OLD | NEW |
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" | |
15 #include "base/strings/utf_string_conversions.h" | 14 #include "base/strings/utf_string_conversions.h" |
16 #include "chrome/browser/ui/browser.h" | 15 #include "chrome/browser/ui/browser.h" |
17 #include "chrome/browser/ui/browser_window.h" | 16 #include "chrome/browser/ui/browser_window.h" |
18 #import "chrome/browser/ui/cocoa/base_bubble_controller.h" | 17 #import "chrome/browser/ui/cocoa/base_bubble_controller.h" |
19 #import "chrome/browser/ui/cocoa/browser_window_controller.h" | 18 #import "chrome/browser/ui/cocoa/browser_window_controller.h" |
20 #import "chrome/browser/ui/cocoa/browser_window_utils.h" | 19 #import "chrome/browser/ui/cocoa/browser_window_utils.h" |
21 #import "chrome/browser/ui/cocoa/chooser_content_view_cocoa.h" | 20 #import "chrome/browser/ui/cocoa/chooser_content_view_cocoa.h" |
22 #import "chrome/browser/ui/cocoa/info_bubble_view.h" | 21 #import "chrome/browser/ui/cocoa/info_bubble_view.h" |
23 #import "chrome/browser/ui/cocoa/info_bubble_window.h" | 22 #import "chrome/browser/ui/cocoa/info_bubble_window.h" |
24 #import "chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h" | 23 #import "chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h" |
25 #include "chrome/browser/ui/website_settings/chooser_bubble_delegate.h" | 24 #include "chrome/browser/ui/website_settings/chooser_bubble_delegate.h" |
26 #include "chrome/grit/generated_resources.h" | 25 #include "chrome/grit/generated_resources.h" |
27 #include "components/bubble/bubble_controller.h" | 26 #include "components/bubble/bubble_controller.h" |
| 27 #include "components/chooser_controller/chooser_controller.h" |
28 #include "components/url_formatter/elide_url.h" | 28 #include "components/url_formatter/elide_url.h" |
29 #include "content/public/browser/native_web_keyboard_event.h" | 29 #include "content/public/browser/native_web_keyboard_event.h" |
30 #include "ui/base/cocoa/cocoa_base_utils.h" | 30 #include "ui/base/cocoa/cocoa_base_utils.h" |
31 #include "ui/base/cocoa/window_size_constants.h" | 31 #include "ui/base/cocoa/window_size_constants.h" |
32 #include "ui/base/l10n/l10n_util.h" | |
33 #include "ui/base/l10n/l10n_util_mac.h" | 32 #include "ui/base/l10n/l10n_util_mac.h" |
34 #include "url/gurl.h" | 33 #include "url/gurl.h" |
35 #include "url/origin.h" | 34 #include "url/origin.h" |
36 | 35 |
37 std::unique_ptr<BubbleUi> ChooserBubbleDelegate::BuildBubbleUi() { | 36 std::unique_ptr<BubbleUi> ChooserBubbleDelegate::BuildBubbleUi() { |
38 return base::WrapUnique( | 37 return base::WrapUnique( |
39 new ChooserBubbleUiCocoa(browser_, chooser_controller())); | 38 new ChooserBubbleUiCocoa(browser_, std::move(chooser_controller_))); |
40 } | 39 } |
41 | 40 |
42 @interface ChooserBubbleUiController | 41 @interface ChooserBubbleUiController |
43 : BaseBubbleController<NSTableViewDataSource, NSTableViewDelegate> { | 42 : BaseBubbleController<NSTableViewDataSource, NSTableViewDelegate> { |
44 @private | 43 @private |
45 // Bridge to the C++ class that created this object. | 44 // Bridge to the C++ class that created this object. |
46 ChooserBubbleUiCocoa* bridge_; // Weak. | 45 ChooserBubbleUiCocoa* bridge_; // Weak. |
47 bool buttonPressed_; | 46 bool buttonPressed_; |
48 | 47 |
49 base::scoped_nsobject<ChooserContentViewCocoa> chooserContentView_; | 48 base::scoped_nsobject<ChooserContentViewCocoa> chooserContentView_; |
50 NSTableView* tableView_; // Weak. | 49 NSTableView* tableView_; // Weak. |
51 NSButton* connectButton_; // Weak. | 50 NSButton* connectButton_; // Weak. |
52 NSButton* cancelButton_; // Weak. | 51 NSButton* cancelButton_; // Weak. |
53 NSButton* helpButton_; // Weak. | |
54 | 52 |
55 Browser* browser_; // Weak. | 53 Browser* browser_; // Weak. |
56 ChooserController* chooserController_; // Weak. | 54 // |chooserController_| is not owned by this class, it is owned by |
| 55 // ChooserContentViewCocoa. |
| 56 // This field only temporarily owns the ChooserController. It is moved |
| 57 // into the ChooserContentViewCocoa when BuildBubbleUi() is called and |
| 58 // the bubble is shown. |
| 59 std::unique_ptr<ChooserController> chooserController_; |
57 } | 60 } |
58 | 61 |
59 // Designated initializer. |browser| and |bridge| must both be non-nil. | 62 // Designated initializer. |browser| and |bridge| must both be non-nil. |
60 - (id)initWithBrowser:(Browser*)browser | 63 - (id)initWithBrowser:(Browser*)browser |
61 chooserController:(ChooserController*)chooserController | 64 chooserController:(std::unique_ptr<ChooserController>)chooserController |
62 bubbleReference:(BubbleReference)bubbleReference | 65 bubbleReference:(BubbleReference)bubbleReference |
63 bridge:(ChooserBubbleUiCocoa*)bridge; | 66 bridge:(ChooserBubbleUiCocoa*)bridge; |
64 | 67 |
65 // Makes the bubble visible. | 68 // Makes the bubble visible. |
66 - (void)show; | 69 - (void)show; |
67 | 70 |
68 // Will reposition the bubble based in case the anchor or parent should change. | 71 // Will reposition the bubble based in case the anchor or parent should change. |
69 - (void)updateAnchorPosition; | 72 - (void)updateAnchorPosition; |
70 | 73 |
71 // Will calculate the expected anchor point for this bubble. | 74 // Will calculate the expected anchor point for this bubble. |
72 // Should only be used outside this class for tests. | 75 // Should only be used outside this class for tests. |
73 - (NSPoint)getExpectedAnchorPoint; | 76 - (NSPoint)getExpectedAnchorPoint; |
74 | 77 |
75 // Returns true if the browser has support for the location bar. | 78 // Returns true if the browser has support for the location bar. |
76 // Should only be used outside this class for tests. | 79 // Should only be used outside this class for tests. |
77 - (bool)hasLocationBar; | 80 - (bool)hasLocationBar; |
78 | 81 |
79 // Update |tableView_| when chooser options were initialized. | |
80 - (void)onOptionsInitialized; | |
81 | |
82 // Update |tableView_| when chooser option was added. | |
83 - (void)onOptionAdded:(NSInteger)index; | |
84 | |
85 // Update |tableView_| when chooser option was removed. | |
86 - (void)onOptionRemoved:(NSInteger)index; | |
87 | |
88 // Update |tableView_| when chooser options changed. | 82 // Update |tableView_| when chooser options changed. |
89 - (void)updateTableView; | 83 - (void)updateTableView; |
90 | 84 |
91 // Determines if the bubble has an anchor in a corner or no anchor at all. | 85 // Determines if the bubble has an anchor in a corner or no anchor at all. |
92 - (info_bubble::BubbleArrowLocation)getExpectedArrowLocation; | 86 - (info_bubble::BubbleArrowLocation)getExpectedArrowLocation; |
93 | 87 |
94 // Returns the expected parent for this bubble. | 88 // Returns the expected parent for this bubble. |
95 - (NSWindow*)getExpectedParentWindow; | 89 - (NSWindow*)getExpectedParentWindow; |
96 | 90 |
97 // Called when the "Connect" button is pressed. | 91 // Called when the "Connect" button is pressed. |
98 - (void)onConnect:(id)sender; | 92 - (void)onConnect:(id)sender; |
99 | 93 |
100 // Called when the "Cancel" button is pressed. | 94 // Called when the "Cancel" button is pressed. |
101 - (void)onCancel:(id)sender; | 95 - (void)onCancel:(id)sender; |
102 | 96 |
103 // Called when the "Get help" button is pressed. | |
104 - (void)onHelpPressed:(id)sender; | |
105 | |
106 @end | 97 @end |
107 | 98 |
108 @implementation ChooserBubbleUiController | 99 @implementation ChooserBubbleUiController |
109 | 100 |
110 - (id)initWithBrowser:(Browser*)browser | 101 - (id)initWithBrowser:(Browser*)browser |
111 chooserController:(ChooserController*)chooserController | 102 chooserController:(std::unique_ptr<ChooserController>)chooserController |
112 bubbleReference:(BubbleReference)bubbleReference | 103 bubbleReference:(BubbleReference)bubbleReference |
113 bridge:(ChooserBubbleUiCocoa*)bridge { | 104 bridge:(ChooserBubbleUiCocoa*)bridge { |
114 DCHECK(browser); | 105 DCHECK(browser); |
115 DCHECK(chooserController); | 106 DCHECK(chooserController); |
116 DCHECK(bubbleReference); | 107 DCHECK(bubbleReference); |
117 DCHECK(bridge); | 108 DCHECK(bridge); |
118 | 109 |
119 browser_ = browser; | 110 browser_ = browser; |
120 chooserController_ = chooserController; | 111 chooserController_ = std::move(chooserController); |
121 | 112 |
122 base::scoped_nsobject<InfoBubbleWindow> window([[InfoBubbleWindow alloc] | 113 base::scoped_nsobject<InfoBubbleWindow> window([[InfoBubbleWindow alloc] |
123 initWithContentRect:ui::kWindowSizeDeterminedLater | 114 initWithContentRect:ui::kWindowSizeDeterminedLater |
124 styleMask:NSBorderlessWindowMask | 115 styleMask:NSBorderlessWindowMask |
125 backing:NSBackingStoreBuffered | 116 backing:NSBackingStoreBuffered |
126 defer:NO]); | 117 defer:NO]); |
127 [window setAllowedAnimations:info_bubble::kAnimateNone]; | 118 [window setAllowedAnimations:info_bubble::kAnimateNone]; |
128 [window setReleasedWhenClosed:NO]; | 119 [window setReleasedWhenClosed:NO]; |
129 if ((self = [super initWithWindow:window | 120 if ((self = [super initWithWindow:window |
130 parentWindow:[self getExpectedParentWindow] | 121 parentWindow:[self getExpectedParentWindow] |
131 anchoredAt:NSZeroPoint])) { | 122 anchoredAt:NSZeroPoint])) { |
132 self.bubbleReference = bubbleReference; | 123 self.bubbleReference = bubbleReference; |
133 [self setShouldCloseOnResignKey:NO]; | 124 [self setShouldCloseOnResignKey:NO]; |
134 [self setShouldOpenAsKeyWindow:YES]; | 125 [self setShouldOpenAsKeyWindow:YES]; |
135 [[self bubble] setArrowLocation:[self getExpectedArrowLocation]]; | 126 [[self bubble] setArrowLocation:[self getExpectedArrowLocation]]; |
136 bridge_ = bridge; | 127 bridge_ = bridge; |
137 NSNotificationCenter* center = [NSNotificationCenter defaultCenter]; | 128 NSNotificationCenter* center = [NSNotificationCenter defaultCenter]; |
138 [center addObserver:self | 129 [center addObserver:self |
139 selector:@selector(parentWindowDidMove:) | 130 selector:@selector(parentWindowDidMove:) |
140 name:NSWindowDidMoveNotification | 131 name:NSWindowDidMoveNotification |
141 object:[self getExpectedParentWindow]]; | 132 object:[self getExpectedParentWindow]]; |
142 } | 133 } |
| 134 |
143 return self; | 135 return self; |
144 } | 136 } |
145 | 137 |
146 - (void)windowWillClose:(NSNotification*)notification { | 138 - (void)windowWillClose:(NSNotification*)notification { |
147 [[NSNotificationCenter defaultCenter] | 139 [[NSNotificationCenter defaultCenter] |
148 removeObserver:self | 140 removeObserver:self |
149 name:NSWindowDidMoveNotification | 141 name:NSWindowDidMoveNotification |
150 object:nil]; | 142 object:nil]; |
151 if (!buttonPressed_) | 143 if (!buttonPressed_) |
152 chooserController_->Close(); | 144 [chooserContentView_ Close]; |
153 bridge_->OnBubbleClosing(); | 145 bridge_->OnBubbleClosing(); |
154 [super windowWillClose:notification]; | 146 [super windowWillClose:notification]; |
155 } | 147 } |
156 | 148 |
157 - (void)parentWindowWillToggleFullScreen:(NSNotification*)notification { | 149 - (void)parentWindowWillToggleFullScreen:(NSNotification*)notification { |
158 // Override the base class implementation, which would have closed the bubble. | 150 // Override the base class implementation, which would have closed the bubble. |
159 } | 151 } |
160 | 152 |
161 - (void)parentWindowDidResize:(NSNotification*)notification { | 153 - (void)parentWindowDidResize:(NSNotification*)notification { |
162 [self setAnchorPoint:[self getExpectedAnchorPoint]]; | 154 [self setAnchorPoint:[self getExpectedAnchorPoint]]; |
163 } | 155 } |
164 | 156 |
165 - (void)parentWindowDidMove:(NSNotification*)notification { | 157 - (void)parentWindowDidMove:(NSNotification*)notification { |
166 DCHECK(bridge_); | 158 DCHECK(bridge_); |
167 [self setAnchorPoint:[self getExpectedAnchorPoint]]; | 159 [self setAnchorPoint:[self getExpectedAnchorPoint]]; |
168 } | 160 } |
169 | 161 |
170 - (void)show { | 162 - (void)show { |
| 163 url::Origin origin = chooserController_->GetOrigin(); |
171 chooserContentView_.reset([[ChooserContentViewCocoa alloc] | 164 chooserContentView_.reset([[ChooserContentViewCocoa alloc] |
172 initWithChooserTitle: | 165 initWithChooserTitle: |
173 l10n_util::GetNSStringF( | 166 l10n_util::GetNSStringF( |
174 IDS_DEVICE_CHOOSER_PROMPT, | 167 IDS_DEVICE_CHOOSER_PROMPT, |
175 url_formatter::FormatOriginForSecurityDisplay( | 168 url_formatter::FormatOriginForSecurityDisplay( |
176 chooserController_->GetOrigin(), | 169 origin, url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC)) |
177 url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC))]); | 170 ChooserController:std::move(chooserController_)]); |
178 | 171 |
179 tableView_ = [chooserContentView_ tableView]; | 172 tableView_ = [chooserContentView_ tableView]; |
180 connectButton_ = [chooserContentView_ connectButton]; | 173 connectButton_ = [chooserContentView_ connectButton]; |
181 cancelButton_ = [chooserContentView_ cancelButton]; | 174 cancelButton_ = [chooserContentView_ cancelButton]; |
182 helpButton_ = [chooserContentView_ helpButton]; | |
183 | 175 |
184 [connectButton_ setTarget:self]; | 176 [connectButton_ setTarget:self]; |
185 [connectButton_ setAction:@selector(onConnect:)]; | 177 [connectButton_ setAction:@selector(onConnect:)]; |
186 [cancelButton_ setTarget:self]; | 178 [cancelButton_ setTarget:self]; |
187 [cancelButton_ setAction:@selector(onCancel:)]; | 179 [cancelButton_ setAction:@selector(onCancel:)]; |
188 [tableView_ setDelegate:self]; | 180 [tableView_ setDelegate:self]; |
189 [tableView_ setDataSource:self]; | 181 [tableView_ setDataSource:self]; |
190 [helpButton_ setTarget:self]; | |
191 [helpButton_ setAction:@selector(onHelpPressed:)]; | |
192 | 182 |
193 [[[self window] contentView] addSubview:chooserContentView_.get()]; | 183 [[[self window] contentView] addSubview:chooserContentView_.get()]; |
194 | 184 |
195 NSRect bubbleFrame = | 185 NSRect bubbleFrame = |
196 [[self window] frameRectForContentRect:[chooserContentView_ frame]]; | 186 [[self window] frameRectForContentRect:[chooserContentView_ frame]]; |
197 if ([[self window] isVisible]) { | 187 if ([[self window] isVisible]) { |
198 // Unfortunately, calling -setFrame followed by -setFrameOrigin (called | 188 // Unfortunately, calling -setFrame followed by -setFrameOrigin (called |
199 // within -setAnchorPoint) causes flickering. Avoid the flickering by | 189 // within -setAnchorPoint) causes flickering. Avoid the flickering by |
200 // manually adjusting the new frame's origin so that the top left stays the | 190 // manually adjusting the new frame's origin so that the top left stays the |
201 // same, and only calling -setFrame. | 191 // same, and only calling -setFrame. |
202 NSRect currentWindowFrame = [[self window] frame]; | 192 NSRect currentWindowFrame = [[self window] frame]; |
203 bubbleFrame.origin = currentWindowFrame.origin; | 193 bubbleFrame.origin = currentWindowFrame.origin; |
204 bubbleFrame.origin.y = bubbleFrame.origin.y + | 194 bubbleFrame.origin.y = bubbleFrame.origin.y + |
205 currentWindowFrame.size.height - | 195 currentWindowFrame.size.height - |
206 bubbleFrame.size.height; | 196 bubbleFrame.size.height; |
207 [[self window] setFrame:bubbleFrame display:YES]; | 197 [[self window] setFrame:bubbleFrame display:YES]; |
208 } else { | 198 } else { |
209 [[self window] setFrame:bubbleFrame display:NO]; | 199 [[self window] setFrame:bubbleFrame display:NO]; |
210 [self setAnchorPoint:[self getExpectedAnchorPoint]]; | 200 [self setAnchorPoint:[self getExpectedAnchorPoint]]; |
211 [self showWindow:nil]; | 201 [self showWindow:nil]; |
212 [[self window] makeFirstResponder:nil]; | 202 [[self window] makeFirstResponder:nil]; |
213 [[self window] setInitialFirstResponder:tableView_]; | 203 [[self window] setInitialFirstResponder:tableView_]; |
214 } | 204 } |
215 } | 205 } |
216 | 206 |
217 - (NSInteger)numberOfRowsInTableView:(NSTableView*)tableView { | 207 - (NSInteger)numberOfRowsInTableView:(NSTableView*)tableView { |
218 // When there are no devices, the table contains a message saying there are | 208 return [chooserContentView_ numOptions]; |
219 // no devices, so the number of rows is always at least 1. | |
220 return std::max(static_cast<NSInteger>(chooserController_->NumOptions()), | |
221 static_cast<NSInteger>(1)); | |
222 } | 209 } |
223 | 210 |
224 - (id)tableView:(NSTableView*)tableView | 211 - (id)tableView:(NSTableView*)tableView |
225 objectValueForTableColumn:(NSTableColumn*)tableColumn | 212 objectValueForTableColumn:(NSTableColumn*)tableColumn |
226 row:(NSInteger)rowIndex { | 213 row:(NSInteger)rowIndex { |
227 NSInteger num_options = | 214 return [chooserContentView_ getOption:rowIndex]; |
228 static_cast<NSInteger>(chooserController_->NumOptions()); | |
229 if (num_options == 0) { | |
230 DCHECK_EQ(0, rowIndex); | |
231 return l10n_util::GetNSString(IDS_DEVICE_CHOOSER_NO_DEVICES_FOUND_PROMPT); | |
232 } | |
233 | |
234 DCHECK_GE(rowIndex, 0); | |
235 DCHECK_LT(rowIndex, num_options); | |
236 return base::SysUTF16ToNSString( | |
237 chooserController_->GetOption(static_cast<size_t>(rowIndex))); | |
238 } | 215 } |
239 | 216 |
240 - (BOOL)tableView:(NSTableView*)aTableView | 217 - (BOOL)tableView:(NSTableView*)aTableView |
241 shouldEditTableColumn:(NSTableColumn*)aTableColumn | 218 shouldEditTableColumn:(NSTableColumn*)aTableColumn |
242 row:(NSInteger)rowIndex { | 219 row:(NSInteger)rowIndex { |
243 return NO; | 220 return NO; |
244 } | 221 } |
245 | 222 |
246 - (void)onOptionsInitialized { | |
247 [self updateTableView]; | |
248 } | |
249 | |
250 - (void)onOptionAdded:(NSInteger)index { | |
251 [self updateTableView]; | |
252 } | |
253 | |
254 - (void)onOptionRemoved:(NSInteger)index { | |
255 // |tableView_| will automatically select the removed item's next item. | |
256 // So here it tracks if the removed item is the item that was currently | |
257 // selected, if so, deselect it. Also if the removed item is before the | |
258 // currently selected item, the currently selected item's index needs to | |
259 // be adjusted by one. | |
260 NSInteger selectedRow = [tableView_ selectedRow]; | |
261 if (selectedRow == index) | |
262 [tableView_ deselectRow:index]; | |
263 else if (selectedRow > index) | |
264 [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:selectedRow - 1] | |
265 byExtendingSelection:NO]; | |
266 | |
267 [self updateTableView]; | |
268 } | |
269 | |
270 - (void)updateTableView { | 223 - (void)updateTableView { |
271 [tableView_ setEnabled:chooserController_->NumOptions() > 0]; | 224 [chooserContentView_ updateTableView]; |
272 [tableView_ reloadData]; | |
273 } | 225 } |
274 | 226 |
275 - (void)tableViewSelectionDidChange:(NSNotification*)aNotification { | 227 - (void)tableViewSelectionDidChange:(NSNotification*)aNotification { |
276 [connectButton_ setEnabled:[tableView_ numberOfSelectedRows] > 0]; | 228 [connectButton_ setEnabled:[tableView_ numberOfSelectedRows] > 0]; |
277 } | 229 } |
278 | 230 |
279 - (void)updateAnchorPosition { | 231 - (void)updateAnchorPosition { |
280 [self setParentWindow:[self getExpectedParentWindow]]; | 232 [self setParentWindow:[self getExpectedParentWindow]]; |
281 [self setAnchorPoint:[self getExpectedAnchorPoint]]; | 233 [self setAnchorPoint:[self getExpectedAnchorPoint]]; |
282 } | 234 } |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
322 + (void)alignCenterOf:(NSView*)viewA verticallyToCenterOf:(NSView*)viewB { | 274 + (void)alignCenterOf:(NSView*)viewA verticallyToCenterOf:(NSView*)viewB { |
323 NSRect frameA = [viewA frame]; | 275 NSRect frameA = [viewA frame]; |
324 NSRect frameB = [viewB frame]; | 276 NSRect frameB = [viewB frame]; |
325 frameA.origin.y = | 277 frameA.origin.y = |
326 NSMinY(frameB) + std::floor((NSHeight(frameB) - NSHeight(frameA)) / 2); | 278 NSMinY(frameB) + std::floor((NSHeight(frameB) - NSHeight(frameA)) / 2); |
327 [viewA setFrameOrigin:frameA.origin]; | 279 [viewA setFrameOrigin:frameA.origin]; |
328 } | 280 } |
329 | 281 |
330 - (void)onConnect:(id)sender { | 282 - (void)onConnect:(id)sender { |
331 buttonPressed_ = true; | 283 buttonPressed_ = true; |
332 NSInteger row = [tableView_ selectedRow]; | 284 [chooserContentView_ Accept]; |
333 chooserController_->Select(row); | |
334 self.bubbleReference->CloseBubble(BUBBLE_CLOSE_ACCEPTED); | 285 self.bubbleReference->CloseBubble(BUBBLE_CLOSE_ACCEPTED); |
335 [self close]; | 286 [self close]; |
336 } | 287 } |
337 | 288 |
338 - (void)onCancel:(id)sender { | 289 - (void)onCancel:(id)sender { |
339 buttonPressed_ = true; | 290 buttonPressed_ = true; |
340 chooserController_->Cancel(); | 291 [chooserContentView_ Cancel]; |
341 self.bubbleReference->CloseBubble(BUBBLE_CLOSE_CANCELED); | 292 self.bubbleReference->CloseBubble(BUBBLE_CLOSE_CANCELED); |
342 [self close]; | 293 [self close]; |
343 } | 294 } |
344 | 295 |
345 - (void)onHelpPressed:(id)sender { | |
346 chooserController_->OpenHelpCenterUrl(); | |
347 } | |
348 | |
349 @end | 296 @end |
350 | 297 |
351 ChooserBubbleUiCocoa::ChooserBubbleUiCocoa( | 298 ChooserBubbleUiCocoa::ChooserBubbleUiCocoa( |
352 Browser* browser, | 299 Browser* browser, |
353 ChooserController* chooser_controller) | 300 std::unique_ptr<ChooserController> chooser_controller) |
354 : browser_(browser), | 301 : browser_(browser), |
355 chooser_controller_(chooser_controller), | 302 chooser_controller_(std::move(chooser_controller)), |
356 chooser_bubble_ui_controller_(nil) { | 303 chooser_bubble_ui_controller_(nil) { |
357 DCHECK(browser); | 304 DCHECK(browser_); |
358 DCHECK(chooser_controller); | 305 DCHECK(chooser_controller_); |
359 chooser_controller_->set_observer(this); | |
360 } | 306 } |
361 | 307 |
362 ChooserBubbleUiCocoa::~ChooserBubbleUiCocoa() { | 308 ChooserBubbleUiCocoa::~ChooserBubbleUiCocoa() { |
363 chooser_controller_->set_observer(nullptr); | 309 if (chooser_bubble_ui_controller_) { |
364 [chooser_bubble_ui_controller_ close]; | 310 [chooser_bubble_ui_controller_ close]; |
365 chooser_bubble_ui_controller_ = nil; | 311 chooser_bubble_ui_controller_ = nil; |
| 312 } |
366 } | 313 } |
367 | 314 |
368 void ChooserBubbleUiCocoa::Show(BubbleReference bubble_reference) { | 315 void ChooserBubbleUiCocoa::Show(BubbleReference bubble_reference) { |
369 if (!chooser_bubble_ui_controller_) { | 316 if (!chooser_bubble_ui_controller_) { |
370 chooser_bubble_ui_controller_ = | 317 chooser_bubble_ui_controller_ = [[ChooserBubbleUiController alloc] |
371 [[ChooserBubbleUiController alloc] initWithBrowser:browser_ | 318 initWithBrowser:browser_ |
372 chooserController:chooser_controller_ | 319 chooserController:std::move(chooser_controller_) |
373 bubbleReference:bubble_reference | 320 bubbleReference:bubble_reference |
374 bridge:this]; | 321 bridge:this]; |
375 } | 322 } |
376 | |
377 [chooser_bubble_ui_controller_ show]; | 323 [chooser_bubble_ui_controller_ show]; |
378 [chooser_bubble_ui_controller_ updateTableView]; | 324 [chooser_bubble_ui_controller_ updateTableView]; |
379 } | 325 } |
380 | 326 |
381 void ChooserBubbleUiCocoa::Close() { | 327 void ChooserBubbleUiCocoa::Close() { |
382 [chooser_bubble_ui_controller_ close]; | 328 if (chooser_bubble_ui_controller_) { |
383 chooser_bubble_ui_controller_ = nil; | 329 [chooser_bubble_ui_controller_ close]; |
| 330 chooser_bubble_ui_controller_ = nil; |
| 331 } |
384 } | 332 } |
385 | 333 |
386 void ChooserBubbleUiCocoa::UpdateAnchorPosition() { | 334 void ChooserBubbleUiCocoa::UpdateAnchorPosition() { |
387 [chooser_bubble_ui_controller_ updateAnchorPosition]; | 335 if (chooser_bubble_ui_controller_) |
388 } | 336 [chooser_bubble_ui_controller_ updateAnchorPosition]; |
389 | |
390 void ChooserBubbleUiCocoa::OnOptionsInitialized() { | |
391 [chooser_bubble_ui_controller_ onOptionsInitialized]; | |
392 } | |
393 | |
394 void ChooserBubbleUiCocoa::OnOptionAdded(size_t index) { | |
395 [chooser_bubble_ui_controller_ onOptionAdded:static_cast<NSInteger>(index)]; | |
396 } | |
397 | |
398 void ChooserBubbleUiCocoa::OnOptionRemoved(size_t index) { | |
399 [chooser_bubble_ui_controller_ onOptionRemoved:static_cast<NSInteger>(index)]; | |
400 } | 337 } |
401 | 338 |
402 void ChooserBubbleUiCocoa::OnBubbleClosing() { | 339 void ChooserBubbleUiCocoa::OnBubbleClosing() { |
403 chooser_bubble_ui_controller_ = nil; | 340 chooser_bubble_ui_controller_ = nil; |
404 } | 341 } |
OLD | NEW |