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;
                }

Reply via email to