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 }