summaryrefslogtreecommitdiff
path: root/indra/llui/lltexteditor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/llui/lltexteditor.cpp')
-rwxr-xr-xindra/llui/lltexteditor.cpp65
1 files changed, 62 insertions, 3 deletions
diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp
index 576e8f7600..9219490bf2 100755
--- a/indra/llui/lltexteditor.cpp
+++ b/indra/llui/lltexteditor.cpp
@@ -1124,8 +1124,14 @@ void LLTextEditor::addChar(llwchar wc)
setCursorPos(new_cursor_pos);
}
}
-}
+ if (mCursorPos > 0)
+ {
+ LLRect current_cursor_rect = getDocRectFromDocIndex(mCursorPos);
+ LLRect prev_cursor_rect = getDocRectFromDocIndex(mCursorPos - 1);
+ mDrawRightmostCursor = current_cursor_rect.mBottom < prev_cursor_rect.mBottom;
+ }
+}
void LLTextEditor::addLineBreakChar(BOOL group_together)
{
@@ -1271,6 +1277,12 @@ BOOL LLTextEditor::handleNavigationKey(const KEY key, const MASK mask)
break;
case KEY_HOME:
+ if(mDrawRightmostCursor && mCursorPos > 0)
+ {
+ mCursorPos--;
+ mDrawRightmostCursor = false;
+ }
+
startOfLine();
break;
@@ -1285,6 +1297,23 @@ BOOL LLTextEditor::handleNavigationKey(const KEY key, const MASK mask)
case KEY_END:
endOfLine();
+ {
+ S32 last_line_index = mLineInfoList.size() - 1;
+ if (getLineNumFromDocIndex(mCursorPos, true) < last_line_index)
+ {
+ mDrawRightmostCursor = true;
+ setCursorPos(mCursorPos + 1);
+ }
+ else if (last_line_index > 0) // only for two and more lines
+ {
+ S32 prev_line_width = mLineInfoList[last_line_index - 1].mRect.getWidth();
+ S32 last_line_width = mLineInfoList[last_line_index].mRect.getWidth();
+ if (prev_line_width <= last_line_width)
+ {
+ mDrawRightmostCursor = true;
+ }
+ }
+ }
break;
case KEY_LEFT:
@@ -1296,7 +1325,18 @@ BOOL LLTextEditor::handleNavigationKey(const KEY key, const MASK mask)
{
if( 0 < mCursorPos )
{
- setCursorPos(mCursorPos - 1);
+ LLRect current_cursor_rect = getDocRectFromDocIndex(mCursorPos);
+ LLRect next_cursor_rect = getDocRectFromDocIndex(mCursorPos - 1);
+
+ if (current_cursor_rect.mBottom < next_cursor_rect.mBottom)
+ {
+ mDrawRightmostCursor = true;
+ }
+ else
+ {
+ mDrawRightmostCursor = false;
+ setCursorPos(mCursorPos - 1);
+ }
}
else
{
@@ -1314,7 +1354,26 @@ BOOL LLTextEditor::handleNavigationKey(const KEY key, const MASK mask)
{
if( mCursorPos < getLength() )
{
- setCursorPos(mCursorPos + 1);
+ LLRect current_cursor_rect = getDocRectFromDocIndex(mCursorPos);
+ LLRect next_cursor_rect = getDocRectFromDocIndex(mCursorPos + 1);
+
+ if (current_cursor_rect.mBottom > next_cursor_rect.mBottom)
+ {
+ if (mDrawRightmostCursor)
+ {
+ mDrawRightmostCursor = false;
+ }
+ else
+ {
+ mDrawRightmostCursor = true;
+ setCursorPos(mCursorPos + 1);
+ }
+ }
+ else
+ {
+ mDrawRightmostCursor = false;
+ setCursorPos(mCursorPos + 1);
+ }
}
else
{