]> ruin.nu Git - moosique.git/blob - MooDialog.java
har fixat den där jävla jump-dialogen!!!
[moosique.git] / MooDialog.java
1 import javax.swing.*;
2 import java.awt.*;
3 import java.awt.event.*;
4 import javax.sound.midi.*;
5 import java.beans.*;
6
7 /*
8  * The GUI-class representing the popupdialogs in the Track menu.
9  *
10  * @author Björn Lanneskog
11  */
12  
13 public class MooDialog extends JDialog {
14
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,
20                                 DELETE_TRACK = 2,
21                                 COPY_TRACK = 3,
22                                 MOVE_TRACK = 4,
23                                 JUMP = 5;
24         
25         /*
26          * Constructor of the dialogs.
27          */
28          public MooDialog(int type) {
29                 super(Moosique.getGUI(), false);
30                         
31                 Container pane = getContentPane();
32                 pane.setLayout(null);
33                 
34                 Track[] tracks = Moosique.getSequence().getTracks();
35
36                 switch (type) {
37                         case ADD_TRACK:
38                                 
39                                 makeAddDialog(pane, tracks);
40                                 
41                                 break;
42                                 
43                         case DELETE_TRACK:
44                         
45                                 makeDelDialog(pane, tracks);
46                                 
47                                 break;
48                                 
49                         case COPY_TRACK:
50                                 
51                                 makeCopyDialog(pane, tracks);
52                         
53                                 break;
54                         
55                         case MOVE_TRACK:
56                                 
57                                 makeMoveDialog(pane, tracks);
58                                 
59                                 break;
60                         
61                         case JUMP:
62                                 
63                                 makeJumpDialog(pane);
64                                 
65                                 break;
66                 }
67          }
68         
69         /*
70          * Builds the add track popupdialog
71          */
72         private void makeAddDialog(Container pane, Track[] tracks) {
73         
74                 setTitle("Add track");
75                 labelA = new JLabel("Name of track", JLabel.CENTER);
76                 pane.add(labelA);
77                 textFieldA = new JTextField();  
78                 pane.add(textFieldA);
79                 labelB = new JLabel("Add after", JLabel.CENTER);
80                 pane.add(labelB);
81                 trackListA = new JComboBox();
82                 for (int i = 1; i <= tracks.length; i++) trackListA.addItem("Track " + i);
83                 pane.add(trackListA);
84                 cancelButton = new JButton("Cancel");
85                 pane.add(cancelButton);
86                 okButton = new JButton("OK");
87                 pane.add(okButton);
88         
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);
95         
96                 setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - this.getWidth()) / 2,
97                 (Toolkit.getDefaultToolkit().getScreenSize().height - this.getHeight()) / 2);
98                 setResizable(false);
99                 pack();
100                 setSize(200,220);
101                 setVisible(true);
102         }
103         
104         /*
105          * Builds the delete track popupdialog
106          */
107         private void makeDelDialog(Container pane, Track[] tracks) {
108         
109                 setTitle("Delete track");
110                 labelB = new JLabel("Delete track", JLabel.CENTER);
111                 pane.add(labelB);
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");
118                 pane.add(okButton);
119                         
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);
124         
125                 setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - this.getWidth()) / 2,
126                 (Toolkit.getDefaultToolkit().getScreenSize().height - this.getHeight()) / 2);
127                 setResizable(false);
128                 pack();
129                 setSize(200,165);
130                 setVisible(true);
131         }
132         
133         /*
134          * Builds the copy track popupdialog
135          */
136         private void makeCopyDialog(Container pane, Track[] tracks) {
137         
138                 setTitle("Copy Track");
139                 labelA = new JLabel("Track to copy", JLabel.CENTER);
140                 pane.add(labelA);
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);
145                 pane.add(labelB);
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");
152                 pane.add(okButton);
153                 
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);
160         
161                 setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - this.getWidth()) / 2,
162                 (Toolkit.getDefaultToolkit().getScreenSize().height - this.getHeight()) / 2);
163                 setResizable(false);
164                 pack();
165                 setSize(200,220);
166                 setVisible(true);
167         }
168         
169         /*
170          * Builds the move track popupdialog
171          */
172         private void makeMoveDialog(Container pane, Track[] tracks) {
173         
174                 setTitle("Move track");
175                 labelA = new JLabel("Track to move", JLabel.CENTER);
176                 pane.add(labelA);
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);
181                 pane.add(labelB);
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");
188                 pane.add(okButton);
189                 
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);
196         
197                 setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - this.getWidth()) / 2,
198                 (Toolkit.getDefaultToolkit().getScreenSize().height - this.getHeight()) / 2);
199                 setResizable(false);
200                 pack();
201                 setSize(200,220);
202                 setVisible(true);
203         }
204         
205         /*
206          * Builds the jump popupdialog
207          */
208         private void makeJumpDialog(Container pane) {
209                 
210                 setTitle("Jump");
211                 labelA = new JLabel("Msr", JLabel.CENTER);
212                 pane.add(labelA);
213                 labelB = new JLabel("Beat", JLabel.CENTER);
214                 pane.add(labelB);
215                 labelC = new JLabel("Tick", JLabel.CENTER);
216                 pane.add(labelC);
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");
226                 pane.add(okButton);
227                 
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);
236                 
237                 setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - this.getWidth()) / 2,
238                 (Toolkit.getDefaultToolkit().getScreenSize().height - this.getHeight()) / 2);
239                 setResizable(false);
240                 pack();
241                 setSize(260,175);
242                 setVisible(true);
243         }
244         
245         private MooNote note;
246         private JOptionPane optionPane;
247         private JTextField pitch;
248         private JTextField velocity;
249         private JTextField length;
250         
251         /** 
252          * Creates a new note preference dialog.
253          * @param mn    the note that will be graphically represented
254          */
255         public MooDialog(MooNote mn) {
256                 super(Moosique.getGUI(), "Note properties", false);
257                 note = mn;
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);
262
263
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);
268
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);
273
274                 Object[] array = {"Set the note properties",
275                                 pitchpanel,
276                                 velocitypanel,
277                                 lengthpanel};
278         
279                 final String btnString1 = "Enter";
280                 final String btnString2 = "Cancel";
281                 Object[] options = {btnString1, btnString2};
282         
283                 optionPane = new JOptionPane(array, 
284                                             JOptionPane.QUESTION_MESSAGE,
285                                             JOptionPane.YES_NO_OPTION,
286                                             null,
287                                             options,
288                                             options[0]);
289                 setContentPane(optionPane);
290                 setDefaultCloseOperation(DISPOSE_ON_CLOSE);
291         
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());
297                                                 if (num < 0)
298                                                         num = 0;
299                                                 else if (num > 127 && s != length)
300                                                         num = 127;
301                                                 s.setText(new Integer(num).toString());
302                                         }
303                     }
304                 };
305                 pitch.addActionListener(intValidator);
306                 velocity.addActionListener(intValidator);
307                 length.addActionListener(intValidator);
308
309                 optionPane.addPropertyChangeListener(new PropertyChangeListener() {
310                     public void propertyChange(PropertyChangeEvent e) {
311                         String prop = e.getPropertyName();
312         
313                         if (isVisible() 
314                          && (e.getSource() == optionPane)
315                          && (prop.equals(JOptionPane.VALUE_PROPERTY) ||
316                              prop.equals(JOptionPane.INPUT_VALUE_PROPERTY))) {
317                             Object value = optionPane.getValue();
318         
319                             if (value == JOptionPane.UNINITIALIZED_VALUE) {
320                                 //ignore reset
321                                 return;
322                             }
323         
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.
328                             optionPane.setValue(
329                                     JOptionPane.UNINITIALIZED_VALUE);
330         
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()));
335         
336                                 setVisible(false);
337                             } else { // user closed dialog or clicked cancel
338                                 setVisible(false);
339                             }
340                         }
341                     }
342                 });
343                 pack();
344         }
345 }