| OLD | NEW |
| 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/extensions/chooser_dialog_cocoa_controller.h" | 5 #import "chrome/browser/ui/cocoa/extensions/chooser_dialog_cocoa_controller.h" |
| 6 | 6 |
| 7 #include "base/strings/sys_string_conversions.h" | 7 #include "base/strings/sys_string_conversions.h" |
| 8 #include "base/strings/utf_string_conversions.h" | 8 #include "base/strings/utf_string_conversions.h" |
| 9 #import "chrome/browser/ui/cocoa/chooser_content_view_cocoa.h" | 9 #import "chrome/browser/ui/cocoa/chooser_content_view_cocoa.h" |
| 10 #import "chrome/browser/ui/cocoa/extensions/chooser_dialog_cocoa.h" | 10 #import "chrome/browser/ui/cocoa/extensions/chooser_dialog_cocoa.h" |
| 11 #include "chrome/grit/generated_resources.h" | 11 #include "chrome/grit/generated_resources.h" |
| 12 #include "components/chooser_controller/chooser_controller.h" | 12 #include "components/chooser_controller/chooser_controller.h" |
| 13 #include "components/url_formatter/elide_url.h" | 13 #include "components/url_formatter/elide_url.h" |
| 14 #include "content/public/browser/web_contents.h" | 14 #include "content/public/browser/web_contents.h" |
| 15 #include "extensions/browser/extension_registry.h" | 15 #include "extensions/browser/extension_registry.h" |
| 16 #import "ui/base/l10n/l10n_util_mac.h" | 16 #import "ui/base/l10n/l10n_util_mac.h" |
| 17 #include "url/gurl.h" | 17 #include "url/gurl.h" |
| 18 #include "url/origin.h" | 18 #include "url/origin.h" |
| 19 | 19 |
| 20 @implementation ChooserDialogCocoaController | 20 @implementation ChooserDialogCocoaController |
| 21 | 21 |
| 22 - (instancetype) | 22 - (instancetype) |
| 23 initWithChooserDialogCocoa:(ChooserDialogCocoa*)chooserDialogCocoa | 23 initWithChooserDialogCocoa:(ChooserDialogCocoa*)chooserDialogCocoa |
| 24 chooserController:(ChooserController*)chooserController { | 24 chooserController: |
| 25 (std::unique_ptr<ChooserController>)chooserController { |
| 25 DCHECK(chooserDialogCocoa); | 26 DCHECK(chooserDialogCocoa); |
| 26 DCHECK(chooserController); | 27 DCHECK(chooserController); |
| 27 if ((self = [super init])) { | 28 if ((self = [super init])) |
| 28 chooserDialogCocoa_ = chooserDialogCocoa; | 29 chooserDialogCocoa_ = chooserDialogCocoa; |
| 29 chooserController_ = chooserController; | |
| 30 } | |
| 31 | 30 |
| 32 base::string16 chooserTitle; | 31 base::string16 chooserTitle; |
| 33 url::Origin origin = chooserController_->GetOrigin(); | 32 url::Origin origin = chooserController->GetOrigin(); |
| 34 content::WebContents* web_contents = chooserDialogCocoa_->web_contents(); | 33 content::WebContents* web_contents = chooserDialogCocoa_->web_contents(); |
| 35 content::BrowserContext* browser_context = web_contents->GetBrowserContext(); | 34 content::BrowserContext* browser_context = web_contents->GetBrowserContext(); |
| 36 extensions::ExtensionRegistry* extension_registry = | 35 extensions::ExtensionRegistry* extension_registry = |
| 37 extensions::ExtensionRegistry::Get(browser_context); | 36 extensions::ExtensionRegistry::Get(browser_context); |
| 38 if (extension_registry) { | 37 if (extension_registry) { |
| 39 const extensions::Extension* extension = | 38 const extensions::Extension* extension = |
| 40 extension_registry->enabled_extensions().GetExtensionOrAppByURL( | 39 extension_registry->enabled_extensions().GetExtensionOrAppByURL( |
| 41 GURL(origin.Serialize())); | 40 GURL(origin.Serialize())); |
| 42 if (extension) | 41 if (extension) |
| 43 chooserTitle = base::UTF8ToUTF16(extension->name()); | 42 chooserTitle = base::UTF8ToUTF16(extension->name()); |
| 44 } | 43 } |
| 45 | 44 |
| 46 if (chooserTitle.empty()) { | 45 if (chooserTitle.empty()) { |
| 47 chooserTitle = url_formatter::FormatOriginForSecurityDisplay( | 46 chooserTitle = url_formatter::FormatOriginForSecurityDisplay( |
| 48 origin, url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC); | 47 origin, url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC); |
| 49 } | 48 } |
| 50 | 49 |
| 51 chooserContentView_.reset([[ChooserContentViewCocoa alloc] | 50 chooserContentView_.reset([[ChooserContentViewCocoa alloc] |
| 52 initWithChooserTitle:l10n_util::GetNSStringF(IDS_DEVICE_CHOOSER_PROMPT, | 51 initWithChooserTitle:l10n_util::GetNSStringF(IDS_DEVICE_CHOOSER_PROMPT, |
| 53 chooserTitle)]); | 52 chooserTitle) |
| 53 ChooserController:std::move(chooserController)]); |
| 54 | 54 |
| 55 tableView_ = [chooserContentView_ tableView]; | 55 tableView_ = [chooserContentView_ tableView]; |
| 56 connectButton_ = [chooserContentView_ connectButton]; | 56 connectButton_ = [chooserContentView_ connectButton]; |
| 57 cancelButton_ = [chooserContentView_ cancelButton]; | 57 cancelButton_ = [chooserContentView_ cancelButton]; |
| 58 helpButton_ = [chooserContentView_ helpButton]; | |
| 59 | 58 |
| 60 [connectButton_ setTarget:self]; | 59 [connectButton_ setTarget:self]; |
| 61 [connectButton_ setAction:@selector(onConnect:)]; | 60 [connectButton_ setAction:@selector(onConnect:)]; |
| 62 [cancelButton_ setTarget:self]; | 61 [cancelButton_ setTarget:self]; |
| 63 [cancelButton_ setAction:@selector(onCancel:)]; | 62 [cancelButton_ setAction:@selector(onCancel:)]; |
| 64 [tableView_ setDelegate:self]; | 63 [tableView_ setDelegate:self]; |
| 65 [tableView_ setDataSource:self]; | 64 [tableView_ setDataSource:self]; |
| 66 [helpButton_ setTarget:self]; | |
| 67 [helpButton_ setAction:@selector(onHelpPressed:)]; | |
| 68 self.view = chooserContentView_; | 65 self.view = chooserContentView_; |
| 69 [self updateTableView]; | 66 [chooserContentView_ updateTableView]; |
| 70 | 67 |
| 71 return self; | 68 return self; |
| 72 } | 69 } |
| 73 | 70 |
| 74 - (NSInteger)numberOfRowsInTableView:(NSTableView*)tableView { | 71 - (NSInteger)numberOfRowsInTableView:(NSTableView*)tableView { |
| 75 // When there are no devices, the table contains a message saying there are | 72 return [chooserContentView_ numOptions]; |
| 76 // no devices, so the number of rows is always at least 1. | |
| 77 return std::max(static_cast<NSInteger>(chooserController_->NumOptions()), | |
| 78 static_cast<NSInteger>(1)); | |
| 79 } | 73 } |
| 80 | 74 |
| 81 - (id)tableView:(NSTableView*)tableView | 75 - (id)tableView:(NSTableView*)tableView |
| 82 objectValueForTableColumn:(NSTableColumn*)tableColumn | 76 objectValueForTableColumn:(NSTableColumn*)tableColumn |
| 83 row:(NSInteger)rowIndex { | 77 row:(NSInteger)rowIndex { |
| 84 NSInteger num_options = | 78 return [chooserContentView_ getOption:rowIndex]; |
| 85 static_cast<NSInteger>(chooserController_->NumOptions()); | |
| 86 if (num_options == 0) { | |
| 87 DCHECK_EQ(0, rowIndex); | |
| 88 return l10n_util::GetNSString(IDS_DEVICE_CHOOSER_NO_DEVICES_FOUND_PROMPT); | |
| 89 } | |
| 90 | |
| 91 DCHECK_GE(rowIndex, 0); | |
| 92 DCHECK_LT(rowIndex, num_options); | |
| 93 return base::SysUTF16ToNSString( | |
| 94 chooserController_->GetOption(static_cast<size_t>(rowIndex))); | |
| 95 } | 79 } |
| 96 | 80 |
| 97 - (BOOL)tableView:(NSTableView*)aTableView | 81 - (BOOL)tableView:(NSTableView*)aTableView |
| 98 shouldEditTableColumn:(NSTableColumn*)aTableColumn | 82 shouldEditTableColumn:(NSTableColumn*)aTableColumn |
| 99 row:(NSInteger)rowIndex { | 83 row:(NSInteger)rowIndex { |
| 100 return NO; | 84 return NO; |
| 101 } | 85 } |
| 102 | 86 |
| 103 - (void)onOptionsInitialized { | |
| 104 [self updateTableView]; | |
| 105 } | |
| 106 | |
| 107 - (void)onOptionAdded:(NSInteger)index { | |
| 108 [self updateTableView]; | |
| 109 } | |
| 110 | |
| 111 - (void)onOptionRemoved:(NSInteger)index { | |
| 112 // |tableView_| will automatically select the removed item's next item. | |
| 113 // So here it tracks if the removed item is the item that was currently | |
| 114 // selected, if so, deselect it. Also if the removed item is before the | |
| 115 // currently selected item, the currently selected item's index needs to | |
| 116 // be adjusted by one. | |
| 117 NSInteger selectedRow = [tableView_ selectedRow]; | |
| 118 if (selectedRow == index) | |
| 119 [tableView_ deselectRow:index]; | |
| 120 else if (selectedRow > index) | |
| 121 [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:selectedRow - 1] | |
| 122 byExtendingSelection:NO]; | |
| 123 | |
| 124 [self updateTableView]; | |
| 125 } | |
| 126 | |
| 127 - (void)updateTableView { | |
| 128 [tableView_ setEnabled:chooserController_->NumOptions() > 0]; | |
| 129 [tableView_ reloadData]; | |
| 130 } | |
| 131 | |
| 132 - (void)tableViewSelectionDidChange:(NSNotification*)aNotification { | 87 - (void)tableViewSelectionDidChange:(NSNotification*)aNotification { |
| 133 [connectButton_ setEnabled:[tableView_ numberOfSelectedRows] > 0]; | 88 [connectButton_ setEnabled:[tableView_ numberOfSelectedRows] > 0]; |
| 134 } | 89 } |
| 135 | 90 |
| 136 - (void)onConnect:(id)sender { | 91 - (void)onConnect:(id)sender { |
| 137 NSInteger row = [tableView_ selectedRow]; | 92 [chooserContentView_ accept]; |
| 138 chooserDialogCocoa_->Dismissed(); | 93 chooserDialogCocoa_->Dismissed(); |
| 139 chooserController_->Select(row); | |
| 140 } | 94 } |
| 141 | 95 |
| 142 - (void)onCancel:(id)sender { | 96 - (void)onCancel:(id)sender { |
| 97 [chooserContentView_ cancel]; |
| 143 chooserDialogCocoa_->Dismissed(); | 98 chooserDialogCocoa_->Dismissed(); |
| 144 chooserController_->Cancel(); | |
| 145 } | |
| 146 | |
| 147 - (void)onHelpPressed:(id)sender { | |
| 148 chooserController_->OpenHelpCenterUrl(); | |
| 149 } | 99 } |
| 150 | 100 |
| 151 - (ChooserContentViewCocoa*)chooserContentView { | 101 - (ChooserContentViewCocoa*)chooserContentView { |
| 152 return chooserContentView_.get(); | 102 return chooserContentView_.get(); |
| 153 } | 103 } |
| 154 | 104 |
| 155 @end | 105 @end |
| OLD | NEW |