1 package prefuse.controls; 2 3 import java.awt.Cursor ; 4 import java.awt.Point ; 5 import java.awt.event.MouseEvent ; 6 7 import javax.swing.SwingUtilities ; 8 9 import prefuse.Display; 10 import prefuse.activity.Activity; 11 import prefuse.activity.SlowInSlowOutPacer; 12 13 14 26 public class ZoomingPanControl extends ControlAdapter { 27 28 private boolean repaint = true, started = false; 29 30 private Point 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 42 public ZoomingPanControl() { 43 this(true); 44 } 45 46 52 public ZoomingPanControl(boolean repaint) { 53 this.repaint = repaint; 54 } 55 56 59 public void mousePressed(MouseEvent 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 71 public void mouseDragged(MouseEvent 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 89 public void mouseReleased(MouseEvent 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 } 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 } 164 } | Popular Tags |