/* * Copyright (c) 1997, 2015, 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 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 */ 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. * @return 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 * @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 null. * * @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. * *

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 * @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 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 * @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 * *

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