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. 4 5 #ifndef CHROME_BROWSER_UI_VIEWS_FRAME_BROWSER_VIEW_LAYOUT_H_ 6 #define CHROME_BROWSER_UI_VIEWS_FRAME_BROWSER_VIEW_LAYOUT_H_ 7 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" 14 15 class BookmarkBarView; 16 class Browser; 17 class BrowserViewLayoutDelegate; 18 class ContentsContainer; 19 class ImmersiveModeController; 20 class InfoBarContainerView; 21 class TabContentsContainer; 22 class TabStrip; 23 24 namespace gfx { 25 class Point; 26 class Size; 27 } 28 29 namespace views { 30 class ClientView; 31 class SingleSplitView; 32 } 33 34 namespace web_modal { 35 class WebContentsModalDialogHost; 36 } 37 38 // The layout manager used in chrome browser. 39 class BrowserViewLayout : public views::LayoutManager { 40 public: 41 // The vertical overlap between the TabStrip and the Toolbar. 42 static const int kToolbarTabStripVerticalOverlap; 43 44 BrowserViewLayout(); 45 virtual ~BrowserViewLayout(); 46 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, 50 Browser* browser, 51 views::ClientView* browser_view, 52 views::View* top_container, 53 TabStrip* tab_strip, 54 views::View* toolbar, 55 InfoBarContainerView* infobar_container, 56 views::View* contents_split, 57 ContentsContainer* contents_container, 58 ImmersiveModeController* immersive_mode_controller); 59 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; 63 } 64 void set_bookmark_bar(BookmarkBarView* bookmark_bar) { 65 bookmark_bar_ = bookmark_bar; 66 } 67 void set_download_shelf(views::View* download_shelf) { 68 download_shelf_ = download_shelf; 69 } 70 71 web_modal::WebContentsModalDialogHost* GetWebContentsModalDialogHost(); 72 73 // Returns the minimum size of the browser view. 74 gfx::Size GetMinimumSize(); 75 76 // Returns the bounding box, in widget coordinates, for the find bar. 77 gfx::Rect GetFindBarBoundingBox() const; 78 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); 84 85 // views::LayoutManager overrides: 86 virtual void Layout(views::View* host) OVERRIDE; 87 virtual gfx::Size GetPreferredSize(views::View* host) OVERRIDE; 88 89 private: 90 FRIEND_TEST_ALL_PREFIXES(BrowserViewLayoutTest, BrowserViewLayout); 91 FRIEND_TEST_ALL_PREFIXES(BrowserViewLayoutTest, Layout); 92 FRIEND_TEST_ALL_PREFIXES(BrowserViewLayoutTest, LayoutDownloadShelf); 93 class WebContentsModalDialogHostViews; 94 95 Browser* browser() { return browser_; } 96 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); 104 105 // Layout the |contents_split_| view between the coordinates |top| and 106 // |bottom|. See browser_view.h for details of the relationship between 107 // |contents_split_| and other views. 108 void LayoutContentsSplitView(int top, int bottom); 109 110 // Updates |top_container_|'s bounds. The new bounds depend on the size of 111 // the bookmark bar and the toolbar. 112 void UpdateTopContainerBounds(); 113 114 // Returns the vertical offset for the web contents to account for a 115 // detached bookmarks bar. 116 int GetContentsOffsetForBookmarkBar(); 117 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(); 122 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); 126 127 // Returns true if an infobar is showing. 128 bool InfobarVisible() const; 129 130 // The delegate interface. May be a mock in tests. 131 scoped_ptr<BrowserViewLayoutDelegate> delegate_; 132 133 // The browser from the owning BrowserView. 134 Browser* browser_; 135 136 // The owning browser view. 137 views::ClientView* browser_view_; 138 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_split_; 148 ContentsContainer* contents_container_; 149 views::View* download_shelf_; 150 151 ImmersiveModeController* immersive_mode_controller_; 152 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 155 // BrowserView. 156 // TODO(jamescook): Remove this and just use browser_view_->GetLocalBounds(). 157 gfx::Rect vertical_layout_rect_; 158 159 // The host for use in positioning the web contents modal dialog. 160 scoped_ptr<WebContentsModalDialogHostViews> dialog_host_; 161 162 // The latest dialog position applied during a layout pass. 163 gfx::Point latest_dialog_position_; 164 165 // The distance the web contents modal dialog is from the top of the window, 166 // in pixels. 167 int web_contents_modal_dialog_top_y_; 168 169 DISALLOW_COPY_AND_ASSIGN(BrowserViewLayout); 170 }; 171 172 #endif // CHROME_BROWSER_UI_VIEWS_FRAME_BROWSER_VIEW_LAYOUT_H_ 173