You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by ha...@apache.org on 2017/03/16 13:38:01 UTC

[41/42] flex-asjs git commit: And here’s TLF…

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/fd08d137/frameworks/projects/TLF/src/main/flex/org/apache/flex/textLayout/EditClasses.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/TLF/src/main/flex/org/apache/flex/textLayout/EditClasses.as b/frameworks/projects/TLF/src/main/flex/org/apache/flex/textLayout/EditClasses.as
new file mode 100644
index 0000000..1f94edf
--- /dev/null
+++ b/frameworks/projects/TLF/src/main/flex/org/apache/flex/textLayout/EditClasses.as
@@ -0,0 +1,69 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package org.apache.flex.textLayout
+{
+	internal class EditClasses
+	{
+		import org.apache.flex.textLayout.container.TextContainerManager; TextContainerManager;
+		
+		import org.apache.flex.textLayout.events.FlowOperationEvent; FlowOperationEvent;
+		import org.apache.flex.textLayout.events.SelectionEvent; SelectionEvent;
+ 
+		import org.apache.flex.textLayout.edit.EditManager; EditManager;
+		import org.apache.flex.textLayout.edit.ElementRange; ElementRange;
+		import org.apache.flex.textLayout.edit.IEditManager; IEditManager;
+		import org.apache.flex.textLayout.edit.Mark; Mark;
+		import org.apache.flex.textLayout.edit.SelectionManager; SelectionManager;
+		import org.apache.flex.textLayout.edit.ModelEdit; ModelEdit;
+		import org.apache.flex.textLayout.edit.IMemento; IMemento;
+		import org.apache.flex.textLayout.edit.ElementMark; ElementMark;
+
+		import org.apache.flex.textLayout.edit.TextScrap; TextScrap;
+
+		import org.apache.flex.textLayout.operations.ApplyFormatOperation; ApplyFormatOperation;
+		import org.apache.flex.textLayout.operations.ApplyFormatToElementOperation; ApplyFormatToElementOperation;
+		import org.apache.flex.textLayout.operations.ApplyLinkOperation; ApplyLinkOperation;
+		import org.apache.flex.textLayout.operations.ApplyTCYOperation; ApplyTCYOperation;
+		import org.apache.flex.textLayout.operations.ApplyElementIDOperation; ApplyElementIDOperation;
+		import org.apache.flex.textLayout.operations.ApplyElementStyleNameOperation; ApplyElementStyleNameOperation;
+		import org.apache.flex.textLayout.operations.ApplyElementTypeNameOperation; ApplyElementTypeNameOperation;
+		import org.apache.flex.textLayout.operations.CreateDivOperation; CreateDivOperation;
+		import org.apache.flex.textLayout.operations.ClearFormatOperation; ClearFormatOperation;
+		import org.apache.flex.textLayout.operations.ClearFormatOnElementOperation; ClearFormatOnElementOperation;
+		import org.apache.flex.textLayout.operations.CreateListOperation; CreateListOperation;
+		import org.apache.flex.textLayout.operations.CreateSubParagraphGroupOperation; CreateSubParagraphGroupOperation;
+		import org.apache.flex.textLayout.operations.CompositeOperation; CompositeOperation;
+		import org.apache.flex.textLayout.operations.CopyOperation; CopyOperation;
+		import org.apache.flex.textLayout.operations.CutOperation; CutOperation;
+		import org.apache.flex.textLayout.operations.DeleteTextOperation; DeleteTextOperation;
+		import org.apache.flex.textLayout.operations.FlowOperation; FlowOperation;
+		import org.apache.flex.textLayout.operations.InsertInlineGraphicOperation; InsertInlineGraphicOperation;
+		import org.apache.flex.textLayout.operations.InsertTextOperation; InsertTextOperation;
+		import org.apache.flex.textLayout.operations.PasteOperation; PasteOperation;
+		import org.apache.flex.textLayout.operations.RedoOperation; RedoOperation;
+		import org.apache.flex.textLayout.operations.ApplyElementUserStyleOperation; ApplyElementUserStyleOperation;
+		import org.apache.flex.textLayout.operations.SplitParagraphOperation; SplitParagraphOperation;
+		import org.apache.flex.textLayout.operations.SplitElementOperation; SplitElementOperation;
+		import org.apache.flex.textLayout.operations.UndoOperation; UndoOperation;
+
+		import org.apache.flex.textLayout.utils.NavigationUtil; NavigationUtil;
+		
+
+	}
+}

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/fd08d137/frameworks/projects/TLF/src/main/flex/org/apache/flex/textLayout/TextLayoutVersion.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/TLF/src/main/flex/org/apache/flex/textLayout/TextLayoutVersion.as b/frameworks/projects/TLF/src/main/flex/org/apache/flex/textLayout/TextLayoutVersion.as
new file mode 100644
index 0000000..6f9aec1
--- /dev/null
+++ b/frameworks/projects/TLF/src/main/flex/org/apache/flex/textLayout/TextLayoutVersion.as
@@ -0,0 +1,135 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package org.apache.flex.textLayout 
+{	
+
+	/** 
+	 *  This class controls the backward-compatibility of the framework.
+	 *  With every new release, some aspects of the framework are changed which can affect your application.
+	 *  
+	 *  @langversion 3.0
+	 *  @playerversion Flash 10
+	 *  @playerversion AIR 2.0
+	 */
+	public class TextLayoutVersion 
+	{		
+		
+		//--------------------------------------------------------------------------
+		//
+		//  Class constants
+		//
+		//--------------------------------------------------------------------------
+		
+		/** 
+		 *  The current released version of the Text Layout Framework, encoded as a uint.
+		 *  
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10
+		 *  @playerversion AIR 2.0
+		 */
+		public static const CURRENT_VERSION:uint = 0x03000000;
+		
+		/** 
+		 *  The version number value of TLF 3.0,
+		 *  encoded numerically as a <code>uint</code>.
+		 *  
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10
+		 *  @playerversion AIR 2.0
+		 */
+		public static const VERSION_3_0:uint = 0x03000000;
+		
+		/** 
+		 *  The version number value of TLF 2.0,
+		 *  encoded numerically as a <code>uint</code>.
+		 *  
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10
+		 *  @playerversion AIR 2.0
+		 */
+		public static const VERSION_2_0:uint = 0x02000000;
+		
+		/** 
+		 *  The version number value of TLF 1.0,
+		 *  encoded numerically as a <code>uint</code>.
+		 *  
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10
+		 *  @playerversion AIR 2.0
+		 */
+		public static const VERSION_1_0:uint = 0x01000000;
+
+		/** 
+		 *  The version number value of TLF 1.1,
+		 *  encoded numerically as a <code>uint</code>.
+		 *  
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10
+		 *  @playerversion AIR 2.0
+		 */
+		public static const VERSION_1_1:uint = 0x01010000;
+		
+		/** @private
+		 * Contains the current build number. 
+		 * It is static and can be called with <code>TextLayoutVersion.BUILD_NUMBER</code>
+		 * <p>String Format: "BuildNumber (Changelist)"</p>
+		 */
+		public static const BUILD_NUMBER:String = "31 (763429)";
+		
+		/** @private
+		 * Contains the branch name. 
+		 */
+		public static const BRANCH:String = "main";
+		
+		/**
+		 * @private 
+		 */
+		public static const AUDIT_ID:String = "<AdobeIP 0000486>";
+		
+		/**
+		 * @private 
+		 */
+		public function dontStripAuditID():String
+		{
+			return AUDIT_ID;
+		}
+
+		/** @private
+		 *  The version as a string of the form "X.X.X".
+		 *  Converts the version number to a more
+		 *  human-readable String version.
+		 *  
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10
+		 *  @playerversion AIR 2.0
+		 */
+		public static function getVersionString(version:uint):String
+		{
+			var major:uint = (version >> 24) & 0xFF;
+			var minor:uint = (version >> 16) & 0xFF;
+			var update:uint = version & 0xFFFF;
+			
+			return major.toString() + "." +
+				minor.toString() + "." +
+				update.toString();
+		}
+
+	}
+	
+}

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/fd08d137/frameworks/projects/TLF/src/main/flex/org/apache/flex/textLayout/accessibility/TextAccImpl.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/TLF/src/main/flex/org/apache/flex/textLayout/accessibility/TextAccImpl.as b/frameworks/projects/TLF/src/main/flex/org/apache/flex/textLayout/accessibility/TextAccImpl.as
new file mode 100644
index 0000000..d8d7fc1
--- /dev/null
+++ b/frameworks/projects/TLF/src/main/flex/org/apache/flex/textLayout/accessibility/TextAccImpl.as
@@ -0,0 +1,426 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package org.apache.flex.textLayout.accessibility
+{
+	import flash.accessibility.Accessibility;
+	import flash.accessibility.AccessibilityImplementation;
+	import flash.accessibility.AccessibilityProperties;
+	import flash.display.DisplayObject;
+	import org.apache.flex.events.Event;
+	
+	import org.apache.flex.textLayout.edit.EditingMode;
+	import org.apache.flex.textLayout.edit.ISelectionManager;
+	import org.apache.flex.textLayout.elements.IFlowLeafElement;
+	import org.apache.flex.textLayout.elements.GlobalSettings;
+	import org.apache.flex.textLayout.elements.IParagraphElement;
+	import org.apache.flex.textLayout.elements.TextFlow;
+	import org.apache.flex.textLayout.events.CompositionCompleteEvent;
+	
+
+    //TODO this is in text_edit... which violates MVC yet again... what to do?
+    //import org.apache.flex.textLayout.events.SelectionEvent;
+    
+	//TODO handle selectable text when FP implements the new selection API:
+	//     http://frpbugapp.macromedia.com/bugapp/detail.asp?id=217540
+	//     To catch the selection changes reliably, listen for SelectionEvent,
+	//     which is dispatched on the TextFlow whenever the selection changes.
+
+    //TODO handle scrolling? might need to expose scrolling in here
+    
+	//TODO handle hyperlinks? I don't know if MSAA has a concept for this
+	//    (what other text advanced features must be accessible? graphics?)
+	//TODO what if there is HTML in it? strip it, or read it? we don't have an
+	//     htmlText property, do we?
+
+    // TODO Do we want to read the contents of each sprite and stop, even if the
+    // text flows into other sprite, meaning we read text in taborder; or do we
+    // want to read the entire model and not worry about the presentation
+    // (simpler)? Not sure if I can get the contents of each sprite separately.
+    
+    // TODO TESTING:
+    //   * Test that JAWS reads when setting the focus programmatically.
+    //   * Tests for changing every part of the model programmatically -- role
+    //     and state should update accordingly, visibility, and text contents.
+    //   * Test that setting tabOrder reads as expected. What happens if you set
+    //     tabOrder on multiple flowComposers?
+    
+    //TODO update this comment after integration
+	/**
+	 * @private
+	 * The TextAccImpl class adds accessibility for text components.
+	 * This hooks into DisplayObjects when TextFlow.container is set.
+	 */
+	public class TextAccImpl extends AccessibilityImplementation
+	{
+	    //TODO might want to put these constants in a new class if they are
+	    //     used anywhere else.
+	    
+		/** Default state */
+		protected static const STATE_SYSTEM_NORMAL:uint = 0x00000000;
+		
+		/** Read-only text */
+		protected static const STATE_SYSTEM_READONLY:uint = 0x00000040;
+		
+		/** Inivisible text */
+		//TODO unused, but supported state for text in MSAA
+		protected static const STATE_SYSTEM_INVISIBLE:uint = 0x00008000;
+		
+		/** Default role -- read-only, unselectable text. */
+		protected static const ROLE_SYSTEM_STATICTEXT:uint = 0x29;
+		
+		/** Editable OR read-only, selectable text. */
+		protected static const ROLE_SYSTEM_TEXT:uint = 0x2a;
+		
+		/* When the name changes (name is the text conent in STATICTEXT). */
+		protected static const EVENT_OBJECT_NAMECHANGE:uint = 0x800c;
+		
+		/* When the value changes (value is the text content in TEXT). */
+		protected static const EVENT_OBJECT_VALUECHANGE:uint = 0x800e;
+	
+		/**
+		 *  A reference to the DisplayObject that is hosting accessible text.
+		 */
+		//TODO for now this assumes only the first DO in a flow is accessible
+		//     in the future each flow DO should host its own accimpl and read
+		//     the text only for its own box.
+		//
+		//     Or... perhaps we use getChildIDArray to manage all the text
+		//     flows if they are linked below some master component (but I don't
+		//     think this is the way it will happen).
+		protected var textContainer:DisplayObject;
+		
+		/**
+		 *  A reference to the TextFlow where our text originates.
+		 */
+		protected var textFlow:TextFlow;
+		
+		/**
+		 *  Constructor.
+		 * 
+		 *  @param textContainer The DisplayObject instance that this
+		 *                       TextAccImpl instance is making accessible.
+		 *  @param textFlow The TextFlow that is hosting the textContainer.
+		 */
+		public function TextAccImpl(textCont:DisplayObject, textFlow:TextFlow)
+		{
+			super();
+	
+			this.textContainer = textCont;
+			this.textFlow = textFlow;
+			
+			// stub is true when you are NOT providing an acc implementation
+			// reports to reader as graphic
+			stub = false;
+			
+			if (textCont.accessibilityProperties == null)
+			{
+    			textCont.accessibilityProperties =
+    			    new AccessibilityProperties();
+			}
+
+            //TODO
+            // setup event listeners for text selection and model changes
+            //textFlow.addEventListener(SelectionEvent.SELECTION_CHANGE,
+            //                          eventHandler);
+            textFlow.addEventListener(CompositionCompleteEvent.COMPOSITION_COMPLETE, eventHandler);
+		}
+		
+		public function detachListeners():void
+		{
+			textFlow.removeEventListener(CompositionCompleteEvent.COMPOSITION_COMPLETE, eventHandler);
+		}
+		
+		/**
+		 *  Returns the system role for the text.
+		 *
+		 *  @param childID uint.
+		 *  @return Role associated with the text.
+		 */
+		override public function get_accRole(childID:uint):uint
+		{
+		    // trace("get_accRole()");
+		    
+		    const iManager:ISelectionManager = textFlow.interactionManager;
+		    if (iManager == null)
+		    {
+		        // non-selectable, non-editable text is STATICTEXT
+		        return ROLE_SYSTEM_STATICTEXT;
+		    }
+		    else // iManager is an IEditManager and/or ISelectionManager
+		    {
+		        // read-only selectable or editable selectable text are TEXT
+		        return ROLE_SYSTEM_TEXT;
+		    }
+		}
+		
+		/**
+		 *  Returns the state of the text.
+		 *
+		 *  @param childID uint.
+		 *  @return Role associated with the text.
+		 */
+		override public function get_accState(childID:uint):uint
+		{
+		    // trace("get_accState()");
+		    
+		    const iManager:ISelectionManager = textFlow.interactionManager;
+		    
+		    //TODO handle STATE_SYSTEM_INVISIBLE for all cases below
+		    //     and add an event to detect changes--does Flash support this?
+		    
+		    //TODO handle STATE_SYSTEM_PROTECTED for all cases below
+		    //     if vellum gets a concept of password fields, then it needs to 
+		    //     emit this value if the field is converted to a password;
+		    //     otherwise the Flex framework will need to be sure to emit
+		    //     this state in a text input component.
+		    
+		    // note: focus-related states are handled by the player
+		    
+		    if (iManager == null)
+		    {
+		        // non-selectable, non-editable text
+		        return STATE_SYSTEM_READONLY;
+		    }
+		    // must check IEditManager before ISelectionManager (it can be both)
+		    else if (iManager.editingMode == EditingMode.READ_WRITE)
+		    {
+		        // editable selectable text
+		        return STATE_SYSTEM_NORMAL;
+		    }
+		    else // if (iManager instanceof ISelectionManager)
+		    {
+		        // read-only selectable text
+		        return STATE_SYSTEM_READONLY;
+		    }
+		}
+		
+		/**
+		 *  Returns the name of the text.
+		 *
+		 *  @param childID uint.
+		 *  @return Name of the text.
+		 */
+		override public function get_accName(childID:uint):String
+		{
+		    // trace("get_accName()");
+		    
+		    switch (get_accRole(childID))
+		    {
+    		    case ROLE_SYSTEM_STATICTEXT:
+    		    {
+        		    //TODO this SHOULD come from TextConverter, but then there is a
+        		    //     circular build dependency since importExport builds
+        		    //     against model, and it probably violates mvc
+        			//return TextConverter.export(textFlow,
+        			//                         TextConverter.PLAIN_TEXT_FORMAT);
+        			
+        			//TODO this is probably expensive. is there a way to cache
+        			//      this and know when dirty?
+        			//TODO  look at the generation and determine when it's dirty
+        			return exportToString(textFlow);
+    		    }
+    		    
+		        case ROLE_SYSTEM_TEXT:
+		        default:
+            		return null;
+    		}
+		}
+		
+		/**
+		 *  Returns the value of the text.
+		 *
+		 *  @param childID uint.
+		 *  @return Name of the text.
+		 */
+		override public function get_accValue(childID:uint):String
+		{
+		    // trace("get_accValue()");
+		    
+		    switch (get_accRole(childID))
+		    {
+		        case ROLE_SYSTEM_TEXT:
+    		    {
+        		    //TODO this SHOULD come from TextConverter, but then there is a
+        		    //     circular build dependency since importExport builds
+        		    //     against model, and it probably violates mvc
+        			//return TextConverter.export(textFlow,
+        			//                         TextConverter.PLAIN_TEXT_FORMAT);
+        			
+        			// TODO this is probably expensive. is there a way to cache
+        			//      this and know when dirty?
+        			//TODO  look at the generation and determine when it's dirty
+        			return exportToString(textFlow);
+    		    }
+    		    
+    		    case ROLE_SYSTEM_STATICTEXT:
+		        default:
+            		return null;
+    		}
+		}
+
+		/**
+		 * Handles COMPOSITION_COMPLETE and SELECTION_CHANGE events,
+		 * updates the MSAA model.
+    	 */
+    	protected function eventHandler(event:Event):void
+    	{
+    		switch (event.type)
+    		{
+                // This updates the entire accessibility DOM.
+                // get_accName is probably expensive here, it happens ONLY if
+                // JAWS is running, otherwise Accessibility.* calls are NOOP.
+                //
+                // Event does NOT fire when interactionManager changes; ideally
+                // we'd want to tell MSAA the role changed, but apparently roles
+                // are typically static and that's not a supported workflow.
+                // instead, Flash occasionally polls the displaylist, e.g. when
+                // you mouseover. calling updateProperties() doesn't necessarily
+                // trigger role updates (calls to get_acc*()).
+    			case CompositionCompleteEvent.COMPOSITION_COMPLETE:
+    			{
+    			    // TODO change childID from 0 if we use getChildIDArray
+    			    //      otherwise delete this comment
+	 				try {
+	    				Accessibility.sendEvent(textContainer, 0,
+    					                        EVENT_OBJECT_NAMECHANGE);
+    					Accessibility.sendEvent(textContainer, 0,
+    					                        EVENT_OBJECT_VALUECHANGE);
+    					Accessibility.updateProperties();
+					} catch (e_err:Error) {
+	 					// generic error occurred.
+                        // this can happen in the SA player since there is no
+                        // Accessibility implementation.
+	 				}
+    				break;
+    			}
+    			
+                //TODO when we have the FP selection APIs
+    			// case SelectionEvent.SELECTION_CHANGE:
+    			// {
+                //   // this is just stubbed code, I don't know what *needs* to
+                //   // be done for SELECTION_CHANGE
+    			// 	Accessibility.sendEvent(textContainer, 0,
+    			//                          EVENT_OBJECT_TEXTSELECTIONCHANGED);
+    			// 	Accessibility.updateProperties();
+    			// 	break;
+    			// }
+    		}
+    	}
+		
+		/**
+		 * TODO HACK, remove and refactor.
+		 * 
+		 * This is copied from PlainTextExportFilter, which I would prefer to
+		 * access through TextConverter.export(textFlow,
+		 *                                  TextConverter.PLAIN_TEXT_FORMAT);
+		 * 
+		 * But, PTEF is in importExport, which builds against text_model,
+		 * which is a circular dependency.
+		 * 
+		 * Also, it seems to be adding a trailing newline, which is bad for
+		 * accessibility unless it is really there.
+		 * 
+		 * Might want to export and strip out hyphens.
+		 * Move it to the model?
+		 */
+		private static function exportToString(source:TextFlow):String
+		{
+			var leaf:IFlowLeafElement = source.getFirstLeaf();
+			var rslt:String = "";
+			var curString:String = "";
+			var discretionaryHyphen:String = String.fromCharCode(0x00AD);
+			while (leaf)
+			{
+            	var p:IParagraphElement = leaf.getParagraph();
+            	while (true)
+            	{
+            		curString = leaf.text;
+            		
+            		//split out discretionary hyphen and put string back together
+					var temparray:Array = curString.split(discretionaryHyphen);
+					curString = temparray.join("");
+					
+	               	rslt += curString;
+					leaf = leaf.getNextLeaf(p);
+					if (!leaf)
+                    {
+                        // we want newlines between paragraphs but not at the end
+                    	rslt += "\n";
+						break;
+					}
+            	}
+            	leaf = p.getLastLeaf().getNextLeaf();
+   			}
+   			return rslt;
+		}
+		
+		/** 
+		 * The zero-based character index value of the first character in the current selection.
+		 * Components which wish to support inline IME or Accessibility should call into this method.
+		 *
+		 * @return the index of the character at the anchor end of the selection, or <code>-1</code> if no text is selected.
+		 * 
+		 * @playerversion Flash 10.0
+		 * @langversion 3.0
+		 */
+		public function get selectionActiveIndex():int
+		{
+			var selMgr:ISelectionManager = textFlow.interactionManager;
+			var selIndex:int = -1;
+			if(selMgr && selMgr.editingMode != EditingMode.READ_ONLY)
+			{
+				selIndex = selMgr.activePosition;
+			}
+			
+			return selIndex;
+		}
+		
+		/** 
+		 * The zero-based character index value of the last character in the current selection.
+		 * Components which wish to support inline IME or Accessibility should call into this method.
+		 *
+		 * @return the index of the character at the active end of the selection, or <code>-1</code> if no text is selected.
+		 * 
+		 * @playerversion Flash 10.0
+		 * @langversion 3.0
+		 */
+		public function get selectionAnchorIndex():int
+		{
+			var selMgr:ISelectionManager = textFlow.interactionManager;
+			var selIndex:int = -1;
+			if(selMgr && selMgr.editingMode != EditingMode.READ_ONLY)
+			{
+				selIndex = selMgr.anchorPosition;
+			}
+			
+			return selIndex;
+		}
+		
+		/** Enable search index for Ichabod
+		 * Returns the entire text of the TextFlow, or null if search index is not enabled
+		 * @see GlobalSettings.searchIndexEnabled
+		 */
+		public function get searchText():String
+		{
+			return GlobalSettings.enableSearch ? textFlow.getText() : null;
+		}
+		
+	}
+}
+