1
2 package hep.wired.heprep.interaction;
3
4 import java.awt.*;
5 import java.awt.event.*;
6 import java.beans.*;
7 import java.text.*;
8 import java.util.*;
9 import java.util.List;
10 import javax.swing.*;
11 import javax.swing.event.*;
12 import javax.swing.table.*;
13 import javax.swing.tree.*;
14
15 import org.freehep.swing.layout.TableLayout;
16 import org.freehep.util.ScientificFormat;
17
18 import hep.wired.image.WiredBaseImage;
19 import hep.wired.util.TitledPanel;
20 import hep.wired.util.DoubleSlider;
21 import hep.wired.util.BoundedDoubleRangeModel;
22 import hep.wired.util.DefaultBoundedDoubleRangeModel;
23 import hep.wired.util.ScientificTable;
24 import hep.wired.variable.Variable;
25 import hep.wired.variable.DoubleVariable;
26 import hep.wired.variable.IntegerVariable;
27 import hep.wired.variable.BooleanVariable;
28 import hep.wired.variable.VariableTableModel;
29 import hep.wired.variable.VariableSlider;
30 import hep.wired.variable.DoubleVariableSlider;
31 import hep.wired.variable.DoubleVariableSliderModel;
32 import hep.wired.variable.IntegerVariableSlider;
33 import hep.wired.variable.IntegerVariableSliderModel;
34 import hep.wired.variable.VariableChangeEvent;
35
36 import hep.wired.heprep.graphicspanel.ControlPanel;
37 import hep.wired.heprep.plugin.WiredPlugin;
38 import hep.wired.heprep.image.WiredImage;
39
40 /***
41 * VariablePanel.
42 *
43 * @author Mark Donszelmann
44 * @version $Id: VariablePanel.java 2163 2005-08-02 23:13:39Z duns $
45 */
46 public class VariablePanel extends ControlPanel implements ChangeListener {
47
48 private final String insets = " [3 3 3 3] ";
49
50 private List variableList = Collections.EMPTY_LIST;
51
52 private List
53
54 private int selectedIndex = -1;
55
56 private VariableTableModel variableTableModel;
57 private ScientificTable variableTable;
58 private JPanel variablePanel;
59
60 private VariableSlider slider;
61 private ChangeListener sliderChangeListener;
62
63 private DoubleVariableSliderModel doubleSliderModel;
64 private DoubleVariableSlider doubleSlider;
65
66 private IntegerVariableSliderModel integerSliderModel;
67 private IntegerVariableSlider integerSlider;
68
69 private JPanel optionPanel;
70
71 private JCheckBox applyImmediately;
72 private JButton apply;
73 private ButtonModel dummyApplyImmediatelyModel, dummyApplyModel;
74
75
76 private static int n=1;
77 private int faces;
78 private double alpha, alphaMax, phi, theta, sx;
79 private boolean split;
80
81 public VariablePanel() {
82 super("Settings", "Set or Change the values of variables",
83 WiredImage.getIcon("Settings%w", 16), null);
84 setLayout(new TableLayout());
85
86 variableTableModel = new VariableTableModel();
87 variableTable = new ScientificTable(variableTableModel) {
88
89
90 public Component prepareRenderer(TableCellRenderer renderer,
91 int rowIndex, int vColIndex) {
92 Component c = super.prepareRenderer(renderer, rowIndex, vColIndex);
93 if (c instanceof JComponent) {
94 Variable v = (Variable)variableList.get(rowIndex);
95 if (v != null) ((JComponent)c).setToolTipText(v.getDescription());
96
97 if (rowIndex == selectedIndex) {
98 c.setFont(c.getFont().deriveFont(Font.BOLD));
99 }
100
101 c.setEnabled(v.isEnabled());
102 }
103 return c;
104 }
105 };
106 variableTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
107
108 variablePanel = new TitledPanel("Choose:",
109 new JScrollPane(variableTable,
110 JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
111 JScrollPane.HORIZONTAL_SCROLLBAR_NEVER)
112 );
113
114 add(variablePanel, "0 0"+insets+"wh");
115
116 doubleSliderModel = new DoubleVariableSliderModel();
117 doubleSlider = new DoubleVariableSlider(doubleSliderModel);
118
119 integerSliderModel = new IntegerVariableSliderModel();
120 integerSlider = new IntegerVariableSlider(integerSliderModel);
121
122 slider = null;
123
124
125 final ListSelectionModel variableTableSelectionModel = variableTable.getSelectionModel();
126 variableTableSelectionModel.addListSelectionListener(new ListSelectionListener() {
127 public void valueChanged(ListSelectionEvent event) {
128 if (event.getValueIsAdjusting()) return;
129
130 for (int i = event.getFirstIndex(); i <= event.getLastIndex(); i++) {
131 if (variableTableSelectionModel.isSelectedIndex(i)) {
132 setSlider(i);
133 return;
134 }
135 }
136 }
137 });
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164 setVariables(Collections.EMPTY_LIST);
165 }
166
167 private void setSlider(int index) {
168 Variable variable = (Variable)variableList.get(index);
169 selectedIndex = index;
170 if (variable instanceof DoubleVariable) {
171 doubleSliderModel.setVariable((DoubleVariable)variable);
172
173 setSlider(doubleSlider);
174
175 } else if (variable instanceof IntegerVariable) {
176 integerSliderModel.setVariable((IntegerVariable)variable);
177
178 setSlider(integerSlider);
179
180 } else if (variable instanceof BooleanVariable) {
181 setSlider(null);
182
183
184
185
186
187
188
189 } else {
190 throw new IllegalArgumentException(getClass()+": ListSelectionListener cannot handle Variables of class: "+variable.getClass());
191 }
192 repaint();
193 }
194
195 public void addChangeListener(ChangeListener listener) {
196 changeListeners.add(listener);
197 }
198
199 public void removeChangeListener(ChangeListener listener) {
200 changeListeners.remove(listener);
201 }
202
203 public void setVariables(List variables) {
204 if (variableList == variables) return;
205
206 for (Iterator i=variableList.iterator(); i.hasNext(); ) {
207 ((Variable)i.next()).removeChangeListener(this);
208 }
209
210 variableList = (variables != null) ? variables : Collections.EMPTY_LIST;
211 variableTableModel.setVariables(variableList);
212
213 for (Iterator i=variableList.iterator(); i.hasNext(); ) {
214 ((Variable)i.next()).addChangeListener(this);
215 }
216
217 if (variableList.size() > 0) variableTable.setRowSelectionInterval(0,0);
218
219 revalidate();
220 repaint();
221 }
222
223
224 public void stateChanged(ChangeEvent event) {
225 if (event instanceof VariableChangeEvent) {
226 if (((VariableChangeEvent)event).isValue()) fireStateChanged();
227 } else {
228 fireStateChanged();
229 }
230 }
231
232
233
234
235
236
237
238 public void setFormat(ScientificFormat format) {
239 variableTable.setFormat(format);
240 doubleSlider.setFormat(format);
241 }
242
243 public Format getFormat() {
244 return variableTable.getFormat();
245 }
246
247 private void setSlider(VariableSlider slider) {
248 if (this.slider == slider) return;
249
250 if (this.slider != null) {
251
252 remove(this.slider);
253 }
254
255 this.slider = slider;
256
257 if (slider != null) {
258
259 add(slider, "1 0"+insets+"h");
260
261
262
263 }
264
265 revalidate();
266 repaint();
267 }
268
269 private void fireStateChanged() {
270 ChangeEvent event = new ChangeEvent(this);
271 for (Iterator i=changeListeners.iterator(); i.hasNext(); ) {
272 ((ChangeListener)i.next()).stateChanged(event);
273 }
274 }
275
276 public void update() {
277 setVariables(WiredPlugin.getPlugin().getVariables());
278 }
279
280 public static void main(String[] args) {
281 VariablePanel panel = new VariablePanel();
282
283 JFrame frame = new JFrame();
284 frame.getContentPane().add(panel);
285 frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
286 frame.pack();
287 frame.show();
288
289 List variableList = new ArrayList();
290 variableList.add(new IntegerVariable("faces", panel, 0, 16, 4, "", "Number of faces for a cylinder"));
291 variableList.add(new DoubleVariable("theta", panel, 0, 180, 90, "deg", "theta angle"));
292 variableList.add(new DoubleVariable("sx", panel, 0, Double.MAX_VALUE, 1, "", "scale in x"));
293
294 final DoubleVariable a = new DoubleVariable("alpha", panel, 0.01, 1.0, 0.5, "", "Angle");
295 final DoubleVariable aMax = new DoubleVariable("alphaMax", panel, 1.0, 10.0, 1.0, "", "Max alpha");
296 aMax.addChangeListener(new ChangeListener() {
297 public void stateChanged(ChangeEvent e) {
298 a.setMaximum(aMax.getDoubleVariable());
299 }
300 });
301
302 variableList.add(a);
303 variableList.add(aMax);
304
305 final BooleanVariable s = new BooleanVariable("split", panel, true, "split the detector");
306 final DoubleVariable p = new DoubleVariable("phi", panel, 0, 360, 0, "deg", "phi angle");
307 s.addChangeListener(new ChangeListener() {
308 public void stateChanged(ChangeEvent e) {
309 p.setEnabled(s.getBooleanVariable());
310 }
311 });
312
313 variableList.add(s);
314 variableList.add(p);
315
316
317 panel.addChangeListener(new ChangeListener() {
318 public void stateChanged(ChangeEvent event) {
319 System.err.println("Change "+n+" srcClass: "+event.getSource().getClass());
320 n++;
321 }
322 });
323
324 panel.setVariables(variableList);
325 }
326
327 }