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