OLD | NEW |
(Empty) | |
| 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 |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #import "chrome/browser/ui/cocoa/extensions/chooser_dialog_cocoa_controller.h" |
| 6 |
| 7 #include "base/strings/sys_string_conversions.h" |
| 8 #include "base/strings/utf_string_conversions.h" |
| 9 #import "chrome/browser/ui/cocoa/chooser_content_view.h" |
| 10 #import "chrome/browser/ui/cocoa/extensions/chooser_dialog_cocoa.h" |
| 11 #include "chrome/grit/generated_resources.h" |
| 12 #include "components/chooser_controller/chooser_controller.h" |
| 13 #include "components/url_formatter/elide_url.h" |
| 14 #include "content/public/browser/web_contents.h" |
| 15 #include "extensions/browser/extension_registry.h" |
| 16 #import "ui/base/l10n/l10n_util_mac.h" |
| 17 #include "url/gurl.h" |
| 18 #include "url/origin.h" |
| 19 |
| 20 @implementation ChooserDialogCocoaController |
| 21 |
| 22 - (instancetype) |
| 23 initWithChooserDialogCocoa:(ChooserDialogCocoa*)chooserDialogCocoa |
| 24 chooserController:(ChooserController*)chooserController { |
| 25 DCHECK(chooserDialogCocoa); |
| 26 DCHECK(chooserController); |
| 27 if ((self = [super init])) { |
| 28 chooserDialogCocoa_ = chooserDialogCocoa; |
| 29 chooserController_ = chooserController; |
| 30 } |
| 31 |
| 32 base::string16 chooserTitle; |
| 33 url::Origin origin = chooserController_->GetOrigin(); |
| 34 content::WebContents* web_contents = chooserDialogCocoa_->web_contents(); |
| 35 content::BrowserContext* browser_context = web_contents->GetBrowserContext(); |
| 36 extensions::ExtensionRegistry* extension_registry = |
| 37 extensions::ExtensionRegistry::Get(browser_context); |
| 38 if (extension_registry) { |
| 39 const extensions::Extension* extension = |
| 40 extension_registry->enabled_extensions().GetExtensionOrAppByURL( |
| 41 GURL(origin.Serialize())); |
| 42 if (extension) |
| 43 chooserTitle = base::UTF8ToUTF16(extension->name()); |
| 44 } |
| 45 |
| 46 if (chooserTitle.empty()) { |
| 47 chooserTitle = url_formatter::FormatOriginForSecurityDisplay( |
| 48 origin, url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC); |
| 49 } |
| 50 |
| 51 chooserContentView_.reset([[ChooserContentView alloc] |
| 52 initWithChooserTitle:l10n_util::GetNSStringF(IDS_CHOOSER_BUBBLE_PROMPT, |
| 53 chooserTitle)]); |
| 54 |
| 55 tableView_ = [chooserContentView_ tableView]; |
| 56 connectButton_ = [chooserContentView_ connectButton]; |
| 57 cancelButton_ = [chooserContentView_ cancelButton]; |
| 58 helpButton_ = [chooserContentView_ helpButton]; |
| 59 |
| 60 [connectButton_ setTarget:self]; |
| 61 [connectButton_ setAction:@selector(onConnect:)]; |
| 62 [cancelButton_ setTarget:self]; |
| 63 [cancelButton_ setAction:@selector(onCancel:)]; |
| 64 [tableView_ setDelegate:self]; |
| 65 [tableView_ setDataSource:self]; |
| 66 [helpButton_ setTarget:self]; |
| 67 [helpButton_ setAction:@selector(onHelpPressed:)]; |
| 68 self.view = chooserContentView_; |
| 69 [self updateTableView]; |
| 70 |
| 71 return self; |
| 72 } |
| 73 |
| 74 - (NSInteger)numberOfRowsInTableView:(NSTableView*)tableView { |
| 75 // When there are no devices, the table contains a message saying there are |
| 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 } |
| 80 |
| 81 - (id)tableView:(NSTableView*)tableView |
| 82 objectValueForTableColumn:(NSTableColumn*)tableColumn |
| 83 row:(NSInteger)rowIndex { |
| 84 NSInteger num_options = |
| 85 static_cast<NSInteger>(chooserController_->NumOptions()); |
| 86 if (num_options == 0) { |
| 87 DCHECK_EQ(0, rowIndex); |
| 88 return l10n_util::GetNSString(IDS_CHOOSER_BUBBLE_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 } |
| 96 |
| 97 - (BOOL)tableView:(NSTableView*)aTableView |
| 98 shouldEditTableColumn:(NSTableColumn*)aTableColumn |
| 99 row:(NSInteger)rowIndex { |
| 100 return NO; |
| 101 } |
| 102 |
| 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 selects the next item if the current |
| 113 // item is removed, so here it tracks if the removed item is the item |
| 114 // that was previously selected, if so, deselect it. |
| 115 if ([tableView_ selectedRow] == index) |
| 116 [tableView_ deselectRow:index]; |
| 117 |
| 118 [self updateTableView]; |
| 119 } |
| 120 |
| 121 - (void)updateTableView { |
| 122 [tableView_ setEnabled:chooserController_->NumOptions() > 0]; |
| 123 [tableView_ reloadData]; |
| 124 } |
| 125 |
| 126 - (void)tableViewSelectionDidChange:(NSNotification*)aNotification { |
| 127 [connectButton_ setEnabled:[tableView_ numberOfSelectedRows] > 0]; |
| 128 } |
| 129 |
| 130 - (void)onConnect:(id)sender { |
| 131 NSInteger row = [tableView_ selectedRow]; |
| 132 chooserDialogCocoa_->Dismissed(); |
| 133 chooserController_->Select(row); |
| 134 } |
| 135 |
| 136 - (void)onCancel:(id)sender { |
| 137 chooserDialogCocoa_->Dismissed(); |
| 138 chooserController_->Cancel(); |
| 139 } |
| 140 |
| 141 - (void)onHelpPressed:(id)sender { |
| 142 chooserController_->OpenHelpCenterUrl(); |
| 143 } |
| 144 |
| 145 - (ChooserContentView*)chooserContentView { |
| 146 return chooserContentView_.get(); |
| 147 } |
| 148 |
| 149 @end |
OLD | NEW |