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(); |