package ie.dcu.apps.ist.actions; import ie.dcu.apps.ist.widgets.ImageMenuManager; import java.net.URL; import java.util.*; import org.eclipse.jface.action.*; import org.eclipse.swt.events.*; import org.eclipse.swt.widgets.*; /** * Menu Manager that notifies instances of IHoverAction when they are armed and * disarmed. * * @author Kevin McGuinness */ public class HoverMenuManager extends ImageMenuManager { /** * Stores items that have hover listeners added to them. */ private final Set hoverItems = new HashSet(); /** * Create hover menu manager. */ public HoverMenuManager() { init(); } /** * Create hover menu manager with id and text. * * @param text * the text for the menu, or null if none. * @param imageURL * the menu image url, or null. */ public HoverMenuManager(String text, URL imageURL) { super(text, imageURL); init(); } /** * Create hover menu manager text. * * @param text * the text for the menu, or null if none. */ public HoverMenuManager(String text) { super(text); init(); } private void init() { addMenuListener(menuListener); } private void addHoverListeners() { Menu menu = getMenu(); for (MenuItem item : menu.getItems()) { addHoverListener(item); } } private void addHoverListener(MenuItem item) { IHoverAction action = getHoverAction(item); if (action != null) { addHoverListener(item, action); } } private void addHoverListener(MenuItem item, IHoverAction action) { if (!hoverItems.contains(item)) { item.addArmListener(new HoverListener(action)); hoverItems.add(item); } } private void disarmAll() { Menu menu = getMenu(); for (MenuItem item : menu.getItems()) { disarm(item); } } private void disarm(MenuItem item) { IHoverAction action = getHoverAction(item); if (action != null) { disarm(action); } } private void disarm(IHoverAction action) { if (action.isArmed()) { action.disarm(); } } private IHoverAction getHoverAction(MenuItem item) { Object data = item.getData(); if (data instanceof ActionContributionItem) { IAction action = ((ActionContributionItem) data).getAction(); if (action instanceof IHoverAction) { return (IHoverAction) action; } } return null; } private IMenuListener menuListener = new IMenuListener2() { public void menuAboutToShow(IMenuManager manager) { addHoverListeners(); } public void menuAboutToHide(IMenuManager manager) { disarmAll(); } }; private final class HoverListener implements ArmListener { private final IHoverAction action; public HoverListener(IHoverAction action) { this.action = action; } public void widgetArmed(ArmEvent e) { disarmAll(); action.arm(); } } }