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

Unified Diff: chrome/browser/ui/cocoa/chooser_content_view_cocoa.mm

Issue 2086663003: Change ChooserController ownership model (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: changed some Cocoa function names to start with lowercase letter Created 4 years, 6 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/chooser_content_view_cocoa.mm
diff --git a/chrome/browser/ui/cocoa/chooser_content_view_cocoa.mm b/chrome/browser/ui/cocoa/chooser_content_view_cocoa.mm
index dcd1e24c15b696984c104b3e920e28aea82247ab..a64a539b9939595c3e40a0baaf1fb7b8034a62f1 100644
--- a/chrome/browser/ui/cocoa/chooser_content_view_cocoa.mm
+++ b/chrome/browser/ui/cocoa/chooser_content_view_cocoa.mm
@@ -4,11 +4,15 @@
#import "chrome/browser/ui/cocoa/chooser_content_view_cocoa.h"
+#include <algorithm>
+
+#include "base/macros.h"
+#include "base/strings/sys_string_conversions.h"
#import "chrome/browser/ui/cocoa/constrained_window/constrained_window_button.h"
#include "chrome/grit/generated_resources.h"
+#include "components/chooser_controller/chooser_controller.h"
#import "third_party/google_toolbox_for_mac/src/AppKit/GTMUILocalizerAndLayoutTweaker.h"
#import "ui/base/cocoa/controls/hyperlink_button_cell.h"
-#include "ui/base/l10n/l10n_util.h"
#include "ui/base/l10n/l10n_util_mac.h"
namespace {
@@ -36,9 +40,75 @@ const CGFloat kSeparatorHeight = 1.0f;
} // namespace
+class TableViewController : public ChooserController::Observer {
+ public:
+ TableViewController(ChooserController* chooser_controller,
+ NSTableView* table_view);
+ ~TableViewController() override;
+
+ // ChooserController::Observer:
+ void OnOptionsInitialized() override;
+ void OnOptionAdded(size_t index) override;
+ void OnOptionRemoved(size_t index) override;
+
+ void UpdateTableView();
+
+ private:
+ ChooserController* chooser_controller_;
+ NSTableView* table_view_;
+
+ DISALLOW_COPY_AND_ASSIGN(TableViewController);
+};
+
+TableViewController::TableViewController(ChooserController* chooser_controller,
+ NSTableView* table_view)
+ : chooser_controller_(chooser_controller), table_view_(table_view) {
+ DCHECK(chooser_controller_);
+ DCHECK(table_view_);
+ chooser_controller_->set_observer(this);
+}
+
+TableViewController::~TableViewController() {
+ chooser_controller_->set_observer(nullptr);
+}
+
+void TableViewController::OnOptionsInitialized() {
+ UpdateTableView();
+}
+
+void TableViewController::OnOptionAdded(size_t index) {
+ UpdateTableView();
+}
+
+void TableViewController::OnOptionRemoved(size_t index) {
+ // |table_view_| will automatically select the removed item's next item.
+ // So here it tracks if the removed item is the item that was currently
+ // selected, if so, deselect it. Also if the removed item is before the
+ // currently selected item, the currently selected item's index needs to
+ // be adjusted by one.
+ NSInteger idx = static_cast<NSInteger>(index);
+ NSInteger selected_row = [table_view_ selectedRow];
+ if (selected_row == idx)
+ [table_view_ deselectRow:idx];
+ else if (selected_row > idx)
+ [table_view_
+ selectRowIndexes:[NSIndexSet indexSetWithIndex:selected_row - 1]
+ byExtendingSelection:NO];
+
+ UpdateTableView();
+}
+
+void TableViewController::UpdateTableView() {
+ [table_view_ setEnabled:chooser_controller_->NumOptions() > 0];
+ [table_view_ reloadData];
+}
+
@implementation ChooserContentViewCocoa
-- (instancetype)initWithChooserTitle:(NSString*)chooserTitle {
+- (instancetype)initWithChooserTitle:(NSString*)chooserTitle
+ ChooserController:
+ (std::unique_ptr<ChooserController>)chooserController {
+ chooserController_ = std::move(chooserController);
Robert Sesek 2016/06/22 21:46:30 Place this in the if block below.
juncai 2016/06/22 22:41:20 Done.
// ------------------------------------
// | Chooser title |
// | -------------------------------- |
@@ -156,7 +226,12 @@ const CGFloat kSeparatorHeight = 1.0f;
CGFloat helpButtonOriginY = kMarginY;
[helpButton_
setFrameOrigin:NSMakePoint(helpButtonOriginX, helpButtonOriginY)];
+ [helpButton_ setTarget:self];
+ [helpButton_ setAction:@selector(onHelpPressed:)];
[self addSubview:helpButton_];
+
+ tableViewController_.reset(
+ new TableViewController(chooserController_.get(), tableView_.get()));
}
return self;
@@ -249,4 +324,46 @@ const CGFloat kSeparatorHeight = 1.0f;
return helpButton_.get();
}
+- (NSInteger)numOptions {
+ // 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));
+}
+
+- (NSString*)getOption:(NSInteger)index {
+ NSInteger numOptions =
+ static_cast<NSInteger>(chooserController_->NumOptions());
+ if (numOptions == 0) {
+ DCHECK_EQ(0, index);
+ return l10n_util::GetNSString(IDS_DEVICE_CHOOSER_NO_DEVICES_FOUND_PROMPT);
+ }
+
+ DCHECK_GE(index, 0);
+ DCHECK_LT(index, numOptions);
+
+ return base::SysUTF16ToNSString(
+ chooserController_->GetOption(static_cast<size_t>(index)));
+}
+
+- (void)updateTableView {
+ tableViewController_->UpdateTableView();
+}
+
+- (void)accept {
+ chooserController_->Select([tableView_ selectedRow]);
+}
+
+- (void)cancel {
+ chooserController_->Cancel();
+}
+
+- (void)close {
+ chooserController_->Close();
+}
+
+- (void)onHelpPressed:(id)sender {
+ chooserController_->OpenHelpCenterUrl();
+}
+
@end

Powered by Google App Engine
This is Rietveld 408576698