Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(684)

Side by Side Diff: chrome/browser/ui/views/sync/one_click_signin_bubble_view.cc

Issue 13979003: Win: Display a native bubble (instead of the JS one) after the web signin flow. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698