home *** CD-ROM | disk | FTP | other *** search
- package netscape.application;
-
- import netscape.util.Vector;
-
- class TextSelection implements Target {
- TextView _owner;
- private TextParagraph _editParagraph;
- TextPositionInfo _insertionPointInfo;
- TextPositionInfo _anchorPositionInfo;
- TextPositionInfo _endPositionInfo;
- Timer _blinkTimer;
- long _lastFlashTime;
- int _anchorPosition;
- int _endPosition;
- boolean _flashInsertionPoint;
- boolean _insertionPointShowing;
- boolean _ignoreNextFlash;
- boolean _selectionDefined;
- int _insertionPointDisabled;
-
- TextSelection() {
- this._selectionDefined = false;
- }
-
- TextSelection(TextView var1) {
- this();
- this.init(var1);
- this._selectionDefined = false;
- }
-
- void init(TextView var1) {
- this._owner = var1;
- }
-
- void _startFlashing() {
- if (this._insertionPointDisabled == 0) {
- if (this._owner.isEditable()) {
- if (this._selectionDefined) {
- if (this._blinkTimer == null) {
- this._blinkTimer = new Timer(this, "blinkCaret", 700);
- }
-
- if (this._owner.isEditing()) {
- this._blinkTimer.start();
- } else if (System.currentTimeMillis() - this._lastFlashTime > 350L) {
- this._ignoreNextFlash = true;
- }
-
- this.showInsertionPoint();
- }
- }
- }
- }
-
- void _stopFlashing() {
- this.hideInsertionPoint();
- if (this._blinkTimer != null) {
- this._blinkTimer.stop();
- this._ignoreNextFlash = false;
- }
-
- }
-
- public void performCommand(String var1, Object var2) {
- if (this._owner.isEditing() && this._selectionDefined) {
- if (!this._ignoreNextFlash && this._flashInsertionPoint && !this.isARange()) {
- this._lastFlashTime = this._blinkTimer.timeStamp();
- this._insertionPointShowing = !this._insertionPointShowing;
- this._owner.drawInsertionPoint();
- } else {
- this._ignoreNextFlash = false;
- }
- } else {
- if (this._blinkTimer != null) {
- this._blinkTimer.stop();
- }
-
- }
- }
-
- boolean isARange() {
- return this._insertionPointInfo == null && this._anchorPositionInfo != null;
- }
-
- void disableInsertionPoint() {
- if (this._insertionPointDisabled == 0) {
- this.hideInsertionPoint();
- }
-
- ++this._insertionPointDisabled;
- }
-
- void enableInsertionPoint() {
- --this._insertionPointDisabled;
- if (this._insertionPointDisabled == 0) {
- this.showInsertionPoint();
- }
-
- }
-
- void showInsertionPoint() {
- if (this._insertionPointDisabled == 0) {
- if (this._owner.isEditable()) {
- if (this._owner.isEditing()) {
- this._flashInsertionPoint = true;
- if (!this.isARange() && !this._insertionPointShowing) {
- this._insertionPointShowing = true;
- this._owner.drawInsertionPoint();
- this._startFlashing();
- }
- }
- }
- }
- }
-
- void hideInsertionPoint() {
- this._flashInsertionPoint = false;
- if (!this.isARange() && this._insertionPointShowing) {
- this._insertionPointShowing = false;
- this._owner.drawInsertionPoint();
- }
- }
-
- Rect insertionPointRect() {
- return this._insertionPointInfo == null ? TextView.newRect() : TextView.newRect(this._insertionPointInfo._x - 1, this._insertionPointInfo._y, 1, this._insertionPointInfo._lineHeight);
- }
-
- Rect _updateRectForInfo(int var1, int var2, TextPositionInfo var3, TextPositionInfo var4) {
- if (var1 == var2) {
- return null;
- } else {
- Rect var6;
- if (var3._y == var4._y) {
- if (var4._x < var3._x) {
- var6 = TextView.newRect(var4._x, var4._y, var3._x - var4._x, var4._lineHeight);
- } else {
- var6 = TextView.newRect(var3._x, var4._y, var4._x - var3._x, var4._lineHeight);
- }
- } else {
- var6 = var3.lineBounds();
- Rect var5 = var4.lineBounds();
- var6.unionWith(var5);
- TextView.returnRect(var5);
- }
-
- return var6;
- }
- }
-
- void setRange(int var1, int var2, TextPositionInfo var3, boolean var4, boolean var5) {
- if (var1 != -1 && var2 != -1) {
- this._selectionDefined = true;
- } else {
- this._selectionDefined = false;
- }
-
- TextPositionInfo var6;
- TextPositionInfo var7;
- int var10;
- if (this._anchorPosition != this._endPosition) {
- var10 = this._anchorPosition < this._endPosition ? this._anchorPosition : this._endPosition;
- var6 = this._anchorPosition < this._endPosition ? this._anchorPositionInfo : this._endPositionInfo;
- if (this._anchorPosition > this._endPosition) {
- int var10000 = this._anchorPosition;
- } else {
- int var17 = this._endPosition;
- }
-
- var7 = this._anchorPosition > this._endPosition ? this._anchorPositionInfo : this._endPositionInfo;
- } else {
- boolean var11 = true;
- var10 = -1;
- var7 = null;
- var6 = null;
- }
-
- if (var1 < 0) {
- var1 = 0;
- } else if (var1 >= this._owner._charCount) {
- var1 = this._owner._charCount - 1;
- }
-
- if (var2 < 0) {
- var2 = 0;
- } else if (var2 >= this._owner._charCount) {
- var2 = this._owner._charCount - 1;
- }
-
- this._anchorPosition = var1;
- this._endPosition = var2;
- if (this._anchorPosition == this._endPosition) {
- this._editParagraph = this._owner._paragraphForIndex(this._anchorPosition);
- this._insertionPointInfo = this._editParagraph.infoForPosition(this._anchorPosition, -1);
- if (var5 && this._insertionPointInfo._endOfLine && this._anchorPosition < this._owner.length() - 1) {
- TextParagraph var14 = this._owner._paragraphForIndex(this._anchorPosition + 1);
- if (var14 == this._editParagraph) {
- TextPositionInfo var15 = this._editParagraph.infoForPosition(this._anchorPosition + 1, -1);
- if (var15._y > this._insertionPointInfo._y) {
- this._insertionPointInfo = this._editParagraph.infoForPosition(this._anchorPosition, var15._y);
- }
- }
- }
-
- this._anchorPositionInfo = this._endPositionInfo = null;
- } else {
- TextParagraph var16 = this._owner._paragraphForIndex(this._anchorPosition);
- this._anchorPositionInfo = var16.infoForPosition(this._anchorPosition, -1);
- if (this._anchorPositionInfo._endOfLine && !var4) {
- this._anchorPositionInfo = var16.infoForPosition(this._anchorPosition, this._anchorPositionInfo.maxY());
- }
-
- if (var3 == null) {
- this._endPositionInfo = this._owner._paragraphForIndex(this._endPosition).infoForPosition(this._endPosition, -1);
- } else {
- this._endPositionInfo = var3;
- }
-
- this._insertionPointInfo = null;
- this._editParagraph = null;
- }
-
- TextPositionInfo var8;
- TextPositionInfo var9;
- int var12;
- if (this._anchorPosition != this._endPosition) {
- var12 = this._anchorPosition < this._endPosition ? this._anchorPosition : this._endPosition;
- var8 = this._anchorPosition < this._endPosition ? this._anchorPositionInfo : this._endPositionInfo;
- if (this._anchorPosition > this._endPosition) {
- int var18 = this._anchorPosition;
- } else {
- int var19 = this._endPosition;
- }
-
- var9 = this._anchorPosition > this._endPosition ? this._anchorPositionInfo : this._endPositionInfo;
- } else {
- boolean var13 = true;
- var12 = -1;
- var9 = null;
- var8 = null;
- }
-
- if (var10 == -1) {
- if (var12 == -1) {
- this._startFlashing();
- this._updateCurrentFont();
- } else {
- this.dirtyRangeForSelection(this._anchorPositionInfo, this._endPositionInfo, (TextPositionInfo)null, (TextPositionInfo)null);
- this._updateCurrentFont();
- }
- } else if (var12 == -1) {
- this.dirtyRangeForSelection(var6, var7, (TextPositionInfo)null, (TextPositionInfo)null);
- this._startFlashing();
- this._updateCurrentFont();
- } else {
- this.dirtyRangeForSelection(var8, var9, var6, var7);
- this._updateCurrentFont();
- }
- }
-
- void dirtyRangeForSelection(TextPositionInfo var1, TextPositionInfo var2, TextPositionInfo var3, TextPositionInfo var4) {
- Rect var10 = null;
- Rect var13 = this._owner.bounds();
- Range var6 = Range.rangeFromIndices(var1._absPosition, var2._absPosition);
- Range var7;
- if (var3 != null && var4 != null) {
- Range var5 = Range.rangeFromIndices(var3._absPosition, var4._absPosition);
- if (var5.equals(var6)) {
- return;
- }
-
- if (var6.index == var5.index) {
- if (var6.length > var5.length) {
- var7 = new Range(var6.index + var5.length, var6.length - var5.length);
- } else {
- var7 = new Range(var6.index + var6.length, var5.length - var6.length);
- }
- } else {
- if (var6.index + var6.length != var5.index + var5.length) {
- this.dirtyRangeForSelection(var1, var2, (TextPositionInfo)null, (TextPositionInfo)null);
- this.dirtyRangeForSelection(var3, var4, (TextPositionInfo)null, (TextPositionInfo)null);
- return;
- }
-
- if (var6.length > var5.length) {
- var7 = new Range(var6.index, var6.length - var5.length);
- } else {
- var7 = new Range(var5.index, var5.length - var6.length);
- }
- }
- } else {
- var7 = var6;
- }
-
- Vector var8 = this._owner.rectsForRange(var7);
- int var11 = 0;
-
- for(int var12 = var8.count(); var11 < var12; ++var11) {
- Rect var9 = (Rect)var8.elementAt(var11);
- var9.x = 0;
- var9.width = var13.width;
- if (var9.height > 0) {
- if (var10 == null) {
- var10 = new Rect(var9);
- } else {
- var10.unionWith(var9);
- }
- }
- }
-
- if (var10 != null) {
- if (var7.contains(var1._absPosition) && !var10.contains(var1._x, var1._y) && var1._absPosition > 0) {
- TextPositionInfo var14 = this._owner.positionInfoForIndex(var1._absPosition - 1);
- if (var14 != null) {
- var10.y -= var14._lineHeight;
- var10.height += var14._lineHeight;
- }
- }
-
- if (var7.contains(var2._absPosition) && !var10.contains(var2._x, var2._y) && var2._absPosition > 0) {
- TextPositionInfo var15 = this._owner.positionInfoForIndex(var2._absPosition - 1);
- if (var15 != null) {
- var10.y -= var15._lineHeight;
- var10.height += var15._lineHeight;
- }
- }
-
- if (var3 != null && var7.contains(var3._absPosition) && !var10.contains(var3._x, var3._y) && var3._absPosition > 0) {
- TextPositionInfo var16 = this._owner.positionInfoForIndex(var3._absPosition - 1);
- if (var16 != null) {
- var10.y -= var16._lineHeight;
- var10.height += var16._lineHeight;
- }
- }
-
- if (var4 != null && var7.contains(var4._absPosition) && !var10.contains(var4._x, var4._y) && var4._absPosition > 0) {
- TextPositionInfo var17 = this._owner.positionInfoForIndex(var4._absPosition - 1);
- if (var17 != null) {
- var10.y -= var17._lineHeight;
- var10.height += var17._lineHeight;
- }
- }
-
- this._owner.addDirtyRect(var10);
- }
- }
-
- void setRange(int var1, int var2, TextPositionInfo var3, boolean var4) {
- this.setRange(var1, var2, var3, var4, false);
- }
-
- void setRange(int var1, int var2) {
- this.setRange(var1, var2, (TextPositionInfo)null, false, false);
- }
-
- void setRange(int var1, int var2, boolean var3) {
- this.setRange(var1, var2, (TextPositionInfo)null, false, var3);
- }
-
- void clearRange() {
- this.hideInsertionPoint();
- this.setRange(-1, -1);
- this._stopFlashing();
- }
-
- void setInsertionPoint(TextPositionInfo var1) {
- Rect var2 = null;
- if (var1 != null) {
- this._selectionDefined = true;
- if (this._anchorPosition != this._endPosition) {
- var2 = this._anchorPositionInfo.lineBounds();
- Rect var3 = this._endPositionInfo.lineBounds();
- var2.unionWith(var3);
- var2.x = 0;
- var2.width = this._owner.bounds.width;
- TextView.returnRect(var3);
- }
-
- this._anchorPosition = this._endPosition = var1._absPosition;
- this._insertionPointInfo = var1;
- this._editParagraph = this._insertionPointInfo._textRun._paragraph;
- this._anchorPositionInfo = this._endPositionInfo = null;
- if (var2 != null) {
- this._owner.draw(var2);
- TextView.returnRect(var2);
- }
-
- if (this._insertionPointShowing) {
- this._startFlashing();
- }
-
- }
- }
-
- int insertionPoint() {
- return this.isARange() ? -1 : this._anchorPosition;
- }
-
- TextPositionInfo insertionPointInfo() {
- return this.isARange() ? null : this._insertionPointInfo;
- }
-
- int selectionStart() {
- if (!this._selectionDefined) {
- return -1;
- } else {
- return this._anchorPosition <= this._endPosition ? this._anchorPosition : this._endPosition;
- }
- }
-
- TextPositionInfo selectionStartInfo() {
- if (!this.isARange()) {
- return this._insertionPointInfo;
- } else {
- return this._anchorPosition <= this._endPosition ? this._anchorPositionInfo : this._endPositionInfo;
- }
- }
-
- int selectionEnd() {
- if (!this._selectionDefined) {
- return -1;
- } else {
- return this._endPosition > this._anchorPosition ? this._endPosition : this._anchorPosition;
- }
- }
-
- TextPositionInfo selectionEndInfo() {
- if (!this.isARange()) {
- return this._insertionPointInfo;
- } else {
- return this._endPosition > this._anchorPosition ? this._endPositionInfo : this._anchorPositionInfo;
- }
- }
-
- void _updateCurrentFont() {
- }
-
- int orderedSelectionStart() {
- return !this._selectionDefined ? -1 : this._anchorPosition;
- }
-
- TextPositionInfo orderedSelectionStartInfo() {
- return !this.isARange() ? this._insertionPointInfo : this._anchorPositionInfo;
- }
-
- int orderedSelectionEnd() {
- return !this._selectionDefined ? -1 : this._endPosition;
- }
-
- TextPositionInfo orderedSelectionEndInfo() {
- return !this.isARange() ? this._insertionPointInfo : this._endPositionInfo;
- }
- }
-