package com.explodingpixels.macwidgets;
import java.awt.FlowLayout;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.List;
import javax.swing.AbstractButton;
import javax.swing.ButtonGroup;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import com.jgoodies.forms.builder.PanelBuilder;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
/**
* Creates a group of components and provides a label underneath those components. The added
* components will be placed side by side, with no spacing in between them, like this:
* <br><br>
* <img src="../../../../graphics/LabeledComponentGroup-anatomy.png">
* <br><br>
* Here are a couple more practical applications of {@code LabledComponentGroup}:
* <br><br>
* <img src="../../../../graphics/LabeledComponentGroup-view.png"> <img src="../../../../graphics/LabeledComponentGroup-search.png">
* <br><br>
* Here's how to create a {@code LabeledComponentGroup} with two buttons:
* <pre>
* JToggleButton leftButton = new JToggleButton("Left Button");
* leftButton.putClientProperty("JButton.buttonType", "segmentedTextured");
* leftButton.putClientProperty("JButton.segmentPosition", "first");
* <p/>
* JToggleButton rightButton = new JToggleButton("Right Button");
* rightButton.putClientProperty("JButton.buttonType", "segmentedTextured");
* rightButton.putClientProperty("JButton.segmentPosition", "last");
* <p/>
* LabeledComponentGroup group = new LabeledComponentGroup("Group", leftButton, rightButton);
* </pre>
*/
public class LabeledComponentGroup {
private JComponent fComponent;
/**
* Creates a labeled component group using the given label and components.
*
* @param labelString the label of the group.
* @param components the components in the group.
*/
public LabeledComponentGroup(String labelString, JComponent... components) {
this(labelString, Arrays.asList(components));
}
/**
* Creates a labeled component group using the given label and components.
*
* @param labelString the label of the group.
* @param components the components in the group.
*/
public LabeledComponentGroup(String labelString, List<JComponent> components) {
init(labelString, components);
}
/**
* Creates a labeled component group using the given button group.
*
* @param labelString the label of the group.
* @param components the components in the group.
*/
public LabeledComponentGroup(String labelString, ButtonGroup group) {
ArrayList<JComponent> list = new ArrayList<JComponent> ();
for (Enumeration<AbstractButton> e = group.getElements() ; e.hasMoreElements() ;) {
AbstractButton element = e.nextElement();
list.add(element);
}
init(labelString, list);
}
protected void init(String labelString, List<JComponent> components)
{
JComponent componentToAdd;
if (components.size() == 1) {
componentToAdd = components.get(0);
} else {
componentToAdd = new JPanel(new FlowLayout(0, 0, FlowLayout.CENTER));
componentToAdd.setOpaque(false);
for (JComponent component : components) {
componentToAdd.add(component);
}
}
// definte the FormLayout columns and rows.
FormLayout layout = new FormLayout("p", "fill:p:grow, p");
// create the cell constraints to use in the layout.
CellConstraints cc = new CellConstraints();
// create the builder with our panel as the component to be filled.
PanelBuilder builder = new PanelBuilder(layout, new JPanel());
builder.add(componentToAdd, cc.xy(1, 1, "center, center"));
builder.add(createLabel(labelString), cc.xy(1, 2, "center, top"));
fComponent = builder.getPanel();
fComponent.setOpaque(false);
}
public JComponent getComponent() {
return fComponent;
}
private JLabel createLabel(String labelString) {
JLabel label = MacWidgetFactory.makeEmphasizedLabel(new JLabel(labelString));
label.setFont(MacFontUtils.TOOLBAR_LABEL_FONT);
return label;
}
}