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

Contents of /jsampler/trunk/src/org/jsampler/view/std/JSInstrumentsDbTable.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1286 - (show annotations) (download)
Fri Aug 10 20:24:23 2007 UTC (16 years, 8 months ago) by iliev
File size: 33899 byte(s)
- Updated to version 0.6a. The Fantasia distribution is now
  capable of controlling all features available in LinuxSampler

1 /*
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.Component;
26 import java.awt.Dialog;
27 import java.awt.Frame;
28 import java.awt.Window;
29
30 import java.awt.event.ActionEvent;
31 import java.awt.event.ActionListener;
32 import java.awt.event.KeyEvent;
33 import java.awt.event.MouseAdapter;
34 import java.awt.event.MouseEvent;
35
36 import java.util.Vector;
37
38 import javax.swing.AbstractAction;
39 import javax.swing.Action;
40 import javax.swing.BorderFactory;
41 import javax.swing.Icon;
42 import javax.swing.JComponent;
43 import javax.swing.JLabel;
44 import javax.swing.JMenu;
45 import javax.swing.JMenuItem;
46 import javax.swing.JPanel;
47 import javax.swing.JPopupMenu;
48 import javax.swing.JTable;
49 import javax.swing.KeyStroke;
50
51 import javax.swing.event.ChangeEvent;
52 import javax.swing.event.ChangeListener;
53 import javax.swing.event.ListSelectionEvent;
54 import javax.swing.event.ListSelectionListener;
55 import javax.swing.event.TreeSelectionEvent;
56 import javax.swing.event.TreeSelectionListener;
57
58 import javax.swing.table.TableCellRenderer;
59
60 import net.sf.juife.InformationDialog;
61 import net.sf.juife.JuifeUtils;
62 import net.sf.juife.Task;
63
64 import net.sf.juife.event.TaskEvent;
65 import net.sf.juife.event.TaskListener;
66
67 import org.jsampler.CC;
68 import org.jsampler.HF;
69 import org.jsampler.Instrument;
70 import org.jsampler.MidiInstrumentMap;
71 import org.jsampler.OrchestraModel;
72 import org.jsampler.SamplerChannelModel;
73 import org.jsampler.SamplerModel;
74
75 import org.jsampler.event.ListEvent;
76 import org.jsampler.event.ListListener;
77 import org.jsampler.event.SamplerChannelListEvent;
78 import org.jsampler.event.SamplerChannelListListener;
79
80 import org.jsampler.task.InstrumentsDb;
81
82 import org.jsampler.view.DbClipboard;
83 import org.jsampler.view.DbDirectoryTreeNode;
84 import org.jsampler.view.InstrumentsDbTableModel;
85
86 import org.linuxsampler.lscp.DbDirectoryInfo;
87 import org.linuxsampler.lscp.DbInstrumentInfo;
88 import org.linuxsampler.lscp.MidiInstrumentInfo;
89
90 import static org.jsampler.view.InstrumentsDbTableModel.ColumnType;
91 import static org.jsampler.view.std.StdI18n.i18n;
92
93 /**
94 *
95 * @author Grigor Iliev
96 */
97 public class JSInstrumentsDbTable extends org.jsampler.view.AbstractInstrumentsDbTable {
98 private JSInstrumentsDbTree instrumentsDbTree;
99 private InstrumentsDbCellRenderer cellRenderer = new InstrumentsDbCellRenderer();
100
101 public final Action reloadAction = new ReloadAction();
102 public final Action createDirectoryAction = new CreateDirectoryAction();
103 public final Action deleteAction = new DeleteAction();
104 public final AddInstrumentsFromFileAction addInstrumentsFromFileAction =
105 new AddInstrumentsFromFileAction();
106 public final AddInstrumentsFromDirAction addInstrumentsFromDirAction =
107 new AddInstrumentsFromDirAction();
108 public final Action propertiesAction = new PropertiesAction();
109 public final Action renameAction = new RenameAction();
110 public final Action changeDescriptionAction = new ChangeDescriptionAction();
111 public final Action cutAction = new CutAction();
112 public final Action copyAction = new CopyAction();
113 public final Action pasteAction;
114
115 private static final DbClipboard dbClipboard = new DbClipboard();
116
117 /**
118 * Creates a new instance of <code>JSInstrumentsDbTable</code>
119 */
120 public JSInstrumentsDbTable(JSInstrumentsDbTree tree) {
121 instrumentsDbTree = tree;
122
123 /*for(int i = 0; i < getColumnModel().getColumnCount(); i++) {
124 getColumnModel().getColumn(i).setMinWidth(50);
125 }*/
126
127 setShowGrid(false);
128 getColumnModel().setColumnMargin(0);
129 getTableHeader().setReorderingAllowed(false);
130
131 setFillsViewportHeight(true);
132
133 addMouseListener(new MouseAdapter() {
134 public void
135 mouseClicked(MouseEvent e) {
136 if(e.getButton() != e.BUTTON1) return;
137 int r = rowAtPoint(e.getPoint());
138 if(r == -1) {
139 clearSelection();
140 return;
141 }
142
143 if(e.getClickCount() < 2) return;
144
145 DbDirectoryTreeNode node = getSelectedDirectoryNode();
146 if(node == null) return;
147 if(!node.isDetached()) {
148 instrumentsDbTree.setSelectedDirectoryNode(node);
149 } else {
150 String s = node.getInfo().getDirectoryPath();
151 instrumentsDbTree.setSelectedDirectory(s);
152 }
153 }
154 });
155
156 addMouseListener(new MouseAdapter() {
157 public void
158 mousePressed(MouseEvent e) {
159 int r = rowAtPoint(e.getPoint());
160
161 if(e.getButton() != e.BUTTON1 && e.getButton() != e.BUTTON3) return;
162 if(r == -1) {
163 clearSelection();
164 return;
165 }
166
167 if(e.getButton() != e.BUTTON3) return;
168 if(getSelectionModel().isSelectedIndex(r)) {
169 getSelectionModel().addSelectionInterval(r, r);
170 } else {
171 getSelectionModel().setSelectionInterval(r, r);
172 }
173 }
174 });
175
176 getSelectionModel().addListSelectionListener(getHandler());
177
178 instrumentsDbTree.addTreeSelectionListener(getHandler());
179
180 PasteAction pasteAction = new PasteAction();
181 instrumentsDbTree.addTreeSelectionListener(pasteAction);
182 this.pasteAction = pasteAction;
183
184 ContextMenu contextMenu = new ContextMenu();
185 addMouseListener(contextMenu);
186
187 CC.getOrchestras().addOrchestraListListener(getHandler());
188 CC.getSamplerModel().addSamplerChannelListListener(getHandler());
189
190 ListListener<MidiInstrumentMap> l = new ListListener<MidiInstrumentMap>() {
191 public void
192 entryAdded(ListEvent<MidiInstrumentMap> e) { updateAddToMidiMapMenus(); }
193
194 public void
195 entryRemoved(ListEvent<MidiInstrumentMap> e) { updateAddToMidiMapMenus(); }
196 };
197
198 CC.getSamplerModel().addMidiInstrumentMapListListener(l);
199
200 installKeyboardListeners();
201 }
202
203 public static DbClipboard
204 getDbClipboard() { return dbClipboard; }
205
206 public TableCellRenderer
207 getCellRenderer(int row, int column) {
208 return cellRenderer;
209 }
210
211 private void
212 installKeyboardListeners() {
213 AbstractAction a = new AbstractAction() {
214 public void
215 actionPerformed(ActionEvent e) { }
216 };
217 a.setEnabled(false);
218 getActionMap().put("none", a);
219
220 getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put (
221 KeyStroke.getKeyStroke(KeyEvent.VK_X, KeyEvent.CTRL_MASK),
222 "none"
223 );
224
225 getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put (
226 KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.CTRL_MASK),
227 "none"
228 );
229
230 getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put (
231 KeyStroke.getKeyStroke(KeyEvent.VK_V, KeyEvent.CTRL_MASK),
232 "none"
233 );
234
235 getInputMap(JComponent.WHEN_FOCUSED).put (
236 KeyStroke.getKeyStroke(KeyEvent.VK_X, KeyEvent.CTRL_MASK),
237 "none"
238 );
239
240 getInputMap(JComponent.WHEN_FOCUSED).put (
241 KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.CTRL_MASK),
242 "none"
243 );
244
245 getInputMap(JComponent.WHEN_FOCUSED).put (
246 KeyStroke.getKeyStroke(KeyEvent.VK_V, KeyEvent.CTRL_MASK),
247 "none"
248 );
249
250 getInputMap().put (
251 KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0),
252 "OpenDirectory"
253 );
254
255 getActionMap().put ("OpenDirectory", new AbstractAction() {
256 public void
257 actionPerformed(ActionEvent e) {
258 DbDirectoryTreeNode node = getSelectedDirectoryNode();
259 if(node == null) return;
260 instrumentsDbTree.setSelectedDirectoryNode(node);
261 }
262 });
263 }
264
265 public String
266 getUniqueDirectoryName() {
267 DbDirectoryTreeNode node = getParentDirectoryNode();
268 if(node == null || node.isDetached()) return null;
269 if(node != instrumentsDbTree.getSelectedDirectoryNode()) return null;
270
271 boolean b = false;
272 int c = 2;
273 String dir = "New Folder";
274
275 while(true) {
276 for(int i = 0; i < node.getChildCount(); i++) {
277
278 if(dir.equals(node.getChildAt(i).getInfo().getName())) {
279 b = true;
280 break;
281 }
282 }
283
284 if(!b) break;
285
286 b = false;
287 dir = "New Folder[" + c++ + "]";
288 }
289
290 return dir;
291 }
292
293 private final Vector<JMenu> loadInstrumentMenus = new Vector<JMenu>();
294 private final Vector<JMenu> addToMidiMapMenus = new Vector<JMenu>();
295 private final Vector<JMenu> addToOrchestraMenus = new Vector<JMenu>();
296
297 public void
298 registerLoadInstrumentMenus(JMenu menu) {
299 loadInstrumentMenus.add(menu);
300 updateLoadInstrumentMenu(menu);
301 }
302
303 public void
304 registerAddToMidiMapMenu(JMenu menu) {
305 addToMidiMapMenus.add(menu);
306 updateAddToMidiMapMenu(menu);
307 }
308
309 public void
310 registerAddToOrchestraMenu(JMenu menu) {
311 addToOrchestraMenus.add(menu);
312 updateAddToOrchestraMenu(menu);
313 }
314
315 private void
316 updateLoadInstrumentMenus() {
317 for(JMenu menu : loadInstrumentMenus) updateLoadInstrumentMenu(menu);
318 }
319
320 private void
321 updateLoadInstrumentMenu(JMenu menu) {
322 menu.removeAll();
323 for(SamplerChannelModel m : CC.getSamplerModel().getChannels()) {
324 menu.add(new JMenuItem(new LoadInstrumentAction(m)));
325 }
326
327 updateLoadInstrumentMenuState(menu);
328 }
329
330 private void
331 updateLoadInstrumentMenuStates() {
332 for(JMenu menu : loadInstrumentMenus) updateLoadInstrumentMenuState(menu);
333 }
334
335 private void
336 updateLoadInstrumentMenuState(JMenu menu) {
337 Object obj = getLeadObject();
338 boolean b = obj == null || !(obj instanceof DbInstrumentInfo);
339 b = b || CC.getSamplerModel().getChannelCount() == 0;
340 menu.setEnabled(!b);
341 }
342
343 private void
344 updateAddToMidiMapMenus() {
345 for(JMenu menu : addToMidiMapMenus) updateAddToMidiMapMenu(menu);
346 }
347
348 private void
349 updateAddToMidiMapMenu(JMenu menu) {
350 menu.removeAll();
351 for(int i = 0; i < CC.getSamplerModel().getMidiInstrumentMapCount(); i++) {
352 MidiInstrumentMap m = CC.getSamplerModel().getMidiInstrumentMap(i);
353 menu.add(new JMenuItem(new AddToMidiMapAction(m)));
354 }
355
356 updateAddToMidiMapMenuState(menu);
357 }
358
359 private void
360 updateAddToMidiMapMenuStates() {
361 for(JMenu menu : addToMidiMapMenus) updateAddToMidiMapMenuState(menu);
362 }
363
364 private void
365 updateAddToMidiMapMenuState(JMenu menu) {
366 Object obj = getLeadObject();
367 boolean b = obj == null || !(obj instanceof DbInstrumentInfo);
368 b = b || CC.getSamplerModel().getMidiInstrumentMapCount() == 0;
369 menu.setEnabled(!b);
370 }
371
372 private void
373 updateAddToOrchestraMenus() {
374 for(JMenu menu : addToOrchestraMenus) updateAddToOrchestraMenu(menu);
375 }
376
377 private void
378 updateAddToOrchestraMenu(JMenu menu) {
379 menu.removeAll();
380 for(int i = 0; i < CC.getOrchestras().getOrchestraCount(); i++) {
381 OrchestraModel m = CC.getOrchestras().getOrchestra(i);
382 Action a = new AddToOrchestraAction(m);
383 menu.add(new JMenuItem(a));
384 }
385
386 updateAddToOrchestraMenuState(menu);
387 }
388
389 private void
390 updateAddToOrchestraMenuStates() {
391 for(JMenu menu : addToOrchestraMenus) updateAddToOrchestraMenuState(menu);
392 }
393
394 private void
395 updateAddToOrchestraMenuState(JMenu menu) {
396 Object obj = getLeadObject();
397 boolean b = obj == null || !(obj instanceof DbInstrumentInfo);
398 b = b || CC.getOrchestras().getOrchestraCount() == 0;
399 menu.setEnabled(!b);
400 }
401
402 private boolean
403 showYesNoDialog(String s) {
404 Window w = JuifeUtils.getWindow(this);
405 if(w instanceof Dialog) return HF.showYesNoDialog((Dialog)w, s);
406 if(w instanceof Frame) return HF.showYesNoDialog((Frame)w, s);
407 return HF.showYesNoDialog((Frame)null, s);
408 }
409
410 private class ReloadAction extends AbstractAction implements TreeSelectionListener {
411 ReloadAction() {
412 super(i18n.getMenuLabel("instrumentsdb.actions.reload"));
413
414 String s = i18n.getMenuLabel("instrumentsdb.actions.reload.tt");
415 putValue(SHORT_DESCRIPTION, s);
416 setEnabled(false);
417 }
418
419 public void
420 actionPerformed(ActionEvent e) {
421 DbDirectoryTreeNode n = instrumentsDbTree.getSelectedDirectoryNode();
422 if(n == null) return;
423 instrumentsDbTree.refreshDirectoryContent(n.getInfo().getDirectoryPath());
424 }
425
426 public void
427 valueChanged(TreeSelectionEvent e) {
428 DbDirectoryTreeNode n = instrumentsDbTree.getSelectedDirectoryNode();
429 setEnabled(n != null);
430 }
431 }
432
433 class CreateDirectoryAction extends AbstractAction {
434 private String directoryName = null;
435
436 CreateDirectoryAction() {
437 super(i18n.getMenuLabel("instrumentsdb.actions.createFolder"));
438
439 String s = i18n.getMenuLabel("instrumentsdb.actions.createFolder.tt");
440 putValue(SHORT_DESCRIPTION, s);
441 }
442
443 public void
444 actionPerformed(ActionEvent e) {
445 setDirectoryName(getUniqueDirectoryName());
446
447 String path = instrumentsDbTree.getSelectedDirectoryPath();
448 if(path.length() > 1) path += "/";
449 path += getDirectoryName();
450
451 final InstrumentsDb.CreateDirectory t =
452 new InstrumentsDb.CreateDirectory(path);
453
454 setCreatedDirectoryName(directoryName);
455
456 t.addTaskListener(new TaskListener() {
457 public void
458 taskPerformed(TaskEvent e) {
459 if(t.doneWithErrors()) {
460 setCreatedDirectoryName(null);
461 return;
462 }
463 }
464 });
465 CC.getTaskQueue().add(t);
466 }
467
468 /**
469 * Gets the name of the directory to be created.
470 * @return The name of the directory to be created.
471 */
472 public String
473 getDirectoryName() { return directoryName; }
474
475 /**
476 * Sets the name of the directory to be created.
477 * @param name The name of the directory to be created.
478 */
479 public void
480 setDirectoryName(String name) { directoryName = name; }
481 }
482
483 class DeleteAction extends AbstractAction {
484 DeleteAction() {
485 super(i18n.getMenuLabel("instrumentsdb.actions.delete"));
486
487 String s;
488 s = i18n.getMenuLabel("instrumentsdb.actions.delete.tt");
489 putValue(SHORT_DESCRIPTION, s);
490 setEnabled(false);
491 }
492
493 public void
494 actionPerformed(ActionEvent e) {
495 final DbDirectoryInfo[] dirs = getSelectedDirectories();
496
497 if(dirs.length > 0) {
498 String s = i18n.getMessage("JSInstrumentsDbTable.confirmDeletion");
499 if(!showYesNoDialog(s)) return;
500
501 final Task t = new InstrumentsDb.RemoveDirectories(dirs);
502 t.addTaskListener(new TaskListener() {
503 public void
504 taskPerformed(TaskEvent e) {
505 if(instrumentsDbTree.getSelectionCount() == 0) {
506 // update search results
507 // TODO: lazily implemented
508 deleteDirectories(dirs);
509 }
510 }
511 });
512 CC.getTaskQueue().add(t);
513
514
515 }
516
517 final DbInstrumentInfo[] instrs = getSelectedInstruments();
518 if(instrs.length > 0) {
519 final Task t = new InstrumentsDb.RemoveInstruments(instrs);
520 t.addTaskListener(new TaskListener() {
521 public void
522 taskPerformed(TaskEvent e) {
523 if(instrumentsDbTree.getSelectionCount() == 0) {
524 // update search results
525 // TODO: lazily implemented
526 deleteInstruments(instrs);
527 }
528 }
529 });
530 CC.getTaskQueue().add(t);
531 }
532 }
533
534 /** Deletes the specified directories from the model */
535 private void
536 deleteDirectories(DbDirectoryInfo[] dirs) {
537 for(DbDirectoryInfo info : dirs) {
538 String path = info.getDirectoryPath();
539 getParentDirectoryNode().removeDirectoryByPathName(path);
540 getModel().fireTableDataChanged();
541 }
542 }
543
544 /** Deletes the specified instruments from the model */
545 private void
546 deleteInstruments(DbInstrumentInfo[] instrs) {
547 for(DbInstrumentInfo info : instrs) {
548 String path = info.getInstrumentPath();
549 getParentDirectoryNode().removeInstrumentByPathName(path);
550 getModel().fireTableDataChanged();
551 }
552 }
553 }
554
555 class AddInstrumentsFromFileAction extends AbstractAction {
556 AddInstrumentsFromFileAction() {
557 super(i18n.getMenuLabel("instrumentsdb.actions.addInstruments.fromFile"));
558
559 String s = "instrumentsdb.actions.addInstruments.fromFile.tt";
560 putValue(SHORT_DESCRIPTION, i18n.getMenuLabel(s));
561 }
562
563 public void
564 actionPerformed(ActionEvent e) {
565 String s;
566 DbDirectoryTreeNode node = getParentDirectoryNode();
567 if(node == null || node.getInfo() == null) s = null;
568 else s = node.getInfo().getDirectoryPath();
569
570 JSAddDbInstrumentsFromFileDlg dlg;
571 Icon ico = instrumentsDbTree.getView().getOpenIcon();
572 Window w = JuifeUtils.getWindow(JSInstrumentsDbTable.this);
573 if(w instanceof Dialog) {
574 dlg = new JSAddDbInstrumentsFromFileDlg((Dialog)w, s, ico);
575 } else if(w instanceof Frame) {
576 dlg = new JSAddDbInstrumentsFromFileDlg((Frame)w, s, ico);
577 } else {
578 dlg = new JSAddDbInstrumentsFromFileDlg((Frame)null, s, ico);
579 }
580
581 dlg.setVisible(true);
582 if(w != null) w.toFront();
583 }
584 }
585
586 class AddInstrumentsFromDirAction extends AbstractAction {
587 AddInstrumentsFromDirAction() {
588 super(i18n.getMenuLabel("instrumentsdb.actions.addInstruments.fromDir"));
589
590 String s = "instrumentsdb.actions.addInstruments.fromDir.tt";
591 putValue(SHORT_DESCRIPTION, i18n.getMenuLabel(s));
592 }
593
594 public void
595 actionPerformed(ActionEvent e) {
596 String s;
597 DbDirectoryTreeNode node = getParentDirectoryNode();
598 if(node == null || node.getInfo() == null) s = null;
599 else s = node.getInfo().getDirectoryPath();
600
601 JSAddDbInstrumentsFromDirDlg dlg;
602 Icon ico = instrumentsDbTree.getView().getOpenIcon();
603 Window w = JuifeUtils.getWindow(JSInstrumentsDbTable.this);
604 if(w instanceof Dialog) {
605 dlg = new JSAddDbInstrumentsFromDirDlg((Dialog)w, s, ico);
606 } else if(w instanceof Frame) {
607 dlg = new JSAddDbInstrumentsFromDirDlg((Frame)w, s, ico);
608 } else {
609 dlg = new JSAddDbInstrumentsFromDirDlg((Frame)null, s, ico);
610 }
611
612 dlg.setVisible(true);
613 if(w != null) w.toFront();
614 }
615 }
616
617 class LoadInstrumentAction extends AbstractAction {
618 private final SamplerChannelModel channelModel;
619
620 LoadInstrumentAction(SamplerChannelModel model) {
621 String s = "instrumentsdb.actions.loadInstrument.onChannel";
622 putValue(Action.NAME, i18n.getMenuLabel(s, model.getChannelId()));
623 channelModel = model;
624 }
625
626 public void
627 actionPerformed(ActionEvent e) {
628 Object obj = getLeadObject();
629 if(obj == null || !(obj instanceof DbInstrumentInfo)) return;
630 DbInstrumentInfo info = (DbInstrumentInfo)obj;
631 int idx = info.getInstrumentIndex();
632 channelModel.setBackendEngineType(info.getFormatFamily()); // TODO: fix this
633 channelModel.loadBackendInstrument(info.getFilePath(), idx);
634 }
635 }
636
637 class AddToMidiMapAction extends AbstractAction {
638 private final MidiInstrumentMap midiMap;
639
640 AddToMidiMapAction(MidiInstrumentMap map) {
641 super(map.getName());
642 midiMap = map;
643 }
644
645 public void
646 actionPerformed(ActionEvent e) {
647 Object obj = getLeadObject();
648 if(obj == null || !(obj instanceof DbInstrumentInfo)) return;
649
650 DbInstrumentInfo info = (DbInstrumentInfo)obj;
651
652 JSAddMidiInstrumentDlg dlg;
653 Window w = JuifeUtils.getWindow(JSInstrumentsDbTable.this);
654 if(w instanceof Dialog) {
655 dlg = new JSAddMidiInstrumentDlg((Dialog)w);
656 } else if(w instanceof Frame) {
657 dlg = new JSAddMidiInstrumentDlg((Frame)w);
658 } else {
659 dlg = new JSAddMidiInstrumentDlg((Frame)null);
660 }
661
662 dlg.setInstrumentName(info.getName());
663 dlg.setVisible(true);
664 if(dlg.isCancelled()) return;
665
666 MidiInstrumentInfo instrInfo = new MidiInstrumentInfo();
667 instrInfo.setName(dlg.getInstrumentName());
668 instrInfo.setFilePath(info.getFilePath());
669 instrInfo.setInstrumentIndex(info.getInstrumentIndex());
670 instrInfo.setEngine(info.getFormatFamily()); // TODO: this should be fixed
671 instrInfo.setVolume(dlg.getVolume());
672 instrInfo.setLoadMode(dlg.getLoadMode());
673
674 int id = midiMap.getMapId();
675 int b = dlg.getMidiBank();
676 int p = dlg.getMidiProgram();
677 CC.getSamplerModel().mapBackendMidiInstrument(id, b, p, instrInfo);
678 }
679 }
680
681 class AddToOrchestraAction extends AbstractAction {
682 private final OrchestraModel orchestraModel;
683
684 AddToOrchestraAction(OrchestraModel model) {
685 super(model.getName());
686 orchestraModel = model;
687 }
688
689 public void
690 actionPerformed(ActionEvent e) {
691 Object obj = getLeadObject();
692 if(obj == null || !(obj instanceof DbInstrumentInfo)) return;
693 DbInstrumentInfo info = (DbInstrumentInfo)obj;
694 Instrument instr = new Instrument();
695 instr.setPath(info.getFilePath());
696 instr.setInstrumentIndex(info.getInstrumentIndex());
697 instr.setName(info.getName());
698 instr.setDescription(info.getDescription());
699 instr.setEngine(info.getFormatFamily()); // TODO: this should be fixed
700 orchestraModel.addInstrument(instr);
701 }
702 }
703
704 class PropertiesAction extends AbstractAction {
705 PropertiesAction() {
706 super(i18n.getMenuLabel("instrumentsdb.actions.properties"));
707
708 String s;
709 s = i18n.getMenuLabel("instrumentsdb.actions.properties.tt");
710 putValue(SHORT_DESCRIPTION, s);
711 setEnabled(false);
712 }
713
714 public void
715 actionPerformed(ActionEvent e) {
716 Object obj = getLeadObject();
717 if(obj == null) {
718 DbDirectoryTreeNode node = getParentDirectoryNode();
719 if(node == null || node.getInfo() == null) return;
720 showDirectoryProperties(node.getInfo());
721 return;
722 }
723
724 if(obj instanceof DbDirectoryInfo) {
725 showDirectoryProperties((DbDirectoryInfo)obj);
726 } else if(obj instanceof DbInstrumentInfo) {
727 showInstrumentProperties((DbInstrumentInfo)obj);
728 }
729 }
730
731 private void
732 showInstrumentProperties(DbInstrumentInfo instr) {
733 JPanel p = new JSDbInstrumentPropsPane(instr);
734 String s = i18n.getLabel("JSInstrumentsDbTable.instrProps");
735 showDialog(s, p);
736 }
737
738 private void
739 showDirectoryProperties(DbDirectoryInfo dir) {
740 JPanel p = new JSDbDirectoryPropsPane(dir);
741 String s = i18n.getLabel("JSInstrumentsDbTable.dirProps");
742 showDialog(s, p);
743 }
744
745 private void
746 showDialog(String title, JPanel mainPane) {
747 InformationDialog dlg;
748 Window w = JuifeUtils.getWindow(JSInstrumentsDbTable.this);
749 if(w instanceof Dialog) {
750 dlg = new InformationDialog((Dialog)w, title, mainPane);
751 } else if(w instanceof Frame) {
752 dlg = new InformationDialog((Frame)w, title, mainPane);
753 } else {
754 dlg = new InformationDialog((Frame)null, title, mainPane);
755 }
756
757 dlg.setMinimumSize(dlg.getPreferredSize());
758 dlg.setVisible(true);
759 }
760 }
761
762 class RenameAction extends AbstractAction {
763 private String directoryPath = null;
764
765 RenameAction() {
766 super(i18n.getMenuLabel("instrumentsdb.edit.rename"));
767
768 String s = i18n.getMenuLabel("instrumentsdb.edit.rename.tt");
769 putValue(SHORT_DESCRIPTION, s);
770 setEnabled(false);
771 }
772
773 public void
774 actionPerformed(ActionEvent e) {
775 int i = getSelectionModel().getLeadSelectionIndex();
776 if(i == -1) return;
777 editCellAt(i, 0);
778 }
779 }
780
781 class ChangeDescriptionAction extends AbstractAction {
782 private String directoryPath = null;
783
784 ChangeDescriptionAction() {
785 super(i18n.getMenuLabel("instrumentsdb.edit.description"));
786
787 String s = i18n.getMenuLabel("instrumentsdb.edit.description.tt");
788 putValue(SHORT_DESCRIPTION, s);
789 setEnabled(false);
790 }
791
792 public void
793 actionPerformed(ActionEvent e) {
794 Object obj = getLeadObject();
795 if(obj == null) return;
796
797 if(obj instanceof DbDirectoryInfo) {
798 DbDirectoryInfo info = (DbDirectoryInfo)obj;
799 String s = editDescription(info.getDescription());
800 if(s == null) return;
801 String path = info.getDirectoryPath();
802 Task t = new InstrumentsDb.SetDirectoryDescription(path, s);
803 CC.getTaskQueue().add(t);
804 } else if(obj instanceof DbInstrumentInfo) {
805 DbInstrumentInfo info = (DbInstrumentInfo)obj;
806 String s = editDescription(info.getDescription());
807 if(s == null) return;
808 String path = info.getInstrumentPath();
809 Task t = new InstrumentsDb.SetInstrumentDescription(path, s);
810 CC.getTaskQueue().add(t);
811 }
812 }
813
814 private String
815 editDescription(String s) {
816 JSDbDescriptionDlg dlg;
817 Window w = JuifeUtils.getWindow(JSInstrumentsDbTable.this);
818 if(w instanceof Dialog) {
819 dlg = new JSDbDescriptionDlg((Dialog)w);
820 } else if(w instanceof Frame) {
821 dlg = new JSDbDescriptionDlg((Frame)w);
822 } else {
823 dlg = new JSDbDescriptionDlg((Frame)null);
824 }
825
826 dlg.setDescription(s);
827 dlg.setVisible(true);
828 if(dlg.isCancelled()) return null;
829 return dlg.getDescription();
830 }
831 }
832
833 class CutAction extends AbstractAction {
834 CutAction() {
835 super(i18n.getMenuLabel("instrumentsdb.edit.cut"));
836
837 String s = i18n.getMenuLabel("instrumentsdb.edit.cut.tt");
838 putValue(SHORT_DESCRIPTION, s);
839 setEnabled(false);
840 }
841
842 public void
843 actionPerformed(ActionEvent e) {
844 getDbClipboard().setDirectories(getSelectedDirectories());
845 getDbClipboard().setInstruments(getSelectedInstruments());
846 getDbClipboard().setOperation(DbClipboard.Operation.CUT);
847 }
848 }
849
850 class CopyAction extends AbstractAction {
851 CopyAction() {
852 super(i18n.getMenuLabel("instrumentsdb.edit.copy"));
853
854 String s = i18n.getMenuLabel("instrumentsdb.edit.copy.tt");
855 putValue(SHORT_DESCRIPTION, s);
856 setEnabled(false);
857 }
858
859 public void
860 actionPerformed(ActionEvent e) {
861 getDbClipboard().setDirectories(getSelectedDirectories());
862 getDbClipboard().setInstruments(getSelectedInstruments());
863 getDbClipboard().setOperation(DbClipboard.Operation.COPY);
864 }
865 }
866
867 class PasteAction extends AbstractAction implements TreeSelectionListener, ChangeListener {
868 PasteAction() {
869 super(i18n.getMenuLabel("instrumentsdb.edit.paste"));
870
871 String s = i18n.getMenuLabel("instrumentsdb.edit.paste.tt");
872 putValue(SHORT_DESCRIPTION, s);
873 setEnabled(false);
874 getDbClipboard().addChangeListener(this);
875 }
876
877 public void
878 actionPerformed(ActionEvent e) {
879 DbDirectoryInfo[] dirs = getDbClipboard().getDirectories();
880 DbInstrumentInfo[] instrs = getDbClipboard().getInstruments();
881 String dest = instrumentsDbTree.getSelectedDirectoryPath();
882
883 Task t;
884 if(getDbClipboard().getOperation() == DbClipboard.Operation.CUT) {
885 t = new InstrumentsDb.Move(dirs, instrs, dest);
886 getDbClipboard().setDirectories(new DbDirectoryInfo[0]);
887 getDbClipboard().setInstruments(new DbInstrumentInfo[0]);
888 } else if(getDbClipboard().getOperation() == DbClipboard.Operation.COPY) {
889 t = new InstrumentsDb.Copy(dirs, instrs, dest);
890 } else {
891 return;
892 }
893
894 CC.getTaskQueue().add(t);
895 }
896
897 public void
898 valueChanged(TreeSelectionEvent e) { updateState(); }
899
900 public void
901 stateChanged(ChangeEvent e) { updateState(); }
902
903 private void
904 updateState() {
905 DbDirectoryTreeNode n = instrumentsDbTree.getSelectedDirectoryNode();
906 if(n == null) {
907 setEnabled(false);
908 return;
909 }
910
911 int dirs = getDbClipboard().getDirectories().length;
912 setEnabled(dirs > 0 || getDbClipboard().getInstruments().length > 0);
913 }
914 }
915
916 class InstrumentsDbCellRenderer extends JLabel implements TableCellRenderer {
917
918 InstrumentsDbCellRenderer() {
919 setOpaque(true);
920 setBorder(BorderFactory.createEmptyBorder(0, 3, 0, 3));
921 }
922
923 public Component
924 getTableCellRendererComponent (
925 JTable table,
926 Object value,
927 boolean isSelected,
928 boolean hasFocus,
929 int row,
930 int column
931 ) {
932 if(column == 0 && value != null) {
933 String s;
934 if(value instanceof DbDirectoryInfo) {
935 setIcon(getView().getFolderIcon());
936 s = ((DbDirectoryInfo)value).getDescription();
937 setToolTipText(s.length() == 0 ? null : s);
938 } else if(value instanceof String) {
939 setIcon(getView().getFolderIcon());
940 setToolTipText(null);
941 } else if(value instanceof DbInstrumentInfo) {
942 DbInstrumentInfo info = (DbInstrumentInfo)value;
943 if("GIG".equals(info.getFormatFamily())) { // TODO: fix it!
944 setIcon(getView().getGigInstrumentIcon());
945 } else {
946 setIcon(getView().getInstrumentIcon());
947 }
948
949 s = info.getDescription();
950 setToolTipText(s.length() == 0 ? null : s);
951 } else {
952 setIcon(null);
953 setToolTipText(null);
954 }
955 } else {
956 setIcon(null);
957 setToolTipText(null);
958 }
959
960 if(value != null) setText(value.toString());
961 else setText("");
962
963 if (isSelected) {
964 setBackground(table.getSelectionBackground());
965 setForeground(table.getSelectionForeground());
966 } else {
967 setBackground(table.getBackground());
968 setForeground(table.getForeground());
969 }
970
971 ColumnType ct =
972 ((InstrumentsDbTableModel)table.getModel()).getColumnType(column);
973
974 if(ct == ColumnType.IS_DRUM || ct == ColumnType.FORMAT_FAMILY) {
975 setHorizontalAlignment(CENTER);
976 } else if ( ct == ColumnType.SIZE ||
977 ct == ColumnType.INSTRUMENT_NR ||
978 ct == ColumnType.FORMAT_VERSION
979 ) {
980 setHorizontalAlignment(RIGHT);
981 } else {
982 setHorizontalAlignment(LEFT);
983 }
984
985 return this;
986 }
987 }
988
989 private final EventHandler eventHandler = new EventHandler();
990
991 private EventHandler
992 getHandler() { return eventHandler; }
993
994 private class EventHandler implements ListSelectionListener, TreeSelectionListener,
995 SamplerChannelListListener, ListListener<OrchestraModel> {
996
997 public void
998 valueChanged(ListSelectionEvent e) {
999 boolean b = !getSelectionModel().isSelectionEmpty();
1000 deleteAction.setEnabled(b);
1001 propertiesAction.setEnabled(b || instrumentsDbTree.getSelectionCount() > 0);
1002 renameAction.setEnabled(b);
1003 changeDescriptionAction.setEnabled(b);
1004 cutAction.setEnabled(b);
1005 copyAction.setEnabled(b);
1006 updateLoadInstrumentMenuStates();
1007 updateAddToMidiMapMenuStates();
1008 updateAddToOrchestraMenuStates();
1009 }
1010
1011 public void
1012 valueChanged(TreeSelectionEvent e) {
1013 DbDirectoryTreeNode n = instrumentsDbTree.getSelectedDirectoryNode();
1014 setParentDirectoryNode(n);
1015 reloadAction.setEnabled(n != null);
1016 createDirectoryAction.setEnabled(n != null);
1017 propertiesAction.setEnabled(n != null || getLeadObject() != null);
1018 }
1019
1020 public void
1021 channelAdded(SamplerChannelListEvent e) {
1022 updateLoadInstrumentMenus();
1023 }
1024
1025 public void
1026 channelRemoved(SamplerChannelListEvent e) {
1027 updateLoadInstrumentMenus();
1028 }
1029
1030 public void
1031 entryAdded(ListEvent<OrchestraModel> e) { updateAddToOrchestraMenus(); }
1032
1033 public void
1034 entryRemoved(ListEvent<OrchestraModel> e) { updateAddToOrchestraMenus(); }
1035 }
1036
1037 class ContextMenu extends MouseAdapter {
1038 private final JPopupMenu instrumentMenu = new JPopupMenu();
1039 private final JPopupMenu directoryMenu = new JPopupMenu();
1040 private final JPopupMenu menu = new JPopupMenu();
1041
1042 private JMenu loadInstrumentMenu;
1043 private JMenu addToMidiMapMenu;
1044 private JMenu addToOrchestraMenu;
1045
1046 class MenuItem extends JMenuItem {
1047 MenuItem(Action a) { super(a); }
1048
1049 public Icon
1050 getIcon() { return null; }
1051 }
1052
1053 ContextMenu() {
1054 JMenuItem mi = new JMenuItem(pasteAction);
1055 mi.setIcon(null);
1056 menu.add(mi);
1057
1058 menu.addSeparator();
1059
1060 mi = new MenuItem(createDirectoryAction);
1061 mi.setIcon(null);
1062 menu.add(mi);
1063
1064 String s = i18n.getMenuLabel("instrumentsdb.actions.addInstruments");
1065 JMenu addInstrumentsMenu = new JMenu(s);
1066 menu.add(addInstrumentsMenu);
1067
1068 mi = new JMenuItem(addInstrumentsFromFileAction);
1069 mi.setIcon(null);
1070 addInstrumentsMenu.add(mi);
1071
1072 mi = new JMenuItem(addInstrumentsFromDirAction);
1073 mi.setIcon(null);
1074 addInstrumentsMenu.add(mi);
1075
1076 menu.addSeparator();
1077
1078 mi = new MenuItem(reloadAction);
1079 mi.setIcon(null);
1080 menu.add(mi);
1081
1082 menu.addSeparator();
1083
1084 mi = new JMenuItem(propertiesAction);
1085 mi.setIcon(null);
1086 menu.add(mi);
1087
1088 // Instrument's context menu
1089 mi = new JMenuItem(cutAction);
1090 mi.setIcon(null);
1091 instrumentMenu.add(mi);
1092
1093 mi = new JMenuItem(copyAction);
1094 mi.setIcon(null);
1095 instrumentMenu.add(mi);
1096
1097 instrumentMenu.addSeparator();
1098
1099 mi = new JMenuItem(deleteAction);
1100 mi.setIcon(null);
1101 instrumentMenu.add(mi);
1102
1103 mi = new JMenuItem(renameAction);
1104 mi.setIcon(null);
1105 instrumentMenu.add(mi);
1106
1107 mi = new JMenuItem(changeDescriptionAction);
1108 mi.setIcon(null);
1109 instrumentMenu.add(mi);
1110
1111 instrumentMenu.addSeparator();
1112
1113 s = i18n.getMenuLabel("instrumentsdb.actions.loadInstrument");
1114 loadInstrumentMenu = new JMenu(s);
1115 instrumentMenu.add(loadInstrumentMenu);
1116 registerLoadInstrumentMenus(loadInstrumentMenu);
1117
1118 addToMidiMapMenu =
1119 new JMenu(i18n.getMenuLabel("instrumentsdb.actions.addToMidiMap"));
1120 instrumentMenu.add(addToMidiMapMenu);
1121 registerAddToMidiMapMenu(addToMidiMapMenu);
1122
1123 s = i18n.getMenuLabel("instrumentsdb.actions.addToOrchestra");
1124 addToOrchestraMenu = new JMenu(s);
1125 instrumentMenu.add(addToOrchestraMenu);
1126 registerAddToOrchestraMenu(addToOrchestraMenu);
1127
1128 instrumentMenu.addSeparator();
1129
1130 mi = new JMenuItem(propertiesAction);
1131 mi.setIcon(null);
1132 instrumentMenu.add(mi);
1133
1134 // Directory's context menu
1135 mi = new JMenuItem(cutAction);
1136 mi.setIcon(null);
1137 directoryMenu.add(mi);
1138
1139 mi = new JMenuItem(copyAction);
1140 mi.setIcon(null);
1141 directoryMenu.add(mi);
1142
1143 directoryMenu.addSeparator();
1144
1145 mi = new JMenuItem(deleteAction);
1146 mi.setIcon(null);
1147 directoryMenu.add(mi);
1148
1149 mi = new JMenuItem(renameAction);
1150 mi.setIcon(null);
1151 directoryMenu.add(mi);
1152
1153 mi = new JMenuItem(changeDescriptionAction);
1154 mi.setIcon(null);
1155 directoryMenu.add(mi);
1156
1157 directoryMenu.addSeparator();
1158
1159 mi = new JMenuItem(propertiesAction);
1160 mi.setIcon(null);
1161 directoryMenu.add(mi);
1162 }
1163
1164 public void
1165 mousePressed(MouseEvent e) {
1166 if(e.isPopupTrigger()) show(e);
1167 }
1168
1169 public void
1170 mouseReleased(MouseEvent e) {
1171 if(e.isPopupTrigger()) show(e);
1172 }
1173
1174 void
1175 show(MouseEvent e) {
1176 Object obj = getLeadObject();
1177 if(obj == null) {
1178 menu.show(e.getComponent(), e.getX(), e.getY());
1179 return;
1180 }
1181
1182 if(obj instanceof DbInstrumentInfo) {
1183 instrumentMenu.show(e.getComponent(), e.getX(), e.getY());
1184 return;
1185 }
1186
1187 if(obj instanceof DbDirectoryInfo) {
1188 directoryMenu.show(e.getComponent(), e.getX(), e.getY());
1189 return;
1190 }
1191 }
1192 }
1193 }

  ViewVC Help
Powered by ViewVC