1 /* 2 * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 package javax.swing.text.html; 26 27 import java.awt.*; 28 import java.text.BreakIterator; 29 import javax.swing.event.DocumentEvent; 30 import javax.swing.text.*; 31 32 /** 33 * Displays the <dfn>inline element</dfn> styles 34 * based upon css attributes. 35 * 36 * @author Timothy Prinzing 37 */ 38 public class InlineView extends LabelView { 39 40 /** 41 * Constructs a new view wrapped on an element. 42 * 43 * @param elem the element 44 */ 45 public InlineView(Element elem) { 46 super(elem); 47 StyleSheet sheet = getStyleSheet(); 48 attr = sheet.getViewAttributes(this); 49 } 50 51 /** 52 * Gives notification that something was inserted into 53 * the document in a location that this view is responsible for. 54 * If either parameter is {@code null}, behavior of this method is 55 * implementation dependent. 56 * 57 * @param e the change information from the associated document 58 * @param a the current allocation of the view 59 * @param f the factory to use to rebuild if the view has children 60 * @since 1.5 61 * @see View#insertUpdate 62 */ 63 public void insertUpdate(DocumentEvent e, Shape a, ViewFactory f) { 64 super.insertUpdate(e, a, f); 65 } 66 67 /** 68 * Gives notification that something was removed from the document 69 * in a location that this view is responsible for. 70 * If either parameter is {@code null}, behavior of this method is 71 * implementation dependent. 72 * 73 * @param e the change information from the associated document 74 * @param a the current allocation of the view 75 * @param f the factory to use to rebuild if the view has children 76 * @since 1.5 77 * @see View#removeUpdate 78 */ 79 public void removeUpdate(DocumentEvent e, Shape a, ViewFactory f) { 80 super.removeUpdate(e, a, f); 81 } 82 83 /** 84 * Gives notification from the document that attributes were changed 85 * in a location that this view is responsible for. 86 * 87 * @param e the change information from the associated document 88 * @param a the current allocation of the view 89 * @param f the factory to use to rebuild if the view has children 90 * @see View#changedUpdate 91 */ 92 public void changedUpdate(DocumentEvent e, Shape a, ViewFactory f) { 93 super.changedUpdate(e, a, f); 94 StyleSheet sheet = getStyleSheet(); 95 attr = sheet.getViewAttributes(this); 96 preferenceChanged(null, true, true); 97 } 98 99 /** 100 * Fetches the attributes to use when rendering. This is 101 * implemented to multiplex the attributes specified in the 102 * model with a StyleSheet. 103 */ 104 public AttributeSet getAttributes() { 105 return attr; 106 } 107 108 /** 109 * Determines how attractive a break opportunity in 110 * this view is. This can be used for determining which 111 * view is the most attractive to call {@code breakView} 112 * on in the process of formatting. A view that represents 113 * text that has whitespace in it might be more attractive 114 * than a view that has no whitespace, for example. The 115 * higher the weight, the more attractive the break. A 116 * value equal to or lower than {@code BadBreakWeight} 117 * should not be considered for a break. A value greater 118 * than or equal to {@code ForcedBreakWeight} should 119 * be broken. 120 * <p> 121 * This is implemented to provide the default behavior 122 * of returning {@code BadBreakWeight} unless the length 123 * is greater than the length of the view in which case the 124 * entire view represents the fragment. Unless a view has 125 * been written to support breaking behavior, it is not 126 * attractive to try and break the view. An example of 127 * a view that does support breaking is {@code LabelView}. 128 * An example of a view that uses break weight is 129 * {@code ParagraphView}. 130 * 131 * @param axis may be either View.X_AXIS or View.Y_AXIS 132 * @param pos the potential location of the start of the 133 * broken view >= 0. This may be useful for calculating tab 134 * positions. 135 * @param len specifies the relative length from <em>pos</em> 136 * where a potential break is desired >= 0. 137 * @return the weight, which should be a value between 138 * ForcedBreakWeight and BadBreakWeight. 139 * @see LabelView 140 * @see ParagraphView 141 * @see javax.swing.text.View#BadBreakWeight 142 * @see javax.swing.text.View#GoodBreakWeight 143 * @see javax.swing.text.View#ExcellentBreakWeight 144 * @see javax.swing.text.View#ForcedBreakWeight 145 */ 146 public int getBreakWeight(int axis, float pos, float len) { 147 if (nowrap) { 148 return BadBreakWeight; 149 } 150 return super.getBreakWeight(axis, pos, len); 151 } 152 153 /** 154 * Tries to break this view on the given axis. Refer to 155 * {@link javax.swing.text.View#breakView} for a complete 156 * description of this method. 157 * <p>Behavior of this method is unspecified in case {@code axis} 158 * is neither {@code View.X_AXIS} nor {@code View.Y_AXIS}, and 159 * in case {@code offset}, {@code pos}, or {@code len} 160 * is null. 161 * 162 * @param axis may be either {@code View.X_AXIS} or 163 * {@code View.Y_AXIS} 164 * @param offset the location in the document model 165 * that a broken fragment would occupy >= 0. This 166 * would be the starting offset of the fragment 167 * returned 168 * @param pos the position along the axis that the 169 * broken view would occupy >= 0. This may be useful for 170 * things like tab calculations 171 * @param len specifies the distance along the axis 172 * where a potential break is desired >= 0 173 * @return the fragment of the view that represents the 174 * given span. 175 * @since 1.5 176 * @see javax.swing.text.View#breakView 177 */ 178 public View breakView(int axis, int offset, float pos, float len) { 179 return super.breakView(axis, offset, pos, len); 180 } 181 182 183 /** 184 * Set the cached properties from the attributes. 185 */ 186 protected void setPropertiesFromAttributes() { 187 super.setPropertiesFromAttributes(); 188 AttributeSet a = getAttributes(); 189 Object decor = a.getAttribute(CSS.Attribute.TEXT_DECORATION); 190 boolean u = (decor != null) ? 191 (decor.toString().indexOf("underline") >= 0) : false; 192 setUnderline(u); 193 boolean s = (decor != null) ? 194 (decor.toString().indexOf("line-through") >= 0) : false; 195 setStrikeThrough(s); 196 Object vAlign = a.getAttribute(CSS.Attribute.VERTICAL_ALIGN); 197 s = (vAlign != null) ? (vAlign.toString().indexOf("sup") >= 0) : false; 198 setSuperscript(s); 199 s = (vAlign != null) ? (vAlign.toString().indexOf("sub") >= 0) : false; 200 setSubscript(s); 201 202 Object whitespace = a.getAttribute(CSS.Attribute.WHITE_SPACE); 203 if ((whitespace != null) && whitespace.equals("nowrap")) { 204 nowrap = true; 205 } else { 206 nowrap = false; 207 } 208 209 HTMLDocument doc = (HTMLDocument)getDocument(); 210 // fetches background color from stylesheet if specified 211 Color bg = doc.getBackground(a); 212 if (bg != null) { 213 setBackground(bg); 214 } 215 } 216 217 /** 218 * Convenient method to get the StyleSheet. 219 * 220 * @return the StyleSheet 221 */ 222 protected StyleSheet getStyleSheet() { 223 HTMLDocument doc = (HTMLDocument) getDocument(); 224 return doc.getStyleSheet(); 225 } 226 227 private boolean nowrap; 228 private AttributeSet attr; 229 } --- EOF ---