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