OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/cocoa/browser_window_controller_private.h" | 5 #import "chrome/browser/cocoa/browser_window_controller_private.h" |
6 | 6 |
7 #include "base/mac_util.h" | 7 #include "base/mac_util.h" |
8 #import "base/scoped_nsobject.h" | 8 #import "base/scoped_nsobject.h" |
9 #include "chrome/browser/browser.h" | 9 #include "chrome/browser/browser.h" |
10 #include "chrome/browser/browser_list.h" | 10 #include "chrome/browser/browser_list.h" |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
133 NSRect contentBounds = [contentView bounds]; | 133 NSRect contentBounds = [contentView bounds]; |
134 CGFloat minY = NSMinY(contentBounds); | 134 CGFloat minY = NSMinY(contentBounds); |
135 CGFloat width = NSWidth(contentBounds); | 135 CGFloat width = NSWidth(contentBounds); |
136 | 136 |
137 // Suppress title drawing if necessary. | 137 // Suppress title drawing if necessary. |
138 if ([window respondsToSelector:@selector(setShouldHideTitle:)]) | 138 if ([window respondsToSelector:@selector(setShouldHideTitle:)]) |
139 [(id)window setShouldHideTitle:![self hasTitleBar]]; | 139 [(id)window setShouldHideTitle:![self hasTitleBar]]; |
140 | 140 |
141 BOOL isFullscreen = [self isFullscreen]; | 141 BOOL isFullscreen = [self isFullscreen]; |
142 CGFloat floatingBarHeight = [self floatingBarHeight]; | 142 CGFloat floatingBarHeight = [self floatingBarHeight]; |
143 CGFloat yOffset = floor( | 143 // In fullscreen mode, |yOffset| accounts for the sliding position of the |
144 isFullscreen ? (1 - floatingBarShownFraction_) * floatingBarHeight : 0); | 144 // floating bar and the extra offset needed to dodge the menu bar. |
| 145 CGFloat yOffset = isFullscreen ? |
| 146 (floor((1 - floatingBarShownFraction_) * floatingBarHeight) - |
| 147 [fullscreenController_ floatingBarVerticalOffset]) : 0; |
145 CGFloat maxY = NSMaxY(contentBounds) + yOffset; | 148 CGFloat maxY = NSMaxY(contentBounds) + yOffset; |
146 CGFloat startMaxY = maxY; | 149 CGFloat startMaxY = maxY; |
147 | 150 |
148 if ([self hasTabStrip]) { | 151 if ([self hasTabStrip]) { |
149 // If we need to lay out the tab strip, replace |maxY| and |startMaxY| with | 152 // If we need to lay out the tab strip, replace |maxY| and |startMaxY| with |
150 // higher values, and then lay out the tab strip. | 153 // higher values, and then lay out the tab strip. |
151 startMaxY = maxY = NSHeight([window frame]) + yOffset; | 154 startMaxY = maxY = NSHeight([window frame]) + yOffset; |
152 maxY = [self layoutTabStripAtMaxY:maxY width:width fullscreen:isFullscreen]; | 155 maxY = [self layoutTabStripAtMaxY:maxY width:width fullscreen:isFullscreen]; |
153 } | 156 } |
154 | 157 |
155 // Sanity-check |maxY|. | 158 // Sanity-check |maxY|. |
156 DCHECK_GE(maxY, minY); | 159 DCHECK_GE(maxY, minY); |
157 DCHECK_LE(maxY, NSMaxY(contentBounds) + yOffset); | 160 DCHECK_LE(maxY, NSMaxY(contentBounds) + yOffset); |
158 | 161 |
159 // Place the toolbar at the top of the reserved area. | 162 // Place the toolbar at the top of the reserved area. |
160 maxY = [self layoutToolbarAtMaxY:maxY width:width]; | 163 maxY = [self layoutToolbarAtMaxY:maxY width:width]; |
161 | 164 |
162 // If we're not displaying the bookmark bar below the infobar, then it goes | 165 // If we're not displaying the bookmark bar below the infobar, then it goes |
163 // immediately below the toolbar. | 166 // immediately below the toolbar. |
164 BOOL placeBookmarkBarBelowInfoBar = [self placeBookmarkBarBelowInfoBar]; | 167 BOOL placeBookmarkBarBelowInfoBar = [self placeBookmarkBarBelowInfoBar]; |
165 if (!placeBookmarkBarBelowInfoBar) | 168 if (!placeBookmarkBarBelowInfoBar) |
166 maxY = [self layoutBookmarkBarAtMaxY:maxY width:width]; | 169 maxY = [self layoutBookmarkBarAtMaxY:maxY width:width]; |
167 | 170 |
168 // The floating bar backing view doesn't actually add any height. | 171 // The floating bar backing view doesn't actually add any height. |
169 [self layoutFloatingBarBackingViewAtY:maxY | 172 [self layoutFloatingBarBackingViewAtY:maxY |
170 width:width | 173 width:width |
171 height:floatingBarHeight | 174 height:floatingBarHeight |
172 fullscreen:isFullscreen]; | 175 fullscreen:isFullscreen]; |
173 | 176 |
174 [fullscreenController_ overlayFrameChanged:[floatingBarBackingView_ frame]]; | |
175 | |
176 // Place the find bar immediately below the toolbar/attached bookmark bar. In | 177 // Place the find bar immediately below the toolbar/attached bookmark bar. In |
177 // fullscreen mode, it hangs off the top of the screen when the bar is hidden. | 178 // fullscreen mode, it hangs off the top of the screen when the bar is hidden. |
178 [findBarCocoaController_ positionFindBarViewAtMaxY:maxY maxWidth:width]; | 179 [findBarCocoaController_ positionFindBarViewAtMaxY:maxY maxWidth:width]; |
179 | 180 |
180 // If in fullscreen mode, reset |maxY| to top of screen, so that the floating | 181 // If in fullscreen mode, reset |maxY| to top of screen, so that the floating |
181 // bar slides over the things which appear to be in the content area. | 182 // bar slides over the things which appear to be in the content area. |
182 if (isFullscreen) | 183 if (isFullscreen) |
183 maxY = NSMaxY(contentBounds); | 184 maxY = NSMaxY(contentBounds); |
184 | 185 |
185 // Also place the infobar container immediate below the toolbar, except in | 186 // Also place the infobar container immediate below the toolbar, except in |
(...skipping 16 matching lines...) Expand all Loading... |
202 // Normally, we don't need to tell the toolbar whether or not to show the | 203 // Normally, we don't need to tell the toolbar whether or not to show the |
203 // divider, but things break down during animation. | 204 // divider, but things break down during animation. |
204 [toolbarController_ | 205 [toolbarController_ |
205 setDividerOpacity:[bookmarkBarController_ toolbarDividerOpacity]]; | 206 setDividerOpacity:[bookmarkBarController_ toolbarDividerOpacity]]; |
206 } | 207 } |
207 | 208 |
208 - (CGFloat)floatingBarHeight { | 209 - (CGFloat)floatingBarHeight { |
209 if (![self isFullscreen]) | 210 if (![self isFullscreen]) |
210 return 0; | 211 return 0; |
211 | 212 |
212 CGFloat totalHeight = [fullscreenController_ tabStripVerticalOffset]; | 213 CGFloat totalHeight = [fullscreenController_ floatingBarVerticalOffset]; |
213 | 214 |
214 if ([self hasTabStrip]) | 215 if ([self hasTabStrip]) |
215 totalHeight += NSHeight([[self tabStripView] frame]); | 216 totalHeight += NSHeight([[self tabStripView] frame]); |
216 | 217 |
217 if ([self hasToolbar]) { | 218 if ([self hasToolbar]) { |
218 totalHeight += NSHeight([[toolbarController_ view] frame]); | 219 totalHeight += NSHeight([[toolbarController_ view] frame]); |
219 } else if ([self hasLocationBar]) { | 220 } else if ([self hasLocationBar]) { |
220 totalHeight += NSHeight([[toolbarController_ view] frame]) + | 221 totalHeight += NSHeight([[toolbarController_ view] frame]) + |
221 kLocBarTopInset + kLocBarBottomInset; | 222 kLocBarTopInset + kLocBarBottomInset; |
222 } | 223 } |
223 | 224 |
224 if (![self placeBookmarkBarBelowInfoBar]) | 225 if (![self placeBookmarkBarBelowInfoBar]) |
225 totalHeight += NSHeight([[bookmarkBarController_ view] frame]); | 226 totalHeight += NSHeight([[bookmarkBarController_ view] frame]); |
226 | 227 |
227 return totalHeight; | 228 return totalHeight; |
228 } | 229 } |
229 | 230 |
230 - (CGFloat)layoutTabStripAtMaxY:(CGFloat)maxY | 231 - (CGFloat)layoutTabStripAtMaxY:(CGFloat)maxY |
231 width:(CGFloat)width | 232 width:(CGFloat)width |
232 fullscreen:(BOOL)fullscreen { | 233 fullscreen:(BOOL)fullscreen { |
233 // Nothing to do if no tab strip. | 234 // Nothing to do if no tab strip. |
234 if (![self hasTabStrip]) | 235 if (![self hasTabStrip]) |
235 return maxY; | 236 return maxY; |
236 | 237 |
237 NSView* tabStripView = [self tabStripView]; | 238 NSView* tabStripView = [self tabStripView]; |
238 CGFloat tabStripHeight = NSHeight([tabStripView frame]); | 239 CGFloat tabStripHeight = NSHeight([tabStripView frame]); |
239 // In fullscreen mode, push the tab strip down so that the main menu (which | |
240 // also slides down) doesn't run it over. | |
241 if (fullscreen) | |
242 maxY -= [fullscreenController_ tabStripVerticalOffset]; | |
243 maxY -= tabStripHeight; | 240 maxY -= tabStripHeight; |
244 [tabStripView setFrame:NSMakeRect(0, maxY, width, tabStripHeight)]; | 241 [tabStripView setFrame:NSMakeRect(0, maxY, width, tabStripHeight)]; |
245 | 242 |
246 // Set indentation. | 243 // Set indentation. |
247 [tabStripController_ setIndentForControls:(fullscreen ? 0 : | 244 [tabStripController_ setIndentForControls:(fullscreen ? 0 : |
248 [[tabStripController_ class] defaultIndentForControls])]; | 245 [[tabStripController_ class] defaultIndentForControls])]; |
249 | 246 |
250 // TODO(viettrungluu): Seems kind of bad -- shouldn't |-layoutSubviews| do | 247 // TODO(viettrungluu): Seems kind of bad -- shouldn't |-layoutSubviews| do |
251 // this? Moreover, |-layoutTabs| will try to animate.... | 248 // this? Moreover, |-layoutTabs| will try to animate.... |
252 [tabStripController_ layoutTabs]; | 249 [tabStripController_ layoutTabs]; |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
320 | 317 |
321 return maxY; | 318 return maxY; |
322 } | 319 } |
323 | 320 |
324 - (void)layoutFloatingBarBackingViewAtY:(CGFloat)y | 321 - (void)layoutFloatingBarBackingViewAtY:(CGFloat)y |
325 width:(CGFloat)width | 322 width:(CGFloat)width |
326 height:(CGFloat)height | 323 height:(CGFloat)height |
327 fullscreen:(BOOL)fullscreen { | 324 fullscreen:(BOOL)fullscreen { |
328 // Only display when in fullscreen mode. | 325 // Only display when in fullscreen mode. |
329 if (fullscreen) { | 326 if (fullscreen) { |
330 DCHECK(floatingBarBackingView_.get()); | 327 // For certain window types such as app windows (e.g., the dev tools |
331 BOOL aboveBookmarkBar = [self placeBookmarkBarBelowInfoBar]; | 328 // window), there's no actual overlay. (Displaying one would result in an |
| 329 // overly sliding in only under the menu, which gives an ugly effect.) |
| 330 NSRect frame = NSMakeRect(0, y, width, height); |
| 331 if (floatingBarBackingView_.get()) { |
| 332 BOOL aboveBookmarkBar = [self placeBookmarkBarBelowInfoBar]; |
332 | 333 |
333 // Insert it into the view hierarchy if necessary. | 334 // Insert it into the view hierarchy if necessary. |
334 if (![floatingBarBackingView_ superview] || | 335 if (![floatingBarBackingView_ superview] || |
335 aboveBookmarkBar != floatingBarAboveBookmarkBar_) { | 336 aboveBookmarkBar != floatingBarAboveBookmarkBar_) { |
336 NSView* contentView = [[self window] contentView]; | 337 NSView* contentView = [[self window] contentView]; |
337 // z-order gets messed up unless we explicitly remove the floatingbar view | 338 // z-order gets messed up unless we explicitly remove the floatingbar |
338 // and re-add it. | 339 // view and re-add it. |
339 [floatingBarBackingView_ removeFromSuperview]; | 340 [floatingBarBackingView_ removeFromSuperview]; |
340 [contentView addSubview:floatingBarBackingView_ | 341 [contentView addSubview:floatingBarBackingView_ |
341 positioned:(aboveBookmarkBar ? | 342 positioned:(aboveBookmarkBar ? |
342 NSWindowAbove : NSWindowBelow) | 343 NSWindowAbove : NSWindowBelow) |
343 relativeTo:[bookmarkBarController_ view]]; | 344 relativeTo:[bookmarkBarController_ view]]; |
344 floatingBarAboveBookmarkBar_ = aboveBookmarkBar; | 345 floatingBarAboveBookmarkBar_ = aboveBookmarkBar; |
| 346 } |
| 347 |
| 348 // Set its frame. |
| 349 [floatingBarBackingView_ setFrame:frame]; |
345 } | 350 } |
346 | 351 |
347 // Set its frame. | 352 // But we want the logic to work as usual (for show/hide/etc. purposes). |
348 [floatingBarBackingView_ setFrame:NSMakeRect(0, y, width, height)]; | 353 [fullscreenController_ overlayFrameChanged:frame]; |
349 } else { | 354 } else { |
350 // Okay to call even if |floatingBarBackingView_| is nil. | 355 // Okay to call even if |floatingBarBackingView_| is nil. |
351 if ([floatingBarBackingView_ superview]) | 356 if ([floatingBarBackingView_ superview]) |
352 [floatingBarBackingView_ removeFromSuperview]; | 357 [floatingBarBackingView_ removeFromSuperview]; |
353 } | 358 } |
354 } | 359 } |
355 | 360 |
356 - (CGFloat)layoutInfoBarAtMaxY:(CGFloat)maxY width:(CGFloat)width { | 361 - (CGFloat)layoutInfoBarAtMaxY:(CGFloat)maxY width:(CGFloat)width { |
357 NSView* infoBarView = [infoBarContainerController_ view]; | 362 NSView* infoBarView = [infoBarContainerController_ view]; |
358 NSRect infoBarFrame = [infoBarView frame]; | 363 NSRect infoBarFrame = [infoBarView frame]; |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
424 [[toolbarController_ view] setFrame:toolbarFrame]; | 429 [[toolbarController_ view] setFrame:toolbarFrame]; |
425 [[bookmarkBarController_ view] setFrame:bookmarkFrame]; | 430 [[bookmarkBarController_ view] setFrame:bookmarkFrame]; |
426 [self layoutSubviews]; | 431 [self layoutSubviews]; |
427 } | 432 } |
428 | 433 |
429 // TODO(rohitrao): This function has shrunk into uselessness, and | 434 // TODO(rohitrao): This function has shrunk into uselessness, and |
430 // |-setFullscreen:| has grown rather large. Find a good way to break up | 435 // |-setFullscreen:| has grown rather large. Find a good way to break up |
431 // |-setFullscreen:| into smaller pieces. http://crbug.com/36449 | 436 // |-setFullscreen:| into smaller pieces. http://crbug.com/36449 |
432 - (void)adjustUIForFullscreen:(BOOL)fullscreen { | 437 - (void)adjustUIForFullscreen:(BOOL)fullscreen { |
433 // Create the floating bar backing view if necessary. | 438 // Create the floating bar backing view if necessary. |
434 if (fullscreen && !floatingBarBackingView_.get()) { | 439 if (fullscreen && !floatingBarBackingView_.get() && |
| 440 ([self hasTabStrip] || [self hasToolbar] || [self hasLocationBar])) { |
435 floatingBarBackingView_.reset( | 441 floatingBarBackingView_.reset( |
436 [[FloatingBarBackingView alloc] initWithFrame:NSZeroRect]); | 442 [[FloatingBarBackingView alloc] initWithFrame:NSZeroRect]); |
437 } | 443 } |
438 } | 444 } |
439 | 445 |
440 - (void)enableBarVisibilityUpdates { | 446 - (void)enableBarVisibilityUpdates { |
441 // Early escape if there's nothing to do. | 447 // Early escape if there's nothing to do. |
442 if (barVisibilityUpdatesEnabled_) | 448 if (barVisibilityUpdatesEnabled_) |
443 return; | 449 return; |
444 | 450 |
445 barVisibilityUpdatesEnabled_ = YES; | 451 barVisibilityUpdatesEnabled_ = YES; |
446 | 452 |
447 if ([barVisibilityLocks_ count]) | 453 if ([barVisibilityLocks_ count]) |
448 [fullscreenController_ ensureOverlayShownWithAnimation:NO delay:NO]; | 454 [fullscreenController_ ensureOverlayShownWithAnimation:NO delay:NO]; |
449 else | 455 else |
450 [fullscreenController_ ensureOverlayHiddenWithAnimation:NO delay:NO]; | 456 [fullscreenController_ ensureOverlayHiddenWithAnimation:NO delay:NO]; |
451 } | 457 } |
452 | 458 |
453 - (void)disableBarVisibilityUpdates { | 459 - (void)disableBarVisibilityUpdates { |
454 // Early escape if there's nothing to do. | 460 // Early escape if there's nothing to do. |
455 if (!barVisibilityUpdatesEnabled_) | 461 if (!barVisibilityUpdatesEnabled_) |
456 return; | 462 return; |
457 | 463 |
458 barVisibilityUpdatesEnabled_ = NO; | 464 barVisibilityUpdatesEnabled_ = NO; |
459 [fullscreenController_ cancelAnimationAndTimers]; | 465 [fullscreenController_ cancelAnimationAndTimers]; |
460 } | 466 } |
461 | 467 |
462 @end // @implementation BrowserWindowController(Private) | 468 @end // @implementation BrowserWindowController(Private) |
OLD | NEW |