| 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
|
|
|