双击以选择 Flex 4 TextArea 中的文本时,如何防止包含句点?
例如,在 Flex 4 TextArea 组件中,如果我有单词“something.else”并且我双击单词“something”,它会突出显示“something.else”。
如何让它只突出“某物”?
我已经用谷歌搜索了这个,通过 API 挖掘,检查了相关的类,并没有找到任何“官方”的东西。
注意:我宁愿避免简单地拦截双击事件来自己处理设置选择范围,因为恢复其他现有功能的复杂性可能变得难以克服。
双击以选择 Flex 4 TextArea 中的文本时,如何防止包含句点?
例如,在 Flex 4 TextArea 组件中,如果我有单词“something.else”并且我双击单词“something”,它会突出显示“something.else”。
如何让它只突出“某物”?
我已经用谷歌搜索了这个,通过 API 挖掘,检查了相关的类,并没有找到任何“官方”的东西。
注意:我宁愿避免简单地拦截双击事件来自己处理设置选择范围,因为恢复其他现有功能的复杂性可能变得难以克服。
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)所以,我认为您使用自定义双击处理程序的选项并没有那么糟糕。
这是我采用的解决方案:
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;
}
}