home *** CD-ROM | disk | FTP | other *** search
/ Computer Shopper 139 / dpcs0999.iso / Web / CFserver / data1.cab / Java / netscape / application / TextSelection.class (.txt) < prev    next >
Encoding:
Java Class File  |  1999-04-12  |  8.5 KB  |  453 lines

  1. package netscape.application;
  2.  
  3. import netscape.util.Vector;
  4.  
  5. class TextSelection implements Target {
  6.    TextView _owner;
  7.    private TextParagraph _editParagraph;
  8.    TextPositionInfo _insertionPointInfo;
  9.    TextPositionInfo _anchorPositionInfo;
  10.    TextPositionInfo _endPositionInfo;
  11.    Timer _blinkTimer;
  12.    long _lastFlashTime;
  13.    int _anchorPosition;
  14.    int _endPosition;
  15.    boolean _flashInsertionPoint;
  16.    boolean _insertionPointShowing;
  17.    boolean _ignoreNextFlash;
  18.    boolean _selectionDefined;
  19.    int _insertionPointDisabled;
  20.  
  21.    TextSelection() {
  22.       this._selectionDefined = false;
  23.    }
  24.  
  25.    TextSelection(TextView var1) {
  26.       this();
  27.       this.init(var1);
  28.       this._selectionDefined = false;
  29.    }
  30.  
  31.    void init(TextView var1) {
  32.       this._owner = var1;
  33.    }
  34.  
  35.    void _startFlashing() {
  36.       if (this._insertionPointDisabled == 0) {
  37.          if (this._owner.isEditable()) {
  38.             if (this._selectionDefined) {
  39.                if (this._blinkTimer == null) {
  40.                   this._blinkTimer = new Timer(this, "blinkCaret", 700);
  41.                }
  42.  
  43.                if (this._owner.isEditing()) {
  44.                   this._blinkTimer.start();
  45.                } else if (System.currentTimeMillis() - this._lastFlashTime > 350L) {
  46.                   this._ignoreNextFlash = true;
  47.                }
  48.  
  49.                this.showInsertionPoint();
  50.             }
  51.          }
  52.       }
  53.    }
  54.  
  55.    void _stopFlashing() {
  56.       this.hideInsertionPoint();
  57.       if (this._blinkTimer != null) {
  58.          this._blinkTimer.stop();
  59.          this._ignoreNextFlash = false;
  60.       }
  61.  
  62.    }
  63.  
  64.    public void performCommand(String var1, Object var2) {
  65.       if (this._owner.isEditing() && this._selectionDefined) {
  66.          if (!this._ignoreNextFlash && this._flashInsertionPoint && !this.isARange()) {
  67.             this._lastFlashTime = this._blinkTimer.timeStamp();
  68.             this._insertionPointShowing = !this._insertionPointShowing;
  69.             this._owner.drawInsertionPoint();
  70.          } else {
  71.             this._ignoreNextFlash = false;
  72.          }
  73.       } else {
  74.          if (this._blinkTimer != null) {
  75.             this._blinkTimer.stop();
  76.          }
  77.  
  78.       }
  79.    }
  80.  
  81.    boolean isARange() {
  82.       return this._insertionPointInfo == null && this._anchorPositionInfo != null;
  83.    }
  84.  
  85.    void disableInsertionPoint() {
  86.       if (this._insertionPointDisabled == 0) {
  87.          this.hideInsertionPoint();
  88.       }
  89.  
  90.       ++this._insertionPointDisabled;
  91.    }
  92.  
  93.    void enableInsertionPoint() {
  94.       --this._insertionPointDisabled;
  95.       if (this._insertionPointDisabled == 0) {
  96.          this.showInsertionPoint();
  97.       }
  98.  
  99.    }
  100.  
  101.    void showInsertionPoint() {
  102.       if (this._insertionPointDisabled == 0) {
  103.          if (this._owner.isEditable()) {
  104.             if (this._owner.isEditing()) {
  105.                this._flashInsertionPoint = true;
  106.                if (!this.isARange() && !this._insertionPointShowing) {
  107.                   this._insertionPointShowing = true;
  108.                   this._owner.drawInsertionPoint();
  109.                   this._startFlashing();
  110.                }
  111.             }
  112.          }
  113.       }
  114.    }
  115.  
  116.    void hideInsertionPoint() {
  117.       this._flashInsertionPoint = false;
  118.       if (!this.isARange() && this._insertionPointShowing) {
  119.          this._insertionPointShowing = false;
  120.          this._owner.drawInsertionPoint();
  121.       }
  122.    }
  123.  
  124.    Rect insertionPointRect() {
  125.       return this._insertionPointInfo == null ? TextView.newRect() : TextView.newRect(this._insertionPointInfo._x - 1, this._insertionPointInfo._y, 1, this._insertionPointInfo._lineHeight);
  126.    }
  127.  
  128.    Rect _updateRectForInfo(int var1, int var2, TextPositionInfo var3, TextPositionInfo var4) {
  129.       if (var1 == var2) {
  130.          return null;
  131.       } else {
  132.          Rect var6;
  133.          if (var3._y == var4._y) {
  134.             if (var4._x < var3._x) {
  135.                var6 = TextView.newRect(var4._x, var4._y, var3._x - var4._x, var4._lineHeight);
  136.             } else {
  137.                var6 = TextView.newRect(var3._x, var4._y, var4._x - var3._x, var4._lineHeight);
  138.             }
  139.          } else {
  140.             var6 = var3.lineBounds();
  141.             Rect var5 = var4.lineBounds();
  142.             var6.unionWith(var5);
  143.             TextView.returnRect(var5);
  144.          }
  145.  
  146.          return var6;
  147.       }
  148.    }
  149.  
  150.    void setRange(int var1, int var2, TextPositionInfo var3, boolean var4, boolean var5) {
  151.       if (var1 != -1 && var2 != -1) {
  152.          this._selectionDefined = true;
  153.       } else {
  154.          this._selectionDefined = false;
  155.       }
  156.  
  157.       TextPositionInfo var6;
  158.       TextPositionInfo var7;
  159.       int var10;
  160.       if (this._anchorPosition != this._endPosition) {
  161.          var10 = this._anchorPosition < this._endPosition ? this._anchorPosition : this._endPosition;
  162.          var6 = this._anchorPosition < this._endPosition ? this._anchorPositionInfo : this._endPositionInfo;
  163.          if (this._anchorPosition > this._endPosition) {
  164.             int var10000 = this._anchorPosition;
  165.          } else {
  166.             int var17 = this._endPosition;
  167.          }
  168.  
  169.          var7 = this._anchorPosition > this._endPosition ? this._anchorPositionInfo : this._endPositionInfo;
  170.       } else {
  171.          boolean var11 = true;
  172.          var10 = -1;
  173.          var7 = null;
  174.          var6 = null;
  175.       }
  176.  
  177.       if (var1 < 0) {
  178.          var1 = 0;
  179.       } else if (var1 >= this._owner._charCount) {
  180.          var1 = this._owner._charCount - 1;
  181.       }
  182.  
  183.       if (var2 < 0) {
  184.          var2 = 0;
  185.       } else if (var2 >= this._owner._charCount) {
  186.          var2 = this._owner._charCount - 1;
  187.       }
  188.  
  189.       this._anchorPosition = var1;
  190.       this._endPosition = var2;
  191.       if (this._anchorPosition == this._endPosition) {
  192.          this._editParagraph = this._owner._paragraphForIndex(this._anchorPosition);
  193.          this._insertionPointInfo = this._editParagraph.infoForPosition(this._anchorPosition, -1);
  194.          if (var5 && this._insertionPointInfo._endOfLine && this._anchorPosition < this._owner.length() - 1) {
  195.             TextParagraph var14 = this._owner._paragraphForIndex(this._anchorPosition + 1);
  196.             if (var14 == this._editParagraph) {
  197.                TextPositionInfo var15 = this._editParagraph.infoForPosition(this._anchorPosition + 1, -1);
  198.                if (var15._y > this._insertionPointInfo._y) {
  199.                   this._insertionPointInfo = this._editParagraph.infoForPosition(this._anchorPosition, var15._y);
  200.                }
  201.             }
  202.          }
  203.  
  204.          this._anchorPositionInfo = this._endPositionInfo = null;
  205.       } else {
  206.          TextParagraph var16 = this._owner._paragraphForIndex(this._anchorPosition);
  207.          this._anchorPositionInfo = var16.infoForPosition(this._anchorPosition, -1);
  208.          if (this._anchorPositionInfo._endOfLine && !var4) {
  209.             this._anchorPositionInfo = var16.infoForPosition(this._anchorPosition, this._anchorPositionInfo.maxY());
  210.          }
  211.  
  212.          if (var3 == null) {
  213.             this._endPositionInfo = this._owner._paragraphForIndex(this._endPosition).infoForPosition(this._endPosition, -1);
  214.          } else {
  215.             this._endPositionInfo = var3;
  216.          }
  217.  
  218.          this._insertionPointInfo = null;
  219.          this._editParagraph = null;
  220.       }
  221.  
  222.       TextPositionInfo var8;
  223.       TextPositionInfo var9;
  224.       int var12;
  225.       if (this._anchorPosition != this._endPosition) {
  226.          var12 = this._anchorPosition < this._endPosition ? this._anchorPosition : this._endPosition;
  227.          var8 = this._anchorPosition < this._endPosition ? this._anchorPositionInfo : this._endPositionInfo;
  228.          if (this._anchorPosition > this._endPosition) {
  229.             int var18 = this._anchorPosition;
  230.          } else {
  231.             int var19 = this._endPosition;
  232.          }
  233.  
  234.          var9 = this._anchorPosition > this._endPosition ? this._anchorPositionInfo : this._endPositionInfo;
  235.       } else {
  236.          boolean var13 = true;
  237.          var12 = -1;
  238.          var9 = null;
  239.          var8 = null;
  240.       }
  241.  
  242.       if (var10 == -1) {
  243.          if (var12 == -1) {
  244.             this._startFlashing();
  245.             this._updateCurrentFont();
  246.          } else {
  247.             this.dirtyRangeForSelection(this._anchorPositionInfo, this._endPositionInfo, (TextPositionInfo)null, (TextPositionInfo)null);
  248.             this._updateCurrentFont();
  249.          }
  250.       } else if (var12 == -1) {
  251.          this.dirtyRangeForSelection(var6, var7, (TextPositionInfo)null, (TextPositionInfo)null);
  252.          this._startFlashing();
  253.          this._updateCurrentFont();
  254.       } else {
  255.          this.dirtyRangeForSelection(var8, var9, var6, var7);
  256.          this._updateCurrentFont();
  257.       }
  258.    }
  259.  
  260.    void dirtyRangeForSelection(TextPositionInfo var1, TextPositionInfo var2, TextPositionInfo var3, TextPositionInfo var4) {
  261.       Rect var10 = null;
  262.       Rect var13 = this._owner.bounds();
  263.       Range var6 = Range.rangeFromIndices(var1._absPosition, var2._absPosition);
  264.       Range var7;
  265.       if (var3 != null && var4 != null) {
  266.          Range var5 = Range.rangeFromIndices(var3._absPosition, var4._absPosition);
  267.          if (var5.equals(var6)) {
  268.             return;
  269.          }
  270.  
  271.          if (var6.index == var5.index) {
  272.             if (var6.length > var5.length) {
  273.                var7 = new Range(var6.index + var5.length, var6.length - var5.length);
  274.             } else {
  275.                var7 = new Range(var6.index + var6.length, var5.length - var6.length);
  276.             }
  277.          } else {
  278.             if (var6.index + var6.length != var5.index + var5.length) {
  279.                this.dirtyRangeForSelection(var1, var2, (TextPositionInfo)null, (TextPositionInfo)null);
  280.                this.dirtyRangeForSelection(var3, var4, (TextPositionInfo)null, (TextPositionInfo)null);
  281.                return;
  282.             }
  283.  
  284.             if (var6.length > var5.length) {
  285.                var7 = new Range(var6.index, var6.length - var5.length);
  286.             } else {
  287.                var7 = new Range(var5.index, var5.length - var6.length);
  288.             }
  289.          }
  290.       } else {
  291.          var7 = var6;
  292.       }
  293.  
  294.       Vector var8 = this._owner.rectsForRange(var7);
  295.       int var11 = 0;
  296.  
  297.       for(int var12 = var8.count(); var11 < var12; ++var11) {
  298.          Rect var9 = (Rect)var8.elementAt(var11);
  299.          var9.x = 0;
  300.          var9.width = var13.width;
  301.          if (var9.height > 0) {
  302.             if (var10 == null) {
  303.                var10 = new Rect(var9);
  304.             } else {
  305.                var10.unionWith(var9);
  306.             }
  307.          }
  308.       }
  309.  
  310.       if (var10 != null) {
  311.          if (var7.contains(var1._absPosition) && !var10.contains(var1._x, var1._y) && var1._absPosition > 0) {
  312.             TextPositionInfo var14 = this._owner.positionInfoForIndex(var1._absPosition - 1);
  313.             if (var14 != null) {
  314.                var10.y -= var14._lineHeight;
  315.                var10.height += var14._lineHeight;
  316.             }
  317.          }
  318.  
  319.          if (var7.contains(var2._absPosition) && !var10.contains(var2._x, var2._y) && var2._absPosition > 0) {
  320.             TextPositionInfo var15 = this._owner.positionInfoForIndex(var2._absPosition - 1);
  321.             if (var15 != null) {
  322.                var10.y -= var15._lineHeight;
  323.                var10.height += var15._lineHeight;
  324.             }
  325.          }
  326.  
  327.          if (var3 != null && var7.contains(var3._absPosition) && !var10.contains(var3._x, var3._y) && var3._absPosition > 0) {
  328.             TextPositionInfo var16 = this._owner.positionInfoForIndex(var3._absPosition - 1);
  329.             if (var16 != null) {
  330.                var10.y -= var16._lineHeight;
  331.                var10.height += var16._lineHeight;
  332.             }
  333.          }
  334.  
  335.          if (var4 != null && var7.contains(var4._absPosition) && !var10.contains(var4._x, var4._y) && var4._absPosition > 0) {
  336.             TextPositionInfo var17 = this._owner.positionInfoForIndex(var4._absPosition - 1);
  337.             if (var17 != null) {
  338.                var10.y -= var17._lineHeight;
  339.                var10.height += var17._lineHeight;
  340.             }
  341.          }
  342.  
  343.          this._owner.addDirtyRect(var10);
  344.       }
  345.    }
  346.  
  347.    void setRange(int var1, int var2, TextPositionInfo var3, boolean var4) {
  348.       this.setRange(var1, var2, var3, var4, false);
  349.    }
  350.  
  351.    void setRange(int var1, int var2) {
  352.       this.setRange(var1, var2, (TextPositionInfo)null, false, false);
  353.    }
  354.  
  355.    void setRange(int var1, int var2, boolean var3) {
  356.       this.setRange(var1, var2, (TextPositionInfo)null, false, var3);
  357.    }
  358.  
  359.    void clearRange() {
  360.       this.hideInsertionPoint();
  361.       this.setRange(-1, -1);
  362.       this._stopFlashing();
  363.    }
  364.  
  365.    void setInsertionPoint(TextPositionInfo var1) {
  366.       Rect var2 = null;
  367.       if (var1 != null) {
  368.          this._selectionDefined = true;
  369.          if (this._anchorPosition != this._endPosition) {
  370.             var2 = this._anchorPositionInfo.lineBounds();
  371.             Rect var3 = this._endPositionInfo.lineBounds();
  372.             var2.unionWith(var3);
  373.             var2.x = 0;
  374.             var2.width = this._owner.bounds.width;
  375.             TextView.returnRect(var3);
  376.          }
  377.  
  378.          this._anchorPosition = this._endPosition = var1._absPosition;
  379.          this._insertionPointInfo = var1;
  380.          this._editParagraph = this._insertionPointInfo._textRun._paragraph;
  381.          this._anchorPositionInfo = this._endPositionInfo = null;
  382.          if (var2 != null) {
  383.             this._owner.draw(var2);
  384.             TextView.returnRect(var2);
  385.          }
  386.  
  387.          if (this._insertionPointShowing) {
  388.             this._startFlashing();
  389.          }
  390.  
  391.       }
  392.    }
  393.  
  394.    int insertionPoint() {
  395.       return this.isARange() ? -1 : this._anchorPosition;
  396.    }
  397.  
  398.    TextPositionInfo insertionPointInfo() {
  399.       return this.isARange() ? null : this._insertionPointInfo;
  400.    }
  401.  
  402.    int selectionStart() {
  403.       if (!this._selectionDefined) {
  404.          return -1;
  405.       } else {
  406.          return this._anchorPosition <= this._endPosition ? this._anchorPosition : this._endPosition;
  407.       }
  408.    }
  409.  
  410.    TextPositionInfo selectionStartInfo() {
  411.       if (!this.isARange()) {
  412.          return this._insertionPointInfo;
  413.       } else {
  414.          return this._anchorPosition <= this._endPosition ? this._anchorPositionInfo : this._endPositionInfo;
  415.       }
  416.    }
  417.  
  418.    int selectionEnd() {
  419.       if (!this._selectionDefined) {
  420.          return -1;
  421.       } else {
  422.          return this._endPosition > this._anchorPosition ? this._endPosition : this._anchorPosition;
  423.       }
  424.    }
  425.  
  426.    TextPositionInfo selectionEndInfo() {
  427.       if (!this.isARange()) {
  428.          return this._insertionPointInfo;
  429.       } else {
  430.          return this._endPosition > this._anchorPosition ? this._endPositionInfo : this._anchorPositionInfo;
  431.       }
  432.    }
  433.  
  434.    void _updateCurrentFont() {
  435.    }
  436.  
  437.    int orderedSelectionStart() {
  438.       return !this._selectionDefined ? -1 : this._anchorPosition;
  439.    }
  440.  
  441.    TextPositionInfo orderedSelectionStartInfo() {
  442.       return !this.isARange() ? this._insertionPointInfo : this._anchorPositionInfo;
  443.    }
  444.  
  445.    int orderedSelectionEnd() {
  446.       return !this._selectionDefined ? -1 : this._endPosition;
  447.    }
  448.  
  449.    TextPositionInfo orderedSelectionEndInfo() {
  450.       return !this.isARange() ? this._insertionPointInfo : this._endPositionInfo;
  451.    }
  452. }
  453.