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/browser_window_controller_private.h" | 5 #import "chrome/browser/ui/cocoa/browser_window_controller_private.h" |
6 | 6 |
7 #include <cmath> | 7 #include <cmath> |
8 | 8 |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/mac/bind_objc_block.h" | 10 #include "base/mac/bind_objc_block.h" |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
198 willPositionSheet:(NSWindow*)sheet | 198 willPositionSheet:(NSWindow*)sheet |
199 usingRect:(NSRect)defaultSheetRect { | 199 usingRect:(NSRect)defaultSheetRect { |
200 // Position the sheet as follows: | 200 // Position the sheet as follows: |
201 // - If the bookmark bar is hidden or shown as a bubble (on the NTP when the | 201 // - If the bookmark bar is hidden or shown as a bubble (on the NTP when the |
202 // bookmark bar is disabled), position the sheet immediately below the | 202 // bookmark bar is disabled), position the sheet immediately below the |
203 // normal toolbar. | 203 // normal toolbar. |
204 // - If the bookmark bar is shown (attached to the normal toolbar), position | 204 // - If the bookmark bar is shown (attached to the normal toolbar), position |
205 // the sheet below the bookmark bar. | 205 // the sheet below the bookmark bar. |
206 // - If the bookmark bar is currently animating, position the sheet according | 206 // - If the bookmark bar is currently animating, position the sheet according |
207 // to where the bar will be when the animation ends. | 207 // to where the bar will be when the animation ends. |
| 208 CGFloat defaultSheetY = defaultSheetRect.origin.y; |
208 switch ([bookmarkBarController_ currentState]) { | 209 switch ([bookmarkBarController_ currentState]) { |
209 case BookmarkBar::SHOW: { | 210 case BookmarkBar::SHOW: { |
210 NSRect bookmarkBarFrame = [[bookmarkBarController_ view] frame]; | 211 NSRect bookmarkBarFrame = [[bookmarkBarController_ view] frame]; |
211 defaultSheetRect.origin.y = bookmarkBarFrame.origin.y; | 212 defaultSheetY = bookmarkBarFrame.origin.y; |
212 break; | 213 break; |
213 } | 214 } |
214 case BookmarkBar::HIDDEN: | 215 case BookmarkBar::HIDDEN: |
215 case BookmarkBar::DETACHED: { | 216 case BookmarkBar::DETACHED: { |
216 if ([self hasToolbar]) { | 217 if ([self hasToolbar]) { |
217 NSRect toolbarFrame = [[toolbarController_ view] frame]; | 218 NSRect toolbarFrame = [[toolbarController_ view] frame]; |
218 defaultSheetRect.origin.y = toolbarFrame.origin.y; | 219 defaultSheetY = toolbarFrame.origin.y; |
219 } else { | 220 } else { |
220 // The toolbar is not shown in application mode. The sheet should be | 221 // The toolbar is not shown in application mode. The sheet should be |
221 // located at the top of the window, under the title of the window. | 222 // located at the top of the window, under the title of the window. |
222 defaultSheetRect.origin.y = NSHeight([[window contentView] frame]) - | 223 defaultSheetY = NSHeight([[window contentView] frame]) - |
223 defaultSheetRect.size.height; | 224 defaultSheetRect.size.height; |
224 } | 225 } |
225 break; | 226 break; |
226 } | 227 } |
227 } | 228 } |
| 229 |
| 230 // AppKit may shift the window up to fit the sheet on screen, but it will |
| 231 // never adjust the height of the sheet, or the origin of the sheet relative |
| 232 // to the window. Adjust the origin to prevent sheets from extending past the |
| 233 // bottom of the screen. |
| 234 |
| 235 // Don't allow the sheet to extend past the bottom of the window. This logic |
| 236 // intentionally ignores the size of the screens, since the window might span |
| 237 // multiple screens, and AppKit may reposition the window. |
| 238 CGFloat sheetHeight = NSHeight([sheet frame]); |
| 239 defaultSheetY = std::max(defaultSheetY, sheetHeight); |
| 240 |
| 241 // It doesn't make sense to provide a Y higher than the height of the window. |
| 242 CGFloat windowHeight = NSHeight([window frame]); |
| 243 defaultSheetY = std::min(defaultSheetY, windowHeight); |
| 244 |
| 245 defaultSheetRect.origin.y = defaultSheetY; |
228 return defaultSheetRect; | 246 return defaultSheetRect; |
229 } | 247 } |
230 | 248 |
231 - (void)layoutSubviews { | 249 - (void)layoutSubviews { |
232 // Suppress title drawing if necessary. | 250 // Suppress title drawing if necessary. |
233 if ([self.window respondsToSelector:@selector(setShouldHideTitle:)]) | 251 if ([self.window respondsToSelector:@selector(setShouldHideTitle:)]) |
234 [(id)self.window setShouldHideTitle:![self hasTitleBar]]; | 252 [(id)self.window setShouldHideTitle:![self hasTitleBar]]; |
235 | 253 |
236 [bookmarkBarController_ updateHiddenState]; | 254 [bookmarkBarController_ updateHiddenState]; |
237 [self updateSubviewZOrder]; | 255 [self updateSubviewZOrder]; |
(...skipping 849 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1087 } | 1105 } |
1088 if (!enteringAppKitFullscreen_) | 1106 if (!enteringAppKitFullscreen_) |
1089 return NO; | 1107 return NO; |
1090 if (enteringAppKitFullscreenOnPrimaryScreen_) | 1108 if (enteringAppKitFullscreenOnPrimaryScreen_) |
1091 return NO; | 1109 return NO; |
1092 | 1110 |
1093 return YES; | 1111 return YES; |
1094 } | 1112 } |
1095 | 1113 |
1096 @end // @implementation BrowserWindowController(Private) | 1114 @end // @implementation BrowserWindowController(Private) |
OLD | NEW |