Home | History | Annotate | Download | only in tabs
      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_UI_VIEWS_TABS_BROWSER_TAB_STRIP_CONTROLLER_H_
      6 #define CHROME_BROWSER_UI_VIEWS_TABS_BROWSER_TAB_STRIP_CONTROLLER_H_
      7 #pragma once
      8 
      9 #include "base/memory/scoped_ptr.h"
     10 #include "chrome/browser/tabs/tab_strip_model.h"
     11 #include "chrome/browser/ui/views/tabs/tab_strip_controller.h"
     12 #include "content/common/notification_observer.h"
     13 #include "content/common/notification_registrar.h"
     14 
     15 class BaseTab;
     16 class BaseTabStrip;
     17 class Browser;
     18 
     19 struct TabRendererData;
     20 
     21 // An implementation of TabStripController that sources data from the
     22 // TabContentsWrappers in a TabStripModel.
     23 class BrowserTabStripController : public TabStripController,
     24                                   public TabStripModelObserver,
     25                                   public NotificationObserver {
     26  public:
     27   BrowserTabStripController(Browser* browser, TabStripModel* model);
     28   virtual ~BrowserTabStripController();
     29 
     30   void InitFromModel(BaseTabStrip* tabstrip);
     31 
     32   TabStripModel* model() const { return model_; }
     33 
     34   bool IsCommandEnabledForTab(TabStripModel::ContextMenuCommand command_id,
     35                               BaseTab* tab) const;
     36   bool IsCommandCheckedForTab(TabStripModel::ContextMenuCommand command_id,
     37                               BaseTab* tab) const;
     38   void ExecuteCommandForTab(TabStripModel::ContextMenuCommand command_id,
     39                             BaseTab* tab);
     40   bool IsTabPinned(BaseTab* tab) const;
     41 
     42   // TabStripController implementation:
     43   virtual int GetCount() const OVERRIDE;
     44   virtual bool IsValidIndex(int model_index) const OVERRIDE;
     45   virtual bool IsActiveTab(int model_index) const;
     46   virtual bool IsTabSelected(int model_index) const OVERRIDE;
     47   virtual bool IsTabPinned(int model_index) const OVERRIDE;
     48   virtual bool IsTabCloseable(int model_index) const OVERRIDE;
     49   virtual bool IsNewTabPage(int model_index) const OVERRIDE;
     50   virtual void SelectTab(int model_index) OVERRIDE;
     51   virtual void ExtendSelectionTo(int model_index) OVERRIDE;
     52   virtual void ToggleSelected(int model_index) OVERRIDE;
     53   virtual void AddSelectionFromAnchorTo(int model_index) OVERRIDE;
     54   virtual void CloseTab(int model_index) OVERRIDE;
     55   virtual void ShowContextMenuForTab(BaseTab* tab,
     56                                      const gfx::Point& p) OVERRIDE;
     57   virtual void UpdateLoadingAnimations() OVERRIDE;
     58   virtual int HasAvailableDragActions() const OVERRIDE;
     59   virtual void PerformDrop(bool drop_before,
     60                            int index,
     61                            const GURL& url) OVERRIDE;
     62   virtual bool IsCompatibleWith(BaseTabStrip* other) const OVERRIDE;
     63   virtual void CreateNewTab() OVERRIDE;
     64 
     65   // TabStripModelObserver implementation:
     66   virtual void TabInsertedAt(TabContentsWrapper* contents,
     67                              int model_index,
     68                              bool active) OVERRIDE;
     69   virtual void TabDetachedAt(TabContentsWrapper* contents,
     70                              int model_index) OVERRIDE;
     71   virtual void TabSelectedAt(TabContentsWrapper* old_contents,
     72                              TabContentsWrapper* contents,
     73                              int model_index,
     74                              bool user_gesture) OVERRIDE;
     75   virtual void TabMoved(TabContentsWrapper* contents,
     76                         int from_model_index,
     77                         int to_model_index) OVERRIDE;
     78   virtual void TabChangedAt(TabContentsWrapper* contents,
     79                             int model_index,
     80                             TabChangeType change_type) OVERRIDE;
     81   virtual void TabReplacedAt(TabStripModel* tab_strip_model,
     82                              TabContentsWrapper* old_contents,
     83                              TabContentsWrapper* new_contents,
     84                              int model_index) OVERRIDE;
     85   virtual void TabPinnedStateChanged(TabContentsWrapper* contents,
     86                                      int model_index) OVERRIDE;
     87   virtual void TabMiniStateChanged(TabContentsWrapper* contents,
     88                                    int model_index) OVERRIDE;
     89   virtual void TabBlockedStateChanged(TabContentsWrapper* contents,
     90                                       int model_index) OVERRIDE;
     91 
     92   // NotificationObserver implementation:
     93   virtual void Observe(NotificationType type,
     94                        const NotificationSource& source,
     95                        const NotificationDetails& details) OVERRIDE;
     96 
     97  private:
     98   class TabContextMenuContents;
     99 
    100   // Invokes tabstrip_->SetTabData.
    101   void SetTabDataAt(TabContentsWrapper* contents, int model_index);
    102 
    103   // Sets the TabRendererData from the TabStripModel.
    104   void SetTabRendererDataFromModel(TabContents* contents,
    105                                    int model_index,
    106                                    TabRendererData* data);
    107 
    108   void StartHighlightTabsForCommand(
    109       TabStripModel::ContextMenuCommand command_id,
    110       BaseTab* tab);
    111   void StopHighlightTabsForCommand(
    112       TabStripModel::ContextMenuCommand command_id,
    113       BaseTab* tab);
    114 
    115   Profile* profile() const { return model_->profile(); }
    116 
    117   TabStripModel* model_;
    118 
    119   BaseTabStrip* tabstrip_;
    120 
    121   // Non-owning pointer to the browser which is using this controller.
    122   Browser* browser_;
    123 
    124   // If non-NULL it means we're showing a menu for the tab.
    125   scoped_ptr<TabContextMenuContents> context_menu_contents_;
    126 
    127   NotificationRegistrar notification_registrar_;
    128 
    129   DISALLOW_COPY_AND_ASSIGN(BrowserTabStripController);
    130 };
    131 
    132 #endif  // CHROME_BROWSER_UI_VIEWS_TABS_BROWSER_TAB_STRIP_CONTROLLER_H_
    133 
    134