1
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
200
201
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
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
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
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
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
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
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
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 }