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

  1. package netscape.application;
  2.  
  3. import netscape.util.ClassInfo;
  4. import netscape.util.Codable;
  5. import netscape.util.CodingException;
  6. import netscape.util.Decoder;
  7. import netscape.util.Encoder;
  8. import netscape.util.InconsistencyException;
  9. import netscape.util.Vector;
  10.  
  11. public class TextField extends View implements ExtendedTarget, FormElement {
  12.    TextFieldOwner _owner;
  13.    TextFilter _filter;
  14.    Target _tabTarget;
  15.    Target _backtabTarget;
  16.    Target _contentsChangedTarget;
  17.    Target _commitTarget;
  18.    Vector _keyVector;
  19.    Border border;
  20.    Font _font;
  21.    Color _textColor;
  22.    Color _backgroundColor;
  23.    Color _selectionColor;
  24.    Color _caretColor;
  25.    String _tabCommand;
  26.    String _backtabCommand;
  27.    String _contentsChangedCommand;
  28.    String _commitCommand;
  29.    FastStringBuffer _contents;
  30.    FastStringBuffer _oldContents;
  31.    Timer blinkTimer;
  32.    char _drawableCharacter;
  33.    int _selectionAnchorChar;
  34.    int _selectionEndChar;
  35.    int _justification;
  36.    int _scrollOffset;
  37.    int _fontHeight;
  38.    int _initialAnchorChar;
  39.    int _clickCount;
  40.    boolean _editing;
  41.    boolean _caretShowing;
  42.    boolean _canBlink;
  43.    boolean _editable;
  44.    boolean _selectable;
  45.    boolean _mouseDragging;
  46.    boolean _shadowed;
  47.    boolean _textChanged;
  48.    boolean _canWrap;
  49.    boolean transparent;
  50.    boolean wantsAutoscrollEvents;
  51.    boolean isScrollable;
  52.    boolean hasFocus;
  53.    boolean _ignoreWillBecomeSelected;
  54.    public static char ANY_CHARACTER = '\uffff';
  55.    public static final String SELECT_TEXT = "selectText";
  56.    static final String BLINK_CARET = "blinkCaret";
  57.    static final String OWNER_KEY = "owner";
  58.    static final String FILTER_KEY = "filter";
  59.    static final String TABREC_KEY = "tabTarget";
  60.    static final String BACKTABREC_KEY = "backtabTarget";
  61.    static final String CONTENTSCHANGEDREC_KEY = "contentsChangedTarget";
  62.    static final String COMMITREC_KEY = "commitTarget";
  63.    static final String BORDER_KEY = "border";
  64.    static final String FONT_KEY = "font";
  65.    static final String TEXTC_KEY = "textColor";
  66.    static final String BACKGROUNDC_KEY = "backgroundColor";
  67.    static final String SELECTIONC_KEY = "selectionColor";
  68.    static final String CARETC_KEY = "caretColor";
  69.    static final String TABCOM_KEY = "tabCommand";
  70.    static final String BACKTABCOM_KEY = "backtabCommand";
  71.    static final String CONTENTSCHANGEDCOM_KEY = "contentsChangedCommand";
  72.    static final String COMMITCOM_KEY = "commitCommand";
  73.    static final String CONTENTS_KEY = "contents";
  74.    static final String SELECTIONANCH_KEY = "selectionAnchorChar";
  75.    static final String SELECTIONEND_KEY = "selectionEndChar";
  76.    static final String JUSTIFICATION_KEY = "justification";
  77.    static final String SCROLLOFFSET_KEY = "scrollOffset";
  78.    static final String EDITABLE_KEY = "editable";
  79.    static final String SELECTABLE_KEY = "selectable";
  80.    static final String SHADOWED_KEY = "shadowed";
  81.    static final String CANWRAP_KEY = "canWrap";
  82.    static final String AUTOSCROLLEVENT_KEY = "wantsAutoscrollEvents";
  83.    static final String TRANSPARENT_KEY = "transparent";
  84.    static final String DRAWABLE_CHAR_KEY = "drawableCharacter";
  85.    static final String DRAWABLE_CHAR_STRING_KEY = "drawable char";
  86.    static final String SCROLLABLE_KEY = "isScrollable";
  87.  
  88.    public TextField() {
  89.       this(0, 0, 0, 0);
  90.    }
  91.  
  92.    public TextField(Rect var1) {
  93.       this(var1.x, var1.y, var1.width, var1.height);
  94.    }
  95.  
  96.    public TextField(int var1, int var2, int var3, int var4) {
  97.       super(var1, var2, var3, var4);
  98.       this.border = BezelBorder.loweredBezel();
  99.       this._selectionAnchorChar = -1;
  100.       this._selectionEndChar = -1;
  101.       this._initialAnchorChar = -1;
  102.       this._textChanged = false;
  103.       this.transparent = false;
  104.       this.wantsAutoscrollEvents = false;
  105.       this.isScrollable = true;
  106.       this.hasFocus = false;
  107.       this._keyVector = new Vector();
  108.       this._contents = new FastStringBuffer();
  109.       this._drawableCharacter = ANY_CHARACTER;
  110.       this._textColor = Color.black;
  111.       this._backgroundColor = Color.white;
  112.       this._selectionColor = Color.lightGray;
  113.       this._caretColor = Color.black;
  114.       this.setEditable(true);
  115.       this.setFont(Font.defaultFont());
  116.    }
  117.  
  118.    public static TextField createLabel(String var0, Font var1) {
  119.       FontMetrics var2 = var1.fontMetrics();
  120.       int var3 = var2.stringWidth(var0);
  121.       int var4 = var2.stringHeight();
  122.       TextField var5 = new TextField(0, 0, var3, var4);
  123.       var5.setBorder((Border)null);
  124.       var5.setStringValue(var0);
  125.       var5.setFont(var1);
  126.       var5.setTransparent(true);
  127.       var5.setEditable(false);
  128.       var5.setSelectable(false);
  129.       return var5;
  130.    }
  131.  
  132.    public static TextField createLabel(String var0) {
  133.       return createLabel(var0, Font.defaultFont());
  134.    }
  135.  
  136.    private static int parseInt(String var0) {
  137.       try {
  138.          return Integer.parseInt(var0);
  139.       } catch (NumberFormatException var1) {
  140.          return 0;
  141.       }
  142.    }
  143.  
  144.    public int leftIndent() {
  145.       int var1 = this.border.leftMargin();
  146.       if (var1 > 2) {
  147.          var1 = 2;
  148.       }
  149.  
  150.       return var1;
  151.    }
  152.  
  153.    public int rightIndent() {
  154.       int var1 = this.border.rightMargin() + 1;
  155.       if (var1 > 3) {
  156.          var1 = 3;
  157.       }
  158.  
  159.       return var1;
  160.    }
  161.  
  162.    private int widthIndent() {
  163.       return this.leftIndent() + this.rightIndent();
  164.    }
  165.  
  166.    public Size minSize() {
  167.       if (super._minSize != null) {
  168.          return new Size(super._minSize);
  169.       } else {
  170.          Size var3 = this._font.fontMetrics().stringSize(this.drawableString());
  171.          Rect var2 = this.interiorRect();
  172.          if (((View)this).horizResizeInstruction() != 2 && this._canWrap && !this.isEditable() && var3.width > var2.width) {
  173.             Vector var1 = this.stringVectorForContents(var2.width);
  174.             var3.sizeTo(var2.width, var3.height * var1.count());
  175.          }
  176.  
  177.          Rect.returnRect(var2);
  178.          var3.sizeBy(this.border.widthMargin() + this.widthIndent(), this.border.heightMargin());
  179.          return var3;
  180.       }
  181.    }
  182.  
  183.    public void setDrawableCharacter(char var1) {
  184.       this._drawableCharacter = var1;
  185.       this._scrollOffset = 0;
  186.       this._computeScrollOffset();
  187.       ((View)this).setDirty(true);
  188.    }
  189.  
  190.    public char drawableCharacter() {
  191.       return this._drawableCharacter;
  192.    }
  193.  
  194.    public void setFont(Font var1) {
  195.       if (var1 == null) {
  196.          this._font = Font.defaultFont();
  197.       } else {
  198.          this._font = var1;
  199.       }
  200.  
  201.       Size var2 = this._font.fontMetrics().stringSize((String)null);
  202.       this._fontHeight = var2.height;
  203.       ((View)this).setDirty(true);
  204.    }
  205.  
  206.    public Font font() {
  207.       return this._font;
  208.    }
  209.  
  210.    public void setTextColor(Color var1) {
  211.       this._textColor = var1;
  212.       if (this._textColor == null) {
  213.          this._textColor = Color.black;
  214.       }
  215.  
  216.       ((View)this).setDirty(true);
  217.    }
  218.  
  219.    public Color textColor() {
  220.       return this._textColor;
  221.    }
  222.  
  223.    public void setBackgroundColor(Color var1) {
  224.       this._backgroundColor = var1;
  225.       if (this._backgroundColor == null) {
  226.          this._backgroundColor = Color.white;
  227.       }
  228.  
  229.       ((View)this).setDirty(true);
  230.    }
  231.  
  232.    public Color backgroundColor() {
  233.       return this._backgroundColor;
  234.    }
  235.  
  236.    public void setSelectionColor(Color var1) {
  237.       this._selectionColor = var1;
  238.       if (this._selectionColor == null) {
  239.          this._selectionColor = Color.lightGray;
  240.       }
  241.  
  242.       ((View)this).setDirty(true);
  243.    }
  244.  
  245.    public Color selectionColor() {
  246.       return this._selectionColor;
  247.    }
  248.  
  249.    public void setCaretColor(Color var1) {
  250.       this._caretColor = var1;
  251.       if (this._caretColor == null) {
  252.          this._caretColor = Color.black;
  253.       }
  254.  
  255.    }
  256.  
  257.    public Color caretColor() {
  258.       return this._caretColor;
  259.    }
  260.  
  261.    public void setBorder(Border var1) {
  262.       if (var1 == null) {
  263.          var1 = EmptyBorder.emptyBorder();
  264.       }
  265.  
  266.       this.border = var1;
  267.    }
  268.  
  269.    public Border border() {
  270.       return this.border;
  271.    }
  272.  
  273.    public void setDrawsDropShadow(boolean var1) {
  274.       this._shadowed = var1;
  275.       ((View)this).setDirty(true);
  276.    }
  277.  
  278.    public boolean drawsDropShadow() {
  279.       return this._shadowed;
  280.    }
  281.  
  282.    public void setJustification(int var1) {
  283.       if (var1 >= 0 && var1 <= 2) {
  284.          if (var1 != this._justification) {
  285.             this._justification = var1;
  286.             this._scrollOffset = 0;
  287.          }
  288.  
  289.       }
  290.    }
  291.  
  292.    public int justification() {
  293.       return this._justification;
  294.    }
  295.  
  296.    public void setTransparent(boolean var1) {
  297.       this.transparent = var1;
  298.       if (this.transparent) {
  299.          this.setBorder((Border)null);
  300.       }
  301.  
  302.    }
  303.  
  304.    public boolean isTransparent() {
  305.       return this.transparent;
  306.    }
  307.  
  308.    public void setSelectable(boolean var1) {
  309.       if (this._selectable != var1) {
  310.          this._selectable = var1;
  311.          this.wantsAutoscrollEvents = var1;
  312.          if (!this._selectable && this._scrollOffset != 0) {
  313.             this._scrollOffset = 0;
  314.             this.drawInterior();
  315.          }
  316.  
  317.          RootView var2 = ((View)this).rootView();
  318.          if (var2 != null) {
  319.             var2.updateCursor();
  320.          }
  321.       }
  322.  
  323.    }
  324.  
  325.    public boolean isSelectable() {
  326.       return this._selectable;
  327.    }
  328.  
  329.    public boolean wantsAutoscrollEvents() {
  330.       return this.wantsAutoscrollEvents;
  331.    }
  332.  
  333.    public void setWrapsContents(boolean var1) {
  334.       this._canWrap = var1;
  335.       if (var1 && this.isEditable()) {
  336.          this.setEditable(false);
  337.       }
  338.  
  339.       this.drawInterior();
  340.    }
  341.  
  342.    public boolean wrapsContents() {
  343.       return this._canWrap;
  344.    }
  345.  
  346.    public void setEditable(boolean var1) {
  347.       if (this._editable != var1) {
  348.          this._editable = var1;
  349.          this.setSelectable(var1);
  350.          if (var1 && this.wrapsContents()) {
  351.             this.setWrapsContents(false);
  352.          }
  353.       }
  354.  
  355.    }
  356.  
  357.    public boolean isEditable() {
  358.       return this._editable;
  359.    }
  360.  
  361.    public boolean isBeingEdited() {
  362.       return this._editing;
  363.    }
  364.  
  365.    public int cursorForPoint(int var1, int var2) {
  366.       return !this.isEditable() && !this.isSelectable() ? 0 : 2;
  367.    }
  368.  
  369.    public void setOwner(TextFieldOwner var1) {
  370.       this._owner = var1;
  371.    }
  372.  
  373.    public TextFieldOwner owner() {
  374.       return this._owner;
  375.    }
  376.  
  377.    public void setFilter(TextFilter var1) {
  378.       this._filter = var1;
  379.    }
  380.  
  381.    public TextFilter filter() {
  382.       return this._filter;
  383.    }
  384.  
  385.    public void setContentsChangedCommandAndTarget(String var1, Target var2) {
  386.       this._contentsChangedCommand = var1;
  387.       this._contentsChangedTarget = var2;
  388.    }
  389.  
  390.    public Target contentsChangedTarget() {
  391.       return this._contentsChangedTarget;
  392.    }
  393.  
  394.    public String contentsChangedCommand() {
  395.       return this._contentsChangedCommand;
  396.    }
  397.  
  398.    public void setTabField(TextField var1) {
  399.       if (var1 == null) {
  400.          this._tabTarget = null;
  401.          this._tabCommand = null;
  402.       } else {
  403.          this._tabTarget = var1;
  404.          this._tabCommand = "selectText";
  405.       }
  406.  
  407.       ((View)this).invalidateKeyboardSelectionOrder();
  408.    }
  409.  
  410.    public TextField tabField() {
  411.       return this._tabTarget instanceof TextField ? (TextField)this._tabTarget : null;
  412.    }
  413.  
  414.    public void setBacktabField(TextField var1) {
  415.       if (var1 == null) {
  416.          this._backtabTarget = null;
  417.          this._backtabCommand = null;
  418.       } else if (var1 != this) {
  419.          this._backtabTarget = var1;
  420.          this._backtabCommand = "selectText";
  421.       }
  422.  
  423.       ((View)this).invalidateKeyboardSelectionOrder();
  424.    }
  425.  
  426.    public TextField backtabField() {
  427.       return this._backtabTarget instanceof TextField ? (TextField)this._backtabTarget : null;
  428.    }
  429.  
  430.    public void setTarget(Target var1) {
  431.       this._commitTarget = var1;
  432.    }
  433.  
  434.    public void setCommand(String var1) {
  435.       this._commitCommand = var1;
  436.    }
  437.  
  438.    public Target target() {
  439.       return this._commitTarget;
  440.    }
  441.  
  442.    public String command() {
  443.       return this._commitCommand;
  444.    }
  445.  
  446.    public void setStringValue(String var1) {
  447.       if (var1 != null && var1.equals(this.stringValue())) {
  448.          if (this.isBeingEdited()) {
  449.             this.cancelEditing();
  450.          }
  451.  
  452.       } else {
  453.          if (var1 == null) {
  454.             var1 = "";
  455.          }
  456.  
  457.          this.replaceRangeWithString(new Range(0, this.charCount()), var1);
  458.          this._oldContents = null;
  459.          if (this.isBeingEdited()) {
  460.             this.cancelEditing();
  461.          } else {
  462.             ((View)this).setDirty(true);
  463.          }
  464.       }
  465.    }
  466.  
  467.    public String stringValue() {
  468.       return this._contents == null ? "" : this._contents.toString();
  469.    }
  470.  
  471.    public void replaceRangeWithString(Range var1, String var2) {
  472.       String var3 = this.stringValue();
  473.       Range var4 = new Range();
  474.       var4.index = var1.index;
  475.       var4.length = var1.length;
  476.       var4.intersectWith(new Range(0, var3.length()));
  477.       if (var4.isNullRange()) {
  478.          var4.index = var3.length();
  479.          var4.length = 0;
  480.       }
  481.  
  482.       String var5 = var3.substring(0, var4.index);
  483.       String var6 = var3.substring(var4.index + var4.length);
  484.       if (var2 != null) {
  485.          this._contents = new FastStringBuffer(var5 + var2 + var6);
  486.       } else {
  487.          this._contents = new FastStringBuffer(var5 + var6);
  488.       }
  489.  
  490.       if (this.isBeingEdited()) {
  491.          var4.index = 0;
  492.          var4.length = this._contents.length();
  493.          Range var7 = this.selectedRange();
  494.          var7.intersectWith(var4);
  495.          if (var7.isNullRange()) {
  496.             this.selectRange(new Range(this._contents.length, 0));
  497.          } else {
  498.             this.selectRange(var7);
  499.          }
  500.       } else {
  501.          ((View)this).setDirty(true);
  502.       }
  503.    }
  504.  
  505.    public String stringForRange(Range var1) {
  506.       String var2 = this.stringValue();
  507.       Range var3 = new Range();
  508.       var3.index = var1.index;
  509.       var3.length = var1.length;
  510.       var3.intersectWith(new Range(0, var2.length()));
  511.       return var3.isNullRange() ? "" : var2.substring(var3.index, var3.index + var3.length());
  512.    }
  513.  
  514.    public String selectedStringValue() {
  515.       if (this.hasInsertionPoint()) {
  516.          return "";
  517.       } else {
  518.          int var1 = this.selectionStart();
  519.          int var2 = this.selectionStop();
  520.          if (var1 != -1 && var2 != -1) {
  521.             return var2 == this._contents.length() ? this._contents.toString().substring(var1) : this._contents.toString().substring(var1, var2);
  522.          } else {
  523.             return "";
  524.          }
  525.       }
  526.    }
  527.  
  528.    public void setIntValue(int var1) {
  529.       this.setStringValue(Integer.toString(var1));
  530.    }
  531.  
  532.    public int intValue() {
  533.       return parseInt(this._contents.toString());
  534.    }
  535.  
  536.    public boolean isEmpty() {
  537.       return this.charCount() == 0;
  538.    }
  539.  
  540.    public int charCount() {
  541.       return this._contents.length();
  542.    }
  543.  
  544.    public int baseline() {
  545.       String var1 = this.drawableString();
  546.       Size var3 = this._font.fontMetrics().stringSize(var1);
  547.       Rect var2 = Rect.newRect();
  548.       this.border.computeInteriorRect(0, 0, super.bounds.width, super.bounds.height, var2);
  549.       int var4 = var2.maxY() - (var2.height - var3.height) / 2 - this._font.fontMetrics().descent();
  550.       Rect.returnRect(var2);
  551.       return var4;
  552.    }
  553.  
  554.    public void selectRange(Range var1) {
  555.       if (var1.length >= 0 && var1.index >= 0) {
  556.          this.selectRange(var1.index, var1.index + var1.length);
  557.       } else {
  558.          throw new InconsistencyException("TextField - invalid range: " + var1);
  559.       }
  560.    }
  561.  
  562.    protected void selectRange(int var1, int var2) {
  563.       if (this.isSelectable()) {
  564.          if (var1 < 0) {
  565.             var1 = 0;
  566.          } else if (var1 > this._contents.length()) {
  567.             var1 = this._contents.length();
  568.          }
  569.  
  570.          if (var2 < 0) {
  571.             var2 = 0;
  572.          } else if (var2 > this._contents.length()) {
  573.             var2 = this._contents.length();
  574.          }
  575.  
  576.          this._selectionAnchorChar = var1;
  577.          this._selectionEndChar = var2;
  578.          if (this.isEditable() && !this.isBeingEdited()) {
  579.             this._startEditing(true);
  580.          }
  581.  
  582.          this.drawInterior();
  583.       }
  584.    }
  585.  
  586.    public void selectText() {
  587.       this.selectRange(0, this.charCount());
  588.    }
  589.  
  590.    public void setInsertionPoint(int var1) {
  591.       this.selectRange(var1, var1);
  592.    }
  593.  
  594.    int selectionAnchorPoint() {
  595.       return this._selectionAnchorChar;
  596.    }
  597.  
  598.    int selectionEndPoint() {
  599.       return this._selectionEndChar;
  600.    }
  601.  
  602.    public Range selectedRange() {
  603.       if (this.hasInsertionPoint()) {
  604.          return new Range(this._selectionAnchorChar, 0);
  605.       } else {
  606.          return this._selectionAnchorChar != -1 && this._selectionEndChar != -1 ? Range.rangeFromIndices(this.selectionStart(), this.selectionStop()) : new Range();
  607.       }
  608.    }
  609.  
  610.    int selectionStart() {
  611.       return this._selectionAnchorChar < this._selectionEndChar ? this._selectionAnchorChar : this._selectionEndChar;
  612.    }
  613.  
  614.    int selectionStop() {
  615.       return this._selectionAnchorChar < this._selectionEndChar ? this._selectionEndChar : this._selectionAnchorChar;
  616.    }
  617.  
  618.    public boolean hasSelection() {
  619.       return this._selectionAnchorChar != this._selectionEndChar;
  620.    }
  621.  
  622.    public boolean hasInsertionPoint() {
  623.       return this._selectionAnchorChar == this._selectionEndChar && this._selectionAnchorChar != -1;
  624.    }
  625.  
  626.    Rect caretRect() {
  627.       FontMetrics var1 = this._font.fontMetrics();
  628.       if (var1 == null) {
  629.          return null;
  630.       } else {
  631.          Rect var2 = this.interiorRect();
  632.          int var4 = var2.maxY() - (var2.height - this._fontHeight) / 2;
  633.          int var3 = var4 - var1.charHeight();
  634.          int var5 = this.border.topMargin();
  635.          if (var3 < var5) {
  636.             var3 = var5;
  637.          }
  638.  
  639.          Rect.returnRect(var2);
  640.          return Rect.newRect(this.xPositionOfCharacter(this._selectionEndChar), var3, 1, var4 - var3);
  641.       }
  642.    }
  643.  
  644.    Rect interiorRect() {
  645.       Rect var1 = Rect.newRect();
  646.       this.border.computeInteriorRect(0, 0, ((View)this).width(), ((View)this).height(), var1);
  647.       return var1;
  648.    }
  649.  
  650.    Rect rectForRange(int var1, int var2) {
  651.       int var4 = this.xPositionOfCharacter(var1);
  652.       Rect var3 = this.interiorRect();
  653.       var3.setBounds(var4, var3.y, this.xPositionOfCharacter(var2) - var4 + 1, var3.height);
  654.       return var3;
  655.    }
  656.  
  657.    public int xPositionOfCharacter(int var1) {
  658.       FontMetrics var2 = this._font.fontMetrics();
  659.       String var3 = this.drawableString();
  660.       int var5 = var2.stringWidth(var3);
  661.       int var4 = this.absoluteXOriginForStringWithWidth(var5);
  662.       return var1 <= 0 ? var4 : var4 + var2.stringWidth(var3.substring(0, var1));
  663.    }
  664.  
  665.    public int charNumberForPoint(int var1) {
  666.       int var4 = this._contents.length();
  667.       if (var4 == 0) {
  668.          return 0;
  669.       } else {
  670.          FontMetrics var2 = this._font.fontMetrics();
  671.          String var3 = this.drawableString();
  672.          int var5 = var2.stringWidth(var3);
  673.          int var10 = this.absoluteXOriginForStringWithWidth(var5);
  674.          if (var1 < var10) {
  675.             return 0;
  676.          } else if (var1 > var10 + var5) {
  677.             return var4;
  678.          } else {
  679.             int var8 = 0;
  680.  
  681.             for(int var6 = 1; var6 < var4; ++var6) {
  682.                int var7 = var2.stringWidth(var3.substring(0, var6));
  683.                int var9 = var7 - var8;
  684.                if (var1 <= var10 + var7) {
  685.                   if (var1 > var10 + var8 + var9 / 2) {
  686.                      return var6;
  687.                   }
  688.  
  689.                   return var6 - 1;
  690.                }
  691.  
  692.                var8 = var7;
  693.             }
  694.  
  695.             return var4;
  696.          }
  697.       }
  698.    }
  699.  
  700.    void drawViewCaret(Graphics var1) {
  701.       if (this._caretShowing && this._selectionAnchorChar != -1 && this._selectionAnchorChar == this._selectionEndChar && this.hasFocus) {
  702.          var1.setColor(this._caretColor);
  703.          Rect var2 = this.caretRect();
  704.          var1.drawLine(var2.x, var2.y, var2.x, var2.maxY() - 1);
  705.          Rect.returnRect(var2);
  706.       }
  707.    }
  708.  
  709.    Vector stringVectorForContents(int var1) {
  710.       Vector var5 = new Vector();
  711.       String var6 = this.drawableString();
  712.       char[] var11 = new char[1];
  713.       FontMetrics var3 = this.font().fontMetrics();
  714.       int[] var2 = var3.widthsArray();
  715.       int var7 = 0;
  716.       int var9 = var6.length();
  717.       int var8 = var7;
  718.       int var4 = 0;
  719.       int var10 = -1;
  720.  
  721.       while(var7 < var9) {
  722.          char var12 = var6.charAt(var7);
  723.          if (var12 == ' ' || var12 == '\t') {
  724.             var10 = var7;
  725.          }
  726.  
  727.          if (var12 == '\n') {
  728.             var5.addElement(var6.substring(var8, var7));
  729.             ++var7;
  730.             var8 = var7;
  731.             var4 = 0;
  732.             var10 = -1;
  733.          } else {
  734.             if (var12 < 256) {
  735.                var4 += var2[var12];
  736.             } else {
  737.                var11[0] = var12;
  738.                var4 += var3.stringWidth(new String(var11));
  739.             }
  740.  
  741.             if (var4 > var1) {
  742.                if (var7 == var8) {
  743.                   var5.addElement(var6.substring(var8, var8 + 1));
  744.                   ++var7;
  745.                   var8 = var7;
  746.                }
  747.  
  748.                if (var10 == -1) {
  749.                   var5.addElement(var6.substring(var8, var7));
  750.                   var8 = var7;
  751.                } else {
  752.                   var5.addElement(var6.substring(var8, var10));
  753.                   var8 = var10 + 1;
  754.                   var7 = var8;
  755.                }
  756.  
  757.                var4 = 0;
  758.                var10 = -1;
  759.             } else {
  760.                ++var7;
  761.             }
  762.          }
  763.       }
  764.  
  765.       if (var8 < var9) {
  766.          var5.addElement(var6.substring(var8));
  767.       }
  768.  
  769.       return var5;
  770.    }
  771.  
  772.    public void drawViewStringAt(Graphics var1, String var2, int var3, int var4) {
  773.       if (this._shadowed) {
  774.          var1.setColor(Color.black);
  775.          var1.drawString(var2, var3 + 2, var4 + 2);
  776.       }
  777.  
  778.       var1.setColor(this._textColor);
  779.       var1.drawString(var2, var3, var4);
  780.    }
  781.  
  782.    int absoluteXOriginForStringWithWidth(int var1) {
  783.       int var2;
  784.       if (this._justification == 2) {
  785.          var2 = ((View)this).width() - this.border.rightMargin() - this.rightIndent() - var1 - this._scrollOffset;
  786.       } else if (this._justification == 1) {
  787.          var2 = this.border.leftMargin() + this.leftIndent() + (((View)this).width() - (this.border.widthMargin() + this.widthIndent()) - var1) / 2 - this._scrollOffset;
  788.       } else {
  789.          var2 = this.border.leftMargin() + this.leftIndent() - this._scrollOffset;
  790.       }
  791.  
  792.       return var2;
  793.    }
  794.  
  795.    void drawViewLine(Graphics var1, String var2, Size var3, int var4) {
  796.       if (var3 == null) {
  797.          var3 = this._font.fontMetrics().stringSize(var2);
  798.       }
  799.  
  800.       int var5 = this.absoluteXOriginForStringWithWidth(var3.width);
  801.       this.drawViewStringAt(var1, var2, var5, var4);
  802.    }
  803.  
  804.    public void drawViewInterior(Graphics var1, Rect var2) {
  805.       int var7 = this.baseline();
  806.       var1.pushState();
  807.       var1.setClipRect(var2);
  808.       if (!this.isTransparent()) {
  809.          var1.setColor(this._backgroundColor);
  810.          var1.fillRect(var2);
  811.       }
  812.  
  813.       if (this._selectionAnchorChar != this._selectionEndChar && this.hasFocus && this.isSelectable()) {
  814.          int var8 = this.xPositionOfCharacter(this.selectionStart());
  815.          int var9 = this.xPositionOfCharacter(this.selectionStop());
  816.          Rect var6 = this.caretRect();
  817.          var1.setColor(this._selectionColor);
  818.          var1.fillRect(var8, var6.y, var9 - var8, var6.height);
  819.          Rect.returnRect(var6);
  820.       }
  821.  
  822.       var1.setFont(this._font);
  823.       String var4 = this.drawableString();
  824.       Size var5 = this._font.fontMetrics().stringSize(var4);
  825.       if (this._canWrap && !this.isEditable()) {
  826.          Vector var3 = this.stringVectorForContents(var2.width);
  827.          int var11 = var3.count();
  828.          if (var11 > 1) {
  829.             var7 += (var2.height - var5.height) / 2;
  830.             int var12 = (var2.height - var5.height * var11) / 2;
  831.             var7 -= var12 + (var11 - 1) * var5.height;
  832.          }
  833.  
  834.          for(int var10 = 0; var10 < var11; ++var10) {
  835.             this.drawViewLine(var1, (String)var3.elementAt(var10), (Size)null, var7);
  836.             var7 += var5.height;
  837.          }
  838.       } else {
  839.          this.drawViewLine(var1, var4, var5, var7);
  840.       }
  841.  
  842.       if (this.isBeingEdited() && this._caretShowing) {
  843.          this.drawViewCaret(var1);
  844.       }
  845.  
  846.       var1.popState();
  847.    }
  848.  
  849.    public void drawViewBorder(Graphics var1) {
  850.       if (this.border != null) {
  851.          this.border.drawInRect(var1, 0, 0, ((View)this).width(), ((View)this).height());
  852.       } else {
  853.          if (!this.isTransparent() && this._backgroundColor != null) {
  854.             var1.setColor(this._backgroundColor);
  855.             var1.fillRect(0, 0, ((View)this).width(), ((View)this).height());
  856.          }
  857.  
  858.       }
  859.    }
  860.  
  861.    public void drawView(Graphics var1) {
  862.       this.drawViewBorder(var1);
  863.       Rect var2 = this.interiorRect();
  864.       this.drawViewInterior(var1, var2);
  865.       Rect.returnRect(var2);
  866.    }
  867.  
  868.    void drawCaret() {
  869.       Rect var1 = this.caretRect();
  870.       ((View)this).addDirtyRect(var1);
  871.       Rect.returnRect(var1);
  872.    }
  873.  
  874.    void hideCaret() {
  875.       this._caretShowing = false;
  876.       this.drawCaret();
  877.    }
  878.  
  879.    void showCaret() {
  880.       this._caretShowing = true;
  881.       this.drawCaret();
  882.    }
  883.  
  884.    public void drawInterior() {
  885.       Rect var1 = this.interiorRect();
  886.       ((View)this).addDirtyRect(var1);
  887.       Rect.returnRect(var1);
  888.    }
  889.  
  890.    public boolean mouseDown(MouseEvent var1) {
  891.       Rect var2 = null;
  892.       this._clickCount = var1.clickCount();
  893.       if (this._clickCount > 3) {
  894.          return true;
  895.       } else if (!this.isSelectable()) {
  896.          return false;
  897.       } else {
  898.          if (!this.isBeingEdited()) {
  899.             if (this.isEditable()) {
  900.                this._startEditing(true);
  901.             } else if (this.isSelectable()) {
  902.                this._startEditing(false);
  903.             }
  904.          }
  905.  
  906.          if (!((View)this).rootView().mouseStillDown()) {
  907.             int var7 = this.charNumberForPoint(var1.x);
  908.             this._clickCount = 0;
  909.             this.selectRange(new Range(var7, 0));
  910.             if (!this.hasSelection() && this.isEditable()) {
  911.                this._caretShowing = this._canBlink = true;
  912.                this.drawCaret();
  913.                this._startBlinkTimer();
  914.             }
  915.  
  916.             return true;
  917.          } else {
  918.             boolean var3 = this._caretShowing;
  919.             this._canBlink = this._caretShowing = false;
  920.             this._mouseDragging = true;
  921.             if (this.hasSelection()) {
  922.                var2 = this.rectForRange(this.selectionStart(), this.selectionStop());
  923.             } else if (var3) {
  924.                this.hideCaret();
  925.             }
  926.  
  927.             Range var5 = this.selectedRange();
  928.             if (var1.isShiftKeyDown() && this._clickCount == 1) {
  929.                this._selectionEndChar = this.charNumberForPoint(var1.x);
  930.                if (var2 != null) {
  931.                   var2.unionWith(this.rectForRange(this.selectionStart(), this.selectionStop()));
  932.                } else {
  933.                   var2 = this.rectForRange(this.selectionStart(), this.selectionStop());
  934.                }
  935.             } else {
  936.                this._selectionAnchorChar = this._selectionEndChar = this._initialAnchorChar = this.charNumberForPoint(var1.x);
  937.             }
  938.  
  939.             switch (this._clickCount) {
  940.                case 2:
  941.                   Range var4 = this.groupForIndex(this._selectionAnchorChar);
  942.                   if (!var4.isNullRange()) {
  943.                      if (var1.isShiftKeyDown()) {
  944.                         Range var6 = new Range(var5);
  945.                         var6.unionWith(var4);
  946.                         this.selectRange(var6);
  947.                      } else {
  948.                         this.selectRange(var4);
  949.                      }
  950.                   }
  951.  
  952.                   var2 = null;
  953.                   break;
  954.                case 3:
  955.                   this.selectRange(new Range(0, this.charCount()));
  956.                   var2 = null;
  957.             }
  958.  
  959.             if (var2 != null) {
  960.                ((View)this).addDirtyRect(var2);
  961.                Rect.returnRect(var2);
  962.             }
  963.  
  964.             return true;
  965.          }
  966.       }
  967.    }
  968.  
  969.    void _computeScrollOffset() {
  970.       if (!this.isScrollable) {
  971.          this._scrollOffset = 0;
  972.       } else {
  973.          int var3 = this.border.leftMargin() + this.leftIndent();
  974.          int var4 = this.border.rightMargin() + this.rightIndent();
  975.          Rect var1 = this.caretRect();
  976.          Rect var2 = this.interiorRect();
  977.          String var5 = this.drawableString();
  978.          if (var2.width - (this.leftIndent() + this.rightIndent()) > this._font.fontMetrics().stringWidth(var5)) {
  979.             this._scrollOffset = 0;
  980.          } else if (var1.x >= var3 && var1.x < super.bounds.width - var4) {
  981.             Rect.returnRect(var1);
  982.          } else {
  983.             if (var1.x < var3) {
  984.                this._scrollOffset += var1.x - var3;
  985.             } else {
  986.                this._scrollOffset += var1.x - (super.bounds.width - var4);
  987.             }
  988.  
  989.             Rect.returnRect(var1);
  990.          }
  991.       }
  992.    }
  993.  
  994.    public void mouseDragged(MouseEvent var1) {
  995.       boolean var7 = true;
  996.       if (this.isSelectable()) {
  997.          if (this._clickCount <= 2) {
  998.             int var4 = this._selectionEndChar;
  999.             this._selectionEndChar = this.charNumberForPoint(var1.x);
  1000.             if (this._clickCount == 2) {
  1001.                Range var8 = this.groupForIndex(this._initialAnchorChar);
  1002.                Range var9 = this.groupForIndex(this._selectionEndChar);
  1003.                Range var10 = Range.rangeFromUnion(var8, var9);
  1004.                if (!var10.isNullRange()) {
  1005.                   if (var9.index > var8.index) {
  1006.                      this._selectionAnchorChar = var8.index;
  1007.                      this._selectionEndChar = var9.index + var9.length;
  1008.                   } else {
  1009.                      this._selectionAnchorChar = var8.index + var8.length;
  1010.                      this._selectionEndChar = var9.index;
  1011.                   }
  1012.                }
  1013.             }
  1014.  
  1015.             if (!((View)this).containsPointInVisibleRect(var1.x, 1)) {
  1016.                int var3 = this._scrollOffset;
  1017.                this._computeScrollOffset();
  1018.                if (this._scrollOffset != var3) {
  1019.                   this.drawInterior();
  1020.                   var7 = false;
  1021.                }
  1022.             }
  1023.  
  1024.             if (var7 && this._selectionEndChar != var4) {
  1025.                int var5;
  1026.                int var6;
  1027.                if (this._selectionEndChar < this._selectionAnchorChar && var4 > this._selectionAnchorChar || this._selectionEndChar > this._selectionAnchorChar && var4 < this._selectionAnchorChar) {
  1028.                   var5 = this.selectionStart();
  1029.                   var6 = this.selectionStop();
  1030.                   if (var4 < var5) {
  1031.                      var5 = var4;
  1032.                   }
  1033.  
  1034.                   if (var4 > var6) {
  1035.                      var6 = var4;
  1036.                   }
  1037.                } else if (this._selectionEndChar > var4) {
  1038.                   var5 = var4;
  1039.                   var6 = this._selectionEndChar;
  1040.                } else {
  1041.                   var5 = this._selectionEndChar;
  1042.                   var6 = var4;
  1043.                }
  1044.  
  1045.                Rect var2 = this.rectForRange(var5, var6);
  1046.                ((View)this).addDirtyRect(var2);
  1047.                Rect.returnRect(var2);
  1048.             }
  1049.  
  1050.          }
  1051.       }
  1052.    }
  1053.  
  1054.    public void mouseUp(MouseEvent var1) {
  1055.       this._mouseDragging = false;
  1056.       if (!this.hasSelection() && this.isEditable()) {
  1057.          this._caretShowing = this._canBlink = true;
  1058.          this.drawCaret();
  1059.       }
  1060.  
  1061.       this._initialAnchorChar = -1;
  1062.       this._clickCount = 0;
  1063.    }
  1064.  
  1065.    void _keyDown(KeyEvent var1) {
  1066.       if (!var1.isReturnKey() && !var1.isTabKey() && !var1.isBackTabKey()) {
  1067.          if (var1.isLeftArrowKey()) {
  1068.             if (var1.isShiftKeyDown()) {
  1069.                int var16 = this._scrollOffset;
  1070.                this.selectRange(this._selectionAnchorChar, this._selectionEndChar - 1);
  1071.                this._computeScrollOffset();
  1072.                if (this._scrollOffset != var16) {
  1073.                   this.drawInterior();
  1074.                   return;
  1075.                }
  1076.             } else {
  1077.                int var11 = this._selectionAnchorChar;
  1078.                boolean var13 = false;
  1079.                if (this._selectionAnchorChar != this._selectionEndChar) {
  1080.                   var13 = true;
  1081.                   this._selectionAnchorChar = this.selectionStart();
  1082.                   var11 = -1;
  1083.                } else if (this._selectionAnchorChar > 0) {
  1084.                   this.hideCaret();
  1085.                   --this._selectionAnchorChar;
  1086.                }
  1087.  
  1088.                this._selectionEndChar = this._selectionAnchorChar;
  1089.                if (var11 != this._selectionAnchorChar) {
  1090.                   int var12 = this._scrollOffset;
  1091.                   this._computeScrollOffset();
  1092.                   if (var12 != this._scrollOffset || var13) {
  1093.                      this._caretShowing = true;
  1094.                      this.drawInterior();
  1095.                      return;
  1096.                   }
  1097.  
  1098.                   this.showCaret();
  1099.                }
  1100.             }
  1101.  
  1102.          } else if (var1.isRightArrowKey()) {
  1103.             if (var1.isShiftKeyDown()) {
  1104.                int var15 = this._scrollOffset;
  1105.                this.selectRange(this._selectionAnchorChar, this._selectionEndChar + 1);
  1106.                this._computeScrollOffset();
  1107.                if (this._scrollOffset != var15) {
  1108.                   this.drawInterior();
  1109.                   return;
  1110.                }
  1111.             } else {
  1112.                int var3 = this._selectionAnchorChar;
  1113.                boolean var8 = false;
  1114.                if (this._selectionAnchorChar != this._selectionEndChar) {
  1115.                   var8 = true;
  1116.                   this._selectionAnchorChar = this.selectionStop();
  1117.                   var3 = -1;
  1118.                } else if (this._selectionAnchorChar < this._contents.length()) {
  1119.                   this.hideCaret();
  1120.                   ++this._selectionAnchorChar;
  1121.                   if (this._selectionAnchorChar > this._contents.length()) {
  1122.                      this._selectionAnchorChar = this._contents.length();
  1123.                   }
  1124.                }
  1125.  
  1126.                this._selectionEndChar = this._selectionAnchorChar;
  1127.                if (var3 != this._selectionAnchorChar) {
  1128.                   int var4 = this._scrollOffset;
  1129.                   this._computeScrollOffset();
  1130.                   if (var4 != this._scrollOffset || var8) {
  1131.                      this._caretShowing = true;
  1132.                      this.drawInterior();
  1133.                      return;
  1134.                   }
  1135.  
  1136.                   this.showCaret();
  1137.                }
  1138.             }
  1139.  
  1140.          } else if (var1.isHomeKey()) {
  1141.             this.selectedRange();
  1142.             if (var1.isShiftKeyDown()) {
  1143.                this.selectRange(this._selectionAnchorChar, 0);
  1144.             } else {
  1145.                this.selectRange(new Range(0, 0));
  1146.             }
  1147.  
  1148.             int var14 = this._scrollOffset;
  1149.             this._computeScrollOffset();
  1150.             if (this._scrollOffset != var14) {
  1151.                this.drawInterior();
  1152.             }
  1153.  
  1154.          } else if (var1.isEndKey()) {
  1155.             this.selectedRange();
  1156.             int var10 = this._contents.length();
  1157.             if (var1.isShiftKeyDown()) {
  1158.                this.selectRange(this._selectionAnchorChar, var10);
  1159.             } else {
  1160.                this.selectRange(new Range(var10, 0));
  1161.             }
  1162.  
  1163.             int var9 = this._scrollOffset;
  1164.             this._computeScrollOffset();
  1165.             if (this._scrollOffset != var9) {
  1166.                this.drawInterior();
  1167.             }
  1168.  
  1169.          } else if (var1.isBackspaceKey() || var1.isDeleteKey() || var1.isPrintableKey()) {
  1170.             if (this._oldContents == null) {
  1171.                this._oldContents = new FastStringBuffer(this._contents.toString());
  1172.             }
  1173.  
  1174.             this.hideCaret();
  1175.             if (this._selectionAnchorChar != this._selectionEndChar) {
  1176.                String var2 = this._contents.toString();
  1177.                int var5 = this.selectionStart();
  1178.                this._contents = new FastStringBuffer(var2.substring(0, var5));
  1179.                this._contents.append(var2.substring(this.selectionStop()));
  1180.                this._selectionAnchorChar = this._selectionEndChar = var5;
  1181.                if (var1.isBackspaceKey() || var1.isDeleteKey()) {
  1182.                   var1 = null;
  1183.                }
  1184.             }
  1185.  
  1186.             if (var1 != null) {
  1187.                if (var1.isBackspaceKey()) {
  1188.                   if (this._contents.length() == 0 || this._selectionAnchorChar == 0) {
  1189.                      this.showCaret();
  1190.                      return;
  1191.                   }
  1192.  
  1193.                   this._contents.removeCharAt(this._selectionAnchorChar - 1);
  1194.                   --this._selectionAnchorChar;
  1195.                } else if (var1.isDeleteKey()) {
  1196.                   if (this._selectionAnchorChar < this._contents.length()) {
  1197.                      this._contents.removeCharAt(this._selectionAnchorChar);
  1198.                   } else {
  1199.                      this.showCaret();
  1200.                   }
  1201.                } else {
  1202.                   this._contents.insert((char)var1.key, this._selectionAnchorChar++);
  1203.                }
  1204.  
  1205.                this._selectionEndChar = this._selectionAnchorChar;
  1206.             }
  1207.  
  1208.             this._computeScrollOffset();
  1209.             this.drawInterior();
  1210.             this.showCaret();
  1211.             if (this._owner != null) {
  1212.                this._owner.textWasModified(this);
  1213.                this._textChanged = true;
  1214.             } else {
  1215.                if (!this._textChanged) {
  1216.                   this._textChanged = true;
  1217.                }
  1218.  
  1219.             }
  1220.          }
  1221.       } else {
  1222.          byte var6;
  1223.          if (var1.isReturnKey()) {
  1224.             var6 = 2;
  1225.          } else if (var1.isTabKey()) {
  1226.             var6 = 0;
  1227.          } else {
  1228.             var6 = 1;
  1229.          }
  1230.  
  1231.          if (this._owner == null || this._owner.textEditingWillEnd(this, var6, this._textChanged)) {
  1232.             boolean var7 = this._textChanged;
  1233.             this._completeEditing();
  1234.             if (this._owner != null) {
  1235.                this._owner.textEditingDidEnd(this, var6, var7);
  1236.             }
  1237.  
  1238.             if (var1.isBackTabKey()) {
  1239.                this.sendBacktabCommand();
  1240.                if (var7) {
  1241.                   this.sendCommitCommand();
  1242.                   return;
  1243.                }
  1244.             } else if (var1.isTabKey()) {
  1245.                this.sendTabCommand();
  1246.                if (var7) {
  1247.                   this.sendCommitCommand();
  1248.                   return;
  1249.                }
  1250.             } else {
  1251.                this.sendCommitCommand();
  1252.             }
  1253.  
  1254.          }
  1255.       }
  1256.    }
  1257.  
  1258.    public void keyDown(KeyEvent var1) {
  1259.       if (this.isEditable()) {
  1260.          if (this._filter != null) {
  1261.             if (this._filter.acceptsEvent(this, var1, this._keyVector)) {
  1262.                this._keyVector.addElement(var1);
  1263.             }
  1264.          } else {
  1265.             this._keyVector.addElement(var1);
  1266.          }
  1267.  
  1268.          while(!this._keyVector.isEmpty()) {
  1269.             KeyEvent var2 = (KeyEvent)this._keyVector.removeFirstElement();
  1270.             this._keyDown(var2);
  1271.          }
  1272.  
  1273.       }
  1274.    }
  1275.  
  1276.    public void setFocusedView() {
  1277.       if (!this._editing && this.isEditable()) {
  1278.          this._startEditing(true);
  1279.       } else {
  1280.          super.setFocusedView();
  1281.       }
  1282.    }
  1283.  
  1284.    private void _startEditing(boolean var1) {
  1285.       if (super._superview != null) {
  1286.          if (this.isEditable()) {
  1287.             this._canBlink = this._caretShowing = this.hasInsertionPoint();
  1288.          } else {
  1289.             this._canBlink = this._caretShowing = false;
  1290.          }
  1291.  
  1292.          this._editing = true;
  1293.          if (this.isSelectable()) {
  1294.             this.setFocusedView();
  1295.          }
  1296.  
  1297.          if (this.hasInsertionPoint() && this.isEditable()) {
  1298.             this.showCaret();
  1299.          }
  1300.  
  1301.          if (var1 && this._owner != null) {
  1302.             this._owner.textEditingDidBegin(this);
  1303.          }
  1304.       }
  1305.  
  1306.    }
  1307.  
  1308.    private void _completeEditing() {
  1309.       this._oldContents = null;
  1310.       boolean var1 = this._textChanged;
  1311.       this._editing = false;
  1312.       if (super._superview != null) {
  1313.          this._ignoreWillBecomeSelected = true;
  1314.          super._superview.setFocusedView((View)null);
  1315.          this._ignoreWillBecomeSelected = false;
  1316.       }
  1317.  
  1318.       if (var1) {
  1319.          this.sendContentsChangedCommand();
  1320.       }
  1321.  
  1322.    }
  1323.  
  1324.    void _startBlinkTimer() {
  1325.       if (this.blinkTimer == null) {
  1326.          this.blinkTimer = new Timer(this, "blinkCaret", 750);
  1327.          this.blinkTimer.start();
  1328.       }
  1329.  
  1330.    }
  1331.  
  1332.    void _validateSelection() {
  1333.       this.stringValue();
  1334.       if (this._selectionAnchorChar == -1) {
  1335.          this.selectRange(new Range(0, 0));
  1336.       } else {
  1337.          if (this._selectionAnchorChar < 0) {
  1338.             this._selectionAnchorChar = 0;
  1339.          } else if (this._selectionAnchorChar > this._contents.length()) {
  1340.             this._selectionAnchorChar = this._contents.length();
  1341.          }
  1342.  
  1343.          if (this._selectionEndChar < 0) {
  1344.             this._selectionEndChar = 0;
  1345.          } else {
  1346.             if (this._selectionEndChar > this._contents.length()) {
  1347.                this._selectionEndChar = this._contents.length();
  1348.             }
  1349.  
  1350.          }
  1351.       }
  1352.    }
  1353.  
  1354.    public void startFocus() {
  1355.       this._validateSelection();
  1356.       this.hasFocus = true;
  1357.       if (this.isEditable()) {
  1358.          this._startBlinkTimer();
  1359.       }
  1360.  
  1361.       ((View)this).setDirty(true);
  1362.    }
  1363.  
  1364.    public void stopFocus() {
  1365.       if (this.blinkTimer != null) {
  1366.          this.blinkTimer.stop();
  1367.          this.blinkTimer = null;
  1368.       }
  1369.  
  1370.       this.hasFocus = false;
  1371.       this._scrollOffset = 0;
  1372.       if (this._editing && this._owner != null && this.isEditable()) {
  1373.          this._owner.textEditingWillEnd(this, 3, this._textChanged);
  1374.       }
  1375.  
  1376.       this._caretShowing = this._canBlink = false;
  1377.       if (this._editing && this.isEditable()) {
  1378.          if (this._owner != null) {
  1379.             this._owner.textEditingDidEnd(this, 3, this._textChanged);
  1380.          }
  1381.  
  1382.          if (this._textChanged) {
  1383.             this.sendCommitCommand();
  1384.          }
  1385.       }
  1386.  
  1387.       this._editing = this._textChanged = false;
  1388.       this.drawInterior();
  1389.    }
  1390.  
  1391.    public void pauseFocus() {
  1392.       if (this.blinkTimer != null) {
  1393.          this.blinkTimer.stop();
  1394.          this.blinkTimer = null;
  1395.          this.hideCaret();
  1396.       }
  1397.  
  1398.    }
  1399.  
  1400.    public void resumeFocus() {
  1401.       if (this.isEditable()) {
  1402.          this._startBlinkTimer();
  1403.       }
  1404.  
  1405.    }
  1406.  
  1407.    public void cancelEditing() {
  1408.       if (this.isBeingEdited()) {
  1409.          if (this._oldContents != null) {
  1410.             this._contents = this._oldContents;
  1411.             this._oldContents = null;
  1412.          }
  1413.  
  1414.          this._editing = false;
  1415.          if (super._superview != null) {
  1416.             this._ignoreWillBecomeSelected = true;
  1417.             super._superview.setFocusedView((View)null);
  1418.             this._ignoreWillBecomeSelected = false;
  1419.          }
  1420.  
  1421.       }
  1422.    }
  1423.  
  1424.    public void completeEditing() {
  1425.       boolean var1 = this._textChanged;
  1426.       if (this.isBeingEdited()) {
  1427.          if (this._owner == null || this._owner.textEditingWillEnd(this, 4, var1)) {
  1428.             this._completeEditing();
  1429.             if (this._owner != null) {
  1430.                this._owner.textEditingDidEnd(this, 4, var1);
  1431.             }
  1432.  
  1433.          }
  1434.       }
  1435.    }
  1436.  
  1437.    void sendCommand(String var1, Target var2) {
  1438.       if (var2 != null) {
  1439.          var2.performCommand(var1, this);
  1440.       }
  1441.  
  1442.    }
  1443.  
  1444.    void sendTabCommand() {
  1445.       if (this._tabCommand != null && this._tabTarget != null) {
  1446.          this.sendCommand(this._tabCommand, this._tabTarget);
  1447.       } else {
  1448.          if (((View)this).rootView() != null) {
  1449.             ((View)this).rootView().selectViewAfter(this);
  1450.          }
  1451.  
  1452.       }
  1453.    }
  1454.  
  1455.    void sendBacktabCommand() {
  1456.       if (this._backtabCommand != null && this._backtabCommand != null) {
  1457.          this.sendCommand(this._backtabCommand, this._backtabTarget);
  1458.       } else {
  1459.          if (((View)this).rootView() != null) {
  1460.             ((View)this).rootView().selectViewBefore(this);
  1461.          }
  1462.  
  1463.       }
  1464.    }
  1465.  
  1466.    void sendContentsChangedCommand() {
  1467.       this.sendCommand(this._contentsChangedCommand, this._contentsChangedTarget);
  1468.    }
  1469.  
  1470.    void sendCommitCommand() {
  1471.       if (this._commitCommand == null && this._commitTarget == null && this._tabCommand != null && this._tabTarget != null) {
  1472.          this.sendTabCommand();
  1473.       }
  1474.  
  1475.       this.sendCommand(this._commitCommand, this._commitTarget);
  1476.    }
  1477.  
  1478.    public boolean canPerformCommand(String var1) {
  1479.       return "blinkCaret".equals(var1) || "selectText".equals(var1) || this.isEditable() && "cut".equals(var1) || "copy".equals(var1) || this.isEditable() && "paste".equals(var1);
  1480.    }
  1481.  
  1482.    public void performCommand(String var1, Object var2) {
  1483.       if ("blinkCaret".equals(var1)) {
  1484.          this.blinkCaret();
  1485.       } else if ("selectText".equals(var1)) {
  1486.          this.selectText();
  1487.       } else if ("cut".equals(var1)) {
  1488.          this.cut();
  1489.       } else if ("copy".equals(var1)) {
  1490.          this.copy();
  1491.       } else if ("paste".equals(var1)) {
  1492.          this.paste();
  1493.       } else {
  1494.          throw new NoSuchMethodError("unknown command: " + var1);
  1495.       }
  1496.    }
  1497.  
  1498.    private void blinkCaret() {
  1499.       if (this._canBlink) {
  1500.          this._caretShowing = !this._caretShowing;
  1501.          this.drawCaret();
  1502.       } else {
  1503.          if (!this._mouseDragging && this.hasInsertionPoint()) {
  1504.             this._canBlink = true;
  1505.          }
  1506.  
  1507.       }
  1508.    }
  1509.  
  1510.    public void describeClassInfo(ClassInfo var1) {
  1511.       super.describeClassInfo(var1);
  1512.       var1.addClass("netscape.application.TextField", 3);
  1513.       var1.addField("contents", (byte)16);
  1514.       var1.addField("owner", (byte)18);
  1515.       var1.addField("filter", (byte)18);
  1516.       var1.addField("tabTarget", (byte)18);
  1517.       var1.addField("backtabTarget", (byte)18);
  1518.       var1.addField("contentsChangedTarget", (byte)18);
  1519.       var1.addField("commitTarget", (byte)18);
  1520.       var1.addField("border", (byte)18);
  1521.       var1.addField("font", (byte)18);
  1522.       var1.addField("textColor", (byte)18);
  1523.       var1.addField("backgroundColor", (byte)18);
  1524.       var1.addField("selectionColor", (byte)18);
  1525.       var1.addField("caretColor", (byte)18);
  1526.       var1.addField("tabCommand", (byte)16);
  1527.       var1.addField("backtabCommand", (byte)16);
  1528.       var1.addField("contentsChangedCommand", (byte)16);
  1529.       var1.addField("commitCommand", (byte)16);
  1530.       var1.addField("selectionAnchorChar", (byte)8);
  1531.       var1.addField("selectionEndChar", (byte)8);
  1532.       var1.addField("justification", (byte)8);
  1533.       var1.addField("scrollOffset", (byte)8);
  1534.       var1.addField("editable", (byte)0);
  1535.       var1.addField("selectable", (byte)0);
  1536.       var1.addField("shadowed", (byte)0);
  1537.       var1.addField("canWrap", (byte)0);
  1538.       var1.addField("wantsAutoscrollEvents", (byte)0);
  1539.       var1.addField("transparent", (byte)0);
  1540.       var1.addField("drawableCharacter", (byte)2);
  1541.       var1.addField("isScrollable", (byte)0);
  1542.    }
  1543.  
  1544.    public void encode(Encoder var1) throws CodingException {
  1545.       super.encode(var1);
  1546.       var1.encodeString("contents", this._contents.toString());
  1547.       var1.encodeObject("owner", (Codable)this._owner);
  1548.       var1.encodeObject("filter", (Codable)this._filter);
  1549.       var1.encodeObject("tabTarget", (Codable)this._tabTarget);
  1550.       var1.encodeObject("backtabTarget", (Codable)this._backtabTarget);
  1551.       var1.encodeObject("contentsChangedTarget", (Codable)this._contentsChangedTarget);
  1552.       var1.encodeObject("commitTarget", (Codable)this._commitTarget);
  1553.       if (this.border instanceof EmptyBorder) {
  1554.          var1.encodeObject("border", (Object)null);
  1555.       } else {
  1556.          var1.encodeObject("border", this.border);
  1557.       }
  1558.  
  1559.       var1.encodeObject("font", this._font);
  1560.       var1.encodeObject("textColor", this._textColor);
  1561.       var1.encodeObject("backgroundColor", this._backgroundColor);
  1562.       var1.encodeObject("selectionColor", this._selectionColor);
  1563.       var1.encodeObject("caretColor", this._caretColor);
  1564.       var1.encodeString("tabCommand", this._tabCommand);
  1565.       var1.encodeString("backtabCommand", this._backtabCommand);
  1566.       var1.encodeString("contentsChangedCommand", this._contentsChangedCommand);
  1567.       var1.encodeString("commitCommand", this._commitCommand);
  1568.       var1.encodeInt("selectionAnchorChar", this._selectionAnchorChar);
  1569.       var1.encodeInt("selectionEndChar", this._selectionEndChar);
  1570.       var1.encodeInt("justification", this._justification);
  1571.       var1.encodeInt("scrollOffset", this._scrollOffset);
  1572.       var1.encodeBoolean("editable", this._editable);
  1573.       var1.encodeBoolean("selectable", this._selectable);
  1574.       var1.encodeBoolean("shadowed", this._shadowed);
  1575.       var1.encodeBoolean("canWrap", this._canWrap);
  1576.       var1.encodeBoolean("wantsAutoscrollEvents", this.wantsAutoscrollEvents);
  1577.       var1.encodeBoolean("transparent", this.transparent);
  1578.       var1.encodeChar("drawableCharacter", this._drawableCharacter);
  1579.       var1.encodeBoolean("isScrollable", this.isScrollable);
  1580.    }
  1581.  
  1582.    public void decode(Decoder var1) throws CodingException {
  1583.       int var3 = var1.versionForClassName("netscape.application.TextField");
  1584.       super.decode(var1);
  1585.       String var2 = var1.decodeString("contents");
  1586.       if (var2 != null) {
  1587.          this._contents = new FastStringBuffer(var2);
  1588.       }
  1589.  
  1590.       this._owner = (TextFieldOwner)var1.decodeObject("owner");
  1591.       this._filter = (TextFilter)var1.decodeObject("filter");
  1592.       this._tabTarget = (Target)var1.decodeObject("tabTarget");
  1593.       this._backtabTarget = (Target)var1.decodeObject("backtabTarget");
  1594.       this._contentsChangedTarget = (Target)var1.decodeObject("contentsChangedTarget");
  1595.       this._commitTarget = (Target)var1.decodeObject("commitTarget");
  1596.       this.setBorder((Border)var1.decodeObject("border"));
  1597.       this._font = (Font)var1.decodeObject("font");
  1598.       this._textColor = (Color)var1.decodeObject("textColor");
  1599.       this._backgroundColor = (Color)var1.decodeObject("backgroundColor");
  1600.       this._selectionColor = (Color)var1.decodeObject("selectionColor");
  1601.       this._caretColor = (Color)var1.decodeObject("caretColor");
  1602.       this._tabCommand = var1.decodeString("tabCommand");
  1603.       this._backtabCommand = var1.decodeString("backtabCommand");
  1604.       this._contentsChangedCommand = var1.decodeString("contentsChangedCommand");
  1605.       this._commitCommand = var1.decodeString("commitCommand");
  1606.       this._selectionAnchorChar = var1.decodeInt("selectionAnchorChar");
  1607.       this._selectionEndChar = var1.decodeInt("selectionEndChar");
  1608.       this._justification = var1.decodeInt("justification");
  1609.       this._scrollOffset = var1.decodeInt("scrollOffset");
  1610.       this._editable = var1.decodeBoolean("editable");
  1611.       this._selectable = var1.decodeBoolean("selectable");
  1612.       this._shadowed = var1.decodeBoolean("shadowed");
  1613.       this._canWrap = var1.decodeBoolean("canWrap");
  1614.       this.wantsAutoscrollEvents = var1.decodeBoolean("wantsAutoscrollEvents");
  1615.       this.transparent = var1.decodeBoolean("transparent");
  1616.       if (var3 >= 2) {
  1617.          this._drawableCharacter = var1.decodeChar("drawableCharacter");
  1618.       } else {
  1619.          this._drawableCharacter = ANY_CHARACTER;
  1620.       }
  1621.  
  1622.       if (var3 >= 3) {
  1623.          this.isScrollable = var1.decodeBoolean("isScrollable");
  1624.       } else {
  1625.          this.isScrollable = true;
  1626.       }
  1627.    }
  1628.  
  1629.    public void finishDecoding() throws CodingException {
  1630.       super.finishDecoding();
  1631.       this.setFont(this._font);
  1632.    }
  1633.  
  1634.    boolean isWordCharacter(char var1) {
  1635.       return var1 >= '0' && var1 <= '9' || var1 >= 'A' && var1 <= 'Z' || var1 >= 'a' && var1 <= 'z';
  1636.    }
  1637.  
  1638.    Range groupForIndex(int var1) {
  1639.       int var2 = this.charCount();
  1640.       if (var2 == 0) {
  1641.          return new Range();
  1642.       } else if (this._drawableCharacter != ANY_CHARACTER) {
  1643.          return new Range(0, this.charCount());
  1644.       } else {
  1645.          if (var1 < 0) {
  1646.             var1 = 0;
  1647.          } else if (var1 >= var2) {
  1648.             var1 = var2 - 1;
  1649.          }
  1650.  
  1651.          int var5 = var1;
  1652.          char var6 = this._contents.charAt(var1);
  1653.          if (var6 == '\n') {
  1654.             return new Range(var1, 1);
  1655.          } else if (var6 != ' ' && var6 != '\t') {
  1656.             if (!this.isWordCharacter(var6)) {
  1657.                return new Range(var1, 1);
  1658.             } else {
  1659.                int var7;
  1660.                for(var7 = var1; var7 > 0; --var7) {
  1661.                   var6 = this._contents.charAt(var7 - 1);
  1662.                   if (!this.isWordCharacter(var6)) {
  1663.                      break;
  1664.                   }
  1665.                }
  1666.  
  1667.                int var8;
  1668.                for(var8 = var1; var8 < var2 - 1; ++var8) {
  1669.                   var6 = this._contents.charAt(var8 + 1);
  1670.                   if (!this.isWordCharacter(var6)) {
  1671.                      break;
  1672.                   }
  1673.                }
  1674.  
  1675.                return new Range(var7, var8 - var7 + 1);
  1676.             }
  1677.          } else {
  1678.             while(var5 > 0) {
  1679.                var6 = this._contents.charAt(var5);
  1680.                if (var6 != ' ' && var6 != '\t') {
  1681.                   break;
  1682.                }
  1683.  
  1684.                --var5;
  1685.             }
  1686.  
  1687.             int var3 = var5 + 1;
  1688.  
  1689.             for(var5 = var1; var5 < var2; ++var5) {
  1690.                var6 = this._contents.charAt(var5);
  1691.                if (var6 != ' ' && var6 != '\t') {
  1692.                   break;
  1693.                }
  1694.             }
  1695.  
  1696.             int var4 = var5 - 1;
  1697.             return new Range(var3, var4 - var3 + 1);
  1698.          }
  1699.       }
  1700.    }
  1701.  
  1702.    private String drawableString() {
  1703.       if (this._drawableCharacter == ANY_CHARACTER) {
  1704.          return this._contents != null ? this._contents.toString() : "";
  1705.       } else if (this._contents != null && this._contents.length() > 0) {
  1706.          char[] var1 = new char[this._contents.length()];
  1707.          int var2 = 0;
  1708.  
  1709.          for(int var3 = var1.length; var2 < var3; ++var2) {
  1710.             var1[var2] = this._drawableCharacter;
  1711.          }
  1712.  
  1713.          return new String(var1);
  1714.       } else {
  1715.          return "";
  1716.       }
  1717.    }
  1718.  
  1719.    public void willBecomeSelected() {
  1720.       if (!this._ignoreWillBecomeSelected) {
  1721.          this.selectText();
  1722.       }
  1723.  
  1724.    }
  1725.  
  1726.    public boolean canBecomeSelectedView() {
  1727.       return this.isEditable();
  1728.    }
  1729.  
  1730.    public View nextSelectableView() {
  1731.       return this._tabTarget != null && this._tabTarget instanceof View ? (View)this._tabTarget : null;
  1732.    }
  1733.  
  1734.    public View previousSelectableView() {
  1735.       return this._backtabTarget != null && this._backtabTarget instanceof View ? (View)this._backtabTarget : null;
  1736.    }
  1737.  
  1738.    public void copy() {
  1739.       Application.setClipboardText(this.stringForRange(this.selectedRange()));
  1740.    }
  1741.  
  1742.    public void cut() {
  1743.       if (this.isEditable()) {
  1744.          Range var1 = this.selectedRange();
  1745.          if (var1 == null || var1.index < 0) {
  1746.             return;
  1747.          }
  1748.  
  1749.          Application.setClipboardText(this.stringForRange(var1));
  1750.          this.replaceRangeWithString(var1, "");
  1751.          this.selectRange(new Range(var1.index(), 0));
  1752.       }
  1753.  
  1754.    }
  1755.  
  1756.    public void paste() {
  1757.       if (this.isEditable()) {
  1758.          Range var1 = this.selectedRange();
  1759.          String var2 = Application.clipboardText();
  1760.          if (var1 == null || var2 == null) {
  1761.             return;
  1762.          }
  1763.  
  1764.          this.replaceRangeWithString(var1, var2);
  1765.          this.selectRange(new Range(var1.index() + var2.length(), 0));
  1766.       }
  1767.  
  1768.    }
  1769.  
  1770.    public boolean isScrollable() {
  1771.       return this.isScrollable;
  1772.    }
  1773.  
  1774.    public void setScrollable(boolean var1) {
  1775.       this.isScrollable = var1;
  1776.    }
  1777.  
  1778.    public String formElementText() {
  1779.       return this.stringValue();
  1780.    }
  1781. }
  1782.