001 // License: GPL. For details, see LICENSE file.
002 package org.openstreetmap.josm.gui.util;
003
004 import javax.swing.Action;
005 import javax.swing.Icon;
006 import javax.swing.JRadioButtonMenuItem;
007 import javax.swing.MenuElement;
008 import javax.swing.MenuSelectionManager;
009 import javax.swing.event.ChangeEvent;
010 import 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 */
017 public 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();
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 }