1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 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)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/renderer_context_menu/spellchecker_submenu_observer.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/chrome_command_ids.h"
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/renderer_context_menu/render_view_context_menu.h"
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/renderer_context_menu/spelling_bubble_model.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/spellchecker/spellcheck_platform_mac.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/spellcheck_messages.h"
1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/grit/generated_resources.h"
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/user_prefs/user_prefs.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_widget_host_view.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/models/simple_menu_model.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace {
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)PrefService* GetPrefs(content::BrowserContext* context) {
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return user_prefs::UserPrefs::Get(context);
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SpellCheckerSubMenuObserver::SpellCheckerSubMenuObserver(
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewContextMenuProxy* proxy,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::SimpleMenuModel::Delegate* delegate,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int group)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : proxy_(proxy),
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      submenu_model_(delegate) {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(proxy_);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SpellCheckerSubMenuObserver::~SpellCheckerSubMenuObserver() {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SpellCheckerSubMenuObserver::InitMenu(
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::ContextMenuParams& params) {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add an item that toggles the spelling panel.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  submenu_model_.AddCheckItem(
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDC_SPELLPANEL_TOGGLE,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          spellcheck_mac::SpellingPanelVisible() ?
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              IDS_CONTENT_CONTEXT_HIDE_SPELLING_PANEL :
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              IDS_CONTENT_CONTEXT_SHOW_SPELLING_PANEL));
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  submenu_model_.AddSeparator(ui::NORMAL_SEPARATOR);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a 'Check Spelling While Typing' item in the sub menu.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  submenu_model_.AddCheckItem(
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDC_CHECK_SPELLING_WHILE_TYPING,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          IDS_CONTENT_CONTEXT_CHECK_SPELLING_WHILE_TYPING));
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy_->AddSubMenu(
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDC_SPELLCHECK_MENU,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_SPELLCHECK_MENU),
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &submenu_model_);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SpellCheckerSubMenuObserver::IsCommandIdSupported(int command_id) {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (command_id) {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_LANGUAGE_SETTINGS:
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Return false so RenderViewContextMenu can handle this item because it
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // is hard for this class to handle it.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CHECK_SPELLING_WHILE_TYPING:
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_SPELLPANEL_TOGGLE:
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_SPELLCHECK_MENU:
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_SPELLING_TOGGLE:
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SpellCheckerSubMenuObserver::IsCommandIdChecked(int command_id) {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(IsCommandIdSupported(command_id));
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check box for 'Check Spelling while typing'.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (command_id == IDC_CHECK_SPELLING_WHILE_TYPING) {
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    content::BrowserContext* context = proxy_->GetBrowserContext();
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    DCHECK(context);
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return GetPrefs(context)->GetBoolean(prefs::kEnableContinuousSpellcheck);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SpellCheckerSubMenuObserver::IsCommandIdEnabled(int command_id) {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(IsCommandIdSupported(command_id));
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (command_id) {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CHECK_SPELLING_WHILE_TYPING:
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_SPELLPANEL_TOGGLE:
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_SPELLCHECK_MENU:
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_SPELLING_TOGGLE:
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SpellCheckerSubMenuObserver::ExecuteCommand(int command_id) {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(IsCommandIdSupported(command_id));
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderViewHost* rvh = proxy_->GetRenderViewHost();
1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  content::BrowserContext* context = proxy_->GetBrowserContext();
1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DCHECK(context);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (command_id) {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CHECK_SPELLING_WHILE_TYPING:
1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      GetPrefs(context)->SetBoolean(
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          prefs::kEnableContinuousSpellcheck,
1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          !GetPrefs(context)->GetBoolean(prefs::kEnableContinuousSpellcheck));
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_SPELLPANEL_TOGGLE:
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rvh->Send(new SpellCheckMsg_ToggleSpellPanel(
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          rvh->GetRoutingID(), spellcheck_mac::SpellingPanelVisible()));
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
133