KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > columba > core > gui > menu > MenuXMLDecoder


1 // The contents of this file are subject to the Mozilla Public License Version
2
// 1.1
3
//(the "License"); you may not use this file except in compliance with the
4
//License. You may obtain a copy of the License at http://www.mozilla.org/MPL/
5
//
6
//Software distributed under the License is distributed on an "AS IS" basis,
7
//WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
8
//for the specific language governing rights and
9
//limitations under the License.
10
//
11
//The Original Code is "The Columba Project"
12
//
13
//The Initial Developers of the Original Code are Frederik Dietz and Timo
14
// Stich.
15
//Portions created by Frederik Dietz and Timo Stich are Copyright (C) 2003.
16
//
17
//All Rights Reserved.
18
package org.columba.core.gui.menu;
19
20 import java.io.IOException JavaDoc;
21 import java.io.InputStream JavaDoc;
22 import java.util.Iterator JavaDoc;
23 import java.util.logging.Logger JavaDoc;
24
25 import javax.swing.JRadioButtonMenuItem JavaDoc;
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 /**
45  * Generate menu from xml-file.
46  * <p>
47  * Translation of resources is mostly done in {@link AbstractColumbaAction},
48  * for JMenuItem, JCheckboxMenuItem, JRadioButtonMenuItem. But, the menu names,
49  * visible on the menubar and the popup menu name are translated here. This is
50  * achieved by passing a {@link IFrameMediator} instance, and using its
51  * <code>getString()</code> method to pass along the translation to the
52  * appropriate resourceloader.
53  * <p>
54  * Example: <br/>
55  *
56  * <pre>
57  * ExtendablePopupMenu menu = new MenuXMLDecoder(frameController)
58  * .createPopupMenu(&quot;org/columba/core/contextmenu.xml&quot;);
59  * </pre>
60  *
61  * @author fdietz
62  *
63  */

64 public class MenuXMLDecoder {
65
66     private static final String JavaDoc PLACEHOLDERID = "placeholderid";
67
68     private static final Logger JavaDoc LOG = Logger
69             .getLogger("org.columba.core.gui.menu");
70
71     private static final String JavaDoc PLACEHOLDER = "placeholder";
72
73     private static final String JavaDoc SEPARATOR = "separator";
74
75     private static final String JavaDoc RADIOBUTTONMENUITEM = "radiobuttonmenuitem";
76
77     private static final String JavaDoc CHECKBOXMENUITEM = "checkboxmenuitem";
78
79     private static final String JavaDoc IMENU = "imenu";
80
81     private static final String JavaDoc ID = "id";
82
83     private static final String JavaDoc MENUITEM = "menuitem";
84
85     private static final String JavaDoc MENU = "menu";
86
87     private static final String JavaDoc 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 JavaDoc id, IFrameMediator controller) {
107         if (id == null)
108             throw new IllegalArgumentException JavaDoc("id == null");
109         if (controller == null)
110             throw new IllegalArgumentException JavaDoc("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 JavaDoc[] { controller });
120         } catch (Exception JavaDoc 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 JavaDoc id, IFrameMediator controller)
132             throws Exception JavaDoc {
133         IExtension extension = pluginHandler.getExtension(id);
134
135         IMenu menu = null;
136         try {
137             menu = (IMenu) extension
138                     .instanciateExtension(new Object JavaDoc[] { controller });
139         } catch (PluginException e) {
140             e.printStackTrace();
141         }
142
143         return menu;
144     }
145
146     public ExtendablePopupMenu createPopupMenu(InputStream JavaDoc 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 JavaDoc 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 JavaDoc it = menubarElement.getChildren().listIterator();
173         while (it.hasNext()) {
174             Element menuElement = (Element) it.next();
175             if (menuElement.getName().equals(MenuXMLDecoder.MENU)) {
176
177                 String JavaDoc menuId = menuElement
178                         .getAttributeValue(MenuXMLDecoder.ID);
179
180                 String JavaDoc 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     /**
193      * @param xmlResource
194      * @return
195      */

196     private Document retrieveDocument(InputStream JavaDoc 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 JavaDoc 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 JavaDoc 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 JavaDoc menuId = menuElement
220                         .getAttributeValue(MenuXMLDecoder.ID);
221                 String JavaDoc 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 JavaDoc 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 JavaDoc 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 JavaDoc id = menuElement.getAttributeValue(MenuXMLDecoder.ID);
250                 AbstractColumbaAction action = getAction(id, mediator);
251                 if (action == null)
252                     continue;
253
254                 JRadioButtonMenuItem JavaDoc menuItem = new JRadioButtonMenuItem JavaDoc(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 JavaDoc 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 JavaDoc e) {
269                     LOG.severe(e.getMessage());
270                     if (Logging.DEBUG)
271                         e.printStackTrace();
272                 }
273             } else if (menuElement.getName().equals(MenuXMLDecoder.PLACEHOLDER)) {
274                 String JavaDoc 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 JavaDoc it = parentElement.getChildren().listIterator();
284         while (it.hasNext()) {
285             Element menuElement = (Element) it.next();
286             if (menuElement.getName().equals(MenuXMLDecoder.MENU)) {
287
288                 String JavaDoc menuId = menuElement
289                         .getAttributeValue(MenuXMLDecoder.ID);
290                 String JavaDoc 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 JavaDoc 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 JavaDoc 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 JavaDoc id = menuElement.getAttributeValue(MenuXMLDecoder.ID);
318                 AbstractColumbaAction action = getAction(id, mediator);
319                 if (action == null)
320                     continue;
321                 JRadioButtonMenuItem JavaDoc menuItem = new JRadioButtonMenuItem JavaDoc(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 JavaDoc 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 JavaDoc e) {
335                     e.printStackTrace();
336                 }
337             } else if (menuElement.getName().equals(MenuXMLDecoder.PLACEHOLDER)) {
338                 String JavaDoc id = menuElement.getAttributeValue(MenuXMLDecoder.ID);
339                 parentMenu.addPlaceholder(id);
340             }
341         }
342
343     }
344
345     /**
346      * Extend menubar from xml resource.
347      *
348      * @param menubar
349      * menubar
350      * @param xmlResource
351      * xml resource to retrieve menu structure
352      */

353     public void extendMenuBar(ExtendableMenuBar menubar, InputStream JavaDoc 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 JavaDoc it = menubarElement.getChildren().listIterator();
362         while (it.hasNext()) {
363             Element menuElement = (Element) it.next();
364             if (menuElement.getName().equals(MenuXMLDecoder.MENU)) {
365
366                 String JavaDoc menuId = menuElement
367                         .getAttributeValue(MenuXMLDecoder.ID);
368                 String JavaDoc placeholderId = menuElement
369                         .getAttributeValue(MenuXMLDecoder.PLACEHOLDERID);
370
371                 String JavaDoc menuName = mediator.getString("menu", "mainframe",
372                         menuId);
373                 
374                 if (menubar.exists(menuId)) {
375                     // extend existing menu
376
ExtendableMenu menu = menubar.getMenu(menuId);
377                     extendMenu(menubar, menu, menuElement, placeholderId);
378                 } else {
379                     // create new menu
380
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 JavaDoc placeholderId) {
392         if( placeholderId == null ) throw new IllegalArgumentException JavaDoc("placeholderId == null");
393
394         Iterator JavaDoc it = parentElement.getChildren().listIterator();
395         while (it.hasNext()) {
396             Element menuElement = (Element) it.next();
397             if (menuElement.getName().equals(MenuXMLDecoder.MENU)) {
398
399                 String JavaDoc menuId = menuElement
400                         .getAttributeValue(MenuXMLDecoder.ID);
401
402                 String JavaDoc menuName = mediator.getString("menu", "mainframe",
403                         menuId);
404
405                 if (menubar.exists(menuId)) {
406                     // extend existing menu
407
ExtendableMenu menu = menubar.getMenu(menuId);
408                     extendMenu(menubar, menu, menuElement, placeholderId);
409                 } else {
410                     // create new menu
411
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 JavaDoc 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 JavaDoc 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 JavaDoc id = menuElement.getAttributeValue(MenuXMLDecoder.ID);
438                 AbstractColumbaAction action = getAction(id, mediator);
439                 if (action == null)
440                     continue;
441                 JRadioButtonMenuItem JavaDoc menuItem = new JRadioButtonMenuItem JavaDoc(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 JavaDoc 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 JavaDoc e) {
455                     LOG.severe(e.getMessage());
456                     if (Logging.DEBUG)
457                         e.printStackTrace();
458                 }
459             } else if (menuElement.getName().equals(MenuXMLDecoder.PLACEHOLDER)) {
460                 String JavaDoc id = menuElement.getAttributeValue(MenuXMLDecoder.ID);
461                 parentMenu.insertPlaceholder(id, placeholderId);
462             }
463         }
464     }
465 }
466
Popular Tags