1
2 package hep.wired.heprep.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.heprep.edit.MultiplyVariable;
12 import hep.wired.heprep.edit.SetVariable;
13 import hep.wired.interaction.DefaultInteractionHandler;
14 import hep.wired.services.GraphicsPanel;
15 import hep.wired.services.RecordPlot;
16 import hep.wired.image.WiredBaseImage;
17
18 /***
19 * Drag/click mouse to scale plot.
20 *
21 * @author Mark Donszelmann
22 * @version $Id: DragToChangeFishEye.java 681 2005-03-14 02:09:54Z duns $
23 */
24 public class DragToChangeFishEye extends DefaultInteractionHandler {
25
26 private static final String variable = "alpha";
27 private double dpsq;
28
29 /***
30 * Create a drag handler to generate scale edits.
31 */
32 public DragToChangeFishEye() {
33 super("Drag to Change Deformation of Fish-Eye");
34 }
35
36 public boolean isSupportedBy(GraphicsPanel panel) {
37 return new SetVariable(variable).isSupportedBy(panel);
38 }
39
40 public Icon getIcon(int size) {
41
42 return WiredBaseImage.getIcon("Scale%w", size);
43 }
44
45 public void changeCursor(RecordPlot plot, InputEvent event) {
46
47 plot.setCursor(WiredBaseImage.getBestCursor("ScaleCursor%w", 32, 32));
48 }
49
50 public void reset(RecordPlot plot, InputEvent event) {
51 plot.getGraphicsPanel().setFastMode(false);
52 plot.drawShape(null);
53 plot.repaint();
54 Application.getApplication().setStatusMessage("Drag inward or outward to change blow-up factor.");
55 }
56
57 public void mouseEntered(RecordPlot plot, MouseEvent event) {
58 plot.requestFocusInWindow();
59 changeCursor(plot, event);
60 }
61
62 public void mouseButton1DragStarted(RecordPlot plot, MouseEvent event) {
63 dpsq = Point2D.distanceSq(event.getComponent().getWidth()/2.0,
64 event.getComponent().getHeight()/2.0,
65 event.getX(),
66 event.getY());
67 changeCursor(plot, event);
68 plot.beginUpdate();
69 plot.getGraphicsPanel().setFastMode(true);
70 }
71
72 public void mouseButton1Dragged(RecordPlot plot, MouseEvent event) {
73 double ddsq = Point2D.distanceSq(event.getComponent().getWidth()/2.0,
74 event.getComponent().getHeight()/2.0,
75 event.getX(),
76 event.getY());
77 double s = Math.sqrt(ddsq / dpsq);
78
79
80 plot.postEdit(new MultiplyVariable(variable, s));
81 dpsq = ddsq;
82 defineShape(plot, event);
83 }
84
85 public void mouseButton1DragEnded(RecordPlot plot, MouseEvent event) {
86 plot.endUpdate();
87 reset(plot, event);
88 }
89
90 public void mouseButton1Released(RecordPlot plot, MouseEvent event) {
91 changeCursor(plot, event);
92 }
93
94 private void defineShape(RecordPlot plot, MouseEvent event) {
95 double x = event.getComponent().getWidth()/2.0;
96 double y = event.getComponent().getHeight()/2.0;
97 double d = Point2D.distance(event.getX(), event.getY(), x, y);
98 plot.drawShape(new Ellipse2D.Double(x - d, y - d, d*2, d*2));
99 }
100
101 public String toString() {
102 return "Drag to change Fish Eye";
103 }
104 }