View Javadoc

1   // Copyright 2004-2005, FreeHEP.
2   package hep.wired.heprep.graphicspanel;
3   
4   import java.awt.*;
5   import java.awt.datatransfer.*;
6   import java.awt.event.*;
7   import java.util.*;
8   
9   import javax.swing.*;
10  import javax.swing.event.*;
11  import javax.swing.undo.*;
12  
13  import org.freehep.application.Application;
14  import org.freehep.application.studio.Studio;
15  import org.freehep.application.PrintHelper;
16  import org.freehep.util.commanddispatcher.CommandProcessor;
17  import org.freehep.util.commanddispatcher.CommandState;
18  import org.freehep.util.commanddispatcher.BooleanCommandState;
19  import org.freehep.util.export.ExportDialog;
20  import org.freehep.util.export.VectorGraphicsTransferable;
21  
22  import hep.wired.edit.Translate;
23  import hep.wired.edit.FitToWindow;
24  import hep.wired.edit.Reset;
25  import hep.wired.services.RecordPlot;
26  import hep.wired.interaction.DragAngledRectangleToScale;
27  import hep.wired.interaction.DragBallToRotate;
28  import hep.wired.interaction.DragRectangleToScale;
29  import hep.wired.interaction.DragToRotate;
30  import hep.wired.interaction.DragToScale;
31  import hep.wired.interaction.DragToTranslate;
32  
33  import hep.wired.heprep.edit.GraphicsModeEdit;
34  import hep.wired.heprep.interaction.HoverToPick;
35  import hep.wired.heprep.interaction.DragRectangleToPick;
36  import hep.wired.heprep.interaction.SetLocationPanel;
37  import hep.wired.heprep.interaction.ClickToSetLocation;
38  import hep.wired.heprep.interaction.Interaction;
39  import hep.wired.heprep.interaction.TreeSelection;
40  import hep.wired.heprep.plugin.WiredPlugin;
41  import hep.wired.heprep.image.WiredImage;
42  import hep.wired.util.WiredUndoManager;
43  
44  /***
45   * Defines a command handler for plot commands.
46   *
47   * @author Mark Donszelmann
48   * @version $Id: HepRepPanelCommandHandler.java 2136 2005-07-30 00:25:21Z duns $
49   */
50  public class HepRepPanelCommandHandler extends CommandProcessor implements UndoableEditListener {
51  
52      private RecordPlot plot;
53      private WiredPlugin plugin;
54  
55      private WiredUndoManager undoManager = new WiredUndoManager();
56  
57      /***
58       * Creates a command handler attached to the plot.
59       */
60      public HepRepPanelCommandHandler(RecordPlot plot) {
61          super();
62          this.plot = plot;
63          plugin = WiredPlugin.getPlugin();
64      }
65  
66      public void enableSaveAs(CommandState state) {
67          state.setEnabled(plot.getRecord() != null);
68          setChanged();
69      }
70      
71      public void onSaveAs() {
72          Studio studio = (Studio)Application.getApplication();
73          Properties user = studio.getUserProperties();
74          String creator = user.getProperty("fullVersion");
75  
76  	    String fileName = "Wired_"+plot.getName().replaceAll(" ","_");
77  
78          ExportDialog dialog = new ExportDialog(creator, true);
79          if (plot.getGraphicsPanel() instanceof HepRepPanel) {
80              dialog.addExportFileType(new XMLHepRepExportFileType());
81          }
82          dialog.setUserProperties(user);
83          dialog.showExportDialog(studio, "Export...", (Component)plot, fileName);
84      }
85      
86  
87  
88      public void enableHoverToPick(BooleanCommandState state) {
89          state.setEnabled(plot.supports(new HoverToPick()));
90          state.setSelected(plugin.getInteractionHandler() instanceof HoverToPick);
91          setChanged();
92      }
93  
94      public void onHoverToPick(boolean on) {
95          if (on) plugin.setInteractionHandler(new HoverToPick());
96          setChanged();
97      }    
98  
99  
100     public void enableDragRectangleToPick(BooleanCommandState state) {
101         state.setEnabled(plot.supports(new DragRectangleToPick()));
102         state.setSelected(plugin.getInteractionHandler() instanceof DragRectangleToPick);
103         setChanged();
104     }
105 
106     public void onDragRectangleToPick(boolean on) {
107         if (on) plugin.setInteractionHandler(new DragRectangleToPick());
108         setChanged();
109     }    
110 
111 
112     public void enableSetTranslation(CommandState state) {
113         state.setEnabled(plot.supports(new ClickToSetLocation()));
114         setChanged();
115     }    
116     
117     public void onSetTranslation() {
118         final JButton selectButton = new JButton("Select Location");
119         final JButton cancelButton = new JButton("Cancel");
120         SetLocationPanel panel = new SetLocationPanel(plot, selectButton);
121 
122         final JOptionPane pane = new JOptionPane(panel, 
123                                                  JOptionPane.QUESTION_MESSAGE,
124                                                  JOptionPane.OK_CANCEL_OPTION,
125                                                  WiredImage.getIcon("Translate3D32"),
126                                                  new Object[] { selectButton, cancelButton} );
127 
128         selectButton.addActionListener(new ActionListener() {
129             public void actionPerformed(ActionEvent event) {
130                 pane.setValue(selectButton);
131             }
132         });
133         
134         cancelButton.addActionListener(new ActionListener() {
135             public void actionPerformed(ActionEvent event) {
136                 pane.setValue(cancelButton);
137             }
138         });
139 
140         JDialog dialog = pane.createDialog(((JComponent)plot).getTopLevelAncestor(), 
141                                            "Select 3D position");
142         dialog.setResizable(true);
143         dialog.show();
144         dialog.dispose();
145 
146         Object value = pane.getValue();        
147         if ((value != null) && value.equals(selectButton)) {
148             try {
149                 double[] xyz = panel.getXYZ();
150                 System.out.println(xyz[0]+" "+xyz[1]+" "+xyz[2]);
151                 plot.postEdit(new Translate(-xyz[0], -xyz[1], -xyz[2]));
152             } catch (UnsupportedOperationException e) {
153                 JOptionPane.showMessageDialog(((JComponent)plot).getTopLevelAncestor(), 
154                                               e.getMessage(),
155                                               "Operation not supported",
156                                               JOptionPane.ERROR_MESSAGE);
157             }
158         }
159     }  
160 
161 
162     public void enableDrawWideLines(BooleanCommandState state) {
163         state.setEnabled(plot.supports(new GraphicsModeEdit("drawWideLines")));
164         state.setSelected(((HepRepGraphicsMode)((HepRepPanel)plot.getGraphicsPanel()).getGraphicsMode()).drawWideLines);
165         setChanged();
166     }
167 
168     public void onDrawWideLines(boolean on) {
169         plot.postEdit(new GraphicsModeEdit("drawWideLines", on));
170         setChanged();
171     }
172     
173 
174     public void enableFillBoxes(BooleanCommandState state) {
175         state.setEnabled(plot.supports(new GraphicsModeEdit("fillBoxes")));
176         state.setSelected(((HepRepGraphicsMode)((HepRepPanel)plot.getGraphicsPanel()).getGraphicsMode()).fillBoxes);
177         setChanged();
178     }
179 
180     public void onFillBoxes(boolean on) {
181         plot.postEdit(new GraphicsModeEdit("fillBoxes", on));
182         setChanged();
183     }
184     
185 
186     public void enableDrawFrames(BooleanCommandState state) {
187         state.setEnabled(plot.supports(new GraphicsModeEdit("drawFrames")));
188         state.setSelected(((HepRepGraphicsMode)((HepRepPanel)plot.getGraphicsPanel()).getGraphicsMode()).drawFrames);
189         setChanged();
190     }
191 
192     public void onDrawFrames(boolean on) {
193         plot.postEdit(new GraphicsModeEdit("drawFrames", on));
194         setChanged();
195     }
196     
197 
198     public void enableAntiAlias(BooleanCommandState state) {
199 // Bug 4485298 (Sun) creates an Exception when rendering large lines with
200 //              antialising switched on. Fixed for 1.5.0-beta-2.
201 //        state.setEnabled(false);
202         state.setEnabled(plot.supports(new GraphicsModeEdit("antiAlias")));
203         state.setSelected(((HepRepGraphicsMode)((HepRepPanel)plot.getGraphicsPanel()).getGraphicsMode()).antiAlias);
204         setChanged();
205     }
206 
207     public void onAntiAlias(boolean on) {
208         plot.postEdit(new GraphicsModeEdit("antiAlias", on));
209         setChanged();
210     }
211     
212     public void enableUseLayering(BooleanCommandState state) {
213         state.setEnabled(plot.supports(new GraphicsModeEdit("useLayering")));
214         state.setSelected(((HepRepGraphicsMode)((HepRepPanel)plot.getGraphicsPanel()).getGraphicsMode()).useLayering);
215         setChanged();        
216     }
217 
218     public void onUseLayering(boolean on) {
219         plot.postEdit(new GraphicsModeEdit("useLayering", on));
220         setChanged();
221     }
222 
223 
224     // =========================================================================================
225     // Additional handling, normally handled by WiredPlotCommandHandler, but plugin specific...
226     // =========================================================================================
227     public void enableRedo(CommandState state) {
228         state.setEnabled(undoManager.canRedo());
229         state.setText("Redo "+undoManager.getRedoString());
230         state.setToolTipText(undoManager.getRedoPresentationName());
231         setChanged();
232     }
233 
234     public void onRedo() {
235         undoManager.redo();
236         setChanged();
237     }
238 
239     public void enableUndo(CommandState state) {
240         state.setEnabled(undoManager.canUndo());
241         state.setText("Undo "+undoManager.getUndoString());
242         state.setToolTipText(undoManager.getUndoPresentationName());
243         setChanged();
244     }
245 
246     public void onUndo() {
247         undoManager.undo();
248         setChanged();
249     }
250 
251     public void onPrintSetup() {
252         Studio studio = (Studio)Application.getApplication();
253 
254         PrintHelper printHelper = new PrintHelper((Component)plot, studio);
255         printHelper.showOptionsDialog(studio);
256     }
257 
258     public void enablePrint(CommandState state) {
259         state.setEnabled(plot.getRecord() != null);
260         setChanged();
261     }
262     
263     public void onPrint() throws Exception {
264         Studio studio = (Studio)Application.getApplication();
265 
266         PrintHelper printHelper = new PrintHelper((Component)plot, studio);
267         printHelper.print();
268     }
269 
270     public void enablePrintPreview(CommandState state) {
271         state.setEnabled(plot.getRecord() != null);
272         setChanged();
273     }
274     
275     public void onPrintPreview() throws Exception {
276         Studio studio = (Studio)Application.getApplication();
277 
278         PrintHelper printHelper = new PrintHelper((Component)plot, studio);
279         printHelper.printPreview(studio);
280     }
281 
282     public void enableCopy(CommandState state) {
283         state.setEnabled(plot.getRecord() != null);
284         setChanged();
285     }
286     
287     public void onCopy() {
288         Clipboard clipBoard = Toolkit.getDefaultToolkit().getSystemClipboard();
289         VectorGraphicsTransferable transferable = new VectorGraphicsTransferable((Component)plot);
290         clipBoard.setContents(transferable, transferable);
291     }
292     
293     public void undoableEditHappened(UndoableEditEvent edit) {
294         undoManager.addEdit(edit.getEdit());
295         setChanged();
296     }
297 
298     public void enableDragToScale(BooleanCommandState state) {
299 //        System.err.println("enableDragToScale "+(plugin.getInteractionHandler() instanceof DragToScale));
300         state.setEnabled(plot.supports(new DragToScale()));
301         state.setSelected(plugin.getInteractionHandler() instanceof DragToScale);
302         setChanged();
303     }
304 
305     public void onDragToScale(boolean on) {
306         if (on) {
307             plugin.setControl(plugin.getInteractionPanel());
308             plugin.setInteractionHandler(new DragToScale());
309         }
310         setChanged();
311     }
312 
313 
314     public void enableDragRectangleToScale(BooleanCommandState state) {
315 //        System.err.println("enableDragRectangleToScale "+(plugin.getInteractionHandler() instanceof DragRectangleToScale));
316         state.setEnabled(plot.supports(new DragRectangleToScale()));
317         state.setSelected(plugin.getInteractionHandler() instanceof DragRectangleToScale);
318         setChanged();
319     }
320 
321     public void onDragRectangleToScale(boolean on) {
322         if (on) {
323             plugin.setControl(plugin.getInteractionPanel());
324             plugin.setInteractionHandler(new DragRectangleToScale());
325         }
326         setChanged();
327     }
328 
329 
330     public void enableDragAngledRectangleToScale(BooleanCommandState state) {
331 //        System.err.println("enableDragAngledRectangleToScale "+(plugin.getInteractionHandler() instanceof DragAngledRectangleToScale));
332         state.setEnabled(plot.supports(new DragAngledRectangleToScale()));
333         state.setSelected(plugin.getInteractionHandler() instanceof DragAngledRectangleToScale);
334         setChanged();
335     }
336 
337     public void onDragAngledRectangleToScale(boolean on) {
338         if (on) {
339             plugin.setControl(plugin.getInteractionPanel());
340             plugin.setInteractionHandler(new DragAngledRectangleToScale());
341         }
342         setChanged();
343     }
344 
345 
346     public void enableDragToTranslate(BooleanCommandState state) {
347 //        System.err.println("enableDragToTranslate "+(plugin.getInteractionHandler() instanceof DragToTranslate));
348         state.setEnabled(plot.supports(new DragToTranslate()));
349         state.setSelected(plugin.getInteractionHandler() instanceof DragToTranslate);
350         setChanged();
351     }
352 
353     public void onDragToTranslate(boolean on) {
354         if (on) {
355             plugin.setControl(plugin.getInteractionPanel());
356             plugin.setInteractionHandler(new DragToTranslate());
357         }
358         setChanged();
359     }
360     
361 
362     public void enableDragToRotate(BooleanCommandState state) {
363 //        System.err.println("enableDragToRotate "+(plugin.getInteractionHandler() instanceof DragToRotate));
364         state.setEnabled(plot.supports(new DragToRotate()));
365         state.setSelected(plugin.getInteractionHandler() instanceof DragToRotate);
366         setChanged();
367     }
368 
369     public void onDragToRotate(boolean on) {
370         if (on) {
371             plugin.setControl(plugin.getInteractionPanel());
372             plugin.setInteractionHandler(new DragToRotate());
373         }
374         setChanged();
375     }
376 
377 
378     public void enableDragBallToRotate(BooleanCommandState state) {
379 //        System.err.println("enableDragBallToRotate "+(plugin.getInteractionHandler() instanceof DragBallToRotate));
380         state.setEnabled(plot.supports(new DragBallToRotate()));
381         state.setSelected(plugin.getInteractionHandler() instanceof DragBallToRotate);
382         setChanged();
383     }
384 
385     public void onDragBallToRotate(boolean on) {
386         if (on) {
387             plugin.setControl(plugin.getInteractionPanel());
388             plugin.setInteractionHandler(new DragBallToRotate());
389         }
390         setChanged();
391     }
392 
393 
394     public void enableReset(CommandState state) {
395         state.setEnabled(plot.supports(new Reset()));
396         setChanged();
397     }    
398 
399     public void onReset() {
400         plot.postEdit(new Reset());
401     }  
402 
403 
404     public void enableFitToWindow(CommandState state) {
405         state.setEnabled(plot.supports(new FitToWindow()));
406         setChanged();
407     }    
408 
409     public void onFitToWindow() {
410         plot.postEdit(new FitToWindow());
411     }          
412 }