| Index: chrome/browser/ui/views/frame/browser_view.cc
|
| ===================================================================
|
| --- chrome/browser/ui/views/frame/browser_view.cc (revision 74134)
|
| +++ chrome/browser/ui/views/frame/browser_view.cc (working copy)
|
| @@ -51,6 +51,9 @@
|
| #include "chrome/browser/ui/views/frame/contents_container.h"
|
| #include "chrome/browser/ui/views/fullscreen_exit_bubble.h"
|
| #include "chrome/browser/ui/views/location_bar/location_icon_view.h"
|
| +#include "chrome/browser/ui/views/sidebar/browser_sidebar_tab_strip_controller.h"
|
| +#include "chrome/browser/ui/views/sidebar/sidebar_tab_strip.h"
|
| +#include "chrome/browser/ui/views/sidebar/sidebar_tab_strip_host.h"
|
| #include "chrome/browser/ui/views/status_bubble_views.h"
|
| #include "chrome/browser/ui/views/tab_contents/tab_contents_container.h"
|
| #include "chrome/browser/ui/views/tabs/browser_tab_strip_controller.h"
|
| @@ -66,6 +69,7 @@
|
| #include "chrome/common/notification_service.h"
|
| #include "chrome/common/pref_names.h"
|
| #include "chrome/common/url_constants.h"
|
| +#include "gfx/path.h"
|
| #include "grit/app_resources.h"
|
| #include "grit/chromium_strings.h"
|
| #include "grit/generated_resources.h"
|
| @@ -437,6 +441,7 @@
|
| infobar_container_(NULL),
|
| sidebar_container_(NULL),
|
| sidebar_split_(NULL),
|
| + sidebar_tabstrip_controller_(NULL),
|
| contents_container_(NULL),
|
| devtools_container_(NULL),
|
| preview_container_(NULL),
|
| @@ -589,7 +594,10 @@
|
| int BrowserView::GetSidebarWidth() const {
|
| if (!sidebar_container_ || !sidebar_container_->IsVisible())
|
| return 0;
|
| - return sidebar_split_->divider_offset();
|
| + int sidebar_width = base::i18n::IsRTL() ?
|
| + sidebar_split_->divider_offset() :
|
| + sidebar_split_->width() - sidebar_split_->divider_offset();
|
| + return sidebar_width;
|
| }
|
|
|
| bool BrowserView::IsTabStripVisible() const {
|
| @@ -1429,9 +1437,9 @@
|
| break;
|
|
|
| case NotificationType::SIDEBAR_CHANGED:
|
| - if (Details<SidebarContainer>(details)->tab_contents() ==
|
| - browser_->GetSelectedTabContents()) {
|
| - UpdateSidebar();
|
| + if (Details<SidebarChangedDetails>(details)->source->tab() ==
|
| + GetSelectedTabContentsWrapper()) {
|
| + UpdateSidebar(Details<SidebarChangedDetails>(details).ptr());
|
| }
|
| break;
|
|
|
| @@ -1826,6 +1834,11 @@
|
| return false;
|
| }
|
|
|
| +void BrowserView::OnSidebarTabStripBoundsChanged(bool is_animating) {
|
| + sidebar_tabstrip_host_->UpdateWindowEdges();
|
| + Layout();
|
| +}
|
| +
|
| views::LayoutManager* BrowserView::CreateLayoutManager() const {
|
| return new BrowserViewLayout;
|
| }
|
| @@ -1848,6 +1861,26 @@
|
| tabstrip_controller->InitFromModel(tabstrip_);
|
| }
|
|
|
| +void BrowserView::InitSidebarTabStrip() {
|
| + if (sidebar_tabstrip_controller_)
|
| + return;
|
| +
|
| + sidebar_tabstrip_controller_ =
|
| + new BrowserSidebarTabStripController(SidebarManager::GetInstance(), this);
|
| +
|
| + // Create a new sidebar tab strip and pass controller's ownership to it.
|
| + SidebarTabStrip* sidebar_tabstrip =
|
| + new SidebarTabStrip(sidebar_tabstrip_controller_);
|
| + sidebar_tabstrip->SetAccessibleName(
|
| + l10n_util::GetStringUTF16(IDS_ACCNAME_SIDEBAR_TABSTRIP));
|
| +
|
| + sidebar_tabstrip_host_.reset(new SidebarTabStripHost(this));
|
| + // Pass sidebar_tabstrip ownership to sidebar_tabstrip_host_.
|
| + sidebar_tabstrip_host_->Init(sidebar_tabstrip);
|
| +
|
| + sidebar_tabstrip_controller_->set_tab_strip(sidebar_tabstrip);
|
| +}
|
| +
|
| ///////////////////////////////////////////////////////////////////////////////
|
| // BrowserView, private:
|
|
|
| @@ -1891,19 +1924,26 @@
|
| bool sidebar_allowed = SidebarManager::IsSidebarAllowed();
|
| if (sidebar_allowed) {
|
| sidebar_container_ = new TabContentsContainer;
|
| - sidebar_container_->SetID(VIEW_ID_SIDE_BAR_CONTAINER);
|
| + sidebar_container_->SetID(VIEW_ID_SIDEBAR_CONTAINER);
|
| sidebar_container_->SetVisible(false);
|
|
|
| + views::View* leading_view = contents_;
|
| + views::View* trailing_view = sidebar_container_;
|
| + // Sidebar ought to stay on the right side of the browser window, where main
|
| + // page scrollbar is rendered.
|
| + if (base::i18n::IsRTL())
|
| + std::swap(leading_view, trailing_view);
|
| sidebar_split_ = new views::SingleSplitView(
|
| - contents_,
|
| - sidebar_container_,
|
| + leading_view,
|
| + trailing_view,
|
| views::SingleSplitView::HORIZONTAL_SPLIT,
|
| this);
|
| - sidebar_split_->SetID(VIEW_ID_SIDE_BAR_SPLIT);
|
| + sidebar_split_->SetID(VIEW_ID_SIDEBAR_SPLIT);
|
| sidebar_split_->SetAccessibleName(
|
| - l10n_util::GetStringUTF16(IDS_ACCNAME_SIDE_BAR));
|
| + l10n_util::GetStringUTF16(IDS_ACCNAME_SIDEBAR));
|
| sidebar_split_->set_background(
|
| views::Background::CreateSolidBackground(bg_color));
|
| + sidebar_split_->set_resize_leading_on_bounds_change(!base::i18n::IsRTL());
|
| }
|
|
|
| devtools_container_ = new TabContentsContainer;
|
| @@ -2023,21 +2063,36 @@
|
| return true;
|
| }
|
|
|
| -void BrowserView::UpdateSidebar() {
|
| - UpdateSidebarForContents(GetSelectedTabContentsWrapper());
|
| - Layout();
|
| +void BrowserView::UpdateSidebar(SidebarChangedDetails* details) {
|
| + DCHECK(GetSelectedTabContentsWrapper() == details->source->tab());
|
| + InitSidebarTabStrip();
|
| + switch (details->update_type) {
|
| + case SidebarChangedDetails::SIDEBAR_STATE_CHANGED:
|
| + UpdateSidebarForContents(details->source->tab());
|
| + break;
|
| + case SidebarChangedDetails::SIDEBAR_PROPS_CHANGED:
|
| + sidebar_tabstrip_controller_->UpdateState(details->source);
|
| + break;
|
| + case SidebarChangedDetails::SIDEBAR_LOADING_STATE_CHANGED:
|
| + sidebar_tabstrip_controller_->UpdateLoadingState(details->source);
|
| + break;
|
| + default:
|
| + NOTREACHED();
|
| + }
|
| }
|
|
|
| -void BrowserView::UpdateSidebarForContents(TabContentsWrapper* tab_contents) {
|
| +void BrowserView::UpdateSidebarForContents(TabContentsWrapper* tab) {
|
| if (!sidebar_container_)
|
| return; // Happens when sidebar is not allowed.
|
| if (!SidebarManager::GetInstance())
|
| return; // Happens only in tests.
|
|
|
| + TabContents* tab_contents = tab ? tab->tab_contents() : NULL;
|
| +
|
| TabContents* sidebar_contents = NULL;
|
| if (tab_contents) {
|
| SidebarContainer* client_host = SidebarManager::GetInstance()->
|
| - GetActiveSidebarContainerFor(tab_contents->tab_contents());
|
| + GetActiveSidebarContainerFor(tab);
|
| if (client_host)
|
| sidebar_contents = client_host->sidebar_contents();
|
| }
|
| @@ -2054,6 +2109,12 @@
|
| SidebarManager::GetInstance()->
|
| NotifyStateChanges(old_contents, sidebar_contents);
|
|
|
| + // Lazy initialize sidebar tabstrip.
|
| + if (SidebarManager::GetInstance()->IsAnySidebarDefinedFor(tab))
|
| + InitSidebarTabStrip();
|
| + if (sidebar_tabstrip_controller_)
|
| + sidebar_tabstrip_controller_->UpdateTabs(tab);
|
| +
|
| // Update sidebar UI width.
|
| if (should_show) {
|
| // Restore split offset.
|
| @@ -2068,17 +2129,21 @@
|
| sidebar_width = std::min(sidebar_split_->width() - min_sidebar_width,
|
| std::max(min_sidebar_width, sidebar_width));
|
|
|
| - sidebar_split_->set_divider_offset(
|
| - sidebar_split_->width() - sidebar_width);
|
| + int divider_offset = base::i18n::IsRTL() ?
|
| + sidebar_width : (sidebar_split_->width() - sidebar_width);
|
| + sidebar_split_->set_divider_offset(divider_offset);
|
|
|
| sidebar_container_->SetVisible(true);
|
| sidebar_split_->InvalidateLayout();
|
| Layout();
|
| } else if (should_hide) {
|
| // Store split offset when hiding sidebar only.
|
| + int sidebar_width = base::i18n::IsRTL() ?
|
| + sidebar_split_->divider_offset() :
|
| + sidebar_split_->width() - sidebar_split_->divider_offset();
|
| +
|
| g_browser_process->local_state()->SetInteger(
|
| - prefs::kExtensionSidebarWidth,
|
| - sidebar_split_->width() - sidebar_split_->divider_offset());
|
| + prefs::kExtensionSidebarWidth, sidebar_width);
|
|
|
| sidebar_container_->SetVisible(false);
|
| sidebar_split_->InvalidateLayout();
|
|
|