jdk/src/share/classes/javax/swing/text/LabelView.java
changeset 2 90ce3da70b43
child 5506 202f599c92aa
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/javax/swing/text/LabelView.java	Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,316 @@
+/*
+ * Copyright 1997-2006 Sun Microsystems, Inc.  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.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.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;
+
+}