| Index: ios/chrome/browser/ui/key_commands_provider.mm
|
| diff --git a/ios/chrome/browser/ui/key_commands_provider.mm b/ios/chrome/browser/ui/key_commands_provider.mm
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..c254dbd0f14954efd3285c54a84ff9f222cc578b
|
| --- /dev/null
|
| +++ b/ios/chrome/browser/ui/key_commands_provider.mm
|
| @@ -0,0 +1,305 @@
|
| +// Copyright 2016 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#import "ios/chrome/browser/ui/key_commands_provider.h"
|
| +
|
| +#import "base/ios/weak_nsobject.h"
|
| +#include "base/logging.h"
|
| +#include "components/strings/grit/components_strings.h"
|
| +#import "ios/chrome/browser/ui/commands/generic_chrome_command.h"
|
| +#include "ios/chrome/browser/ui/commands/ios_command_ids.h"
|
| +#import "ios/chrome/browser/ui/keyboard/UIKeyCommand+Chrome.h"
|
| +#include "ios/chrome/browser/ui/rtl_geometry.h"
|
| +#include "ios/chrome/grit/ios_strings.h"
|
| +#include "ui/base/l10n/l10n_util_mac.h"
|
| +
|
| +@implementation KeyCommandsProvider
|
| +
|
| +- (NSArray*)keyCommandsForConsumer:(id<KeyCommandsPlumbing>)consumer
|
| + editingText:(BOOL)editingText {
|
| + base::WeakNSProtocol<id<KeyCommandsPlumbing>> weakConsumer(consumer);
|
| +
|
| + // Block to execute a command from the |tag|.
|
| + void (^execute)(NSInteger) = [[^(NSInteger tag) {
|
| + [weakConsumer
|
| + chromeExecuteCommand:[GenericChromeCommand commandWithTag:tag]];
|
| + } copy] autorelease];
|
| +
|
| + // Block to have the tab model open the tab at |index|, if there is one.
|
| + void (^focusTab)(NSUInteger) = [[^(NSUInteger index) {
|
| + [weakConsumer focusTabAtIndex:index];
|
| + } copy] autorelease];
|
| +
|
| + const BOOL hasTabs = [consumer tabsCount] > 0;
|
| +
|
| + const BOOL useRTLLayout = UseRTLLayout();
|
| + const NSInteger browseLeft = useRTLLayout ? IDC_FORWARD : IDC_BACK;
|
| + const NSInteger browseRight = useRTLLayout ? IDC_BACK : IDC_FORWARD;
|
| + const int browseLeftDescriptionID = useRTLLayout
|
| + ? IDS_IOS_KEYBOARD_HISTORY_FORWARD
|
| + : IDS_IOS_KEYBOARD_HISTORY_BACK;
|
| + const int browseRightDescriptionID = useRTLLayout
|
| + ? IDS_IOS_KEYBOARD_HISTORY_BACK
|
| + : IDS_IOS_KEYBOARD_HISTORY_FORWARD;
|
| +
|
| + // Initialize the array of commands with an estimated capacity.
|
| + NSMutableArray* keyCommands = [NSMutableArray arrayWithCapacity:32];
|
| +
|
| + // List the commands that always appear in the HUD. They appear in the HUD
|
| + // since they have titles.
|
| + [keyCommands addObjectsFromArray:@[
|
| + [UIKeyCommand cr_keyCommandWithInput:@"t"
|
| + modifierFlags:UIKeyModifierCommand
|
| + title:l10n_util::GetNSStringWithFixup(
|
| + IDS_IOS_TOOLS_MENU_NEW_TAB)
|
| + action:^{
|
| + if ([weakConsumer isOffTheRecord]) {
|
| + execute(IDC_NEW_INCOGNITO_TAB);
|
| + } else {
|
| + execute(IDC_NEW_TAB);
|
| + }
|
| + }],
|
| + [UIKeyCommand
|
| + cr_keyCommandWithInput:@"n"
|
| + modifierFlags:UIKeyModifierCommand | UIKeyModifierShift
|
| + title:l10n_util::GetNSStringWithFixup(
|
| + IDS_IOS_TOOLS_MENU_NEW_INCOGNITO_TAB)
|
| + action:^{
|
| + execute(IDC_NEW_INCOGNITO_TAB);
|
| + }],
|
| + [UIKeyCommand
|
| + cr_keyCommandWithInput:@"t"
|
| + modifierFlags:UIKeyModifierCommand | UIKeyModifierShift
|
| + title:l10n_util::GetNSStringWithFixup(
|
| + IDS_IOS_KEYBOARD_REOPEN_CLOSED_TAB)
|
| + action:^{
|
| + [weakConsumer reopenClosedTab];
|
| + }],
|
| + ]];
|
| +
|
| + // List the commands that only appear when there is at least a tab. When they
|
| + // appear, they are in the HUD since they have titles.
|
| + if (hasTabs) {
|
| + [keyCommands addObjectsFromArray:@[
|
| + [UIKeyCommand cr_keyCommandWithInput:@"l"
|
| + modifierFlags:UIKeyModifierCommand
|
| + title:l10n_util::GetNSStringWithFixup(
|
| + IDS_IOS_KEYBOARD_OPEN_LOCATION)
|
| + action:^{
|
| + [weakConsumer focusOmnibox];
|
| + }],
|
| + [UIKeyCommand cr_keyCommandWithInput:@"w"
|
| + modifierFlags:UIKeyModifierCommand
|
| + title:l10n_util::GetNSStringWithFixup(
|
| + IDS_IOS_TOOLS_MENU_CLOSE_TAB)
|
| + action:^{
|
| + execute(IDC_CLOSE_TAB);
|
| + }],
|
| + [UIKeyCommand
|
| + cr_keyCommandWithInput:@"d"
|
| + modifierFlags:UIKeyModifierCommand
|
| + title:l10n_util::GetNSStringWithFixup(
|
| + IDS_IOS_KEYBOARD_BOOKMARK_THIS_PAGE)
|
| + action:^{
|
| + execute(IDC_BOOKMARK_PAGE);
|
| + }],
|
| + [UIKeyCommand cr_keyCommandWithInput:@"f"
|
| + modifierFlags:UIKeyModifierCommand
|
| + title:l10n_util::GetNSStringWithFixup(
|
| + IDS_IOS_TOOLS_MENU_FIND_IN_PAGE)
|
| + action:^{
|
| + execute(IDC_FIND);
|
| + }],
|
| + [UIKeyCommand cr_keyCommandWithInput:@"g"
|
| + modifierFlags:UIKeyModifierCommand
|
| + title:nil
|
| + action:^{
|
| + execute(IDC_FIND_NEXT);
|
| + }],
|
| + [UIKeyCommand
|
| + cr_keyCommandWithInput:@"g"
|
| + modifierFlags:UIKeyModifierCommand | UIKeyModifierShift
|
| + title:nil
|
| + action:^{
|
| + execute(IDC_FIND_PREVIOUS);
|
| + }],
|
| + [UIKeyCommand cr_keyCommandWithInput:@"r"
|
| + modifierFlags:UIKeyModifierCommand
|
| + title:l10n_util::GetNSStringWithFixup(
|
| + IDS_IOS_ACCNAME_RELOAD)
|
| + action:^{
|
| + execute(IDC_RELOAD);
|
| + }],
|
| + ]];
|
| +
|
| + // Since cmd+left and cmd+right are valid system shortcuts when editing
|
| + // text, don't register those if text is being edited.
|
| + if (!editingText) {
|
| + [keyCommands addObjectsFromArray:@[
|
| + [UIKeyCommand cr_keyCommandWithInput:UIKeyInputLeftArrow
|
| + modifierFlags:UIKeyModifierCommand
|
| + title:l10n_util::GetNSStringWithFixup(
|
| + browseLeftDescriptionID)
|
| + action:^{
|
| + execute(browseLeft);
|
| + }],
|
| + [UIKeyCommand cr_keyCommandWithInput:UIKeyInputRightArrow
|
| + modifierFlags:UIKeyModifierCommand
|
| + title:l10n_util::GetNSStringWithFixup(
|
| + browseRightDescriptionID)
|
| + action:^{
|
| + execute(browseRight);
|
| + }],
|
| + ]];
|
| + }
|
| +
|
| + NSString* voiceSearchTitle = l10n_util::GetNSStringWithFixup(
|
| + IDS_IOS_VOICE_SEARCH_KEYBOARD_DISCOVERY_TITLE);
|
| + [keyCommands addObjectsFromArray:@[
|
| + [UIKeyCommand cr_keyCommandWithInput:@"y"
|
| + modifierFlags:UIKeyModifierCommand
|
| + title:l10n_util::GetNSStringWithFixup(
|
| + IDS_HISTORY_SHOW_HISTORY)
|
| + action:^{
|
| + execute(IDC_SHOW_HISTORY);
|
| + }],
|
| + [UIKeyCommand
|
| + cr_keyCommandWithInput:@"."
|
| + modifierFlags:UIKeyModifierCommand | UIKeyModifierShift
|
| + title:voiceSearchTitle
|
| + action:^{
|
| + execute(IDC_VOICE_SEARCH);
|
| + }],
|
| + ]];
|
| + }
|
| +
|
| + // List the commands that don't appear in the HUD but are always present.
|
| + [keyCommands addObjectsFromArray:@[
|
| + [UIKeyCommand cr_keyCommandWithInput:UIKeyInputEscape
|
| + modifierFlags:Cr_UIKeyModifierNone
|
| + title:nil
|
| + action:^{
|
| + execute(IDC_CLOSE_MODALS);
|
| + }],
|
| + [UIKeyCommand cr_keyCommandWithInput:@"n"
|
| + modifierFlags:UIKeyModifierCommand
|
| + title:nil
|
| + action:^{
|
| + if ([weakConsumer isOffTheRecord]) {
|
| + execute(IDC_NEW_INCOGNITO_TAB);
|
| + } else {
|
| + execute(IDC_NEW_TAB);
|
| + }
|
| + }],
|
| + [UIKeyCommand cr_keyCommandWithInput:@","
|
| + modifierFlags:UIKeyModifierCommand
|
| + title:nil
|
| + action:^{
|
| + execute(IDC_OPTIONS);
|
| + }],
|
| + ]];
|
| +
|
| + // List the commands that don't appear in the HUD and only appear when there
|
| + // is at least a tab.
|
| + if (hasTabs) {
|
| + [keyCommands addObjectsFromArray:@[
|
| + [UIKeyCommand cr_keyCommandWithInput:@"["
|
| + modifierFlags:UIKeyModifierCommand
|
| + title:nil
|
| + action:^{
|
| + execute(browseLeft);
|
| + }],
|
| + [UIKeyCommand cr_keyCommandWithInput:@"]"
|
| + modifierFlags:UIKeyModifierCommand
|
| + title:nil
|
| + action:^{
|
| + execute(browseRight);
|
| + }],
|
| + [UIKeyCommand cr_keyCommandWithInput:@"."
|
| + modifierFlags:UIKeyModifierCommand
|
| + title:nil
|
| + action:^{
|
| + execute(IDC_STOP);
|
| + }],
|
| + [UIKeyCommand cr_keyCommandWithInput:@"?"
|
| + modifierFlags:UIKeyModifierCommand
|
| + title:nil
|
| + action:^{
|
| + execute(IDC_HELP_PAGE_VIA_MENU);
|
| + }],
|
| + [UIKeyCommand cr_keyCommandWithInput:@"1"
|
| + modifierFlags:UIKeyModifierCommand
|
| + title:nil
|
| + action:^{
|
| + focusTab(0);
|
| + }],
|
| + [UIKeyCommand cr_keyCommandWithInput:@"2"
|
| + modifierFlags:UIKeyModifierCommand
|
| + title:nil
|
| + action:^{
|
| + focusTab(1);
|
| + }],
|
| + [UIKeyCommand cr_keyCommandWithInput:@"3"
|
| + modifierFlags:UIKeyModifierCommand
|
| + title:nil
|
| + action:^{
|
| + focusTab(2);
|
| + }],
|
| + [UIKeyCommand cr_keyCommandWithInput:@"4"
|
| + modifierFlags:UIKeyModifierCommand
|
| + title:nil
|
| + action:^{
|
| + focusTab(3);
|
| + }],
|
| + [UIKeyCommand cr_keyCommandWithInput:@"5"
|
| + modifierFlags:UIKeyModifierCommand
|
| + title:nil
|
| + action:^{
|
| + focusTab(4);
|
| + }],
|
| + [UIKeyCommand cr_keyCommandWithInput:@"6"
|
| + modifierFlags:UIKeyModifierCommand
|
| + title:nil
|
| + action:^{
|
| + focusTab(5);
|
| + }],
|
| + [UIKeyCommand cr_keyCommandWithInput:@"7"
|
| + modifierFlags:UIKeyModifierCommand
|
| + title:nil
|
| + action:^{
|
| + focusTab(6);
|
| + }],
|
| + [UIKeyCommand cr_keyCommandWithInput:@"8"
|
| + modifierFlags:UIKeyModifierCommand
|
| + title:nil
|
| + action:^{
|
| + focusTab(7);
|
| + }],
|
| + [UIKeyCommand cr_keyCommandWithInput:@"9"
|
| + modifierFlags:UIKeyModifierCommand
|
| + title:nil
|
| + action:^{
|
| + focusTab([weakConsumer tabsCount] - 1);
|
| + }],
|
| + [UIKeyCommand
|
| + cr_keyCommandWithInput:UIKeyInputLeftArrow
|
| + modifierFlags:UIKeyModifierCommand | UIKeyModifierAlternate
|
| + title:nil
|
| + action:^{
|
| + [weakConsumer focusPreviousTab];
|
| + }],
|
| + [UIKeyCommand
|
| + cr_keyCommandWithInput:UIKeyInputRightArrow
|
| + modifierFlags:UIKeyModifierCommand | UIKeyModifierAlternate
|
| + title:nil
|
| + action:^{
|
| + [weakConsumer focusNextTab];
|
| + }],
|
| + ]];
|
| + }
|
| +
|
| + return keyCommands;
|
| +}
|
| +
|
| +@end
|
|
|