15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_UI_VIEWS_TABS_BROWSER_TAB_STRIP_CONTROLLER_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_VIEWS_TABS_BROWSER_TAB_STRIP_CONTROLLER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_change_registrar.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/hover_tab_selector.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/ui/views/frame/immersive_mode_controller.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/tabs/tab_strip_controller.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Browser; 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Tab; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TabStrip; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct TabRendererData; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebContents; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ui { 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ListSelectionModel; 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An implementation of TabStripController that sources data from the 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// WebContentses in a TabStripModel. 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserTabStripController : public TabStripController, 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public TabStripModelObserver { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserTabStripController(Browser* browser, TabStripModel* model); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~BrowserTabStripController(); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void InitFromModel(TabStrip* tabstrip); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStripModel* model() const { return model_; } 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsCommandEnabledForTab(TabStripModel::ContextMenuCommand command_id, 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Tab* tab) const; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ExecuteCommandForTab(TabStripModel::ContextMenuCommand command_id, 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Tab* tab); 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool IsTabPinned(Tab* tab) const; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TabStripController implementation: 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual const ui::ListSelectionModel& GetSelectionModel() OVERRIDE; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int GetCount() const OVERRIDE; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsValidIndex(int model_index) const OVERRIDE; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsActiveTab(int model_index) const OVERRIDE; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int GetActiveIndex() const OVERRIDE; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsTabSelected(int model_index) const OVERRIDE; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsTabPinned(int model_index) const OVERRIDE; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsNewTabPage(int model_index) const OVERRIDE; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SelectTab(int model_index) OVERRIDE; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ExtendSelectionTo(int model_index) OVERRIDE; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ToggleSelected(int model_index) OVERRIDE; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void AddSelectionFromAnchorTo(int model_index) OVERRIDE; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void CloseTab(int model_index, CloseTabSource source) OVERRIDE; 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void ToggleTabAudioMute(int model_index) OVERRIDE; 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void ShowContextMenuForTab(Tab* tab, 637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const gfx::Point& p, 647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ui::MenuSourceType source_type) OVERRIDE; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void UpdateLoadingAnimations() OVERRIDE; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int HasAvailableDragActions() const OVERRIDE; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnDropIndexUpdate(int index, bool drop_before) OVERRIDE; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void PerformDrop(bool drop_before, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url) OVERRIDE; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsCompatibleWith(TabStrip* other) const OVERRIDE; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void CreateNewTab() OVERRIDE; 73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void CreateNewTabWithLocation(const base::string16& loc) OVERRIDE; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsIncognito() OVERRIDE; 75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void StackedLayoutMaybeChanged() OVERRIDE; 767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void OnStartedDraggingTabs() OVERRIDE; 777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void OnStoppedDraggingTabs() OVERRIDE; 78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void CheckFileSupported(const GURL& url) OVERRIDE; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TabStripModelObserver implementation: 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TabInsertedAt(content::WebContents* contents, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int model_index, 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_active) OVERRIDE; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TabDetachedAt(content::WebContents* contents, 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int model_index) OVERRIDE; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TabSelectionChanged( 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStripModel* tab_strip_model, 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ui::ListSelectionModel& old_model) OVERRIDE; 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TabMoved(content::WebContents* contents, 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int from_model_index, 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int to_model_index) OVERRIDE; 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TabChangedAt(content::WebContents* contents, 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int model_index, 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabChangeType change_type) OVERRIDE; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TabReplacedAt(TabStripModel* tab_strip_model, 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebContents* old_contents, 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebContents* new_contents, 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int model_index) OVERRIDE; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TabPinnedStateChanged(content::WebContents* contents, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int model_index) OVERRIDE; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TabMiniStateChanged(content::WebContents* contents, 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int model_index) OVERRIDE; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TabBlockedStateChanged(content::WebContents* contents, 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int model_index) OVERRIDE; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The context in which SetTabRendererDataFromModel is being called. 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum TabStatus { 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NEW_TAB, 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXISTING_TAB 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the TabRendererData from the TabStripModel. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetTabRendererDataFromModel(content::WebContents* contents, 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int model_index, 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabRendererData* data, 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStatus tab_status); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile() const { return model_->profile(); } 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TabStrip* tabstrip() const { return tabstrip_; } 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Browser* browser() const { return browser_; } 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class TabContextMenuContents; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invokes tabstrip_->SetTabData. 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetTabDataAt(content::WebContents* web_contents, int model_index); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StartHighlightTabsForCommand( 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStripModel::ContextMenuCommand command_id, 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Tab* tab); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StopHighlightTabsForCommand( 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStripModel::ContextMenuCommand command_id, 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Tab* tab); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds a tab. 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddTab(content::WebContents* contents, int index, bool is_active); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Resets the tabstrips stacked layout (true or false) from prefs. 142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void UpdateStackedLayout(); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Notifies the tabstrip whether |url| is supported once a MIME type request 145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // has completed. 146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void OnFindURLMimeTypeCompleted(const GURL& url, 147a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::string& mime_type); 148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStripModel* model_; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStrip* tabstrip_; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Non-owning pointer to the browser which is using this controller. 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser_; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If non-NULL it means we're showing a menu for the tab. 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<TabContextMenuContents> context_menu_contents_; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper for performing tab selection as a result of dragging over a tab. 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HoverTabSelector hover_tab_selector_; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Forces the tabs to use the regular (non-immersive) style and the 1637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // top-of-window views to be revealed when the user is dragging |tabstrip|'s 1647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // tabs. 1657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) scoped_ptr<ImmersiveRevealedLock> immersive_reveal_lock_; 1667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrefChangeRegistrar local_pref_registrar_; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 169a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::WeakPtrFactory<BrowserTabStripController> weak_ptr_factory_; 170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(BrowserTabStripController); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_UI_VIEWS_TABS_BROWSER_TAB_STRIP_CONTROLLER_H_ 175