blob: 3da43c340e484313d53a240a2e673e8c136d5d39 [file] [log] [blame]
/*
* 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;
}