jdk/src/share/classes/javax/swing/text/html/InlineView.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/html/InlineView.java	Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,225 @@
+/*
+ * Copyright 1998-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.html;
+
+import java.awt.*;
+import java.text.BreakIterator;
+import javax.swing.event.DocumentEvent;
+import javax.swing.text.*;
+
+/**
+ * Displays the <dfn>inline element</dfn> styles
+ * based upon css attributes.
+ *
+ * @author  Timothy Prinzing
+ */
+public class InlineView extends LabelView {
+
+    /**
+     * Constructs a new view wrapped on an element.
+     *
+     * @param elem the element
+     */
+    public InlineView(Element elem) {
+        super(elem);
+        StyleSheet sheet = getStyleSheet();
+        attr = sheet.getViewAttributes(this);
+    }
+
+    /**
+     * Gives notification that something was inserted into
+     * the document in a location that this view is responsible for.
+     * If either parameter is <code>null</code>, behavior of this method is
+     * implementation dependent.
+     *
+     * @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
+     * @since 1.5
+     * @see View#insertUpdate
+     */
+    public void insertUpdate(DocumentEvent e, Shape a, ViewFactory f) {
+        super.insertUpdate(e, a, f);
+    }
+
+    /**
+     * Gives notification that something was removed from the document
+     * in a location that this view is responsible for.
+     * If either parameter is <code>null</code>, behavior of this method is
+     * implementation dependent.
+     *
+     * @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
+     * @since 1.5
+     * @see View#removeUpdate
+     */
+    public void removeUpdate(DocumentEvent e, Shape a, ViewFactory f) {
+        super.removeUpdate(e, a, f);
+    }
+
+    /**
+     * 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) {
+        super.changedUpdate(e, a, f);
+        StyleSheet sheet = getStyleSheet();
+        attr = sheet.getViewAttributes(this);
+        preferenceChanged(null, true, true);
+    }
+
+    /**
+     * Fetches the attributes to use when rendering.  This is
+     * implemented to multiplex the attributes specified in the
+     * model with a StyleSheet.
+     */
+    public AttributeSet getAttributes() {
+        return attr;
+    }
+
+    /**
+     * Determines how attractive a break opportunity in
+     * this view is.  This can be used for determining which
+     * view is the most attractive to call <code>breakView</code>
+     * on in the process of formatting.  A view that represents
+     * text that has whitespace in it might be more attractive
+     * than a view that has no whitespace, for example.  The
+     * higher the weight, the more attractive the break.  A
+     * value equal to or lower than <code>BadBreakWeight</code>
+     * should not be considered for a break.  A value greater
+     * than or equal to <code>ForcedBreakWeight</code> should
+     * be broken.
+     * <p>
+     * This is implemented to provide the default behavior
+     * of returning <code>BadBreakWeight</code> unless the length
+     * is greater than the length of the view in which case the
+     * entire view represents the fragment.  Unless a view has
+     * been written to support breaking behavior, it is not
+     * attractive to try and break the view.  An example of
+     * a view that does support breaking is <code>LabelView</code>.
+     * An example of a view that uses break weight is
+     * <code>ParagraphView</code>.
+     *
+     * @param axis may be either View.X_AXIS or View.Y_AXIS
+     * @param pos the potential location of the start of the
+     *   broken view >= 0.  This may be useful for calculating tab
+     *   positions.
+     * @param len specifies the relative length from <em>pos</em>
+     *   where a potential break is desired >= 0.
+     * @return the weight, which should be a value between
+     *   ForcedBreakWeight and BadBreakWeight.
+     * @see LabelView
+     * @see ParagraphView
+     * @see javax.swing.text.View#BadBreakWeight
+     * @see javax.swing.text.View#GoodBreakWeight
+     * @see javax.swing.text.View#ExcellentBreakWeight
+     * @see javax.swing.text.View#ForcedBreakWeight
+     */
+    public int getBreakWeight(int axis, float pos, float len) {
+        if (nowrap) {
+            return BadBreakWeight;
+        }
+        return super.getBreakWeight(axis, pos, len);
+    }
+
+    /**
+     * Tries to break this view on the given axis. Refer to
+     * {@link javax.swing.text.View#breakView} for a complete
+     * description of this method.
+     * <p>Behavior of this method is unspecified in case <code>axis</code>
+     * is neither <code>View.X_AXIS</code> nor <code>View.Y_AXIS</code>, and
+     * in case <code>offset</code>, <code>pos</code>, or <code>len</code>
+     * is null.
+     *
+     * @param axis may be either <code>View.X_AXIS</code> or
+     *          <code>View.Y_AXIS</code>
+     * @param offset the location in the document model
+     *   that a broken fragment would occupy >= 0.  This
+     *   would be the starting offset of the fragment
+     *   returned
+     * @param pos the position along the axis that the
+     *  broken view would occupy >= 0.  This may be useful for
+     *  things like tab calculations
+     * @param len specifies the distance along the axis
+     *  where a potential break is desired >= 0
+     * @return the fragment of the view that represents the
+     *  given span.
+     * @since 1.5
+     * @see javax.swing.text.View#breakView
+     */
+    public View breakView(int axis, int offset, float pos, float len) {
+        return super.breakView(axis, offset, pos, len);
+    }
+
+
+    /**
+     * Set the cached properties from the attributes.
+     */
+    protected void setPropertiesFromAttributes() {
+        super.setPropertiesFromAttributes();
+        AttributeSet a = getAttributes();
+        Object decor = a.getAttribute(CSS.Attribute.TEXT_DECORATION);
+        boolean u = (decor != null) ?
+          (decor.toString().indexOf("underline") >= 0) : false;
+        setUnderline(u);
+        boolean s = (decor != null) ?
+          (decor.toString().indexOf("line-through") >= 0) : false;
+        setStrikeThrough(s);
+        Object vAlign = a.getAttribute(CSS.Attribute.VERTICAL_ALIGN);
+        s = (vAlign != null) ? (vAlign.toString().indexOf("sup") >= 0) : false;
+        setSuperscript(s);
+        s = (vAlign != null) ? (vAlign.toString().indexOf("sub") >= 0) : false;
+        setSubscript(s);
+
+        Object whitespace = a.getAttribute(CSS.Attribute.WHITE_SPACE);
+        if ((whitespace != null) && whitespace.equals("nowrap")) {
+            nowrap = true;
+        } else {
+            nowrap = false;
+        }
+
+        HTMLDocument doc = (HTMLDocument)getDocument();
+        // fetches background color from stylesheet if specified
+        Color bg = doc.getBackground(a);
+        if (bg != null) {
+            setBackground(bg);
+        }
+    }
+
+
+    protected StyleSheet getStyleSheet() {
+        HTMLDocument doc = (HTMLDocument) getDocument();
+        return doc.getStyleSheet();
+    }
+
+    private boolean nowrap;
+    private AttributeSet attr;
+}