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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1864 - (hide 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 iliev 787 /*
2     * JSampler - a java front-end for LinuxSampler
3     *
4 iliev 1864 * Copyright (C) 2005-2009 Grigor Iliev <grigor@grigoriliev.com>
5 iliev 787 *
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 iliev 911 * A tabular data model for representing LSCP parameters.
68     * @see ParameterTable
69 iliev 787 * @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 iliev 911 private Parameter[] parameters;
76 iliev 787
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 iliev 911 /**
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 iliev 787 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 iliev 911 /**
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 iliev 787 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 iliev 1864 // TODO: string list editor with no possibilities
196     /*StringListParameter slp = (StringListParameter)p;
197 iliev 787 if(slp.hasPossibilities()) {
198 iliev 1864
199     }*/
200     return stringListEditor;
201 iliev 787 } else if(p.hasPossibilities()) {
202 iliev 1487 JComboBox cb = new JComboBox(p.getPossibilities());
203     cb.setSelectedItem(null);
204     return new DefaultCellEditor(cb);
205 iliev 787 } 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 iliev 1327 /** Gets the parameters that are shown in the table. */
227     public Parameter[]
228     getParameters() { return parameters; }
229    
230 iliev 787 /**
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 iliev 911 * Sets the value in the cell at <code>col</code>
283     * and <code>row</code> to <code>value</code>.
284 iliev 787 */
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 iliev 911 * <code>row</code> and <code>col</code> is editable.
297 iliev 787 */
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 iliev 1327 class StringListCellEditor extends AbstractCellEditor implements TableCellEditor {
383 iliev 787 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 iliev 1327 editor.setMargin(new java.awt.Insets(0, 0, 0, 0));
392 iliev 787 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 iliev 1864 if(slp.getPossibilities().length == 0) {
438     editor.setText("");
439     return editor;
440     }
441 iliev 787 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 iliev 1327 for(String s2 : vals) {
464     if(s2.equals(s)) item.setSelected(true);
465     }
466 iliev 787
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 iliev 1327 }
484 iliev 787
485 iliev 1327 /*private static JComboBox comboBox = new JComboBox();
486 iliev 787 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 iliev 1327 }*/
514 iliev 787
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