172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
24a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
34a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// found in the LICENSE file.
44a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
54a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#ifndef CHROME_BROWSER_UI_VIEWS_TABS_TAB_STRIP_H_
64a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#define CHROME_BROWSER_UI_VIEWS_TABS_TAB_STRIP_H_
74a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#pragma once
84a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h"
104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "base/timer.h"
1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/tabs/base_tab_strip.h"
123f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "ui/base/animation/animation_container.h"
1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/point.h"
1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/rect.h"
154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "views/controls/button/image_button.h"
164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "views/mouse_watcher.h"
174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass Tab;
194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochnamespace views {
214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass ImageView;
224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#if defined(OS_LINUX)
234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass WidgetGtk;
244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#elif defined(OS_WIN)
254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass WidgetWin;
264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#endif
274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch///////////////////////////////////////////////////////////////////////////////
304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch//
314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// TabStrip
324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch//
334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch//  A View that represents the TabStripModel. The TabStrip has the
344a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch//  following responsibilities:
354a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch//    - It implements the TabStripModelObserver interface, and acts as a
364a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch//      container for Tabs, and is also responsible for creating them.
374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch//    - It takes part in Tab Drag & Drop with Tab, TabDragHelper and
384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch//      DraggedTab, focusing on tasks that require reshuffling other tabs
394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch//      in response to dragged tabs.
404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch//
414a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch///////////////////////////////////////////////////////////////////////////////
424a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass TabStrip : public BaseTabStrip,
434a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                 public views::ButtonListener,
444a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                 public views::MouseWatcherListener {
454a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch public:
464a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  explicit TabStrip(TabStripController* controller);
474a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual ~TabStrip();
484a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Creates the new tab button.
504a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void InitTabStripButtons();
514a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
524a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Returns the bounds of the new tab button.
534a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  gfx::Rect GetNewTabButtonBounds();
544a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // MouseWatcherListener overrides:
56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void MouseMovedOutOfView() OVERRIDE;
57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // AbstractTabStripView implementation:
59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual bool IsPositionInWindowCaption(const gfx::Point& point) OVERRIDE;
60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void SetBackgroundOffset(const gfx::Point& offset) OVERRIDE;
614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // BaseTabStrip implementation:
63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void PrepareForCloseAt(int model_index) OVERRIDE;
64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void RemoveTabAt(int model_index) OVERRIDE;
65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void SelectTabAt(int old_model_index, int new_model_index) OVERRIDE;
66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void TabTitleChangedNotLoading(int model_index) OVERRIDE;
67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void StartHighlight(int model_index) OVERRIDE;
68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void StopAllHighlighting() OVERRIDE;
69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual BaseTab* CreateTabForDragging() OVERRIDE;
704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // views::View overrides:
72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void PaintChildren(gfx::Canvas* canvas) OVERRIDE;
73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual const views::View* GetViewByID(int id) const OVERRIDE;
74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual gfx::Size GetPreferredSize() OVERRIDE;
75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // NOTE: the drag and drop methods are invoked from FrameView. This is done
76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // to allow for a drop region that extends outside the bounds of the TabStrip.
77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void OnDragEntered(const views::DropTargetEvent& event) OVERRIDE;
78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual int OnDragUpdated(const views::DropTargetEvent& event) OVERRIDE;
79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void OnDragExited() OVERRIDE;
80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual int OnPerformDrop(const views::DropTargetEvent& event) OVERRIDE;
81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE;
82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual views::View* GetEventHandlerForPoint(const gfx::Point& point)
83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      OVERRIDE;
84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void OnThemeChanged() OVERRIDE;
854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
864a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch protected:
874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // BaseTabStrip overrides:
88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual BaseTab* CreateTab() OVERRIDE;
89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void StartInsertTabAnimation(int model_index) OVERRIDE;
90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void AnimateToIdealBounds() OVERRIDE;
91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual bool ShouldHighlightCloseButtonAfterRemove() OVERRIDE;
92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void DoLayout() OVERRIDE;
93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void LayoutDraggedTabsAt(const std::vector<BaseTab*>& tabs,
94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                   BaseTab* active_tab,
95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                   const gfx::Point& location,
96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                   bool initial_drag) OVERRIDE;
97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void CalculateBoundsForDraggedTabs(
98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::vector<BaseTab*>& tabs,
99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      std::vector<gfx::Rect>* bounds) OVERRIDE;
100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual int GetSizeNeededForTabs(const std::vector<BaseTab*>& tabs) OVERRIDE;
1014a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1024a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // views::View implementation:
1034a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual void ViewHierarchyChanged(bool is_add,
1044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                                    views::View* parent,
105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                    views::View* child) OVERRIDE;
1064a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1074a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // views::ButtonListener implementation:
108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ButtonPressed(views::Button* sender, const views::Event& event)
109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      OVERRIDE;
1104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Horizontal gap between mini and non-mini-tabs.
1124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  static const int mini_to_non_mini_gap_;
1134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch private:
1154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  friend class DraggedTabController;
1164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Used during a drop session of a url. Tracks the position of the drop as
1184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // well as a window used to highlight where the drop occurs.
1194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  struct DropInfo {
1204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    DropInfo(int index, bool drop_before, bool paint_down);
1214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    ~DropInfo();
1224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    // Index of the tab to drop on. If drop_before is true, the drop should
1244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    // occur between the tab at drop_index - 1 and drop_index.
1254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    // WARNING: if drop_before is true it is possible this will == tab_count,
1264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    // which indicates the drop should create a new tab at the end of the tabs.
1274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    int drop_index;
1284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    bool drop_before;
1294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    // Direction the arrow should point in. If true, the arrow is displayed
1314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    // above the tab and points down. If false, the arrow is displayed beneath
1324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    // the tab and points up.
1334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    bool point_down;
1344a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1354a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    // Renders the drop indicator.
136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    views::Widget* arrow_window;
1374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    views::ImageView* arrow_view;
1384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch   private:
1404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    DISALLOW_COPY_AND_ASSIGN(DropInfo);
1414a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  };
1424a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1434a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void Init();
1444a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1454a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Set the images for the new tab button.
1464a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void LoadNewTabButtonImage();
1474a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1484a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Retrieves the Tab at the specified index. Remember, the specified index
1494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // is in terms of tab_data, *not* the model.
1504a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  Tab* GetTabAtTabDataIndex(int tab_data_index) const;
1514a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1524a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Returns the tab at the specified index. If a remove animation is on going
1534a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // and the index is >= the index of the tab being removed, the index is
1544a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // incremented. While a remove operation is on going the indices of the model
1554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // do not line up with the indices of the view. This method adjusts the index
1564a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // accordingly.
1574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  //
1584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Use this instead of GetTabAtTabDataIndex if the index comes from the model.
1594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  Tab* GetTabAtModelIndex(int model_index) const;
1604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Returns the number of mini-tabs.
1624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  int GetMiniTabCount() const;
1634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // -- Tab Resize Layout -----------------------------------------------------
1654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Returns the exact (unrounded) current width of each tab.
1674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void GetCurrentTabWidths(double* unselected_width,
1684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                           double* selected_width) const;
1694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Returns the exact (unrounded) desired width of each tab, based on the
1714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // desired strip width and number of tabs.  If
1724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // |width_of_tabs_for_mouse_close_| is nonnegative we use that value in
1734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // calculating the desired strip width; otherwise we use the current width.
1744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // |mini_tab_count| gives the number of mini-tabs and |tab_count| the number
1754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // of mini and non-mini-tabs.
1764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void GetDesiredTabWidths(int tab_count,
1774a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                           int mini_tab_count,
1784a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                           double* unselected_width,
1794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                           double* selected_width) const;
1804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1814a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Perform an animated resize-relayout of the TabStrip immediately.
1824a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void ResizeLayoutTabs();
1834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Ensure that the message loop observer used for event spying is added and
1854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // removed appropriately so we can tell when to resize layout the tab strip.
1864a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void AddMessageLoopObserver();
1874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void RemoveMessageLoopObserver();
1884a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // -- Link Drag & Drop ------------------------------------------------------
1904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Returns the bounds to render the drop at, in screen coordinates. Sets
1924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // |is_beneath| to indicate whether the arrow is beneath the tab, or above
1934a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // it.
1944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  gfx::Rect GetDropBounds(int drop_index, bool drop_before, bool* is_beneath);
1954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Updates the location of the drop based on the event.
1974a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void UpdateDropIndex(const views::DropTargetEvent& event);
1984a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1994a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Sets the location of the drop, repainting as necessary.
2004a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void SetDropIndex(int tab_data_index, bool drop_before);
2014a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2024a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Returns the drop effect for dropping a URL on the tab strip. This does
2034a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // not query the data in anyway, it only looks at the source operations.
2044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  int GetDropEffect(const views::DropTargetEvent& event);
2054a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2064a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Returns the image to use for indicating a drop on a tab. If is_down is
2074a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // true, this returns an arrow pointing down.
2084a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  static SkBitmap* GetDropArrowImage(bool is_down);
2094a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // -- Animations ------------------------------------------------------------
2114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Generates the ideal bounds of the TabStrip when all Tabs have finished
2134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // animating to their desired position/bounds. This is used by the standard
2144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Layout method and other callers like the DraggedTabController that need
2154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // stable representations of Tab positions.
216dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void GenerateIdealBounds();
2174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Starts various types of TabStrip animations.
2194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void StartResizeLayoutAnimation();
220dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void StartMiniTabAnimation();
2214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void StartMouseInitiatedRemoveTabAnimation(int model_index);
2224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Calculates the available width for tabs, assuming a Tab is to be closed.
2244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  int GetAvailableWidthForTabs(Tab* last_tab) const;
2254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Returns true if the specified point in TabStrip coords is within the
2274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // hit-test region of the specified Tab.
2284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  bool IsPointInTab(Tab* tab, const gfx::Point& point_in_tabstrip_coords);
2294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // -- Member Variables ------------------------------------------------------
2314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The "New Tab" button.
2334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  views::ImageButton* newtab_button_;
2344a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2354a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Ideal bounds of the new tab button.
2364a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  gfx::Rect newtab_button_bounds_;
2374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The current widths of various types of tabs.  We save these so that, as
2394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // users close tabs while we're holding them at the same size, we can lay out
2404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // tabs exactly and eliminate the "pixel jitter" we'd get from just leaving
2414a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // them all at their existing, rounded widths.
2424a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  double current_unselected_width_;
2434a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  double current_selected_width_;
2444a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2454a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // If this value is nonnegative, it is used in GetDesiredTabWidths() to
2464a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // calculate how much space in the tab strip to use for tabs.  Most of the
2474a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // time this will be -1, but while we're handling closing a tab via the mouse,
2484a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // we'll set this to the edge of the last tab before closing, so that if we
2494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // are closing the last tab and need to resize immediately, we'll resize only
2504a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // back to this width, thus once again placing the last tab under the mouse
2514a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // cursor.
2524a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  int available_width_for_tabs_;
2534a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2544a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // True if PrepareForCloseAt has been invoked. When true remove animations
2554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // preserve current tab bounds.
2564a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  bool in_tab_close_;
2574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The size of the new tab button must be hardcoded because we need to be
2594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // able to lay it out before we are able to get its image from the
26072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // ui::ThemeProvider.  It also makes sense to do this, because the size of the
2614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // new tab button should not need to be calculated dynamically.
2624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  static const int kNewTabButtonWidth = 28;
2634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  static const int kNewTabButtonHeight = 18;
2644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Valid for the lifetime of a drag over us.
2664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  scoped_ptr<DropInfo> drop_info_;
2674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // To ensure all tabs pulse at the same time they share the same animation
2694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // container. This is that animation container.
2703f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  scoped_refptr<ui::AnimationContainer> animation_container_;
2714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Used for stage 1 of new tab animation.
2734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  base::OneShotTimer<TabStrip> new_tab_timer_;
2744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  scoped_ptr<views::MouseWatcher> mouse_watcher_;
2764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2774a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(TabStrip);
2784a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch};
2794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#endif  // CHROME_BROWSER_UI_VIEWS_TABS_TAB_STRIP_H_
281