/*
* Copyright (c) 2005-2008 Substance Kirill Grouchnikov. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* o Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* o Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* o Neither the name of Substance Kirill Grouchnikov nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package test.check;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Font;
import java.awt.Insets;
import java.util.EnumSet;
import javax.swing.AbstractButton;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JToggleButton;
import org.pushingpixels.lafwidget.LafWidget;
import org.pushingpixels.substance.api.SubstanceConstants.FocusKind;
import org.pushingpixels.substance.api.SubstanceConstants.Side;
import org.pushingpixels.substance.api.SubstanceLookAndFeel;
import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.layout.FormLayout;
import test.Check;
import test.check.command.ChainCommand;
import test.check.command.ClientPropertyCommand;
import test.check.command.ConfigurationCommand;
import test.check.command.DisableCommand;
import test.check.command.SelectCommand;
import test.check.svg.flags.cn;
import test.check.svg.flags.gr;
import test.check.svg.flags.il;
import test.check.svg.flags.it;
import test.check.svg.flags.ru;
import test.check.svg.flags.se;
/**
* Test application panel for testing {@link JButton}, {@link JToggleButton},
* {@link JRadioButton} and {@link JCheckBox} components.
*
* @author Kirill Grouchnikov
*/
public class ButtonsPanel extends JPanel {
/**
* The default button.
*/
public JButton defaultButton;
/**
* A configure command that removes the focus painting from the specified
* button.
*
* @author Kirill Grouchnikov
*/
private class NoFocusCommand implements
ConfigurationCommand<AbstractButton> {
/*
* (non-Javadoc)
*
* @see test.check.ConfigurationCommand#invoke(java.lang.Object)
*/
public void configure(AbstractButton ab) {
ab.setFocusPainted(false);
}
}
/**
* A configure command that sets the specified focus painting kind the
* specified button.
*
* @author Kirill Grouchnikov
*/
private class FocusKindCommand implements
ConfigurationCommand<AbstractButton> {
/**
* Focus painting kind.
*/
private FocusKind focusKind;
/**
* Creates the focus painting configuration command.
*
* @param focusKind
* Focus painting kind.
*/
public FocusKindCommand(FocusKind focusKind) {
this.focusKind = focusKind;
}
/*
* (non-Javadoc)
*
* @see test.check.ConfigurationCommand#invoke(java.lang.Object)
*/
public void configure(AbstractButton ab) {
ab.putClientProperty(SubstanceLookAndFeel.FOCUS_KIND, focusKind);
}
}
/**
* A configure command that marks the specified button to not have minimum
* size.
*
* @author Kirill Grouchnikov
*/
private class NoMinSizeCommand implements
ConfigurationCommand<AbstractButton> {
/*
* (non-Javadoc)
*
* @see test.check.ConfigurationCommand#invoke(java.lang.Object)
*/
public void configure(AbstractButton ab) {
ab.putClientProperty(
SubstanceLookAndFeel.BUTTON_NO_MIN_SIZE_PROPERTY,
Boolean.TRUE);
}
}
/**
* A configure command that sets a 5-pixel margin on the specified button.
*
* @author Kirill Grouchnikov
*/
private class MarginCommand implements ConfigurationCommand<AbstractButton> {
/*
* (non-Javadoc)
*
* @see test.check.ConfigurationCommand#invoke(java.lang.Object)
*/
public void configure(AbstractButton ab) {
ab.setMargin(new Insets(5, 5, 5, 5));
}
}
/**
* A configure command that sets straight sides on the specified button.
*
* @author Kirill Grouchnikov
*/
private class StraightSideCommand implements
ConfigurationCommand<AbstractButton> {
/**
* Straight sides object.
*/
private Object sideObj;
/**
* Creates a straight side configuration command.
*
* @param sideObj
* Straight side object.
*/
public StraightSideCommand(Object sideObj) {
this.sideObj = sideObj;
}
/*
* (non-Javadoc)
*
* @see test.check.ConfigurationCommand#invoke(java.lang.Object)
*/
public void configure(AbstractButton ab) {
ab.putClientProperty(SubstanceLookAndFeel.BUTTON_SIDE_PROPERTY,
this.sideObj);
}
}
/**
* A configure command that sets open sides on the specified button.
*
* @author Kirill Grouchnikov
*/
private class OpenSideCommand implements
ConfigurationCommand<AbstractButton> {
/**
* Open sides object.
*/
private Object sideObj;
/**
* Creates an open side configuration command.
*
* @param sideObj
* Open side object.
*/
public OpenSideCommand(Object sideObj) {
this.sideObj = sideObj;
}
/*
* (non-Javadoc)
*
* @see test.check.ConfigurationCommand#invoke(java.lang.Object)
*/
public void configure(AbstractButton ab) {
ab.putClientProperty(
SubstanceLookAndFeel.BUTTON_OPEN_SIDE_PROPERTY,
this.sideObj);
}
}
/**
* A configure command that sets the specified text on the specified button.
*
* @author Kirill Grouchnikov
*/
private class TextCommand implements ConfigurationCommand<AbstractButton> {
/**
* Text to set.
*/
private String text;
/**
* Creates a text configuration command.
*
* @param text
* Text to set.
*/
public TextCommand(String text) {
this.text = text;
}
/*
* (non-Javadoc)
*
* @see test.check.ConfigurationCommand#invoke(java.lang.Object)
*/
public void configure(AbstractButton ab) {
ab.setText(this.text);
}
}
/**
* A configure command that sets the specified tooltip text on the specified
* button.
*
* @author Kirill Grouchnikov
*/
private class TooltipTextCommand implements
ConfigurationCommand<AbstractButton> {
/**
* Tooltip text to set.
*/
private String tooltipText;
/**
* Creates a tooltip text configuration command.
*
* @param tooltipText
* Tooltip text to set.
*/
public TooltipTextCommand(String tooltipText) {
this.tooltipText = tooltipText;
}
/*
* (non-Javadoc)
*
* @see test.check.ConfigurationCommand#invoke(java.lang.Object)
*/
public void configure(AbstractButton ab) {
ab.setToolTipText(this.tooltipText);
}
}
/**
* A configure command that sets a popup menu handler on the specified
* button.
*
* @author Kirill Grouchnikov
*/
private class PopupMenuCommand implements
ConfigurationCommand<AbstractButton> {
/*
* (non-Javadoc)
*
* @see test.check.ConfigurationCommand#invoke(java.lang.Object)
*/
public void configure(AbstractButton ab) {
ab.addMouseListener(new MousePopupListener(ab));
}
}
/**
* A configure command that sets the specified font on the specified button.
*
* @author Kirill Grouchnikov
*/
private class FontCommand implements ConfigurationCommand<AbstractButton> {
/**
* Font to set.
*/
private Font font;
/**
* Creates a font configuration command.
*
* @param font
* Font to set.
*/
public FontCommand(Font font) {
this.font = font;
}
/*
* (non-Javadoc)
*
* @see test.check.ConfigurationCommand#invoke(java.lang.Object)
*/
public void configure(AbstractButton ab) {
ab.setFont(this.font);
}
}
/**
* A configure command that sets the specified icon on the specified button.
*
* @author Kirill Grouchnikov
*/
private class IconCommand implements ConfigurationCommand<AbstractButton> {
/**
* Icon to set.
*/
private Icon icon;
/**
* Creates an icon configuration command.
*
* @param icon
* Icon to set.
*/
public IconCommand(Icon icon) {
this.icon = icon;
}
/*
* (non-Javadoc)
*
* @see test.check.ConfigurationCommand#invoke(java.lang.Object)
*/
public void configure(AbstractButton ab) {
if ((ab instanceof JRadioButton) || (ab instanceof JCheckBox))
return;
ab.setIcon(this.icon);
}
}
/**
* A configure command that marks the button to not have content area
* filled.
*
* @author Kirill Grouchnikov
*/
private class NoContentAreaFilledCommand implements
ConfigurationCommand<AbstractButton> {
/*
* (non-Javadoc)
*
* @see test.check.ConfigurationCommand#invoke(java.lang.Object)
*/
public void configure(AbstractButton ab) {
ab.setContentAreaFilled(false);
}
}
/**
* A configure command that marks the button to not have border painted.
*
* @author Kirill Grouchnikov
*/
private class NoBorderPaintedCommand implements
ConfigurationCommand<AbstractButton> {
/*
* (non-Javadoc)
*
* @see test.check.ConfigurationCommand#invoke(java.lang.Object)
*/
public void configure(AbstractButton ab) {
ab.setBorderPainted(false);
}
}
/**
* Returns a row of buttons, consisting of {@link JButton},
* {@link JToggleButton}, {@link JCheckBox} and {@link JRadioButton} in
* default states.
*
* @return A row of buttons, consisting of {@link JButton},
* {@link JToggleButton}, {@link JCheckBox} and {@link JRadioButton}
* in default states.
*/
private AbstractButton[] getRow() {
AbstractButton[] result = new AbstractButton[4];
result[0] = new JButton("sample");
result[0].setName("Button " + rowCount);
result[1] = new JToggleButton("sample");
result[1].setName("Toggle " + rowCount);
result[2] = new JCheckBox("sample");
result[2].setName("Check " + rowCount);
result[3] = new JRadioButton("sample");
result[3].setName("Radio " + rowCount);
rowCount++;
return result;
}
private int rowCount = 0;
/**
* Adds a row of buttons configured with the specified text, icon and
* configuration command.
*
* @param builder
* Form builder.
* @param label
* Text to set.
* @param icon
* Icon to set.
* @param cmd
* Configuration command to apply.
*/
private void addRow(DefaultFormBuilder builder, String label, Icon icon,
ConfigurationCommand<? super AbstractButton> cmd) {
AbstractButton[] row = this.getRow();
if (cmd != null) {
for (AbstractButton ab : row) {
cmd.configure(ab);
}
}
JLabel jl = new JLabel(label);
if (icon != null)
jl.setIcon(icon);
builder.append(jl);
for (AbstractButton ab : row)
builder.append(ab);
}
/**
* Creates a new button panel.
*/
@SuppressWarnings("unchecked")
public ButtonsPanel() {
this.setLayout(new BorderLayout());
FormLayout lm = new FormLayout(
"right:pref, 10dlu, left:pref:grow(1), 4dlu,"
+ "left:pref:grow(1), 4dlu, left:pref:grow(1), "
+ "4dlu, left:pref:grow(1)", "");
lm.setColumnGroups(new int[][] { { 3, 5, 7, 9 } });
DefaultFormBuilder builder = new DefaultFormBuilder(lm,
new ScrollablePanel());
builder.setDefaultDialogBorder();
builder.append("");
JLabel bLabel = new JLabel("Buttons");
bLabel.setIcon(Check.getIcon("JButtonColor16"));
JLabel tbLabel = new JLabel("Toggle buttons");
tbLabel.setIcon(Check.getIcon("JToggleButtonColor16"));
JLabel cbLabel = new JLabel("Check boxes");
cbLabel.setIcon(Check.getIcon("JCheckBoxColor16"));
JLabel rbLabel = new JLabel("Radio buttons");
rbLabel.setIcon(Check.getIcon("JRadioButtonColor16"));
// bLabel.setFont(bLabel.getFont().deriveFont(Font.BOLD));
// tbLabel.setFont(rbLabel.getFont().deriveFont(Font.BOLD));
// cbLabel.setFont(cbLabel.getFont().deriveFont(Font.BOLD));
// rbLabel.setFont(rbLabel.getFont().deriveFont(Font.BOLD));
builder.append(bLabel, tbLabel);
builder.append(cbLabel, rbLabel);
builder.appendSeparator("Regular settings");
this.addRow(builder, "Enabled", null, null);
this.addRow(builder, "Disabled", null, new DisableCommand());
this.addRow(builder, "Selected", null, new SelectCommand());
this.addRow(builder, "Disabled selected", null,
new ChainCommand<Component>(new DisableCommand(),
new SelectCommand()));
this.addRow(builder, "HTML text", null, new TextCommand(
"<html>text <b>text</b> <font color='red'>text</font>"));
this.addRow(builder, "Long text", null, new TextCommand(
"Some long long text"));
this.addRow(builder, "With tooltip", null, new TooltipTextCommand(
"Sample tooltip"));
this
.addRow(builder, "Disabled with tooltip", null,
new ChainCommand(new TooltipTextCommand(
"Sample tooltip"), new DisableCommand()));
this.addRow(builder, "Popup menu", null, new PopupMenuCommand());
this.addRow(builder, "With icon", Check.configure(new se(), 21, 16),
new IconCommand(Check.configure(new se(), 21, 16)));
builder.appendSeparator("Focus indications");
this.addRow(builder, "No focus painted", null, new NoFocusCommand());
this
.addRow(builder, "None", null, new FocusKindCommand(
FocusKind.NONE));
this
.addRow(builder, "Text", null, new FocusKindCommand(
FocusKind.TEXT));
this.addRow(builder, "All", null, new FocusKindCommand(FocusKind.ALL));
this.addRow(builder, "All inner", null, new FocusKindCommand(
FocusKind.ALL_INNER));
this.addRow(builder, "All strong inner", null, new FocusKindCommand(
FocusKind.ALL_STRONG_INNER));
this.addRow(builder, "Underline", null, new FocusKindCommand(
FocusKind.UNDERLINE));
this.addRow(builder, "Strong underline", null, new FocusKindCommand(
FocusKind.STRONG_UNDERLINE));
builder.appendSeparator("Size settings");
this.addRow(builder, "No min size", null, new NoMinSizeCommand());
this.addRow(builder, "Custom margin", null, new MarginCommand());
builder.appendSeparator("Side settings");
this.addRow(builder, "Straight top", null, new StraightSideCommand(
Side.TOP));
this.addRow(builder, "Straight bottom", null, new StraightSideCommand(
Side.BOTTOM));
this.addRow(builder, "Straight left", null, new StraightSideCommand(
EnumSet.of(Side.LEFT)));
this.addRow(builder, "Straight right", null, new StraightSideCommand(
EnumSet.of(Side.RIGHT)));
this.addRow(builder, "Open top", null,
new ChainCommand<AbstractButton>(new StraightSideCommand(
Side.TOP), new OpenSideCommand(Side.TOP)));
this.addRow(builder, "Open bottom", null,
new ChainCommand<AbstractButton>(new StraightSideCommand(
Side.BOTTOM), new OpenSideCommand(Side.BOTTOM)));
this.addRow(builder, "Open left", null,
new ChainCommand<AbstractButton>(new StraightSideCommand(
EnumSet.of(Side.LEFT)), new OpenSideCommand(EnumSet
.of(Side.LEFT))));
this.addRow(builder, "Open right", null,
new ChainCommand<AbstractButton>(new StraightSideCommand(
EnumSet.of(Side.RIGHT)), new OpenSideCommand(EnumSet
.of(Side.RIGHT))));
builder.appendSeparator("Unicode texts");
this.addRow(builder, "Hebrew", null, new ChainCommand<AbstractButton>(
new TextCommand("\u05D0\u05D1\u05D2"),
new IconCommand(Check.configure(new il(), 21, 16))));
this.addRow(builder, "Chinese", null, new ChainCommand<AbstractButton>(
new FontCommand(new Font("Arial Unicode MS", Font.PLAIN, 11)),
new TextCommand("\u4E01\u4E02\u4E03"),
new IconCommand(Check.configure(new cn(), 21, 16))));
this.addRow(builder, "Cyrillic", null,
new ChainCommand<AbstractButton>(new TextCommand(
"\u0430\u0431\u0432"),
new IconCommand(Check.configure(new ru(), 21, 16))));
this.addRow(builder, "Greek", null, new ChainCommand<AbstractButton>(
new TextCommand("\u03B1\u03B2\u03B3"),
new IconCommand(Check.configure(new gr(), 21, 16))));
this.addRow(builder, "Latin", null, new ChainCommand<AbstractButton>(
new TextCommand("\u00E6\u00F0\u0127\u2248"),
new IconCommand(Check.configure(new it(), 21, 16))));
builder.appendSeparator("Misc settings");
this.addRow(builder, "No content area", null,
new NoContentAreaFilledCommand());
this.addRow(builder, "No border", null, new NoBorderPaintedCommand());
this.addRow(builder, "No background", null,
new ChainCommand<AbstractButton>(
new NoContentAreaFilledCommand(),
new NoBorderPaintedCommand()));
this.addRow(builder, "Flat", null, new ClientPropertyCommand(
SubstanceLookAndFeel.FLAT_PROPERTY, Boolean.TRUE));
this
.addRow(builder, "Never", null, new ClientPropertyCommand(
SubstanceLookAndFeel.BUTTON_PAINT_NEVER_PROPERTY,
Boolean.TRUE));
this.addRow(builder, "Fixed font", null, new FontCommand(new Font(
"Arial", Font.PLAIN, 12)));
this.addRow(builder, "Null text", null, new TextCommand(null));
this.addRow(builder, "Empty text", null, new TextCommand(""));
JPanel panel = builder.getPanel();
JScrollPane jsp = new JScrollPane(panel);
jsp.putClientProperty(LafWidget.AUTO_SCROLL, Boolean.TRUE);
this.add(jsp, BorderLayout.CENTER);
}
}