// Copyright (c) 2011 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_SIDEBAR_SIDEBAR_MANAGER_H_
#define CHROME_BROWSER_SIDEBAR_SIDEBAR_MANAGER_H_
#include <map>
#include <string>
#include "base/memory/ref_counted.h"
#include "base/string16.h"
#include "chrome/browser/sidebar/sidebar_container.h"
#include "content/common/notification_observer.h"
#include "content/common/notification_registrar.h"
class GURL;
class PrefService;
class Profile;
class SidebarContainer;
class SkBitmap;
class TabContents;
///////////////////////////////////////////////////////////////////////////////
// SidebarManager
//
// This class is a singleton that manages SidebarContainer instances and
// maintains a connection between tabs and sidebars.
//
class SidebarManager : public NotificationObserver,
public base::RefCounted<SidebarManager>,
private SidebarContainer::Delegate {
public:
// Returns s singleton instance.
static SidebarManager* GetInstance();
// Returns true if sidebar is allowed to be displayed in the browser.
static bool IsSidebarAllowed();
SidebarManager();
// Returns SidebarContainer registered for |tab| and active or NULL if
// there is no alive and active SidebarContainer registered for |tab|.
SidebarContainer* GetActiveSidebarContainerFor(TabContents* tab);
// Returns SidebarContainer registered for |tab| and |content_id| or NULL if
// there is no such SidebarContainer registered.
SidebarContainer* GetSidebarContainerFor(TabContents* tab,
const std::string& content_id);
// Returns sidebar's TabContents registered for |tab| and |content_id|.
TabContents* GetSidebarTabContents(TabContents* tab,
const std::string& content_id);
// Sends sidebar state change notification to extensions.
void NotifyStateChanges(TabContents* was_active_sidebar_contents,
TabContents* active_sidebar_contents);
// Functions supporting chrome.experimental.sidebar API.
// Shows sidebar identified by |tab| and |content_id| (only sidebar's
// mini tab is visible).
void ShowSidebar(TabContents* tab, const std::string& content_id);
// Expands sidebar identified by |tab| and |content_id|.
void ExpandSidebar(TabContents* tab, const std::string& content_id);
// Collapses sidebar identified by |tab| and |content_id| (has no effect
// if sidebar is not expanded).
void CollapseSidebar(TabContents* tab, const std::string& content_id);
// Hides sidebar identified by |tab| and |content_id| (removes sidebar's
// mini tab).
void HideSidebar(TabContents* tab, const std::string& content_id);
// Navigates sidebar identified by |tab| and |content_id| to |url|.
void NavigateSidebar(TabContents* tab,
const std::string& content_id,
const GURL& url);
// Changes sidebar's badge text (displayed on the mini tab).
void SetSidebarBadgeText(TabContents* tab,
const std::string& content_id,
const string16& badge_text);
// Changes sidebar's icon (displayed on the mini tab).
void SetSidebarIcon(TabContents* tab,
const std::string& content_id,
const SkBitmap& bitmap);
// Changes sidebar's title (mini tab's tooltip).
void SetSidebarTitle(TabContents* tab,
const std::string& content_id,
const string16& title);
private:
friend class base::RefCounted<SidebarManager>;
virtual ~SidebarManager();
// Overridden from NotificationObserver.
virtual void Observe(NotificationType type,
const NotificationSource& source,
const NotificationDetails& details);
// Overridden from SidebarContainer::Delegate.
virtual void UpdateSidebar(SidebarContainer* host);
// Hides all sidebars registered for |tab|.
void HideAllSidebars(TabContents* tab);
// Returns SidebarContainer corresponding to |sidebar_contents|.
SidebarContainer* FindSidebarContainerFor(TabContents* sidebar_contents);
// Registers new SidebarContainer for |tab|. There must be no
// other SidebarContainers registered for the RenderViewHost at the moment.
void RegisterSidebarContainerFor(TabContents* tab,
SidebarContainer* container);
// Unregisters SidebarContainer identified by |tab| and |content_id|.
void UnregisterSidebarContainerFor(TabContents* tab,
const std::string& content_id);
// Records the link between |tab| and |sidebar_host|.
void BindSidebarHost(TabContents* tab, SidebarContainer* sidebar_host);
// Forgets the link between |tab| and |sidebar_host|.
void UnbindSidebarHost(TabContents* tab, SidebarContainer* sidebar_host);
NotificationRegistrar registrar_;
// This map stores sidebars linked to a particular tab. Sidebars are
// identified by their unique content id (string).
typedef std::map<std::string, SidebarContainer*> ContentIdToSidebarHostMap;
// These two maps are for tracking dependencies between tabs and
// their SidebarContainers.
//
// SidebarManager start listening to SidebarContainers when they are put
// into these maps and removes them when they are closing.
struct SidebarStateForTab;
typedef std::map<TabContents*, SidebarStateForTab> TabToSidebarHostMap;
TabToSidebarHostMap tab_to_sidebar_host_;
typedef std::map<SidebarContainer*, TabContents*> SidebarHostToTabMap;
SidebarHostToTabMap sidebar_host_to_tab_;
DISALLOW_COPY_AND_ASSIGN(SidebarManager);
};
#endif // CHROME_BROWSER_SIDEBAR_SIDEBAR_MANAGER_H_