/[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 1487 - (hide annotations) (download)
Sun Nov 18 21:36:38 2007 UTC (16 years, 5 months ago) by iliev
File size: 15051 byte(s)
* fixed a bug in the parameter table occuring
  when combo box is used as cell editor

1 iliev 787 /*
2     * JSampler - a java front-end for LinuxSampler
3     *
4 iliev 1327 * Copyright (C) 2005-2007 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     StringListParameter slp = (StringListParameter)p;
196     if(slp.hasPossibilities()) {
197     return stringListEditor;
198     }
199     } else if(p.hasPossibilities()) {
200 iliev 1487 JComboBox cb = new JComboBox(p.getPossibilities());
201     cb.setSelectedItem(null);
202     return new DefaultCellEditor(cb);
203 iliev 787 } else if(p.getType() == ParameterType.INT) {
204     Integer i = p.hasRangeMin() ? p.getRangeMin().intValue() : null;
205     integerEditor.setMinimum(i);
206    
207     i = p.hasRangeMax() ? p.getRangeMax().intValue() : null;
208     integerEditor.setMaximum(i);
209    
210     return integerEditor;
211     } else if(p.getType() == ParameterType.FLOAT) {
212     Float f = p.hasRangeMin() ? p.getRangeMin().floatValue() : null;
213     floatEditor.setMinimum(f);
214    
215     f = p.hasRangeMax() ? p.getRangeMax().floatValue() : null;
216     floatEditor.setMaximum(f);
217    
218     return floatEditor;
219     }
220    
221     return null;
222     }
223    
224 iliev 1327 /** Gets the parameters that are shown in the table. */
225     public Parameter[]
226     getParameters() { return parameters; }
227    
228 iliev 787 /**
229     * Sets the parameters to be shown in the table.
230     * @param parameters The parameters to be shown in the table.
231     */
232     public void
233     setParameters(Parameter[] parameters) {
234     this.parameters = parameters;
235     fireTableDataChanged();
236     }
237    
238     /**
239     * Gets the number of columns in the model.
240     * @return The number of columns in the model.
241     */
242     public int
243     getColumnCount() { return 2; }
244    
245     /**
246     * Gets the number of rows in the model.
247     * @return The number of rows in the model.
248     */
249     public int
250     getRowCount() { return parameters.length; }
251    
252     /**
253     * Gets the name of the column at <code>columnIndex</code>.
254     * @return The name of the column at <code>columnIndex</code>.
255     */
256     public String
257     getColumnName(int col) { return " "; }
258    
259     /**
260     * Gets the value for the cell at <code>columnIndex</code> and
261     * <code>rowIndex</code>.
262     * @param row The row whose value is to be queried.
263     * @param col The column whose value is to be queried.
264     * @return The value for the cell at <code>columnIndex</code> and
265     * <code>rowIndex</code>.
266     */
267     public Object
268     getValueAt(int row, int col) {
269     switch(col) {
270     case PARAMETER_NAME_COLUMN:
271     return parameters[row].getName();
272     case PARAMETER_VALUE_COLUMN:
273     return parameters[row].getValue();
274     }
275    
276     return null;
277     }
278    
279     /**
280 iliev 911 * Sets the value in the cell at <code>col</code>
281     * and <code>row</code> to <code>value</code>.
282 iliev 787 */
283     public void
284     setValueAt(Object value, int row, int col) {
285     if(col != PARAMETER_VALUE_COLUMN) return;
286    
287     parameters[row].setValue(value);
288     fireTableCellUpdated(row, col);
289     fireParameterChanged(parameters[row]);
290     }
291    
292     /**
293     * Returns <code>true</code> if the cell at
294 iliev 911 * <code>row</code> and <code>col</code> is editable.
295 iliev 787 */
296     public boolean
297     isCellEditable(int row, int col) {
298     switch(col) {
299     case PARAMETER_NAME_COLUMN:
300     return false;
301     case PARAMETER_VALUE_COLUMN:
302     return canEditFixedParameters() || !parameters[row].isFixed();
303     default: return false;
304     }
305     }
306    
307     private void
308     fireParameterChanged(Parameter p) {
309     ParameterEvent e = new ParameterEvent(this, p);
310     for(ParameterListener l : parameterListeners) l.parameterChanged(e);
311     }
312    
313     class BooleanCellRenderer extends JCheckBox implements TableCellRenderer {
314     private final Border emptyBorder = BorderFactory.createEmptyBorder(1, 1, 1, 1);
315    
316     BooleanCellRenderer() {
317     setHorizontalAlignment(CENTER);
318     setBorderPainted(true);
319     }
320    
321     public Component
322     getTableCellRendererComponent (
323     JTable table,
324     Object value,
325     boolean isSelected,
326     boolean hasFocus,
327     int row,
328     int column
329     ) {
330     if (isSelected) {
331     setBackground(table.getSelectionBackground());
332     setForeground(table.getSelectionForeground());
333     } else {
334     setBackground(table.getBackground());
335     setForeground(table.getForeground());
336     }
337    
338     Boolean b = (Boolean) value;
339     setSelected(b != null && b);
340    
341     if(hasFocus) {
342     setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
343     } else { setBorder(emptyBorder); }
344    
345     setToolTipText(parameters[row].getDescription());
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     String[] poss = slp.getPossibilities()[0];
438     String[] vals = (String[])value;
439    
440     sb.setLength(0);
441    
442     if(vals != null) {
443     if(vals.length > 0) sb.append(vals[0]);
444    
445     for(int i = 1; i < vals.length; i++) {
446     sb.append(", ").append(vals[i]);
447     }
448     }
449    
450     editor.setText(sb.toString());
451    
452     menu.removeAll();
453     menuItems.removeAllElements();
454    
455     for(String s : poss) {
456     JCheckBoxMenuItem item = new JCheckBoxMenuItem(s);
457     setListener(item);
458    
459 iliev 1327 for(String s2 : vals) {
460     if(s2.equals(s)) item.setSelected(true);
461     }
462 iliev 787
463     menu.add(item);
464     menuItems.add(item);
465     }
466    
467     return editor;
468     }
469    
470     private void
471     setListener(JCheckBoxMenuItem i) {
472     i.addItemListener(new ItemListener() {
473     public void
474     itemStateChanged(ItemEvent e) {
475     StringListCellEditor.this.stopCellEditing();
476     }
477     });
478     }
479 iliev 1327 }
480 iliev 787
481 iliev 1327 /*private static JComboBox comboBox = new JComboBox();
482 iliev 787 class StringListCellEditor extends DefaultCellEditor {
483     StringListCellEditor() {
484     super(comboBox);
485     }
486    
487     public Object
488     getCellEditorValue() {
489     Object o = comboBox.getSelectedItem();
490     if(o == null) return null;
491     String[] sS = new String[1];
492     sS[0] = (String)o;
493     return sS;
494     }
495    
496     public Component
497     getTableCellEditorComponent (
498     JTable table,
499     Object value,
500     boolean isSelected,
501     int row,
502     int column
503     ) {
504     StringListParameter slp = (StringListParameter)parameters[row];
505     comboBox.removeAllItems();
506     for(String s : slp.getPossibilities()[0]) comboBox.addItem(s);
507     return comboBox;
508     }
509 iliev 1327 }*/
510 iliev 787
511     class StringListCellRenderer extends DefaultTableCellRenderer {
512     private final StringBuffer sb = new StringBuffer();
513    
514     public Component
515     getTableCellRendererComponent (
516     JTable table,
517     Object value,
518     boolean isSelected,
519     boolean hasFocus,
520     int row,
521     int column
522     ) {
523     if(value instanceof String) return super.getTableCellRendererComponent (
524     table, value, isSelected, hasFocus, row, column
525     );
526    
527     String[] s = (String[])value;
528    
529     sb.setLength(0);
530    
531     if(s != null) {
532     if(s.length > 0) sb.append(s[0]);
533     for(int i = 1; i < s.length; i++) sb.append(", ").append(s[i]);
534     }
535    
536     return super.getTableCellRendererComponent (
537     table, sb.toString(), isSelected, hasFocus, row, column
538     );
539     }
540     }
541     }

  ViewVC Help
Powered by ViewVC