Dart DocumentationstagexlTextField

TextField class

class TextField extends InteractiveObject {

 String _text = "";
 TextFormat _defaultTextFormat = null;

 String _autoSize = TextFieldAutoSize.NONE;
 String _type = TextFieldType.DYNAMIC;

 int _caretIndex = 0;
 int _caretLine = 0;
 num _caretTime = 0.0;
 num _caretX = 0.0;
 num _caretY = 0.0;
 num _caretWidth = 0.0;
 num _caretHeight = 0.0;

 bool _wordWrap = false;
 bool _multiline = false;
 bool _displayAsPassword = false;
 bool _background = false;
 bool _border = false;
 String _passwordChar = "•";
 int _backgroundColor = 0xFFFFFF;
 int _borderColor = 0x000000;
 int _maxChars = 0;
 num _width = 100;
 num _height = 100;

 num _textWidth = 0.0;
 num _textHeight = 0.0;
 final List<TextLineMetrics> _textLineMetrics = new List<TextLineMetrics>();

 int _refreshPending = 3;   // bit 0: textLineMetrics, bit 1: cache
 bool _cacheAsBitmap = true;

 RenderTexture _renderTexture;

 //-------------------------------------------------------------------------------------------------

 TextField([String text, TextFormat textFormat]) {

   this.text = (text != null) ? text : "";
   this.defaultTextFormat = (textFormat != null) ? textFormat : new TextFormat("Arial", 12, 0x000000);

   this.onKeyDown.listen(_onKeyDown);
   this.onTextInput.listen(_onTextInput);
   this.onMouseDown.listen(_onMouseDown);
 }

 //-------------------------------------------------------------------------------------------------

 RenderTexture get renderTexture => _renderTexture;

 String get text => _text;
 int get textColor => _defaultTextFormat.color;
 TextFormat get defaultTextFormat => _defaultTextFormat;

 int get caretIndex => _caretIndex;

 String get autoSize => _autoSize;
 String get type => _type;

 bool get wordWrap => _wordWrap;
 bool get multiline => _multiline;
 bool get displayAsPassword => _displayAsPassword;
 bool get background => _background;
 bool get border => _border;
 bool get cacheAsBitmap => _cacheAsBitmap;

 String get passwordChar => _passwordChar;
 int get backgroundColor => _backgroundColor;
 int get borderColor => _borderColor;
 int get maxChars => _maxChars;

 //-------------------------------------------------------------------------------------------------

 void set width(num value) {
   _width = value.toDouble();
   _refreshPending |= 3;
 }

 void set height(num value) {
   _height = value.toDouble();
   _refreshPending |= 3;
 }

 void set text(String value) {
   _text = value.replaceAll('\r\n', '\n').replaceAll('\r', '\n');
   _caretIndex = _text.length;
   _refreshPending |= 3;
 }

 void set textColor(int value) {
   _defaultTextFormat.color = value;
   _refreshPending |= 2;
 }

 void set defaultTextFormat(TextFormat value) {
   _defaultTextFormat = value.clone();
   _refreshPending |= 3;
 }

 void set autoSize(String value) {
   _autoSize = value;
   _refreshPending |= 3;
 }

 void set type(String value) {
   _type = value;
   _refreshPending |= 3;
 }

 void set wordWrap(bool value) {
   _wordWrap = value;
   _refreshPending |= 3;
 }

 void set multiline(bool value) {
   _multiline = value;
   _refreshPending |= 3;
 }

 void set displayAsPassword(bool value) {
   _displayAsPassword = value;
   _refreshPending |= 3;
 }

 void set passwordChar(String value) {
   _passwordChar = value[0];
   _refreshPending |= 3;
 }

 void set background(bool value) {
   _background = value;
   _refreshPending |= 2;
 }

 void set backgroundColor(int value) {
   _backgroundColor = value;
   _refreshPending |= 2;
 }

 void set border(bool value) {
   _border = value;
   _refreshPending |= 2;
 }

 void set borderColor(int value) {
   _borderColor = value;
   _refreshPending |= 2;
 }

 void set maxChars(int value) {
   _maxChars = value;
 }

 void set cacheAsBitmap(bool value) {
   if (value) _refreshPending |= 2;
   _cacheAsBitmap = value;
 }

 //-------------------------------------------------------------------------------------------------

 num get x {
   _refreshTextLineMetrics();
   return super.x;
 }

 num get width {
   _refreshTextLineMetrics();
   return _width;
 }

 num get height {
   _refreshTextLineMetrics();
   return _height;
 }

 num get textWidth {
   _refreshTextLineMetrics();
   return _textWidth;
 }

 num get textHeight {
   _refreshTextLineMetrics();
   return _textHeight;
 }

 int get numLines {
   _refreshTextLineMetrics();
   return _textLineMetrics.length;
 }

 TextLineMetrics getLineMetrics(int lineIndex) {
   _refreshTextLineMetrics();
   return _textLineMetrics[lineIndex];
 }

 String getLineText(int lineIndex) {
   return getLineMetrics(lineIndex)._text;
 }

 int getLineLength(int lineIndex) {
   return getLineText(lineIndex).length;
 }

 Matrix get transformationMatrix {
   _refreshTextLineMetrics();
   return super.transformationMatrix;
 }

 //-------------------------------------------------------------------------------------------------
 //-------------------------------------------------------------------------------------------------

 Rectangle getBoundsTransformed(Matrix matrix, [Rectangle returnRectangle]) {
   return _getBoundsTransformedHelper(matrix, _width, _height, returnRectangle);
 }

 //-------------------------------------------------------------------------------------------------

 DisplayObject hitTestInput(num localX, num localY) {

   if (localX >= 0 && localY >= 0 && localX < _width && localY < _height)
     return this;

   return null;
 }

 //-------------------------------------------------------------------------------------------------

 void render(RenderState renderState) {

   _refreshTextLineMetrics();

   var renderContext = renderState.renderContext;

   if (_cacheAsBitmap || renderContext is! RenderContextCanvas) {
     _refreshCache();
     renderState.renderQuad(_renderTexture.quad);
   } else {
     var renderContextCanvas = renderState.renderContext as RenderContextCanvas;
     var context = renderContextCanvas.rawContext;
     var matrix = renderState.globalMatrix;
     context.setTransform(matrix.a, matrix.b, matrix.c, matrix.d, matrix.tx, matrix.ty);
     context.globalAlpha = renderState.globalAlpha;
     _renderText(renderContextCanvas.rawContext);
   }

   // draw cursor for INPUT text fields

   _caretTime += renderState.deltaTime;

   if (_type == TextFieldType.INPUT) {
     var stage = this.stage;
     if (stage != null && stage.focus == this && _caretTime.remainder(0.8) < 0.4) {
       var x1 = _caretX;
       var y1 = _caretY;
       var x3 = _caretX + _caretWidth;
       var y3 = _caretY + _caretHeight;
       var color = _defaultTextFormat.color;
       renderState.renderTriangle(x1, y1, x3, y1, x3, y3, color);
       renderState.renderTriangle(x1, y1, x3, y3, x1, y3, color);
     }
   }
 }

 //-------------------------------------------------------------------------------------------------
 //-------------------------------------------------------------------------------------------------

 _refreshTextLineMetrics() {

   if ((_refreshPending & 1) == 0) {
     return;
   } else {
     _refreshPending &= 255 - 1;
   }

   _textLineMetrics.clear();

   //-----------------------------------
   // split lines

   var startIndex = 0;
   var checkLine = '';
   var validLine = '';
   var lineWidth = 0;
   var lineIndent = 0;

   var textFormatSize = _ensureNum(_defaultTextFormat.size);
   var textFormatLeftMargin = _ensureNum(_defaultTextFormat.leftMargin);
   var textFormatRightMargin = _ensureNum(_defaultTextFormat.rightMargin);
   var textFormatTopMargin = _ensureNum(_defaultTextFormat.topMargin);
   var textFormatBottomMargin = _ensureNum(_defaultTextFormat.bottomMargin);
   var textFormatIndent = _ensureNum(_defaultTextFormat.indent);
   var textFormatLeading = _ensureNum(defaultTextFormat.leading);
   var textFormatAlign = _ensureString(_defaultTextFormat.align);

   var fontStyle = _defaultTextFormat._cssFontStyle;
   var fontStyleMetrics = _getFontStyleMetrics(fontStyle);
   var fontStyleMetricsAscent = _ensureNum(fontStyleMetrics.ascent);
   var fontStyleMetricsDescent = _ensureNum(fontStyleMetrics.descent);

   var availableWidth = _width - textFormatLeftMargin - textFormatRightMargin;
   var canvasContext = _dummyCanvasContext;
   var paragraphLines = new List<int>();
   var paragraphs = _text.split('\n');

   canvasContext.font = fontStyle;
   canvasContext.textAlign = "start";
   canvasContext.textBaseline = "alphabetic";
   canvasContext.setTransform(1.0, 0.0, 0.0, 1.0, 0.0, 0.0);

   for(int p = 0; p < paragraphs.length; p++) {

     var paragraph = paragraphs[p];
     if (paragraph is! String) continue; // dart2js_hint

     paragraphLines.add(_textLineMetrics.length);

     if (_wordWrap == false) {

       _textLineMetrics.add(new TextLineMetrics._internal(paragraph, startIndex));
       startIndex += paragraph.length + 1;

     } else {

       checkLine = null;
       lineIndent = textFormatIndent;

       var words = paragraph.split(' ');

       for(int w = 0; w < words.length; w++) {

         var word = words[w];
         if (word is! String) continue; // dart2js_hint

         validLine = checkLine;
         checkLine = (validLine == null) ? word : "$validLine $word";
         checkLine = _passwordEncoder(checkLine);
         lineWidth = canvasContext.measureText(checkLine).width.toDouble();

         if (lineIndent + lineWidth >= availableWidth) {
           if (validLine == null) {
             _textLineMetrics.add(new TextLineMetrics._internal(checkLine, startIndex));
             startIndex += checkLine.length + 1;
             checkLine = null;
             lineIndent = 0;
           } else {
             _textLineMetrics.add(new TextLineMetrics._internal(validLine, startIndex));
             startIndex += validLine.length + 1;
             checkLine = _passwordEncoder(word);
             lineIndent = 0;
           }
         }
       }

       if (checkLine != null) {
         _textLineMetrics.add(new TextLineMetrics._internal(checkLine, startIndex));
         startIndex += checkLine.length + 1;
       }
     }
   }

   //-----------------------------------
   // calculate metrics

   _textWidth = 0.0;
   _textHeight = 0.0;

   for(int line = 0; line < _textLineMetrics.length; line++) {

     var textLineMetrics = _textLineMetrics[line];
     if (textLineMetrics is! TextLineMetrics) continue; // dart2js_hint

     var indent = paragraphLines.contains(line) ? textFormatIndent : 0;
     var offsetX = textFormatLeftMargin + indent;
     var offsetY = textFormatTopMargin + textFormatSize +
                   line * (textFormatLeading + textFormatSize + fontStyleMetricsDescent);

     var width = canvasContext.measureText(textLineMetrics._text).width.toDouble();

     textLineMetrics._x = offsetX;
     textLineMetrics._y = offsetY;
     textLineMetrics._width = width;
     textLineMetrics._height = textFormatSize;
     textLineMetrics._ascent = fontStyleMetricsAscent;
     textLineMetrics._descent = fontStyleMetricsDescent;
     textLineMetrics._leading = textFormatLeading;
     textLineMetrics._indent = indent;

     _textWidth = max(_textWidth, textFormatLeftMargin + indent + width + textFormatRightMargin);
     _textHeight = offsetY + fontStyleMetricsDescent + textFormatBottomMargin;
   }

   //-----------------------------------
   // calculate TextField autoSize

   var autoWidth = _wordWrap ? _width : _textWidth.ceil();
   var autoHeight = _textHeight.ceil();

   if (_width != autoWidth || _height != autoHeight) {

     switch(_autoSize) {
       case TextFieldAutoSize.LEFT:
         _width = autoWidth;
         _height = autoHeight;
         break;
       case TextFieldAutoSize.RIGHT:
         super.x -= (autoWidth - _width);
         _width = autoWidth;
         _height = autoHeight;
         break;
       case TextFieldAutoSize.CENTER:
         super.x -= (autoWidth - _width) / 2;
         _width = autoWidth;
         _height = autoHeight;
         break;
     }
   }

   availableWidth = _width - textFormatLeftMargin - textFormatRightMargin;

   //-----------------------------------
   // calculate TextFormat align

   for(int line = 0; line < _textLineMetrics.length; line++) {

     var textLineMetrics = _textLineMetrics[line];
     if (textLineMetrics is! TextLineMetrics) continue; // dart2js_hint

     switch(textFormatAlign) {
       case TextFormatAlign.CENTER:
       case TextFormatAlign.JUSTIFY:
         textLineMetrics._x += (availableWidth - textLineMetrics.width) / 2;
         break;
       case TextFormatAlign.RIGHT:
       case TextFormatAlign.END:
         textLineMetrics._x += (availableWidth - textLineMetrics.width);
         break;
     }
   }

   //-----------------------------------
   // calculate caret position

   if (_type == TextFieldType.INPUT) {

     for(int line = _textLineMetrics.length - 1; line >= 0; line--) {

       var textLineMetrics = _textLineMetrics[line];
       if (textLineMetrics is! TextLineMetrics) continue; // dart2js_hint

       if (_caretIndex >= textLineMetrics._textIndex) {
         var textIndex = _caretIndex - textLineMetrics._textIndex;
         var text = textLineMetrics._text.substring(0, textIndex);
         _caretLine = line;
         _caretX = textLineMetrics.x + canvasContext.measureText(text).width.toDouble();
         _caretY = textLineMetrics.y - fontStyleMetricsAscent * 0.9;
         _caretWidth = 2.0;
         _caretHeight = textFormatSize;
         break;
       }
     }

     var shiftX = 0.0;
     var shiftY = 0.0;

     while (shiftX + _caretX > _width) shiftX -= _width * 0.2;
     while (shiftX + _caretX < 0) shiftX += _width * 0.2;
     while (shiftY + _caretY + _caretHeight > _height) shiftY -= textFormatSize;
     while (shiftY + _caretY < 0) shiftY += textFormatSize;

     _caretX += shiftX;
     _caretY += shiftY;

     for(int line = 0; line < _textLineMetrics.length; line++) {
       var textLineMetrics = _textLineMetrics[line];
       if (textLineMetrics is! TextLineMetrics) continue; // dart2js_hint

       textLineMetrics._x += shiftX;
       textLineMetrics._y += shiftY;
     }
   }
 }

 //-------------------------------------------------------------------------------------------------

 _refreshCache() {

   if ((_refreshPending & 2) == 0) {
     return;
   } else {
     _refreshPending &= 255 - 2;
   }

   var pixelRatio = Stage.autoHiDpi ? _devicePixelRatio : 1.0;
   var width = max(1, _width).ceil();
   var height =  max(1, _height).ceil();

   if (_renderTexture == null) {
     _renderTexture = new RenderTexture(width, height, true, Color.Transparent, pixelRatio);
   } else {
     _renderTexture.resize(width, height);
   }

   var matrix = _renderTexture.quad.drawMatrix;
   var context = _renderTexture.canvas.context2D;
   context.setTransform(matrix.a, matrix.b, matrix.c, matrix.d, matrix.tx, matrix.ty);
   context.clearRect(0, 0, _width, _height);

   _renderText(context);
   _renderTexture.update();
 }

 //-------------------------------------------------------------------------------------------------

 _renderText(CanvasRenderingContext2D context) {

   var textFormat = _defaultTextFormat;
   var lineWidth = (textFormat.bold ? textFormat.size / 10 : textFormat.size / 20).ceil();

   context.save();
   context.beginPath();
   context.rect(0, 0, _width, _height);
   context.clip();

   if (_background) {
     context.fillStyle = _color2rgb(_backgroundColor);
     context.fillRect(0, 0, _width, _height);
   }

   context.font = textFormat._cssFontStyle;
   context.textAlign = "start";
   context.textBaseline = "alphabetic";
   context.fillStyle = context.strokeStyle = _color2rgb(textFormat.color);
   context.lineCap = context.lineJoin = "round";
   context.lineWidth = lineWidth;

   for(int i = 0; i < _textLineMetrics.length; i++) {
     var lm = _textLineMetrics[i];
     context.fillText(lm._text, lm.x, lm.y);

     if(textFormat.underline) {
       num underlineY = (lm.y + lineWidth).round();
       if (lineWidth % 2 != 0) underlineY += 0.5;
       context.beginPath();
       context.moveTo(lm.x, underlineY);
       context.lineTo(lm.x + lm.width, underlineY);
       context.stroke();
     }
   }

   if (_border) {
     context.strokeStyle = _color2rgb(_borderColor);
     context.lineWidth = 1;
     context.strokeRect(0, 0, _width, _height);
   }

   context.restore();
 }

 //-------------------------------------------------------------------------------------------------

 String _passwordEncoder(String text) {

   if (text is! String) return text;
   if (_displayAsPassword == false) return text;

   var newText = "";
   for(int i = 0; i < text.length; i++) {
     newText = "$newText$_passwordChar";
   }
   return newText;
 }

 //-------------------------------------------------------------------------------------------------
 //-------------------------------------------------------------------------------------------------

 _onKeyDown(KeyboardEvent keyboardEvent) {

   if (_type == TextFieldType.INPUT) {

     _refreshTextLineMetrics();

     var text = _text;
     var textLength = text.length;
     var textLineMetrics = _textLineMetrics;
     var caretIndex = _caretIndex;
     var caretLine = _caretLine;
     var caretIndexNew = -1;

     switch(keyboardEvent.keyCode) {

       case html.KeyCode.BACKSPACE:
         if (caretIndex > 0) {
           _text = text.substring(0, caretIndex - 1) + text.substring(caretIndex);
           caretIndexNew = caretIndex - 1;
         }
         break;

       case html.KeyCode.END:
         var tlm = textLineMetrics[caretLine];
         caretIndexNew = tlm._textIndex + tlm._text.length;
         break;

       case html.KeyCode.HOME:
         var tlm = textLineMetrics[caretLine];
         caretIndexNew = tlm._textIndex;
         break;

       case html.KeyCode.LEFT:
         if (caretIndex > 0) {
           caretIndexNew = caretIndex - 1;
         }
         break;

       case html.KeyCode.UP:
         if (caretLine > 0 && caretLine < textLineMetrics.length) {
           var tlmFrom = textLineMetrics[caretLine ];
           var tlmTo = textLineMetrics[caretLine - 1];
           var lineIndex = min(caretIndex - tlmFrom._textIndex, tlmTo._text.length);
           caretIndexNew = tlmTo._textIndex + lineIndex;
         } else {
           caretIndexNew = 0;
         }
         break;

       case html.KeyCode.RIGHT:
         if (caretIndex < textLength) {
           caretIndexNew = caretIndex + 1;
         }
         break;

       case html.KeyCode.DOWN:
         if (caretLine >= 0 && caretLine < textLineMetrics.length - 1) {
           var tlmFrom = textLineMetrics[caretLine ];
           var tlmTo = textLineMetrics[caretLine + 1];
           var lineIndex = min(caretIndex - tlmFrom._textIndex, tlmTo._text.length);
           caretIndexNew = tlmTo._textIndex + lineIndex;
         } else {
           caretIndexNew = textLength;
         }
         break;

       case html.KeyCode.DELETE:
         if (caretIndex < textLength) {
           _text = text.substring(0, caretIndex) + text.substring(caretIndex + 1);
           caretIndexNew = caretIndex;
         }
         break;
     }

     if (caretIndexNew != -1) {
       _caretIndex = caretIndexNew;
       _caretTime = 0.0;
       _refreshPending |= 3;
     }
   }
 }

 //-------------------------------------------------------------------------------------------------

 _onTextInput(TextEvent textEvent) {

   if (_type == TextFieldType.INPUT) {

     var textLength = _text.length;
     var caretIndex = _caretIndex;
     var newText = textEvent.text;

     if (newText == '\r') newText = '\n';
     if (newText == '\n' && _multiline == false) newText = '';
     if (newText == '') return;
     if (_maxChars != 0 && textLength >= _maxChars) return;

     _text = _text.substring(0, caretIndex) + newText + _text.substring(caretIndex);
     _caretIndex = _caretIndex + newText.length;
     _caretTime = 0.0;
     _refreshPending |= 3;
   }
 }

 //-------------------------------------------------------------------------------------------------

 _onMouseDown(MouseEvent mouseEvent) {

   var mouseX = mouseEvent.localX.toDouble();
   var mouseY = mouseEvent.localY.toDouble();
   var canvasContext = _dummyCanvasContext;

   canvasContext.setTransform(1.0, 0.0, 0.0, 1.0, 0.0, 0.0);

   for(int line = 0; line < _textLineMetrics.length; line++) {

     var textLineMetrics = _textLineMetrics[line];
     if (textLineMetrics is! TextLineMetrics) continue;  // dart2js_hint

     var text = textLineMetrics._text;
     var lineX = textLineMetrics.x;
     var lineY1 = textLineMetrics.y - textLineMetrics.ascent;
     var lineY2 = textLineMetrics.y + textLineMetrics.descent;

     if (lineY1 <= mouseY && lineY2 >= mouseY) {
       var bestDistance = double.INFINITY;
       var bestIndex = 0;

       for(var c = 0; c <= text.length; c++) {
         var width = canvasContext.measureText(text.substring(0, c)).width.toDouble();
         var distance = (lineX + width - mouseX).abs();
         if (distance < bestDistance) {
           bestDistance = distance;
           bestIndex = c;
         }
       }

       _caretIndex = textLineMetrics._textIndex + bestIndex;
       _caretTime = 0.0;
       _refreshPending |= 3;
     }
   }
 }
}

Extends

EventDispatcher > DisplayObject > InteractiveObject > TextField

Constructors

new TextField([String text, TextFormat textFormat]) #

Creates a new Object instance.

Object instances have no meaningful state, and are only useful through their identity. An Object instance is equal to itself only.

docs inherited from Object
TextField([String text, TextFormat textFormat]) {

 this.text = (text != null) ? text : "";
 this.defaultTextFormat = (textFormat != null) ? textFormat : new TextFormat("Arial", 12, 0x000000);

 this.onKeyDown.listen(_onKeyDown);
 this.onTextInput.listen(_onTextInput);
 this.onMouseDown.listen(_onMouseDown);
}

Properties

num alpha #

inherited from DisplayObject
num get alpha => _alpha;
set alpha(num value) {
 if (value is num) {
   if (value < 0.0) value = 0.0;
   if (value > 1.0) value = 1.0;
   _alpha = value;
 }
}

String autoSize #

String get autoSize => _autoSize;
void set autoSize(String value) {
 _autoSize = value;
 _refreshPending |= 3;
}

bool background #

bool get background => _background;
void set background(bool value) {
 _background = value;
 _refreshPending |= 2;
}

int backgroundColor #

int get backgroundColor => _backgroundColor;
void set backgroundColor(int value) {
 _backgroundColor = value;
 _refreshPending |= 2;
}

bool border #

bool get border => _border;
void set border(bool value) {
 _border = value;
 _refreshPending |= 2;
}

int borderColor #

int get borderColor => _borderColor;
void set borderColor(int value) {
 _borderColor = value;
 _refreshPending |= 2;
}

bool cacheAsBitmap #

bool get cacheAsBitmap => _cacheAsBitmap;
void set cacheAsBitmap(bool value) {
 if (value) _refreshPending |= 2;
 _cacheAsBitmap = value;
}

final bool cached #

inherited from DisplayObject
bool get cached => _cacheTexture != null;

final int caretIndex #

int get caretIndex => _caretIndex;

String compositeOperation #

inherited from DisplayObject
String get compositeOperation => _compositeOperation;
set compositeOperation(String value) {
 _compositeOperation = value;
}

TextFormat defaultTextFormat #

TextFormat get defaultTextFormat => _defaultTextFormat;
void set defaultTextFormat(TextFormat value) {
 _defaultTextFormat = value.clone();
 _refreshPending |= 3;
}

bool displayAsPassword #

bool get displayAsPassword => _displayAsPassword;
void set displayAsPassword(bool value) {
 _displayAsPassword = value;
 _refreshPending |= 3;
}

bool doubleClickEnabled #

inherited from InteractiveObject
bool doubleClickEnabled = false

List<BitmapFilter> filters #

inherited from DisplayObject
List<BitmapFilter> get filters {
 if (_filters == null) _filters = new List<BitmapFilter>();
 return _filters;
}
set filters(List<BitmapFilter> value) {
 _filters = value;
}

num height #

num get height {
 _refreshTextLineMetrics();
 return _height;
}
void set height(num value) {
 _height = value.toDouble();
 _refreshPending |= 3;
}

Mask mask #

inherited from DisplayObject
Mask get mask => _mask;
set mask(Mask value) {
 _mask = value;
}

int maxChars #

int get maxChars => _maxChars;
void set maxChars(int value) {
 _maxChars = value;
}

bool mouseEnabled #

inherited from InteractiveObject
bool mouseEnabled = true

final Point mousePosition #

inherited from DisplayObject
Point get mousePosition {
 var stage = this.stage;
 return (stage != null) ? this.globalToLocal(stage._mousePosition) : null;
}

final num mouseX #

inherited from DisplayObject
num get mouseX {
 var mp = this.mousePosition;
 return (mp != null) ? mp.x : 0.0;
}

final num mouseY #

inherited from DisplayObject
num get mouseY {
 var mp = this.mousePosition;
 return (mp != null) ? mp.y : 0.0;
}

bool multiline #

bool get multiline => _multiline;
void set multiline(bool value) {
 _multiline = value;
 _refreshPending |= 3;
}

String name #

inherited from DisplayObject
String get name => _name;
set name(String value) {
 _name = value;
}

final int numLines #

int get numLines {
 _refreshTextLineMetrics();
 return _textLineMetrics.length;
}

bool off #

inherited from DisplayObject
bool get off => _off;
set off(bool value) {
 if (value is bool) _off = value;
}

final EventStream<Event> onAdded #

inherited from DisplayObject
EventStream<Event> get onAdded => DisplayObject.addedEvent.forTarget(this);

final EventStream<Event> onAddedToStage #

inherited from DisplayObject
EventStream<Event> get onAddedToStage => DisplayObject.addedToStageEvent.forTarget(this);

final EventStream<EnterFrameEvent> onEnterFrame #

inherited from DisplayObject
EventStream<EnterFrameEvent> get onEnterFrame => DisplayObject.enterFrameEvent.forTarget(this);

final EventStream<ExitFrameEvent> onExitFrame #

inherited from DisplayObject
EventStream<ExitFrameEvent> get onExitFrame => DisplayObject.exitFrameEvent.forTarget(this);

final EventStream<KeyboardEvent> onKeyDown #

inherited from InteractiveObject
EventStream<KeyboardEvent> get onKeyDown => InteractiveObject.keyDownEvent.forTarget(this);

final EventStream<KeyboardEvent> onKeyUp #

inherited from InteractiveObject
EventStream<KeyboardEvent> get onKeyUp => InteractiveObject.keyUpEvent.forTarget(this);

final EventStream<MouseEvent> onMouseClick #

inherited from InteractiveObject
EventStream<MouseEvent> get onMouseClick => InteractiveObject.mouseClickEvent.forTarget(this);

final EventStream<MouseEvent> onMouseContextMenu #

inherited from InteractiveObject
EventStream<MouseEvent> get onMouseContextMenu => InteractiveObject.mouseContextMenu.forTarget(this);

final EventStream<MouseEvent> onMouseDoubleClick #

inherited from InteractiveObject
EventStream<MouseEvent> get onMouseDoubleClick => InteractiveObject.mouseDoubleClickEvent.forTarget(this);

final EventStream<MouseEvent> onMouseDown #

inherited from InteractiveObject
EventStream<MouseEvent> get onMouseDown => InteractiveObject.mouseDownEvent.forTarget(this);

final EventStream<MouseEvent> onMouseMiddleClick #

inherited from InteractiveObject
EventStream<MouseEvent> get onMouseMiddleClick => InteractiveObject.mouseMiddleClickEvent.forTarget(this);

final EventStream<MouseEvent> onMouseMiddleDown #

inherited from InteractiveObject
EventStream<MouseEvent> get onMouseMiddleDown => InteractiveObject.mouseMiddleDownEvent.forTarget(this);

final EventStream<MouseEvent> onMouseMiddleUp #

inherited from InteractiveObject
EventStream<MouseEvent> get onMouseMiddleUp => InteractiveObject.mouseMiddleUpEvent.forTarget(this);

final EventStream<MouseEvent> onMouseMove #

inherited from InteractiveObject
EventStream<MouseEvent> get onMouseMove => InteractiveObject.mouseMoveEvent.forTarget(this);

final EventStream<MouseEvent> onMouseOut #

inherited from InteractiveObject
EventStream<MouseEvent> get onMouseOut => InteractiveObject.mouseOutEvent.forTarget(this);

final EventStream<MouseEvent> onMouseOver #

inherited from InteractiveObject
EventStream<MouseEvent> get onMouseOver => InteractiveObject.mouseOverEvent.forTarget(this);

final EventStream<MouseEvent> onMouseRightClick #

inherited from InteractiveObject
EventStream<MouseEvent> get onMouseRightClick => InteractiveObject.mouseRightClickEvent.forTarget(this);

final EventStream<MouseEvent> onMouseRightDown #

inherited from InteractiveObject
EventStream<MouseEvent> get onMouseRightDown => InteractiveObject.mouseRightDownEvent.forTarget(this);

final EventStream<MouseEvent> onMouseRightUp #

inherited from InteractiveObject
EventStream<MouseEvent> get onMouseRightUp => InteractiveObject.mouseRightUpEvent.forTarget(this);

final EventStream<MouseEvent> onMouseRollOut #

inherited from InteractiveObject
EventStream<MouseEvent> get onMouseRollOut => InteractiveObject.mouseRollOutEvent.forTarget(this);

final EventStream<MouseEvent> onMouseRollOver #

inherited from InteractiveObject
EventStream<MouseEvent> get onMouseRollOver => InteractiveObject.mouseRollOverEvent.forTarget(this);

final EventStream<MouseEvent> onMouseUp #

inherited from InteractiveObject
EventStream<MouseEvent> get onMouseUp => InteractiveObject.mouseUpEvent.forTarget(this);

final EventStream<MouseEvent> onMouseWheel #

inherited from InteractiveObject
EventStream<MouseEvent> get onMouseWheel => InteractiveObject.mouseWheelEvent.forTarget(this);

final EventStream<Event> onRemoved #

inherited from DisplayObject
EventStream<Event> get onRemoved => DisplayObject.removedEvent.forTarget(this);

final EventStream<Event> onRemovedFromStage #

inherited from DisplayObject
EventStream<Event> get onRemovedFromStage => DisplayObject.removedFromStageEvent.forTarget(this);

final EventStream<RenderEvent> onRender #

inherited from DisplayObject
EventStream<RenderEvent> get onRender => DisplayObject.renderEvent.forTarget(this);

final EventStream<TextEvent> onTextInput #

inherited from InteractiveObject
EventStream<TextEvent> get onTextInput => InteractiveObject.textInputEvent.forTarget(this);

final EventStream<TouchEvent> onTouchBegin #

inherited from InteractiveObject
EventStream<TouchEvent> get onTouchBegin => InteractiveObject.touchBeginEvent.forTarget(this);

final EventStream<TouchEvent> onTouchCancel #

inherited from InteractiveObject
EventStream<TouchEvent> get onTouchCancel => InteractiveObject.touchCancelEvent.forTarget(this);

final EventStream<TouchEvent> onTouchEnd #

inherited from InteractiveObject
EventStream<TouchEvent> get onTouchEnd => InteractiveObject.touchEndEvent.forTarget(this);

final EventStream<TouchEvent> onTouchMove #

inherited from InteractiveObject
EventStream<TouchEvent> get onTouchMove => InteractiveObject.touchMoveEvent.forTarget(this);

final EventStream<TouchEvent> onTouchOut #

inherited from InteractiveObject
EventStream<TouchEvent> get onTouchOut => InteractiveObject.touchOutEvent.forTarget(this);

final EventStream<TouchEvent> onTouchOver #

inherited from InteractiveObject
EventStream<TouchEvent> get onTouchOver => InteractiveObject.touchOverEvent.forTarget(this);

final DisplayObjectContainer parent #

inherited from DisplayObject
DisplayObjectContainer get parent => _parent;

String passwordChar #

String get passwordChar => _passwordChar;
void set passwordChar(String value) {
 _passwordChar = value[0];
 _refreshPending |= 3;
}

num pivotX #

inherited from DisplayObject
num get pivotX => _pivotX;
set pivotX(num value) {
 if (value is num) _pivotX = value;
 _transformationMatrixRefresh = true;
}

num pivotY #

inherited from DisplayObject
num get pivotY => _pivotY;
set pivotY(num value) {
 if (value is num) _pivotY = value;
 _transformationMatrixRefresh = true;
}

final RenderTexture renderTexture #

RenderTexture get renderTexture => _renderTexture;

final DisplayObject root #

inherited from DisplayObject
DisplayObject get root {

 DisplayObject currentObject = this;

 while (currentObject._parent != null)
   currentObject = currentObject._parent;

 return currentObject;
}

num rotation #

inherited from DisplayObject
num get rotation => _rotation;
set rotation(num value) {
 if (value is num) _rotation = value;
 _transformationMatrixRefresh = true;
}

num scaleX #

inherited from DisplayObject
num get scaleX => _scaleX;
set scaleX(num value) {
 if (value is num) _scaleX = value;
 _transformationMatrixRefresh = true;
}

num scaleY #

inherited from DisplayObject
num get scaleY => _scaleY;
set scaleY(num value) {
 if (value is num) _scaleY = value;
 _transformationMatrixRefresh = true;
}

Shadow shadow #

inherited from DisplayObject
Shadow get shadow => _shadow;
set shadow(Shadow value) {
 _shadow = value;
}

num skewX #

inherited from DisplayObject
num get skewX => _skewX;
set skewX(num value) {
 if (value is num) _skewX = value;
 _transformationMatrixRefresh = true;
}

num skewY #

inherited from DisplayObject
num get skewY => _skewY;
set skewY(num value) {
 if (value is num) _skewY = value;
 _transformationMatrixRefresh = true;
}

final Stage stage #

inherited from DisplayObject
Stage get stage {

 DisplayObject root = this.root;
 return (root is Stage) ? root : null;
}

bool tabEnabled #

inherited from InteractiveObject
bool tabEnabled = true

int tabIndex #

inherited from InteractiveObject
int tabIndex = 0

String text #

String get text => _text;
void set text(String value) {
 _text = value.replaceAll('\r\n', '\n').replaceAll('\r', '\n');
 _caretIndex = _text.length;
 _refreshPending |= 3;
}

int textColor #

int get textColor => _defaultTextFormat.color;
void set textColor(int value) {
 _defaultTextFormat.color = value;
 _refreshPending |= 2;
}

final num textHeight #

num get textHeight {
 _refreshTextLineMetrics();
 return _textHeight;
}

final num textWidth #

num get textWidth {
 _refreshTextLineMetrics();
 return _textWidth;
}

final Matrix transformationMatrix #

Matrix get transformationMatrix {
 _refreshTextLineMetrics();
 return super.transformationMatrix;
}

String type #

String get type => _type;
void set type(String value) {
 _type = value;
 _refreshPending |= 3;
}

var userData #

inherited from DisplayObject

Gets or sets user-defined data associated with the display object.

dynamic userData = null

bool visible #

inherited from DisplayObject
bool get visible => _visible;
set visible(bool value) {
 if (value is bool) _visible = value;
}

num width #

num get width {
 _refreshTextLineMetrics();
 return _width;
}
void set width(num value) {
 _width = value.toDouble();
 _refreshPending |= 3;
}

bool wordWrap #

bool get wordWrap => _wordWrap;
void set wordWrap(bool value) {
 _wordWrap = value;
 _refreshPending |= 3;
}

num get x #

num get x {
 _refreshTextLineMetrics();
 return super.x;
}

dynamic set x(num value) #

inherited from DisplayObject
set x(num value) {
 if (value is num) _x = value;
 _transformationMatrixRefresh = true;
}

num y #

inherited from DisplayObject
num get y => _y;
set y(num value) {
 if (value is num) _y = value;
 _transformationMatrixRefresh = true;
}

Methods

StreamSubscription<Event> addEventListener(String eventType, EventListener eventListener, {bool useCapture: false, int priority: 0}) #

inherited from EventDispatcher
StreamSubscription<Event> addEventListener(String eventType, EventListener eventListener, {
 bool useCapture: false, int priority: 0 }) {

 return this.on(eventType)._subscribe(eventListener, useCapture, priority);
}

void addTo(DisplayObjectContainer parent) #

inherited from DisplayObject
void addTo(DisplayObjectContainer parent) {
 parent.addChild(this);
}

void applyCache(int x, int y, int width, int height, {bool debugBorder: false}) #

inherited from DisplayObject
void applyCache(int x, int y, int width, int height, {bool debugBorder: false}) {

 var pixelRatio = Stage.autoHiDpi ? _devicePixelRatio : 1.0;

 if (_cacheTexture == null) {
   _cacheTexture = new RenderTexture(width, height, true, Color.Transparent, pixelRatio);
 } else {
   _cacheTexture.resize(width, height);
 }

 _cacheRectangle = new Rectangle(x, y, width, height);
 _cacheDebugBorder = debugBorder;

 refreshCache();
}

void dispatchEvent(Event event) #

inherited from DisplayObject
void dispatchEvent(Event event) {

 List<DisplayObject> ancestors = null;

 if (event.captures || event.bubbles) {
   for(DisplayObject ancestor = parent; ancestor != null; ancestor = ancestor.parent) {
     if(ancestor._hasPropagationEventListeners(event)) {
       if (ancestors == null) ancestors = [];
       ancestors.add(ancestor);
     }
   }
 }

 if (ancestors != null && event.captures) {
   for(int i = ancestors.length - 1 ; i >= 0; i--) {
     ancestors[i]._dispatchEventInternal(event, this, EventPhase.CAPTURING_PHASE);
     if (event.stopsPropagation) return;
   }
 }

 _dispatchEventInternal(event, this, EventPhase.AT_TARGET);
 if (event.stopsPropagation) return;

 if (ancestors != null && event.bubbles) {
   for(int i = 0; i < ancestors.length; i++) {
     ancestors[i]._dispatchEventInternal(event, this, EventPhase.BUBBLING_PHASE);
     if (event.stopsPropagation) return;
   }
 }
}

Rectangle getBounds(DisplayObject targetSpace) #

inherited from DisplayObject
Rectangle getBounds(DisplayObject targetSpace) {

 Rectangle returnRectangle = new Rectangle.zero();
 Matrix matrix = (targetSpace == null) ? transformationMatrix : transformationMatrixTo(targetSpace);

 return (matrix != null) ? getBoundsTransformed(matrix, returnRectangle) : returnRectangle;
}

Rectangle getBoundsTransformed(Matrix matrix, [Rectangle returnRectangle]) #

Rectangle getBoundsTransformed(Matrix matrix, [Rectangle returnRectangle]) {
 return _getBoundsTransformedHelper(matrix, _width, _height, returnRectangle);
}

int getLineLength(int lineIndex) #

int getLineLength(int lineIndex) {
 return getLineText(lineIndex).length;
}

TextLineMetrics getLineMetrics(int lineIndex) #

TextLineMetrics getLineMetrics(int lineIndex) {
 _refreshTextLineMetrics();
 return _textLineMetrics[lineIndex];
}

String getLineText(int lineIndex) #

String getLineText(int lineIndex) {
 return getLineMetrics(lineIndex)._text;
}

Point globalToLocal(Point globalPoint) #

inherited from DisplayObject
Point globalToLocal(Point globalPoint) {

 _tmpMatrix.identity();

 for(var current = this; current != null; current = current._parent) {
   _tmpMatrix.concat(current.transformationMatrix);
 }

 _tmpMatrix.invert();

 return _tmpMatrix.transformPoint(globalPoint);
}

bool hasEventListener(String eventType) #

inherited from EventDispatcher
bool hasEventListener(String eventType) {

 var eventStreams = _eventStreams;
 if (eventStreams == null) return false;
 var eventStream = eventStreams[eventType];
 if (eventStream == null) return false;

 return eventStream.hasSubscriptions;
}

DisplayObject hitTestInput(num localX, num localY) #

DisplayObject hitTestInput(num localX, num localY) {

 if (localX >= 0 && localY >= 0 && localX < _width && localY < _height)
   return this;

 return null;
}

bool hitTestObject(DisplayObject other) #

inherited from DisplayObject
bool hitTestObject(DisplayObject other) {

 var stage1 = this.stage;
 var stage2 = other.stage;

 if (stage1 == null || stage2 == null || stage1 != stage2) return false;

 var rect1 = this.getBounds(stage1);
 var rect2 = other.getBounds(stage2);

 return rect1.intersects(rect2);
}

bool hitTestPoint(num x, num y, [bool shapeFlag = false]) #

inherited from DisplayObject
bool hitTestPoint(num x, num y, [bool shapeFlag = false]) {

 var stage = this.stage;
 if (stage == null) return false;

 if (shapeFlag) {
   var matrix = stage.transformationMatrixTo(this);
   if (matrix == null) return false;

   var stagePoint = new Point(x, y);
   var localPoint = matrix.transformPoint(stagePoint);

   return this.hitTestInput(localPoint.x, localPoint.y) != null;

 } else {

   var rect = this.getBounds(stage);
   return rect.contains(x, y);
 }
}

Point localToGlobal(Point localPoint) #

inherited from DisplayObject
Point localToGlobal(Point localPoint) {

 _tmpMatrix.identity();

 for(var current = this; current != null; current = current._parent) {
   _tmpMatrix.concat(current.transformationMatrix);
 }

 return _tmpMatrix.transformPoint(localPoint);
}

EventStream<Event> on(String eventType) #

inherited from EventDispatcher
EventStream<Event> on(String eventType) {

 var eventStreams = _eventStreams;
 if (eventStreams == null) {
   eventStreams = new Map<String, EventStream>();
   _eventStreams = eventStreams;
 }

 var eventStream = eventStreams[eventType];
 if (eventStream == null) {
   eventStream = new EventStream._internal(this, eventType);
   eventStreams[eventType] = eventStream;
 }

 return eventStream;
}

void refreshCache() #

inherited from DisplayObject
void refreshCache() {

 if (_cacheTexture == null) return;

 var x = _cacheRectangle.x;
 var y = _cacheRectangle.y;
 var width = _cacheRectangle.width;
 var height = _cacheRectangle.height;
 var canvas = _cacheTexture.canvas;

 var matrix = _cacheTexture.quad.drawMatrix..translate(-x, -y);
 var renderContext = new RenderContextCanvas(canvas, Color.Transparent);
 var renderState = new RenderState(renderContext, matrix);

 renderContext.clear();
 render(renderState);

 if (_filters != null) {
   var cacheBitmapData = new BitmapData.fromRenderTextureQuad(_cacheTexture.quad);
   var bounds = this.getBoundsTransformed(_identityMatrix)..offset(-x, -y);
   for(var filter in _filters) {
     var filterOverlap = filter.overlap;
     var filterBounds = bounds.clone();
     filterBounds.offset(filterOverlap.x, filterOverlap.y);
     filterBounds.inflate(filterOverlap.width, filterOverlap.height);
     filter.apply(cacheBitmapData, filterBounds.align());
   }
 }

 if (_cacheDebugBorder) {
   canvas.context2D
       ..setTransform(1.0, 0.0, 0.0, 1.0, 0.0, 0.0)
       ..lineWidth = 1
       ..lineJoin = "miter"
       ..lineCap = "butt"
       ..strokeStyle = "#FF00FF"
       ..strokeRect(0.5, 0.5, canvas.width - 1, canvas.height - 1);
 }

 _cacheTexture.update();
}

void removeCache() #

inherited from DisplayObject
void removeCache() {
 if (_cacheTexture != null) {
   _cacheTexture.dispose();
   _cacheTexture = null;
 }
}

void removeEventListener(String eventType, EventListener eventListener, {bool useCapture: false}) #

inherited from EventDispatcher
void removeEventListener(String eventType, EventListener eventListener, {
 bool useCapture: false }) {

 this.on(eventType)._unsubscribe(eventListener, useCapture);
}

void removeEventListeners(String eventType) #

inherited from EventDispatcher
void removeEventListeners(String eventType) {
 this.on(eventType).cancelSubscriptions();
}

void removeFromParent() #

inherited from DisplayObject
void removeFromParent() {
 if (_parent != null)
   _parent.removeChild(this);
}

void render(RenderState renderState) #

void render(RenderState renderState) {

 _refreshTextLineMetrics();

 var renderContext = renderState.renderContext;

 if (_cacheAsBitmap || renderContext is! RenderContextCanvas) {
   _refreshCache();
   renderState.renderQuad(_renderTexture.quad);
 } else {
   var renderContextCanvas = renderState.renderContext as RenderContextCanvas;
   var context = renderContextCanvas.rawContext;
   var matrix = renderState.globalMatrix;
   context.setTransform(matrix.a, matrix.b, matrix.c, matrix.d, matrix.tx, matrix.ty);
   context.globalAlpha = renderState.globalAlpha;
   _renderText(renderContextCanvas.rawContext);
 }

 // draw cursor for INPUT text fields

 _caretTime += renderState.deltaTime;

 if (_type == TextFieldType.INPUT) {
   var stage = this.stage;
   if (stage != null && stage.focus == this && _caretTime.remainder(0.8) < 0.4) {
     var x1 = _caretX;
     var y1 = _caretY;
     var x3 = _caretX + _caretWidth;
     var y3 = _caretY + _caretHeight;
     var color = _defaultTextFormat.color;
     renderState.renderTriangle(x1, y1, x3, y1, x3, y3, color);
     renderState.renderTriangle(x1, y1, x3, y3, x1, y3, color);
   }
 }
}

void setTransform(num x, num y, [num scaleX, num scaleY, num rotation, num skewX, num skewY, num pivotX, num pivotY]) #

inherited from DisplayObject
void setTransform(num x, num y, [num scaleX, num scaleY, num rotation, num skewX, num skewY, num pivotX, num pivotY]) {
 if (x is num) _x = x;
 if (y is num) _y = y;
 if (scaleX is num) _scaleX = scaleX;
 if (scaleY is num) _scaleY = scaleY;
 if (rotation is num) _rotation = rotation;
 if (skewX is num) _skewX = skewX;
 if (skewY is num) _skewY = skewY;
 if (pivotX is num) _pivotX = pivotX;
 if (pivotY is num) _pivotY = pivotY;
 _transformationMatrixRefresh = true;
}

Matrix transformationMatrixTo(DisplayObject targetSpace) #

inherited from DisplayObject
Matrix transformationMatrixTo(DisplayObject targetSpace) {

 if (targetSpace == _parent) {
   return this.transformationMatrix.clone();
 }

 if (targetSpace != null && targetSpace._parent == this) {
   return targetSpace.transformationMatrix.cloneInvert();
 }

 //------------------------------------------------

 Matrix resultMatrix = new Matrix.fromIdentity();
 DisplayObject resultObject = this;

 while(resultObject != targetSpace && resultObject._parent != null) {
   resultMatrix.concat(resultObject.transformationMatrix);
   resultObject = resultObject._parent;
 }

 if (targetSpace == null && resultObject != null) {
   resultMatrix.concat(resultObject.transformationMatrix);
   resultObject = null;
 }

 if (resultObject == targetSpace)
   return resultMatrix;

 //------------------------------------------------

 Matrix targetMatrix = new Matrix.fromIdentity();
 DisplayObject targetObject = targetSpace;

 while(targetObject != this && targetObject._parent != null) {
   targetMatrix.concat(targetObject.transformationMatrix);
   targetObject = targetObject._parent;
 }

 targetMatrix.invert();

 if (targetObject == this) {
   return targetMatrix;
 }

 if (targetObject != resultObject) {
   return null;
 }

 resultMatrix.concat(targetMatrix);

 return resultMatrix;
}