spellchecker_submenu_observer_mac.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
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"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_widget_host_view.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/models/simple_menu_model.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SpellCheckerSubMenuObserver::SpellCheckerSubMenuObserver(
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewContextMenuProxy* proxy,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::SimpleMenuModel::Delegate* delegate,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int group)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : proxy_(proxy),
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      submenu_model_(delegate) {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(proxy_);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SpellCheckerSubMenuObserver::~SpellCheckerSubMenuObserver() {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SpellCheckerSubMenuObserver::InitMenu(
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::ContextMenuParams& params) {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add an item that toggles the spelling panel.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  submenu_model_.AddCheckItem(
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDC_SPELLPANEL_TOGGLE,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          spellcheck_mac::SpellingPanelVisible() ?
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              IDS_CONTENT_CONTEXT_HIDE_SPELLING_PANEL :
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              IDS_CONTENT_CONTEXT_SHOW_SPELLING_PANEL));
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  submenu_model_.AddSeparator(ui::NORMAL_SEPARATOR);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a 'Check Spelling While Typing' item in the sub menu.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  submenu_model_.AddCheckItem(
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDC_CHECK_SPELLING_WHILE_TYPING,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          IDS_CONTENT_CONTEXT_CHECK_SPELLING_WHILE_TYPING));
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy_->AddSubMenu(
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDC_SPELLCHECK_MENU,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_SPELLCHECK_MENU),
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &submenu_model_);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SpellCheckerSubMenuObserver::IsCommandIdSupported(int command_id) {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (command_id) {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_LANGUAGE_SETTINGS:
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Return false so RenderViewContextMenu can handle this item because it
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // is hard for this class to handle it.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CHECK_SPELLING_WHILE_TYPING:
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_SPELLPANEL_TOGGLE:
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_SPELLCHECK_MENU:
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_SPELLING_TOGGLE:
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SpellCheckerSubMenuObserver::IsCommandIdChecked(int command_id) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(IsCommandIdSupported(command_id));
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check box for 'Check Spelling while typing'.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (command_id == IDC_CHECK_SPELLING_WHILE_TYPING) {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile = proxy_->GetProfile();
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(profile);
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return profile->GetPrefs()->GetBoolean(prefs::kEnableContinuousSpellcheck);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SpellCheckerSubMenuObserver::IsCommandIdEnabled(int command_id) {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(IsCommandIdSupported(command_id));
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (command_id) {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CHECK_SPELLING_WHILE_TYPING:
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_SPELLPANEL_TOGGLE:
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_SPELLCHECK_MENU:
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_SPELLING_TOGGLE:
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SpellCheckerSubMenuObserver::ExecuteCommand(int command_id) {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(IsCommandIdSupported(command_id));
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderViewHost* rvh = proxy_->GetRenderViewHost();
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = proxy_->GetProfile();
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(profile);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (command_id) {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CHECK_SPELLING_WHILE_TYPING:
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile->GetPrefs()->SetBoolean(
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          prefs::kEnableContinuousSpellcheck,
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          !profile->GetPrefs()->GetBoolean(prefs::kEnableContinuousSpellcheck));
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_SPELLPANEL_TOGGLE:
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rvh->Send(new SpellCheckMsg_ToggleSpellPanel(
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          rvh->GetRoutingID(), spellcheck_mac::SpellingPanelVisible()));
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
124