225 lines · 8.5 KB · Java
RawDownload
/* * Copyright (c) 1998, 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.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;}