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.BorderFactory;
047    import javax.swing.JLabel;
048    import javax.swing.JTable;
049    import javax.swing.UIManager;
050    import javax.swing.border.Border;
051    import javax.swing.border.EmptyBorder;
052    
053    /**
054     * Class to display every cells.
055     */
056    public class DefaultTableCellRenderer extends JLabel
057      implements TableCellRenderer, Serializable
058    {
059      static final long serialVersionUID = 7878911414715528324L;
060    
061      protected static Border noFocusBorder = new EmptyBorder(1, 1, 1, 1);
062    
063      public static class UIResource extends DefaultTableCellRenderer
064        implements javax.swing.plaf.UIResource
065      {
066        public UIResource()
067        {
068          super();
069        }
070      }
071    
072      /**
073       * Stores the color set by setForeground().
074       */
075      Color foreground;
076    
077      /**
078       * Stores the color set by setBackground().
079       */
080      Color background;
081    
082      /**
083       * Creates a default table cell renderer with an empty border.
084       */
085      public DefaultTableCellRenderer()
086      {
087        super();
088      }
089    
090      /**
091       * Assign the unselected-foreground.
092       *
093       * @param c the color to assign
094       */
095      public void setForeground(Color c)
096      {
097        super.setForeground(c);
098        foreground = c;
099      }
100    
101      /**
102       * Assign the unselected-background.
103       *
104       * @param c the color to assign
105       */
106      public void setBackground(Color c)
107      {
108        super.setBackground(c);
109        background = c;
110      }
111    
112      /**
113       * Look and feel has changed.
114       *
115       * <p>Replaces the current UI object with the  latest version from
116       * the UIManager.</p>
117       */
118      public void updateUI()
119      {
120        super.updateUI();
121        background = null;
122        foreground = null;
123      }
124    
125      /**
126       * Get the string value of the object and pass it to setText().
127       *
128       * @param table the JTable
129       * @param value the value of the object. For the text content,
130       *        null is rendered as an empty cell.
131       * @param isSelected is the cell selected?
132       * @param hasFocus has the cell the focus?
133       * @param row the row to render
134       * @param column the cell to render
135       * 
136       * @return this component (the default table cell renderer)
137       */
138      public Component getTableCellRendererComponent(JTable table, Object value,
139                                                     boolean isSelected,
140                                                     boolean hasFocus,
141                                                     int row, int column)
142      {
143        setValue(value);
144        setOpaque(true);
145    
146        if (table == null)
147          return this;
148    
149        if (isSelected)
150          {
151            super.setBackground(table.getSelectionBackground());
152            super.setForeground(table.getSelectionForeground());
153          }
154        else
155          {
156            if (background != null)
157              super.setBackground(background);
158            else
159              super.setBackground(table.getBackground());
160            if (foreground != null)
161              super.setForeground(foreground);
162            else
163              super.setForeground(table.getForeground());
164          }
165    
166        Border b = null;
167        if (hasFocus)
168          {
169            if (isSelected)
170              b = UIManager.getBorder("Table.focusSelectedCellHighlightBorder");
171            if (b == null)
172              b = UIManager.getBorder("Table.focusCellHighlightBorder");
173          }
174        else
175          b = noFocusBorder;
176        setBorder(b);
177    
178        setFont(table.getFont());
179    
180        // If the current background is equal to the table's background, then we
181        // can avoid filling the background by setting the renderer opaque.
182        Color back = getBackground();
183        setOpaque(back != null && back.equals(table.getBackground()));
184        
185        return this;    
186      }
187    
188      /**
189       * Overriden for performance.
190       *
191       * <p>This method needs to be overridden in a subclass to actually
192       * do something.</p>
193       *
194       * @return always true
195       */
196      public boolean isOpaque()
197      {
198        return true;
199      }
200    
201      /**
202       * Overriden for performance.
203       *
204       * <p>This method needs to be overridden in a subclass to actually
205       * do something.</p>
206       */
207      public void validate()
208      {
209        // Does nothing.
210      }
211    
212      public void revalidate()
213      {
214        // Does nothing.
215      }
216    
217      /**
218       * Overriden for performance.
219       *
220       * <p>This method needs to be overridden in a subclass to actually
221       * do something.</p>
222       */
223      public void repaint(long tm, int x, int y, int width, int height)
224      {
225        // Does nothing.
226      }
227    
228      /**
229       * Overriden for performance.
230       *
231       * <p>This method needs to be overridden in a subclass to actually
232       * do something.</p>
233       */
234      public void repaint(Rectangle r)
235      {
236        // Does nothing.
237      }
238    
239      /**
240       * Overriden for performance.
241       *
242       * <p>This method needs to be overridden in a subclass to actually
243       * do something.</p>
244       */
245      protected void firePropertyChange(String propertyName, Object oldValue,
246                                        Object newValue)
247      {
248        // Does nothing.
249      }
250    
251      /**
252       * Overriden for performance.
253       *
254       * <p>This method needs to be overridden in a subclass to actually
255       * do something.</p>
256       */
257      public void firePropertyChange(String propertyName, boolean oldValue,
258                                     boolean newValue)
259      {
260        // Does nothing.
261      }
262    
263      /**
264       * Sets the String for this cell.
265       * 
266       * @param value the string value for this cell; if value is null it
267       * sets the text value to an empty string
268       */
269      protected void setValue(Object value)
270      {
271        if (value != null)
272          setText(value.toString());
273        else
274          // null is rendered as an empty cell.
275          setText("");
276      }
277    }