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
00051 c.translateView(d.getWidth(), 0);
00052 }
00053 }
00054
00055
00056
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
00115 if (delta.width != 0) {
00116 c.translateView(delta.width, 0);
00117 }
00118
00119
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
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 }