1 26 27 package org.nightlabs.editor2d.impl; 28 29 import java.awt.Rectangle ; 30 import java.awt.geom.AffineTransform ; 31 import java.util.ArrayList ; 32 import java.util.Collection ; 33 import java.util.Iterator ; 34 import java.util.List ; 35 36 import org.nightlabs.editor2d.DrawComponent; 37 import org.nightlabs.editor2d.DrawComponentContainer; 38 import org.nightlabs.editor2d.MultiLayerDrawComponent; 39 import org.nightlabs.editor2d.render.RenderModeManager; 40 import org.nightlabs.util.Utils; 41 42 47 public class DrawComponentContainerImpl 48 extends DrawComponentImpl 49 implements DrawComponentContainer 50 { 51 54 protected List drawComponents = null; 55 56 public DrawComponentContainerImpl() { 57 super(); 58 } 59 60 65 public List getDrawComponents() 66 { 67 if (drawComponents == null) { 68 drawComponents = new ArrayList (); 69 } 70 return drawComponents; 71 } 72 73 76 public void setDrawComponents(List drawComponents) { 77 this.drawComponents = drawComponents; 78 } 79 80 92 public void addDrawComponent(DrawComponent drawComponent) 93 { 94 primAddDrawComponent(drawComponent); 95 firePropertyChange(CHILD_ADDED, null, drawComponents); 96 } 97 98 protected void primAddDrawComponent(DrawComponent drawComponent) 99 { 100 drawComponent.setParent(this); 102 getRoot().registerDrawComponent(drawComponent); 103 drawComponent.setRenderModeManager(getRoot().getRenderModeManager()); 104 getDrawComponents().add(drawComponent); 105 bounds = null; 106 } 107 108 128 public void addDrawComponent(DrawComponent drawComponent, int index) 129 { 130 primAddDrawComponent(drawComponent, index); 131 firePropertyChange(CHILD_ADDED, null, drawComponents); 132 } 133 134 protected void primAddDrawComponent(DrawComponent drawComponent, int index) 135 { 136 drawComponent.setParent(this); 138 getRoot().registerDrawComponent(drawComponent); 139 drawComponent.setRenderModeManager(getRoot().getRenderModeManager()); 140 getDrawComponents().add(index, drawComponent); 141 bounds = null; 142 } 143 144 159 public void removeDrawComponent(DrawComponent drawComponent) 160 { 161 primRemoveDrawComponent(drawComponent); 162 firePropertyChange(CHILD_REMOVED, null, drawComponents); 163 } 164 165 protected void primRemoveDrawComponent(DrawComponent drawComponent) 166 { 167 getRoot().unregisterDrawComponent(drawComponent); 169 getDrawComponents().remove(drawComponent); 170 bounds = null; 171 } 172 173 188 public void removeDrawComponent(int index) 189 { 190 primRemoveDrawComponent(index); 191 firePropertyChange(CHILD_REMOVED, null, drawComponents); 192 } 193 194 protected void primRemoveDrawComponent(int index) 195 { 196 DrawComponent dc = (DrawComponent) getDrawComponents().get(index); 197 long idToRemove = dc.getId(); 199 getRoot().unregisterDrawComponent(idToRemove); 200 getDrawComponents().remove(index); 201 bounds = null; 202 } 203 204 209 public MultiLayerDrawComponent getRoot() 210 { 211 DrawComponentContainer parent = getParent(); 212 if (parent == null) { 213 if (this instanceof MultiLayerDrawComponent) 214 return (MultiLayerDrawComponent) this; 215 else 216 throw new IllegalStateException ("Member parent may not be null for DrawComponentContainer "+this.toString()); 217 } 218 219 if (parent instanceof MultiLayerDrawComponent) { 220 return (MultiLayerDrawComponent) parent; 221 } 222 223 while (!(parent instanceof MultiLayerDrawComponent)) { 224 parent = parent.getParent(); 225 } 226 227 return (MultiLayerDrawComponent) parent; 228 } 229 230 235 public Rectangle getBounds() 236 { 237 if (bounds != null) { 238 return bounds; 239 } 240 else 241 { 242 Rectangle oldBounds = bounds; 243 244 int minX = Integer.MAX_VALUE; 245 int minY = Integer.MAX_VALUE; 246 int maxX = Integer.MIN_VALUE; 247 int maxY = Integer.MIN_VALUE; 248 249 if (getDrawComponents().isEmpty()) 250 return new Rectangle (0, 0, 0, 0); 251 252 for (Iterator it = getDrawComponents().iterator(); it.hasNext(); ) 253 { 254 DrawComponent dc = (DrawComponent) it.next(); 255 Rectangle bounds = dc.getBounds(); 256 minX = Math.min((int)bounds.getMinX(), minX); 257 minY = Math.min((int)bounds.getMinY(), minY); 258 maxX = Math.max((int)bounds.getMaxX(), maxX); 259 maxY = Math.max((int)bounds.getMaxY(), maxY); 260 } 261 bounds = new Rectangle (minX, minY, maxX-minX, maxY-minY); 262 263 firePropertyChange(PROP_BOUNDS, oldBounds, bounds); 264 return bounds; 265 } 266 } 267 268 272 public void setRenderModeManager(RenderModeManager man) 273 { 274 super.setRenderModeManager(man); 275 for (Iterator it = getDrawComponents().iterator(); it.hasNext(); ) { 276 DrawComponent dc = (DrawComponent) it.next(); 277 dc.setRenderModeManager(renderModeManager); 278 } 279 } 280 281 285 public void setRenderMode(int mode) 286 { 287 super.setRenderMode(mode); 288 for (Iterator it = getDrawComponents().iterator(); it.hasNext(); ) { 289 DrawComponent dc = (DrawComponent) it.next(); 290 dc.setRenderMode(mode); 291 } 292 } 293 294 public Class getRenderModeClass() { 295 return DrawComponentContainer.class; 296 } 297 298 public void notifyChildTransform(DrawComponent child) 299 { 300 bounds = null; 302 setBounds(getBounds()); 303 System.out.println("DrawComponent changed DrawComponentContainer BOUNDS!"); 304 } 305 306 public String getTypeName() { 307 return "DrawComponentContainer"; 308 } 309 310 314 public void setLanguageId(String newLanguageId) 315 { 316 super.setLanguageId(newLanguageId); 317 for (Iterator it = getDrawComponents().iterator(); it.hasNext(); ) { 318 DrawComponent dc = (DrawComponent) it.next(); 319 dc.setLanguageId(newLanguageId); 320 } 321 } 322 323 326 public Collection findDrawComponents(Class type) 327 { 328 return findDrawComponents(type, false); 329 } 330 333 public Collection findDrawComponents(Class type, boolean canSelfPackage) 334 { 335 ArrayList res = new ArrayList (); 336 337 if (drawComponents != null) { 338 for (Iterator it = drawComponents.iterator(); it.hasNext(); ) { 339 DrawComponent dc = (DrawComponent) it.next(); 340 341 if (type.isInstance(dc)) { 342 res.add(dc); 343 344 if (!canSelfPackage) 345 continue; 346 } 347 348 if (dc instanceof DrawComponentContainer) { 349 DrawComponentContainer dcc = (DrawComponentContainer)dc; 350 res.addAll(dcc.findDrawComponents(type, canSelfPackage)); 351 } 352 } } 355 return res; 356 } 357 358 362 public void setRotation(double newRotation) 363 { 364 for (Iterator it = getDrawComponents().iterator(); it.hasNext(); ) { 365 DrawComponent dc = (DrawComponent) it.next(); 366 dc.setRotationMember(newRotation); 367 } 368 super.setRotation(newRotation); 369 } 370 371 375 public void transform(AffineTransform at) 376 { 377 for (Iterator it = getDrawComponents().iterator(); it.hasNext(); ) { 378 DrawComponent dc = (DrawComponent) it.next(); 379 dc.transform(at, true); 381 } 382 super.transform(at); 383 } 384 385 399 420 public Object clone(DrawComponentContainer parent) 421 { 422 DrawComponentContainerImpl container = (DrawComponentContainerImpl) super.clone(parent); 423 container.drawComponents = new ArrayList (getDrawComponents().size()); 424 425 for (Iterator it = getDrawComponents().iterator(); it.hasNext(); ) { 427 DrawComponent child = (DrawComponent) it.next(); 428 DrawComponent clone = (DrawComponent) child.clone(container); 429 } 430 return container; 431 } 432 433 } | Popular Tags |