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.JRadioButtonMenuItem;
007import javax.swing.MenuElement;
008import javax.swing.MenuSelectionManager;
009import javax.swing.event.ChangeEvent;
010import javax.swing.event.ChangeListener;
011
012/**
013 * An extension of JRadioButtonMenuItem that doesn't close the menu when selected.
014 *
015 * @author Darryl http://tips4java.wordpress.com/2010/09/12/keeping-menus-open/
016 */
017public class StayOpenRadioButtonMenuItem extends JRadioButtonMenuItem {
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 JRadioButtonMenuItem#JRadioButtonMenuItem()
035   */
036  public StayOpenRadioButtonMenuItem() {
037    super();
038  }
039
040  /**
041   * @see JRadioButtonMenuItem#JRadioButtonMenuItem(Action)
042   */
043  public StayOpenRadioButtonMenuItem(Action a) {
044    super(a);
045  }
046
047  /**
048   * @see JRadioButtonMenuItem#JRadioButtonMenuItem(Icon)
049   */
050  public StayOpenRadioButtonMenuItem(Icon icon) {
051    super(icon);
052  }
053
054  /**
055   * @see JRadioButtonMenuItem#JRadioButtonMenuItem(Icon, boolean)
056   */
057  public StayOpenRadioButtonMenuItem(Icon icon, boolean selected) {
058    super(icon, selected);
059  }
060
061  /**
062   * @see JRadioButtonMenuItem#JRadioButtonMenuItem(String)
063   */
064  public StayOpenRadioButtonMenuItem(String text) {
065    super(text);
066  }
067
068  /**
069   * @see JRadioButtonMenuItem#JRadioButtonMenuItem(String, boolean)
070   */
071  public StayOpenRadioButtonMenuItem(String text, boolean selected) {
072    super(text, selected);
073  }
074
075  /**
076   * @see JRadioButtonMenuItem#JRadioButtonMenuItem(String, Icon)
077   */
078  public StayOpenRadioButtonMenuItem(String text, Icon icon) {
079    super(text, icon);
080  }
081
082  /**
083   * @see JRadioButtonMenuItem#JRadioButtonMenuItem(String, Icon, boolean)
084   */
085  public StayOpenRadioButtonMenuItem(String text, Icon icon, boolean selected) {
086    super(text, icon, selected);
087  }
088
089  /**
090   * Overridden to reopen the menu.
091   *
092   * @param pressTime the time to "hold down" the button, in milliseconds
093   */
094  @Override
095  public void doClick(int pressTime) {
096    super.doClick(pressTime);
097    MenuSelectionManager.defaultManager().setSelectedPath(path);
098  }
099}