1
2 package hep.wired.interaction;
3
4 import java.awt.*;
5 import java.awt.event.*;
6 import java.awt.geom.*;
7 import javax.swing.*;
8
9 import org.freehep.application.Application;
10
11 import hep.wired.edit.Scale;
12 import hep.wired.services.GraphicsPanel;
13 import hep.wired.services.RecordPlot;
14 import hep.wired.image.WiredBaseImage;
15
16 /***
17 * Drag/click mouse to scale plot.
18 *
19 * @author Mark Donszelmann
20 * @version $Id: DragToScale.java 682 2005-03-14 02:24:52Z duns $
21 */
22 public class DragToScale extends DefaultInteractionHandler {
23
24 private double dpsq;
25
26 /***
27 * Create a drag handler to generate scale edits.
28 */
29 public DragToScale() {
30 super("Drag to Scale");
31 }
32
33 public boolean isSupportedBy(GraphicsPanel panel) {
34 return new Scale().isSupportedBy(panel);
35 }
36
37 public Icon getIcon(int size) {
38 return WiredBaseImage.getIcon("Scale%w", size);
39 }
40
41 public String getDescription() {
42 return "Click to zoom in, Alt-Click to zoom out, Drag inward or outward to instant zoom.";
43 }
44
45 public void changeCursor(RecordPlot plot, InputEvent event) {
46 if (event.getID() == MouseEvent.MOUSE_DRAGGED) {
47 plot.setCursor(WiredBaseImage.getBestCursor("ScaleCursor%w", 32, 32));
48 } else if (event.isAltDown()) {
49 plot.setCursor(WiredBaseImage.getBestCursor("ScaleMinusCursor%w", 32, 32));
50 } else {
51 plot.setCursor(WiredBaseImage.getBestCursor("ScalePlusCursor%w", 32, 32));
52 }
53 }
54
55 public void reset(RecordPlot plot, InputEvent event) {
56 plot.getGraphicsPanel().setFastMode(false);
57 plot.drawShape(null);
58 plot.repaint();
59 Application.getApplication().setStatusMessage(getDescription());
60 }
61
62 public void mouseEntered(RecordPlot plot, MouseEvent event) {
63 plot.requestFocusInWindow();
64 changeCursor(plot, event);
65 }
66
67 public void mouseButton1DragStarted(RecordPlot plot, MouseEvent event) {
68 dpsq = Point2D.distanceSq(event.getComponent().getWidth()/2.0,
69 event.getComponent().getHeight()/2.0,
70 event.getX(),
71 event.getY());
72 changeCursor(plot, event);
73 plot.beginUpdate();
74 plot.getGraphicsPanel().setFastMode(true);
75 }
76
77 public void mouseButton1Dragged(RecordPlot plot, MouseEvent event) {
78 double ddsq = Point2D.distanceSq(event.getComponent().getWidth()/2.0,
79 event.getComponent().getHeight()/2.0,
80 event.getX(),
81 event.getY());
82 double s = Math.sqrt(ddsq / dpsq);
83
84 plot.postEdit(new Scale(s, s, s));
85 dpsq = ddsq;
86 defineShape(plot, event);
87 }
88
89 public void mouseButton1DragEnded(RecordPlot plot, MouseEvent event) {
90 plot.endUpdate();
91 reset(plot, event);
92 }
93
94 public void mouseButton1Released(RecordPlot plot, MouseEvent event) {
95 changeCursor(plot, event);
96 }
97
98 public boolean altKeyPressed(RecordPlot plot, KeyEvent event) {
99 changeCursor(plot, event);
100 return true;
101 }
102
103 public boolean altKeyReleased(RecordPlot plot, KeyEvent event) {
104 changeCursor(plot, event);
105 return true;
106 }
107
108 /***
109 * Zoom in (or out if alt key pressed).
110 */
111 public void mouseButton1Clicked(RecordPlot plot, MouseEvent event) {
112 double w = event.getComponent().getWidth();
113 double h = event.getComponent().getHeight();
114
115 plot.beginUpdate();
116
117 if (event.isAltDown()) {
118
119 Shape shape = new Rectangle2D.Double(0, 0, w, h);
120 plot.postEdit(new Scale(1/fixedScale, 1/fixedScale, 1/fixedScale, shape, 5));
121 } else {
122
123 Shape shape = new Rectangle2D.Double((w - (w/fixedScale))/2, (h - (h/fixedScale))/2, w/fixedScale, h/fixedScale);
124 plot.postEdit(new Scale(fixedScale, fixedScale, fixedScale, shape, 5));
125 }
126 plot.endUpdate();
127 reset(plot, event);
128 }
129
130 private void defineShape(RecordPlot plot, MouseEvent event) {
131 double x = event.getComponent().getWidth()/2.0;
132 double y = event.getComponent().getHeight()/2.0;
133 double d = Point2D.distance(event.getX(), event.getY(), x, y);
134 plot.drawShape(new Ellipse2D.Double(x - d, y - d, d*2, d*2));
135 }
136
137 public String toString() {
138 return "Drag to Scale";
139 }
140 }