Home | History | Annotate | Download | only in frame
      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