You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by ah...@apache.org on 2017/05/08 18:59:24 UTC

[12/21] git commit: [flex-asjs] [refs/heads/tlf] - make TextLine actually do something on SWF side and report better sizes and errors for unimplemented things

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 <ah...@apache.org>
Authored: Sat May 6 21:37:57 2017 -0700
Committer: Alex Harui <ah...@apache.org>
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;
 		}