如何清除TLF中选择的格式?

时间:2018-02-04 04:45:26

标签: actionscript-3 flash flex tlf

我试图删除选择的格式,到目前为止,当选择在段落中时,我只删除选择的格式。如果选择扩展到另一个段落,则不会删除格式。

这是我到目前为止所做的:

var currentFormat:TextLayoutFormat;
var currentParagraphFormat:TextLayoutFormat;
var containerFormat:TextLayoutFormat;
var selectionStart:int;
var selectionEnd:int;
var operationState:SelectionState;
var editManager:IEditManager;

if (richEditableText.textFlow && richEditableText.textFlow.interactionManager is IEditManager) {
    editManager = IEditManager(richEditableText.textFlow.interactionManager);

    selectionStart = Math.min(richEditableText.selectionActivePosition, richEditableText.selectionAnchorPosition);
    selectionEnd = Math.max(richEditableText.selectionActivePosition, richEditableText.selectionAnchorPosition);

    if (operationState == null) {
        operationState = new SelectionState(richEditableText.textFlow, selectionStart, selectionEnd);
    }

    currentFormat = editManager.getCommonCharacterFormat(operationState);
    currentParagraphFormat = editManager.getCommonParagraphFormat(operationState);
    containerFormat = editManager.getCommonContainerFormat(operationState);

    editManager.clearFormat(currentFormat, currentParagraphFormat, containerFormat);

}

1 个答案:

答案 0 :(得分:0)

似乎SelectionManager.getCommonCharacterFormat()并没有像我想象的那样做。我需要获取所选字符的格式,而该功能似乎并没有这样做。

如果我得到一个ElementRange然后遍历它,我可以创建一个TextLayoutFormat,其中包含元素范围内所有叶子上的格式。

var currentFormat:TextLayoutFormat;
var currentParagraphFormat:TextLayoutFormat;
var containerFormat:TextLayoutFormat;
var selectionStart:int;
var selectionEnd:int;
var operationState:SelectionState;
var editManager:IEditManager;

if (richEditableText.textFlow && richEditableText.textFlow.interactionManager is IEditManager) {
    editManager = IEditManager(richEditableText.textFlow.interactionManager);

    selectionStart = Math.min(richEditableText.selectionActivePosition, richEditableText.selectionAnchorPosition);
    selectionEnd = Math.max(richEditableText.selectionActivePosition, richEditableText.selectionAnchorPosition);

    if (operationState == null) {
        operationState = new SelectionState(richEditableText.textFlow, selectionStart, selectionEnd);
    }

    // following lines were change
    elementRange = ElementRange.createElementRange(richEditableText.textFlow, selectionStart, selectionEnd);
    currentFormat = getElementRangeFormat(elementRange);

    editManager.clearFormat(currentFormat, currentParagraphFormat, containerFormat);

}

// method to get format of the selected range
public static function getElementRangeFormat(elementRange:ElementRange):TextLayoutFormat {      
    var leaf:FlowLeafElement = elementRange.firstLeaf;
    var attr:TextLayoutFormat = new TextLayoutFormat(leaf.computedFormat);

    for (;;)
    {
        if (leaf == elementRange.lastLeaf)
            break;
        leaf = leaf.getNextLeaf();
        attr.concatInheritOnly(leaf.computedFormat);
    }

    return Property.extractInCategory(TextLayoutFormat, TextLayoutFormat.description, attr, Category.CHARACTER, false) as TextLayoutFormat;
}