Chromium Code Reviews| Index: chrome/browser/ui/views/sync/one_click_signin_bubble_view.cc |
| diff --git a/chrome/browser/ui/views/sync/one_click_signin_bubble_view.cc b/chrome/browser/ui/views/sync/one_click_signin_bubble_view.cc |
| index 3b9ec083b9629d7dcb32f197d18c57631f63a7b5..2aeb4cbaa7e015a3b9fc119beb4fbf130318736d 100644 |
| --- a/chrome/browser/ui/views/sync/one_click_signin_bubble_view.cc |
| +++ b/chrome/browser/ui/views/sync/one_click_signin_bubble_view.cc |
| @@ -10,12 +10,17 @@ |
| #include "chrome/browser/google/google_util.h" |
| #include "chrome/browser/ui/browser.h" |
| #include "chrome/common/url_constants.h" |
| +#include "content/public/browser/web_contents.h" |
| #include "grit/chromium_strings.h" |
| #include "grit/generated_resources.h" |
| +#include "grit/theme_resources.h" |
| +#include "grit/ui_resources.h" |
| #include "ui/base/keycodes/keyboard_codes.h" |
| #include "ui/base/l10n/l10n_util.h" |
| #include "ui/base/resource/resource_bundle.h" |
| +#include "ui/views/controls/button/image_button.h" |
| #include "ui/views/controls/button/text_button.h" |
| +#include "ui/views/controls/image_view.h" |
| #include "ui/views/controls/label.h" |
| #include "ui/views/controls/link.h" |
| #include "ui/views/layout/grid_layout.h" |
| @@ -24,6 +29,161 @@ |
| // Minimum width for the mutli-line label. |
| const int kMinimumLabelWidth = 240; |
| +const int kDialogMargin = 16; |
| + |
| +namespace { |
| + |
| +// The column set constants that can be used in the InitContent() function |
| +// to layout views. |
| +enum { |
|
sky
2013/01/24 17:28:00
Name your enum.
Roger Tawa OOO till Jul 10th
2013/01/24 23:30:10
Done.
|
| + kColumnSetFillAlign, |
|
sky
2013/01/24 17:28:00
chrome uses ALL_CAPS for enums.
Roger Tawa OOO till Jul 10th
2013/01/24 23:30:10
Done.
|
| + kColumnSetControls, |
| + kColumnSetTitleBar, |
| + kColumnSetDescription |
| +}; |
| + |
| +class OneClickSigninDialogView : public OneClickSigninBubbleView { |
| + public: |
| + |
|
sky
2013/01/24 17:28:00
remove newline.
Roger Tawa OOO till Jul 10th
2013/01/24 23:30:10
Done.
|
| + OneClickSigninDialogView( |
| + content::WebContents* web_content, |
| + views::View* anchor_view, |
| + const BrowserWindow::StartSyncCallback& start_sync_callback); |
| + |
| + private: |
| + // Overridden from views::WidgetDelegate: |
| + virtual ui::ModalType GetModalType() const OVERRIDE; |
| + |
| + // Overridden from OneClickSigninBubbleView: |
| + virtual void InitContent(views::GridLayout* layout) OVERRIDE; |
|
sky
2013/01/24 17:28:00
I'm surprised this works. Shouldn't virtual method
Roger Tawa OOO till Jul 10th
2013/01/24 23:30:10
No. This is common to allow behaviour to be overr
sky
2013/01/25 00:51:31
I've seen this in subclasses, but never in the par
|
| + virtual void GetButtons(views::TextButton** ok_button, |
| + views::TextButton** undo_button) OVERRIDE; |
| + |
| + // Overridden from views::LinkListener: |
| + virtual void LinkClicked(views::Link* source, int event_flags) OVERRIDE; |
| + |
| + content::WebContents* web_content_; |
| + views::Link* learn_more_link_; |
| + views::ImageButton* close_button_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(OneClickSigninDialogView); |
| +}; |
| + |
| +OneClickSigninDialogView::OneClickSigninDialogView( |
| + content::WebContents* web_content, |
| + views::View* anchor_view, |
| + const BrowserWindow::StartSyncCallback& start_sync_callback) |
| + : OneClickSigninBubbleView(anchor_view, start_sync_callback), |
| + web_content_(web_content), |
| + learn_more_link_(NULL), |
| + close_button_(NULL) { |
| + set_arrow_location(views::BubbleBorder::NONE); |
| + set_anchor_insets(gfx::Insets(0, 0, anchor_view->height() / 2, 0)); |
| + set_close_on_deactivate(false); |
| + set_margins(gfx::Insets(kDialogMargin, kDialogMargin, kDialogMargin, |
| + kDialogMargin)); |
| +} |
| + |
| +ui::ModalType OneClickSigninDialogView::GetModalType() const { |
| + return ui::MODAL_TYPE_CHILD; |
| +} |
| + |
| +void OneClickSigninDialogView::InitContent(views::GridLayout* layout) { |
| + // Column set for title bar. |
| + views::ColumnSet* cs = layout->AddColumnSet(kColumnSetTitleBar); |
| + cs->AddColumn(views::GridLayout::LEADING, views::GridLayout::CENTER, 0, |
| + views::GridLayout::USE_PREF, 0, 0); |
| + cs->AddPaddingColumn(1, views::kUnrelatedControlHorizontalSpacing); |
| + cs->AddColumn(views::GridLayout::TRAILING, views::GridLayout::CENTER, 0, |
| + views::GridLayout::USE_PREF, 0, 0); |
| + |
| + // Column set for descriptive text and link. |
| + cs = layout->AddColumnSet(kColumnSetDescription); |
| + cs->AddColumn(views::GridLayout::LEADING, views::GridLayout::CENTER, 0, |
| + views::GridLayout::USE_PREF, 0, 0); |
| + cs->AddPaddingColumn(0, views::kRelatedControlSmallHorizontalSpacing); |
| + cs->AddColumn(views::GridLayout::LEADING, views::GridLayout::CENTER, 0, |
| + views::GridLayout::USE_PREF, 0, 0); |
| + |
| + ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
| + |
| + { |
| + layout->StartRow(0, kColumnSetTitleBar); |
| + |
| + views::Label* label = new views::Label( |
| + l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_TITLE)); |
| + label->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| + label->SetFont(label->font().DeriveFont(3, gfx::Font::BOLD)); |
| + layout->AddView(label); |
| + |
| + close_button_ = new views::ImageButton(this); |
| + close_button_->SetImage(views::ImageButton::STATE_NORMAL, |
| + rb.GetImageNamed(IDR_CLOSE_BAR).ToImageSkia()); |
| + close_button_->SetImage(views::ImageButton::STATE_HOVERED, |
| + rb.GetImageNamed(IDR_CLOSE_BAR_H).ToImageSkia()); |
| + close_button_->SetImage(views::ImageButton::STATE_PRESSED, |
| + rb.GetImageNamed(IDR_CLOSE_BAR_P).ToImageSkia()); |
| + layout->AddView(close_button_); |
| + } |
| + |
| + { |
| + layout->StartRow(0, kColumnSetFillAlign); |
| + |
| + views::ImageView* image = new views::ImageView(); |
| + image->SetImage(rb.GetImageNamed(IDR_ONE_CLICK_SIGNIN).ToImageSkia()); |
| + layout->AddView(image); |
| + } |
| + |
| + { |
| + layout->StartRow(0, kColumnSetDescription); |
| + |
| + views::Label* label = new views::Label( |
| + l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_MESSAGE)); |
| + layout->AddView(label); |
| + |
| + learn_more_link_ = new views::Link( |
| + l10n_util::GetStringUTF16(IDS_LEARN_MORE)); |
| + learn_more_link_->set_listener(this); |
| + learn_more_link_->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| + layout->AddView(learn_more_link_); |
| + } |
| + |
| + layout->AddPaddingRow(0, views::kLabelToControlVerticalSpacing); |
| +} |
| + |
| +void OneClickSigninDialogView::GetButtons(views::TextButton** ok_button, |
| + views::TextButton** undo_button) { |
| + *ok_button = new views::NativeTextButton(this); |
| + *undo_button = new views::NativeTextButton(this); |
| + |
| + // The default size of the buttons is too large. To allow them to be smaller |
| + // ignore the minimum default size. Furthermore, to make sure they are the |
| + // same size, SetText() is called with both strings on both buttons. |
| + string16 ok_label = |
| + l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_OK_BUTTON); |
| + string16 undo_label = |
| + l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_UNDO_BUTTON); |
| + (*ok_button)->SetText(undo_label); |
| + (*ok_button)->SetText(ok_label); |
| + (*undo_button)->SetText(ok_label); |
| + (*undo_button)->SetText(undo_label); |
| +} |
| + |
| +void OneClickSigninDialogView::LinkClicked(views::Link* source, |
| + int event_flags) { |
| + if (source == learn_more_link_) { |
| + StartFade(false); |
| + content::OpenURLParams params( |
| + GURL(chrome::kChromeSyncLearnMoreURL), content::Referrer(), |
| + NEW_WINDOW, content::PAGE_TRANSITION_LINK, false); |
| + web_content_->OpenURL(params); |
| + return; |
| + } |
| + |
| + OneClickSigninBubbleView::LinkClicked(source, event_flags); |
| +} |
| + |
| +} |
|
sky
2013/01/24 17:28:00
// namespace
Roger Tawa OOO till Jul 10th
2013/01/24 23:30:10
Done.
|
| // OneClickSigninBubbleView ---------------------------------------------------- |
| @@ -32,13 +192,17 @@ OneClickSigninBubbleView* OneClickSigninBubbleView::bubble_view_ = NULL; |
| // static |
| void OneClickSigninBubbleView::ShowBubble( |
| - views::View* anchor_view, |
| + BrowserWindow::OneClickSigninBubbleType type, |
| + ToolbarView* toolbar_view, |
| const BrowserWindow::StartSyncCallback& start_sync) { |
| if (IsShowing()) |
| return; |
| - bubble_view_ = |
| - new OneClickSigninBubbleView(anchor_view, start_sync); |
| + bubble_view_ = type == BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_BUBBLE ? |
| + new OneClickSigninBubbleView(toolbar_view->app_menu(), start_sync) : |
| + new OneClickSigninDialogView(toolbar_view->GetWebContents(), |
| + toolbar_view->location_bar(), start_sync); |
| + |
| views::BubbleDelegateView::CreateBubble(bubble_view_); |
| bubble_view_->Show(); |
| } |
| @@ -80,16 +244,12 @@ void OneClickSigninBubbleView::Init() { |
| SetLayoutManager(layout); |
| set_border(views::Border::CreateEmptyBorder(8, 8, 8, 8)); |
| - enum { |
| - kColumnSetFillAlign, |
| - kColumnSetControls |
| - }; |
| - |
| // Column set for descriptive text and link. |
| views::ColumnSet* cs = layout->AddColumnSet(kColumnSetFillAlign); |
| - cs->AddColumn(views::GridLayout::FILL, views::GridLayout::CENTER, 0, |
| - views::GridLayout::USE_PREF, 0, kMinimumLabelWidth); |
| + cs->AddColumn(views::GridLayout::FILL, views::GridLayout::CENTER, 1, |
| + views::GridLayout::USE_PREF, 0, 0); |
| + // Column set for buttons at bottom of bubble. |
| cs = layout->AddColumnSet(kColumnSetControls); |
| cs->AddColumn(views::GridLayout::LEADING, views::GridLayout::CENTER, 0, |
| views::GridLayout::USE_PREF, 0, 0); |
| @@ -100,15 +260,7 @@ void OneClickSigninBubbleView::Init() { |
| cs->AddColumn(views::GridLayout::TRAILING, views::GridLayout::CENTER, 0, |
| views::GridLayout::USE_PREF, 0, 0); |
| - // Add main text description. |
| - views::Label* label = new views::Label( |
| - l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_BUBBLE_MESSAGE)); |
| - label->SetMultiLine(true); |
| - label->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| - label->SizeToFit(kMinimumLabelWidth); |
| - |
| - layout->StartRow(0, kColumnSetFillAlign); |
| - layout->AddView(label); |
| + InitContent(layout); |
| layout->AddPaddingRow(0, views::kRelatedControlSmallVerticalSpacing); |
| @@ -119,23 +271,9 @@ void OneClickSigninBubbleView::Init() { |
| advanced_link_->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| // Add controls at the bottom. |
| - ok_button_ = new views::NativeTextButton(this); |
| + GetButtons(&ok_button_, &undo_button_); |
| ok_button_->SetIsDefault(true); |
| - undo_button_ = new views::NativeTextButton(this); |
| - |
| - // The default size of the buttons is too large. To allow them to be smaller |
| - // ignore the minimum default size. Furthermore, to make sure they are the |
| - // same size, SetText() is called with both strings on both buttons. |
| - ok_button_->set_ignore_minimum_size(true); |
| - undo_button_->set_ignore_minimum_size(true); |
| - string16 ok_label = l10n_util::GetStringUTF16(IDS_OK); |
| - string16 undo_label = l10n_util::GetStringUTF16(IDS_ONE_CLICK_BUBBLE_UNDO); |
| - ok_button_->SetText(undo_label); |
| - ok_button_->SetText(ok_label); |
| - undo_button_->SetText(ok_label); |
| - undo_button_->SetText(undo_label); |
| - |
| layout->StartRow(0, kColumnSetControls); |
| layout->AddView(advanced_link_); |
| layout->AddView(ok_button_); |
| @@ -144,6 +282,36 @@ void OneClickSigninBubbleView::Init() { |
| AddAccelerator(ui::Accelerator(ui::VKEY_RETURN, 0)); |
| } |
| +void OneClickSigninBubbleView::InitContent(views::GridLayout* layout) { |
| + // Add main text description. |
| + views::Label* label = new views::Label( |
| + l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_BUBBLE_MESSAGE)); |
| + label->SetMultiLine(true); |
| + label->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| + label->SizeToFit(kMinimumLabelWidth); |
| + |
| + layout->StartRow(0, kColumnSetFillAlign); |
| + layout->AddView(label); |
| +} |
| + |
| +void OneClickSigninBubbleView::GetButtons(views::TextButton** ok_button, |
| + views::TextButton** undo_button) { |
| + *ok_button = new views::NativeTextButton(this); |
| + *undo_button = new views::NativeTextButton(this); |
| + |
| + // The default size of the buttons is too large. To allow them to be smaller |
| + // ignore the minimum default size. Furthermore, to make sure they are the |
| + // same size, SetText() is called with both strings on both buttons. |
| + (*ok_button)->set_ignore_minimum_size(true); |
| + (*undo_button)->set_ignore_minimum_size(true); |
| + string16 ok_label = l10n_util::GetStringUTF16(IDS_OK); |
| + string16 undo_label = l10n_util::GetStringUTF16(IDS_ONE_CLICK_BUBBLE_UNDO); |
| + (*ok_button)->SetText(undo_label); |
| + (*ok_button)->SetText(ok_label); |
| + (*undo_button)->SetText(ok_label); |
| + (*undo_button)->SetText(undo_label); |
| +} |
| + |
| void OneClickSigninBubbleView::WindowClosing() { |
| // We have to reset |bubble_view_| here, not in our destructor, because |
| // we'll be destroyed asynchronously and the shown state will be checked |