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

Unified 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/translate/translate_infobar_delegate2.cc
diff --git a/chrome/browser/translate/translate_infobar_delegate2.cc b/chrome/browser/translate/translate_infobar_delegate2.cc
new file mode 100644
index 0000000000000000000000000000000000000000..9b5395bf1b5c40450fde4ab73f63a8285044a9ce
--- /dev/null
+++ b/chrome/browser/translate/translate_infobar_delegate2.cc
@@ -0,0 +1,305 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/translate/translate_infobar_delegate2.h"
+
+#include "app/l10n_util.h"
+#include "app/resource_bundle.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/profile.h"
+#include "chrome/browser/tab_contents/tab_contents.h"
+#include "chrome/browser/translate/translate_infobar_view.h"
+#include "chrome/browser/translate/translate_manager2.h"
+#include "grit/generated_resources.h"
+#include "grit/theme_resources.h"
+
+// static
+TranslateInfoBarDelegate2* TranslateInfoBarDelegate2::CreateInstance(
+ Type type,
+ TranslateErrors::Type error,
+ TabContents* tab_contents,
+ const std::string& original_language,
+ const std::string& target_language) {
+ if (!TranslateManager2::IsSupportedLanguage(original_language) ||
+ !TranslateManager2::IsSupportedLanguage(target_language)) {
+ return NULL;
+ }
+ return new TranslateInfoBarDelegate2(type, error, tab_contents,
+ original_language, target_language);
+}
+
+TranslateInfoBarDelegate2::TranslateInfoBarDelegate2(
+ Type type,
+ TranslateErrors::Type error,
+ TabContents* tab_contents,
+ const std::string& original_language,
+ const std::string& target_language)
+ : InfoBarDelegate(tab_contents),
+ type_(type),
+ background_animation_(NONE),
+ tab_contents_(tab_contents),
+ original_language_index_(-1),
+ target_language_index_(-1),
+ error_(error),
+ infobar_view_(NULL),
+ prefs_(tab_contents_->profile()->GetPrefs()) {
+ DCHECK((type_ != TRANSLATION_ERROR && error == TranslateErrors::NONE) ||
+ (type_ == TRANSLATION_ERROR && error != TranslateErrors::NONE));
+
+ std::vector<std::string> language_codes;
+ TranslateManager2::GetSupportedLanguages(&language_codes);
+
+ languages_.reserve(language_codes.size());
+ for (std::vector<std::string>::const_iterator iter = language_codes.begin();
+ iter != language_codes.end(); ++iter) {
+ std::string language_code = *iter;
+
+ if (language_code == original_language)
+ original_language_index_ = iter - language_codes.begin();
+ else if (language_code == target_language)
+ target_language_index_ = iter - language_codes.begin();
+
+ string16 language_name = GetLanguageDisplayableName(language_code);
+ // Insert the language in languages_ in alphabetical order.
+ std::vector<LanguageNamePair>::iterator iter2;
+ for (iter2 = languages_.begin(); iter2 != languages_.end(); ++iter2) {
+ if (language_name.compare(iter2->second) < 0)
+ break;
+ }
+ languages_.insert(iter2, LanguageNamePair(language_code, language_name));
+ }
+ DCHECK(original_language_index_ != -1);
+ DCHECK(target_language_index_ != -1);
+}
+
+int TranslateInfoBarDelegate2::GetLanguageCount() const {
+ return static_cast<int>(languages_.size());
+}
+
+const std::string& TranslateInfoBarDelegate2::GetLanguageCodeAt(
+ int index) const {
+ DCHECK(index >=0 && index < GetLanguageCount());
+ return languages_[index].first;
+}
+
+const string16& TranslateInfoBarDelegate2::GetLanguageDisplayableNameAt(
+ int index) const {
+ DCHECK(index >=0 && index < GetLanguageCount());
+ return languages_[index].second;
+}
+
+const std::string& TranslateInfoBarDelegate2::GetOriginalLanguageCode() const {
+ return GetLanguageCodeAt(original_language_index());
+}
+
+const std::string& TranslateInfoBarDelegate2::GetTargetLanguageCode() const {
+ return GetLanguageCodeAt(target_language_index());
+}
+
+void TranslateInfoBarDelegate2::SetOriginalLanguage(int language_index) {
+ DCHECK(language_index < static_cast<int>(languages_.size()));
+ original_language_index_ = language_index;
+ if (infobar_view_)
+ infobar_view_->OriginalLanguageChanged();
+ if (type_ == AFTER_TRANSLATE)
+ Translate();
+}
+
+void TranslateInfoBarDelegate2::SetTargetLanguage(int language_index) {
+ DCHECK(language_index < static_cast<int>(languages_.size()));
+ target_language_index_ = language_index;
+ if (infobar_view_)
+ infobar_view_->TargetLanguageChanged();
+ if (type_ == AFTER_TRANSLATE)
+ Translate();
+}
+
+bool TranslateInfoBarDelegate2::IsError() {
+ return type_ == TRANSLATION_ERROR;
+}
+
+void TranslateInfoBarDelegate2::Translate() {
+ Singleton<TranslateManager2>::get()->TranslatePage(
+ tab_contents_,
+ GetLanguageCodeAt(original_language_index()),
+ GetLanguageCodeAt(target_language_index()));
+}
+
+void TranslateInfoBarDelegate2::RevertTranslation() {
+ Singleton<TranslateManager2>::get()->RevertTranslation(tab_contents_);
+ tab_contents_->RemoveInfoBar(this);
+}
+
+void TranslateInfoBarDelegate2::TranslationDeclined() {
+ // Remember that the user declined the translation so as to prevent showing a
+ // translate infobar for that page again. (TranslateManager initiates
+ // translations when getting a LANGUAGE_DETERMINED from the page, which
+ // happens when a load stops. That could happen multiple times, including
+ // after the user already declined the translation.)
+ tab_contents_->language_state().set_translation_declined(true);
+}
+
+void TranslateInfoBarDelegate2::InfoBarDismissed() {
+ if (type_ != BEFORE_TRANSLATE)
+ return;
+
+ // The user closed the infobar without clicking the translate button.
+ TranslationDeclined();
+ UMA_HISTOGRAM_COUNTS("Translate.DeclineTranslateCloseInfobar", 1);
+}
+
+SkBitmap* TranslateInfoBarDelegate2::GetIcon() const {
+ return ResourceBundle::GetSharedInstance().GetBitmapNamed(
+ IDR_INFOBAR_TRANSLATE);
+}
+
+InfoBarDelegate::Type TranslateInfoBarDelegate2::GetInfoBarType() {
+ return InfoBarDelegate::PAGE_ACTION_TYPE;
+}
+
+bool TranslateInfoBarDelegate2::IsLanguageBlacklisted() {
+ const std::string& original_lang =
+ GetLanguageCodeAt(original_language_index());
+ return prefs_.IsLanguageBlacklisted(original_lang);
+}
+
+void TranslateInfoBarDelegate2::ToggleLanguageBlacklist() {
+ const std::string& original_lang =
+ GetLanguageCodeAt(original_language_index());
+ if (prefs_.IsLanguageBlacklisted(original_lang))
+ prefs_.RemoveLanguageFromBlacklist(original_lang);
+ else
+ prefs_.BlacklistLanguage(original_lang);
+}
+
+bool TranslateInfoBarDelegate2::IsSiteBlacklisted() {
+ std::string host = GetPageHost();
+ return !host.empty() && prefs_.IsSiteBlacklisted(host);
+}
+
+void TranslateInfoBarDelegate2::ToggleSiteBlacklist() {
+ std::string host = GetPageHost();
+ if (host.empty())
+ return;
+
+ if (prefs_.IsSiteBlacklisted(host))
+ prefs_.RemoveSiteFromBlacklist(host);
+ else
+ prefs_.BlacklistSite(host);
+}
+
+bool TranslateInfoBarDelegate2::ShouldAlwaysTranslate() {
+ return prefs_.IsLanguagePairWhitelisted(GetOriginalLanguageCode(),
+ GetTargetLanguageCode());
+}
+
+void TranslateInfoBarDelegate2::ToggleAlwaysTranslate() {
+ std::string original_lang = GetOriginalLanguageCode();
+ std::string target_lang = GetTargetLanguageCode();
+ if (prefs_.IsLanguagePairWhitelisted(original_lang, target_lang))
+ prefs_.RemoveLanguagePairFromWhitelist(original_lang, target_lang);
+ else
+ prefs_.WhitelistLanguagePair(original_lang, target_lang);
+}
+
+string16 TranslateInfoBarDelegate2::GetMessageInfoBarText() {
+ switch (type_) {
+ case TRANSLATING:
+ return l10n_util::GetStringFUTF16(
+ IDS_TRANSLATE_INFOBAR_TRANSLATING_TO,
+ GetLanguageDisplayableNameAt(target_language_index_));
+ case TRANSLATION_ERROR:
+ switch (error_) {
+ case TranslateErrors::NETWORK:
+ return l10n_util::GetStringUTF16(
+ IDS_TRANSLATE_INFOBAR_ERROR_CANT_CONNECT);
+ case TranslateErrors::INITIALIZATION_ERROR:
+ case TranslateErrors::TRANSLATION_ERROR:
+ return l10n_util::GetStringUTF16(
+ IDS_TRANSLATE_INFOBAR_ERROR_CANT_TRANSLATE);
+ default:
+ NOTREACHED();
+ return string16();
+ }
+ default:
+ NOTREACHED();
+ return string16();
+ }
+}
+
+string16 TranslateInfoBarDelegate2::GetMessageInfoBarButtonText() {
+ switch (type_) {
+ case TRANSLATING:
+ return string16();
+ case TRANSLATION_ERROR:
+ return l10n_util::GetStringUTF16(IDS_TRANSLATE_INFOBAR_RETRY);
+ default:
+ NOTREACHED();
+ return string16();
+ }
+}
+
+void TranslateInfoBarDelegate2::MessageInfoBarButtonPressed() {
+ DCHECK(type_ == TRANSLATION_ERROR);
+ Singleton<TranslateManager2>::get()->TranslatePage(
+ tab_contents_,
+ GetLanguageCodeAt(original_language_index()),
+ GetLanguageCodeAt(target_language_index()));
+}
+
+void TranslateInfoBarDelegate2::UpdateBackgroundAnimation(
+ TranslateInfoBarDelegate2* previous_infobar) {
+ if (!previous_infobar || previous_infobar->IsError() == IsError()) {
+ background_animation_ = NONE;
+ return;
+ }
+ background_animation_ = IsError() ? NORMAL_TO_ERROR : ERROR_TO_NORMAL;
+}
+
+std::string TranslateInfoBarDelegate2::GetPageHost() {
+ NavigationEntry* entry = tab_contents_->controller().GetActiveEntry();
+ return entry ? entry->url().HostNoBrackets() : std::string();
+}
+
+// static
+string16 TranslateInfoBarDelegate2::GetLanguageDisplayableName(
+ const std::string& language_code) {
+ return l10n_util::GetDisplayNameForLocale(
+ language_code, g_browser_process->GetApplicationLocale(), true);
+}
+
+// static
+void TranslateInfoBarDelegate2::GetAfterTranslateStrings(
+ std::vector<string16>* strings, bool* swap_languages) {
+ DCHECK(strings);
+ DCHECK(swap_languages);
+
+ std::vector<size_t> offsets;
+ string16 text =
+ l10n_util::GetStringFUTF16(IDS_TRANSLATE_INFOBAR_AFTER_MESSAGE,
+ string16(), string16(), &offsets);
+ DCHECK(offsets.size() == 2U);
+
+ if (offsets[0] > offsets[1]) {
+ // Target language comes before source.
+ int tmp = offsets[0];
+ offsets[0] = offsets[0];
+ offsets[1] = tmp;
+ *swap_languages = true;
+ } else {
+ *swap_languages = false;
+ }
+
+ strings->push_back(text.substr(0, offsets[0]));
+ strings->push_back(text.substr(offsets[0], offsets[1]));
+ strings->push_back(text.substr(offsets[1]));
+}
+
+#if !defined(OS_WIN) && !defined(OS_CHROMEOS)
+// Necessary so we link OK on Mac and Linux while the new translate infobars
+// are being ported to these platforms.
+InfoBar* TranslateInfoBarDelegate2::CreateInfoBar() {
+ return NULL;
+}
+#endif
« 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