/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package de.cismet.tools.gui;
import java.awt.Color;
import javax.swing.Action;
import javax.swing.Icon;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.MenuElement;
import javax.swing.MenuSelectionManager;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
/**
* An extension of JCheckBoxMenuItem that doesn't close the menu when selected.
*
* @author Darryl
* @author jweintraut Erweiterung für Popup-Menüs
* @version $Revision$, $Date$
* @url http://tips4java.wordpress.com/2010/09/12/keeping-menus-open/
*/
public class StayOpenCheckBoxMenuItem extends JCheckBoxMenuItem {
//~ Static fields/initializers ---------------------------------------------
private static MenuElement[] path;
private static JCheckBoxMenuItem bsp = new JCheckBoxMenuItem("white");
//~ Instance fields --------------------------------------------------------
private Color selectedBackgroundColor;
private Color selectedForegroundColor;
private Color normalBackgroundColor;
private Color normalForegroundColor;
//~ Instance initializers --------------------------------------------------
{
getModel().addChangeListener(new ChangeListener() {
@Override
public void stateChanged(final ChangeEvent e) {
if (getModel().isArmed() && isShowing()) {
path = MenuSelectionManager.defaultManager().getSelectedPath();
}
}
});
}
//~ Constructors -----------------------------------------------------------
/**
* @see JCheckBoxMenuItem#JCheckBoxMenuItem()
*/
public StayOpenCheckBoxMenuItem() {
super();
}
/**
* @see JCheckBoxMenuItem#JCheckBoxMenuItem(Action)
*/
public StayOpenCheckBoxMenuItem(final Action a) {
super(a);
}
/**
* @see JCheckBoxMenuItem#JCheckBoxMenuItem(Icon)
*/
public StayOpenCheckBoxMenuItem(final Icon icon) {
super(icon);
}
/**
* @see JCheckBoxMenuItem#JCheckBoxMenuItem(String)
*/
public StayOpenCheckBoxMenuItem(final String text) {
super(text);
}
/**
* @see JCheckBoxMenuItem#JCheckBoxMenuItem(String, boolean)
*/
public StayOpenCheckBoxMenuItem(final String text, final boolean selected) {
super(text, selected);
}
/**
* @see JCheckBoxMenuItem#JCheckBoxMenuItem(String, Icon)
*/
public StayOpenCheckBoxMenuItem(final String text, final Icon icon) {
super(text, icon);
}
/**
* Creates a new StayOpenCheckBoxMenuItem object.
*
* @param action DOCUMENT ME!
* @param selectedBackgroundColor DOCUMENT ME!
* @param selectedForegroundColor DOCUMENT ME!
*/
public StayOpenCheckBoxMenuItem(final Action action,
final Color selectedBackgroundColor,
final Color selectedForegroundColor) {
this(action);
this.selectedBackgroundColor = selectedBackgroundColor;
this.selectedForegroundColor = selectedForegroundColor;
normalBackgroundColor = bsp.getBackground();
normalForegroundColor = bsp.getForeground();
}
/**
* @see JCheckBoxMenuItem#JCheckBoxMenuItem(String, Icon, boolean)
*/
public StayOpenCheckBoxMenuItem(final String text, final Icon icon, final boolean selected) {
super(text, icon, selected);
}
//~ Methods ----------------------------------------------------------------
/**
* Overridden to reopen the menu.
*
* @param pressTime the time to "hold down" the button, in milliseconds
*/
@Override
public void doClick(final int pressTime) {
super.doClick(pressTime);
if ((path != null) && (path.length > 1) && (path[0] instanceof JPopupMenu)) {
final JPopupMenu menu = (JPopupMenu)path[0];
menu.setVisible(true);
}
MenuSelectionManager.defaultManager().setSelectedPath(path);
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
@Override
public Color getBackground() {
if (isSelected()) {
return selectedBackgroundColor;
} else {
return normalBackgroundColor;
}
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
@Override
public Color getForeground() {
if (isSelected()) {
return selectedForegroundColor;
} else {
return normalForegroundColor;
}
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public Color getSelectedBackgroundColor() {
return selectedBackgroundColor;
}
/**
* DOCUMENT ME!
*
* @param selectedBackgroundColor DOCUMENT ME!
*/
public void setSelectedBackgroundColor(final Color selectedBackgroundColor) {
this.selectedBackgroundColor = selectedBackgroundColor;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public Color getSelectedForegroundColor() {
return selectedForegroundColor;
}
/**
* DOCUMENT ME!
*
* @param selectedForegroundColor DOCUMENT ME!
*/
public void setSelectedForegroundColor(final Color selectedForegroundColor) {
this.selectedForegroundColor = selectedForegroundColor;
}
}