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
3 // found in the LICENSE file.
5 #ifndef CHROME_BROWSER_UI_VIEWS_FRAME_BROWSER_VIEW_LAYOUT_H_
6 #define CHROME_BROWSER_UI_VIEWS_FRAME_BROWSER_VIEW_LAYOUT_H_
8 #include "base/basictypes.h"
9 #include "base/compiler_specific.h"
10 #include "base/gtest_prod_util.h"
11 #include "base/memory/scoped_ptr.h"
12 #include "ui/gfx/rect.h"
13 #include "ui/views/layout/layout_manager.h"
15 class BookmarkBarView
;
17 class BrowserViewLayoutDelegate
;
18 class ContentsLayoutManager
;
19 class ImmersiveModeController
;
20 class InfoBarContainerView
;
21 class TabContentsContainer
;
31 class SingleSplitView
;
35 class WebContentsModalDialogHost
;
38 // The layout manager used in chrome browser.
39 class BrowserViewLayout
: public views::LayoutManager
{
41 // The vertical overlap between the TabStrip and the Toolbar.
42 static const int kToolbarTabStripVerticalOverlap
;
45 virtual ~BrowserViewLayout();
47 // Sets all the views to be managed. Takes ownership of |delegate|.
48 // |browser_view| may be NULL in tests.
49 void Init(BrowserViewLayoutDelegate
* delegate
,
51 views::ClientView
* browser_view
,
52 views::View
* top_container
,
55 InfoBarContainerView
* infobar_container
,
56 views::View
* contents_container
,
57 ContentsLayoutManager
* contents_layout_manager
,
58 ImmersiveModeController
* immersive_mode_controller
);
60 // Sets or updates views that are not available when |this| is initialized.
61 void set_tab_strip(TabStrip
* tab_strip
) {
62 tab_strip_
= tab_strip
;
64 void set_bookmark_bar(BookmarkBarView
* bookmark_bar
) {
65 bookmark_bar_
= bookmark_bar
;
67 void set_download_shelf(views::View
* download_shelf
) {
68 download_shelf_
= download_shelf
;
71 web_modal::WebContentsModalDialogHost
* GetWebContentsModalDialogHost();
73 // Returns the minimum size of the browser view.
74 gfx::Size
GetMinimumSize();
76 // Returns the bounding box, in widget coordinates, for the find bar.
77 gfx::Rect
GetFindBarBoundingBox() const;
79 // Tests to see if the specified |point| (in nonclient view's coordinates)
80 // is within the views managed by the laymanager. Returns one of
81 // HitTestCompat enum defined in ui/base/hit_test.h.
82 // See also ClientView::NonClientHitTest.
83 int NonClientHitTest(const gfx::Point
& point
);
85 // views::LayoutManager overrides:
86 virtual void Layout(views::View
* host
) OVERRIDE
;
87 virtual gfx::Size
GetPreferredSize(const views::View
* host
) const OVERRIDE
;
90 FRIEND_TEST_ALL_PREFIXES(BrowserViewLayoutTest
, BrowserViewLayout
);
91 FRIEND_TEST_ALL_PREFIXES(BrowserViewLayoutTest
, Layout
);
92 FRIEND_TEST_ALL_PREFIXES(BrowserViewLayoutTest
, LayoutDownloadShelf
);
93 class WebContentsModalDialogHostViews
;
95 Browser
* browser() { return browser_
; }
97 // Layout the following controls, starting at |top|, returns the coordinate
98 // of the bottom of the control, for laying out the next control.
99 int LayoutTabStripRegion(int top
);
100 int LayoutToolbar(int top
);
101 int LayoutBookmarkAndInfoBars(int top
, int browser_view_y
);
102 int LayoutBookmarkBar(int top
);
103 int LayoutInfoBar(int top
);
105 // Layout the |contents_container_| view between the coordinates |top| and
106 // |bottom|. See browser_view.h for details of the relationship between
107 // |contents_container_| and other views.
108 void LayoutContentsContainerView(int top
, int bottom
);
110 // Updates |top_container_|'s bounds. The new bounds depend on the size of
111 // the bookmark bar and the toolbar.
112 void UpdateTopContainerBounds();
114 // Returns the vertical offset for the web contents to account for a
115 // detached bookmarks bar.
116 int GetContentsOffsetForBookmarkBar();
118 // Returns the top margin to adjust the contents_container_ by. This is used
119 // to make the bookmark bar and contents_container_ overlap so that the
120 // preview contents hides the bookmark bar.
121 int GetTopMarginForActiveContent();
123 // Layout the Download Shelf, returns the coordinate of the top of the
124 // control, for laying out the previous control.
125 int LayoutDownloadShelf(int bottom
);
127 // Returns true if an infobar is showing.
128 bool InfobarVisible() const;
130 // The delegate interface. May be a mock in tests.
131 scoped_ptr
<BrowserViewLayoutDelegate
> delegate_
;
133 // The browser from the owning BrowserView.
136 // The owning browser view.
137 views::ClientView
* browser_view_
;
139 // Child views that the layout manager manages.
140 // NOTE: If you add a view, try to add it as a views::View, which makes
141 // testing much easier.
142 views::View
* top_container_
;
143 TabStrip
* tab_strip_
;
144 views::View
* toolbar_
;
145 BookmarkBarView
* bookmark_bar_
;
146 InfoBarContainerView
* infobar_container_
;
147 views::View
* contents_container_
;
148 ContentsLayoutManager
* contents_layout_manager_
;
149 views::View
* download_shelf_
;
151 ImmersiveModeController
* immersive_mode_controller_
;
153 // The bounds within which the vertically-stacked contents of the BrowserView
154 // should be laid out within. This is just the local bounds of the
156 // TODO(jamescook): Remove this and just use browser_view_->GetLocalBounds().
157 gfx::Rect vertical_layout_rect_
;
159 // The host for use in positioning the web contents modal dialog.
160 scoped_ptr
<WebContentsModalDialogHostViews
> dialog_host_
;
162 // The latest dialog bounds applied during a layout pass.
163 gfx::Rect latest_dialog_bounds_
;
165 // The distance the web contents modal dialog is from the top of the window,
167 int web_contents_modal_dialog_top_y_
;
169 DISALLOW_COPY_AND_ASSIGN(BrowserViewLayout
);
172 #endif // CHROME_BROWSER_UI_VIEWS_FRAME_BROWSER_VIEW_LAYOUT_H_