• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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