1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/renderer_context_menu/spellchecker_submenu_observer.h" 6 7 #include "base/logging.h" 8 #include "base/prefs/pref_service.h" 9 #include "chrome/app/chrome_command_ids.h" 10 #include "chrome/browser/renderer_context_menu/render_view_context_menu.h" 11 #include "chrome/browser/renderer_context_menu/spelling_bubble_model.h" 12 #include "chrome/browser/spellchecker/spellcheck_platform_mac.h" 13 #include "chrome/common/chrome_switches.h" 14 #include "chrome/common/pref_names.h" 15 #include "chrome/common/spellcheck_messages.h" 16 #include "chrome/grit/generated_resources.h" 17 #include "components/user_prefs/user_prefs.h" 18 #include "content/public/browser/render_view_host.h" 19 #include "content/public/browser/render_widget_host_view.h" 20 #include "ui/base/l10n/l10n_util.h" 21 #include "ui/base/models/simple_menu_model.h" 22 23 using content::BrowserThread; 24 25 namespace { 26 27 PrefService* GetPrefs(content::BrowserContext* context) { 28 return user_prefs::UserPrefs::Get(context); 29 } 30 31 } 32 33 SpellCheckerSubMenuObserver::SpellCheckerSubMenuObserver( 34 RenderViewContextMenuProxy* proxy, 35 ui::SimpleMenuModel::Delegate* delegate, 36 int group) 37 : proxy_(proxy), 38 submenu_model_(delegate) { 39 DCHECK(proxy_); 40 } 41 42 SpellCheckerSubMenuObserver::~SpellCheckerSubMenuObserver() { 43 } 44 45 void SpellCheckerSubMenuObserver::InitMenu( 46 const content::ContextMenuParams& params) { 47 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 48 49 // Add an item that toggles the spelling panel. 50 submenu_model_.AddCheckItem( 51 IDC_SPELLPANEL_TOGGLE, 52 l10n_util::GetStringUTF16( 53 spellcheck_mac::SpellingPanelVisible() ? 54 IDS_CONTENT_CONTEXT_HIDE_SPELLING_PANEL : 55 IDS_CONTENT_CONTEXT_SHOW_SPELLING_PANEL)); 56 submenu_model_.AddSeparator(ui::NORMAL_SEPARATOR); 57 58 // Add a 'Check Spelling While Typing' item in the sub menu. 59 submenu_model_.AddCheckItem( 60 IDC_CHECK_SPELLING_WHILE_TYPING, 61 l10n_util::GetStringUTF16( 62 IDS_CONTENT_CONTEXT_CHECK_SPELLING_WHILE_TYPING)); 63 64 proxy_->AddSubMenu( 65 IDC_SPELLCHECK_MENU, 66 l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_SPELLCHECK_MENU), 67 &submenu_model_); 68 } 69 70 bool SpellCheckerSubMenuObserver::IsCommandIdSupported(int command_id) { 71 switch (command_id) { 72 case IDC_CONTENT_CONTEXT_LANGUAGE_SETTINGS: 73 // Return false so RenderViewContextMenu can handle this item because it 74 // is hard for this class to handle it. 75 return false; 76 77 case IDC_CHECK_SPELLING_WHILE_TYPING: 78 case IDC_SPELLPANEL_TOGGLE: 79 case IDC_SPELLCHECK_MENU: 80 case IDC_CONTENT_CONTEXT_SPELLING_TOGGLE: 81 return true; 82 } 83 84 return false; 85 } 86 87 bool SpellCheckerSubMenuObserver::IsCommandIdChecked(int command_id) { 88 DCHECK(IsCommandIdSupported(command_id)); 89 90 // Check box for 'Check Spelling while typing'. 91 if (command_id == IDC_CHECK_SPELLING_WHILE_TYPING) { 92 content::BrowserContext* context = proxy_->GetBrowserContext(); 93 DCHECK(context); 94 return GetPrefs(context)->GetBoolean(prefs::kEnableContinuousSpellcheck); 95 } 96 97 return false; 98 } 99 100 bool SpellCheckerSubMenuObserver::IsCommandIdEnabled(int command_id) { 101 DCHECK(IsCommandIdSupported(command_id)); 102 103 switch (command_id) { 104 case IDC_CHECK_SPELLING_WHILE_TYPING: 105 case IDC_SPELLPANEL_TOGGLE: 106 case IDC_SPELLCHECK_MENU: 107 case IDC_CONTENT_CONTEXT_SPELLING_TOGGLE: 108 return true; 109 } 110 111 return false; 112 } 113 114 void SpellCheckerSubMenuObserver::ExecuteCommand(int command_id) { 115 DCHECK(IsCommandIdSupported(command_id)); 116 117 content::RenderViewHost* rvh = proxy_->GetRenderViewHost(); 118 content::BrowserContext* context = proxy_->GetBrowserContext(); 119 DCHECK(context); 120 switch (command_id) { 121 case IDC_CHECK_SPELLING_WHILE_TYPING: 122 GetPrefs(context)->SetBoolean( 123 prefs::kEnableContinuousSpellcheck, 124 !GetPrefs(context)->GetBoolean(prefs::kEnableContinuousSpellcheck)); 125 break; 126 127 case IDC_SPELLPANEL_TOGGLE: 128 rvh->Send(new SpellCheckMsg_ToggleSpellPanel( 129 rvh->GetRoutingID(), spellcheck_mac::SpellingPanelVisible())); 130 break; 131 } 132 } 133