home *** CD-ROM | disk | FTP | other *** search
- package netscape.application;
-
- import netscape.util.ClassInfo;
- import netscape.util.Codable;
- import netscape.util.CodingException;
- import netscape.util.Decoder;
- import netscape.util.Encoder;
- import netscape.util.Hashtable;
- import netscape.util.InconsistencyException;
- import netscape.util.Vector;
-
- public class TextParagraph implements Cloneable, Codable {
- TextView _owner;
- TextParagraphFormat _format;
- Vector _runVector;
- // $FF: renamed from: _y int
- int field_0;
- int _height;
- int[] _lineBreaks;
- int _breakCount;
- int[] _lineHeights;
- int _heightCount;
- int[] _baselines;
- int _baselineCount;
- int[] _lineRemainders;
- int _remainderCount;
- int _charCount;
- int _startChar;
- static final String FORMAT_KEY = "format";
- static final String RUNVECTOR_KEY = "runVector";
-
- public TextParagraph() {
- }
-
- TextParagraph(TextView var1) {
- this();
- this.init(var1);
- }
-
- TextParagraph(TextView var1, TextParagraphFormat var2) {
- this();
- this.init(var1, var2);
- }
-
- void init(TextView var1, TextParagraphFormat var2) {
- this._owner = var1;
- this._runVector = new Vector();
- this.setFormat(var2);
- }
-
- void init(TextView var1) {
- this.init(var1, (TextParagraphFormat)null);
- }
-
- Object objectAt(Vector var1, int var2) {
- return var2 >= 0 && var2 < var1.count() ? var1.elementAt(var2) : null;
- }
-
- public Object clone() {
- Object var3 = null;
- this.collectEmptyRuns();
-
- try {
- var3 = super.clone();
- } catch (CloneNotSupportedException var7) {
- throw new InconsistencyException(this + ": clone() not supported :" + var7);
- }
-
- if (var3 != null) {
- TextParagraph var1 = (TextParagraph)var3;
- var1._owner = null;
- if (this._format != null) {
- var1._format = (TextParagraphFormat)this._format.clone();
- } else {
- var1._format = null;
- }
-
- var1._runVector = new Vector();
- int var5 = this._runVector.count();
-
- for(int var4 = 0; var4 < var5; ++var4) {
- TextStyleRun var2 = (TextStyleRun)this._runVector.elementAt(var4);
- var1.addRun(var2.createEmptyRun());
- }
-
- var1._lineBreaks = null;
- var1._lineHeights = null;
- var1._baselines = null;
- var1._lineRemainders = null;
- }
-
- return var3;
- }
-
- void setOwner(TextView var1) {
- this._owner = var1;
- }
-
- TextView owner() {
- return this._owner;
- }
-
- void setY(int var1) {
- this.field_0 = var1;
- }
-
- void setStartChar(int var1) {
- this._startChar = var1;
- }
-
- void setFormat(TextParagraphFormat var1) {
- if (var1 != null || this._format != null) {
- if (var1 != null) {
- this._format = (TextParagraphFormat)var1.clone();
- } else {
- this._format = null;
- }
-
- if (this._charCount > 0) {
- this.computeLineBreaksAndHeights(this._owner.bounds.width);
- }
-
- }
- }
-
- TextParagraphFormat format() {
- return this._format;
- }
-
- TextParagraphFormat currentParagraphFormat() {
- if (this._format != null) {
- return this._format;
- } else {
- TextParagraphFormat var1 = null;
- if (this._owner != null) {
- var1 = (TextParagraphFormat)this._owner.defaultAttributes().get("ParagraphFormatKey");
- }
-
- return var1 != null ? var1 : new TextParagraphFormat();
- }
- }
-
- Vector runVector() {
- return this._runVector;
- }
-
- TextStyleRun firstRun() {
- return (TextStyleRun)this._runVector.firstElement();
- }
-
- TextStyleRun lastRun() {
- return (TextStyleRun)this._runVector.lastElement();
- }
-
- void addRun(TextStyleRun var1) {
- if (var1 != null) {
- var1.setParagraph(this);
- this._runVector.addElement(var1);
- }
-
- }
-
- void collectEmptyRuns() {
- int var1 = 1;
-
- for(int var2 = this._runVector.count(); var1 < var2; ++var1) {
- TextStyleRun var3 = (TextStyleRun)this._runVector.elementAt(var1);
- if (var3.charCount() == 0 && (var3._attributes == null || var3._attributes.get("LinkDestinationKey") == null)) {
- this._runVector.removeElementAt(var1);
- --var1;
- --var2;
- }
- }
-
- }
-
- void addRuns(Vector var1) {
- if (var1 != null) {
- int var2 = var1.count();
-
- for(int var3 = 0; var3 < var2; ++var3) {
- this.addRun((TextStyleRun)var1.elementAt(var3));
- }
- }
-
- }
-
- void insertRunAt(TextStyleRun var1, int var2) {
- if (var1 != null && var2 >= 0) {
- var1.setParagraph(this);
- this._runVector.insertElementAt(var1, var2);
- }
-
- }
-
- TextStyleRun runBefore(TextStyleRun var1) {
- if (var1 == null) {
- return null;
- } else {
- int var2 = this._runVector.indexOfIdentical(var1);
- return var2 < 1 ? null : (TextStyleRun)this._runVector.elementAt(var2 - 1);
- }
- }
-
- TextStyleRun runAfter(TextStyleRun var1) {
- if (var1 == null) {
- return null;
- } else {
- int var2 = this._runVector.indexOfIdentical(var1);
- return var2 == this._runVector.count() - 1 ? null : (TextStyleRun)this._runVector.elementAt(var2 + 1);
- }
- }
-
- Vector runsBefore(TextStyleRun var1) {
- Vector var2 = TextView.newVector();
- if (var1 == null) {
- return var2;
- } else {
- int var4 = this._runVector.indexOfIdentical(var1);
- if (var4 == -1) {
- return var2;
- } else {
- for(int var3 = 0; var3 < var4; ++var3) {
- var2.addElement(this._runVector.elementAt(var3));
- }
-
- return var2;
- }
- }
- }
-
- Vector runsAfter(TextStyleRun var1) {
- Vector var2 = TextView.newVector();
- if (var1 == null) {
- return var2;
- } else {
- int var3 = this._runVector.indexOfIdentical(var1);
- if (var3 == -1) {
- return var2;
- } else {
- for(int var4 = this._runVector.count(); var3 < var4; ++var3) {
- var2.addElement(this._runVector.elementAt(var3));
- }
-
- return var2;
- }
- }
- }
-
- Vector runsFromTo(TextStyleRun var1, TextStyleRun var2) {
- Vector var3 = TextView.newVector();
- if (var1 == var2 && var1 != null) {
- var3.addElement(var1);
- return var3;
- } else {
- int var4;
- if (var1 == null) {
- var4 = 0;
- } else {
- var4 = this._runVector.indexOfIdentical(var1);
- }
-
- int var5;
- if (var2 == null) {
- var5 = this._runVector.count() - 1;
- } else {
- var5 = this._runVector.indexOfIdentical(var2);
- }
-
- if (var4 >= 0 && var5 >= 0) {
- while(var4 <= var5) {
- var3.addElement(this._runVector.elementAt(var4));
- ++var4;
- }
-
- return var3;
- } else {
- return var3;
- }
- }
- }
-
- void removeRun(TextStyleRun var1) {
- if (var1 != null) {
- this._runVector.removeElement(var1);
- }
-
- }
-
- void removeRuns(Vector var1) {
- if (var1 != null) {
- int var2 = var1.count();
-
- while(var2-- > 0) {
- this._runVector.removeElement(var1.elementAt(var2));
- }
-
- }
- }
-
- void removeRunAt(int var1) {
- this._runVector.removeElementAt(var1);
- }
-
- boolean isEmpty() {
- int var3 = 0;
-
- TextStyleRun var1;
- for(int var2 = this._runVector.count(); var2-- > 0 && var3 == 0; var3 += var1.charCount()) {
- var1 = (TextStyleRun)this._runVector.elementAt(var2);
- }
-
- return var3 == 0;
- }
-
- int[] _growArrayTo(int[] var1, int var2) {
- if (var2 < 1) {
- return var1;
- } else if (var1 != null && var1.length >= var2) {
- return var1;
- } else {
- int[] var4 = var1;
- int var3;
- if (var1 != null) {
- for(var3 = var1.length; var3 < var2; var3 *= 2) {
- }
- } else {
- var3 = 20;
- }
-
- var1 = new int[var3];
- if (var4 == null) {
- return var1;
- } else {
- System.arraycopy(var4, 0, var1, 0, var4.length);
- return var1;
- }
- }
- }
-
- void _addLineBreak(int var1) {
- if (var1 >= 0) {
- this._lineBreaks = this._growArrayTo(this._lineBreaks, this._breakCount + 1);
- this._lineBreaks[this._breakCount] = var1;
- ++this._breakCount;
- }
- }
-
- void _addLineHeightAndBaseline(int var1, int var2) {
- if (var1 >= 0 && var2 >= 0) {
- this._lineHeights = this._growArrayTo(this._lineHeights, this._heightCount + 1);
- this._lineHeights[this._heightCount] = var1;
- ++this._heightCount;
- this._baselines = this._growArrayTo(this._baselines, this._baselineCount + 1);
- this._baselines[this._baselineCount] = var2;
- ++this._baselineCount;
- }
- }
-
- void _addLineRemainder(int var1) {
- if (var1 < 0) {
- var1 = 0;
- }
-
- this._lineRemainders = this._growArrayTo(this._lineRemainders, this._remainderCount + 1);
- this._lineRemainders[this._remainderCount] = var1;
- ++this._remainderCount;
- }
-
- int addWidthOfInitialTabs(int var1) {
- int var8 = 0;
- int[] var9 = this.currentParagraphFormat().tabPositions();
- int var3 = 0;
-
- for(int var4 = this._runVector.count(); var3 < var4; ++var3) {
- TextStyleRun var2 = (TextStyleRun)this._runVector.elementAt(var3);
- FastStringBuffer var7 = var2._contents;
- if (var7 == null || var7.length() == 0) {
- break;
- }
-
- int var5 = 0;
-
- int var6;
- for(var6 = var7.length(); var5 < var6 && var7.charAt(var5) == '\t'; ++var5) {
- ++var8;
- }
-
- if (var5 < var6) {
- break;
- }
- }
-
- if (var8 == 0) {
- return var1;
- } else {
- var3 = 0;
-
- int var12;
- for(var12 = var9.length; var3 < var12 && var9[var3] < var1; ++var3) {
- }
-
- if (var3 == var12) {
- return var1;
- } else {
- var3 += var8;
- return var3 >= var9.length ? var9[var9.length - 1] : var9[var3 - 1];
- }
- }
- }
-
- void computeLineBreaksAndHeights(int var1) {
- this.computeLineBreaksAndHeights(var1, 0);
- }
-
- void computeLineBreaksAndHeights(int var1, int var2) {
- TextParagraphFormat var20 = this.currentParagraphFormat();
- if (var2 > 0) {
- --var2;
- }
-
- this._breakCount = var2;
- this._heightCount = var2;
- this._baselineCount = var2;
- this._remainderCount = var2;
- if (var20._justification == 0 && var2 == 0) {
- this._lineRemainders = null;
- }
-
- var1 -= var20._leftMargin + var20._rightMargin;
- if (var1 < 1) {
- var1 = 1;
- }
-
- int var9;
- int var13;
- if (var2 == 0) {
- var9 = var1 - var20._leftIndent;
- if (var9 < 1) {
- var9 = 1;
- }
-
- var13 = var9;
- this._height = 0;
- this._charCount = 0;
- } else {
- var9 = var1;
- var13 = var1;
- this._height = 0;
-
- for(int var5 = 0; var5 < var2; ++var5) {
- this._height += this._lineHeights[var5];
- }
-
- this._charCount = this._lineBreaks[var2 - 1];
- }
-
- int var4 = this._runVector.count();
- int var10 = this._charCount;
- int var11 = 0;
- int var12 = 0;
- int var15 = 0;
- int var14 = 0;
- int var18 = var20._leftMargin;
- int var19 = var18;
- if (var2 == 0) {
- var18 += var20._leftIndent;
- }
-
- if (var20.wrapsUnderFirstCharacter()) {
- var19 = this.addWidthOfInitialTabs(var20._leftMargin + var20._leftIndent);
- var1 -= var19 - var18;
- var9 = var1;
- }
-
- TextStyleRun var3;
- int var6;
- int var7;
- int var23;
- if (var2 == 0) {
- var23 = 0;
- var3 = null;
- var7 = 0;
- var6 = 0;
- } else {
- var3 = this.runForCharPosition(this._startChar + this._charCount);
- var23 = this._runVector.indexOfIdentical(var3) + 1;
- var7 = var3.charCount();
- var6 = this._startChar + this._charCount - var3.rangeIndex();
- this._charCount += var7 - this._charCount;
- }
-
- while(true) {
- while(var3 == null || var6 >= var7) {
- if (var23 == this._runVector.count()) {
- this._addLineBreak(var10);
- if (var11 == 0) {
- var3 = (TextStyleRun)this._runVector.firstElement();
- var11 = var3.height() + var20._lineSpacing;
- var12 = var3.baseline();
- } else {
- var11 += var20._lineSpacing;
- }
-
- this._addLineHeightAndBaseline(var11, var12);
- this._height += var11;
- this._addLineRemainder(var9);
- ++this._charCount;
- return;
- }
-
- var3 = (TextStyleRun)this._runVector.elementAt(var23++);
- if (var3.charCount() != 0) {
- var6 = 0;
- var7 = var3.charCount();
- this._charCount += var7;
- break;
- }
- }
-
- while(var6 < var7) {
- int var8 = var3.charsForWidth(var6, var18, var9, var13, var20._tabStops);
- if (var8 > 0) {
- var6 += var8;
- var10 += var8;
- int var16 = var3.baseline();
- int var17 = var3.height() - var3.baseline();
- if (var14 < var16) {
- var14 = var16;
- }
-
- if (var15 < var17) {
- var15 = var17;
- }
-
- if (var14 + var15 > var11) {
- var11 = var14 + var15;
- }
-
- if (var14 > var12) {
- var12 = var14;
- }
-
- var18 += var9 - var3._remainder;
- var9 = var3._remainder;
- }
-
- if (var6 < var7) {
- this._addLineBreak(var10);
- this._addLineHeightAndBaseline(var11 + var20._lineSpacing, var12);
- this._height += var11 + var20._lineSpacing;
- this._addLineRemainder(var9);
- var13 = var1;
- var9 = var1;
- var12 = 0;
- var11 = 0;
- var15 = 0;
- var14 = 0;
- var18 = var19;
- }
- }
- }
- }
-
- int characterStartingLine(int var1) {
- if (var1 == 0) {
- return this._startChar;
- } else {
- return var1 < this._breakCount ? this._startChar + this._lineBreaks[var1 - 1] : -1;
- }
- }
-
- Rect rectForLine(int var1) {
- TextParagraphFormat var4 = this.currentParagraphFormat();
- if (var1 >= this._breakCount) {
- return null;
- } else {
- int var2 = this.field_0;
-
- int var3;
- for(var3 = 0; var3 < var1; ++var3) {
- var2 += this._lineHeights[var3];
- }
-
- return TextView.newRect(var4._leftMargin, var2, this._owner.bounds.width - var4._rightMargin, this._lineHeights[var3]);
- }
- }
-
- Range rangeForLine(int var1) {
- if (var1 >= this._breakCount) {
- return new Range(this._startChar + this._charCount, 0);
- } else {
- return var1 == 0 ? new Range(this._startChar, this._lineBreaks[var1]) : new Range(this._startChar + this._lineBreaks[var1 - 1], this._lineBreaks[var1] - this._lineBreaks[var1 - 1]);
- }
- }
-
- int runIndexForCharPosition(int var1) {
- int var3 = var1 - this._startChar;
- int var4 = this._runVector.count();
-
- for(int var5 = 0; var5 < var4; ++var5) {
- TextStyleRun var2 = (TextStyleRun)this._runVector.elementAt(var5);
- if (var2.charCount() > var3) {
- return var5;
- }
-
- var3 -= var2.charCount();
- }
-
- return this._runVector.count() - 1;
- }
-
- TextStyleRun runForCharPosition(int var1) {
- int var2 = this.runIndexForCharPosition(var1);
- return var2 >= 0 ? (TextStyleRun)this._runVector.elementAt(var2) : null;
- }
-
- char characterAt(int var1) {
- if (this._charCount < 2) {
- return '\n';
- } else {
- int var4 = var1 - this._startChar;
- int var5 = this._runVector.count();
-
- for(int var6 = 0; var6 < var5; ++var6) {
- TextStyleRun var2 = (TextStyleRun)this._runVector.elementAt(var6);
- if (var2.charCount() > var4) {
- char var3 = var2.charAt(var4);
- return var3;
- }
-
- var4 -= var2.charCount();
- }
-
- return (char)(var4 < 2 ? '\n' : '\u0000');
- }
- }
-
- int lineForPosition(int var1) {
- int var2 = var1 - this._startChar;
- if (this._breakCount > 0 && var2 == this._lineBreaks[this._breakCount - 1]) {
- return this._breakCount - 1;
- } else {
- int var3;
- for(var3 = 0; var3 < this._breakCount && var2 >= this._lineBreaks[var3]; ++var3) {
- }
-
- return var3 >= this._breakCount ? -1 : var3;
- }
- }
-
- TextPositionInfo positionForPoint(int var1, int var2, boolean var3) {
- TextStyleRun var4 = null;
- int var16 = 0;
- TextParagraphFormat var18 = this.currentParagraphFormat();
- int var7 = this.field_0;
-
- int var6;
- for(var6 = 0; var6 < this._breakCount && (var2 < var7 || var2 > var7 + this._lineHeights[var6]); ++var6) {
- var7 += this._lineHeights[var6];
- }
-
- int var8;
- if (var6 == 0) {
- var8 = this._startChar;
- } else {
- var8 = this._startChar + this._lineBreaks[var6 - 1];
- }
-
- int var9 = this._startChar + this._lineBreaks[var6];
- int var17 = this._runVector.count();
- int var10 = this._startChar;
-
- for(var6 = 0; var6 < var17; ++var6) {
- var4 = (TextStyleRun)this._runVector.elementAt(var6);
- if (var10 + var4.charCount() > var8) {
- var16 = var8 - var10;
- break;
- }
-
- var10 += var4.charCount();
- }
-
- if (var4 == null) {
- return null;
- } else {
- int var11;
- if (var18._justification == 0) {
- var11 = var18._leftMargin;
- } else if (var18._justification == 2) {
- var11 = var18._leftMargin + this._lineRemainders[var6];
- } else {
- var11 = var18._leftMargin + this._lineRemainders[var6] / 2;
- }
-
- int var12 = this._owner.bounds.width - var18._leftMargin - var18._rightMargin;
- if (var6 == 0) {
- var11 += var18._leftIndent;
- var12 -= var18._leftIndent;
- } else if (var18.wrapsUnderFirstCharacter()) {
- int var19 = var11;
- var11 = this.addWidthOfInitialTabs(var11 + var18._leftIndent);
- var12 -= var11 - var19;
- }
-
- if (var12 < 1) {
- var12 = 1;
- }
-
- if (var1 > var11 + var12 - this._lineRemainders[var6]) {
- TextPositionInfo var5 = this.infoForPosition(var9, -1);
- var5.setAtEndOfLine(true);
- return var5;
- } else if (var1 <= var11) {
- return this.infoForPosition(var8, var2);
- } else {
- int var14;
- for(var14 = var6 + 1; var4 != null && var4.charCount() == 0; ++var14) {
- var4 = this.runAfter(var4);
- }
-
- if (var4 == null) {
- return this.infoForPosition(var8 + var10, var2);
- } else {
- while(var8 <= var9) {
- int var15 = var4.widthOfContents(var16, 1, var11, var18._tabStops);
- if (var1 >= var11 && var1 <= var11 + var15) {
- if (var3) {
- return this.infoForPosition(var8, var2);
- }
-
- var15 /= 2;
- if (var1 >= var11 + var15) {
- return this.infoForPosition(var8 + 1, var2);
- }
-
- return this.infoForPosition(var8, var2);
- }
-
- ++var16;
- if (var16 >= var4.charCount()) {
- for(var4 = (TextStyleRun)this.objectAt(this._runVector, var14++); var4 != null && var4.charCount() == 0; ++var14) {
- var4 = this.runAfter(var4);
- }
-
- if (var4 == null) {
- return this.infoForPosition(var8 + var10, var2);
- }
-
- var16 = 0;
- }
-
- ++var8;
- var11 += var15;
- }
-
- return null;
- }
- }
- }
- }
-
- TextPositionInfo _infoForPosition(int var1) {
- int var4 = 0;
- int var5 = 0;
- int var6 = 1;
- int var7 = 0;
- int var10 = 0;
- TextParagraphFormat var15 = this.currentParagraphFormat();
- int var3 = var1 - this._startChar;
- int var12 = var3;
- int var13 = this._owner.bounds.width - var15._leftMargin - var15._rightMargin;
- int var8 = this.field_0;
-
- for(var4 = 0; var4 < this._breakCount - 1 && this._lineBreaks[var4] < var3; ++var4) {
- var8 += this._lineHeights[var4];
- }
-
- TextStyleRun var2;
- int var11;
- if (var4 > 0) {
- var2 = this.runForCharPosition(this._startChar + this._lineBreaks[var4 - 1]);
- var11 = this._lineBreaks[var4 - 1] + this._startChar - var2.rangeIndex();
- var3 -= this._lineBreaks[var4 - 1];
- } else {
- var2 = (TextStyleRun)this._runVector.firstElement();
- var11 = 0;
- }
-
- while(var4 < this._breakCount) {
- if (var4 == 0) {
- var5 = this._lineBreaks[var4];
- } else {
- var5 = this._lineBreaks[var4] - this._lineBreaks[var4 - 1];
- }
-
- if (var5 > var3) {
- var5 = var3;
- }
-
- if (var15._justification == 0) {
- var7 = var15._leftMargin;
- } else if (var15._justification == 2) {
- var7 = var15._leftMargin + this._lineRemainders[var4];
- } else {
- var7 = var15._leftMargin + this._lineRemainders[var4] / 2;
- }
-
- int var14 = var13;
- if (var4 == 0) {
- var7 += var15._leftIndent;
- var14 = var13 - var15._leftIndent;
- } else if (var15.wrapsUnderFirstCharacter()) {
- int var16 = this.addWidthOfInitialTabs(var7 + var15._leftIndent);
- var14 = var13 - (var16 - var7);
- var7 = var16;
- }
-
- if (var14 < 1) {
- var14 = 1;
- }
-
- if (var5 == 0) {
- return new TextPositionInfo(var2, var7, var8, var4, this._lineHeights[var4], var11, var1);
- }
-
- while(var5 > 0) {
- int var9 = var2.charCount() - var11;
- if (var5 < var9) {
- if (var5 <= var3) {
- var10 = var2.widthOfContents(var11, var5, var7, var15._tabStops);
- }
-
- var11 += var5;
- var3 -= var5;
- var5 = 0;
- } else {
- if (var5 <= var3) {
- var10 = var2.widthOfContents(var11, var5, var7, var15._tabStops);
- }
-
- var5 -= var9;
- var3 -= var9;
-
- for(var2 = (TextStyleRun)this.objectAt(this._runVector, var6++); var2 != null && var2.charCount() == 0; var2 = (TextStyleRun)this.objectAt(this._runVector, var6++)) {
- }
-
- var11 = 0;
- }
-
- var7 += var10;
- var14 -= var10;
- if (var3 == 0 || var2 == null && var3 == 1) {
- if (var2 == null) {
- var2 = (TextStyleRun)this._runVector.lastElement();
- var11 = var2.charCount();
- }
-
- TextPositionInfo var20 = new TextPositionInfo(var2, var7, var8, var4, this._lineHeights[var4], var11, var1);
- if (var12 == this._lineBreaks[var4]) {
- var20.setAtEndOfLine(true);
- if (var4 == this._breakCount - 1) {
- var20.setAtEndOfParagraph(true);
- }
- }
-
- return var20;
- }
- }
-
- var8 += this._lineHeights[var4];
- ++var4;
- }
-
- return null;
- }
-
- TextPositionInfo infoForPosition(int var1, int var2) {
- TextParagraphFormat var7 = this.currentParagraphFormat();
- TextPositionInfo var3 = this._infoForPosition(var1);
- if (var3 == null) {
- var3 = this._infoForPosition(this._startChar + this._charCount);
- return var3;
- } else if (var2 < var3.maxY()) {
- return var3;
- } else {
- TextPositionInfo var4 = this._infoForPosition(var1 + 1);
- if (var4 != null && var4._lineNumber != var3._lineNumber) {
- int var5 = var4._lineNumber;
- int var6;
- if (var7._justification == 0) {
- var6 = var7._leftMargin;
- } else if (var7._justification == 2) {
- var6 = var7._leftMargin + this._lineRemainders[var5];
- } else {
- var6 = var7._leftMargin + this._lineRemainders[var5] / 2;
- }
-
- var3 = new TextPositionInfo(var3._textRun, var6, var4._y, var4._lineNumber, var4._lineHeight, var3._positionInRun, var3._absPosition);
- var3.setNextLine(true);
- return var3;
- } else {
- return var3;
- }
- }
- }
-
- TextPositionInfo insertCharOrStringAt(char var1, String var2, int var3) {
- TextStyleRun var7 = null;
- if (var2 == null && var1 == 0) {
- return null;
- } else {
- int var11 = var3 - this._startChar;
- int var10 = this._runVector.count();
-
- int var9;
- for(var9 = 0; var9 < var10; ++var9) {
- var7 = (TextStyleRun)this.objectAt(this._runVector, var9);
- if (var7 == null) {
- break;
- }
-
- if (var7.charCount() >= var11) {
- if (var7.containsATextAttachment()) {
- if (var11 == 0) {
- TextStyleRun var8 = var7.createEmptyRun();
- this.insertRunAt(var8, this._runVector.indexOfIdentical(var7));
- var7 = var8;
- } else {
- Object var16 = null;
- if (var9 > 0) {
- TextStyleRun var20 = (TextStyleRun)this.objectAt(this._runVector, var9 - 1);
- TextStyleRun var18 = var20.createEmptyRun(TextView.attributesByRemovingStaticAttributes(var20.attributes()));
- this.insertRunAt(var18, this._runVector.indexOfIdentical(var7) + 1);
- var7 = var18;
- } else {
- var7 = (TextStyleRun)this.objectAt(this._runVector, 0);
- TextStyleRun var19 = var7.createEmptyRun(TextView.attributesByRemovingStaticAttributes(var7.attributes()));
- this.insertRunAt(var19, 1);
- var7 = var19;
- }
-
- if (var7 == null) {
- var7 = new TextStyleRun(this, "", (Hashtable)null);
- this.addRun(var7);
- }
- }
-
- var11 = 0;
- }
- break;
- }
-
- var11 -= var7.charCount();
- }
-
- if ((var9 >= var10 || var7 == null) && var11 == 1) {
- var7 = (TextStyleRun)this._runVector.lastElement();
- var11 = var7.charCount();
- } else if (var7 == null) {
- return null;
- }
-
- int var12 = this.lineForPosition(var3 - 1);
- int var14 = this._lineBreaks[var12] + this._startChar;
- TextPositionInfo var4 = this.infoForPosition(var14, -1);
- int var15 = this._height;
- int var13;
- if (var2 != null) {
- var7.insertStringAt(var2, var11);
- var13 = var2.length();
- } else {
- var7.insertCharAt(var1, var11);
- var13 = 1;
- }
-
- this.computeLineBreaksAndHeights(this._owner.bounds.width, var12);
- TextPositionInfo var5 = this.infoForPosition(var3 + var13, -1);
- if (var15 != this._height) {
- var5.setRedrawCurrentParagraphOnly(false);
- var5.setRedrawCurrentLineOnly(false);
- return var5;
- } else {
- var5.setRedrawCurrentParagraphOnly(true);
- if (var5._lineNumber != var4._lineNumber) {
- var5.setRedrawCurrentParagraphOnly(false);
- if (var4._lineNumber < var5._lineNumber) {
- var5.setUpdateLine(var4._lineNumber);
- } else {
- var5.setUpdateLine(var5._lineNumber);
- }
-
- return var5;
- } else {
- var5.setRedrawCurrentParagraphOnly(true);
- TextPositionInfo var6 = this.infoForPosition(var14 + 1, -1);
- if (var6 != null && var4 != null && var6._lineNumber == var4._lineNumber) {
- if (this.currentParagraphFormat().wrapsUnderFirstCharacter()) {
- var5.setRedrawCurrentLineOnly(false);
- } else {
- var5.setRedrawCurrentLineOnly(true);
- }
- } else {
- var5.setRedrawCurrentLineOnly(false);
- }
-
- return var5;
- }
- }
- }
- }
-
- TextPositionInfo removeCharAt(int var1) {
- TextStyleRun var7 = null;
- if (var1 <= this._startChar) {
- return null;
- } else {
- --var1;
- int var10 = var1 - this._startChar;
- int var9 = this._runVector.count();
-
- int var8;
- for(var8 = 0; var8 < var9; ++var8) {
- var7 = (TextStyleRun)this._runVector.elementAt(var8);
- if (var7.charCount() > var10) {
- break;
- }
-
- var10 -= var7.charCount();
- }
-
- if ((var8 >= var9 || var7 == null) && var10 == 0) {
- var7 = (TextStyleRun)this._runVector.lastElement();
- var10 = var7.charCount() - 1;
- } else if (var7 == null) {
- return null;
- }
-
- int var11 = this.lineForPosition(var1 - 1);
- int var12;
- if (var11 == 0) {
- var12 = this._startChar + 1;
- } else {
- var12 = this._lineBreaks[var11 - 1] + this._startChar + 1;
- }
-
- int var13 = this._lineBreaks[var11] + this._startChar + 1;
- if (var13 > this._startChar + this._charCount) {
- var13 = this._startChar + this._charCount;
- }
-
- TextPositionInfo var3 = this.infoForPosition(var13, -1);
- TextPositionInfo var2 = this.infoForPosition(var12, -1);
- int var14 = this._height;
- var7.removeCharAt(var10);
- if (var7.charCount() == 0 && this._runVector.count() > 1) {
- this._runVector.removeElement(var7);
- }
-
- this.computeLineBreaksAndHeights(this._owner.bounds.width);
- TextPositionInfo var4 = this.infoForPosition(var1, -1);
- if (var14 == this._height) {
- var4.setRedrawCurrentParagraphOnly(true);
- }
-
- if (var4._lineNumber != var2._lineNumber) {
- if (var2._lineNumber < var4._lineNumber) {
- var4.setUpdateLine(var2._lineNumber);
- } else {
- var4.setUpdateLine(var4._lineNumber);
- }
-
- return var4;
- } else {
- TextPositionInfo var6 = this.infoForPosition(var13 - 1, -1);
- if (var3._lineNumber != var6._lineNumber) {
- if (var3._lineNumber < var6._lineNumber) {
- var4.setUpdateLine(var3._lineNumber);
- } else {
- var4.setUpdateLine(var6._lineNumber);
- }
-
- return var4;
- } else {
- TextPositionInfo var5 = this.infoForPosition(var12, -1);
- if (var14 == this._height && var5 != null && var2 != null && var5._lineNumber == var2._lineNumber) {
- if (this.currentParagraphFormat().wrapsUnderFirstCharacter()) {
- var4.setRedrawCurrentLineOnly(false);
- } else {
- var4.setRedrawCurrentLineOnly(true);
- }
- }
-
- return var4;
- }
- }
- }
- }
-
- TextStyleRun createNewRunAt(int var1) {
- TextPositionInfo var2 = this.infoForPosition(var1, -1);
- if (var2 == null) {
- return null;
- } else {
- int var4 = this._runVector.indexOfIdentical(var2._textRun);
- TextStyleRun var3 = var2._textRun.breakAt(var2._positionInRun);
- this.insertRunAt(var3, var4 + 1);
- return var3;
- }
- }
-
- TextParagraph createNewParagraphAt(int var1) {
- Object var3 = null;
- TextParagraphFormat var9 = this.currentParagraphFormat();
- this.collectEmptyRuns();
- TextStyleRun var11 = this.runForCharPosition(var1);
- int var10 = var1 - var11.rangeIndex();
- TextParagraph var2 = new TextParagraph(this._owner, var9);
- int var7;
- if (var10 == 0) {
- var7 = this._runVector.indexOfIdentical(var11);
- Hashtable var12 = TextView.attributesByRemovingStaticAttributes(var11.attributes());
- if (var7 == 0) {
- TextStyleRun var13 = var11.createEmptyRun(var12);
- this._runVector.insertElementAt(var13, 0);
- } else {
- --var7;
- }
-
- var2.addRun(new TextStyleRun(this, "", var12));
- } else if (var11.containsATextAttachment()) {
- var7 = this._runVector.indexOfIdentical(var11);
- int var17 = var7 - 1;
-
- TextStyleRun var5;
- for(var5 = null; var17 > 0; --var17) {
- var5 = (TextStyleRun)this.objectAt(this._runVector, var17);
- if (var5 == null || !var5.containsATextAttachment()) {
- break;
- }
- }
-
- if (var5 == null) {
- TextStyleRun var14 = new TextStyleRun(this, "", (Hashtable)null);
- var2.addRun(var14);
- } else {
- TextStyleRun var15 = new TextStyleRun(this, "", TextView.attributesByRemovingStaticAttributes(var5.attributes()));
- var2.addRun(var15);
- }
- } else {
- TextStyleRun var4 = var11.breakAt(var10);
- var2.addRun(var4);
- var7 = this._runVector.indexOfIdentical(var11);
- }
-
- if (var7 < 0) {
- return var2;
- } else {
- ++var7;
- int var6 = this._runVector.count();
-
- int var8;
- for(var8 = 0; var7 < var6; ++var8) {
- var2.addRun((TextStyleRun)this._runVector.elementAt(var7));
- ++var7;
- }
-
- while(var8-- > 0) {
- this._runVector.removeLastElement();
- }
-
- return var2;
- }
- }
-
- void drawBackgroundForLine(Graphics var1, int var2, int var3, int var4) {
- Rect var7 = null;
- TextParagraphFormat var16 = this.currentParagraphFormat();
- TextParagraphFormat var17 = (TextParagraphFormat)this._owner.defaultAttributes().get("ParagraphFormatKey");
- int var12 = this._owner.bounds.width - var16._leftMargin - var16._rightMargin;
- int var13 = this._owner.bounds.width - var17._leftMargin - var17._rightMargin;
- if (var2 == 0) {
- int var10000 = var12 - var16._leftIndent;
- }
-
- if (var2 >= 0 && var2 < this._breakCount && (this._owner.hasSelectionRange() || this._owner.insertionPointVisible)) {
- int var10 = this._owner.selectionStart();
- int var11 = this._owner.selectionEnd();
- TextPositionInfo var5 = this._owner.selectionStartInfo();
- TextPositionInfo var6 = this._owner.selectionEndInfo();
- int var14;
- if (var2 == 0) {
- var14 = this._startChar;
- } else {
- var14 = this._startChar + this._lineBreaks[var2 - 1];
- }
-
- int var15 = this._startChar + this._lineBreaks[var2];
- if (var2 == this._breakCount - 1) {
- ++var15;
- }
-
- if (var10 != var11 && var10 <= var15 && var11 >= var14) {
- Rect var8;
- Rect var9;
- if (var14 >= var10 && var15 <= var11) {
- var7 = TextView.newRect(var17._leftMargin, var4, var13, this._lineHeights[var2]);
- var9 = null;
- var8 = null;
- } else if (var14 >= var10 && var15 > var11 && var14 < var11) {
- if (var10 == var14) {
- var7 = TextView.newRect(var3, var4, var6._x - var3, this._lineHeights[var2]);
- } else {
- var7 = TextView.newRect(var17._leftMargin, var4, var6._x - var17._leftMargin, this._lineHeights[var2]);
- }
-
- var8 = TextView.newRect(var7.maxX(), var4, var13 - var7.width, this._lineHeights[var2]);
- var9 = null;
- } else if (var14 < var10 && var10 < var15 && var15 <= var11) {
- if (var5._textRun._paragraph == this && var5._lineNumber <= var2) {
- var7 = TextView.newRect(var5._x, var4, this._owner.bounds.width - var17._rightMargin - var5._x, this._lineHeights[var2]);
- var8 = TextView.newRect(var17._leftMargin, var4, var7.x - var17._leftMargin, this._lineHeights[var2]);
- } else {
- var8 = TextView.newRect(var17._leftMargin, var4, var13, this._lineHeights[var2]);
- }
-
- var9 = null;
- } else if (var14 < var10 && var15 > var11) {
- var7 = TextView.newRect(var5._x, var4, var6._x - var5._x, this._lineHeights[var2]);
- var8 = TextView.newRect(var7.maxX(), var4, var13 - var7.width, this._lineHeights[var2]);
- var9 = TextView.newRect(var17._leftMargin, var4, var7.x - var17._leftMargin, this._lineHeights[var2]);
- } else {
- var8 = TextView.newRect(var17._leftMargin, var4, var13, this._lineHeights[var2]);
- var9 = null;
- }
-
- if (!this._owner.isTransparent()) {
- var1.setColor(this._owner._backgroundColor);
- if (var8 != null) {
- var1.fillRect(var8);
- TextView.returnRect(var8);
- }
-
- if (var9 != null) {
- var1.fillRect(var9);
- TextView.returnRect(var9);
- }
- }
-
- if (this._owner.hasSelectionRange() && var7 != null && this._owner.isSelectable()) {
- if (var7.width == 0 && var7.x == var3) {
- var7.sizeTo(4, var7.height);
- }
-
- if (!this._owner.isEditing()) {
- if (!this._owner.isTransparent()) {
- var1.setColor(this._owner._backgroundColor);
- var1.fillRect(var7);
- }
- } else {
- var1.setColor(this._owner._selectionColor);
- var1.fillRect(var7);
- }
-
- TextView.returnRect(var7);
- }
-
- } else {
- if (!this._owner.isTransparent()) {
- var1.setColor(this._owner._backgroundColor);
- var1.fillRect(var17._leftMargin, var4, var13, this._lineHeights[var2]);
- }
-
- }
- } else {
- if (!this._owner.isTransparent()) {
- var1.setColor(this._owner._backgroundColor);
- var1.fillRect(var17._leftMargin, var4, var13, this._lineHeights[var2]);
- }
-
- }
- }
-
- void drawLine(Graphics var1, int var2) {
- int var5 = 0;
- int var6 = 1;
- int var11 = 0;
- TextParagraphFormat var14 = this.currentParagraphFormat();
- if (var2 < this._breakCount) {
- int var12 = this._owner.bounds.width - var14._leftMargin - var14._rightMargin;
- int var8 = this.field_0;
- if (!this._owner.isTransparent()) {
- var1.setColor(this._owner._backgroundColor);
- var1.fillRect(0, var8, var14._leftMargin, this._height);
- var1.fillRect(this._owner.bounds.width - var14._rightMargin, var8, var14._rightMargin + 1, this._height);
- }
-
- TextStyleRun var3 = (TextStyleRun)this._runVector.firstElement();
- int var10 = 0;
-
- for(int var4 = 0; var4 <= var2; ++var4) {
- int var7;
- if (var14._justification == 0) {
- var7 = var14._leftMargin;
- } else if (var14._justification == 2) {
- var7 = var14._leftMargin + this._lineRemainders[var4];
- } else {
- var7 = var14._leftMargin + this._lineRemainders[var4] / 2;
- }
-
- int var13 = var12;
- if (var4 == 0) {
- var7 += var14._leftIndent;
- var13 = var12 - var14._leftIndent;
- } else if (var14.wrapsUnderFirstCharacter()) {
- int var15 = this.addWidthOfInitialTabs(var7 + var14._leftIndent);
- var13 = var12 - (var15 - var7);
- var7 = var15;
- }
-
- if (var4 == 0) {
- var5 = this._lineBreaks[var4];
- } else {
- var5 = this._lineBreaks[var4] - this._lineBreaks[var4 - 1];
- }
-
- if (var4 == var2) {
- this.drawBackgroundForLine(var1, var4, var7, var8);
- }
-
- while(var5 > 0) {
- int var9 = var3.charCount() - var10;
- if (var5 < var9) {
- if (var4 == var2) {
- var11 = var3.drawCharacters(var1, var10, var5, var7, var8 + this._baselines[var4], var14._tabStops);
- }
-
- var10 += var5;
- var5 = 0;
- } else {
- if (var4 == var2) {
- var11 = var3.drawCharacters(var1, var10, var9, var7, var8 + this._baselines[var4], var14._tabStops);
- }
-
- var5 -= var9;
-
- for(var3 = (TextStyleRun)this.objectAt(this._runVector, var6++); var3 != null && var3.charCount() == 0; var3 = (TextStyleRun)this.objectAt(this._runVector, var6++)) {
- }
-
- var10 = 0;
- }
-
- var7 += var11;
- var13 -= var11;
- }
-
- var8 += this._lineHeights[var4];
- }
-
- }
- }
-
- void drawView(Graphics var1, Rect var2) {
- int var7 = 0;
- int var8 = 1;
- TextParagraphFormat var17 = this.currentParagraphFormat();
- TextParagraphFormat var18 = (TextParagraphFormat)this._owner.defaultAttributes().get("ParagraphFormatKey");
- int var15 = this._owner.bounds.width - var17._leftMargin - var17._rightMargin;
- int var10 = this.field_0;
- if (!this._owner.isTransparent()) {
- var1.setColor(this._owner._backgroundColor);
- var1.fillRect(var2.maxX() - var18._rightMargin, var10, var18._rightMargin + 1, this._height);
- }
-
- TextStyleRun var3 = (TextStyleRun)this._runVector.firstElement();
- int var12 = 0;
- Rect var4 = TextView.newRect();
- Rect var5 = var1.clipRect();
-
- for(int var6 = 0; var6 < this._breakCount; ++var6) {
- int var9;
- if (var17._justification == 0) {
- var9 = var2.x + var17._leftMargin;
- } else if (var17._justification == 2) {
- var9 = var2.x + var17._leftMargin + this._lineRemainders[var6];
- } else {
- var9 = var2.x + var17._leftMargin + this._lineRemainders[var6] / 2;
- }
-
- int var14 = var15;
- if (var6 == 0) {
- var9 += var17._leftIndent;
- var14 = var15 - var17._leftIndent;
- } else if (var17.wrapsUnderFirstCharacter()) {
- int var19 = this.addWidthOfInitialTabs(var9 + var17._leftIndent);
- var14 = var15 - (var19 - var9);
- var9 = var19;
- }
-
- if (var6 == 0) {
- var7 = this._lineBreaks[var6];
- } else {
- var7 = this._lineBreaks[var6] - this._lineBreaks[var6 - 1];
- }
-
- var4.setBounds(0, var10, this._owner.bounds.width, this._lineHeights[var6]);
- boolean var16 = var5.intersects(var4);
- if (!this._owner.isTransparent()) {
- var1.setColor(this._owner.backgroundColor());
- var1.fillRect(var2.x, var10, var9 - var2.x, this._lineHeights[var6]);
- }
-
- if (var16) {
- this.drawBackgroundForLine(var1, var6, var9, var10);
- }
-
- while(var7 > 0) {
- int var11 = var3.charCount() - var12;
- int var13;
- if (var7 < var11) {
- if (var16) {
- var13 = var3.drawCharacters(var1, var12, var7, var9, var10 + this._baselines[var6], var17._tabStops);
- } else {
- var13 = 0;
- }
-
- var12 += var7;
- var7 = 0;
- } else {
- if (var16) {
- var13 = var3.drawCharacters(var1, var12, var11, var9, var10 + this._baselines[var6], var17._tabStops);
- } else {
- var13 = 0;
- }
-
- var7 -= var11;
-
- for(var3 = (TextStyleRun)this.objectAt(this._runVector, var8++); var3 != null && var3.charCount() == 0; var3 = (TextStyleRun)this.objectAt(this._runVector, var8++)) {
- }
-
- var12 = 0;
- }
-
- var9 += var13;
- var14 -= var13;
- }
-
- var10 += this._lineHeights[var6];
- }
-
- TextView.returnRect(var4);
- }
-
- void draw() {
- if (this._owner != null) {
- Rect var1 = TextView.newRect(0, this.field_0, this._owner.bounds.width, this._height);
- this._owner.draw(var1);
- TextView.returnRect(var1);
- }
-
- }
-
- void subsumeParagraph(TextParagraph var1) {
- if (var1 != null) {
- int var3 = var1._runVector.count();
-
- for(int var4 = 0; var4 < var3; ++var4) {
- TextStyleRun var2 = (TextStyleRun)var1._runVector.elementAt(var4);
- if (var2.charCount() > 0 || this._runVector.isEmpty() && var4 + 1 == var3) {
- this.addRun(var2);
- }
- }
-
- }
- }
-
- public String toString() {
- FastStringBuffer var2 = new FastStringBuffer();
- var2.append("[");
- int var4 = this._runVector.count();
-
- for(int var3 = 0; var3 < var4; ++var3) {
- TextStyleRun var1 = (TextStyleRun)this._runVector.elementAt(var3);
- var2.append(var1.toString());
- }
-
- var2.append("]\n");
- return var2.toString();
- }
-
- public void describeClassInfo(ClassInfo var1) {
- var1.addClass("netscape.application.TextParagraph", 1);
- var1.addField("format", (byte)18);
- var1.addField("runVector", (byte)18);
- }
-
- public void encode(Encoder var1) throws CodingException {
- var1.encodeObject("format", this._format);
- var1.encodeObject("runVector", this._runVector);
- }
-
- public void decode(Decoder var1) throws CodingException {
- this._format = (TextParagraphFormat)var1.decodeObject("format");
- this._runVector = (Vector)var1.decodeObject("runVector");
- int var3 = this._runVector.count();
-
- while(var3-- > 0) {
- TextStyleRun var2 = (TextStyleRun)this._runVector.elementAt(var3);
- var2.setParagraph(this);
- }
-
- }
-
- public void finishDecoding() throws CodingException {
- }
-
- String stringForRange(Range var1) {
- StringBuffer var3 = new StringBuffer();
- int var6 = this._startChar;
- Range var7 = TextView.allocateRange();
- int var4 = 0;
-
- for(int var5 = this._runVector.count(); var4 < var5; ++var4) {
- TextStyleRun var2 = (TextStyleRun)this._runVector.elementAt(var4);
- var7.index = var6;
- var7.length = var2.charCount();
- var7.intersectWith(var1);
- if (var7.index != Range.nullRange().index) {
- String var8 = var2.text().substring(var7.index - var6, var7.index - var6 + var7.length);
- var3.append(var8);
- }
-
- var6 += var2.charCount();
- }
-
- if (var1.index + var1.length - 1 == this._startChar + this._charCount - 1) {
- var3.append("\n");
- }
-
- TextView.recycleRange(var7);
- return var3.toString();
- }
-
- Range range() {
- return TextView.allocateRange(this._startChar, this._charCount);
- }
-
- int lineCount() {
- return this._breakCount;
- }
- }
-