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

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

Powered by Google App Engine
This is Rietveld 408576698