Ctrl-Backspace and Ctrl-Delete for removing whole words when editing text
parent
16bafd9080
commit
caa86284e1
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue