Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3696)

Unified Diff: chrome/browser/ui/views/translate/translate_bubble_view.cc

Issue 26775007: Translate: Add TranslateBubbleView (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: (rebasing) Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/views/translate/translate_bubble_view.cc
diff --git a/chrome/browser/ui/views/translate/translate_bubble_view.cc b/chrome/browser/ui/views/translate/translate_bubble_view.cc
new file mode 100644
index 0000000000000000000000000000000000000000..f24b9360031a742de7f1409cae430098802b1d34
--- /dev/null
+++ b/chrome/browser/ui/views/translate/translate_bubble_view.cc
@@ -0,0 +1,753 @@
+// Copyright 2013 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/ui/views/translate/translate_bubble_view.h"
+
+#include <algorithm>
+#include <string>
+#include <vector>
+
+#include "base/i18n/string_compare.h"
+#include "base/memory/singleton.h"
+#include "base/metrics/histogram.h"
+#include "base/prefs/pref_service.h"
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/translate/translate_manager.h"
+#include "chrome/browser/translate/translate_tab_helper.h"
+#include "chrome/browser/translate/translate_ui_delegate.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/translate/translate_bubble_model_impl.h"
+#include "chrome/common/url_constants.h"
+#include "content/public/browser/web_contents.h"
+#include "grit/generated_resources.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/models/combobox_model.h"
+#include "ui/base/resource/resource_bundle.h"
+#include "ui/views/controls/button/checkbox.h"
+#include "ui/views/controls/button/label_button.h"
+#include "ui/views/controls/combobox/combobox.h"
+#include "ui/views/controls/label.h"
+#include "ui/views/controls/link.h"
+#include "ui/views/layout/box_layout.h"
+#include "ui/views/layout/grid_layout.h"
+#include "ui/views/layout/layout_constants.h"
+#include "ui/views/widget/widget.h"
+
+namespace {
+
+views::LabelButton* CreateLabelButton(views::ButtonListener* listener,
+ const string16& label, int id) {
+ views::LabelButton* button = new views::LabelButton(listener, label);
+ button->set_id(id);
+ button->SetStyle(views::Button::STYLE_NATIVE_TEXTBUTTON);
+ return button;
+}
+
+views::Link* CreateLink(views::LinkListener* listener,
+ int resource_id,
+ int id) {
+ views::Link* link = new views::Link(
+ l10n_util::GetStringUTF16(resource_id));
+ link->set_listener(listener);
+ link->set_id(id);
+ return link;
+}
+
+void GetTranslateLanguages(content::WebContents* web_contents,
+ std::string* source,
+ std::string* target) {
+ DCHECK(source != NULL);
+ DCHECK(target != NULL);
+
+ TranslateTabHelper* translate_tab_helper =
+ TranslateTabHelper::FromWebContents(web_contents);
+ *source = translate_tab_helper->language_state().original_language();
+ *target = TranslateManager::GetLanguageCode(
+ g_browser_process->GetApplicationLocale());
+}
+
+// TODO(hajimehoshi): The interface to offer denial choices should be another
+// control instead of Combobox. See crbug/305494.
+class TranslateDenialComboboxModel : public ui::ComboboxModel {
+ public:
+ enum {
+ INDEX_NOPE = 0,
+ INDEX_NEVER_TRANSLATE_LANGUAGE = 2,
+ INDEX_NEVER_TRANSLATE_SITE = 4,
+ };
+
+ explicit TranslateDenialComboboxModel(
+ const string16& original_language_name) {
+ items_.push_back(l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_DENY));
+ items_.push_back(string16());
+ items_.push_back(l10n_util::GetStringFUTF16(
+ IDS_TRANSLATE_BUBBLE_NEVER_TRANSLATE_LANG,
+ original_language_name));
+ items_.push_back(string16());
+ items_.push_back(l10n_util::GetStringUTF16(
+ IDS_TRANSLATE_BUBBLE_NEVER_TRANSLATE_SITE));
+ }
+ virtual ~TranslateDenialComboboxModel() {}
+
+ private:
+ // Overridden from ui::ComboboxModel:
+ virtual int GetItemCount() const OVERRIDE {
+ return items_.size();
+ }
+ virtual string16 GetItemAt(int index) OVERRIDE {
+ return items_[index];
+ }
+ virtual bool IsItemSeparatorAt(int index) OVERRIDE {
+ return items_[index].empty();
+ }
+ virtual int GetDefaultIndex() const OVERRIDE {
+ return 0;
+ }
+
+ std::vector<string16> items_;
+
+ DISALLOW_COPY_AND_ASSIGN(TranslateDenialComboboxModel);
+};
+
+const char* kUMATranslateModifyOriginalLang = "Translate.ModifyOriginalLang";
+const char* kUMATranslateModifyTargetLang = "Translate.ModifyTargetLang";
+
+} // namespace
+
+// static
+TranslateBubbleView* TranslateBubbleView::translate_bubble_view_ = NULL;
+
+TranslateBubbleView::~TranslateBubbleView() {
+ // A child view could refer to a model which is owned by this class when
+ // the child view is destructed. For example, |source_language_combobx_model_|
+ // is referred by Combobox's destructor. Before destroying the models,
+ // removing the child views is needed.
+ RemoveAllChildViews(true);
+}
+
+// static
+void TranslateBubbleView::ShowBubble(views::View* anchor_view,
+ content::WebContents* web_contents,
+ TranslateBubbleModel::ViewState type,
+ Browser* browser) {
+ if (IsShowing()) {
+ translate_bubble_view_->SwitchView(type);
+ return;
+ }
+
+ std::string source_language;
+ std::string target_language;
+ GetTranslateLanguages(web_contents, &source_language, &target_language);
+
+ scoped_ptr<TranslateUIDelegate> ui_delegate(
+ new TranslateUIDelegate(web_contents, source_language, target_language));
+ scoped_ptr<TranslateBubbleModel> model(
+ new TranslateBubbleModelImpl(type, ui_delegate.Pass()));
+ bool is_in_incognito_window =
+ web_contents->GetBrowserContext()->IsOffTheRecord();
+ TranslateBubbleView* view = new TranslateBubbleView(anchor_view,
+ model.Pass(),
+ is_in_incognito_window,
+ browser);
+ views::BubbleDelegateView::CreateBubble(view)->Show();
+}
+
+// static
+bool TranslateBubbleView::IsShowing() {
+ return translate_bubble_view_ != NULL;
+}
+
+void TranslateBubbleView::Init() {
+ SetLayoutManager(new views::BoxLayout(views::BoxLayout::kVertical,
+ 0, 0, 0));
+
+ before_translate_view_ = CreateViewBeforeTranslate();
+ translating_view_ = CreateViewTranslating();
+ after_translate_view_ = CreateViewAfterTranslate();
+ error_view_ = CreateViewError();
+ advanced_view_ = CreateViewAdvanced();
+
+ AddChildView(before_translate_view_);
+ AddChildView(translating_view_);
+ AddChildView(after_translate_view_);
+ AddChildView(error_view_);
+ AddChildView(advanced_view_);
+
+ AddAccelerator(ui::Accelerator(ui::VKEY_RETURN, ui::EF_NONE));
+
+ UpdateChildVisibilities();
+}
+
+void TranslateBubbleView::ButtonPressed(views::Button* sender,
+ const ui::Event& event) {
+ HandleButtonPressed(static_cast<ButtonID>(sender->id()));
+}
+
+void TranslateBubbleView::WindowClosing() {
+ if (!translate_executed_)
+ model_->TranslationDeclined();
+
+ // We have to reset |translate_bubble_view_| here, not in our destructor,
+ // because we'll be destroyed asynchronously and the shown state will be
+ // checked before then.
+ DCHECK_EQ(translate_bubble_view_, this);
+ translate_bubble_view_ = NULL;
+}
+
+bool TranslateBubbleView::AcceleratorPressed(
+ const ui::Accelerator& accelerator) {
+ switch (model_->GetViewState()) {
+ case TranslateBubbleModel::VIEW_STATE_BEFORE_TRANSLATE: {
+ if (accelerator.key_code() == ui::VKEY_RETURN) {
+ HandleButtonPressed(BUTTON_ID_TRANSLATE);
+ return true;
+ }
+ break;
+ }
+ case TranslateBubbleModel::VIEW_STATE_TRANSLATING:
+ break;
+ case TranslateBubbleModel::VIEW_STATE_AFTER_TRANSLATE: {
+ if (accelerator.key_code() == ui::VKEY_RETURN) {
+ HandleButtonPressed(BUTTON_ID_SHOW_ORIGINAL);
+ return true;
+ }
+ break;
+ }
+ case TranslateBubbleModel::VIEW_STATE_ERROR:
+ break;
+ case TranslateBubbleModel::VIEW_STATE_ADVANCED: {
+ if (accelerator.key_code() == ui::VKEY_RETURN) {
+ HandleButtonPressed(BUTTON_ID_DONE);
+ return true;
+ }
+ break;
+ }
+ }
+ return BubbleDelegateView::AcceleratorPressed(accelerator);
+}
+
+gfx::Size TranslateBubbleView::GetPreferredSize() {
+ int width = 0;
+ for (int i = 0; i < child_count(); i++) {
+ views::View* child = child_at(i);
+ width = std::max(width, child->GetPreferredSize().width());
+ }
+ int height = GetCurrentView()->GetPreferredSize().height();
+ return gfx::Size(width, height);
+}
+
+void TranslateBubbleView::OnSelectedIndexChanged(views::Combobox* combobox) {
+ switch (static_cast<ComboboxID>(combobox->id())) {
+ case COMBOBOX_ID_DENIAL: {
+ int index = combobox->selected_index();
+ switch (index) {
+ case TranslateDenialComboboxModel::INDEX_NOPE:
+ if (!translate_executed_)
+ model_->TranslationDeclined();
+ StartFade(false);
+ break;
+ case TranslateDenialComboboxModel::INDEX_NEVER_TRANSLATE_LANGUAGE:
+ model_->SetNeverTranslateLanguage(true);
+ StartFade(false);
+ break;
+ case TranslateDenialComboboxModel::INDEX_NEVER_TRANSLATE_SITE:
+ model_->SetNeverTranslateSite(true);
+ StartFade(false);
+ break;
+ default:
+ NOTREACHED();
+ break;
+ }
+ break;
+ }
+ case COMBOBOX_ID_SOURCE_LANGUAGE: {
+ // TODO(hajimehoshi): This UMA should be counted at a model or a delegate
+ // not to dependent on platforms. However, this UMA has not been used at
+ // some platforms. See crbug/306365.
+ UMA_HISTOGRAM_BOOLEAN(kUMATranslateModifyOriginalLang, true);
+ UpdateAdvancedView();
+ break;
+ }
+ case COMBOBOX_ID_TARGET_LANGUAGE: {
+ // TODO(hajimehoshi): Ditto.
+ UMA_HISTOGRAM_BOOLEAN(kUMATranslateModifyTargetLang, true);
+ UpdateAdvancedView();
+ break;
+ }
+ }
+}
+
+void TranslateBubbleView::LinkClicked(views::Link* source, int event_flags) {
+ HandleLinkClicked(static_cast<LinkID>(source->id()));
+}
+
+TranslateBubbleModel::ViewState TranslateBubbleView::GetViewState() const {
+ return model_->GetViewState();
+}
+
+TranslateBubbleView::TranslateBubbleView(
+ views::View* anchor_view,
+ scoped_ptr<TranslateBubbleModel> model,
+ bool is_in_incognito_window,
+ Browser* browser)
+ : BubbleDelegateView(anchor_view, views::BubbleBorder::TOP_RIGHT),
+ source_language_combobox_(NULL),
+ target_language_combobox_(NULL),
+ always_translate_checkbox_(NULL),
+ model_(model.Pass()),
+ is_in_incognito_window_(is_in_incognito_window),
+ browser_(browser),
+ translate_executed_(false) {
+ if (model_->GetViewState() !=
+ TranslateBubbleModel::VIEW_STATE_BEFORE_TRANSLATE) {
+ translate_executed_ = true;
+ }
+
+ set_margins(gfx::Insets(views::kPanelVertMargin, views::kPanelHorizMargin,
+ views::kPanelVertMargin, views::kPanelHorizMargin));
+
+ translate_bubble_view_ = this;
+}
+
+views::View* TranslateBubbleView::GetCurrentView() {
+ switch (model_->GetViewState()) {
+ case TranslateBubbleModel::VIEW_STATE_BEFORE_TRANSLATE:
+ return before_translate_view_;
+ case TranslateBubbleModel::VIEW_STATE_TRANSLATING:
+ return translating_view_;
+ case TranslateBubbleModel::VIEW_STATE_AFTER_TRANSLATE:
+ return after_translate_view_;
+ case TranslateBubbleModel::VIEW_STATE_ERROR:
+ return error_view_;
+ case TranslateBubbleModel::VIEW_STATE_ADVANCED:
+ return advanced_view_;
+ }
+ NOTREACHED();
+ return NULL;
+}
+
+void TranslateBubbleView::HandleButtonPressed(
+ TranslateBubbleView::ButtonID sender_id) {
+ switch (sender_id) {
+ case BUTTON_ID_TRANSLATE: {
+ translate_executed_ = true;
+ model_->Translate();
+ break;
+ }
+ case BUTTON_ID_DONE: {
+ translate_executed_ = true;
+ DCHECK(source_language_combobox_);
+ DCHECK(target_language_combobox_);
+
+ model_->SetOriginalLanguageIndex(
+ source_language_combobox_->selected_index());
+ model_->SetTargetLanguageIndex(
+ target_language_combobox_->selected_index());
+ model_->Translate();
+ break;
+ }
+ case BUTTON_ID_CANCEL: {
+ model_->GoBackFromAdvanced();
+ UpdateChildVisibilities();
+ SizeToContents();
+ break;
+ }
+ case BUTTON_ID_TRY_AGAIN: {
+ translate_executed_ = true;
+ model_->Translate();
+ break;
+ }
+ case BUTTON_ID_SHOW_ORIGINAL: {
+ model_->RevertTranslation();
+ StartFade(false);
+ break;
+ }
+ case BUTTON_ID_ALWAYS_TRANSLATE: {
+ DCHECK(always_translate_checkbox_);
+ model_->SetAlwaysTranslate(always_translate_checkbox_->checked());
+ UpdateAdvancedView();
+ break;
+ }
+ }
+}
+
+void TranslateBubbleView::HandleLinkClicked(
+ TranslateBubbleView::LinkID sender_id) {
+ switch (sender_id) {
+ case LINK_ID_ADVANCED: {
+ SwitchView(TranslateBubbleModel::VIEW_STATE_ADVANCED);
+ break;
+ }
+ case LINK_ID_LEARN_MORE: {
+ browser_->OpenURL(content::OpenURLParams(
+ GURL(chrome::kAboutGoogleTranslateURL),
+ content::Referrer(),
+ NEW_FOREGROUND_TAB,
+ content::PAGE_TRANSITION_LINK,
+ false));
+ break;
+ }
+ }
+}
+
+void TranslateBubbleView::UpdateChildVisibilities() {
+ for (int i = 0; i < child_count(); i++) {
+ views::View* view = child_at(i);
+ view->SetVisible(view == GetCurrentView());
+ }
+}
+
+views::View* TranslateBubbleView::CreateViewBeforeTranslate() {
+ views::Label* message_label = new views::Label(
+ l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_BEFORE_TRANSLATE));
+
+ string16 original_language_name =
+ model_->GetLanguageNameAt(model_->GetOriginalLanguageIndex());
+ views::Combobox* denial_combobox = new views::Combobox(
+ new TranslateDenialComboboxModel(original_language_name));
+ denial_combobox->set_id(COMBOBOX_ID_DENIAL);
+ denial_combobox->set_listener(this);
+
+ views::View* view = new views::View();
+ views::GridLayout* layout = new views::GridLayout(view);
+ view->SetLayoutManager(layout);
+
+ using views::GridLayout;
+
+ enum {
+ COLUMN_SET_ID_MESSAGE,
+ COLUMN_SET_ID_CONTENT,
+ };
+
+ views::ColumnSet* cs = layout->AddColumnSet(COLUMN_SET_ID_MESSAGE);
+ cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER,
+ 0, GridLayout::USE_PREF, 0, 0);
+ cs->AddPaddingColumn(0, views::kRelatedButtonHSpacing);
+ cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER,
+ 0, GridLayout::USE_PREF, 0, 0);
+ cs->AddPaddingColumn(1, 0);
+
+ cs = layout->AddColumnSet(COLUMN_SET_ID_CONTENT);
+ cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER,
+ 0, GridLayout::USE_PREF, 0, 0);
+ cs->AddPaddingColumn(1, views::kUnrelatedControlHorizontalSpacing);
+ cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER,
+ 0, GridLayout::USE_PREF, 0, 0);
+ cs->AddPaddingColumn(0, views::kRelatedButtonHSpacing);
+ cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER,
+ 0, GridLayout::USE_PREF, 0, 0);
+
+ layout->StartRow(0, COLUMN_SET_ID_MESSAGE);
+ layout->AddView(message_label);
+ layout->AddView(CreateLink(this,
+ IDS_TRANSLATE_BUBBLE_ADVANCED,
+ LINK_ID_ADVANCED));
+
+ layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing);
+
+ layout->StartRow(0, COLUMN_SET_ID_CONTENT);
+ layout->AddView(CreateLink(this,
+ IDS_TRANSLATE_BUBBLE_LEARN_MORE,
+ LINK_ID_LEARN_MORE));
+ layout->AddView(denial_combobox);
+ layout->AddView(CreateLabelButton(
+ this,
+ l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_ACCEPT),
+ BUTTON_ID_TRANSLATE));
+
+ return view;
+}
+
+views::View* TranslateBubbleView::CreateViewTranslating() {
+ string16 target_language_name =
+ model_->GetLanguageNameAt(model_->GetTargetLanguageIndex());
+ views::Label* label = new views::Label(
+ l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_TRANSLATING));
+
+ views::View* view = new views::View();
+ views::GridLayout* layout = new views::GridLayout(view);
+ view->SetLayoutManager(layout);
+
+ using views::GridLayout;
+
+ enum {
+ COLUMN_SET_ID_MESSAGE,
+ COLUMN_SET_ID_CONTENT,
+ };
+
+ views::ColumnSet* cs = layout->AddColumnSet(COLUMN_SET_ID_MESSAGE);
+ cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER,
+ 0, views::GridLayout::USE_PREF, 0, 0);
+ cs->AddPaddingColumn(1, 0);
+
+ cs = layout->AddColumnSet(COLUMN_SET_ID_CONTENT);
+ cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER,
+ 0, GridLayout::USE_PREF, 0, 0);
+ cs->AddPaddingColumn(1, views::kUnrelatedControlHorizontalSpacing);
+ cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER,
+ 0, GridLayout::USE_PREF, 0, 0);
+
+ layout->StartRow(0, COLUMN_SET_ID_MESSAGE);
+ layout->AddView(label);
+
+ layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing);
+
+ layout->StartRow(0, COLUMN_SET_ID_CONTENT);
+ layout->AddView(CreateLink(this,
+ IDS_TRANSLATE_BUBBLE_LEARN_MORE,
+ LINK_ID_LEARN_MORE));
+ views::LabelButton* revert_button = CreateLabelButton(
+ this,
+ l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_REVERT),
+ BUTTON_ID_SHOW_ORIGINAL);
+ revert_button->SetEnabled(false);
+ layout->AddView(revert_button);
+
+ return view;
+}
+
+views::View* TranslateBubbleView::CreateViewAfterTranslate() {
+ views::Label* label = new views::Label(
+ l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_TRANSLATED));
+
+ views::View* view = new views::View();
+ views::GridLayout* layout = new views::GridLayout(view);
+ view->SetLayoutManager(layout);
+
+ using views::GridLayout;
+
+ enum {
+ COLUMN_SET_ID_MESSAGE,
+ COLUMN_SET_ID_CONTENT,
+ };
+
+ views::ColumnSet* cs = layout->AddColumnSet(COLUMN_SET_ID_MESSAGE);
+ cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER,
+ 0, views::GridLayout::USE_PREF, 0, 0);
+ cs->AddPaddingColumn(0, views::kRelatedButtonHSpacing);
+ cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER,
+ 0, views::GridLayout::USE_PREF, 0, 0);
+ cs->AddPaddingColumn(1, 0);
+
+ cs = layout->AddColumnSet(COLUMN_SET_ID_CONTENT);
+ cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER,
+ 0, GridLayout::USE_PREF, 0, 0);
+ cs->AddPaddingColumn(1, views::kUnrelatedControlHorizontalSpacing);
+ cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER,
+ 0, GridLayout::USE_PREF, 0, 0);
+
+ layout->StartRow(0, COLUMN_SET_ID_MESSAGE);
+ layout->AddView(label);
+ layout->AddView(CreateLink(this,
+ IDS_TRANSLATE_BUBBLE_ADVANCED,
+ LINK_ID_ADVANCED));
+
+ layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing);
+
+ layout->StartRow(0, COLUMN_SET_ID_CONTENT);
+ layout->AddView(CreateLink(this,
+ IDS_TRANSLATE_BUBBLE_LEARN_MORE,
+ LINK_ID_LEARN_MORE));
+ layout->AddView(CreateLabelButton(
+ this,
+ l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_REVERT),
+ BUTTON_ID_SHOW_ORIGINAL));
+
+ return view;
+}
+
+views::View* TranslateBubbleView::CreateViewError() {
+ views::Label* label = new views::Label(
+ l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_COULD_NOT_TRANSLATE));
+
+ views::View* view = new views::View();
+ views::GridLayout* layout = new views::GridLayout(view);
+ view->SetLayoutManager(layout);
+
+ using views::GridLayout;
+
+ enum {
+ COLUMN_SET_ID_MESSAGE,
+ COLUMN_SET_ID_CONTENT,
+ };
+
+ views::ColumnSet* cs = layout->AddColumnSet(COLUMN_SET_ID_MESSAGE);
+ cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER,
+ 0, GridLayout::USE_PREF, 0, 0);
+ cs->AddPaddingColumn(0, views::kRelatedButtonHSpacing);
+ cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER,
+ 0, GridLayout::USE_PREF, 0, 0);
+ cs->AddPaddingColumn(1, 0);
+
+ cs = layout->AddColumnSet(COLUMN_SET_ID_CONTENT);
+ cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER,
+ 0, GridLayout::USE_PREF, 0, 0);
+ cs->AddPaddingColumn(1, views::kUnrelatedControlHorizontalSpacing);
+ cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER,
+ 0, GridLayout::USE_PREF, 0, 0);
+
+ layout->StartRow(0, COLUMN_SET_ID_MESSAGE);
+ layout->AddView(label);
+ layout->AddView(CreateLink(this,
+ IDS_TRANSLATE_BUBBLE_ADVANCED,
+ LINK_ID_ADVANCED));
+
+ layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing);
+
+ layout->StartRow(0, COLUMN_SET_ID_CONTENT);
+ layout->AddView(CreateLink(this,
+ IDS_TRANSLATE_BUBBLE_LEARN_MORE,
+ LINK_ID_LEARN_MORE));
+ layout->AddView(CreateLabelButton(
+ this,
+ l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_TRY_AGAIN),
+ BUTTON_ID_TRY_AGAIN));
+
+ return view;
+}
+
+// TODO(hajimehoshi): Revice this later to show a specific message for each
+// error. (crbug/307350)
+views::View* TranslateBubbleView::CreateViewAdvanced() {
+ views::Label* source_language_label = new views::Label(
+ l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_PAGE_LANGUAGE));
+
+ views::Label* target_language_label = new views::Label(
+ l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_TRANSLATION_LANGUAGE));
+
+ int source_default_index = model_->GetOriginalLanguageIndex();
+ source_language_combobox_model_.reset(
+ new LanguageComboboxModel(source_default_index, model_.get()));
+ source_language_combobox_ =
+ new views::Combobox(source_language_combobox_model_.get());
+
+ source_language_combobox_->set_id(COMBOBOX_ID_SOURCE_LANGUAGE);
+ source_language_combobox_->set_listener(this);
+
+ int target_default_index = model_->GetTargetLanguageIndex();
+ target_language_combobox_model_.reset(
+ new LanguageComboboxModel(target_default_index, model_.get()));
+ target_language_combobox_ =
+ new views::Combobox(target_language_combobox_model_.get());
+
+ target_language_combobox_->set_id(COMBOBOX_ID_TARGET_LANGUAGE);
+ target_language_combobox_->set_listener(this);
+
+ // In an incognito window, "Always translate" checkbox shouldn't be shown.
+ if (!is_in_incognito_window_) {
+ always_translate_checkbox_ = new views::Checkbox(string16());
+ always_translate_checkbox_->set_id(BUTTON_ID_ALWAYS_TRANSLATE);
+ always_translate_checkbox_->set_listener(this);
+ }
+
+ views::View* view = new views::View();
+ views::GridLayout* layout = new views::GridLayout(view);
+ view->SetLayoutManager(layout);
+
+ using views::GridLayout;
+
+ enum {
+ COLUMN_SET_ID_LANGUAGES,
+ COLUMN_SET_ID_ALWAYS_TRANSLATE,
+ COLUMN_SET_ID_BUTTONS,
+ };
+
+ views::ColumnSet* cs = layout->AddColumnSet(COLUMN_SET_ID_LANGUAGES);
+ cs->AddColumn(GridLayout::TRAILING, GridLayout::CENTER,
+ 0, GridLayout::USE_PREF, 0, 0);
+ cs->AddPaddingColumn(0, views::kRelatedControlHorizontalSpacing);
+ cs->AddColumn(GridLayout::FILL, GridLayout::CENTER,
+ 0, GridLayout::USE_PREF, 0, 0);
+ cs->AddPaddingColumn(1, 0);
+
+ if (!is_in_incognito_window_) {
+ cs = layout->AddColumnSet(COLUMN_SET_ID_ALWAYS_TRANSLATE);
+ cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER,
+ 0, GridLayout::USE_PREF, 0, 0);
+ cs->AddPaddingColumn(1, 0);
+ }
+
+ cs = layout->AddColumnSet(COLUMN_SET_ID_BUTTONS);
+ cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER,
+ 0, GridLayout::USE_PREF, 0, 0);
+ cs->AddPaddingColumn(1, views::kUnrelatedControlHorizontalSpacing);
+ cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER,
+ 0, GridLayout::USE_PREF, 0, 0);
+ cs->AddPaddingColumn(0, views::kRelatedButtonHSpacing);
+ cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER,
+ 0, GridLayout::USE_PREF, 0, 0);
+
+ layout->StartRow(0, COLUMN_SET_ID_LANGUAGES);
+ layout->AddView(source_language_label);
+ layout->AddView(source_language_combobox_);
+
+ layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
+
+ layout->StartRow(0, COLUMN_SET_ID_LANGUAGES);
+ layout->AddView(target_language_label);
+ layout->AddView(target_language_combobox_);
+
+ if (!is_in_incognito_window_) {
+ layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing);
+
+ layout->StartRow(0, COLUMN_SET_ID_ALWAYS_TRANSLATE);
+ layout->AddView(always_translate_checkbox_);
+ }
+
+ layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing);
+
+ layout->StartRow(0, COLUMN_SET_ID_BUTTONS);
+ layout->AddView(CreateLink(this,
+ IDS_TRANSLATE_BUBBLE_LEARN_MORE,
+ LINK_ID_LEARN_MORE));
+ views::LabelButton* cancel_button = CreateLabelButton(
+ this, l10n_util::GetStringUTF16(IDS_CANCEL), BUTTON_ID_CANCEL);
+ layout->AddView(cancel_button);
+ views::LabelButton* done_button = CreateLabelButton(
+ this, l10n_util::GetStringUTF16(IDS_DONE), BUTTON_ID_DONE);
+ done_button->SetIsDefault(true);
+ layout->AddView(done_button);
+
+ UpdateAdvancedView();
+
+ return view;
+}
+
+void TranslateBubbleView::SwitchView(
+ TranslateBubbleModel::ViewState view_state) {
+ if (model_->GetViewState() == view_state)
+ return;
+
+ model_->SetViewState(view_state);
+ UpdateChildVisibilities();
+ SizeToContents();
+}
+
+void TranslateBubbleView::UpdateAdvancedView() {
+ DCHECK(source_language_combobox_);
+ DCHECK(target_language_combobox_);
+
+ model_->SetOriginalLanguageIndex(
+ source_language_combobox_->selected_index());
+ model_->SetTargetLanguageIndex(
+ target_language_combobox_->selected_index());
+
+ string16 source_language_name =
+ model_->GetLanguageNameAt(model_->GetOriginalLanguageIndex());
+ string16 target_language_name =
+ model_->GetLanguageNameAt(model_->GetTargetLanguageIndex());
+
+ string16 message =
+ l10n_util::GetStringFUTF16(IDS_TRANSLATE_BUBBLE_ALWAYS,
+ source_language_name,
+ target_language_name);
+ // "Always translate" checkbox doesn't exist in an incognito window.
+ if (always_translate_checkbox_) {
+ always_translate_checkbox_->SetText(message);
+ always_translate_checkbox_->SetChecked(
+ model_->ShouldAlwaysTranslate());
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698