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

Side by Side Diff: chrome/browser/ui/views/autofill/save_card_bubble_views.cc

Issue 1407093007: Autofill: Add legal message footer to save credit card bubble. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Change interface for retrieving lines + give each line its own StyledLabel. Created 5 years, 1 month 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/autofill/save_card_bubble_views.h" 5 #include "chrome/browser/ui/views/autofill/save_card_bubble_views.h"
6 6
7 #include "base/strings/utf_string_conversions.h" 7 #include "base/strings/utf_string_conversions.h"
8 #include "chrome/browser/ui/autofill/autofill_dialog_types.h"
8 #include "chrome/browser/ui/autofill/save_card_bubble_controller.h" 9 #include "chrome/browser/ui/autofill/save_card_bubble_controller.h"
9 #include "grit/components_strings.h" 10 #include "grit/components_strings.h"
10 #include "ui/base/l10n/l10n_util.h" 11 #include "ui/base/l10n/l10n_util.h"
11 #include "ui/views/bubble/bubble_frame_view.h" 12 #include "ui/views/bubble/bubble_frame_view.h"
12 #include "ui/views/controls/button/blue_button.h" 13 #include "ui/views/controls/button/blue_button.h"
13 #include "ui/views/controls/button/label_button.h" 14 #include "ui/views/controls/button/label_button.h"
14 #include "ui/views/controls/link.h" 15 #include "ui/views/controls/link.h"
16 #include "ui/views/controls/styled_label.h"
17 #include "ui/views/layout/box_layout.h"
15 #include "ui/views/layout/grid_layout.h" 18 #include "ui/views/layout/grid_layout.h"
16 #include "ui/views/layout/layout_constants.h" 19 #include "ui/views/layout/layout_constants.h"
17 20
18 using views::GridLayout; 21 using views::GridLayout;
19 22
20 namespace { 23 namespace {
21 24
22 // Fixed width of the column holding the message text. 25 // Fixed width of the column holding the message text.
23 const int kWidthOfMessageText = 375; 26 const int kWidthOfMessageText = 375;
24 27
25 // TODO(bondd): BubbleManager will eventually move this logic somewhere else, 28 // TODO(bondd): BubbleManager will eventually move this logic somewhere else,
26 // and then kIsOkButtonOnLeftSide can be removed from here and 29 // and then kIsOkButtonOnLeftSide can be removed from here and
27 // dialog_client_view.cc. 30 // dialog_client_view.cc.
28 #if defined(OS_WIN) || defined(OS_CHROMEOS) 31 #if defined(OS_WIN) || defined(OS_CHROMEOS)
29 const bool kIsOkButtonOnLeftSide = true; 32 const bool kIsOkButtonOnLeftSide = true;
30 #else 33 #else
31 const bool kIsOkButtonOnLeftSide = false; 34 const bool kIsOkButtonOnLeftSide = false;
32 #endif 35 #endif
33 36
37 views::StyledLabel* CreateLegalMessageLineLabel(
38 const autofill::SaveCardBubbleController::LegalMessageLine& line,
39 views::StyledLabelListener& listener) {
40 views::StyledLabel* label = new views::StyledLabel(line.text, &listener);
41 const std::vector<autofill::SaveCardBubbleController::LegalMessageLine::Link>&
42 links = line.links;
43 for (size_t i = 0; i < links.size(); ++i) {
44 label->AddStyleRange(links[i].range,
45 views::StyledLabel::RangeStyleInfo::CreateForLink());
46 }
47 label->SizeToFit(kWidthOfMessageText);
48 return label;
49 }
50
34 } // namespace 51 } // namespace
35 52
36 namespace autofill { 53 namespace autofill {
37 54
38 SaveCardBubbleViews::SaveCardBubbleViews(views::View* anchor_view, 55 SaveCardBubbleViews::SaveCardBubbleViews(views::View* anchor_view,
39 content::WebContents* web_contents, 56 content::WebContents* web_contents,
40 SaveCardBubbleController* controller) 57 SaveCardBubbleController* controller)
41 : LocationBarBubbleDelegateView(anchor_view, web_contents), 58 : LocationBarBubbleDelegateView(anchor_view, web_contents),
42 controller_(controller), 59 controller_(controller),
43 save_button_(nullptr), 60 save_button_(nullptr),
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
88 controller_->OnCancelButton(); 105 controller_->OnCancelButton();
89 } 106 }
90 GetWidget()->Close(); 107 GetWidget()->Close();
91 } 108 }
92 109
93 void SaveCardBubbleViews::LinkClicked(views::Link* source, int event_flags) { 110 void SaveCardBubbleViews::LinkClicked(views::Link* source, int event_flags) {
94 DCHECK_EQ(source, learn_more_link_); 111 DCHECK_EQ(source, learn_more_link_);
95 controller_->OnLearnMoreClicked(); 112 controller_->OnLearnMoreClicked();
96 } 113 }
97 114
98 void SaveCardBubbleViews::Init() { 115 void SaveCardBubbleViews::StyledLabelLinkClicked(views::StyledLabel& label,
116 const gfx::Range& range,
117 int event_flags) {
118 const std::vector<SaveCardBubbleController::LegalMessageLine::Link>& links =
119 legal_message_lines_[&label]->links;
120 for (size_t i = 0; i < links.size(); ++i) {
Evan Stade 2015/11/13 01:33:07 this is why i suggested a map for range->url. But
bondd 2015/11/13 22:30:43 Yep, I tried a map and decided against it when I f
121 if (links[i].range == range) {
122 controller_->OnLegalMessageLinkClicked(links[i].url);
123 return;
124 }
125 }
126 // |range| was not found.
127 NOTREACHED();
128 }
129
130 // Create view containing everything except for the footnote.
131 // ASCII art diagram of view contents:
132 // +---------------------------------------------------------------------------+
133 // | |
134 // | learn_more_link_ save_button_ cancel_button_ |
135 // | |
136 // +---------------------------------------------------------------------------+
137 views::View* SaveCardBubbleViews::CreateMainContentView() {
99 enum { 138 enum {
100 COLUMN_SET_ID_MESSAGE, 139 COLUMN_SET_ID_MESSAGE,
101 COLUMN_SET_ID_BUTTONS, 140 COLUMN_SET_ID_BUTTONS,
102 }; 141 };
103 142
104 GridLayout* layout = new GridLayout(this); 143 View* view = new View();
Evan Stade 2015/11/13 01:33:07 nit: scoped_ptr
bondd 2015/11/13 22:30:43 Sorry, can you explain this out a bit further, or
Justin Donnelly 2015/11/13 22:51:04 The idea is to be defensive against future changes
bondd 2015/11/17 00:12:04 Done. Thanks for the detailed explanation.
105 SetLayoutManager(layout); 144 GridLayout* layout = new GridLayout(view);
145 view->SetLayoutManager(layout);
106 146
107 // Set up ColumnSet that will contain the full-width message text. 147 // Set up ColumnSet that will contain the full-width message text.
108 int horizontal_inset = GetBubbleFrameView()->GetTitleInsets().left(); 148 int horizontal_inset = GetBubbleFrameView()->GetTitleInsets().left();
109 views::ColumnSet* cs = layout->AddColumnSet(COLUMN_SET_ID_MESSAGE); 149 views::ColumnSet* cs = layout->AddColumnSet(COLUMN_SET_ID_MESSAGE);
110 cs->AddPaddingColumn(0, horizontal_inset); 150 cs->AddPaddingColumn(0, horizontal_inset);
111 // TODO(bondd): Current dialog layout has no message text, but future layouts 151 // TODO(bondd): Current dialog layout has no message text, but future layouts
112 // will. This padding column is used until then to set the dialog width. 152 // will. This padding column is used until then to set the dialog width.
113 cs->AddPaddingColumn(1, kWidthOfMessageText); 153 cs->AddPaddingColumn(1, kWidthOfMessageText);
114 cs->AddPaddingColumn(0, horizontal_inset); 154 cs->AddPaddingColumn(0, horizontal_inset);
115 155
116 // Set up ColumnSet that will contain the buttons and "learn more" link. 156 // Set up ColumnSet that will contain the buttons and "learn more" link.
117 cs = layout->AddColumnSet(COLUMN_SET_ID_BUTTONS); 157 cs = layout->AddColumnSet(COLUMN_SET_ID_BUTTONS);
118 cs->AddPaddingColumn(0, horizontal_inset); 158 cs->AddPaddingColumn(0, horizontal_inset);
119 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0, 159 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0,
120 GridLayout::USE_PREF, 0, 0); 160 GridLayout::USE_PREF, 0, 0);
121 cs->AddPaddingColumn(1, 0); 161 cs->AddPaddingColumn(1, 0);
122 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0, 162 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0,
123 GridLayout::USE_PREF, 0, 0); 163 GridLayout::USE_PREF, 0, 0);
124 cs->AddPaddingColumn(0, views::kRelatedButtonHSpacing); 164 cs->AddPaddingColumn(0, views::kRelatedButtonHSpacing);
125 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0, 165 cs->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0,
126 GridLayout::USE_PREF, 0, 0); 166 GridLayout::USE_PREF, 0, 0);
127 cs->AddPaddingColumn(0, horizontal_inset); 167 cs->AddPaddingColumn(0, horizontal_inset);
128 168
129 // Create "learn more" link and add it to layout. 169 // Create "learn more" link and add it to layout.
130 learn_more_link_ = new views::Link(l10n_util::GetStringUTF16(IDS_LEARN_MORE)); 170 learn_more_link_ = new views::Link(l10n_util::GetStringUTF16(IDS_LEARN_MORE));
171 learn_more_link_->SetUnderline(false);
131 learn_more_link_->set_listener(this); 172 learn_more_link_->set_listener(this);
132 layout->StartRow(0, COLUMN_SET_ID_BUTTONS); 173 layout->StartRow(0, COLUMN_SET_ID_BUTTONS);
133 layout->AddView(learn_more_link_); 174 layout->AddView(learn_more_link_);
134 175
135 // Create accept button. 176 // Create accept button.
136 save_button_ = new views::BlueButton( 177 save_button_ = new views::BlueButton(
137 this, l10n_util::GetStringUTF16(IDS_AUTOFILL_SAVE_CARD_BUBBLE_ACCEPT)); 178 this, l10n_util::GetStringUTF16(IDS_AUTOFILL_SAVE_CARD_BUBBLE_ACCEPT));
138 save_button_->SetIsDefault(true); 179 save_button_->SetIsDefault(true);
139 180
140 // Create cancel button. 181 // Create cancel button.
141 cancel_button_ = new views::LabelButton( 182 cancel_button_ = new views::LabelButton(
142 this, l10n_util::GetStringUTF16(IDS_AUTOFILL_SAVE_CARD_BUBBLE_DENY)); 183 this, l10n_util::GetStringUTF16(IDS_AUTOFILL_SAVE_CARD_BUBBLE_DENY));
143 cancel_button_->SetStyle(views::Button::STYLE_BUTTON); 184 cancel_button_->SetStyle(views::Button::STYLE_BUTTON);
144 185
145 if (kIsOkButtonOnLeftSide) { 186 if (kIsOkButtonOnLeftSide) {
146 layout->AddView(save_button_); 187 layout->AddView(save_button_);
147 layout->AddView(cancel_button_); 188 layout->AddView(cancel_button_);
148 } else { 189 } else {
149 layout->AddView(cancel_button_); 190 layout->AddView(cancel_button_);
150 layout->AddView(save_button_); 191 layout->AddView(save_button_);
151 } 192 }
152 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 193 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
153 194
195 return view;
196 }
197
198 // Create view containing the legal message text.
199 views::View* SaveCardBubbleViews::CreateFootnoteView() {
200 // Use BoxLayout to provide insets around the label.
201 View* view = new View();
Evan Stade 2015/11/13 01:33:07 nit: scoped_ptr
202 int horizontal_inset = GetBubbleFrameView()->GetTitleInsets().left();
203 view->SetLayoutManager(
204 new views::BoxLayout(views::BoxLayout::kVertical, horizontal_inset,
205 views::kRelatedControlVerticalSpacing, 0));
206 view->SetBorder(
207 views::Border::CreateSolidSidedBorder(1, 0, 0, 0, kSubtleBorderColor));
208 view->set_background(
209 views::Background::CreateSolidBackground(kLightShadingColor));
210
211 // Add a StyledLabel for each line of the legal message.
212 for (size_t i = 0; i < controller_->GetLegalMessageLines().size(); ++i) {
213 views::StyledLabel* label = CreateLegalMessageLineLabel(
214 controller_->GetLegalMessageLines()[i], *this);
215 view->AddChildView(label);
216
217 legal_message_lines_[label] = &controller_->GetLegalMessageLines()[i];
218 }
219
220 return view;
221 }
222
223 void SaveCardBubbleViews::Init() {
224 SetLayoutManager(new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 0));
225 AddChildView(CreateMainContentView());
226 if (!controller_->GetLegalMessageLines().empty())
227 AddChildView(CreateFootnoteView());
228
154 set_margins(gfx::Insets(1, 0, 1, 0)); 229 set_margins(gfx::Insets(1, 0, 1, 0));
155 Layout();
156 } 230 }
157 231
158 } // namespace autofill 232 } // namespace autofill
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698