browser_tab_strip_controller.h revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
1// Copyright (c) 2012 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
8#include "base/compiler_specific.h"
9#include "base/memory/scoped_ptr.h"
10#include "base/prefs/pref_change_registrar.h"
11#include "chrome/browser/ui/tabs/hover_tab_selector.h"
12#include "chrome/browser/ui/tabs/tab_strip_model.h"
13#include "chrome/browser/ui/views/frame/immersive_mode_controller.h"
14#include "chrome/browser/ui/views/tabs/tab_strip_controller.h"
15
16class Browser;
17class Tab;
18class TabStrip;
19struct TabRendererData;
20
21namespace content {
22class WebContents;
23}
24
25namespace ui {
26class ListSelectionModel;
27}
28
29// An implementation of TabStripController that sources data from the
30// WebContentses in a TabStripModel.
31class BrowserTabStripController : public TabStripController,
32                                  public TabStripModelObserver {
33 public:
34  BrowserTabStripController(Browser* browser, TabStripModel* model);
35  virtual ~BrowserTabStripController();
36
37  void InitFromModel(TabStrip* tabstrip);
38
39  TabStripModel* model() const { return model_; }
40
41  bool IsCommandEnabledForTab(TabStripModel::ContextMenuCommand command_id,
42                              Tab* tab) const;
43  void ExecuteCommandForTab(TabStripModel::ContextMenuCommand command_id,
44                            Tab* tab);
45  bool IsTabPinned(Tab* tab) const;
46
47  // TabStripController implementation:
48  virtual const ui::ListSelectionModel& GetSelectionModel() OVERRIDE;
49  virtual int GetCount() const OVERRIDE;
50  virtual bool IsValidIndex(int model_index) const OVERRIDE;
51  virtual bool IsActiveTab(int model_index) const OVERRIDE;
52  virtual int GetActiveIndex() const OVERRIDE;
53  virtual bool IsTabSelected(int model_index) const OVERRIDE;
54  virtual bool IsTabPinned(int model_index) const OVERRIDE;
55  virtual bool IsNewTabPage(int model_index) const OVERRIDE;
56  virtual void SelectTab(int model_index) OVERRIDE;
57  virtual void ExtendSelectionTo(int model_index) OVERRIDE;
58  virtual void ToggleSelected(int model_index) OVERRIDE;
59  virtual void AddSelectionFromAnchorTo(int model_index) OVERRIDE;
60  virtual void CloseTab(int model_index, CloseTabSource source) OVERRIDE;
61  virtual void ToggleTabAudioMute(int model_index) OVERRIDE;
62  virtual void ShowContextMenuForTab(Tab* tab,
63                                     const gfx::Point& p,
64                                     ui::MenuSourceType source_type) OVERRIDE;
65  virtual void UpdateLoadingAnimations() OVERRIDE;
66  virtual int HasAvailableDragActions() const OVERRIDE;
67  virtual void OnDropIndexUpdate(int index, bool drop_before) OVERRIDE;
68  virtual void PerformDrop(bool drop_before,
69                           int index,
70                           const GURL& url) OVERRIDE;
71  virtual bool IsCompatibleWith(TabStrip* other) const OVERRIDE;
72  virtual void CreateNewTab() OVERRIDE;
73  virtual void CreateNewTabWithLocation(const base::string16& loc) OVERRIDE;
74  virtual bool IsIncognito() OVERRIDE;
75  virtual void StackedLayoutMaybeChanged() OVERRIDE;
76  virtual void OnStartedDraggingTabs() OVERRIDE;
77  virtual void OnStoppedDraggingTabs() OVERRIDE;
78  virtual void CheckFileSupported(const GURL& url) OVERRIDE;
79
80  // TabStripModelObserver implementation:
81  virtual void TabInsertedAt(content::WebContents* contents,
82                             int model_index,
83                             bool is_active) OVERRIDE;
84  virtual void TabDetachedAt(content::WebContents* contents,
85                             int model_index) OVERRIDE;
86  virtual void TabSelectionChanged(
87      TabStripModel* tab_strip_model,
88      const ui::ListSelectionModel& old_model) OVERRIDE;
89  virtual void TabMoved(content::WebContents* contents,
90                        int from_model_index,
91                        int to_model_index) OVERRIDE;
92  virtual void TabChangedAt(content::WebContents* contents,
93                            int model_index,
94                            TabChangeType change_type) OVERRIDE;
95  virtual void TabReplacedAt(TabStripModel* tab_strip_model,
96                             content::WebContents* old_contents,
97                             content::WebContents* new_contents,
98                             int model_index) OVERRIDE;
99  virtual void TabPinnedStateChanged(content::WebContents* contents,
100                                     int model_index) OVERRIDE;
101  virtual void TabMiniStateChanged(content::WebContents* contents,
102                                   int model_index) OVERRIDE;
103  virtual void TabBlockedStateChanged(content::WebContents* contents,
104                                      int model_index) OVERRIDE;
105
106 protected:
107  // The context in which SetTabRendererDataFromModel is being called.
108  enum TabStatus {
109    NEW_TAB,
110    EXISTING_TAB
111  };
112
113  // Sets the TabRendererData from the TabStripModel.
114  virtual void SetTabRendererDataFromModel(content::WebContents* contents,
115                                           int model_index,
116                                           TabRendererData* data,
117                                           TabStatus tab_status);
118
119  Profile* profile() const { return model_->profile(); }
120
121  const TabStrip* tabstrip() const { return tabstrip_; }
122
123  const Browser* browser() const { return browser_; }
124
125 private:
126  class TabContextMenuContents;
127
128  // Invokes tabstrip_->SetTabData.
129  void SetTabDataAt(content::WebContents* web_contents, int model_index);
130
131  void StartHighlightTabsForCommand(
132      TabStripModel::ContextMenuCommand command_id,
133      Tab* tab);
134  void StopHighlightTabsForCommand(
135      TabStripModel::ContextMenuCommand command_id,
136      Tab* tab);
137
138  // Adds a tab.
139  void AddTab(content::WebContents* contents, int index, bool is_active);
140
141  // Resets the tabstrips stacked layout (true or false) from prefs.
142  void UpdateStackedLayout();
143
144  // Notifies the tabstrip whether |url| is supported once a MIME type request
145  // has completed.
146  void OnFindURLMimeTypeCompleted(const GURL& url,
147                                  const std::string& mime_type);
148
149  TabStripModel* model_;
150
151  TabStrip* tabstrip_;
152
153  // Non-owning pointer to the browser which is using this controller.
154  Browser* browser_;
155
156  // If non-NULL it means we're showing a menu for the tab.
157  scoped_ptr<TabContextMenuContents> context_menu_contents_;
158
159  // Helper for performing tab selection as a result of dragging over a tab.
160  HoverTabSelector hover_tab_selector_;
161
162  // Forces the tabs to use the regular (non-immersive) style and the
163  // top-of-window views to be revealed when the user is dragging |tabstrip|'s
164  // tabs.
165  scoped_ptr<ImmersiveRevealedLock> immersive_reveal_lock_;
166
167  PrefChangeRegistrar local_pref_registrar_;
168
169  base::WeakPtrFactory<BrowserTabStripController> weak_ptr_factory_;
170
171  DISALLOW_COPY_AND_ASSIGN(BrowserTabStripController);
172};
173
174#endif  // CHROME_BROWSER_UI_VIEWS_TABS_BROWSER_TAB_STRIP_CONTROLLER_H_
175