diff options
author | robertshield@chromium.org <robertshield@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-22 16:59:52 +0000 |
---|---|---|
committer | robertshield@chromium.org <robertshield@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-22 16:59:52 +0000 |
commit | 07539ee525bdb2ee619d0f571ffdc492aff54f0f (patch) | |
tree | 93f6174b2421f4e3853538704030a6cd80a1dae6 | |
parent | 0e623c188f818c9bf61356a1043b2b709669ccde (diff) | |
download | chromium_src-07539ee525bdb2ee619d0f571ffdc492aff54f0f.zip chromium_src-07539ee525bdb2ee619d0f571ffdc492aff54f0f.tar.gz chromium_src-07539ee525bdb2ee619d0f571ffdc492aff54f0f.tar.bz2 |
Revert 50465 - Porting the infobars on Linux to the new TranslateInfobarDelegate2.
Each translate infobar is now its own class and most of the logic is in the delegate.
BUG=40828
TEST=Thoroughly test the translate feature on Linux.
Review URL: http://codereview.chromium.org/2867017
TBR=jcivelli@chromium.org
Review URL: http://codereview.chromium.org/2870019
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@50468 0039d316-1c4b-4281-b951-d872f2087c98
16 files changed, 881 insertions, 721 deletions
diff --git a/chrome/browser/browser_main.cc b/chrome/browser/browser_main.cc index ece80db..29016d6 100644 --- a/chrome/browser/browser_main.cc +++ b/chrome/browser/browser_main.cc @@ -56,10 +56,10 @@ #include "chrome/browser/search_engines/template_url_model.h" #include "chrome/browser/search_engines/template_url_prepopulate_data.h" #include "chrome/browser/shell_integration.h" -#if defined(OS_WIN) || defined(OS_LINUX) -#include "chrome/browser/translate/translate_manager2.h" -#else +#if !defined(OS_WIN) #include "chrome/browser/translate/translate_manager.h" +#else +#include "chrome/browser/translate/translate_manager2.h" #endif #include "chrome/common/chrome_constants.h" #include "chrome/common/chrome_paths.h" @@ -1210,7 +1210,7 @@ int BrowserMain(const MainFunctionParams& parameters) { return ResultCodes::MACHINE_LEVEL_INSTALL_EXISTS; // Create the TranslateManager singleton. -#if defined(OS_WIN) || defined(OS_LINUX) +#if defined(OS_WIN) Singleton<TranslateManager2>::get(); #else Singleton<TranslateManager>::get(); diff --git a/chrome/browser/gtk/translate/after_translate_infobar_gtk.cc b/chrome/browser/gtk/translate/after_translate_infobar_gtk.cc deleted file mode 100644 index 1fab560..0000000 --- a/chrome/browser/gtk/translate/after_translate_infobar_gtk.cc +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/gtk/translate/after_translate_infobar_gtk.h" - -#include "app/l10n_util.h" -#include "base/message_loop.h" -#include "base/utf_string_conversions.h" -#include "chrome/browser/gtk/gtk_util.h" -#include "chrome/browser/translate/translate_infobar_delegate2.h" -#include "grit/generated_resources.h" - -AfterTranslateInfoBar::AfterTranslateInfoBar( - TranslateInfoBarDelegate2* delegate) - : TranslateInfoBarBase(delegate), - ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) { -} - -AfterTranslateInfoBar::~AfterTranslateInfoBar() { -} - -void AfterTranslateInfoBar::Init() { - TranslateInfoBarBase::Init(); - - bool swapped_language_combos = false; - std::vector<string16> strings; - TranslateInfoBarDelegate2::GetAfterTranslateStrings( - &strings, &swapped_language_combos); - DCHECK(strings.size() == 3U); - - GtkWidget* hbox = gtk_hbox_new(FALSE, gtk_util::kControlSpacing); - gtk_util::CenterWidgetInHBox(hbox_, hbox, false, 0); - - GtkWidget* original_lang_combo = - CreateLanguageCombobox(GetDelegate()->original_language_index(), - GetDelegate()->target_language_index()); - g_signal_connect(original_lang_combo, "changed", - G_CALLBACK(&OnOriginalLanguageModifiedThunk), this); - GtkWidget* target_lang_combo = - CreateLanguageCombobox(GetDelegate()->target_language_index(), - GetDelegate()->original_language_index()); - g_signal_connect(target_lang_combo, "changed", - G_CALLBACK(&OnTargetLanguageModifiedThunk), this); - - gtk_box_pack_start(GTK_BOX(hbox), CreateLabel(UTF16ToUTF8(strings[0])), - FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(hbox), - swapped_language_combos ? target_lang_combo : - original_lang_combo, - FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(hbox), CreateLabel(UTF16ToUTF8(strings[1])), - FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(hbox), - swapped_language_combos ? original_lang_combo : - target_lang_combo, - FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(hbox), CreateLabel(UTF16ToUTF8(strings[2])), - FALSE, FALSE, 0); - - GtkWidget* button = gtk_button_new_with_label( - l10n_util::GetStringUTF8(IDS_TRANSLATE_INFOBAR_REVERT).c_str()); - g_signal_connect(button, "clicked",G_CALLBACK(&OnRevertPressedThunk), this); - gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); - - gtk_widget_show_all(border_bin_.get()); -} - -void AfterTranslateInfoBar::OnOriginalLanguageModified(GtkWidget* sender) { - int index = GetLanguageComboboxActiveId(GTK_COMBO_BOX(sender)); - if (index == GetDelegate()->original_language_index()) - return; - - // Setting the language will lead to a new translation that is going to close - // the infobar. This is not OK to do this from the signal handler, so we'll - // defer it. - MessageLoop::current()->PostTask(FROM_HERE, method_factory_.NewRunnableMethod( - &AfterTranslateInfoBar::SetOriginalLanguage, index)); -} - -void AfterTranslateInfoBar::OnTargetLanguageModified(GtkWidget* sender) { - int index = GetLanguageComboboxActiveId(GTK_COMBO_BOX(sender)); - if (index == GetDelegate()->target_language_index()) - return; - - // See comment in OnOriginalLanguageModified on why we use a task. - MessageLoop::current()->PostTask(FROM_HERE, method_factory_.NewRunnableMethod( - &AfterTranslateInfoBar::SetTargetLanguage, index)); -} - -void AfterTranslateInfoBar::OnRevertPressed(GtkWidget* sender) { - GetDelegate()->RevertTranslation(); -} - -void AfterTranslateInfoBar::SetOriginalLanguage(int language_index) { - GetDelegate()->SetOriginalLanguage(language_index); -} - -void AfterTranslateInfoBar::SetTargetLanguage(int language_index) { - GetDelegate()->SetTargetLanguage(language_index); -} diff --git a/chrome/browser/gtk/translate/after_translate_infobar_gtk.h b/chrome/browser/gtk/translate/after_translate_infobar_gtk.h deleted file mode 100644 index 576b023..0000000 --- a/chrome/browser/gtk/translate/after_translate_infobar_gtk.h +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_GTK_TRANSLATE_AFTER_TRANSLATE_INFOBAR_GTK_H_ -#define CHROME_BROWSER_GTK_TRANSLATE_AFTER_TRANSLATE_INFOBAR_GTK_H_ - -#include "base/task.h" -#include "chrome/browser/gtk/translate/translate_infobar_base_gtk.h" - -class TranslateInfoBarDelegate2; - -class AfterTranslateInfoBar : public TranslateInfoBarBase { - public: - explicit AfterTranslateInfoBar(TranslateInfoBarDelegate2* delegate); - virtual ~AfterTranslateInfoBar(); - - // Overridden from TranslateInfoBarBase: - virtual void Init(); - - protected: - virtual bool ShowOptionsMenuButton() const { return true; } - - private: - CHROMEGTK_CALLBACK_0(AfterTranslateInfoBar, void, OnOriginalLanguageModified); - CHROMEGTK_CALLBACK_0(AfterTranslateInfoBar, void, OnTargetLanguageModified); - CHROMEGTK_CALLBACK_0(AfterTranslateInfoBar, void, OnRevertPressed); - - // These methods set the original/target language on the - // TranslateInfobarDelegate. - void SetOriginalLanguage(int language_index); - void SetTargetLanguage(int language_index); - - ScopedRunnableMethodFactory<AfterTranslateInfoBar> method_factory_; - - DISALLOW_COPY_AND_ASSIGN(AfterTranslateInfoBar); -}; - -#endif // CHROME_BROWSER_GTK_TRANSLATE_AFTER_TRANSLATE_INFOBAR_GTK_H_ diff --git a/chrome/browser/gtk/translate/before_translate_infobar_gtk.cc b/chrome/browser/gtk/translate/before_translate_infobar_gtk.cc deleted file mode 100644 index 53b9773..0000000 --- a/chrome/browser/gtk/translate/before_translate_infobar_gtk.cc +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/gtk/translate/before_translate_infobar_gtk.h" - -#include "app/l10n_util.h" -#include "base/utf_string_conversions.h" -#include "chrome/browser/gtk/gtk_util.h" -#include "chrome/browser/translate/translate_infobar_delegate2.h" -#include "grit/generated_resources.h" - -BeforeTranslateInfoBar::BeforeTranslateInfoBar( - TranslateInfoBarDelegate2* delegate) - : TranslateInfoBarBase(delegate) { -} - -BeforeTranslateInfoBar::~BeforeTranslateInfoBar() { -} - -void BeforeTranslateInfoBar::Init() { - TranslateInfoBarBase::Init(); - - GtkWidget* hbox = gtk_hbox_new(FALSE, gtk_util::kControlSpacing); - gtk_util::CenterWidgetInHBox(hbox_, hbox, false, 0); - size_t offset = 0; - string16 text = - l10n_util::GetStringFUTF16(IDS_TRANSLATE_INFOBAR_BEFORE_MESSAGE, - string16(), &offset); - - gtk_box_pack_start(GTK_BOX(hbox), - CreateLabel(UTF16ToUTF8(text.substr(0, offset))), - FALSE, FALSE, 0); - GtkWidget* combobox = - CreateLanguageCombobox(GetDelegate()->original_language_index(), - GetDelegate()->target_language_index()); - g_signal_connect(combobox, "changed", - G_CALLBACK(&OnLanguageModifiedThunk), this); - gtk_box_pack_start(GTK_BOX(hbox), combobox, FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(hbox), - CreateLabel(UTF16ToUTF8(text.substr(offset))), - FALSE, FALSE, 0); - - GtkWidget* button = gtk_button_new_with_label( - l10n_util::GetStringUTF8(IDS_TRANSLATE_INFOBAR_ACCEPT).c_str()); - g_signal_connect(button, "clicked",G_CALLBACK(&OnAcceptPressedThunk), this); - gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); - - button = gtk_button_new_with_label( - l10n_util::GetStringUTF8(IDS_TRANSLATE_INFOBAR_DENY).c_str()); - g_signal_connect(button, "clicked",G_CALLBACK(&OnDenyPressedThunk), this); - gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); - - gtk_widget_show_all(border_bin_.get()); -} - -void BeforeTranslateInfoBar::OnLanguageModified(GtkWidget* sender) { - int index = GetLanguageComboboxActiveId(GTK_COMBO_BOX(sender)); - if (index == GetDelegate()->original_language_index()) - return; - - GetDelegate()->SetOriginalLanguage(index); -} - -void BeforeTranslateInfoBar::OnAcceptPressed(GtkWidget* sender) { - GetDelegate()->Translate(); -} - -void BeforeTranslateInfoBar::OnDenyPressed(GtkWidget* sender) { - RemoveInfoBar(); -} diff --git a/chrome/browser/gtk/translate/before_translate_infobar_gtk.h b/chrome/browser/gtk/translate/before_translate_infobar_gtk.h deleted file mode 100644 index f31c529..0000000 --- a/chrome/browser/gtk/translate/before_translate_infobar_gtk.h +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_GTK_TRANSLATE_BEFORE_TRANSLATE_INFOBAR_GTK_H_ -#define CHROME_BROWSER_GTK_TRANSLATE_BEFORE_TRANSLATE_INFOBAR_GTK_H_ - -#include "chrome/browser/gtk/translate/translate_infobar_base_gtk.h" - -class TranslateInfoBarDelegate2; - -class BeforeTranslateInfoBar : public TranslateInfoBarBase { - public: - explicit BeforeTranslateInfoBar(TranslateInfoBarDelegate2* delegate); - virtual ~BeforeTranslateInfoBar(); - - // Overridden from TranslateInfoBarBase: - virtual void Init(); - - protected: - virtual bool ShowOptionsMenuButton() const { return true; } - - private: - CHROMEGTK_CALLBACK_0(BeforeTranslateInfoBar, void, OnLanguageModified); - CHROMEGTK_CALLBACK_0(BeforeTranslateInfoBar, void, OnAcceptPressed); - CHROMEGTK_CALLBACK_0(BeforeTranslateInfoBar, void, OnDenyPressed); - - DISALLOW_COPY_AND_ASSIGN(BeforeTranslateInfoBar); -}; - -#endif // CHROME_BROWSER_GTK_TRANSLATE_BEFORE_TRANSLATE_INFOBAR_GTK_H_ diff --git a/chrome/browser/gtk/translate/translate_infobar_base_gtk.cc b/chrome/browser/gtk/translate/translate_infobar_base_gtk.cc deleted file mode 100644 index a2d46e0..0000000 --- a/chrome/browser/gtk/translate/translate_infobar_base_gtk.cc +++ /dev/null @@ -1,237 +0,0 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/gtk/translate/translate_infobar_base_gtk.h" - -#include "app/l10n_util.h" -#include "app/resource_bundle.h" -#include "app/slide_animation.h" -#include "base/utf_string_conversions.h" -#include "chrome/browser/translate/options_menu_model2.h" -#include "chrome/browser/translate/translate_infobar_delegate2.h" -#include "chrome/browser/gtk/translate/after_translate_infobar_gtk.h" -#include "chrome/browser/gtk/translate/before_translate_infobar_gtk.h" -#include "chrome/browser/gtk/translate/translate_message_infobar_gtk.h" -#include "chrome/browser/gtk/gtk_util.h" -#include "chrome/browser/gtk/menu_gtk.h" -#include "gfx/canvas.h" -#include "gfx/gtk_util.h" -#include "grit/generated_resources.h" - -namespace { - -// To be able to map from language id <-> entry in the combo box, we -// store the language id in the combo box data model in addition to the -// displayed name. -enum { - LANGUAGE_COMBO_COLUMN_ID, - LANGUAGE_COMBO_COLUMN_NAME, - LANGUAGE_COMBO_COLUMN_COUNT -}; - -} // namespace - -TranslateInfoBarBase::TranslateInfoBarBase(TranslateInfoBarDelegate2* delegate) - : InfoBar(delegate) { - TranslateInfoBarDelegate2::BackgroundAnimationType animation = - delegate->background_animation_type(); - if (animation != TranslateInfoBarDelegate2::NONE) { - background_color_animation_.reset(new SlideAnimation(this)); - background_color_animation_->SetTweenType(Tween::LINEAR); - background_color_animation_->SetSlideDuration(500); - if (animation == TranslateInfoBarDelegate2::NORMAL_TO_ERROR) { - background_color_animation_->Show(); - } else { - DCHECK_EQ(TranslateInfoBarDelegate2::ERROR_TO_NORMAL, animation); - // Hide() runs the animation in reverse. - background_color_animation_->Reset(1.0); - background_color_animation_->Hide(); - } - } -} - -TranslateInfoBarBase::~TranslateInfoBarBase() { -} - -void TranslateInfoBarBase::Init() { - if (!ShowOptionsMenuButton()) - return; - - // The options button sits outside the translate_box so that it can be end - // packed in hbox_. - GtkWidget* options_menu_button = BuildOptionsMenuButton(); - g_signal_connect(options_menu_button, "clicked", - G_CALLBACK(&OnOptionsClickedThunk), this); - gtk_widget_show_all(options_menu_button); - gtk_util::CenterWidgetInHBox(hbox_, options_menu_button, true, 0); -} - -void TranslateInfoBarBase::GetTopColor(InfoBarDelegate::Type type, - double* r, double* g, double *b) { - if (background_error_percent_ <= 0) { - InfoBar::GetTopColor(InfoBarDelegate::PAGE_ACTION_TYPE, r, g, b); - } else if (background_error_percent_ >= 1) { - InfoBar::GetTopColor(InfoBarDelegate::ERROR_TYPE, r, g, b); - } else { - double normal_r, normal_g, normal_b; - InfoBar::GetTopColor(InfoBarDelegate::PAGE_ACTION_TYPE, - &normal_r, &normal_g, &normal_b); - - double error_r, error_g, error_b; - InfoBar::GetTopColor(InfoBarDelegate::ERROR_TYPE, - &error_r, &error_g, &error_b); - - double offset_r = error_r - normal_r; - double offset_g = error_g - normal_g; - double offset_b = error_b - normal_b; - - *r = normal_r + (background_error_percent_ * offset_r); - *g = normal_g + (background_error_percent_ * offset_g); - *b = normal_b + (background_error_percent_ * offset_b); - } -} - -void TranslateInfoBarBase::GetBottomColor(InfoBarDelegate::Type type, - double* r, double* g, double *b) { - if (background_error_percent_ <= 0) { - InfoBar::GetBottomColor(InfoBarDelegate::PAGE_ACTION_TYPE, r, g, b); - } else if (background_error_percent_ >= 1) { - InfoBar::GetBottomColor(InfoBarDelegate::ERROR_TYPE, r, g, b); - } else { - double normal_r, normal_g, normal_b; - InfoBar::GetBottomColor(InfoBarDelegate::PAGE_ACTION_TYPE, - &normal_r, &normal_g, &normal_b); - - double error_r, error_g, error_b; - InfoBar::GetBottomColor(InfoBarDelegate::ERROR_TYPE, - &error_r, &error_g, &error_b); - - double offset_r = error_r - normal_r; - double offset_g = error_g - normal_g; - double offset_b = error_b - normal_b; - - *r = normal_r + (background_error_percent_ * offset_r); - *g = normal_g + (background_error_percent_ * offset_g); - *b = normal_b + (background_error_percent_ * offset_b); - } -} - -void TranslateInfoBarBase::AnimationProgressed(const Animation* animation) { - DCHECK(animation == background_color_animation_.get()); - background_error_percent_ = animation->GetCurrentValue(); - // Queue the info bar widget for redisplay so it repaints its background. - gtk_widget_queue_draw(widget()); -} - -GtkWidget* TranslateInfoBarBase::CreateLabel(const std::string& text) { - GtkWidget* label = gtk_label_new(text.c_str()); - gtk_widget_modify_fg(label, GTK_STATE_NORMAL, &gfx::kGdkBlack); - return label; -} - -GtkWidget* TranslateInfoBarBase::CreateLanguageCombobox(int selected_language, - int exclude_language) { - GtkListStore* model = gtk_list_store_new(LANGUAGE_COMBO_COLUMN_COUNT, - G_TYPE_INT, G_TYPE_STRING); - bool set_selection = false; - GtkTreeIter selected_iter; - TranslateInfoBarDelegate2* delegate = GetDelegate(); - for (int i = 0; i < delegate->GetLanguageCount(); ++i) { - if (i == exclude_language) - continue; - GtkTreeIter tree_iter; - const string16& name = delegate->GetLanguageDisplayableNameAt(i); - - gtk_list_store_append(model, &tree_iter); - gtk_list_store_set(model, &tree_iter, - LANGUAGE_COMBO_COLUMN_ID, i, - LANGUAGE_COMBO_COLUMN_NAME, UTF16ToUTF8(name).c_str(), - -1); - if (i == selected_language) { - selected_iter = tree_iter; - set_selection = true; - } - } - - GtkWidget* combobox = gtk_combo_box_new_with_model(GTK_TREE_MODEL(model)); - if (set_selection) - gtk_combo_box_set_active_iter(GTK_COMBO_BOX(combobox), &selected_iter); - g_object_unref(model); - GtkCellRenderer* renderer = gtk_cell_renderer_text_new(); - gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combobox), renderer, TRUE); - gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(combobox), renderer, - "text", LANGUAGE_COMBO_COLUMN_NAME, - NULL); - return combobox; -} - -// static -int TranslateInfoBarBase::GetLanguageComboboxActiveId(GtkComboBox* combo) { - GtkTreeIter iter; - if (!gtk_combo_box_get_active_iter(combo, &iter)) - return 0; - - gint id = 0; - gtk_tree_model_get(gtk_combo_box_get_model(combo), &iter, - LANGUAGE_COMBO_COLUMN_ID, &id, - -1); - return id; -} - -TranslateInfoBarDelegate2* TranslateInfoBarBase::GetDelegate() const { - return static_cast<TranslateInfoBarDelegate2*>(delegate()); -} - -// static -GtkWidget* TranslateInfoBarBase::BuildOptionsMenuButton() { - GtkWidget* button = gtk_button_new(); - GtkWidget* former_child = gtk_bin_get_child(GTK_BIN(button)); - if (former_child) - gtk_container_remove(GTK_CONTAINER(button), former_child); - - GtkWidget* hbox = gtk_hbox_new(FALSE, 0); - - GtkWidget* label = gtk_label_new( - l10n_util::GetStringUTF8(IDS_TRANSLATE_INFOBAR_OPTIONS).c_str()); - gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); - - GtkWidget* arrow = gtk_arrow_new(GTK_ARROW_DOWN, GTK_SHADOW_NONE); - gtk_box_pack_start(GTK_BOX(hbox), arrow, FALSE, FALSE, 0); - - gtk_container_add(GTK_CONTAINER(button), hbox); - - return button; -} - -void TranslateInfoBarBase::OnOptionsClicked(GtkWidget* sender) { - if (!options_menu_model_.get()) { - options_menu_model_.reset(new OptionsMenuModel2(GetDelegate())); - options_menu_menu_.reset(new MenuGtk(NULL, options_menu_model_.get())); - } - options_menu_menu_->Popup(sender, 1, gtk_get_current_event_time()); -} - -// TranslateInfoBarDelegate specific method: -InfoBar* TranslateInfoBarDelegate2::CreateInfoBar() { - TranslateInfoBarBase* infobar = NULL; - switch (type_) { - case BEFORE_TRANSLATE: - infobar = new BeforeTranslateInfoBar(this); - break; - case AFTER_TRANSLATE: - infobar = new AfterTranslateInfoBar(this); - break; - case TRANSLATING: - case TRANSLATION_ERROR: - infobar = new TranslateMessageInfoBar(this); - break; - default: - NOTREACHED(); - } - infobar->Init(); - // Set |infobar_view_| so that the model can notify the infobar when it - // changes. - infobar_view_ = infobar; - return infobar; -} diff --git a/chrome/browser/gtk/translate/translate_infobar_base_gtk.h b/chrome/browser/gtk/translate/translate_infobar_base_gtk.h deleted file mode 100644 index f2911f6..0000000 --- a/chrome/browser/gtk/translate/translate_infobar_base_gtk.h +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_GTK_TRANSLATE_TRANSLATE_INFOBAR_BASE_GTK_H_ -#define CHROME_BROWSER_GTK_TRANSLATE_TRANSLATE_INFOBAR_BASE_GTK_H_ - -#include "chrome/browser/translate/translate_infobar_view.h" -#include "chrome/browser/gtk/infobar_gtk.h" - -class MenuGtk; -class OptionsMenuModel2; -class TranslateInfoBarDelegate2; - -// This class contains some of the base functionality that translate infobars -// use. -class TranslateInfoBarBase : public TranslateInfoBarView, - public InfoBar, - public AnimationDelegate { - public: - explicit TranslateInfoBarBase(TranslateInfoBarDelegate2* delegate); - virtual ~TranslateInfoBarBase(); - - // Initializes the infobar widgets. Should be called after the object has been - // created. - virtual void Init(); - - // Overridden from InfoBar: - virtual void GetTopColor(InfoBarDelegate::Type type, - double* r, double* g, double *b); - virtual void GetBottomColor(InfoBarDelegate::Type type, - double* r, double* g, double *b); - - // Overridden from TranslateInfoBarView: - virtual void OriginalLanguageChanged() {} - virtual void TargetLanguageChanged() {} - - // Overridden from AnimationDelegate: - virtual void AnimationProgressed(const Animation* animation); - - protected: - // Sub-classes that want to have the options menu button showing sould - // override and return true. - virtual bool ShowOptionsMenuButton() const { return false; } - - // Creates a label with the appropriate font and color for the translate - // infobars. - GtkWidget* CreateLabel(const std::string& text); - - // Creates a combobox that displays the languages currently available. - // |selected_language| is the language index (as used in the - // TranslateInfoDelegate) that should be selected initially. - // |exclude_language| is the language index of the language that should not be - // included in the list (-1 means no language excluded). - GtkWidget* CreateLanguageCombobox(int selected_language, - int exclude_language); - - // Given an above-constructed combobox, returns the currently selected - // language id. - static int GetLanguageComboboxActiveId(GtkComboBox* combo); - - // Convenience to retrieve the TranslateInfoBarDelegate2 for this infobar. - TranslateInfoBarDelegate2* GetDelegate() const; - - private: - // Builds a button with an arrow in it to emulate the menu-button style from - // the windows version. - static GtkWidget* BuildOptionsMenuButton(); - - // The menu displayed when the Options button is pressed. - scoped_ptr<OptionsMenuModel2> options_menu_model_; - scoped_ptr<MenuGtk> options_menu_menu_; - - CHROMEGTK_CALLBACK_0(TranslateInfoBarBase, void, OnOptionsClicked); - - // A percentage to average the normal page action background with the error - // background. When 0, the infobar background should be pure PAGE_ACTION_TYPE. - // When 1, the infobar background should be pure ERROR_TYPE. - double background_error_percent_; - - // Changes the color of the background from normal to error color and back. - scoped_ptr<SlideAnimation> background_color_animation_; - - DISALLOW_COPY_AND_ASSIGN(TranslateInfoBarBase); -}; - -#endif // CHROME_BROWSER_GTK_TRANSLATE_TRANSLATE_INFOBAR_BASE_GTK_H_ diff --git a/chrome/browser/gtk/translate/translate_message_infobar_gtk.cc b/chrome/browser/gtk/translate/translate_message_infobar_gtk.cc deleted file mode 100644 index 3a5b828..0000000 --- a/chrome/browser/gtk/translate/translate_message_infobar_gtk.cc +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/gtk/translate/translate_message_infobar_gtk.h" - -#include "base/utf_string_conversions.h" -#include "chrome/browser/gtk/gtk_util.h" -#include "chrome/browser/translate/translate_infobar_delegate2.h" - -TranslateMessageInfoBar::TranslateMessageInfoBar( - TranslateInfoBarDelegate2* delegate) - : TranslateInfoBarBase(delegate) { -} - -TranslateMessageInfoBar::~TranslateMessageInfoBar() { -} - -void TranslateMessageInfoBar::Init() { - TranslateInfoBarBase::Init(); - - GtkWidget* hbox = gtk_hbox_new(FALSE, gtk_util::kControlSpacing); - gtk_util::CenterWidgetInHBox(hbox_, hbox, false, 0); - - std::string text = UTF16ToUTF8(GetDelegate()->GetMessageInfoBarText()); - gtk_box_pack_start(GTK_BOX(hbox), CreateLabel(text.c_str()), FALSE, FALSE, 0); - string16 button_text = GetDelegate()->GetMessageInfoBarButtonText(); - if (!button_text.empty()) { - GtkWidget* button = - gtk_button_new_with_label(UTF16ToUTF8(button_text).c_str()); - g_signal_connect(button, "clicked",G_CALLBACK(&OnButtonPressedThunk), this); - gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); - } - - gtk_widget_show_all(border_bin_.get()); -} - -void TranslateMessageInfoBar::OnButtonPressed(GtkWidget* sender) { - GetDelegate()->MessageInfoBarButtonPressed(); -} diff --git a/chrome/browser/gtk/translate/translate_message_infobar_gtk.h b/chrome/browser/gtk/translate/translate_message_infobar_gtk.h deleted file mode 100644 index f0e70a3..0000000 --- a/chrome/browser/gtk/translate/translate_message_infobar_gtk.h +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_GTK_TRANSLATE_TRANSLATE_MESSAGE_INFOBAR_GTK_H_ -#define CHROME_BROWSER_GTK_TRANSLATE_TRANSLATE_MESSAGE_INFOBAR_GTK_H_ - -#include "chrome/browser/gtk/translate/translate_infobar_base_gtk.h" - -class TranslateInfoBarDelegate2; - -class TranslateMessageInfoBar : public TranslateInfoBarBase { - public: - explicit TranslateMessageInfoBar(TranslateInfoBarDelegate2* delegate); - virtual ~TranslateMessageInfoBar(); - - // Overridden from TranslateInfoBarBase: - virtual void Init(); - - private: - CHROMEGTK_CALLBACK_0(TranslateMessageInfoBar, void, OnButtonPressed); - - DISALLOW_COPY_AND_ASSIGN(TranslateMessageInfoBar); -}; - -#endif // CHROME_BROWSER_GTK_TRANSLATE_TRANSLATE_MESSAGE_INFOBAR_GTK_H_ diff --git a/chrome/browser/gtk/translate_infobars.cc b/chrome/browser/gtk/translate_infobars.cc new file mode 100644 index 0000000..d85a7f5 --- /dev/null +++ b/chrome/browser/gtk/translate_infobars.cc @@ -0,0 +1,586 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/gtk/translate_infobars.h" + +#include <string> +#include <vector> + +#include "app/l10n_util.h" +#include "app/slide_animation.h" +#include "base/utf_string_conversions.h" +#include "chrome/app/chrome_dll_resource.h" +#include "chrome/browser/browser_process.h" +#include "chrome/browser/gtk/gtk_util.h" +#include "chrome/browser/gtk/menu_gtk.h" +#include "chrome/browser/tab_contents/tab_contents.h" +#include "chrome/browser/translate/translate_infobars_delegates.h" +#include "chrome/browser/translate/options_menu_model.h" +#include "chrome/browser/translate/page_translated_details.h" +#include "chrome/common/notification_service.h" +#include "gfx/gtk_util.h" +#include "grit/app_resources.h" +#include "grit/generated_resources.h" +#include "grit/locale_settings.h" +#include "grit/theme_resources.h" + +namespace { + +// Reorders the widgets in the NULL terminated array |widgets| that are all +// children of |box|. +void ReorderWidgetsTo(GtkWidget* box, GtkWidget** widgets) { + for (int count = 0; *widgets != NULL; widgets++) { + gtk_box_reorder_child(GTK_BOX(box), *widgets, count++); + gtk_widget_show_all(*widgets); + } +} + +// To be able to map from language id <-> entry in the combo box, we +// store the language id in the combo box data model in addition to the +// displayed name. +enum { + LANGUAGE_COMBO_COLUMN_ID, + LANGUAGE_COMBO_COLUMN_NAME, + LANGUAGE_COMBO_COLUMN_COUNT +}; + +// Creates a combobox set up to display text from a list of language codes +// (translating the codes into the display string). +GtkWidget* BuildLanguageComboboxFrom( + TranslateInfoBarDelegate* delegate, + const std::vector<std::string>& languages) { + std::map<string16, int> language_id_map; + std::vector<string16> display_languages; + for (size_t i = 0; i < languages.size(); ++i) { + string16 name = delegate->GetDisplayNameForLocale(languages[i]); + display_languages.push_back(name); + language_id_map[name] = i; + } + + l10n_util::SortStrings16(g_browser_process->GetApplicationLocale(), + &display_languages); + + // Note: be sure this model matches the LANGUAGE_COMBO enum above. + GtkListStore* model = gtk_list_store_new(LANGUAGE_COMBO_COLUMN_COUNT, + G_TYPE_INT, G_TYPE_STRING); + for (size_t i = 0; i < display_languages.size(); ++i) { + GtkTreeIter tree_iter; + const string16& name = display_languages[i]; + gtk_list_store_append(model, &tree_iter); + gtk_list_store_set(model, &tree_iter, + LANGUAGE_COMBO_COLUMN_ID, language_id_map[name], + LANGUAGE_COMBO_COLUMN_NAME, UTF16ToUTF8(name).c_str(), + -1); + } + + GtkWidget* combobox = gtk_combo_box_new_with_model(GTK_TREE_MODEL(model)); + g_object_unref(model); + GtkCellRenderer* renderer = gtk_cell_renderer_text_new(); + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combobox), renderer, TRUE); + gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(combobox), renderer, + "text", LANGUAGE_COMBO_COLUMN_NAME, + NULL); + + return combobox; +} + +// Given an above-constructed combo box, grab the currently-selected +// language id. +int GetLanguageComboboxActiveId(GtkComboBox* combo) { + GtkTreeIter iter; + if (!gtk_combo_box_get_active_iter(combo, &iter)) + return 0; + + gint id = 0; + gtk_tree_model_get(gtk_combo_box_get_model(combo), &iter, + LANGUAGE_COMBO_COLUMN_ID, &id, + -1); + return id; +} + +// Given an above-constructed combo box, select the row corresponding +// to a given language id. +void SetLanguageComboboxActiveId(GtkComboBox* combo, int target) { + GtkTreeModel* model = gtk_combo_box_get_model(combo); + GtkTreeIter iter; + gtk_tree_model_get_iter_first(model, &iter); + do { + gint id; + gtk_tree_model_get(model, &iter, + LANGUAGE_COMBO_COLUMN_ID, &id, + -1); + if (id == target) { + gtk_combo_box_set_active_iter(combo, &iter); + return; + } + } while (gtk_tree_model_iter_next(model, &iter)); +} + +// Builds a button with an arrow in it to emulate the menu-button style from +// the windows version. +GtkWidget* BuildOptionsMenuButton() { + GtkWidget* button = gtk_button_new(); + GtkWidget* former_child = gtk_bin_get_child(GTK_BIN(button)); + if (former_child) + gtk_container_remove(GTK_CONTAINER(button), former_child); + + GtkWidget* hbox = gtk_hbox_new(FALSE, 0); + + GtkWidget* label = gtk_label_new( + l10n_util::GetStringUTF8(IDS_TRANSLATE_INFOBAR_OPTIONS).c_str()); + gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); + + GtkWidget* arrow = gtk_arrow_new(GTK_ARROW_DOWN, GTK_SHADOW_NONE); + gtk_box_pack_start(GTK_BOX(hbox), arrow, FALSE, FALSE, 0); + + gtk_container_add(GTK_CONTAINER(button), hbox); + + return button; +} + +} // namespace + +TranslateInfoBar::TranslateInfoBar(TranslateInfoBarDelegate* delegate) + : InfoBar(delegate), + background_error_percent_(0), + state_(TranslateInfoBarDelegate::kTranslateNone), + translation_pending_(false), + swapped_language_placeholders_(false) { + // Initialize slide animation for transitioning to and from error state. + error_animation_.reset(new SlideAnimation(this)); + error_animation_->SetTweenType(Tween::LINEAR); + error_animation_->SetSlideDuration(500); + + BuildWidgets(); + + // Register for PAGE_TRANSLATED notification. + notification_registrar_.Add(this, NotificationType::PAGE_TRANSLATED, + Source<TabContents>(GetDelegate()->tab_contents())); +} + +TranslateInfoBar::~TranslateInfoBar() { +} + +void TranslateInfoBar::GetTopColor(InfoBarDelegate::Type type, + double* r, double* g, double *b) { + if (background_error_percent_ <= 0) { + InfoBar::GetTopColor(InfoBarDelegate::PAGE_ACTION_TYPE, r, g, b); + } else if (background_error_percent_ >= 1) { + InfoBar::GetTopColor(InfoBarDelegate::ERROR_TYPE, r, g, b); + } else { + double normal_r, normal_g, normal_b; + InfoBar::GetTopColor(InfoBarDelegate::PAGE_ACTION_TYPE, + &normal_r, &normal_g, &normal_b); + + double error_r, error_g, error_b; + InfoBar::GetTopColor(InfoBarDelegate::ERROR_TYPE, + &error_r, &error_g, &error_b); + + double offset_r = error_r - normal_r; + double offset_g = error_g - normal_g; + double offset_b = error_b - normal_b; + + *r = normal_r + (background_error_percent_ * offset_r); + *g = normal_g + (background_error_percent_ * offset_g); + *b = normal_b + (background_error_percent_ * offset_b); + } +} + +void TranslateInfoBar::GetBottomColor(InfoBarDelegate::Type type, + double* r, double* g, double *b) { + if (background_error_percent_ <= 0) { + InfoBar::GetBottomColor(InfoBarDelegate::PAGE_ACTION_TYPE, r, g, b); + } else if (background_error_percent_ >= 1) { + InfoBar::GetBottomColor(InfoBarDelegate::ERROR_TYPE, r, g, b); + } else { + double normal_r, normal_g, normal_b; + InfoBar::GetBottomColor(InfoBarDelegate::PAGE_ACTION_TYPE, + &normal_r, &normal_g, &normal_b); + + double error_r, error_g, error_b; + InfoBar::GetBottomColor(InfoBarDelegate::ERROR_TYPE, + &error_r, &error_g, &error_b); + + double offset_r = error_r - normal_r; + double offset_g = error_g - normal_g; + double offset_b = error_b - normal_b; + + *r = normal_r + (background_error_percent_ * offset_r); + *g = normal_g + (background_error_percent_ * offset_g); + *b = normal_b + (background_error_percent_ * offset_b); + } +} + +void TranslateInfoBar::Observe(NotificationType type, + const NotificationSource& source, const NotificationDetails& details) { + if (type.value == NotificationType::PAGE_TRANSLATED) { + TabContents* tab = Source<TabContents>(source).ptr(); + if (tab != GetDelegate()->tab_contents()) + return; + + PageTranslatedDetails* page_translated_details = + Details<PageTranslatedDetails>(details).ptr(); + UpdateState((page_translated_details->error_type == TranslateErrors::NONE ? + TranslateInfoBarDelegate::kAfterTranslate : + TranslateInfoBarDelegate::kTranslateError), false, + page_translated_details->error_type); + } else { + InfoBar::Observe(type, source, details); + } +} + +void TranslateInfoBar::AnimationProgressed(const Animation* animation) { + background_error_percent_ = animation->GetCurrentValue(); + // Queue the info bar widget for redisplay. + gtk_widget_queue_draw(widget()); +} + +bool TranslateInfoBar::IsCommandIdChecked(int command_id) const { + TranslateInfoBarDelegate* translate_delegate = GetDelegate(); + switch (command_id) { + case IDC_TRANSLATE_OPTIONS_NEVER_TRANSLATE_LANG : + return translate_delegate->IsLanguageBlacklisted(); + + case IDC_TRANSLATE_OPTIONS_NEVER_TRANSLATE_SITE : + return translate_delegate->IsSiteBlacklisted(); + + case IDC_TRANSLATE_OPTIONS_ALWAYS : + return translate_delegate->ShouldAlwaysTranslate(); + + default: + NOTREACHED() << "Invalid command_id from menu"; + break; + } + return false; +} + +bool TranslateInfoBar::IsCommandIdEnabled(int command_id) const { + TranslateInfoBarDelegate* translate_delegate = GetDelegate(); + switch (command_id) { + case IDC_TRANSLATE_OPTIONS_NEVER_TRANSLATE_LANG : + case IDC_TRANSLATE_OPTIONS_NEVER_TRANSLATE_SITE : + return !translate_delegate->ShouldAlwaysTranslate(); + + case IDC_TRANSLATE_OPTIONS_ALWAYS : + return (!translate_delegate->IsLanguageBlacklisted() && + !translate_delegate->IsSiteBlacklisted()); + + default: + break; + } + return true; +} + +bool TranslateInfoBar::GetAcceleratorForCommandId(int command_id, + menus::Accelerator* accelerator) { + return false; +} + +void TranslateInfoBar::ExecuteCommand(int command_id) { + switch (command_id) { + case IDC_TRANSLATE_OPTIONS_NEVER_TRANSLATE_LANG: + GetDelegate()->ToggleLanguageBlacklist(); + RemoveInfoBar(); + break; + + case IDC_TRANSLATE_OPTIONS_NEVER_TRANSLATE_SITE: + GetDelegate()->ToggleSiteBlacklist(); + RemoveInfoBar(); + break; + + case IDC_TRANSLATE_OPTIONS_ALWAYS: + GetDelegate()->ToggleAlwaysTranslate(); + break; + + case IDC_TRANSLATE_OPTIONS_ABOUT: { + TabContents* tab_contents = GetDelegate()->tab_contents(); + if (tab_contents) { + string16 url = l10n_util::GetStringUTF16( + IDS_ABOUT_GOOGLE_TRANSLATE_URL); + tab_contents->OpenURL(GURL(url), GURL(), NEW_FOREGROUND_TAB, + PageTransition::LINK); + } + break; + } + + default: + NOTREACHED() << "Invalid command id from menu."; + break; + } +} + +void TranslateInfoBar::BuildWidgets() { + translate_box_ = gtk_hbox_new(FALSE, gtk_util::kControlSpacing); + gtk_widget_set_no_show_all(translate_box_, TRUE); + + // Add all labels to the translate_box_. Unlike views or cocoa, there's no + // concept of manual layout in GTK, so we'll manually reorder these widgets + // inside |translate_box_| and selectively show and hide them. + label_1_ = gtk_label_new(NULL); + gtk_box_pack_start(GTK_BOX(translate_box_), label_1_, FALSE, FALSE, 0); + gtk_widget_modify_fg(label_1_, GTK_STATE_NORMAL, &gfx::kGdkBlack); + + label_2_ = gtk_label_new(NULL); + gtk_box_pack_start(GTK_BOX(translate_box_), label_2_, FALSE, FALSE, 0); + gtk_widget_modify_fg(label_2_, GTK_STATE_NORMAL, &gfx::kGdkBlack); + + label_3_ = gtk_label_new(NULL); + gtk_box_pack_start(GTK_BOX(translate_box_), label_3_, FALSE, FALSE, 0); + gtk_widget_modify_fg(label_3_, GTK_STATE_NORMAL, &gfx::kGdkBlack); + + translating_label_ = gtk_label_new( + l10n_util::GetStringUTF8(IDS_TRANSLATE_INFOBAR_TRANSLATING).c_str()); + gtk_box_pack_start(GTK_BOX(translate_box_), translating_label_, + FALSE, FALSE, 0); + gtk_widget_modify_fg(translating_label_, GTK_STATE_NORMAL, &gfx::kGdkBlack); + + error_label_ = gtk_label_new(NULL); + gtk_box_pack_start(GTK_BOX(translate_box_), error_label_, + FALSE, FALSE, 0); + gtk_widget_modify_fg(error_label_, GTK_STATE_NORMAL, &gfx::kGdkBlack); + + accept_button_ = gtk_button_new_with_label( + l10n_util::GetStringUTF8(IDS_TRANSLATE_INFOBAR_ACCEPT).c_str()); + g_signal_connect(accept_button_, "clicked", + G_CALLBACK(&OnAcceptPressedThunk), this); + accept_button_vbox_ = gtk_util::CenterWidgetInHBox( + translate_box_, accept_button_, false, 0); + + deny_button_ = gtk_button_new_with_label( + l10n_util::GetStringUTF8(IDS_TRANSLATE_INFOBAR_DENY).c_str()); + g_signal_connect(deny_button_, "clicked", + G_CALLBACK(&OnDenyPressedThunk), this); + deny_button_vbox_ = gtk_util::CenterWidgetInHBox( + translate_box_, deny_button_, false, 0); + + retry_button_ = gtk_button_new_with_label( + l10n_util::GetStringUTF8(IDS_TRANSLATE_INFOBAR_RETRY).c_str()); + g_signal_connect(retry_button_, "clicked", + G_CALLBACK(&OnAcceptPressedThunk), this); + retry_button_vbox_ = gtk_util::CenterWidgetInHBox( + translate_box_, retry_button_, false, 0); + + revert_button_ = gtk_button_new_with_label( + l10n_util::GetStringUTF8(IDS_TRANSLATE_INFOBAR_REVERT).c_str()); + g_signal_connect(revert_button_, "clicked", + G_CALLBACK(&OnRevertPressedThunk), this); + revert_button_vbox_ = gtk_util::CenterWidgetInHBox( + translate_box_, revert_button_, false, 0); + + std::vector<std::string> orig_languages; + GetDelegate()->GetAvailableOriginalLanguages(&orig_languages); + original_language_combobox_ = BuildLanguageComboboxFrom(GetDelegate(), + orig_languages); + g_signal_connect(original_language_combobox_, "changed", + G_CALLBACK(&OnOriginalModifiedThunk), this); + original_language_combobox_vbox_ = gtk_util::CenterWidgetInHBox( + translate_box_, original_language_combobox_, false, 0); + + std::vector<std::string> target_languages; + GetDelegate()->GetAvailableTargetLanguages(&target_languages); + target_language_combobox_ = BuildLanguageComboboxFrom(GetDelegate(), + target_languages); + g_signal_connect(target_language_combobox_, "changed", + G_CALLBACK(&OnTargetModifiedThunk), this); + target_language_combobox_vbox_ = gtk_util::CenterWidgetInHBox( + translate_box_, target_language_combobox_, false, 0); + + gtk_box_pack_start(GTK_BOX(hbox_), translate_box_, FALSE, FALSE, 0); + + // The options button sits outside the translate_box so that it can be end + // packed in hbox_. + options_menu_button_ = BuildOptionsMenuButton(); + g_signal_connect(options_menu_button_, "clicked", + G_CALLBACK(&OnOptionsClickedThunk), this); + gtk_widget_show_all(options_menu_button_); + gtk_util::CenterWidgetInHBox( + hbox_, options_menu_button_, true, 0); + + UpdateState(GetDelegate()->state(), GetDelegate()->translation_pending(), + GetDelegate()->error_type()); + + gtk_widget_show_all(border_bin_.get()); +} + +void TranslateInfoBar::UpdateState( + TranslateInfoBarDelegate::TranslateState new_state, + bool new_translation_pending, TranslateErrors::Type error_type) { + if (state_ == new_state && translation_pending_ == new_translation_pending) + return; + + TranslateInfoBarDelegate::TranslateState old_state = state_; + state_ = new_state; + translation_pending_ = new_translation_pending; + + // Show the box... + gtk_widget_show(translate_box_); + // ...but hide all children of the translate box. They will be selectively + // unhidden and reordered based on the current translate state. + gtk_container_foreach( + GTK_CONTAINER(translate_box_), + reinterpret_cast<void (*)(GtkWidget*, void*)>(gtk_widget_hide_all), NULL); + + switch (state_) { + case TranslateInfoBarDelegate::kBeforeTranslate: { + SetLabels(); + + GtkWidget* before_state[] = { + label_1_, + original_language_combobox_vbox_, + label_2_, + translation_pending_ ? translating_label_ : accept_button_vbox_, + translation_pending_ ? NULL : deny_button_vbox_, + NULL + }; + ReorderWidgetsTo(translate_box_, before_state); + + SetLanguageComboboxActiveId(GTK_COMBO_BOX(original_language_combobox_), + GetDelegate()->original_lang_index()); + break; + } + case TranslateInfoBarDelegate::kAfterTranslate: { + SetLabels(); + GtkWidget* first_button_box = + swapped_language_placeholders_ ? + target_language_combobox_vbox_ : original_language_combobox_vbox_; + GtkWidget* second_button_box = + swapped_language_placeholders_ ? + original_language_combobox_vbox_ : target_language_combobox_vbox_; + + GtkWidget* after_state[] = { + label_1_, + first_button_box, + label_2_, + second_button_box, + label_3_, + translation_pending_ ? translating_label_ : revert_button_vbox_, + NULL + }; + ReorderWidgetsTo(translate_box_, after_state); + + SetLanguageComboboxActiveId(GTK_COMBO_BOX(original_language_combobox_), + GetDelegate()->original_lang_index()); + SetLanguageComboboxActiveId(GTK_COMBO_BOX(target_language_combobox_), + GetDelegate()->target_lang_index()); + break; + } + case TranslateInfoBarDelegate::kTranslateError: { + string16 error_message_utf16 = GetDelegate()->GetErrorMessage(error_type); + gtk_label_set_text(GTK_LABEL(error_label_), + UTF16ToUTF8(error_message_utf16).c_str()); + + GtkWidget* error_state[] = { + error_label_, + retry_button_vbox_, + NULL + }; + ReorderWidgetsTo(translate_box_, error_state); + break; + } + default: { + NOTIMPLEMENTED() << "Received state " << new_state; + } + } + + // The options button is visible any time that we aren't in an error state. + if (state_ == TranslateInfoBarDelegate::kTranslateError) + gtk_widget_hide(options_menu_button_); + else + gtk_widget_show(options_menu_button_); + + // If background should change per state, trigger animation of transition + // accordingly. + if (old_state != TranslateInfoBarDelegate::kTranslateError && + state_ == TranslateInfoBarDelegate::kTranslateError) { + error_animation_->Show(); // Transition to error state. + } else if (old_state == TranslateInfoBarDelegate::kTranslateError && + state_ != TranslateInfoBarDelegate::kTranslateError) { + error_animation_->Hide(); // Transition from error state. + } else { + error_animation_->Stop(); // No transition. + } +} + +void TranslateInfoBar::SetLabels() { + std::vector<size_t> offsets; + string16 message_text_utf16; + GetDelegate()->GetMessageText(GetDelegate()->state(), &message_text_utf16, + &offsets, &swapped_language_placeholders_); + + string16 text = message_text_utf16.substr(0, offsets[0]); + gtk_label_set_text(GTK_LABEL(label_1_), UTF16ToUTF8(text).c_str()); + + text = message_text_utf16.substr(offsets[0], offsets[1] - offsets[0]); + gtk_label_set_text(GTK_LABEL(label_2_), UTF16ToUTF8(text).c_str()); + + if (offsets.size() == 3) { + text = message_text_utf16.substr(offsets[1], offsets[2] - offsets[1]); + gtk_label_set_text(GTK_LABEL(label_3_), UTF16ToUTF8(text).c_str()); + } +} + +TranslateInfoBarDelegate* TranslateInfoBar::GetDelegate() const { + return static_cast<TranslateInfoBarDelegate*>(delegate()); +} + +void TranslateInfoBar::LanguageModified() { + options_menu_model_.reset(); + + // Selecting an item from the "from language" menu in the before translate + // phase shouldn't trigger translation - http://crbug.com/36666 + if (GetDelegate()->state() == TranslateInfoBarDelegate::kAfterTranslate) { + GetDelegate()->Translate(); + UpdateState(GetDelegate()->state(), GetDelegate()->translation_pending(), + GetDelegate()->error_type()); + } +} + +void TranslateInfoBar::OnOriginalModified(GtkWidget* sender) { + int index = GetLanguageComboboxActiveId(GTK_COMBO_BOX(sender)); + if (index == GetDelegate()->original_lang_index()) + return; + + GetDelegate()->ModifyOriginalLanguage(index); + + LanguageModified(); +} + +void TranslateInfoBar::OnTargetModified(GtkWidget* sender) { + int index = GetLanguageComboboxActiveId(GTK_COMBO_BOX(sender)); + if (index == GetDelegate()->target_lang_index()) + return; + + GetDelegate()->ModifyTargetLanguage(index); + + LanguageModified(); +} + +void TranslateInfoBar::OnAcceptPressed(GtkWidget* sender) { + GetDelegate()->Translate(); + UpdateState(GetDelegate()->state(), GetDelegate()->translation_pending(), + GetDelegate()->error_type()); +} + +void TranslateInfoBar::OnDenyPressed(GtkWidget* sender) { + GetDelegate()->TranslationDeclined(); + RemoveInfoBar(); +} + +void TranslateInfoBar::OnRevertPressed(GtkWidget* sender) { + GetDelegate()->RevertTranslation(); +} + +void TranslateInfoBar::OnOptionsClicked(GtkWidget* sender) { + if (!options_menu_model_.get()) { + options_menu_model_.reset(new OptionsMenuModel(this, GetDelegate())); + options_menu_menu_.reset(new MenuGtk(this, options_menu_model_.get())); + } + options_menu_menu_->Popup(sender, 1, gtk_get_current_event_time()); +} + +// TranslateInfoBarDelegate, InfoBarDelegate overrides: ------------------ + +InfoBar* TranslateInfoBarDelegate::CreateInfoBar() { + return new TranslateInfoBar(this); +} diff --git a/chrome/browser/gtk/translate_infobars.h b/chrome/browser/gtk/translate_infobars.h new file mode 100644 index 0000000..87d2029 --- /dev/null +++ b/chrome/browser/gtk/translate_infobars.h @@ -0,0 +1,138 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_GTK_TRANSLATE_INFOBARS_H_ +#define CHROME_BROWSER_GTK_TRANSLATE_INFOBARS_H_ + +#include <gtk/gtk.h> + +#include "app/gtk_signal.h" +#include "app/menus/simple_menu_model.h" +#include "chrome/browser/gtk/infobar_gtk.h" +#include "chrome/browser/gtk/menu_gtk.h" +#include "chrome/browser/translate/translate_infobars_delegates.h" +#include "chrome/common/notification_registrar.h" + +class SlideAnimation; +class OptionsMenuModel; + +// InfoBar that asks user if they want to translate a page that isn't in the +// user's language to their language. Bar changes during and after translation. +class TranslateInfoBar : public InfoBar, + public AnimationDelegate, + public menus::SimpleMenuModel::Delegate, + public MenuGtk::Delegate { + public: + explicit TranslateInfoBar(TranslateInfoBarDelegate* delegate); + virtual ~TranslateInfoBar(); + + // Overridden from InfoBar: + virtual void GetTopColor(InfoBarDelegate::Type type, + double* r, double* g, double *b); + virtual void GetBottomColor(InfoBarDelegate::Type type, + double* r, double* g, double *b); + + // Overridden from NotificationObserver (through InfoBar): + virtual void Observe(NotificationType type, + const NotificationSource& source, const NotificationDetails& details); + + // Overridden from AnimationDelegate: + virtual void AnimationProgressed(const Animation* animation); + + // Overridden for both menus::SimpleMenuModel::Delegate and MenuGtk::Delegate: + virtual bool IsCommandIdChecked(int command_id) const; + virtual bool IsCommandIdEnabled(int command_id) const; + + // Overridden from menus::SimpleMenuModel::Delegate: + virtual bool GetAcceleratorForCommandId(int command_id, + menus::Accelerator* accelerator); + virtual void ExecuteCommand(int command_id); + + // Overridden from MenuGtk::Delegate: + virtual void ExecuteCommandById(int command_id) { + ExecuteCommand(command_id); + } + + private: + // Builds all the widgets and sets the initial view of the dialog. + void BuildWidgets(); + + // Changes the layout of the info bar, displaying the correct widgets in the + // correct order for |new_state|. + void UpdateState(TranslateInfoBarDelegate::TranslateState new_state, + bool new_translation_pending, TranslateErrors::Type error_type); + + // Sets the text in the three labels for the current state. + void SetLabels(); + + // Casts delegate() to the only possible subclass. + TranslateInfoBarDelegate* GetDelegate() const; + + // Called after OnOriginalModified or OnTargetModified. + void LanguageModified(); + + CHROMEGTK_CALLBACK_0(TranslateInfoBar, void, OnOriginalModified); + CHROMEGTK_CALLBACK_0(TranslateInfoBar, void, OnTargetModified); + CHROMEGTK_CALLBACK_0(TranslateInfoBar, void, OnAcceptPressed); + CHROMEGTK_CALLBACK_0(TranslateInfoBar, void, OnDenyPressed); + CHROMEGTK_CALLBACK_0(TranslateInfoBar, void, OnRevertPressed); + CHROMEGTK_CALLBACK_0(TranslateInfoBar, void, OnOptionsClicked); + + // A percentage to average the normal page action background with the error + // background. When 0, the infobar background should be pure + // PAGE_ACTION_TYPE. When 1, the infobar background should be pure + // ERROR_TYPE. + double background_error_percent_; + + // Infobar keeps track of the state it is displaying, which should match that + // in the TranslateInfoBarDelegate. UI needs to keep track separately because + // infobar may receive PAGE_TRANSLATED notifications before delegate does, in + // which case, delegate's state is not updated and hence can't be used to + // update display. After the notification is sent out to all observers, both + // infobar and delegate would end up with the same state. + TranslateInfoBarDelegate::TranslateState state_; + bool translation_pending_; + TranslateErrors::Type error_type_; + + GtkWidget* translate_box_; + GtkWidget* label_1_; + GtkWidget* label_2_; + GtkWidget* label_3_; + GtkWidget* translating_label_; + GtkWidget* error_label_; + + GtkWidget* accept_button_; + GtkWidget* accept_button_vbox_; + + GtkWidget* deny_button_; + GtkWidget* deny_button_vbox_; + + GtkWidget* retry_button_; + GtkWidget* retry_button_vbox_; + + GtkWidget* revert_button_; + GtkWidget* revert_button_vbox_; + + GtkWidget* original_language_combobox_; + GtkWidget* original_language_combobox_vbox_; + + GtkWidget* target_language_combobox_; + GtkWidget* target_language_combobox_vbox_; + + GtkWidget* options_menu_button_; + scoped_ptr<MenuGtk> options_menu_menu_; + scoped_ptr<OptionsMenuModel> options_menu_model_; + + // This is true if language placeholders in label have been swapped. + bool swapped_language_placeholders_; + + NotificationRegistrar notification_registrar_; + + // Changes the color of the background from blue to red and back. + scoped_ptr<SlideAnimation> error_animation_; + + DISALLOW_COPY_AND_ASSIGN(TranslateInfoBar); +}; + +#endif // CHROME_BROWSER_GTK_TRANSLATE_INFOBARS_H_ diff --git a/chrome/browser/tab_contents/render_view_context_menu.cc b/chrome/browser/tab_contents/render_view_context_menu.cc index 9ddcb16..ef4e6d7 100644 --- a/chrome/browser/tab_contents/render_view_context_menu.cc +++ b/chrome/browser/tab_contents/render_view_context_menu.cc @@ -34,10 +34,8 @@ #include "chrome/browser/spellchecker_platform_engine.h" #include "chrome/browser/tab_contents/navigation_entry.h" #include "chrome/browser/tab_contents/tab_contents.h" -#include "chrome/browser/translate/translate_prefs.h" -#if !defined(OS_WIN) && !defined(OS_LINUX) #include "chrome/browser/translate/translate_manager.h" -#else +#if defined(OS_WIN) #include "chrome/browser/translate/translate_manager2.h" #endif #include "chrome/common/chrome_switches.h" @@ -451,11 +449,7 @@ void RenderViewContextMenu::AppendPageItems() { menu_model_.AddItemWithStringId(IDC_PRINT, IDS_CONTENT_CONTEXT_PRINT); std::string locale = g_browser_process->GetApplicationLocale(); -#if defined(OS_WIN) || defined(OS_LINUX) - locale = TranslateManager2::GetLanguageCode(locale); -#else locale = TranslateManager::GetLanguageCode(locale); -#endif string16 language = l10n_util::GetDisplayNameForLocale(locale, locale, true); menu_model_.AddItem( IDC_CONTENT_CONTEXT_TRANSLATE, @@ -729,19 +723,11 @@ bool RenderViewContextMenu::IsCommandIdEnabled(int id) const { std::string original_lang = source_tab_contents_->language_state().original_language(); std::string target_lang = g_browser_process->GetApplicationLocale(); -#if defined(OS_WIN) || defined(OS_LINUX) - target_lang = TranslateManager2::GetLanguageCode(target_lang); -#else target_lang = TranslateManager::GetLanguageCode(target_lang); -#endif return original_lang != target_lang && !source_tab_contents_->language_state().IsPageTranslated() && !source_tab_contents_->interstitial_page() && -#if defined(OS_WIN) || defined(OS_LINUX) - TranslateManager2::IsTranslatableURL(params_.page_url); -#else TranslateManager::IsTranslatableURL(params_.page_url); -#endif } case IDC_CONTENT_CONTEXT_OPENLINKNEWTAB: @@ -1146,17 +1132,13 @@ void RenderViewContextMenu::ExecuteCommand(int id) { std::string original_lang = source_tab_contents_->language_state().original_language(); std::string target_lang = g_browser_process->GetApplicationLocale(); -#if defined(OS_WIN) || defined(OS_LINUX) - target_lang = TranslateManager2::GetLanguageCode(target_lang); -#else target_lang = TranslateManager::GetLanguageCode(target_lang); -#endif // Since the user decided to translate for that language and site, clears // any preferences for not translating them. TranslatePrefs prefs(profile_->GetPrefs()); prefs.RemoveLanguageFromBlacklist(original_lang); prefs.RemoveSiteFromBlacklist(params_.page_url.HostNoBrackets()); -#if defined(OS_WIN) || defined(OS_LINUX) +#if defined(OS_WIN) Singleton<TranslateManager2>::get()->TranslatePage( source_tab_contents_, original_lang, target_lang); #else diff --git a/chrome/browser/translate/translate_infobar_delegate2.cc b/chrome/browser/translate/translate_infobar_delegate2.cc index d773542..bc11024 100644 --- a/chrome/browser/translate/translate_infobar_delegate2.cc +++ b/chrome/browser/translate/translate_infobar_delegate2.cc @@ -300,8 +300,9 @@ void TranslateInfoBarDelegate2::GetAfterTranslateStrings( strings->push_back(text.substr(offsets[1])); } -#if !defined(OS_WIN) && !defined(OS_LINUX) -// Necessary so we link OK on Mac until Mac uses the new delegate as well. +#if !defined(OS_WIN) && !defined(OS_CHROMEOS) +// Necessary so we link OK on Mac and Linux while the new translate infobars +// are being ported to these platforms. InfoBar* TranslateInfoBarDelegate2::CreateInfoBar() { return NULL; } diff --git a/chrome/browser/translate/translate_manager2_unittest.cc b/chrome/browser/translate/translate_manager2_unittest.cc index 5f171e2..6ad168d 100644 --- a/chrome/browser/translate/translate_manager2_unittest.cc +++ b/chrome/browser/translate/translate_manager2_unittest.cc @@ -4,7 +4,6 @@ #include "chrome/browser/renderer_host/test/test_render_view_host.h" -#include "base/utf_string_conversions.h" #include "chrome/app/chrome_dll_resource.h" #include "chrome/browser/renderer_host/mock_render_process_host.h" #include "chrome/browser/tab_contents/render_view_context_menu.h" @@ -42,18 +41,17 @@ class TranslateManager2Test : public RenderViewHostTestHarness, // Simluates navigating to a page and getting the page contents and language // for that navigation. void SimulateNavigation(const GURL& url, int page_id, - const std::string& contents, + const std::wstring& contents, const std::string& lang) { NavigateAndCommit(url); SimulateOnPageContents(url, page_id, contents, lang); } void SimulateOnPageContents(const GURL& url, int page_id, - const std::string& contents, + const std::wstring& contents, const std::string& lang) { rvh()->TestOnMessageReceived(ViewHostMsg_PageContents(0, url, page_id, - UTF8ToUTF16(contents), - lang)); + contents, lang)); } bool GetTranslateMessage(int* page_id, @@ -266,7 +264,7 @@ class TestRenderViewContextMenu : public RenderViewContextMenu { TEST_F(TranslateManager2Test, NormalTranslate) { // Simulate navigating to a page. - SimulateNavigation(GURL("http://www.google.fr"), 0, "Le Google", "fr"); + SimulateNavigation(GURL("http://www.google.fr"), 0, L"Le Google", "fr"); // We should have an infobar. TranslateInfoBarDelegate2* infobar = GetTranslateInfoBar(); @@ -276,7 +274,7 @@ TEST_F(TranslateManager2Test, NormalTranslate) { // Simulate clicking translate. process()->sink().ClearMessages(); infobar->Translate(); - + // Simulate the translate script being retrieved (it only needs to be done // once in the test as it is cached). SimulateURLFetch(true); @@ -320,7 +318,7 @@ TEST_F(TranslateManager2Test, NormalTranslate) { TEST_F(TranslateManager2Test, TranslateScriptNotAvailable) { // Simulate navigating to a page. - SimulateNavigation(GURL("http://www.google.fr"), 0, "Le Google", "fr"); + SimulateNavigation(GURL("http://www.google.fr"), 0, L"Le Google", "fr"); // We should have an infobar. TranslateInfoBarDelegate2* infobar = GetTranslateInfoBar(); @@ -400,7 +398,7 @@ TEST_F(TranslateManager2Test, TestAllLanguages) { // Simulate navigating to a page. NavigateAndCommit(url); - SimulateOnPageContents(url, i, "", lang); + SimulateOnPageContents(url, i, L"", lang); // Verify we have/don't have an info-bar as expected. infobar = GetTranslateInfoBar(); @@ -415,7 +413,7 @@ TEST_F(TranslateManager2Test, TestAllLanguages) { // Tests auto-translate on page. TEST_F(TranslateManager2Test, AutoTranslateOnNavigate) { // Simulate navigating to a page and getting its language. - SimulateNavigation(GURL("http://www.google.fr"), 0, "Le Google", "fr"); + SimulateNavigation(GURL("http://www.google.fr"), 0, L"Le Google", "fr"); // Simulate the user translating. TranslateInfoBarDelegate2* infobar = GetTranslateInfoBar(); @@ -428,7 +426,7 @@ TEST_F(TranslateManager2Test, AutoTranslateOnNavigate) { // Now navigate to a new page in the same language. process()->sink().ClearMessages(); - SimulateNavigation(GURL("http://news.google.fr"), 1, "Les news", "fr"); + SimulateNavigation(GURL("http://news.google.fr"), 1, L"Les news", "fr"); // This should have automatically triggered a translation. int page_id = 0; @@ -440,7 +438,7 @@ TEST_F(TranslateManager2Test, AutoTranslateOnNavigate) { // Now navigate to a page in a different language. process()->sink().ClearMessages(); - SimulateNavigation(GURL("http://news.google.es"), 1, "Las news", "es"); + SimulateNavigation(GURL("http://news.google.es"), 1, L"Las news", "es"); // This should not have triggered a translate. EXPECT_FALSE(GetTranslateMessage(&page_id, &original_lang, &target_lang)); @@ -449,28 +447,28 @@ TEST_F(TranslateManager2Test, AutoTranslateOnNavigate) { // Tests that multiple OnPageContents do not cause multiple infobars. TEST_F(TranslateManager2Test, MultipleOnPageContents) { // Simulate navigating to a page and getting its language. - SimulateNavigation(GURL("http://www.google.fr"), 0, "Le Google", "fr"); + SimulateNavigation(GURL("http://www.google.fr"), 0, L"Le Google", "fr"); // Simulate clicking 'Nope' (don't translate). EXPECT_TRUE(DenyTranslation()); EXPECT_EQ(0, contents()->infobar_delegate_count()); // Send a new PageContents, we should not show an infobar. - SimulateOnPageContents(GURL("http://www.google.fr"), 0, "Le Google", "fr"); + SimulateOnPageContents(GURL("http://www.google.fr"), 0, L"Le Google", "fr"); EXPECT_EQ(0, contents()->infobar_delegate_count()); // Do the same steps but simulate closing the infobar this time. - SimulateNavigation(GURL("http://www.youtube.fr"), 1, "Le YouTube", "fr"); + SimulateNavigation(GURL("http://www.youtube.fr"), 1, L"Le YouTube", "fr"); EXPECT_TRUE(CloseTranslateInfoBar()); EXPECT_EQ(0, contents()->infobar_delegate_count()); - SimulateOnPageContents(GURL("http://www.youtube.fr"), 1, "Le YouTube", "fr"); + SimulateOnPageContents(GURL("http://www.youtube.fr"), 1, L"Le YouTube", "fr"); EXPECT_EQ(0, contents()->infobar_delegate_count()); } // Test that reloading the page brings back the infobar. TEST_F(TranslateManager2Test, Reload) { // Simulate navigating to a page and getting its language. - SimulateNavigation(GURL("http://www.google.fr"), 0, "Le Google", "fr"); + SimulateNavigation(GURL("http://www.google.fr"), 0, L"Le Google", "fr"); // Close the infobar. EXPECT_TRUE(CloseTranslateInfoBar()); @@ -497,7 +495,7 @@ TEST_F(TranslateManager2Test, ReloadFromLocationBar) { GURL url("http://www.google.fr"); // Simulate navigating to a page and getting its language. - SimulateNavigation(url, 0, "Le Google", "fr"); + SimulateNavigation(url, 0, L"Le Google", "fr"); // Close the infobar. EXPECT_TRUE(CloseTranslateInfoBar()); @@ -525,34 +523,34 @@ TEST_F(TranslateManager2Test, ReloadFromLocationBar) { // in-page. TEST_F(TranslateManager2Test, CloseInfoBarInPageNavigation) { // Simulate navigating to a page and getting its language. - SimulateNavigation(GURL("http://www.google.fr"), 0, "Le Google", "fr"); + SimulateNavigation(GURL("http://www.google.fr"), 0, L"Le Google", "fr"); // Close the infobar. EXPECT_TRUE(CloseTranslateInfoBar()); // Navigate in page, no infobar should be shown. - SimulateNavigation(GURL("http://www.google.fr/#ref1"), 0, "Le Google", "fr"); + SimulateNavigation(GURL("http://www.google.fr/#ref1"), 0, L"Le Google", "fr"); EXPECT_TRUE(GetTranslateInfoBar() == NULL); // Navigate out of page, a new infobar should show. - SimulateNavigation(GURL("http://www.google.fr/foot"), 0, "Le Google", "fr"); + SimulateNavigation(GURL("http://www.google.fr/foot"), 0, L"Le Google", "fr"); EXPECT_TRUE(GetTranslateInfoBar() != NULL); } // Tests that denying translation is sticky when navigating in page. TEST_F(TranslateManager2Test, DenyTranslateInPageNavigation) { // Simulate navigating to a page and getting its language. - SimulateNavigation(GURL("http://www.google.fr"), 0, "Le Google", "fr"); + SimulateNavigation(GURL("http://www.google.fr"), 0, L"Le Google", "fr"); // Simulate clicking 'Nope' (don't translate). EXPECT_TRUE(DenyTranslation()); // Navigate in page, no infobar should be shown. - SimulateNavigation(GURL("http://www.google.fr/#ref1"), 0, "Le Google", "fr"); + SimulateNavigation(GURL("http://www.google.fr/#ref1"), 0, L"Le Google", "fr"); EXPECT_TRUE(GetTranslateInfoBar() == NULL); // Navigate out of page, a new infobar should show. - SimulateNavigation(GURL("http://www.google.fr/foot"), 0, "Le Google", "fr"); + SimulateNavigation(GURL("http://www.google.fr/foot"), 0, L"Le Google", "fr"); EXPECT_TRUE(GetTranslateInfoBar() != NULL); } @@ -560,7 +558,7 @@ TEST_F(TranslateManager2Test, DenyTranslateInPageNavigation) { // return when navigating in page. TEST_F(TranslateManager2Test, TranslateCloseInfoBarInPageNavigation) { // Simulate navigating to a page and getting its language. - SimulateNavigation(GURL("http://www.google.fr"), 0, "Le Google", "fr"); + SimulateNavigation(GURL("http://www.google.fr"), 0, L"Le Google", "fr"); // Simulate the user translating. TranslateInfoBarDelegate2* infobar = GetTranslateInfoBar(); @@ -574,14 +572,14 @@ TEST_F(TranslateManager2Test, TranslateCloseInfoBarInPageNavigation) { EXPECT_TRUE(CloseTranslateInfoBar()); // Navigate in page, no infobar should be shown. - SimulateNavigation(GURL("http://www.google.fr/#ref1"), 0, "Le Google", "fr"); + SimulateNavigation(GURL("http://www.google.fr/#ref1"), 0, L"Le Google", "fr"); EXPECT_TRUE(GetTranslateInfoBar() == NULL); // Navigate out of page, a new infobar should show. // Note that we navigate to a page in a different language so we don't trigger // the auto-translate feature (it would translate the page automatically and // the before translate inforbar would not be shown). - SimulateNavigation(GURL("http://www.google.de"), 0, "Das Google", "de"); + SimulateNavigation(GURL("http://www.google.de"), 0, L"Das Google", "de"); EXPECT_TRUE(GetTranslateInfoBar() != NULL); } @@ -589,7 +587,7 @@ TEST_F(TranslateManager2Test, TranslateCloseInfoBarInPageNavigation) { // in-page. TEST_F(TranslateManager2Test, TranslateInPageNavigation) { // Simulate navigating to a page and getting its language. - SimulateNavigation(GURL("http://www.google.fr"), 0, "Le Google", "fr"); + SimulateNavigation(GURL("http://www.google.fr"), 0, L"Le Google", "fr"); // Simulate the user translating. TranslateInfoBarDelegate2* infobar = GetTranslateInfoBar(); @@ -604,14 +602,14 @@ TEST_F(TranslateManager2Test, TranslateInPageNavigation) { // Navigate in page, the same infobar should still be shown. ClearRemovedInfoBars(); - SimulateNavigation(GURL("http://www.google.fr/#ref1"), 0, "Le Google", "fr"); + SimulateNavigation(GURL("http://www.google.fr/#ref1"), 0, L"Le Google", "fr"); EXPECT_FALSE(InfoBarRemoved()); EXPECT_EQ(infobar, GetTranslateInfoBar()); // Navigate out of page, a new infobar should show. // See note in TranslateCloseInfoBarInPageNavigation test on why it is // important to navigate to a page in a different language for this test. - SimulateNavigation(GURL("http://www.google.de"), 0, "Das Google", "de"); + SimulateNavigation(GURL("http://www.google.de"), 0, L"Das Google", "de"); // The old infobar is gone. EXPECT_TRUE(CheckInfoBarRemovedAndReset(infobar)); // And there is a new one. @@ -622,7 +620,7 @@ TEST_F(TranslateManager2Test, TranslateInPageNavigation) { // unsupported language. TEST_F(TranslateManager2Test, UnsupportedPageLanguage) { // Simulate navigating to a page and getting an unsupported language. - SimulateNavigation(GURL("http://www.google.com"), 0, "Google", "qbz"); + SimulateNavigation(GURL("http://www.google.com"), 0, L"Google", "qbz"); // No info-bar should be shown. EXPECT_TRUE(GetTranslateInfoBar() == NULL); @@ -638,7 +636,7 @@ TEST_F(TranslateManager2Test, UnsupportedUILanguage) { // Simulate navigating to a page in a language supported by the translate // server. - SimulateNavigation(GURL("http://www.google.com"), 0, "Google", "en"); + SimulateNavigation(GURL("http://www.google.com"), 0, L"Google", "en"); // No info-bar should be shown. EXPECT_TRUE(GetTranslateInfoBar() == NULL); @@ -653,7 +651,7 @@ TEST_F(TranslateManager2Test, TranslateEnabledPref) { prefs->SetBoolean(prefs::kEnableTranslate, true); // Simulate navigating to a page and getting its language. - SimulateNavigation(GURL("http://www.google.fr"), 0, "Le Google", "fr"); + SimulateNavigation(GURL("http://www.google.fr"), 0, L"Le Google", "fr"); // An infobar should be shown. TranslateInfoBarDelegate2* infobar = GetTranslateInfoBar(); @@ -670,7 +668,7 @@ TEST_F(TranslateManager2Test, TranslateEnabledPref) { // Simulate getting the page contents and language, that should not trigger // a translate infobar. - SimulateOnPageContents(url, 1, "Le YouTube", "fr"); + SimulateOnPageContents(url, 1, L"Le YouTube", "fr"); infobar = GetTranslateInfoBar(); EXPECT_TRUE(infobar == NULL); } @@ -679,7 +677,7 @@ TEST_F(TranslateManager2Test, TranslateEnabledPref) { TEST_F(TranslateManager2Test, NeverTranslateLanguagePref) { // Simulate navigating to a page and getting its language. GURL url("http://www.google.fr"); - SimulateNavigation(url, 0, "Le Google", "fr"); + SimulateNavigation(url, 0, L"Le Google", "fr"); // An infobar should be shown. EXPECT_TRUE(GetTranslateInfoBar() != NULL); @@ -700,7 +698,7 @@ TEST_F(TranslateManager2Test, NeverTranslateLanguagePref) { EXPECT_TRUE(CloseTranslateInfoBar()); // Navigate to a new page also in French. - SimulateNavigation(GURL("http://wwww.youtube.fr"), 1, "Le YouTube", "fr"); + SimulateNavigation(GURL("http://wwww.youtube.fr"), 1, L"Le YouTube", "fr"); // There should not be a translate infobar. EXPECT_TRUE(GetTranslateInfoBar() == NULL); @@ -712,7 +710,7 @@ TEST_F(TranslateManager2Test, NeverTranslateLanguagePref) { EXPECT_TRUE(translate_prefs.CanTranslate(prefs, "fr", url)); // Navigate to a page in French. - SimulateNavigation(url, 2, "Le Google", "fr"); + SimulateNavigation(url, 2, L"Le Google", "fr"); // There should be a translate infobar. EXPECT_TRUE(GetTranslateInfoBar() != NULL); @@ -725,7 +723,7 @@ TEST_F(TranslateManager2Test, NeverTranslateSitePref) { // Simulate navigating to a page and getting its language. GURL url("http://www.google.fr"); std::string host(url.host()); - SimulateNavigation(url, 0, "Le Google", "fr"); + SimulateNavigation(url, 0, L"Le Google", "fr"); // An infobar should be shown. EXPECT_TRUE(GetTranslateInfoBar() != NULL); @@ -746,7 +744,7 @@ TEST_F(TranslateManager2Test, NeverTranslateSitePref) { EXPECT_TRUE(CloseTranslateInfoBar()); // Navigate to a new page also on the same site. - SimulateNavigation(GURL("http://www.google.fr/hello"), 1, "Bonjour", "fr"); + SimulateNavigation(GURL("http://www.google.fr/hello"), 1, L"Bonjour", "fr"); // There should not be a translate infobar. EXPECT_TRUE(GetTranslateInfoBar() == NULL); @@ -758,7 +756,7 @@ TEST_F(TranslateManager2Test, NeverTranslateSitePref) { EXPECT_TRUE(translate_prefs.CanTranslate(prefs, "fr", url)); // Navigate to a page in French. - SimulateNavigation(url, 0, "Le Google", "fr"); + SimulateNavigation(url, 0, L"Le Google", "fr"); // There should be a translate infobar. EXPECT_TRUE(GetTranslateInfoBar() != NULL); @@ -777,7 +775,7 @@ TEST_F(TranslateManager2Test, AlwaysTranslateLanguagePref) { translate_prefs.WhitelistLanguagePair("fr", "en"); // Load a page in French. - SimulateNavigation(GURL("http://www.google.fr"), 0, "Le Google", "fr"); + SimulateNavigation(GURL("http://www.google.fr"), 0, L"Le Google", "fr"); // It should have triggered an automatic translation to English. SimulateURLFetch(true); // Simulate the translate script being retrieved. @@ -793,7 +791,7 @@ TEST_F(TranslateManager2Test, AlwaysTranslateLanguagePref) { EXPECT_TRUE(GetTranslateInfoBar() == NULL); // Try another language, it should not be autotranslated. - SimulateNavigation(GURL("http://www.google.es"), 1, "El Google", "es"); + SimulateNavigation(GURL("http://www.google.es"), 1, L"El Google", "es"); EXPECT_FALSE(GetTranslateMessage(&page_id, &original_lang, &target_lang)); EXPECT_TRUE(GetTranslateInfoBar() != NULL); EXPECT_TRUE(CloseTranslateInfoBar()); @@ -803,7 +801,7 @@ TEST_F(TranslateManager2Test, AlwaysTranslateLanguagePref) { TestingProfile* test_profile = static_cast<TestingProfile*>(contents()->profile()); test_profile->set_off_the_record(true); - SimulateNavigation(GURL("http://www.youtube.fr"), 2, "Le YouTube", "fr"); + SimulateNavigation(GURL("http://www.youtube.fr"), 2, L"Le YouTube", "fr"); EXPECT_FALSE(GetTranslateMessage(&page_id, &original_lang, &target_lang)); EXPECT_TRUE(GetTranslateInfoBar() != NULL); EXPECT_TRUE(CloseTranslateInfoBar()); @@ -813,12 +811,103 @@ TEST_F(TranslateManager2Test, AlwaysTranslateLanguagePref) { // behavior, which is show an infobar. SetPrefObserverExpectation(TranslatePrefs::kPrefTranslateWhitelists); translate_prefs.RemoveLanguagePairFromWhitelist("fr", "en"); - SimulateNavigation(GURL("http://www.google.fr"), 3, "Le Google", "fr"); + SimulateNavigation(GURL("http://www.google.fr"), 3, L"Le Google", "fr"); EXPECT_FALSE(GetTranslateMessage(&page_id, &original_lang, &target_lang)); EXPECT_TRUE(GetTranslateInfoBar() != NULL); prefs->RemovePrefObserver(TranslatePrefs::kPrefTranslateWhitelists, &pref_observer_); } +/* + +// Context menu. +TEST_F(TranslateManager2Test, ContextMenu) { + // Blacklist www.google.fr and French for translation. + GURL url("http://www.google.fr"); + TranslatePrefs translate_prefs(contents()->profile()->GetPrefs()); + translate_prefs.BlacklistLanguage("fr"); + translate_prefs.BlacklistSite(url.host()); + EXPECT_TRUE(translate_prefs.IsLanguageBlacklisted("fr")); + EXPECT_TRUE(translate_prefs.IsSiteBlacklisted(url.host())); + + // Simulate navigating to a page in French. The translate menu should show. + SimulateNavigation(url, 0, L"Le Google", "fr"); + scoped_ptr<TestRenderViewContextMenu> menu( + TestRenderViewContextMenu::CreateContextMenu(contents())); + menu->Init(); + EXPECT_TRUE(menu->IsItemPresent(IDS_CONTENT_CONTEXT_TRANSLATE)); + EXPECT_TRUE(menu->TestIsCommandIdEnabled(IDS_CONTENT_CONTEXT_TRANSLATE)); + + // Use the menu to translate the page. + menu->TestExecuteItemCommand(IDS_CONTENT_CONTEXT_TRANSLATE); + + // That should have triggered a translation. + SimulateURLFetch(true); // Simulate the translate script being retrieved. + int page_id = 0; + std::string original_lang, target_lang; + EXPECT_TRUE(GetTranslateMessage(&page_id, &original_lang, &target_lang)); + EXPECT_EQ(0, page_id); + EXPECT_EQ("fr", original_lang); + EXPECT_EQ("en", target_lang); + process()->sink().ClearMessages(); + + // This should also have reverted the blacklisting of this site and language. + EXPECT_FALSE(translate_prefs.IsLanguageBlacklisted("fr")); + EXPECT_FALSE(translate_prefs.IsSiteBlacklisted(url.host())); + + // Let's simulate the page being translated. + rvh()->TestOnMessageReceived(ViewHostMsg_PageTranslated(0, 0, "fr", "en", + TranslateErrors::NONE)); + + // The translate menu should now be disabled. + menu.reset(TestRenderViewContextMenu::CreateContextMenu(contents())); + menu->Init(); + EXPECT_TRUE(menu->IsItemPresent(IDS_CONTENT_CONTEXT_TRANSLATE)); + EXPECT_FALSE(menu->TestIsCommandIdEnabled(IDS_CONTENT_CONTEXT_TRANSLATE)); + + // Test that selecting translate in the context menu WHILE the page is being + // translated does nothing (this could happen if autotranslate kicks-in and + // the user selects the menu while the translation is being performed). + SimulateNavigation(GURL("http://www.google.es"), 1, L"El Google", "es"); + TranslateInfoBarDelegate2* infobar = GetTranslateInfoBar(); + ASSERT_TRUE(infobar != NULL); + infobar->Translate(); + EXPECT_TRUE(GetTranslateMessage(&page_id, &original_lang, &target_lang)); + EXPECT_EQ(1, page_id); + process()->sink().ClearMessages(); + menu.reset(TestRenderViewContextMenu::CreateContextMenu(contents())); + menu->Init(); + EXPECT_TRUE(menu->TestIsCommandIdEnabled(IDS_CONTENT_CONTEXT_TRANSLATE)); + menu->TestExecuteItemCommand(IDS_CONTENT_CONTEXT_TRANSLATE); + // No message expected since the translation should have been ignored. + EXPECT_FALSE(GetTranslateMessage(&page_id, &original_lang, &target_lang)); + + // Now test that selecting translate in the context menu AFTER the page has + // been translated does nothing. + SimulateNavigation(GURL("http://www.google.de"), 2, L"Das Google", "de"); + infobar = GetTranslateInfoBar(); + ASSERT_TRUE(infobar != NULL); + infobar->Translate(); + EXPECT_TRUE(GetTranslateMessage(&page_id, &original_lang, &target_lang)); + EXPECT_EQ(2, page_id); + process()->sink().ClearMessages(); + menu.reset(TestRenderViewContextMenu::CreateContextMenu(contents())); + menu->Init(); + EXPECT_TRUE(menu->TestIsCommandIdEnabled(IDS_CONTENT_CONTEXT_TRANSLATE)); + rvh()->TestOnMessageReceived(ViewHostMsg_PageTranslated(0, 0, "de", "en", + TranslateErrors::NONE)); + menu->TestExecuteItemCommand(IDS_CONTENT_CONTEXT_TRANSLATE); + // No message expected since the translation should have been ignored. + EXPECT_FALSE(GetTranslateMessage(&page_id, &original_lang, &target_lang)); + + // Test that the translate context menu is disabled when the page is in the + // same language as the UI. + SimulateNavigation(url, 0, L"Google", "en"); + menu.reset(TestRenderViewContextMenu::CreateContextMenu(contents())); + menu->Init(); + EXPECT_TRUE(menu->IsItemPresent(IDS_CONTENT_CONTEXT_TRANSLATE)); + EXPECT_FALSE(menu->TestIsCommandIdEnabled(IDS_CONTENT_CONTEXT_TRANSLATE)); +} +*/ // Context menu. TEST_F(TranslateManager2Test, ContextMenu) { @@ -831,7 +920,7 @@ TEST_F(TranslateManager2Test, ContextMenu) { EXPECT_TRUE(translate_prefs.IsSiteBlacklisted(url.host())); // Simulate navigating to a page in French. The translate menu should show. - SimulateNavigation(url, 0, "Le Google", "fr"); + SimulateNavigation(url, 0, L"Le Google", "fr"); scoped_ptr<TestRenderViewContextMenu> menu( TestRenderViewContextMenu::CreateContextMenu(contents())); menu->Init(); @@ -868,7 +957,7 @@ TEST_F(TranslateManager2Test, ContextMenu) { // Test that selecting translate in the context menu WHILE the page is being // translated does nothing (this could happen if autotranslate kicks-in and // the user selects the menu while the translation is being performed). - SimulateNavigation(GURL("http://www.google.es"), 1, "El Google", "es"); + SimulateNavigation(GURL("http://www.google.es"), 1, L"El Google", "es"); TranslateInfoBarDelegate2* infobar = GetTranslateInfoBar(); ASSERT_TRUE(infobar != NULL); infobar->Translate(); @@ -884,7 +973,7 @@ TEST_F(TranslateManager2Test, ContextMenu) { // Now test that selecting translate in the context menu AFTER the page has // been translated does nothing. - SimulateNavigation(GURL("http://www.google.de"), 2, "Das Google", "de"); + SimulateNavigation(GURL("http://www.google.de"), 2, L"Das Google", "de"); infobar = GetTranslateInfoBar(); ASSERT_TRUE(infobar != NULL); infobar->Translate(); @@ -902,7 +991,7 @@ TEST_F(TranslateManager2Test, ContextMenu) { // Test that the translate context menu is disabled when the page is in the // same language as the UI. - SimulateNavigation(url, 0, "Google", "en"); + SimulateNavigation(url, 0, L"Google", "en"); menu.reset(TestRenderViewContextMenu::CreateContextMenu(contents())); menu->Init(); EXPECT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_TRANSLATE)); diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index cd71d7f..5ede262 100755 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi @@ -1508,14 +1508,8 @@ 'browser/gtk/task_manager_gtk.h', 'browser/gtk/theme_install_bubble_view_gtk.cc', 'browser/gtk/theme_install_bubble_view_gtk.h', - 'browser/gtk/translate/after_translate_infobar_gtk.cc', - 'browser/gtk/translate/after_translate_infobar_gtk.h', - 'browser/gtk/translate/before_translate_infobar_gtk.cc', - 'browser/gtk/translate/before_translate_infobar_gtk.h', - 'browser/gtk/translate/translate_infobar_base_gtk.cc', - 'browser/gtk/translate/translate_infobar_base_gtk.h', - 'browser/gtk/translate/translate_message_infobar_gtk.cc', - 'browser/gtk/translate/translate_message_infobar_gtk.h', + 'browser/gtk/translate_infobars.cc', + 'browser/gtk/translate_infobars.h', 'browser/gtk/update_recommended_dialog.cc', 'browser/gtk/update_recommended_dialog.h', 'browser/gtk/view_id_util.cc', @@ -2299,8 +2293,12 @@ 'browser/translate/options_menu_model2.cc', 'browser/translate/options_menu_model2.h', 'browser/translate/translate_infobar_view.h', + 'browser/translate/translate_infobars_delegates.cc', + 'browser/translate/translate_infobars_delegates.h', 'browser/translate/translate_infobar_delegate2.cc', 'browser/translate/translate_infobar_delegate2.h', + 'browser/translate/translate_manager.cc', + 'browser/translate/translate_manager.h', 'browser/translate/translate_manager2.cc', 'browser/translate/translate_manager2.h', 'browser/translate/translate_prefs.cc', @@ -2487,6 +2485,8 @@ 'browser/views/infobars/infobar_text_button.h', 'browser/views/infobars/infobars.cc', 'browser/views/infobars/infobars.h', + 'browser/views/infobars/translate_infobars.cc', + 'browser/views/infobars/translate_infobars.h', 'browser/views/infobars/translate_infobar_base.cc', 'browser/views/infobars/translate_infobar_base.h', 'browser/views/infobars/translate_message_infobar.cc', @@ -2816,11 +2816,6 @@ ], 'sources': [ 'browser/net/ssl_config_service_manager_system.cc', - # Mac is still using the older TranslateManager. - 'browser/translate/translate_manager.cc', - 'browser/translate/translate_manager.h', - 'browser/translate/translate_infobars_delegates.cc', - 'browser/translate/translate_infobars_delegates.h', # Build Apple sample code '../third_party/apple/ImageAndTextCell.h', '../third_party/apple/ImageAndTextCell.m', diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi index 096b827..0b6099b 100755 --- a/chrome/chrome_tests.gypi +++ b/chrome/chrome_tests.gypi @@ -970,6 +970,7 @@ 'browser/tabs/tab_strip_model_unittest.cc', 'browser/task_manager_unittest.cc', 'browser/thumbnail_store_unittest.cc', + 'browser/translate/translate_manager_unittest.cc', 'browser/translate/translate_manager2_unittest.cc', 'browser/user_style_sheet_watcher_unittest.cc', 'browser/views/accessibility_event_router_views_unittest.cc', @@ -1154,7 +1155,6 @@ ], 'sources': [ 'browser/spellchecker_platform_engine_unittest.cc', - 'browser/translate/translate_manager_unittest.cc', ], 'sources!': [ # Blocked on bookmark manager. @@ -1165,7 +1165,6 @@ 'browser/views/accessibility_event_router_views_unittest.cc', 'browser/views/bookmark_bar_view_unittest.cc', 'browser/views/bookmark_context_menu_test.cc', - 'browser/translate/translate_manager2_unittest.cc', 'tools/convert_dict/convert_dict_unittest.cc', '../third_party/hunspell/google/hunspell_tests.cc', ], @@ -1239,6 +1238,7 @@ ], 'sources/': [ ['exclude', 'browser/gtk/tabs/tab_renderer_gtk_unittest\\.cc$'], + ['exclude', 'browser/translate/translate_manager_unittest\\.cc$'], ], 'link_settings': { 'libraries': [ @@ -1270,6 +1270,7 @@ 'browser/printing/print_job_unittest.cc', 'browser/rlz/rlz_unittest.cc', 'browser/search_engines/template_url_scraper_unittest.cc', + 'browser/translate/translate_manager2_unittest.cc', 'browser/views/bookmark_editor_view_unittest.cc', 'browser/views/extensions/browser_action_drag_data_unittest.cc', 'browser/views/find_bar_host_unittest.cc', |