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

Unified Diff: chrome/browser/ui/cocoa/extensions/chooser_dialog_cocoa_controller.mm

Issue 2005443002: Implement bluetooth chooser for Chrome Apps on Mac (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@refactor_chooser_bubble_ui_cocoa
Patch Set: rebase and address comments 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/cocoa/extensions/chooser_dialog_cocoa_controller.mm
diff --git a/chrome/browser/ui/cocoa/extensions/chooser_dialog_cocoa_controller.mm b/chrome/browser/ui/cocoa/extensions/chooser_dialog_cocoa_controller.mm
new file mode 100644
index 0000000000000000000000000000000000000000..b1a40b565a2d6334e2b40790f8fecd6154d43b5b
--- /dev/null
+++ b/chrome/browser/ui/cocoa/extensions/chooser_dialog_cocoa_controller.mm
@@ -0,0 +1,149 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "chrome/browser/ui/cocoa/extensions/chooser_dialog_cocoa_controller.h"
+
+#include "base/strings/sys_string_conversions.h"
+#include "base/strings/utf_string_conversions.h"
+#import "chrome/browser/ui/cocoa/chooser_content_view.h"
+#import "chrome/browser/ui/cocoa/extensions/chooser_dialog_cocoa.h"
+#include "chrome/grit/generated_resources.h"
+#include "components/chooser_controller/chooser_controller.h"
+#include "components/url_formatter/elide_url.h"
+#include "content/public/browser/web_contents.h"
+#include "extensions/browser/extension_registry.h"
+#import "ui/base/l10n/l10n_util_mac.h"
+#include "url/gurl.h"
+#include "url/origin.h"
+
+@implementation ChooserDialogCocoaController
+
+- (instancetype)
+initWithChooserDialogCocoa:(ChooserDialogCocoa*)chooserDialogCocoa
+ chooserController:(ChooserController*)chooserController {
+ DCHECK(chooserDialogCocoa);
+ DCHECK(chooserController);
+ if ((self = [super init])) {
+ chooserDialogCocoa_ = chooserDialogCocoa;
+ chooserController_ = chooserController;
+ }
+
+ base::string16 chooserTitle;
+ url::Origin origin = chooserController_->GetOrigin();
+ content::WebContents* web_contents = chooserDialogCocoa_->web_contents();
+ content::BrowserContext* browser_context = web_contents->GetBrowserContext();
+ extensions::ExtensionRegistry* extension_registry =
+ extensions::ExtensionRegistry::Get(browser_context);
+ if (extension_registry) {
+ const extensions::Extension* extension =
+ extension_registry->enabled_extensions().GetExtensionOrAppByURL(
+ GURL(origin.Serialize()));
+ if (extension)
+ chooserTitle = base::UTF8ToUTF16(extension->name());
+ }
+
+ if (chooserTitle.empty()) {
+ chooserTitle = url_formatter::FormatOriginForSecurityDisplay(
+ origin, url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC);
+ }
+
+ chooserContentView_.reset([[ChooserContentView alloc]
+ initWithChooserTitle:l10n_util::GetNSStringF(IDS_CHOOSER_BUBBLE_PROMPT,
+ chooserTitle)]);
+
+ tableView_ = [chooserContentView_ tableView];
+ connectButton_ = [chooserContentView_ connectButton];
+ cancelButton_ = [chooserContentView_ cancelButton];
+ helpButton_ = [chooserContentView_ helpButton];
+
+ [connectButton_ setTarget:self];
+ [connectButton_ setAction:@selector(onConnect:)];
+ [cancelButton_ setTarget:self];
+ [cancelButton_ setAction:@selector(onCancel:)];
+ [tableView_ setDelegate:self];
+ [tableView_ setDataSource:self];
+ [helpButton_ setTarget:self];
+ [helpButton_ setAction:@selector(onHelpPressed:)];
+ self.view = chooserContentView_;
+ [self updateTableView];
+
+ return self;
+}
+
+- (NSInteger)numberOfRowsInTableView:(NSTableView*)tableView {
+ // When there are no devices, the table contains a message saying there are
+ // no devices, so the number of rows is always at least 1.
+ return std::max(static_cast<NSInteger>(chooserController_->NumOptions()),
+ static_cast<NSInteger>(1));
+}
+
+- (id)tableView:(NSTableView*)tableView
+ objectValueForTableColumn:(NSTableColumn*)tableColumn
+ row:(NSInteger)rowIndex {
+ NSInteger num_options =
+ static_cast<NSInteger>(chooserController_->NumOptions());
+ if (num_options == 0) {
+ DCHECK_EQ(0, rowIndex);
+ return l10n_util::GetNSString(IDS_CHOOSER_BUBBLE_NO_DEVICES_FOUND_PROMPT);
+ }
+
+ DCHECK_GE(rowIndex, 0);
+ DCHECK_LT(rowIndex, num_options);
+ return base::SysUTF16ToNSString(
+ chooserController_->GetOption(static_cast<size_t>(rowIndex)));
+}
+
+- (BOOL)tableView:(NSTableView*)aTableView
+ shouldEditTableColumn:(NSTableColumn*)aTableColumn
+ row:(NSInteger)rowIndex {
+ return NO;
+}
+
+- (void)onOptionsInitialized {
+ [self updateTableView];
+}
+
+- (void)onOptionAdded:(NSInteger)index {
+ [self updateTableView];
+}
+
+- (void)onOptionRemoved:(NSInteger)index {
+ // |tableView_| will automatically selects the next item if the current
+ // item is removed, so here it tracks if the removed item is the item
+ // that was previously selected, if so, deselect it.
+ if ([tableView_ selectedRow] == index)
+ [tableView_ deselectRow:index];
+
+ [self updateTableView];
+}
+
+- (void)updateTableView {
+ [tableView_ setEnabled:chooserController_->NumOptions() > 0];
+ [tableView_ reloadData];
+}
+
+- (void)tableViewSelectionDidChange:(NSNotification*)aNotification {
+ [connectButton_ setEnabled:[tableView_ numberOfSelectedRows] > 0];
+}
+
+- (void)onConnect:(id)sender {
+ NSInteger row = [tableView_ selectedRow];
+ chooserDialogCocoa_->Dismissed();
+ chooserController_->Select(row);
+}
+
+- (void)onCancel:(id)sender {
+ chooserDialogCocoa_->Dismissed();
+ chooserController_->Cancel();
+}
+
+- (void)onHelpPressed:(id)sender {
+ chooserController_->OpenHelpCenterUrl();
+}
+
+- (ChooserContentView*)chooserContentView {
+ return chooserContentView_.get();
+}
+
+@end

Powered by Google App Engine
This is Rietveld 408576698