one_click_signin_bubble_view.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/sync/one_click_signin_bubble_view.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback_helpers.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/message_loop.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/google/google_util.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/chromium_strings.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/theme_resources.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/ui_resources.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/keycodes/keyboard_codes.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/button/image_button.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/button/text_button.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/image_view.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/link.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/grid_layout.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/layout_constants.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Minimum width for the mutli-line label. 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kMinimumDialogLabelWidth = 400; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kMinimumLabelWidth = 240; 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kDialogMargin = 16; 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The column set constants that can be used in the InitContent() function 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// to layout views. 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)enum OneClickSigninBubbleColumnTypes { 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) COLUMN_SET_FILL_ALIGN, 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) COLUMN_SET_CONTROLS, 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) COLUMN_SET_TITLE_BAR 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class OneClickSigninDialogView : public OneClickSigninBubbleView { 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OneClickSigninDialogView( 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebContents* web_content, 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::View* anchor_view, 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const BrowserWindow::StartSyncCallback& start_sync_callback); 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Overridden from views::WidgetDelegate: 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ui::ModalType GetModalType() const OVERRIDE; 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Overridden from OneClickSigninBubbleView: 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void InitContent(views::GridLayout* layout) OVERRIDE; 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void GetButtons(views::TextButton** ok_button, 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::TextButton** undo_button) OVERRIDE; 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual views::Link* GetAdvancedLink() OVERRIDE; 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Overridden from views::LinkListener: 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void LinkClicked(views::Link* source, int event_flags) OVERRIDE; 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebContents* web_content_; 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Link* learn_more_link_; 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::ImageButton* close_button_; 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(OneClickSigninDialogView); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)OneClickSigninDialogView::OneClickSigninDialogView( 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebContents* web_content, 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::View* anchor_view, 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const BrowserWindow::StartSyncCallback& start_sync_callback) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : OneClickSigninBubbleView(anchor_view, start_sync_callback), 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_content_(web_content), 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) learn_more_link_(NULL), 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) close_button_(NULL) { 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_arrow_location(views::BubbleBorder::NONE); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_anchor_insets(gfx::Insets(0, 0, anchor_view->height() / 2, 0)); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_close_on_deactivate(false); 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_margins(gfx::Insets(kDialogMargin, kDialogMargin, kDialogMargin, 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kDialogMargin)); 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ui::ModalType OneClickSigninDialogView::GetModalType() const { 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ui::MODAL_TYPE_CHILD; 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void OneClickSigninDialogView::InitContent(views::GridLayout* layout) { 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Column set for title bar. 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::ColumnSet* cs = layout->AddColumnSet(COLUMN_SET_TITLE_BAR); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cs->AddColumn(views::GridLayout::LEADING, views::GridLayout::CENTER, 0, 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::GridLayout::USE_PREF, 0, 0); 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cs->AddPaddingColumn(1, views::kUnrelatedControlHorizontalSpacing); 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cs->AddColumn(views::GridLayout::TRAILING, views::GridLayout::CENTER, 0, 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::GridLayout::USE_PREF, 0, 0); 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layout->StartRow(0, COLUMN_SET_TITLE_BAR); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Label* label = new views::Label( 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_TITLE)); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) label->SetHorizontalAlignment(gfx::ALIGN_LEFT); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) label->SetFont(label->font().DeriveFont(3, gfx::Font::BOLD)); 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layout->AddView(label); 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) close_button_ = new views::ImageButton(this); 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) close_button_->SetImage(views::ImageButton::STATE_NORMAL, 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rb.GetImageNamed(IDR_CLOSE_BAR).ToImageSkia()); 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) close_button_->SetImage(views::ImageButton::STATE_HOVERED, 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rb.GetImageNamed(IDR_CLOSE_BAR_H).ToImageSkia()); 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) close_button_->SetImage(views::ImageButton::STATE_PRESSED, 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rb.GetImageNamed(IDR_CLOSE_BAR_P).ToImageSkia()); 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layout->AddView(close_button_); 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing); 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layout->StartRow(0, COLUMN_SET_FILL_ALIGN); 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Label* label = new views::Label( 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_MESSAGE)); 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) label->SetMultiLine(true); 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) label->SetHorizontalAlignment(gfx::ALIGN_LEFT); 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) label->SizeToFit(kMinimumDialogLabelWidth); 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layout->AddView(label); 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layout->StartRow(0, COLUMN_SET_FILL_ALIGN); 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) learn_more_link_ = new views::Link( 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_LEARN_MORE)); 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) learn_more_link_->set_listener(this); 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) learn_more_link_->SetHorizontalAlignment(gfx::ALIGN_LEFT); 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layout->AddView(learn_more_link_, 1, 1, views::GridLayout::TRAILING, 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::GridLayout::CENTER); 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing); 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void OneClickSigninDialogView::GetButtons(views::TextButton** ok_button, 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::TextButton** undo_button) { 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *ok_button = new views::NativeTextButton(this); 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *undo_button = new views::NativeTextButton(this); 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The default size of the buttons is too large. To allow them to be smaller 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ignore the minimum default size. Furthermore, to make sure they are the 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // same size, SetText() is called with both strings on both buttons. 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*ok_button)->set_ignore_minimum_size(true); 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*undo_button)->set_ignore_minimum_size(true); 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16 ok_label = 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_OK_BUTTON); 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16 undo_label = 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_UNDO_BUTTON); 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*ok_button)->SetText(undo_label); 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*ok_button)->SetText(ok_label); 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*undo_button)->SetText(ok_label); 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*undo_button)->SetText(undo_label); 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)views::Link* OneClickSigninDialogView::GetAdvancedLink() { 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Link* advanced_link= new views::Link( 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_ADVANCED)); 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) advanced_link->set_listener(this); 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) advanced_link->SetHorizontalAlignment(gfx::ALIGN_LEFT); 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return advanced_link; 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void OneClickSigninDialogView::LinkClicked(views::Link* source, 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int event_flags) { 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (source == learn_more_link_) { 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::OpenURLParams params( 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL(chrome::kChromeSyncLearnMoreURL), content::Referrer(), 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NEW_WINDOW, content::PAGE_TRANSITION_LINK, false); 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_content_->OpenURL(params); 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OneClickSigninBubbleView::LinkClicked(source, event_flags); 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OneClickSigninBubbleView ---------------------------------------------------- 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)OneClickSigninBubbleView* OneClickSigninBubbleView::bubble_view_ = NULL; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OneClickSigninBubbleView::ShowBubble( 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserWindow::OneClickSigninBubbleType type, 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ToolbarView* toolbar_view, 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BrowserWindow::StartSyncCallback& start_sync) { 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsShowing()) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bubble_view_ = type == BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_BUBBLE ? 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new OneClickSigninBubbleView(toolbar_view->app_menu(), start_sync) : 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new OneClickSigninDialogView(toolbar_view->GetWebContents(), 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) toolbar_view->location_bar(), start_sync); 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::BubbleDelegateView::CreateBubble(bubble_view_)->Show(); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool OneClickSigninBubbleView::IsShowing() { 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return bubble_view_ != NULL; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OneClickSigninBubbleView::Hide() { 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsShowing()) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bubble_view_->GetWidget()->Close(); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)OneClickSigninBubbleView::OneClickSigninBubbleView( 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::View* anchor_view, 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BrowserWindow::StartSyncCallback& start_sync_callback) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : BubbleDelegateView(anchor_view, views::BubbleBorder::TOP_RIGHT), 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) advanced_link_(NULL), 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ok_button_(NULL), 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) undo_button_(NULL), 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start_sync_callback_(start_sync_callback), 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_for_testing_(NULL) { 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!start_sync_callback_.is_null()); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)OneClickSigninBubbleView::~OneClickSigninBubbleView() { 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OneClickSigninBubbleView::AnimationEnded(const ui::Animation* animation) { 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::BubbleDelegateView::AnimationEnded(animation); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (message_loop_for_testing_) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_for_testing_->Quit(); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OneClickSigninBubbleView::Init() { 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::GridLayout* layout = new views::GridLayout(this); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetLayoutManager(layout); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_border(views::Border::CreateEmptyBorder(8, 8, 8, 8)); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Column set for descriptive text and link. 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::ColumnSet* cs = layout->AddColumnSet(COLUMN_SET_FILL_ALIGN); 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cs->AddColumn(views::GridLayout::FILL, views::GridLayout::CENTER, 1, 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::GridLayout::USE_PREF, 0, 0); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Column set for buttons at bottom of bubble. 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cs = layout->AddColumnSet(COLUMN_SET_CONTROLS); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cs->AddColumn(views::GridLayout::LEADING, views::GridLayout::CENTER, 0, 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::GridLayout::USE_PREF, 0, 0); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cs->AddPaddingColumn(1, views::kUnrelatedControlHorizontalSpacing); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cs->AddColumn(views::GridLayout::TRAILING, views::GridLayout::CENTER, 0, 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::GridLayout::USE_PREF, 0, 0); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cs->AddPaddingColumn(0, views::kRelatedButtonHSpacing); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cs->AddColumn(views::GridLayout::TRAILING, views::GridLayout::CENTER, 0, 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::GridLayout::USE_PREF, 0, 0); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitContent(layout); 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Add controls at the bottom. 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) advanced_link_= GetAdvancedLink(); 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetButtons(&ok_button_, &undo_button_); 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ok_button_->SetIsDefault(true); 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layout->StartRow(0, COLUMN_SET_CONTROLS); 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layout->AddView(advanced_link_); 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layout->AddView(ok_button_); 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layout->AddView(undo_button_); 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddAccelerator(ui::Accelerator(ui::VKEY_RETURN, 0)); 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void OneClickSigninBubbleView::InitContent(views::GridLayout* layout) { 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add main text description. 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Label* label = new views::Label( 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_BUBBLE_MESSAGE)); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) label->SetMultiLine(true); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) label->SetHorizontalAlignment(gfx::ALIGN_LEFT); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) label->SizeToFit(kMinimumLabelWidth); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layout->StartRow(0, COLUMN_SET_FILL_ALIGN); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(label); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddPaddingRow(0, views::kRelatedControlSmallVerticalSpacing); 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void OneClickSigninBubbleView::GetButtons(views::TextButton** ok_button, 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::TextButton** undo_button) { 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *ok_button = new views::NativeTextButton(this); 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *undo_button = new views::NativeTextButton(this); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The default size of the buttons is too large. To allow them to be smaller 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ignore the minimum default size. Furthermore, to make sure they are the 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // same size, SetText() is called with both strings on both buttons. 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*ok_button)->set_ignore_minimum_size(true); 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*undo_button)->set_ignore_minimum_size(true); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 ok_label = l10n_util::GetStringUTF16(IDS_OK); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 undo_label = l10n_util::GetStringUTF16(IDS_ONE_CLICK_BUBBLE_UNDO); 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*ok_button)->SetText(undo_label); 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*ok_button)->SetText(ok_label); 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*undo_button)->SetText(ok_label); 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*undo_button)->SetText(undo_label); 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)views::Link* OneClickSigninBubbleView::GetAdvancedLink() { 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Link* advanced_link= new views::Link( 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_SYNC_PROMO_NTP_BUBBLE_ADVANCED)); 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) advanced_link->set_listener(this); 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) advanced_link->SetHorizontalAlignment(gfx::ALIGN_LEFT); 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return advanced_link; 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OneClickSigninBubbleView::WindowClosing() { 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We have to reset |bubble_view_| here, not in our destructor, because 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we'll be destroyed asynchronously and the shown state will be checked 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // before then. 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(bubble_view_, this); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bubble_view_ = NULL; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!start_sync_callback_.is_null()) { 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ResetAndReturn(&start_sync_callback_).Run( 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OneClickSigninSyncStarter::SYNC_WITH_DEFAULT_SETTINGS); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool OneClickSigninBubbleView::AcceleratorPressed( 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Accelerator& accelerator) { 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (accelerator.key_code() == ui::VKEY_RETURN || 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerator.key_code() == ui::VKEY_ESCAPE) { 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartFade(false); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (accelerator.key_code() == ui::VKEY_RETURN) { 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ResetAndReturn(&start_sync_callback_).Run( 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OneClickSigninSyncStarter::SYNC_WITH_DEFAULT_SETTINGS); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start_sync_callback_.Reset(); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return BubbleDelegateView::AcceleratorPressed(accelerator); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OneClickSigninBubbleView::LinkClicked(views::Link* source, 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int event_flags) { 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartFade(false); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ResetAndReturn(&start_sync_callback_).Run( 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OneClickSigninSyncStarter::CONFIGURE_SYNC_FIRST); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OneClickSigninBubbleView::ButtonPressed(views::Button* sender, 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Event& event) { 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartFade(false); 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ResetAndReturn(&start_sync_callback_).Run((sender == ok_button_) ? 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OneClickSigninSyncStarter::SYNC_WITH_DEFAULT_SETTINGS : 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OneClickSigninSyncStarter::UNDO_SYNC); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 363