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.JCheckBoxMenuItem;
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 /**
014 * An extension of JCheckBoxMenuItem that doesn't close the menu when selected.
015 *
016 * @author Darryl http://tips4java.wordpress.com/2010/09/12/keeping-menus-open/
017 */
018 public class StayOpenCheckBoxMenuItem extends JCheckBoxMenuItem {
019
020 private static MenuElement[] path;
021
022 {
023 getModel().addChangeListener(new ChangeListener() {
024
025 @Override
026 public void stateChanged(ChangeEvent e) {
027 if (getModel().isArmed() && isShowing()) {
028 path = MenuSelectionManager.defaultManager().getSelectedPath();
029 }
030 }
031 });
032 }
033
034 /**
035 * @see JCheckBoxMenuItem#JCheckBoxMenuItem()
036 */
037 public StayOpenCheckBoxMenuItem() {
038 super();
039 }
040
041 /**
042 * @see JCheckBoxMenuItem#JCheckBoxMenuItem(Action)
043 */
044 public StayOpenCheckBoxMenuItem(Action a) {
045 super(a);
046 }
047
048 /**
049 * @see JCheckBoxMenuItem#JCheckBoxMenuItem(Icon)
050 */
051 public StayOpenCheckBoxMenuItem(Icon icon) {
052 super(icon);
053 }
054
055 /**
056 * @see JCheckBoxMenuItem#JCheckBoxMenuItem(String)
057 */
058 public StayOpenCheckBoxMenuItem(String text) {
059 super(text);
060 }
061
062 /**
063 * @see JCheckBoxMenuItem#JCheckBoxMenuItem(String, boolean)
064 */
065 public StayOpenCheckBoxMenuItem(String text, boolean selected) {
066 super(text, selected);
067 }
068
069 /**
070 * @see JCheckBoxMenuItem#JCheckBoxMenuItem(String, Icon)
071 */
072 public StayOpenCheckBoxMenuItem(String text, Icon icon) {
073 super(text, icon);
074 }
075
076 /**
077 * @see JCheckBoxMenuItem#JCheckBoxMenuItem(String, Icon, boolean)
078 */
079 public StayOpenCheckBoxMenuItem(String text, Icon icon, boolean selected) {
080 super(text, icon, selected);
081 }
082
083 /**
084 * Overridden to reopen the menu.
085 *
086 * @param pressTime the time to "hold down" the button, in milliseconds
087 */
088 @Override
089 public void doClick(int pressTime) {
090 super.doClick(pressTime);
091 MenuSelectionManager.defaultManager().setSelectedPath(path);
092 }
093 }