browser_tab_strip_controller.h revision f2477e01787aa58f445919b809d89e252beef54f
11510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// Copyright (c) 2012 The Chromium Authors. All rights reserved.
21510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// Use of this source code is governed by a BSD-style license that can be
31510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// found in the LICENSE file.
41510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
51510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#ifndef CHROME_BROWSER_UI_VIEWS_TABS_BROWSER_TAB_STRIP_CONTROLLER_H_
61510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#define CHROME_BROWSER_UI_VIEWS_TABS_BROWSER_TAB_STRIP_CONTROLLER_H_
71510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
81510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#include "base/compiler_specific.h"
91510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#include "base/memory/scoped_ptr.h"
101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#include "base/prefs/pref_change_registrar.h"
111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#include "chrome/browser/ui/tabs/hover_tab_selector.h"
121510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#include "chrome/browser/ui/tabs/tab_strip_model.h"
131510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#include "chrome/browser/ui/views/frame/immersive_mode_controller.h"
141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#include "chrome/browser/ui/views/tabs/tab_strip_controller.h"
151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass Browser;
171510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass Tab;
181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass TabStrip;
191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgstruct TabRendererData;
201510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
211510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgnamespace content {
221510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass WebContents;
231510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}
241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgnamespace ui {
261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass ListSelectionModel;
271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}
281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// An implementation of TabStripController that sources data from the
301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// WebContentses in a TabStripModel.
311510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass BrowserTabStripController : public TabStripController,
321510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                                  public TabStripModelObserver {
331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public:
341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  BrowserTabStripController(Browser* browser, TabStripModel* model);
351510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  virtual ~BrowserTabStripController();
361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  void InitFromModel(TabStrip* tabstrip);
381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
391510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  TabStripModel* model() const { return model_; }
401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  bool IsCommandEnabledForTab(TabStripModel::ContextMenuCommand command_id,
421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                              Tab* tab) const;
431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  void ExecuteCommandForTab(TabStripModel::ContextMenuCommand command_id,
441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                            Tab* tab);
451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  bool IsTabPinned(Tab* tab) const;
461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
471510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  // TabStripController implementation:
481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  virtual const ui::ListSelectionModel& GetSelectionModel() OVERRIDE;
491510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  virtual int GetCount() const OVERRIDE;
501510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  virtual bool IsValidIndex(int model_index) const OVERRIDE;
511510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  virtual bool IsActiveTab(int model_index) const OVERRIDE;
521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  virtual int GetActiveIndex() const OVERRIDE;
531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  virtual bool IsTabSelected(int model_index) const OVERRIDE;
541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  virtual bool IsTabPinned(int model_index) const OVERRIDE;
551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  virtual bool IsNewTabPage(int model_index) const OVERRIDE;
561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  virtual void SelectTab(int model_index) OVERRIDE;
571510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  virtual void ExtendSelectionTo(int model_index) OVERRIDE;
581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  virtual void ToggleSelected(int model_index) OVERRIDE;
591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  virtual void AddSelectionFromAnchorTo(int model_index) OVERRIDE;
601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  virtual void CloseTab(int model_index, CloseTabSource source) OVERRIDE;
611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  virtual void ShowContextMenuForTab(Tab* tab,
621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                                     const gfx::Point& p,
631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                                     ui::MenuSourceType source_type) OVERRIDE;
641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  virtual void UpdateLoadingAnimations() OVERRIDE;
651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  virtual int HasAvailableDragActions() const OVERRIDE;
661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  virtual void OnDropIndexUpdate(int index, bool drop_before) OVERRIDE;
671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  virtual void PerformDrop(bool drop_before,
681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                           int index,
691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                           const GURL& url) OVERRIDE;
701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  virtual bool IsCompatibleWith(TabStrip* other) const OVERRIDE;
711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  virtual void CreateNewTab() OVERRIDE;
721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  virtual void CreateNewTabWithLocation(const base::string16& loc) OVERRIDE;
731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  virtual bool IsIncognito() OVERRIDE;
741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  virtual void LayoutTypeMaybeChanged() OVERRIDE;
751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  virtual void OnStartedDraggingTabs() OVERRIDE;
761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  virtual void OnStoppedDraggingTabs() OVERRIDE;
771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
781510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  // TabStripModelObserver implementation:
791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  virtual void TabInsertedAt(content::WebContents* contents,
801510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                             int model_index,
811510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                             bool is_active) OVERRIDE;
821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  virtual void TabDetachedAt(content::WebContents* contents,
831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                             int model_index) OVERRIDE;
841510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  virtual void TabSelectionChanged(
851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      TabStripModel* tab_strip_model,
861510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      const ui::ListSelectionModel& old_model) OVERRIDE;
871510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  virtual void TabMoved(content::WebContents* contents,
881510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                        int from_model_index,
891510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                        int to_model_index) OVERRIDE;
901510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  virtual void TabChangedAt(content::WebContents* contents,
911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                            int model_index,
921510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                            TabChangeType change_type) OVERRIDE;
931510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  virtual void TabReplacedAt(TabStripModel* tab_strip_model,
941510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                             content::WebContents* old_contents,
95                             content::WebContents* new_contents,
96                             int model_index) OVERRIDE;
97  virtual void TabPinnedStateChanged(content::WebContents* contents,
98                                     int model_index) OVERRIDE;
99  virtual void TabMiniStateChanged(content::WebContents* contents,
100                                   int model_index) OVERRIDE;
101  virtual void TabBlockedStateChanged(content::WebContents* contents,
102                                      int model_index) OVERRIDE;
103
104 protected:
105  // The context in which SetTabRendererDataFromModel is being called.
106  enum TabStatus {
107    NEW_TAB,
108    EXISTING_TAB
109  };
110
111  // Sets the TabRendererData from the TabStripModel.
112  virtual void SetTabRendererDataFromModel(content::WebContents* contents,
113                                           int model_index,
114                                           TabRendererData* data,
115                                           TabStatus tab_status);
116
117  Profile* profile() const { return model_->profile(); }
118
119  const TabStrip* tabstrip() const { return tabstrip_; }
120
121  const Browser* browser() const { return browser_; }
122
123 private:
124  class TabContextMenuContents;
125
126  // Invokes tabstrip_->SetTabData.
127  void SetTabDataAt(content::WebContents* web_contents, int model_index);
128
129  void StartHighlightTabsForCommand(
130      TabStripModel::ContextMenuCommand command_id,
131      Tab* tab);
132  void StopHighlightTabsForCommand(
133      TabStripModel::ContextMenuCommand command_id,
134      Tab* tab);
135
136  // Adds a tab.
137  void AddTab(content::WebContents* contents, int index, bool is_active);
138
139  // Resets the tabstrips layout type from prefs.
140  void UpdateLayoutType();
141
142  TabStripModel* model_;
143
144  TabStrip* tabstrip_;
145
146  // Non-owning pointer to the browser which is using this controller.
147  Browser* browser_;
148
149  // If non-NULL it means we're showing a menu for the tab.
150  scoped_ptr<TabContextMenuContents> context_menu_contents_;
151
152  // Helper for performing tab selection as a result of dragging over a tab.
153  HoverTabSelector hover_tab_selector_;
154
155  // Forces the tabs to use the regular (non-immersive) style and the
156  // top-of-window views to be revealed when the user is dragging |tabstrip|'s
157  // tabs.
158  scoped_ptr<ImmersiveRevealedLock> immersive_reveal_lock_;
159
160  PrefChangeRegistrar local_pref_registrar_;
161
162  DISALLOW_COPY_AND_ASSIGN(BrowserTabStripController);
163};
164
165#endif  // CHROME_BROWSER_UI_VIEWS_TABS_BROWSER_TAB_STRIP_CONTROLLER_H_
166