1 7 package com.nightlabs.editor2d.impl; 8 9 import java.awt.Rectangle ; 10 import java.awt.geom.AffineTransform ; 11 import java.util.ArrayList ; 12 import java.util.Collection ; 13 import java.util.Iterator ; 14 import java.util.List ; 15 16 import com.nightlabs.editor2d.DrawComponent; 17 import com.nightlabs.editor2d.DrawComponentContainer; 18 import com.nightlabs.editor2d.MultiLayerDrawComponent; 19 import com.nightlabs.editor2d.render.RenderModeManager; 20 21 public class DrawComponentContainerImpl 22 extends DrawComponentImpl 23 implements DrawComponentContainer 24 { 25 28 protected List drawComponents = null; 29 30 48 public DrawComponentContainerImpl() { 49 super(); 50 } 51 52 56 public List getDrawComponents() 57 { 58 if (drawComponents == null) { 59 drawComponents = new ArrayList (); 60 } 61 return drawComponents; 62 } 63 64 public void setDrawComponents(List drawComponents) { 65 this.drawComponents = drawComponents; 66 } 67 68 73 public void addDrawComponent(DrawComponent drawComponent) 74 { 75 primAddDrawComponent(drawComponent); 76 firePropertyChange(CHILD_ADDED, null, drawComponents); 77 } 78 79 protected void primAddDrawComponent(DrawComponent drawComponent) 80 { 81 drawComponent.setParent(this); 83 getRoot().registerDrawComponent(drawComponent); 84 drawComponent.setRenderModeManager(getRoot().getRenderModeManager()); 85 getDrawComponents().add(drawComponent); 86 bounds = null; 87 } 88 89 94 public void addDrawComponent(DrawComponent drawComponent, int index) 95 { 96 primAddDrawComponent(drawComponent, index); 97 firePropertyChange(CHILD_ADDED, null, drawComponents); 98 } 99 100 protected void primAddDrawComponent(DrawComponent drawComponent, int index) 101 { 102 drawComponent.setParent(this); 104 getRoot().registerDrawComponent(drawComponent); 105 drawComponent.setRenderModeManager(getRoot().getRenderModeManager()); 106 getDrawComponents().add(index, drawComponent); 107 bounds = null; 108 } 109 110 115 public void removeDrawComponent(DrawComponent drawComponent) 116 { 117 primRemoveDrawComponent(drawComponent); 118 firePropertyChange(CHILD_REMOVED, null, drawComponents); 119 } 120 121 protected void primRemoveDrawComponent(DrawComponent drawComponent) 122 { 123 getRoot().unregisterDrawComponent(drawComponent); 125 getDrawComponents().remove(drawComponent); 126 bounds = null; 127 } 128 129 133 public void removeDrawComponent(int index) 134 { 135 primRemoveDrawComponent(index); 136 firePropertyChange(CHILD_REMOVED, null, drawComponents); 137 } 138 139 protected void primRemoveDrawComponent(int index) 140 { 141 DrawComponent dc = (DrawComponent) getDrawComponents().get(index); 142 long idToRemove = dc.getId(); 144 getRoot().unregisterDrawComponent(idToRemove); 145 getDrawComponents().remove(index); 146 bounds = null; 147 } 148 149 154 public MultiLayerDrawComponent getRoot() 155 { 156 DrawComponentContainer parent = getParent(); 157 if (parent == null) { 158 if (this instanceof MultiLayerDrawComponent) 159 return (MultiLayerDrawComponent) this; 160 else 161 throw new IllegalStateException ("Member parent may not be null for DrawComponentContainer "+this.toString()); 162 } 163 164 if (parent instanceof MultiLayerDrawComponent) { 165 return (MultiLayerDrawComponent) parent; 166 } 167 168 while (!(parent instanceof MultiLayerDrawComponent)) { 169 parent = parent.getParent(); 170 } 171 172 return (MultiLayerDrawComponent) parent; 173 } 174 175 public Rectangle getBounds() 176 { 177 if (bounds != null) { 178 return bounds; 179 } 180 else 181 { 182 Rectangle oldBounds = bounds; 183 184 int minX = Integer.MAX_VALUE; 185 int minY = Integer.MAX_VALUE; 186 int maxX = Integer.MIN_VALUE; 187 int maxY = Integer.MIN_VALUE; 188 189 if (getDrawComponents().isEmpty()) 190 return new Rectangle (0, 0, 0, 0); 191 192 for (Iterator it = getDrawComponents().iterator(); it.hasNext(); ) 193 { 194 DrawComponent dc = (DrawComponent) it.next(); 195 Rectangle bounds = dc.getBounds(); 196 minX = Math.min((int)bounds.getMinX(), minX); 197 minY = Math.min((int)bounds.getMinY(), minY); 198 maxX = Math.max((int)bounds.getMaxX(), maxX); 199 maxY = Math.max((int)bounds.getMaxY(), maxY); 200 } 201 bounds = new Rectangle (minX, minY, maxX-minX, maxY-minY); 202 203 firePropertyChange(PROP_BOUNDS, oldBounds, bounds); 204 return bounds; 205 } 206 } 207 208 public void transform(AffineTransform at) 209 { 210 for (Iterator it = getDrawComponents().iterator(); it.hasNext(); ) { 211 DrawComponent dc = (DrawComponent) it.next(); 212 dc.transform(at); 213 } 214 super.transform(at); 215 } 216 217 public void setRenderModeManager(RenderModeManager man) 218 { 219 super.setRenderModeManager(man); 220 for (Iterator it = getDrawComponents().iterator(); it.hasNext(); ) { 221 DrawComponent dc = (DrawComponent) it.next(); 222 dc.setRenderModeManager(renderModeManager); 223 } 224 } 225 226 public void setRenderMode(int mode) 227 { 228 super.setRenderMode(mode); 229 for (Iterator it = getDrawComponents().iterator(); it.hasNext(); ) { 230 DrawComponent dc = (DrawComponent) it.next(); 231 dc.setRenderMode(mode); 232 } 233 } 234 235 public Class getRenderModeClass() { 236 return DrawComponentContainer.class; 237 } 238 239 public void notifyChildTransform(DrawComponent child) 240 { 241 Rectangle childBounds = child.getBounds(); 243 if (!getBounds().contains(childBounds)) { 244 bounds = null; 245 setBounds(getBounds()); 246 System.out.println("DrawComponent changed DrawComponentContainer BOUNDS!"); 247 } 248 } 249 250 public String getTypeName() { 254 return "DrawComponentContainer"; 255 } 256 257 public void setLanguageId(String newLanguageId) 258 { 259 super.setLanguageId(newLanguageId); 260 for (Iterator it = getDrawComponents().iterator(); it.hasNext(); ) { 261 DrawComponent dc = (DrawComponent) it.next(); 262 dc.setLanguageId(newLanguageId); 263 } 264 } 265 266 269 public Collection findDrawComponents(Class type) 270 { 271 return findDrawComponents(type, false); 272 } 273 276 public Collection findDrawComponents(Class type, boolean canSelfPackage) 277 { 278 ArrayList res = new ArrayList (); 279 280 if (drawComponents != null) { 281 for (Iterator it = drawComponents.iterator(); it.hasNext(); ) { 282 DrawComponent dc = (DrawComponent) it.next(); 283 284 if (type.isInstance(dc)) { 285 res.add(dc); 286 287 if (!canSelfPackage) 288 continue; 289 } 290 291 if (dc instanceof DrawComponentContainer) { 292 DrawComponentContainer dcc = (DrawComponentContainer)dc; 293 res.addAll(dcc.findDrawComponents(type, canSelfPackage)); 294 } 295 } } 298 return res; 299 } 300 } | Popular Tags |