3 import java.awt.event.*;
4 import javax.sound.midi.*;
8 * The GUI-class representing the popupdialogs in the Track menu.
10 * @author Björn Lanneskog
13 public class MooDialog extends JDialog {
15 private JLabel labelA, labelB, labelC;
16 private JTextField textFieldA, textFieldB, textFieldC;
17 private JComboBox trackListA, trackListB;
18 private JButton okButton, cancelButton;
19 public static final int ADD_TRACK = 1,
26 * Constructor of the dialogs.
28 public MooDialog(int type) {
29 super(Moosique.getGUI(), false);
31 Container pane = getContentPane();
34 Track[] tracks = Moosique.getSequence().getTracks();
39 makeAddDialog(pane, tracks);
45 makeDelDialog(pane, tracks);
51 makeCopyDialog(pane, tracks);
57 makeMoveDialog(pane, tracks);
70 * Builds the add track popupdialog
72 private void makeAddDialog(Container pane, Track[] tracks) {
74 setTitle("Add track");
75 labelA = new JLabel("Name of track", JLabel.CENTER);
77 textFieldA = new JTextField();
79 labelB = new JLabel("Add after", JLabel.CENTER);
81 trackListA = new JComboBox();
82 for (int i = 1; i <= tracks.length; i++) trackListA.addItem("Track " + i);
84 cancelButton = new JButton("Cancel");
85 pane.add(cancelButton);
86 okButton = new JButton("OK");
89 labelA.setBounds(50, 10, 100, 20);
90 textFieldA.setBounds(40, 35, 120, 20);
91 labelB.setBounds(50, 70, 100, 20);
92 trackListA.setBounds(40, 95, 120, 20);
93 cancelButton.setBounds(10, 150, 80, 30);
94 okButton.setBounds(120, 150, 60, 30);
96 setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - this.getWidth()) / 2,
97 (Toolkit.getDefaultToolkit().getScreenSize().height - this.getHeight()) / 2);
105 * Builds the delete track popupdialog
107 private void makeDelDialog(Container pane, Track[] tracks) {
109 setTitle("Delete track");
110 labelB = new JLabel("Delete track", JLabel.CENTER);
112 trackListA = new JComboBox();
113 for (int i = 1; i <= tracks.length; i++) trackListA.addItem("Track " + i);
114 pane.add(trackListA);
115 cancelButton = new JButton("Cancel");
116 pane.add(cancelButton);
117 okButton = new JButton("OK");
120 labelB.setBounds(50, 10, 100, 20);
121 trackListA.setBounds(40, 35, 120, 20);
122 cancelButton.setBounds(10, 90, 80, 30);
123 okButton.setBounds(120, 90, 60, 30);
125 setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - this.getWidth()) / 2,
126 (Toolkit.getDefaultToolkit().getScreenSize().height - this.getHeight()) / 2);
134 * Builds the copy track popupdialog
136 private void makeCopyDialog(Container pane, Track[] tracks) {
138 setTitle("Copy Track");
139 labelA = new JLabel("Track to copy", JLabel.CENTER);
141 trackListA = new JComboBox();
142 for (int i = 1; i <= tracks.length; i++) trackListA.addItem("Track " + i);
143 pane.add(trackListA);
144 labelB = new JLabel("Insert after", JLabel.CENTER);
146 trackListB = new JComboBox();
147 for (int i = 1; i <= tracks.length; i++) trackListB.addItem("Track " + i);
148 pane.add(trackListB);
149 cancelButton = new JButton("Cancel");
150 pane.add(cancelButton);
151 okButton = new JButton("OK");
154 labelA.setBounds(50, 10, 100, 20);
155 trackListA.setBounds(40, 35, 120, 20);
156 labelB.setBounds(50, 70, 100, 20);
157 trackListB.setBounds(40, 95, 120, 20);
158 cancelButton.setBounds(10, 150, 80, 30);
159 okButton.setBounds(120, 150, 60, 30);
161 setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - this.getWidth()) / 2,
162 (Toolkit.getDefaultToolkit().getScreenSize().height - this.getHeight()) / 2);
170 * Builds the move track popupdialog
172 private void makeMoveDialog(Container pane, Track[] tracks) {
174 setTitle("Move track");
175 labelA = new JLabel("Track to move", JLabel.CENTER);
177 trackListA = new JComboBox();
178 for (int i = 1; i <= tracks.length; i++) trackListA.addItem("Track " + i);
179 pane.add(trackListA);
180 labelB = new JLabel("Insert after", JLabel.CENTER);
182 trackListB = new JComboBox();
183 for (int i = 1; i <= tracks.length; i++) trackListB.addItem("Track " + i);
184 pane.add(trackListB);
185 cancelButton = new JButton("Cancel");
186 pane.add(cancelButton);
187 okButton = new JButton("OK");
190 labelA.setBounds(40, 10, 120, 20);
191 trackListA.setBounds(40, 35, 120, 20);
192 labelB.setBounds(50, 70, 100, 20);
193 trackListB.setBounds(40, 95, 120, 20);
194 cancelButton.setBounds(10, 150, 80, 30);
195 okButton.setBounds(120, 150, 60, 30);
197 setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - this.getWidth()) / 2,
198 (Toolkit.getDefaultToolkit().getScreenSize().height - this.getHeight()) / 2);
206 * Builds the jump popupdialog
208 private void makeJumpDialog(Container pane) {
211 labelA = new JLabel("Msr", JLabel.CENTER);
213 labelB = new JLabel("Beat", JLabel.CENTER);
215 labelC = new JLabel("Tick", JLabel.CENTER);
217 textFieldA = new JTextField();
218 pane.add(textFieldA);
219 textFieldB = new JTextField();
220 pane.add(textFieldB);
221 textFieldC = new JTextField();
222 pane.add(textFieldC);
223 cancelButton = new JButton("Cancel");
224 pane.add(cancelButton);
225 okButton = new JButton("OK");
228 labelA.setBounds(30, 25, 50, 20);
229 labelB.setBounds(105, 25, 50, 20);
230 labelC.setBounds(180, 25, 50, 20);
231 textFieldA.setBounds(30, 45, 50, 20);
232 textFieldB.setBounds(105, 45, 50, 20);
233 textFieldC.setBounds(180, 45, 50, 20);
234 cancelButton.setBounds(35, 90, 80, 30);
235 okButton.setBounds(155, 90, 60, 30);
237 setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - this.getWidth()) / 2,
238 (Toolkit.getDefaultToolkit().getScreenSize().height - this.getHeight()) / 2);
245 private MooNote note;
246 private JOptionPane optionPane;
247 private JTextField pitch;
248 private JTextField velocity;
249 private JTextField length;
252 * Creates a new note preference dialog.
253 * @param mn the note that will be graphically represented
255 public MooDialog(MooNote mn) {
256 super(Moosique.getGUI(), "Note properties", false);
258 pitch = new JTextField(new Integer(note.getPitch()).toString(),3);
259 JPanel pitchpanel = new JPanel();
260 pitchpanel.add(new Label("Pitch: "));
261 pitchpanel.add(pitch);
264 velocity = new JTextField(new Integer(note.getVelocity()).toString(),3);
265 JPanel velocitypanel = new JPanel();
266 velocitypanel.add(new Label("Velocity: "));
267 velocitypanel.add(velocity);
269 length = new JTextField(new Integer(note.getDuration()).toString(),5);
270 JPanel lengthpanel = new JPanel();
271 lengthpanel.add(new Label("Length: "));
272 lengthpanel.add(length);
274 Object[] array = {"Set the note properties",
279 final String btnString1 = "Enter";
280 final String btnString2 = "Cancel";
281 Object[] options = {btnString1, btnString2};
283 optionPane = new JOptionPane(array,
284 JOptionPane.QUESTION_MESSAGE,
285 JOptionPane.YES_NO_OPTION,
289 setContentPane(optionPane);
290 setDefaultCloseOperation(DISPOSE_ON_CLOSE);
292 ActionListener intValidator = new ActionListener() {
293 public void actionPerformed(ActionEvent e) {
294 if (e.getSource() instanceof JTextField){
295 JTextField s = (JTextField)e.getSource();
296 int num = Integer.parseInt(s.getText());
299 else if (num > 127 && s != length)
301 s.setText(new Integer(num).toString());
305 pitch.addActionListener(intValidator);
306 velocity.addActionListener(intValidator);
307 length.addActionListener(intValidator);
309 optionPane.addPropertyChangeListener(new PropertyChangeListener() {
310 public void propertyChange(PropertyChangeEvent e) {
311 String prop = e.getPropertyName();
314 && (e.getSource() == optionPane)
315 && (prop.equals(JOptionPane.VALUE_PROPERTY) ||
316 prop.equals(JOptionPane.INPUT_VALUE_PROPERTY))) {
317 Object value = optionPane.getValue();
319 if (value == JOptionPane.UNINITIALIZED_VALUE) {
324 // Reset the JOptionPane's value.
325 // If you don't do this, then if the user
326 // presses the same button next time, no
327 // property change event will be fired.
329 JOptionPane.UNINITIALIZED_VALUE);
331 if (value.equals(btnString1)) {
332 note.setPitch(Integer.parseInt(pitch.getText()));
333 note.setVelocity(Integer.parseInt(velocity.getText()));
334 note.setDuration(Integer.parseInt(length.getText()));
337 } else { // user closed dialog or clicked cancel