1 package org.columba.core.gui.menu; 19 20 import java.io.IOException ; 21 import java.io.InputStream ; 22 import java.util.Iterator ; 23 import java.util.logging.Logger ; 24 25 import javax.swing.JRadioButtonMenuItem ; 26 27 import org.columba.api.gui.frame.IFrameMediator; 28 import org.columba.api.plugin.IExtension; 29 import org.columba.api.plugin.IExtensionHandler; 30 import org.columba.api.plugin.IExtensionHandlerKeys; 31 import org.columba.api.plugin.PluginException; 32 import org.columba.api.plugin.PluginHandlerNotFoundException; 33 import org.columba.core.gui.action.AbstractColumbaAction; 34 import org.columba.core.gui.action.AbstractSelectableAction; 35 import org.columba.core.gui.action.CCheckBoxMenuItem; 36 import org.columba.core.gui.base.CMenuItem; 37 import org.columba.core.logging.Logging; 38 import org.columba.core.plugin.PluginManager; 39 import org.jdom.Document; 40 import org.jdom.Element; 41 import org.jdom.JDOMException; 42 import org.jdom.input.SAXBuilder; 43 44 64 public class MenuXMLDecoder { 65 66 private static final String PLACEHOLDERID = "placeholderid"; 67 68 private static final Logger LOG = Logger 69 .getLogger("org.columba.core.gui.menu"); 70 71 private static final String PLACEHOLDER = "placeholder"; 72 73 private static final String SEPARATOR = "separator"; 74 75 private static final String RADIOBUTTONMENUITEM = "radiobuttonmenuitem"; 76 77 private static final String CHECKBOXMENUITEM = "checkboxmenuitem"; 78 79 private static final String IMENU = "imenu"; 80 81 private static final String ID = "id"; 82 83 private static final String MENUITEM = "menuitem"; 84 85 private static final String MENU = "menu"; 86 87 private static final String MENUBAR = "menubar"; 88 89 private IExtensionHandler pluginHandler; 90 91 private IFrameMediator mediator; 92 93 public MenuXMLDecoder(IFrameMediator mediator) { 94 super(); 95 96 this.mediator = mediator; 97 98 try { 99 pluginHandler = PluginManager.getInstance().getExtensionHandler( 100 IExtensionHandlerKeys.ORG_COLUMBA_CORE_ACTION); 101 } catch (PluginHandlerNotFoundException e) { 102 e.printStackTrace(); 103 } 104 } 105 106 private AbstractColumbaAction getAction(String id, IFrameMediator controller) { 107 if (id == null) 108 throw new IllegalArgumentException ("id == null"); 109 if (controller == null) 110 throw new IllegalArgumentException ("controller == null"); 111 112 IExtension extension = pluginHandler.getExtension(id); 113 114 AbstractColumbaAction a = null; 115 116 try { 117 if (extension != null) 118 a = (AbstractColumbaAction) extension 119 .instanciateExtension(new Object [] { controller }); 120 } catch (Exception e) { 121 LOG.severe(e.getMessage()); 122 if (Logging.DEBUG) 123 e.printStackTrace(); 124 125 } 126 127 return a; 128 129 } 130 131 private IMenu getIMenu(String id, IFrameMediator controller) 132 throws Exception { 133 IExtension extension = pluginHandler.getExtension(id); 134 135 IMenu menu = null; 136 try { 137 menu = (IMenu) extension 138 .instanciateExtension(new Object [] { controller }); 139 } catch (PluginException e) { 140 e.printStackTrace(); 141 } 142 143 return menu; 144 } 145 146 public ExtendablePopupMenu createPopupMenu(InputStream is) { 147 Document doc = retrieveDocument(is); 148 149 Element menuElement = doc.getRootElement(); 150 if (menuElement.getName().equals(MenuXMLDecoder.MENU) == false) { 151 LOG.severe("root element <menu> expected"); 152 return null; 153 } 154 155 ExtendablePopupMenu menu = new ExtendablePopupMenu("id"); 156 parsePopupMenu(menu, menuElement); 157 158 return menu; 159 } 160 161 public ExtendableMenuBar createMenuBar(InputStream is) { 162 163 Document doc = retrieveDocument(is); 164 165 Element menubarElement = doc.getRootElement(); 166 if (menubarElement.getName().equals(MenuXMLDecoder.MENUBAR) == false) { 167 LOG.severe("root element <menubar> expected"); 168 return null; 169 } 170 171 ExtendableMenuBar menuBar = new ExtendableMenuBar(); 172 Iterator it = menubarElement.getChildren().listIterator(); 173 while (it.hasNext()) { 174 Element menuElement = (Element) it.next(); 175 if (menuElement.getName().equals(MenuXMLDecoder.MENU)) { 176 177 String menuId = menuElement 178 .getAttributeValue(MenuXMLDecoder.ID); 179 180 String menuName = mediator.getString("menu", "mainframe", 181 menuId); 182 183 ExtendableMenu menu = new ExtendableMenu(menuId, menuName); 184 parseMenu(menu, menuElement); 185 menuBar.add(menu); 186 } 187 } 188 189 return menuBar; 190 } 191 192 196 private Document retrieveDocument(InputStream is) { 197 SAXBuilder builder = new SAXBuilder(); 198 builder.setIgnoringElementContentWhitespace(true); 199 Document doc = null; 200 try { 201 doc = builder.build(is); 202 } catch (JDOMException e) { 203 LOG.severe(e.getMessage()); 204 e.printStackTrace(); 205 } catch (IOException e) { 206 LOG.severe(e.getMessage()); 207 e.printStackTrace(); 208 } 209 return doc; 210 } 211 212 private void parseMenu(ExtendableMenu parentMenu, Element parentElement) { 213 Iterator it = parentElement.getChildren().listIterator(); 214 while (it.hasNext()) { 215 Element menuElement = (Element) it.next(); 216 217 if (menuElement.getName().equals(MenuXMLDecoder.MENU)) { 218 219 String menuId = menuElement 220 .getAttributeValue(MenuXMLDecoder.ID); 221 String menuName = mediator.getString("menu", "mainframe", 222 menuId); 223 224 ExtendableMenu menu = new ExtendableMenu(menuId, menuName); 225 parseMenu(menu, menuElement); 226 parentMenu.add(menu); 227 } else if (menuElement.getName().equals(MenuXMLDecoder.MENUITEM)) { 228 String id = menuElement.getAttributeValue(MenuXMLDecoder.ID); 229 AbstractColumbaAction action = getAction(id, mediator); 230 if (action == null) 231 continue; 232 233 CMenuItem menuItem = new CMenuItem(action); 234 menuItem.addMouseListener(mediator.getMouseTooltipHandler()); 235 parentMenu.add(menuItem); 236 } else if (menuElement.getName().equals( 237 MenuXMLDecoder.CHECKBOXMENUITEM)) { 238 String id = menuElement.getAttributeValue(MenuXMLDecoder.ID); 239 AbstractSelectableAction action = (AbstractSelectableAction) getAction( 240 id, mediator); 241 if (action == null) 242 continue; 243 244 CCheckBoxMenuItem menuItem = new CCheckBoxMenuItem(action); 245 menuItem.addMouseListener(mediator.getMouseTooltipHandler()); 246 parentMenu.add(menuItem); 247 } else if (menuElement.getName().equals( 248 MenuXMLDecoder.RADIOBUTTONMENUITEM)) { 249 String id = menuElement.getAttributeValue(MenuXMLDecoder.ID); 250 AbstractColumbaAction action = getAction(id, mediator); 251 if (action == null) 252 continue; 253 254 JRadioButtonMenuItem menuItem = new JRadioButtonMenuItem (action); 255 menuItem.addMouseListener(mediator.getMouseTooltipHandler()); 256 parentMenu.add(menuItem); 257 } else if (menuElement.getName().equals(MenuXMLDecoder.SEPARATOR)) { 258 parentMenu.addSeparator(); 259 } else if (menuElement.getName().equals(MenuXMLDecoder.IMENU)) { 260 String id = menuElement.getAttributeValue(MenuXMLDecoder.ID); 261 IMenu imenu; 262 try { 263 imenu = getIMenu(id, mediator); 264 if (imenu == null) 265 continue; 266 267 parentMenu.add(imenu); 268 } catch (Exception e) { 269 LOG.severe(e.getMessage()); 270 if (Logging.DEBUG) 271 e.printStackTrace(); 272 } 273 } else if (menuElement.getName().equals(MenuXMLDecoder.PLACEHOLDER)) { 274 String id = menuElement.getAttributeValue(MenuXMLDecoder.ID); 275 parentMenu.addPlaceholder(id); 276 } 277 } 278 279 } 280 281 private void parsePopupMenu(ExtendablePopupMenu parentMenu, 282 Element parentElement) { 283 Iterator it = parentElement.getChildren().listIterator(); 284 while (it.hasNext()) { 285 Element menuElement = (Element) it.next(); 286 if (menuElement.getName().equals(MenuXMLDecoder.MENU)) { 287 288 String menuId = menuElement 289 .getAttributeValue(MenuXMLDecoder.ID); 290 String menuName = mediator.getString("menu", "mainframe", 291 menuId); 292 293 ExtendableMenu menu = new ExtendableMenu(menuId, menuName); 294 parseMenu(menu, menuElement); 295 parentMenu.add(menu); 296 } else if (menuElement.getName().equals(MenuXMLDecoder.MENUITEM)) { 297 String id = menuElement.getAttributeValue(MenuXMLDecoder.ID); 298 AbstractColumbaAction action = getAction(id, mediator); 299 if (action == null) 300 continue; 301 302 CMenuItem menuItem = new CMenuItem(action); 303 menuItem.addMouseListener(mediator.getMouseTooltipHandler()); 304 parentMenu.add(menuItem); 305 } else if (menuElement.getName().equals( 306 MenuXMLDecoder.CHECKBOXMENUITEM)) { 307 String id = menuElement.getAttributeValue(MenuXMLDecoder.ID); 308 AbstractSelectableAction action = (AbstractSelectableAction) getAction( 309 id, mediator); 310 if (action == null) 311 continue; 312 CCheckBoxMenuItem menuItem = new CCheckBoxMenuItem(action); 313 menuItem.addMouseListener(mediator.getMouseTooltipHandler()); 314 parentMenu.add(menuItem); 315 } else if (menuElement.getName().equals( 316 MenuXMLDecoder.RADIOBUTTONMENUITEM)) { 317 String id = menuElement.getAttributeValue(MenuXMLDecoder.ID); 318 AbstractColumbaAction action = getAction(id, mediator); 319 if (action == null) 320 continue; 321 JRadioButtonMenuItem menuItem = new JRadioButtonMenuItem (action); 322 menuItem.addMouseListener(mediator.getMouseTooltipHandler()); 323 parentMenu.add(menuItem); 324 } else if (menuElement.getName().equals(MenuXMLDecoder.SEPARATOR)) { 325 parentMenu.addSeparator(); 326 } else if (menuElement.getName().equals(MenuXMLDecoder.IMENU)) { 327 String id = menuElement.getAttributeValue(MenuXMLDecoder.ID); 328 IMenu imenu; 329 try { 330 imenu = getIMenu(id, mediator); 331 if (imenu == null) 332 continue; 333 parentMenu.add(imenu); 334 } catch (Exception e) { 335 e.printStackTrace(); 336 } 337 } else if (menuElement.getName().equals(MenuXMLDecoder.PLACEHOLDER)) { 338 String id = menuElement.getAttributeValue(MenuXMLDecoder.ID); 339 parentMenu.addPlaceholder(id); 340 } 341 } 342 343 } 344 345 353 public void extendMenuBar(ExtendableMenuBar menubar, InputStream is) { 354 Document doc = retrieveDocument(is); 355 Element menubarElement = doc.getRootElement(); 356 if (menubarElement.getName().equals(MenuXMLDecoder.MENUBAR) == false) { 357 LOG.severe("root element <menubar> expected"); 358 return; 359 } 360 361 Iterator it = menubarElement.getChildren().listIterator(); 362 while (it.hasNext()) { 363 Element menuElement = (Element) it.next(); 364 if (menuElement.getName().equals(MenuXMLDecoder.MENU)) { 365 366 String menuId = menuElement 367 .getAttributeValue(MenuXMLDecoder.ID); 368 String placeholderId = menuElement 369 .getAttributeValue(MenuXMLDecoder.PLACEHOLDERID); 370 371 String menuName = mediator.getString("menu", "mainframe", 372 menuId); 373 374 if (menubar.exists(menuId)) { 375 ExtendableMenu menu = menubar.getMenu(menuId); 377 extendMenu(menubar, menu, menuElement, placeholderId); 378 } else { 379 ExtendableMenu menu = new ExtendableMenu(menuId, menuName); 381 menubar.insert(menu); 382 parseMenu(menu, menuElement); 383 } 384 } 385 } 386 387 } 388 389 public void extendMenu(ExtendableMenuBar menubar, 390 ExtendableMenu parentMenu, Element parentElement, 391 String placeholderId) { 392 if( placeholderId == null ) throw new IllegalArgumentException ("placeholderId == null"); 393 394 Iterator it = parentElement.getChildren().listIterator(); 395 while (it.hasNext()) { 396 Element menuElement = (Element) it.next(); 397 if (menuElement.getName().equals(MenuXMLDecoder.MENU)) { 398 399 String menuId = menuElement 400 .getAttributeValue(MenuXMLDecoder.ID); 401 402 String menuName = mediator.getString("menu", "mainframe", 403 menuId); 404 405 if (menubar.exists(menuId)) { 406 ExtendableMenu menu = menubar.getMenu(menuId); 408 extendMenu(menubar, menu, menuElement, placeholderId); 409 } else { 410 ExtendableMenu menu = new ExtendableMenu(menuId, menuName); 412 parseMenu(menu, menuElement); 413 parentMenu.insert(menu, placeholderId); 414 } 415 416 } else if (menuElement.getName().equals(MenuXMLDecoder.MENUITEM)) { 417 String id = menuElement.getAttributeValue(MenuXMLDecoder.ID); 418 AbstractColumbaAction action = getAction(id, mediator); 419 if (action == null) 420 continue; 421 422 CMenuItem menuItem = new CMenuItem(action); 423 menuItem.addMouseListener(mediator.getMouseTooltipHandler()); 424 parentMenu.insert(menuItem, placeholderId); 425 } else if (menuElement.getName().equals( 426 MenuXMLDecoder.CHECKBOXMENUITEM)) { 427 String id = menuElement.getAttributeValue(MenuXMLDecoder.ID); 428 AbstractSelectableAction action = (AbstractSelectableAction) getAction( 429 id, mediator); 430 if (action == null) 431 continue; 432 CCheckBoxMenuItem menuItem = new CCheckBoxMenuItem(action); 433 menuItem.addMouseListener(mediator.getMouseTooltipHandler()); 434 parentMenu.insert(menuItem, placeholderId); 435 } else if (menuElement.getName().equals( 436 MenuXMLDecoder.RADIOBUTTONMENUITEM)) { 437 String id = menuElement.getAttributeValue(MenuXMLDecoder.ID); 438 AbstractColumbaAction action = getAction(id, mediator); 439 if (action == null) 440 continue; 441 JRadioButtonMenuItem menuItem = new JRadioButtonMenuItem (action); 442 menuItem.addMouseListener(mediator.getMouseTooltipHandler()); 443 parentMenu.insert(menuItem, placeholderId); 444 } else if (menuElement.getName().equals(MenuXMLDecoder.SEPARATOR)) { 445 parentMenu.insertSeparator(placeholderId); 446 } else if (menuElement.getName().equals(MenuXMLDecoder.IMENU)) { 447 String id = menuElement.getAttributeValue(MenuXMLDecoder.ID); 448 IMenu imenu; 449 try { 450 imenu = getIMenu(id, mediator); 451 if (imenu == null) 452 continue; 453 parentMenu.insert(imenu, placeholderId); 454 } catch (Exception e) { 455 LOG.severe(e.getMessage()); 456 if (Logging.DEBUG) 457 e.printStackTrace(); 458 } 459 } else if (menuElement.getName().equals(MenuXMLDecoder.PLACEHOLDER)) { 460 String id = menuElement.getAttributeValue(MenuXMLDecoder.ID); 461 parentMenu.insertPlaceholder(id, placeholderId); 462 } 463 } 464 } 465 } 466 | Popular Tags |