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