1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_UI_VIEWS_TABS_BASE_TAB_H_ 6 #define CHROME_BROWSER_UI_VIEWS_TABS_BASE_TAB_H_ 7 #pragma once 8 9 #include "base/memory/ref_counted.h" 10 #include "base/memory/scoped_ptr.h" 11 #include "chrome/browser/ui/views/tabs/tab_renderer_data.h" 12 #include "ui/base/animation/animation_delegate.h" 13 #include "views/controls/button/button.h" 14 #include "views/view.h" 15 16 class BaseTab; 17 class TabController; 18 19 namespace gfx { 20 class Font; 21 } 22 23 namespace ui { 24 class AnimationContainer; 25 class SlideAnimation; 26 class ThrobAnimation; 27 } 28 29 namespace views { 30 class ImageButton; 31 } 32 33 // Base class for tab renderers. 34 class BaseTab : public ui::AnimationDelegate, 35 public views::ButtonListener, 36 public views::ContextMenuController, 37 public views::View { 38 public: 39 explicit BaseTab(TabController* controller); 40 virtual ~BaseTab(); 41 42 // Sets the data this tabs displays. Invokes DataChanged for subclasses to 43 // update themselves appropriately. 44 void SetData(const TabRendererData& data); data()45 const TabRendererData& data() const { return data_; } 46 47 // Sets the network state. If the network state changes NetworkStateChanged is 48 // invoked. 49 virtual void UpdateLoadingAnimation(TabRendererData::NetworkState state); 50 51 // Starts/Stops a pulse animation. 52 void StartPulse(); 53 void StopPulse(); 54 55 // Used to set/check whether this Tab is being animated closed. set_closing(bool closing)56 void set_closing(bool closing) { closing_ = closing; } closing()57 bool closing() const { return closing_; } 58 59 // See description above field. set_dragging(bool dragging)60 void set_dragging(bool dragging) { dragging_ = dragging; } dragging()61 bool dragging() const { return dragging_; } 62 63 // Sets the container all animations run from. 64 void set_animation_container(ui::AnimationContainer* container); animation_container()65 ui::AnimationContainer* animation_container() const { 66 return animation_container_.get(); 67 } 68 69 // Set the theme provider - because we get detached, we are frequently 70 // outside of a hierarchy with a theme provider at the top. This should be 71 // called whenever we're detached or attached to a hierarchy. set_theme_provider(ui::ThemeProvider * provider)72 void set_theme_provider(ui::ThemeProvider* provider) { 73 theme_provider_ = provider; 74 } 75 76 // Returns true if the tab is closeable. 77 bool IsCloseable() const; 78 79 // Returns true if this tab is the active tab. 80 bool IsActive() const; 81 82 // Returns true if the tab is selected. 83 virtual bool IsSelected() const; 84 85 // Overridden from views::View: 86 virtual ThemeProvider* GetThemeProvider() const OVERRIDE; 87 virtual bool OnMousePressed(const views::MouseEvent& event) OVERRIDE; 88 virtual bool OnMouseDragged(const views::MouseEvent& event) OVERRIDE; 89 virtual void OnMouseReleased(const views::MouseEvent& event) OVERRIDE; 90 virtual void OnMouseCaptureLost() OVERRIDE; 91 virtual void OnMouseEntered(const views::MouseEvent& event) OVERRIDE; 92 virtual void OnMouseExited(const views::MouseEvent& event) OVERRIDE; 93 virtual bool GetTooltipText(const gfx::Point& p, 94 std::wstring* tooltip) OVERRIDE; 95 virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE; 96 97 protected: 98 // Invoked from SetData after |data_| has been updated to the new data. DataChanged(const TabRendererData & old)99 virtual void DataChanged(const TabRendererData& old) {} 100 101 // Invoked if data_.network_state changes, or the network_state is not none. 102 virtual void AdvanceLoadingAnimation(TabRendererData::NetworkState old_state, 103 TabRendererData::NetworkState state); 104 controller()105 TabController* controller() const { return controller_; } 106 107 // Returns the pulse animation. The pulse animation is non-null if StartPulse 108 // has been invoked. pulse_animation()109 ui::ThrobAnimation* pulse_animation() const { return pulse_animation_.get(); } 110 111 // Returns the hover animation. This may return null. hover_animation()112 const ui::SlideAnimation* hover_animation() const { 113 return hover_animation_.get(); 114 } 115 close_button()116 views::ImageButton* close_button() const { return close_button_; } 117 118 // Paints the icon at the specified coordinates, mirrored for RTL if needed. 119 void PaintIcon(gfx::Canvas* canvas); 120 void PaintTitle(gfx::Canvas* canvas, SkColor title_color); 121 122 // Overridden from AnimationDelegate: 123 virtual void AnimationProgressed(const ui::Animation* animation) OVERRIDE; 124 virtual void AnimationCanceled(const ui::Animation* animation) OVERRIDE; 125 virtual void AnimationEnded(const ui::Animation* animation) OVERRIDE; 126 127 // Overridden from views::ButtonListener: 128 virtual void ButtonPressed(views::Button* sender, 129 const views::Event& event) OVERRIDE; 130 131 // Overridden from views::ContextMenuController: 132 virtual void ShowContextMenuForView(views::View* source, 133 const gfx::Point& p, 134 bool is_mouse_gesture) OVERRIDE; 135 136 // Returns the bounds of the title and icon. 137 virtual const gfx::Rect& GetTitleBounds() const = 0; 138 virtual const gfx::Rect& GetIconBounds() const = 0; 139 140 virtual int loading_animation_frame() const; 141 virtual bool should_display_crashed_favicon() const; 142 virtual int favicon_hiding_offset() const; 143 font()144 static gfx::Font* font() { return font_; } font_height()145 static int font_height() { return font_height_; } 146 147 private: 148 // The animation object used to swap the favicon with the sad tab icon. 149 class FaviconCrashAnimation; 150 151 // Set the temporary offset for the favicon. This is used during the crash 152 // animation. 153 void SetFaviconHidingOffset(int offset); 154 155 void DisplayCrashedFavicon(); 156 void ResetCrashedFavicon(); 157 158 // Starts/Stops the crash animation. 159 void StartCrashAnimation(); 160 void StopCrashAnimation(); 161 162 // Returns true if the crash animation is currently running. 163 bool IsPerformingCrashAnimation() const; 164 165 // Schedules repaint task for icon. 166 void ScheduleIconPaint(); 167 168 static void InitResources(); 169 170 // The controller. 171 // WARNING: this is null during detached tab dragging. 172 TabController* controller_; 173 174 TabRendererData data_; 175 176 // True if the tab is being animated closed. 177 bool closing_; 178 179 // True if the tab is being dragged. 180 bool dragging_; 181 182 // The offset used to animate the favicon location. This is used when the tab 183 // crashes. 184 int favicon_hiding_offset_; 185 186 // The current index of the loading animation. 187 int loading_animation_frame_; 188 189 bool should_display_crashed_favicon_; 190 191 // Pulse animation. 192 scoped_ptr<ui::ThrobAnimation> pulse_animation_; 193 194 // Hover animation. 195 scoped_ptr<ui::SlideAnimation> hover_animation_; 196 197 // Crash animation. 198 scoped_ptr<FaviconCrashAnimation> crash_animation_; 199 200 scoped_refptr<ui::AnimationContainer> animation_container_; 201 202 views::ImageButton* close_button_; 203 204 // Whether to disable throbber animations. Only true if this is an app tab 205 // renderer and a command line flag has been passed in to disable the 206 // animations. 207 bool throbber_disabled_; 208 209 ui::ThemeProvider* theme_provider_; 210 211 static gfx::Font* font_; 212 static int font_height_; 213 214 DISALLOW_COPY_AND_ASSIGN(BaseTab); 215 }; 216 217 #endif // CHROME_BROWSER_UI_VIEWS_TABS_BASE_TAB_H_ 218