/**
* @ 2003 Daniel C. Tofan
* daniel@danieltofan.org
*/
package photoSpreadUtilities;
import java.util.*;
import javax.swing.*;
/** Extends <code>javax.swing.ButtonGroup</code> to provide methods
* that allow working with button references instead of button models.
* @author Daniel Tofan
* @version 1.0 April 2003
* @see ButtonGroup
*/
public class JButtonGroup extends ButtonGroup {
private static final long serialVersionUID = 1L;
/**
* Stores a reference to the currently selected button in the group
*/
private AbstractButton selectedButton;
/**
* Creates an empty <code>JButtonGroup</code>
*/
public JButtonGroup() {
super();
}
/**
* Creates a <code>JButtonGroup</code> object from an array of buttons and adds the buttons to the group
* No button will be selected initially.
* @param buttons an array of <code>AbstractButton</code>s
*/
public JButtonGroup(AbstractButton[] buttons) {
add(buttons);
}
/**
* Adds a button to the group
* @param button an <code>AbstractButton</code> reference
*/
public void add(AbstractButton button) {
if (button == null || buttons.contains(button)) return;
super.add(button);
if (getSelection() == button.getModel()) selectedButton = button;
}
/**
* Adds an array of buttons to the group
* @param buttons an array of <code>AbstractButton</code>s
*/
public void add(AbstractButton[] buttons) {
if (buttons == null) return;
for (int i=0; i<buttons.length; i++) {
add(buttons[i]);
}
}
/**
* Removes a button from the group
* @param button the button to be removed
*/
public void remove(AbstractButton button) {
if (button != null) {
if (selectedButton == button) selectedButton = null;
super.remove(button);
}
}
/**
* Removes all the buttons in the array from the group
* @param buttons an array of <code>AbstractButton</code>s
*/
public void remove(AbstractButton[] buttons) {
if (buttons == null) return;
for (int i=0; i<buttons.length; i++) {
remove(buttons[i]);
}
}
/**
* Sets the selected button in the group
* Only one button in the group can be selected
* @param button an <code>AbstractButton</code> reference
* @param selected an <code>boolean</code> representing the selection state of the button
*/
public void setSelected(AbstractButton button, boolean selected) {
if (button != null && buttons.contains(button)) {
setSelected(button.getModel(), selected);
if (getSelection() == button.getModel()) selectedButton = button;
}
}
/**
* Sets the selected button model in the group
* @param model a <code>ButtonModel</code> reference
* @param selected an <code>boolean</code> representing the selection state of the button
*/
public void setSelected(ButtonModel model, boolean selected) {
AbstractButton button = getButton(model);
if (buttons.contains(button)) super.setSelected(model, selected);
}
/**
* Returns the <code>AbstractButton</code> whose <code>ButtonModel</code> is given.
* If the model does not belong to a button in the group, returns null.
* @param model a <code>ButtonModel</code> that should belong to a button in the group
* @return an <code>AbstractButton</code> reference whose model is <code>model</code> if the button belongs to the group, <code>null</code>otherwise
*/
public AbstractButton getButton(ButtonModel model) {
Iterator<AbstractButton> it = buttons.iterator();
while (it.hasNext()) {
AbstractButton ab = (AbstractButton)it.next();
if (ab.getModel() == model) return ab;
}
return null;
}
/**
* Returns the selected button in the group.
* @return a reference to the currently selected button in the group or <code>null</code> if no button is selected
*/
public AbstractButton getSelected()
{
return selectedButton;
}
/**
* Returns whether the button is selected
* @param button an <code>AbstractButton</code> reference
* @return <code>true</code> if the button is selected, <code>false</code> otherwise
*/
public boolean isSelected(AbstractButton button) {
return button == selectedButton;
}
/**
* Returns the buttons in the group as a <code>List</code>
* @return a <code>List</code> containing the buttons in the group, in the order they were added to the group
*/
public List<AbstractButton> getButtons() {
return Collections.unmodifiableList(buttons);
}
/**
* Checks whether the group contains the given button
* @return <code>true</code> if the button is contained in the group, <code>false</code> otherwise
*/
public boolean contains(AbstractButton button) {
return buttons.contains(button);
}
}