/* * 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;}
/*
* 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;
}