Disable view source for Developer Tools.
[chromium-blink-merge.git] / chrome / browser / translate / translate_infobar_delegate.h
blob35b89496373969a8f4ccb8305ce42ec24998c15b
1 // Copyright (c) 2011 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.
5 #ifndef CHROME_BROWSER_TRANSLATE_TRANSLATE_INFOBAR_DELEGATE_H_
6 #define CHROME_BROWSER_TRANSLATE_TRANSLATE_INFOBAR_DELEGATE_H_
8 #include <string>
9 #include <utility>
10 #include <vector>
12 #include "base/logging.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "chrome/browser/infobars/infobar_delegate.h"
15 #include "chrome/browser/translate/translate_prefs.h"
16 #include "chrome/browser/translate/translate_ui_delegate.h"
17 #include "components/translate/core/common/translate_constants.h"
18 #include "components/translate/core/common/translate_errors.h"
20 class PrefService;
22 // The defaults after which extra shortcuts for options
23 // can be shown.
24 struct ShortcutConfiguration {
25 int always_translate_min_count;
26 int never_translate_min_count;
29 class TranslateInfoBarDelegate : public InfoBarDelegate {
30 public:
31 // The different types of infobars that can be shown for translation.
32 enum Type {
33 BEFORE_TRANSLATE,
34 TRANSLATING,
35 AFTER_TRANSLATE,
36 TRANSLATION_ERROR
39 // The types of background color animations.
40 enum BackgroundAnimationType {
41 NONE,
42 NORMAL_TO_ERROR,
43 ERROR_TO_NORMAL
46 static const size_t kNoIndex;
48 virtual ~TranslateInfoBarDelegate();
50 // Factory method to create a translate infobar. |error_type| must be
51 // specified iff |infobar_type| == TRANSLATION_ERROR. For other infobar
52 // types, |original_language| and |target_language| must be ASCII language
53 // codes (e.g. "en", "fr", etc.) for languages the TranslateManager supports
54 // translating. The lone exception is when the user initiates translation
55 // from the context menu, in which case it's legal to call this with
56 // |infobar_type| == TRANSLATING and
57 // |original_language| == kUnknownLanguageCode.
59 // If |replace_existing_infobar| is true, the infobar is created and added to
60 // the infobar service for |web_contents|, replacing any other translate
61 // infobar already present there. Otherwise, the infobar will only be added
62 // if there is no other translate infobar already present.
63 static void Create(bool replace_existing_infobar,
64 content::WebContents* web_contents,
65 Type infobar_type,
66 const std::string& original_language,
67 const std::string& target_language,
68 TranslateErrors::Type error_type,
69 PrefService* prefs,
70 const ShortcutConfiguration& shortcut_config);
72 // Returns the number of languages supported.
73 size_t num_languages() const { return ui_delegate_.GetNumberOfLanguages(); }
75 // Returns the ISO code for the language at |index|.
76 std::string language_code_at(size_t index) const {
77 return ui_delegate_.GetLanguageCodeAt(index);
80 // Returns the displayable name for the language at |index|.
81 base::string16 language_name_at(size_t index) const {
82 return ui_delegate_.GetLanguageNameAt(index);
85 Type infobar_type() const { return infobar_type_; }
87 TranslateErrors::Type error_type() const { return error_type_; }
89 size_t original_language_index() const {
90 return ui_delegate_.GetOriginalLanguageIndex();
92 void UpdateOriginalLanguageIndex(size_t language_index);
94 size_t target_language_index() const {
95 return ui_delegate_.GetTargetLanguageIndex();
97 void UpdateTargetLanguageIndex(size_t language_index);
99 // Convenience methods.
100 std::string original_language_code() const {
101 return ui_delegate_.GetOriginalLanguageCode();
103 std::string target_language_code() const {
104 return ui_delegate_.GetTargetLanguageCode();
107 // Returns true if the current infobar indicates an error (in which case it
108 // should get a yellow background instead of a blue one).
109 bool is_error() const { return infobar_type_ == TRANSLATION_ERROR; }
111 // Returns what kind of background fading effect the infobar should use when
112 // its is shown.
113 BackgroundAnimationType background_animation_type() const {
114 return background_animation_;
117 virtual void Translate();
118 virtual void RevertTranslation();
119 void ReportLanguageDetectionError();
121 // Called when the user declines to translate a page, by either closing the
122 // infobar or pressing the "Don't translate" button.
123 virtual void TranslationDeclined();
125 // Methods called by the Options menu delegate.
126 virtual bool IsTranslatableLanguageByPrefs();
127 virtual void ToggleTranslatableLanguageByPrefs();
128 virtual bool IsSiteBlacklisted();
129 virtual void ToggleSiteBlacklist();
130 virtual bool ShouldAlwaysTranslate();
131 virtual void ToggleAlwaysTranslate();
133 // Methods called by the extra-buttons that can appear on the "before
134 // translate" infobar (when the user has accepted/declined the translation
135 // several times).
136 void AlwaysTranslatePageLanguage();
137 void NeverTranslatePageLanguage();
139 // The following methods are called by the infobar that displays the status
140 // while translating and also the one displaying the error message.
141 base::string16 GetMessageInfoBarText();
142 base::string16 GetMessageInfoBarButtonText();
143 void MessageInfoBarButtonPressed();
144 bool ShouldShowMessageInfoBarButton();
146 // Called by the before translate infobar to figure-out if it should show
147 // an extra shortcut to let the user black-list/white-list that language
148 // (based on how many times the user accepted/declined translation).
149 // The shortcut itself is platform specific, it can be a button or a new bar
150 // for example.
151 bool ShouldShowNeverTranslateShortcut();
152 bool ShouldShowAlwaysTranslateShortcut();
154 // Convenience method that returns the displayable language name for
155 // |language_code| in the current application locale.
156 static base::string16 GetLanguageDisplayableName(
157 const std::string& language_code);
159 // Adds the strings that should be displayed in the after translate infobar to
160 // |strings|. If |autodetermined_source_language| is false, the text in that
161 // infobar is:
162 // "The page has been translated from <lang1> to <lang2>."
163 // Otherwise:
164 // "The page has been translated to <lang1>."
165 // Because <lang1>, or <lang1> and <lang2> are displayed in menu buttons, the
166 // text is split in 2 or 3 chunks. |swap_languages| is set to true if
167 // |autodetermined_source_language| is false, and <lang1> and <lang2>
168 // should be inverted (some languages express the sentense as "The page has
169 // been translate to <lang2> from <lang1>."). It is ignored if
170 // |autodetermined_source_language| is true.
171 static void GetAfterTranslateStrings(std::vector<base::string16>* strings,
172 bool* swap_languages,
173 bool autodetermined_source_language);
175 protected:
176 TranslateInfoBarDelegate(content::WebContents* web_contents,
177 Type infobar_type,
178 TranslateInfoBarDelegate* old_delegate,
179 const std::string& original_language,
180 const std::string& target_language,
181 TranslateErrors::Type error_type,
182 PrefService* prefs,
183 ShortcutConfiguration shortcut_config);
185 private:
186 friend class TranslationInfoBarTest;
187 typedef std::pair<std::string, base::string16> LanguageNamePair;
189 // Returns a translate infobar that owns |delegate|.
190 static scoped_ptr<InfoBar> CreateInfoBar(
191 scoped_ptr<TranslateInfoBarDelegate> delegate);
193 // InfoBarDelegate:
194 virtual void InfoBarDismissed() OVERRIDE;
195 virtual int GetIconID() const OVERRIDE;
196 virtual InfoBarDelegate::Type GetInfoBarType() const OVERRIDE;
197 virtual bool ShouldExpire(
198 const content::LoadCommittedDetails& details) const OVERRIDE;
199 virtual TranslateInfoBarDelegate* AsTranslateInfoBarDelegate() OVERRIDE;
201 Type infobar_type_;
203 // The type of fading animation if any that should be used when showing this
204 // infobar.
205 BackgroundAnimationType background_animation_;
207 TranslateUIDelegate ui_delegate_;
209 // The error that occurred when trying to translate (NONE if no error).
210 TranslateErrors::Type error_type_;
212 // The translation related preferences.
213 TranslatePrefs prefs_;
215 // Translation shortcut configuration
216 ShortcutConfiguration shortcut_config_;
217 DISALLOW_COPY_AND_ASSIGN(TranslateInfoBarDelegate);
220 #endif // CHROME_BROWSER_TRANSLATE_TRANSLATE_INFOBAR_DELEGATE_H_