TextView: Update nav shortcuts again

Make Cmd+Left and Cmd+Right work the same as Option+Left and
Option+Right, that is, they do word-wise navigation.

Make Option+Up go to beginning of paragraph and Option+Down go to end
of paragraph like Cmd+Left and Cmd+Right used to.

Unfortunately option shortcuts are currently eaten by S&T until #9431
gets fixed.
This commit is contained in:
John Scipione
2014-01-31 18:30:07 -05:00
parent 712bf7552d
commit 0875173246
2 changed files with 95 additions and 48 deletions
+10 -8
View File
@@ -453,15 +453,17 @@ private:
LayoutData* fLayoutData; LayoutData* fLayoutData;
int32 fLastClickOffset; int32 fLastClickOffset;
bool fInstalledNavigateLinewiseShortcuts; bool fInstalledNavigateCommandWordwiseShortcuts;
bool fInstalledNavigateWordwiseShortcuts; bool fInstalledNavigateOptionWordwiseShortcuts;
bool fInstalledNavigateDocwiseShortcuts; bool fInstalledNavigateOptionLinewiseShortcuts;
bool fInstalledNavigateToTopOrBottomShortcuts; bool fInstalledNavigateCommandDocwiseShortcuts;
bool fInstalledNavigateHomeEndDocwiseShortcuts;
bool fInstalledSelectLinewiseShortcuts; bool fInstalledSelectCommandWordwiseShortcuts;
bool fInstalledSelectWordwiseShortcuts; bool fInstalledSelectOptionWordwiseShortcuts;
bool fInstalledSelectDocwiseShortcuts; bool fInstalledSelectOptionLinewiseShortcuts;
bool fInstalledSelectToTopOrBottomShortcuts; bool fInstalledSelectCommandDocwiseShortcuts;
bool fInstalledSelectHomeEndDocwiseShortcuts;
uint32 _reserved[6]; uint32 _reserved[6];
}; };
+85 -40
View File
@@ -3108,15 +3108,17 @@ BTextView::_InitObject(BRect textRect, const BFont* initialFont,
fLines = new LineBuffer; fLines = new LineBuffer;
fStyles = new StyleBuffer(&font, initialColor); fStyles = new StyleBuffer(&font, initialColor);
fInstalledNavigateLinewiseShortcuts = false; fInstalledNavigateCommandWordwiseShortcuts = false;
fInstalledNavigateWordwiseShortcuts = false; fInstalledNavigateOptionWordwiseShortcuts = false;
fInstalledNavigateDocwiseShortcuts = false; fInstalledNavigateOptionLinewiseShortcuts = false;
fInstalledNavigateToTopOrBottomShortcuts = false; fInstalledNavigateCommandDocwiseShortcuts = false;
fInstalledNavigateHomeEndDocwiseShortcuts = false;
fInstalledSelectLinewiseShortcuts = false; fInstalledSelectCommandWordwiseShortcuts = false;
fInstalledSelectWordwiseShortcuts = false; fInstalledSelectOptionWordwiseShortcuts = false;
fInstalledSelectDocwiseShortcuts = false; fInstalledSelectOptionLinewiseShortcuts = false;
fInstalledSelectToTopOrBottomShortcuts = false; fInstalledSelectCommandDocwiseShortcuts = false;
fInstalledSelectHomeEndDocwiseShortcuts = false;
// We put these here instead of in the constructor initializer list // We put these here instead of in the constructor initializer list
// to have less code duplication, and a single place where to do changes // to have less code duplication, and a single place where to do changes
@@ -3229,9 +3231,7 @@ BTextView::_HandleArrowKey(uint32 arrowKey, int32 modifiers)
else if (fSelStart != fSelEnd && !shiftKeyDown) else if (fSelStart != fSelEnd && !shiftKeyDown)
fCaretOffset = fSelStart; fCaretOffset = fSelStart;
else { else {
if (commandKeyDown && !optionKeyDown && !controlKeyDown) if ((commandKeyDown || optionKeyDown) && !controlKeyDown)
fCaretOffset = _PreviousLineStart(fCaretOffset);
else if (optionKeyDown && !commandKeyDown && !controlKeyDown)
fCaretOffset = _PreviousWordStart(fCaretOffset - 1); fCaretOffset = _PreviousWordStart(fCaretOffset - 1);
else else
fCaretOffset = _PreviousInitialByte(fCaretOffset); fCaretOffset = _PreviousInitialByte(fCaretOffset);
@@ -3258,9 +3258,7 @@ BTextView::_HandleArrowKey(uint32 arrowKey, int32 modifiers)
else if (fSelStart != fSelEnd && !shiftKeyDown) else if (fSelStart != fSelEnd && !shiftKeyDown)
fCaretOffset = fSelEnd; fCaretOffset = fSelEnd;
else { else {
if (commandKeyDown && !controlKeyDown && !optionKeyDown) if ((commandKeyDown || optionKeyDown) && !controlKeyDown)
fCaretOffset = _NextLineEnd(fCaretOffset);
else if (optionKeyDown && !controlKeyDown && !commandKeyDown)
fCaretOffset = _NextWordEnd(fCaretOffset); fCaretOffset = _NextWordEnd(fCaretOffset);
else else
fCaretOffset = _NextInitialByte(fCaretOffset); fCaretOffset = _NextInitialByte(fCaretOffset);
@@ -3288,7 +3286,9 @@ BTextView::_HandleArrowKey(uint32 arrowKey, int32 modifiers)
else if (fSelStart != fSelEnd && !shiftKeyDown) else if (fSelStart != fSelEnd && !shiftKeyDown)
fCaretOffset = fSelStart; fCaretOffset = fSelStart;
else { else {
if (commandKeyDown && !controlKeyDown && !optionKeyDown) { if (optionKeyDown && !commandKeyDown && !controlKeyDown)
fCaretOffset = _PreviousLineStart(fCaretOffset);
else if (commandKeyDown && !optionKeyDown && !controlKeyDown) {
_ScrollTo(0, 0); _ScrollTo(0, 0);
fCaretOffset = 0; fCaretOffset = 0;
} else { } else {
@@ -3330,7 +3330,9 @@ BTextView::_HandleArrowKey(uint32 arrowKey, int32 modifiers)
else if (fSelStart != fSelEnd && !shiftKeyDown) else if (fSelStart != fSelEnd && !shiftKeyDown)
fCaretOffset = fSelEnd; fCaretOffset = fSelEnd;
else { else {
if (commandKeyDown && !optionKeyDown && !controlKeyDown) { if (optionKeyDown && !commandKeyDown && !controlKeyDown)
fCaretOffset = _NextLineEnd(fCaretOffset);
else if (commandKeyDown && !optionKeyDown && !controlKeyDown) {
_ScrollTo(0, fTextRect.bottom + fLayoutData->bottomInset); _ScrollTo(0, fTextRect.bottom + fLayoutData->bottomInset);
fCaretOffset = fText->Length(); fCaretOffset = fText->Length();
} else { } else {
@@ -4996,7 +4998,7 @@ BTextView::_Activate()
message->AddInt32("modifiers", B_COMMAND_KEY); message->AddInt32("modifiers", B_COMMAND_KEY);
Window()->AddShortcut(B_RIGHT_ARROW, B_COMMAND_KEY, message, this); Window()->AddShortcut(B_RIGHT_ARROW, B_COMMAND_KEY, message, this);
fInstalledNavigateLinewiseShortcuts = true; fInstalledNavigateCommandWordwiseShortcuts = true;
} }
if (!Window()->HasShortcut(B_LEFT_ARROW, B_COMMAND_KEY | B_SHIFT_KEY) if (!Window()->HasShortcut(B_LEFT_ARROW, B_COMMAND_KEY | B_SHIFT_KEY)
&& !Window()->HasShortcut(B_RIGHT_ARROW, && !Window()->HasShortcut(B_RIGHT_ARROW,
@@ -5013,7 +5015,7 @@ BTextView::_Activate()
Window()->AddShortcut(B_RIGHT_ARROW, B_COMMAND_KEY | B_SHIFT_KEY, Window()->AddShortcut(B_RIGHT_ARROW, B_COMMAND_KEY | B_SHIFT_KEY,
message, this); message, this);
fInstalledSelectLinewiseShortcuts = true; fInstalledSelectCommandWordwiseShortcuts = true;
} }
if (!Window()->HasShortcut(B_LEFT_ARROW, B_OPTION_KEY) if (!Window()->HasShortcut(B_LEFT_ARROW, B_OPTION_KEY)
@@ -5028,7 +5030,7 @@ BTextView::_Activate()
message->AddInt32("modifiers", B_OPTION_KEY); message->AddInt32("modifiers", B_OPTION_KEY);
Window()->AddShortcut(B_RIGHT_ARROW, B_OPTION_KEY, message, this); Window()->AddShortcut(B_RIGHT_ARROW, B_OPTION_KEY, message, this);
fInstalledNavigateWordwiseShortcuts = true; fInstalledNavigateOptionWordwiseShortcuts = true;
} }
if (!Window()->HasShortcut(B_LEFT_ARROW, B_OPTION_KEY | B_SHIFT_KEY) if (!Window()->HasShortcut(B_LEFT_ARROW, B_OPTION_KEY | B_SHIFT_KEY)
&& !Window()->HasShortcut(B_RIGHT_ARROW, && !Window()->HasShortcut(B_RIGHT_ARROW,
@@ -5045,7 +5047,39 @@ BTextView::_Activate()
Window()->AddShortcut(B_RIGHT_ARROW, B_OPTION_KEY | B_SHIFT_KEY, Window()->AddShortcut(B_RIGHT_ARROW, B_OPTION_KEY | B_SHIFT_KEY,
message, this); message, this);
fInstalledSelectWordwiseShortcuts = true; fInstalledSelectOptionWordwiseShortcuts = true;
}
if (!Window()->HasShortcut(B_UP_ARROW, B_OPTION_KEY)
&& !Window()->HasShortcut(B_DOWN_ARROW, B_OPTION_KEY)) {
message = new BMessage(kMsgNavigateArrow);
message->AddInt32("key", B_UP_ARROW);
message->AddInt32("modifiers", B_OPTION_KEY);
Window()->AddShortcut(B_UP_ARROW, B_OPTION_KEY, message, this);
message = new BMessage(kMsgNavigateArrow);
message->AddInt32("key", B_DOWN_ARROW);
message->AddInt32("modifiers", B_OPTION_KEY);
Window()->AddShortcut(B_DOWN_ARROW, B_OPTION_KEY, message, this);
fInstalledNavigateOptionLinewiseShortcuts = true;
}
if (!Window()->HasShortcut(B_UP_ARROW, B_OPTION_KEY | B_SHIFT_KEY)
&& !Window()->HasShortcut(B_DOWN_ARROW,
B_OPTION_KEY | B_SHIFT_KEY)) {
message = new BMessage(kMsgNavigateArrow);
message->AddInt32("key", B_UP_ARROW);
message->AddInt32("modifiers", B_OPTION_KEY | B_SHIFT_KEY);
Window()->AddShortcut(B_UP_ARROW, B_OPTION_KEY | B_SHIFT_KEY,
message, this);
message = new BMessage(kMsgNavigateArrow);
message->AddInt32("key", B_DOWN_ARROW);
message->AddInt32("modifiers", B_OPTION_KEY | B_SHIFT_KEY);
Window()->AddShortcut(B_DOWN_ARROW, B_OPTION_KEY | B_SHIFT_KEY,
message, this);
fInstalledSelectOptionLinewiseShortcuts = true;
} }
if (!Window()->HasShortcut(B_UP_ARROW, B_COMMAND_KEY) if (!Window()->HasShortcut(B_UP_ARROW, B_COMMAND_KEY)
@@ -5060,7 +5094,7 @@ BTextView::_Activate()
message->AddInt32("modifiers", B_COMMAND_KEY); message->AddInt32("modifiers", B_COMMAND_KEY);
Window()->AddShortcut(B_DOWN_ARROW, B_COMMAND_KEY, message, this); Window()->AddShortcut(B_DOWN_ARROW, B_COMMAND_KEY, message, this);
fInstalledNavigateDocwiseShortcuts = true; fInstalledNavigateCommandDocwiseShortcuts = true;
} }
if (!Window()->HasShortcut(B_UP_ARROW, B_COMMAND_KEY | B_SHIFT_KEY) if (!Window()->HasShortcut(B_UP_ARROW, B_COMMAND_KEY | B_SHIFT_KEY)
&& !Window()->HasShortcut(B_DOWN_ARROW, && !Window()->HasShortcut(B_DOWN_ARROW,
@@ -5077,7 +5111,7 @@ BTextView::_Activate()
Window()->AddShortcut(B_DOWN_ARROW, B_COMMAND_KEY | B_SHIFT_KEY, Window()->AddShortcut(B_DOWN_ARROW, B_COMMAND_KEY | B_SHIFT_KEY,
message, this); message, this);
fInstalledSelectDocwiseShortcuts = true; fInstalledSelectCommandDocwiseShortcuts = true;
} }
if (!Window()->HasShortcut(B_HOME, B_COMMAND_KEY) if (!Window()->HasShortcut(B_HOME, B_COMMAND_KEY)
@@ -5092,7 +5126,7 @@ BTextView::_Activate()
message->AddInt32("modifiers", B_COMMAND_KEY); message->AddInt32("modifiers", B_COMMAND_KEY);
Window()->AddShortcut(B_END, B_COMMAND_KEY, message, this); Window()->AddShortcut(B_END, B_COMMAND_KEY, message, this);
fInstalledNavigateToTopOrBottomShortcuts = true; fInstalledNavigateHomeEndDocwiseShortcuts = true;
} }
if (!Window()->HasShortcut(B_HOME, B_COMMAND_KEY | B_SHIFT_KEY) if (!Window()->HasShortcut(B_HOME, B_COMMAND_KEY | B_SHIFT_KEY)
&& !Window()->HasShortcut(B_END, B_COMMAND_KEY | B_SHIFT_KEY)) { && !Window()->HasShortcut(B_END, B_COMMAND_KEY | B_SHIFT_KEY)) {
@@ -5108,7 +5142,7 @@ BTextView::_Activate()
Window()->AddShortcut(B_END, B_COMMAND_KEY | B_SHIFT_KEY, Window()->AddShortcut(B_END, B_COMMAND_KEY | B_SHIFT_KEY,
message, this); message, this);
fInstalledSelectToTopOrBottomShortcuts = true; fInstalledSelectHomeEndDocwiseShortcuts = true;
} }
} }
} }
@@ -5130,50 +5164,61 @@ BTextView::_Deactivate()
_HideCaret(); _HideCaret();
if (Window() != NULL) { if (Window() != NULL) {
if (fInstalledNavigateLinewiseShortcuts) { if (fInstalledNavigateCommandWordwiseShortcuts) {
Window()->RemoveShortcut(B_LEFT_ARROW, B_COMMAND_KEY); Window()->RemoveShortcut(B_LEFT_ARROW, B_COMMAND_KEY);
Window()->RemoveShortcut(B_RIGHT_ARROW, B_COMMAND_KEY); Window()->RemoveShortcut(B_RIGHT_ARROW, B_COMMAND_KEY);
fInstalledNavigateLinewiseShortcuts = false; fInstalledNavigateCommandWordwiseShortcuts = false;
} }
if (fInstalledSelectLinewiseShortcuts) { if (fInstalledSelectCommandWordwiseShortcuts) {
Window()->RemoveShortcut(B_LEFT_ARROW, B_COMMAND_KEY | B_SHIFT_KEY); Window()->RemoveShortcut(B_LEFT_ARROW, B_COMMAND_KEY | B_SHIFT_KEY);
Window()->RemoveShortcut(B_RIGHT_ARROW, Window()->RemoveShortcut(B_RIGHT_ARROW,
B_COMMAND_KEY | B_SHIFT_KEY); B_COMMAND_KEY | B_SHIFT_KEY);
fInstalledSelectLinewiseShortcuts = false; fInstalledSelectCommandWordwiseShortcuts = false;
} }
if (fInstalledNavigateWordwiseShortcuts) { if (fInstalledNavigateOptionWordwiseShortcuts) {
Window()->RemoveShortcut(B_LEFT_ARROW, B_OPTION_KEY); Window()->RemoveShortcut(B_LEFT_ARROW, B_OPTION_KEY);
Window()->RemoveShortcut(B_RIGHT_ARROW, B_OPTION_KEY); Window()->RemoveShortcut(B_RIGHT_ARROW, B_OPTION_KEY);
fInstalledNavigateWordwiseShortcuts = false; fInstalledNavigateOptionWordwiseShortcuts = false;
} }
if (fInstalledSelectWordwiseShortcuts) { if (fInstalledSelectOptionWordwiseShortcuts) {
Window()->RemoveShortcut(B_LEFT_ARROW, B_OPTION_KEY | B_SHIFT_KEY); Window()->RemoveShortcut(B_LEFT_ARROW, B_OPTION_KEY | B_SHIFT_KEY);
Window()->RemoveShortcut(B_RIGHT_ARROW, B_OPTION_KEY | B_SHIFT_KEY); Window()->RemoveShortcut(B_RIGHT_ARROW, B_OPTION_KEY | B_SHIFT_KEY);
fInstalledSelectWordwiseShortcuts = false; fInstalledSelectOptionWordwiseShortcuts = false;
} }
if (fInstalledNavigateDocwiseShortcuts) { if (fInstalledNavigateOptionLinewiseShortcuts) {
Window()->RemoveShortcut(B_UP_ARROW, B_OPTION_KEY);
Window()->RemoveShortcut(B_DOWN_ARROW, B_OPTION_KEY);
fInstalledNavigateOptionLinewiseShortcuts = false;
}
if (fInstalledSelectOptionLinewiseShortcuts) {
Window()->RemoveShortcut(B_UP_ARROW, B_OPTION_KEY | B_SHIFT_KEY);
Window()->RemoveShortcut(B_DOWN_ARROW, B_OPTION_KEY | B_SHIFT_KEY);
fInstalledSelectOptionLinewiseShortcuts = false;
}
if (fInstalledNavigateCommandDocwiseShortcuts) {
Window()->RemoveShortcut(B_UP_ARROW, B_COMMAND_KEY); Window()->RemoveShortcut(B_UP_ARROW, B_COMMAND_KEY);
Window()->RemoveShortcut(B_DOWN_ARROW, B_COMMAND_KEY); Window()->RemoveShortcut(B_DOWN_ARROW, B_COMMAND_KEY);
fInstalledNavigateDocwiseShortcuts = false; fInstalledNavigateCommandDocwiseShortcuts = false;
} }
if (fInstalledSelectDocwiseShortcuts) { if (fInstalledSelectCommandDocwiseShortcuts) {
Window()->RemoveShortcut(B_UP_ARROW, B_COMMAND_KEY | B_SHIFT_KEY); Window()->RemoveShortcut(B_UP_ARROW, B_COMMAND_KEY | B_SHIFT_KEY);
Window()->RemoveShortcut(B_DOWN_ARROW, Window()->RemoveShortcut(B_DOWN_ARROW,
B_COMMAND_KEY | B_SHIFT_KEY); B_COMMAND_KEY | B_SHIFT_KEY);
fInstalledSelectDocwiseShortcuts = false; fInstalledSelectCommandDocwiseShortcuts = false;
} }
if (fInstalledNavigateToTopOrBottomShortcuts) { if (fInstalledNavigateHomeEndDocwiseShortcuts) {
Window()->RemoveShortcut(B_HOME, B_COMMAND_KEY); Window()->RemoveShortcut(B_HOME, B_COMMAND_KEY);
Window()->RemoveShortcut(B_END, B_COMMAND_KEY); Window()->RemoveShortcut(B_END, B_COMMAND_KEY);
fInstalledNavigateToTopOrBottomShortcuts = false; fInstalledNavigateHomeEndDocwiseShortcuts = false;
} }
if (fInstalledSelectToTopOrBottomShortcuts) { if (fInstalledSelectHomeEndDocwiseShortcuts) {
Window()->RemoveShortcut(B_HOME, B_COMMAND_KEY | B_SHIFT_KEY); Window()->RemoveShortcut(B_HOME, B_COMMAND_KEY | B_SHIFT_KEY);
Window()->RemoveShortcut(B_END, B_COMMAND_KEY | B_SHIFT_KEY); Window()->RemoveShortcut(B_END, B_COMMAND_KEY | B_SHIFT_KEY);
fInstalledSelectToTopOrBottomShortcuts = false; fInstalledSelectHomeEndDocwiseShortcuts = false;
} }
} }
} }