1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_UI_COCOA_BROWSER_WINDOW_CONTROLLER_LAYOUT_H_
6#define CHROME_BROWSER_UI_COCOA_BROWSER_WINDOW_CONTROLLER_LAYOUT_H_
7
8#import <Cocoa/Cocoa.h>
9
10#import "chrome/browser/ui/cocoa/presentation_mode_controller.h"
11
12namespace chrome {
13
14// The height of the tab strip.
15extern const CGFloat kTabStripHeight;
16
17// The parameters used to calculate the layout of the views managed by the
18// BrowserWindowController.
19struct LayoutParameters {
20  // The size of the content view of the window.
21  NSSize contentViewSize;
22  // The size of the window.
23  NSSize windowSize;
24
25  // Whether the controller is in any fullscreen mode. This parameter should be
26  // NO if the controller is in the process of entering fullscreen.
27  BOOL inAnyFullscreen;
28  // The fullscreen sliding style. See presentation_mode_controller.h for more
29  // details.
30  fullscreen_mac::SlidingStyle slidingStyle;
31  // The minY of the AppKit Menu Bar, relative to the top of the screen. Ranges
32  // from 0 to -22. Only relevant in fullscreen mode.
33  CGFloat menubarOffset;
34  // The fraction of the sliding toolbar that is visible in fullscreenm mode.
35  // Ranges from 0 to 1. Only relevant in fullscreen mode.
36  CGFloat toolbarFraction;
37
38  BOOL hasTabStrip;
39
40  BOOL hasToolbar;
41  BOOL hasLocationBar;
42  CGFloat toolbarHeight;
43
44  BOOL bookmarkBarHidden;
45  // If the bookmark bar is not hidden, then the bookmark bar should either be
46  // directly below the omnibox, or directly below the info bar. This parameter
47  // selects between those 2 cases.
48  BOOL placeBookmarkBarBelowInfoBar;
49  CGFloat bookmarkBarHeight;
50
51  // The height of the info bar, not including the top arrow.
52  CGFloat infoBarHeight;
53  // The distance from the bottom of the location icon to the bottom of the
54  // toolbar.
55  CGFloat pageInfoBubblePointY;
56
57  BOOL hasDownloadShelf;
58  CGFloat downloadShelfHeight;
59};
60
61// The output frames of the views managed by the BrowserWindowController.
62struct LayoutOutput {
63  NSRect tabStripFrame;
64  NSRect toolbarFrame;
65  NSRect bookmarkFrame;
66  NSRect fullscreenBackingBarFrame;
67  CGFloat findBarMaxY;
68  CGFloat fullscreenExitButtonMaxY;
69  NSRect infoBarFrame;
70  CGFloat infoBarMaxTopArrowHeight;
71  NSRect downloadShelfFrame;
72  NSRect contentAreaFrame;
73};
74
75}  // namespace chrome
76
77// This class is the sole entity responsible for calculating the layout of the
78// views managed by the BrowserWindowController. The parameters used to
79// calculate the layout are the fields of |parameters_|. These fields should be
80// filled by calling the appropriate setters on this class. Once the parameters
81// have been set, calling -computeLayout will return a LayoutOutput that
82// includes sufficient information to lay out all views managed by
83// BrowserWindowController.
84//
85// This is a lightweight class. It should be created on demand.
86@interface BrowserWindowLayout : NSObject {
87 @private
88  // Stores the parameters used to compute layout.
89  chrome::LayoutParameters parameters_;
90
91  // Stores the layout output as it's being computed.
92  chrome::LayoutOutput output_;
93
94  // The offset of the maxY of the tab strip during fullscreen mode.
95  CGFloat fullscreenYOffset_;
96
97  // The views are laid out from highest Y to lowest Y. This variable holds the
98  // current highest Y that the next view is expected to be laid under.
99  CGFloat maxY_;
100}
101
102// Performs the layout computation and returns the results. This method is fast
103// and does not perform any caching.
104- (chrome::LayoutOutput)computeLayout;
105
106- (void)setContentViewSize:(NSSize)size;
107- (void)setWindowSize:(NSSize)size;
108
109// Whether the controller is in any fullscreen mode. |inAnyFullscreen| should
110// be NO if the controller is in the process of entering fullscreen.
111- (void)setInAnyFullscreen:(BOOL)inAnyFullscreen;
112- (void)setFullscreenSlidingStyle:(fullscreen_mac::SlidingStyle)slidingStyle;
113- (void)setFullscreenMenubarOffset:(CGFloat)menubarOffset;
114- (void)setFullscreenToolbarFraction:(CGFloat)toolbarFraction;
115
116- (void)setHasTabStrip:(BOOL)hasTabStrip;
117
118- (void)setHasToolbar:(BOOL)hasToolbar;
119- (void)setHasLocationBar:(BOOL)hasLocationBar;
120- (void)setToolbarHeight:(CGFloat)toolbarHeight;
121
122- (void)setBookmarkBarHidden:(BOOL)bookmarkBarHidden;
123- (void)setPlaceBookmarkBarBelowInfoBar:(BOOL)placeBookmarkBarBelowInfoBar;
124- (void)setBookmarkBarHeight:(CGFloat)bookmarkBarHeight;
125
126// The height of the info bar, not including the top arrow.
127- (void)setInfoBarHeight:(CGFloat)infoBarHeight;
128// The min Y of the bubble point, relative to the toolbar.
129- (void)setPageInfoBubblePointY:(CGFloat)pageInfoBubblePointY;
130
131- (void)setHasDownloadShelf:(BOOL)hasDownloadShelf;
132- (void)setDownloadShelfHeight:(CGFloat)downloadShelfHeight;
133
134@end
135
136#endif  // CHROME_BROWSER_UI_COCOA_BROWSER_WINDOW_CONTROLLER_LAYOUT_H_
137