diff options
| author | Richard Linden <none@none> | 2010-03-23 12:50:53 -0700 | 
|---|---|---|
| committer | Richard Linden <none@none> | 2010-03-23 12:50:53 -0700 | 
| commit | 75370837c11ec5f62aadcd7f364c4db93764ca8a (patch) | |
| tree | 9e5c04556a9c2489dc7c8894e6769359a7c8ad5c /indra | |
| parent | eb91c97d6046ee1255f8b9b7d86826e0045dee98 (diff) | |
| parent | e3e50bf7ed48c6ee0a199d27fce7ba888793429d (diff) | |
merge
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/llrender/llfontgl.cpp | 2 | ||||
| -rw-r--r-- | indra/llui/lltextbase.cpp | 31 | ||||
| -rw-r--r-- | indra/newview/llchathistory.cpp | 1 | 
3 files changed, 26 insertions, 8 deletions
| diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp index 768f042e69..d9e1976341 100644 --- a/indra/llrender/llfontgl.cpp +++ b/indra/llrender/llfontgl.cpp @@ -673,7 +673,7 @@ S32 LLFontGL::charFromPixelOffset(const llwchar* wchars, S32 begin_offset, F32 t  	target_x *= sScaleX;  	// max_chars is S32_MAX by default, so make sure we don't get overflow -	const S32 max_index = begin_offset + llmin(S32_MAX - begin_offset, max_chars); +	const S32 max_index = begin_offset + llmin(S32_MAX - begin_offset, max_chars - 1);  	F32 scaled_max_pixels =	max_pixels * sScaleX; diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 633135382e..5f4b16ec9e 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -350,6 +350,8 @@ void LLTextBase::drawSelectionBackground()  					S32 segment_line_start = segmentp->getStart() + segment_offset;  					S32 segment_line_end = llmin(segmentp->getEnd(), line_iter->mDocIndexEnd); +					if (segment_line_start > segment_line_end) break; +  					S32 segment_width = 0;  					S32 segment_height = 0; @@ -361,8 +363,11 @@ void LLTextBase::drawSelectionBackground()  						selection_rect.mLeft += segment_width;  					} -					// if selection spans end of current segment... -					if (selection_right > segment_line_end) +					// if selection_right == segment_line_end then that means we are the first character of the next segment +					// or first character of the next line, in either case we want to add the length of the current segment +					// to the selection rectangle and continue. +					// if selection right > segment_line_end then selection spans end of current segment... +					if (selection_right >= segment_line_end)  					{  						// extend selection slightly beyond end of line  						// to indicate selection of newline character (use "n" character to determine width) @@ -1813,11 +1818,18 @@ S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round,  		const LLTextSegmentPtr segmentp = *line_seg_iter;  		S32 segment_line_start = segmentp->getStart() + line_seg_offset; -		S32 segment_line_length = llmin(segmentp->getEnd(), line_iter->mDocIndexEnd - 1) - segment_line_start; +		S32 segment_line_length = llmin(segmentp->getEnd(), line_iter->mDocIndexEnd) - segment_line_start;  		S32 text_width, text_height; -		segmentp->getDimensions(line_seg_offset, segment_line_length, text_width, text_height); -		if (local_x < start_x + text_width						// cursor to left of right edge of text -			|| (hit_past_end_of_line && (segmentp->getEnd() >= line_iter->mDocIndexEnd - 1)))	// or this segment wraps to next line +		bool newline = segmentp->getDimensions(line_seg_offset, segment_line_length, text_width, text_height); + +		// if we've reached a line of text *below* the mouse cursor, doc index is first character on that line +		if (hit_past_end_of_line && local_y - mVisibleTextRect.mBottom + visible_region.mBottom > line_iter->mRect.mTop) +		{ +			pos = segment_line_start; +			break; +		} +		if (local_x < start_x + text_width			// cursor to left of right edge of text +			|| newline)								// or this line ends with a newline, set doc pos to newline char  		{  			// Figure out which character we're nearest to.  			S32 offset; @@ -1841,6 +1853,13 @@ S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round,  			pos = segment_line_start + offset;  			break;  		} +		else if (hit_past_end_of_line && segmentp->getEnd() >= line_iter->mDocIndexEnd - 1)	 +		{ +			// segment wraps to next line, so just set doc pos to start of next line (represented by mDocIndexEnd) +			pos = llmin(getLength(), line_iter->mDocIndexEnd); +			break; +		} +  		start_x += text_width;  	} diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index ffa24a0c15..efdfbb8d20 100644 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -835,7 +835,6 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL  			message = chat.mFromName + message;  		} -  		mEditor->appendText(message, FALSE, style_params);  	}  	mEditor->blockUndo(); | 
