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)「。」の前後にスペース文字の1つを配置できます。(狭いものを好むか、それらの文字の1つが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 に答える