1 6 7 package com.thoughtriver.open.vectorvisuals; 8 9 import java.awt.*; 10 import java.awt.geom.*; 11 import java.util.*; 12 import java.util.List ; 13 14 32 public class VisualObject { 33 34 35 private int layer; 36 37 38 private VVDisplay vvDisplay = null; 39 40 41 private VisualObjectManager objManager = null; 42 43 44 private LODManager lodManager = null; 45 46 50 private VisualObject parent = null; 51 52 53 private AffineTransform transform = null; 54 55 56 private Shape shape = null; 57 58 59 private Brush lineBrush = null; 60 61 62 private Brush fillBrush = null; 63 64 65 transient private int renderingDetail = Integer.MAX_VALUE; 66 67 77 public VisualObject(final Shape shape, final Brush lineBrush, final Brush fillBrush) { 78 layer = 1; 79 setShape(shape); 80 setLineBrush(lineBrush); 81 setFillBrush(fillBrush); 82 transform = new AffineTransform(); 83 } 84 85 91 synchronized void setDisplay(final VVDisplay vvDisplay) { 92 this.vvDisplay = vvDisplay; 93 } 94 95 102 synchronized public VVDisplay getDisplay() { 103 104 if (vvDisplay == null) { 106 if (getParent() != null) { return getParent().getDisplay(); 108 } 109 110 return null; 112 113 } 114 115 return vvDisplay; 117 } 118 119 124 synchronized public Shape getShape() { 125 return shape; 126 } 127 128 133 synchronized public void setShape(final Shape shape) { 134 this.shape = shape; 135 } 136 137 142 synchronized public Brush getLineBrush() { 143 return lineBrush; 144 } 145 146 152 synchronized public void setLineBrush(final Brush lineBrush) { 153 this.lineBrush = lineBrush; 154 } 155 156 161 synchronized public Brush getFillBrush() { 162 return fillBrush; 163 } 164 165 170 synchronized public void setFillBrush(final Brush fillBrush) { 171 this.fillBrush = fillBrush; 172 } 173 174 194 synchronized public void addLevelOfDetail(final double scale, final int detail) { 195 if (lodManager == null) { 196 lodManager = new LODManager(); 197 } 198 lodManager.addLevel(scale, detail); 199 } 200 201 211 synchronized public int getLevelOfDetail(final Graphics2D g2d) { 212 if (lodManager != null) { 213 AffineTransform absTransform = getTransformRelativeTo(null); 214 AffineTransform gTransform = g2d.getTransform(); 215 216 double scale = Math.max(Math.abs(absTransform.getScaleX()), Math.abs(absTransform.getScaleY())); 217 scale *= Math.max(Math.abs(gTransform.getScaleX()), Math.abs(gTransform.getScaleY())); 218 return lodManager.getLevel(scale); 219 } 220 221 return Integer.MAX_VALUE; 222 } 223 224 234 synchronized public void add(final VisualObject obj) { 235 if (objManager == null) { 236 objManager = new VisualObjectManager(); 237 } 238 objManager.addObject(obj); 239 240 obj.setParent(this); 241 } 242 243 251 synchronized public void remove(final VisualObject obj) { 252 if (objManager == null) { 253 return; 254 } 255 objManager.removeObject(obj); 256 257 obj.setParent(null); 258 } 259 260 267 synchronized public List <VisualObject> getAllEmbedded() { 268 if (objManager == null) { 269 return new LinkedList<VisualObject>(); 270 } 271 return objManager.getAllObjects(); 272 } 273 274 282 synchronized public int getLayer() { 283 return layer; 284 } 285 286 294 synchronized public void setLayer(final int layer) { 295 this.layer = layer; 296 } 297 298 305 synchronized public VisualObject getParent() { 306 return parent; 307 } 308 309 316 synchronized void setParent(final VisualObject parent) { 317 this.parent = parent; 318 } 319 320 327 synchronized public AffineTransform getTransform() { 328 return new AffineTransform(transform); 329 } 330 331 338 synchronized public void setTransform(final AffineTransform transform) { 339 this.transform = transform; 340 } 341 342 356 synchronized public AffineTransform getTransformRelativeTo(final VisualObject parent) { 357 358 if (parent == this) { 360 return new AffineTransform(); 361 362 } 364 else if (getParent() == null) { 365 return getTransform(); 366 367 } 369 else { 370 AffineTransform transform = getParent().getTransformRelativeTo(parent); 371 transform.concatenate(getTransform()); 372 return transform; 373 } 374 375 } 376 377 385 synchronized public Point2D getRotationPoint() { 386 Rectangle2D bounds = shape.getBounds2D(); 387 return new Point2D.Double(bounds.getCenterX(), bounds.getCenterY()); 388 } 389 390 399 synchronized public boolean contains(final Point2D point) { 400 401 Point2D transPoint = (Point2D) point.clone(); 402 try { 403 transPoint = getTransformRelativeTo(null).createInverse().transform(transPoint, transPoint); 404 } 405 catch (NoninvertibleTransformException e) { 406 return false; 407 } 408 return getShape().contains(transPoint); 409 } 410 411 420 synchronized public VisualObject getVisualObjectAt(final Point2D point) { 421 422 if (objManager != null) { 424 for (VisualObject obj : objManager.getAllObjects()) { 425 VisualObject found = obj.getVisualObjectAt(point); 426 if (found != null) { 427 return found; 428 } 429 } 430 } 431 432 if (contains(point)) { 434 return this; 435 } 436 437 return null; 438 } 439 440 448 synchronized public void prepare() { 449 } 451 452 463 synchronized public void render(final Graphics2D g) { 464 465 renderingDetail = getLevelOfDetail(g); 466 467 Graphics2D transformedG = (Graphics2D) g.create(); 468 transformedG.transform(transform); 469 renderObject(transformedG); 470 471 if (objManager != null) { 472 if (renderingDetail >= 2) { 474 objManager.renderNegativeLayers(transformedG); 475 } 476 } 477 478 renderOutline(transformedG); 479 480 if (objManager != null) { 481 if (renderingDetail >= 2) { 483 objManager.renderNonNegativeLayers(transformedG); 484 } 485 } 486 487 transformedG.dispose(); 488 } 489 490 496 synchronized public void renderObject(final Graphics2D g) { 497 if (fillBrush != null) { 498 fillBrush.useOn(g); 499 500 if (renderingDetail >= 2) { 501 g.fill(shape); 502 } 503 else if (renderingDetail == 1) { 504 Rectangle rect = shape.getBounds(); 505 g.fillRect(rect.x, rect.y, rect.width, rect.height); 506 } 507 } 508 } 509 510 515 synchronized public void renderOutline(final Graphics2D g) { 516 if (renderingDetail >= 2) { 517 if (lineBrush != null) { 518 lineBrush.useOn(g); 519 g.draw(shape); 520 } 521 } 522 } 523 524 } 525 | Popular Tags |