0

双击以选择 Flex 4 TextArea 中的文本时,如何防止包含句点?

例如,在 Flex 4 TextArea 组件中,如果我有单词“something.else”并且我双击单词“something”,它会突出显示“something.else”。

如何让它只突出“某物”?

我已经用谷歌搜索了这个,通过 API 挖掘,检查了相关的类,并没有找到任何“官方”的东西。

注意:我宁愿避免简单地拦截双击事件来自己处理设置选择范围,因为恢复其他现有功能的复杂性可能变得难以克服。

4

2 回答 2

2

1) TextArea 使用 RichEditableText。RichEditableText 使用 SelectionManager。SelectionManager 具有公共函数 mouseDoubleClickHandler。mouseDoubleClickHandler 使用 ParagraphElement(这是最终类)及其 findPreviousWordBoundary 和 findNextWordBoundary 函数。他们使用名称相似的 TextBlock 函数。TextBlock 是 playerglobal.swc 的一部分。

因此,可以通过覆盖 SelectionManager 的处理程序,然后扩展 RichEditableText 和一些基础设施类以使其使用您的自定义 SelectionManager 来应用具有覆盖方法的唯一“专业”方式。

但这不是一个简单的方法。

2)您可以在“。”周围放置一个空格字符。(更喜欢窄字体或创建其中一个字符宽度为 0 的自定义字体)。

rslt[0x0020] =  true;  //SPACE
            rslt[0x1680] =  true;  //OGHAM SPACE MARK
            rslt[0x180E] =  true;  //MONGOLIAN VOWEL SEPARATOR
            rslt[0x2000] =  true;  //EN QUAD
            rslt[0x2001] =  true;  //EM QUAD
            rslt[0x2002] =  true;  //EN SPACE
            rslt[0x2003] =  true;  //EM SPACE
            rslt[0x2004] =  true;  //THREE-PER-EM SPACE
            rslt[0x2005] =  true;  //FOUR-PER-EM SPACE
            rslt[0x2006] =  true;  //SIZE-PER-EM SPACE
            rslt[0x2007] =  true;  //FIGURE SPACE
            rslt[0x2008] =  true;  //PUNCTUATION SPACE
            rslt[0x2009] =  true;  //THIN SPACE
            rslt[0x200A] =  true;  //HAIR SPACE
            rslt[0x202F] =  true;  //NARROW NO-BREAK SPACE
            rslt[0x205F] =  true;  //MEDIUM MATHEMATICAL SPACE
            rslt[0x3000] =  true;  //IDEOGRAPHIC SPACE
            //members of LineSeparator category
            rslt[0x2028] =  true;  //LINE SEPARATOR
            //members of ParagraphSeparator category
            rslt[0x2029] =  true;
            //Other characters considered to be a space
            rslt[0x0009] =  true; //CHARACTER TABULATION
            rslt[0x000A] =  true; //LINE FEED
            rslt[0x000B] =  true; //LINE TABULATION
            rslt[0x000C] =  true; //FORM FEED
            rslt[0x000D] =  true; //CARRIAGE RETURN
            rslt[0x0085] =  true; //NEXT LINE
            rslt[0x00A0] =  true; //NO-BREAK SPACE  

3)所以,我认为您使用自定义双击处理程序的选项并没有那么糟糕。

于 2012-12-21T08:31:43.823 回答
1

这是我采用的解决方案:

protected var lastClickedSelectionAnchorIndex:int = 0;

protected function textArea_doubleClickHandler( event:MouseEvent ):void
{

    if( event.target != textArea.textDisplay ) return;

    if( textArea.selectionAnchorPosition == textArea.selectionActivePosition ) return;

    var targetText:String = textArea.text;

    if( targetText == null || targetText == "" || targetText.indexOf( "." ) === -1 ) return;

    var selectedText:String = targetText.substring( textArea.selectionAnchorPosition, textArea.selectionActivePosition );

    if( selectedText == null || selectedText == "" || selectedText.indexOf( "." ) === -1 ) return;

    var selectionStart:int = textArea.selectionAnchorPosition;
    var selectionEnd:int = textArea.selectionActivePosition;

    if( selectionStart > selectionEnd ){

        selectionStart = textArea.selectionActivePosition;
        selectionEnd = textArea.selectionAnchorPosition;

    }

    if( lastClickedSelectionAnchorIndex < selectionStart || lastClickedSelectionAnchorIndex > selectionEnd ){

        return;

    }

    var newSelectionStart:int = targetText.lastIndexOf( ".", lastClickedSelectionAnchorIndex );
    var newSelectionEnd:int = targetText.indexOf( ".", lastClickedSelectionAnchorIndex );

    var startSelectionOffset:int = 1;

    if( newSelectionStart < selectionStart || newSelectionStart === -1 ){

        newSelectionStart = selectionStart;

        startSelectionOffset = 0;

    }

    if( newSelectionEnd > selectionEnd || newSelectionEnd === -1 ){

        newSelectionEnd = selectionEnd;

    }

    textArea.selectRange( newSelectionStart + startSelectionOffset, newSelectionEnd );

}

protected function textArea_mouseDownHandler( event:MouseEvent ):void
{

    try{

        lastClickedSelectionAnchorIndex = textArea.selectionAnchorPosition;

    }catch( error:Error ){

        lastClickedSelectionAnchorIndex = 0;

    }

}
于 2012-12-22T05:11:39.203 回答