| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/ui/views/sync/one_click_signin_bubble_view.h" | 5 #include "chrome/browser/ui/views/sync/one_click_signin_bubble_view.h" |
| 6 | 6 |
| 7 #include "base/callback_helpers.h" | 7 #include "base/callback_helpers.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
| 10 #include "base/utf_string_conversions.h" | |
| 11 #include "chrome/browser/google/google_util.h" | 10 #include "chrome/browser/google/google_util.h" |
| 12 #include "chrome/browser/ui/browser.h" | 11 #include "chrome/browser/ui/browser.h" |
| 13 #include "chrome/browser/ui/sync/one_click_signin_helper.h" | 12 #include "chrome/browser/ui/sync/one_click_signin_helper.h" |
| 14 #include "chrome/browser/ui/sync/one_click_signin_histogram.h" | 13 #include "chrome/browser/ui/sync/one_click_signin_histogram.h" |
| 15 #include "chrome/common/url_constants.h" | 14 #include "chrome/common/url_constants.h" |
| 16 #include "content/public/browser/web_contents.h" | 15 #include "content/public/browser/web_contents.h" |
| 17 #include "grit/chromium_strings.h" | 16 #include "grit/chromium_strings.h" |
| 18 #include "grit/generated_resources.h" | 17 #include "grit/generated_resources.h" |
| 19 #include "grit/theme_resources.h" | 18 #include "grit/theme_resources.h" |
| 20 #include "grit/ui_resources.h" | 19 #include "grit/ui_resources.h" |
| 21 #include "ui/base/keycodes/keyboard_codes.h" | 20 #include "ui/base/keycodes/keyboard_codes.h" |
| 22 #include "ui/base/l10n/l10n_util.h" | 21 #include "ui/base/l10n/l10n_util.h" |
| 23 #include "ui/base/resource/resource_bundle.h" | 22 #include "ui/base/resource/resource_bundle.h" |
| 24 #include "ui/views/controls/button/image_button.h" | 23 #include "ui/views/controls/button/image_button.h" |
| 25 #include "ui/views/controls/button/label_button.h" | 24 #include "ui/views/controls/button/label_button.h" |
| 26 #include "ui/views/controls/image_view.h" | 25 #include "ui/views/controls/image_view.h" |
| 27 #include "ui/views/controls/label.h" | 26 #include "ui/views/controls/label.h" |
| 28 #include "ui/views/controls/link.h" | 27 #include "ui/views/controls/link.h" |
| 29 #include "ui/views/layout/grid_layout.h" | 28 #include "ui/views/layout/grid_layout.h" |
| 30 #include "ui/views/layout/layout_constants.h" | 29 #include "ui/views/layout/layout_constants.h" |
| 31 #include "ui/views/widget/widget.h" | 30 #include "ui/views/widget/widget.h" |
| 32 | 31 |
| 33 // Minimum width for the mutli-line label. | 32 // Minimum width for the multi-line label. |
| 34 const int kMinimumDialogLabelWidth = 400; | 33 const int kMinimumDialogLabelWidth = 400; |
| 35 const int kMinimumLabelWidth = 240; | 34 const int kMinimumLabelWidth = 240; |
| 36 const int kDialogMargin = 16; | 35 const int kDialogMargin = 16; |
| 37 | 36 |
| 38 namespace { | 37 namespace { |
| 39 | 38 |
| 40 // The column set constants that can be used in the InitContent() function | 39 // The column set constants that can be used in the InitContent() function |
| 41 // to layout views. | 40 // to layout views. |
| 42 enum OneClickSigninBubbleColumnTypes { | 41 enum OneClickSigninBubbleColumnTypes { |
| 43 COLUMN_SET_FILL_ALIGN, | 42 COLUMN_SET_FILL_ALIGN, |
| 44 COLUMN_SET_CONTROLS, | 43 COLUMN_SET_CONTROLS, |
| 45 COLUMN_SET_TITLE_BAR | 44 COLUMN_SET_TITLE_BAR |
| 46 }; | 45 }; |
| 47 | |
| 48 class OneClickSigninDialogView : public OneClickSigninBubbleView { | |
| 49 public: | |
| 50 OneClickSigninDialogView( | |
| 51 content::WebContents* web_content, | |
| 52 views::View* anchor_view, | |
| 53 const string16& email, | |
| 54 const BrowserWindow::StartSyncCallback& start_sync_callback); | |
| 55 | |
| 56 private: | |
| 57 // Overridden from views::WidgetDelegate: | |
| 58 virtual ui::ModalType GetModalType() const OVERRIDE; | |
| 59 | |
| 60 // Overridden from OneClickSigninBubbleView: | |
| 61 virtual void InitContent(views::GridLayout* layout) OVERRIDE; | |
| 62 virtual void GetButtons(views::LabelButton** ok_button, | |
| 63 views::LabelButton** undo_button) OVERRIDE; | |
| 64 virtual views::Link* CreateAdvancedLink() OVERRIDE; | |
| 65 | |
| 66 // Overridden from views::LinkListener: | |
| 67 virtual void LinkClicked(views::Link* source, int event_flags) OVERRIDE; | |
| 68 | |
| 69 // Overridden from views::ButtonListener: | |
| 70 virtual void ButtonPressed(views::Button* sender, | |
| 71 const ui::Event& event) OVERRIDE; | |
| 72 | |
| 73 // views::View method: | |
| 74 virtual bool AcceleratorPressed(const ui::Accelerator& accelerator) OVERRIDE; | |
| 75 | |
| 76 const string16 email_; | |
| 77 content::WebContents* web_content_; | |
| 78 views::Link* learn_more_link_; | |
| 79 views::ImageButton* close_button_; | |
| 80 | |
| 81 bool clicked_learn_more_; | |
| 82 | |
| 83 DISALLOW_COPY_AND_ASSIGN(OneClickSigninDialogView); | |
| 84 }; | |
| 85 | |
| 86 OneClickSigninDialogView::OneClickSigninDialogView( | |
| 87 content::WebContents* web_content, | |
| 88 views::View* anchor_view, | |
| 89 const string16& email, | |
| 90 const BrowserWindow::StartSyncCallback& start_sync_callback) | |
| 91 : OneClickSigninBubbleView(anchor_view, start_sync_callback), | |
| 92 email_(email), | |
| 93 web_content_(web_content), | |
| 94 learn_more_link_(NULL), | |
| 95 close_button_(NULL), | |
| 96 clicked_learn_more_(false) { | |
| 97 set_arrow(views::BubbleBorder::NONE); | |
| 98 set_anchor_view_insets(gfx::Insets(0, 0, anchor_view->height() / 2, 0)); | |
| 99 set_close_on_deactivate(false); | |
| 100 set_margins(gfx::Insets(kDialogMargin, kDialogMargin, kDialogMargin, | |
| 101 kDialogMargin)); | |
| 102 } | |
| 103 | |
| 104 ui::ModalType OneClickSigninDialogView::GetModalType() const { | |
| 105 return ui::MODAL_TYPE_CHILD; | |
| 106 } | |
| 107 | |
| 108 void OneClickSigninDialogView::InitContent(views::GridLayout* layout) { | |
| 109 OneClickSigninHelper::LogConfirmHistogramValue( | |
| 110 one_click_signin::HISTOGRAM_CONFIRM_SHOWN); | |
| 111 | |
| 112 // Column set for title bar. | |
| 113 views::ColumnSet* cs = layout->AddColumnSet(COLUMN_SET_TITLE_BAR); | |
| 114 cs->AddColumn(views::GridLayout::LEADING, views::GridLayout::CENTER, 0, | |
| 115 views::GridLayout::USE_PREF, 0, 0); | |
| 116 cs->AddPaddingColumn(1, views::kUnrelatedControlHorizontalSpacing); | |
| 117 cs->AddColumn(views::GridLayout::TRAILING, views::GridLayout::CENTER, 0, | |
| 118 views::GridLayout::USE_PREF, 0, 0); | |
| 119 | |
| 120 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); | |
| 121 | |
| 122 { | |
| 123 layout->StartRow(0, COLUMN_SET_TITLE_BAR); | |
| 124 | |
| 125 views::Label* label = new views::Label(email_.empty() ? | |
| 126 l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_TITLE) : | |
| 127 l10n_util::GetStringFUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_TITLE_NEW, | |
| 128 email_)); | |
| 129 label->SetHorizontalAlignment(gfx::ALIGN_LEFT); | |
| 130 label->SetFont(label->font().DeriveFont(3, gfx::Font::BOLD)); | |
| 131 layout->AddView(label); | |
| 132 | |
| 133 close_button_ = new views::ImageButton(this); | |
| 134 close_button_->SetImage(views::ImageButton::STATE_NORMAL, | |
| 135 rb.GetImageNamed(IDR_CLOSE_2).ToImageSkia()); | |
| 136 close_button_->SetImage(views::ImageButton::STATE_HOVERED, | |
| 137 rb.GetImageNamed(IDR_CLOSE_2_H).ToImageSkia()); | |
| 138 close_button_->SetImage(views::ImageButton::STATE_PRESSED, | |
| 139 rb.GetImageNamed(IDR_CLOSE_2_P).ToImageSkia()); | |
| 140 layout->AddView(close_button_); | |
| 141 } | |
| 142 | |
| 143 layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing); | |
| 144 | |
| 145 { | |
| 146 layout->StartRow(0, COLUMN_SET_FILL_ALIGN); | |
| 147 | |
| 148 views::Label* label = new views::Label(email_.empty() ? | |
| 149 l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_MESSAGE) : | |
| 150 l10n_util::GetStringFUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_MESSAGE_NEW, | |
| 151 email_)); | |
| 152 label->SetMultiLine(true); | |
| 153 label->SetHorizontalAlignment(gfx::ALIGN_LEFT); | |
| 154 label->SizeToFit(kMinimumDialogLabelWidth); | |
| 155 layout->AddView(label); | |
| 156 | |
| 157 layout->StartRow(0, COLUMN_SET_FILL_ALIGN); | |
| 158 | |
| 159 learn_more_link_ = new views::Link( | |
| 160 l10n_util::GetStringUTF16(IDS_LEARN_MORE)); | |
| 161 learn_more_link_->set_listener(this); | |
| 162 learn_more_link_->SetHorizontalAlignment(gfx::ALIGN_LEFT); | |
| 163 layout->AddView(learn_more_link_, 1, 1, views::GridLayout::TRAILING, | |
| 164 views::GridLayout::CENTER); | |
| 165 } | |
| 166 | |
| 167 layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing); | |
| 168 } | |
| 169 | |
| 170 void OneClickSigninDialogView::GetButtons(views::LabelButton** ok_button, | |
| 171 views::LabelButton** undo_button) { | |
| 172 *ok_button = new views::LabelButton(this, string16()); | |
| 173 (*ok_button)->SetStyle(views::Button::STYLE_NATIVE_TEXTBUTTON); | |
| 174 | |
| 175 *undo_button = new views::LabelButton(this, string16()); | |
| 176 (*undo_button)->SetStyle(views::Button::STYLE_NATIVE_TEXTBUTTON); | |
| 177 | |
| 178 // The default size of the buttons is too large. To allow them to be smaller | |
| 179 // ignore the minimum default size. Furthermore, to make sure they are the | |
| 180 // same size, SetText() is called with both strings on both buttons. | |
| 181 (*ok_button)->set_min_size(gfx::Size()); | |
| 182 (*undo_button)->set_min_size(gfx::Size()); | |
| 183 string16 ok_label = | |
| 184 l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_OK_BUTTON); | |
| 185 string16 undo_label = | |
| 186 l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_UNDO_BUTTON); | |
| 187 (*ok_button)->SetText(undo_label); | |
| 188 (*ok_button)->SetText(ok_label); | |
| 189 (*undo_button)->SetText(ok_label); | |
| 190 (*undo_button)->SetText(undo_label); | |
| 191 } | |
| 192 | |
| 193 views::Link* OneClickSigninDialogView::CreateAdvancedLink() { | |
| 194 views::Link* advanced_link= new views::Link( | |
| 195 l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_ADVANCED)); | |
| 196 advanced_link->set_listener(this); | |
| 197 advanced_link->SetHorizontalAlignment(gfx::ALIGN_LEFT); | |
| 198 return advanced_link; | |
| 199 } | |
| 200 | |
| 201 void OneClickSigninDialogView::LinkClicked(views::Link* source, | |
| 202 int event_flags) { | |
| 203 if (source == learn_more_link_) { | |
| 204 if (!clicked_learn_more_) { | |
| 205 OneClickSigninHelper::LogConfirmHistogramValue( | |
| 206 one_click_signin::HISTOGRAM_CONFIRM_LEARN_MORE); | |
| 207 clicked_learn_more_ = true; | |
| 208 } | |
| 209 content::OpenURLParams params( | |
| 210 GURL(chrome::kChromeSyncLearnMoreURL), content::Referrer(), | |
| 211 NEW_WINDOW, content::PAGE_TRANSITION_LINK, false); | |
| 212 web_content_->OpenURL(params); | |
| 213 return; | |
| 214 } | |
| 215 | |
| 216 if (source == GetAdvancedLink()) | |
| 217 OneClickSigninHelper::LogConfirmHistogramValue( | |
| 218 clicked_learn_more_ ? | |
| 219 one_click_signin::HISTOGRAM_CONFIRM_LEARN_MORE_ADVANCED : | |
| 220 one_click_signin::HISTOGRAM_CONFIRM_ADVANCED); | |
| 221 | |
| 222 OneClickSigninBubbleView::LinkClicked(source, event_flags); | |
| 223 } | |
| 224 | |
| 225 void OneClickSigninDialogView::ButtonPressed(views::Button* sender, | |
| 226 const ui::Event& event) { | |
| 227 if (sender == GetOkButton()) | |
| 228 OneClickSigninHelper::LogConfirmHistogramValue( | |
| 229 clicked_learn_more_ ? | |
| 230 one_click_signin::HISTOGRAM_CONFIRM_LEARN_MORE_OK : | |
| 231 one_click_signin::HISTOGRAM_CONFIRM_OK); | |
| 232 | |
| 233 if (sender == GetUndoButton()) | |
| 234 OneClickSigninHelper::LogConfirmHistogramValue( | |
| 235 clicked_learn_more_ ? | |
| 236 one_click_signin::HISTOGRAM_CONFIRM_LEARN_MORE_UNDO : | |
| 237 one_click_signin::HISTOGRAM_CONFIRM_UNDO); | |
| 238 | |
| 239 if (sender == close_button_) | |
| 240 OneClickSigninHelper::LogConfirmHistogramValue( | |
| 241 clicked_learn_more_ ? | |
| 242 one_click_signin::HISTOGRAM_CONFIRM_LEARN_MORE_CLOSE : | |
| 243 one_click_signin::HISTOGRAM_CONFIRM_CLOSE); | |
| 244 | |
| 245 | |
| 246 OneClickSigninBubbleView::ButtonPressed(sender, event); | |
| 247 } | |
| 248 | |
| 249 bool OneClickSigninDialogView::AcceleratorPressed( | |
| 250 const ui::Accelerator& accelerator) { | |
| 251 if (accelerator.key_code() == ui::VKEY_RETURN) | |
| 252 OneClickSigninHelper::LogConfirmHistogramValue( | |
| 253 clicked_learn_more_ ? | |
| 254 one_click_signin::HISTOGRAM_CONFIRM_LEARN_MORE_RETURN : | |
| 255 one_click_signin::HISTOGRAM_CONFIRM_RETURN); | |
| 256 if (accelerator.key_code() == ui::VKEY_ESCAPE) | |
| 257 OneClickSigninHelper::LogConfirmHistogramValue( | |
| 258 clicked_learn_more_ ? | |
| 259 one_click_signin::HISTOGRAM_CONFIRM_LEARN_MORE_ESCAPE : | |
| 260 one_click_signin::HISTOGRAM_CONFIRM_ESCAPE); | |
| 261 return OneClickSigninBubbleView::AcceleratorPressed(accelerator); | |
| 262 } | |
| 263 | |
| 264 } // namespace | 46 } // namespace |
| 265 | 47 |
| 266 // OneClickSigninBubbleView ---------------------------------------------------- | |
| 267 | |
| 268 // static | 48 // static |
| 269 OneClickSigninBubbleView* OneClickSigninBubbleView::bubble_view_ = NULL; | 49 OneClickSigninBubbleView* OneClickSigninBubbleView::bubble_view_ = NULL; |
| 270 | 50 |
| 271 // static | 51 // static |
| 272 void OneClickSigninBubbleView::ShowBubble( | 52 void OneClickSigninBubbleView::ShowBubble( |
| 273 BrowserWindow::OneClickSigninBubbleType type, | 53 BrowserWindow::OneClickSigninBubbleType type, |
| 274 const string16& email, | 54 const string16& email, |
| 55 const string16& error_message, |
| 275 ToolbarView* toolbar_view, | 56 ToolbarView* toolbar_view, |
| 276 const BrowserWindow::StartSyncCallback& start_sync) { | 57 const BrowserWindow::StartSyncCallback& start_sync) { |
| 277 if (IsShowing()) | 58 if (IsShowing()) |
| 278 return; | 59 return; |
| 279 | 60 |
| 280 switch (type) { | 61 switch (type) { |
| 281 case BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_BUBBLE: | 62 case BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_BUBBLE: |
| 282 bubble_view_ = new OneClickSigninBubbleView(toolbar_view->app_menu(), | 63 bubble_view_ = new OneClickSigninBubbleView( |
| 283 start_sync); | 64 toolbar_view->GetWebContents(), toolbar_view->app_menu(), |
| 65 error_message, string16(), start_sync, false); |
| 284 break; | 66 break; |
| 285 case BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_MODAL_DIALOG: | 67 case BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_MODAL_DIALOG: |
| 286 bubble_view_ = new OneClickSigninDialogView( | 68 bubble_view_ = new OneClickSigninBubbleView( |
| 287 toolbar_view->GetWebContents(), toolbar_view->location_bar(), | 69 toolbar_view->GetWebContents(), toolbar_view->location_bar(), |
| 288 string16(), start_sync); | 70 string16(), string16(), start_sync, true); |
| 289 break; | 71 break; |
| 290 case BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_SAML_MODAL_DIALOG: | 72 case BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_SAML_MODAL_DIALOG: |
| 291 bubble_view_ = new OneClickSigninDialogView( | 73 bubble_view_ = new OneClickSigninBubbleView( |
| 292 toolbar_view->GetWebContents(), toolbar_view->location_bar(), | 74 toolbar_view->GetWebContents(), toolbar_view->location_bar(), |
| 293 email, start_sync); | 75 string16(), email, start_sync, true); |
| 294 break; | 76 break; |
| 295 } | 77 } |
| 296 | 78 |
| 297 views::BubbleDelegateView::CreateBubble(bubble_view_)->Show(); | 79 views::BubbleDelegateView::CreateBubble(bubble_view_)->Show(); |
| 298 } | 80 } |
| 299 | 81 |
| 300 // static | 82 // static |
| 301 bool OneClickSigninBubbleView::IsShowing() { | 83 bool OneClickSigninBubbleView::IsShowing() { |
| 302 return bubble_view_ != NULL; | 84 return bubble_view_ != NULL; |
| 303 } | 85 } |
| 304 | 86 |
| 305 // static | 87 // static |
| 306 void OneClickSigninBubbleView::Hide() { | 88 void OneClickSigninBubbleView::Hide() { |
| 307 if (IsShowing()) | 89 if (IsShowing()) |
| 308 bubble_view_->GetWidget()->Close(); | 90 bubble_view_->GetWidget()->Close(); |
| 309 } | 91 } |
| 310 | 92 |
| 311 OneClickSigninBubbleView::OneClickSigninBubbleView( | 93 OneClickSigninBubbleView::OneClickSigninBubbleView( |
| 94 content::WebContents* web_contents, |
| 312 views::View* anchor_view, | 95 views::View* anchor_view, |
| 313 const BrowserWindow::StartSyncCallback& start_sync_callback) | 96 const string16& error_message, |
| 97 const string16& email, |
| 98 const BrowserWindow::StartSyncCallback& start_sync_callback, |
| 99 bool is_sync_dialog) |
| 314 : BubbleDelegateView(anchor_view, views::BubbleBorder::TOP_RIGHT), | 100 : BubbleDelegateView(anchor_view, views::BubbleBorder::TOP_RIGHT), |
| 101 web_contents_(web_contents), |
| 102 error_message_(error_message), |
| 103 email_(email), |
| 104 start_sync_callback_(start_sync_callback), |
| 105 is_sync_dialog_(is_sync_dialog), |
| 315 advanced_link_(NULL), | 106 advanced_link_(NULL), |
| 107 learn_more_link_(NULL), |
| 316 ok_button_(NULL), | 108 ok_button_(NULL), |
| 317 undo_button_(NULL), | 109 undo_button_(NULL), |
| 318 start_sync_callback_(start_sync_callback), | 110 close_button_(NULL), |
| 111 clicked_learn_more_(false), |
| 319 message_loop_for_testing_(NULL) { | 112 message_loop_for_testing_(NULL) { |
| 320 DCHECK(!start_sync_callback_.is_null()); | 113 if (is_sync_dialog_) { |
| 114 DCHECK(!start_sync_callback_.is_null()); |
| 115 set_arrow(views::BubbleBorder::NONE); |
| 116 set_anchor_view_insets(gfx::Insets(0, 0, anchor_view->height() / 2, 0)); |
| 117 set_close_on_deactivate(false); |
| 118 set_margins(gfx::Insets(kDialogMargin, kDialogMargin, kDialogMargin, |
| 119 kDialogMargin)); |
| 120 } |
| 321 } | 121 } |
| 322 | 122 |
| 323 OneClickSigninBubbleView::~OneClickSigninBubbleView() { | 123 OneClickSigninBubbleView::~OneClickSigninBubbleView() { |
| 324 } | 124 } |
| 325 | 125 |
| 126 ui::ModalType OneClickSigninBubbleView::GetModalType() const { |
| 127 return is_sync_dialog_? ui::MODAL_TYPE_CHILD : ui::MODAL_TYPE_NONE; |
| 128 } |
| 129 |
| 326 void OneClickSigninBubbleView::AnimationEnded(const ui::Animation* animation) { | 130 void OneClickSigninBubbleView::AnimationEnded(const ui::Animation* animation) { |
| 327 views::BubbleDelegateView::AnimationEnded(animation); | 131 views::BubbleDelegateView::AnimationEnded(animation); |
| 328 if (message_loop_for_testing_) | 132 if (message_loop_for_testing_) |
| 329 message_loop_for_testing_->Quit(); | 133 message_loop_for_testing_->Quit(); |
| 330 } | 134 } |
| 331 | 135 |
| 332 void OneClickSigninBubbleView::Init() { | 136 void OneClickSigninBubbleView::Init() { |
| 333 views::GridLayout* layout = new views::GridLayout(this); | 137 views::GridLayout* layout = new views::GridLayout(this); |
| 334 SetLayoutManager(layout); | 138 SetLayoutManager(layout); |
| 335 set_border(views::Border::CreateEmptyBorder(8, 8, 8, 8)); | 139 set_border(views::Border::CreateEmptyBorder(8, 8, 8, 8)); |
| 336 | 140 |
| 337 // Column set for descriptive text and link. | 141 // Column set for descriptive text and link. |
| 338 views::ColumnSet* cs = layout->AddColumnSet(COLUMN_SET_FILL_ALIGN); | 142 views::ColumnSet* cs = layout->AddColumnSet(COLUMN_SET_FILL_ALIGN); |
| 339 cs->AddColumn(views::GridLayout::FILL, views::GridLayout::CENTER, 1, | 143 cs->AddColumn(views::GridLayout::FILL, views::GridLayout::CENTER, 1, |
| 340 views::GridLayout::USE_PREF, 0, 0); | 144 views::GridLayout::USE_PREF, 0, 0); |
| 341 | 145 |
| 342 // Column set for buttons at bottom of bubble. | 146 // Column set for buttons at bottom of bubble. |
| 343 cs = layout->AddColumnSet(COLUMN_SET_CONTROLS); | 147 cs = layout->AddColumnSet(COLUMN_SET_CONTROLS); |
| 344 cs->AddColumn(views::GridLayout::LEADING, views::GridLayout::CENTER, 0, | 148 cs->AddColumn(views::GridLayout::LEADING, views::GridLayout::CENTER, 0, |
| 345 views::GridLayout::USE_PREF, 0, 0); | 149 views::GridLayout::USE_PREF, 0, 0); |
| 346 cs->AddPaddingColumn(1, views::kUnrelatedControlHorizontalSpacing); | 150 cs->AddPaddingColumn(1, views::kUnrelatedControlHorizontalSpacing); |
| 347 cs->AddColumn(views::GridLayout::TRAILING, views::GridLayout::CENTER, 0, | 151 cs->AddColumn(views::GridLayout::TRAILING, views::GridLayout::CENTER, 0, |
| 348 views::GridLayout::USE_PREF, 0, 0); | 152 views::GridLayout::USE_PREF, 0, 0); |
| 349 cs->AddPaddingColumn(0, views::kRelatedButtonHSpacing); | 153 cs->AddPaddingColumn(0, views::kRelatedButtonHSpacing); |
| 350 cs->AddColumn(views::GridLayout::TRAILING, views::GridLayout::CENTER, 0, | 154 cs->AddColumn(views::GridLayout::TRAILING, views::GridLayout::CENTER, 0, |
| 351 views::GridLayout::USE_PREF, 0, 0); | 155 views::GridLayout::USE_PREF, 0, 0); |
| 352 | 156 |
| 353 InitContent(layout); | 157 is_sync_dialog_ ? InitDialogContent(layout) : InitBubbleContent(layout); |
| 354 | 158 |
| 355 // Add controls at the bottom. | 159 // Add controls at the bottom. |
| 356 advanced_link_= CreateAdvancedLink(); | 160 InitAdvancedLink(); |
| 357 GetButtons(&ok_button_, &undo_button_); | |
| 358 ok_button_->SetIsDefault(true); | |
| 359 | 161 |
| 360 layout->StartRow(0, COLUMN_SET_CONTROLS); | 162 layout->StartRow(0, COLUMN_SET_CONTROLS); |
| 361 layout->AddView(advanced_link_); | 163 layout->AddView(advanced_link_); |
| 362 layout->AddView(ok_button_); | 164 |
| 363 layout->AddView(undo_button_); | 165 InitButtons(layout); |
| 166 ok_button_->SetIsDefault(true); |
| 364 | 167 |
| 365 AddAccelerator(ui::Accelerator(ui::VKEY_RETURN, 0)); | 168 AddAccelerator(ui::Accelerator(ui::VKEY_RETURN, 0)); |
| 366 } | 169 } |
| 367 | 170 |
| 368 void OneClickSigninBubbleView::InitContent(views::GridLayout* layout) { | 171 void OneClickSigninBubbleView::InitBubbleContent(views::GridLayout* layout) { |
| 369 // Add main text description. | 172 // Add main text description. |
| 370 views::Label* label = new views::Label( | 173 layout->StartRow(0, COLUMN_SET_FILL_ALIGN); |
| 371 l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_BUBBLE_MESSAGE)); | 174 |
| 175 views::Label* label = !error_message_.empty() ? |
| 176 new views::Label(error_message_) : |
| 177 new views::Label( |
| 178 l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_BUBBLE_MESSAGE)); |
| 179 |
| 372 label->SetMultiLine(true); | 180 label->SetMultiLine(true); |
| 373 label->SetHorizontalAlignment(gfx::ALIGN_LEFT); | 181 label->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| 374 label->SizeToFit(kMinimumLabelWidth); | 182 label->SizeToFit(kMinimumLabelWidth); |
| 375 | |
| 376 layout->StartRow(0, COLUMN_SET_FILL_ALIGN); | |
| 377 layout->AddView(label); | 183 layout->AddView(label); |
| 378 | 184 |
| 379 layout->AddPaddingRow(0, views::kRelatedControlSmallVerticalSpacing); | 185 layout->StartRow(0, COLUMN_SET_CONTROLS); |
| 186 |
| 187 InitLearnMoreLink(); |
| 188 layout->AddView(learn_more_link_); |
| 189 } |
| 190 |
| 191 void OneClickSigninBubbleView::InitDialogContent(views::GridLayout* layout) { |
| 192 OneClickSigninHelper::LogConfirmHistogramValue( |
| 193 one_click_signin::HISTOGRAM_CONFIRM_SHOWN); |
| 194 |
| 195 // Column set for title bar. |
| 196 views::ColumnSet* cs = layout->AddColumnSet(COLUMN_SET_TITLE_BAR); |
| 197 cs->AddColumn(views::GridLayout::LEADING, views::GridLayout::CENTER, 0, |
| 198 views::GridLayout::USE_PREF, 0, 0); |
| 199 cs->AddPaddingColumn(1, views::kUnrelatedControlHorizontalSpacing); |
| 200 cs->AddColumn(views::GridLayout::TRAILING, views::GridLayout::CENTER, 0, |
| 201 views::GridLayout::USE_PREF, 0, 0); |
| 202 |
| 203 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
| 204 |
| 205 { |
| 206 layout->StartRow(0, COLUMN_SET_TITLE_BAR); |
| 207 |
| 208 views::Label* label = new views::Label(email_.empty() ? |
| 209 l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_TITLE) : |
| 210 l10n_util::GetStringFUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_TITLE_NEW, |
| 211 email_)); |
| 212 label->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| 213 label->SetFont(label->font().DeriveFont(3, gfx::Font::BOLD)); |
| 214 layout->AddView(label); |
| 215 |
| 216 close_button_ = new views::ImageButton(this); |
| 217 close_button_->SetImage(views::ImageButton::STATE_NORMAL, |
| 218 rb.GetImageNamed(IDR_CLOSE_2).ToImageSkia()); |
| 219 close_button_->SetImage(views::ImageButton::STATE_HOVERED, |
| 220 rb.GetImageNamed(IDR_CLOSE_2_H).ToImageSkia()); |
| 221 close_button_->SetImage(views::ImageButton::STATE_PRESSED, |
| 222 rb.GetImageNamed(IDR_CLOSE_2_P).ToImageSkia()); |
| 223 |
| 224 layout->AddView(close_button_); |
| 225 } |
| 226 |
| 227 layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing); |
| 228 |
| 229 { |
| 230 layout->StartRow(0, COLUMN_SET_FILL_ALIGN); |
| 231 |
| 232 views::Label* label = new views::Label(email_.empty() ? |
| 233 l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_MESSAGE) : |
| 234 l10n_util::GetStringFUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_MESSAGE_NEW, |
| 235 email_)); |
| 236 label->SetMultiLine(true); |
| 237 label->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| 238 label->SizeToFit(kMinimumDialogLabelWidth); |
| 239 layout->AddView(label); |
| 240 |
| 241 layout->StartRow(0, COLUMN_SET_FILL_ALIGN); |
| 242 |
| 243 InitLearnMoreLink(); |
| 244 layout->AddView(learn_more_link_, 1, 1, views::GridLayout::TRAILING, |
| 245 views::GridLayout::CENTER); |
| 246 } |
| 247 |
| 248 layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing); |
| 249 } |
| 250 |
| 251 void OneClickSigninBubbleView::InitButtons(views::GridLayout* layout) { |
| 252 GetButtons(&ok_button_, &undo_button_); |
| 253 layout->AddView(ok_button_); |
| 254 |
| 255 if (is_sync_dialog_) |
| 256 layout->AddView(undo_button_); |
| 380 } | 257 } |
| 381 | 258 |
| 382 void OneClickSigninBubbleView::GetButtons(views::LabelButton** ok_button, | 259 void OneClickSigninBubbleView::GetButtons(views::LabelButton** ok_button, |
| 383 views::LabelButton** undo_button) { | 260 views::LabelButton** undo_button) { |
| 384 *ok_button = new views::LabelButton(this, string16()); | 261 *ok_button = new views::LabelButton(this, string16()); |
| 385 (*ok_button)->SetStyle(views::Button::STYLE_NATIVE_TEXTBUTTON); | 262 (*ok_button)->SetStyle(views::Button::STYLE_NATIVE_TEXTBUTTON); |
| 386 | 263 |
| 387 *undo_button = new views::LabelButton(this, string16()); | 264 // The default size of the buttons is too large. To allow them to be smaller |
| 388 (*undo_button)->SetStyle(views::Button::STYLE_NATIVE_TEXTBUTTON); | 265 // ignore the minimum default size., |
| 266 (*ok_button)->set_min_size(gfx::Size()); |
| 389 | 267 |
| 390 // The default size of the buttons is too large. To allow them to be smaller | 268 string16 ok_label; |
| 391 // ignore the minimum default size. Furthermore, to make sure they are the | |
| 392 // same size, SetText() is called with both strings on both buttons. | |
| 393 (*ok_button)->set_min_size(gfx::Size()); | |
| 394 (*undo_button)->set_min_size(gfx::Size()); | |
| 395 string16 ok_label = l10n_util::GetStringUTF16(IDS_OK); | |
| 396 string16 undo_label = l10n_util::GetStringUTF16(IDS_ONE_CLICK_BUBBLE_UNDO); | |
| 397 (*ok_button)->SetText(undo_label); | |
| 398 (*ok_button)->SetText(ok_label); | |
| 399 (*undo_button)->SetText(ok_label); | |
| 400 (*undo_button)->SetText(undo_label); | |
| 401 } | |
| 402 | 269 |
| 403 views::Link* OneClickSigninBubbleView::CreateAdvancedLink() { | 270 if (is_sync_dialog_) { |
| 404 views::Link* advanced_link= new views::Link( | 271 *undo_button = new views::LabelButton(this, string16()); |
| 405 l10n_util::GetStringUTF16(IDS_SYNC_PROMO_NTP_BUBBLE_ADVANCED)); | 272 (*undo_button)->SetStyle(views::Button::STYLE_NATIVE_TEXTBUTTON); |
| 406 advanced_link->set_listener(this); | 273 (*undo_button)->set_min_size(gfx::Size()); |
| 407 advanced_link->SetHorizontalAlignment(gfx::ALIGN_LEFT); | |
| 408 return advanced_link; | |
| 409 } | |
| 410 | 274 |
| 411 void OneClickSigninBubbleView::WindowClosing() { | 275 ok_label = l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_OK_BUTTON); |
| 412 // We have to reset |bubble_view_| here, not in our destructor, because | 276 string16 undo_label = |
| 413 // we'll be destroyed asynchronously and the shown state will be checked | 277 l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_UNDO_BUTTON); |
| 414 // before then. | |
| 415 DCHECK_EQ(bubble_view_, this); | |
| 416 bubble_view_ = NULL; | |
| 417 | 278 |
| 418 if (!start_sync_callback_.is_null()) { | 279 // To make sure they are the same size, SetText() is called |
| 419 base::ResetAndReturn(&start_sync_callback_).Run( | 280 // with both strings on both buttons. |
| 420 OneClickSigninSyncStarter::SYNC_WITH_DEFAULT_SETTINGS); | 281 (*ok_button)->SetText(undo_label); |
| 282 (*ok_button)->SetText(ok_label); |
| 283 (*undo_button)->SetText(ok_label); |
| 284 (*undo_button)->SetText(undo_label); |
| 285 } else { |
| 286 ok_label = l10n_util::GetStringUTF16(IDS_OK); |
| 287 (*ok_button)->SetText(ok_label); |
| 421 } | 288 } |
| 422 } | 289 } |
| 423 | 290 |
| 291 void OneClickSigninBubbleView::InitAdvancedLink() { |
| 292 advanced_link_ = is_sync_dialog_ ? |
| 293 new views::Link( |
| 294 l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_ADVANCED)): |
| 295 new views::Link( |
| 296 l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_ADVANCED)); |
| 297 |
| 298 advanced_link_->set_listener(this); |
| 299 advanced_link_->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| 300 } |
| 301 |
| 302 void OneClickSigninBubbleView::InitLearnMoreLink() { |
| 303 learn_more_link_ = new views::Link( |
| 304 l10n_util::GetStringUTF16(IDS_LEARN_MORE)); |
| 305 learn_more_link_->set_listener(this); |
| 306 learn_more_link_->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| 307 } |
| 308 |
| 424 bool OneClickSigninBubbleView::AcceleratorPressed( | 309 bool OneClickSigninBubbleView::AcceleratorPressed( |
| 425 const ui::Accelerator& accelerator) { | 310 const ui::Accelerator& accelerator) { |
| 426 if (accelerator.key_code() == ui::VKEY_RETURN || | 311 if (accelerator.key_code() == ui::VKEY_RETURN || |
| 427 accelerator.key_code() == ui::VKEY_ESCAPE) { | 312 accelerator.key_code() == ui::VKEY_ESCAPE) { |
| 428 StartFade(false); | 313 OneClickSigninBubbleView::Hide(); |
| 429 if (accelerator.key_code() == ui::VKEY_RETURN) { | 314 |
| 430 base::ResetAndReturn(&start_sync_callback_).Run( | 315 if (is_sync_dialog_) { |
| 316 if (accelerator.key_code() == ui::VKEY_RETURN) { |
| 317 OneClickSigninHelper::LogConfirmHistogramValue( |
| 318 clicked_learn_more_ ? |
| 319 one_click_signin::HISTOGRAM_CONFIRM_LEARN_MORE_RETURN : |
| 320 one_click_signin::HISTOGRAM_CONFIRM_RETURN); |
| 321 |
| 322 base::ResetAndReturn(&start_sync_callback_).Run( |
| 431 OneClickSigninSyncStarter::SYNC_WITH_DEFAULT_SETTINGS); | 323 OneClickSigninSyncStarter::SYNC_WITH_DEFAULT_SETTINGS); |
| 432 } else { | 324 } else if (accelerator.key_code() == ui::VKEY_ESCAPE) { |
| 433 start_sync_callback_.Reset(); | 325 OneClickSigninHelper::LogConfirmHistogramValue( |
| 326 clicked_learn_more_ ? |
| 327 one_click_signin::HISTOGRAM_CONFIRM_LEARN_MORE_ESCAPE : |
| 328 one_click_signin::HISTOGRAM_CONFIRM_ESCAPE); |
| 329 |
| 330 start_sync_callback_.Reset(); |
| 331 } |
| 434 } | 332 } |
| 435 | 333 |
| 436 return true; | 334 return true; |
| 437 } | 335 } |
| 438 | 336 |
| 439 return BubbleDelegateView::AcceleratorPressed(accelerator); | 337 return BubbleDelegateView::AcceleratorPressed(accelerator); |
| 440 } | 338 } |
| 441 | 339 |
| 442 views::Link* OneClickSigninBubbleView::GetAdvancedLink() { | |
| 443 return advanced_link_; | |
| 444 } | |
| 445 | |
| 446 views::Button* OneClickSigninBubbleView::GetOkButton() { | |
| 447 return ok_button_; | |
| 448 } | |
| 449 | |
| 450 views::Button* OneClickSigninBubbleView::GetUndoButton() { | |
| 451 return undo_button_; | |
| 452 } | |
| 453 | |
| 454 void OneClickSigninBubbleView::LinkClicked(views::Link* source, | 340 void OneClickSigninBubbleView::LinkClicked(views::Link* source, |
| 455 int event_flags) { | 341 int event_flags) { |
| 456 StartFade(false); | 342 if (source == learn_more_link_) { |
| 457 base::ResetAndReturn(&start_sync_callback_).Run( | 343 if (is_sync_dialog_ && !clicked_learn_more_) { |
| 344 OneClickSigninHelper::LogConfirmHistogramValue( |
| 345 one_click_signin::HISTOGRAM_CONFIRM_LEARN_MORE); |
| 346 clicked_learn_more_ = true; |
| 347 } |
| 348 |
| 349 WindowOpenDisposition location = |
| 350 is_sync_dialog_ ? NEW_WINDOW : NEW_FOREGROUND_TAB; |
| 351 |
| 352 content::OpenURLParams params( |
| 353 GURL(chrome::kChromeSyncLearnMoreURL), content::Referrer(), |
| 354 location, content::PAGE_TRANSITION_LINK, false); |
| 355 web_contents_->OpenURL(params); |
| 356 |
| 357 // don't hide the modal dialog, as this is an informational link |
| 358 if (is_sync_dialog_) |
| 359 return; |
| 360 } else if (source == advanced_link_) { |
| 361 if (is_sync_dialog_) { |
| 362 OneClickSigninHelper::LogConfirmHistogramValue( |
| 363 clicked_learn_more_ ? |
| 364 one_click_signin::HISTOGRAM_CONFIRM_LEARN_MORE_ADVANCED : |
| 365 one_click_signin::HISTOGRAM_CONFIRM_ADVANCED); |
| 366 |
| 367 base::ResetAndReturn(&start_sync_callback_).Run( |
| 458 OneClickSigninSyncStarter::CONFIGURE_SYNC_FIRST); | 368 OneClickSigninSyncStarter::CONFIGURE_SYNC_FIRST); |
| 369 } else { |
| 370 content::OpenURLParams params( |
| 371 GURL(chrome::kChromeUISettingsURL), content::Referrer(), |
| 372 CURRENT_TAB, content::PAGE_TRANSITION_LINK, false); |
| 373 web_contents_->OpenURL(params); |
| 374 } |
| 375 } |
| 376 |
| 377 Hide(); |
| 459 } | 378 } |
| 460 | 379 |
| 461 void OneClickSigninBubbleView::ButtonPressed(views::Button* sender, | 380 void OneClickSigninBubbleView::ButtonPressed(views::Button* sender, |
| 462 const ui::Event& event) { | 381 const ui::Event& event) { |
| 463 StartFade(false); | 382 Hide(); |
| 464 base::ResetAndReturn(&start_sync_callback_).Run((sender == ok_button_) ? | 383 |
| 384 if (is_sync_dialog_) { |
| 385 if (sender == ok_button_) |
| 386 OneClickSigninHelper::LogConfirmHistogramValue( |
| 387 clicked_learn_more_ ? |
| 388 one_click_signin::HISTOGRAM_CONFIRM_LEARN_MORE_OK : |
| 389 one_click_signin::HISTOGRAM_CONFIRM_OK); |
| 390 |
| 391 if (sender == undo_button_) |
| 392 OneClickSigninHelper::LogConfirmHistogramValue( |
| 393 clicked_learn_more_ ? |
| 394 one_click_signin::HISTOGRAM_CONFIRM_LEARN_MORE_UNDO : |
| 395 one_click_signin::HISTOGRAM_CONFIRM_UNDO); |
| 396 |
| 397 if (sender == close_button_) |
| 398 OneClickSigninHelper::LogConfirmHistogramValue( |
| 399 clicked_learn_more_ ? |
| 400 one_click_signin::HISTOGRAM_CONFIRM_LEARN_MORE_CLOSE : |
| 401 one_click_signin::HISTOGRAM_CONFIRM_CLOSE); |
| 402 |
| 403 base::ResetAndReturn(&start_sync_callback_).Run((sender == ok_button_) ? |
| 465 OneClickSigninSyncStarter::SYNC_WITH_DEFAULT_SETTINGS : | 404 OneClickSigninSyncStarter::SYNC_WITH_DEFAULT_SETTINGS : |
| 466 OneClickSigninSyncStarter::UNDO_SYNC); | 405 OneClickSigninSyncStarter::UNDO_SYNC); |
| 406 } |
| 467 } | 407 } |
| 408 |
| 409 void OneClickSigninBubbleView::WindowClosing() { |
| 410 // We have to reset |bubble_view_| here, not in our destructor, because |
| 411 // we'll be destroyed asynchronously and the shown state will be checked |
| 412 // before then. |
| 413 DCHECK_EQ(bubble_view_, this); |
| 414 bubble_view_ = NULL; |
| 415 |
| 416 if (is_sync_dialog_ && !start_sync_callback_.is_null()) { |
| 417 base::ResetAndReturn(&start_sync_callback_).Run( |
| 418 OneClickSigninSyncStarter::SYNC_WITH_DEFAULT_SETTINGS); |
| 419 } |
| 420 } |
| OLD | NEW |