package com.revolsys.swing.component;
import java.awt.Dimension;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.Arrays;
import java.util.List;
import javax.swing.Action;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.ButtonModel;
import javax.swing.JToggleButton;
import javax.swing.SpringLayout;
import com.revolsys.swing.layout.SpringLayoutUtil;
public class TogglePanel extends ValueField implements ItemListener {
/**
*
*/
private static final long serialVersionUID = -1157521301167776836L;
private final ButtonGroup group;
public TogglePanel(final String value, final Action... actions) {
this(value, null, actions);
}
public TogglePanel(final String value, final Dimension dimension, final Action... actions) {
this(null, value, dimension, actions);
}
public TogglePanel(final String fieldName, final String value, final Dimension dimension,
final Action... actions) {
this(fieldName, value, dimension, Arrays.asList(actions));
}
public TogglePanel(final String fieldName, final String value, final Dimension dimension,
final List<Action> actions) {
super(new SpringLayout(), fieldName, value);
setOpaque(false);
setBorder(BorderFactory.createEmptyBorder(0, 3, 0, 0));
this.group = new ButtonGroup();
for (final Action action : actions) {
final JToggleButton button = new JToggleButton(action);
if (dimension != null) {
button.setPreferredSize(dimension);
}
this.group.add(button);
add(button);
final Object actionCommand = action.getValue(Action.ACTION_COMMAND_KEY);
if (value != null && actionCommand != null
&& value.equalsIgnoreCase(actionCommand.toString())) {
button.setSelected(true);
}
button.addItemListener(this);
}
SpringLayoutUtil.makeColumns(this, getComponentCount(), 0, 0, 5, 0);
}
public String getActionCommand() {
if (this.group != null) {
final ButtonModel selection = this.group.getSelection();
if (selection != null) {
return selection.getActionCommand();
}
}
return null;
}
@Override
public void itemStateChanged(final ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
firePropertyChange("actionCommand", null, getActionCommand());
setFieldValue(getActionCommand());
}
}
@Override
public void save() {
super.save();
setFieldValue(getActionCommand());
}
}