/* /////////////////////////////////////////////////////////////////////////////// // // HighlightBlock by Kingnare.com. // All Rights Reserved. // // Free to use for any non-commercial purposes just list me in your credits. // Contact me at auzn1982[at]gmail.com concerning commercial use. // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // /////////////////////////////////////////////////////////////////////////////// */ package com.kingnare.regex { import flash.display.Shape; import flash.geom.Point; import flash.geom.Rectangle; import flash.text.TextLineMetrics; import mx.core.IUITextField; import mx.flash.UIMovieClip; /** * * 根据IUITextField文本的起始和结束字符索引绘制图形并显示在文本选择区。 *

* E-mail:auzn1982[at]gmail.com * @author auzn at Kingnare.com * */ public class HighlightBlock extends UIMovieClip { /** * 目标文本 */ private var _textField:IUITextField; /** * 偏移点,调整绘图Shape与目标文本的位置差距 */ private var _offsetPoint:Point; /** * * HighlightBlock 构造方法 * @param textField 目标文本 * */ public function HighlightBlock(textField:IUITextField) { super(); _offsetPoint = new Point(0, 0); _textField = textField; } /** * * 绘制高亮块 * 根据起始字符索引及结束字符索引获得有效的绘制范围 * 如果绘制范围合法,将绘制高亮块。 * * @param beginIndex 目标文本中起始字符索引 * @param endIndex 目标文本中结束字符索引 * * @see #getValidBeginCharIndex() * @see #getValidEndCharIndex() */ public function highLightDraw(beginIndex:Number, endIndex:Number):void { var beginValidIndex:Number = getValidBeginCharIndex(beginIndex); var endValidIndex:Number = getValidEndCharIndex(endIndex); if(beginValidIndex == -1 || endValidIndex == -2) { //throw new Error("Invalid value"); return; } if(beginValidIndex<=endValidIndex) { normalDraw(beginValidIndex, endValidIndex); } } /** * * 根据起始字符索引及结束字符索引绘制,单行/多行。 * * @param beginIndex 目标文本中起始字符索引 * @param endIndex 目标文本中结束字符索引 * * @see #drawSingleLine() */ private function normalDraw(beginIndex:Number, endIndex:Number):void { //trace("Normal Draw"); var beginLineIndex:Number = _textField.getLineIndexOfChar(beginIndex); var endLineIndex:Number = _textField.getLineIndexOfChar(endIndex); var disLineNum:Number = endLineIndex-beginLineIndex; //1行 if(disLineNum<1) { drawSingleLine(beginIndex, endIndex); return; } //大于或等于一行 //首行 drawSingleLine(beginIndex, _textField.getLineOffset(beginLineIndex)+_textField.getLineLength(beginLineIndex)-1); //中间行 for(var i:Number=beginLineIndex+1;i= 1."); } } /** * * 通过行索引查找相对显示行的总高度 * @param lineIndex 行索引 * @return 相对高度 * */ public function getDisLineHeightByLine(lineIndex:Number):Number { var addHeight:Number = 2; for(var i:Number=_textField.scrollV-1;ilen-1) { return -1; } var line:Number = _textField.getLineIndexOfChar(beginIndex); if(line<_textField.scrollV-1) { line = _textField.scrollV-1; return _textField.getLineOffset(line); } return beginIndex; } /** * * 获取当前有效的结束字符索引 * @param endIndex 结束字符索引 * @return 有效的索引值。若索引值超出文本范围,返回-2 * */ public function getValidEndCharIndex(endIndex:Number):Number { var len:Number = _textField.text.length; if(endIndex<0 || endIndex>len-1) { return -2; } var line:Number = _textField.getLineIndexOfChar(endIndex); if(line>_textField.bottomScrollV-1) { line = _textField.bottomScrollV-1; return _textField.getLineOffset(line)+_textField.getLineLength(line)-1; } return endIndex; } /** * * 绘制并加到显示容器中 * @param pos * */ private function showBlock(pos:Rectangle):void { var rect:Rectangle = new Rectangle(_offsetPoint.x+pos.x, _offsetPoint.y+pos.y, pos.width, pos.height); this.addChild(drawBlock(rect)); } /** * * 绘制 * @param rect * @return 绘制图形 * */ protected function drawBlock(rect:Rectangle):Shape { var block:Shape = new Shape(); block.graphics.clear(); block.graphics.beginFill(0x0099CC, .35); block.graphics.lineStyle(1, 0x0099CC, .65, true); block.graphics.drawRoundRectComplex(rect.x, rect.y, rect.width, rect.height, 0, 0, 0, 0); block.graphics.endFill(); return block; } /** * * 目标文本组件 * @param tf 目标文本 * */ public function set textField(tf:IUITextField):void { _textField = tf; } /** * * @private * @return 目标文本 * */ public function get textField():IUITextField { return _textField; } /** * * 偏移点 * @param op 偏移点 * */ public function set offsetPoint(op:Point):void { _offsetPoint = op; } /** * * @private * @return 偏移点 * */ public function get offsetPoint():Point { return _offsetPoint; } } }