summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoroshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-01-15 18:44:42 +0000
committeroshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-01-15 18:44:42 +0000
commit963dfb5a05c5b0e3fa8ed74d803f01cb10fd455e (patch)
treee3129274a7bb00be5dba7cb7ba383478cfc17316
parent54786db93ab64ce5948ba7a5c0b199146d799cde (diff)
downloadchromium_src-963dfb5a05c5b0e3fa8ed74d803f01cb10fd455e.zip
chromium_src-963dfb5a05c5b0e3fa8ed74d803f01cb10fd455e.tar.gz
chromium_src-963dfb5a05c5b0e3fa8ed74d803f01cb10fd455e.tar.bz2
Factoring out the layout code from browser_view in preparation to implement side bar. (and this will also allow us to clean up browser extender)
- BrowserLayoutManager interface with extra layout methods for BrowserView - ChromeLayoutManager implements the same layout policy as of today. - Added new view IDs so that layout manager can identify comoponents added to the BrowserView. BUG=none TEST=none Committed: http://src.chromium.org/viewvc/chrome?view=rev&revision=36276 Review URL: http://codereview.chromium.org/543035 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@36377 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/gtk/view_id_util_browsertest.cc7
-rw-r--r--chrome/browser/view_ids.h11
-rw-r--r--chrome/browser/views/download_shelf_view.cc2
-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
-rw-r--r--chrome/browser/views/infobars/infobar_container.cc2
-rw-r--r--chrome/browser/views/toolbar_view.cc1
-rwxr-xr-xchrome/chrome_browser.gypi4
10 files changed, 473 insertions, 262 deletions
diff --git a/chrome/browser/gtk/view_id_util_browsertest.cc b/chrome/browser/gtk/view_id_util_browsertest.cc
index ba5fe83..42c9420 100644
--- a/chrome/browser/gtk/view_id_util_browsertest.cc
+++ b/chrome/browser/gtk/view_id_util_browsertest.cc
@@ -41,6 +41,13 @@ IN_PROC_BROWSER_TEST_F(ViewIDTest, Basic) {
if (i == VIEW_ID_DEV_EXTENSION_SHELF)
continue;
+ // The following ids are used only in views implementation.
+ if (i == VIEW_ID_CONTENTS_SPLIT ||
+ i == VIEW_ID_INFO_BAR_CONTAINER ||
+ i == VIEW_ID_DOWNLOAD_SHELF) {
+ continue;
+ }
+
CheckViewID(static_cast<ViewID>(i), true);
}
diff --git a/chrome/browser/view_ids.h b/chrome/browser/view_ids.h
index b495605..0109546 100644
--- a/chrome/browser/view_ids.h
+++ b/chrome/browser/view_ids.h
@@ -61,6 +61,17 @@ enum ViewID {
// Bottom extension shelf.
VIEW_ID_DEV_EXTENSION_SHELF,
+ // The contents split.
+ VIEW_ID_CONTENTS_SPLIT,
+
+ // The Infobar container.
+ VIEW_ID_INFO_BAR_CONTAINER,
+
+ // The Download shelf.
+ VIEW_ID_DOWNLOAD_SHELF,
+
+ // Used in chrome/browser/gtk/view_id_util_browsertests.cc
+ // If you add new ids, make sure the above test passes.
VIEW_ID_PREDEFINED_COUNT
};
diff --git a/chrome/browser/views/download_shelf_view.cc b/chrome/browser/views/download_shelf_view.cc
index 2141a17..6455f3c 100644
--- a/chrome/browser/views/download_shelf_view.cc
+++ b/chrome/browser/views/download_shelf_view.cc
@@ -15,6 +15,7 @@
#include "chrome/browser/download/download_item_model.h"
#include "chrome/browser/download/download_manager.h"
#include "chrome/browser/tab_contents/navigation_entry.h"
+#include "chrome/browser/view_ids.h"
#include "chrome/browser/views/download_item_view.h"
#include "chrome/browser/views/frame/browser_view.h"
#include "grit/generated_resources.h"
@@ -74,6 +75,7 @@ int CenterPosition(int size, int target_size) {
DownloadShelfView::DownloadShelfView(Browser* browser, BrowserView* parent)
: browser_(browser),
parent_(parent) {
+ SetID(VIEW_ID_DOWNLOAD_SHELF);
parent->AddChildView(this);
Init();
}
diff --git a/chrome/browser/views/frame/browser_layout_manager.cc b/chrome/browser/views/frame/browser_layout_manager.cc
new file mode 100644
index 0000000..cdc7ca3
--- /dev/null
+++ b/chrome/browser/views/frame/browser_layout_manager.cc
@@ -0,0 +1,403 @@
+// 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
new file mode 100644
index 0000000..ea73f57
--- /dev/null
+++ b/chrome/browser/views/frame/browser_layout_manager.h
@@ -0,0 +1,27 @@
+// 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 9d0a14e..be8a488 100644
--- a/chrome/browser/views/frame/browser_view.cc
+++ b/chrome/browser/views/frame/browser_view.cc
@@ -27,8 +27,6 @@
#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"
@@ -41,6 +39,7 @@
#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"
@@ -92,16 +91,11 @@ 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)
@@ -412,7 +406,6 @@ BrowserView::BrowserView(Browser* browser)
tabstrip_(NULL),
toolbar_(NULL),
infobar_container_(NULL),
- find_bar_y_(0),
contents_container_(NULL),
devtools_container_(NULL),
contents_split_(NULL),
@@ -533,35 +526,7 @@ bool BrowserView::ShouldFindBarBlendWithBookmarksBar() const {
}
gfx::Rect BrowserView::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 (UILayoutIsRightToLeft())
- bounding_box.set_x(bounding_box.x() + scrollbar_width);
-
- return bounding_box;
+ return GetBrowserLayoutManager()->GetFindBarBoundingBox();
}
int BrowserView::GetTabStripHeight() const {
@@ -1624,32 +1589,7 @@ int BrowserView::NonClientHitTest(const gfx::Point& point) {
}
gfx::Size BrowserView::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);
+ return GetBrowserLayoutManager()->GetMinimumSize();
}
///////////////////////////////////////////////////////////////////////////////
@@ -1662,23 +1602,10 @@ std::string BrowserView::GetClassName() const {
void BrowserView::Layout() {
if (ignore_layout_)
return;
-
- 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);
+ if (GetLayoutManager()) {
+ GetLayoutManager()->Layout(this);
+ SchedulePaint();
}
- // Align status bubble with the bottom of the contents_container_.
- LayoutStatusBubble(top + contents_container_->bounds().height());
- SchedulePaint();
}
void BrowserView::ViewHierarchyChanged(bool is_add,
@@ -1719,6 +1646,7 @@ 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)
@@ -1745,7 +1673,6 @@ 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));
@@ -1760,6 +1687,7 @@ 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(
@@ -1810,147 +1738,8 @@ void BrowserView::InitSystemMenu() {
}
#endif
-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;
+BrowserLayoutManager* BrowserView::GetBrowserLayoutManager() const {
+ return static_cast<BrowserLayoutManager*>(GetLayoutManager());
}
void BrowserView::LayoutStatusBubble(int top) {
@@ -1964,22 +1753,6 @@ 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 651e9c7..c6dc2ce 100644
--- a/chrome/browser/views/frame/browser_view.h
+++ b/chrome/browser/views/frame/browser_view.h
@@ -36,6 +36,7 @@ class BookmarkBarView;
class Browser;
class BrowserBubble;
class BrowserExtender;
+class BrowserLayoutManager;
class DownloadShelfView;
class EncodingMenuModel;
class ExtensionShelf;
@@ -355,6 +356,9 @@ class BrowserView : public BrowserWindow,
return browser_extender_.get();
}
+ // Layout the Status Bubble.
+ void LayoutStatusBubble(int top);
+
protected:
// Overridden from views::View:
virtual void Layout();
@@ -371,28 +375,8 @@ class BrowserView : public BrowserWindow,
// Creates the system menu.
void InitSystemMenu();
#endif
-
- // 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);
+ // Returns the BrowserLayoutManager.
+ BrowserLayoutManager* GetBrowserLayoutManager() const;
// 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
@@ -477,9 +461,6 @@ 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_;
diff --git a/chrome/browser/views/infobars/infobar_container.cc b/chrome/browser/views/infobars/infobar_container.cc
index 792729b..3e91d36 100644
--- a/chrome/browser/views/infobars/infobar_container.cc
+++ b/chrome/browser/views/infobars/infobar_container.cc
@@ -6,6 +6,7 @@
#include "chrome/browser/tab_contents/infobar_delegate.h"
#include "chrome/browser/tab_contents/tab_contents.h"
+#include "chrome/browser/view_ids.h"
#include "chrome/browser/views/frame/browser_view.h"
#include "chrome/browser/views/infobars/infobars.h"
#include "chrome/common/notification_service.h"
@@ -15,6 +16,7 @@
InfoBarContainer::InfoBarContainer(BrowserView* browser_view)
: browser_view_(browser_view),
tab_contents_(NULL) {
+ SetID(VIEW_ID_INFO_BAR_CONTAINER);
}
InfoBarContainer::~InfoBarContainer() {
diff --git a/chrome/browser/views/toolbar_view.cc b/chrome/browser/views/toolbar_view.cc
index 5f47284..71037bb 100644
--- a/chrome/browser/views/toolbar_view.cc
+++ b/chrome/browser/views/toolbar_view.cc
@@ -93,6 +93,7 @@ ToolbarView::ToolbarView(Browser* browser)
profile_(NULL),
browser_(browser),
profiles_menu_contents_(NULL) {
+ SetID(VIEW_ID_TOOLBAR);
browser_->command_updater()->AddCommandObserver(IDC_BACK, this);
browser_->command_updater()->AddCommandObserver(IDC_FORWARD, this);
browser_->command_updater()->AddCommandObserver(IDC_RELOAD, this);
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index a4d10ab..287324c 100755
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -1722,6 +1722,8 @@
'browser/views/frame/browser_frame_gtk.h',
'browser/views/frame/browser_frame_win.cc',
'browser/views/frame/browser_frame_win.h',
+ 'browser/views/frame/browser_layout_manager.cc',
+ 'browser/views/frame/browser_layout_manager.h',
'browser/views/frame/browser_non_client_frame_view.h',
'browser/views/frame/browser_root_view.cc',
'browser/views/frame/browser_root_view.h',
@@ -2260,6 +2262,8 @@
['include', '^browser/views/toolbar_star_toggle.cc'],
['include', '^browser/views/frame/browser_extender.cc'],
['include', '^browser/views/frame/browser_extender.h'],
+ ['include', '^browser/views/frame/browser_layout_manager.cc'],
+ ['include', '^browser/views/frame/browser_layout_manager.h'],
['include', '^browser/views/frame/browser_view.cc'],
['include', '^browser/views/frame/browser_view.h'],
['include', '^browser/views/frame/browser_frame_gtk.cc'],