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

Side by Side Diff: chrome/browser/ui/views/chooser_content_view.cc

Issue 2468403002: Make WebBluetooth chooser consistent on Android and desktops (desktop part) (Closed)
Patch Set: address comments Created 4 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 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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/chooser_content_view.h" 5 #include "chrome/browser/ui/views/chooser_content_view.h"
6 6
7 #include "base/numerics/safe_conversions.h" 7 #include "base/numerics/safe_conversions.h"
8 #include "chrome/grit/generated_resources.h" 8 #include "chrome/grit/generated_resources.h"
9 #include "ui/base/l10n/l10n_util.h" 9 #include "ui/base/l10n/l10n_util.h"
10 #include "ui/base/resource/resource_bundle.h" 10 #include "ui/base/resource/resource_bundle.h"
11 #include "ui/gfx/color_palette.h" 11 #include "ui/gfx/color_palette.h"
12 #include "ui/gfx/geometry/point.h" 12 #include "ui/gfx/geometry/point.h"
13 #include "ui/gfx/geometry/rect.h" 13 #include "ui/gfx/geometry/rect.h"
14 #include "ui/gfx/image/image_skia.h" 14 #include "ui/gfx/image/image_skia.h"
15 #include "ui/gfx/paint_vector_icon.h" 15 #include "ui/gfx/paint_vector_icon.h"
16 #include "ui/gfx/vector_icons_public.h" 16 #include "ui/gfx/vector_icons_public.h"
17 #include "ui/resources/grit/ui_resources.h" 17 #include "ui/resources/grit/ui_resources.h"
18 #include "ui/views/controls/link.h"
19 #include "ui/views/controls/styled_label.h" 18 #include "ui/views/controls/styled_label.h"
20 #include "ui/views/controls/table/table_view.h" 19 #include "ui/views/controls/table/table_view.h"
21 #include "ui/views/controls/throbber.h" 20 #include "ui/views/controls/throbber.h"
21 #include "ui/views/widget/widget.h"
22 22
23 namespace { 23 namespace {
24 24
25 const int kChooserWidth = 330; 25 const int kChooserWidth = 370;
26 26
27 const int kChooserHeight = 220; 27 const int kChooserHeight = 260;
28 28
29 const int kThrobberDiameter = 24; 29 const int kThrobberDiameter = 24;
30 30
31 const int kAdapterOffHelpLinkPadding = 5; 31 const int kAdapterOffHelpLinkPadding = 5;
32 32
33 // The lookup table for signal strength level image. 33 // The lookup table for signal strength level image.
34 const int kSignalStrengthLevelImageIds[5] = {IDR_SIGNAL_0_BAR, IDR_SIGNAL_1_BAR, 34 const int kSignalStrengthLevelImageIds[5] = {IDR_SIGNAL_0_BAR, IDR_SIGNAL_1_BAR,
35 IDR_SIGNAL_2_BAR, IDR_SIGNAL_3_BAR, 35 IDR_SIGNAL_2_BAR, IDR_SIGNAL_3_BAR,
36 IDR_SIGNAL_4_BAR}; 36 IDR_SIGNAL_4_BAR};
37 37
38 } // namespace 38 } // namespace
39 39
40 ChooserContentView::ChooserContentView( 40 ChooserContentView::ChooserContentView(
41 views::TableViewObserver* table_view_observer, 41 views::TableViewObserver* table_view_observer,
42 std::unique_ptr<ChooserController> chooser_controller) 42 std::unique_ptr<ChooserController> chooser_controller)
43 : chooser_controller_(std::move(chooser_controller)) { 43 : chooser_controller_(std::move(chooser_controller)),
44 help_text_(l10n_util::GetStringFUTF16(
45 IDS_DEVICE_CHOOSER_GET_HELP_LINK_WITH_SCANNING_STATUS,
46 base::string16())),
47 help_and_scanning_text_(l10n_util::GetStringFUTF16(
48 IDS_DEVICE_CHOOSER_GET_HELP_LINK_WITH_SCANNING_STATUS,
49 l10n_util::GetStringUTF16(IDS_BLUETOOTH_DEVICE_CHOOSER_SCANNING))) {
50 base::string16 re_scan_text =
51 l10n_util::GetStringUTF16(IDS_BLUETOOTH_DEVICE_CHOOSER_RE_SCAN);
52 std::vector<size_t> offsets;
53 help_and_re_scan_text_ = l10n_util::GetStringFUTF16(
54 IDS_DEVICE_CHOOSER_GET_HELP_LINK_WITH_RE_SCAN_LINK, help_text_,
55 re_scan_text, &offsets);
56 help_text_range_ = gfx::Range(offsets[0], offsets[0] + help_text_.size());
57 re_scan_text_range_ =
58 gfx::Range(offsets[1], offsets[1] + re_scan_text.size());
44 chooser_controller_->set_view(this); 59 chooser_controller_->set_view(this);
45 std::vector<ui::TableColumn> table_columns; 60 std::vector<ui::TableColumn> table_columns;
46 table_columns.push_back(ui::TableColumn()); 61 table_columns.push_back(ui::TableColumn());
47 table_view_ = new views::TableView( 62 table_view_ = new views::TableView(
48 this, table_columns, 63 this, table_columns,
49 chooser_controller_->ShouldShowIconBeforeText() ? views::ICON_AND_TEXT 64 chooser_controller_->ShouldShowIconBeforeText() ? views::ICON_AND_TEXT
50 : views::TEXT_ONLY, 65 : views::TEXT_ONLY,
51 true /* single_selection */); 66 true /* single_selection */);
52 table_view_->set_select_on_remove(false); 67 table_view_->set_select_on_remove(false);
53 table_view_->SetObserver(table_view_observer); 68 table_view_->SetObserver(table_view_observer);
(...skipping 16 matching lines...) Expand all
70 gfx::Range(0, link_text.size()), 85 gfx::Range(0, link_text.size()),
71 views::StyledLabel::RangeStyleInfo::CreateForLink()); 86 views::StyledLabel::RangeStyleInfo::CreateForLink());
72 turn_adapter_off_help_->SetVisible(false); 87 turn_adapter_off_help_->SetVisible(false);
73 AddChildView(turn_adapter_off_help_); 88 AddChildView(turn_adapter_off_help_);
74 } 89 }
75 90
76 ChooserContentView::~ChooserContentView() { 91 ChooserContentView::~ChooserContentView() {
77 chooser_controller_->set_view(nullptr); 92 chooser_controller_->set_view(nullptr);
78 table_view_->SetObserver(nullptr); 93 table_view_->SetObserver(nullptr);
79 table_view_->SetModel(nullptr); 94 table_view_->SetModel(nullptr);
80 if (discovery_state_)
81 discovery_state_->set_listener(nullptr);
82 } 95 }
83 96
84 gfx::Size ChooserContentView::GetPreferredSize() const { 97 gfx::Size ChooserContentView::GetPreferredSize() const {
85 return gfx::Size(kChooserWidth, kChooserHeight); 98 return gfx::Size(kChooserWidth, kChooserHeight);
86 } 99 }
87 100
88 void ChooserContentView::Layout() { 101 void ChooserContentView::Layout() {
89 gfx::Rect rect(GetContentsBounds()); 102 gfx::Rect rect(GetContentsBounds());
90 table_parent_->SetBoundsRect(rect); 103 table_parent_->SetBoundsRect(rect);
91 // Set the throbber in the center of the chooser. 104 // Set the throbber in the center of the chooser.
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
182 // This will also disable the OK button if it was enabled because 195 // This will also disable the OK button if it was enabled because
183 // of a previously selected row. 196 // of a previously selected row.
184 table_view_->Select(-1); 197 table_view_->Select(-1);
185 UpdateTableView(); 198 UpdateTableView();
186 table_view_->SetVisible(enabled); 199 table_view_->SetVisible(enabled);
187 turn_adapter_off_help_->SetVisible(!enabled); 200 turn_adapter_off_help_->SetVisible(!enabled);
188 201
189 throbber_->Stop(); 202 throbber_->Stop();
190 throbber_->SetVisible(false); 203 throbber_->SetVisible(false);
191 204
192 discovery_state_->SetText(chooser_controller_->GetStatus()); 205 if (enabled) {
193 discovery_state_->SetEnabled(enabled); 206 SetGetHelpAndReScanLink();
207 } else {
208 footnote_link_->SetText(help_text_);
209 footnote_link_->AddStyleRange(
210 help_text_range_, views::StyledLabel::RangeStyleInfo::CreateForLink());
211 }
212
213 footnote_link_->GetWidget()->GetRootView()->Layout();
sky 2016/11/03 22:33:52 You really don't need footnote_link_ here (and bel
juncai 2016/11/04 02:27:47 I tested it with a long string, and the widget has
194 } 214 }
195 215
196 void ChooserContentView::OnRefreshStateChanged(bool refreshing) { 216 void ChooserContentView::OnRefreshStateChanged(bool refreshing) {
197 if (refreshing) { 217 if (refreshing) {
198 // No row is selected since the chooser is refreshing. This will also 218 // No row is selected since the chooser is refreshing. This will also
199 // disable the OK button if it was enabled because of a previously 219 // disable the OK button if it was enabled because of a previously
200 // selected row. 220 // selected row.
201 table_view_->Select(-1); 221 table_view_->Select(-1);
202 UpdateTableView(); 222 UpdateTableView();
203 } 223 }
204 224
205 // When refreshing and no option available yet, hide |table_view_| and show 225 // When refreshing and no option available yet, hide |table_view_| and show
206 // |throbber_|. Otherwise show |table_view_| and hide |throbber_|. 226 // |throbber_|. Otherwise show |table_view_| and hide |throbber_|.
207 bool throbber_visible = 227 bool throbber_visible =
208 refreshing && (chooser_controller_->NumOptions() == 0); 228 refreshing && (chooser_controller_->NumOptions() == 0);
209 table_view_->SetVisible(!throbber_visible); 229 table_view_->SetVisible(!throbber_visible);
210 throbber_->SetVisible(throbber_visible); 230 throbber_->SetVisible(throbber_visible);
211 if (throbber_visible) 231 if (throbber_visible)
212 throbber_->Start(); 232 throbber_->Start();
213 else 233 else
214 throbber_->Stop(); 234 throbber_->Stop();
215 235
216 discovery_state_->SetText(chooser_controller_->GetStatus()); 236 if (refreshing) {
217 // When refreshing, disable |discovery_state_| to show it as a text label. 237 footnote_link_->SetText(help_and_scanning_text_);
218 // When complete, enable |discovery_state_| to show it as a link. 238 footnote_link_->AddStyleRange(
219 discovery_state_->SetEnabled(!refreshing); 239 help_text_range_, views::StyledLabel::RangeStyleInfo::CreateForLink());
220 } 240 } else {
241 SetGetHelpAndReScanLink();
242 }
221 243
222 void ChooserContentView::LinkClicked(views::Link* source, int event_flags) { 244 footnote_link_->GetWidget()->GetRootView()->Layout();
223 if (source == discovery_state_)
224 chooser_controller_->RefreshOptions();
225 else
226 NOTREACHED();
227 } 245 }
228 246
229 void ChooserContentView::StyledLabelLinkClicked(views::StyledLabel* label, 247 void ChooserContentView::StyledLabelLinkClicked(views::StyledLabel* label,
230 const gfx::Range& range, 248 const gfx::Range& range,
231 int event_flags) { 249 int event_flags) {
232 if (label == turn_adapter_off_help_) 250 if (label == turn_adapter_off_help_) {
233 chooser_controller_->OpenAdapterOffHelpUrl(); 251 chooser_controller_->OpenAdapterOffHelpUrl();
234 else if (label == help_link_) 252 } else if (label == footnote_link_) {
235 chooser_controller_->OpenHelpCenterUrl(); 253 if (range == help_text_range_)
236 else 254 chooser_controller_->OpenHelpCenterUrl();
255 else if (range == re_scan_text_range_)
256 chooser_controller_->RefreshOptions();
257 else
258 NOTREACHED();
259 } else {
237 NOTREACHED(); 260 NOTREACHED();
261 }
238 } 262 }
239 263
240 base::string16 ChooserContentView::GetWindowTitle() const { 264 base::string16 ChooserContentView::GetWindowTitle() const {
241 return chooser_controller_->GetTitle(); 265 return chooser_controller_->GetTitle();
242 } 266 }
243 267
244 base::string16 ChooserContentView::GetDialogButtonLabel( 268 base::string16 ChooserContentView::GetDialogButtonLabel(
245 ui::DialogButton button) const { 269 ui::DialogButton button) const {
246 return button == ui::DIALOG_BUTTON_OK 270 return button == ui::DIALOG_BUTTON_OK
247 ? chooser_controller_->GetOkButtonLabel() 271 ? chooser_controller_->GetOkButtonLabel()
248 : l10n_util::GetStringUTF16(IDS_DEVICE_CHOOSER_CANCEL_BUTTON_TEXT); 272 : l10n_util::GetStringUTF16(IDS_DEVICE_CHOOSER_CANCEL_BUTTON_TEXT);
249 } 273 }
250 274
251 bool ChooserContentView::IsDialogButtonEnabled(ui::DialogButton button) const { 275 bool ChooserContentView::IsDialogButtonEnabled(ui::DialogButton button) const {
252 return button != ui::DIALOG_BUTTON_OK || 276 return button != ui::DIALOG_BUTTON_OK ||
253 !table_view_->selection_model().empty(); 277 !table_view_->selection_model().empty();
254 } 278 }
255 279
256 views::Link* ChooserContentView::CreateExtraView() {
257 discovery_state_ = new views::Link(chooser_controller_->GetStatus());
258 discovery_state_->SetHandlesTooltips(false);
259 discovery_state_->SetUnderline(false);
260 discovery_state_->SetMultiLine(true);
261 discovery_state_->SizeToFit(kChooserWidth / 2);
262 discovery_state_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
263 discovery_state_->set_listener(this);
264 return discovery_state_;
265 }
266
267 views::StyledLabel* ChooserContentView::CreateFootnoteView() { 280 views::StyledLabel* ChooserContentView::CreateFootnoteView() {
268 base::string16 link = 281 footnote_link_ = new views::StyledLabel(help_text_, this);
269 l10n_util::GetStringUTF16(IDS_DEVICE_CHOOSER_GET_HELP_LINK_TEXT); 282 footnote_link_->AddStyleRange(
270 size_t offset = 0; 283 help_text_range_, views::StyledLabel::RangeStyleInfo::CreateForLink());
271 base::string16 text = l10n_util::GetStringFUTF16( 284 return footnote_link_;
272 IDS_DEVICE_CHOOSER_FOOTNOTE_TEXT, link, &offset);
273 help_link_ = new views::StyledLabel(text, this);
274 help_link_->AddStyleRange(
275 gfx::Range(offset, offset + link.length()),
276 views::StyledLabel::RangeStyleInfo::CreateForLink());
277 return help_link_;
278 } 285 }
279 286
280 void ChooserContentView::Accept() { 287 void ChooserContentView::Accept() {
281 chooser_controller_->Select(table_view_->selection_model().active()); 288 chooser_controller_->Select(table_view_->selection_model().active());
282 } 289 }
283 290
284 void ChooserContentView::Cancel() { 291 void ChooserContentView::Cancel() {
285 chooser_controller_->Cancel(); 292 chooser_controller_->Cancel();
286 } 293 }
287 294
288 void ChooserContentView::Close() { 295 void ChooserContentView::Close() {
289 chooser_controller_->Close(); 296 chooser_controller_->Close();
290 } 297 }
291 298
292 void ChooserContentView::UpdateTableView() { 299 void ChooserContentView::UpdateTableView() {
293 if (chooser_controller_->NumOptions() == 0) { 300 if (chooser_controller_->NumOptions() == 0) {
294 table_view_->OnModelChanged(); 301 table_view_->OnModelChanged();
295 table_view_->SetEnabled(false); 302 table_view_->SetEnabled(false);
296 } else { 303 } else {
297 table_view_->SetEnabled(true); 304 table_view_->SetEnabled(true);
298 } 305 }
299 } 306 }
307
308 void ChooserContentView::SetGetHelpAndReScanLink() {
309 footnote_link_->SetText(help_and_re_scan_text_);
310 footnote_link_->AddStyleRange(
311 help_text_range_, views::StyledLabel::RangeStyleInfo::CreateForLink());
312 footnote_link_->AddStyleRange(
313 re_scan_text_range_, views::StyledLabel::RangeStyleInfo::CreateForLink());
314 }
OLDNEW
« no previous file with comments | « chrome/browser/ui/views/chooser_content_view.h ('k') | chrome/browser/ui/views/chooser_content_view_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698