Ctrl-Backspace and Ctrl-Delete for removing whole words when editing text

Lirusaito 2014-08-27 00:04:47 -04:00
parent 16bafd9080
commit caa86284e1
4 changed files with 81 additions and 2 deletions

View File

@ -933,6 +933,32 @@ void LLLineEditor::removeChar()
}
}
// Remove a word (set of characters up to next space/punctuation) from the text
void LLLineEditor::removeWord(bool prev)
{
const U32 pos(getCursor());
if (prev ? pos > 0 : static_cast<S32>(pos) < getLength())
{
U32 new_pos(prev ? prevWordPos(pos) : nextWordPos(pos));
if (new_pos == pos) // Other character we don't jump over
new_pos = prev ? prevWordPos(new_pos-1) : nextWordPos(new_pos+1);
const U32 diff(labs(pos - new_pos));
if (prev)
{
mText.erase(new_pos, diff);
setCursor(new_pos);
}
else
{
mText.erase(pos, diff);
}
}
else
{
LLUI::reportBadKeystroke();
}
}
void LLLineEditor::addChar(const llwchar uni_char)
{
@ -1381,7 +1407,10 @@ BOOL LLLineEditor::handleSpecialKey(KEY key, MASK mask)
else
if( 0 < getCursor() )
{
removeChar();
if (mask == MASK_CONTROL)
removeWord(true);
else
removeChar();
}
else
{
@ -1391,6 +1420,14 @@ BOOL LLLineEditor::handleSpecialKey(KEY key, MASK mask)
handled = TRUE;
break;
case KEY_DELETE:
if (!mReadOnly && mask == MASK_CONTROL)
{
removeWord(false);
handled = true;
}
break;
case KEY_PAGE_UP:
case KEY_HOME:
if (!mIgnoreArrowKeys)

View File

@ -285,6 +285,7 @@ private:
void pasteHelper(bool is_primary);
void removeChar();
void removeWord(bool prev);
void addChar(const llwchar c);
void setCursorAtLocalPos(S32 local_mouse_x);
S32 findPixelNearestPos(S32 cursor_offset = 0) const;

View File

@ -1122,6 +1122,33 @@ void LLTextEditor::removeChar()
}
}
// Remove a word (set of characters up to next space/punctuation) from the text
void LLTextEditor::removeWord(bool prev)
{
const U32 pos(mCursorPos);
if (prev ? pos > 0 : static_cast<S32>(pos) < getLength())
{
U32 new_pos(prev ? prevWordPos(pos) : nextWordPos(pos));
if (new_pos == pos) // Other character we don't jump over
new_pos = prev ? prevWordPos(new_pos-1) : nextWordPos(new_pos+1);
const U32 diff(labs(pos - new_pos));
if (prev)
{
remove(new_pos, diff, false);
setCursorPos(new_pos);
}
else
{
remove(pos, diff, false);
}
}
else
{
LLUI::reportBadKeystroke();
}
}
// Add a single character to the text
S32 LLTextEditor::addChar(S32 pos, llwchar wc)
{
@ -1717,7 +1744,10 @@ BOOL LLTextEditor::handleSpecialKey(const KEY key, const MASK mask)
else
if( 0 < mCursorPos )
{
removeCharOrTab();
if (mask == MASK_CONTROL)
removeWord(true);
else
removeCharOrTab();
}
else
{
@ -1725,6 +1755,16 @@ BOOL LLTextEditor::handleSpecialKey(const KEY key, const MASK mask)
}
break;
case KEY_DELETE:
if (getEnabled() && mask == MASK_CONTROL)
{
removeWord(false);
}
else
{
handled = false;
}
break;
case KEY_RETURN:
if (mask == MASK_NONE)

View File

@ -262,6 +262,7 @@ protected:
S32 overwriteChar(S32 pos, llwchar wc);
void removeChar();
S32 removeChar(S32 pos);
void removeWord(bool prev);
S32 insert(S32 pos, const LLWString &wstr, bool group_with_next_op, LLTextSegmentPtr segment);
S32 remove(S32 pos, S32 length, bool group_with_next_op);