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 % 2 == 0) background = 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 == null) setForeground(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 Controller) iconName = "application";
154 }
155 icon = (iconName == null) ? null : 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 }
|