001    /******************************************************************************
002     * Copyright (C) MActor Developers. All rights reserved.                        *
003     * ---------------------------------------------------------------------------*
004     * This file is part of MActor.                                               *
005     *                                                                            *
006     * MActor is free software; you can redistribute it and/or modify             *
007     * it under the terms of the GNU General Public License as published by       *
008     * the Free Software Foundation; either version 2 of the License, or          *
009     * (at your option) any later version.                                        *
010     *                                                                            *
011     * MActor is distributed in the hope that it will be useful,                  *
012     * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
013     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *
014     * GNU General Public License for more details.                               *
015     *                                                                            *
016     * You should have received a copy of the GNU General Public License          *
017     * along with MActor; if not, write to the Free Software                      *
018     * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA *
019     ******************************************************************************/
020    package org.mactor.ui.gui;
021    
022    import java.net.URL;
023    import java.util.HashMap;
024    import java.util.Iterator;
025    import java.util.Map;
026    
027    import javax.swing.JMenu;
028    import javax.swing.JMenuItem;
029    import javax.swing.JPopupMenu;
030    import javax.swing.JSeparator;
031    
032    import org.dom4j.Document;
033    import org.dom4j.Element;
034    import org.dom4j.io.SAXReader;
035    import org.mactor.framework.MactorException;
036    
037    public class MenuBuilder {
038            Map<String, Element> menuElements = new HashMap<String, Element>();
039            ActionsManager actionManager;
040            public MenuBuilder(ActionsManager actionManager) throws MactorException {
041                    this.actionManager = actionManager;
042                    try {
043                            loadMenuDefs("project_menus.xml");
044                    } catch (Exception e) {
045                            throw new MactorException(e);
046                    }
047                    try {
048                            loadMenuDefs("project_menus_ex.xml");
049                            System.out.println("project_menus_ex.xml was loaded");
050                    } catch (Exception e) {
051                            System.out.println("project_menus_ex.xml was not loaded. Reason:" + e.getMessage());
052                    }
053            }
054            private void loadMenuDefs(String resource) throws Exception {
055                    URL u = Thread.currentThread().getContextClassLoader().getResource(resource);
056                    if (u == null)
057                            throw new RuntimeException("Resource '" + resource + "' was not found");
058                    Document doc = null;
059                    doc = new SAXReader().read(Thread.currentThread().getContextClassLoader().getResourceAsStream(resource));
060                    Iterator it = doc.getRootElement().elementIterator("menu");
061                    while (it.hasNext()) {
062                            Element e = (Element) it.next();
063                            menuElements.put(e.attributeValue("name"), e);
064                    }
065            }
066            private Element getMenuElement(String name) throws MactorException {
067                    Element e = menuElements.get(name);
068                    if (e == null)
069                            throw new MactorException("The menu '" + name + "' does not exist");
070                    return e;
071            }
072            public JPopupMenu buildPopuMenu(String name) throws MactorException {
073                    return createPopupMenu(menuElements.get(name));
074            }
075            public JMenu buildMenu(String name) throws MactorException {
076                    return createMenu(menuElements.get(name));
077            }
078            private JPopupMenu createPopupMenu(Element e) throws MactorException {
079                    JPopupMenu m = new JPopupMenu(e.attributeValue("name"));
080                    Iterator it = e.elementIterator();
081                    while (it.hasNext()) {
082                            Element child = (Element) it.next();
083                            if ("menu".equals(child.getName())) {
084                                    m.add(createMenu(getMenuElement(child.attributeValue("name"))));
085                            } else if ("action".equals(child.getName())) {
086                                    JMenuItem item = new JMenuItem(actionManager.getAction(child.attributeValue("name")));
087                                    m.add(item);
088                            } else if ("seperator".equals(child.getName())) {
089                                    m.add(new JSeparator());
090                            } else {
091                                    throw new MactorException("Encountered unexpected node '" + child.getName() + "' while building menu");
092                            }
093                    }
094                    return m;
095            }
096            private JMenu createMenu(Element e) throws MactorException {
097                    JMenu m = new JMenu(e.attributeValue("name"));
098                    Iterator it = e.elementIterator();
099                    while (it.hasNext()) {
100                            Element child = (Element) it.next();
101                            if ("menu".equals(child.getName())) {
102                                    m.add(createMenu(getMenuElement(child.attributeValue("name"))));
103                            } else if ("action".equals(child.getName())) {
104                                    JMenuItem item = new JMenuItem(actionManager.getAction(child.attributeValue("name")));
105                                    m.add(item);
106                            } else if ("seperator".equals(child.getName())) {
107                                    m.add(new JSeparator());
108                            } else {
109                                    throw new MactorException("Encountered unexpected node '" + child.getName() + "' while building menu");
110                            }
111                    }
112                    return m;
113            }
114    }