Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(200)

Unified Diff: chrome/browser/ui/views/frame/browser_view.cc

Issue 6250141: Sidebar mini tabs UI (views version).... Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/ui/views/frame/browser_view.h ('k') | chrome/browser/ui/views/frame/browser_view_layout.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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();
« no previous file with comments | « chrome/browser/ui/views/frame/browser_view.h ('k') | chrome/browser/ui/views/frame/browser_view_layout.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698