15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_UI_VIEWS_FRAME_BROWSER_VIEW_LAYOUT_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_VIEWS_FRAME_BROWSER_VIEW_LAYOUT_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/gtest_prod_util.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/layout_manager.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkBarView; 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Browser; 1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class BrowserViewLayoutDelegate; 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ContentsLayoutManager; 1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ImmersiveModeController; 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class InfoBarContainerView; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TabContentsContainer; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TabStrip; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Point; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Size; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views { 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class ClientView; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SingleSplitView; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace web_modal { 3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class WebContentsModalDialogHost; 3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The layout manager used in chrome browser. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserViewLayout : public views::LayoutManager { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The vertical overlap between the TabStrip and the Toolbar. 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static const int kToolbarTabStripVerticalOverlap; 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserViewLayout(); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~BrowserViewLayout(); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Sets all the views to be managed. Takes ownership of |delegate|. 4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // |browser_view| may be NULL in tests. 4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void Init(BrowserViewLayoutDelegate* delegate, 5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Browser* browser, 51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) views::ClientView* browser_view, 5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::View* top_container, 5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TabStrip* tab_strip, 5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::View* toolbar, 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InfoBarContainerView* infobar_container, 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) views::View* contents_container, 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ContentsLayoutManager* contents_layout_manager, 5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ImmersiveModeController* immersive_mode_controller); 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Sets or updates views that are not available when |this| is initialized. 6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void set_tab_strip(TabStrip* tab_strip) { 6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) tab_strip_ = tab_strip; 6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void set_bookmark_bar(BookmarkBarView* bookmark_bar) { 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bookmark_bar_ = bookmark_bar; 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void set_download_shelf(views::View* download_shelf) { 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) download_shelf_ = download_shelf; 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) web_modal::WebContentsModalDialogHost* GetWebContentsModalDialogHost(); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the minimum size of the browser view. 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Size GetMinimumSize(); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Returns the bounding box, in widget coordinates, for the find bar. 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Rect GetFindBarBoundingBox() const; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tests to see if the specified |point| (in nonclient view's coordinates) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is within the views managed by the laymanager. Returns one of 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // HitTestCompat enum defined in ui/base/hit_test.h. 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See also ClientView::NonClientHitTest. 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int NonClientHitTest(const gfx::Point& point); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // views::LayoutManager overrides: 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Layout(views::View* host) OVERRIDE; 87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual gfx::Size GetPreferredSize(const views::View* host) const OVERRIDE; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(BrowserViewLayoutTest, BrowserViewLayout); 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(BrowserViewLayoutTest, Layout); 9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(BrowserViewLayoutTest, LayoutDownloadShelf); 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) class WebContentsModalDialogHostViews; 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Browser* browser() { return browser_; } 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Layout the following controls, starting at |top|, returns the coordinate 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of the bottom of the control, for laying out the next control. 99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int LayoutTabStripRegion(int top); 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int LayoutToolbar(int top); 10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int LayoutBookmarkAndInfoBars(int top, int browser_view_y); 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int LayoutBookmarkBar(int top); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int LayoutInfoBar(int top); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Layout the |contents_container_| view between the coordinates |top| and 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // |bottom|. See browser_view.h for details of the relationship between 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // |contents_container_| and other views. 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void LayoutContentsContainerView(int top, int bottom); 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Updates |top_container_|'s bounds. The new bounds depend on the size of 111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // the bookmark bar and the toolbar. 112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void UpdateTopContainerBounds(); 113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Returns the vertical offset for the web contents to account for a 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // detached bookmarks bar. 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int GetContentsOffsetForBookmarkBar(); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the top margin to adjust the contents_container_ by. This is used 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to make the bookmark bar and contents_container_ overlap so that the 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // preview contents hides the bookmark bar. 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int GetTopMarginForActiveContent(); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Layout the Download Shelf, returns the coordinate of the top of the 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // control, for laying out the previous control. 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int LayoutDownloadShelf(int bottom); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if an infobar is showing. 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool InfobarVisible() const; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // The delegate interface. May be a mock in tests. 13190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<BrowserViewLayoutDelegate> delegate_; 13290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The browser from the owning BrowserView. 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Browser* browser_; 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The owning browser view. 137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) views::ClientView* browser_view_; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Child views that the layout manager manages. 14090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // NOTE: If you add a view, try to add it as a views::View, which makes 14190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // testing much easier. 14290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::View* top_container_; 14390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TabStrip* tab_strip_; 14490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::View* toolbar_; 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) BookmarkBarView* bookmark_bar_; 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InfoBarContainerView* infobar_container_; 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) views::View* contents_container_; 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ContentsLayoutManager* contents_layout_manager_; 14990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::View* download_shelf_; 15090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 15190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ImmersiveModeController* immersive_mode_controller_; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The bounds within which the vertically-stacked contents of the BrowserView 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // should be laid out within. This is just the local bounds of the 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BrowserView. 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(jamescook): Remove this and just use browser_view_->GetLocalBounds(). 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect vertical_layout_rect_; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The host for use in positioning the web contents modal dialog. 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<WebContentsModalDialogHostViews> dialog_host_; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The latest dialog bounds applied during a layout pass. 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect latest_dialog_bounds_; 164a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The distance the web contents modal dialog is from the top of the window, 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in pixels. 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int web_contents_modal_dialog_top_y_; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(BrowserViewLayout); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_UI_VIEWS_FRAME_BROWSER_VIEW_LAYOUT_H_ 173