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

Contents of /jsampler/trunk/src/org/jsampler/view/AbstractInstrumentsDbTable.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2192 - (show annotations) (download)
Fri Jun 24 21:34:51 2011 UTC (12 years, 9 months ago) by iliev
File size: 19395 byte(s)
* Initial implementation of Sampler Browser
  (choose Window/Sampler Browser) - another way to view/edit
  the sampler configuration (work in progress - for now only
  support for viewing/editing send effects)

1 /*
2 * JSampler - a java front-end for LinuxSampler
3 *
4 * Copyright (C) 2005-2008 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;
24
25 import java.awt.Component;
26 import java.util.Comparator;
27 import java.util.List;
28 import java.util.Vector;
29
30 import javax.swing.DefaultCellEditor;
31 import javax.swing.JTable;
32 import javax.swing.JTextField;
33 import javax.swing.RowSorter.SortKey;
34 import javax.swing.SortOrder;
35
36 import javax.swing.event.RowSorterEvent;
37 import javax.swing.event.RowSorterListener;
38
39 import javax.swing.table.TableCellEditor;
40 import javax.swing.table.TableColumn;
41 import javax.swing.table.TableColumnModel;
42 import javax.swing.table.TableRowSorter;
43
44 import org.jsampler.CC;
45 import org.jsampler.JSPrefs;
46
47 import org.linuxsampler.lscp.DbDirectoryInfo;
48 import org.linuxsampler.lscp.DbInstrumentInfo;
49
50 import org.linuxsampler.lscp.event.InstrumentsDbAdapter;
51 import org.linuxsampler.lscp.event.InstrumentsDbEvent;
52
53 import static javax.swing.event.RowSorterEvent.Type.SORT_ORDER_CHANGED;
54
55
56 /**
57 *
58 * @author Grigor Iliev
59 */
60 public abstract class AbstractInstrumentsDbTable extends JTable {
61 private final DefaultCellEditor nameEditor;
62 private final JTextField tfEditor = new JTextField();
63
64 private DbDirectoryTreeNode directoryNode;
65 private final InstrumentsDbTableRowSorter rowSorter;
66
67 private String createdDirectoryName = null;
68
69 private InstrumentsDbTableView view = null;
70
71 private final String tablePrefix;
72
73 /**
74 * Creates a new instance of <code>AbstractInstrumentsDbTable</code>
75 */
76 public
77 AbstractInstrumentsDbTable() {
78 this("");
79 }
80
81 /**
82 * Creates a new instance of <code>AbstractInstrumentsDbTable</code>
83 * @param tablePrefix Used to create unique property names for storing
84 * the column preferences for different tables e.g. for DbInstrumentChooser,
85 * InstrumentsDbFrame.
86 */
87 public
88 AbstractInstrumentsDbTable(String tablePrefix) {
89 this(new InstrumentsDbTableModel(), tablePrefix);
90 }
91
92 /**
93 * Creates a new instance of <code>AbstractInstrumentsDbTable</code>
94 */
95 public AbstractInstrumentsDbTable(InstrumentsDbTableModel model, String tablePrefix) {
96 super(model);
97 setView(CC.getViewConfig().getInstrumentsDbTableView());
98
99 this.tablePrefix = tablePrefix;
100 loadColumnsVisibleState();
101 loadColumnWidths();
102
103 setAutoResizeMode(AUTO_RESIZE_OFF);
104
105 rowSorter = new InstrumentsDbTableRowSorter(getModel());
106 setRowSorter(rowSorter);
107
108 loadSortOrder();
109
110 RowSorterListener l = new RowSorterListener() {
111 public void
112 sorterChanged(RowSorterEvent e) {
113 if(e.getType() != SORT_ORDER_CHANGED) return;
114 rowSorterChanged();
115 }
116 };
117
118 getRowSorter().addRowSorterListener(l);
119
120 putClientProperty("JTable.autoStartsEdit", false);
121
122 nameEditor = new DefaultCellEditor(tfEditor);
123 nameEditor.setClickCountToStart(5);
124
125 if( getModel().getShowDummyColumn()) {
126 TableColumn dummy;
127 dummy = getColumnModel().getColumn(getModel().getDummyColumnIndex());
128 dummy.setPreferredWidth(10);
129 }
130 }
131
132 public InstrumentsDbTableModel
133 getModel() { return (InstrumentsDbTableModel)super.getModel(); }
134
135 public TableCellEditor
136 getCellEditor(int row, int column) {
137 if(column == 0) return nameEditor;
138 return super.getCellEditor(row, column);
139 }
140
141 public DbDirectoryTreeNode
142 getSelectedDirectoryNode() {
143 int idx = getSelectedRow();
144 if(idx == -1) return null;
145 idx = convertRowIndexToModel(idx);
146 return getModel().getDirectoryNode(idx);
147 }
148
149 /**
150 * Selects the specified directory.
151 * The current selection is not altered if missing directory is specified.
152 * @param dir The name of the directory to select.
153 */
154 public void
155 setSelectedDirectory(String dir) {
156 int i = getModel().getDirectoryRowIndex(dir);
157 if(i == -1) return;
158 i = convertRowIndexToView(i);
159 if(i == -1) return;
160
161 getSelectionModel().setSelectionInterval(i, i);
162 }
163
164 /**
165 * Selects the specified instrument.
166 * The current selection is not altered if missing instrument is specified.
167 * @param instr The name of the instrument to select.
168 */
169 public void
170 setSelectedInstrument(String instr) {
171 int i = getModel().getInstrumentRowIndex(instr);
172 if(i == -1) return;
173 i = convertRowIndexToView(i);
174 if(i == -1) return;
175 getSelectionModel().setSelectionInterval(i, i);
176 }
177
178 /**
179 * Gets all selected directories.
180 */
181 public DbDirectoryInfo[]
182 getSelectedDirectories() {
183 int[] rows = getSelectedRows();
184 if(rows.length == 0) return new DbDirectoryInfo[0];
185
186 DbDirectoryTreeNode dir;
187 Vector<DbDirectoryInfo> v = new Vector<DbDirectoryInfo>();
188 for(int i : rows) {
189 dir = getModel().getDirectoryNode(convertRowIndexToModel(i));
190 if(dir != null) v.add(dir.getInfo());
191 }
192
193 return v.toArray(new DbDirectoryInfo[v.size()]);
194 }
195
196 /**
197 * Gets all selected instruments.
198 */
199 public DbInstrumentInfo[]
200 getSelectedInstruments() {
201 int[] rows = getSelectedRows();
202 if(rows.length == 0) return new DbInstrumentInfo[0];
203
204 DbInstrumentInfo instr;
205 Vector<DbInstrumentInfo> v = new Vector<DbInstrumentInfo>();
206 for(int i : rows) {
207 instr = getModel().getInstrument(convertRowIndexToModel(i));
208 if(instr != null) v.add(instr);
209 }
210
211 return v.toArray(new DbInstrumentInfo[v.size()]);
212 }
213
214 public boolean
215 editCellAt(int row, int column) {
216 if(!super.editCellAt(row, column)) return false;
217
218 Component c = getEditorComponent();
219 if(c != null) c.requestFocusInWindow();
220
221 return true;
222 }
223
224 /**
225 * Gets the directory node, which
226 * content is represented by this table.
227 */
228 public DbDirectoryTreeNode
229 getParentDirectoryNode() { return directoryNode; }
230
231 /**
232 * Sets the directory node, which
233 * content will be represented by this table.
234 */
235 public void
236 setParentDirectoryNode(DbDirectoryTreeNode node) {
237 getModel().setParentDirectoryNode(node);
238
239 if(directoryNode != null) directoryNode.removeInstrumentsDbListener(getHandler());
240 directoryNode = node;
241 if(directoryNode != null) directoryNode.addInstrumentsDbListener(getHandler());
242 }
243
244 /**
245 * Gets the name of the directory created by this frontend.
246 * This method is used to determine the directories created
247 * by this frontend.
248 * @return The name of the directory created by this frontend.
249 */
250 public String
251 getCreatedDirectoryName() { return createdDirectoryName; }
252
253 /**
254 * Sets the name of the created by this frontend.
255 * @param name The name of the directory created by this frontend.
256 */
257 public void
258 setCreatedDirectoryName(String name) { createdDirectoryName = name; }
259
260 public Object
261 getLeadObject() {
262 if(getSelectionModel().isSelectionEmpty()) return null;
263 int idx = getSelectionModel().getLeadSelectionIndex();
264 if(idx < 0) return null;
265 idx = this.convertRowIndexToModel(idx);
266
267 return getModel().getValueAt(idx, 0);
268 }
269
270 /** Sets the view to be used for retrieving UI information. */
271 public void
272 setView(InstrumentsDbTableView view) {
273 this.view = view;
274 }
275
276 /** Gets the view used to retrieve UI information. */
277 public InstrumentsDbTableView
278 getView() { return view; }
279
280 private JSPrefs
281 preferences() { return CC.getViewConfig().preferences(); }
282
283 public void
284 loadColumnWidths() {
285 loadColumnWidths(tablePrefix);
286 }
287
288 public void
289 loadColumnWidths(String prefix) {
290 InstrumentsDbTableModel m = getModel();
291 TableColumnModel tcm = getColumnModel();
292
293 for(int i = 0; i < m.getColumnCount(); i++) {
294 switch(m.getColumnType(i)) {
295 case NAME:
296 String s = prefix + "DbInstrumentsTable.nameColumnWidth";
297 int w = preferences().getIntProperty(s);
298 if(w > 0) tcm.getColumn(i).setPreferredWidth(w);
299 break;
300 case SIZE:
301 s = prefix + "DbInstrumentsTable.sizeColumnWidth";
302 w = preferences().getIntProperty(s);
303 if(w > 0) tcm.getColumn(i).setPreferredWidth(w);
304 break;
305 case FORMAT_FAMILY:
306 s = prefix + "DbInstrumentsTable.formatFamilyColumnWidth";
307 w = preferences().getIntProperty(s);
308 if(w > 0) tcm.getColumn(i).setPreferredWidth(w);
309 break;
310 case FORMAT_VERSION:
311 s = prefix + "DbInstrumentsTable.formatVersionColumnWidth";
312 w = preferences().getIntProperty(s);
313 if(w > 0) tcm.getColumn(i).setPreferredWidth(w);
314 break;
315 case IS_DRUM:
316 s = prefix + "DbInstrumentsTable.isDrumColumnWidth";
317 w = preferences().getIntProperty(s);
318 if(w > 0) tcm.getColumn(i).setPreferredWidth(w);
319 break;
320 case CREATED:
321 s = prefix + "DbInstrumentsTable.createdColumnWidth";
322 w = preferences().getIntProperty(s);
323 if(w > 0) tcm.getColumn(i).setPreferredWidth(w);
324 break;
325 case MODIFIED:
326 s = prefix + "DbInstrumentsTable.modifiedColumnWidth";
327 w = preferences().getIntProperty(s);
328 if(w > 0) tcm.getColumn(i).setPreferredWidth(w);
329 break;
330 case PRODUCT:
331 s = prefix + "DbInstrumentsTable.productColumnWidth";
332 w = preferences().getIntProperty(s);
333 if(w > 0) tcm.getColumn(i).setPreferredWidth(w);
334 break;
335 case ARTISTS:
336 s = prefix + "DbInstrumentsTable.artistsColumnWidth";
337 w = preferences().getIntProperty(s);
338 if(w > 0) tcm.getColumn(i).setPreferredWidth(w);
339 break;
340 case INSTRUMENT_FILE:
341 s = prefix + "DbInstrumentsTable.instrumentFileColumnWidth";
342 w = preferences().getIntProperty(s);
343 if(w > 0) tcm.getColumn(i).setPreferredWidth(w);
344 break;
345 case INSTRUMENT_NR:
346 s = prefix + "DbInstrumentsTable.instrumentNrColumnWidth";
347 w = preferences().getIntProperty(s);
348 if(w > 0) tcm.getColumn(i).setPreferredWidth(w);
349 break;
350 case KEYWORDS:
351 s = prefix + "DbInstrumentsTable.keywordsColumnWidth";
352 w = preferences().getIntProperty(s);
353 if(w > 0) tcm.getColumn(i).setPreferredWidth(w);
354 break;
355 case DUMMY:
356 tcm.getColumn(i).setPreferredWidth(10);
357 break;
358 }
359 }
360 }
361
362 public void
363 saveColumnWidths() {
364 saveColumnWidths(tablePrefix);
365 }
366
367 public void
368 saveColumnWidths(String prefix) {
369 InstrumentsDbTableModel m = getModel();
370 TableColumnModel tcm = getColumnModel();
371
372 for(int i = 0; i < m.getColumnCount(); i++) {
373 switch(m.getColumnType(i)) {
374 case NAME:
375 String s = prefix + "DbInstrumentsTable.nameColumnWidth";
376 preferences().setIntProperty(s, tcm.getColumn(i).getWidth());
377 break;
378 case SIZE:
379 s = prefix + "DbInstrumentsTable.sizeColumnWidth";
380 preferences().setIntProperty(s, tcm.getColumn(i).getWidth());
381 break;
382 case FORMAT_FAMILY:
383 s = prefix + "DbInstrumentsTable.formatFamilyColumnWidth";
384 preferences().setIntProperty(s, tcm.getColumn(i).getWidth());
385 break;
386 case FORMAT_VERSION:
387 s = prefix + "DbInstrumentsTable.formatVersionColumnWidth";
388 preferences().setIntProperty(s, tcm.getColumn(i).getWidth());
389 break;
390 case IS_DRUM:
391 s = prefix + "DbInstrumentsTable.isDrumColumnWidth";
392 preferences().setIntProperty(s, tcm.getColumn(i).getWidth());
393 break;
394 case CREATED:
395 s = prefix + "DbInstrumentsTable.createdColumnWidth";
396 preferences().setIntProperty(s, tcm.getColumn(i).getWidth());
397 break;
398 case MODIFIED:
399 s = prefix + "DbInstrumentsTable.modifiedColumnWidth";
400 preferences().setIntProperty(s, tcm.getColumn(i).getWidth());
401 break;
402 case PRODUCT:
403 s = prefix + "DbInstrumentsTable.productColumnWidth";
404 preferences().setIntProperty(s, tcm.getColumn(i).getWidth());
405 break;
406 case ARTISTS:
407 s = prefix + "DbInstrumentsTable.artistsColumnWidth";
408 preferences().setIntProperty(s, tcm.getColumn(i).getWidth());
409 break;
410 case INSTRUMENT_FILE:
411 s = prefix + "DbInstrumentsTable.instrumentFileColumnWidth";
412 preferences().setIntProperty(s, tcm.getColumn(i).getWidth());
413 break;
414 case INSTRUMENT_NR:
415 s = prefix + "DbInstrumentsTable.instrumentNrColumnWidth";
416 preferences().setIntProperty(s, tcm.getColumn(i).getWidth());
417 break;
418 case KEYWORDS:
419 s = prefix + "DbInstrumentsTable.keywordsColumnWidth";
420 preferences().setIntProperty(s, tcm.getColumn(i).getWidth());
421 break;
422 }
423 }
424 }
425
426 public void
427 loadColumnsVisibleState() {
428 loadColumnsVisibleState(tablePrefix);
429 }
430
431 public void
432 loadColumnsVisibleState(String prefix) {
433 String s;
434 InstrumentsDbTableModel m = getModel();
435
436 s = prefix + "DbInstrumentsTable.ShowSizeColumn";
437 m.setShowSizeColumn(preferences().getBoolProperty(s));
438 s = prefix + "DbInstrumentsTable.ShowFormatFamilyColumn";
439 m.setShowFormatFamilyColumn(preferences().getBoolProperty(s));
440 s = prefix + "DbInstrumentsTable.ShowFormatVersionColumn";
441 m.setShowFormatVersionColumn(preferences().getBoolProperty(s));
442 s = prefix + "DbInstrumentsTable.ShowIsDrumColumn";
443 m.setShowIsDrumColumn(preferences().getBoolProperty(s));
444 s = prefix + "DbInstrumentsTable.ShowCreatedColumn";
445 m.setShowCreatedColumn(preferences().getBoolProperty(s));
446 s = prefix + "DbInstrumentsTable.ShowModifiedColumn";
447 m.setShowModifiedColumn(preferences().getBoolProperty(s));
448 s = prefix + "DbInstrumentsTable.ShowProductColumn";
449 m.setShowProductColumn(preferences().getBoolProperty(s));
450 s = prefix + "DbInstrumentsTable.ShowArtistsColumn";
451 m.setShowArtistsColumn(preferences().getBoolProperty(s));
452 s = prefix + "DbInstrumentsTable.ShowInstrumentFileColumn";
453 m.setShowInstrumentFileColumn(preferences().getBoolProperty(s));
454 s = prefix + "DbInstrumentsTable.ShowInstrumentNrColumn";
455 m.setShowInstrumentNrColumn(preferences().getBoolProperty(s));
456 s = prefix + "DbInstrumentsTable.ShowKeywordsColumn";
457 m.setShowKeywordsColumn(preferences().getBoolProperty(s));
458 }
459
460 public void
461 saveColumnsVisibleState() {
462 saveColumnsVisibleState(tablePrefix);
463 }
464
465 public void
466 saveColumnsVisibleState(String prefix) {
467 InstrumentsDbTableModel m = getModel();
468
469 String s = prefix + "DbInstrumentsTable.ShowSizeColumn";
470 preferences().setBoolProperty(s, m.getShowSizeColumn());
471 s = prefix + "DbInstrumentsTable.ShowFormatFamilyColumn";
472 preferences().setBoolProperty(s, m.getShowFormatFamilyColumn());
473 s = prefix + "DbInstrumentsTable.ShowFormatVersionColumn";
474 preferences().setBoolProperty(s, m.getShowFormatVersionColumn());
475 s = prefix + "DbInstrumentsTable.ShowIsDrumColumn";
476 preferences().setBoolProperty(s, m.getShowIsDrumColumn());
477 s = prefix + "DbInstrumentsTable.ShowCreatedColumn";
478 preferences().setBoolProperty(s, m.getShowCreatedColumn());
479 s = prefix + "DbInstrumentsTable.ShowModifiedColumn";
480 preferences().setBoolProperty(s, m.getShowModifiedColumn());
481 s = prefix + "DbInstrumentsTable.ShowProductColumn";
482 preferences().setBoolProperty(s, m.getShowProductColumn());
483 s = prefix + "DbInstrumentsTable.ShowArtistsColumn";
484 preferences().setBoolProperty(s, m.getShowArtistsColumn());
485 s = prefix + "DbInstrumentsTable.ShowInstrumentFileColumn";
486 preferences().setBoolProperty(s, m.getShowInstrumentFileColumn());
487 s = prefix + "DbInstrumentsTable.ShowInstrumentNrColumn";
488 preferences().setBoolProperty(s, m.getShowInstrumentNrColumn());
489 s = prefix + "DbInstrumentsTable.ShowKeywordsColumn";
490 preferences().setBoolProperty(s, m.getShowKeywordsColumn());
491 }
492
493 public void
494 loadSortOrder() {
495 loadSortOrder(tablePrefix);
496 }
497
498 public void
499 loadSortOrder(String prefix) {
500 int i = preferences().getIntProperty(tablePrefix + "sortOrder");
501 boolean descending = i < 0;
502 if(i < 0) i *= -1;
503 i--;
504
505 if(i < 0 || i >= getModel().getColumnCount()) {
506 getRowSorter().toggleSortOrder(0);
507 CC.getLogger().warning("Unknown table column: " + i);
508 } else {
509 getRowSorter().toggleSortOrder(i);
510 if(descending) getRowSorter().toggleSortOrder(i);
511 }
512 }
513
514 private void
515 rowSorterChanged() {
516 List<? extends SortKey> list = getRowSorter().getSortKeys();
517 if(list.isEmpty()) return;
518 SortKey k = list.get(0);
519 int i = k.getColumn() + 1;
520 if(k.getSortOrder() == SortOrder.UNSORTED) return;
521 if(k.getSortOrder() == SortOrder.DESCENDING) i *= -1;
522 preferences().setIntProperty(tablePrefix + "sortOrder", i);
523 }
524
525 /*public void
526 columnMarginChanged(ChangeEvent e) {
527 if(isEditing()) removeEditor();
528 TableColumn resizingColumn = null;
529 if(getTableHeader() != null) resizingColumn = getTableHeader().getResizingColumn();
530 if (resizingColumn != null && autoResizeMode == AUTO_RESIZE_OFF) {
531 resizingColumn.setPreferredWidth(resizingColumn.getWidth());
532 }
533 setAutoResizeMode();
534 resizeAndRepaint();
535 }
536
537 public boolean
538 getScrollableTracksViewportWidth() {
539 return getPreferredSize().width < getParent().getWidth();
540 }
541
542 private void
543 setAutoResizeMode() {
544 Container c = getParent();
545 if (!(c instanceof JViewport)) return;
546
547 JViewport vp = (JViewport)c;
548 int w = vp.getWidth();
549 TableColumn dummy = getColumnModel().getColumn(getModel().getDummyColumnIndex());
550 int i = w - (getColumnModel().getTotalColumnWidth() - dummy.getWidth());
551 if(i > 5) {
552 if(getAutoResizeMode() != AUTO_RESIZE_LAST_COLUMN)
553 setAutoResizeMode(AUTO_RESIZE_LAST_COLUMN);
554 } else {
555 if(getAutoResizeMode() != AUTO_RESIZE_OFF)
556 setAutoResizeMode(AUTO_RESIZE_OFF);
557 }
558 }*/
559
560 private class InstrumentsDbTableRowSorter extends TableRowSorter<InstrumentsDbTableModel> {
561 InstrumentsDbTableRowSorter(InstrumentsDbTableModel model) {
562 super(model);
563 }
564
565 public Comparator<?>
566 getComparator(int column) {
567 Comparator c = getModel().getComparator(column);
568 if(c != null) return c;
569
570 return super.getComparator(column);
571 }
572
573 protected boolean
574 useToString(int column) {
575 return getModel().getComparator(column) == null;
576 }
577
578 public boolean
579 isSortable(int column) {
580 return getModel().isSortable(column);
581 }
582 }
583
584 private final EventHandler eventHandler = new EventHandler();
585
586 private EventHandler
587 getHandler() { return eventHandler; }
588
589 private class EventHandler extends InstrumentsDbAdapter {
590
591 /**
592 * Invoked when the number of instrument
593 * directories in a specific directory has changed.
594 */
595 public void
596 directoryCountChanged(InstrumentsDbEvent e) {
597 String rd = getModel().getRenamedDirectory();
598 int idx = getModel().getDirectoryRowIndex(rd);
599 if(idx != -1) {
600 setSelectedDirectory(rd);
601 getModel().setRenamedDirectory(null);
602 }
603
604 idx = getModel().getDirectoryRowIndex(getCreatedDirectoryName());
605 if(idx != -1) {
606 idx = convertRowIndexToView(idx);
607 if(idx != -1) {
608 getSelectionModel().setSelectionInterval(idx, idx);
609 editCellAt(idx, 0);
610 Component c = nameEditor.getComponent();
611 if(c instanceof JTextField) ((JTextField)c).selectAll();
612 setCreatedDirectoryName(null);
613 }
614 }
615 }
616
617 /**
618 * Invoked when the number of instruments
619 * in a specific directory has changed.
620 */
621 public void
622 instrumentCountChanged(InstrumentsDbEvent e) {
623 String ri = getModel().getRenamedInstrument();
624 int idx = getModel().getInstrumentRowIndex(ri);
625 if(idx != -1) {
626 setSelectedInstrument(ri);
627 getModel().setRenamedInstrument(null);
628 }
629 }
630 }
631 }

  ViewVC Help
Powered by ViewVC