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 "components/translate/core/browser/options_menu_model.h"
6
7#include "base/metrics/histogram.h"
8#include "components/translate/core/browser/translate_driver.h"
9#include "components/translate/core/browser/translate_infobar_delegate.h"
10#include "grit/components_strings.h"
11#include "ui/base/l10n/l10n_util.h"
12
13namespace {
14
15const char kAboutGoogleTranslateURL[] =
16#if defined(OS_CHROMEOS)
17    "https://support.google.com/chromeos/?p=ib_translation_bar";
18#else
19    "https://support.google.com/chrome/?p=ib_translation_bar";
20#endif
21
22}  // namespace
23
24OptionsMenuModel::OptionsMenuModel(TranslateInfoBarDelegate* translate_delegate)
25    : ui::SimpleMenuModel(this),
26      translate_infobar_delegate_(translate_delegate) {
27  // |translate_delegate| must already be owned.
28  DCHECK(translate_infobar_delegate_->GetTranslateDriver());
29
30  base::string16 original_language = translate_delegate->language_name_at(
31      translate_delegate->original_language_index());
32  base::string16 target_language = translate_delegate->language_name_at(
33      translate_delegate->target_language_index());
34
35  bool autodetermined_source_language =
36      translate_delegate->original_language_index() ==
37      TranslateInfoBarDelegate::kNoIndex;
38
39  // Populate the menu.
40  // Incognito mode does not get any preferences related items.
41  if (!translate_delegate->is_off_the_record()) {
42    if (!autodetermined_source_language) {
43      AddCheckItem(ALWAYS_TRANSLATE,
44          l10n_util::GetStringFUTF16(IDS_TRANSLATE_INFOBAR_OPTIONS_ALWAYS,
45                                     original_language, target_language));
46      AddCheckItem(NEVER_TRANSLATE_LANGUAGE,
47                   l10n_util::GetStringFUTF16(
48                       IDS_TRANSLATE_INFOBAR_OPTIONS_NEVER_TRANSLATE_LANG,
49                       original_language));
50    }
51    AddCheckItem(NEVER_TRANSLATE_SITE,
52                 l10n_util::GetStringUTF16(
53                     IDS_TRANSLATE_INFOBAR_OPTIONS_NEVER_TRANSLATE_SITE));
54    AddSeparator(ui::NORMAL_SEPARATOR);
55  }
56  if (!autodetermined_source_language) {
57    AddItem(REPORT_BAD_DETECTION,
58        l10n_util::GetStringFUTF16(IDS_TRANSLATE_INFOBAR_OPTIONS_REPORT_ERROR,
59                                   original_language));
60  }
61  AddItemWithStringId(ABOUT_TRANSLATE, IDS_TRANSLATE_INFOBAR_OPTIONS_ABOUT);
62}
63
64OptionsMenuModel::~OptionsMenuModel() {
65}
66
67bool OptionsMenuModel::IsCommandIdChecked(int command_id) const {
68  switch (command_id) {
69    case NEVER_TRANSLATE_LANGUAGE:
70      return !translate_infobar_delegate_->IsTranslatableLanguageByPrefs();
71
72    case NEVER_TRANSLATE_SITE:
73      return translate_infobar_delegate_->IsSiteBlacklisted();
74
75    case ALWAYS_TRANSLATE:
76      return translate_infobar_delegate_->ShouldAlwaysTranslate();
77
78    default:
79      NOTREACHED() << "Invalid command_id from menu";
80      break;
81  }
82  return false;
83}
84
85bool OptionsMenuModel::IsCommandIdEnabled(int command_id) const {
86  switch (command_id) {
87    case NEVER_TRANSLATE_LANGUAGE:
88    case NEVER_TRANSLATE_SITE:
89      return !translate_infobar_delegate_->ShouldAlwaysTranslate();
90
91    case ALWAYS_TRANSLATE:
92      return (translate_infobar_delegate_->IsTranslatableLanguageByPrefs() &&
93          !translate_infobar_delegate_->IsSiteBlacklisted());
94
95    default:
96      break;
97  }
98  return true;
99}
100
101bool OptionsMenuModel::GetAcceleratorForCommandId(
102    int command_id,
103    ui::Accelerator* accelerator) {
104  return false;
105}
106
107void OptionsMenuModel::ExecuteCommand(int command_id, int event_flags) {
108  switch (command_id) {
109    case NEVER_TRANSLATE_LANGUAGE:
110      translate_infobar_delegate_->ToggleTranslatableLanguageByPrefs();
111      break;
112
113    case NEVER_TRANSLATE_SITE:
114      translate_infobar_delegate_->ToggleSiteBlacklist();
115      break;
116
117    case ALWAYS_TRANSLATE:
118      translate_infobar_delegate_->ToggleAlwaysTranslate();
119      break;
120
121    case REPORT_BAD_DETECTION:
122      translate_infobar_delegate_->ReportLanguageDetectionError();
123      break;
124
125    case ABOUT_TRANSLATE: {
126      TranslateDriver* translate_driver =
127          translate_infobar_delegate_->GetTranslateDriver();
128      if (translate_driver)
129        translate_driver->OpenUrlInNewTab(GURL(kAboutGoogleTranslateURL));
130      break;
131    }
132
133    default:
134      NOTREACHED() << "Invalid command id from menu.";
135      break;
136  }
137}
138