/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package de.cismet.tools.gui.actiongroup;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.AbstractButton;
import javax.swing.Action;
import javax.swing.JMenuItem;
import javax.swing.JRadioButton;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.JToggleButton;
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
public final class ComponentFactory {
//~ Constructors -----------------------------------------------------------
/**
* Creates a new ComponentFactory object.
*/
private ComponentFactory() {
}
//~ Methods ----------------------------------------------------------------
/**
* DOCUMENT ME!
*
* @param action DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public static AbstractButton getRadioButton(final Action action) {
final JRadioButton button = new JRadioButton(action);
connectActionAndButton(action, button);
return button;
}
/**
* DOCUMENT ME!
*
* @param action DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public static AbstractButton getToggleButton(final Action action) {
final JToggleButton button = new JToggleButton(action);
connectActionAndButton(action, button);
return button;
}
/**
* DOCUMENT ME!
*
* @param action DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public static JMenuItem getRadioMenuItem(final Action action) {
final JRadioButtonMenuItem menu = new JRadioButtonMenuItem(action);
connectActionAndButton(action, menu);
return menu;
}
/**
* DOCUMENT ME!
*
* @param action DOCUMENT ME!
* @param button DOCUMENT ME!
*/
private static void connectActionAndButton(final Action action, final AbstractButton button) {
final SelectionStateAdapter adapter = new SelectionStateAdapter(action, button);
adapter.configure();
}
//~ Inner Classes ----------------------------------------------------------
/**
* Class that connects the selection state of the action to the selection state of the button.
*
* @author R.J. Lorimer
* @version $Revision$, $Date$
*/
private static class SelectionStateAdapter implements PropertyChangeListener, ItemListener {
//~ Instance fields ----------------------------------------------------
private Action action;
private AbstractButton button;
//~ Constructors -------------------------------------------------------
/**
* Creates a new SelectionStateAdapter object.
*
* @param theAction DOCUMENT ME!
* @param theButton DOCUMENT ME!
*/
public SelectionStateAdapter(final Action theAction, final AbstractButton theButton) {
action = theAction;
button = theButton;
}
//~ Methods ------------------------------------------------------------
/**
* DOCUMENT ME!
*/
protected void configure() {
action.addPropertyChangeListener(this);
button.addItemListener(this);
}
@Override
public void itemStateChanged(final ItemEvent e) {
final boolean value = e.getStateChange() == ItemEvent.SELECTED;
final Boolean valueObj = Boolean.valueOf(value);
action.putValue(ActionConstants.SELECTED_KEY, valueObj);
}
@Override
public void propertyChange(final PropertyChangeEvent evt) {
if (evt.getPropertyName().equals(ActionConstants.SELECTED_KEY)) {
final Boolean newSelectedState = (Boolean)evt.getNewValue();
button.setSelected(newSelectedState.booleanValue());
}
}
}
}