001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.util;
003
004import javax.swing.Action;
005import javax.swing.Icon;
006import javax.swing.JMenuItem;
007import javax.swing.MenuElement;
008import javax.swing.MenuSelectionManager;
009import javax.swing.event.ChangeEvent;
010import javax.swing.event.ChangeListener;
011
012/**
013 * An extension of JMenuItem that doesn't close the menu when selected.
014 *
015 * @author Darryl https://tips4java.wordpress.com/2010/09/12/keeping-menus-open/
016 */
017public class StayOpenMenuItem extends JMenuItem {
018
019  private static MenuElement[] path;
020
021  {
022    getModel().addChangeListener(new ChangeListener() {
023
024      @Override
025      public void stateChanged(ChangeEvent e) {
026        if (getModel().isArmed() && isShowing()) {
027          path = MenuSelectionManager.defaultManager().getSelectedPath();
028        }
029      }
030    });
031  }
032
033  /**
034   * @see JMenuItem#JMenuItem()
035   */
036  public StayOpenMenuItem() {
037    super();
038  }
039
040  /**
041   * @see JMenuItem#JMenuItem(javax.swing.Action)
042   */
043  public StayOpenMenuItem(Action a) {
044    super(a);
045  }
046
047  /**
048   * @see JMenuItem#JMenuItem(javax.swing.Icon)
049   */
050  public StayOpenMenuItem(Icon icon) {
051    super(icon);
052  }
053
054  /**
055   * @see JMenuItem#JMenuItem(java.lang.String)
056   */
057  public StayOpenMenuItem(String text) {
058    super(text);
059  }
060
061  /**
062   * @see JMenuItem#JMenuItem(java.lang.String, javax.swing.Icon)
063   */
064  public StayOpenMenuItem(String text, Icon icon) {
065    super(text, icon);
066  }
067
068  /**
069   * @see JMenuItem#JMenuItem(java.lang.String, int)
070   */
071  public StayOpenMenuItem(String text, int mnemonic) {
072    super(text, mnemonic);
073  }
074
075  /**
076   * Overridden to reopen the menu.
077   *
078   * @param pressTime the time to "hold down" the button, in milliseconds
079   */
080  @Override
081  public void doClick(int pressTime) {
082    super.doClick(pressTime);
083    MenuSelectionManager.defaultManager().setSelectedPath(path);
084  }
085}