1 19 package org.columba.core.gui.frame; 20 21 import java.util.Enumeration ; 22 import java.util.HashMap ; 23 import java.util.Iterator ; 24 import java.util.LinkedList ; 25 import java.util.List ; 26 import java.util.Map ; 27 import java.util.logging.Logger ; 28 29 import javax.swing.JFrame ; 30 31 import org.columba.api.gui.frame.IContainer; 32 import org.columba.api.gui.frame.IFrameManager; 33 import org.columba.api.gui.frame.IFrameMediator; 34 import org.columba.api.plugin.IExtension; 35 import org.columba.api.plugin.IExtensionHandler; 36 import org.columba.api.plugin.IExtensionHandlerKeys; 37 import org.columba.api.plugin.PluginException; 38 import org.columba.api.plugin.PluginHandlerNotFoundException; 39 import org.columba.api.plugin.PluginLoadingFailedException; 40 import org.columba.core.config.Config; 41 import org.columba.core.config.ViewItem; 42 import org.columba.core.logging.Logging; 43 import org.columba.core.plugin.PluginManager; 44 import org.columba.core.shutdown.ShutdownManager; 45 import org.columba.core.xml.XmlElement; 46 47 57 public class FrameManager implements IFrameManager { 58 59 private static final Logger LOG = Logger 60 .getLogger("org.columba.core.gui.frame"); 61 62 63 protected List activeFrameCtrls = new LinkedList (); 64 65 66 protected XmlElement viewList = Config.getInstance().get("views") 67 .getElement("/views/viewlist"); 68 69 70 protected XmlElement defaultViews = Config.getInstance().get("views") 71 .getElement("/views/defaultviews"); 72 73 protected IExtensionHandler handler; 74 75 private static FrameManager instance = new FrameManager(); 76 77 80 protected Map frameMediatorCache; 81 82 86 public FrameManager() { 87 88 frameMediatorCache = new HashMap (); 89 90 try { 92 handler = PluginManager.getInstance() 93 .getExtensionHandler(IExtensionHandlerKeys.ORG_COLUMBA_CORE_FRAME); 94 } catch (PluginHandlerNotFoundException ex) { 95 throw new RuntimeException (ex); 96 } 97 98 ShutdownManager.getInstance().register(new Runnable () { 101 public void run() { 102 storeViews(); 103 } 104 }); 105 } 106 107 public static FrameManager getInstance() { 108 return instance; 109 } 110 111 112 118 public boolean isManaged(String frameMediatorId) { 119 Enumeration _enum = handler.getExtensionEnumeration(); 120 while (_enum.hasMoreElements()) { 121 IExtension extension = (IExtension) _enum.nextElement(); 122 String managed = extension.getMetadata().getAttribute("managed"); 123 if (managed == null) 124 managed = "false"; 125 126 if ( (extension.getMetadata().getId().equals(frameMediatorId)) && managed.equals("true") ) return true; 127 } 128 129 return false; 130 } 131 132 139 public void refresh() { 140 storeViews(); 141 openStoredViews(); 142 } 143 144 148 public void storeViews() { 149 List newViewList = new LinkedList (); 152 153 ViewItem v; 154 155 while (activeFrameCtrls.size() > 0) { 158 DefaultContainer c = (DefaultContainer) activeFrameCtrls.get(0); 159 v = c.getViewItem(); 160 161 newViewList.add(v.getRoot()); 163 164 c.close(); 166 } 167 168 if (newViewList.size() > 0) { 170 viewList.removeAllElements(); 174 175 for (Iterator it = newViewList.iterator(); it.hasNext();) { 176 viewList.addElement((XmlElement) it.next()); 177 } 178 } 179 } 180 181 184 public void openStoredViews() { 185 for (int i = 0; i < viewList.count(); i++) { 187 XmlElement view = viewList.getElement(i); 189 try { 190 createFrameMediator(new ViewItem(view)); 191 } catch (PluginLoadingFailedException plfe) { 192 continue; 194 } 195 196 } 197 198 } 199 200 203 public IContainer[] getOpenFrames() { 204 return (IContainer[]) activeFrameCtrls.toArray(new IContainer[0]); 205 } 206 207 212 public IContainer getActiveFrameMediator() { 213 Iterator it = activeFrameCtrls.iterator(); 214 while (it.hasNext()) { 215 IContainer m = (IContainer) it.next(); 216 JFrame frame = m.getFrame(); 217 if (frame.isActive()) 218 return m; 219 } 220 221 return null; 222 } 223 224 229 public JFrame getActiveFrame() { 230 IContainer m = getActiveFrameMediator(); 231 if (m != null) 232 return m.getFrame(); 233 234 return new JFrame (); 236 } 237 238 244 private IFrameMediator instanciateFrameMediator(ViewItem viewItem) 245 throws PluginLoadingFailedException { 246 String id = viewItem.get("id"); 247 248 IFrameMediator frame = null; 249 if (frameMediatorCache.containsKey(id)) { 250 LOG.fine("use cached instance " + id); 251 252 frame = (IFrameMediator) frameMediatorCache.remove(id); 255 } else { 256 LOG.fine("create new instance " + id); 257 Object [] args = { viewItem }; 258 261 try { 262 IExtension extension = handler.getExtension(id); 263 frame = (IFrameMediator) extension.instanciateExtension(args); 264 } catch (PluginException e) { 265 LOG.severe(e.getMessage()); 266 if (Logging.DEBUG) 267 e.printStackTrace(); 269 } 270 } 271 return frame; 272 } 273 274 protected IFrameMediator createFrameMediator(ViewItem viewItem) 275 throws PluginLoadingFailedException { 276 277 278 279 IFrameMediator frame = instanciateFrameMediator(viewItem); 280 281 IContainer c = new DefaultContainer((DefaultFrameController) frame); 282 283 activeFrameCtrls.add(c); 284 285 return frame; 286 } 287 288 293 public IFrameMediator openView(String id) 294 throws PluginLoadingFailedException { 295 ViewItem view = loadDefaultView(id); 297 298 if (view == null) 299 view = ViewItem.createDefault(id); 300 301 IFrameMediator controller = createFrameMediator(view); 304 305 return controller; 306 } 307 308 314 public IFrameMediator switchView(IContainer c, String id) 315 throws PluginLoadingFailedException { 316 ViewItem view = loadDefaultView(id); 318 319 if (view == null) 320 view = ViewItem.createDefault(id); 321 322 if ( c.getFrameMediator().getId().equals(id)) return c.getFrameMediator(); 324 325 327 frameMediatorCache.put(((DefaultContainer) c).getViewItem().get("id"), 329 c.getFrameMediator()); 330 331 IFrameMediator frame = instanciateFrameMediator(view); 332 333 c.switchFrameMediator(frame); 334 335 return frame; 336 } 337 338 345 protected ViewItem loadDefaultView(String id) { 346 if (defaultViews == null) { 348 XmlElement gui = Config.getInstance().get("views").getElement( 349 "/views"); 350 defaultViews = new XmlElement("defaultviews"); 351 gui.addElement(defaultViews); 352 } 353 354 ViewItem view = null; 356 357 for (int i = 0; i < defaultViews.count(); i++) { 358 XmlElement child = defaultViews.getElement(i); 359 String childId = child.getAttribute("id"); 360 361 if ((childId != null) && childId.equals(id)) { 362 view = new ViewItem(child); 363 364 break; 365 } 366 } 367 368 return view; 369 } 370 371 381 protected void saveDefaultView(ViewItem view) { 382 if (view == null) { 383 return; } 385 386 String id = view.get("id"); 387 388 ViewItem oldView = loadDefaultView(id); 390 391 if (oldView != null) { 392 defaultViews.removeElement(oldView.getRoot()); 393 } 394 395 defaultViews.addElement(view.getRoot()); 397 } 398 399 407 public void close(IContainer c) { 408 409 if (activeFrameCtrls.contains(c)) { 411 ViewItem v = ((DefaultContainer) c).getViewItem(); 412 413 frameMediatorCache.put(v.get("id"), c.getFrameMediator()); 415 416 saveDefaultView(v); 417 activeFrameCtrls.remove(c); 418 419 if (activeFrameCtrls.size() == 0) { 420 viewList.removeAllElements(); 422 viewList.addElement(v.getRoot()); 423 } 424 } 425 426 if (activeFrameCtrls.size() == 0) { 427 if (getOpenFrames().length == 0) { 429 430 ShutdownManager.getInstance().shutdown(0); 431 } 432 } 433 } 434 435 public ViewItem createCustomViewItem(String id) { 436 XmlElement parent = Config.getInstance().get("views").getElement( 437 "views"); 438 XmlElement custom = parent.getElement("custom"); 439 if (custom == null) 440 custom = parent.addSubElement("custom"); 441 442 for (int i = 0; i < custom.count(); i++) { 443 XmlElement child = custom.getElement(i); 444 String name = child.getAttribute("id"); 445 if (name.equals(id)) 446 return new ViewItem(child); 447 } 448 449 ViewItem viewItem = ViewItem.createDefault(id); 450 custom.addElement(viewItem.getRoot()); 451 452 return viewItem; 453 } 454 } | Popular Tags |