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

Side by Side Diff: chrome/browser/ui/cocoa/website_settings/chooser_bubble_ui_cocoa.mm

Issue 1984923002: Refactor ChooserBubbleController (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: updated README for ChooserController Created 4 years, 7 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 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 #import "chrome/browser/ui/cocoa/website_settings/chooser_bubble_ui_cocoa.h" 5 #import "chrome/browser/ui/cocoa/website_settings/chooser_bubble_ui_cocoa.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <cmath> 10 #include <cmath>
11 11
12 #include "base/mac/scoped_nsobject.h" 12 #include "base/mac/scoped_nsobject.h"
13 #include "base/memory/ptr_util.h" 13 #include "base/memory/ptr_util.h"
14 #include "base/strings/sys_string_conversions.h" 14 #include "base/strings/sys_string_conversions.h"
15 #include "base/strings/utf_string_conversions.h" 15 #include "base/strings/utf_string_conversions.h"
16 #include "chrome/browser/ui/browser.h" 16 #include "chrome/browser/ui/browser.h"
17 #include "chrome/browser/ui/browser_finder.h"
18 #include "chrome/browser/ui/browser_window.h" 17 #include "chrome/browser/ui/browser_window.h"
19 #import "chrome/browser/ui/chrome_style.h"
20 #import "chrome/browser/ui/cocoa/base_bubble_controller.h" 18 #import "chrome/browser/ui/cocoa/base_bubble_controller.h"
21 #import "chrome/browser/ui/cocoa/browser_window_controller.h" 19 #import "chrome/browser/ui/cocoa/browser_window_controller.h"
22 #import "chrome/browser/ui/cocoa/browser_window_utils.h" 20 #import "chrome/browser/ui/cocoa/browser_window_utils.h"
23 #import "chrome/browser/ui/cocoa/constrained_window/constrained_window_button.h" 21 #import "chrome/browser/ui/cocoa/constrained_window/constrained_window_button.h"
24 #import "chrome/browser/ui/cocoa/hover_close_button.h"
25 #import "chrome/browser/ui/cocoa/info_bubble_view.h" 22 #import "chrome/browser/ui/cocoa/info_bubble_view.h"
26 #import "chrome/browser/ui/cocoa/info_bubble_window.h" 23 #import "chrome/browser/ui/cocoa/info_bubble_window.h"
27 #import "chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h" 24 #import "chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h"
25 #include "chrome/browser/ui/website_settings/chooser_bubble_controller.h"
28 #include "chrome/grit/generated_resources.h" 26 #include "chrome/grit/generated_resources.h"
29 #include "components/url_formatter/elide_url.h" 27 #include "components/url_formatter/elide_url.h"
30 #include "content/public/browser/native_web_keyboard_event.h" 28 #include "content/public/browser/native_web_keyboard_event.h"
31 #import "third_party/google_toolbox_for_mac/src/AppKit/GTMUILocalizerAndLayoutTw eaker.h" 29 #import "third_party/google_toolbox_for_mac/src/AppKit/GTMUILocalizerAndLayoutTw eaker.h"
32 #include "ui/base/cocoa/cocoa_base_utils.h" 30 #include "ui/base/cocoa/cocoa_base_utils.h"
33 #import "ui/base/cocoa/controls/hyperlink_button_cell.h" 31 #import "ui/base/cocoa/controls/hyperlink_button_cell.h"
34 #include "ui/base/cocoa/window_size_constants.h" 32 #include "ui/base/cocoa/window_size_constants.h"
35 #include "ui/base/l10n/l10n_util.h" 33 #include "ui/base/l10n/l10n_util.h"
36 #include "ui/base/l10n/l10n_util_mac.h" 34 #include "ui/base/l10n/l10n_util_mac.h"
37 #include "url/gurl.h" 35 #include "url/gurl.h"
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
69 base::scoped_nsobject<NSTextField> titleView_; 67 base::scoped_nsobject<NSTextField> titleView_;
70 base::scoped_nsobject<NSScrollView> scrollView_; 68 base::scoped_nsobject<NSScrollView> scrollView_;
71 base::scoped_nsobject<NSTableColumn> tableColumn_; 69 base::scoped_nsobject<NSTableColumn> tableColumn_;
72 base::scoped_nsobject<NSTableView> tableView_; 70 base::scoped_nsobject<NSTableView> tableView_;
73 base::scoped_nsobject<NSButton> connectButton_; 71 base::scoped_nsobject<NSButton> connectButton_;
74 base::scoped_nsobject<NSButton> cancelButton_; 72 base::scoped_nsobject<NSButton> cancelButton_;
75 base::scoped_nsobject<NSTextField> message_; 73 base::scoped_nsobject<NSTextField> message_;
76 base::scoped_nsobject<NSButton> getHelpButton_; 74 base::scoped_nsobject<NSButton> getHelpButton_;
77 bool buttonPressed_; 75 bool buttonPressed_;
78 76
79 Browser* browser_; // Weak. 77 Browser* browser_; // Weak.
80 ChooserBubbleController* chooserBubbleController_; // Weak. 78 ChooserController* chooserController_; // Weak.
81 } 79 }
82 80
83 // Designated initializer. |browser| and |bridge| must both be non-nil. 81 // Designated initializer. |browser| and |bridge| must both be non-nil.
84 - (id)initWithBrowser:(Browser*)browser 82 - (id)initWithBrowser:(Browser*)browser
85 initWithChooserBubbleController: 83 initWithChooserController:(ChooserController*)chooserController
86 (ChooserBubbleController*)chooserBubbleController 84 bridge:(ChooserBubbleUiCocoa*)bridge;
87 bridge:(ChooserBubbleUiCocoa*)bridge;
88 85
89 // Makes the bubble visible. 86 // Makes the bubble visible.
90 - (void)show; 87 - (void)show;
91 88
92 // Will reposition the bubble based in case the anchor or parent should change. 89 // Will reposition the bubble based in case the anchor or parent should change.
93 - (void)updateAnchorPosition; 90 - (void)updateAnchorPosition;
94 91
95 // Will calculate the expected anchor point for this bubble. 92 // Will calculate the expected anchor point for this bubble.
96 // Should only be used outside this class for tests. 93 // Should only be used outside this class for tests.
97 - (NSPoint)getExpectedAnchorPoint; 94 - (NSPoint)getExpectedAnchorPoint;
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
144 - (void)onCancel:(id)sender; 141 - (void)onCancel:(id)sender;
145 142
146 // Called when the "Get help" button is pressed. 143 // Called when the "Get help" button is pressed.
147 - (void)onGetHelpPressed:(id)sender; 144 - (void)onGetHelpPressed:(id)sender;
148 145
149 @end 146 @end
150 147
151 @implementation ChooserBubbleUiController 148 @implementation ChooserBubbleUiController
152 149
153 - (id)initWithBrowser:(Browser*)browser 150 - (id)initWithBrowser:(Browser*)browser
154 initWithChooserBubbleController: 151 initWithChooserController:(ChooserController*)chooserController
155 (ChooserBubbleController*)chooserBubbleController 152 bridge:(ChooserBubbleUiCocoa*)bridge {
156 bridge:(ChooserBubbleUiCocoa*)bridge {
157 DCHECK(browser); 153 DCHECK(browser);
158 DCHECK(chooserBubbleController); 154 DCHECK(chooserController);
159 DCHECK(bridge); 155 DCHECK(bridge);
160 156
161 browser_ = browser; 157 browser_ = browser;
162 chooserBubbleController_ = chooserBubbleController; 158 chooserController_ = chooserController;
163 159
164 base::scoped_nsobject<InfoBubbleWindow> window([[InfoBubbleWindow alloc] 160 base::scoped_nsobject<InfoBubbleWindow> window([[InfoBubbleWindow alloc]
165 initWithContentRect:ui::kWindowSizeDeterminedLater 161 initWithContentRect:ui::kWindowSizeDeterminedLater
166 styleMask:NSBorderlessWindowMask 162 styleMask:NSBorderlessWindowMask
167 backing:NSBackingStoreBuffered 163 backing:NSBackingStoreBuffered
168 defer:NO]); 164 defer:NO]);
169 [window setAllowedAnimations:info_bubble::kAnimateNone]; 165 [window setAllowedAnimations:info_bubble::kAnimateNone];
170 [window setReleasedWhenClosed:NO]; 166 [window setReleasedWhenClosed:NO];
171 if ((self = [super initWithWindow:window 167 if ((self = [super initWithWindow:window
172 parentWindow:[self getExpectedParentWindow] 168 parentWindow:[self getExpectedParentWindow]
(...skipping 10 matching lines...) Expand all
183 } 179 }
184 return self; 180 return self;
185 } 181 }
186 182
187 - (void)windowWillClose:(NSNotification*)notification { 183 - (void)windowWillClose:(NSNotification*)notification {
188 [[NSNotificationCenter defaultCenter] 184 [[NSNotificationCenter defaultCenter]
189 removeObserver:self 185 removeObserver:self
190 name:NSWindowDidMoveNotification 186 name:NSWindowDidMoveNotification
191 object:nil]; 187 object:nil];
192 if (!buttonPressed_) 188 if (!buttonPressed_)
193 chooserBubbleController_->Close(); 189 chooserController_->Close();
194 bridge_->OnBubbleClosing(); 190 bridge_->OnBubbleClosing();
195 [super windowWillClose:notification]; 191 [super windowWillClose:notification];
196 } 192 }
197 193
198 - (void)parentWindowWillToggleFullScreen:(NSNotification*)notification { 194 - (void)parentWindowWillToggleFullScreen:(NSNotification*)notification {
199 // Override the base class implementation, which would have closed the bubble. 195 // Override the base class implementation, which would have closed the bubble.
200 } 196 }
201 197
202 - (void)parentWindowDidResize:(NSNotification*)notification { 198 - (void)parentWindowDidResize:(NSNotification*)notification {
203 [self setAnchorPoint:[self getExpectedAnchorPoint]]; 199 [self setAnchorPoint:[self getExpectedAnchorPoint]];
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
353 [self setAnchorPoint:[self getExpectedAnchorPoint]]; 349 [self setAnchorPoint:[self getExpectedAnchorPoint]];
354 [self showWindow:nil]; 350 [self showWindow:nil];
355 [[self window] makeFirstResponder:nil]; 351 [[self window] makeFirstResponder:nil];
356 [[self window] setInitialFirstResponder:tableView_.get()]; 352 [[self window] setInitialFirstResponder:tableView_.get()];
357 } 353 }
358 } 354 }
359 355
360 - (NSInteger)numberOfRowsInTableView:(NSTableView*)tableView { 356 - (NSInteger)numberOfRowsInTableView:(NSTableView*)tableView {
361 // When there are no devices, the table contains a message saying there are 357 // When there are no devices, the table contains a message saying there are
362 // no devices, so the number of rows is always at least 1. 358 // no devices, so the number of rows is always at least 1.
363 return std::max( 359 return std::max(static_cast<NSInteger>(chooserController_->NumOptions()),
364 static_cast<NSInteger>(chooserBubbleController_->NumOptions()), 360 static_cast<NSInteger>(1));
365 static_cast<NSInteger>(1));
366 } 361 }
367 362
368 - (id)tableView:(NSTableView*)tableView 363 - (id)tableView:(NSTableView*)tableView
369 objectValueForTableColumn:(NSTableColumn*)tableColumn 364 objectValueForTableColumn:(NSTableColumn*)tableColumn
370 row:(NSInteger)rowIndex { 365 row:(NSInteger)rowIndex {
371 NSInteger num_options = 366 NSInteger num_options =
372 static_cast<NSInteger>(chooserBubbleController_->NumOptions()); 367 static_cast<NSInteger>(chooserController_->NumOptions());
373 if (num_options == 0) { 368 if (num_options == 0) {
374 DCHECK_EQ(0, rowIndex); 369 DCHECK_EQ(0, rowIndex);
375 return l10n_util::GetNSString(IDS_CHOOSER_BUBBLE_NO_DEVICES_FOUND_PROMPT); 370 return l10n_util::GetNSString(IDS_CHOOSER_BUBBLE_NO_DEVICES_FOUND_PROMPT);
376 } 371 }
377 372
378 DCHECK_GE(rowIndex, 0); 373 DCHECK_GE(rowIndex, 0);
379 DCHECK_LT(rowIndex, num_options); 374 DCHECK_LT(rowIndex, num_options);
380 return base::SysUTF16ToNSString( 375 return base::SysUTF16ToNSString(
381 chooserBubbleController_->GetOption(static_cast<size_t>(rowIndex))); 376 chooserController_->GetOption(static_cast<size_t>(rowIndex)));
382 } 377 }
383 378
384 - (BOOL)tableView:(NSTableView*)aTableView 379 - (BOOL)tableView:(NSTableView*)aTableView
385 shouldEditTableColumn:(NSTableColumn*)aTableColumn 380 shouldEditTableColumn:(NSTableColumn*)aTableColumn
386 row:(NSInteger)rowIndex { 381 row:(NSInteger)rowIndex {
387 return NO; 382 return NO;
388 } 383 }
389 384
390 - (void)onOptionsInitialized { 385 - (void)onOptionsInitialized {
391 [self updateTableView]; 386 [self updateTableView];
392 } 387 }
393 388
394 - (void)onOptionAdded:(NSInteger)index { 389 - (void)onOptionAdded:(NSInteger)index {
395 [self updateTableView]; 390 [self updateTableView];
396 } 391 }
397 392
398 - (void)onOptionRemoved:(NSInteger)index { 393 - (void)onOptionRemoved:(NSInteger)index {
399 // |tableView_| will automatically selects the next item if the current 394 // |tableView_| will automatically selects the next item if the current
400 // item is removed, so here it tracks if the removed item is the item 395 // item is removed, so here it tracks if the removed item is the item
401 // that was previously selected, if so, deselect it. 396 // that was previously selected, if so, deselect it.
402 if ([tableView_ selectedRow] == index) 397 if ([tableView_ selectedRow] == index)
403 [tableView_ deselectRow:index]; 398 [tableView_ deselectRow:index];
404 399
405 [self updateTableView]; 400 [self updateTableView];
406 } 401 }
407 402
408 - (void)updateTableView { 403 - (void)updateTableView {
409 [tableView_ setEnabled:chooserBubbleController_->NumOptions() > 0]; 404 [tableView_ setEnabled:chooserController_->NumOptions() > 0];
410 [tableView_ reloadData]; 405 [tableView_ reloadData];
411 } 406 }
412 407
413 - (void)tableViewSelectionDidChange:(NSNotification*)aNotification { 408 - (void)tableViewSelectionDidChange:(NSNotification*)aNotification {
414 [connectButton_ setEnabled:[tableView_ numberOfSelectedRows] > 0]; 409 [connectButton_ setEnabled:[tableView_ numberOfSelectedRows] > 0];
415 } 410 }
416 411
417 - (void)updateAnchorPosition { 412 - (void)updateAnchorPosition {
418 [self setParentWindow:[self getExpectedParentWindow]]; 413 [self setParentWindow:[self getExpectedParentWindow]];
419 [self setAnchorPoint:[self getExpectedAnchorPoint]]; 414 [self setAnchorPoint:[self getExpectedAnchorPoint]];
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
452 base::scoped_nsobject<NSTextField> titleView( 447 base::scoped_nsobject<NSTextField> titleView(
453 [[NSTextField alloc] initWithFrame:NSZeroRect]); 448 [[NSTextField alloc] initWithFrame:NSZeroRect]);
454 [titleView setDrawsBackground:NO]; 449 [titleView setDrawsBackground:NO];
455 [titleView setBezeled:NO]; 450 [titleView setBezeled:NO];
456 [titleView setEditable:NO]; 451 [titleView setEditable:NO];
457 [titleView setSelectable:NO]; 452 [titleView setSelectable:NO];
458 [titleView setStringValue: 453 [titleView setStringValue:
459 l10n_util::GetNSStringF( 454 l10n_util::GetNSStringF(
460 IDS_CHOOSER_BUBBLE_PROMPT, 455 IDS_CHOOSER_BUBBLE_PROMPT,
461 url_formatter::FormatOriginForSecurityDisplay( 456 url_formatter::FormatOriginForSecurityDisplay(
462 chooserBubbleController_->GetOrigin(), 457 chooserController_->GetOrigin(),
463 url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC))]; 458 url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC))];
464 [titleView setFont:[NSFont systemFontOfSize:[NSFont systemFontSize]]]; 459 [titleView setFont:[NSFont systemFontOfSize:[NSFont systemFontSize]]];
465 // The height is arbitrary as it will be adjusted later. 460 // The height is arbitrary as it will be adjusted later.
466 [titleView setFrameSize:NSMakeSize(kChooserBubbleWidth - 2 * kMarginX, 0.0f)]; 461 [titleView setFrameSize:NSMakeSize(kChooserBubbleWidth - 2 * kMarginX, 0.0f)];
467 [GTMUILocalizerAndLayoutTweaker sizeToFitFixedWidthTextField:titleView]; 462 [GTMUILocalizerAndLayoutTweaker sizeToFitFixedWidthTextField:titleView];
468 return titleView; 463 return titleView;
469 } 464 }
470 465
471 - (base::scoped_nsobject<NSButton>)buttonWithTitle:(NSString*)title 466 - (base::scoped_nsobject<NSButton>)buttonWithTitle:(NSString*)title
472 action:(SEL)action { 467 action:(SEL)action {
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
533 NSRect frameA = [viewA frame]; 528 NSRect frameA = [viewA frame];
534 NSRect frameB = [viewB frame]; 529 NSRect frameB = [viewB frame];
535 frameA.origin.y = 530 frameA.origin.y =
536 NSMinY(frameB) + std::floor((NSHeight(frameB) - NSHeight(frameA)) / 2); 531 NSMinY(frameB) + std::floor((NSHeight(frameB) - NSHeight(frameA)) / 2);
537 [viewA setFrameOrigin:frameA.origin]; 532 [viewA setFrameOrigin:frameA.origin];
538 } 533 }
539 534
540 - (void)onConnect:(id)sender { 535 - (void)onConnect:(id)sender {
541 buttonPressed_ = true; 536 buttonPressed_ = true;
542 NSInteger row = [tableView_ selectedRow]; 537 NSInteger row = [tableView_ selectedRow];
543 chooserBubbleController_->Select(row); 538 chooserController_->Select(row);
544 [self close]; 539 [self close];
545 } 540 }
546 541
547 - (void)onCancel:(id)sender { 542 - (void)onCancel:(id)sender {
548 buttonPressed_ = true; 543 buttonPressed_ = true;
549 chooserBubbleController_->Cancel(); 544 chooserController_->Cancel();
550 [self close]; 545 [self close];
551 } 546 }
552 547
553 - (void)onGetHelpPressed:(id)sender { 548 - (void)onGetHelpPressed:(id)sender {
554 chooserBubbleController_->OpenHelpCenterUrl(); 549 chooserController_->OpenHelpCenterUrl();
555 } 550 }
556 551
557 @end 552 @end
558 553
559 ChooserBubbleUiCocoa::ChooserBubbleUiCocoa( 554 ChooserBubbleUiCocoa::ChooserBubbleUiCocoa(
560 Browser* browser, 555 Browser* browser,
561 ChooserBubbleController* chooser_bubble_controller) 556 ChooserController* chooser_controller)
562 : browser_(browser), 557 : browser_(browser),
563 chooser_bubble_controller_(chooser_bubble_controller), 558 chooser_controller_(chooser_controller),
564 chooser_bubble_ui_controller_(nil) { 559 chooser_bubble_ui_controller_(nil) {
565 DCHECK(browser); 560 DCHECK(browser);
566 DCHECK(chooser_bubble_controller); 561 DCHECK(chooser_controller);
567 chooser_bubble_controller_->set_observer(this); 562 chooser_controller_->set_observer(this);
568 } 563 }
569 564
570 ChooserBubbleUiCocoa::~ChooserBubbleUiCocoa() { 565 ChooserBubbleUiCocoa::~ChooserBubbleUiCocoa() {
571 chooser_bubble_controller_->set_observer(nullptr); 566 chooser_controller_->set_observer(nullptr);
572 [chooser_bubble_ui_controller_ close]; 567 [chooser_bubble_ui_controller_ close];
573 chooser_bubble_ui_controller_ = nil; 568 chooser_bubble_ui_controller_ = nil;
574 } 569 }
575 570
576 void ChooserBubbleUiCocoa::Show(BubbleReference bubble_reference) { 571 void ChooserBubbleUiCocoa::Show(BubbleReference bubble_reference) {
577 if (!chooser_bubble_ui_controller_) { 572 if (!chooser_bubble_ui_controller_) {
578 chooser_bubble_ui_controller_ = [[ChooserBubbleUiController alloc] 573 chooser_bubble_ui_controller_ =
579 initWithBrowser:browser_ 574 [[ChooserBubbleUiController alloc] initWithBrowser:browser_
580 initWithChooserBubbleController:chooser_bubble_controller_ 575 initWithChooserController:chooser_controller_
581 bridge:this]; 576 bridge:this];
582 } 577 }
583 578
584 [chooser_bubble_ui_controller_ show]; 579 [chooser_bubble_ui_controller_ show];
585 [chooser_bubble_ui_controller_ updateTableView]; 580 [chooser_bubble_ui_controller_ updateTableView];
586 } 581 }
587 582
588 void ChooserBubbleUiCocoa::Close() { 583 void ChooserBubbleUiCocoa::Close() {
589 [chooser_bubble_ui_controller_ close]; 584 [chooser_bubble_ui_controller_ close];
590 chooser_bubble_ui_controller_ = nil; 585 chooser_bubble_ui_controller_ = nil;
591 } 586 }
(...skipping 10 matching lines...) Expand all
602 [chooser_bubble_ui_controller_ onOptionAdded:static_cast<NSInteger>(index)]; 597 [chooser_bubble_ui_controller_ onOptionAdded:static_cast<NSInteger>(index)];
603 } 598 }
604 599
605 void ChooserBubbleUiCocoa::OnOptionRemoved(size_t index) { 600 void ChooserBubbleUiCocoa::OnOptionRemoved(size_t index) {
606 [chooser_bubble_ui_controller_ onOptionRemoved:static_cast<NSInteger>(index)]; 601 [chooser_bubble_ui_controller_ onOptionRemoved:static_cast<NSInteger>(index)];
607 } 602 }
608 603
609 void ChooserBubbleUiCocoa::OnBubbleClosing() { 604 void ChooserBubbleUiCocoa::OnBubbleClosing() {
610 chooser_bubble_ui_controller_ = nil; 605 chooser_bubble_ui_controller_ = nil;
611 } 606 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698