/* | 
|
 * Copyright (c) 1998, 2013, 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;  | 
|
}  |