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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1864 - (show annotations) (download)
Sat Mar 14 20:44:58 2009 UTC (15 years, 1 month ago) by iliev
File size: 15207 byte(s)
* Fixed bug in the parameter table when editing
  string list parameters with no possibilities
* Mac OS integration, work in progress:
* ant: added new target build-fantasia-osx
* Moved the menu bar on top of the screen
* Use custom application icon
* Register LSCP scripts to be opened with Fantasia
* Changed shortcut keys (use command key instead of ctrl key)

1 /*
2 * JSampler - a java front-end for LinuxSampler
3 *
4 * Copyright (C) 2005-2009 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
27 import java.awt.event.ActionEvent;
28 import java.awt.event.ActionListener;
29 import java.awt.event.ItemEvent;
30 import java.awt.event.ItemListener;
31
32 import java.util.Vector;
33
34 import javax.swing.AbstractCellEditor;
35 import javax.swing.BorderFactory;
36 import javax.swing.DefaultCellEditor;
37 import javax.swing.JButton;
38 import javax.swing.JCheckBox;
39 import javax.swing.JCheckBoxMenuItem;
40 import javax.swing.JComboBox;
41 import javax.swing.JMenu;
42 import javax.swing.JMenuItem;
43 import javax.swing.JPopupMenu;
44 import javax.swing.JTable;
45 import javax.swing.SpinnerNumberModel;
46 import javax.swing.UIManager;
47
48 import javax.swing.border.Border;
49
50 import javax.swing.event.PopupMenuEvent;
51 import javax.swing.event.PopupMenuListener;
52
53 import javax.swing.table.AbstractTableModel;
54 import javax.swing.table.DefaultTableCellRenderer;
55 import javax.swing.table.TableCellRenderer;
56 import javax.swing.table.TableCellEditor;
57
58 import org.jsampler.event.ParameterEvent;
59 import org.jsampler.event.ParameterListener;
60
61 import org.linuxsampler.lscp.Parameter;
62 import org.linuxsampler.lscp.ParameterType;
63 import org.linuxsampler.lscp.StringListParameter;
64
65
66 /**
67 * A tabular data model for representing LSCP parameters.
68 * @see ParameterTable
69 * @author Grigor Iliev
70 */
71 public class ParameterTableModel extends AbstractTableModel {
72 public final static int PARAMETER_NAME_COLUMN = 0;
73 public final static int PARAMETER_VALUE_COLUMN = 1;
74
75 private Parameter[] parameters;
76
77 private final BooleanCellRenderer booleanRenderer = new BooleanCellRenderer();
78 private final BooleanCellEditor booleanEditor = new BooleanCellEditor();
79
80 private final IntegerCellRenderer integerRenderer = new IntegerCellRenderer();
81 private final IntegerCellEditor integerEditor = new IntegerCellEditor();
82
83 private final FloatCellRenderer floatRenderer = new FloatCellRenderer();
84 private final FloatCellEditor floatEditor = new FloatCellEditor();
85
86 private final StringListCellRenderer stringListRenderer = new StringListCellRenderer();
87 private final StringListCellEditor stringListEditor = new StringListCellEditor();
88
89 private boolean editFixedParameters;
90
91
92 /**
93 * Creates a new instance of <code>ParameterTableModel</code>.
94 * @param parameters The parameters to be provided by this model.
95 */
96 public
97 ParameterTableModel(Parameter[] parameters) {
98 this(parameters, false);
99 }
100
101 /**
102 * Creates a new instance of <code>ParameterTableModel</code>.
103 * @param parameters The parameters to be provided by this model.
104 * @param editFixedParameters Determines whether fixed parameters are editable.
105 * Specify <code>true</code> to enable the editing of fixed parameters.
106 */
107 public
108 ParameterTableModel(Parameter[] parameters, boolean editFixedParameters) {
109 setParameters(parameters);
110 setEditFixedParameters(editFixedParameters);
111 }
112
113 private final Vector<ParameterListener> parameterListeners =
114 new Vector<ParameterListener>();
115
116 /**
117 * Registers the specified listener for receiving event messages.
118 * @param l The <code>ParameterListener</code> to register.
119 */
120 public void
121 addParameterListener(ParameterListener l) { parameterListeners.add(l); }
122
123 /**
124 * Removes the specified listener.
125 * @param l The <code>ParameterListener</code> to remove.
126 */
127 public void
128 removeParameterListener(ParameterListener l) { parameterListeners.remove(l); }
129
130 /**
131 * Sets whether fixed parameters are editable.
132 * @param b Specify <code>true</code> to enable the editing of fixed parameters.
133 * @see org.linuxsampler.lscp.Parameter#isFixed
134 */
135 public void
136 setEditFixedParameters(boolean b) { editFixedParameters = b; }
137
138 /**
139 * Determines whether fixed parameters are editable.
140 * @return <code>true</code> if the fixed parameters are
141 * editable, <code>false</code> otherwise.
142 * @see org.linuxsampler.lscp.Parameter#isFixed
143 */
144 public boolean
145 canEditFixedParameters() { return editFixedParameters; }
146
147 /**
148 * Gets the parameter at the specified row.
149 * @param row The row number of the parameter to be provided.
150 * @return The parameter at the specified row.
151 */
152 public Parameter
153 getParameter(int row) { return parameters[row]; }
154
155 /**
156 * Returns an appropriate renderer for the cell specified by
157 * <code>row</code> and <code>column</code>.
158 * @param row The row of the cell to render, where 0 is the first row.
159 * @param column The column of the cell to render, where 0 is the first column.
160 */
161 public TableCellRenderer
162 getCellRenderer(int row, int column) {
163 if(column != PARAMETER_VALUE_COLUMN) return null;
164
165 if(parameters[row].getType() == ParameterType.BOOL) return booleanRenderer;
166 else if(parameters[row].getType() == ParameterType.INT) return integerRenderer;
167 else if(parameters[row].getType() == ParameterType.FLOAT) return floatRenderer;
168 else if(parameters[row].getType() == ParameterType.STRING_LIST) {
169 return stringListRenderer;
170 }
171
172 return null;
173 }
174
175 /**
176 * Returns an appropriate editor for the cell specified by
177 * <code>row</code> and <code>column</code>.
178 * @param row The row of the cell to edit, where 0 is the first row.
179 * @param column The column of the cell to edit, where 0 is the first column.
180 */
181 public TableCellEditor
182 getCellEditor(int row, int column) {
183 if(column != PARAMETER_VALUE_COLUMN) return null;
184
185 Parameter p = parameters[row];
186 if(p.getType() == ParameterType.BOOL) return booleanEditor;
187
188 if(p.getType() == ParameterType.BOOL_LIST) {
189
190 } if(p.getType() == ParameterType.FLOAT_LIST) {
191
192 } if(p.getType() == ParameterType.INT_LIST) {
193
194 } if(p.getType() == ParameterType.STRING_LIST) {
195 // TODO: string list editor with no possibilities
196 /*StringListParameter slp = (StringListParameter)p;
197 if(slp.hasPossibilities()) {
198
199 }*/
200 return stringListEditor;
201 } else if(p.hasPossibilities()) {
202 JComboBox cb = new JComboBox(p.getPossibilities());
203 cb.setSelectedItem(null);
204 return new DefaultCellEditor(cb);
205 } else if(p.getType() == ParameterType.INT) {
206 Integer i = p.hasRangeMin() ? p.getRangeMin().intValue() : null;
207 integerEditor.setMinimum(i);
208
209 i = p.hasRangeMax() ? p.getRangeMax().intValue() : null;
210 integerEditor.setMaximum(i);
211
212 return integerEditor;
213 } else if(p.getType() == ParameterType.FLOAT) {
214 Float f = p.hasRangeMin() ? p.getRangeMin().floatValue() : null;
215 floatEditor.setMinimum(f);
216
217 f = p.hasRangeMax() ? p.getRangeMax().floatValue() : null;
218 floatEditor.setMaximum(f);
219
220 return floatEditor;
221 }
222
223 return null;
224 }
225
226 /** Gets the parameters that are shown in the table. */
227 public Parameter[]
228 getParameters() { return parameters; }
229
230 /**
231 * Sets the parameters to be shown in the table.
232 * @param parameters The parameters to be shown in the table.
233 */
234 public void
235 setParameters(Parameter[] parameters) {
236 this.parameters = parameters;
237 fireTableDataChanged();
238 }
239
240 /**
241 * Gets the number of columns in the model.
242 * @return The number of columns in the model.
243 */
244 public int
245 getColumnCount() { return 2; }
246
247 /**
248 * Gets the number of rows in the model.
249 * @return The number of rows in the model.
250 */
251 public int
252 getRowCount() { return parameters.length; }
253
254 /**
255 * Gets the name of the column at <code>columnIndex</code>.
256 * @return The name of the column at <code>columnIndex</code>.
257 */
258 public String
259 getColumnName(int col) { return " "; }
260
261 /**
262 * Gets the value for the cell at <code>columnIndex</code> and
263 * <code>rowIndex</code>.
264 * @param row The row whose value is to be queried.
265 * @param col The column whose value is to be queried.
266 * @return The value for the cell at <code>columnIndex</code> and
267 * <code>rowIndex</code>.
268 */
269 public Object
270 getValueAt(int row, int col) {
271 switch(col) {
272 case PARAMETER_NAME_COLUMN:
273 return parameters[row].getName();
274 case PARAMETER_VALUE_COLUMN:
275 return parameters[row].getValue();
276 }
277
278 return null;
279 }
280
281 /**
282 * Sets the value in the cell at <code>col</code>
283 * and <code>row</code> to <code>value</code>.
284 */
285 public void
286 setValueAt(Object value, int row, int col) {
287 if(col != PARAMETER_VALUE_COLUMN) return;
288
289 parameters[row].setValue(value);
290 fireTableCellUpdated(row, col);
291 fireParameterChanged(parameters[row]);
292 }
293
294 /**
295 * Returns <code>true</code> if the cell at
296 * <code>row</code> and <code>col</code> is editable.
297 */
298 public boolean
299 isCellEditable(int row, int col) {
300 switch(col) {
301 case PARAMETER_NAME_COLUMN:
302 return false;
303 case PARAMETER_VALUE_COLUMN:
304 return canEditFixedParameters() || !parameters[row].isFixed();
305 default: return false;
306 }
307 }
308
309 private void
310 fireParameterChanged(Parameter p) {
311 ParameterEvent e = new ParameterEvent(this, p);
312 for(ParameterListener l : parameterListeners) l.parameterChanged(e);
313 }
314
315 class BooleanCellRenderer extends JCheckBox implements TableCellRenderer {
316 private final Border emptyBorder = BorderFactory.createEmptyBorder(1, 1, 1, 1);
317
318 BooleanCellRenderer() {
319 setHorizontalAlignment(CENTER);
320 setBorderPainted(true);
321 }
322
323 public Component
324 getTableCellRendererComponent (
325 JTable table,
326 Object value,
327 boolean isSelected,
328 boolean hasFocus,
329 int row,
330 int column
331 ) {
332 if (isSelected) {
333 setBackground(table.getSelectionBackground());
334 setForeground(table.getSelectionForeground());
335 } else {
336 setBackground(table.getBackground());
337 setForeground(table.getForeground());
338 }
339
340 Boolean b = (Boolean) value;
341 setSelected(b != null && b);
342
343 if(hasFocus) {
344 setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
345 } else { setBorder(emptyBorder); }
346
347 return this;
348 }
349 }
350
351 class BooleanCellEditor extends DefaultCellEditor {
352 BooleanCellEditor() {
353 super(new JCheckBox());
354 JCheckBox cb = (JCheckBox)getComponent();
355 cb.setHorizontalAlignment(JCheckBox.CENTER);
356 }
357 }
358
359 class IntegerCellEditor extends NumberCellEditor {
360
361 }
362
363 class IntegerCellRenderer extends DefaultTableCellRenderer {
364 IntegerCellRenderer() {
365 setHorizontalAlignment(RIGHT);
366 }
367 }
368
369 class FloatCellEditor extends NumberCellEditor {
370 FloatCellEditor() {
371 SpinnerNumberModel model = new SpinnerNumberModel(0.0, 0.0, 0.0, 1.0);
372 setModel(model);
373 }
374 }
375
376 class FloatCellRenderer extends DefaultTableCellRenderer {
377 FloatCellRenderer() {
378 setHorizontalAlignment(RIGHT);
379 }
380 }
381
382 class StringListCellEditor extends AbstractCellEditor implements TableCellEditor {
383 private final JButton editor = new JButton();
384 private final JPopupMenu menu = new JPopupMenu();
385 private final Vector<JCheckBoxMenuItem> menuItems = new Vector<JCheckBoxMenuItem>();
386
387 StringListCellEditor() {
388 editor.setBorderPainted(false);
389 editor.setContentAreaFilled(false);
390 editor.setFocusPainted(false);
391 editor.setMargin(new java.awt.Insets(0, 0, 0, 0));
392 editor.setFont(editor.getFont().deriveFont(java.awt.Font.PLAIN));
393
394 editor.addActionListener(new ActionListener() {
395 public void
396 actionPerformed(ActionEvent e) { menu.show(editor, 0, 0); }
397 });
398
399 menu.addPopupMenuListener(new PopupMenuListener() {
400 public void
401 popupMenuCanceled(PopupMenuEvent e) {
402 StringListCellEditor.this.cancelCellEditing();
403 }
404
405 public void
406 popupMenuWillBecomeInvisible(PopupMenuEvent e) { }
407
408 public void
409 popupMenuWillBecomeVisible(PopupMenuEvent e) { }
410 });
411 }
412
413 private final Vector<String> strings = new Vector<String>();
414
415 public Object
416 getCellEditorValue() {
417 strings.removeAllElements();
418
419 for(JCheckBoxMenuItem i : menuItems) {
420 if(i.isSelected()) strings.add(i.getText());
421 }
422
423 return strings.toArray(new String[strings.size()]);
424 }
425
426 private final StringBuffer sb = new StringBuffer();
427
428 public Component
429 getTableCellEditorComponent (
430 JTable table,
431 Object value,
432 boolean isSelected,
433 int row,
434 int column
435 ) {
436 StringListParameter slp = (StringListParameter)parameters[row];
437 if(slp.getPossibilities().length == 0) {
438 editor.setText("");
439 return editor;
440 }
441 String[] poss = slp.getPossibilities()[0];
442 String[] vals = (String[])value;
443
444 sb.setLength(0);
445
446 if(vals != null) {
447 if(vals.length > 0) sb.append(vals[0]);
448
449 for(int i = 1; i < vals.length; i++) {
450 sb.append(", ").append(vals[i]);
451 }
452 }
453
454 editor.setText(sb.toString());
455
456 menu.removeAll();
457 menuItems.removeAllElements();
458
459 for(String s : poss) {
460 JCheckBoxMenuItem item = new JCheckBoxMenuItem(s);
461 setListener(item);
462
463 for(String s2 : vals) {
464 if(s2.equals(s)) item.setSelected(true);
465 }
466
467 menu.add(item);
468 menuItems.add(item);
469 }
470
471 return editor;
472 }
473
474 private void
475 setListener(JCheckBoxMenuItem i) {
476 i.addItemListener(new ItemListener() {
477 public void
478 itemStateChanged(ItemEvent e) {
479 StringListCellEditor.this.stopCellEditing();
480 }
481 });
482 }
483 }
484
485 /*private static JComboBox comboBox = new JComboBox();
486 class StringListCellEditor extends DefaultCellEditor {
487 StringListCellEditor() {
488 super(comboBox);
489 }
490
491 public Object
492 getCellEditorValue() {
493 Object o = comboBox.getSelectedItem();
494 if(o == null) return null;
495 String[] sS = new String[1];
496 sS[0] = (String)o;
497 return sS;
498 }
499
500 public Component
501 getTableCellEditorComponent (
502 JTable table,
503 Object value,
504 boolean isSelected,
505 int row,
506 int column
507 ) {
508 StringListParameter slp = (StringListParameter)parameters[row];
509 comboBox.removeAllItems();
510 for(String s : slp.getPossibilities()[0]) comboBox.addItem(s);
511 return comboBox;
512 }
513 }*/
514
515 class StringListCellRenderer extends DefaultTableCellRenderer {
516 private final StringBuffer sb = new StringBuffer();
517
518 public Component
519 getTableCellRendererComponent (
520 JTable table,
521 Object value,
522 boolean isSelected,
523 boolean hasFocus,
524 int row,
525 int column
526 ) {
527 if(value instanceof String) return super.getTableCellRendererComponent (
528 table, value, isSelected, hasFocus, row, column
529 );
530
531 String[] s = (String[])value;
532
533 sb.setLength(0);
534
535 if(s != null) {
536 if(s.length > 0) sb.append(s[0]);
537 for(int i = 1; i < s.length; i++) sb.append(", ").append(s[i]);
538 }
539
540 return super.getTableCellRendererComponent (
541 table, sb.toString(), isSelected, hasFocus, row, column
542 );
543 }
544 }
545 }

  ViewVC Help
Powered by ViewVC