OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/base_bubble_controller.h" | 5 #import "chrome/browser/ui/cocoa/base_bubble_controller.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/mac/bundle_locations.h" | 8 #include "base/mac/bundle_locations.h" |
9 #include "base/mac/foundation_util.h" | 9 #include "base/mac/foundation_util.h" |
10 #include "base/mac/mac_util.h" | 10 #include "base/mac/mac_util.h" |
11 #include "base/mac/scoped_nsobject.h" | 11 #include "base/mac/scoped_nsobject.h" |
12 #include "base/mac/sdk_forward_declarations.h" | 12 #include "base/mac/sdk_forward_declarations.h" |
13 #include "base/strings/string_util.h" | 13 #include "base/strings/string_util.h" |
14 #import "chrome/browser/ui/cocoa/browser_window_controller.h" | 14 #import "chrome/browser/ui/cocoa/browser_window_controller.h" |
15 #import "chrome/browser/ui/cocoa/info_bubble_view.h" | 15 #import "chrome/browser/ui/cocoa/info_bubble_view.h" |
16 #import "chrome/browser/ui/cocoa/info_bubble_window.h" | 16 #import "chrome/browser/ui/cocoa/info_bubble_window.h" |
17 #import "chrome/browser/ui/cocoa/tabs/tab_strip_model_observer_bridge.h" | 17 #import "chrome/browser/ui/cocoa/tabs/tab_strip_model_observer_bridge.h" |
18 | 18 |
19 @interface BaseBubbleController (Private) | 19 @interface BaseBubbleController (Private) |
| 20 - (InfoBubbleWindow*)bubbleWindow; |
20 - (void)registerForNotifications; | 21 - (void)registerForNotifications; |
21 - (void)updateOriginFromAnchor; | 22 - (void)updateOriginFromAnchor; |
22 - (void)activateTabWithContents:(content::WebContents*)newContents | 23 - (void)activateTabWithContents:(content::WebContents*)newContents |
23 previousContents:(content::WebContents*)oldContents | 24 previousContents:(content::WebContents*)oldContents |
24 atIndex:(NSInteger)index | 25 atIndex:(NSInteger)index |
25 reason:(int)reason; | 26 reason:(int)reason; |
26 - (void)recordAnchorOffset; | 27 - (void)recordAnchorOffset; |
27 - (void)parentWindowDidResize:(NSNotification*)notification; | 28 - (void)parentWindowDidResize:(NSNotification*)notification; |
28 - (void)parentWindowWillClose:(NSNotification*)notification; | 29 - (void)parentWindowWillClose:(NSNotification*)notification; |
29 - (void)parentWindowWillBecomeFullScreen:(NSNotification*)notification; | 30 - (void)parentWindowWillBecomeFullScreen:(NSNotification*)notification; |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
107 } | 108 } |
108 | 109 |
109 [bubble_ setArrowLocation:info_bubble::kTopRight]; | 110 [bubble_ setArrowLocation:info_bubble::kTopRight]; |
110 } | 111 } |
111 | 112 |
112 - (void)dealloc { | 113 - (void)dealloc { |
113 [[NSNotificationCenter defaultCenter] removeObserver:self]; | 114 [[NSNotificationCenter defaultCenter] removeObserver:self]; |
114 [super dealloc]; | 115 [super dealloc]; |
115 } | 116 } |
116 | 117 |
| 118 - (InfoBubbleWindow*)bubbleWindow { |
| 119 return base::mac::ObjCCastStrict<InfoBubbleWindow>([self window]); |
| 120 } |
| 121 |
117 - (void)registerForNotifications { | 122 - (void)registerForNotifications { |
118 NSNotificationCenter* center = [NSNotificationCenter defaultCenter]; | 123 NSNotificationCenter* center = [NSNotificationCenter defaultCenter]; |
119 // Watch to see if the parent window closes, and if so, close this one. | 124 // Watch to see if the parent window closes, and if so, close this one. |
120 [center addObserver:self | 125 [center addObserver:self |
121 selector:@selector(parentWindowWillClose:) | 126 selector:@selector(parentWindowWillClose:) |
122 name:NSWindowWillCloseNotification | 127 name:NSWindowWillCloseNotification |
123 object:parentWindow_]; | 128 object:parentWindow_]; |
124 // Watch for the full screen event, if so, close the bubble | 129 // Watch for the full screen event, if so, close the bubble |
125 [center addObserver:self | 130 [center addObserver:self |
126 selector:@selector(parentWindowWillBecomeFullScreen:) | 131 selector:@selector(parentWindowWillBecomeFullScreen:) |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
226 if (shouldOpenAsKeyWindow_) | 231 if (shouldOpenAsKeyWindow_) |
227 [window makeKeyAndOrderFront:self]; | 232 [window makeKeyAndOrderFront:self]; |
228 else | 233 else |
229 [window orderFront:nil]; | 234 [window orderFront:nil]; |
230 [self registerKeyStateEventTap]; | 235 [self registerKeyStateEventTap]; |
231 [self recordAnchorOffset]; | 236 [self recordAnchorOffset]; |
232 } | 237 } |
233 | 238 |
234 - (void)close { | 239 - (void)close { |
235 [self closeCleanup]; | 240 [self closeCleanup]; |
236 [super close]; | 241 [[self bubbleWindow] animateClose]; |
237 } | 242 } |
238 | 243 |
239 // The controller is the delegate of the window so it receives did resign key | 244 // The controller is the delegate of the window so it receives did resign key |
240 // notifications. When key is resigned mirror Windows behavior and close the | 245 // notifications. When key is resigned mirror Windows behavior and close the |
241 // window. | 246 // window. |
242 - (void)windowDidResignKey:(NSNotification*)notification { | 247 - (void)windowDidResignKey:(NSNotification*)notification { |
243 NSWindow* window = [self window]; | 248 NSWindow* window = [self window]; |
244 DCHECK_EQ([notification object], window); | 249 DCHECK_EQ([notification object], window); |
245 | 250 |
246 // If the window isn't visible, it is already closed, and this notification | 251 // If the window isn't visible, it is already closed, and this notification |
247 // has been sent as part of the closing operation, so no need to close. | 252 // has been sent as part of the closing operation, so no need to close. |
248 if (![window isVisible]) | 253 if (![window isVisible]) |
249 return; | 254 return; |
250 | 255 |
251 // Don't close when explicily disabled, or if there's an attached sheet (e.g. | 256 // Don't close when explicily disabled, or if there's an attached sheet (e.g. |
252 // Open File dialog). | 257 // Open File dialog). |
253 if ([self shouldCloseOnResignKey] && ![window attachedSheet]) { | 258 if ([self shouldCloseOnResignKey] && ![window attachedSheet]) { |
254 [self close]; | 259 [self close]; |
255 return; | 260 return; |
256 } | 261 } |
257 | 262 |
258 // The bubble should not receive key events when it is no longer key window, | 263 // The bubble should not receive key events when it is no longer key window, |
259 // so disable sharing parent key state. Share parent key state is only used | 264 // so disable sharing parent key state. Share parent key state is only used |
260 // to enable the close/minimize/maximize buttons of the parent window when | 265 // to enable the close/minimize/maximize buttons of the parent window when |
261 // the bubble has key state, so disabling it here is safe. | 266 // the bubble has key state, so disabling it here is safe. |
262 InfoBubbleWindow* bubbleWindow = | 267 [[self bubbleWindow] setAllowShareParentKeyState:NO]; |
263 base::mac::ObjCCastStrict<InfoBubbleWindow>([self window]); | |
264 [bubbleWindow setAllowShareParentKeyState:NO]; | |
265 } | 268 } |
266 | 269 |
267 - (void)windowDidBecomeKey:(NSNotification*)notification { | 270 - (void)windowDidBecomeKey:(NSNotification*)notification { |
268 // Re-enable share parent key state to make sure the close/minimize/maximize | 271 // Re-enable share parent key state to make sure the close/minimize/maximize |
269 // buttons of the parent window are active. | 272 // buttons of the parent window are active. |
270 InfoBubbleWindow* bubbleWindow = | 273 [[self bubbleWindow] setAllowShareParentKeyState:YES]; |
271 base::mac::ObjCCastStrict<InfoBubbleWindow>([self window]); | |
272 [bubbleWindow setAllowShareParentKeyState:YES]; | |
273 } | 274 } |
274 | 275 |
275 // Since the bubble shares first responder with its parent window, set event | 276 // Since the bubble shares first responder with its parent window, set event |
276 // handlers to dismiss the bubble when it would normally lose key state. | 277 // handlers to dismiss the bubble when it would normally lose key state. |
277 // Events on sheets are ignored: this assumes the sheet belongs to the bubble | 278 // Events on sheets are ignored: this assumes the sheet belongs to the bubble |
278 // since, to affect a sheet on a different window, the bubble would also lose | 279 // since, to affect a sheet on a different window, the bubble would also lose |
279 // key status in -[NSWindowDelegate windowDidResignKey:]. This keeps the logic | 280 // key status in -[NSWindowDelegate windowDidResignKey:]. This keeps the logic |
280 // simple, since -[NSWindow attachedSheet] returns nil while the sheet is still | 281 // simple, since -[NSWindow attachedSheet] returns nil while the sheet is still |
281 // closing. | 282 // closing. |
282 - (void)registerKeyStateEventTap { | 283 - (void)registerKeyStateEventTap { |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
381 | 382 |
382 - (void)activateTabWithContents:(content::WebContents*)newContents | 383 - (void)activateTabWithContents:(content::WebContents*)newContents |
383 previousContents:(content::WebContents*)oldContents | 384 previousContents:(content::WebContents*)oldContents |
384 atIndex:(NSInteger)index | 385 atIndex:(NSInteger)index |
385 reason:(int)reason { | 386 reason:(int)reason { |
386 // The user switched tabs; close. | 387 // The user switched tabs; close. |
387 [self close]; | 388 [self close]; |
388 } | 389 } |
389 | 390 |
390 @end // BaseBubbleController | 391 @end // BaseBubbleController |
OLD | NEW |