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