/* | 
|
 * Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved. | 
|
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 
|
 * | 
|
 * This code is free software; you can redistribute it and/or modify it | 
|
 * under the terms of the GNU General Public License version 2 only, as | 
|
 * published by the Free Software Foundation.  Oracle designates this | 
|
 * particular file as subject to the "Classpath" exception as provided | 
|
 * by Oracle in the LICENSE file that accompanied this code. | 
|
 * | 
|
 * This code is distributed in the hope that it will be useful, but WITHOUT | 
|
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | 
|
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License | 
|
 * version 2 for more details (a copy is included in the LICENSE file that | 
|
 * accompanied this code). | 
|
 * | 
|
 * You should have received a copy of the GNU General Public License version | 
|
 * 2 along with this work; if not, write to the Free Software Foundation, | 
|
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | 
|
 * | 
|
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | 
|
 * or visit www.oracle.com if you need additional information or have any | 
|
 * questions. | 
|
*/  | 
|
package javax.swing.text;  | 
|
import java.awt.*;  | 
|
import javax.swing.event.*;  | 
|
/** | 
|
 * A <code>LabelView</code> 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 | 
|
*/  | 
|
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 <code>View</code>. If you need | 
|
     * to customize the background color you should override | 
|
     * <code>setPropertiesFromAttributes</code> and invoke this method. A | 
|
     * value of null indicates no background should be rendered, so that the | 
|
     * background of the parent <code>View</code> 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 <code>FontMetrics</code> 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 <code>null</code>. | 
|
     * | 
|
     * @return the cached background color | 
|
     * @since 1.3 | 
|
*/  | 
|
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 <code>null</code>. | 
|
     * | 
|
     * @return the cached foreground color | 
|
     * @since 1.3 | 
|
*/  | 
|
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. | 
|
     * | 
|
     * <p>When you request this property, <code>LabelView</code> | 
|
     * re-syncs its state with the properties of the | 
|
     * <code>Element</code>'s <code>AttributeSet</code>. | 
|
     * If <code>Element</code>'s <code>AttributeSet</code> | 
|
     * does not have this property set, it will revert to false. | 
|
     * | 
|
     * @return the value of the cached | 
|
     *     <code>underline</code> property | 
|
     * @since 1.3 | 
|
*/  | 
|
    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 <code>strikeThrough</code> property. | 
|
     * | 
|
     * <p>When you request this property, <code>LabelView</code> | 
|
     * re-syncs its state with the properties of the | 
|
     * <code>Element</code>'s <code>AttributeSet</code>. | 
|
     * If <code>Element</code>'s <code>AttributeSet</code> | 
|
     * does not have this property set, it will revert to false. | 
|
     * | 
|
     * @return the value of the cached | 
|
     *     <code>strikeThrough</code> property | 
|
     * @since 1.3 | 
|
*/  | 
|
    public boolean isStrikeThrough() { | 
|
sync();  | 
|
return strike;  | 
|
}  | 
|
    /** | 
|
     * Determines if the glyphs should be rendered as superscript. | 
|
     * @return the value of the cached subscript property | 
|
     * | 
|
     * <p>When you request this property, <code>LabelView</code> | 
|
     * re-syncs its state with the properties of the | 
|
     * <code>Element</code>'s <code>AttributeSet</code>. | 
|
     * If <code>Element</code>'s <code>AttributeSet</code> | 
|
     * does not have this property set, it will revert to false. | 
|
     * | 
|
     * @return the value of the cached | 
|
     *     <code>subscript</code> property | 
|
     * @since 1.3 | 
|
*/  | 
|
    public boolean isSubscript() { | 
|
sync();  | 
|
return subscript;  | 
|
}  | 
|
    /** | 
|
     * Determines if the glyphs should be rendered as subscript. | 
|
     * | 
|
     * <p>When you request this property, <code>LabelView</code> | 
|
     * re-syncs its state with the properties of the | 
|
     * <code>Element</code>'s <code>AttributeSet</code>. | 
|
     * If <code>Element</code>'s <code>AttributeSet</code> | 
|
     * does not have this property set, it will revert to false. | 
|
     * | 
|
     * @return the value of the cached | 
|
     *     <code>superscript</code> property | 
|
     * @since 1.3 | 
|
*/  | 
|
    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;  | 
|
}  |