1// Copyright (c) 2011 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#pragma once
8
9#include "base/basictypes.h"
10#include "ui/gfx/rect.h"
11#include "views/layout/layout_manager.h"
12
13class AbstractTabStripView;
14class BookmarkBarView;
15class Browser;
16class BrowserView;
17class ContentsContainer;
18class DownloadShelfView;
19class TabContentsContainer;
20class ToolbarView;
21
22namespace gfx {
23class Point;
24class Size;
25}
26
27namespace views {
28class SingleSplitView;
29}
30
31// The layout manager used in chrome browser.
32class BrowserViewLayout : public views::LayoutManager {
33 public:
34  BrowserViewLayout();
35  virtual ~BrowserViewLayout();
36
37  // Returns the minimum size of the browser view.
38  virtual gfx::Size GetMinimumSize();
39
40  // Returns the bounding box for the find bar.
41  virtual gfx::Rect GetFindBarBoundingBox() const;
42
43  // Returns true if the specified point(BrowserView coordinates) is in
44  // in the window caption area of the browser window.
45  virtual bool IsPositionInWindowCaption(const gfx::Point& point);
46
47  // Tests to see if the specified |point| (in nonclient view's coordinates)
48  // is within the views managed by the laymanager. Returns one of
49  // HitTestCompat enum defined in views/window/hit_test.h.
50  // See also ClientView::NonClientHitTest.
51  virtual int NonClientHitTest(const gfx::Point& point);
52
53  // views::LayoutManager overrides:
54  virtual void Installed(views::View* host);
55  virtual void Uninstalled(views::View* host);
56  virtual void ViewAdded(views::View* host, views::View* view);
57  virtual void ViewRemoved(views::View* host, views::View* view);
58  virtual void Layout(views::View* host);
59  virtual gfx::Size GetPreferredSize(views::View* host);
60
61 protected:
62  Browser* browser();
63  const Browser* browser() const;
64
65  // Layout the TabStrip, returns the coordinate of the bottom of the TabStrip,
66  // for laying out subsequent controls.
67  virtual int LayoutTabStrip();
68
69  // Layout the following controls, starting at |top|, returns the coordinate
70  // of the bottom of the control, for laying out the next control.
71  virtual int LayoutToolbar(int top);
72  virtual int LayoutBookmarkAndInfoBars(int top);
73  int LayoutBookmarkBar(int top);
74  int LayoutInfoBar(int top);
75
76  // Updates |source|'s reserved contents rect by mapping BrowserView's
77  // |browser_reserved_rect| into |future_source_bounds| taking into
78  // account |source|'s |future_parent_offset| (offset is relative to
79  // browser_view_).
80  void UpdateReservedContentsRect(const gfx::Rect& browser_reserved_rect,
81                                  TabContentsContainer* source,
82                                  const gfx::Rect& future_source_bounds,
83                                  const gfx::Point& future_parent_offset);
84
85  // Layout the TabContents container, between the coordinates |top| and
86  // |bottom|.
87  void LayoutTabContents(int top, int bottom);
88
89  // Returns the top margin to adjust the contents_container_ by. This is used
90  // to make the bookmark bar and contents_container_ overlap so that the
91  // preview contents hides the bookmark bar.
92  int GetTopMarginForActiveContent();
93
94  // Layout the Download Shelf, returns the coordinate of the top of the
95  // control, for laying out the previous control.
96  int LayoutDownloadShelf(int bottom);
97
98  // Returns true if an infobar is showing.
99  bool InfobarVisible() const;
100
101  // See description above vertical_layout_rect_ for details.
102  void set_vertical_layout_rect(const gfx::Rect& bounds) {
103    vertical_layout_rect_ = bounds;
104  }
105  const gfx::Rect& vertical_layout_rect() const {
106    return vertical_layout_rect_;
107  }
108
109  // Child views that the layout manager manages.
110  AbstractTabStripView* tabstrip_;
111  ToolbarView* toolbar_;
112  views::SingleSplitView* contents_split_;
113  ContentsContainer* contents_container_;
114  views::View* infobar_container_;
115  DownloadShelfView* download_shelf_;
116  BookmarkBarView* active_bookmark_bar_;
117
118  BrowserView* browser_view_;
119
120  // The bounds within which the vertically-stacked contents of the BrowserView
121  // should be laid out within. When the SideTabstrip is not visible, this is
122  // just the local bounds of the BrowserView, otherwise it's the local bounds
123  // of the BrowserView less the width of the SideTabstrip.
124  gfx::Rect vertical_layout_rect_;
125
126  // The distance the FindBar is from the top of the window, in pixels.
127  int find_bar_y_;
128
129  DISALLOW_COPY_AND_ASSIGN(BrowserViewLayout);
130};
131
132#endif  // CHROME_BROWSER_UI_VIEWS_FRAME_BROWSER_VIEW_LAYOUT_H_
133