You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by al...@apache.org on 2018/08/10 12:30:15 UTC
[royale-asjs] branch feature/MXRoyale updated: Add RichTextEditor.as
This is an automated email from the ASF dual-hosted git repository.
alinakazi pushed a commit to branch feature/MXRoyale
in repository https://gitbox.apache.org/repos/asf/royale-asjs.git
The following commit(s) were added to refs/heads/feature/MXRoyale by this push:
new 735d5ef Add RichTextEditor.as
735d5ef is described below
commit 735d5ef7aa175b7a2ba2c9156d8aebc32927dd06
Author: alinakazi <AL...@GMAIL.COM>
AuthorDate: Fri Aug 10 17:30:13 2018 +0500
Add RichTextEditor.as
---
.../src/main/royale/mx/controls/RichTextEditor.as | 795 +++++++++++++++++++++
1 file changed, 795 insertions(+)
diff --git a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/RichTextEditor.as b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/RichTextEditor.as
new file mode 100644
index 0000000..c73fd4b
--- /dev/null
+++ b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/RichTextEditor.as
@@ -0,0 +1,795 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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 mx.controls
+{
+ /* import flash.events.Event;
+ import flash.events.FocusEvent;
+ import flash.events.KeyboardEvent;
+ import flash.events.MouseEvent;
+ import flash.text.engine.FontPosture;
+ import flash.text.engine.FontWeight;
+ import flash.ui.Keyboard;
+ import flash.utils.Dictionary;
+
+ import mx.events.FlexEvent;
+
+ import spark.components.richTextEditorClasses.AlignTool;
+ import spark.components.richTextEditorClasses.BoldTool;
+ import spark.components.richTextEditorClasses.BulletTool;
+ import spark.components.richTextEditorClasses.ColorTool;
+ import spark.components.richTextEditorClasses.FontTool;
+ import spark.components.richTextEditorClasses.ItalicTool;
+ import spark.components.richTextEditorClasses.LinkTool;
+ import spark.components.richTextEditorClasses.SizeTool;
+ import spark.components.richTextEditorClasses.UnderlineTool;
+ import spark.events.ColorChangeEvent;
+ import spark.events.IndexChangeEvent;
+ import spark.events.TextOperationEvent;
+
+ import flashx.textLayout.conversion.ConversionType;
+ import flashx.textLayout.conversion.TextConverter;
+ import flashx.textLayout.edit.ElementRange;
+ import flashx.textLayout.edit.IEditManager;
+ import flashx.textLayout.edit.ISelectionManager;
+ import flashx.textLayout.edit.SelectionState;
+ import flashx.textLayout.elements.FlowGroupElement;
+ import flashx.textLayout.elements.FlowLeafElement;
+ import flashx.textLayout.elements.LinkElement;
+ import flashx.textLayout.elements.ListElement;
+ import flashx.textLayout.elements.ParagraphElement;
+ import flashx.textLayout.elements.TextFlow;
+ import flashx.textLayout.formats.TextAlign;
+ import flashx.textLayout.formats.TextDecoration;
+ import flashx.textLayout.formats.TextLayoutFormat;
+ */
+ // for asdoc
+ /* [Experimental]
+ [Event(name = "change", type = "flash.events.Event")]
+ [Style(name = "borderColor", inherit = "no", type = "unit")]
+ [Style(name = "focusColor", inherit = "yes", type = "unit")]
+ */
+ import mx.core.UIComponent;
+
+ public class RichTextEditor extends UIComponent
+ {
+
+
+ private var _htmlText:String;
+ private var _text:String;
+
+ /*private var _htmlTextChanged:Boolean = false;
+ private var _prompt:String = "";
+ private var _stylesChanged:Dictionary = new Dictionary;
+ private var _textFlow:TextFlow;
+ private var _linkSelected:Boolean = false;
+ private var _urlRegExpression:RegExp = new RegExp("^(https?://(www\\.)?|www\\.)[-._~:/?#\\[\\]@!$&'()*+,;=a-z0-9]+$", 'i');
+ private const _defaultLinkText:String = "http://";
+ private var _linkEl:LinkElement
+ private var _lastRange:ElementRange;
+
+ [SkinPart(required="true")]
+ public var textArea:TextArea;
+ [SkinPart(required="false")]
+ public var fontTool:FontTool;
+ [SkinPart(required="false")]
+ public var sizeTool:SizeTool;
+ [SkinPart(required="false")]
+ public var boldTool:BoldTool;
+ [SkinPart(required="false")]
+ public var italicTool:ItalicTool;
+ [SkinPart(required="false")]
+ public var underlineTool:UnderlineTool;
+ [SkinPart(required="false")]
+ public var colorTool:ColorTool;
+ [SkinPart(required="false")]
+ public var alignTool:AlignTool;
+ [SkinPart(required="false")]
+ public var bulletTool:BulletTool;
+ [SkinPart(required="false")]
+ public var linkTool:LinkTool;
+ */
+ public function RichTextEditor()
+ {
+ super();
+ //this.textFlow = new TextFlow; //Prevents a stack trace that happends when you try to access the textflow on click.
+ }
+
+ // [Bindable("change")]
+ /**
+ * The htmlText property is here for convenience. It converts the textFlow to TextConverter.TEXT_FIELD_HTML_FORMAT.
+ */
+ public function get htmlText():String
+ {
+ /* if (_htmlTextChanged)
+ {
+ if (text == "")
+ {
+ _htmlText = "";
+ }
+ else
+ {
+ _htmlText = TextConverter.export(textFlow, TextConverter.TEXT_FIELD_HTML_FORMAT, ConversionType.STRING_TYPE) as String;
+ }
+ _htmlTextChanged = false;
+ } */
+ return _htmlText;
+ }
+
+ /**
+ * The htmlText property is here for convenience. It converts the textFlow to TextConverter.TEXT_FIELD_HTML_FORMAT.
+ */
+ public function set htmlText(value:String):void
+ {
+ /* if (htmlText != value)
+ {
+ _htmlText = value;
+ if (textFlow)
+ {
+ textFlow = TextConverter.importToFlow(_htmlText, TextConverter.TEXT_FIELD_HTML_FORMAT);
+ }
+ } */
+ }
+
+ /**
+ * @private
+ */
+ /* public function get prompt():String
+ {
+ return _prompt;
+ } */
+
+ /**
+ * @private
+ */
+ /* public function set prompt(value:String):void
+ {
+ _prompt = value;
+ if (textArea)
+ {
+ textArea.prompt = _prompt;
+ }
+ } */
+
+ /**
+ * @private
+ */
+ /* public override function styleChanged(styleProp:String):void
+ {
+ super.styleChanged(styleProp);
+ _stylesChanged[styleProp] = getStyle(styleProp);
+ this.invalidateDisplayList();
+ }
+ */
+ //[Bindable("change")]
+ /**
+ * The text in the textArea
+ */
+ public function get text():String
+ {
+ /* if (textArea)
+ {
+ return textArea.text;
+ }
+ else
+ {
+ return _text;
+ } */
+ return _text;
+ }
+
+ /**
+ * @private
+ */
+ public function set text(value:String):void
+ {
+ _text = value;
+ /* if (textArea)
+ {
+ textArea.text = value;
+ } */
+ }
+
+ //[Bindable("change")]
+ /**
+ * The textFlow
+ */
+ /* public function get textFlow():TextFlow
+ {
+ return _textFlow;
+ } */
+
+ /**
+ * @private
+ */
+ /* public function set textFlow(value:TextFlow):void
+ {
+ _textFlow = value;
+ if (textArea)
+ {
+ textArea.textFlow = value;
+ }
+ } */
+
+ /**
+ * @private
+ */
+ /* protected override function partAdded(partName:String, instance:Object):void
+ {
+ super.partAdded(partName, instance);
+ if (instance == textArea)
+ {
+ textArea.addEventListener(TextOperationEvent.CHANGE, handleChange);
+ textArea.addEventListener(FlexEvent.SELECTION_CHANGE, handleSelectionChange);
+ textArea.addEventListener(KeyboardEvent.KEY_DOWN, handleKeyDown);
+ textArea.prompt = prompt;
+ textArea.textFlow = textFlow;
+ if (_htmlText)
+ {
+ textFlow = TextConverter.importToFlow(_htmlText, TextConverter.TEXT_FIELD_HTML_FORMAT);
+ }
+ else if (_text)
+ {
+ textArea.text = _text;
+ }
+ }
+ if (instance == fontTool)
+ {
+ fontTool.addEventListener(IndexChangeEvent.CHANGE, handleFontChange);
+ }
+ if (instance == sizeTool)
+ {
+ sizeTool.addEventListener(IndexChangeEvent.CHANGE, handleSizeChange);
+ }
+ if (instance == boldTool)
+ {
+ boldTool.addEventListener(MouseEvent.CLICK, handleBoldClick);
+ }
+ if (instance == italicTool)
+ {
+ italicTool.addEventListener(MouseEvent.CLICK, handleItalicClick);
+ }
+ if (instance == underlineTool)
+ {
+ underlineTool.addEventListener(MouseEvent.CLICK, handleUnderlineClick);
+ }
+ if (instance == colorTool)
+ {
+ colorTool.addEventListener(ColorChangeEvent.CHOOSE, handleColorChoose);
+ }
+ if (instance == alignTool)
+ {
+ alignTool.addEventListener(IndexChangeEvent.CHANGE, handleAlignChange);
+ }
+ if (instance == bulletTool)
+ {
+ bulletTool.addEventListener(MouseEvent.CLICK, handleBulletClick);
+ }
+ if (instance == linkTool)
+ {
+ linkTool.addEventListener(KeyboardEvent.KEY_DOWN, handleLinkKeydown);
+ linkTool.addEventListener(FocusEvent.MOUSE_FOCUS_CHANGE, handleLinkUpdate);
+ }
+ handleSelectionChange();
+ }
+ */
+ /**
+ * @private
+ */
+ /* protected override function partRemoved(partName:String, instance:Object):void
+ {
+ super.partRemoved(partName, instance);
+ if (instance == textArea)
+ {
+ textArea.removeEventListener(TextOperationEvent.CHANGE, handleChange);
+ textArea.removeEventListener(FlexEvent.SELECTION_CHANGE, handleSelectionChange);
+ textArea.removeEventListener(KeyboardEvent.KEY_DOWN, handleKeyDown);
+ }
+ if (instance == fontTool)
+ {
+ fontTool.removeEventListener(IndexChangeEvent.CHANGE, handleFontChange);
+ }
+ if (instance == sizeTool)
+ {
+ sizeTool.removeEventListener(IndexChangeEvent.CHANGE, handleSizeChange);
+ }
+ if (instance == boldTool)
+ {
+ boldTool.removeEventListener(MouseEvent.CLICK, handleBoldClick);
+ }
+ if (instance == italicTool)
+ {
+ italicTool.removeEventListener(MouseEvent.CLICK, handleItalicClick);
+ }
+ if (instance == underlineTool)
+ {
+ underlineTool.removeEventListener(MouseEvent.CLICK, handleUnderlineClick);
+ }
+ if (instance == colorTool)
+ {
+ colorTool.removeEventListener(ColorChangeEvent.CHOOSE, handleColorChoose);
+ }
+ if (instance == alignTool)
+ {
+ alignTool.removeEventListener(IndexChangeEvent.CHANGE, handleAlignChange);
+ }
+ if (instance == bulletTool)
+ {
+ bulletTool.removeEventListener(MouseEvent.CLICK, handleBulletClick);
+ }
+ if (instance == linkTool)
+ {
+ linkTool.removeEventListener(KeyboardEvent.KEY_DOWN, handleLinkKeydown);
+ linkTool.removeEventListener(FocusEvent.MOUSE_FOCUS_CHANGE, handleLinkUpdate);
+ }
+ }
+
+ /**
+ * @private
+ */
+ /* protected override function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
+ {
+ super.updateDisplayList(unscaledWidth, unscaledHeight);
+ if (textArea)
+ {
+ for (var key:String in _stylesChanged)
+ {
+ textArea.setStyle(key, _stylesChanged[key]);
+ }
+ _stylesChanged = new Dictionary; //Clear it out
+ }
+ } */
+
+ /**
+ * @private
+ * Actually apply the link to the selection. Repair the formating in the process.
+ */
+ /* private function applyLink(href:String, target:String = null, extendToLinkBoundary:Boolean = false, operationState:SelectionState = null):void
+ {
+ if (textArea && textArea.textFlow && textArea.textFlow.interactionManager is IEditManager)
+ {
+ //Get the current format
+ var txtLayFmt:TextLayoutFormat = textArea.textFlow.interactionManager.getCommonCharacterFormat();
+ //Set the link
+ if (operationState == null && _linkEl != null)
+ {
+ operationState = new SelectionState(textArea.textFlow, _linkEl.getAbsoluteStart(), _linkEl.getAbsoluteStart() + _linkEl.textLength);
+ }
+ var linkElement:LinkElement = IEditManager(textArea.textFlow.interactionManager).applyLink(href, target, extendToLinkBoundary, operationState);
+ //Fix the formatting
+ if(linkElement)
+ {
+ IEditManager(textArea.textFlow.interactionManager).clearFormatOnElement(linkElement.getChildAt(0), txtLayFmt);
+ }
+ var selectionEnd:int = Math.max(textArea.selectionActivePosition, textArea.selectionAnchorPosition);
+ textArea.selectRange(selectionEnd, selectionEnd);
+ IEditManager(textArea.textFlow.interactionManager).applyLeafFormat(txtLayFmt);
+ }
+ }
+ */
+ /**
+ * @private
+ * Automatically add a link if the previous text looks like a link
+ */
+ /* private function checkLinks():void
+ {
+ var position:int = textArea.selectionActivePosition;
+ //Find the firt non-whitespace character
+ while (position > 0)
+ {
+ if (!isWhitespace(textArea.textFlow.getCharCodeAtPosition(position)))
+ {
+ break;
+ }
+ position--;
+ }
+ //Find the next whitespace character
+ while (position > 0)
+ {
+ if (isWhitespace(textArea.textFlow.getCharCodeAtPosition(position)))
+ {
+ position++; //Back up one character
+ break;
+ }
+ position--;
+ }
+ var testText:String = textArea.textFlow.getText(position, textArea.selectionActivePosition);
+ var result:Array = testText.match(_urlRegExpression);
+ if (result != null && result.length > 0)
+ {
+ if (textArea.textFlow.interactionManager is IEditManager)
+ {
+ var selectionState:SelectionState = new SelectionState(textArea.textFlow, position, textArea.selectionActivePosition);
+ if (testText.substr(0, 3) == "www")
+ {
+ testText = "http://" + testText; //Add a missing 'http://' if needed
+ }
+ applyLink(testText, "_blank", true, selectionState);
+ textArea.setFocus();
+ }
+ }
+ } */
+
+ /**
+ * @private
+ */
+ /* private function getBulletSelectionState():SelectionState
+ {
+ if (textArea.textFlow)
+ {
+ var selectionManager:ISelectionManager = textArea.textFlow.interactionManager;
+ var selectionState:SelectionState = selectionManager.getSelectionState();
+ var startleaf:FlowLeafElement = textArea.textFlow.findLeaf(selectionState.absoluteStart);
+ var endleaf:FlowLeafElement = textArea.textFlow.findLeaf(selectionState.absoluteEnd);
+ if (startleaf != null)
+ {
+ selectionState.absoluteStart = startleaf.getAbsoluteStart();
+ }
+ if (endleaf != null)
+ {
+ selectionState.absoluteEnd = endleaf.getAbsoluteStart() + endleaf.parentRelativeEnd - endleaf.parentRelativeStart;
+ }
+ return selectionState;
+ }
+ return null;
+ }
+ */
+ /**
+ * @private
+ */
+ /* private function handleAlignChange(e:Event):void
+ {
+ if (alignTool.selectedItem)
+ {
+ var txtLayFmt:TextLayoutFormat = textArea.getFormatOfRange(null, textArea.selectionAnchorPosition, textArea.selectionActivePosition);
+ txtLayFmt.textAlign = alignTool.selectedItem.value;
+ textArea.setFormatOfRange(txtLayFmt, textArea.selectionAnchorPosition, textArea.selectionActivePosition);
+ textArea.setFocus();
+ textArea.dispatchEvent(new TextOperationEvent(TextOperationEvent.CHANGE));
+ }
+ } */
+
+ /**
+ * @private
+ */
+ /* private function handleBoldClick(e:MouseEvent):void
+ {
+ var format:TextLayoutFormat = textArea.getFormatOfRange(null, textArea.selectionAnchorPosition, textArea.selectionActivePosition);
+ format.fontWeight = (format.fontWeight == FontWeight.BOLD) ? FontWeight.NORMAL : FontWeight.BOLD;
+ textArea.setFormatOfRange(format, textArea.selectionAnchorPosition, textArea.selectionActivePosition);
+ textArea.setFocus();
+ textArea.dispatchEvent(new TextOperationEvent(TextOperationEvent.CHANGE));
+ } */
+
+ /**
+ * @private
+ */
+ /* private function handleBulletClick(e:MouseEvent):void
+ {
+ if (textArea.textFlow && textArea.textFlow.interactionManager is IEditManager)
+ {
+ var editManager:IEditManager = IEditManager(textArea.textFlow.interactionManager);
+ var doCreate:Boolean = true;
+ var selectionState:SelectionState = getBulletSelectionState();
+ var listElements:Array = textArea.textFlow.getElementsByTypeName("list");
+ for each (var listElement:ListElement in listElements)
+ {
+ var start:int = listElement.getAbsoluteStart();
+ var end:int = listElement.getAbsoluteStart() + listElement.parentRelativeEnd - listElement.parentRelativeStart;
+ if (selectionState.absoluteStart == start && selectionState.absoluteEnd == end)
+ { //Same
+ removeList(listElement);
+ doCreate = false;
+ break;
+ }
+ else if (selectionState.absoluteStart == start && selectionState.absoluteEnd <= end)
+ { //Inside touching start
+ selectionState = new SelectionState(textArea.textFlow, end, selectionState.absoluteEnd);
+ removeList(listElement);
+ editManager.createList(null, null, selectionState);
+ doCreate = false;
+ break;
+ }
+ else if (selectionState.absoluteStart >= start && selectionState.absoluteEnd == end)
+ { //Inside touching end
+ selectionState = new SelectionState(textArea.textFlow, selectionState.absoluteStart, start);
+ removeList(listElement);
+ editManager.createList(null, null, selectionState);
+ doCreate = false;
+ break;
+ }
+ else if (selectionState.absoluteStart >= start && selectionState.absoluteEnd <= end)
+ { //Inside
+ var firstRange:SelectionState = new SelectionState(textArea.textFlow, selectionState.absoluteStart, start);
+ var secondRange:SelectionState = new SelectionState(textArea.textFlow, end, selectionState.absoluteEnd);
+ removeList(listElement);
+ editManager.createList(null, null, firstRange);
+ editManager.createList(null, null, secondRange);
+ doCreate = false;
+ break;
+ }
+ else if ((selectionState.absoluteStart >= start && selectionState.absoluteStart <= end) || (selectionState.absoluteEnd >= start && selectionState.absoluteEnd <= end))
+ { //Overlap. Include this list in the selection
+ selectionState = new SelectionState(textArea.textFlow, Math.min(start, selectionState.absoluteStart), Math.max(end, selectionState.absoluteEnd));
+ removeList(listElement);
+ }
+ else if (selectionState.absoluteStart <= start && selectionState.absoluteEnd >= end)
+ { //surround. Remove this list since it will get added back in, only expanded.
+ removeList(listElement);
+ }
+ }
+ if (doCreate)
+ {
+ IEditManager(textArea.textFlow.interactionManager).createList(null, null, selectionState);
+ }
+ textArea.textFlow.interactionManager.setFocus();
+ }
+ }
+ */
+ /**
+ * @private
+ */
+ /* private function handleColorChoose(e:ColorChangeEvent):void
+ {
+ var format:TextLayoutFormat = textArea.getFormatOfRange(null, textArea.selectionAnchorPosition, textArea.selectionActivePosition);
+ format.color = e.color
+ textArea.setFormatOfRange(format, textArea.selectionAnchorPosition, textArea.selectionActivePosition);
+ textArea.setFocus();
+ textArea.dispatchEvent(new TextOperationEvent(TextOperationEvent.CHANGE));
+ }
+ */
+ /**
+ * @private
+ */
+ /* private function handleFontChange(e:Event):void
+ {
+ if (fontTool.selectedItem)
+ {
+ var format:TextLayoutFormat = textArea.getFormatOfRange(null, textArea.selectionAnchorPosition, textArea.selectionActivePosition);
+ format.fontFamily = fontTool.selectedItem;
+ textArea.setFormatOfRange(format, textArea.selectionAnchorPosition, textArea.selectionActivePosition);
+ textArea.setFocus();
+ textArea.dispatchEvent(new TextOperationEvent(TextOperationEvent.CHANGE));
+ }
+ } */
+
+ /**
+ * @private
+ */
+ /* private function handleItalicClick(e:MouseEvent):void
+ {
+ var format:TextLayoutFormat = textArea.getFormatOfRange(null, textArea.selectionAnchorPosition, textArea.selectionActivePosition);
+ format.fontStyle = (format.fontStyle == FontPosture.ITALIC) ? FontPosture.NORMAL : FontPosture.ITALIC;
+ textArea.setFormatOfRange(format, textArea.selectionAnchorPosition, textArea.selectionActivePosition);
+ textArea.setFocus();
+ textArea.dispatchEvent(new TextOperationEvent(TextOperationEvent.CHANGE));
+ } */
+
+ /**
+ * @private
+ */
+ /* private function handleKeyDown(e:KeyboardEvent):void
+ {
+ if (e.keyCode == Keyboard.ENTER || e.keyCode == Keyboard.SPACE || e.keyCode == Keyboard.TAB)
+ {
+ checkLinks();
+ }
+ } */
+
+ /**
+ * @private
+ */
+ /* private function handleLinkKeydown(e:KeyboardEvent):void
+ {
+ e.stopImmediatePropagation();
+ if (e.keyCode == Keyboard.ENTER)
+ {
+ handleLinkUpdate();
+ textArea.setFocus();
+ }
+ } */
+
+ /**
+ * @private
+ * Handle link set by applying the link to the selected text
+ */
+ /* private function handleLinkUpdate(e:Event = null):void
+ {
+ var urlText:String = linkTool.selectedLink == _defaultLinkText ? '' : linkTool.selectedLink;
+ applyLink(urlText, "_blank", true);
+ //Set focus to textFlow
+ textArea.textFlow.interactionManager.setFocus();
+ } */
+
+ /**
+ * @private
+ */
+ /* private function handleSelectionChange(e:FlexEvent = null):void
+ {
+ if (textArea != null)
+ {
+ var format:TextLayoutFormat = textArea.getFormatOfRange(null, textArea.selectionAnchorPosition, textArea.selectionActivePosition);
+ if (fontTool != null)
+ {
+ fontTool.selectedFontFamily = format.fontFamily;
+ }
+ if (sizeTool != null)
+ {
+ sizeTool.selectedFontSize = format.fontSize;
+ }
+ if (boldTool != null)
+ {
+ boldTool.selectedFontWeight = format.fontWeight;
+ }
+ if (italicTool != null)
+ {
+ italicTool.selectedFontStyle = format.fontStyle;
+ }
+ if (underlineTool != null)
+ {
+ underlineTool.selectedTextDecoration = format.textDecoration;
+ }
+ if (colorTool != null)
+ {
+ colorTool.selectedTextColor = format.color;
+ }
+ if (alignTool != null)
+ {
+ alignTool.selectedTextAlign = format.textAlign;
+ }
+ if (bulletTool != null)
+ {
+ if (textArea.textFlow)
+ {
+ var willRemoveBulletsIfClicked:Boolean = false;
+ var selectionState:SelectionState = getBulletSelectionState();
+ var listElements:Array = textArea.textFlow.getElementsByTypeName("list");
+ for each (var listElement:ListElement in listElements)
+ {
+ var start:int = listElement.getAbsoluteStart();
+ var end:int = listElement.getAbsoluteStart() + listElement.parentRelativeEnd - listElement.parentRelativeStart;
+ if (selectionState.absoluteStart == start && selectionState.absoluteEnd == end)
+ { //Same
+ willRemoveBulletsIfClicked = true;
+ break;
+ }
+ else if (selectionState.absoluteStart >= start && selectionState.absoluteEnd <= end)
+ { //Inside
+ willRemoveBulletsIfClicked = true;
+ break;
+ }
+ }
+ bulletTool.selected = willRemoveBulletsIfClicked;
+
+ }
+ }
+ if (linkTool != null)
+ {
+ var bulletSelectionState:SelectionState = textArea.textFlow.interactionManager.getSelectionState();
+ if (bulletSelectionState.absoluteStart != -1 && bulletSelectionState.absoluteEnd != -1)
+ {
+ var range:ElementRange = ElementRange.createElementRange(bulletSelectionState.textFlow, bulletSelectionState.absoluteStart, bulletSelectionState.absoluteEnd);
+ if (range)
+ {
+ var linkString:String = _defaultLinkText;
+ _linkEl = range.firstLeaf.getParentByType(LinkElement) as LinkElement;
+ if (_linkEl != null)
+ {
+ var linkElStart:int = _linkEl.getAbsoluteStart();
+ var linkElEnd:int = linkElStart + _linkEl.textLength;
+ if (linkElEnd < linkElStart)
+ {
+ var temp:int = linkElStart;
+ linkElStart = linkElEnd;
+ linkElEnd = temp;
+ }
+
+ var beginRange:int = range.absoluteStart;
+ var endRange:int = range.absoluteEnd;
+
+ var beginPara:ParagraphElement = range.firstParagraph;
+ if (endRange == (beginPara.getAbsoluteStart() + beginPara.textLength))
+ {
+ endRange--;
+ }
+
+ if ((beginRange == endRange) || (endRange <= linkElEnd))
+ {
+ linkString = LinkElement(_linkEl).href;
+ }
+ }
+ var newLinkSelected:Boolean = _linkEl != null;
+ if (_linkSelected != newLinkSelected)
+ {
+ _linkSelected = newLinkSelected;
+ this.dispatchEvent(new Event("linkSelectedChange"));
+ }
+
+ linkTool.selectedLink = linkString;
+
+ _lastRange = range;
+ }
+ else
+ {
+ _lastRange = null;
+ }
+ }
+ linkTool.enabled = textArea.selectionAnchorPosition != textArea.selectionActivePosition || _linkSelected;
+ }
+ }
+ }
+ */
+ /**
+ * @private
+ */
+ /* private function handleSizeChange(e:Event):void
+ {
+ if (sizeTool.selectedItem)
+ {
+ var format:TextLayoutFormat = textArea.getFormatOfRange(null, textArea.selectionAnchorPosition, textArea.selectionActivePosition);
+ format.fontSize = sizeTool.selectedItem;
+ textArea.setFormatOfRange(format, textArea.selectionAnchorPosition, textArea.selectionActivePosition);
+ textArea.setFocus();
+ textArea.dispatchEvent(new TextOperationEvent(TextOperationEvent.CHANGE));
+ }
+ } */
+
+ /**
+ * @private
+ */
+ /* private function handleUnderlineClick(e:MouseEvent):void
+ {
+ var format:TextLayoutFormat = textArea.getFormatOfRange(null, textArea.selectionAnchorPosition, textArea.selectionActivePosition);
+ format.textDecoration = (format.textDecoration == TextDecoration.UNDERLINE) ? TextDecoration.NONE : TextDecoration.UNDERLINE;
+ textArea.setFormatOfRange(format, textArea.selectionAnchorPosition, textArea.selectionActivePosition);
+ textArea.setFocus();
+ textArea.dispatchEvent(new TextOperationEvent(TextOperationEvent.CHANGE));
+ } */
+
+ /**
+ * @private
+ */
+ /* private function handleChange(e:Event):void
+ {
+ _htmlTextChanged = true;
+ this.dispatchEvent(e);
+ } */
+
+ /**
+ * @private
+ */
+ /* private function removeList(listElement:ListElement):void
+ {
+ var editManager:IEditManager = IEditManager(textArea.textFlow.interactionManager);
+
+ var target:FlowGroupElement = listElement.parent;
+ var targetIndex:int = target.getChildIndex(listElement);
+ editManager.moveChildren(listElement, 0, listElement.numChildren, target, targetIndex);
+ } */
+
+ /**
+ * @private
+ * Return true if the character is a whitespace character
+ */
+ /* private function isWhitespace(charCode:uint):Boolean
+ {
+ return charCode === 0x0009 || charCode === 0x000A || charCode === 0x000B || charCode === 0x000C || charCode === 0x000D || charCode === 0x0020 || charCode === 0x0085 || charCode === 0x00A0 || charCode === 0x1680 || charCode === 0x180E || charCode === 0x2000 || charCode === 0x2001 || charCode === 0x2002 || charCode === 0x2003 || charCode === 0x2004 || charCode === 0x2005 || charCode === 0x2006 || charCode === 0x2007 || charCode === 0x2008 || charCode === 0x2009 || charCode === 0x200A || [...]
+ } */
+ }
+}