ResourceRenderer.java
001 /*
002  *  Copyright (c) 1995-2010, The University of Sheffield. See the file
003  *  COPYRIGHT.txt in the software or at http://gate.ac.uk/gate/COPYRIGHT.txt
004  *
005  *  This file is part of GATE (see http://gate.ac.uk/), and is free
006  *  software, licenced under the GNU Library General Public License,
007  *  Version 2, June 1991 (in the distribution as file licence.html,
008  *  and also available at http://gate.ac.uk/gate/licence.html).
009  *
010  *  Valentin Tablan 02/10/2001
011  *
012  *  $Id: ResourceRenderer.java 12282 2010-02-18 14:37:50Z valyt $
013  *
014  */
015 package gate.gui;
016 
017 import java.awt.Color;
018 import java.awt.Component;
019 import java.awt.Dimension;
020 import java.awt.Rectangle;
021 
022 import javax.swing.*;
023 import javax.swing.border.Border;
024 import javax.swing.border.EmptyBorder;
025 import javax.swing.table.TableCellRenderer;
026 import javax.swing.tree.TreeCellRenderer;
027 
028 import gate.*;
029 import gate.creole.ResourceData;
030 
031 /**
032  * Renders a {@link Resource} for tables, trees and lists. It will use
033  * the icon info from the creole register, the name of the resource as
034  * the rendered string and the type of the resource as the tooltip.
035  */
036 public class ResourceRenderer extends JLabel implements ListCellRenderer,
037                                             TableCellRenderer, TreeCellRenderer {
038 
039   public ResourceRenderer() {
040     setOpaque(true);
041   }
042 
043   public Component getListCellRendererComponent(JList list, Object value,
044           int index, boolean isSelected, boolean cellHasFocus) {
045     prepareRendererList(list, value, isSelected, hasFocus());
046     return this;
047   }
048 
049   public Component getTableCellRendererComponent(JTable table, Object value,
050           boolean isSelected, boolean hasFocus, int row, int column) {
051     prepareRendererTable(table, value, isSelected, hasFocus, row, column);
052     return this;
053   }
054 
055   public Component getTreeCellRendererComponent(JTree tree, Object value,
056           boolean selected, boolean expanded, boolean leaf, int row,
057           boolean hasFocus) {
058     prepareRendererTree(tree, value, selected, hasFocus);
059     return this;
060   }
061 
062   private void prepareRendererTable(JTable table, Object value,
063           boolean isSelected, boolean hasFocus, int row, int column) {
064     setName("Table.cellRenderer");
065     if(isSelected) {
066       super.setForeground(table.getSelectionForeground());
067       super.setBackground(table.getSelectionBackground());
068     }
069     else {
070       Color background = table.getBackground();
071       if(background == null
072               || background instanceof javax.swing.plaf.UIResource) {
073 //        Color alternateColor = DefaultLookup.getColor(this, ui,
074 //                "Table.alternateRowColor");
075         Color alternateColor = UIManager.getColor("Table.alternateRowColor");
076         
077         if(alternateColor != null && row % == 0background = alternateColor;
078       }
079       super.setForeground(table.getForeground());
080       super.setBackground(background);
081     }
082 
083     if(hasFocus) {
084       Border border = null;
085       if(isSelected) {
086         border = UIManager.getBorder("Table.focusSelectedCellHighlightBorder");
087       }
088       if(border == null) {
089         border = UIManager.getBorder("Table.focusCellHighlightBorder");
090       }
091       setBorder(border);
092     }
093     else {
094       setBorder(UIManager.getBorder("Table.cellNoFocusBorder"));
095     }
096 
097     prepareRendererCommon(table, value, isSelected, hasFocus);
098   }
099 
100   private void prepareRendererList(JList list, Object value,
101           boolean isSelected, boolean hasFocus) {
102     if(isSelected) {
103       setForeground(list.getSelectionForeground());
104       setBackground(list.getSelectionBackground());
105     }
106     else {
107       setForeground(list.getForeground());
108       setBackground(list.getBackground());
109     }
110     prepareRendererCommon(list, value, isSelected, hasFocus);
111   }
112 
113   private void prepareRendererTree(JTree tree, Object value,
114           boolean isSelected, boolean hasFocus) {
115     if(isSelected) {
116       setForeground(UIManager.getColor("Tree.selectionForeground"));
117       setBackground(UIManager.getColor("Tree.selectionBackground"));
118     }
119     else {
120       setForeground(tree.getForeground());
121       setBackground(tree.getBackground());
122     }
123     prepareRendererCommon(tree, value, isSelected, hasFocus);
124   }
125 
126   private void prepareRendererCommon(JComponent ownerComponent, Object value,
127           boolean isSelected, boolean hasFocus) {
128 
129     setFont(ownerComponent.getFont());
130 
131     String text;
132     String toolTipText;
133     Icon icon;
134     ResourceData rData = null;
135     if(value instanceof Resource) {
136       text = ((Resource)value).getName();
137 
138       rData = (ResourceData)Gate.getCreoleRegister().get(
139               value.getClass().getName());
140     }
141     else {
142       text = (value == null"<null>" : value.toString();
143       if(value == nullsetForeground(Color.red);
144     }
145     if(rData != null) {
146       toolTipText = "<HTML>Type: <b>" + rData.getName() "</b></HTML>";
147       String iconName = rData.getIcon();
148       if(iconName == null) {
149         if(value instanceof LanguageResource)
150           iconName = "lr";
151         else if(value instanceof ProcessingResource)
152           iconName = "pr";
153         else if(value instanceof ControllericonName = "application";
154       }
155       icon = (iconName == nullnull : MainFrame.getIcon(iconName);
156     }
157     else {
158       icon = null;
159       toolTipText = null;
160     }
161 
162     setText(text);
163     setIcon(icon);
164     setToolTipText(toolTipText);
165   }
166 
167   
168   @Override
169   public Dimension getMaximumSize() {
170     //we don't mind being extended horizontally
171     Dimension dim = super.getMaximumSize();
172     if(dim != null){
173       dim.width = Integer.MAX_VALUE;
174       setMaximumSize(dim);
175     }
176     return dim;
177   }
178 
179   @Override
180   public Dimension getMinimumSize() {
181     //we don't like being squashed!
182     return getPreferredSize();
183   }
184   /*
185    * The following methods are overridden as a performance measure to to
186    * prune code-paths are often called in the case of renders but which
187    * we know are unnecessary. Great care should be taken when writing
188    * your own renderer to weigh the benefits and drawbacks of overriding
189    * methods like these.
190    */
191 
192   /**
193    * Overridden for performance reasons.
194    */
195   public boolean isOpaque() {
196     Color back = getBackground();
197     Component p = getParent();
198     if(p != null) {
199       p = p.getParent();
200     }
201 
202     // p should now be the JTable.
203     boolean colorMatch = (back != null&& (p != null)
204             && back.equals(p.getBackground()) && p.isOpaque();
205     return !colorMatch && super.isOpaque();
206   }
207 
208   /**
209    * Overridden for performance reasons.
210    */
211   public void invalidate() {
212   }
213 
214   /**
215    * Overridden for performance reasons.
216    */
217   public void validate() {
218   }
219 
220   /**
221    * Overridden for performance reasons.
222    */
223   public void revalidate() {
224   }
225 
226   /**
227    * Overridden for performance reasons.
228    */
229   public void repaint(long tm, int x, int y, int width, int height) {
230   }
231 
232   /**
233    * Overridden for performance reasons.
234    */
235   public void repaint(Rectangle r) {
236   }
237 
238   /**
239    * Overridden for performance reasons.
240    */
241   public void repaint() {
242   }
243 
244 }