summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/app/generated_resources.grd3
-rw-r--r--chrome/browser/translate/options_menu_model.cc7
-rw-r--r--chrome/browser/translate/options_menu_model.h8
-rw-r--r--chrome/browser/translate/translate_infobars_delegates.cc197
-rw-r--r--chrome/browser/translate/translate_infobars_delegates.h94
-rw-r--r--chrome/browser/translate/translate_manager.cc32
-rw-r--r--chrome/browser/views/infobars/infobars.cc4
-rw-r--r--chrome/browser/views/infobars/translate_infobars.cc555
-rw-r--r--chrome/browser/views/infobars/translate_infobars.h104
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_