View Javadoc

1   // Copyright 2004-2005, FreeHEP.
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         // zoom
117         if (event.isAltDown()) {
118             // zoom out
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             // zoom in
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 }