]> ruin.nu Git - moosique.git/blob - MooDialog.java
*** empty log message ***
[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.io.*;
6 import java.beans.*;
7
8 /**
9  * The GUI-class representing the popupdialogs in the Track menu.
10  *
11  * @author Björn Lanneskog
12  */
13  
14 public class MooDialog extends JDialog {
15
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,
21                                 DELETE_TRACK = 2,
22                                 COPY_TRACK = 3,
23                                 MOVE_TRACK = 4,
24                                 JUMP = 5,
25                                 CONTENTS = 6;
26         
27         /**
28          * Constructor of the dialogs.
29          */
30          public MooDialog(int type) {
31                 super(Moosique.getGUI(), false);
32                         
33                 Container pane = getContentPane();
34                 pane.setLayout(null);
35                 
36                 Track[] tracks = Moosique.getSequence().getTracks();
37
38                 switch (type) {
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;
45                 }
46          }
47         
48         /**
49          * Builds the add track popupdialog.
50          */
51         private void makeAddDialog(Container pane, Track[] tracks) {
52         
53                 setTitle("Add track");
54                 labelA = new JLabel("Name of track", JLabel.CENTER);
55                 pane.add(labelA);
56                 textFieldA = new JTextField();  
57                 pane.add(textFieldA);
58                 labelB = new JLabel("Add after", JLabel.CENTER);
59                 pane.add(labelB);
60                 trackListA = new JComboBox();
61                 for (int i = 1; i <= tracks.length; i++) trackListA.addItem("Track " + i);
62                 pane.add(trackListA);
63                 cancelButton = new JButton("Cancel");
64                 pane.add(cancelButton);
65                 okButton = new JButton("OK");
66                 pane.add(okButton);
67         
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);
74         
75                 setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - this.getWidth()) / 2,
76                 (Toolkit.getDefaultToolkit().getScreenSize().height - this.getHeight()) / 2);
77                 setResizable(false);
78                 pack();
79                 setSize(200,220);
80                 setVisible(true);
81         }
82         
83         /**
84          * Builds the delete track popupdialog.
85          */
86         private void makeDelDialog(Container pane, Track[] tracks) {
87         
88                 setTitle("Delete track");
89                 labelB = new JLabel("Delete track", JLabel.CENTER);
90                 pane.add(labelB);
91                 trackListA = new JComboBox();
92                 for (int i = 1; i <= tracks.length; i++) trackListA.addItem("Track " + i);
93                 pane.add(trackListA);
94                 cancelButton = new JButton("Cancel");
95                 pane.add(cancelButton);
96                 okButton = new JButton("OK");
97                 pane.add(okButton);
98                         
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);
103         
104                 setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - this.getWidth()) / 2,
105                 (Toolkit.getDefaultToolkit().getScreenSize().height - this.getHeight()) / 2);
106                 setResizable(false);
107                 pack();
108                 setSize(200,165);
109                 setVisible(true);
110         }
111         
112         /**
113          * Builds the copy track popupdialog.
114          */
115         private void makeCopyDialog(Container pane, Track[] tracks) {
116         
117                 setTitle("Copy Track");
118                 labelA = new JLabel("Track to copy", JLabel.CENTER);
119                 pane.add(labelA);
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);
124                 pane.add(labelB);
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");
131                 pane.add(okButton);
132                 
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);
139         
140                 setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - this.getWidth()) / 2,
141                 (Toolkit.getDefaultToolkit().getScreenSize().height - this.getHeight()) / 2);
142                 setResizable(false);
143                 pack();
144                 setSize(200,220);
145                 setVisible(true);
146         }
147         
148         /**
149          * Builds the move track popupdialog
150          */
151         private void makeMoveDialog(Container pane, Track[] tracks) {
152         
153                 setTitle("Move track");
154                 labelA = new JLabel("Track to move", JLabel.CENTER);
155                 pane.add(labelA);
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);
160                 pane.add(labelB);
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");
167                 pane.add(okButton);
168                 
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);
175         
176                 setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - this.getWidth()) / 2,
177                 (Toolkit.getDefaultToolkit().getScreenSize().height - this.getHeight()) / 2);
178                 setResizable(false);
179                 pack();
180                 setSize(200,220);
181                 setVisible(true);
182         }
183         
184         /**
185          * Builds the jump popupdialog.
186          */
187         private void makeJumpDialog(Container pane) {
188                 
189                 setTitle("Jump");
190                 labelA = new JLabel("Msr", JLabel.CENTER);
191                 pane.add(labelA);
192                 labelB = new JLabel("Beat", JLabel.CENTER);
193                 pane.add(labelB);
194                 labelC = new JLabel("Tick", JLabel.CENTER);
195                 pane.add(labelC);
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");
205                 pane.add(okButton);
206                 
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);
215                 
216                 setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - this.getWidth()) / 2,
217                 (Toolkit.getDefaultToolkit().getScreenSize().height - this.getHeight()) / 2);
218                 setResizable(false);
219                 pack();
220                 setSize(260,175);
221                 setVisible(true);
222         }
223
224         private void makeTextDialog(Container pane, String filename) {
225                 setTitle("Contents");
226                 File manual = new File(filename);
227                 String s;
228                 try {
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";
235                 }
236                 JTextArea contents = new JTextArea(s, 30, 40);
237                 contents.setAutoscrolls(true);
238                 pane.add(contents);
239                 contents.setBounds(10, 10, 500, 350);
240                 setResizable(false);
241                 pack();
242                 setSize(600,400);
243                 setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - this.getWidth()) / 2,
244                 (Toolkit.getDefaultToolkit().getScreenSize().height - this.getHeight()) / 2);
245                 setVisible(true);
246         }
247
248         private MooNote note;
249         private JOptionPane optionPane;
250         private JTextField pitch;
251         private JTextField velocity;
252         private JTextField length;
253         
254         /** 
255          * Creates a new note preference dialog.
256          * @param mn    the note that will be graphically represented
257          */
258         public MooDialog(MooNote mn) {
259                 super(Moosique.getGUI(), "Note properties", false);
260                 note = mn;
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);
265
266
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);
271
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);
276
277                 Object[] array = {"Set the note properties",
278                                 pitchpanel,
279                                 velocitypanel,
280                                 lengthpanel};
281         
282                 final String btnString1 = "Enter";
283                 final String btnString2 = "Cancel";
284                 Object[] options = {btnString1, btnString2};
285         
286                 optionPane = new JOptionPane(array, 
287                                             JOptionPane.QUESTION_MESSAGE,
288                                             JOptionPane.YES_NO_OPTION,
289                                             null,
290                                             options,
291                                             options[0]);
292                 setContentPane(optionPane);
293                 setDefaultCloseOperation(DISPOSE_ON_CLOSE);
294         
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());
300                                                 if (num < 0)
301                                                         num = 0;
302                                                 else if (num > 127 && s != length)
303                                                         num = 127;
304                                                 s.setText(new Integer(num).toString());
305                                         }
306                     }
307                 };
308                 pitch.addActionListener(intValidator);
309                 velocity.addActionListener(intValidator);
310                 length.addActionListener(intValidator);
311
312                 optionPane.addPropertyChangeListener(new PropertyChangeListener() {
313                     public void propertyChange(PropertyChangeEvent e) {
314                         String prop = e.getPropertyName();
315         
316                         if (isVisible() 
317                          && (e.getSource() == optionPane)
318                          && (prop.equals(JOptionPane.VALUE_PROPERTY) ||
319                              prop.equals(JOptionPane.INPUT_VALUE_PROPERTY))) {
320                             Object value = optionPane.getValue();
321         
322                             if (value == JOptionPane.UNINITIALIZED_VALUE) {
323                                 //ignore reset
324                                 return;
325                             }
326         
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.
331                             optionPane.setValue(
332                                     JOptionPane.UNINITIALIZED_VALUE);
333         
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()));
338         
339                                 setVisible(false);
340                             } else { // user closed dialog or clicked cancel
341                                 setVisible(false);
342                             }
343                         }
344                     }
345                 });
346                 pack();
347         }
348 }