/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ /* * MultiButton.java * * Created on 18. Juni 2004, 15:05 */ package Sirius.navigator.ui.widget; import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.*; import javax.swing.event.*; /** * DOCUMENT ME! * * @author pascal * @version $Revision$, $Date$ */ public class MultiButton extends JButton { //~ Instance fields -------------------------------------------------------- private final LinkedHashMap actionMap; private final ActionMenu actionMenu; private String activeAction = null; //~ Constructors ----------------------------------------------------------- /** * Creates a new instance of MultiButton. */ public MultiButton() { this.actionMap = new LinkedHashMap(); this.actionMenu = new ActionMenu(); this.addMouseListener(new PopupListener()); } /** * Creates a new MultiButton object. * * @param actions DOCUMENT ME! */ public MultiButton(final Collection actions) { this.actionMap = new LinkedHashMap(); this.actionMenu = new ActionMenu(); this.addMouseListener(new PopupListener()); this.setActions(actions); } //~ Methods ---------------------------------------------------------------- /** * DOCUMENT ME! * * @param actions DOCUMENT ME! */ private void setActions(final Collection actions) { final Iterator iterator = actions.iterator(); while (iterator.hasNext()) { final Action action = (Action)iterator.next(); this.actionMap.put(action.getValue(Action.ACTION_COMMAND_KEY), action); if (this.getAction() == null) { this.setActiveAction(action.getValue(Action.ACTION_COMMAND_KEY).toString()); } } } /** * DOCUMENT ME! * * @param activeAction DOCUMENT ME! */ private void setActiveAction(final String activeAction) { if (!activeAction.equals(this.activeAction) && this.actionMap.containsKey(activeAction)) { this.activeAction = activeAction; this.setAction((Action)this.actionMap.get(activeAction)); } } //~ Inner Classes ---------------------------------------------------------- /** * public static void main(String args[]) { * Sirius.navigator.resource.PropertyManager.getManager().setLookAndFeel("Plastic 3D"); * Sirius.navigator.ui.LAFManager.getManager().changeLookAndFeel(Sirius.navigator.resource.PropertyManager.getManager().getLookAndFeel()); * JToolBar jt = new JToolBar(); MultiButton mb = new MultiButton(); mb.setMargin(new Insets(5,5,5,5)); jt.add(mb); * ArrayList actions = new ArrayList(3); Action action = new AbstractAction() { public void * actionPerformed(ActionEvent e) { System.out.println(this.getValue(Action.ACTION_COMMAND_KEY)); } }; * action.putValue(Action.ACTION_COMMAND_KEY, "a"); action.putValue(Action.SMALL_ICON, * Sirius.navigator.resource.ResourceManager.getManager().getIcon("save24.gif")); actions.add(action); action = new * AbstractAction() { public void actionPerformed(ActionEvent e) { * System.out.println(this.getValue(Action.ACTION_COMMAND_KEY)); } }; action.putValue(Action.ACTION_COMMAND_KEY, * "b"); action.putValue(Action.SMALL_ICON, * Sirius.navigator.resource.ResourceManager.getManager().getIcon("information24.gif")); actions.add(action); action * = new AbstractAction() { public void actionPerformed(ActionEvent e) { * System.out.println(this.getValue(Action.ACTION_COMMAND_KEY)); } }; action.putValue(Action.ACTION_COMMAND_KEY, * "c"); action.putValue(Action.SMALL_ICON, * Sirius.navigator.resource.ResourceManager.getManager().getIcon("back24.gif")); actions.add(action); * mb.setActions(actions); JFrame jf = new JFrame("MultiButtonTest"); jf.getContentPane().add(jt, * BorderLayout.NORTH); jf.getContentPane().add(new JButton(":o)"), BorderLayout.CENTER); * jf.setDefaultCloseOperation(jf.EXIT_ON_CLOSE); jf.setSize(640,480); jf.setLocationRelativeTo(null); * jf.setVisible(true); jf.setDefaultCloseOperation(jf.EXIT_ON_CLOSE); }. * * @version $Revision$, $Date$ */ private class PopupListener extends MouseAdapter { //~ Methods ------------------------------------------------------------ @Override public void mousePressed(final MouseEvent e) { if (e.isPopupTrigger()) { actionMenu.show(MultiButton.this, -1, MultiButton.this.getHeight()); } } @Override public void mouseReleased(final MouseEvent e) { if (e.isPopupTrigger() && !actionMenu.isShowing()) { actionMenu.show(MultiButton.this, -1, MultiButton.this.getHeight()); } } } /** * DOCUMENT ME! * * @version $Revision$, $Date$ */ private class ActionMenu extends JPopupMenu implements PopupMenuListener, ActionListener { //~ Constructors ------------------------------------------------------- /** * Creates a new ActionMenu object. */ private ActionMenu() { this.addPopupMenuListener(this); } //~ Methods ------------------------------------------------------------ @Override public void popupMenuCanceled(final PopupMenuEvent e) { } @Override public void popupMenuWillBecomeInvisible(final PopupMenuEvent e) { this.removeAll(); } @Override public void popupMenuWillBecomeVisible(final PopupMenuEvent e) { final Iterator iterator = actionMap.values().iterator(); while (iterator.hasNext()) { final Action action = (Action)iterator.next(); if (!action.getValue(Action.ACTION_COMMAND_KEY).equals(activeAction)) { final JMenuItem item = this.add(action); item.addActionListener(this); item.setMargin(MultiButton.this.getMargin()); // item.setBorder(MultiButton.this.getBorder()); item.setPreferredSize(MultiButton.this.getPreferredSize()); } } this.pack(); // this.setPreferredSize(new Dimension(MultiButton.this.getWidth(), MultiButton.this.getHeight() * // (MultiButton.this.actionMap.size() - 1))); } @Override public void actionPerformed(final ActionEvent e) { MultiButton.this.setActiveAction(e.getActionCommand()); } } }