package com.link_intersystems.swing; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeListenerProxy; import java.beans.PropertyChangeSupport; import javax.swing.Action; public class SingleActionSelectionMediator implements PropertyChangeListener { public static final String PROP_SELECTED_ACTION = "selectedAction"; private Action[] actions; private PropertyChangeListener selectedKeyListener = new PropertyChangeListenerProxy( Action.SELECTED_KEY, this); private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport( this); private Action selectedAction; public void setActionGroup(Action... actions) { if (this.actions != null) { for (Action action : this.actions) { action.removePropertyChangeListener(selectedKeyListener); } } this.actions = actions; for (Action action : this.actions) { action.addPropertyChangeListener(selectedKeyListener); Boolean selectedKey = (Boolean) action .getValue(Action.SELECTED_KEY); boolean isSelected = selectedKey != null && selectedKey; if (isSelected) { if (selectedAction == null) { setSelectedAction(action); } else { throw new IllegalArgumentException( "actions must contain at most 1 selected action"); } } } } private void setSelectedAction(Action selectedAction) { propertyChangeSupport.firePropertyChange(PROP_SELECTED_ACTION, this.selectedAction, this.selectedAction = selectedAction); } public Action getSelectedAction() { return selectedAction; } public void addPropertyChangeListener(PropertyChangeListener listener) { propertyChangeSupport.addPropertyChangeListener(listener); } public void removePropertyChangeListener(PropertyChangeListener listener) { propertyChangeSupport.removePropertyChangeListener(listener); } public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { propertyChangeSupport.addPropertyChangeListener(propertyName, listener); } public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) { propertyChangeSupport.removePropertyChangeListener(propertyName, listener); } @Override public void propertyChange(PropertyChangeEvent evt) { Object source = evt.getSource(); Boolean selectedKey = (Boolean) evt.getNewValue(); if (selectedKey) { for (Action action : actions) { if (action.equals(source)) { continue; } action.putValue(Action.SELECTED_KEY, Boolean.FALSE); } } } }