make TextLine actually do something on SWF side and report better sizes and errors for unimplemented things
Project: http://git-wip-us.apache.org/repos/asf/flex-asjs/repo Commit: http://git-wip-us.apache.org/repos/asf/flex-asjs/commit/6853279c Tree: http://git-wip-us.apache.org/repos/asf/flex-asjs/tree/6853279c Diff: http://git-wip-us.apache.org/repos/asf/flex-asjs/diff/6853279c Branch: refs/heads/tlf Commit: 6853279cd2a735c83ced4ae09c9b0a55df129b01 Parents: 70e2c0d Author: Alex Harui <[email protected]> Authored: Sat May 6 21:37:57 2017 -0700 Committer: Alex Harui <[email protected]> Committed: Mon May 8 11:59:02 2017 -0700 ---------------------------------------------------------------------- .../org/apache/flex/text/engine/ITextLine.as | 1 + .../flex/org/apache/flex/text/html/TextBlock.as | 48 +++++- .../flex/org/apache/flex/text/html/TextLine.as | 146 ++++++++++++++++--- 3 files changed, 169 insertions(+), 26 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/6853279c/frameworks/projects/Text/src/main/flex/org/apache/flex/text/engine/ITextLine.as ---------------------------------------------------------------------- diff --git a/frameworks/projects/Text/src/main/flex/org/apache/flex/text/engine/ITextLine.as b/frameworks/projects/Text/src/main/flex/org/apache/flex/text/engine/ITextLine.as index 17d93c8..c9f6b2a 100644 --- a/frameworks/projects/Text/src/main/flex/org/apache/flex/text/engine/ITextLine.as +++ b/frameworks/projects/Text/src/main/flex/org/apache/flex/text/engine/ITextLine.as @@ -69,6 +69,7 @@ package org.apache.flex.text.engine function getAtomTextRotation(atomIndex:int):String; function getAtomWordBoundaryOnLeft(atomIndex:int):Boolean; function getBaselinePosition(baseline:String):Number; + function getBounds(ref:Object):Rectangle; } http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/6853279c/frameworks/projects/Text/src/main/flex/org/apache/flex/text/html/TextBlock.as ---------------------------------------------------------------------- diff --git a/frameworks/projects/Text/src/main/flex/org/apache/flex/text/html/TextBlock.as b/frameworks/projects/Text/src/main/flex/org/apache/flex/text/html/TextBlock.as index 7c1faa6..088588a 100644 --- a/frameworks/projects/Text/src/main/flex/org/apache/flex/text/html/TextBlock.as +++ b/frameworks/projects/Text/src/main/flex/org/apache/flex/text/html/TextBlock.as @@ -60,7 +60,7 @@ package org.apache.flex.text.html { _baselineFontDescription = value; } - private var _baselineFontSize:Number = 0; + private var _baselineFontSize:Number = 12; public function get baselineFontSize():Number { return _baselineFontSize; @@ -70,7 +70,7 @@ package org.apache.flex.text.html _baselineFontSize = value; } - private var _baselineZero:String; + private var _baselineZero:String = "roman"; public function get baselineZero():String { return _baselineZero; @@ -180,16 +180,42 @@ package org.apache.flex.text.html _userData = value; } + private var lines:Array = []; + public function createTextLine(previousLine:ITextLine = null, width:Number = 1000000, lineOffset:Number = 0.0, fitSomething:Boolean = false):ITextLine { + if (previousLine == null) + lines.length = 0; // Not a very good implementation at this point... var textElem:TextElement = content as TextElement; var format:ElementFormat = content.elementFormat; - var tl:TextLine = new TextLine(); - var span:Span = new Span(); - span.text = textElem.text; - tl.addElement(span); - + var tl:TextLine = new TextLine(this, previousLine ? previousLine.textBlockBeginIndex + previousLine.rawTextLength : 0); + COMPILE::SWF + { + var s:String = content.text; + if (previousLine) + s = s.substring(previousLine.textBlockBeginIndex + previousLine.rawTextLength); + if (s.length == 0) + return null; + tl.textField.text = s; + tl.textField.width = width; + if (tl.textField.numLines > 1) + { + s = tl.textField.getLineText(0); + tl.textField.text = s; + tl.textField.multiline = false; + } + lines.push(tl); + } + COMPILE::JS + { + var span:Span = new Span(); + span.text = textElem.text; + tl.addElement(span); + } + if (previousLine == null) + _firstLine = tl; + _lastLine = tl; return tl; } public function dump():String{ @@ -197,26 +223,32 @@ package org.apache.flex.text.html } public function findNextAtomBoundary(afterCharIndex:int):int { + trace("findNextAtomBoundary not implemented"); return 0; } public function findNextWordBoundary(afterCharIndex:int):int { + trace("findNextWordBoundary not implemented"); return 0; } public function findPreviousAtomBoundary(beforeCharIndex:int):int { + trace("findPreviousAtomBoundary not implemented"); return 0; } public function findPreviousWordBoundary(beforeCharIndex:int):int { + trace("findPreviousWordBoundary not implemented"); return 0; } public function getTextLineAtCharIndex(charIndex:int):ITextLine { + trace("getTextLineAtCharIndex not implemented"); return null; } public function recreateTextLine(textLine:ITextLine, previousLine:ITextLine = null, width:Number = 1000000, lineOffset:Number = 0.0, fitSomething:Boolean = false):ITextLine { + trace("recreateTextLine not implemented"); return null; } public function releaseLineCreationData():void @@ -225,7 +257,7 @@ package org.apache.flex.text.html } public function releaseLines(firstLine:ITextLine, lastLine:ITextLine):void { - //TODO + lines.length = 0; } } http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/6853279c/frameworks/projects/Text/src/main/flex/org/apache/flex/text/html/TextLine.as ---------------------------------------------------------------------- diff --git a/frameworks/projects/Text/src/main/flex/org/apache/flex/text/html/TextLine.as b/frameworks/projects/Text/src/main/flex/org/apache/flex/text/html/TextLine.as index a3eeaff..3087cd7 100644 --- a/frameworks/projects/Text/src/main/flex/org/apache/flex/text/html/TextLine.as +++ b/frameworks/projects/Text/src/main/flex/org/apache/flex/text/html/TextLine.as @@ -18,6 +18,15 @@ //////////////////////////////////////////////////////////////////////////////// package org.apache.flex.text.html { + COMPILE::SWF + { + import flash.display.DisplayObject; + import flash.text.TextField; + import flash.text.TextFormat; + import flash.text.TextFieldAutoSize; + } + + import org.apache.flex.text.engine.ElementFormat; import org.apache.flex.text.engine.ITextLine; import org.apache.flex.text.engine.ITextBlock; import org.apache.flex.core.IUIBase; @@ -27,17 +36,54 @@ package org.apache.flex.text.html public class TextLine extends Div implements ITextLine { - public function TextLine() - { + COMPILE::SWF + public var textField:TextField; + + public function TextLine(textBlock:ITextBlock, beginIndex:int) + { + COMPILE::SWF + { + textField = new TextField(); + $displayObjectContainer.addChild(textField); + textField.autoSize = TextFieldAutoSize.LEFT; + + // use these to help calculate line breaks + textField.multiline = true; + textField.wordWrap = true; + + var textFormat:TextFormat = new TextFormat(); + var ef:ElementFormat = textBlock.content.elementFormat; + textFormat.font = ef.fontDescription.fontName; + textFormat.size = ef.fontSize; + textFormat.color = ef.color; + textField.defaultTextFormat = textFormat; + + } + _textBlock = textBlock; + _beginIndex = beginIndex; } public function get ascent():Number { - return 0; + COMPILE::SWF + { + return textField.getLineMetrics(0).ascent; + } + COMPILE::JS + { + return 0; + } } public function get atomCount():int { - return 0; + COMPILE::SWF + { + return textField.length; + } + COMPILE::JS + { + return 0; + } } public function get blendMode():String @@ -52,6 +98,10 @@ package org.apache.flex.text.html public function get descent():Number { + COMPILE::SWF + { + return textField.getLineMetrics(0).descent; + } return 0; } @@ -93,7 +143,14 @@ package org.apache.flex.text.html public function get rawTextLength():int { - return 0; + COMPILE::SWF + { + return textField.length; + } + COMPILE::JS + { + return 0; + } } public function get specifiedWidth():Number @@ -101,44 +158,61 @@ package org.apache.flex.text.html return 0; } + private var _textBlock:ITextBlock; + public function get textBlock():ITextBlock { - return null; + return _textBlock; } + private var _beginIndex:int; public function get textBlockBeginIndex():int { - return 0; + return _beginIndex; } public function get textHeight():Number { - return 0; + COMPILE::SWF + { + return textField.textHeight; + } + COMPILE::JS + { + return 0; + } } public function get textWidth():Number { - return 0; + COMPILE::SWF + { + return textField.textWidth; + } + COMPILE::JS + { + return 0; + } } public function get totalAscent():Number { - return 0; + return ascent; } public function get totalDescent():Number { - return 0; + return descent; } public function get totalHeight():Number { - return 0; + return textHeight; } public function get unjustifiedTextWidth():Number { - return 0; + return textWidth; } private var _userData:*; @@ -151,7 +225,7 @@ package org.apache.flex.text.html _userData = value; } - private var _validity:String; + private var _validity:String = "valid"; public function get validity():String { return _validity; @@ -194,9 +268,34 @@ package org.apache.flex.text.html return 0; } + public function getBounds(ref:Object):Rectangle + { + COMPILE::SWF + { + return Rectangle.fromObject($displayObject.getBounds(ref as DisplayObject)); + } + COMPILE::JS + { + return null; + } + } + public function getAtomBounds(atomIndex:int):Rectangle { - return null; + COMPILE::SWF + { + var r:Object = textField.getCharBoundaries(atomIndex); + if (r == null) + { + // not sure why we get null sometimes, but fake an answer + return new Rectangle(0, 1.2 - Number(textField.defaultTextFormat.size), 3, 1.2); + } + return Rectangle.fromObject(r); + } + COMPILE::JS + { + return null; + } } public function getAtomCenter(atomIndex:int):Number @@ -214,35 +313,46 @@ package org.apache.flex.text.html public function getAtomIndexAtCharIndex(charIndex:int):int { //TODO track indexes... - return 0; + return charIndex; } public function getAtomIndexAtPoint(stageX:Number, stageY:Number):int { - //TODO atom locations. This one will be fun... - return 0; + COMPILE::SWF + { + return textField.getCharIndexAtPoint(stageX, stageY); + } + COMPILE::JS + { + //TODO atom locations. This one will be fun... + return 0; + } } public function getAtomTextBlockBeginIndex(atomIndex:int):int { + trace("getAtomTextBlockBeginIndex not implemented"); //TODO track indexes... return 0; } public function getAtomTextBlockEndIndex(atomIndex:int):int { + trace("getAtomTextBlockEndIndex not implemented"); //TODO track indexes... return 0; } public function getAtomTextRotation(atomIndex:int):String { + trace("getAtomTextRotation not implemented"); //TODO returns TextRotation values. return "rotate0"; } public function getAtomWordBoundaryOnLeft(atomIndex:int):Boolean { + trace("getAtomWordBoundaryOnLeft not implemented"); //TODO we need to track word boundaries return false; }
