Mercurial > hg > jslab
diff src/samer/core_/util/swing/MenuBuilder.java @ 0:bf79fb79ee13
Initial Mercurial check in.
author | samer |
---|---|
date | Tue, 17 Jan 2012 17:50:20 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/samer/core_/util/swing/MenuBuilder.java Tue Jan 17 17:50:20 2012 +0000 @@ -0,0 +1,95 @@ +/* + * MenuBuilder.java + * + * Copyright (c) 2000, Samer Abdallah, King's College London. + * All rights reserved. + * + * This software is provided AS iS and WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + */ + +package samer.core.util.swing; +import samer.core.util.*; +import samer.core.*; +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; + +public class MenuBuilder implements Agent.Registry +{ + JPopupMenu menu; + AgentAdapter ad; + + public MenuBuilder(JPopupMenu m, AgentAdapter a) { menu=m; ad=a; } + + public Agent.Registry add(String l) + { + // could get icon here + JMenuItem mi = new JMenuItem(l); + mi.addActionListener(ad); + menu.add(mi); + return this; + } + public Agent.Registry add(String l, boolean state) + { + // could get icon here + JCheckBoxMenuItem mi = new JCheckBoxMenuItem(l, state); + mi.setName(l); + mi.addItemListener(ad); + menu.add(mi); + return this; + } + public void group() { menu.addSeparator(); } + + public void setTarget(Agent a) { ad=new AgentAdapter(a); group(); } + + public static PopupHandler addPopup(JPopupMenu popup, Component c) { + PopupHandler h=new PopupHandler(popup); + insertML(h,c); return h; + } + + private static void insertML(MouseListener l, Component c) { + // what if this listener isn't there? + c.removeMouseListener(MouseRetarget.listener); + c.addMouseListener(l); + c.addMouseListener(MouseRetarget.listener); + } + + /** Add commands for given Agent to given menu, to be show in given component. + If menu is null, then a new menu is created and associated with the component + using a popup menu mouse handler. The popup will be shown when the user + right clicks in the component. + */ + + public static JPopupMenu showCommands( Agent agent, Component c, JPopupMenu menu) + { + if (menu==null) { + menu=new JPopupMenu(c.getName()); + addPopup(menu, c); + } else { + menu.addSeparator(); + } + + agent.getCommands( new MenuBuilder(menu,new AgentAdapter(agent))); + return menu; + } + + /** Add commands for given Agent to the given DynamicPopupHandler. This maintains + a list of agents, so when the handler is triggered by the user right-clicking in + the given component, a popup menu is built dynamically from the commands reported + by the Agents. + */ + + public static DynamicPopupHandler showCommands( Agent agent, Component c, DynamicPopupHandler h) + { + if (h==null) { + h=new DynamicPopupHandler(c.getName()); + insertML(h,c); + } + h.addAgent(agent); + return h; + } +}; + +