Chromium Code Reviews| 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..4023781821c88e5013b5af2854177a84c755d5df |
| --- /dev/null |
| +++ b/chrome/browser/ui/views/translate/translate_bubble_view.cc |
| @@ -0,0 +1,673 @@ |
| +// 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/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 "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 { |
| + |
| +enum { |
| + LINK_ID_ADVANCED, |
| +}; |
| + |
| +enum { |
| + BUTTON_ID_TRANSLATE, |
| + BUTTON_ID_DONE, |
| + BUTTON_ID_CANCEL, |
| + BUTTON_ID_SHOW_ORIGINAL, |
| + BUTTON_ID_TRY_AGAIN, |
| + BUTTON_ID_ALWAYS_TRANSLATE, |
| +}; |
| + |
| +enum { |
| + COMBOBOX_ID_DENIAL, |
| + COMBOBOX_ID_SOURCE_LANGUAGE, |
| + COMBOBOX_ID_TARGET_LANGUAGE, |
| +}; |
| + |
| +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* CreateAdvancedLink(views::LinkListener* listener) { |
| + views::Link* link = new views::Link( |
| + l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_ADVANCED)); |
| + link->set_listener(listener); |
| + link->set_id(LINK_ID_ADVANCED); |
| + 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); |
| + if (!translate_tab_helper) |
| + return; |
| + |
| + *source = translate_tab_helper->language_state().original_language(); |
| + *target = g_browser_process->GetApplicationLocale(); |
| + *target = TranslateManager::GetLanguageCode(*target); |
| +} |
| + |
| +// TODO(hajimehoshi): The interface to offer denial choices should be another |
| +// component instead of Combobox. |
|
Takashi Toyoshima
2013/10/08 14:54:09
Have a crbug for this?
hajimehoshi
2013/10/10 11:07:10
Created. Done.
|
| +class ConfigureComboboxModel : public ui::ComboboxModel { |
| + public: |
| + enum { |
| + INDEX_NOPE = 0, |
| + INDEX_NEVER_TRANSLATE_LANGUAGE = 2, |
| + INDEX_NEVER_TRANSLATE_SITE = 4, |
| + }; |
| + |
| + explicit ConfigureComboboxModel(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 ~ConfigureComboboxModel() {} |
| + |
| + private: |
| + // Overridden from ui::ComboboxModel: |
| + virtual int GetItemCount() const OVERRIDE { |
| + return items_.size(); |
| + } |
| + virtual string16 GetItemAt(int index) OVERRIDE { |
| + return items_.at(index); |
| + } |
| + virtual bool IsItemSeparatorAt(int index) OVERRIDE { |
| + return items_.at(index).empty(); |
| + } |
| + virtual int GetDefaultIndex() const OVERRIDE { |
| + return 0; |
| + } |
| + |
| + std::vector<string16> items_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(ConfigureComboboxModel); |
| +}; |
| + |
| +} // namespace |
| + |
| +TranslateBubbleView* TranslateBubbleView::translate_bubble_view_; |
| + |
| +// static |
| +void TranslateBubbleView::ShowBubble(views::View* anchor_view, |
| + content::WebContents* web_contents, |
| + TranslateBubble::Type type) { |
| + if (IsShowing()) { |
| + translate_bubble_view_->SwitchView(type); |
| + return; |
| + } |
| + |
| + std::string source_language; |
| + std::string target_language; |
| + GetTranslateLanguages(web_contents, &source_language, &target_language); |
| + |
| + translate_bubble_view_ = new TranslateBubbleView(anchor_view, |
| + web_contents, |
| + type, |
| + source_language, |
| + target_language); |
| + views::BubbleDelegateView::CreateBubble(translate_bubble_view_)->Show(); |
| +} |
| + |
| +// static |
| +bool TranslateBubbleView::IsShowing() { |
| + return translate_bubble_view_ != NULL; |
| +} |
| + |
| +TranslateBubbleView::TranslateBubbleView(views::View* anchor_view, |
| + content::WebContents* web_contents, |
| + TranslateBubble::Type type, |
| + const std::string& original_language, |
| + const std::string& target_language) |
| + : BubbleDelegateView(anchor_view, views::BubbleBorder::TOP_RIGHT), |
| + source_language_combobox_(NULL), |
| + target_language_combobox_(NULL), |
| + always_translate_checkbox_(NULL), |
| + ui_delegate_(web_contents, original_language, target_language), |
| + web_contents_(web_contents), |
| + view_type_(type) { |
| + set_margins(gfx::Insets(views::kPanelVertMargin, views::kPanelHorizMargin, |
| + views::kPanelVertMargin, views::kPanelHorizMargin)); |
| +} |
| + |
| +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); |
| +} |
| + |
| +void TranslateBubbleView::Init() { |
| + SetLayoutManager(new views::BoxLayout(views::BoxLayout::kVertical, |
| + 0, 0, 0)); |
| + AddChildViewAt(CreateViewBeforeTranslate(), |
| + TranslateBubble::BEFORE_TRANSLATE); |
| + AddChildViewAt(CreateViewTranslating(), |
| + TranslateBubble::TRANSLATING); |
| + AddChildViewAt(CreateViewAfterTranslate(), |
| + TranslateBubble::AFTER_TRANSLATE); |
| + AddChildViewAt(CreateViewError(), |
| + TranslateBubble::ERROR); |
| + AddChildViewAt(CreateViewAdvanced(), |
| + TranslateBubble::ADVANCED); |
| + |
| + AddAccelerator(ui::Accelerator(ui::VKEY_RETURN, ui::EF_NONE)); |
| + |
| + UpdateChildVisibilities(); |
| +} |
| + |
| +void TranslateBubbleView::ButtonPressed(views::Button* sender, |
| + const ui::Event& event) { |
| + HandleButtonPressed(sender->id()); |
| +} |
| + |
| +void TranslateBubbleView::WindowClosing() { |
| + if (view_type_ == TranslateBubble::BEFORE_TRANSLATE) |
| + ui_delegate_.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 (view_type_) { |
| + case TranslateBubble::BEFORE_TRANSLATE: { |
| + if (accelerator.key_code() == ui::VKEY_RETURN) { |
| + HandleButtonPressed(BUTTON_ID_TRANSLATE); |
| + return true; |
| + } |
| + break; |
| + } |
| + case TranslateBubble::TRANSLATING: |
| + break; |
| + case TranslateBubble::AFTER_TRANSLATE: { |
| + if (accelerator.key_code() == ui::VKEY_RETURN) { |
| + HandleButtonPressed(BUTTON_ID_SHOW_ORIGINAL); |
| + return true; |
| + } |
| + break; |
| + } |
| + case TranslateBubble::ERROR: |
| + break; |
| + case TranslateBubble::ADVANCED: { |
| + if (accelerator.key_code() == ui::VKEY_RETURN) { |
| + HandleButtonPressed(BUTTON_ID_DONE); |
| + return true; |
| + } |
| + break; |
| + } |
| + default: |
| + NOTREACHED(); |
| + 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 = child_at(view_type_)->GetPreferredSize().height(); |
| + return gfx::Size(width, height); |
| +} |
| + |
| +void TranslateBubbleView::OnSelectedIndexChanged(views::Combobox* combobox) { |
| + switch (combobox->id()) { |
| + case COMBOBOX_ID_DENIAL: { |
| + int index = combobox->selected_index(); |
| + switch (index) { |
| + case ConfigureComboboxModel::INDEX_NOPE: |
| + StartFade(false); |
| + break; |
| + case ConfigureComboboxModel::INDEX_NEVER_TRANSLATE_LANGUAGE: |
| + ui_delegate_.SetLanguageBlocked(true); |
| + StartFade(false); |
| + break; |
| + case ConfigureComboboxModel::INDEX_NEVER_TRANSLATE_SITE: |
| + ui_delegate_.SetSiteBlacklist(true); |
| + StartFade(false); |
| + break; |
| + default: |
| + NOTREACHED(); |
| + break; |
| + } |
| + break; |
| + } |
| + case COMBOBOX_ID_SOURCE_LANGUAGE: |
| + UpdateAdvancedView(); |
| + break; |
| + case COMBOBOX_ID_TARGET_LANGUAGE: |
| + UpdateAdvancedView(); |
| + break; |
| + default: |
| + NOTREACHED(); |
| + break; |
| + } |
| +} |
| + |
| +void TranslateBubbleView::LinkClicked(views::Link* source, int event_flags) { |
| + switch (source->id()) { |
| + case LINK_ID_ADVANCED: |
| + SwitchView(TranslateBubble::ADVANCED); |
| + break; |
| + default: |
| + NOTREACHED(); |
| + break; |
| + } |
| +} |
| + |
| +void TranslateBubbleView::HandleButtonPressed(int sender_id) { |
| + switch (sender_id) { |
| + case BUTTON_ID_TRANSLATE: { |
| + ui_delegate_.Translate(); |
| + break; |
| + } |
| + case BUTTON_ID_DONE: { |
| + DCHECK(source_language_combobox_); |
| + DCHECK(target_language_combobox_); |
| + |
| + ui_delegate_.SetOriginalLanguageIndex( |
| + source_language_combobox_->selected_index()); |
| + ui_delegate_.SetTargetLanguageIndex( |
| + target_language_combobox_->selected_index()); |
| + ui_delegate_.Translate(); |
| + break; |
| + } |
| + case BUTTON_ID_CANCEL: { |
| + StartFade(false); |
| + break; |
| + } |
| + case BUTTON_ID_TRY_AGAIN: { |
| + ui_delegate_.Translate(); |
| + break; |
| + } |
| + case BUTTON_ID_SHOW_ORIGINAL: { |
| + ui_delegate_.RevertTranslation(); |
| + StartFade(false); |
| + break; |
| + } |
| + case BUTTON_ID_ALWAYS_TRANSLATE: { |
| + DCHECK(always_translate_checkbox_); |
| + ui_delegate_.SetAlwaysTranslate(always_translate_checkbox_->checked()); |
| + UpdateAdvancedView(); |
| + break; |
| + } |
| + default: |
| + NOTREACHED(); |
| + break; |
| + } |
| +} |
| + |
| +void TranslateBubbleView::SwitchView(TranslateBubble::Type type) { |
| + if (view_type_ == type) |
| + return; |
| + |
| + view_type_ = type; |
| + UpdateChildVisibilities(); |
| + SizeToContents(); |
| +} |
| + |
| +void TranslateBubbleView::UpdateChildVisibilities() { |
| + for (int i = 0; i < child_count(); i++) { |
| + views::View* view = child_at(i); |
| + view->SetVisible(i == view_type_); |
| + } |
| +} |
| + |
| +views::View* TranslateBubbleView::CreateViewBeforeTranslate() { |
| + views::Label* message_label = new views::Label( |
| + l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_BEFORE_TRANSLATE)); |
| + |
| + string16 original_language_name = |
| + ui_delegate_.GetLanguageNameAt(ui_delegate_.GetOriginalLanguageIndex()); |
| + views::Combobox* denial_combobox = new views::Combobox( |
| + new ConfigureComboboxModel(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->AddPaddingColumn(1, 0); |
| + 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(CreateAdvancedLink(this)); |
| + |
| + layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing); |
| + |
| + layout->StartRow(0, COLUMN_SET_ID_CONTENT); |
| + 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 = |
| + ui_delegate_.GetLanguageNameAt(ui_delegate_.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->AddPaddingColumn(1, 0); |
| + 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); |
| + 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->AddPaddingColumn(1, 0); |
| + cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, |
| + 0, GridLayout::USE_PREF, 0, 0); |
| + |
| + layout->StartRow(0, COLUMN_SET_ID_MESSAGE); |
| + layout->AddView(label); |
| + layout->AddView(CreateAdvancedLink(this)); |
| + |
| + layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing); |
| + |
| + layout->StartRow(0, COLUMN_SET_ID_CONTENT); |
| + 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->AddPaddingColumn(1, 0); |
| + cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, |
| + 0, GridLayout::USE_PREF, 0, 0); |
| + |
| + layout->StartRow(0, COLUMN_SET_ID_MESSAGE); |
| + layout->AddView(label); |
| + layout->AddView(CreateAdvancedLink(this)); |
| + |
| + layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing); |
| + |
| + layout->StartRow(0, COLUMN_SET_ID_CONTENT); |
| + layout->AddView(CreateLabelButton( |
| + this, |
| + l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_TRY_AGAIN), |
| + BUTTON_ID_TRY_AGAIN)); |
| + |
| + return view; |
| +} |
| + |
| +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 = ui_delegate_.GetOriginalLanguageIndex(); |
| + source_language_combobox_model_.reset( |
| + new LanguageComboboxModel(source_default_index, ui_delegate_)); |
| + 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 = ui_delegate_.GetTargetLanguageIndex(); |
| + target_language_combobox_model_.reset( |
| + new LanguageComboboxModel(target_default_index, ui_delegate_)); |
| + 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 (!web_contents_->GetBrowserContext()->IsOffTheRecord()) { |
| + 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 (!web_contents_->GetBrowserContext()->IsOffTheRecord()) { |
| + 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->AddPaddingColumn(1, 0); |
| + 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 (!web_contents_->GetBrowserContext()->IsOffTheRecord()) { |
| + 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); |
| + 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::UpdateAdvancedView() { |
| + DCHECK(source_language_combobox_); |
| + DCHECK(target_language_combobox_); |
| + |
| + ui_delegate_.SetOriginalLanguageIndex( |
| + source_language_combobox_->selected_index()); |
| + ui_delegate_.SetTargetLanguageIndex( |
| + target_language_combobox_->selected_index()); |
| + |
| + string16 source_language_name = |
| + ui_delegate_.GetLanguageNameAt(ui_delegate_.GetOriginalLanguageIndex()); |
| + string16 target_language_name = |
| + ui_delegate_.GetLanguageNameAt(ui_delegate_.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( |
| + ui_delegate_.ShouldAlwaysTranslate()); |
| + } |
| +} |