KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > prefuse > controls > ZoomingPanControl


1 package prefuse.controls;
2
3 import java.awt.Cursor JavaDoc;
4 import java.awt.Point JavaDoc;
5 import java.awt.event.MouseEvent JavaDoc;
6
7 import javax.swing.SwingUtilities JavaDoc;
8
9 import prefuse.Display;
10 import prefuse.activity.Activity;
11 import prefuse.activity.SlowInSlowOutPacer;
12
13
14 /**
15  * <p>Allows users to pan over a display such that the display zooms in and
16  * out proportionally to how fast the pan is performed.</p>
17  *
18  * <p>The algorithm used is that of Takeo Igarishi and Ken Hinckley in their
19  * research paper
20  * <a HREF="http://citeseer.ist.psu.edu/igarashi00speeddependent.html">
21  * Speed-dependent Automatic Zooming for Browsing Large Documents</a>,
22  * UIST 2000.</p>
23  *
24  * @author <a HREF="http://jheer.org">jeffrey heer</a>
25  */

26 public class ZoomingPanControl extends ControlAdapter {
27
28     private boolean repaint = true, started = false;
29     
30     private Point JavaDoc mouseDown, mouseCur, mouseUp;
31     private int dx, dy;
32     private double d = 0;
33     
34     private double v0 = 75.0, d0 = 50, d1 = 400, s0 = .1;
35     
36     private UpdateActivity update = new UpdateActivity();
37     private FinishActivity finish = new FinishActivity();
38     
39     /**
40      * Create a new ZoomingPanControl.
41      */

42     public ZoomingPanControl() {
43         this(true);
44     }
45     
46     /**
47      * Create a new ZoomingPanControl.
48      * @param repaint true if repaint requests should be issued while
49      * panning and zooming. false if repaint requests will come from
50      * elsewhere (e.g., a continuously running action).
51      */

52     public ZoomingPanControl(boolean repaint) {
53         this.repaint = repaint;
54     }
55     
56     /**
57      * @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
58      */

59     public void mousePressed(MouseEvent JavaDoc e) {
60         if ( SwingUtilities.isLeftMouseButton(e) ) {
61             Display display = (Display)e.getComponent();
62             display.setCursor(
63                     Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
64             mouseDown = e.getPoint();
65         }
66     }
67     
68     /**
69      * @see java.awt.event.MouseMotionListener#mouseDragged(java.awt.event.MouseEvent)
70      */

71     public void mouseDragged(MouseEvent JavaDoc e) {
72         if ( SwingUtilities.isLeftMouseButton(e) ) {
73             mouseCur = e.getPoint();
74             dx = mouseCur.x - mouseDown.x;
75             dy = mouseCur.y - mouseDown.y;
76             d = Math.sqrt(dx*dx + dy*dy);
77             
78             if ( !started ) {
79                 Display display = (Display)e.getComponent();
80                 update.setDisplay(display);
81                 update.run();
82             }
83         }
84     }
85     
86     /**
87      * @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
88      */

89     public void mouseReleased(MouseEvent JavaDoc e) {
90         if ( SwingUtilities.isLeftMouseButton(e) ) {
91             update.cancel();
92             started = false;
93             
94             Display display = (Display)e.getComponent();
95             mouseUp = e.getPoint();
96             
97             finish.setDisplay(display);
98             finish.run();
99             
100             display.setCursor(Cursor.getDefaultCursor());
101         }
102     }
103     
104     private class UpdateActivity extends Activity {
105         private Display display;
106         private long lastTime = 0;
107         public UpdateActivity() {
108             super(-1,15,0);
109         }
110         public void setDisplay(Display display) {
111             this.display = display;
112         }
113         protected void run(long elapsedTime) {
114             double sx = display.getTransform().getScaleX();
115             double s, v;
116             
117             if ( d <= d0 ) {
118                 s = 1.0;
119                 v = v0*(d/d0);
120             } else {
121                 s = ( d >= d1 ? s0 : Math.pow(s0, (d-d0)/(d1-d0)) );
122                 v = v0;
123             }
124             
125             s = s/sx;
126             
127             double dd = (v*(elapsedTime-lastTime))/1000;
128             lastTime = elapsedTime;
129             double deltaX = -dd*dx/d;
130             double deltaY = -dd*dy/d;
131             
132             display.pan(deltaX,deltaY);
133             if (s != 1.0)
134                 display.zoom(mouseCur, s);
135             
136             if ( repaint )
137                 display.repaint();
138         }
139     } // end of class UpdateActivity
140

141     private class FinishActivity extends Activity {
142         private Display display;
143         private double scale;
144         public FinishActivity() {
145             super(1500,15,0);
146             setPacingFunction(new SlowInSlowOutPacer());
147         }
148         public void setDisplay(Display display) {
149             this.display = display;
150             this.scale = display.getTransform().getScaleX();
151             double z = (scale<1.0 ? 1/scale : scale);
152             setDuration((long)(500+500*Math.log(1+z)));
153         }
154         protected void run(long elapsedTime) {
155             double f = getPace(elapsedTime);
156             double s = display.getTransform().getScaleX();
157             double z = (f + (1-f)*scale)/s;
158             display.zoom(mouseUp,z);
159             if ( repaint )
160                 display.repaint();
161         }
162     } // end of class FinishActivity
163

164 } // end of class ZoomingPanControl
165
Popular Tags