001 /* LabelView.java -- A view to render styled text
002 Copyright (C) 2005 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.text;
040
041 import java.awt.Color;
042 import java.awt.Container;
043 import java.awt.Font;
044 import java.awt.FontMetrics;
045 import java.awt.Shape;
046 import java.awt.Toolkit;
047
048 import javax.swing.event.DocumentEvent;
049
050 /**
051 * A {@link GlyphView} that caches the textattributes for most effective
052 * rendering.
053 *
054 * @author Roman Kennke (kennke@aicas.com)
055 */
056 public class LabelView extends GlyphView
057 {
058
059 /**
060 * The background color.
061 */
062 Color background;
063
064 /**
065 * The foreground color.
066 */
067 Color foreground;
068
069 /**
070 * The background color.
071 */
072 Font font;
073
074 /**
075 * The strikethrough flag.
076 */
077 boolean strikeThrough;
078
079 /**
080 * The underline flag.
081 */
082 boolean underline;
083
084 /**
085 * The subscript flag.
086 */
087 boolean subscript;
088
089 /**
090 * The superscript flag.
091 */
092 boolean superscript;
093
094 /**
095 * Indicates if the attributes must be refetched.
096 */
097 private boolean valid;
098
099 /**
100 * Creates a new <code>GlyphView</code> for the given <code>Element</code>.
101 *
102 * @param element the element that is rendered by this GlyphView
103 */
104 public LabelView(Element element)
105 {
106 super(element);
107 valid = false;
108 }
109
110 /**
111 * Loads the properties of this label view from the element's text
112 * attributes. This method is called from the constructor and the
113 * {@link #changedUpdate} method
114 */
115 protected void setPropertiesFromAttributes()
116 {
117 AttributeSet atts = getAttributes();
118 setStrikeThrough(StyleConstants.isStrikeThrough(atts));
119 setSubscript(StyleConstants.isSubscript(atts));
120 setSuperscript(StyleConstants.isSuperscript(atts));
121 setUnderline(StyleConstants.isUnderline(atts));
122
123 // Determine the font and colors.
124 Document d = getDocument();
125 if (d instanceof StyledDocument)
126 {
127 StyledDocument doc = (StyledDocument) d;
128 font = doc.getFont(atts);
129 if (atts.isDefined(StyleConstants.Background))
130 background = doc.getBackground(atts);
131 else
132 background = null;
133 foreground = doc.getForeground(atts);
134 }
135 valid = true;
136 }
137
138 /**
139 * Receives notification when text attributes change in the chunk of
140 * text that this view is responsible for. This simply calls
141 * {@link #setPropertiesFromAttributes()}.
142 *
143 * @param e the document event
144 * @param a the allocation of this view
145 * @param vf the view factory to use for creating new views
146 */
147 public void changedUpdate(DocumentEvent e, Shape a, ViewFactory vf)
148 {
149 valid = false;
150 super.changedUpdate(e, a, vf);
151 }
152
153 /**
154 * Returns the background color for the glyphs.
155 *
156 * @return the background color for the glyphs
157 */
158 public Color getBackground()
159 {
160 if (! valid)
161 setPropertiesFromAttributes();
162 return background;
163 }
164
165 /**
166 * Sets the background color for the glyphs. A value of <code>null</code>
167 * means the background of the parent view should shine through.
168 *
169 * @param bg the background to set or <code>null</code>
170 *
171 * @since 1.5
172 */
173 protected void setBackground(Color bg)
174 {
175 background = bg;
176 }
177
178 /**
179 * Returns the foreground color for the glyphs.
180 *
181 * @return the foreground color for the glyphs
182 */
183 public Color getForeground()
184 {
185 if (! valid)
186 setPropertiesFromAttributes();
187 return foreground;
188 }
189
190 /**
191 * Returns the font for the glyphs.
192 *
193 * @return the font for the glyphs
194 */
195 public Font getFont()
196 {
197 if (! valid)
198 setPropertiesFromAttributes();
199 return font;
200 }
201
202 /**
203 * Returns the font metrics of the current font.
204 *
205 * @return the font metrics of the current font
206 *
207 * @deprecated this is not used anymore
208 */
209 protected FontMetrics getFontMetrics()
210 {
211 if (! valid)
212 setPropertiesFromAttributes();
213
214 Container c = getContainer();
215 FontMetrics fm;
216 if (c != null)
217 fm = c.getFontMetrics(font);
218 else
219 fm = Toolkit.getDefaultToolkit().getFontMetrics(font);
220 return fm;
221 }
222
223 /**
224 * Returns <code>true</code> if the glyphs are rendered underlined,
225 * <code>false</code> otherwise.
226 *
227 * @return <code>true</code> if the glyphs are rendered underlined,
228 * <code>false</code> otherwise
229 */
230 public boolean isUnderline()
231 {
232 if (! valid)
233 setPropertiesFromAttributes();
234 return underline;
235 }
236
237 /**
238 * Sets the underline flag.
239 *
240 * @param flag <code>true</code> if the glyphs are rendered underlined,
241 * <code>false</code> otherwise
242 */
243 protected void setUnderline(boolean flag)
244 {
245 underline = flag;
246 }
247
248 /**
249 * Returns <code>true</code> if the glyphs are rendered as subscript,
250 * <code>false</code> otherwise.
251 *
252 * @return <code>true</code> if the glyphs are rendered as subscript,
253 * <code>false</code> otherwise
254 */
255 public boolean isSubscript()
256 {
257 if (! valid)
258 setPropertiesFromAttributes();
259 return subscript;
260 }
261
262 /**
263 * Sets the subscript flag.
264 *
265 * @param flag <code>true</code> if the glyphs are rendered as subscript,
266 * <code>false</code> otherwise
267 */
268 protected void setSubscript(boolean flag)
269 {
270 subscript = flag;
271 }
272
273 /**
274 * Returns <code>true</code> if the glyphs are rendered as superscript,
275 * <code>false</code> otherwise.
276 *
277 * @return <code>true</code> if the glyphs are rendered as superscript,
278 * <code>false</code> otherwise
279 */
280 public boolean isSuperscript()
281 {
282 if (! valid)
283 setPropertiesFromAttributes();
284 return superscript;
285 }
286
287 /**
288 * Sets the superscript flag.
289 *
290 * @param flag <code>true</code> if the glyphs are rendered as superscript,
291 * <code>false</code> otherwise
292 */
293 protected void setSuperscript(boolean flag)
294 {
295 superscript = flag;
296 }
297
298 /**
299 * Returns <code>true</code> if the glyphs are rendered strike-through,
300 * <code>false</code> otherwise.
301 *
302 * @return <code>true</code> if the glyphs are rendered strike-through,
303 * <code>false</code> otherwise
304 */
305 public boolean isStrikeThrough()
306 {
307 if (! valid)
308 setPropertiesFromAttributes();
309 return strikeThrough;
310 }
311
312 /**
313 * Sets the strike-through flag.
314 *
315 * @param flag <code>true</code> if the glyphs are rendered strike-through,
316 * <code>false</code> otherwise
317 */
318 protected void setStrikeThrough(boolean flag)
319 {
320 strikeThrough = flag;
321 }
322 }