/[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 787 - (show 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 /*
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