/*
* @(#)LabelView.java 1.68 04/06/28
*
* Copyright 2004 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package javax.swing.text;
import java.awt.*;
import javax.swing.event.*;
/**
* A LabelView
is a styled chunk of text
* that represents a view mapped over an element in the
* text model. It caches the character level attributes
* used for rendering.
*
* @author Timothy Prinzing
* @version 1.68 06/28/04
*/
public class LabelView extends GlyphView implements TabableView {
/**
* Constructs a new view wrapped on an element.
*
* @param elem the element
*/
public LabelView(Element elem) {
super(elem);
}
/**
* Synchronize the view's cached values with the model.
* This causes the font, metrics, color, etc to be
* re-cached if the cache has been invalidated.
*/
final void sync() {
if (font == null) {
setPropertiesFromAttributes();
}
}
/**
* Sets whether or not the view is underlined.
* Note that this setter is protected and is really
* only meant if you need to update some additional
* state when set.
*
* @param u true if the view is underlined, otherwise
* false
* @see #isUnderline
*/
protected void setUnderline(boolean u) {
underline = u;
}
/**
* Sets whether or not the view has a strike/line
* through it.
* Note that this setter is protected and is really
* only meant if you need to update some additional
* state when set.
*
* @param s true if the view has a strike/line
* through it, otherwise false
* @see #isStrikeThrough
*/
protected void setStrikeThrough(boolean s) {
strike = s;
}
/**
* Sets whether or not the view represents a
* superscript.
* Note that this setter is protected and is really
* only meant if you need to update some additional
* state when set.
*
* @param s true if the view represents a
* superscript, otherwise false
* @see #isSuperscript
*/
protected void setSuperscript(boolean s) {
superscript = s;
}
/**
* Sets whether or not the view represents a
* subscript.
* Note that this setter is protected and is really
* only meant if you need to update some additional
* state when set.
*
* @param s true if the view represents a
* subscript, otherwise false
* @see #isSubscript
*/
protected void setSubscript(boolean s) {
subscript = s;
}
/**
* Sets the background color for the view. This method is typically
* invoked as part of configuring this View
. If you need
* to customize the background color you should override
* setPropertiesFromAttributes
and invoke this method. A
* value of null indicates no background should be rendered, so that the
* background of the parent View
will show through.
*
* @param bg background color, or null
* @see #setPropertiesFromAttributes
* @since 1.5
*/
protected void setBackground(Color bg) {
this.bg = bg;
}
/**
* Sets the cached properties from the attributes.
*/
protected void setPropertiesFromAttributes() {
AttributeSet attr = getAttributes();
if (attr != null) {
Document d = getDocument();
if (d instanceof StyledDocument) {
StyledDocument doc = (StyledDocument) d;
font = doc.getFont(attr);
fg = doc.getForeground(attr);
if (attr.isDefined(StyleConstants.Background)) {
bg = doc.getBackground(attr);
} else {
bg = null;
}
setUnderline(StyleConstants.isUnderline(attr));
setStrikeThrough(StyleConstants.isStrikeThrough(attr));
setSuperscript(StyleConstants.isSuperscript(attr));
setSubscript(StyleConstants.isSubscript(attr));
} else {
throw new StateInvariantError("LabelView needs StyledDocument");
}
}
}
/**
* Fetches the FontMetrics
used for this view.
* @deprecated FontMetrics are not used for glyph rendering
* when running in the JDK.
*/
@Deprecated
protected FontMetrics getFontMetrics() {
sync();
Container c = getContainer();
return (c != null) ? c.getFontMetrics(font) :
Toolkit.getDefaultToolkit().getFontMetrics(font);
}
/**
* Fetches the background color to use to render the glyphs.
* This is implemented to return a cached background color,
* which defaults to null
.
*
* @return the cached background color
*/
public Color getBackground() {
sync();
return bg;
}
/**
* Fetches the foreground color to use to render the glyphs.
* This is implemented to return a cached foreground color,
* which defaults to null
.
*
* @return the cached foreground color
*/
public Color getForeground() {
sync();
return fg;
}
/**
* Fetches the font that the glyphs should be based upon.
* This is implemented to return a cached font.
*
* @return the cached font
*/
public Font getFont() {
sync();
return font;
}
/**
* Determines if the glyphs should be underlined. If true,
* an underline should be drawn through the baseline. This
* is implemented to return the cached underline property.
*
*
When you request this property, LabelView
* re-syncs its state with the properties of the
* Element
's AttributeSet
.
* If Element
's AttributeSet
* does not have this property set, it will revert to false.
*
* @return the value of the cached
* underline
property
*/
public boolean isUnderline() {
sync();
return underline;
}
/**
* Determines if the glyphs should have a strikethrough
* line. If true, a line should be drawn through the center
* of the glyphs. This is implemented to return the
* cached strikeThrough
property.
*
*
When you request this property, LabelView
* re-syncs its state with the properties of the
* Element
's AttributeSet
.
* If Element
's AttributeSet
* does not have this property set, it will revert to false.
*
* @return the value of the cached
* strikeThrough
property
*/
public boolean isStrikeThrough() {
sync();
return strike;
}
/**
* Determines if the glyphs should be rendered as superscript.
* @return the value of the cached subscript property
*
*
When you request this property, LabelView
* re-syncs its state with the properties of the
* Element
's AttributeSet
.
* If Element
's AttributeSet
* does not have this property set, it will revert to false.
*
* @return the value of the cached
* subscript
property
*/
public boolean isSubscript() {
sync();
return subscript;
}
/**
* Determines if the glyphs should be rendered as subscript.
*
*
When you request this property, LabelView
* re-syncs its state with the properties of the
* Element
's AttributeSet
.
* If Element
's AttributeSet
* does not have this property set, it will revert to false.
*
* @return the value of the cached
* superscript
property
*/
public boolean isSuperscript() {
sync();
return superscript;
}
// --- View methods ---------------------------------------------
/**
* Gives notification from the document that attributes were changed
* in a location that this view is responsible for.
*
* @param e the change information from the associated document
* @param a the current allocation of the view
* @param f the factory to use to rebuild if the view has children
* @see View#changedUpdate
*/
public void changedUpdate(DocumentEvent e, Shape a, ViewFactory f) {
font = null;
super.changedUpdate(e, a, f);
}
// --- variables ------------------------------------------------
private Font font;
private Color fg;
private Color bg;
private boolean underline;
private boolean strike;
private boolean superscript;
private boolean subscript;
}