/[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 787 - (hide annotations) (download)
Mon Oct 10 16:03:12 2005 UTC (18 years, 6 months ago) by iliev
File size: 14196 byte(s)
* The first alpha-release of JSampler

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

  ViewVC Help
Powered by ViewVC