diff options
Diffstat (limited to 'chrome/browser/translate')
-rw-r--r-- | chrome/browser/translate/options_menu_model.cc | 7 | ||||
-rw-r--r-- | chrome/browser/translate/options_menu_model.h | 8 | ||||
-rw-r--r-- | chrome/browser/translate/translate_infobars_delegates.cc | 197 | ||||
-rw-r--r-- | chrome/browser/translate/translate_infobars_delegates.h | 94 | ||||
-rw-r--r-- | chrome/browser/translate/translate_manager.cc | 32 |
5 files changed, 149 insertions, 189 deletions
diff --git a/chrome/browser/translate/options_menu_model.cc b/chrome/browser/translate/options_menu_model.cc index da1f896..376e2cb 100644 --- a/chrome/browser/translate/options_menu_model.cc +++ b/chrome/browser/translate/options_menu_model.cc @@ -10,12 +10,13 @@ #include "grit/generated_resources.h" OptionsMenuModel::OptionsMenuModel(menus::SimpleMenuModel::Delegate* delegate, - TranslateInfoBarDelegate* translate_delegate, bool before_translate) + TranslateInfoBarDelegate* translate_delegate) : menus::SimpleMenuModel(delegate) { string16 original_language = TranslateInfoBarDelegate::GetDisplayNameForLocale( translate_delegate->original_lang_code()); - if (before_translate) { + TranslateInfoBarDelegate::TranslateState state = translate_delegate->state(); + if (state == TranslateInfoBarDelegate::kBeforeTranslate) { AddCheckItem(IDC_TRANSLATE_OPTIONS_NEVER_TRANSLATE_LANG, l10n_util::GetStringFUTF16( IDS_TRANSLATE_INFOBAR_OPTIONS_NEVER_TRANSLATE_LANG, @@ -23,7 +24,7 @@ OptionsMenuModel::OptionsMenuModel(menus::SimpleMenuModel::Delegate* delegate, AddCheckItem(IDC_TRANSLATE_OPTIONS_NEVER_TRANSLATE_SITE, l10n_util::GetStringUTF16( IDS_TRANSLATE_INFOBAR_OPTIONS_NEVER_TRANSLATE_SITE)); - } else { + } else if (state == TranslateInfoBarDelegate::kAfterTranslate) { string16 target_language = TranslateInfoBarDelegate::GetDisplayNameForLocale( translate_delegate->target_lang_code()); diff --git a/chrome/browser/translate/options_menu_model.h b/chrome/browser/translate/options_menu_model.h index e335059..c6de2f3 100644 --- a/chrome/browser/translate/options_menu_model.h +++ b/chrome/browser/translate/options_menu_model.h @@ -1,6 +1,6 @@ -// Copyright (c) 2009 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. +// Copyright (c) 2009 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. #ifndef CHROME_BROWSER_TRANSLATE_OPTIONS_MENU_MODEL_H_ #define CHROME_BROWSER_TRANSLATE_OPTIONS_MENU_MODEL_H_ @@ -14,7 +14,7 @@ class TranslateInfoBarDelegate; class OptionsMenuModel : public menus::SimpleMenuModel { public: explicit OptionsMenuModel(menus::SimpleMenuModel::Delegate* menu_delegate, - TranslateInfoBarDelegate* translate_delegate, bool before_translate); + TranslateInfoBarDelegate* translate_delegate); virtual ~OptionsMenuModel(); private: diff --git a/chrome/browser/translate/translate_infobars_delegates.cc b/chrome/browser/translate/translate_infobars_delegates.cc index 7bf2a4f..ed86b6c 100644 --- a/chrome/browser/translate/translate_infobars_delegates.cc +++ b/chrome/browser/translate/translate_infobars_delegates.cc @@ -32,6 +32,41 @@ void TranslateInfoBarDelegate::InfoBarClosed() { // TranslateInfoBarDelegate: public: ------------------------------------------- +TranslateInfoBarDelegate::TranslateInfoBarDelegate(TabContents* tab_contents, + PrefService* user_prefs, TranslateState state, const GURL& url, + const std::string& original_lang_code, const std::string& target_lang_code) + : InfoBarDelegate(tab_contents), + tab_contents_(tab_contents), + prefs_(user_prefs), + state_(state), + site_(url.HostNoBrackets()), + original_lang_index_(-1), + target_lang_index_(-1), + never_translate_language_(false), + never_translate_site_(false), + always_translate_(false) { + TranslationService::GetSupportedLanguages(&supported_languages_); + for (size_t i = 0; i < supported_languages_.size(); ++i) { + if (original_lang_code == supported_languages_[i]) { + original_lang_index_ = i; + break; + } + } + DCHECK(original_lang_index_ > -1); + for (size_t i = 0; i < supported_languages_.size(); ++i) { + if (target_lang_code == supported_languages_[i]) { + target_lang_index_ = i; + break; + } + } + DCHECK(target_lang_index_ > -1); +} + +void TranslateInfoBarDelegate::UpdateState(TranslateState new_state) { + if (state_ != new_state) + state_ = new_state; +} + void TranslateInfoBarDelegate::ModifyOriginalLanguage(int lang_index) { original_lang_index_ = lang_index; // TODO(kuan): Send stats to Google Translate that original language has been @@ -39,7 +74,7 @@ void TranslateInfoBarDelegate::ModifyOriginalLanguage(int lang_index) { } void TranslateInfoBarDelegate::ModifyTargetLanguage(int lang_index) { - NOTREACHED() << "Subclass should override"; + target_lang_index_ = lang_index; } void TranslateInfoBarDelegate::GetAvailableOriginalLanguages( @@ -49,7 +84,7 @@ void TranslateInfoBarDelegate::GetAvailableOriginalLanguages( void TranslateInfoBarDelegate::GetAvailableTargetLanguages( std::vector<std::string>* languages) { - NOTREACHED() << "Subclass should override"; + TranslationService::GetSupportedLanguages(languages); } void TranslateInfoBarDelegate::Translate() { @@ -58,30 +93,69 @@ void TranslateInfoBarDelegate::Translate() { } bool TranslateInfoBarDelegate::IsLanguageBlacklisted() { - NOTREACHED() << "Subclass should override"; + if (state_ == kBeforeTranslate) { + never_translate_language_ = + prefs_.IsLanguageBlacklisted(original_lang_code()); + return never_translate_language_; + } + NOTREACHED() << "Invalid mehod called for translate state"; return false; } bool TranslateInfoBarDelegate::IsSiteBlacklisted() { - NOTREACHED() << "Subclass should override"; + if (state_ == kBeforeTranslate) { + never_translate_site_ = prefs_.IsSiteBlacklisted(site_); + return never_translate_site_; + } + NOTREACHED() << "Invalid mehod called for translate state"; return false; } bool TranslateInfoBarDelegate::ShouldAlwaysTranslate() { - NOTREACHED() << "Subclass should override"; + if (state_ == kAfterTranslate) { + always_translate_ = prefs_.IsLanguagePairWhitelisted(original_lang_code(), + target_lang_code()); + return always_translate_; + } + NOTREACHED() << "Invalid mehod called for translate state"; return false; } void TranslateInfoBarDelegate::ToggleLanguageBlacklist() { - NOTREACHED() << "Subclass should override"; + if (state_ == kBeforeTranslate) { + never_translate_language_ = !never_translate_language_; + if (never_translate_language_) + prefs_.BlacklistLanguage(original_lang_code()); + else + prefs_.RemoveLanguageFromBlacklist(original_lang_code()); + } else { + NOTREACHED() << "Invalid mehod called for translate state"; + } } void TranslateInfoBarDelegate::ToggleSiteBlacklist() { - NOTREACHED() << "Subclass should override"; + if (state_ == kBeforeTranslate) { + never_translate_site_ = !never_translate_site_; + if (never_translate_site_) + prefs_.BlacklistSite(site_); + else + prefs_.RemoveSiteFromBlacklist(site_); + } else { + NOTREACHED() << "Invalid mehod called for translate state"; + } } void TranslateInfoBarDelegate::ToggleAlwaysTranslate() { - NOTREACHED() << "Subclass should override"; + if (state_ == kAfterTranslate) { + always_translate_ = !always_translate_; + if (always_translate_) + prefs_.WhitelistLanguagePair(original_lang_code(), target_lang_code()); + else + prefs_.RemoveLanguagePairFromWhitelist(original_lang_code(), + target_lang_code()); + } else { + NOTREACHED() << "Invalid mehod called for translate state"; + } } // TranslateInfoBarDelegate: static: ------------------------------------------- @@ -92,113 +166,10 @@ string16 TranslateInfoBarDelegate::GetDisplayNameForLocale( language_code, g_browser_process->GetApplicationLocale(), true); } -// TranslateInfoBarDelegate: protected: ---------------------------------------- - -TranslateInfoBarDelegate::TranslateInfoBarDelegate(TabContents* tab_contents, - PrefService* user_prefs, const std::string& original_lang_code, - const std::string& target_lang_code) - : InfoBarDelegate(tab_contents), - tab_contents_(tab_contents), - original_lang_index_(0), - target_lang_index_(0), - prefs_(user_prefs) { - TranslationService::GetSupportedLanguages(&supported_languages_); - for (size_t i = 0; i < supported_languages_.size(); ++i) { - if (original_lang_code == supported_languages_[i]) { - original_lang_index_ = i; - break; - } - } - for (size_t i = 0; i < supported_languages_.size(); ++i) { - if (target_lang_code == supported_languages_[i]) { - target_lang_index_ = i; - break; - } - } -} - -// BeforeTranslateInfoBarDelegate: public: ------------------------------------- - -BeforeTranslateInfoBarDelegate::BeforeTranslateInfoBarDelegate( - TabContents* tab_contents, PrefService* user_prefs, const GURL& url, - const std::string& original_lang_code, const std::string& target_lang_code) - : TranslateInfoBarDelegate(tab_contents, user_prefs, original_lang_code, - target_lang_code), - site_(url.HostNoBrackets()), - never_translate_language_(false), - never_translate_site_(false) { -} - -bool BeforeTranslateInfoBarDelegate::IsLanguageBlacklisted() { - never_translate_language_ = - prefs_.IsLanguageBlacklisted(original_lang_code()); - return never_translate_language_; -} - -void BeforeTranslateInfoBarDelegate::ToggleLanguageBlacklist() { - never_translate_language_ = !never_translate_language_; - if (never_translate_language_) - prefs_.BlacklistLanguage(original_lang_code()); - else - prefs_.RemoveLanguageFromBlacklist(original_lang_code()); -} - -bool BeforeTranslateInfoBarDelegate::IsSiteBlacklisted() { - never_translate_site_ = prefs_.IsSiteBlacklisted(site_); - return never_translate_site_; -} - -void BeforeTranslateInfoBarDelegate::ToggleSiteBlacklist() { - never_translate_site_ = !never_translate_site_; - if (never_translate_site_) - prefs_.BlacklistSite(site_); - else - prefs_.RemoveSiteFromBlacklist(site_); -} - #if !defined(TOOLKIT_VIEWS) -InfoBar* BeforeTranslateInfoBarDelegate::CreateInfoBar() { - NOTIMPLEMENTED(); - return NULL; -} -#endif // !TOOLKIT_VIEWS - -// AfterTranslateInfoBarDelegate: public: -------------------------------------- - -AfterTranslateInfoBarDelegate::AfterTranslateInfoBarDelegate( - TabContents* tab_contents, PrefService* user_prefs, - const std::string& original_lang_code, const std::string& target_lang_code) - : TranslateInfoBarDelegate(tab_contents, user_prefs, original_lang_code, - target_lang_code), - always_translate_(false) { -} - -void AfterTranslateInfoBarDelegate::GetAvailableTargetLanguages( - std::vector<std::string>* languages) { - TranslationService::GetSupportedLanguages(languages); -} - -void AfterTranslateInfoBarDelegate::ModifyTargetLanguage(int lang_index) { - target_lang_index_ = lang_index; -} - -bool AfterTranslateInfoBarDelegate::ShouldAlwaysTranslate() { - always_translate_ = prefs_.IsLanguagePairWhitelisted(original_lang_code(), - target_lang_code()); - return always_translate_; -} - -void AfterTranslateInfoBarDelegate::ToggleAlwaysTranslate() { - always_translate_ = !always_translate_; - if (always_translate_) - prefs_.WhitelistLanguagePair(original_lang_code(), target_lang_code()); - else - prefs_.RemoveLanguagePairFromWhitelist(original_lang_code(), - target_lang_code()); -} +// TranslateInfoBarDelegate: InfoBarDelegate overrides: ------------------------ -#if !defined(TOOLKIT_VIEWS) -InfoBar* AfterTranslateInfoBarDelegate::CreateInfoBar() { +InfoBar* TranslateInfoBarDelegate::CreateInfoBar() { NOTIMPLEMENTED(); return NULL; } diff --git a/chrome/browser/translate/translate_infobars_delegates.h b/chrome/browser/translate/translate_infobars_delegates.h index 5b10f3f..311b847 100644 --- a/chrome/browser/translate/translate_infobars_delegates.h +++ b/chrome/browser/translate/translate_infobars_delegates.h @@ -14,19 +14,29 @@ class SkBitmap; // translate infobars. class TranslateInfoBarDelegate : public InfoBarDelegate { public: - virtual void GetAvailableOriginalLanguages( - std::vector<std::string>* languages); - virtual void GetAvailableTargetLanguages( - std::vector<std::string>* languages); - virtual void ModifyOriginalLanguage(int lang_index); - virtual void ModifyTargetLanguage(int lang_index); - virtual void Translate(); - virtual bool IsLanguageBlacklisted(); - virtual void ToggleLanguageBlacklist(); - virtual bool IsSiteBlacklisted(); - virtual void ToggleSiteBlacklist(); - virtual bool ShouldAlwaysTranslate(); - virtual void ToggleAlwaysTranslate(); + enum TranslateState { + kBeforeTranslate = 1, + kTranslating, + kAfterTranslate, + kTranslationFailed, + }; + + TranslateInfoBarDelegate(TabContents* contents, PrefService* user_prefs, + TranslateState state, const GURL& url, + const std::string& original_language, const std::string& target_language); + + void UpdateState(TranslateState new_state); + void GetAvailableOriginalLanguages(std::vector<std::string>* languages); + void GetAvailableTargetLanguages(std::vector<std::string>* languages); + void ModifyOriginalLanguage(int lang_index); + void ModifyTargetLanguage(int lang_index); + void Translate(); + bool IsLanguageBlacklisted(); + void ToggleLanguageBlacklist(); + bool IsSiteBlacklisted(); + void ToggleSiteBlacklist(); + bool ShouldAlwaysTranslate(); + void ToggleAlwaysTranslate(); int original_lang_index() const { return original_lang_index_; @@ -46,77 +56,41 @@ class TranslateInfoBarDelegate : public InfoBarDelegate { TabContents* tab_contents() const { return tab_contents_; } + TranslateState state() const { + return state_; + } // Overridden from InfoBarDelegate. virtual Type GetInfoBarType() { return PAGE_ACTION_TYPE; } virtual SkBitmap* GetIcon() const; - virtual bool EqualsDelegate(InfoBarDelegate* delegate) const; virtual TranslateInfoBarDelegate* AsTranslateInfoBarDelegate() { return this; } + virtual bool EqualsDelegate(InfoBarDelegate* delegate) const; virtual void InfoBarClosed(); // Returns the printable version of the language code |language_code|. static string16 GetDisplayNameForLocale(const std::string& language_code); - protected: - TranslateInfoBarDelegate(TabContents* contents, PrefService* user_prefs, - const std::string& original_language, const std::string& target_language); + // Overridden from InfoBarDelegate: + virtual InfoBar* CreateInfoBar(); + private: TabContents* tab_contents_; // Weak. + TranslatePrefs prefs_; + TranslateState state_; + std::string site_; int original_lang_index_; int target_lang_index_; - TranslatePrefs prefs_; // The list of languages supported. std::vector<std::string> supported_languages_; - - DISALLOW_COPY_AND_ASSIGN(TranslateInfoBarDelegate); -}; - -class BeforeTranslateInfoBarDelegate : public TranslateInfoBarDelegate { - public: - BeforeTranslateInfoBarDelegate(TabContents* contents, PrefService* user_prefs, - const GURL& url, const std::string& original_language, - const std::string& target_language); - - // Overriden from TranslateInfoBarDelegate: - virtual bool IsLanguageBlacklisted(); - virtual void ToggleLanguageBlacklist(); - virtual bool IsSiteBlacklisted(); - virtual void ToggleSiteBlacklist(); - - // Overridden from InfoBarDelegate: - virtual InfoBar* CreateInfoBar(); - - private: - std::string site_; bool never_translate_language_; bool never_translate_site_; - - DISALLOW_COPY_AND_ASSIGN(BeforeTranslateInfoBarDelegate); -}; - -class AfterTranslateInfoBarDelegate : public TranslateInfoBarDelegate { - public: - AfterTranslateInfoBarDelegate(TabContents* contents, PrefService* user_prefs, - const std::string& original_language, const std::string& target_language); - - // Overriden from TranslateInfoBar: - virtual void GetAvailableTargetLanguages( - std::vector<std::string>* languages); - virtual void ModifyTargetLanguage(int lang_index); - virtual bool ShouldAlwaysTranslate(); - virtual void ToggleAlwaysTranslate(); - - // Overridden from InfoBarDelegate: - virtual InfoBar* CreateInfoBar(); - - private: bool always_translate_; - DISALLOW_COPY_AND_ASSIGN(AfterTranslateInfoBarDelegate); + DISALLOW_COPY_AND_ASSIGN(TranslateInfoBarDelegate); }; #endif // CHROME_BROWSER_TRANSLATE_TRANSLATE_INFOBARS_DELEGATES_H_ diff --git a/chrome/browser/translate/translate_manager.cc b/chrome/browser/translate/translate_manager.cc index 4022187..2398cca 100644 --- a/chrome/browser/translate/translate_manager.cc +++ b/chrome/browser/translate/translate_manager.cc @@ -44,15 +44,29 @@ void TranslateManager::Observe(NotificationType type, break; } case NotificationType::PAGE_TRANSLATED: { + // Only add translate infobar if it doesn't exist; if it already exists, + // it would have received the same notification and acted accordingly. TabContents* tab = Source<TabContents>(source).ptr(); - std::pair<std::string, std::string>* language_pair = - (Details<std::pair<std::string, std::string> >(details).ptr()); - PrefService* prefs = GetPrefService(tab); - tab->AddInfoBar(new AfterTranslateInfoBarDelegate(tab, prefs, - language_pair->first, - language_pair->second)); + int i; + for (i = 0; i < tab->infobar_delegate_count(); ++i) { + InfoBarDelegate* info_bar = tab->GetInfoBarDelegateAt(i); + if (info_bar->AsTranslateInfoBarDelegate()) + break; + } + if (i == tab->infobar_delegate_count()) { + NavigationEntry* entry = tab->controller().GetActiveEntry(); + if (entry) { + std::pair<std::string, std::string>* language_pair = + (Details<std::pair<std::string, std::string> >(details).ptr()); + PrefService* prefs = GetPrefService(tab); + tab->AddInfoBar(new TranslateInfoBarDelegate(tab, prefs, + TranslateInfoBarDelegate::kAfterTranslate, entry->url(), + language_pair->first, language_pair->second)); + } + } break; } + default: NOTREACHED(); } @@ -113,9 +127,9 @@ void TranslateManager::InitiateTranslation(TabContents* tab, } // Prompts the user if he/she wants the page translated. - tab->AddInfoBar(new BeforeTranslateInfoBarDelegate(tab, prefs, - entry->url(), - page_lang, ui_lang)); + tab->AddInfoBar(new TranslateInfoBarDelegate(tab, prefs, + TranslateInfoBarDelegate::kBeforeTranslate, entry->url(), + page_lang, ui_lang)); } PrefService* TranslateManager::GetPrefService(TabContents* tab) { |