summaryrefslogtreecommitdiffstats
path: root/chrome/browser/views/frame
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/views/frame')
-rw-r--r--chrome/browser/views/frame/browser_layout_manager.cc403
-rw-r--r--chrome/browser/views/frame/browser_layout_manager.h27
-rw-r--r--chrome/browser/views/frame/browser_view.cc247
-rw-r--r--chrome/browser/views/frame/browser_view.h31
4 files changed, 262 insertions, 446 deletions
diff --git a/chrome/browser/views/frame/browser_layout_manager.cc b/chrome/browser/views/frame/browser_layout_manager.cc
deleted file mode 100644
index cdc7ca3..0000000
--- a/chrome/browser/views/frame/browser_layout_manager.cc
+++ /dev/null
@@ -1,403 +0,0 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/views/frame/browser_layout_manager.h"
-
-#include "app/gfx/scrollbar_size.h"
-#include "chrome/browser/find_bar.h"
-#include "chrome/browser/find_bar_controller.h"
-#include "chrome/browser/view_ids.h"
-#include "chrome/browser/views/bookmark_bar_view.h"
-#include "chrome/browser/views/download_shelf_view.h"
-#include "chrome/browser/views/extensions/extension_shelf.h"
-#include "chrome/browser/views/frame/browser_extender.h"
-#include "chrome/browser/views/frame/browser_frame.h"
-#include "chrome/browser/views/frame/browser_view.h"
-#include "chrome/browser/views/tabs/tab_strip.h"
-#include "chrome/browser/views/toolbar_view.h"
-
-namespace {
-
-// The vertical overlap between the TabStrip and the Toolbar.
-static const int kToolbarTabStripVerticalOverlap = 3;
-// An offset distance between certain toolbars and the toolbar that preceded
-// them in layout.
-static const int kSeparationLineHeight = 1;
-
-// The layout manager used in chrome browser.
-class ChromeLayoutManager : public BrowserLayoutManager {
- public:
- ChromeLayoutManager()
- : tabstrip_(NULL),
- toolbar_(NULL),
- contents_split_(NULL),
- contents_container_(NULL),
- infobar_container_(NULL),
- download_shelf_(NULL),
- extension_shelf_(NULL),
- active_bookmark_bar_(NULL),
- browser_view_(NULL),
- find_bar_y_(0) {
- }
-
- //////////////////////////////////////////////////////////////////////////////
- // Overridden from LayoutManager.
-
- virtual void Installed(views::View* host) {
- toolbar_ = NULL;
- contents_split_ = NULL;
- contents_container_ = NULL;
- infobar_container_ = NULL;
- download_shelf_ = NULL;
- extension_shelf_ = NULL;
- active_bookmark_bar_ = NULL;
- tabstrip_ = NULL;
- browser_view_ = static_cast<BrowserView*>(host);
- }
-
- virtual void Uninstalled(views::View* host) {}
-
- virtual void ViewAdded(views::View* host, views::View* view) {
- switch (view->GetID()) {
- case VIEW_ID_CONTENTS_SPLIT:
- contents_split_ = view;
- contents_container_ = contents_split_->GetChildViewAt(0);
- break;
- case VIEW_ID_INFO_BAR_CONTAINER:
- infobar_container_ = view;
- break;
- case VIEW_ID_DOWNLOAD_SHELF:
- download_shelf_ = static_cast<DownloadShelfView*>(view);
- break;
- case VIEW_ID_DEV_EXTENSION_SHELF:
- extension_shelf_ = static_cast<ExtensionShelf*>(view);
- break;
- case VIEW_ID_BOOKMARK_BAR:
- active_bookmark_bar_ = static_cast<BookmarkBarView*>(view);
- break;
- case VIEW_ID_TOOLBAR:
- toolbar_ = static_cast<ToolbarView*>(view);
- break;
- case VIEW_ID_TAB_STRIP:
- tabstrip_ = static_cast<TabStrip*>(view);
- break;
- }
- }
-
- virtual void ViewRemoved(views::View* host, views::View* view) {
- switch (view->GetID()) {
- case VIEW_ID_BOOKMARK_BAR:
- active_bookmark_bar_ = NULL;
- break;
- }
- }
-
- // Lay out the children of |host| according to implementation-specific
- // heuristics. The graphics used during painting is provided to allow for
- // string sizing.
- virtual void Layout(views::View* host) {
- int top = LayoutTabStrip();
- top = LayoutToolbar(top);
- top = LayoutBookmarkAndInfoBars(top);
- int bottom = LayoutExtensionAndDownloadShelves();
- LayoutTabContents(top, bottom);
- // This must be done _after_ we lay out the TabContents since this
- // code calls back into us to find the bounding box the find bar
- // must be laid out within, and that code depends on the
- // TabContentsContainer's bounds being up to date.
- if (browser()->HasFindBarController()) {
- browser()->GetFindBarController()->find_bar()->MoveWindowIfNecessary(
- gfx::Rect(), true);
- }
- // Align status bubble with the bottom of the contents_container.
- browser_view_->LayoutStatusBubble(
- top + contents_container_->bounds().height());
- browser_view_->SchedulePaint();
- }
-
- // Return the preferred size which is the size required to give each
- // children their respective preferred size.
- virtual gfx::Size GetPreferredSize(views::View* host) {
- return gfx::Size();
- }
-
- //////////////////////////////////////////////////////////////////////////////
- // Overridden from BrowserLayoutManager.
-
- virtual gfx::Size GetMinimumSize() {
- // TODO(noname): In theory the tabstrip width should probably be
- // (OTR + tabstrip + caption buttons) width.
- gfx::Size tabstrip_size(
- browser()->SupportsWindowFeature(Browser::FEATURE_TABSTRIP) ?
- tabstrip_->GetMinimumSize() : gfx::Size());
- gfx::Size toolbar_size(
- (browser()->SupportsWindowFeature(Browser::FEATURE_TOOLBAR) ||
- browser()->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR)) ?
- toolbar_->GetMinimumSize() : gfx::Size());
- if (tabstrip_size.height() && toolbar_size.height())
- toolbar_size.Enlarge(0, -kToolbarTabStripVerticalOverlap);
- gfx::Size bookmark_bar_size;
- if (active_bookmark_bar_ &&
- browser()->SupportsWindowFeature(Browser::FEATURE_BOOKMARKBAR)) {
- bookmark_bar_size = active_bookmark_bar_->GetMinimumSize();
- bookmark_bar_size.Enlarge(
- 0,
- -kSeparationLineHeight -
- active_bookmark_bar_->GetToolbarOverlap(true));
- }
- gfx::Size contents_size(contents_split_->GetMinimumSize());
-
- int min_height = tabstrip_size.height() + toolbar_size.height() +
- bookmark_bar_size.height() + contents_size.height();
- int widths[] = { tabstrip_size.width(), toolbar_size.width(),
- bookmark_bar_size.width(), contents_size.width() };
- int min_width = *std::max_element(&widths[0], &widths[arraysize(widths)]);
- return gfx::Size(min_width, min_height);
- }
-
- virtual gfx::Rect GetFindBarBoundingBox() const {
- // This function returns the area the Find Bar can be laid out
- // within. This basically implies the "user-perceived content
- // area" of the browser window excluding the vertical
- // scrollbar. This is not quite so straightforward as positioning
- // based on the TabContentsContainer since the BookmarkBarView may
- // be visible but not persistent (in the New Tab case) and we
- // position the Find Bar over the top of it in that case since the
- // BookmarkBarView is not _visually_ connected to the Toolbar.
-
- // First determine the bounding box of the content area in Widget
- // coordinates.
- gfx::Rect bounding_box(contents_container_->bounds());
-
- gfx::Point topleft;
- views::View::ConvertPointToWidget(contents_container_, &topleft);
- bounding_box.set_origin(topleft);
-
- // Adjust the position and size of the bounding box by the find bar offset
- // calculated during the last Layout.
- int height_delta = find_bar_y_ - bounding_box.y();
- bounding_box.set_y(find_bar_y_);
- bounding_box.set_height(std::max(0, bounding_box.height() + height_delta));
-
- // Finally decrease the width of the bounding box by the width of
- // the vertical scroll bar.
- int scrollbar_width = gfx::scrollbar_size();
- bounding_box.set_width(std::max(0, bounding_box.width() - scrollbar_width));
- if (browser_view_->UILayoutIsRightToLeft())
- bounding_box.set_x(bounding_box.x() + scrollbar_width);
-
- return bounding_box;
- }
-
- private:
- Browser* browser() {
- return browser_view_->browser();
- }
-
- // Layout the TabStrip, returns the coordinate of the bottom of the TabStrip,
- // for laying out subsequent controls.
- int LayoutTabStrip() {
- gfx::Rect layout_bounds =
- browser_view_->frame()->GetBoundsForTabStrip(tabstrip_);
- gfx::Rect toolbar_bounds = browser_view_->GetToolbarBounds();
- tabstrip_->SetBackgroundOffset(
- gfx::Point(layout_bounds.x() - toolbar_bounds.x(), layout_bounds.y()));
-
- gfx::Point tabstrip_origin = layout_bounds.origin();
- views::View::ConvertPointToView(browser_view_->GetParent(), browser_view_,
- &tabstrip_origin);
- layout_bounds.set_origin(tabstrip_origin);
-
- // Layout extra components.
- int bottom = 0;
- gfx::Rect tabstrip_bounds;
- browser_view_->browser_extender()->Layout(
- layout_bounds, &tabstrip_bounds, &bottom);
- tabstrip_->SetVisible(browser_view_->IsTabStripVisible());
- tabstrip_->SetBounds(tabstrip_bounds);
- return bottom;
- }
-
- // Layout the following controls, starting at |top|, returns the coordinate
- // of the bottom of the control, for laying out the next control.
- int LayoutToolbar(int top) {
- int browser_view_width = browser_view_->width();
- bool visible = browser_view_->IsToolbarVisible();
- toolbar_->location_bar()->SetFocusable(visible);
- int y = top -
- ((visible && browser_view_->IsTabStripVisible())
- ? kToolbarTabStripVerticalOverlap : 0);
- int height = visible ? toolbar_->GetPreferredSize().height() : 0;
- toolbar_->SetVisible(visible);
- toolbar_->SetBounds(0, y, browser_view_width, height);
- return y + height;
- }
-
- int LayoutBookmarkAndInfoBars(int top) {
- find_bar_y_ = top + browser_view_->y() - 1;
- if (active_bookmark_bar_) {
- // If we're showing the Bookmark bar in detached style, then we
- // need to show any Info bar _above_ the Bookmark bar, since the
- // Bookmark bar is styled to look like it's part of the page.
- if (active_bookmark_bar_->IsDetached())
- return LayoutTopBar(LayoutInfoBar(top));
- // Otherwise, Bookmark bar first, Info bar second.
- top = LayoutTopBar(top);
- }
- find_bar_y_ = top + browser_view_->y() - 1;
- return LayoutInfoBar(top);
- }
-
- int LayoutTopBar(int top) {
- // This method lays out the the bookmark bar, and, if required,
- // the extension shelf by its side. The bookmark bar appears on
- // the right of the extension shelf. If there are too many
- // bookmark items and extension toolstrips to fit in the single
- // bar, some compromises are made as follows: 1. The bookmark bar
- // is shrunk till it reaches the minimum width. 2. After reaching
- // the minimum width, the bookmark bar width is kept fixed - the
- // extension shelf bar width is reduced.
- DCHECK(active_bookmark_bar_);
- int y = top, x = 0;
- if (!browser_view_->IsBookmarkBarVisible()) {
- active_bookmark_bar_->SetVisible(false);
- active_bookmark_bar_->SetBounds(0, y, browser_view_->width(), 0);
- if (extension_shelf_->IsOnTop())
- extension_shelf_->SetVisible(false);
- return y;
- }
-
- int bookmark_bar_height = active_bookmark_bar_->GetPreferredSize().height();
- y -= kSeparationLineHeight + (
- active_bookmark_bar_->IsDetached() ?
- 0 : active_bookmark_bar_->GetToolbarOverlap(false));
-
- if (extension_shelf_->IsOnTop()) {
- if (!active_bookmark_bar_->IsDetached()) {
- int extension_shelf_width =
- extension_shelf_->GetPreferredSize().width();
- int bookmark_bar_given_width =
- browser_view_->width() - extension_shelf_width;
- int minimum_allowed_bookmark_bar_width =
- active_bookmark_bar_->GetMinimumSize().width();
- if (bookmark_bar_given_width < minimum_allowed_bookmark_bar_width) {
- // The bookmark bar cannot compromise on its width any more. The
- // extension shelf needs to shrink now.
- extension_shelf_width =
- browser_view_->width() - minimum_allowed_bookmark_bar_width;
- }
- extension_shelf_->SetVisible(true);
- extension_shelf_->SetBounds(x, y, extension_shelf_width,
- bookmark_bar_height);
- x += extension_shelf_width;
- } else {
- // TODO(sidchat): For detached style bookmark bar, set the extensions
- // shelf in a better position. Issue = 20741.
- extension_shelf_->SetVisible(false);
- }
- }
-
- active_bookmark_bar_->SetVisible(true);
- active_bookmark_bar_->SetBounds(x, y,
- browser_view_->width() - x,
- bookmark_bar_height);
- return y + bookmark_bar_height;
- }
-
- int LayoutInfoBar(int top) {
- bool visible = browser()->SupportsWindowFeature(Browser::FEATURE_INFOBAR);
- int height = visible ? infobar_container_->GetPreferredSize().height() : 0;
- infobar_container_->SetVisible(visible);
- infobar_container_->SetBounds(0, top, browser_view_->width(), height);
- return top + height;
- }
-
- // Layout the TabContents container, between the coordinates |top| and
- // |bottom|.
- void LayoutTabContents(int top, int bottom) {
- contents_split_->SetBounds(0, top, browser_view_->width(), bottom - top);
- }
-
- int LayoutExtensionAndDownloadShelves() {
- // If we're showing the Extension bar in detached style, then we
- // need to show Download shelf _above_ the Extension bar, since
- // the Extension bar is styled to look like it's part of the page.
- //
- // TODO(Oshima): confirm this comment.
- int bottom = browser_view_->height();
- if (extension_shelf_) {
- if (extension_shelf_->IsDetached()) {
- bottom = LayoutDownloadShelf(bottom);
- return LayoutExtensionShelf(bottom);
- }
- // Otherwise, Extension shelf first, Download shelf second.
- bottom = LayoutExtensionShelf(bottom);
- }
- return LayoutDownloadShelf(bottom);
- }
-
- // Layout the Download Shelf, returns the coordinate of the top of the
- // control, for laying out the previous control.
- int LayoutDownloadShelf(int bottom) {
- // Re-layout the shelf either if it is visible or if it's close animation
- // is currently running.
- if (browser_view_->IsDownloadShelfVisible() ||
- (download_shelf_ && download_shelf_->IsClosing())) {
- bool visible = browser()->SupportsWindowFeature(
- Browser::FEATURE_DOWNLOADSHELF);
- DCHECK(download_shelf_);
- int height = visible ? download_shelf_->GetPreferredSize().height() : 0;
- download_shelf_->SetVisible(visible);
- download_shelf_->SetBounds(0, bottom - height,
- browser_view_->width(), height);
- download_shelf_->Layout();
- bottom -= height;
- }
- return bottom;
- }
-
- // Layout the Extension Shelf, returns the coordinate of the top of the
- // control, for laying out the previous control.
- int LayoutExtensionShelf(int bottom) {
- if (!extension_shelf_ || extension_shelf_->IsOnTop())
- return bottom;
-
- if (extension_shelf_) {
- bool visible = browser()->SupportsWindowFeature(
- Browser::FEATURE_EXTENSIONSHELF);
- int height =
- visible ? extension_shelf_->GetPreferredSize().height() : 0;
- extension_shelf_->SetVisible(visible);
- extension_shelf_->SetBounds(0, bottom - height,
- browser_view_->width(), height);
- extension_shelf_->Layout();
- bottom -= height;
- }
- return bottom;
- }
-
- // Child views that the layout manager manages.
- TabStrip* tabstrip_;
- ToolbarView* toolbar_;
- views::View* contents_split_;
- views::View* contents_container_;
- views::View* infobar_container_;
- DownloadShelfView* download_shelf_;
- ExtensionShelf* extension_shelf_;
- BookmarkBarView* active_bookmark_bar_;
-
- BrowserView* browser_view_;
-
- // The distance the FindBar is from the top of the window, in pixels.
- int find_bar_y_;
-
- DISALLOW_COPY_AND_ASSIGN(ChromeLayoutManager);
-};
-
-} // namespace
-
-// static
-BrowserLayoutManager* BrowserLayoutManager::CreateBrowserLayoutManager() {
- return new ChromeLayoutManager();
-}
diff --git a/chrome/browser/views/frame/browser_layout_manager.h b/chrome/browser/views/frame/browser_layout_manager.h
deleted file mode 100644
index ea73f57..0000000
--- a/chrome/browser/views/frame/browser_layout_manager.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_VIEWS_FRAME_BROWSER_LAYOUT_MANAGER_H_
-#define CHROME_BROWSER_VIEWS_FRAME_BROWSER_LAYOUT_MANAGER_H_
-
-#include "base/gfx/size.h"
-#include "views/layout_manager.h"
-
-class BrowserView;
-
-// An extended LayoutManager to layout components in
-// BrowserView.
-class BrowserLayoutManager : public views::LayoutManager {
- public:
- // Returns the minimum size of the browser view.
- virtual gfx::Size GetMinimumSize() = 0;
-
- // Returns the bounding box for the find bar.
- virtual gfx::Rect GetFindBarBoundingBox() const = 0;
-
- static BrowserLayoutManager* CreateBrowserLayoutManager();
-};
-
-#endif // CHROME_BROWSER_VIEWS_FRAME_BROWSER_LAYOUT_MANAGER_H_
-
diff --git a/chrome/browser/views/frame/browser_view.cc b/chrome/browser/views/frame/browser_view.cc
index be8a488..9d0a14e 100644
--- a/chrome/browser/views/frame/browser_view.cc
+++ b/chrome/browser/views/frame/browser_view.cc
@@ -27,6 +27,8 @@
#include "chrome/browser/browser_theme_provider.h"
#include "chrome/browser/debugger/devtools_window.h"
#include "chrome/browser/download/download_manager.h"
+#include "chrome/browser/find_bar.h"
+#include "chrome/browser/find_bar_controller.h"
#include "chrome/browser/ntp_background_util.h"
#include "chrome/browser/page_info_window.h"
#include "chrome/browser/profile.h"
@@ -39,7 +41,6 @@
#include "chrome/browser/views/extensions/extension_shelf.h"
#include "chrome/browser/views/frame/browser_extender.h"
#include "chrome/browser/views/frame/browser_frame.h"
-#include "chrome/browser/views/frame/browser_layout_manager.h"
#include "chrome/browser/views/fullscreen_exit_bubble.h"
#include "chrome/browser/views/infobars/infobar_container.h"
#include "chrome/browser/views/status_bubble_views.h"
@@ -91,11 +92,16 @@ using views::GridLayout;
// static
SkBitmap BrowserView::default_favicon_;
SkBitmap BrowserView::otr_avatar_;
+// The vertical overlap between the TabStrip and the Toolbar.
+static const int kToolbarTabStripVerticalOverlap = 3;
// The visible height of the shadow above the tabs. Clicks in this area are
// treated as clicks to the frame, rather than clicks to the tab.
static const int kTabShadowSize = 2;
// The height of the status bubble.
static const int kStatusBubbleHeight = 20;
+// An offset distance between certain toolbars and the toolbar that preceded
+// them in layout.
+static const int kSeparationLineHeight = 1;
// The name of a key to store on the window handle so that other code can
// locate this object using just the handle.
#if defined(OS_WIN)
@@ -406,6 +412,7 @@ BrowserView::BrowserView(Browser* browser)
tabstrip_(NULL),
toolbar_(NULL),
infobar_container_(NULL),
+ find_bar_y_(0),
contents_container_(NULL),
devtools_container_(NULL),
contents_split_(NULL),
@@ -526,7 +533,35 @@ bool BrowserView::ShouldFindBarBlendWithBookmarksBar() const {
}
gfx::Rect BrowserView::GetFindBarBoundingBox() const {
- return GetBrowserLayoutManager()->GetFindBarBoundingBox();
+ // This function returns the area the Find Bar can be laid out within. This
+ // basically implies the "user-perceived content area" of the browser window
+ // excluding the vertical scrollbar. This is not quite so straightforward as
+ // positioning based on the TabContentsContainer since the BookmarkBarView
+ // may be visible but not persistent (in the New Tab case) and we position
+ // the Find Bar over the top of it in that case since the BookmarkBarView is
+ // not _visually_ connected to the Toolbar.
+
+ // First determine the bounding box of the content area in Widget coordinates.
+ gfx::Rect bounding_box(contents_container_->bounds());
+
+ gfx::Point topleft;
+ views::View::ConvertPointToWidget(contents_container_, &topleft);
+ bounding_box.set_origin(topleft);
+
+ // Adjust the position and size of the bounding box by the find bar offset
+ // calculated during the last Layout.
+ int height_delta = find_bar_y_ - bounding_box.y();
+ bounding_box.set_y(find_bar_y_);
+ bounding_box.set_height(std::max(0, bounding_box.height() + height_delta));
+
+ // Finally decrease the width of the bounding box by the width of the vertical
+ // scroll bar.
+ int scrollbar_width = gfx::scrollbar_size();
+ bounding_box.set_width(std::max(0, bounding_box.width() - scrollbar_width));
+ if (UILayoutIsRightToLeft())
+ bounding_box.set_x(bounding_box.x() + scrollbar_width);
+
+ return bounding_box;
}
int BrowserView::GetTabStripHeight() const {
@@ -1589,7 +1624,32 @@ int BrowserView::NonClientHitTest(const gfx::Point& point) {
}
gfx::Size BrowserView::GetMinimumSize() {
- return GetBrowserLayoutManager()->GetMinimumSize();
+ // TODO(noname): In theory the tabstrip width should probably be
+ // (OTR + tabstrip + caption buttons) width.
+ gfx::Size tabstrip_size(
+ browser_->SupportsWindowFeature(Browser::FEATURE_TABSTRIP) ?
+ tabstrip_->GetMinimumSize() : gfx::Size());
+ gfx::Size toolbar_size(
+ (browser_->SupportsWindowFeature(Browser::FEATURE_TOOLBAR) ||
+ browser_->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR)) ?
+ toolbar_->GetMinimumSize() : gfx::Size());
+ if (tabstrip_size.height() && toolbar_size.height())
+ toolbar_size.Enlarge(0, -kToolbarTabStripVerticalOverlap);
+ gfx::Size bookmark_bar_size;
+ if (active_bookmark_bar_ &&
+ browser_->SupportsWindowFeature(Browser::FEATURE_BOOKMARKBAR)) {
+ bookmark_bar_size = active_bookmark_bar_->GetMinimumSize();
+ bookmark_bar_size.Enlarge(0,
+ -kSeparationLineHeight - bookmark_bar_view_->GetToolbarOverlap(true));
+ }
+ gfx::Size contents_size(contents_split_->GetMinimumSize());
+
+ int min_height = tabstrip_size.height() + toolbar_size.height() +
+ bookmark_bar_size.height() + contents_size.height();
+ int widths[] = { tabstrip_size.width(), toolbar_size.width(),
+ bookmark_bar_size.width(), contents_size.width() };
+ int min_width = *std::max_element(&widths[0], &widths[arraysize(widths)]);
+ return gfx::Size(min_width, min_height);
}
///////////////////////////////////////////////////////////////////////////////
@@ -1602,10 +1662,23 @@ std::string BrowserView::GetClassName() const {
void BrowserView::Layout() {
if (ignore_layout_)
return;
- if (GetLayoutManager()) {
- GetLayoutManager()->Layout(this);
- SchedulePaint();
+
+ int top = LayoutTabStrip();
+ top = LayoutToolbar(top);
+ top = LayoutBookmarkAndInfoBars(top);
+ int bottom = LayoutExtensionAndDownloadShelves();
+ LayoutTabContents(top, bottom);
+ // This must be done _after_ we lay out the TabContents since this code calls
+ // back into us to find the bounding box the find bar must be laid out within,
+ // and that code depends on the TabContentsContainer's bounds being up to
+ // date.
+ if (browser_->HasFindBarController()) {
+ browser_->GetFindBarController()->find_bar()->MoveWindowIfNecessary(
+ gfx::Rect(), true);
}
+ // Align status bubble with the bottom of the contents_container_.
+ LayoutStatusBubble(top + contents_container_->bounds().height());
+ SchedulePaint();
}
void BrowserView::ViewHierarchyChanged(bool is_add,
@@ -1646,7 +1719,6 @@ void BrowserView::SetAccessibleName(const std::wstring& name) {
// BrowserView, private:
void BrowserView::Init() {
- SetLayoutManager(BrowserLayoutManager::CreateBrowserLayoutManager());
// Stow a pointer to this object onto the window handle so that we can get
// at it later when all we have is a native view.
#if defined(OS_WIN)
@@ -1673,6 +1745,7 @@ void BrowserView::Init() {
toolbar_ = new ToolbarView(browser_.get());
AddChildView(toolbar_);
+ toolbar_->SetID(VIEW_ID_TOOLBAR);
toolbar_->Init(browser_->profile());
toolbar_->SetAccessibleName(l10n_util::GetString(IDS_ACCNAME_TOOLBAR));
@@ -1687,7 +1760,6 @@ void BrowserView::Init() {
contents_container_,
devtools_container_,
views::SingleSplitView::VERTICAL_SPLIT);
- contents_split_->SetID(VIEW_ID_CONTENTS_SPLIT);
SkColor bg_color = GetWidget()->GetThemeProvider()->
GetColor(BrowserThemeProvider::COLOR_TOOLBAR);
contents_split_->set_background(
@@ -1738,8 +1810,147 @@ void BrowserView::InitSystemMenu() {
}
#endif
-BrowserLayoutManager* BrowserView::GetBrowserLayoutManager() const {
- return static_cast<BrowserLayoutManager*>(GetLayoutManager());
+int BrowserView::LayoutTabStrip() {
+ gfx::Rect layout_bounds = frame_->GetBoundsForTabStrip(tabstrip_);
+ gfx::Rect toolbar_bounds = GetToolbarBounds();
+ tabstrip_->SetBackgroundOffset(
+ gfx::Point(layout_bounds.x() - toolbar_bounds.x(),
+ layout_bounds.y()));
+
+ gfx::Point tabstrip_origin = layout_bounds.origin();
+ ConvertPointToView(GetParent(), this, &tabstrip_origin);
+ layout_bounds.set_origin(tabstrip_origin);
+
+ // Layout extra components.
+ int bottom = 0;
+ gfx::Rect tabstrip_bounds;
+ browser_extender_->Layout(layout_bounds, &tabstrip_bounds, &bottom);
+ tabstrip_->SetVisible(IsTabStripVisible());
+ tabstrip_->SetBounds(tabstrip_bounds);
+ return bottom;
+}
+
+int BrowserView::LayoutToolbar(int top) {
+ int browser_view_width = width();
+ bool visible = IsToolbarVisible();
+ toolbar_->location_bar()->SetFocusable(visible);
+ int y = top -
+ ((visible && IsTabStripVisible()) ? kToolbarTabStripVerticalOverlap : 0);
+ int height = visible ? toolbar_->GetPreferredSize().height() : 0;
+ toolbar_->SetVisible(visible);
+ toolbar_->SetBounds(0, y, browser_view_width, height);
+ return y + height;
+}
+
+int BrowserView::LayoutBookmarkAndInfoBars(int top) {
+ find_bar_y_ = top + y() - 1;
+ if (active_bookmark_bar_) {
+ // If we're showing the Bookmark bar in detached style, then we need to show
+ // any Info bar _above_ the Bookmark bar, since the Bookmark bar is styled
+ // to look like it's part of the page.
+ if (bookmark_bar_view_->IsDetached())
+ return LayoutTopBar(LayoutInfoBar(top));
+ // Otherwise, Bookmark bar first, Info bar second.
+ top = LayoutTopBar(top);
+ }
+ find_bar_y_ = top + y() - 1;
+ return LayoutInfoBar(top);
+}
+
+int BrowserView::LayoutTopBar(int top) {
+ // This method lays out the the bookmark bar, and, if required, the extension
+ // shelf by its side. The bookmark bar appears on the right of the extension
+ // shelf. If there are too many bookmark items and extension toolstrips to fit
+ // in the single bar, some compromises are made as follows:
+ // 1. The bookmark bar is shrunk till it reaches the minimum width.
+ // 2. After reaching the minimum width, the bookmark bar width is kept fixed -
+ // the extension shelf bar width is reduced.
+ DCHECK(active_bookmark_bar_);
+ int y = top, x = 0;
+ if (!IsBookmarkBarVisible()) {
+ bookmark_bar_view_->SetVisible(false);
+ bookmark_bar_view_->SetBounds(0, y, width(), 0);
+ if (extension_shelf_->IsOnTop())
+ extension_shelf_->SetVisible(false);
+ return y;
+ }
+
+ int bookmark_bar_height = bookmark_bar_view_->GetPreferredSize().height();
+ y -= kSeparationLineHeight + (bookmark_bar_view_->IsDetached() ?
+ 0 : bookmark_bar_view_->GetToolbarOverlap(false));
+
+ if (extension_shelf_->IsOnTop()) {
+ if (!bookmark_bar_view_->IsDetached()) {
+ int extension_shelf_width =
+ extension_shelf_->GetPreferredSize().width();
+ int bookmark_bar_given_width = width() - extension_shelf_width;
+ int minimum_allowed_bookmark_bar_width =
+ bookmark_bar_view_->GetMinimumSize().width();
+ if (bookmark_bar_given_width < minimum_allowed_bookmark_bar_width) {
+ // The bookmark bar cannot compromise on its width any more. The
+ // extension shelf needs to shrink now.
+ extension_shelf_width =
+ width() - minimum_allowed_bookmark_bar_width;
+ }
+ extension_shelf_->SetVisible(true);
+ extension_shelf_->SetBounds(x, y, extension_shelf_width,
+ bookmark_bar_height);
+ x += extension_shelf_width;
+ } else {
+ // TODO(sidchat): For detached style bookmark bar, set the extensions
+ // shelf in a better position. Issue = 20741.
+ extension_shelf_->SetVisible(false);
+ }
+ }
+
+ bookmark_bar_view_->SetVisible(true);
+ bookmark_bar_view_->SetBounds(x, y, width() - x, bookmark_bar_height);
+ return y + bookmark_bar_height;
+}
+
+int BrowserView::LayoutInfoBar(int top) {
+ bool visible = browser_->SupportsWindowFeature(Browser::FEATURE_INFOBAR);
+ int height = visible ? infobar_container_->GetPreferredSize().height() : 0;
+ infobar_container_->SetVisible(visible);
+ infobar_container_->SetBounds(0, top, width(), height);
+ return top + height;
+}
+
+void BrowserView::LayoutTabContents(int top, int bottom) {
+ contents_split_->SetBounds(0, top, width(), bottom - top);
+}
+
+int BrowserView::LayoutExtensionAndDownloadShelves() {
+ // If we're showing the Bookmark bar in detached style, then we need to show
+ // any Info bar _above_ the Bookmark bar, since the Bookmark bar is styled
+ // to look like it's part of the page.
+ int bottom = height();
+ if (extension_shelf_) {
+ if (extension_shelf_->IsDetached()) {
+ bottom = LayoutDownloadShelf(bottom);
+ return LayoutExtensionShelf(bottom);
+ }
+ // Otherwise, Extension shelf first, Download shelf second.
+ bottom = LayoutExtensionShelf(bottom);
+ }
+ return LayoutDownloadShelf(bottom);
+}
+
+int BrowserView::LayoutDownloadShelf(int bottom) {
+ // Re-layout the shelf either if it is visible or if it's close animation
+ // is currently running.
+ if (IsDownloadShelfVisible() ||
+ (download_shelf_.get() && download_shelf_->IsClosing())) {
+ bool visible = browser_->SupportsWindowFeature(
+ Browser::FEATURE_DOWNLOADSHELF);
+ DCHECK(download_shelf_.get());
+ int height = visible ? download_shelf_->GetPreferredSize().height() : 0;
+ download_shelf_->SetVisible(visible);
+ download_shelf_->SetBounds(0, bottom - height, width(), height);
+ download_shelf_->Layout();
+ bottom -= height;
+ }
+ return bottom;
}
void BrowserView::LayoutStatusBubble(int top) {
@@ -1753,6 +1964,22 @@ void BrowserView::LayoutStatusBubble(int top) {
status_bubble_->SetBounds(origin.x(), origin.y(), width() / 3, height);
}
+int BrowserView::LayoutExtensionShelf(int bottom) {
+ if (!extension_shelf_ || extension_shelf_->IsOnTop())
+ return bottom;
+
+ if (extension_shelf_) {
+ bool visible = browser_->SupportsWindowFeature(
+ Browser::FEATURE_EXTENSIONSHELF);
+ int height =
+ visible ? extension_shelf_->GetPreferredSize().height() : 0;
+ extension_shelf_->SetVisible(visible);
+ extension_shelf_->SetBounds(0, bottom - height, width(), height);
+ extension_shelf_->Layout();
+ bottom -= height;
+ }
+ return bottom;
+}
bool BrowserView::MaybeShowBookmarkBar(TabContents* contents) {
views::View* new_bookmark_bar_view = NULL;
diff --git a/chrome/browser/views/frame/browser_view.h b/chrome/browser/views/frame/browser_view.h
index c6dc2ce..651e9c7 100644
--- a/chrome/browser/views/frame/browser_view.h
+++ b/chrome/browser/views/frame/browser_view.h
@@ -36,7 +36,6 @@ class BookmarkBarView;
class Browser;
class BrowserBubble;
class BrowserExtender;
-class BrowserLayoutManager;
class DownloadShelfView;
class EncodingMenuModel;
class ExtensionShelf;
@@ -356,9 +355,6 @@ class BrowserView : public BrowserWindow,
return browser_extender_.get();
}
- // Layout the Status Bubble.
- void LayoutStatusBubble(int top);
-
protected:
// Overridden from views::View:
virtual void Layout();
@@ -375,8 +371,28 @@ class BrowserView : public BrowserWindow,
// Creates the system menu.
void InitSystemMenu();
#endif
- // Returns the BrowserLayoutManager.
- BrowserLayoutManager* GetBrowserLayoutManager() const;
+
+ // Layout the TabStrip, returns the coordinate of the bottom of the TabStrip,
+ // for laying out subsequent controls.
+ int LayoutTabStrip();
+ // Layout the following controls, starting at |top|, returns the coordinate
+ // of the bottom of the control, for laying out the next control.
+ int LayoutToolbar(int top);
+ int LayoutBookmarkAndInfoBars(int top);
+ int LayoutTopBar(int top);
+ int LayoutInfoBar(int top);
+ // Layout the TabContents container, between the coordinates |top| and
+ // |bottom|.
+ void LayoutTabContents(int top, int bottom);
+ int LayoutExtensionAndDownloadShelves();
+ // Layout the Extension Shelf, returns the coordinate of the top of the
+ // control, for laying out the previous control.
+ int LayoutExtensionShelf(int bottom);
+ // Layout the Download Shelf, returns the coordinate of the top of the
+ // control, for laying out the previous control.
+ int LayoutDownloadShelf(int bottom);
+ // Layout the Status Bubble.
+ void LayoutStatusBubble(int top);
// Prepare to show the Bookmark Bar for the specified TabContents. Returns
// true if the Bookmark Bar can be shown (i.e. it's supported for this
@@ -461,6 +477,9 @@ class BrowserView : public BrowserWindow,
// The InfoBarContainer that contains InfoBars for the current tab.
InfoBarContainer* infobar_container_;
+ // The distance the FindBar is from the top of the window, in pixels.
+ int find_bar_y_;
+
// The view that contains the selected TabContents.
TabContentsContainer* contents_container_;