/[svn]/jsampler/trunk/src/org/jsampler/view/fantasia/NormalChannelOptionsView.java
ViewVC logotype

Annotation of /jsampler/trunk/src/org/jsampler/view/fantasia/NormalChannelOptionsView.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2288 - (hide annotations) (download)
Wed Nov 23 21:19:44 2011 UTC (12 years, 5 months ago) by iliev
File size: 20227 byte(s)
* Added option to select a sampler engine in Add/Edit Instrument dialog
* Moved all Swing dependent code outside the JSampler core

1 iliev 1730 /*
2     * JSampler - a java front-end for LinuxSampler
3     *
4 iliev 2288 * Copyright (C) 2005-2011 Grigor Iliev <grigor@grigoriliev.com>
5 iliev 1730 *
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.fantasia;
24    
25     import java.awt.BorderLayout;
26     import java.awt.Dimension;
27     import java.awt.Insets;
28    
29     import java.awt.event.ActionEvent;
30     import java.awt.event.ActionListener;
31    
32     import java.util.logging.Level;
33    
34     import javax.swing.BorderFactory;
35     import javax.swing.Box;
36     import javax.swing.BoxLayout;
37     import javax.swing.JComboBox;
38     import javax.swing.JComponent;
39     import javax.swing.JLabel;
40     import javax.swing.JPanel;
41     import javax.swing.SwingConstants;
42    
43     import org.jsampler.AudioDeviceModel;
44     import org.jsampler.CC;
45     import org.jsampler.MidiDeviceModel;
46     import org.jsampler.MidiInstrumentMap;
47     import org.jsampler.SamplerModel;
48    
49     import org.jsampler.event.ListEvent;
50     import org.jsampler.event.ListListener;
51     import org.jsampler.event.MidiDeviceEvent;
52     import org.jsampler.event.MidiDeviceListEvent;
53     import org.jsampler.event.MidiDeviceListListener;
54     import org.jsampler.event.MidiDeviceListener;
55     import org.jsampler.event.SamplerAdapter;
56     import org.jsampler.event.SamplerChannelAdapter;
57     import org.jsampler.event.SamplerChannelEvent;
58     import org.jsampler.event.SamplerEvent;
59     import org.jsampler.event.SamplerListener;
60    
61 iliev 1785 import org.jsampler.view.fantasia.basic.*;
62 iliev 1730 import org.jsampler.view.std.JSChannelOutputRoutingDlg;
63 iliev 2288 import org.jsampler.view.swing.SHF;
64 iliev 1730
65     import org.linuxsampler.lscp.AudioOutputDevice;
66     import org.linuxsampler.lscp.MidiInputDevice;
67     import org.linuxsampler.lscp.MidiPort;
68     import org.linuxsampler.lscp.SamplerChannel;
69    
70 iliev 2146 import org.pushingpixels.substance.api.SubstanceLookAndFeel;
71    
72 iliev 1730 import static org.jsampler.view.fantasia.FantasiaI18n.i18n;
73    
74     /**
75     *
76     * @author Grigor Iliev
77     */
78     public class NormalChannelOptionsView extends JPanel implements ChannelOptionsView {
79     private final Channel channel;
80     private MidiDeviceModel midiDevice = null;
81    
82     private final JComboBox cbMidiDevice = new FantasiaComboBox();
83     private final JComboBox cbMidiPort = new FantasiaComboBox();
84     private final JComboBox cbMidiChannel = new FantasiaComboBox();
85     private final JComboBox cbInstrumentMap = new FantasiaComboBox();
86     private final JComboBox cbAudioDevice = new FantasiaComboBox();
87    
88     private final PixmapButton btnChannelRouting;
89    
90     private boolean update = false;
91    
92     private final SamplerListener samplerListener;
93     private final MapListListener mapListListener = new MapListListener();
94    
95     private class NoMap {
96     public String
97     toString() { return "[None]"; }
98     }
99    
100     private NoMap noMap = new NoMap();
101    
102     private class DefaultMap {
103     public String
104     toString() { return "[Default]"; }
105     }
106    
107     private DefaultMap defaultMap = new DefaultMap();
108    
109     /** Creates a new instance of <code>NormalChannelOptionsView</code> */
110     public
111     NormalChannelOptionsView(final Channel channel) {
112     setLayout(new BorderLayout());
113     PixmapPane bgp = new PixmapPane(Res.gfxChannelOptions);
114     bgp.setPixmapInsets(new Insets(1, 1, 1, 1));
115    
116     this.channel = channel;
117    
118     bgp.setBorder(BorderFactory.createEmptyBorder(5, 4, 5, 4));
119     bgp.setLayout(new BoxLayout(bgp, BoxLayout.X_AXIS));
120    
121     bgp.setPreferredSize(new Dimension(420, 44));
122     bgp.setMinimumSize(getPreferredSize());
123     bgp.setMaximumSize(getPreferredSize());
124    
125 iliev 1743 JPanel p = new FantasiaPanel();
126 iliev 1730 p.setBorder(BorderFactory.createEmptyBorder(3, 4, 3, 4));
127     p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
128     JLabel l = new JLabel(Res.gfxMidiInputTitle);
129     l.setAlignmentX(LEFT_ALIGNMENT);
130     p.add(l);
131    
132 iliev 1743 JPanel p2 = new FantasiaPanel();
133 iliev 1730 p2.setBorder(BorderFactory.createEmptyBorder(3, 0, 0, 0));
134     p2.setLayout(new BoxLayout(p2, BoxLayout.X_AXIS));
135    
136     Object o = cbMidiDevice.getRenderer();
137     if(o instanceof JLabel) ((JLabel )o).setHorizontalAlignment(SwingConstants.CENTER);
138    
139     cbMidiDevice.setPreferredSize(new Dimension(40, 18));
140     cbMidiDevice.setMinimumSize(cbMidiDevice.getPreferredSize());
141     cbMidiDevice.setMaximumSize(cbMidiDevice.getPreferredSize());
142     p2.add(cbMidiDevice);
143    
144     p2.add(Box.createRigidArea(new Dimension(3, 0)));
145    
146     o = cbMidiPort.getRenderer();
147 iliev 2146 if(o instanceof JLabel) ((JLabel )o).setHorizontalAlignment(SwingConstants.LEFT);
148    
149     cbMidiPort.addActionListener(new ActionListener() {
150     public void
151     actionPerformed(ActionEvent e) {
152     updateCbMidiPortToolTipText();
153     }
154     });
155    
156 iliev 1730 cbMidiPort.setPreferredSize(new Dimension(62, 18));
157     cbMidiPort.setMinimumSize(cbMidiPort.getPreferredSize());
158     cbMidiPort.setMaximumSize(cbMidiPort.getPreferredSize());
159     p2.add(cbMidiPort);
160    
161     p2.add(Box.createRigidArea(new Dimension(3, 0)));
162    
163     o = cbMidiChannel.getRenderer();
164     if(o instanceof JLabel) ((JLabel )o).setHorizontalAlignment(SwingConstants.CENTER);
165    
166     cbMidiChannel.addItem("All");
167     for(int i = 1; i <= 16; i++) cbMidiChannel.addItem("Channel " + String.valueOf(i));
168     cbMidiChannel.setPreferredSize(new Dimension(84, 18));
169     cbMidiChannel.setMinimumSize(cbMidiChannel.getPreferredSize());
170     cbMidiChannel.setMaximumSize(cbMidiChannel.getPreferredSize());
171    
172     p2.add(cbMidiChannel);
173     p2.setAlignmentX(LEFT_ALIGNMENT);
174     p2.setOpaque(false);
175     p.add(p2);
176     p.setBackground(new java.awt.Color(0x818181));
177    
178     bgp.add(p);
179    
180     bgp.add(Box.createRigidArea(new Dimension(4, 0)));
181    
182 iliev 1743 p = new FantasiaPanel();
183 iliev 1730 p.setOpaque(true);
184     p.setBorder(BorderFactory.createEmptyBorder(3, 4, 3, 4));
185     p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
186     l = new JLabel(Res.gfxInstrumentMapTitle);
187     l.setAlignmentX(LEFT_ALIGNMENT);
188     l.setAlignmentX(LEFT_ALIGNMENT);
189     p.add(l);
190    
191     p.add(Box.createRigidArea(new Dimension(0, 3)));
192    
193     //o = cbInstrumentMap.getRenderer();
194     //if(o instanceof JLabel) ((JLabel )o).setHorizontalAlignment(SwingConstants.CENTER);
195    
196     cbInstrumentMap.setPreferredSize(new Dimension(122, 18));
197     cbInstrumentMap.setMinimumSize(cbInstrumentMap.getPreferredSize());
198     cbInstrumentMap.setMaximumSize(cbInstrumentMap.getPreferredSize());
199     cbInstrumentMap.setAlignmentX(LEFT_ALIGNMENT);
200     p.add(cbInstrumentMap);
201     p.setBackground(new java.awt.Color(0x818181));
202     bgp.add(p);
203    
204     bgp.add(Box.createRigidArea(new Dimension(4, 0)));
205    
206 iliev 1743 p = new FantasiaPanel();
207 iliev 1730 p.setOpaque(true);
208     p.setBorder(BorderFactory.createEmptyBorder(3, 4, 3, 4));
209     p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
210     l = new JLabel(Res.gfxAudioOutputTitle);
211     l.setAlignmentX(LEFT_ALIGNMENT);
212     p.add(l);
213    
214     //p.add(Box.createRigidArea(new Dimension(0, 3)));
215    
216 iliev 1743 p2 = new FantasiaPanel();
217 iliev 1730 p2.setBorder(BorderFactory.createEmptyBorder(3, 0, 0, 0));
218     p2.setLayout(new BoxLayout(p2, BoxLayout.X_AXIS));
219     p2.setOpaque(false);
220     p2.setAlignmentX(LEFT_ALIGNMENT);
221    
222     o = cbAudioDevice.getRenderer();
223     if(o instanceof JLabel) ((JLabel )o).setHorizontalAlignment(SwingConstants.RIGHT);
224    
225     cbAudioDevice.setPreferredSize(new Dimension(40, 18));
226     cbAudioDevice.setMinimumSize(cbAudioDevice.getPreferredSize());
227     cbAudioDevice.setMaximumSize(cbAudioDevice.getPreferredSize());
228    
229     p2.add(cbAudioDevice);
230     p2.add(Box.createRigidArea(new Dimension(3, 0)));
231     btnChannelRouting = new PixmapButton(Res.gfxBtnCr, Res.gfxBtnCrRO);
232     btnChannelRouting.setPressedIcon(Res.gfxBtnCrRO);
233     btnChannelRouting.setEnabled(false);
234     btnChannelRouting.setToolTipText(i18n.getLabel("ChannelOptions.routing"));
235    
236     btnChannelRouting.addActionListener(new ActionListener() {
237     public void
238     actionPerformed(ActionEvent e) {
239     SamplerChannel c = channel.getChannelInfo();
240 iliev 2288 new JSChannelOutputRoutingDlg(SHF.getMainFrame(), c).setVisible(true);
241 iliev 1730
242     }
243     });
244    
245     p2.add(btnChannelRouting);
246    
247     p.add(p2);
248     p.setBackground(new java.awt.Color(0x818181));
249 iliev 1743 p2 = new FantasiaPanel();
250 iliev 1730 p2.setLayout(new java.awt.BorderLayout());
251     p.add(p2);
252     bgp.add(p);
253    
254     add(bgp);
255    
256     cbMidiDevice.addActionListener(new ActionListener() {
257     public void
258     actionPerformed(ActionEvent e) { setMidiDevice(); }
259     });
260    
261     cbMidiPort.addActionListener(new ActionListener() {
262     public void
263     actionPerformed(ActionEvent e) { setMidiPort(); }
264     });
265    
266     cbMidiChannel.addActionListener(new ActionListener() {
267     public void
268     actionPerformed(ActionEvent e) { setMidiChannel(); }
269     });
270    
271     samplerListener = new SamplerAdapter() {
272     /** Invoked when the default MIDI instrument map is changed. */
273     public void
274     defaultMapChanged(SamplerEvent e) {
275     updateCbInstrumentMapToolTipText();
276    
277     }
278     };
279    
280     CC.getSamplerModel().addSamplerListener(samplerListener);
281    
282     cbInstrumentMap.addItem(noMap);
283     cbInstrumentMap.addItem(defaultMap);
284     for(MidiInstrumentMap map : CC.getSamplerModel().getMidiInstrumentMaps()) {
285     cbInstrumentMap.addItem(map);
286     }
287    
288     int map = channel.getModel().getChannelInfo().getMidiInstrumentMapId();
289     cbInstrumentMap.setSelectedItem(CC.getSamplerModel().getMidiInstrumentMapById(map));
290     if(cbInstrumentMap.getSelectedItem() == null) {
291     if(map == -1) cbInstrumentMap.setSelectedItem(noMap);
292     else if(map == -2) {
293     cbInstrumentMap.setSelectedItem(defaultMap);
294     }
295     }
296    
297     updateCbInstrumentMapToolTipText();
298    
299     if(channel.getModel().getChannelInfo().getEngine() == null) {
300     cbInstrumentMap.setEnabled(false);
301     }
302    
303     cbInstrumentMap.addActionListener(new ActionListener() {
304     public void
305     actionPerformed(ActionEvent e) { updateInstrumentMap(); }
306     });
307    
308     CC.getSamplerModel().addMidiInstrumentMapListListener(mapListListener);
309    
310     cbAudioDevice.addActionListener(new ActionListener() {
311     public void
312     actionPerformed(ActionEvent e) { setBackendAudioDevice(); }
313     });
314    
315     channel.getModel().addSamplerChannelListener(new SamplerChannelAdapter() {
316     public void
317     channelChanged(SamplerChannelEvent e) { updateChannelProperties(); }
318     });
319    
320     CC.getSamplerModel().addMidiDeviceListListener(getHandler());
321     CC.getSamplerModel().addAudioDeviceListListener(getHandler());
322    
323     updateMidiDevices();
324     updateAudioDevices();
325     updateChannelProperties();
326     }
327    
328     //////////////////////////////////////////////
329     // Implementation of the ChannelOptionsView interface
330     //////////////////////////////////////////////
331    
332     public JComponent
333     getComponent() { return this; }
334    
335     public void
336     installView() { }
337    
338     public void
339     uninstallView() {
340     onDestroy();
341     }
342    
343     public void
344     updateChannelInfo() {
345    
346     }
347    
348     //////////////////////////////////////////////
349    
350     /**
351     * Updates the channel settings. This method is invoked when changes to the
352     * channel were made.
353     */
354     private void
355     updateChannelProperties() {
356     SamplerModel sm = CC.getSamplerModel();
357     SamplerChannel sc = channel.getModel().getChannelInfo();
358    
359     MidiDeviceModel mm = sm.getMidiDeviceById(sc.getMidiInputDevice());
360     AudioDeviceModel am = sm.getAudioDeviceById(sc.getAudioOutputDevice());
361    
362     if(isUpdate()) CC.getLogger().warning("Unexpected update state!");
363    
364     setUpdate(true);
365    
366     try {
367     cbMidiDevice.setSelectedItem(mm == null ? null : mm.getDeviceInfo());
368    
369     cbAudioDevice.setSelectedItem(am == null ? null : am.getDeviceInfo());
370     btnChannelRouting.setEnabled(am != null);
371     } catch(Exception x) {
372     CC.getLogger().log(Level.WARNING, "Unkown error", x);
373     }
374    
375     if(sc.getEngine() != null) {
376     cbInstrumentMap.setEnabled(true);
377     int id = sc.getMidiInstrumentMapId();
378     Object o;
379     if(id == -2) o = defaultMap;
380     else if(id == -1) o = noMap;
381     else o = CC.getSamplerModel().getMidiInstrumentMapById(id);
382    
383     if(cbInstrumentMap.getSelectedItem() != o) {
384     cbInstrumentMap.setSelectedItem(o);
385     }
386     } else {
387     cbInstrumentMap.setSelectedItem(noMap);
388     cbInstrumentMap.setEnabled(false);
389     }
390    
391     setUpdate(false);
392     }
393    
394     /**
395     * Updates the MIDI device list.
396     */
397     private void
398     updateMidiDevices() {
399     SamplerModel sm = CC.getSamplerModel();
400     SamplerChannel sc = channel.getModel().getChannelInfo();
401    
402     setUpdate(true);
403    
404     try {
405     cbMidiDevice.removeAllItems();
406    
407     for(MidiDeviceModel m : sm.getMidiDevices())
408     cbMidiDevice.addItem(m.getDeviceInfo());
409    
410     MidiDeviceModel mm = sm.getMidiDeviceById(sc.getMidiInputDevice());
411     cbMidiDevice.setSelectedItem(mm == null ? null : mm.getDeviceInfo());
412     } catch(Exception x) {
413     CC.getLogger().log(Level.WARNING, "Unkown error", x);
414     }
415    
416     setUpdate(false);
417     }
418    
419    
420     private void
421     updateInstrumentMap() {
422     updateCbInstrumentMapToolTipText();
423    
424     int id = channel.getModel().getChannelInfo().getMidiInstrumentMapId();
425     Object o = cbInstrumentMap.getSelectedItem();
426     if(o == null && id == -1) return;
427    
428     int cbId;
429     if(o == null || o == noMap) cbId = -1;
430     else if(o == defaultMap) cbId = -2;
431     else cbId = ((MidiInstrumentMap)o).getMapId();
432    
433     if(cbId == id) return;
434    
435     channel.getModel().setBackendMidiInstrumentMap(cbId);
436     }
437    
438     private void
439 iliev 2146 updateCbMidiPortToolTipText() {
440     if(cbMidiPort.getSelectedItem() == null) {
441     cbMidiPort.setToolTipText(null);
442     return;
443     }
444    
445     cbMidiPort.setToolTipText(cbMidiPort.getSelectedItem().toString());
446     }
447    
448     private void
449 iliev 1730 updateCbInstrumentMapToolTipText() {
450     if(cbInstrumentMap.getSelectedItem() != defaultMap) {
451     cbInstrumentMap.setToolTipText(null);
452     return;
453     }
454 iliev 2146
455 iliev 1730 MidiInstrumentMap m = CC.getSamplerModel().getDefaultMidiInstrumentMap();
456     if(m != null) {
457     String s = i18n.getLabel("Channel.ttDefault", m.getName());
458     cbInstrumentMap.setToolTipText(s);
459     } else {
460     cbInstrumentMap.setToolTipText(null);
461     }
462     }
463    
464     /**
465     * Updates the audio device list.
466     */
467     private void
468     updateAudioDevices() {
469     SamplerModel sm = CC.getSamplerModel();
470     SamplerChannel sc = channel.getModel().getChannelInfo();
471    
472     setUpdate(true);
473    
474     try {
475     cbAudioDevice.removeAllItems();
476    
477     for(AudioDeviceModel m : sm.getAudioDevices())
478     cbAudioDevice.addItem(m.getDeviceInfo());
479    
480     AudioDeviceModel am = sm.getAudioDeviceById(sc.getAudioOutputDevice());
481     cbAudioDevice.setSelectedItem(am == null ? null : am.getDeviceInfo());
482     } catch(Exception x) {
483     CC.getLogger().log(Level.WARNING, "Unkown error", x);
484     }
485    
486     setUpdate(false);
487     }
488    
489     private void
490     setMidiDevice() {
491     MidiInputDevice mid = (MidiInputDevice)cbMidiDevice.getSelectedItem();
492    
493     if(!isUpdate()) {
494     if(mid != null) {
495     channel.getModel().setBackendMidiInputDevice(mid.getDeviceId());
496     }
497    
498     return;
499     }
500    
501     if(midiDevice != null) midiDevice.removeMidiDeviceListener(getHandler());
502    
503     cbMidiPort.removeAllItems();
504    
505     if(mid == null) {
506     midiDevice = null;
507     cbMidiPort.setEnabled(false);
508    
509     cbMidiChannel.setSelectedItem(null);
510     cbMidiChannel.setEnabled(false);
511     } else {
512     midiDevice = CC.getSamplerModel().getMidiDeviceById(mid.getDeviceId());
513     if(midiDevice != null) midiDevice.addMidiDeviceListener(getHandler());
514    
515     cbMidiPort.setEnabled(true);
516    
517     MidiPort[] ports = mid.getMidiPorts();
518     for(MidiPort port : ports) cbMidiPort.addItem(port);
519    
520     int p = channel.getModel().getChannelInfo().getMidiInputPort();
521     cbMidiPort.setSelectedItem(p >= 0 && p < ports.length ? ports[p] : null);
522 iliev 2146
523     cbMidiPort.putClientProperty (
524     SubstanceLookAndFeel.COMBO_POPUP_PROTOTYPE,
525     new FantasiaComboBox.WidestComboPopupPrototype()
526     );
527 iliev 1730
528     cbMidiChannel.setEnabled(true);
529     int c = channel.getModel().getChannelInfo().getMidiInputChannel();
530     cbMidiChannel.setSelectedItem(c == -1 ? "All" : "Channel " + (c + 1));
531     }
532     }
533    
534     private void
535     setMidiPort() {
536     if(isUpdate()) return;
537    
538     channel.getModel().setBackendMidiInputPort(cbMidiPort.getSelectedIndex());
539     }
540    
541     private void
542     setMidiChannel() {
543     if(isUpdate()) return;
544    
545     Object o = cbMidiChannel.getSelectedItem();
546     if(o == null) return;
547     String s = o.toString();
548    
549     int c = s.equals("All") ? -1 : Integer.parseInt(s.substring(8)) - 1;
550    
551     channel.getModel().setBackendMidiInputChannel(c);
552     }
553    
554     private void
555     setBackendAudioDevice() {
556     if(isUpdate()) return;
557     AudioOutputDevice dev = (AudioOutputDevice)cbAudioDevice.getSelectedItem();
558     if(dev != null) channel.getModel().setBackendAudioOutputDevice(dev.getDeviceId());
559     }
560    
561     /**
562     * Determines whether the currently processed changes are due to update.
563     * @return <code>true</code> if the currently processed changes are due to update and
564     * <code>false</code> if the currently processed changes are due to user input.
565     */
566     private boolean
567     isUpdate() { return update; }
568    
569     /**
570     * Sets whether the currently processed changes are due to update.
571     * @param b Specify <code>true</code> to indicate that the currently
572     * processed changes are due to update; <code>false</code>
573     * indicates that the currently processed changes are due to user input.
574     */
575     private void
576     setUpdate(boolean b) { update = b; }
577    
578     protected void
579     onDestroy() {
580     SamplerModel sm = CC.getSamplerModel();
581    
582     sm.removeMidiDeviceListListener(getHandler());
583     sm.removeAudioDeviceListListener(getHandler());
584     sm.removeMidiInstrumentMapListListener(mapListListener);
585     sm.removeSamplerListener(samplerListener);
586    
587     if(midiDevice != null) {
588     midiDevice.removeMidiDeviceListener(getHandler());
589     }
590     }
591    
592     private final Handler handler = new Handler();
593    
594     private Handler
595     getHandler() { return handler; }
596    
597     private class Handler implements MidiDeviceListListener, ListListener<AudioDeviceModel>,
598     MidiDeviceListener {
599     /**
600     * Invoked when a new MIDI device is created.
601     * @param e A <code>MidiDeviceListEvent</code>
602     * instance providing the event information.
603     */
604 iliev 1785 @Override
605 iliev 1730 public void
606     deviceAdded(MidiDeviceListEvent e) {
607     cbMidiDevice.addItem(e.getMidiDeviceModel().getDeviceInfo());
608     }
609    
610     /**
611     * Invoked when a MIDI device is removed.
612     * @param e A <code>MidiDeviceListEvent</code>
613     * instance providing the event information.
614     */
615 iliev 1785 @Override
616 iliev 1730 public void
617     deviceRemoved(MidiDeviceListEvent e) {
618     cbMidiDevice.removeItem(e.getMidiDeviceModel().getDeviceInfo());
619     }
620    
621     /**
622     * Invoked when a new audio device is created.
623     * @param e An <code>AudioDeviceListEvent</code>
624     * instance providing the event information.
625     */
626 iliev 1785 @Override
627 iliev 1730 public void
628     entryAdded(ListEvent<AudioDeviceModel> e) {
629     cbAudioDevice.addItem(e.getEntry().getDeviceInfo());
630     }
631    
632     /**
633     * Invoked when an audio device is removed.
634     * @param e An <code>AudioDeviceListEvent</code>
635     * instance providing the event information.
636     */
637 iliev 1785 @Override
638 iliev 1730 public void
639     entryRemoved(ListEvent<AudioDeviceModel> e) {
640     cbAudioDevice.removeItem(e.getEntry().getDeviceInfo());
641     }
642    
643 iliev 1785 @Override
644 iliev 1730 public void
645     settingsChanged(MidiDeviceEvent e) {
646     if(isUpdate()) {
647     CC.getLogger().warning("Invalid update state");
648     return;
649     }
650    
651     setUpdate(true);
652     int idx = cbMidiPort.getSelectedIndex();
653     MidiInputDevice d = e.getMidiDeviceModel().getDeviceInfo();
654    
655     cbMidiPort.removeAllItems();
656     for(MidiPort port : d.getMidiPorts()) cbMidiPort.addItem(port);
657    
658     if(idx >= cbMidiPort.getModel().getSize()) idx = 0;
659    
660     setUpdate(false);
661    
662     if(cbMidiPort.getModel().getSize() > 0) cbMidiPort.setSelectedIndex(idx);
663     }
664     }
665    
666     private class MapListListener implements ListListener<MidiInstrumentMap> {
667     /** Invoked when a new MIDI instrument map is added to a list. */
668 iliev 1785 @Override
669 iliev 1730 public void
670     entryAdded(ListEvent<MidiInstrumentMap> e) {
671     cbInstrumentMap.insertItemAt(e.getEntry(), cbInstrumentMap.getItemCount());
672     boolean b = channel.getModel().getChannelInfo().getEngine() != null;
673     if(b && !cbInstrumentMap.isEnabled()) cbInstrumentMap.setEnabled(true);
674     }
675    
676     /** Invoked when a new MIDI instrument map is removed from a list. */
677 iliev 1785 @Override
678 iliev 1730 public void
679     entryRemoved(ListEvent<MidiInstrumentMap> e) {
680     cbInstrumentMap.removeItem(e.getEntry());
681     if(cbInstrumentMap.getItemCount() == 0) { // TODO: ?
682     cbInstrumentMap.setSelectedItem(noMap);
683     cbInstrumentMap.setEnabled(false);
684     }
685     }
686     }
687     }

  ViewVC Help
Powered by ViewVC