1 6 7 package com.thoughtriver.open.vectorvisuals; 8 9 import java.awt.*; 10 import java.awt.geom.*; 11 12 import com.thoughtriver.open.vectorvisuals.task.*; 13 import com.thoughtriver.open.vectorvisuals.ui.*; 14 15 27 public class VVDisplay { 28 29 33 private final VVViewPane viewPane; 34 35 39 private final TaskManager taskManager; 40 41 42 private final VisualObject rootObj; 43 44 45 private Point2D translation = null; 46 47 48 private double scale; 49 50 54 private double rotation; 55 56 66 public VVDisplay(final VVViewPane viewPane, final VisualObject rootObj) { 67 68 this.rootObj = rootObj; 69 rootObj.setDisplay(this); 70 71 taskManager = new TaskManager(this); 72 translation = new Point2D.Double(0, 0); 73 scale = 1.0; 74 rotation = 0.0; 75 76 if (viewPane instanceof Component) { 77 this.viewPane = viewPane; 78 viewPane.setVVDisplay(this); 79 } 80 else { 81 throw new IllegalArgumentException ("All VVViewPane implementations must extend Component"); 82 } 83 viewPane.setFocusable(true); 84 } 85 86 93 public VVDisplay(final VVViewPane viewPane) { 94 this(viewPane, new VisualContainerObject()); 95 } 96 97 106 public Component getViewPane() { 107 return (Component) viewPane; 108 } 109 110 117 public VisualObject getRootObject() { 118 return rootObj; 119 } 120 121 128 public TaskManager getTaskManager() { 129 return taskManager; 130 } 131 132 138 public synchronized void setWorldViewScale(final double scale) { 139 140 if (scale < 0.001) { 142 return; 143 } 144 145 int centerX = viewPane.getWidth() / 2; 147 int centerY = viewPane.getHeight() / 2; 148 Point2D oldCenter = getWorldPointUnderPixel(centerX, centerY); 149 150 this.scale = scale; 152 153 Point2D newCenter = getWorldPointUnderPixel(centerX, centerY); 155 156 double xDiff = newCenter.getX() - oldCenter.getX(); 158 double yDiff = newCenter.getY() - oldCenter.getY(); 159 160 Point2D translation = getWorldViewTranslation(); 162 setWorldViewTranslation(translation.getX() + (xDiff * scale), translation.getY() 163 + (yDiff * scale)); 164 165 viewPane.repaint(); 166 } 167 168 173 public synchronized double getWorldViewScale() { 174 return scale; 175 } 176 177 183 public synchronized void setWorldViewTranslation(final Point2D offset) { 184 translation = offset; 185 186 viewPane.repaint(); 187 } 188 189 196 public synchronized void setWorldViewTranslation(final double x, final double y) { 197 setWorldViewTranslation(new Point2D.Double(x, y)); 198 } 199 200 205 public synchronized Point2D getWorldViewTranslation() { 206 return translation; 207 } 208 209 215 public synchronized void centerViewOn(final VisualObject obj) { 216 217 int centerX = viewPane.getWidth() / 2; 219 int centerY = viewPane.getHeight() / 2; 220 Point2D oldCenter = getWorldPointUnderPixel(centerX, centerY); 221 222 Rectangle2D objBounds = obj.getShape().getBounds2D(); 224 AffineTransform objTransform = obj.getTransformRelativeTo(null); 225 226 objTransform.translate(objBounds.getCenterX(), objBounds.getCenterY()); 228 229 double xDiff = objTransform.getTranslateX() - oldCenter.getX(); 231 double yDiff = objTransform.getTranslateY() - oldCenter.getY(); 232 233 Point2D translation = getWorldViewTranslation(); 235 setWorldViewTranslation(translation.getX() 236 - (xDiff * getWorldViewScale()), translation.getY() 237 - (yDiff * getWorldViewScale())); 238 239 } 240 241 250 public synchronized AffineTransform getCompositeTransform() { 251 252 AffineTransform compositeTransform = AffineTransform.getTranslateInstance(getWorldViewTranslation().getX(), getWorldViewTranslation().getY()); 253 254 compositeTransform.concatenate(AffineTransform.getScaleInstance(scale, scale)); 255 256 compositeTransform.concatenate(AffineTransform.getRotateInstance(rotation)); 257 258 return compositeTransform; 259 } 260 261 270 public void addVVMouseListener(final VVMouseListener listener) { 271 viewPane.addMouseListener(listener); 272 viewPane.addMouseWheelListener(listener); 273 viewPane.addMouseMotionListener(listener); 274 } 275 276 284 public void removeVVMouseListener(final VVMouseListener listener) { 285 viewPane.removeMouseListener(listener); 286 viewPane.removeMouseWheelListener(listener); 287 viewPane.removeMouseMotionListener(listener); 288 } 289 290 302 public synchronized VisualObject getVisualObjectAt(final int x, final int y) { 303 304 Point2D point = getWorldPointUnderPixel(x, y); 305 if (point == null) { 306 return null; 307 } 308 309 return rootObj.getVisualObjectAt(point); 310 } 311 312 321 public synchronized Point2D getWorldPointUnderPixel(final int x, final int y) { 322 Point2D point = new Point2D.Double(x, y); 323 try { 324 point = getCompositeTransform().createInverse().transform(point, point); 325 } 326 catch (NoninvertibleTransformException e) { 327 return null; 328 } 329 330 return point; 331 } 332 333 340 public synchronized void paint(final Graphics g) { 341 342 Graphics2D g2d = (Graphics2D) g.create(); 343 g2d.setColor(viewPane.getBackground()); 344 g2d.fillRect(0, 0, viewPane.getWidth(), viewPane.getHeight()); 345 346 AffineTransform transform = g2d.getTransform(); 347 transform.concatenate(getCompositeTransform()); 348 g2d.setTransform(transform); 349 350 g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_SPEED); 351 g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 352 g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED); 353 rootObj.render(g2d); 354 355 g2d.dispose(); 356 } 357 358 364 public void addObject(final VisualObject vo) { 365 rootObj.add(vo); 366 viewPane.repaint(); 367 } 368 369 375 public void removeObject(final VisualObject vo) { 376 rootObj.remove(vo); 377 viewPane.repaint(); 378 } 379 380 } 381 | Popular Tags |