/[svn]/jsampler/trunk/src/org/jsampler/view/std/JSNewMidiInstrumentWizard.java
ViewVC logotype

Annotation of /jsampler/trunk/src/org/jsampler/view/std/JSNewMidiInstrumentWizard.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1329 - (hide annotations) (download)
Sat Sep 8 18:33:05 2007 UTC (16 years, 7 months ago) by iliev
File size: 25148 byte(s)
* Implemented some UI enhancements for speeding up
  the MIDI instrument mapping process
* some minor bugfixes

1 iliev 1286 /*
2     * JSampler - a java front-end for LinuxSampler
3     *
4     * Copyright (C) 2005-2007 Grigor Iliev <grigor@grigoriliev.com>
5     *
6     * This file is part of JSampler.
7     *
8     * JSampler is free software; you can redistribute it and/or modify
9     * it under the terms of the GNU General Public License version 2
10     * as published by the Free Software Foundation.
11     *
12     * JSampler is distributed in the hope that it will be useful,
13     * but WITHOUT ANY WARRANTY; without even the implied warranty of
14     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15     * GNU General Public License for more details.
16     *
17     * You should have received a copy of the GNU General Public License
18     * along with JSampler; if not, write to the Free Software
19     * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
20     * MA 02111-1307 USA
21     */
22    
23     package org.jsampler.view.std;
24    
25     import java.awt.BorderLayout;
26     import java.awt.Dimension;
27     import java.awt.GridBagConstraints;
28     import java.awt.GridBagLayout;
29     import java.awt.Insets;
30    
31     import java.awt.event.ActionEvent;
32     import java.awt.event.ActionListener;
33    
34     import javax.swing.Box;
35     import javax.swing.BoxLayout;
36     import javax.swing.ButtonGroup;
37     import javax.swing.ImageIcon;
38     import javax.swing.JButton;
39     import javax.swing.JCheckBox;
40     import javax.swing.JComboBox;
41     import javax.swing.JFileChooser;
42     import javax.swing.JLabel;
43     import javax.swing.JPanel;
44     import javax.swing.JRadioButton;
45     import javax.swing.JSlider;
46     import javax.swing.JSpinner;
47     import javax.swing.JTextField;
48     import javax.swing.SpinnerNumberModel;
49    
50     import javax.swing.event.DocumentEvent;
51     import javax.swing.event.DocumentListener;
52    
53     import net.sf.juife.Wizard;
54    
55     import net.sf.juife.wizard.DefaultWizardModel;
56     import net.sf.juife.wizard.UserInputPage;
57     import net.sf.juife.wizard.WizardPage;
58    
59     import org.jsampler.CC;
60     import org.jsampler.Instrument;
61     import org.jsampler.JSPrefs;
62     import org.jsampler.MidiInstrumentMap;
63     import org.jsampler.OrchestraModel;
64    
65 iliev 1329 import org.linuxsampler.lscp.MidiInstrumentEntry;
66 iliev 1286 import org.linuxsampler.lscp.MidiInstrumentInfo;
67     import org.linuxsampler.lscp.SamplerEngine;
68    
69     import static org.jsampler.view.std.StdI18n.i18n;
70    
71    
72     /**
73     * A wizard for mapping new MIDI instrument.
74     * @author Grigor Iliev
75     */
76     public class JSNewMidiInstrumentWizard extends Wizard {
77 iliev 1329 /**
78     * Creates a new instance of <code>JSNewMidiInstrumentWizard</code>.
79     */
80     public
81     JSNewMidiInstrumentWizard(ImageIcon iconBrowse) {
82     this(iconBrowse, null);
83     }
84 iliev 1286
85     /**
86     * Creates a new instance of <code>JSNewMidiInstrumentWizard</code>.
87     */
88     public
89 iliev 1329 JSNewMidiInstrumentWizard(ImageIcon iconBrowse, MidiInstrumentMap defaultMap) {
90 iliev 1286 super(CC.getMainFrame(), i18n.getLabel("JSNewMidiInstrumentWizard.title"));
91 iliev 1329 setModel(new NewMidiInstrumentWizardModel(iconBrowse, defaultMap));
92 iliev 1286 }
93    
94     }
95    
96     class NewMidiInstrumentWizardModel extends DefaultWizardModel {
97     private final InstrLocationMethodWizardPage instrLocationMethodWizardPage;
98     private final OrchestraSelectWizardPage orchestraSelectWizardPage;
99     private final ManualSelectWizardPage manualSelectWizardPage;
100     private final InstrumentMappingWizardPage instrumentMappingWizardPage;
101    
102 iliev 1329 private MidiInstrumentMap defaultMap;
103    
104     NewMidiInstrumentWizardModel(ImageIcon iconBrowse, MidiInstrumentMap defaultMap) {
105     this.defaultMap = defaultMap;
106     instrLocationMethodWizardPage = new InstrLocationMethodWizardPage();
107 iliev 1286 orchestraSelectWizardPage = new OrchestraSelectWizardPage();
108     manualSelectWizardPage = new ManualSelectWizardPage(iconBrowse);
109 iliev 1329 instrumentMappingWizardPage = new InstrumentMappingWizardPage(this);
110 iliev 1286
111     addPage(instrLocationMethodWizardPage);
112     addStep(i18n.getLabel("JSNewMidiInstrumentWizard.step1"));
113    
114     addPage(manualSelectWizardPage);
115     addPage(orchestraSelectWizardPage);
116     addStep(i18n.getLabel("JSNewMidiInstrumentWizard.step2"), 2);
117    
118     addPage(instrumentMappingWizardPage);
119     addStep(i18n.getLabel("JSNewMidiInstrumentWizard.step3"));
120     }
121    
122 iliev 1329 public String
123     getInstrumentName() {
124     if(!instrLocationMethodWizardPage.isOrchestraMethodSelected()) return null;
125     Instrument instr = orchestraSelectWizardPage.getInstrument();
126     if(instr == null) return null;
127     return instr.getName();
128     }
129    
130     /**
131 iliev 1286 * Moves to the next page in the wizard.
132     * @return The next page in the wizard.
133     */
134     public WizardPage
135     next() {
136     InstrLocationMethodWizardPage p1 = instrLocationMethodWizardPage;
137     WizardPage p2 = manualSelectWizardPage;
138    
139     if(getCurrentPage() == p1 && p1.isOrchestraMethodSelected()) {
140     super.next();
141     } else if(getCurrentPage() == manualSelectWizardPage) {
142     super.next();
143     }
144    
145     return super.next();
146     }
147    
148     /**
149     * Moves to the previous page in the wizard.
150     * @return The previous page in the wizard.
151     * @see #hasPrevious
152     */
153     public WizardPage
154     previous() {
155     InstrLocationMethodWizardPage p1 = instrLocationMethodWizardPage;
156     WizardPage p2 = instrumentMappingWizardPage;
157    
158     if(getCurrentPage() == orchestraSelectWizardPage) {
159     super.previous();
160     } else if(getCurrentPage() == p2 && !p1.isOrchestraMethodSelected()) {
161     super.previous();
162     }
163    
164     return super.previous();
165     }
166    
167     public void
168     mapInstrument() {
169     MidiInstrumentInfo instr = new MidiInstrumentInfo();
170     if(instrLocationMethodWizardPage.isOrchestraMethodSelected()) {
171     Instrument i = orchestraSelectWizardPage.getInstrument();
172     instr.setFilePath(i.getPath());
173     instr.setInstrumentIndex(i.getInstrumentIndex());
174     instr.setEngine(i.getEngine());
175     instr.setLoadMode(orchestraSelectWizardPage.getLoadMode());
176     } else {
177     instr.setFilePath(manualSelectWizardPage.getSelectedFile());
178     instr.setInstrumentIndex(manualSelectWizardPage.getInstrumentIndex());
179     instr.setEngine(manualSelectWizardPage.getEngine());
180     instr.setLoadMode(manualSelectWizardPage.getLoadMode());
181     }
182    
183     int map = instrumentMappingWizardPage.getMapId();
184     int bank = instrumentMappingWizardPage.getMidiBank();
185     int prog = instrumentMappingWizardPage.getMidiProgram();
186    
187     instr.setName(instrumentMappingWizardPage.getInstrumentName());
188     instr.setVolume(instrumentMappingWizardPage.getVolume());
189    
190     CC.getSamplerModel().mapBackendMidiInstrument(map, bank, prog, instr);
191     }
192 iliev 1329
193     public MidiInstrumentMap
194     getDefaultMap() { return defaultMap; }
195    
196     public void
197     setDefaultMap(MidiInstrumentMap map) { defaultMap = map; }
198 iliev 1286 }
199    
200     class InstrLocationMethodWizardPage extends UserInputPage {
201     private final static String INSTR_LOCATION_METHOD = "InstrLocationMethod";
202     private final static String NEW_MIDI_INSTR_WIZARD_SKIP1 = "NewMidiInstrumentWizard.skip1";
203    
204     private final JRadioButton rbManual =
205     new JRadioButton(i18n.getLabel("InstrLocationMethodWizardPage.rbManual"));
206    
207     private final JRadioButton rbOrchestra =
208     new JRadioButton(i18n.getLabel("InstrLocationMethodWizardPage.rbOrchestra"));
209    
210     private final JCheckBox checkSkip =
211     new JCheckBox(i18n.getLabel("InstrLocationMethodWizardPage.checkSkip"));
212    
213 iliev 1329 InstrLocationMethodWizardPage() {
214 iliev 1286 super(i18n.getLabel("InstrLocationMethodWizardPage.subtitle"));
215    
216     String s = i18n.getLabel("InstrLocationMethodWizardPage.mainInstructions");
217     setMainInstructions(s);
218    
219     JPanel p = new JPanel();
220     p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
221    
222     ButtonGroup group = new ButtonGroup();
223     group.add(rbManual);
224     group.add(rbOrchestra);
225     rbManual.setSelected(true);
226    
227     p.add(rbManual);
228     p.add(rbOrchestra);
229    
230     JPanel p2 = new JPanel();
231     p2.setLayout(new BorderLayout());
232     p2.add(p, BorderLayout.NORTH);
233     p2.add(checkSkip, BorderLayout.SOUTH);
234     setMainPane(p2);
235    
236 iliev 1329 switch(preferences().getIntProperty(INSTR_LOCATION_METHOD)) {
237 iliev 1286 case 0:
238     rbManual.setSelected(true);
239     break;
240     case 1:
241     rbOrchestra.setSelected(true);
242     }
243    
244 iliev 1329 checkSkip.setSelected(preferences().getBoolProperty(NEW_MIDI_INSTR_WIZARD_SKIP1));
245 iliev 1286
246     rbManual.addActionListener(new ActionListener() {
247     public void
248     actionPerformed(ActionEvent e) {
249     if(rbManual.isSelected()) {
250 iliev 1329 preferences().setIntProperty(INSTR_LOCATION_METHOD, 0);
251 iliev 1286 }
252     }
253     });
254    
255     rbOrchestra.addActionListener(new ActionListener() {
256     public void
257     actionPerformed(ActionEvent e) {
258     if(rbOrchestra.isSelected()) {
259 iliev 1329 preferences().setIntProperty(INSTR_LOCATION_METHOD, 1);
260 iliev 1286 }
261     }
262     });
263    
264     checkSkip.addActionListener(new ActionListener() {
265     public void
266     actionPerformed(ActionEvent e) {
267     boolean b = checkSkip.isSelected();
268 iliev 1329 preferences().setBoolProperty(NEW_MIDI_INSTR_WIZARD_SKIP1, b);
269 iliev 1286 }
270     });
271     }
272    
273 iliev 1329 protected JSPrefs
274     preferences() { return CC.getViewConfig().preferences(); }
275    
276 iliev 1286 /**
277     * Determines whether the user selected an orchestra location method.
278     */
279     public boolean
280     isOrchestraMethodSelected() { return rbOrchestra.isSelected(); }
281     }
282    
283     class OrchestraSelectWizardPage extends UserInputPage {
284     private final JLabel lOrchestras =
285     new JLabel(i18n.getLabel("OrchestraSelectWizardPage.lOrchestras"));
286    
287     private final JLabel lInstruments =
288     new JLabel(i18n.getLabel("OrchestraSelectWizardPage.lInstruments"));
289    
290     private final JLabel lLoadMode =
291     new JLabel(i18n.getLabel("OrchestraSelectWizardPage.lLoadMode"));
292    
293     private final JComboBox cbOrchestras = new JComboBox();
294     private final JComboBox cbInstruments = new JComboBox();
295     private final JComboBox cbLoadMode = new JComboBox();
296    
297     OrchestraSelectWizardPage() {
298     super(i18n.getLabel("OrchestraSelectWizardPage.subtitle"));
299     setMainInstructions(i18n.getLabel("OrchestraSelectWizardPage.mainInstructions"));
300    
301     GridBagLayout gridbag = new GridBagLayout();
302     GridBagConstraints c = new GridBagConstraints();
303    
304     JPanel p = new JPanel();
305    
306     p.setLayout(gridbag);
307    
308     c.fill = GridBagConstraints.NONE;
309    
310     c.gridx = 0;
311     c.gridy = 0;
312     c.anchor = GridBagConstraints.EAST;
313     c.insets = new Insets(0, 0, 6, 16);
314     gridbag.setConstraints(lOrchestras, c);
315     p.add(lOrchestras);
316    
317     c.gridx = 0;
318     c.gridy = 1;
319     gridbag.setConstraints(lInstruments, c);
320     p.add(lInstruments);
321    
322     c.gridx = 0;
323     c.gridy = 2;
324     c.insets = new Insets(12, 0, 6, 16);
325     gridbag.setConstraints(lLoadMode, c);
326     p.add(lLoadMode);
327    
328     c.gridx = 1;
329     c.gridy = 0;
330     c.weightx = 1.0;
331     c.insets = new Insets(0, 0, 6, 48);
332     c.fill = GridBagConstraints.HORIZONTAL;
333     c.anchor = GridBagConstraints.NORTH;
334     gridbag.setConstraints(cbOrchestras, c);
335     p.add(cbOrchestras);
336    
337     c.gridx = 1;
338     c.gridy = 1;
339     gridbag.setConstraints(cbInstruments, c);
340     p.add(cbInstruments);
341    
342     c.gridx = 1;
343     c.gridy = 2;
344     c.insets = new Insets(12, 0, 6, 48);
345     gridbag.setConstraints(cbLoadMode, c);
346     p.add(cbLoadMode);
347    
348     JPanel p2 = new JPanel();
349     p2.setOpaque(false);
350     c.gridx = 0;
351     c.gridy = 3;
352     c.fill = GridBagConstraints.VERTICAL;
353     c.weightx = 0.0;
354     c.weighty = 1.0;
355     gridbag.setConstraints(p2, c);
356     p.add(p2);
357    
358     setMainPane(p);
359    
360 iliev 1329 int orchIdx =
361     preferences().getIntProperty("OrchestraSelectWizardPage.OrchestraIndex", 0);
362    
363 iliev 1286 cbOrchestras.addActionListener(new ActionListener() {
364     public void
365     actionPerformed(ActionEvent e) { orchestraChanged(); }
366     });
367    
368     for(int i = 0; i < CC.getOrchestras().getOrchestraCount(); i++) {
369     cbOrchestras.addItem(CC.getOrchestras().getOrchestra(i));
370     }
371    
372 iliev 1329 if(CC.getOrchestras().getOrchestraCount() > orchIdx) {
373     cbOrchestras.setSelectedIndex(orchIdx);
374     }
375    
376 iliev 1286 cbInstruments.addActionListener(new ActionListener() {
377     public void
378     actionPerformed(ActionEvent e) { instrumentChanged(); }
379     });
380    
381     cbLoadMode.addItem(MidiInstrumentInfo.LoadMode.DEFAULT);
382     cbLoadMode.addItem(MidiInstrumentInfo.LoadMode.ON_DEMAND);
383     cbLoadMode.addItem(MidiInstrumentInfo.LoadMode.ON_DEMAND_HOLD);
384     cbLoadMode.addItem(MidiInstrumentInfo.LoadMode.PERSISTENT);
385 iliev 1329
386     int i = preferences().getIntProperty("std.midiInstrument.loadMode", 0);
387     if(cbLoadMode.getItemCount() > i) cbLoadMode.setSelectedIndex(i);
388    
389     cbLoadMode.addActionListener(new ActionListener() {
390     public void
391     actionPerformed(ActionEvent e) {
392     int j = cbLoadMode.getSelectedIndex();
393     if(j < 0) return;
394     preferences().setIntProperty("std.midiInstrument.loadMode", j);
395     }
396     });
397 iliev 1286 }
398    
399 iliev 1329 protected JSPrefs
400     preferences() { return CC.getViewConfig().preferences(); }
401    
402 iliev 1286 private void
403     orchestraChanged() {
404     OrchestraModel om = (OrchestraModel)cbOrchestras.getSelectedItem();
405     String s = om == null ? null : om.getDescription();
406     if(s != null && s.length() == 0) s = null;
407     cbOrchestras.setToolTipText(s);
408    
409 iliev 1329 s = "OrchestraSelectWizardPage.OrchestraIndex";
410     int orchIdx = cbOrchestras.getSelectedIndex();
411     if(orchIdx >= 0) preferences().setIntProperty(s, orchIdx);
412    
413 iliev 1286 cbInstruments.removeAllItems();
414     if(om == null || om.getInstrumentCount() == 0) {
415     cbInstruments.setEnabled(false);
416     return;
417     }
418    
419     cbInstruments.setEnabled(true);
420    
421     for(int i = 0; i < om.getInstrumentCount(); i++) {
422     cbInstruments.addItem(om.getInstrument(i));
423     }
424     }
425    
426     private void
427     instrumentChanged() {
428     Instrument instr = (Instrument)cbInstruments.getSelectedItem();
429     String s = instr == null ? null : instr.getDescription();
430     if(s != null && s.length() == 0) s = null;
431     cbInstruments.setToolTipText(s);
432    
433     getWizard().enableNextButton(instr != null);
434     }
435    
436     public void
437     postinitPage() {
438     getWizard().enableNextButton(cbInstruments.getSelectedItem() != null);
439     }
440    
441     /**
442     * Gets the selected instrument.
443     */
444     public Instrument
445     getInstrument() { return (Instrument)cbInstruments.getSelectedItem(); }
446    
447     /**
448     * Gets the selected load mode.
449     */
450     public MidiInstrumentInfo.LoadMode
451     getLoadMode() { return (MidiInstrumentInfo.LoadMode) cbLoadMode.getSelectedItem(); }
452     }
453    
454     class ManualSelectWizardPage extends UserInputPage {
455     private final JLabel lFilename =
456     new JLabel(i18n.getLabel("ManualSelectWizardPage.lFilename"));
457    
458     private final JLabel lIndex = new JLabel(i18n.getLabel("ManualSelectWizardPage.lIndex"));
459    
460     private final JLabel lEngine = new JLabel(i18n.getLabel("ManualSelectWizardPage.lEngine"));
461    
462     private final JLabel lLoadMode =
463     new JLabel(i18n.getLabel("ManualSelectWizardPage.lLoadMode"));
464    
465 iliev 1329 private final JComboBox cbFilename = new JComboBox();
466 iliev 1286 private final JSpinner spinnerIndex = new JSpinner(new SpinnerNumberModel(0, 0, 500, 1));
467    
468     private final JButton btnBrowse;
469    
470     private final JComboBox cbEngine = new JComboBox();
471     private final JComboBox cbLoadMode = new JComboBox();
472    
473     ManualSelectWizardPage(ImageIcon iconBrowse) {
474     super(i18n.getLabel("ManualSelectWizardPage.subtitle"));
475     setMainInstructions(i18n.getLabel("ManualSelectWizardPage.mainInstructions"));
476    
477     GridBagLayout gridbag = new GridBagLayout();
478     GridBagConstraints c = new GridBagConstraints();
479    
480     JPanel mainPane = new JPanel();
481    
482     mainPane.setLayout(gridbag);
483    
484     c.fill = GridBagConstraints.NONE;
485    
486     c.gridx = 0;
487     c.gridy = 0;
488     c.anchor = GridBagConstraints.EAST;
489     c.insets = new Insets(3, 3, 3, 3);
490     gridbag.setConstraints(lFilename, c);
491     mainPane.add(lFilename);
492    
493     c.gridx = 0;
494     c.gridy = 1;
495     gridbag.setConstraints(lIndex, c);
496     mainPane.add(lIndex);
497    
498     c.gridx = 0;
499     c.gridy = 2;
500     c.insets = new Insets(12, 3, 3, 3);
501     gridbag.setConstraints(lEngine, c);
502     mainPane.add(lEngine);
503    
504     c.gridx = 0;
505     c.gridy = 3;
506     c.insets = new Insets(3, 3, 3, 3);
507     gridbag.setConstraints(lLoadMode, c);
508     mainPane.add(lLoadMode);
509    
510     btnBrowse = new JButton(iconBrowse);
511     btnBrowse.setMargin(new Insets(0, 0, 0, 0));
512     btnBrowse.setToolTipText(i18n.getLabel("ManualSelectWizardPage.btnBrowse"));
513     c.gridx = 2;
514     c.gridy = 0;
515     gridbag.setConstraints(btnBrowse, c);
516     mainPane.add(btnBrowse);
517    
518     c.fill = GridBagConstraints.HORIZONTAL;
519     c.gridx = 1;
520     c.gridy = 0;
521     c.weightx = 1.0;
522     c.anchor = GridBagConstraints.WEST;
523 iliev 1329 gridbag.setConstraints(cbFilename, c);
524     mainPane.add(cbFilename);
525 iliev 1286
526     c.gridx = 1;
527     c.gridy = 1;
528     gridbag.setConstraints(spinnerIndex, c);
529     mainPane.add(spinnerIndex);
530    
531     c.gridx = 1;
532     c.gridy = 2;
533     c.insets = new Insets(12, 3, 3, 64);
534     gridbag.setConstraints(cbEngine, c);
535     mainPane.add(cbEngine);
536    
537     c.gridx = 1;
538     c.gridy = 3;
539     c.insets = new Insets(3, 3, 3, 64);
540     gridbag.setConstraints(cbLoadMode, c);
541     mainPane.add(cbLoadMode);
542    
543     JPanel p2 = new JPanel();
544     p2.setOpaque(false);
545     c.gridx = 0;
546     c.gridy = 4;
547     c.fill = GridBagConstraints.VERTICAL;
548     c.weightx = 0.0;
549     c.weighty = 1.0;
550     gridbag.setConstraints(p2, c);
551     mainPane.add(p2);
552    
553     setMainPane(mainPane);
554    
555 iliev 1329 cbFilename.setEditable(true);
556     String[] files = preferences().getStringListProperty("recentInstrumentFiles");
557     for(String s : files) cbFilename.addItem(s);
558     cbFilename.setSelectedItem(null);
559 iliev 1286
560 iliev 1329 cbFilename.addActionListener(new ActionListener() {
561     public void
562     actionPerformed(ActionEvent e) { updateState(); }
563     });
564    
565 iliev 1286 btnBrowse.addActionListener(new ActionListener() {
566     public void
567     actionPerformed(ActionEvent e) { onBrowse(); }
568     });
569    
570     for(SamplerEngine e : CC.getSamplerModel().getEngines()) cbEngine.addItem(e);
571    
572     cbLoadMode.addItem(MidiInstrumentInfo.LoadMode.DEFAULT);
573     cbLoadMode.addItem(MidiInstrumentInfo.LoadMode.ON_DEMAND);
574     cbLoadMode.addItem(MidiInstrumentInfo.LoadMode.ON_DEMAND_HOLD);
575     cbLoadMode.addItem(MidiInstrumentInfo.LoadMode.PERSISTENT);
576 iliev 1329
577     int i = preferences().getIntProperty("std.midiInstrument.loadMode", 0);
578     if(cbLoadMode.getItemCount() > i) cbLoadMode.setSelectedIndex(i);
579    
580     cbLoadMode.addActionListener(new ActionListener() {
581     public void
582     actionPerformed(ActionEvent e) {
583     int j = cbLoadMode.getSelectedIndex();
584     if(j < 0) return;
585     preferences().setIntProperty("std.midiInstrument.loadMode", j);
586     }
587     });
588 iliev 1286 }
589    
590 iliev 1329 protected JSPrefs
591     preferences() { return CC.getViewConfig().preferences(); }
592    
593 iliev 1286 private void
594     onBrowse() {
595 iliev 1329 String s = preferences().getStringProperty("lastInstrumentLocation");
596     JFileChooser fc = new JFileChooser(s);
597 iliev 1286 int result = fc.showOpenDialog(this);
598 iliev 1329 if(result != JFileChooser.APPROVE_OPTION) return;
599    
600     cbFilename.setSelectedItem(fc.getSelectedFile().getPath());
601     String path = fc.getCurrentDirectory().getAbsolutePath();
602     preferences().setStringProperty("lastInstrumentLocation", path);
603 iliev 1286 }
604    
605     private void
606 iliev 1329 updateState() {
607     boolean b = false;
608     Object o = cbFilename.getSelectedItem();
609     if(o == null) b = false;
610     else b = o.toString().length() > 0;
611     getWizard().enableNextButton(b);
612     }
613 iliev 1286
614     public void
615     postinitPage() {
616     updateState();
617     }
618    
619     /**
620     * Gets the name of the instrument file.
621     * @return The name of the instrument file.
622     */
623     public String
624 iliev 1329 getSelectedFile() { return cbFilename.getSelectedItem().toString(); }
625 iliev 1286
626     /**
627     * Gets the index of the instrument in the instrument file.
628     * @return The index of the instrument in the instrument file.
629     */
630     public int
631     getInstrumentIndex() { return Integer.parseInt(spinnerIndex.getValue().toString()); }
632    
633     /**
634     * Gets the selected engine.
635     */
636     public String
637     getEngine() { return ((SamplerEngine)cbEngine.getSelectedItem()).getName(); }
638    
639     /**
640     * Gets the selected load mode.
641     */
642     public MidiInstrumentInfo.LoadMode
643     getLoadMode() { return (MidiInstrumentInfo.LoadMode)cbLoadMode.getSelectedItem(); }
644    
645     private final Handler eventHandler = new Handler();
646    
647     private Handler
648     getHandler() { return eventHandler; }
649    
650     private class Handler implements DocumentListener {
651     // DocumentListener
652     public void
653     insertUpdate(DocumentEvent e) { updateState(); }
654    
655     public void
656     removeUpdate(DocumentEvent e) { updateState(); }
657    
658     public void
659     changedUpdate(DocumentEvent e) { updateState(); }
660     }
661     }
662    
663     class InstrumentMappingWizardPage extends WizardPage {
664     private final JLabel lName = new JLabel(i18n.getLabel("InstrumentMappingWizardPage.lName"));
665     private final JLabel lMap = new JLabel(i18n.getLabel("InstrumentMappingWizardPage.lMap"));
666     private final JLabel lBank = new JLabel(i18n.getLabel("InstrumentMappingWizardPage.lBank"));
667     private final JLabel lProgram =
668     new JLabel(i18n.getLabel("InstrumentMappingWizardPage.lProgram"));
669    
670     private final JLabel lVolume =
671     new JLabel(i18n.getLabel("InstrumentMappingWizardPage.lVolume"));
672    
673     private final JTextField tfName = new JTextField();
674     private final JComboBox cbMap = new JComboBox();
675     private final JSpinner spinnerBank = new JSpinner(new SpinnerNumberModel(0, 0, 16383, 1));
676     private final JComboBox cbProgram = new JComboBox();
677     private final JSlider slVolume = new JSlider(0, 100, 100);
678    
679 iliev 1329 private final NewMidiInstrumentWizardModel wizardModel;
680    
681     InstrumentMappingWizardPage(NewMidiInstrumentWizardModel wizardModel) {
682 iliev 1286 super(i18n.getLabel("InstrumentMappingWizardPage.subtitle"));
683 iliev 1329 this.wizardModel = wizardModel;
684    
685 iliev 1286 setPageType(Type.CONFIRMATION_PAGE);
686    
687     GridBagLayout gridbag = new GridBagLayout();
688     GridBagConstraints c = new GridBagConstraints();
689    
690     setLayout(gridbag);
691    
692     c.fill = GridBagConstraints.NONE;
693    
694     c.gridx = 0;
695     c.gridy = 0;
696     c.anchor = GridBagConstraints.EAST;
697     c.insets = new Insets(24, 3, 3, 0);
698     gridbag.setConstraints(lName, c);
699     add(lName);
700    
701     c.gridx = 0;
702     c.gridy = 2;
703     c.insets = new Insets(3, 3, 3, 0);
704     gridbag.setConstraints(lMap, c);
705     add(lMap);
706    
707     c.gridx = 0;
708     c.gridy = 3;
709     gridbag.setConstraints(lBank, c);
710     add(lBank);
711    
712     c.gridx = 0;
713     c.gridy = 4;
714     gridbag.setConstraints(lProgram, c);
715     add(lProgram);
716    
717     c.gridx = 0;
718     c.gridy = 1;
719     c.insets = new Insets(3, 3, 24, 0);
720     gridbag.setConstraints(lVolume, c);
721     add(lVolume);
722    
723     c.fill = GridBagConstraints.HORIZONTAL;
724     c.gridx = 1;
725     c.gridy = 0;
726     c.weightx = 1.0;
727     c.insets = new Insets(24, 12, 3, 36);
728     c.anchor = GridBagConstraints.WEST;
729     gridbag.setConstraints(tfName, c);
730     add(tfName);
731    
732     c.gridx = 1;
733     c.gridy = 2;
734     c.insets = new Insets(3, 12, 3, 36);
735     gridbag.setConstraints(cbMap, c);
736     add(cbMap);
737    
738     c.gridx = 1;
739     c.gridy = 3;
740     gridbag.setConstraints(spinnerBank, c);
741     add(spinnerBank);
742    
743     c.gridx = 1;
744     c.gridy = 4;
745     gridbag.setConstraints(cbProgram, c);
746     add(cbProgram);
747    
748     c.gridx = 1;
749     c.gridy = 1;
750     c.insets = new Insets(3, 12, 24, 36);
751     gridbag.setConstraints(slVolume, c);
752     add(slVolume);
753    
754     JPanel p2 = new JPanel();
755     p2.setOpaque(false);
756     c.gridx = 0;
757     c.gridy = 5;
758     c.insets = new Insets(0, 0, 0, 0);
759     c.fill = GridBagConstraints.VERTICAL;
760     c.weightx = 0.0;
761     c.weighty = 1.0;
762     gridbag.setConstraints(p2, c);
763     add(p2);
764    
765     cbMap.addActionListener(new ActionListener() {
766     public void
767     actionPerformed(ActionEvent e) { updateState(); }
768     });
769    
770     for(MidiInstrumentMap m : CC.getSamplerModel().getMidiInstrumentMaps()) {
771     cbMap.addItem(m);
772     }
773    
774     tfName.getDocument().addDocumentListener(getHandler());
775    
776     cbMap.setEnabled(cbMap.getItemCount() > 0);
777    
778    
779     for(int i = 0; i < 128; i++) cbProgram.addItem(new Integer(i));
780 iliev 1329
781     cbMap.addActionListener(new ActionListener() {
782     public void
783     actionPerformed(ActionEvent e) { updateMapping(); }
784     });
785    
786     updateMapping();
787 iliev 1286 }
788    
789 iliev 1329 protected JSPrefs
790     preferences() { return CC.getViewConfig().preferences(); }
791    
792 iliev 1286 private void
793     updateState() {
794     cbMap.setEnabled(cbMap.getItemCount() > 0);
795     boolean b = cbMap.getSelectedItem() != null;
796     spinnerBank.setEnabled(b);
797     cbProgram.setEnabled(b);
798    
799     b = tfName.getText().length() > 0 && cbMap.getSelectedItem() != null;
800     b = b && cbProgram.getSelectedItem() != null;
801     if(getWizard() != null) getWizard().enableFinishButton(b);
802     }
803    
804 iliev 1329 private void
805     updateMapping() {
806     if(cbMap.getSelectedItem() == null) return;
807     MidiInstrumentMap map = (MidiInstrumentMap)cbMap.getSelectedItem();
808     MidiInstrumentEntry entry = map.getAvailableEntry();
809     if(entry == null) return;
810     spinnerBank.setValue(entry.getMidiBank());
811     cbProgram.setSelectedIndex(entry.getMidiProgram());
812     }
813    
814 iliev 1286 public void
815     postinitPage() {
816 iliev 1329 String s = wizardModel.getInstrumentName();
817     if(s != null) tfName.setText(s);
818     if(wizardModel.getDefaultMap() != null) {
819     cbMap.setSelectedItem(wizardModel.getDefaultMap());
820     }
821 iliev 1286 updateState();
822     }
823    
824     /**
825     * Invoked when the user clicks the 'Finish' button
826     * while this page is the current page of the wizard.
827     * @return <code>true</code>
828     */
829     public boolean
830     mayFinish() {
831     ((NewMidiInstrumentWizardModel)getWizardModel()).mapInstrument();
832 iliev 1329 preferences().setIntProperty("lastUsedMidiBank", getMidiBank());
833 iliev 1286 return true;
834     }
835    
836     /**
837     * Gets the ID of the selected MIDI instrument map.
838     */
839     public int
840     getMapId() { return ((MidiInstrumentMap)cbMap.getSelectedItem()).getMapId(); }
841    
842     /**
843     * Gets the selected MIDI bank.
844     */
845     public int
846     getMidiBank() { return Integer.parseInt(spinnerBank.getValue().toString()); }
847    
848     /**
849     * Gets the selected MIDI program.
850     */
851     public int
852     getMidiProgram() { return cbProgram.getSelectedIndex(); }
853    
854     /**
855     * Gets the chosen name for the new MIDI instrument.
856     * @return The chosen name for the new MIDI instrument.
857     */
858     public String
859     getInstrumentName() { return tfName.getText(); }
860    
861     /**
862     * Returns the volume level of the new MIDI instrument.
863     * @return The volume level of the new MIDI instrument.
864     */
865     public float
866     getVolume() {
867     float f = slVolume.getValue();
868     f /= 100;
869     return f;
870     }
871    
872     private final Handler eventHandler = new Handler();
873    
874     private Handler
875     getHandler() { return eventHandler; }
876    
877     private class Handler implements DocumentListener {
878     // DocumentListener
879     public void
880     insertUpdate(DocumentEvent e) { updateState(); }
881    
882     public void
883     removeUpdate(DocumentEvent e) { updateState(); }
884    
885     public void
886     changedUpdate(DocumentEvent e) { updateState(); }
887     }
888     }

  ViewVC Help
Powered by ViewVC