* introduced two new private methods, _PreviousWordStart() and _NextWordStart(),

which are now being used to implement the word-wise keyboard navigation,
  fixing #4785


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@33885 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Oliver Tappe
2009-11-04 18:49:15 +00:00
parent 3b02662f2d
commit a85a827cd0
2 changed files with 58 additions and 2 deletions
+3
View File
@@ -384,6 +384,9 @@ private:
int32 _PreviousWordBoundary(int32 offset); int32 _PreviousWordBoundary(int32 offset);
int32 _NextWordBoundary(int32 offset); int32 _NextWordBoundary(int32 offset);
int32 _PreviousWordStart(int32 offset);
int32 _NextWordStart(int32 offset);
bool _GetProperty(BMessage* specifier, int32 form, bool _GetProperty(BMessage* specifier, int32 form,
const char* property, BMessage* reply); const char* property, BMessage* reply);
bool _SetProperty(BMessage* specifier, int32 form, bool _SetProperty(BMessage* specifier, int32 form,
+55 -2
View File
@@ -3289,7 +3289,7 @@ BTextView::_HandleArrowKey(uint32 inArrowKey)
else { else {
fCaretOffset fCaretOffset
= ctrlDown = ctrlDown
? _PreviousWordBoundary(fCaretOffset - 1) ? _PreviousWordStart(fCaretOffset - 1)
: _PreviousInitialByte(fCaretOffset); : _PreviousInitialByte(fCaretOffset);
if (shiftDown && fCaretOffset != lastClickOffset) { if (shiftDown && fCaretOffset != lastClickOffset) {
if (fCaretOffset < fSelStart) { if (fCaretOffset < fSelStart) {
@@ -3315,7 +3315,7 @@ BTextView::_HandleArrowKey(uint32 inArrowKey)
else { else {
fCaretOffset fCaretOffset
= ctrlDown = ctrlDown
? _NextWordBoundary(fCaretOffset) ? _NextWordStart(fCaretOffset)
: _NextInitialByte(fCaretOffset); : _NextInitialByte(fCaretOffset);
if (shiftDown && fCaretOffset != lastClickOffset) { if (shiftDown && fCaretOffset != lastClickOffset) {
if (fCaretOffset > fSelEnd) { if (fCaretOffset > fSelEnd) {
@@ -4061,6 +4061,59 @@ BTextView::_NextWordBoundary(int32 offset)
} }
int32
BTextView::_PreviousWordStart(int32 offset)
{
if (offset <= 1)
return 0;
--offset; // need to look at previous char
if (_CharClassification(offset) == CHAR_CLASS_WHITESPACE) {
// skip whitespace
while (offset > 0) {
offset = _PreviousInitialByte(offset);
if (_CharClassification(offset) != CHAR_CLASS_WHITESPACE)
break;
}
}
while (offset > 0) {
// find preceeding whitespace char.
int32 previous = _PreviousInitialByte(offset);
if (_CharClassification(previous) == CHAR_CLASS_WHITESPACE)
break;
offset = previous;
}
return offset;
}
int32
BTextView::_NextWordStart(int32 offset)
{
int32 textLen = TextLength();
if (offset >= textLen)
return textLen;
if (_CharClassification(offset) != CHAR_CLASS_WHITESPACE) {
// skip until the next whitespace
while (offset < textLen) {
offset = _NextInitialByte(offset);
if (_CharClassification(offset) == CHAR_CLASS_WHITESPACE)
break;
}
}
while (offset < textLen) {
// find next non-white char
offset = _NextInitialByte(offset);
if (_CharClassification(offset) != CHAR_CLASS_WHITESPACE)
break;
}
return offset;
}
/*! \brief Returns the width used by the characters starting at the given /*! \brief Returns the width used by the characters starting at the given
offset with the given length, expanding all tab characters as needed. offset with the given length, expanding all tab characters as needed.
*/ */