1 6 7 package com.thoughtriver.open.vectorvisuals.ui; 8 9 import java.awt.*; 10 import java.awt.event.*; 11 import java.awt.geom.*; 12 import java.util.*; 13 14 import com.thoughtriver.open.vectorvisuals.*; 15 16 24 public class VVMouseDragListener extends VVMouseListener implements MouseMotionListener { 25 26 27 private Object objectBeingDragged = null; 28 29 30 private Point lastKnownPoint = null; 31 32 33 private boolean viewportDraggable = false; 34 35 36 private final Set<VisualObject> draggableObjects = new HashSet<VisualObject>(); 37 38 45 public VVMouseDragListener(final VVDisplay vvDisplay) { 46 super(vvDisplay); 47 } 48 49 58 public VVMouseDragListener(final VVDisplay vvDisplay, final SelectionManager selectionManager) { 59 super(vvDisplay, selectionManager); 60 } 61 62 67 public boolean isViewportDraggable() { 68 return viewportDraggable; 69 } 70 71 77 public void setViewportDraggable(final boolean viewportDraggable) { 78 this.viewportDraggable = viewportDraggable; 79 } 80 81 87 public boolean isObjectDraggable(final VisualObject obj) { 88 return draggableObjects.contains(obj); 89 } 90 91 97 public void setObjectDraggable(final VisualObject obj, final boolean draggable) { 98 if (draggable) { 99 draggableObjects.add(obj); 100 } 101 else { 102 draggableObjects.remove(obj); 103 } 104 } 105 106 111 @Override 112 public void mouseDragged(final MouseEvent e) { 113 114 VVDisplay vvDisplay = getVVDisplay(); 115 116 Point currentPoint = e.getPoint(); 117 if (objectBeingDragged != null) { 118 119 vvDisplay.getViewPane().setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR)); 121 122 double diffX = currentPoint.getX() - lastKnownPoint.getX(); 124 double diffY = currentPoint.getY() - lastKnownPoint.getY(); 125 126 if (objectBeingDragged == vvDisplay) { 129 Point2D trans = vvDisplay.getWorldViewTranslation(); 130 double newX = trans.getX() + diffX; 131 double newY = trans.getY() + diffY; 132 vvDisplay.setWorldViewTranslation(newX, newY); 133 } 134 else if (objectBeingDragged instanceof VisualObject) { 135 translateObjectBeingDragged((VisualObject) objectBeingDragged, diffX, diffY); 136 137 vvDisplay.getViewPane().repaint(); 139 } 140 } 141 142 lastKnownPoint = currentPoint; 144 } 145 146 155 protected void translateObjectBeingDragged(final VisualObject obj, final double dx, final double dy) { 156 157 double diffX = dx; 158 double diffY = dy; 159 160 AffineTransform trans = obj.getTransform(); 161 162 double scale = getVVDisplay().getWorldViewScale(); 163 diffX /= (scale * trans.getScaleX()); 164 diffY /= (scale * trans.getScaleY()); 165 166 trans.translate(diffX, diffY); 167 obj.setTransform(trans); 168 } 169 170 176 @Override 177 public void mouseMoved(final MouseEvent e) { 178 179 lastKnownPoint = e.getPoint(); 181 } 182 183 188 @Override 189 public void mousePressed(final MouseEvent e) { 190 super.mousePressed(e); 191 192 determineObjectForDrag(e); 194 195 lastKnownPoint = e.getPoint(); 197 } 198 199 204 @Override 205 public void mouseReleased(final MouseEvent e) { 206 super.mouseReleased(e); 207 208 if (objectBeingDragged != null) { 210 objectBeingDragged = null; 211 212 lastKnownPoint = e.getPoint(); 213 } 214 215 getVVDisplay().getViewPane().setCursor(Cursor.getDefaultCursor()); 217 } 218 219 226 private void determineObjectForDrag(final MouseEvent e) { 227 228 VisualObject visObj = getVVDisplay().getVisualObjectAt(e.getX(), e.getY()); 230 231 while ((visObj != null) && (!isObjectDraggable(visObj))) { 233 visObj = visObj.getParent(); 234 } 235 objectBeingDragged = visObj; 236 237 if ((objectBeingDragged == null) && (isViewportDraggable())) { 239 objectBeingDragged = getVVDisplay(); 240 } 241 242 } 243 244 } 245 | Popular Tags |