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,
28 * Constructor of the dialogs.
30 public MooDialog(int type) {
31 super(Moosique.getGUI(), false);
33 Container pane = getContentPane();
36 Track[] tracks = Moosique.getSequence().getTracks();
39 case ADD_TRACK: makeAddDialog(pane, tracks); break;
40 case DELETE_TRACK: makeDelDialog(pane, tracks); break;
41 case COPY_TRACK: makeCopyDialog(pane, tracks); break;
42 case MOVE_TRACK: makeMoveDialog(pane, tracks); break;
43 case JUMP: makeJumpDialog(pane); break;
44 case CONTENTS: makeTextDialog(pane, "Manual.txt"); break;
49 * Builds the add track popupdialog.
51 private void makeAddDialog(Container pane, Track[] tracks) {
53 setTitle("Add track");
54 labelA = new JLabel("Name of track", JLabel.CENTER);
56 textFieldA = new JTextField();
58 labelB = new JLabel("Add after", JLabel.CENTER);
60 trackListA = new JComboBox();
61 for (int i = 1; i <= tracks.length; i++) trackListA.addItem("Track " + i);
63 cancelButton = new JButton("Cancel");
64 pane.add(cancelButton);
65 okButton = new JButton("OK");
68 labelA.setBounds(50, 10, 100, 20);
69 textFieldA.setBounds(40, 35, 120, 20);
70 labelB.setBounds(50, 70, 100, 20);
71 trackListA.setBounds(40, 95, 120, 20);
72 cancelButton.setBounds(10, 150, 80, 30);
73 okButton.setBounds(120, 150, 60, 30);
75 setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - this.getWidth()) / 2,
76 (Toolkit.getDefaultToolkit().getScreenSize().height - this.getHeight()) / 2);
84 * Builds the delete track popupdialog.
86 private void makeDelDialog(Container pane, Track[] tracks) {
88 setTitle("Delete track");
89 labelB = new JLabel("Delete track", JLabel.CENTER);
91 trackListA = new JComboBox();
92 for (int i = 1; i <= tracks.length; i++) trackListA.addItem("Track " + i);
94 cancelButton = new JButton("Cancel");
95 pane.add(cancelButton);
96 okButton = new JButton("OK");
99 labelB.setBounds(50, 10, 100, 20);
100 trackListA.setBounds(40, 35, 120, 20);
101 cancelButton.setBounds(10, 90, 80, 30);
102 okButton.setBounds(120, 90, 60, 30);
104 setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - this.getWidth()) / 2,
105 (Toolkit.getDefaultToolkit().getScreenSize().height - this.getHeight()) / 2);
113 * Builds the copy track popupdialog.
115 private void makeCopyDialog(Container pane, Track[] tracks) {
117 setTitle("Copy Track");
118 labelA = new JLabel("Track to copy", JLabel.CENTER);
120 trackListA = new JComboBox();
121 for (int i = 1; i <= tracks.length; i++) trackListA.addItem("Track " + i);
122 pane.add(trackListA);
123 labelB = new JLabel("Insert after", JLabel.CENTER);
125 trackListB = new JComboBox();
126 for (int i = 1; i <= tracks.length; i++) trackListB.addItem("Track " + i);
127 pane.add(trackListB);
128 cancelButton = new JButton("Cancel");
129 pane.add(cancelButton);
130 okButton = new JButton("OK");
133 labelA.setBounds(50, 10, 100, 20);
134 trackListA.setBounds(40, 35, 120, 20);
135 labelB.setBounds(50, 70, 100, 20);
136 trackListB.setBounds(40, 95, 120, 20);
137 cancelButton.setBounds(10, 150, 80, 30);
138 okButton.setBounds(120, 150, 60, 30);
140 setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - this.getWidth()) / 2,
141 (Toolkit.getDefaultToolkit().getScreenSize().height - this.getHeight()) / 2);
149 * Builds the move track popupdialog
151 private void makeMoveDialog(Container pane, Track[] tracks) {
153 setTitle("Move track");
154 labelA = new JLabel("Track to move", JLabel.CENTER);
156 trackListA = new JComboBox();
157 for (int i = 1; i <= tracks.length; i++) trackListA.addItem("Track " + i);
158 pane.add(trackListA);
159 labelB = new JLabel("Insert after", JLabel.CENTER);
161 trackListB = new JComboBox();
162 for (int i = 1; i <= tracks.length; i++) trackListB.addItem("Track " + i);
163 pane.add(trackListB);
164 cancelButton = new JButton("Cancel");
165 pane.add(cancelButton);
166 okButton = new JButton("OK");
169 labelA.setBounds(40, 10, 120, 20);
170 trackListA.setBounds(40, 35, 120, 20);
171 labelB.setBounds(50, 70, 100, 20);
172 trackListB.setBounds(40, 95, 120, 20);
173 cancelButton.setBounds(10, 150, 80, 30);
174 okButton.setBounds(120, 150, 60, 30);
176 setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - this.getWidth()) / 2,
177 (Toolkit.getDefaultToolkit().getScreenSize().height - this.getHeight()) / 2);
185 * Builds the jump popupdialog.
187 private void makeJumpDialog(Container pane) {
190 labelA = new JLabel("Msr", JLabel.CENTER);
192 labelB = new JLabel("Beat", JLabel.CENTER);
194 labelC = new JLabel("Tick", JLabel.CENTER);
196 textFieldA = new JTextField();
197 pane.add(textFieldA);
198 textFieldB = new JTextField();
199 pane.add(textFieldB);
200 textFieldC = new JTextField();
201 pane.add(textFieldC);
202 cancelButton = new JButton("Cancel");
203 pane.add(cancelButton);
204 okButton = new JButton("OK");
207 labelA.setBounds(30, 25, 50, 20);
208 labelB.setBounds(105, 25, 50, 20);
209 labelC.setBounds(180, 25, 50, 20);
210 textFieldA.setBounds(30, 45, 50, 20);
211 textFieldB.setBounds(105, 45, 50, 20);
212 textFieldC.setBounds(180, 45, 50, 20);
213 cancelButton.setBounds(35, 90, 80, 30);
214 okButton.setBounds(155, 90, 60, 30);
216 setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - this.getWidth()) / 2,
217 (Toolkit.getDefaultToolkit().getScreenSize().height - this.getHeight()) / 2);
224 private void makeTextDialog(Container pane, String filename) {
225 setTitle("Contents");
226 File manual = new File(filename);
229 BufferedReader br = new BufferedReader(new FileReader(manual));
230 char[] chars = new char[(int)manual.length()];
231 br.read(chars, 0, (int)manual.length());
232 s = new String(chars);
233 } catch (Exception ex) {
234 s = "Manual not found";
236 JTextArea contents = new JTextArea(s, 30, 40);
237 contents.setAutoscrolls(true);
239 contents.setBounds(10, 10, 500, 350);
243 setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - this.getWidth()) / 2,
244 (Toolkit.getDefaultToolkit().getScreenSize().height - this.getHeight()) / 2);
248 private MooNote note;
249 private JOptionPane optionPane;
250 private JTextField pitch;
251 private JTextField velocity;
252 private JTextField length;
255 * Creates a new note preference dialog.
256 * @param mn the note that will be graphically represented
258 public MooDialog(MooNote mn) {
259 super(Moosique.getGUI(), "Note properties", false);
261 pitch = new JTextField(new Integer(note.getPitch()).toString(),3);
262 JPanel pitchpanel = new JPanel();
263 pitchpanel.add(new Label("Pitch: "));
264 pitchpanel.add(pitch);
267 velocity = new JTextField(new Integer(note.getVelocity()).toString(),3);
268 JPanel velocitypanel = new JPanel();
269 velocitypanel.add(new Label("Velocity: "));
270 velocitypanel.add(velocity);
272 length = new JTextField(new Integer(note.getDuration()).toString(),5);
273 JPanel lengthpanel = new JPanel();
274 lengthpanel.add(new Label("Length: "));
275 lengthpanel.add(length);
277 Object[] array = {"Set the note properties",
282 final String btnString1 = "Enter";
283 final String btnString2 = "Cancel";
284 Object[] options = {btnString1, btnString2};
286 optionPane = new JOptionPane(array,
287 JOptionPane.QUESTION_MESSAGE,
288 JOptionPane.YES_NO_OPTION,
292 setContentPane(optionPane);
293 setDefaultCloseOperation(DISPOSE_ON_CLOSE);
295 ActionListener intValidator = new ActionListener() {
296 public void actionPerformed(ActionEvent e) {
297 if (e.getSource() instanceof JTextField){
298 JTextField s = (JTextField)e.getSource();
299 int num = Integer.parseInt(s.getText());
302 else if (num > 127 && s != length)
304 s.setText(new Integer(num).toString());
308 pitch.addActionListener(intValidator);
309 velocity.addActionListener(intValidator);
310 length.addActionListener(intValidator);
312 optionPane.addPropertyChangeListener(new PropertyChangeListener() {
313 public void propertyChange(PropertyChangeEvent e) {
314 String prop = e.getPropertyName();
317 && (e.getSource() == optionPane)
318 && (prop.equals(JOptionPane.VALUE_PROPERTY) ||
319 prop.equals(JOptionPane.INPUT_VALUE_PROPERTY))) {
320 Object value = optionPane.getValue();
322 if (value == JOptionPane.UNINITIALIZED_VALUE) {
327 // Reset the JOptionPane's value.
328 // If you don't do this, then if the user
329 // presses the same button next time, no
330 // property change event will be fired.
332 JOptionPane.UNINITIALIZED_VALUE);
334 if (value.equals(btnString1)) {
335 note.setPitch(Integer.parseInt(pitch.getText()));
336 note.setVelocity(Integer.parseInt(velocity.getText()));
337 note.setDuration(Integer.parseInt(length.getText()));
340 } else { // user closed dialog or clicked cancel