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 void CreateNewTabWithLocation(const base::string16
& loc
) OVERRIDE
;
73 virtual bool IsIncognito() OVERRIDE
;
74 virtual void LayoutTypeMaybeChanged() OVERRIDE
;
75 virtual void OnStartedDraggingTabs() OVERRIDE
;
76 virtual void OnStoppedDraggingTabs() OVERRIDE
;
77 virtual void CheckFileSupported(const GURL
& url
) OVERRIDE
;
79 // TabStripModelObserver implementation:
80 virtual void TabInsertedAt(content::WebContents
* contents
,
82 bool is_active
) OVERRIDE
;
83 virtual void TabDetachedAt(content::WebContents
* contents
,
84 int model_index
) OVERRIDE
;
85 virtual void TabSelectionChanged(
86 TabStripModel
* tab_strip_model
,
87 const ui::ListSelectionModel
& old_model
) OVERRIDE
;
88 virtual void TabMoved(content::WebContents
* contents
,
90 int to_model_index
) OVERRIDE
;
91 virtual void TabChangedAt(content::WebContents
* contents
,
93 TabChangeType change_type
) OVERRIDE
;
94 virtual void TabReplacedAt(TabStripModel
* tab_strip_model
,
95 content::WebContents
* old_contents
,
96 content::WebContents
* new_contents
,
97 int model_index
) OVERRIDE
;
98 virtual void TabPinnedStateChanged(content::WebContents
* contents
,
99 int model_index
) OVERRIDE
;
100 virtual void TabMiniStateChanged(content::WebContents
* contents
,
101 int model_index
) OVERRIDE
;
102 virtual void TabBlockedStateChanged(content::WebContents
* contents
,
103 int model_index
) OVERRIDE
;
106 // The context in which SetTabRendererDataFromModel is being called.
112 // Sets the TabRendererData from the TabStripModel.
113 virtual void SetTabRendererDataFromModel(content::WebContents
* contents
,
115 TabRendererData
* data
,
116 TabStatus tab_status
);
118 Profile
* profile() const { return model_
->profile(); }
120 const TabStrip
* tabstrip() const { return tabstrip_
; }
122 const Browser
* browser() const { return browser_
; }
125 class TabContextMenuContents
;
127 // Invokes tabstrip_->SetTabData.
128 void SetTabDataAt(content::WebContents
* web_contents
, int model_index
);
130 void StartHighlightTabsForCommand(
131 TabStripModel::ContextMenuCommand command_id
,
133 void StopHighlightTabsForCommand(
134 TabStripModel::ContextMenuCommand command_id
,
138 void AddTab(content::WebContents
* contents
, int index
, bool is_active
);
140 // Resets the tabstrips layout type from prefs.
141 void UpdateLayoutType();
143 // Notifies the tabstrip whether |url| is supported once a MIME type request
145 void OnFindURLMimeTypeCompleted(const GURL
& url
,
146 const std::string
& mime_type
);
148 TabStripModel
* model_
;
152 // Non-owning pointer to the browser which is using this controller.
155 // If non-NULL it means we're showing a menu for the tab.
156 scoped_ptr
<TabContextMenuContents
> context_menu_contents_
;
158 // Helper for performing tab selection as a result of dragging over a tab.
159 HoverTabSelector hover_tab_selector_
;
161 // Forces the tabs to use the regular (non-immersive) style and the
162 // top-of-window views to be revealed when the user is dragging |tabstrip|'s
164 scoped_ptr
<ImmersiveRevealedLock
> immersive_reveal_lock_
;
166 PrefChangeRegistrar local_pref_registrar_
;
168 base::WeakPtrFactory
<BrowserTabStripController
> weak_ptr_factory_
;
170 DISALLOW_COPY_AND_ASSIGN(BrowserTabStripController
);
173 #endif // CHROME_BROWSER_UI_VIEWS_TABS_BROWSER_TAB_STRIP_CONTROLLER_H_