summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
authorRichard Nelson <none@none>2010-03-23 11:18:01 -0700
committerRichard Nelson <none@none>2010-03-23 11:18:01 -0700
commit91b90b0a1749471a9016c4935b58c08a3dd66523 (patch)
tree4f6491facf7fb603bb95ace300aa369797ff4dc6 /indra
parent3dc1bcd6ffba8b5763503375ff55e49f9b8323fd (diff)
EXT-5549 Can't select last character in chat window
Diffstat (limited to 'indra')
-rw-r--r--indra/llrender/llfontgl.cpp2
-rw-r--r--indra/llui/lltextbase.cpp26
-rw-r--r--indra/newview/llchathistory.cpp5
3 files changed, 23 insertions, 10 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..13201719f4 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;
@@ -362,7 +364,7 @@ void LLTextBase::drawSelectionBackground()
}
// if selection spans end of current segment...
- if (selection_right > segment_line_end)
+ 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 +1815,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 +1850,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
+ pos = llmin(getLength(), line_iter->mDocIndexEnd);
+ break;
+ }
+
start_x += text_width;
}
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index 7a45637d42..fc906a8f8e 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -734,7 +734,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
view->reshape(target_rect.getWidth(), view->getRect().getHeight());
view->setOrigin(target_rect.mLeft, view->getRect().mBottom);
- std::string widget_associated_text = "[" + chat.mTimeStr + "] ";
+ std::string widget_associated_text = "\n[" + chat.mTimeStr + "] ";
if (utf8str_trim(chat.mFromName).size() != 0 && chat.mFromName != SYSTEM_FROM)
widget_associated_text += chat.mFromName + delimiter;
@@ -835,9 +835,6 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
message = chat.mFromName + message;
}
- message += "\n";
-
-
mEditor->appendText(message, FALSE, style_params);
}
mEditor->blockUndo();