APIdia Launch Partner
Top Description Fields Constructors Methods
java.awt.font

public final Class TextMeasurer

extends Object
implements Cloneable
Class Inheritance
All Implemented Interfaces
java.lang.Cloneable
Imports
java.awt.Font, java.text.AttributedCharacterIterator, .AttributedCharacterIterator.Attribute, .AttributedString, .Bidi, .BreakIterator, .CharacterIterator, java.awt.font.FontRenderContext, java.util.Hashtable, .Map, sun.font.AttributeValues, .BidiUtils, .TextLineComponent, .TextLabelFactory, .FontResolver

The TextMeasurer class provides the primitive operations needed for line break: measuring up to a given advance, determining the advance of a range of characters, and generating a TextLayout for a range of characters. It also provides methods for incremental editing of paragraphs.

A TextMeasurer object is constructed with an AttributedCharacterIterator representing a single paragraph of text. The value returned by the getBeginIndex method of AttributedCharacterIterator defines the absolute index of the first character. The value returned by the getEndIndex method of AttributedCharacterIterator defines the index past the last character. These values define the range of indexes to use in calls to the TextMeasurer. For example, calls to get the advance of a range of text or the line break of a range of text must use indexes between the beginning and end index values. Calls to insertChar and deleteChar reset the TextMeasurer to use the beginning index and end index of the AttributedCharacterIterator passed in those calls.

Most clients will use the more convenient LineBreakMeasurer, which implements the standard line break policy (placing as many words as will fit on each line).

Author
John Raley
Since
1.3
See Also
LineBreakMeasurer

Field Summary

Modifier and TypeField and Description
private CharArrayIterator
private boolean
private static float
private byte
private float[]
private Bidi
private char[]
private int
private TextLineComponent[]
private int
private FontRenderContext
private boolean
private float
private byte[]
private BreakIterator
private int
private StyledParagraph
private int
private boolean
pack-priv int
pack-priv int
private static boolean

Constructor Summary

AccessConstructor and Description
public
TextMeasurer(AttributedCharacterIterator
the source paragraph. Cannot be null.
text
,
FontRenderContext
the information about a graphics device which is needed to measure the text correctly. Cannot be null.
frc
)

Constructs a TextMeasurer from the source text.

Method Summary

Modifier and TypeMethod and Description
private int
calcLineBreak(final int pos, final float maxAdvance)

protected Object
clone()

Overrides java.lang.Object.clone.

Creates and returns a copy of this object.

public void
deleteChar(AttributedCharacterIterator
the text of the paragraph after performing the deletion. Cannot be null.
newParagraph
,
int
the position in the text where the character was removed. Must not be less than the start of newParagraph, and must not be greater than the end of newParagraph.
deletePos
)

Updates the TextMeasurer after a single character has been deleted from the paragraph currently represented by this TextMeasurer.

private void
ensureComponents(int start, int limit)

private void
generateComponents(int startingAt, int endingAt)

Generate components for the paragraph.

public float

Returns:

the graphical width of a line beginning at start and including characters up to limit
getAdvanceBetween
(int
the character index at which to start measuring
start
,
int
the character index at which to stop measuring
limit
)

Returns the graphical width of a line beginning at start and including characters up to limit.

pack-priv char[]
getChars()

Note

This method is only for LineBreakMeasurer's use.

public TextLayout

Returns:

a TextLayout for the characters beginning at start up to (but not including) limit
getLayout
(int
the index of the first character
start
,
int
the index after the last character. Must be greater than start
limit
)

Returns a TextLayout on the given character range.

public int

Returns:

the index after the last character that will fit on a line beginning at start, which is not longer than maxAdvance in graphical width
getLineBreakIndex
(int
the character index at which to start measuring. start is an absolute index, not relative to the start of the paragraph
start
,
float
the graphical width in which the line must fit
maxAdvance
)

Returns the index of the first character which will not fit on on a line beginning at start and possible measuring up to maxAdvance in graphical width.

private void
initAll(AttributedCharacterIterator text)

Initialize state, including fChars array, direction, and fBidi.

public void
insertChar(AttributedCharacterIterator
the text of the paragraph after performing the insertion. Cannot be null.
newParagraph
,
int
the position in the text where the character was inserted. Must not be less than the start of newParagraph, and must be less than the end of newParagraph.
insertPos
)

Updates the TextMeasurer after a single character has been inserted into the paragraph currently represented by this TextMeasurer.

private void
private TextLineComponent[]
makeComponentsOnRange(int startPos, int limitPos)

private void
makeLayoutWindow(int localStart)

private TextLine
makeTextLineOnRange(int startPos, int limitPos)

private void
private int
trailingCdWhitespaceStart(int startPos, int limitPos)

According to the Unicode Bidirectional Behavior specification (Unicode Standard 2.0, section 3.11), whitespace at the ends of lines which would naturally flow against the base direction must be made to flow with the line direction, and moved to the end of the line.

Inherited from java.lang.Object:
equalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

Field Detail

charIterback to summary
private CharArrayIterator charIter
collectStatsback to summary
private boolean collectStats
EST_LINESback to summary
private static float EST_LINES
fBaselineback to summary
private byte fBaseline
fBaselineOffsetsback to summary
private float[] fBaselineOffsets
fBidiback to summary
private Bidi fBidi
fCharsback to summary
private char[] fChars
fComponentLimitback to summary
private int fComponentLimit
fComponentsback to summary
private TextLineComponent[] fComponents
fComponentStartback to summary
private int fComponentStart
fFrcback to summary
private FontRenderContext fFrc
fIsDirectionLTRback to summary
private boolean fIsDirectionLTR
fJustifyRatioback to summary
private float fJustifyRatio
fLevelsback to summary
private byte[] fLevels
fLineBreakback to summary
private BreakIterator fLineBreak
formattedCharsback to summary
private int formattedChars
fParagraphback to summary
private StyledParagraph fParagraph
fStartback to summary
private int fStart
haveLayoutWindowback to summary
private boolean haveLayoutWindow
layoutCharCountback to summary
pack-priv int layoutCharCount
layoutCountback to summary
pack-priv int layoutCount
wantStatsback to summary
private static boolean wantStats

Constructor Detail

TextMeasurerback to summary
public TextMeasurer(AttributedCharacterIterator text, FontRenderContext frc)

Constructs a TextMeasurer from the source text. The source text should be a single entire paragraph.

Parameters
text:AttributedCharacterIterator

the source paragraph. Cannot be null.

frc:FontRenderContext

the information about a graphics device which is needed to measure the text correctly. Cannot be null.

Method Detail

calcLineBreakback to summary
private int calcLineBreak(final int pos, final float maxAdvance)
cloneback to summary
protected Object clone()

Overrides java.lang.Object.clone.

Doc from java.lang.Object.clone.

Creates and returns a copy of this object. The precise meaning of "copy" may depend on the class of the object. The general intent is that, for any object x, the expression:

x.clone() != x
will be true, and that the expression:
x.clone().getClass() == x.getClass()
will be true, but these are not absolute requirements. While it is typically the case that:
x.clone().equals(x)
will be true, this is not an absolute requirement.

By convention, the returned object should be obtained by calling super.clone. If a class and all of its superclasses (except Object) obey this convention, it will be the case that x.clone().getClass() == x.getClass().

By convention, the object returned by this method should be independent of this object (which is being cloned). To achieve this independence, it may be necessary to modify one or more fields of the object returned by super.clone before returning it. Typically, this means copying any mutable objects that comprise the internal "deep structure" of the object being cloned and replacing the references to these objects with references to the copies. If a class contains only primitive fields or references to immutable objects, then it is usually the case that no fields in the object returned by super.clone need to be modified.

deleteCharback to summary
public void deleteChar(AttributedCharacterIterator newParagraph, int deletePos)

Updates the TextMeasurer after a single character has been deleted from the paragraph currently represented by this TextMeasurer. After this call, this TextMeasurer is equivalent to a new TextMeasurer created from the text; however, it will usually be more efficient to update an existing TextMeasurer than to create a new one from scratch.

Parameters
newParagraph:AttributedCharacterIterator

the text of the paragraph after performing the deletion. Cannot be null.

deletePos:int

the position in the text where the character was removed. Must not be less than the start of newParagraph, and must not be greater than the end of newParagraph.

Exceptions
IndexOutOfBoundsException:
if deletePos is less than the start of newParagraph or greater than the end of newParagraph
NullPointerException:
if newParagraph is null
ensureComponentsback to summary
private void ensureComponents(int start, int limit)
generateComponentsback to summary
private void generateComponents(int startingAt, int endingAt)

Generate components for the paragraph. fChars, fBidi should have been initialized already.

getAdvanceBetweenback to summary
public float getAdvanceBetween(int start, int limit)

Returns the graphical width of a line beginning at start and including characters up to limit. start and limit are absolute indices, not relative to the start of the paragraph.

Parameters
start:int

the character index at which to start measuring

limit:int

the character index at which to stop measuring

Returns:float

the graphical width of a line beginning at start and including characters up to limit

Exceptions
IndexOutOfBoundsException:
if limit is less than start
IllegalArgumentException:
if start or limit is not between the beginning of the paragraph and the end of the paragraph.
getCharsback to summary
pack-priv char[] getChars()

Note

This method is only for LineBreakMeasurer's use. It is package- private because it returns internal data.

getLayoutback to summary
public TextLayout getLayout(int start, int limit)

Returns a TextLayout on the given character range.

Parameters
start:int

the index of the first character

limit:int

the index after the last character. Must be greater than start

Returns:TextLayout

a TextLayout for the characters beginning at start up to (but not including) limit

Exceptions
IndexOutOfBoundsException:
if limit is less than start
IllegalArgumentException:
if start or limit is not between the beginning of the paragraph and the end of the paragraph.
getLineBreakIndexback to summary
public int getLineBreakIndex(int start, float maxAdvance)

Returns the index of the first character which will not fit on on a line beginning at start and possible measuring up to maxAdvance in graphical width.

Parameters
start:int

the character index at which to start measuring. start is an absolute index, not relative to the start of the paragraph

maxAdvance:float

the graphical width in which the line must fit

Returns:int

the index after the last character that will fit on a line beginning at start, which is not longer than maxAdvance in graphical width

Exceptions
IllegalArgumentException:
if start is less than the beginning of the paragraph.
initAllback to summary
private void initAll(AttributedCharacterIterator text)

Initialize state, including fChars array, direction, and fBidi.

insertCharback to summary
public void insertChar(AttributedCharacterIterator newParagraph, int insertPos)

Updates the TextMeasurer after a single character has been inserted into the paragraph currently represented by this TextMeasurer. After this call, this TextMeasurer is equivalent to a new TextMeasurer created from the text; however, it will usually be more efficient to update an existing TextMeasurer than to create a new one from scratch.

Parameters
newParagraph:AttributedCharacterIterator

the text of the paragraph after performing the insertion. Cannot be null.

insertPos:int

the position in the text where the character was inserted. Must not be less than the start of newParagraph, and must be less than the end of newParagraph.

Exceptions
IndexOutOfBoundsException:
if insertPos is less than the start of newParagraph or greater than or equal to the end of newParagraph
NullPointerException:
if newParagraph is null
invalidateComponentsback to summary
private void invalidateComponents()
makeComponentsOnRangeback to summary
private TextLineComponent[] makeComponentsOnRange(int startPos, int limitPos)
makeLayoutWindowback to summary
private void makeLayoutWindow(int localStart)
makeTextLineOnRangeback to summary
private TextLine makeTextLineOnRange(int startPos, int limitPos)
printStatsback to summary
private void printStats()
trailingCdWhitespaceStartback to summary
private int trailingCdWhitespaceStart(int startPos, int limitPos)

According to the Unicode Bidirectional Behavior specification (Unicode Standard 2.0, section 3.11), whitespace at the ends of lines which would naturally flow against the base direction must be made to flow with the line direction, and moved to the end of the line. This method returns the start of the sequence of trailing whitespace characters to move to the end of a line taken from the given range.