Index: chrome/browser/ui/cocoa/browser_window_layout.mm |
diff --git a/chrome/browser/ui/cocoa/browser_window_layout.mm b/chrome/browser/ui/cocoa/browser_window_layout.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..fabd7799ed7f33d8c1ad816fac730c47b596caa3 |
--- /dev/null |
+++ b/chrome/browser/ui/cocoa/browser_window_layout.mm |
@@ -0,0 +1,276 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#import "chrome/browser/ui/cocoa/browser_window_layout.h" |
+ |
+#include "base/logging.h" |
+ |
+namespace mac_browser { |
+ |
+const CGFloat kTabStripHeight = 37; |
+ |
+} // namespace mac_browser |
+ |
+namespace { |
+ |
+// Insets for the location bar, used when the full toolbar is hidden. |
+// TODO(viettrungluu): We can argue about the "correct" insetting; I like the |
+// following best, though arguably 0 inset is better/more correct. |
+const CGFloat kLocBarLeftRightInset = 1; |
+const CGFloat kLocBarTopInset = 0; |
+const CGFloat kLocBarBottomInset = 1; |
+ |
+} // namespace |
+ |
+@interface BrowserWindowLayout () |
+ |
+// Computes the y offset to use when laying out the tab strip in fullscreen |
+// mode. |
+- (void)computeFullscreenYOffset; |
+ |
+// Computes the layout of the tab strip. |
+- (void)computeTabStripLayout; |
+ |
+// Computes the layout of the subviews of the content view. |
+- (void)computeContentViewLayout; |
+ |
+// Computes the height of the backing bar for the views in the omnibox area in |
+// fullscreen mode. |
+- (CGFloat)fullscreenBackingBarHeight; |
+ |
+@end |
+ |
+@implementation BrowserWindowLayout |
+ |
+- (void)setContentViewSize:(NSSize)size { |
+ parameters_.contentViewSize = size; |
+} |
+ |
+- (void)setWindowSize:(NSSize)size { |
+ parameters_.windowSize = size; |
+} |
+ |
+- (void)setInAnyFullscreen:(BOOL)inAnyFullscreen { |
+ parameters_.inAnyFullscreen = inAnyFullscreen; |
+} |
+ |
+- (void)setFullscreenSlidingStyle:(fullscreen_mac::SlidingStyle)slidingStyle { |
+ parameters_.slidingStyle = slidingStyle; |
+} |
+ |
+- (void)setFullscreenMenubarOffset:(CGFloat)menubarOffset { |
+ parameters_.menubarOffset = menubarOffset; |
+} |
+ |
+- (void)setFullscreenToolbarFraction:(CGFloat)toolbarFraction { |
+ parameters_.toolbarFraction = toolbarFraction; |
+} |
+ |
+- (void)setHasTabStrip:(BOOL)hasTabStrip { |
+ parameters_.hasTabStrip = hasTabStrip; |
+} |
+ |
+- (void)setHasToolbar:(BOOL)hasToolbar { |
+ parameters_.hasToolbar = hasToolbar; |
+} |
+ |
+- (void)setHasLocationBar:(BOOL)hasLocationBar { |
+ parameters_.hasLocationBar = hasLocationBar; |
+} |
+ |
+- (void)setToolbarHeight:(CGFloat)toolbarHeight { |
+ parameters_.toolbarHeight = toolbarHeight; |
+} |
+ |
+- (void)setBookmarkBarHidden:(BOOL)bookmarkBarHidden { |
+ parameters_.bookmarkBarHidden = bookmarkBarHidden; |
+} |
+ |
+- (void)setPlaceBookmarkBarBelowInfoBar:(BOOL)placeBookmarkBarBelowInfoBar { |
+ parameters_.placeBookmarkBarBelowInfoBar = placeBookmarkBarBelowInfoBar; |
+} |
+ |
+- (void)setBookmarkBarHeight:(CGFloat)bookmarkBarHeight { |
+ parameters_.bookmarkBarHeight = bookmarkBarHeight; |
+} |
+ |
+- (void)setInfoBarHeight:(CGFloat)infoBarHeight { |
+ parameters_.infoBarHeight = infoBarHeight; |
+} |
+ |
+- (void)setPageInfoBubblePointY:(CGFloat)pageInfoBubblePointY { |
+ parameters_.pageInfoBubblePointY = pageInfoBubblePointY; |
+} |
+ |
+- (void)setHasDownloadShelf:(BOOL)hasDownloadShelf { |
+ parameters_.hasDownloadShelf = hasDownloadShelf; |
+} |
+ |
+- (void)setDownloadShelfHeight:(CGFloat)downloadShelfHeight { |
+ parameters_.downloadShelfHeight = downloadShelfHeight; |
+} |
+ |
+- (mac_browser::LayoutOutput)computeLayout { |
+ memset(&output_, 0, sizeof(mac_browser::LayoutOutput)); |
+ |
+ [self computeFullscreenYOffset]; |
+ [self computeTabStripLayout]; |
+ [self computeContentViewLayout]; |
+ |
+ return output_; |
+} |
+ |
+- (void)computeFullscreenYOffset { |
+ CGFloat yOffset = 0; |
+ if (parameters_.inAnyFullscreen) { |
+ yOffset += parameters_.menubarOffset; |
+ switch (parameters_.slidingStyle) { |
+ case fullscreen_mac::OMNIBOX_TABS_PRESENT: |
+ break; |
+ case fullscreen_mac::OMNIBOX_TABS_HIDDEN: |
+ // In presentation mode, |yOffset| accounts for the sliding position of |
+ // the floating bar and the extra offset needed to dodge the menu bar. |
+ yOffset += std::floor((1 - parameters_.toolbarFraction) * |
+ [self fullscreenBackingBarHeight]); |
+ break; |
+ } |
+ } |
+ fullscreenYOffset_ = yOffset; |
+} |
+ |
+- (void)computeTabStripLayout { |
+ if (parameters_.hasTabStrip) { |
+ maxY_ = parameters_.windowSize.height + fullscreenYOffset_; |
+ CGFloat width = parameters_.contentViewSize.width; |
+ output_.tabStripFrame = NSMakeRect(0, |
+ maxY_ - mac_browser::kTabStripHeight, |
+ width, |
+ mac_browser::kTabStripHeight); |
+ maxY_ = NSMinY(output_.tabStripFrame); |
+ } else { |
+ maxY_ = parameters_.contentViewSize.height + fullscreenYOffset_; |
+ } |
+} |
+ |
+- (void)computeContentViewLayout { |
+ mac_browser::LayoutParameters parameters = parameters_; |
+ CGFloat maxY = maxY_; |
+ |
+ // Sanity-check |maxY|. |
+ DCHECK_GE(maxY, 0); |
+ DCHECK_LE(maxY, parameters_.contentViewSize.height + fullscreenYOffset_); |
+ |
+ CGFloat width = parameters_.contentViewSize.width; |
+ |
+ // Lay out the toolbar. |
+ if (parameters.hasToolbar) { |
+ output_.toolbarFrame = NSMakeRect( |
+ 0, maxY - parameters_.toolbarHeight, width, parameters_.toolbarHeight); |
+ maxY = NSMinY(output_.toolbarFrame); |
+ } else if (parameters_.hasLocationBar) { |
+ CGFloat toolbarX = kLocBarLeftRightInset; |
+ CGFloat toolbarY = maxY - parameters_.toolbarHeight - kLocBarTopInset; |
+ CGFloat toolbarWidth = width - 2 * kLocBarLeftRightInset; |
+ output_.toolbarFrame = |
+ NSMakeRect(toolbarX, toolbarY, toolbarWidth, parameters_.toolbarHeight); |
+ maxY = NSMinY(output_.toolbarFrame) - kLocBarBottomInset; |
+ } |
+ |
+ // Lay out the bookmark bar, if it's above the info bar. |
+ if (!parameters.bookmarkBarHidden && |
+ !parameters.placeBookmarkBarBelowInfoBar) { |
+ output_.bookmarkFrame = NSMakeRect(0, |
+ maxY - parameters.bookmarkBarHeight, |
+ width, |
+ parameters.bookmarkBarHeight); |
+ maxY = NSMinY(output_.bookmarkFrame); |
+ } |
+ |
+ // Lay out the backing bar in fullscreen mode. |
+ if (parameters_.inAnyFullscreen) { |
+ output_.fullscreenBackingBarFrame = |
+ NSMakeRect(0, maxY, width, [self fullscreenBackingBarHeight]); |
+ } |
+ |
+ // Place the find bar immediately below the toolbar/attached bookmark bar. |
+ output_.findBarMaxY = maxY; |
+ output_.fullscreenExitButtonMaxY = maxY; |
+ |
+ if (parameters_.inAnyFullscreen) { |
+ switch (parameters_.slidingStyle) { |
+ case fullscreen_mac::OMNIBOX_TABS_PRESENT: |
+ // Do nothing in Canonical Fullscreen. All content slides. |
+ break; |
+ case fullscreen_mac::OMNIBOX_TABS_HIDDEN: |
+ // If in presentation mode, reset |maxY| to top of screen, so that the |
+ // floating bar slides over the things which appear to be in the content |
+ // area. |
+ maxY = parameters_.contentViewSize.height; |
+ break; |
+ } |
+ } |
+ |
+ // Lay out the info bar. It is never hidden. The frame needs to be high |
+ // enough to accomodate the top arrow, which might stretch all the way to the |
+ // page info bubble icon. |
+ if (parameters_.infoBarHeight != 0) { |
+ CGFloat infoBarMaxY = |
+ NSMinY(output_.toolbarFrame) + parameters.pageInfoBubblePointY; |
+ CGFloat infoBarMinY = maxY - parameters_.infoBarHeight; |
+ output_.infoBarFrame = |
+ NSMakeRect(0, infoBarMinY, width, infoBarMaxY - infoBarMinY); |
+ output_.infoBarMaxTopArrowHeight = |
+ NSHeight(output_.infoBarFrame) - parameters_.infoBarHeight; |
+ maxY = NSMinY(output_.infoBarFrame); |
+ } else { |
+ // The info bar has 0 height, but tests still expect it in the right |
+ // location. |
+ output_.infoBarFrame = NSMakeRect(0, maxY, width, 0); |
+ } |
+ |
+ // Lay out the bookmark bar when it is below the info bar. |
+ if (!parameters.bookmarkBarHidden && |
+ parameters.placeBookmarkBarBelowInfoBar) { |
+ output_.bookmarkFrame = NSMakeRect(0, |
+ maxY - parameters.bookmarkBarHeight, |
+ width, |
+ parameters.bookmarkBarHeight); |
+ maxY = NSMinY(output_.bookmarkFrame); |
+ } |
+ |
+ // Layout the download shelf at the bottom of the content view. |
+ CGFloat minY = 0; |
+ if (parameters.hasDownloadShelf) { |
+ output_.downloadShelfFrame = |
+ NSMakeRect(0, 0, width, parameters.downloadShelfHeight); |
+ minY = NSMaxY(output_.downloadShelfFrame); |
+ } |
+ |
+ // All the remaining space becomes the frame of the content area. |
+ output_.contentAreaFrame = NSMakeRect(0, minY, width, maxY - minY); |
+} |
+ |
+- (CGFloat)fullscreenBackingBarHeight { |
+ if (!parameters_.inAnyFullscreen) |
+ return 0; |
+ |
+ CGFloat totalHeight = 0; |
+ if (parameters_.hasTabStrip) |
+ totalHeight += mac_browser::kTabStripHeight; |
+ |
+ if (parameters_.hasToolbar) { |
+ totalHeight += parameters_.toolbarHeight; |
+ } else if (parameters_.hasLocationBar) { |
+ totalHeight += |
+ parameters_.toolbarHeight + kLocBarTopInset + kLocBarBottomInset; |
+ } |
+ |
+ if (!parameters_.bookmarkBarHidden && |
+ !parameters_.placeBookmarkBarBelowInfoBar) |
+ totalHeight += parameters_.bookmarkBarHeight; |
+ |
+ return totalHeight; |
+} |
+ |
+@end |