| 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 #import "base/memory/scoped_nsobject.h" | 10 #import "base/memory/scoped_nsobject.h" |
| (...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 202 } | 202 } |
| 203 | 203 |
| 204 // Sanity-check |maxY|. | 204 // Sanity-check |maxY|. |
| 205 DCHECK_GE(maxY, minY); | 205 DCHECK_GE(maxY, minY); |
| 206 DCHECK_LE(maxY, NSMaxY(contentBounds) + yOffset); | 206 DCHECK_LE(maxY, NSMaxY(contentBounds) + yOffset); |
| 207 | 207 |
| 208 // Place the toolbar at the top of the reserved area. | 208 // Place the toolbar at the top of the reserved area. |
| 209 CGFloat toolbarTopY = maxY; | 209 CGFloat toolbarTopY = maxY; |
| 210 maxY = [self layoutToolbarAtMinX:minX maxY:maxY width:width]; | 210 maxY = [self layoutToolbarAtMinX:minX maxY:maxY width:width]; |
| 211 | 211 |
| 212 // If we're not displaying the bookmark bar below the infobar, then it goes | 212 // If we're not displaying the bookmark bar below the info bar, then it goes |
| 213 // immediately below the toolbar. | 213 // immediately below the toolbar. |
| 214 BOOL placeBookmarkBarBelowInfoBar = [self placeBookmarkBarBelowInfoBar]; | 214 BOOL placeBookmarkBarBelowInfoBar = [self placeBookmarkBarBelowInfoBar]; |
| 215 if (!placeBookmarkBarBelowInfoBar) | 215 if (!placeBookmarkBarBelowInfoBar) |
| 216 maxY = [self layoutBookmarkBarAtMinX:minX maxY:maxY width:width]; | 216 maxY = [self layoutBookmarkBarAtMinX:minX maxY:maxY width:width]; |
| 217 | 217 |
| 218 // The floating bar backing view doesn't actually add any height. | 218 // The floating bar backing view doesn't actually add any height. |
| 219 NSRect floatingBarBackingRect = | 219 NSRect floatingBarBackingRect = |
| 220 NSMakeRect(minX, maxY, width, floatingBarHeight); | 220 NSMakeRect(minX, maxY, width, floatingBarHeight); |
| 221 [self layoutFloatingBarBackingView:floatingBarBackingRect | 221 [self layoutFloatingBarBackingView:floatingBarBackingRect |
| 222 presentationMode:inPresentationMode]; | 222 presentationMode:inPresentationMode]; |
| 223 | 223 |
| 224 // Place the find bar immediately below the toolbar/attached bookmark bar. In | 224 // Place the find bar immediately below the toolbar/attached bookmark bar. In |
| 225 // presentation mode, it hangs off the top of the screen when the bar is | 225 // presentation mode, it hangs off the top of the screen when the bar is |
| 226 // hidden. The find bar is unaffected by the side tab positioning. | 226 // hidden. The find bar is unaffected by the side tab positioning. |
| 227 [findBarCocoaController_ positionFindBarViewAtMaxY:maxY maxWidth:width]; | 227 [findBarCocoaController_ positionFindBarViewAtMaxY:maxY maxWidth:width]; |
| 228 [fullscreenExitBubbleController_ positionInWindowAtTop:maxY width:width]; | 228 [fullscreenExitBubbleController_ positionInWindowAtTop:maxY width:width]; |
| 229 | 229 |
| 230 // If in presentation mode, reset |maxY| to top of screen, so that the | 230 // If in presentation mode, reset |maxY| to top of screen, so that the |
| 231 // floating bar slides over the things which appear to be in the content area. | 231 // floating bar slides over the things which appear to be in the content area. |
| 232 if (inPresentationMode) | 232 if (inPresentationMode) |
| 233 maxY = NSMaxY(contentBounds); | 233 maxY = NSMaxY(contentBounds); |
| 234 | 234 |
| 235 // Also place the infobar container immediate below the toolbar, except in | 235 // Also place the info bar container immediate below the toolbar, except in |
| 236 // presentation mode in which case it's at the top of the visual content area. | 236 // presentation mode in which case it's at the top of the visual content area. |
| 237 maxY = [self layoutInfoBarAtMinX:minX maxY:maxY width:width]; | 237 maxY = [self layoutInfoBarAtMinX:minX maxY:maxY width:width]; |
| 238 | 238 |
| 239 // Place the download shelf, if any, at the bottom of the view. | 239 // Place the download shelf, if any, at the bottom of the view. |
| 240 minY = [self layoutDownloadShelfAtMinX:minX minY:minY width:width]; | 240 minY = [self layoutDownloadShelfAtMinX:minX minY:minY width:width]; |
| 241 | 241 |
| 242 // Place the bookmark bar. | 242 // Place the bookmark bar. |
| 243 if (placeBookmarkBarBelowInfoBar) | 243 if (placeBookmarkBarBelowInfoBar) |
| 244 maxY = [self layoutBookmarkBarAtMinX:minX maxY:maxY width:width]; | 244 maxY = [self layoutBookmarkBarAtMinX:minX maxY:maxY width:width]; |
| 245 | 245 |
| 246 // In presentation mode the content area takes up all the remaining space | 246 // In presentation mode the content area takes up all the remaining space |
| 247 // (from the bottom of the infobar down). In normal mode the content area | 247 // (from the bottom of the info bar down). In normal mode the content area |
| 248 // takes up the space between the bottom of the toolbar down. | 248 // takes up the space between the bottom of the toolbar down. |
| 249 CGFloat contentAreaTop = 0; | 249 CGFloat contentAreaTop = 0; |
| 250 if (inPresentationMode) { | 250 if (inPresentationMode) { |
| 251 toolbarToWebContentsOffset_ = 0; | 251 // The tabContentaArea starts at the bottom of the info bar (or top of the |
| 252 // screen if there's no info bar). |
| 252 contentAreaTop = maxY; | 253 contentAreaTop = maxY; |
| 254 CGFloat floatingBarHeight = |
| 255 NSHeight(floatingBarBackingRect) * [self floatingBarShownFraction]; |
| 256 // When an instant overlay is shown this is the amount it needs to be pushed |
| 257 // down so that it doesn't get covered by the floating toolbar. |
| 258 toolbarToWebContentsOffset_ = |
| 259 floatingBarHeight - (NSMaxY(contentBounds) - maxY); |
| 253 } else { | 260 } else { |
| 261 // The tabContentArea view starts below the omnibox. |
| 254 CGFloat minToolbarHeight = 0; | 262 CGFloat minToolbarHeight = 0; |
| 255 if ([self hasToolbar]) { | 263 if ([self hasToolbar]) { |
| 256 minToolbarHeight = [toolbarController_ | 264 minToolbarHeight = [toolbarController_ |
| 257 desiredHeightForCompression:bookmarks::kBookmarkBarOverlap]; | 265 desiredHeightForCompression:bookmarks::kBookmarkBarOverlap]; |
| 258 } | 266 } |
| 259 contentAreaTop = toolbarTopY - minToolbarHeight; | 267 contentAreaTop = toolbarTopY - minToolbarHeight; |
| 268 // This is the space between the bottom of the omnibox and the bottom of the |
| 269 // last bar (info bar or bookmark bar or toolbar). This is used to push the |
| 270 // tab web content down when no instant overlay is shown. |
| 260 toolbarToWebContentsOffset_ = contentAreaTop - maxY; | 271 toolbarToWebContentsOffset_ = contentAreaTop - maxY; |
| 261 } | 272 } |
| 262 [self updateContentOffsets]; | 273 [self updateContentOffsets]; |
| 263 | 274 |
| 264 NSRect contentAreaRect = NSMakeRect(minX, minY, width, contentAreaTop - minY); | 275 NSRect contentAreaRect = NSMakeRect(minX, minY, width, contentAreaTop - minY); |
| 265 [self layoutTabContentArea:contentAreaRect]; | 276 [self layoutTabContentArea:contentAreaRect]; |
| 266 | 277 |
| 267 // Normally, we don't need to tell the toolbar whether or not to show the | 278 // Normally, we don't need to tell the toolbar whether or not to show the |
| 268 // divider, but things break down during animation. | 279 // divider, but things break down during animation. |
| 269 [toolbarController_ setDividerOpacity:[self toolbarDividerOpacity]]; | 280 [toolbarController_ setDividerOpacity:[self toolbarDividerOpacity]]; |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 375 DCHECK([toolbarView isHidden]); | 386 DCHECK([toolbarView isHidden]); |
| 376 } | 387 } |
| 377 } | 388 } |
| 378 [toolbarView setFrame:toolbarFrame]; | 389 [toolbarView setFrame:toolbarFrame]; |
| 379 return maxY; | 390 return maxY; |
| 380 } | 391 } |
| 381 | 392 |
| 382 - (BOOL)placeBookmarkBarBelowInfoBar { | 393 - (BOOL)placeBookmarkBarBelowInfoBar { |
| 383 // If we are currently displaying the NTP detached bookmark bar or animating | 394 // If we are currently displaying the NTP detached bookmark bar or animating |
| 384 // to/from it (from/to anything else), we display the bookmark bar below the | 395 // to/from it (from/to anything else), we display the bookmark bar below the |
| 385 // infobar. | 396 // info bar. |
| 386 return [bookmarkBarController_ isInState:BookmarkBar::DETACHED] || | 397 return [bookmarkBarController_ isInState:BookmarkBar::DETACHED] || |
| 387 [bookmarkBarController_ isAnimatingToState:BookmarkBar::DETACHED] || | 398 [bookmarkBarController_ isAnimatingToState:BookmarkBar::DETACHED] || |
| 388 [bookmarkBarController_ isAnimatingFromState:BookmarkBar::DETACHED]; | 399 [bookmarkBarController_ isAnimatingFromState:BookmarkBar::DETACHED]; |
| 389 } | 400 } |
| 390 | 401 |
| 391 - (CGFloat)layoutBookmarkBarAtMinX:(CGFloat)minX | 402 - (CGFloat)layoutBookmarkBarAtMinX:(CGFloat)minX |
| 392 maxY:(CGFloat)maxY | 403 maxY:(CGFloat)maxY |
| 393 width:(CGFloat)width { | 404 width:(CGFloat)width { |
| 394 [bookmarkBarController_ updateHiddenState]; | 405 [bookmarkBarController_ updateHiddenState]; |
| 395 | 406 |
| (...skipping 463 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 859 if ([overlayableContentsController_ isShowingOverlay]) | 870 if ([overlayableContentsController_ isShowingOverlay]) |
| 860 return browser_window_controller::kInstantUIOverlay; | 871 return browser_window_controller::kInstantUIOverlay; |
| 861 | 872 |
| 862 if (browser_->search_model()->top_bars_visible()) | 873 if (browser_->search_model()->top_bars_visible()) |
| 863 return browser_window_controller::kInstantUINone; | 874 return browser_window_controller::kInstantUINone; |
| 864 | 875 |
| 865 return browser_window_controller::kInstantUIFullPageResults; | 876 return browser_window_controller::kInstantUIFullPageResults; |
| 866 } | 877 } |
| 867 | 878 |
| 868 - (void)updateContentOffsets { | 879 - (void)updateContentOffsets { |
| 869 // Normally the tab contents sits below the bookmark bar. This is achieved by | 880 if ([self inPresentationMode]) { |
| 870 // setting the offset to the height of the bookmark bar. The only exception | 881 // In presentation mode the tabContentArea starts at the bottom of the info |
| 871 // is on the search results page where the Instant results are shown inside | 882 // bar (or top of the screen if there's no info bar). |
| 872 // the page and not in the overlay contents as usual. | 883 if ([self currentInstantUIState] != |
| 873 CGFloat tabContentsOffset = toolbarToWebContentsOffset_; | 884 browser_window_controller::kInstantUIFullPageResults) { |
| 874 if ([self currentInstantUIState] == | 885 // Normal mode, keep the tab web contents at the top (below the info bar). |
| 875 browser_window_controller::kInstantUIFullPageResults) { | 886 [overlayableContentsController_ setActiveContainerOffset:0]; |
| 876 tabContentsOffset = 0; | 887 } else { |
| 888 // Instant suggestions are displayed in the main tab contents so push that |
| 889 // down so that the floating toolbar doesn't obscure it. |
| 890 [overlayableContentsController_ |
| 891 setActiveContainerOffset:toolbarToWebContentsOffset_]; |
| 892 } |
| 893 // Floating overlay (if any) should also be below the floating toolbar. |
| 894 [overlayableContentsController_ |
| 895 setOverlayContentsOffset:toolbarToWebContentsOffset_]; |
| 896 |
| 897 [[self tabContentArea] setContentOffset:0]; |
| 898 [devToolsController_ setTopContentOffset:0]; |
| 899 } else { |
| 900 // In normal mode the tabContentArea starts just below the omnibox and the |
| 901 // bookmark bar and info bar overlap it. |
| 902 if ([self currentInstantUIState] != |
| 903 browser_window_controller::kInstantUIFullPageResults) { |
| 904 // Normal mode, push the tab web contents down so that it doesn't obscure |
| 905 // the bookmark bar and info bar. |
| 906 [overlayableContentsController_ |
| 907 setActiveContainerOffset:toolbarToWebContentsOffset_]; |
| 908 } else { |
| 909 // Instant suggestions are displayed in the main tab contents so don't |
| 910 // push it down (keep it next to the omnibox). |
| 911 [overlayableContentsController_ setActiveContainerOffset:0]; |
| 912 } |
| 913 // Floating overlay (if any) should also be at the top (next to the |
| 914 // omnibox). |
| 915 [overlayableContentsController_ setOverlayContentsOffset:0]; |
| 916 |
| 917 // Prevent the fast resize view from drawing white over the bookmark bar. |
| 918 [[self tabContentArea] setContentOffset:toolbarToWebContentsOffset_]; |
| 919 // Prevent the dev tools splitter from overlapping the bookmark bar. |
| 920 if ([self currentInstantUIState] != |
| 921 browser_window_controller::kInstantUINone) { |
| 922 [devToolsController_ setTopContentOffset:0]; |
| 923 } else { |
| 924 [devToolsController_ setTopContentOffset:toolbarToWebContentsOffset_]; |
| 925 } |
| 877 } | 926 } |
| 878 [overlayableContentsController_ setActiveContainerOffset:tabContentsOffset]; | |
| 879 | |
| 880 // Prevent the fast resize view from drawing white over the bookmark bar. | |
| 881 [[self tabContentArea] setContentOffset:toolbarToWebContentsOffset_]; | |
| 882 | |
| 883 // Prevent the dev tools splitter from overlapping the bookmark bar. | |
| 884 if ([self currentInstantUIState] != browser_window_controller::kInstantUINone) | |
| 885 [devToolsController_ setTopContentOffset:0]; | |
| 886 else | |
| 887 [devToolsController_ setTopContentOffset:toolbarToWebContentsOffset_]; | |
| 888 } | 927 } |
| 889 | 928 |
| 890 - (void)updateSubviewZOrder:(BOOL)inPresentationMode { | 929 - (void)updateSubviewZOrder:(BOOL)inPresentationMode { |
| 891 NSView* contentView = [[self window] contentView]; | 930 NSView* contentView = [[self window] contentView]; |
| 892 NSView* toolbarView = [toolbarController_ view]; | 931 NSView* toolbarView = [toolbarController_ view]; |
| 893 | 932 |
| 894 if (inPresentationMode) { | 933 if (inPresentationMode) { |
| 895 // Toolbar is above tab contents so that it can slide down from top of | 934 // Toolbar is above tab contents so that it can slide down from top of |
| 896 // screen. | 935 // screen. |
| 897 [contentView cr_ensureSubview:toolbarView | 936 [contentView cr_ensureSubview:toolbarView |
| 898 isPositioned:NSWindowAbove | 937 isPositioned:NSWindowAbove |
| 899 relativeTo:[self tabContentArea]]; | 938 relativeTo:[self tabContentArea]]; |
| 900 } else { | 939 } else { |
| 901 // Toolbar is below tab contents so that the infobar arrow can appear above | 940 // Toolbar is below tab contents so that the infob ar arrow can appear above |
| 902 // it. Unlike other views the toolbar never overlaps the actual web | 941 // it. Unlike other views the toolbar never overlaps the actual web |
| 903 // content. | 942 // content. |
| 904 [contentView cr_ensureSubview:toolbarView | 943 [contentView cr_ensureSubview:toolbarView |
| 905 isPositioned:NSWindowBelow | 944 isPositioned:NSWindowBelow |
| 906 relativeTo:[self tabContentArea]]; | 945 relativeTo:[self tabContentArea]]; |
| 907 } | 946 } |
| 908 | 947 |
| 909 // The bookmark bar is always below the toolbar. In normal mode this means | 948 // The bookmark bar is always below the toolbar. In normal mode this means |
| 910 // that it is below tab contents. This allows Instant results to be above | 949 // that it is below tab contents. This allows Instant results to be above |
| 911 // the bookmark bar. | 950 // the bookmark bar. |
| 912 [contentView cr_ensureSubview:[bookmarkBarController_ view] | 951 [contentView cr_ensureSubview:[bookmarkBarController_ view] |
| 913 isPositioned:NSWindowBelow | 952 isPositioned:NSWindowBelow |
| 914 relativeTo:toolbarView]; | 953 relativeTo:toolbarView]; |
| 915 | 954 |
| 916 if (inPresentationMode) { | 955 if (inPresentationMode) { |
| 917 // In presentation mode the infobar is below all other views. | 956 // In presentation mode the info bar is below all other views. |
| 918 [contentView cr_ensureSubview:[infoBarContainerController_ view] | 957 [contentView cr_ensureSubview:[infoBarContainerController_ view] |
| 919 isPositioned:NSWindowBelow | 958 isPositioned:NSWindowBelow |
| 920 relativeTo:[self tabContentArea]]; | 959 relativeTo:[self tabContentArea]]; |
| 921 } else { | 960 } else { |
| 922 // Above the toolbar but still below tab contents. Similar to the bookmark | 961 // Above the toolbar but still below tab contents. Similar to the bookmark |
| 923 // bar, this allows Instant results to be above the info bar. | 962 // bar, this allows Instant results to be above the info bar. |
| 924 [contentView cr_ensureSubview:[infoBarContainerController_ view] | 963 [contentView cr_ensureSubview:[infoBarContainerController_ view] |
| 925 isPositioned:NSWindowAbove | 964 isPositioned:NSWindowAbove |
| 926 relativeTo:toolbarView]; | 965 relativeTo:toolbarView]; |
| 927 } | 966 } |
| (...skipping 23 matching lines...) Expand all Loading... |
| 951 relativeTo:[bookmarkBarController_ view]]; | 990 relativeTo:[bookmarkBarController_ view]]; |
| 952 } else { | 991 } else { |
| 953 [contentView cr_ensureSubview:floatingBarBackingView_ | 992 [contentView cr_ensureSubview:floatingBarBackingView_ |
| 954 isPositioned:NSWindowBelow | 993 isPositioned:NSWindowBelow |
| 955 relativeTo:[bookmarkBarController_ view]]; | 994 relativeTo:[bookmarkBarController_ view]]; |
| 956 } | 995 } |
| 957 } | 996 } |
| 958 } | 997 } |
| 959 | 998 |
| 960 @end // @implementation BrowserWindowController(Private) | 999 @end // @implementation BrowserWindowController(Private) |
| OLD | NEW |