View Javadoc

1   // Copyright 2005, FreeHEP.
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/*<ChangeListener>*/ changeListeners = new ArrayList();
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      // test variables
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              // override tooltip to be description of the variable
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         // hook selection from table to slider
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 NOTE: taken out since the resize did not work. Maybe not needed at all.     
141         optionPanel = new JPanel();
142         optionPanel.setLayout(new TableLayout());
143         add(optionPanel, "0 1 2 1"+insets+"wh");
144         
145         applyImmediately = new JCheckBox("Apply immediately");
146         optionPanel.add(applyImmediately, "0 0"+insets+"w");
147         applyImmediately.addPropertyChangeListener("enabled", new PropertyChangeListener() {
148             public void propertyChange(PropertyChangeEvent event) {
149                 apply.setEnabled(applyImmediately.isEnabled() && !applyImmediately.isSelected());
150             }
151         });
152         applyImmediately.addActionListener(new ActionListener() {
153             public void actionPerformed(ActionEvent event) {
154                 apply.setEnabled(!applyImmediately.isSelected());
155             }
156         });
157         dummyApplyImmediatelyModel = applyImmediately.getModel();
158 
159         apply = new JButton("Apply");
160         optionPanel.add(apply, "1 0"+insets+"");
161         dummyApplyModel = apply.getModel();
162 */
163         // initial List
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 //                            doubleSlider.setEnabled(true);
173             setSlider(doubleSlider);
174             
175         } else if (variable instanceof IntegerVariable) {
176             integerSliderModel.setVariable((IntegerVariable)variable);
177 //                            integerSlider.setEnabled(true);
178             setSlider(integerSlider);
179             
180         } else if (variable instanceof BooleanVariable) {
181             setSlider(null);
182 
183 //                            slider.setEnabled(false);
184 //                            doubleSlider.setEnabled(false);
185 //                            integerSlider.setEnabled(false);
186             // NOTE does not seem to have the correct effect.
187 //                            doubleSlider.setVisible(false);
188 //                            integerSlider.setVisible(false);
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     // forward events from variables
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     public void setEnabled(boolean state) {
234         applyImmediately.setEnabled(state);
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 //            this.slider.removeChangeListener(sliderChangeListener);
252             remove(this.slider);
253         }
254         
255         this.slider = slider;
256         
257         if (slider != null) {
258 //            slider.addChangeListener(sliderChangeListener);
259             add(slider, "1 0"+insets+"h"); 
260 
261 //            slider.setVisible(true);
262 //            slider.setEnabled(true);
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 }