1:
37:
38:
39: package ;
40:
41: import ;
42: import ;
43: import ;
44: import ;
45:
46: public final class LineBreakMeasurer
47: {
48: private AttributedCharacterIterator text;
49: private int position;
50: private TextMeasurer tm;
51: private int numChars;
52:
53: public LineBreakMeasurer(AttributedCharacterIterator text,
54: BreakIterator breakIter, FontRenderContext frc)
55: {
56: this( text, frc );
57: }
58:
59: public LineBreakMeasurer(AttributedCharacterIterator text,
60: FontRenderContext frc)
61: {
62: this.text = text;
63: position = 0;
64: numChars = text.getEndIndex();
65: tm = new TextMeasurer( text, frc );
66: }
67:
68: public void deleteChar(AttributedCharacterIterator newParagraph,
69: int deletePos)
70: {
71: tm.deleteChar( newParagraph, deletePos );
72: position = 0;
73: }
74:
75: public void insertChar(AttributedCharacterIterator newParagraph,
76: int insertPos)
77: {
78: tm.insertChar( newParagraph, insertPos );
79: position = 0;
80: }
81:
82: public TextLayout nextLayout(float wrappingWidth)
83: {
84: return nextLayout( wrappingWidth, numChars, false );
85: }
86:
87: public TextLayout nextLayout(float wrappingWidth, int offsetLimit,
88: boolean requireNextWord)
89: {
90: int next = nextOffset( wrappingWidth, offsetLimit, requireNextWord );
91: TextLayout tl = tm.getLayout( position, next );
92: position = next;
93: return tl;
94: }
95:
96: public int nextOffset(float wrappingWidth)
97: {
98: return nextOffset( wrappingWidth, numChars, false );
99: }
100:
101: public int nextOffset(float wrappingWidth, int offsetLimit,
102: boolean requireNextWord)
103: {
104: int guessOffset = tm.getLineBreakIndex(position, wrappingWidth);
105: if( offsetLimit > numChars )
106: offsetLimit = numChars;
107:
108: if( guessOffset > offsetLimit )
109: {
110: text.setIndex( offsetLimit );
111: return offsetLimit;
112: }
113:
114: text.setIndex( guessOffset );
115:
116:
117: if( Character.isWhitespace( text.current() ) )
118: return guessOffset;
119:
120:
121: if( !requireNextWord )
122: while( !Character.isWhitespace( text.previous() ) &&
123: guessOffset > position )
124: guessOffset--;
125: else
126: while( !Character.isWhitespace( text.next() ) &&
127: guessOffset < offsetLimit )
128: guessOffset++;
129:
130: if( guessOffset > offsetLimit )
131: {
132: text.setIndex( offsetLimit );
133: return offsetLimit;
134: }
135:
136: text.setIndex( guessOffset );
137:
138: return guessOffset;
139: }
140:
141: public void setPosition(int newPosition)
142: {
143: position = newPosition;
144: }
145:
146: public int getPosition()
147: {
148: return position;
149: }
150: }