/[svn]/jsampler/trunk/src/org/jsampler/view/classic/ChannelsPane.java
ViewVC logotype

Annotation of /jsampler/trunk/src/org/jsampler/view/classic/ChannelsPane.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 787 - (hide annotations) (download)
Mon Oct 10 16:03:12 2005 UTC (18 years, 6 months ago) by iliev
File size: 11359 byte(s)
* The first alpha-release of JSampler

1 iliev 787 /*
2     * JSampler - a java front-end for LinuxSampler
3     *
4     * Copyright (C) 2005 Grigor Kirilov Iliev
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.classic;
24    
25     import java.awt.BorderLayout;
26     import java.awt.Component;
27    
28     import java.awt.event.KeyEvent;
29     import java.awt.event.MouseAdapter;
30     import java.awt.event.MouseEvent;
31    
32     import java.util.Vector;
33    
34     import javax.swing.BorderFactory;
35     import javax.swing.JComponent;
36     import javax.swing.JMenu;
37     import javax.swing.JMenuItem;
38     import javax.swing.JPopupMenu;
39     import javax.swing.JScrollPane;
40     import javax.swing.JTabbedPane;
41     import javax.swing.KeyStroke;
42     import javax.swing.ListCellRenderer;
43     import javax.swing.ListSelectionModel;
44    
45     import javax.swing.event.ListSelectionEvent;
46     import javax.swing.event.ListSelectionListener;
47    
48     import org.jsampler.CC;
49     import org.jsampler.SamplerChannelModel;
50    
51     import org.jsampler.view.JSChannel;
52     import org.jsampler.view.JSChannelsPane;
53    
54     import net.sf.juife.ComponentList;
55     import net.sf.juife.ComponentListModel;
56     import net.sf.juife.DefaultComponentListModel;
57    
58     import org.linuxsampler.lscp.SamplerChannel;
59    
60     import static org.jsampler.view.classic.ClassicI18n.i18n;
61    
62    
63     /**
64     *
65     * @author Grigor Iliev
66     */
67     public class ChannelsPane extends JSChannelsPane implements ListSelectionListener {
68     private final ComponentList chnList = new ComponentList();
69     private final DefaultComponentListModel listModel = new DefaultComponentListModel();
70    
71     /** Creates a new instance of ChannelsPane */
72     public
73     ChannelsPane(String title) {
74     super(title);
75    
76     setLayout(new BorderLayout());
77    
78     chnList.setOpaque(false);
79     //chnList.setLayoutOrientation(JList.HORIZONTAL_WRAP);
80     chnList.setModel(listModel);
81     chnList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
82     chnList.addListSelectionListener(this);
83     chnList.addMouseListener(new ContextMenu());
84     //chnList.setDragEnabled(true);
85    
86     JScrollPane sp = new JScrollPane(chnList);
87     sp.setBorder(BorderFactory.createEmptyBorder());
88     add(sp);
89    
90     setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3));
91    
92     }
93    
94     /**
95     * Adds new channel to this channels pane.
96     * @param channelModel The sampler channel model to be used by the new channel.
97     */
98     public void
99     addChannel(SamplerChannelModel channelModel) {
100     Channel channel = new Channel(channelModel);
101     listModel.add(channel);
102     if(channel.getChannelInfo().getEngine() == null) channel.expandChannel();
103     chnList.setSelectedComponent(channel, true);
104     }
105    
106     /**
107     * Adds the specified channels to this channels pane.
108     * @param chns The channels to be added.
109     */
110     public void addChannels(JSChannel[] chns) {
111     for(JSChannel c : chns) listModel.add(c);
112     chnList.setSelectionInterval (
113     listModel.getSize() - chns.length, listModel.getSize() - 1
114     );
115    
116     chnList.ensureIndexIsVisible(listModel.getSize() - 1);
117     }
118    
119     /**
120     * Removes the specified channel from this channels pane.
121     * This method is invoked when a sampler channel is removed in the back-end.
122     * @param chn The channel to be removed from this channels pane.
123     */
124     public void
125     removeChannel(JSChannel chn) { listModel.remove(chn); }
126    
127     /**
128     * Gets the first channel in this channels pane.
129     * @return The first channel in this channels pane or <code>null</code> if
130     * the channels pane is empty.
131     */
132     public JSChannel
133     getFirstChannel() { return listModel.size() == 0 ? null : (JSChannel)listModel.get(0); }
134    
135     /**
136     * Gets the last channel in this channels pane.
137     * @return The last channel in this channels pane or <code>null</code> if
138     * the channels pane is empty.
139     */
140     public JSChannel
141     getLastChannel() {
142     return listModel.size() == 0 ? null : (JSChannel)listModel.get(listModel.size()-1);
143     }
144    
145     /**
146     * Gets the channel at the specified index.
147     * @return The channel at the specified index.
148     * @throws ArrayIndexOutOfBoundsException If the index is out of range.
149     */
150     public JSChannel
151     getChannel(int idx) { return (JSChannel)listModel.get(idx); }
152    
153     /**
154     * Gets an array with all channels in this channels pane.
155     * @return An array with all channels in this channels pane.
156     */
157     public JSChannel[]
158     getChannels() {
159     JSChannel[] chns = new JSChannel[listModel.size()];
160     for(int i = 0; i < listModel.size(); i++) chns[i] = (JSChannel)listModel.get(i);
161     return chns;
162     }
163    
164     /**
165     * Gets the number of channels in this channels pane.
166     * @return The number of channels in this channels pane.
167     */
168     public int
169     getChannelCount() { return listModel.size(); }
170    
171     /**
172     * Determines whether there is at least one selected channel.
173     * @return <code>true</code> if there is at least one selected channel,
174     * <code>false</code> otherwise.
175     */
176     public boolean
177     hasSelectedChannel() { return !chnList.isSelectionEmpty(); }
178    
179     /**
180     * Gets the number of the selected channels.
181     * @return The number of the selected channels.
182     */
183     public int
184     getSelectedChannelCount() { return chnList.getSelectedIndices().length; }
185    
186     /**
187     * Gets an array with all selected channels.
188     * The channels are sorted in increasing index order.
189     * @return The selected channels or an empty array if nothing is selected.
190     */
191     public JSChannel[]
192     getSelectedChannels() {
193     Component[] cS = chnList.getSelectedComponents();
194     JSChannel[] chns = new JSChannel[cS.length];
195     for(int i = 0; i < cS.length; i++) chns[i] = (JSChannel)cS[i];
196     return chns;
197     }
198    
199     /**
200     * Removes all selected channels in this channels pane.
201     * Notice that this method does not remove any channels in the back-end.
202     * It is invoked after the channels are already removed in the back-end.
203     * @return The number of removed channels.
204     */
205     public int
206     removeSelectedChannels() {
207     int[] l = chnList.getSelectedIndices();
208     ComponentListModel model = chnList.getModel();
209    
210     for(;;) {
211     int i = chnList.getMinSelectionIndex();
212     if(i == -1) break;
213     model.remove(i);
214     }
215    
216     return l.length;
217     }
218    
219     /** Selects all channels. */
220     public void
221     selectAllChannels() { chnList.selectAll(); }
222    
223     /** Deselects all selected channels. */
224     public void
225     deselectChannels() { chnList.clearSelection(); }
226    
227     /**
228     * Registers the specified listener for receiving list selection events.
229     * @param listener The <code>ListSelectionListener</code> to register.
230     */
231     public void
232     addListSelectionListener(ListSelectionListener listener) {
233     listenerList.add(ListSelectionListener.class, listener);
234     }
235    
236     /**
237     * Removes the specified listener.
238     * @param listener The <code>ListSelectionListener</code> to remove.
239     */
240     public void
241     removeListSelectionListener(ListSelectionListener listener) {
242     listenerList.remove(ListSelectionListener.class, listener);
243     }
244    
245     /**
246     * Invoked when the selection has changed.
247     * This method implements <code>valueChanged</code>
248     * method of the <code>ListSelectionListener</code> interface.
249     * @param e A <code>ListSelectionEvent</code>
250     * instance providing the event information.
251     */
252     public void
253     valueChanged(ListSelectionEvent e) {
254     ListSelectionEvent e2 = null;
255     Object[] listeners = listenerList.getListenerList();
256    
257     for(int i = listeners.length - 2; i >= 0; i -= 2) {
258     if(listeners[i] == ListSelectionListener.class) {
259     if(e2 == null) e2 = new ListSelectionEvent (
260     this,
261     e.getFirstIndex(),
262     e.getLastIndex(),
263     e.getValueIsAdjusting()
264     );
265     ((ListSelectionListener)listeners[i + 1]).valueChanged(e2);
266     }
267     }
268    
269     }
270    
271    
272     public void
273     moveSelectedChannelsOnTop() {
274     JSChannel[] chns = getSelectedChannels();
275    
276     if(chns.length == 0) {
277     CC.getLogger().info("Can't move channel(s) at the beginning");
278     return;
279     }
280    
281     for(int i = chns.length - 1; i >= 0; i--) {
282     listModel.remove(chns[i]);
283     listModel.insert(chns[i], 0);
284     }
285    
286     chnList.setSelectionInterval(0, chns.length - 1);
287     chnList.ensureIndexIsVisible(0);
288     }
289    
290     public void
291     moveSelectedChannelsUp() {
292     JSChannel[] chns = getSelectedChannels();
293    
294     if(chns.length == 0 || chns[0] == getFirstChannel()) {
295     CC.getLogger().info("Can't move channel(s) up");
296     return;
297     }
298    
299     for(int i = 0; i < chns.length; i++) listModel.moveUp(chns[i]);
300    
301     int[] si = chnList.getSelectedIndices();
302    
303     for(int i = 0; i < si.length; i++) si[i] -= 1;
304    
305     chnList.setSelectedIndices(si);
306     chnList.ensureIndexIsVisible(si[0]);
307     }
308    
309     public void
310     moveSelectedChannelsDown() {
311     JSChannel[] chns = getSelectedChannels();
312    
313     if(chns.length == 0 || chns[chns.length - 1] == getLastChannel()) {
314     CC.getLogger().info("Can't move channel(s) down");
315     return;
316     }
317    
318     for(int i = chns.length - 1; i >= 0; i--) listModel.moveDown(chns[i]);
319    
320     int[] si = chnList.getSelectedIndices();
321     for(int i = 0; i < si.length; i++) si[i] += 1;
322     chnList.setSelectedIndices(si);
323     chnList.ensureIndexIsVisible(si[si.length - 1]);
324     }
325    
326     public void
327     moveSelectedChannelsAtBottom() {
328     JSChannel[] chns = getSelectedChannels();
329    
330     if(chns.length == 0) {
331     CC.getLogger().info("Can't move channel(s) at the end");
332     return;
333     }
334    
335     for(int i = 0; i < chns.length; i++) {
336     listModel.remove(chns[i]);
337     listModel.add(chns[i]);
338     }
339    
340     chnList.setSelectionInterval (
341     listModel.getSize() - chns.length, listModel.getSize() - 1
342     );
343     chnList.ensureIndexIsVisible(listModel.getSize() - 1);
344     }
345    
346     class ContextMenu extends MouseAdapter {
347     private final JPopupMenu cmenu = new JPopupMenu();
348     private final JMenu submenu = new JMenu(i18n.getMenuLabel("channels.MoveToTab"));
349    
350     ContextMenu() {
351     JMenuItem mi = new JMenuItem(A4n.moveChannelsOnTop);
352     mi.setIcon(null);
353     cmenu.add(mi);
354    
355     mi = new JMenuItem(A4n.moveChannelsUp);
356     mi.setIcon(null);
357     cmenu.add(mi);
358    
359     mi = new JMenuItem(A4n.moveChannelsDown);
360     mi.setIcon(null);
361     cmenu.add(mi);
362    
363     mi = new JMenuItem(A4n.moveChannelsAtBottom);
364     mi.setIcon(null);
365     cmenu.add(mi);
366    
367     cmenu.add(submenu);
368    
369     cmenu.addSeparator();
370    
371     mi = new JMenuItem(A4n.removeChannels);
372     mi.setIcon(null);
373     cmenu.add(mi);
374     }
375    
376     public void
377     mousePressed(MouseEvent e) {
378     if(e.isPopupTrigger()) show(e);
379     }
380    
381     public void
382     mouseReleased(MouseEvent e) {
383     if(e.isPopupTrigger()) show(e);
384     }
385    
386     void
387     show(MouseEvent e) {
388     /*int idx = chnList.locationToIndex(e.getPoint());
389     if(!chnList.isSelectedIndex(idx)) chnList.setSelectedIndex(idx);
390    
391     if(idx != -1 && CC.getMainFrame().getChannelsPaneCount() > 1) {
392     updateMenu();
393     submenu.setEnabled(true);
394     } else submenu.setEnabled(false);
395    
396     cmenu.show(e.getComponent(), e.getX(), e.getY());*/
397     }
398    
399     private void
400     updateMenu() {
401     submenu.removeAll();
402     Vector<JSChannelsPane> v = CC.getMainFrame().getChannelsPaneList();
403     for(JSChannelsPane p : v)
404     if(p != CC.getMainFrame().getSelectedChannelsPane())
405     submenu.add(new JMenuItem(new A4n.MoveChannelsTo(p)));
406     }
407     }
408     }

  ViewVC Help
Powered by ViewVC