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.
5 #ifndef CHROME_BROWSER_UI_VIEWS_TABS_BROWSER_TAB_STRIP_CONTROLLER_H_
6 #define CHROME_BROWSER_UI_VIEWS_TABS_BROWSER_TAB_STRIP_CONTROLLER_H_
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"
19 struct TabRendererData;
26 class ListSelectionModel;
29 // An implementation of TabStripController that sources data from the
30 // WebContentses in a TabStripModel.
31 class BrowserTabStripController : public TabStripController,
32 public TabStripModelObserver {
34 BrowserTabStripController(Browser* browser, TabStripModel* model);
35 virtual ~BrowserTabStripController();
37 void InitFromModel(TabStrip* tabstrip);
39 TabStripModel* model() const { return model_; }
41 bool IsCommandEnabledForTab(TabStripModel::ContextMenuCommand command_id,
43 void ExecuteCommandForTab(TabStripModel::ContextMenuCommand command_id,
45 bool IsTabPinned(Tab* tab) const;
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 ShowContextMenuForTab(Tab* tab,
63 ui::MenuSourceType source_type) OVERRIDE;
64 virtual void UpdateLoadingAnimations() OVERRIDE;
65 virtual int HasAvailableDragActions() const OVERRIDE;
66 virtual void OnDropIndexUpdate(int index, bool drop_before) OVERRIDE;
67 virtual void PerformDrop(bool drop_before,
69 const GURL& url) OVERRIDE;
70 virtual bool IsCompatibleWith(TabStrip* other) const OVERRIDE;
71 virtual void CreateNewTab() OVERRIDE;
72 virtual bool IsIncognito() OVERRIDE;
73 virtual void LayoutTypeMaybeChanged() OVERRIDE;
74 virtual void OnStartedDraggingTabs() OVERRIDE;
75 virtual void OnStoppedDraggingTabs() OVERRIDE;
77 // TabStripModelObserver implementation:
78 virtual void TabInsertedAt(content::WebContents* contents,
80 bool is_active) OVERRIDE;
81 virtual void TabDetachedAt(content::WebContents* contents,
82 int model_index) OVERRIDE;
83 virtual void TabSelectionChanged(
84 TabStripModel* tab_strip_model,
85 const ui::ListSelectionModel& old_model) OVERRIDE;
86 virtual void TabMoved(content::WebContents* contents,
88 int to_model_index) OVERRIDE;
89 virtual void TabChangedAt(content::WebContents* contents,
91 TabChangeType change_type) OVERRIDE;
92 virtual void TabReplacedAt(TabStripModel* tab_strip_model,
93 content::WebContents* old_contents,
94 content::WebContents* new_contents,
95 int model_index) OVERRIDE;
96 virtual void TabPinnedStateChanged(content::WebContents* contents,
97 int model_index) OVERRIDE;
98 virtual void TabMiniStateChanged(content::WebContents* contents,
99 int model_index) OVERRIDE;
100 virtual void TabBlockedStateChanged(content::WebContents* contents,
101 int model_index) OVERRIDE;
104 // The context in which SetTabRendererDataFromModel is being called.
110 // Sets the TabRendererData from the TabStripModel.
111 virtual void SetTabRendererDataFromModel(content::WebContents* contents,
113 TabRendererData* data,
114 TabStatus tab_status);
116 Profile* profile() const { return model_->profile(); }
118 const TabStrip* tabstrip() const { return tabstrip_; }
120 const Browser* browser() const { return browser_; }
123 class TabContextMenuContents;
125 // Invokes tabstrip_->SetTabData.
126 void SetTabDataAt(content::WebContents* web_contents, int model_index);
128 void StartHighlightTabsForCommand(
129 TabStripModel::ContextMenuCommand command_id,
131 void StopHighlightTabsForCommand(
132 TabStripModel::ContextMenuCommand command_id,
136 void AddTab(content::WebContents* contents, int index, bool is_active);
138 // Resets the tabstrips layout type from prefs.
139 void UpdateLayoutType();
141 TabStripModel* model_;
145 // Non-owning pointer to the browser which is using this controller.
148 // If non-NULL it means we're showing a menu for the tab.
149 scoped_ptr<TabContextMenuContents> context_menu_contents_;
151 // Helper for performing tab selection as a result of dragging over a tab.
152 HoverTabSelector hover_tab_selector_;
154 // Forces the tabs to use the regular (non-immersive) style and the
155 // top-of-window views to be revealed when the user is dragging |tabstrip|'s
157 scoped_ptr<ImmersiveRevealedLock> immersive_reveal_lock_;
159 PrefChangeRegistrar local_pref_registrar_;
161 DISALLOW_COPY_AND_ASSIGN(BrowserTabStripController);
164 #endif // CHROME_BROWSER_UI_VIEWS_TABS_BROWSER_TAB_STRIP_CONTROLLER_H_