1 26 27 package org.nightlabs.editor2d.render; 28 29 import java.util.ArrayList ; 30 import java.util.Collection ; 31 import java.util.HashMap ; 32 import java.util.HashSet ; 33 import java.util.Iterator ; 34 import java.util.LinkedList ; 35 import java.util.Map ; 36 import java.util.Set ; 37 import java.util.Map.Entry; 38 39 import org.apache.log4j.Logger; 40 import org.nightlabs.editor2d.DrawComponentContainer; 41 import org.nightlabs.editor2d.ImageDrawComponent; 42 import org.nightlabs.editor2d.ShapeDrawComponent; 43 44 45 public class RenderModeManager 46 { 47 public static final Logger LOGGER = Logger.getLogger(RenderModeManager.class); 48 49 public static final int DEFAULT_MODE = 1; 50 public static final int ROLLOVER_MODE = 2; 51 52 public RenderModeManager() 53 { 54 super(); 55 initModes(); 56 } 57 58 62 protected void initModes() 63 { 64 if (mode2Class2Renderer == null) 65 mode2Class2Renderer = new HashMap (); 66 67 addRenderer(DEFAULT_MODE, ShapeDrawComponent.class, new ShapeDefaultRenderer()); 68 addRenderer(DEFAULT_MODE, ImageDrawComponent.class, new ImageDefaultRenderer()); 69 addRenderer(DEFAULT_MODE, DrawComponentContainer.class, new RendererImpl()); 70 } 73 74 protected Map mode2Class2Renderer; 76 77 88 public void addRenderer(int mode, Class dcClass, Renderer r) 89 { 90 if (dcClass == null) 91 throw new IllegalArgumentException ("Param dcClass must not be null!"); 92 93 if (r == null) 94 throw new IllegalArgumentException ("Param Renderer must not be null!"); 95 96 if (mode2Class2Renderer.containsKey(new Integer (mode))) 97 { 98 Map class2Renderer = (Map ) mode2Class2Renderer.get(new Integer (mode)); 99 class2Renderer.put(dcClass, r); 100 } 101 else 102 { 103 Map class2Renderer = new HashMap (); 104 class2Renderer.put(dcClass, r); 105 mode2Class2Renderer.put(new Integer (mode), class2Renderer); 106 } 107 renderClasses = null; 108 } 109 110 118 public Renderer getRenderer(int mode, Class dcClass) 119 { 120 if (mode2Class2Renderer.containsKey(new Integer (mode))) 121 { 122 Map class2Renderer = (Map ) mode2Class2Renderer.get(new Integer (mode)); 123 if (class2Renderer.containsKey(dcClass)) { 124 Renderer r = (Renderer) class2Renderer.get(dcClass); 125 return r; 126 } 127 else { 128 return getDefaultRenderer(dcClass); 129 } 130 } 131 else 132 return getDefaultRenderer(dcClass); 133 } 134 135 139 public Renderer getDefaultRenderer(Class dcClass) 140 { 141 if (mode2Class2Renderer.containsKey(new Integer (DEFAULT_MODE))) 142 { 143 Map class2Renderer = (Map ) mode2Class2Renderer.get(new Integer (DEFAULT_MODE)); 144 if (class2Renderer.containsKey(dcClass)) { 145 Renderer r = (Renderer) class2Renderer.get(dcClass); 146 return r; 147 } 148 else { 150 for (Iterator it = class2Renderer.keySet().iterator(); it.hasNext(); ) { 151 Class c = (Class ) it.next(); 152 if (c.isAssignableFrom(dcClass)) { 153 Renderer r = (Renderer) class2Renderer.get(c); 154 return r; 155 } 156 } 157 } 158 } 159 return null; 160 } 161 162 protected int currentRenderMode = DEFAULT_MODE; 163 164 168 public int getCurrentRenderMode() { 169 return currentRenderMode; 170 } 171 172 176 public void setCurrentRenderMode(int currentRenderMode) { 177 this.currentRenderMode = currentRenderMode; 178 fireRenderModeChanged(); 179 } 180 181 protected Set renderModeListeners = null; 182 protected Set getRenderModeListeners() 183 { 184 if (renderModeListeners == null) 185 renderModeListeners = new HashSet (); 186 187 return renderModeListeners; 188 } 189 190 195 public void addRenderModeListener(RenderModeListener rml) 196 { 197 getRenderModeListeners().add(rml); 198 } 199 200 205 public void removeRenderModeListener(RenderModeListener rml) 206 { 207 getRenderModeListeners().remove(rml); 208 } 209 210 protected void fireRenderModeChanged() 211 { 212 for (Iterator it = getRenderModeListeners().iterator(); it.hasNext(); ) { 213 RenderModeListener rml = (RenderModeListener) it.next(); 214 rml.renderModeChanges(getCurrentRenderMode()); 215 } 216 } 217 218 222 public Set getRenderModes() 223 { 224 return mode2Class2Renderer.keySet(); 225 } 226 227 protected Map renderMode2Descriptor; 228 protected Map getRenderMode2Descriptor() 229 { 230 if (renderMode2Descriptor == null) 231 renderMode2Descriptor = new HashMap (); 232 233 return renderMode2Descriptor; 234 } 235 236 244 public void addRenderer(RenderModeDescriptor desc, Class c, Renderer r) 245 { 246 if (desc == null) 247 throw new IllegalArgumentException ("Param desc must not be null"); 248 249 addRenderer(desc.getRenderMode(), c, r); 250 getRenderMode2Descriptor().put(new Integer (desc.getRenderMode()), desc); 251 } 252 253 259 public RenderModeDescriptor getRenderModeDescriptor(int renderMode) 260 { 261 return (RenderModeDescriptor) getRenderMode2Descriptor().get(new Integer (renderMode)); 262 } 263 264 public void logRegisteredRenderer(int renderMode) 265 { 266 Map class2Renderer = (Map ) mode2Class2Renderer.get(new Integer (renderMode)); 267 if (class2Renderer != null) { 268 for (Iterator it = class2Renderer.entrySet().iterator(); it.hasNext(); ) { 269 Map.Entry entry = (Map.Entry ) it.next(); 270 Class c = (Class ) entry.getKey(); 271 Renderer r = (Renderer) entry.getValue(); 272 LOGGER.info("Class "+c.getName()); 273 LOGGER.info("Renderer "+r); 274 LOGGER.info(""); 275 } 276 } 277 } 278 279 public Collection <Renderer> getRenderers(int renderMode) 280 { 281 Collection <Class > classes = getRenderClasses(); 282 Collection <Renderer> renderer = new ArrayList <Renderer>(classes.size()); 283 for (Iterator <Class > it = classes.iterator(); it.hasNext(); ) { 284 Class c = it.next(); 285 Renderer r = getRenderer(renderMode, c); 286 renderer.add(r); 287 } 288 return renderer; 289 } 290 291 protected Collection <Class > renderClasses = null; 292 public Collection <Class > getRenderClasses() 293 { 294 if (renderClasses == null) { 295 for (Iterator it = mode2Class2Renderer.entrySet().iterator(); it.hasNext(); ) { 296 Map.Entry <Integer , Map <Class , Renderer>> entry = (Map.Entry <Integer , Map <Class , Renderer>>) it.next(); 297 Map <Class , Renderer> class2Renderer = entry.getValue(); 298 renderClasses = class2Renderer.keySet(); 299 } 300 } 301 return renderClasses; 302 } 303 } 304 | Popular Tags |