001 /*
002 * $Id: CheckBoxProvider.java 3152 2008-12-23 18:12:39Z kschaefe $
003 *
004 * Copyright 2006 Sun Microsystems, Inc., 4150 Network Circle,
005 * Santa Clara, California 95054, U.S.A. All rights reserved.
006 *
007 * This library is free software; you can redistribute it and/or
008 * modify it under the terms of the GNU Lesser General Public
009 * License as published by the Free Software Foundation; either
010 * version 2.1 of the License, or (at your option) any later version.
011 *
012 * This library is distributed in the hope that it will be useful,
013 * but WITHOUT ANY WARRANTY; without even the implied warranty of
014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015 * Lesser General Public License for more details.
016 *
017 * You should have received a copy of the GNU Lesser General Public
018 * License along with this library; if not, write to the Free Software
019 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
020 */
021 package org.jdesktop.swingx.renderer;
022
023 import javax.swing.AbstractButton;
024 import javax.swing.JLabel;
025
026 /**
027 * A component provider which uses a JCheckBox.
028 * <p>
029 *
030 * This implementation respects a BooleanValue and a StringValue to configure
031 * the button's selected and text property. By default, the selected is mapped
032 * to a Boolean-type value and the text is empty.
033 * <p>
034 *
035 * To allow mapping to different types, client code can supply a custom
036 * StringValue which also implements BooleanValue. F.i. to render a cell value
037 * of type TableColumnExt with the column's visibility mapped to the selected
038 * and the column's title to the text:
039 *
040 * <pre><code>
041 *
042 * BooleanValue bv = new BooleanValue(){
043 * public boolean getBoolean(Object value) {
044 * if (value instanceof TableColumnExt)
045 * return ((TableColumnExt) value).isVisible();
046 * return false;
047 * }
048 * };
049 * StringValue sv = new StringValue() {
050 * public String getString(Object value) {
051 * if (value instanceof TableColumnExt)
052 * return ((TableColumnExt) value).getTitle();
053 * return "";
054 * }
055 * };
056 * list.setCellRenderer(new DefaultListRenderer(
057 * new CheckBoxProvider(new MappedValue(sv, null, bv), JLabel.LEADING)));
058 * </code></pre>
059 *
060 *
061 * @see BooleanValue
062 * @see StringValue
063 * @see MappedValue
064 *
065 * @author Jeanette Winzenburg
066 */
067 public class CheckBoxProvider extends ComponentProvider<AbstractButton> {
068
069 private boolean borderPainted;
070
071 /**
072 * Instantiates a CheckBoxProvider with default properties. <p>
073 *
074 */
075 public CheckBoxProvider() {
076 this(null);
077 }
078
079 /**
080 * Instantiates a CheckBoxProvider with the given StringValue and default
081 * alignment.
082 *
083 * @param stringValue the StringValue to use for formatting.
084 */
085 public CheckBoxProvider(StringValue stringValue) {
086 this(stringValue, JLabel.CENTER);
087 }
088
089 /**
090 * Instantiates a CheckBoxProvider with the given StringValue and
091 * alignment.
092 *
093 * @param stringValue the StringValue to use for formatting.
094 * @param alignment the horizontalAlignment.
095 */
096 public CheckBoxProvider(StringValue stringValue, int alignment) {
097 super(stringValue == null ? StringValues.EMPTY : stringValue, alignment);
098 setBorderPainted(true);
099 }
100
101
102 /**
103 * Returns the border painted flag.
104 * @return the borderpainted flag to use on the checkbox.
105 * @see #setBorderPainted(boolean)
106 */
107 public boolean isBorderPainted() {
108 return borderPainted;
109 }
110
111 /**
112 * Sets the border painted flag. The underlying checkbox
113 * is configured with this value on every request.<p>
114 *
115 * The default value is true.
116 *
117 * @param borderPainted the borderPainted property to configure
118 * the underlying checkbox with.
119 *
120 * @see #isBorderPainted()
121 */
122 public void setBorderPainted(boolean borderPainted) {
123 this.borderPainted = borderPainted;
124 }
125
126 /**
127 * {@inheritDoc} <p>
128 * Overridden to set the button's selected state and text.<p>
129 *
130 * PENDING: set icon?
131 *
132 * @see #getValueAsBoolean(CellContext)
133 * @see #getValueAsString(CellContext)
134 */
135 @Override
136 protected void format(CellContext context) {
137 rendererComponent.setSelected(getValueAsBoolean(context));
138 rendererComponent.setText(getValueAsString(context));
139 }
140
141 /**
142 * Returns a boolean representation of the content.<p>
143 *
144 * This method messages the
145 * <code>BooleanValue</code> to get the boolean rep. If none available,
146 * checks for Boolean type directly and returns its value. Returns
147 * false otherwise. <p>
148 *
149 * PENDING: fallback to check for boolean is convenient .. could cleanup
150 * to use a default BooleanValue instead.
151 *
152 * @param context the cell context, must not be null.
153 * @return the boolean representation of the cell's content,
154 * or false if none if available.
155 */
156 protected boolean getValueAsBoolean(CellContext context) {
157 if (formatter instanceof BooleanValue) {
158 return ((BooleanValue) formatter).getBoolean(context.getValue());
159 }
160 return Boolean.TRUE.equals(context.getValue());
161 }
162
163 /**
164 * {@inheritDoc}<p>
165 *
166 * Here: set's the buttons horizontal alignment and borderpainted properties
167 * to this provider's properties.
168 */
169 @Override
170 protected void configureState(CellContext context) {
171 rendererComponent.setBorderPainted(isBorderPainted());
172 rendererComponent.setHorizontalAlignment(getHorizontalAlignment());
173 }
174
175 /**
176 * {@inheritDoc}<p>
177 * Here: returns a JCheckBox as rendering component.<p>
178 *
179 */
180 @Override
181 protected AbstractButton createRendererComponent() {
182 return new JRendererCheckBox();
183 }
184
185 }