3 import java.awt.event.*;
4 import javax.sound.midi.*;
9 * The GUI-class representing the popupdialogs in the Track menu.
11 * @author Björn Lanneskog
14 public class MooDialog extends JDialog {
16 private JLabel labelA, labelB, labelC;
17 private JTextField textFieldA, textFieldB, textFieldC;
18 private JComboBox trackListA, trackListB;
19 private JButton okButton, cancelButton;
20 public static final int ADD_TRACK = 1,
30 * Constructor of the dialogs.
32 public MooDialog(int type) {
33 super(Moosique.getGUI(), false);
35 Container pane = getContentPane();
38 Track[] tracks = Moosique.getSequence().getTracks();
41 case ADD_TRACK: makeAddDialog(pane, tracks); break;
42 case DELETE_TRACK: makeDelDialog(pane, tracks); break;
43 case COPY_TRACK: makeCopyDialog(pane, tracks); break;
44 case MOVE_TRACK: makeMoveDialog(pane, tracks); break;
45 case JUMP: makeJumpDialog(pane); break;
46 case CONTENTS: makeTextDialog(pane, "Manual.txt"); break;
47 case INSERT_MEASURE: makeInsertMeasureDialog(pane); break;
48 case DELETE_MEASURE: makeDeleteMeasureDialog(pane); break;
53 * Builds the add track popupdialog.
54 * @param pane The container to put the dialog in.
55 * @param tracks A array containing miditracks.
57 private void makeAddDialog(Container pane, Track[] tracks) {
59 setTitle("Add track");
60 labelA = new JLabel("Name of track", JLabel.CENTER);
62 textFieldA = new JTextField();
64 labelB = new JLabel("Add after", JLabel.CENTER);
66 trackListA = new JComboBox();
67 for (int i = 1; i <= tracks.length; i++) trackListA.addItem("Track " + i);
69 cancelButton = new JButton("Cancel");
70 pane.add(cancelButton);
71 okButton = new JButton("OK");
74 labelA.setBounds(50, 10, 100, 20);
75 textFieldA.setBounds(40, 35, 120, 20);
76 labelB.setBounds(50, 70, 100, 20);
77 trackListA.setBounds(40, 95, 120, 20);
78 cancelButton.setBounds(10, 150, 80, 30);
79 okButton.setBounds(120, 150, 60, 30);
81 setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - this.getWidth()) / 2,
82 (Toolkit.getDefaultToolkit().getScreenSize().height - this.getHeight()) / 2);
90 * Builds the delete track popupdialog.
91 * @param pane The container to put the dialog in.
92 * @param tracks A array containing miditracks.
94 private void makeDelDialog(Container pane, Track[] tracks) {
96 setTitle("Delete track");
97 labelB = new JLabel("Delete track", JLabel.CENTER);
99 trackListA = new JComboBox();
100 for (int i = 1; i <= tracks.length; i++) trackListA.addItem("Track " + i);
101 pane.add(trackListA);
102 cancelButton = new JButton("Cancel");
103 pane.add(cancelButton);
104 okButton = new JButton("OK");
107 labelB.setBounds(50, 10, 100, 20);
108 trackListA.setBounds(40, 35, 120, 20);
109 cancelButton.setBounds(10, 90, 80, 30);
110 okButton.setBounds(120, 90, 60, 30);
112 setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - this.getWidth()) / 2,
113 (Toolkit.getDefaultToolkit().getScreenSize().height - this.getHeight()) / 2);
121 * Builds the copy track popupdialog.
122 * @param pane The container to put the dialog in.
123 * @param tracks A array containing miditracks.
125 private void makeCopyDialog(Container pane, Track[] tracks) {
127 setTitle("Copy Track");
128 labelA = new JLabel("Track to copy", JLabel.CENTER);
130 trackListA = new JComboBox();
131 for (int i = 1; i <= tracks.length; i++) trackListA.addItem("Track " + i);
132 pane.add(trackListA);
133 labelB = new JLabel("Insert after", JLabel.CENTER);
135 trackListB = new JComboBox();
136 for (int i = 1; i <= tracks.length; i++) trackListB.addItem("Track " + i);
137 pane.add(trackListB);
138 cancelButton = new JButton("Cancel");
139 pane.add(cancelButton);
140 okButton = new JButton("OK");
143 labelA.setBounds(50, 10, 100, 20);
144 trackListA.setBounds(40, 35, 120, 20);
145 labelB.setBounds(50, 70, 100, 20);
146 trackListB.setBounds(40, 95, 120, 20);
147 cancelButton.setBounds(10, 150, 80, 30);
148 okButton.setBounds(120, 150, 60, 30);
150 setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - this.getWidth()) / 2,
151 (Toolkit.getDefaultToolkit().getScreenSize().height - this.getHeight()) / 2);
159 * Builds the move track popupdialog
160 * @param pane The container to put the dialog in.
161 * @param tracks A array containing miditracks.
163 private void makeMoveDialog(Container pane, Track[] tracks) {
165 setTitle("Move track");
166 labelA = new JLabel("Track to move", JLabel.CENTER);
168 trackListA = new JComboBox();
169 for (int i = 1; i <= tracks.length; i++) trackListA.addItem("Track " + i);
170 pane.add(trackListA);
171 labelB = new JLabel("Insert after", JLabel.CENTER);
173 trackListB = new JComboBox();
174 for (int i = 1; i <= tracks.length; i++) trackListB.addItem("Track " + i);
175 pane.add(trackListB);
176 cancelButton = new JButton("Cancel");
177 pane.add(cancelButton);
178 okButton = new JButton("OK");
181 labelA.setBounds(40, 10, 120, 20);
182 trackListA.setBounds(40, 35, 120, 20);
183 labelB.setBounds(50, 70, 100, 20);
184 trackListB.setBounds(40, 95, 120, 20);
185 cancelButton.setBounds(10, 150, 80, 30);
186 okButton.setBounds(120, 150, 60, 30);
188 setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - this.getWidth()) / 2,
189 (Toolkit.getDefaultToolkit().getScreenSize().height - this.getHeight()) / 2);
197 * Builds the jump popupdialog.
198 * @param pane The container to put the dialog in.
199 * @param tracks A array containing miditracks.
201 private void makeJumpDialog(Container pane) {
204 labelA = new JLabel("Msr", JLabel.CENTER);
206 labelB = new JLabel("Beat", JLabel.CENTER);
208 labelC = new JLabel("Tick", JLabel.CENTER);
210 textFieldA = new JTextField();
211 pane.add(textFieldA);
212 textFieldB = new JTextField();
213 pane.add(textFieldB);
214 textFieldC = new JTextField();
215 pane.add(textFieldC);
216 cancelButton = new JButton("Cancel");
217 pane.add(cancelButton);
218 okButton = new JButton("OK");
221 labelA.setBounds(30, 25, 50, 20);
222 labelB.setBounds(105, 25, 50, 20);
223 labelC.setBounds(180, 25, 50, 20);
224 textFieldA.setBounds(30, 45, 50, 20);
225 textFieldB.setBounds(105, 45, 50, 20);
226 textFieldC.setBounds(180, 45, 50, 20);
227 cancelButton.setBounds(35, 90, 80, 30);
228 okButton.setBounds(155, 90, 60, 30);
230 setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - this.getWidth()) / 2,
231 (Toolkit.getDefaultToolkit().getScreenSize().height - this.getHeight()) / 2);
239 * Builds the insert measure popupdialog.
240 * @param pane The container to put the dialog in.
242 private void makeInsertMeasureDialog(Container pane){
244 setTitle("Insert Measure");
245 labelA = new JLabel("Insert at:", JLabel.RIGHT);
247 labelB = new JLabel("Measure count:", JLabel.RIGHT);
249 textFieldA = new JTextField();
250 pane.add(textFieldA);
251 textFieldB = new JTextField();
252 pane.add(textFieldB);
253 cancelButton = new JButton("Cancel");
254 pane.add(cancelButton);
255 okButton = new JButton("OK");
258 labelA.setBounds(20, 20, 110 ,20);
259 labelB.setBounds(20, 50, 110, 20);
260 textFieldA.setBounds(140 ,20 , 40, 20);
261 textFieldB.setBounds(140,50, 40, 20);
262 cancelButton.setBounds(20 ,95 , 80, 30);
263 okButton.setBounds(120, 95, 60, 30);
265 setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - this.getWidth()) / 2,
266 (Toolkit.getDefaultToolkit().getScreenSize().height - this.getHeight()) / 2);
274 * Builds the delete measure popupdialog.
275 * @param pane The container to put the dialog in.
277 private void makeDeleteMeasureDialog(Container pane) {
279 setTitle("Delete Measure");
280 labelA = new JLabel("Delete at:", JLabel.RIGHT);
282 labelB = new JLabel("Measure count:", JLabel.RIGHT);
284 textFieldA = new JTextField();
285 pane.add(textFieldA);
286 textFieldB = new JTextField();
287 pane.add(textFieldB);
288 cancelButton = new JButton("Cancel");
289 pane.add(cancelButton);
290 okButton = new JButton("OK");
293 labelA.setBounds(20, 20, 110 ,20);
294 labelB.setBounds(20, 50, 110, 20);
295 textFieldA.setBounds(140 ,20 , 40, 20);
296 textFieldB.setBounds(140,50, 40, 20);
297 cancelButton.setBounds(20 ,95 , 80, 30);
298 okButton.setBounds(120, 95, 60, 30);
300 setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - this.getWidth()) / 2,
301 (Toolkit.getDefaultToolkit().getScreenSize().height - this.getHeight()) / 2);
308 private void makeTextDialog(Container pane, String filename) {
309 setTitle("Contents");
310 File manual = new File(filename);
313 BufferedReader br = new BufferedReader(new FileReader(manual));
314 char[] chars = new char[(int)manual.length()];
315 br.read(chars, 0, (int)manual.length());
316 s = new String(chars);
317 } catch (Exception ex) {
318 s = "Manual not found";
320 JTextArea contents = new JTextArea(s, 30, 40);
321 contents.setAutoscrolls(true);
323 contents.setBounds(10, 10, 500, 350);
327 setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - this.getWidth()) / 2,
328 (Toolkit.getDefaultToolkit().getScreenSize().height - this.getHeight()) / 2);
332 private MooNote note;
333 private JOptionPane optionPane;
334 private JTextField pitch;
335 private JTextField velocity;
336 private JTextField length;
339 * Creates a new note preference dialog.
340 * @param mn the note that will be graphically represented
342 public MooDialog(MooNote mn) {
343 super(Moosique.getGUI(), "Note properties", false);
345 pitch = new JTextField(new Integer(note.getPitch()).toString(),3);
346 JPanel pitchpanel = new JPanel();
347 pitchpanel.add(new Label("Pitch: "));
348 pitchpanel.add(pitch);
351 velocity = new JTextField(new Integer(note.getVelocity()).toString(),3);
352 JPanel velocitypanel = new JPanel();
353 velocitypanel.add(new Label("Velocity: "));
354 velocitypanel.add(velocity);
356 length = new JTextField(new Integer(note.getDuration()).toString(),5);
357 JPanel lengthpanel = new JPanel();
358 lengthpanel.add(new Label("Length: "));
359 lengthpanel.add(length);
361 Object[] array = {"Set the note properties",
366 final String btnString1 = "Enter";
367 final String btnString2 = "Cancel";
368 Object[] options = {btnString1, btnString2};
370 optionPane = new JOptionPane(array,
371 JOptionPane.QUESTION_MESSAGE,
372 JOptionPane.YES_NO_OPTION,
376 setContentPane(optionPane);
377 setDefaultCloseOperation(DISPOSE_ON_CLOSE);
379 ActionListener intValidator = new ActionListener() {
380 public void actionPerformed(ActionEvent e) {
381 if (e.getSource() instanceof JTextField){
382 JTextField s = (JTextField)e.getSource();
383 int num = Integer.parseInt(s.getText());
386 else if (num > 127 && s != length)
388 s.setText(new Integer(num).toString());
392 pitch.addActionListener(intValidator);
393 velocity.addActionListener(intValidator);
394 length.addActionListener(intValidator);
396 optionPane.addPropertyChangeListener(new PropertyChangeListener() {
397 public void propertyChange(PropertyChangeEvent e) {
398 String prop = e.getPropertyName();
401 && (e.getSource() == optionPane)
402 && (prop.equals(JOptionPane.VALUE_PROPERTY) ||
403 prop.equals(JOptionPane.INPUT_VALUE_PROPERTY))) {
404 Object value = optionPane.getValue();
406 if (value == JOptionPane.UNINITIALIZED_VALUE) {
411 // Reset the JOptionPane's value.
412 // If you don't do this, then if the user
413 // presses the same button next time, no
414 // property change event will be fired.
416 JOptionPane.UNINITIALIZED_VALUE);
418 if (value.equals(btnString1)) {
419 note.setPitch(Integer.parseInt(pitch.getText()));
420 note.setVelocity(Integer.parseInt(velocity.getText()));
421 note.setDuration(Integer.parseInt(length.getText()));
424 } else { // user closed dialog or clicked cancel