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.JMenuItem;
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 JMenuItem 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 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 }