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