У меня есть Spark TextArea:
<s:TextArea id="editor">
<s:textFlow>
<s:TextFlow id="_tf" >
<s:p>Lorem ipsum etc.</s:p>
<s:p>
<s:img source="http://example.com/example.jpg" />
</s:p>
<s:p>Aliquam tincidunt tempor etc.</s:p>
</s:TextFlow>
</s:textFlow>
</s:TextArea>
И кнопка для добавления изображения:
<s:Button id="imageBtn"
label="insert image"
width="89"
click="imageBtn_clickHandler(event);" />
Работает следующий скрипт:
import flashx.textLayout.elements.*;
import mx.events.FlexEvent;
protected function imageBtn_clickHandler(evt:MouseEvent):void {
var img:InlineGraphicElement = new InlineGraphicElement();
img.source = "http://example.com/example.jpg";
var p:ParagraphElement = new ParagraphElement();
p.addChild(img);
_tf.addChild(p);
_tf.flowComposer.updateAllControllers();
editor.setFocus();
}
, но добавляется только в конец TextFlow. Как я могу вставить InlineGraphicElement в активную каретку в TextArea? Моя первая мысль что-то вроде:
import flashx.textLayout.elements.*;
import mx.events.FlexEvent;
protected function imageBtn_clickHandler(evt:MouseEvent):void {
var img:InlineGraphicElement = new InlineGraphicElement();
img.source = "http://example.com/example.jpg";
var p:ParagraphElement;
//pseudocode
p = _tf.getCaret.AncestorThatIsParagraphElement;
// end pseudocode
p.addChild(img);
_tf.flowComposer.updateAllControllers();
editor.setFocus();
}
Но это все равно будет добавлено только в конце текущего абзаца, при условии, что я даже смогу найти текущий абзац как объект для .addChild () с. Итак, как я могу вставить InlineGraphicElement в середине текста (или даже заменить текст) в дочернем абзаце объекта TextFlow.
Спасибо за понимание.
ОБНОВЛЕНИЕ: ближе.
Я могу добавить в начало или конец абзаца.
protected function imageBtn_clickHandler(evt:MouseEvent):void {
var img:InlineGraphicElement = new InlineGraphicElement();
img.source = "http://example.com/example.jpg";
var insertInto:ParagraphElement = new ParagraphElement();
insertInto = editor.textFlow.getChildAt(
editor.textFlow.findChildIndexAtPosition(
editor.selectionAnchorPosition
)).getParagraph();
insertInto.addChildAt(0, img); // inserts at beginning of paragraph
insertInto.addChildAt(1, img); // inserts at end of paragraph
_tf.flowComposer.updateAllControllers();
editor.setFocus();
}
Но по-прежнему нет радости от вставки в середину. Кроме того, приведенный выше код не заменит выделенный текст, но здесь это не имеет значения.
РЕШЕНИЕ:
Основываясь на ссылке Юджина, ключом к этому является EditManager.
Следующий код представляет рабочую обновленную функцию:
protected function imageBtn_clickHandler(evt:MouseEvent):void {
var em:EditManager = editor.textFlow.interactionManager as EditManager;
em.selectRange(editor.selectionAnchorPosition, editor.selectionActivePosition);
em.insertInlineGraphic("http://example.com/example.jpg","auto","auto");
_tf.flowComposer.updateAllControllers();
editor.setFocus();
}