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