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    }