// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.gui; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Set; import javax.swing.Action; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import javax.swing.MenuElement; import javax.swing.event.PopupMenuListener; import org.openstreetmap.josm.actions.OsmPrimitiveAction; import org.openstreetmap.josm.data.osm.OsmPrimitive; /** * Handler to ease management of actions in different popup menus. * @since 5821 */ public class PopupMenuHandler { // Set of enabled osm primitives actions private final Set<OsmPrimitiveAction> primitiveActions = new HashSet<>(); // Managed menu private final JPopupMenu menu; /** * Constructs a new {@code RelationActionMenuHandler} for the specified popup menu. * * @param menu The menu to be managed */ public PopupMenuHandler(JPopupMenu menu) { this.menu = menu; } /** * Appends a new separator at the end of the menu. * @see JPopupMenu#addSeparator */ public void addSeparator() { menu.addSeparator(); } /** * Appends a new menu item to the end of the menu which dispatches the specified <code>Action</code> object. * * @param a the <code>Action</code> to add to the menu * @return the new menu item * @see JPopupMenu#add(Action) */ public JMenuItem addAction(Action a) { if (a != null) { if (a instanceof OsmPrimitiveAction) { primitiveActions.add((OsmPrimitiveAction) a); } return menu.add(a); } return null; } /** * Removes the menu item which dispatches the specified <code>Action</code> object. * * @param a the <code>Action</code> to remove from the menu * @see JPopupMenu#remove(int) */ public void removeAction(Action a) { if (a != null) { if (a instanceof OsmPrimitiveAction) { primitiveActions.remove(a); } MenuElement[] elements = menu.getSubElements(); for (int i = 0; i < elements.length; i++) { if (elements[i] instanceof JMenuItem && ((JMenuItem) elements[i]).getAction() == a) { menu.remove(i); return; } } } } /** * Adds a <code>PopupMenu</code> listener. * * @param l the <code>PopupMenuListener</code> to add * @see JPopupMenu#addPopupMenuListener */ public void addListener(PopupMenuListener l) { menu.addPopupMenuListener(l); } /** * Removes a <code>PopupMenu</code> listener. * * @param l the <code>PopupMenuListener</code> to remove * @see JPopupMenu#removePopupMenuListener */ public void removeListener(PopupMenuListener l) { menu.removePopupMenuListener(l); } /** * Returns all enabled primitive actions. * @return All primitive actions that have been added. * @see #addAction(Action) */ public Collection<OsmPrimitiveAction> getPrimitiveActions() { return Collections.unmodifiableCollection(primitiveActions); } /** * Specifies the working set of primitives for all primitive actions. * @param primitives The new working set of primitives. Can be null or empty * @see OsmPrimitiveAction#setPrimitives */ public void setPrimitives(Collection<? extends OsmPrimitive> primitives) { for (OsmPrimitiveAction action : primitiveActions) { action.setPrimitives(primitives); } } }