diff options
author | oshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-01-15 18:44:42 +0000 |
---|---|---|
committer | oshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-01-15 18:44:42 +0000 |
commit | 963dfb5a05c5b0e3fa8ed74d803f01cb10fd455e (patch) | |
tree | e3129274a7bb00be5dba7cb7ba383478cfc17316 | |
parent | 54786db93ab64ce5948ba7a5c0b199146d799cde (diff) | |
download | chromium_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.cc | 7 | ||||
-rw-r--r-- | chrome/browser/view_ids.h | 11 | ||||
-rw-r--r-- | chrome/browser/views/download_shelf_view.cc | 2 | ||||
-rw-r--r-- | chrome/browser/views/frame/browser_layout_manager.cc | 403 | ||||
-rw-r--r-- | chrome/browser/views/frame/browser_layout_manager.h | 27 | ||||
-rw-r--r-- | chrome/browser/views/frame/browser_view.cc | 247 | ||||
-rw-r--r-- | chrome/browser/views/frame/browser_view.h | 31 | ||||
-rw-r--r-- | chrome/browser/views/infobars/infobar_container.cc | 2 | ||||
-rw-r--r-- | chrome/browser/views/toolbar_view.cc | 1 | ||||
-rwxr-xr-x | chrome/chrome_browser.gypi | 4 |
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'], |