15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/options/chromeos/keyboard_handler.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ash/new_window_delegate.h"
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ash/shell.h"
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/bind.h"
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/bind_helpers.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/generated_resources.h"
14b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "chromeos/chromeos_switches.h"
15a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "chromeos/ime/ime_keyboard.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const struct ModifierKeysSelectItem {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int message_id;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chromeos::input_method::ModifierKey value;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} kModifierKeysSelectItems[] = {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { IDS_OPTIONS_SETTINGS_LANGUAGES_KEY_SEARCH,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chromeos::input_method::kSearchKey },
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { IDS_OPTIONS_SETTINGS_LANGUAGES_KEY_LEFT_CTRL,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chromeos::input_method::kControlKey },
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { IDS_OPTIONS_SETTINGS_LANGUAGES_KEY_LEFT_ALT,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chromeos::input_method::kAltKey },
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { IDS_OPTIONS_SETTINGS_LANGUAGES_KEY_VOID,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chromeos::input_method::kVoidKey },
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { IDS_OPTIONS_SETTINGS_LANGUAGES_KEY_CAPS_LOCK,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chromeos::input_method::kCapsLockKey },
34d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  { IDS_OPTIONS_SETTINGS_LANGUAGES_KEY_ESCAPE,
35d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    chromeos::input_method::kEscapeKey },
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kDataValuesNames[] = {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "remapSearchKeyToValue",
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "remapControlKeyToValue",
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "remapAltKeyToValue",
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "remapCapsLockKeyToValue",
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "remapDiamondKeyToValue",
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace options {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)KeyboardHandler::KeyboardHandler() {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)KeyboardHandler::~KeyboardHandler() {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void KeyboardHandler::GetLocalizedValues(
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue* localized_strings) {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(localized_strings);
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RegisterTitle(localized_strings, "keyboardOverlay",
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                IDS_OPTIONS_KEYBOARD_OVERLAY_TITLE);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("remapSearchKeyToContent",
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          IDS_OPTIONS_SETTINGS_LANGUAGES_KEY_SEARCH_LABEL));
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("remapControlKeyToContent",
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          IDS_OPTIONS_SETTINGS_LANGUAGES_KEY_LEFT_CTRL_LABEL));
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("remapAltKeyToContent",
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          IDS_OPTIONS_SETTINGS_LANGUAGES_KEY_LEFT_ALT_LABEL));
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("remapCapsLockKeyToContent",
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          IDS_OPTIONS_SETTINGS_LANGUAGES_KEY_CAPS_LOCK_LABEL));
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  localized_strings->SetString("remapDiamondKeyToContent",
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      l10n_util::GetStringUTF16(
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          IDS_OPTIONS_SETTINGS_LANGUAGES_KEY_DIAMOND_KEY_LABEL));
771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  localized_strings->SetString("sendFunctionKeys",
781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      l10n_util::GetStringUTF16(
791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          IDS_OPTIONS_SETTINGS_LANGUAGES_SEND_FUNCTION_KEYS));
801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  localized_strings->SetString("sendFunctionKeysDescription",
811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      l10n_util::GetStringUTF16(
821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          IDS_OPTIONS_SETTINGS_LANGUAGES_SEND_FUNCTION_KEYS_DESCRIPTION));
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  localized_strings->SetString("enableAutoRepeat",
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      l10n_util::GetStringUTF16(
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          IDS_OPTIONS_SETTINGS_LANGUAGES_AUTO_REPEAT_ENABLE));
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  localized_strings->SetString("autoRepeatDelay",
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      l10n_util::GetStringUTF16(
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          IDS_OPTIONS_SETTINGS_LANGUAGES_AUTO_REPEAT_DELAY));
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  localized_strings->SetString("autoRepeatDelayLong",
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      l10n_util::GetStringUTF16(
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          IDS_OPTIONS_SETTINGS_LANGUAGES_AUTO_REPEAT_DELAY_LONG));
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  localized_strings->SetString("autoRepeatDelayShort",
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      l10n_util::GetStringUTF16(
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          IDS_OPTIONS_SETTINGS_LANGUAGES_AUTO_REPEAT_DELAY_SHORT));
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  localized_strings->SetString("autoRepeatRate",
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      l10n_util::GetStringUTF16(
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          IDS_OPTIONS_SETTINGS_LANGUAGES_AUTO_REPEAT_RATE));
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  localized_strings->SetString("autoRepeatRateSlow",
995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      l10n_util::GetStringUTF16(
1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          IDS_OPTIONS_SETTINGS_LANGUAGES_AUTO_REPEAT_RATE_SLOW));
1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  localized_strings->SetString("autoRepeatRateFast",
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      l10n_util::GetStringUTF16(
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          IDS_OPTIONS_SETTINGS_LANGUAGES_AUTO_REPEAT_RATE_FAST));
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  localized_strings->SetString("changeLanguageAndInputSettings",
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      l10n_util::GetStringUTF16(
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          IDS_OPTIONS_SETTINGS_CHANGE_LANGUAGE_AND_INPUT_SETTINGS));
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  localized_strings->SetString("showKeyboardShortcuts",
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      l10n_util::GetStringUTF16(
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          IDS_OPTIONS_SETTINGS_SHOW_KEYBOARD_SHORTCUTS));
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < arraysize(kDataValuesNames); ++i) {
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::ListValue* list_value = new base::ListValue();
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t j = 0; j < arraysize(kModifierKeysSelectItems); ++j) {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const input_method::ModifierKey value =
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kModifierKeysSelectItems[j].value;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const int message_id = kModifierKeysSelectItems[j].message_id;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Only the seach key can be remapped to the caps lock key.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (kDataValuesNames[i] != std::string("remapSearchKeyToValue") &&
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kDataValuesNames[i] != std::string("remapCapsLockKeyToValue") &&
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          value == input_method::kCapsLockKey) {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        continue;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::ListValue* option = new base::ListValue();
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      option->Append(new base::FundamentalValue(value));
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      option->Append(new base::StringValue(l10n_util::GetStringUTF16(
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          message_id)));
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      list_value->Append(option);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    localized_strings->Set(kDataValuesNames[i], list_value);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void KeyboardHandler::InitializePage() {
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool chromeos_keyboard = CommandLine::ForCurrentProcess()->HasSwitch(
135b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      chromeos::switches::kHasChromeOSKeyboard);
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FundamentalValue show_caps_lock_options(!chromeos_keyboard);
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool has_diamond_key = CommandLine::ForCurrentProcess()->HasSwitch(
139b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      chromeos::switches::kHasChromeOSDiamondKey);
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FundamentalValue show_diamond_key_options(has_diamond_key);
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_ui()->CallJavascriptFunction(
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "options.KeyboardOverlay.showCapsLockOptions",
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      show_caps_lock_options);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction(
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "options.KeyboardOverlay.showDiamondKeyOptions",
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      show_diamond_key_options);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void KeyboardHandler::RegisterMessages() {
151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Callback to show keyboard overlay.
152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      "showKeyboardShortcuts",
154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::Bind(&KeyboardHandler::HandleShowKeyboardShortcuts,
155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 base::Unretained(this)));
156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void KeyboardHandler::HandleShowKeyboardShortcuts(const base::ListValue* args) {
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(USE_ATHENA)
1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Athena doesn't have ash::Shell and its new_window_delegate so keyboard
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // shortcut overlays are not supported.
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // TODO(mukai): re-enable this.
163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ash::Shell::GetInstance()->new_window_delegate()->ShowKeyboardOverlay();
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace options
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
169