001 /* DefaultTableCellRenderer.java --
002 Copyright (C) 2002, 2004, 2005, 2006, Free Software Foundation, Inc.
003
004 This file is part of GNU Classpath.
005
006 GNU Classpath is free software; you can redistribute it and/or modify
007 it under the terms of the GNU General Public License as published by
008 the Free Software Foundation; either version 2, or (at your option)
009 any later version.
010
011 GNU Classpath is distributed in the hope that it will be useful, but
012 WITHOUT ANY WARRANTY; without even the implied warranty of
013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014 General Public License for more details.
015
016 You should have received a copy of the GNU General Public License
017 along with GNU Classpath; see the file COPYING. If not, write to the
018 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
019 02110-1301 USA.
020
021 Linking this library statically or dynamically with other modules is
022 making a combined work based on this library. Thus, the terms and
023 conditions of the GNU General Public License cover the whole
024 combination.
025
026 As a special exception, the copyright holders of this library give you
027 permission to link this library with independent modules to produce an
028 executable, regardless of the license terms of these independent
029 modules, and to copy and distribute the resulting executable under
030 terms of your choice, provided that you also meet, for each linked
031 independent module, the terms and conditions of the license of that
032 module. An independent module is a module which is not derived from
033 or based on this library. If you modify this library, you may extend
034 this exception to your version of the library, but you are not
035 obligated to do so. If you do not wish to do so, delete this
036 exception statement from your version. */
037
038
039 package javax.swing.table;
040
041 import java.awt.Color;
042 import java.awt.Component;
043 import java.awt.Rectangle;
044 import java.io.Serializable;
045
046 import javax.swing.JLabel;
047 import javax.swing.JTable;
048 import javax.swing.UIManager;
049 import javax.swing.border.Border;
050 import javax.swing.border.EmptyBorder;
051
052 /**
053 * Class to display every cells.
054 */
055 public class DefaultTableCellRenderer extends JLabel
056 implements TableCellRenderer, Serializable
057 {
058 static final long serialVersionUID = 7878911414715528324L;
059
060 protected static Border noFocusBorder = new EmptyBorder(1, 1, 1, 1);
061
062 public static class UIResource extends DefaultTableCellRenderer
063 implements javax.swing.plaf.UIResource
064 {
065 public UIResource()
066 {
067 super();
068 }
069 }
070
071 /**
072 * Stores the color set by setForeground().
073 */
074 Color foreground;
075
076 /**
077 * Stores the color set by setBackground().
078 */
079 Color background;
080
081 /**
082 * Creates a default table cell renderer with an empty border.
083 */
084 public DefaultTableCellRenderer()
085 {
086 super();
087 }
088
089 /**
090 * Assign the unselected-foreground.
091 *
092 * @param c the color to assign
093 */
094 public void setForeground(Color c)
095 {
096 super.setForeground(c);
097 foreground = c;
098 }
099
100 /**
101 * Assign the unselected-background.
102 *
103 * @param c the color to assign
104 */
105 public void setBackground(Color c)
106 {
107 super.setBackground(c);
108 background = c;
109 }
110
111 /**
112 * Look and feel has changed.
113 *
114 * <p>Replaces the current UI object with the latest version from
115 * the UIManager.</p>
116 */
117 public void updateUI()
118 {
119 super.updateUI();
120 background = null;
121 foreground = null;
122 }
123
124 /**
125 * Get the string value of the object and pass it to setText().
126 *
127 * @param table the JTable
128 * @param value the value of the object. For the text content,
129 * null is rendered as an empty cell.
130 * @param isSelected is the cell selected?
131 * @param hasFocus has the cell the focus?
132 * @param row the row to render
133 * @param column the cell to render
134 *
135 * @return this component (the default table cell renderer)
136 */
137 public Component getTableCellRendererComponent(JTable table, Object value,
138 boolean isSelected,
139 boolean hasFocus,
140 int row, int column)
141 {
142 setValue(value);
143 setOpaque(true);
144
145 if (table == null)
146 return this;
147
148 if (isSelected)
149 {
150 super.setBackground(table.getSelectionBackground());
151 super.setForeground(table.getSelectionForeground());
152 }
153 else
154 {
155 if (background != null)
156 super.setBackground(background);
157 else
158 super.setBackground(table.getBackground());
159 if (foreground != null)
160 super.setForeground(foreground);
161 else
162 super.setForeground(table.getForeground());
163 }
164
165 Border b = null;
166 if (hasFocus)
167 {
168 if (isSelected)
169 b = UIManager.getBorder("Table.focusSelectedCellHighlightBorder");
170 if (b == null)
171 b = UIManager.getBorder("Table.focusCellHighlightBorder");
172 }
173 else
174 b = noFocusBorder;
175 setBorder(b);
176
177 setFont(table.getFont());
178
179 // If the current background is equal to the table's background, then we
180 // can avoid filling the background by setting the renderer opaque.
181 Color back = getBackground();
182 setOpaque(back != null && back.equals(table.getBackground()));
183
184 return this;
185 }
186
187 /**
188 * Overriden for performance.
189 *
190 * <p>This method needs to be overridden in a subclass to actually
191 * do something.</p>
192 *
193 * @return always true
194 */
195 public boolean isOpaque()
196 {
197 return true;
198 }
199
200 /**
201 * Overriden for performance.
202 *
203 * <p>This method needs to be overridden in a subclass to actually
204 * do something.</p>
205 */
206 public void validate()
207 {
208 // Does nothing.
209 }
210
211 public void revalidate()
212 {
213 // Does nothing.
214 }
215
216 /**
217 * Overriden for performance.
218 *
219 * <p>This method needs to be overridden in a subclass to actually
220 * do something.</p>
221 */
222 public void repaint(long tm, int x, int y, int width, int height)
223 {
224 // Does nothing.
225 }
226
227 /**
228 * Overriden for performance.
229 *
230 * <p>This method needs to be overridden in a subclass to actually
231 * do something.</p>
232 */
233 public void repaint(Rectangle r)
234 {
235 // Does nothing.
236 }
237
238 /**
239 * Overriden for performance.
240 *
241 * <p>This method needs to be overridden in a subclass to actually
242 * do something.</p>
243 */
244 protected void firePropertyChange(String propertyName, Object oldValue,
245 Object newValue)
246 {
247 // Does nothing.
248 }
249
250 /**
251 * Overriden for performance.
252 *
253 * <p>This method needs to be overridden in a subclass to actually
254 * do something.</p>
255 */
256 public void firePropertyChange(String propertyName, boolean oldValue,
257 boolean newValue)
258 {
259 // Does nothing.
260 }
261
262 /**
263 * Sets the String for this cell.
264 *
265 * @param value the string value for this cell; if value is null it
266 * sets the text value to an empty string
267 */
268 protected void setValue(Object value)
269 {
270 if (value != null)
271 setText(value.toString());
272 else
273 // null is rendered as an empty cell.
274 setText("");
275 }
276 }