/* |
|
* Copyright (c) 1997, 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; |
|
import java.awt.*; |
|
import javax.swing.event.*; |
|
/** |
|
* A <code>LabelView</code> is a styled chunk of text |
|
* that represents a view mapped over an element in the |
|
* text model. It caches the character level attributes |
|
* used for rendering. |
|
* |
|
* @author Timothy Prinzing |
|
*/ |
|
public class LabelView extends GlyphView implements TabableView { |
|
/** |
|
* Constructs a new view wrapped on an element. |
|
* |
|
* @param elem the element |
|
*/ |
|
public LabelView(Element elem) { |
|
super(elem); |
|
} |
|
/** |
|
* Synchronize the view's cached values with the model. |
|
* This causes the font, metrics, color, etc to be |
|
* re-cached if the cache has been invalidated. |
|
*/ |
|
final void sync() { |
|
if (font == null) { |
|
setPropertiesFromAttributes(); |
|
} |
|
} |
|
/** |
|
* Sets whether or not the view is underlined. |
|
* Note that this setter is protected and is really |
|
* only meant if you need to update some additional |
|
* state when set. |
|
* |
|
* @param u true if the view is underlined, otherwise |
|
* false |
|
* @see #isUnderline |
|
*/ |
|
protected void setUnderline(boolean u) { |
|
underline = u; |
|
} |
|
/** |
|
* Sets whether or not the view has a strike/line |
|
* through it. |
|
* Note that this setter is protected and is really |
|
* only meant if you need to update some additional |
|
* state when set. |
|
* |
|
* @param s true if the view has a strike/line |
|
* through it, otherwise false |
|
* @see #isStrikeThrough |
|
*/ |
|
protected void setStrikeThrough(boolean s) { |
|
strike = s; |
|
} |
|
/** |
|
* Sets whether or not the view represents a |
|
* superscript. |
|
* Note that this setter is protected and is really |
|
* only meant if you need to update some additional |
|
* state when set. |
|
* |
|
* @param s true if the view represents a |
|
* superscript, otherwise false |
|
* @see #isSuperscript |
|
*/ |
|
protected void setSuperscript(boolean s) { |
|
superscript = s; |
|
} |
|
/** |
|
* Sets whether or not the view represents a |
|
* subscript. |
|
* Note that this setter is protected and is really |
|
* only meant if you need to update some additional |
|
* state when set. |
|
* |
|
* @param s true if the view represents a |
|
* subscript, otherwise false |
|
* @see #isSubscript |
|
*/ |
|
protected void setSubscript(boolean s) { |
|
subscript = s; |
|
} |
|
/** |
|
* Sets the background color for the view. This method is typically |
|
* invoked as part of configuring this <code>View</code>. If you need |
|
* to customize the background color you should override |
|
* <code>setPropertiesFromAttributes</code> and invoke this method. A |
|
* value of null indicates no background should be rendered, so that the |
|
* background of the parent <code>View</code> will show through. |
|
* |
|
* @param bg background color, or null |
|
* @see #setPropertiesFromAttributes |
|
* @since 1.5 |
|
*/ |
|
protected void setBackground(Color bg) { |
|
this.bg = bg; |
|
} |
|
/** |
|
* Sets the cached properties from the attributes. |
|
*/ |
|
protected void setPropertiesFromAttributes() { |
|
AttributeSet attr = getAttributes(); |
|
if (attr != null) { |
|
Document d = getDocument(); |
|
if (d instanceof StyledDocument) { |
|
StyledDocument doc = (StyledDocument) d; |
|
font = doc.getFont(attr); |
|
fg = doc.getForeground(attr); |
|
if (attr.isDefined(StyleConstants.Background)) { |
|
bg = doc.getBackground(attr); |
|
} else { |
|
bg = null; |
|
} |
|
setUnderline(StyleConstants.isUnderline(attr)); |
|
setStrikeThrough(StyleConstants.isStrikeThrough(attr)); |
|
setSuperscript(StyleConstants.isSuperscript(attr)); |
|
setSubscript(StyleConstants.isSubscript(attr)); |
|
} else { |
|
throw new StateInvariantError("LabelView needs StyledDocument"); |
|
} |
|
} |
|
} |
|
/** |
|
* Fetches the <code>FontMetrics</code> used for this view. |
|
* @deprecated FontMetrics are not used for glyph rendering |
|
* when running in the JDK. |
|
*/ |
|
@Deprecated |
|
protected FontMetrics getFontMetrics() { |
|
sync(); |
|
Container c = getContainer(); |
|
return (c != null) ? c.getFontMetrics(font) : |
|
Toolkit.getDefaultToolkit().getFontMetrics(font); |
|
} |
|
/** |
|
* Fetches the background color to use to render the glyphs. |
|
* This is implemented to return a cached background color, |
|
* which defaults to <code>null</code>. |
|
* |
|
* @return the cached background color |
|
* @since 1.3 |
|
*/ |
|
public Color getBackground() { |
|
sync(); |
|
return bg; |
|
} |
|
/** |
|
* Fetches the foreground color to use to render the glyphs. |
|
* This is implemented to return a cached foreground color, |
|
* which defaults to <code>null</code>. |
|
* |
|
* @return the cached foreground color |
|
* @since 1.3 |
|
*/ |
|
public Color getForeground() { |
|
sync(); |
|
return fg; |
|
} |
|
/** |
|
* Fetches the font that the glyphs should be based upon. |
|
* This is implemented to return a cached font. |
|
* |
|
* @return the cached font |
|
*/ |
|
public Font getFont() { |
|
sync(); |
|
return font; |
|
} |
|
/** |
|
* Determines if the glyphs should be underlined. If true, |
|
* an underline should be drawn through the baseline. This |
|
* is implemented to return the cached underline property. |
|
* |
|
* <p>When you request this property, <code>LabelView</code> |
|
* re-syncs its state with the properties of the |
|
* <code>Element</code>'s <code>AttributeSet</code>. |
|
* If <code>Element</code>'s <code>AttributeSet</code> |
|
* does not have this property set, it will revert to false. |
|
* |
|
* @return the value of the cached |
|
* <code>underline</code> property |
|
* @since 1.3 |
|
*/ |
|
public boolean isUnderline() { |
|
sync(); |
|
return underline; |
|
} |
|
/** |
|
* Determines if the glyphs should have a strikethrough |
|
* line. If true, a line should be drawn through the center |
|
* of the glyphs. This is implemented to return the |
|
* cached <code>strikeThrough</code> property. |
|
* |
|
* <p>When you request this property, <code>LabelView</code> |
|
* re-syncs its state with the properties of the |
|
* <code>Element</code>'s <code>AttributeSet</code>. |
|
* If <code>Element</code>'s <code>AttributeSet</code> |
|
* does not have this property set, it will revert to false. |
|
* |
|
* @return the value of the cached |
|
* <code>strikeThrough</code> property |
|
* @since 1.3 |
|
*/ |
|
public boolean isStrikeThrough() { |
|
sync(); |
|
return strike; |
|
} |
|
/** |
|
* Determines if the glyphs should be rendered as superscript. |
|
* @return the value of the cached subscript property |
|
* |
|
* <p>When you request this property, <code>LabelView</code> |
|
* re-syncs its state with the properties of the |
|
* <code>Element</code>'s <code>AttributeSet</code>. |
|
* If <code>Element</code>'s <code>AttributeSet</code> |
|
* does not have this property set, it will revert to false. |
|
* |
|
* @return the value of the cached |
|
* <code>subscript</code> property |
|
* @since 1.3 |
|
*/ |
|
public boolean isSubscript() { |
|
sync(); |
|
return subscript; |
|
} |
|
/** |
|
* Determines if the glyphs should be rendered as subscript. |
|
* |
|
* <p>When you request this property, <code>LabelView</code> |
|
* re-syncs its state with the properties of the |
|
* <code>Element</code>'s <code>AttributeSet</code>. |
|
* If <code>Element</code>'s <code>AttributeSet</code> |
|
* does not have this property set, it will revert to false. |
|
* |
|
* @return the value of the cached |
|
* <code>superscript</code> property |
|
* @since 1.3 |
|
*/ |
|
public boolean isSuperscript() { |
|
sync(); |
|
return superscript; |
|
} |
|
// --- View methods --------------------------------------------- |
|
/** |
|
* 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) { |
|
font = null; |
|
super.changedUpdate(e, a, f); |
|
} |
|
// --- variables ------------------------------------------------ |
|
private Font font; |
|
private Color fg; |
|
private Color bg; |
|
private boolean underline; |
|
private boolean strike; |
|
private boolean superscript; |
|
private boolean subscript; |
|
} |