• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 ContentsLayoutManager;
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_container,
57             ContentsLayoutManager* contents_layout_manager,
58             ImmersiveModeController* immersive_mode_controller);
59 
60   // Sets or updates views that are not available when |this| is initialized.
set_tab_strip(TabStrip * tab_strip)61   void set_tab_strip(TabStrip* tab_strip) {
62     tab_strip_ = tab_strip;
63   }
set_bookmark_bar(BookmarkBarView * bookmark_bar)64   void set_bookmark_bar(BookmarkBarView* bookmark_bar) {
65     bookmark_bar_ = bookmark_bar;
66   }
set_download_shelf(views::View * download_shelf)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(const views::View* host) const 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 
browser()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_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);
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_container_;
148   ContentsLayoutManager* contents_layout_manager_;
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 bounds applied during a layout pass.
163   gfx::Rect latest_dialog_bounds_;
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