diff options
-rw-r--r-- | chrome/app/generated_resources.grd | 3 | ||||
-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 | ||||
-rw-r--r-- | chrome/browser/views/infobars/infobars.cc | 4 | ||||
-rw-r--r-- | chrome/browser/views/infobars/translate_infobars.cc | 555 | ||||
-rw-r--r-- | chrome/browser/views/infobars/translate_infobars.h | 104 |
9 files changed, 535 insertions, 469 deletions
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index d8760f3..d079ddd 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd @@ -6407,6 +6407,9 @@ Keep your key file in a safe place. You will need it to create new versions of y <message name="IDS_TRANSLATE_INFOBAR_DENY" desc="Text to show for the translate infobar button to deny translation."> Nope </message> + <message name="IDS_TRANSLATE_INFOBAR_TRANSLATING" desc="Text shown when page is currently being translated by servers"> + Loading... + </message> <message name="IDS_TRANSLATE_INFOBAR_PRIVACY_TITLE" desc="Title for translation warning."> Translation Warning </message> 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) { diff --git a/chrome/browser/views/infobars/infobars.cc b/chrome/browser/views/infobars/infobars.cc index fd6437b7..f3008cf 100644 --- a/chrome/browser/views/infobars/infobars.cc +++ b/chrome/browser/views/infobars/infobars.cc @@ -42,9 +42,9 @@ static const SkColor kErrorBackgroundColorBottom = kWarningBackgroundColorBottom; static const SkColor kPageActionBackgroundColorTop = - SkColorSetRGB(209, 222, 245); + SkColorSetRGB(218, 231, 249); static const SkColor kPageActionBackgroundColorBottom = - SkColorSetRGB(178, 201, 239); + SkColorSetRGB(179, 202, 231); static const int kSeparatorLineHeight = 1; diff --git a/chrome/browser/views/infobars/translate_infobars.cc b/chrome/browser/views/infobars/translate_infobars.cc index d20d844..2ce8525 100644 --- a/chrome/browser/views/infobars/translate_infobars.cc +++ b/chrome/browser/views/infobars/translate_infobars.cc @@ -9,6 +9,7 @@ #include "app/resource_bundle.h" #include "base/utf_string_conversions.h" #include "chrome/app/chrome_dll_resource.h" +#include "chrome/common/notification_service.h" #include "chrome/browser/tab_contents/tab_contents.h" #include "chrome/browser/translate/languages_menu_model.h" #include "chrome/browser/translate/options_menu_model.h" @@ -107,7 +108,71 @@ void TranslateButtonBorder::Paint(const views::View& view, gfx::Canvas* canvas) else if (state == views::TextButton::BS_PUSHED) set = &pushed_set_; - TextButtonBorder::Paint(view, canvas, *set); + gfx::Rect bounds = view.bounds(); + + // Draw top left image. + canvas->DrawBitmapInt(*set->top_left, 0, 0); + + // Stretch top image. + canvas->DrawBitmapInt( + *set->top, + 0, 0, set->top->width(), set->top->height(), + set->top_left->width(), + 0, + bounds.width() - set->top_right->width() - set->top_left->width(), + set->top->height(), false); + + // Draw top right image. + canvas->DrawBitmapInt(*set->top_right, + bounds.width() - set->top_right->width(), 0); + + // Stretch left image. + canvas->DrawBitmapInt( + *set->left, + 0, 0, set->left->width(), set->left->height(), + 0, + set->top_left->height(), + set->top_left->width(), + bounds.height() - set->top->height() - set->bottom_left->height(), false); + + // Stretch center image. + canvas->DrawBitmapInt( + *set->center, + 0, 0, set->center->width(), set->center->height(), + set->left->width(), + set->top->height(), + bounds.width() - set->right->width() - set->left->width(), + bounds.height() - set->bottom->height() - set->top->height(), false); + + // Stretch right image. + canvas->DrawBitmapInt( + *set->right, + 0, 0, set->right->width(), set->right->height(), + bounds.width() - set->right->width(), + set->top_right->height(), + set->right->width(), + bounds.height() - set->bottom_right->height() - + set->top_right->height(), false); + + // Draw bottom left image. + canvas->DrawBitmapInt(*set->bottom_left, + 0, + bounds.height() - set->bottom_left->height()); + + // Stretch bottom image. + canvas->DrawBitmapInt( + *set->bottom, + 0, 0, set->bottom->width(), set->bottom->height(), + set->bottom_left->width(), + bounds.height() - set->bottom->height(), + bounds.width() - set->bottom_right->width() - + set->bottom_left->width(), + set->bottom->height(), false); + + // Draw bottom right image. + canvas->DrawBitmapInt(*set->bottom_right, + bounds.width() - set->bottom_right->width(), + bounds.height() - set->bottom_right->height()); } //////////////////////////////////////////////////////////////////////////////// @@ -145,79 +210,128 @@ TranslateTextButton::TranslateTextButton(views::ButtonListener* listener, TranslateTextButton::~TranslateTextButton() { } -// TranslateButtonBorder, protected:-------------------------------------------- +// TranslateTextButton, protected: --------------------------------------------- + bool TranslateTextButton::OnMousePressed(const views::MouseEvent& e) { return views::CustomButton::OnMousePressed(e); } // TranslateInfoBar, public: --------------------------------------------------- -TranslateInfoBar::TranslateInfoBar(TranslateInfoBarDelegate* delegate, - bool before_translate, int label_id) +TranslateInfoBar::TranslateInfoBar(TranslateInfoBarDelegate* delegate) : InfoBar(delegate), - before_translate_(before_translate), + label_1_(NULL), + label_2_(NULL), + label_3_(NULL), + translating_label_(NULL), + accept_button_(NULL), + deny_button_(NULL), + target_language_menu_button_(NULL), swapped_language_placeholders_(false) { + // Initialize icon. icon_ = new views::ImageView; SkBitmap* image = delegate->GetIcon(); if (image) icon_->SetImage(image); AddChildView(icon_); - // Set up the labels. - std::vector<size_t> offsets; - std::wstring message_text = l10n_util::GetStringF(label_id, std::wstring(), - std::wstring(), &offsets); - if (!offsets.empty() && offsets.size() <= 2) { - // Sort the offsets if necessary. - if (offsets.size() == 2 && offsets[0] > offsets[1]) { - size_t offset0 = offsets[0]; - offsets[0] = offsets[1]; - offsets[1] = offset0; - swapped_language_placeholders_ = true; - } - if (offsets[offsets.size() - 1] != message_text.length()) - offsets.push_back(message_text.length()); - } else { - NOTREACHED() << "Invalid no. of placeholders in label."; - } - - const gfx::Font& font = ResourceBundle::GetSharedInstance().GetFont( - ResourceBundle::MediumFont); - label_1_ = new views::Label(message_text.substr(0, offsets[0]), font); - label_1_->SetColor(SK_ColorBLACK); - label_1_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); - AddChildView(label_1_); - - label_2_ = new views::Label( - message_text.substr(offsets[0], offsets[1] - offsets[0]), font); - label_2_->SetColor(SK_ColorBLACK); - label_2_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); - AddChildView(label_2_); - - if (offsets.size() == 3) { - label_3_ = new views::Label( - message_text.substr(offsets[1], offsets[2] - offsets[1]), font); - label_3_->SetColor(SK_ColorBLACK); - label_3_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); - AddChildView(label_3_); - } else { - label_3_ = NULL; - } - + // Create original language menu button. string16 language_name = TranslateInfoBarDelegate::GetDisplayNameForLocale( GetDelegate()->original_lang_code()); original_language_menu_button_ = CreateMenuButton(kMenuIDOriginalLanguage, UTF16ToWideHack(language_name)); AddChildView(original_language_menu_button_); + // Create options menu button. options_menu_button_ = CreateMenuButton(kMenuIDOptions, l10n_util::GetString(IDS_TRANSLATE_INFOBAR_OPTIONS)); AddChildView(options_menu_button_); + + // Create state-dependent controls. + UpdateState(GetDelegate()->state()); + + // Register for PAGE_TRANSLATED notification. + notification_registrar_.Add(this, NotificationType::PAGE_TRANSLATED, + Source<TabContents>(GetDelegate()->tab_contents())); } TranslateInfoBar::~TranslateInfoBar() { } +void TranslateInfoBar::UpdateState( + TranslateInfoBarDelegate::TranslateState new_state) { + // If this is not a call for initialization (i.e. called from Constructor), + // only proceed with state has changed. + if (label_1_ && GetDelegate()->state() == new_state) + return; + GetDelegate()->UpdateState(new_state); + + // Create and initialize state-dependent controls if necessary. + switch (new_state) { + case TranslateInfoBarDelegate::kAfterTranslate: + CreateLabels(); + if (!target_language_menu_button_) { + string16 language_name = + TranslateInfoBarDelegate::GetDisplayNameForLocale( + GetDelegate()->target_lang_code()); + target_language_menu_button_ = CreateMenuButton(kMenuIDTargetLanguage, + UTF16ToWideHack(language_name)); + AddChildView(target_language_menu_button_); + } + break; + + case TranslateInfoBarDelegate::kBeforeTranslate: + if (!label_1_) + CreateLabels(); + if (!accept_button_) { + accept_button_ = new TranslateTextButton(this, + IDS_TRANSLATE_INFOBAR_ACCEPT); + AddChildView(accept_button_); + } + if (!deny_button_) { + deny_button_ = new TranslateTextButton(this, + IDS_TRANSLATE_INFOBAR_DENY); + AddChildView(deny_button_); + } + break; + + case TranslateInfoBarDelegate::kTranslating: + if (!translating_label_) { + translating_label_ = new views::Label( + l10n_util::GetString(IDS_TRANSLATE_INFOBAR_TRANSLATING)); + translating_label_->SetColor(SK_ColorBLACK); + translating_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); + AddChildView(translating_label_); + } + break; + + default: + NOTREACHED() << "Invalid translate state change"; + break; + } + + // Determine visibility of state-dependent controls. + if (accept_button_) + accept_button_->SetVisible( + new_state == TranslateInfoBarDelegate::kBeforeTranslate); + if (deny_button_) + deny_button_->SetVisible( + new_state == TranslateInfoBarDelegate::kBeforeTranslate); + if (target_language_menu_button_) + target_language_menu_button_->SetVisible( + new_state == TranslateInfoBarDelegate::kAfterTranslate); + if (translating_label_) + translating_label_->SetVisible( + new_state == TranslateInfoBarDelegate::kTranslating); + + // Trigger layout and repaint. + Layout(); + SchedulePaint(); + + // Clear options menu model so that it'll be created for new state. + options_menu_model_.reset(); +} + // TranslateInfoBar, views::View overrides: ------------------------------------ void TranslateInfoBar::Layout() { @@ -235,13 +349,14 @@ void TranslateInfoBar::Layout() { options_menu_button_->SetBounds(available_width - options_ps.width(), OffsetY(this, options_ps), options_ps.width(), options_ps.height()); + TranslateInfoBarDelegate::TranslateState state = GetDelegate()->state(); + // Layout the controls between icon and options i.e. labels, original language // menu button, and if available, target language menu button. - // We layout target language menu button here (as opposed to in - // AfterTranslateInfoBar) because the 2 language menu buttons could be swapped - // for different locales. views::MenuButton* button1 = original_language_menu_button_; - views::MenuButton* button2 = target_language_menu_button(); + views::MenuButton* button2 = + (state == TranslateInfoBarDelegate::kAfterTranslate ? + target_language_menu_button_ : NULL); if (button2 && swapped_language_placeholders_) { button1 = button2; button2 = original_language_menu_button_; @@ -251,18 +366,24 @@ void TranslateInfoBar::Layout() { gfx::Size label1_ps = label_1_->GetPreferredSize(); gfx::Size label2_ps = label_2_->GetPreferredSize(); gfx::Size label3_ps; + gfx::Size translating_ps; if (label_3_) label3_ps = label_3_->GetPreferredSize(); + if (state == TranslateInfoBarDelegate::kTranslating) + translating_ps = translating_label_->GetPreferredSize(); int text1_width = label1_ps.width(); int text2_width = label2_ps.width(); int text3_width = label3_ps.width(); - int total_text_width = text1_width + text2_width + text3_width; + int translating_width = translating_ps.width(); + int total_text_width = text1_width + text2_width + text3_width + + translating_width; if (total_text_width > available_text_width) { double ratio = static_cast<double>(available_text_width) / static_cast<double>(total_text_width); text1_width = static_cast<int>(text1_width * ratio); text2_width = static_cast<int>(text2_width * ratio); text3_width = static_cast<int>(text3_width * ratio); + translating_width = static_cast<int>(translating_width * ratio); } label_1_->SetBounds(icon_->bounds().right() + InfoBar::kIconLabelSpacing, InfoBar::OffsetY(this, label1_ps), text1_width, label1_ps.height()); @@ -284,14 +405,33 @@ void TranslateInfoBar::Layout() { InfoBar::kButtonInLabelSpacing, OffsetY(this, button2_ps), button2_ps.width(), button2_ps.height()); + // If label_3 is available, place it after second language menu button. if (label_3_) { gfx::Size label3_ps = label_3_->GetPreferredSize(); - // Place label_3 after first language menu button. label_3_->SetBounds(button2->bounds().right() + InfoBar::kButtonInLabelSpacing, InfoBar::OffsetY(this, label3_ps), text3_width, label3_ps.height()); } } + + // If translate state is kBeforeTranslate, layout accept and deny butons. + if (state == TranslateInfoBarDelegate::kBeforeTranslate) { + gfx::Size accept_ps = accept_button_->GetPreferredSize(); + accept_button_->SetBounds( + (label_3_ ? label_3_->bounds().right() : label_2_->bounds().right()) + + InfoBar::kEndOfLabelSpacing, + OffsetY(this, accept_ps), accept_ps.width(), accept_ps.height()); + gfx::Size deny_ps = deny_button_->GetPreferredSize(); + deny_button_->SetBounds( + accept_button_->bounds().right() + InfoBar::kButtonButtonSpacing, + OffsetY(this, deny_ps), deny_ps.width(), deny_ps.height()); + } else if (state == TranslateInfoBarDelegate::kTranslating) { + // If translate state is kTranslating, layout "Translating..." label. + translating_label_->SetBounds( + label_2_->bounds().right() + InfoBar::kEndOfLabelSpacing, + InfoBar::OffsetY(this, translating_ps), + translating_width, translating_ps.height()); + } } // TranslateInfoBar, InfoBar overrides: ---------------------------------------- @@ -312,39 +452,73 @@ int TranslateInfoBar::GetAvailableWidth() const { gfx::Size options_ps = options_menu_button_->GetPreferredSize(); int options_spacing = (label_3_ ? InfoBar::kButtonInLabelSpacing + InfoBar::kEndOfLabelSpacing : - (target_language_menu_button() ? InfoBar::kEndOfLabelSpacing : + (target_language_menu_button_ ? InfoBar::kEndOfLabelSpacing : InfoBar::kButtonButtonSpacing)); - return (InfoBar::GetAvailableWidth() - options_ps.width() - options_spacing - + int available_width = (InfoBar::GetAvailableWidth() - + options_ps.width() - options_spacing - language_ps.width() - language_spacing - icon_->bounds().right() - InfoBar::kIconLabelSpacing); + TranslateInfoBarDelegate::TranslateState state = GetDelegate()->state(); + if (state == TranslateInfoBarDelegate::kBeforeTranslate) { + gfx::Size accept_ps = accept_button_->GetPreferredSize(); + gfx::Size deny_ps = deny_button_->GetPreferredSize(); + available_width -= accept_ps.width() + InfoBar::kEndOfLabelSpacing + + deny_ps.width() + InfoBar::kButtonButtonSpacing; + } else if (state == TranslateInfoBarDelegate::kAfterTranslate) { + gfx::Size target_ps = target_language_menu_button_->GetPreferredSize(); + available_width -= target_ps.width() + InfoBar::kButtonInLabelSpacing; + } + return available_width; } // TranslateInfoBar, views::ViewMenuDelegate implementation: ------------------- void TranslateInfoBar::RunMenu(views::View* source, const gfx::Point& pt) { - int menu_id = source->GetID(); - if (menu_id == kMenuIDOptions) { - if (!options_menu_model_.get()) { - options_menu_model_.reset(new OptionsMenuModel(this, GetDelegate(), - before_translate_)); - options_menu_menu_.reset(new views::Menu2(options_menu_model_.get())); + switch (source->GetID()) { + case kMenuIDOptions: { + if (!options_menu_model_.get()) { + options_menu_model_.reset(new OptionsMenuModel(this, GetDelegate())); + options_menu_menu_.reset(new views::Menu2(options_menu_model_.get())); + } + options_menu_menu_->RunMenuAt(pt, + (UILayoutIsRightToLeft() ? views::Menu2::ALIGN_TOPLEFT : + views::Menu2::ALIGN_TOPRIGHT)); + break; } - options_menu_menu_->RunMenuAt(pt, - (UILayoutIsRightToLeft() ? views::Menu2::ALIGN_TOPLEFT : - views::Menu2::ALIGN_TOPRIGHT)); - } else if (menu_id == kMenuIDOriginalLanguage) { - if (!original_language_menu_model_.get()) { - original_language_menu_model_.reset( - new LanguagesMenuModel(this, GetDelegate(), true)); - original_language_menu_menu_.reset( - new views::Menu2(original_language_menu_model_.get())); + + case kMenuIDOriginalLanguage: { + if (GetDelegate()->state() != TranslateInfoBarDelegate::kTranslating) { + if (!original_language_menu_model_.get()) { + original_language_menu_model_.reset( + new LanguagesMenuModel(this, GetDelegate(), true)); + original_language_menu_menu_.reset( + new views::Menu2(original_language_menu_model_.get())); + } + views::Menu2::Alignment alignment; + gfx::Point menu_position = DetermineMenuPositionAndAlignment( + original_language_menu_button_, &alignment); + original_language_menu_menu_->RunMenuAt(menu_position, alignment); + } + break; } - views::Menu2::Alignment alignment; - gfx::Point menu_position = DetermineMenuPositionAndAlignment( - original_language_menu_button_, &alignment); - original_language_menu_menu_->RunMenuAt(menu_position, alignment); - } else { - NOTREACHED() << "Invalid source menu."; + + case kMenuIDTargetLanguage: { + if (!target_language_menu_model_.get()) { + target_language_menu_model_.reset( + new LanguagesMenuModel(this, GetDelegate(), false)); + target_language_menu_menu_.reset( + new views::Menu2(target_language_menu_model_.get())); + } + views::Menu2::Alignment alignment; + gfx::Point menu_position = DetermineMenuPositionAndAlignment( + target_language_menu_button_, &alignment); + target_language_menu_menu_->RunMenuAt(menu_position, alignment); + break; + } + + default: + NOTREACHED() << "Invalid source menu."; + break; } } @@ -379,7 +553,10 @@ bool TranslateInfoBar::GetAcceleratorForCommandId(int command_id, } void TranslateInfoBar::ExecuteCommand(int command_id) { - if (command_id >= IDC_TRANSLATE_ORIGINAL_LANGUAGE_BASE) { + if (command_id >= IDC_TRANSLATE_TARGET_LANGUAGE_BASE) { + OnLanguageModified(target_language_menu_button_, + command_id - IDC_TRANSLATE_TARGET_LANGUAGE_BASE); + } else if (command_id >= IDC_TRANSLATE_ORIGINAL_LANGUAGE_BASE) { OnLanguageModified(original_language_menu_button_, command_id - IDC_TRANSLATE_ORIGINAL_LANGUAGE_BASE); } else { @@ -414,7 +591,93 @@ void TranslateInfoBar::ExecuteCommand(int command_id) { } } -// TranslateInfoBar, protected: ------------------------------------------------ +// TranslateInfoBar, views::ButtonListener overrides: -------------------------- + +void TranslateInfoBar::ButtonPressed( + views::Button* sender, const views::Event& event) { + if (sender == accept_button_) { + UpdateState(TranslateInfoBarDelegate::kTranslating); + GetDelegate()->Translate(); + } else if (sender == deny_button_) { + RemoveInfoBar(); + } else { // Let base InfoBar handle close button. + InfoBar::ButtonPressed(sender, event); + } +} + +// TranslateInfoBar, NotificationObserver overrides: --------------------------- + +void TranslateInfoBar::Observe(NotificationType type, + const NotificationSource& source, const NotificationDetails& details) { + if (type.value != NotificationType::PAGE_TRANSLATED) + return; + TabContents* tab = Source<TabContents>(source).ptr(); + if (tab != GetDelegate()->tab_contents()) + return; + UpdateState(TranslateInfoBarDelegate::kAfterTranslate); +} + +// TranslateInfoBar, private: -------------------------------------------------- + +void TranslateInfoBar::CreateLabels() { + // Determine text for labels. + std::vector<size_t> offsets; + std::wstring message_text = l10n_util::GetStringF( + (GetDelegate()->state() == TranslateInfoBarDelegate::kAfterTranslate ? + IDS_TRANSLATE_INFOBAR_AFTER_MESSAGE : + IDS_TRANSLATE_INFOBAR_BEFORE_MESSAGE), + std::wstring(), std::wstring(), &offsets); + if (!offsets.empty() && offsets.size() <= 2) { + // Sort the offsets if necessary. + if (offsets.size() == 2 && offsets[0] > offsets[1]) { + size_t offset0 = offsets[0]; + offsets[0] = offsets[1]; + offsets[1] = offset0; + swapped_language_placeholders_ = true; + } + if (offsets[offsets.size() - 1] != message_text.length()) + offsets.push_back(message_text.length()); + } else { + NOTREACHED() << "Invalid no. of placeholders in label."; + } + + // Create label controls. + const gfx::Font& font = ResourceBundle::GetSharedInstance().GetFont( + ResourceBundle::MediumFont); + std::wstring label_1 = message_text.substr(0, offsets[0]); + if (label_1_) { + label_1_->SetText(label_1); + } else { + label_1_ = new views::Label(label_1, font); + label_1_->SetColor(SK_ColorBLACK); + label_1_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); + AddChildView(label_1_); + } + + std::wstring label_2 = message_text.substr(offsets[0], + offsets[1] - offsets[0]); + if (label_2_) { + label_2_->SetText(label_2); + } else { + label_2_ = new views::Label(label_2, font); + label_2_->SetColor(SK_ColorBLACK); + label_2_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); + AddChildView(label_2_); + } + + if (offsets.size() == 3) { + std::wstring label_3 = message_text.substr(offsets[1], + offsets[2] - offsets[1]); + if (label_3_) { + label_3_->SetText(label_3); + } else { + label_3_ = new views::Label(label_3, font); + label_3_->SetColor(SK_ColorBLACK); + label_3_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); + AddChildView(label_3_); + } + } +} views::MenuButton* TranslateInfoBar::CreateMenuButton(int menu_id, const std::wstring& label) { @@ -427,11 +690,6 @@ views::MenuButton* TranslateInfoBar::CreateMenuButton(int menu_id, return menu_button; } -int TranslateInfoBar::GetAvailableX() const { - return ((label_3_ ? label_3_->bounds().right() : label_2_->bounds().right()) + - InfoBar::kEndOfLabelSpacing); -} - gfx::Point TranslateInfoBar::DetermineMenuPositionAndAlignment( views::MenuButton* menu_button, views::Menu2::Alignment* alignment) { gfx::Rect lb = menu_button->GetLocalBounds(true); @@ -474,133 +732,26 @@ void TranslateInfoBar::OnLanguageModified(views::MenuButton* menu_button, SchedulePaint(); // Clear options menu model so that it'll be created with new language. options_menu_model_.reset(); - if (!before_translate_) + // If necessary, update state and translate. + TranslateInfoBarDelegate::TranslateState state = GetDelegate()->state(); + if (state != TranslateInfoBarDelegate::kTranslating) { + if (state == TranslateInfoBarDelegate::kBeforeTranslate) + UpdateState(TranslateInfoBarDelegate::kTranslating); GetDelegate()->Translate(); -} - -TranslateInfoBarDelegate* TranslateInfoBar::GetDelegate() const { - return static_cast<TranslateInfoBarDelegate*>(delegate()); -} - -// BeforeTranslateInfoBar, public: --------------------------------------------- - -BeforeTranslateInfoBar::BeforeTranslateInfoBar( - BeforeTranslateInfoBarDelegate* delegate) - : TranslateInfoBar(delegate, true, IDS_TRANSLATE_INFOBAR_BEFORE_MESSAGE) { - accept_button_ = new TranslateTextButton(this, IDS_TRANSLATE_INFOBAR_ACCEPT); - AddChildView(accept_button_); - - deny_button_ = new TranslateTextButton(this, IDS_TRANSLATE_INFOBAR_DENY); - AddChildView(deny_button_); -} - -BeforeTranslateInfoBar::~BeforeTranslateInfoBar() { -} - -// BeforeTranslateInfoBar, InfoBar overrides: ---------------------------------- - -int BeforeTranslateInfoBar::GetAvailableWidth() const { - gfx::Size accept_ps = accept_button_->GetPreferredSize(); - gfx::Size deny_ps = deny_button_->GetPreferredSize(); - return (TranslateInfoBar::GetAvailableWidth() - - accept_ps.width() - InfoBar::kEndOfLabelSpacing - - deny_ps.width() - InfoBar::kButtonButtonSpacing); -} - -// BeforeTranslateInfoBar, views::View overrides: ------------------------------ - -void BeforeTranslateInfoBar::Layout() { - // Layout the icon, options menu, language menu and close buttons. - TranslateInfoBar::Layout(); - - // Layout accept button. - gfx::Size accept_ps = accept_button_->GetPreferredSize(); - accept_button_->SetBounds(TranslateInfoBar::GetAvailableX(), - OffsetY(this, accept_ps), accept_ps.width(), accept_ps.height()); - - // Layout deny button. - gfx::Size deny_ps = deny_button_->GetPreferredSize(); - deny_button_->SetBounds( - accept_button_->bounds().right() + InfoBar::kButtonButtonSpacing, - OffsetY(this, deny_ps), deny_ps.width(), deny_ps.height()); -} - -// BeforeTranslateInfoBar, views::ButtonListener overrides: -------------------- - -void BeforeTranslateInfoBar::ButtonPressed( - views::Button* sender, const views::Event& event) { - if (sender == accept_button_) { - // TODO(kuan): If privacy warning box is needed (awaiting PM/UX decision), - // implement it. - GetDelegate()->Translate(); - } else if (sender != deny_button_) { // Let base InfoBar handle close button. - InfoBar::ButtonPressed(sender, event); } - RemoveInfoBar(); -} - -// AfterTranslateInfoBar, public: ---------------------------------------------- - -AfterTranslateInfoBar::AfterTranslateInfoBar( - AfterTranslateInfoBarDelegate* delegate) - : TranslateInfoBar(delegate, false, IDS_TRANSLATE_INFOBAR_AFTER_MESSAGE) { - string16 language_name = TranslateInfoBarDelegate::GetDisplayNameForLocale( - GetDelegate()->target_lang_code()); - target_language_menu_button_ = CreateMenuButton(kMenuIDTargetLanguage, - UTF16ToWideHack(language_name)); - AddChildView(target_language_menu_button_); } -AfterTranslateInfoBar::~AfterTranslateInfoBar() { -} - -// AfterTranslateInfoBar, InfoBar overrides: ---------------------------------- - -int AfterTranslateInfoBar::GetAvailableWidth() const { - gfx::Size target_ps = target_language_menu_button_->GetPreferredSize(); - return (TranslateInfoBar::GetAvailableWidth() - target_ps.width() - - InfoBar::kButtonInLabelSpacing); -} - -// AfterTranslateInfoBar, views::ViewMenuDelegate implementation: -------------- - -void AfterTranslateInfoBar::RunMenu(views::View* source, const gfx::Point& pt) { - if (source->GetID() == kMenuIDTargetLanguage) { - if (!target_language_menu_model_.get()) { - target_language_menu_model_.reset( - new LanguagesMenuModel(this, GetDelegate(), false)); - target_language_menu_menu_.reset( - new views::Menu2(target_language_menu_model_.get())); - } - views::Menu2::Alignment alignment; - gfx::Point menu_position = DetermineMenuPositionAndAlignment( - target_language_menu_button_, &alignment); - target_language_menu_menu_->RunMenuAt(menu_position, alignment); - } else { - TranslateInfoBar::RunMenu(source, pt); - } -} - -// AfterTranslateInfoBar, menus::SimpleMenuModel::Delegate implementation: ----- - -void AfterTranslateInfoBar::ExecuteCommand(int command_id) { - if (command_id >= IDC_TRANSLATE_TARGET_LANGUAGE_BASE) { - OnLanguageModified(target_language_menu_button_, - command_id - IDC_TRANSLATE_TARGET_LANGUAGE_BASE); - } else { - TranslateInfoBar::ExecuteCommand(command_id); - } +inline TranslateInfoBarDelegate* TranslateInfoBar::GetDelegate() const { + return static_cast<TranslateInfoBarDelegate*>(delegate()); } -// BeforeTranslateInfoBarDelegate, InfoBarDelegate overrides: ------------------ - -InfoBar* BeforeTranslateInfoBarDelegate::CreateInfoBar() { - return new BeforeTranslateInfoBar(this); +inline int TranslateInfoBar::GetSpacingAfterFirstLanguageButton() const { + return (GetDelegate()->state() == TranslateInfoBarDelegate::kBeforeTranslate ? + 10 : kButtonInLabelSpacing); } -// AfterTranslateInfoBarDelegate, InfoBarDelegate overrides: ------------------ +// TranslateInfoBarDelegate, InfoBarDelegate overrides: ------------------ -InfoBar* AfterTranslateInfoBarDelegate::CreateInfoBar() { - return new AfterTranslateInfoBar(this); +InfoBar* TranslateInfoBarDelegate::CreateInfoBar() { + return new TranslateInfoBar(this); } - diff --git a/chrome/browser/views/infobars/translate_infobars.h b/chrome/browser/views/infobars/translate_infobars.h index ae355dd..4cc7703 100644 --- a/chrome/browser/views/infobars/translate_infobars.h +++ b/chrome/browser/views/infobars/translate_infobars.h @@ -6,6 +6,7 @@ #define CHROME_BROWSER_VIEWS_INFOBARS_TRANSLATE_INFOBARS_H_ #include "app/menus/simple_menu_model.h" +#include "chrome/common/notification_registrar.h" #include "chrome/browser/translate/translate_infobars_delegates.h" #include "chrome/browser/views/infobars/infobars.h" #include "views/controls/menu/view_menu_delegate.h" @@ -25,12 +26,14 @@ class TranslateTextButton; class TranslateInfoBar : public InfoBar, public views::ViewMenuDelegate, - public menus::SimpleMenuModel::Delegate { + public menus::SimpleMenuModel::Delegate, + public NotificationObserver { public: - TranslateInfoBar(TranslateInfoBarDelegate* delegate, bool before_translate, - int label_id); + explicit TranslateInfoBar(TranslateInfoBarDelegate* delegate); virtual ~TranslateInfoBar(); + void UpdateState(TranslateInfoBarDelegate::TranslateState new_state); + // Overridden from views::View: virtual void Layout(); @@ -44,103 +47,52 @@ class TranslateInfoBar : public InfoBar, menus::Accelerator* accelerator); virtual void ExecuteCommand(int command_id); + // Overridden from NotificationObserver: + virtual void Observe(NotificationType type, + const NotificationSource& source, const NotificationDetails& details); + protected: + // Overridden from InfoBar: + virtual int GetAvailableWidth() const; + + // Overridden from views::ButtonListener: + virtual void ButtonPressed(views::Button* sender, const views::Event& event); + + private: + void CreateLabels(); views::MenuButton* CreateMenuButton(int menu_id, const std::wstring& label); gfx::Point DetermineMenuPositionAndAlignment(views::MenuButton* menu_button, views::Menu2::Alignment* alignment); void OnLanguageModified(views::MenuButton* menu_button, int new_language_index); - TranslateInfoBarDelegate* GetDelegate() const; - - // Overridden from InfoBar: - virtual int GetAvailableWidth() const; + inline int GetSpacingAfterFirstLanguageButton() const; + inline TranslateInfoBarDelegate* GetDelegate() const; - // Returns the leftmost position that subclasses can position their controls. - virtual int GetAvailableX() const; - - virtual views::MenuButton* target_language_menu_button() const { - return NULL; - } - - virtual int GetSpacingAfterFirstLanguageButton() const { - return InfoBar::kButtonInLabelSpacing; - } - - private: - bool before_translate_; views::ImageView* icon_; views::Label* label_1_; views::Label* label_2_; views::Label* label_3_; + views::Label* translating_label_; + TranslateTextButton* accept_button_; + TranslateTextButton* deny_button_; views::MenuButton* original_language_menu_button_; + views::MenuButton* target_language_menu_button_; views::MenuButton* options_menu_button_; scoped_ptr<LanguagesMenuModel> original_language_menu_model_; + scoped_ptr<LanguagesMenuModel> target_language_menu_model_; scoped_ptr<OptionsMenuModel> options_menu_model_; scoped_ptr<views::Menu2> original_language_menu_menu_; + scoped_ptr<views::Menu2> target_language_menu_menu_; scoped_ptr<views::Menu2> options_menu_menu_; // This is true if language placeholders in label have been swapped. bool swapped_language_placeholders_; - DISALLOW_COPY_AND_ASSIGN(TranslateInfoBar); -}; - -class BeforeTranslateInfoBar : public TranslateInfoBar { - public: - explicit BeforeTranslateInfoBar(BeforeTranslateInfoBarDelegate* delegate); - virtual ~BeforeTranslateInfoBar(); - - // Overridden from views::View: - virtual void Layout(); - - protected: - // Overridden from views::ButtonListener: - virtual void ButtonPressed(views::Button* sender, const views::Event& event); + NotificationRegistrar notification_registrar_; - // Overriden from TranslateInfoBar: - virtual int GetSpacingAfterFirstLanguageButton() const { - return 10; - } - - // Overridden from InfoBar: - virtual int GetAvailableWidth() const; - - private: - TranslateTextButton* accept_button_; - TranslateTextButton* deny_button_; - - DISALLOW_COPY_AND_ASSIGN(BeforeTranslateInfoBar); -}; - -class AfterTranslateInfoBar : public TranslateInfoBar { - public: - explicit AfterTranslateInfoBar(AfterTranslateInfoBarDelegate* delegate); - virtual ~AfterTranslateInfoBar(); - - // Overridden from views::MenuDelegate: - virtual void RunMenu(views::View* source, const gfx::Point& pt); - - // Overridden from menus::SimpleMenuModel::Delegate: - virtual void ExecuteCommand(int command_id); - - protected: - // Overridden from InfoBar: - virtual int GetAvailableWidth() const; - - virtual views::MenuButton* target_language_menu_button() const { - return target_language_menu_button_; - } - - private: - views::MenuButton* target_language_menu_button_; - - scoped_ptr<LanguagesMenuModel> target_language_menu_model_; - - scoped_ptr<views::Menu2> target_language_menu_menu_; - - DISALLOW_COPY_AND_ASSIGN(AfterTranslateInfoBar); + DISALLOW_COPY_AND_ASSIGN(TranslateInfoBar); }; #endif // CHROME_BROWSER_VIEWS_INFOBARS_TRANSLATE_INFOBARS_H_ |