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

Side by Side Diff: chrome/browser/ui/cocoa/chooser_content_view_cocoa.mm

Issue 2354023003: Add help link when Bluetooth adapter is off for WebBluetooth chooser on Mac (Closed)
Patch Set: rebase Created 4 years, 2 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 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 #import "chrome/browser/ui/cocoa/chooser_content_view_cocoa.h" 5 #import "chrome/browser/ui/cocoa/chooser_content_view_cocoa.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/macros.h" 9 #include "base/macros.h"
10 #include "base/strings/sys_string_conversions.h" 10 #include "base/strings/sys_string_conversions.h"
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
53 // Separator alpha value. 53 // Separator alpha value.
54 const CGFloat kSeparatorAlphaValue = 0.6f; 54 const CGFloat kSeparatorAlphaValue = 0.6f;
55 55
56 // Separator height. 56 // Separator height.
57 const CGFloat kSeparatorHeight = 1.0f; 57 const CGFloat kSeparatorHeight = 1.0f;
58 58
59 // Distance between two views inside the table row view. 59 // Distance between two views inside the table row view.
60 const CGFloat kTableRowViewHorizontalPadding = 5.0f; 60 const CGFloat kTableRowViewHorizontalPadding = 5.0f;
61 const CGFloat kTableRowViewVerticalPadding = 1.0f; 61 const CGFloat kTableRowViewVerticalPadding = 1.0f;
62 62
63 // Distance between the adapter off help link and the scroll view boundaries.
64 const CGFloat kAdapterOffHelpLinkPadding = 5.0f;
65
63 // The lookup table for signal strength level image. 66 // The lookup table for signal strength level image.
64 const int kSignalStrengthLevelImageIds[5] = {IDR_SIGNAL_0_BAR, IDR_SIGNAL_1_BAR, 67 const int kSignalStrengthLevelImageIds[5] = {IDR_SIGNAL_0_BAR, IDR_SIGNAL_1_BAR,
65 IDR_SIGNAL_2_BAR, IDR_SIGNAL_3_BAR, 68 IDR_SIGNAL_2_BAR, IDR_SIGNAL_3_BAR,
66 IDR_SIGNAL_4_BAR}; 69 IDR_SIGNAL_4_BAR};
67 const int kSignalStrengthLevelImageSelectedIds[5] = { 70 const int kSignalStrengthLevelImageSelectedIds[5] = {
68 IDR_SIGNAL_0_BAR_SELECTED, IDR_SIGNAL_1_BAR_SELECTED, 71 IDR_SIGNAL_0_BAR_SELECTED, IDR_SIGNAL_1_BAR_SELECTED,
69 IDR_SIGNAL_2_BAR_SELECTED, IDR_SIGNAL_3_BAR_SELECTED, 72 IDR_SIGNAL_2_BAR_SELECTED, IDR_SIGNAL_3_BAR_SELECTED,
70 IDR_SIGNAL_4_BAR_SELECTED}; 73 IDR_SIGNAL_4_BAR_SELECTED};
71 74
72 // Creates a label with |text|. 75 // Creates a label with |text|.
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
226 - (NSTextField*)pairedStatus { 229 - (NSTextField*)pairedStatus {
227 return pairedStatus_.get(); 230 return pairedStatus_.get();
228 } 231 }
229 232
230 @end 233 @end
231 234
232 class ChooserContentViewController : public ChooserController::View { 235 class ChooserContentViewController : public ChooserController::View {
233 public: 236 public:
234 ChooserContentViewController(ChooserContentViewCocoa* chooser_content_view, 237 ChooserContentViewController(ChooserContentViewCocoa* chooser_content_view,
235 ChooserController* chooser_controller, 238 ChooserController* chooser_controller,
239 NSButton* adapter_off_help_button,
236 NSTableView* table_view, 240 NSTableView* table_view,
237 SpinnerView* spinner, 241 SpinnerView* spinner,
238 NSTextField* status, 242 NSTextField* status,
239 NSButton* rescan_button); 243 NSButton* rescan_button);
240 ~ChooserContentViewController() override; 244 ~ChooserContentViewController() override;
241 245
242 // ChooserController::View: 246 // ChooserController::View:
243 void OnOptionsInitialized() override; 247 void OnOptionsInitialized() override;
244 void OnOptionAdded(size_t index) override; 248 void OnOptionAdded(size_t index) override;
245 void OnOptionRemoved(size_t index) override; 249 void OnOptionRemoved(size_t index) override;
246 void OnOptionUpdated(size_t index) override; 250 void OnOptionUpdated(size_t index) override;
247 void OnAdapterEnabledChanged(bool enabled) override; 251 void OnAdapterEnabledChanged(bool enabled) override;
248 void OnRefreshStateChanged(bool refreshing) override; 252 void OnRefreshStateChanged(bool refreshing) override;
249 253
250 void UpdateTableView(); 254 void UpdateTableView();
251 255
252 private: 256 private:
253 ChooserContentViewCocoa* chooser_content_view_; 257 ChooserContentViewCocoa* chooser_content_view_;
254 ChooserController* chooser_controller_; 258 ChooserController* chooser_controller_;
259 NSButton* adapter_off_help_button_;
255 NSTableView* table_view_; 260 NSTableView* table_view_;
256 SpinnerView* spinner_; 261 SpinnerView* spinner_;
257 NSTextField* status_; 262 NSTextField* status_;
258 NSButton* rescan_button_; 263 NSButton* rescan_button_;
259 264
260 DISALLOW_COPY_AND_ASSIGN(ChooserContentViewController); 265 DISALLOW_COPY_AND_ASSIGN(ChooserContentViewController);
261 }; 266 };
262 267
263 ChooserContentViewController::ChooserContentViewController( 268 ChooserContentViewController::ChooserContentViewController(
264 ChooserContentViewCocoa* chooser_content_view, 269 ChooserContentViewCocoa* chooser_content_view,
265 ChooserController* chooser_controller, 270 ChooserController* chooser_controller,
271 NSButton* adapter_off_help_button,
266 NSTableView* table_view, 272 NSTableView* table_view,
267 SpinnerView* spinner, 273 SpinnerView* spinner,
268 NSTextField* status, 274 NSTextField* status,
269 NSButton* rescan_button) 275 NSButton* rescan_button)
270 : chooser_content_view_(chooser_content_view), 276 : chooser_content_view_(chooser_content_view),
271 chooser_controller_(chooser_controller), 277 chooser_controller_(chooser_controller),
278 adapter_off_help_button_(adapter_off_help_button),
272 table_view_(table_view), 279 table_view_(table_view),
273 spinner_(spinner), 280 spinner_(spinner),
274 status_(status), 281 status_(status),
275 rescan_button_(rescan_button) { 282 rescan_button_(rescan_button) {
276 DCHECK(chooser_controller_); 283 DCHECK(chooser_controller_);
284 DCHECK(adapter_off_help_button_);
277 DCHECK(table_view_); 285 DCHECK(table_view_);
278 DCHECK(spinner_); 286 DCHECK(spinner_);
279 DCHECK(status_); 287 DCHECK(status_);
280 DCHECK(rescan_button_); 288 DCHECK(rescan_button_);
281 chooser_controller_->set_view(this); 289 chooser_controller_->set_view(this);
282 } 290 }
283 291
284 ChooserContentViewController::~ChooserContentViewController() { 292 ChooserContentViewController::~ChooserContentViewController() {
285 chooser_controller_->set_view(nullptr); 293 chooser_controller_->set_view(nullptr);
286 } 294 }
(...skipping 30 matching lines...) Expand all
317 void ChooserContentViewController::OnOptionUpdated(size_t index) { 325 void ChooserContentViewController::OnOptionUpdated(size_t index) {
318 UpdateTableView(); 326 UpdateTableView();
319 } 327 }
320 328
321 void ChooserContentViewController::OnAdapterEnabledChanged(bool enabled) { 329 void ChooserContentViewController::OnAdapterEnabledChanged(bool enabled) {
322 // No row is selected since the adapter status has changed. 330 // No row is selected since the adapter status has changed.
323 // This will also disable the OK button if it was enabled because 331 // This will also disable the OK button if it was enabled because
324 // of a previously selected row. 332 // of a previously selected row.
325 [table_view_ deselectAll:nil]; 333 [table_view_ deselectAll:nil];
326 UpdateTableView(); 334 UpdateTableView();
327 [table_view_ setHidden:NO]; 335 [table_view_ setHidden:enabled ? NO : YES];
336 [adapter_off_help_button_ setHidden:enabled ? YES : NO];
328 337
329 [spinner_ setHidden:YES]; 338 [spinner_ setHidden:YES];
330 339
331 [status_ setHidden:YES]; 340 [status_ setHidden:YES];
332 // When adapter is enabled, show |rescan_button_|; otherwise hide it. 341 // When adapter is enabled, show |rescan_button_|; otherwise hide it.
333 [rescan_button_ setHidden:enabled ? NO : YES]; 342 [rescan_button_ setHidden:enabled ? NO : YES];
334 343
335 [chooser_content_view_ updateView]; 344 [chooser_content_view_ updateView];
336 } 345 }
337 346
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
402 NSRect chooserFrame = NSMakeRect(0, 0, kChooserWidth, kChooserHeight); 411 NSRect chooserFrame = NSMakeRect(0, 0, kChooserWidth, kChooserHeight);
403 412
404 if ((self = [super initWithFrame:chooserFrame])) { 413 if ((self = [super initWithFrame:chooserFrame])) {
405 chooserController_ = std::move(chooserController); 414 chooserController_ = std::move(chooserController);
406 415
407 // Create the views. 416 // Create the views.
408 // Title. 417 // Title.
409 titleView_ = [self createChooserTitle:chooserTitle]; 418 titleView_ = [self createChooserTitle:chooserTitle];
410 titleHeight_ = NSHeight([titleView_ frame]); 419 titleHeight_ = NSHeight([titleView_ frame]);
411 420
421 // Adapter turned off help button.
422 adapterOffHelpButton_ =
423 [self createHyperlinkButtonWithText:
424 l10n_util::GetNSString(
425 IDS_BLUETOOTH_DEVICE_CHOOSER_TURN_ADAPTER_OFF)];
426 CGFloat adapterOffHelpButtonHeight =
427 NSHeight([adapterOffHelpButton_ frame]);
428
412 // Status. 429 // Status.
413 status_ = CreateLabel( 430 status_ = CreateLabel(
414 l10n_util::GetNSString(IDS_BLUETOOTH_DEVICE_CHOOSER_SCANNING)); 431 l10n_util::GetNSString(IDS_BLUETOOTH_DEVICE_CHOOSER_SCANNING));
415 CGFloat statusWidth = kChooserWidth / 2 - kMarginX; 432 CGFloat statusWidth = kChooserWidth / 2 - kMarginX;
416 // The height is arbitrary as it will be adjusted later. 433 // The height is arbitrary as it will be adjusted later.
417 [status_ setFrameSize:NSMakeSize(statusWidth, 0.0f)]; 434 [status_ setFrameSize:NSMakeSize(statusWidth, 0.0f)];
418 [GTMUILocalizerAndLayoutTweaker sizeToFitFixedWidthTextField:status_]; 435 [GTMUILocalizerAndLayoutTweaker sizeToFitFixedWidthTextField:status_];
419 statusHeight_ = NSHeight([status_ frame]); 436 statusHeight_ = NSHeight([status_ frame]);
420 437
421 // Re-scan button. 438 // Re-scan button.
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
453 470
454 // ScollView embedding with TableView. 471 // ScollView embedding with TableView.
455 noStatusOrRescanButtonShown_.scroll_view_frame = 472 noStatusOrRescanButtonShown_.scroll_view_frame =
456 [self calculateScrollViewFrame:buttonRowHeight]; 473 [self calculateScrollViewFrame:buttonRowHeight];
457 scrollView_.reset([[NSScrollView alloc] 474 scrollView_.reset([[NSScrollView alloc]
458 initWithFrame:noStatusOrRescanButtonShown_.scroll_view_frame]); 475 initWithFrame:noStatusOrRescanButtonShown_.scroll_view_frame]);
459 [scrollView_ setBorderType:NSBezelBorder]; 476 [scrollView_ setBorderType:NSBezelBorder];
460 [scrollView_ setHasVerticalScroller:YES]; 477 [scrollView_ setHasVerticalScroller:YES];
461 [scrollView_ setHasHorizontalScroller:YES]; 478 [scrollView_ setHasHorizontalScroller:YES];
462 [scrollView_ setAutohidesScrollers:YES]; 479 [scrollView_ setAutohidesScrollers:YES];
480 [scrollView_ setDrawsBackground:NO];
463 481
464 // TableView. 482 // TableView.
465 tableView_.reset([[NSTableView alloc] initWithFrame:NSZeroRect]); 483 tableView_.reset([[NSTableView alloc] initWithFrame:NSZeroRect]);
466 tableColumn_.reset([[NSTableColumn alloc] initWithIdentifier:@""]); 484 tableColumn_.reset([[NSTableColumn alloc] initWithIdentifier:@""]);
467 [tableColumn_ 485 [tableColumn_
468 setWidth:(noStatusOrRescanButtonShown_.scroll_view_frame.size.width - 486 setWidth:(noStatusOrRescanButtonShown_.scroll_view_frame.size.width -
469 kMarginX)]; 487 kMarginX)];
470 [tableView_ addTableColumn:tableColumn_]; 488 [tableView_ addTableColumn:tableColumn_];
471 // Make the column title invisible. 489 // Make the column title invisible.
472 [tableView_ setHeaderView:nil]; 490 [tableView_ setHeaderView:nil];
(...skipping 17 matching lines...) Expand all
490 initWithFrame:NSMakeRect(spinnerOriginX, spinnerOriginY, kSpinnerSize, 508 initWithFrame:NSMakeRect(spinnerOriginX, spinnerOriginY, kSpinnerSize,
491 kSpinnerSize)]); 509 kSpinnerSize)]);
492 510
493 // Lay out the views. 511 // Lay out the views.
494 // Title. 512 // Title.
495 CGFloat titleOriginX = kMarginX; 513 CGFloat titleOriginX = kMarginX;
496 CGFloat titleOriginY = kChooserHeight - kMarginY - titleHeight_; 514 CGFloat titleOriginY = kChooserHeight - kMarginY - titleHeight_;
497 [titleView_ setFrameOrigin:NSMakePoint(titleOriginX, titleOriginY)]; 515 [titleView_ setFrameOrigin:NSMakePoint(titleOriginX, titleOriginY)];
498 [self addSubview:titleView_]; 516 [self addSubview:titleView_];
499 517
518 // Adapter turned off help button.
519 CGFloat adapterOffHelpButtonOriginX = kMarginX + kAdapterOffHelpLinkPadding;
520 CGFloat adapterOffHelpButtonOriginY = titleOriginY - kVerticalPadding -
521 adapterOffHelpButtonHeight -
522 kAdapterOffHelpLinkPadding;
523 [adapterOffHelpButton_
524 setFrameOrigin:NSMakePoint(adapterOffHelpButtonOriginX,
525 adapterOffHelpButtonOriginY)];
526 [adapterOffHelpButton_ setTarget:self];
527 [adapterOffHelpButton_ setAction:@selector(onAdapterOffHelp:)];
528 [adapterOffHelpButton_ setHidden:YES];
529 [self addSubview:adapterOffHelpButton_];
530
500 // ScollView and Spinner. Only one of them is shown. 531 // ScollView and Spinner. Only one of them is shown.
501 [scrollView_ setDocumentView:tableView_]; 532 [scrollView_ setDocumentView:tableView_];
502 [self addSubview:scrollView_]; 533 [self addSubview:scrollView_];
503 [spinner_ setHidden:YES]; 534 [spinner_ setHidden:YES];
504 [self addSubview:spinner_]; 535 [self addSubview:spinner_];
505 536
506 // Status text field and Re-scan button. At most one of them is shown. 537 // Status text field and Re-scan button. At most one of them is shown.
507 [self addSubview:status_]; 538 [self addSubview:status_];
508 [status_ setHidden:YES]; 539 [status_ setHidden:YES];
509 540
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
559 590
560 buttonRowHeight = 591 buttonRowHeight =
561 std::max(rescanButtonHeight_, 592 std::max(rescanButtonHeight_,
562 std::max(connectButtonHeight_, cancelButtonHeight_)); 593 std::max(connectButtonHeight_, cancelButtonHeight_));
563 rescanButtonShown_ = {[self calculateScrollViewFrame:buttonRowHeight], 594 rescanButtonShown_ = {[self calculateScrollViewFrame:buttonRowHeight],
564 [self calculateConnectButtonOrigin:buttonRowHeight], 595 [self calculateConnectButtonOrigin:buttonRowHeight],
565 [self calculateCancelButtonOrigin:buttonRowHeight]}; 596 [self calculateCancelButtonOrigin:buttonRowHeight]};
566 rescanButtonOrigin_ = [self calculateRescanButtonOrigin:buttonRowHeight]; 597 rescanButtonOrigin_ = [self calculateRescanButtonOrigin:buttonRowHeight];
567 598
568 chooserContentViewController_.reset(new ChooserContentViewController( 599 chooserContentViewController_.reset(new ChooserContentViewController(
569 self, chooserController_.get(), tableView_.get(), spinner_.get(), 600 self, chooserController_.get(), adapterOffHelpButton_.get(),
570 status_.get(), rescanButton_.get())); 601 tableView_.get(), spinner_.get(), status_.get(), rescanButton_.get()));
571 } 602 }
572 603
573 return self; 604 return self;
574 } 605 }
575 606
576 - (base::scoped_nsobject<NSTextField>)createChooserTitle:(NSString*)title { 607 - (base::scoped_nsobject<NSTextField>)createChooserTitle:(NSString*)title {
577 base::scoped_nsobject<NSTextField> titleView( 608 base::scoped_nsobject<NSTextField> titleView(
578 [[NSTextField alloc] initWithFrame:NSZeroRect]); 609 [[NSTextField alloc] initWithFrame:NSZeroRect]);
579 [titleView setDrawsBackground:NO]; 610 [titleView setDrawsBackground:NO];
580 [titleView setBezeled:NO]; 611 [titleView setBezeled:NO];
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
728 frameAndOrigin = rescanButtonShown_; 759 frameAndOrigin = rescanButtonShown_;
729 } else { 760 } else {
730 frameAndOrigin = noStatusOrRescanButtonShown_; 761 frameAndOrigin = noStatusOrRescanButtonShown_;
731 } 762 }
732 763
733 [scrollView_ setFrame:frameAndOrigin.scroll_view_frame]; 764 [scrollView_ setFrame:frameAndOrigin.scroll_view_frame];
734 [connectButton_ setFrameOrigin:frameAndOrigin.connect_button_origin]; 765 [connectButton_ setFrameOrigin:frameAndOrigin.connect_button_origin];
735 [cancelButton_ setFrameOrigin:frameAndOrigin.cancel_button_origin]; 766 [cancelButton_ setFrameOrigin:frameAndOrigin.cancel_button_origin];
736 } 767 }
737 768
769 - (NSButton*)adapterOffHelpButton {
770 return adapterOffHelpButton_.get();
771 }
772
738 - (NSTableView*)tableView { 773 - (NSTableView*)tableView {
739 return tableView_.get(); 774 return tableView_.get();
740 } 775 }
741 776
742 - (SpinnerView*)spinner { 777 - (SpinnerView*)spinner {
743 return spinner_.get(); 778 return spinner_.get();
744 } 779 }
745 780
746 - (NSTextField*)status { 781 - (NSTextField*)status {
747 return status_.get(); 782 return status_.get();
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
796 } 831 }
797 832
798 - (void)cancel { 833 - (void)cancel {
799 chooserController_->Cancel(); 834 chooserController_->Cancel();
800 } 835 }
801 836
802 - (void)close { 837 - (void)close {
803 chooserController_->Close(); 838 chooserController_->Close();
804 } 839 }
805 840
841 - (void)onAdapterOffHelp:(id)sender {
842 chooserController_->OpenAdapterOffHelpUrl();
843 }
844
806 - (void)onRescan:(id)sender { 845 - (void)onRescan:(id)sender {
807 chooserController_->RefreshOptions(); 846 chooserController_->RefreshOptions();
808 } 847 }
809 848
810 - (void)onHelpPressed:(id)sender { 849 - (void)onHelpPressed:(id)sender {
811 chooserController_->OpenHelpCenterUrl(); 850 chooserController_->OpenHelpCenterUrl();
812 } 851 }
813 852
814 - (void)updateContentRowColor { 853 - (void)updateContentRowColor {
815 NSInteger selectedRow = [tableView_ selectedRow]; 854 NSInteger selectedRow = [tableView_ selectedRow];
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
867 return [tableRowView text]; 906 return [tableRowView text];
868 } 907 }
869 908
870 - (NSTextField*)tableRowViewPairedStatus:(NSInteger)row { 909 - (NSTextField*)tableRowViewPairedStatus:(NSInteger)row {
871 ChooserContentTableRowView* tableRowView = 910 ChooserContentTableRowView* tableRowView =
872 [tableView_ viewAtColumn:0 row:row makeIfNecessary:YES]; 911 [tableView_ viewAtColumn:0 row:row makeIfNecessary:YES];
873 return [tableRowView pairedStatus]; 912 return [tableRowView pairedStatus];
874 } 913 }
875 914
876 @end 915 @end
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698