Home | History | Annotate | Download | only in sidebar
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_SIDEBAR_SIDEBAR_MANAGER_H_
      6 #define CHROME_BROWSER_SIDEBAR_SIDEBAR_MANAGER_H_
      7 
      8 #include <map>
      9 #include <string>
     10 
     11 #include "base/memory/ref_counted.h"
     12 #include "base/string16.h"
     13 #include "chrome/browser/sidebar/sidebar_container.h"
     14 #include "content/common/notification_observer.h"
     15 #include "content/common/notification_registrar.h"
     16 
     17 class GURL;
     18 class PrefService;
     19 class Profile;
     20 class SidebarContainer;
     21 class SkBitmap;
     22 class TabContents;
     23 
     24 ///////////////////////////////////////////////////////////////////////////////
     25 // SidebarManager
     26 //
     27 //  This class is a singleton that manages SidebarContainer instances and
     28 //  maintains a connection between tabs and sidebars.
     29 //
     30 class SidebarManager : public NotificationObserver,
     31                        public base::RefCounted<SidebarManager>,
     32                        private SidebarContainer::Delegate {
     33  public:
     34   // Returns s singleton instance.
     35   static SidebarManager* GetInstance();
     36 
     37   // Returns true if sidebar is allowed to be displayed in the browser.
     38   static bool IsSidebarAllowed();
     39 
     40   SidebarManager();
     41 
     42   // Returns SidebarContainer registered for |tab| and active or NULL if
     43   // there is no alive and active SidebarContainer registered for |tab|.
     44   SidebarContainer* GetActiveSidebarContainerFor(TabContents* tab);
     45 
     46   // Returns SidebarContainer registered for |tab| and |content_id| or NULL if
     47   // there is no such SidebarContainer registered.
     48   SidebarContainer* GetSidebarContainerFor(TabContents* tab,
     49                                            const std::string& content_id);
     50 
     51   // Returns sidebar's TabContents registered for |tab| and |content_id|.
     52   TabContents* GetSidebarTabContents(TabContents* tab,
     53                                      const std::string& content_id);
     54 
     55   // Sends sidebar state change notification to extensions.
     56   void NotifyStateChanges(TabContents* was_active_sidebar_contents,
     57                           TabContents* active_sidebar_contents);
     58 
     59   // Functions supporting chrome.experimental.sidebar API.
     60 
     61   // Shows sidebar identified by |tab| and |content_id| (only sidebar's
     62   // mini tab is visible).
     63   void ShowSidebar(TabContents* tab, const std::string& content_id);
     64 
     65   // Expands sidebar identified by |tab| and |content_id|.
     66   void ExpandSidebar(TabContents* tab, const std::string& content_id);
     67 
     68   // Collapses sidebar identified by |tab| and |content_id| (has no effect
     69   // if sidebar is not expanded).
     70   void CollapseSidebar(TabContents* tab, const std::string& content_id);
     71 
     72   // Hides sidebar identified by |tab| and |content_id| (removes sidebar's
     73   // mini tab).
     74   void HideSidebar(TabContents* tab, const std::string& content_id);
     75 
     76   // Navigates sidebar identified by |tab| and |content_id| to |url|.
     77   void NavigateSidebar(TabContents* tab,
     78                        const std::string& content_id,
     79                        const GURL& url);
     80 
     81   // Changes sidebar's badge text (displayed on the mini tab).
     82   void SetSidebarBadgeText(TabContents* tab,
     83                            const std::string& content_id,
     84                            const string16& badge_text);
     85 
     86   // Changes sidebar's icon (displayed on the mini tab).
     87   void SetSidebarIcon(TabContents* tab,
     88                       const std::string& content_id,
     89                       const SkBitmap& bitmap);
     90 
     91   // Changes sidebar's title (mini tab's tooltip).
     92   void SetSidebarTitle(TabContents* tab,
     93                        const std::string& content_id,
     94                        const string16& title);
     95 
     96  private:
     97   friend class base::RefCounted<SidebarManager>;
     98 
     99   virtual ~SidebarManager();
    100 
    101   // Overridden from NotificationObserver.
    102   virtual void Observe(NotificationType type,
    103                        const NotificationSource& source,
    104                        const NotificationDetails& details);
    105 
    106   // Overridden from SidebarContainer::Delegate.
    107   virtual void UpdateSidebar(SidebarContainer* host);
    108 
    109   // Hides all sidebars registered for |tab|.
    110   void HideAllSidebars(TabContents* tab);
    111 
    112   // Returns SidebarContainer corresponding to |sidebar_contents|.
    113   SidebarContainer* FindSidebarContainerFor(TabContents* sidebar_contents);
    114 
    115   // Registers new SidebarContainer for |tab|. There must be no
    116   // other SidebarContainers registered for the RenderViewHost at the moment.
    117   void RegisterSidebarContainerFor(TabContents* tab,
    118                                    SidebarContainer* container);
    119 
    120   // Unregisters SidebarContainer identified by |tab| and |content_id|.
    121   void UnregisterSidebarContainerFor(TabContents* tab,
    122                                      const std::string& content_id);
    123 
    124   // Records the link between |tab| and |sidebar_host|.
    125   void BindSidebarHost(TabContents* tab, SidebarContainer* sidebar_host);
    126 
    127   // Forgets the link between |tab| and |sidebar_host|.
    128   void UnbindSidebarHost(TabContents* tab, SidebarContainer* sidebar_host);
    129 
    130   NotificationRegistrar registrar_;
    131 
    132   // This map stores sidebars linked to a particular tab. Sidebars are
    133   // identified by their unique content id (string).
    134   typedef std::map<std::string, SidebarContainer*> ContentIdToSidebarHostMap;
    135 
    136   // These two maps are for tracking dependencies between tabs and
    137   // their SidebarContainers.
    138   //
    139   // SidebarManager start listening to SidebarContainers when they are put
    140   // into these maps and removes them when they are closing.
    141   struct SidebarStateForTab;
    142   typedef std::map<TabContents*, SidebarStateForTab> TabToSidebarHostMap;
    143   TabToSidebarHostMap tab_to_sidebar_host_;
    144 
    145   typedef std::map<SidebarContainer*, TabContents*> SidebarHostToTabMap;
    146   SidebarHostToTabMap sidebar_host_to_tab_;
    147 
    148   DISALLOW_COPY_AND_ASSIGN(SidebarManager);
    149 };
    150 
    151 #endif  // CHROME_BROWSER_SIDEBAR_SIDEBAR_MANAGER_H_
    152 
    153