/******************************************************************************* * Copyright (c) 2003-2005, 2013 Till Zoppke. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/gpl.html * * Contributors: * Till Zoppke - initial API and implementation ******************************************************************************/ /* * Created on 25.03.2004 */ package eniac.menu; import java.io.IOException; import java.io.InputStream; import java.util.Hashtable; import javax.swing.AbstractButton; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JToolBar; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import eniac.Manager; import eniac.io.IOUtil; import eniac.io.XMLUtil; import eniac.menu.action.EAction; import eniac.util.EProperties; /** * @author zoppke */ public class MenuHandler extends DefaultHandler { // constant tag and attribute names for parsing the menu xml file private enum Tag { MENU, GROUP, ACTION, NAME, MENUBAR, TOOLBAR, SEPARATOR, KEY, SID; } // Enum representing the parsing state (FSM) private enum ParsingState { DEFAULT, TOOLBAR, MENUBAR; } // =============================== fields //================================ private Hashtable<String, EAction> _actionDefaults = null; private JMenu _currentMenu = null; private JToolBar _toolBar = null; private JMenuBar _menuBar = null; private ParsingState _parsingState = ParsingState.DEFAULT; private Hashtable<String, EAction> _actions = new Hashtable<>(); // ============================ lifecycle //================================ public MenuHandler(Hashtable<String, EAction> actionDefaults) { _actionDefaults = actionDefaults; } public void init() { // parse menu and toolbar from xml String path = EProperties.getInstance().getProperty("MENU_FILE"); InputStream in = Manager.class.getClassLoader().getResourceAsStream(path); try { IOUtil.parse(in, this); } catch (IOException e) { e.printStackTrace(); } } // ========================== defaultHandler methods //===================== public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException { // System.out.println(qName); try { Tag tag = Enum.valueOf(Tag.class, qName.toUpperCase()); switch (tag) { case TOOLBAR : // create jtoolbar and adjust parsing state _toolBar = new JToolBar(); _parsingState = ParsingState.TOOLBAR; break; case ACTION : if (_parsingState == ParsingState.MENUBAR) { // add action to jmenu String key = XMLUtil.parseString(attrs, Tag.KEY); EAction action = getAction(key); _currentMenu.add((JMenuItem) action.getValue(EAction.ITEM)); } else if (_parsingState == ParsingState.TOOLBAR) { // add action to toolbar String key = XMLUtil.parseString(attrs, Tag.KEY); EAction action = getAction(key); _toolBar.add((AbstractButton) action.getValue(EAction.BUTTON)); } break; case SEPARATOR : if (_parsingState == ParsingState.TOOLBAR) { // add separator to toolbar _toolBar.addSeparator(); } else if (_parsingState == ParsingState.MENUBAR) { // add separator to menu _currentMenu.addSeparator(); } break; case MENUBAR : // create jmenubar and adjust parsing state _menuBar = new JMenuBar(); _parsingState = ParsingState.MENUBAR; break; case GROUP : // create jmenu and add it to menubar String sid = XMLUtil.parseString(attrs, Tag.SID); _currentMenu = new EMenu(sid); _menuBar.add(_currentMenu); break; default : break; } } catch (Exception e) { // important: catch any exception and print its tree. // otherwise you won't get the error's source. e.printStackTrace(); throw new SAXException(e); } } // =========================== other methods //============================= public JToolBar getToolBar() { return _toolBar; } public JMenuBar getMenuBar() { return _menuBar; } private EAction getAction(String key) { EAction action = _actions.get(key); // if action is not present in our table, get it from the action manager if (action == null) { action = ActionManager.getInstance().getAction(key); // add action defaults for (String s : _actionDefaults.keySet()) { action.putValue(s, _actionDefaults.get(s)); } // init action and store it at our table action.init(); _actions.put(key, action); } // return action return action; } }