Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(652)

Side by Side Diff: chrome/browser/translate/translate_infobar_delegate2.cc

Issue 2602003: Refactored the translate infobars. (Closed) Base URL: http://src.chromium.org/git/chromium.git
Patch Set: Synced Created 10 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (c) 2010 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/translate/translate_infobar_delegate2.h"
6
7 #include "app/l10n_util.h"
8 #include "app/resource_bundle.h"
9 #include "chrome/browser/browser_process.h"
10 #include "chrome/browser/profile.h"
11 #include "chrome/browser/tab_contents/tab_contents.h"
12 #include "chrome/browser/translate/translate_infobar_view.h"
13 #include "chrome/browser/translate/translate_manager2.h"
14 #include "grit/generated_resources.h"
15 #include "grit/theme_resources.h"
16
17 // static
18 TranslateInfoBarDelegate2* TranslateInfoBarDelegate2::CreateInstance(
19 Type type,
20 TranslateErrors::Type error,
21 TabContents* tab_contents,
22 const std::string& original_language,
23 const std::string& target_language) {
24 if (!TranslateManager2::IsSupportedLanguage(original_language) ||
25 !TranslateManager2::IsSupportedLanguage(target_language)) {
26 return NULL;
27 }
28 return new TranslateInfoBarDelegate2(type, error, tab_contents,
29 original_language, target_language);
30 }
31
32 TranslateInfoBarDelegate2::TranslateInfoBarDelegate2(
33 Type type,
34 TranslateErrors::Type error,
35 TabContents* tab_contents,
36 const std::string& original_language,
37 const std::string& target_language)
38 : InfoBarDelegate(tab_contents),
39 type_(type),
40 background_animation_(NONE),
41 tab_contents_(tab_contents),
42 original_language_index_(-1),
43 target_language_index_(-1),
44 error_(error),
45 infobar_view_(NULL),
46 prefs_(tab_contents_->profile()->GetPrefs()) {
47 DCHECK((type_ != TRANSLATION_ERROR && error == TranslateErrors::NONE) ||
48 (type_ == TRANSLATION_ERROR && error != TranslateErrors::NONE));
49
50 std::vector<std::string> language_codes;
51 TranslateManager2::GetSupportedLanguages(&language_codes);
52
53 languages_.reserve(language_codes.size());
54 for (std::vector<std::string>::const_iterator iter = language_codes.begin();
55 iter != language_codes.end(); ++iter) {
56 std::string language_code = *iter;
57
58 if (language_code == original_language)
59 original_language_index_ = iter - language_codes.begin();
60 else if (language_code == target_language)
61 target_language_index_ = iter - language_codes.begin();
62
63 string16 language_name = GetLanguageDisplayableName(language_code);
64 // Insert the language in languages_ in alphabetical order.
65 std::vector<LanguageNamePair>::iterator iter2;
66 for (iter2 = languages_.begin(); iter2 != languages_.end(); ++iter2) {
67 if (language_name.compare(iter2->second) < 0)
68 break;
69 }
70 languages_.insert(iter2, LanguageNamePair(language_code, language_name));
71 }
72 DCHECK(original_language_index_ != -1);
73 DCHECK(target_language_index_ != -1);
74 }
75
76 int TranslateInfoBarDelegate2::GetLanguageCount() const {
77 return static_cast<int>(languages_.size());
78 }
79
80 const std::string& TranslateInfoBarDelegate2::GetLanguageCodeAt(
81 int index) const {
82 DCHECK(index >=0 && index < GetLanguageCount());
83 return languages_[index].first;
84 }
85
86 const string16& TranslateInfoBarDelegate2::GetLanguageDisplayableNameAt(
87 int index) const {
88 DCHECK(index >=0 && index < GetLanguageCount());
89 return languages_[index].second;
90 }
91
92 const std::string& TranslateInfoBarDelegate2::GetOriginalLanguageCode() const {
93 return GetLanguageCodeAt(original_language_index());
94 }
95
96 const std::string& TranslateInfoBarDelegate2::GetTargetLanguageCode() const {
97 return GetLanguageCodeAt(target_language_index());
98 }
99
100 void TranslateInfoBarDelegate2::SetOriginalLanguage(int language_index) {
101 DCHECK(language_index < static_cast<int>(languages_.size()));
102 original_language_index_ = language_index;
103 if (infobar_view_)
104 infobar_view_->OriginalLanguageChanged();
105 if (type_ == AFTER_TRANSLATE)
106 Translate();
107 }
108
109 void TranslateInfoBarDelegate2::SetTargetLanguage(int language_index) {
110 DCHECK(language_index < static_cast<int>(languages_.size()));
111 target_language_index_ = language_index;
112 if (infobar_view_)
113 infobar_view_->TargetLanguageChanged();
114 if (type_ == AFTER_TRANSLATE)
115 Translate();
116 }
117
118 bool TranslateInfoBarDelegate2::IsError() {
119 return type_ == TRANSLATION_ERROR;
120 }
121
122 void TranslateInfoBarDelegate2::Translate() {
123 Singleton<TranslateManager2>::get()->TranslatePage(
124 tab_contents_,
125 GetLanguageCodeAt(original_language_index()),
126 GetLanguageCodeAt(target_language_index()));
127 }
128
129 void TranslateInfoBarDelegate2::RevertTranslation() {
130 Singleton<TranslateManager2>::get()->RevertTranslation(tab_contents_);
131 tab_contents_->RemoveInfoBar(this);
132 }
133
134 void TranslateInfoBarDelegate2::TranslationDeclined() {
135 // Remember that the user declined the translation so as to prevent showing a
136 // translate infobar for that page again. (TranslateManager initiates
137 // translations when getting a LANGUAGE_DETERMINED from the page, which
138 // happens when a load stops. That could happen multiple times, including
139 // after the user already declined the translation.)
140 tab_contents_->language_state().set_translation_declined(true);
141 }
142
143 void TranslateInfoBarDelegate2::InfoBarDismissed() {
144 if (type_ != BEFORE_TRANSLATE)
145 return;
146
147 // The user closed the infobar without clicking the translate button.
148 TranslationDeclined();
149 UMA_HISTOGRAM_COUNTS("Translate.DeclineTranslateCloseInfobar", 1);
150 }
151
152 SkBitmap* TranslateInfoBarDelegate2::GetIcon() const {
153 return ResourceBundle::GetSharedInstance().GetBitmapNamed(
154 IDR_INFOBAR_TRANSLATE);
155 }
156
157 InfoBarDelegate::Type TranslateInfoBarDelegate2::GetInfoBarType() {
158 return InfoBarDelegate::PAGE_ACTION_TYPE;
159 }
160
161 bool TranslateInfoBarDelegate2::IsLanguageBlacklisted() {
162 const std::string& original_lang =
163 GetLanguageCodeAt(original_language_index());
164 return prefs_.IsLanguageBlacklisted(original_lang);
165 }
166
167 void TranslateInfoBarDelegate2::ToggleLanguageBlacklist() {
168 const std::string& original_lang =
169 GetLanguageCodeAt(original_language_index());
170 if (prefs_.IsLanguageBlacklisted(original_lang))
171 prefs_.RemoveLanguageFromBlacklist(original_lang);
172 else
173 prefs_.BlacklistLanguage(original_lang);
174 }
175
176 bool TranslateInfoBarDelegate2::IsSiteBlacklisted() {
177 std::string host = GetPageHost();
178 return !host.empty() && prefs_.IsSiteBlacklisted(host);
179 }
180
181 void TranslateInfoBarDelegate2::ToggleSiteBlacklist() {
182 std::string host = GetPageHost();
183 if (host.empty())
184 return;
185
186 if (prefs_.IsSiteBlacklisted(host))
187 prefs_.RemoveSiteFromBlacklist(host);
188 else
189 prefs_.BlacklistSite(host);
190 }
191
192 bool TranslateInfoBarDelegate2::ShouldAlwaysTranslate() {
193 return prefs_.IsLanguagePairWhitelisted(GetOriginalLanguageCode(),
194 GetTargetLanguageCode());
195 }
196
197 void TranslateInfoBarDelegate2::ToggleAlwaysTranslate() {
198 std::string original_lang = GetOriginalLanguageCode();
199 std::string target_lang = GetTargetLanguageCode();
200 if (prefs_.IsLanguagePairWhitelisted(original_lang, target_lang))
201 prefs_.RemoveLanguagePairFromWhitelist(original_lang, target_lang);
202 else
203 prefs_.WhitelistLanguagePair(original_lang, target_lang);
204 }
205
206 string16 TranslateInfoBarDelegate2::GetMessageInfoBarText() {
207 switch (type_) {
208 case TRANSLATING:
209 return l10n_util::GetStringFUTF16(
210 IDS_TRANSLATE_INFOBAR_TRANSLATING_TO,
211 GetLanguageDisplayableNameAt(target_language_index_));
212 case TRANSLATION_ERROR:
213 switch (error_) {
214 case TranslateErrors::NETWORK:
215 return l10n_util::GetStringUTF16(
216 IDS_TRANSLATE_INFOBAR_ERROR_CANT_CONNECT);
217 case TranslateErrors::INITIALIZATION_ERROR:
218 case TranslateErrors::TRANSLATION_ERROR:
219 return l10n_util::GetStringUTF16(
220 IDS_TRANSLATE_INFOBAR_ERROR_CANT_TRANSLATE);
221 default:
222 NOTREACHED();
223 return string16();
224 }
225 default:
226 NOTREACHED();
227 return string16();
228 }
229 }
230
231 string16 TranslateInfoBarDelegate2::GetMessageInfoBarButtonText() {
232 switch (type_) {
233 case TRANSLATING:
234 return string16();
235 case TRANSLATION_ERROR:
236 return l10n_util::GetStringUTF16(IDS_TRANSLATE_INFOBAR_RETRY);
237 default:
238 NOTREACHED();
239 return string16();
240 }
241 }
242
243 void TranslateInfoBarDelegate2::MessageInfoBarButtonPressed() {
244 DCHECK(type_ == TRANSLATION_ERROR);
245 Singleton<TranslateManager2>::get()->TranslatePage(
246 tab_contents_,
247 GetLanguageCodeAt(original_language_index()),
248 GetLanguageCodeAt(target_language_index()));
249 }
250
251 void TranslateInfoBarDelegate2::UpdateBackgroundAnimation(
252 TranslateInfoBarDelegate2* previous_infobar) {
253 if (!previous_infobar || previous_infobar->IsError() == IsError()) {
254 background_animation_ = NONE;
255 return;
256 }
257 background_animation_ = IsError() ? NORMAL_TO_ERROR : ERROR_TO_NORMAL;
258 }
259
260 std::string TranslateInfoBarDelegate2::GetPageHost() {
261 NavigationEntry* entry = tab_contents_->controller().GetActiveEntry();
262 return entry ? entry->url().HostNoBrackets() : std::string();
263 }
264
265 // static
266 string16 TranslateInfoBarDelegate2::GetLanguageDisplayableName(
267 const std::string& language_code) {
268 return l10n_util::GetDisplayNameForLocale(
269 language_code, g_browser_process->GetApplicationLocale(), true);
270 }
271
272 // static
273 void TranslateInfoBarDelegate2::GetAfterTranslateStrings(
274 std::vector<string16>* strings, bool* swap_languages) {
275 DCHECK(strings);
276 DCHECK(swap_languages);
277
278 std::vector<size_t> offsets;
279 string16 text =
280 l10n_util::GetStringFUTF16(IDS_TRANSLATE_INFOBAR_AFTER_MESSAGE,
281 string16(), string16(), &offsets);
282 DCHECK(offsets.size() == 2U);
283
284 if (offsets[0] > offsets[1]) {
285 // Target language comes before source.
286 int tmp = offsets[0];
287 offsets[0] = offsets[0];
288 offsets[1] = tmp;
289 *swap_languages = true;
290 } else {
291 *swap_languages = false;
292 }
293
294 strings->push_back(text.substr(0, offsets[0]));
295 strings->push_back(text.substr(offsets[0], offsets[1]));
296 strings->push_back(text.substr(offsets[1]));
297 }
298
299 #if !defined(OS_WIN) && !defined(OS_CHROMEOS)
300 // Necessary so we link OK on Mac and Linux while the new translate infobars
301 // are being ported to these platforms.
302 InfoBar* TranslateInfoBarDelegate2::CreateInfoBar() {
303 return NULL;
304 }
305 #endif
OLDNEW
« no previous file with comments | « chrome/browser/translate/translate_infobar_delegate2.h ('k') | chrome/browser/translate/translate_infobar_view.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698