HorizontalPanEventHandler.java

00001 package edu.stanford.hci.r3.browse;
00002 
00003 import java.awt.Rectangle;
00004 import java.awt.event.InputEvent;
00005 import java.awt.geom.Point2D;
00006 
00007 import edu.umd.cs.piccolo.PCamera;
00008 import edu.umd.cs.piccolo.event.PDragSequenceEventHandler;
00009 import edu.umd.cs.piccolo.event.PInputEvent;
00010 import edu.umd.cs.piccolo.event.PInputEventFilter;
00011 import edu.umd.cs.piccolo.util.PBounds;
00012 import edu.umd.cs.piccolo.util.PDimension;
00013 
00026 public class HorizontalPanEventHandler extends PDragSequenceEventHandler {
00027 
00028         private boolean autopan;
00029         private double minAutopanSpeed = 250;
00030         private double maxAutopanSpeed = 750;
00031 
00032         public HorizontalPanEventHandler() {
00033                 super();
00034                 setEventFilter(new PInputEventFilter(InputEvent.BUTTON1_MASK));
00035                 setAutopan(true);
00036         }
00037 
00038         protected void drag(PInputEvent e) {
00039                 super.drag(e);
00040                 pan(e);
00041         }
00042 
00043         protected void pan(PInputEvent e) {
00044                 PCamera c = e.getCamera();
00045                 Point2D l = e.getPosition();
00046 
00047                 if (c.getViewBounds().contains(l)) {
00048                         PDimension d = e.getDelta();
00049 
00050                         // c.translateView(d.getWidth(), d.getHeight());
00051                         c.translateView(d.getWidth(), 0);
00052                 }
00053         }
00054 
00055         // ****************************************************************
00056         // Auto Pan
00057         // ****************************************************************
00058 
00059         public void setAutopan(boolean autopan) {
00060                 this.autopan = autopan;
00061         }
00062 
00063         public boolean getAutopan() {
00064                 return autopan;
00065         }
00066 
00072         public void setMinAutopanSpeed(double minAutopanSpeed) {
00073                 this.minAutopanSpeed = minAutopanSpeed;
00074         }
00075 
00081         public void setMaxAutopanSpeed(double maxAutopanSpeed) {
00082                 this.maxAutopanSpeed = maxAutopanSpeed;
00083         }
00084 
00088         protected void dragActivityStep(PInputEvent aEvent) {
00089                 if (!autopan)
00090                         return;
00091 
00092                 PCamera c = aEvent.getCamera();
00093                 PBounds b = c.getBoundsReference();
00094                 Point2D l = aEvent.getPositionRelativeTo(c);
00095                 int outcode = b.outcode(l);
00096                 PDimension delta = new PDimension();
00097 
00098                 if ((outcode & Rectangle.OUT_TOP) != 0) {
00099                         delta.height = validatePanningSpeed(-1.0 - (0.5 * Math.abs(l.getY() - b.getY())));
00100                 } else if ((outcode & Rectangle.OUT_BOTTOM) != 0) {
00101                         delta.height = validatePanningSpeed(1.0 + (0.5 * Math.abs(l.getY()
00102                                         - (b.getY() + b.getHeight()))));
00103                 }
00104 
00105                 if ((outcode & Rectangle.OUT_RIGHT) != 0) {
00106                         delta.width = validatePanningSpeed(1.0 + (0.5 * Math.abs(l.getX()
00107                                         - (b.getX() + b.getWidth()))));
00108                 } else if ((outcode & Rectangle.OUT_LEFT) != 0) {
00109                         delta.width = validatePanningSpeed(-1.0 - (0.5 * Math.abs(l.getX() - b.getX())));
00110                 }
00111 
00112                 c.localToView(delta);
00113 
00114                 // only go for deltas in width...
00115                 if (delta.width != 0) {
00116                         c.translateView(delta.width, 0);
00117                 }
00118                 // if (delta.width != 0 || delta.height != 0) {
00119                 // c.translateView(delta.width, delta.height);
00120                 // }
00121         }
00122 
00123         protected double validatePanningSpeed(double delta) {
00124                 double minDelta = minAutopanSpeed / (1000 / getDragActivity().getStepRate());
00125                 double maxDelta = maxAutopanSpeed / (1000 / getDragActivity().getStepRate());
00126 
00127                 boolean deltaNegative = delta < 0;
00128                 delta = Math.abs(delta);
00129                 if (delta < minDelta)
00130                         delta = minDelta;
00131                 if (delta > maxDelta)
00132                         delta = maxDelta;
00133                 if (deltaNegative)
00134                         delta = -delta;
00135                 return delta;
00136         }
00137 
00138         // ****************************************************************
00139         // Debugging - methods for debugging
00140         // ****************************************************************
00141 
00149         protected String paramString() {
00150                 StringBuffer result = new StringBuffer();
00151 
00152                 result.append("minAutopanSpeed=" + minAutopanSpeed);
00153                 result.append(",maxAutopanSpeed=" + maxAutopanSpeed);
00154                 if (autopan)
00155                         result.append(",autopan");
00156                 result.append(',');
00157                 result.append(super.paramString());
00158 
00159                 return result.toString();
00160         }
00161 }

Generated on Sat Apr 14 18:21:35 2007 for R3 Paper Toolkit by  doxygen 1.4.7