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