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