| 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..6c29a98df4cbabcc2c2894471cd2dd374494b397 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,158 @@
|
|
|
| // Minimum width for the mutli-line label.
|
| const int kMinimumLabelWidth = 240;
|
| +const int kDialogMargin = 16;
|
| +
|
| +namespace {
|
| +
|
| +class OneClickSigninDialogView : public OneClickSigninBubbleView {
|
| + public:
|
| + // The column set constants that can be used in the InitContent() function
|
| + // to layout views.
|
| + enum {
|
| + kColumnSetTitleBar = kColumnSetLast + 1,
|
| + kColumnSetDescription
|
| + };
|
| +
|
| + 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;
|
| + 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);
|
| +}
|
| +
|
| +}
|
|
|
| // OneClickSigninBubbleView ----------------------------------------------------
|
|
|
| @@ -32,13 +189,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 +241,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);
|
| + 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 +257,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 +268,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 +279,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
|
|
|