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    }