browser_tab_strip_controller.h revision dc0f95d653279beabeb9817299e2902918ba123e
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/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 "chrome/common/notification_observer.h"
13#include "chrome/common/notification_registrar.h"
14
15class BaseTab;
16class BaseTabStrip;
17class Browser;
18
19struct TabRendererData;
20
21// An implementation of TabStripController that sources data from the
22// TabContentsWrappers in a TabStripModel.
23class 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;
44  virtual bool IsValidIndex(int model_index) const;
45  virtual bool IsTabSelected(int model_index) const;
46  virtual bool IsTabPinned(int model_index) const;
47  virtual bool IsTabCloseable(int model_index) const;
48  virtual bool IsNewTabPage(int model_index) const;
49  virtual void SelectTab(int model_index);
50  virtual void CloseTab(int model_index);
51  virtual void ShowContextMenuForTab(BaseTab* tab, const gfx::Point& p);
52  virtual void UpdateLoadingAnimations();
53  virtual int HasAvailableDragActions() const;
54  virtual void PerformDrop(bool drop_before, int index, const GURL& url);
55  virtual bool IsCompatibleWith(BaseTabStrip* other) const;
56  virtual void CreateNewTab();
57
58  // TabStripModelObserver implementation:
59  virtual void TabInsertedAt(TabContentsWrapper* contents,
60                             int model_index,
61                             bool foreground);
62  virtual void TabDetachedAt(TabContentsWrapper* contents, int model_index);
63  virtual void TabSelectedAt(TabContentsWrapper* old_contents,
64                             TabContentsWrapper* contents,
65                             int model_index,
66                             bool user_gesture);
67  virtual void TabMoved(TabContentsWrapper* contents,
68                        int from_model_index,
69                        int to_model_index);
70  virtual void TabChangedAt(TabContentsWrapper* contents,
71                            int model_index,
72                            TabChangeType change_type);
73  virtual void TabReplacedAt(TabStripModel* tab_strip_model,
74                             TabContentsWrapper* old_contents,
75                             TabContentsWrapper* new_contents,
76                             int model_index);
77  virtual void TabPinnedStateChanged(TabContentsWrapper* contents,
78                                     int model_index);
79  virtual void TabMiniStateChanged(TabContentsWrapper* contents,
80                                   int model_index);
81  virtual void TabBlockedStateChanged(TabContentsWrapper* contents,
82                                      int model_index);
83
84  // NotificationObserver implementation:
85  virtual void Observe(NotificationType type, const NotificationSource& source,
86                       const NotificationDetails& details);
87
88 private:
89  class TabContextMenuContents;
90
91  // Invokes tabstrip_->SetTabData.
92  void SetTabDataAt(TabContentsWrapper* contents, int model_index);
93
94  // Sets the TabRendererData from the TabStripModel.
95  void SetTabRendererDataFromModel(TabContents* contents,
96                                   int model_index,
97                                   TabRendererData* data);
98
99  void StartHighlightTabsForCommand(
100      TabStripModel::ContextMenuCommand command_id,
101      BaseTab* tab);
102  void StopHighlightTabsForCommand(
103      TabStripModel::ContextMenuCommand command_id,
104      BaseTab* tab);
105
106  Profile* profile() const { return model_->profile(); }
107
108  TabStripModel* model_;
109
110  BaseTabStrip* tabstrip_;
111
112  // Non-owning pointer to the browser which is using this controller.
113  Browser* browser_;
114
115  // If non-NULL it means we're showing a menu for the tab.
116  scoped_ptr<TabContextMenuContents> context_menu_contents_;
117
118  NotificationRegistrar notification_registrar_;
119
120  DISALLOW_COPY_AND_ASSIGN(BrowserTabStripController);
121};
122
123#endif  // CHROME_BROWSER_UI_VIEWS_TABS_BROWSER_TAB_STRIP_CONTROLLER_H_
124
125