| // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROME_BROWSER_UI_VIEWS_TABS_BASE_TAB_H_ |
| #define CHROME_BROWSER_UI_VIEWS_TABS_BASE_TAB_H_ |
| #pragma once |
| |
| #include "base/memory/ref_counted.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "chrome/browser/ui/views/tabs/tab_renderer_data.h" |
| #include "ui/base/animation/animation_delegate.h" |
| #include "views/controls/button/button.h" |
| #include "views/view.h" |
| |
| class BaseTab; |
| class TabController; |
| |
| namespace gfx { |
| class Font; |
| } |
| |
| namespace ui { |
| class AnimationContainer; |
| class SlideAnimation; |
| class ThrobAnimation; |
| } |
| |
| namespace views { |
| class ImageButton; |
| } |
| |
| // Base class for tab renderers. |
| class BaseTab : public ui::AnimationDelegate, |
| public views::ButtonListener, |
| public views::ContextMenuController, |
| public views::View { |
| public: |
| explicit BaseTab(TabController* controller); |
| virtual ~BaseTab(); |
| |
| // Sets the data this tabs displays. Invokes DataChanged for subclasses to |
| // update themselves appropriately. |
| void SetData(const TabRendererData& data); |
| const TabRendererData& data() const { return data_; } |
| |
| // Sets the network state. If the network state changes NetworkStateChanged is |
| // invoked. |
| virtual void UpdateLoadingAnimation(TabRendererData::NetworkState state); |
| |
| // Starts/Stops a pulse animation. |
| void StartPulse(); |
| void StopPulse(); |
| |
| // Used to set/check whether this Tab is being animated closed. |
| void set_closing(bool closing) { closing_ = closing; } |
| bool closing() const { return closing_; } |
| |
| // See description above field. |
| void set_dragging(bool dragging) { dragging_ = dragging; } |
| bool dragging() const { return dragging_; } |
| |
| // Sets the container all animations run from. |
| void set_animation_container(ui::AnimationContainer* container); |
| ui::AnimationContainer* animation_container() const { |
| return animation_container_.get(); |
| } |
| |
| // Set the theme provider - because we get detached, we are frequently |
| // outside of a hierarchy with a theme provider at the top. This should be |
| // called whenever we're detached or attached to a hierarchy. |
| void set_theme_provider(ui::ThemeProvider* provider) { |
| theme_provider_ = provider; |
| } |
| |
| // Returns true if the tab is closeable. |
| bool IsCloseable() const; |
| |
| // Returns true if this tab is the active tab. |
| bool IsActive() const; |
| |
| // Returns true if the tab is selected. |
| virtual bool IsSelected() const; |
| |
| // Overridden from views::View: |
| virtual ThemeProvider* GetThemeProvider() const OVERRIDE; |
| virtual bool OnMousePressed(const views::MouseEvent& event) OVERRIDE; |
| virtual bool OnMouseDragged(const views::MouseEvent& event) OVERRIDE; |
| virtual void OnMouseReleased(const views::MouseEvent& event) OVERRIDE; |
| virtual void OnMouseCaptureLost() OVERRIDE; |
| virtual void OnMouseEntered(const views::MouseEvent& event) OVERRIDE; |
| virtual void OnMouseExited(const views::MouseEvent& event) OVERRIDE; |
| virtual bool GetTooltipText(const gfx::Point& p, |
| std::wstring* tooltip) OVERRIDE; |
| virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE; |
| |
| protected: |
| // Invoked from SetData after |data_| has been updated to the new data. |
| virtual void DataChanged(const TabRendererData& old) {} |
| |
| // Invoked if data_.network_state changes, or the network_state is not none. |
| virtual void AdvanceLoadingAnimation(TabRendererData::NetworkState old_state, |
| TabRendererData::NetworkState state); |
| |
| TabController* controller() const { return controller_; } |
| |
| // Returns the pulse animation. The pulse animation is non-null if StartPulse |
| // has been invoked. |
| ui::ThrobAnimation* pulse_animation() const { return pulse_animation_.get(); } |
| |
| // Returns the hover animation. This may return null. |
| const ui::SlideAnimation* hover_animation() const { |
| return hover_animation_.get(); |
| } |
| |
| views::ImageButton* close_button() const { return close_button_; } |
| |
| // Paints the icon at the specified coordinates, mirrored for RTL if needed. |
| void PaintIcon(gfx::Canvas* canvas); |
| void PaintTitle(gfx::Canvas* canvas, SkColor title_color); |
| |
| // Overridden from AnimationDelegate: |
| virtual void AnimationProgressed(const ui::Animation* animation) OVERRIDE; |
| virtual void AnimationCanceled(const ui::Animation* animation) OVERRIDE; |
| virtual void AnimationEnded(const ui::Animation* animation) OVERRIDE; |
| |
| // Overridden from views::ButtonListener: |
| virtual void ButtonPressed(views::Button* sender, |
| const views::Event& event) OVERRIDE; |
| |
| // Overridden from views::ContextMenuController: |
| virtual void ShowContextMenuForView(views::View* source, |
| const gfx::Point& p, |
| bool is_mouse_gesture) OVERRIDE; |
| |
| // Returns the bounds of the title and icon. |
| virtual const gfx::Rect& GetTitleBounds() const = 0; |
| virtual const gfx::Rect& GetIconBounds() const = 0; |
| |
| virtual int loading_animation_frame() const; |
| virtual bool should_display_crashed_favicon() const; |
| virtual int favicon_hiding_offset() const; |
| |
| static gfx::Font* font() { return font_; } |
| static int font_height() { return font_height_; } |
| |
| private: |
| // The animation object used to swap the favicon with the sad tab icon. |
| class FaviconCrashAnimation; |
| |
| // Set the temporary offset for the favicon. This is used during the crash |
| // animation. |
| void SetFaviconHidingOffset(int offset); |
| |
| void DisplayCrashedFavicon(); |
| void ResetCrashedFavicon(); |
| |
| // Starts/Stops the crash animation. |
| void StartCrashAnimation(); |
| void StopCrashAnimation(); |
| |
| // Returns true if the crash animation is currently running. |
| bool IsPerformingCrashAnimation() const; |
| |
| // Schedules repaint task for icon. |
| void ScheduleIconPaint(); |
| |
| static void InitResources(); |
| |
| // The controller. |
| // WARNING: this is null during detached tab dragging. |
| TabController* controller_; |
| |
| TabRendererData data_; |
| |
| // True if the tab is being animated closed. |
| bool closing_; |
| |
| // True if the tab is being dragged. |
| bool dragging_; |
| |
| // The offset used to animate the favicon location. This is used when the tab |
| // crashes. |
| int favicon_hiding_offset_; |
| |
| // The current index of the loading animation. |
| int loading_animation_frame_; |
| |
| bool should_display_crashed_favicon_; |
| |
| // Pulse animation. |
| scoped_ptr<ui::ThrobAnimation> pulse_animation_; |
| |
| // Hover animation. |
| scoped_ptr<ui::SlideAnimation> hover_animation_; |
| |
| // Crash animation. |
| scoped_ptr<FaviconCrashAnimation> crash_animation_; |
| |
| scoped_refptr<ui::AnimationContainer> animation_container_; |
| |
| views::ImageButton* close_button_; |
| |
| // Whether to disable throbber animations. Only true if this is an app tab |
| // renderer and a command line flag has been passed in to disable the |
| // animations. |
| bool throbber_disabled_; |
| |
| ui::ThemeProvider* theme_provider_; |
| |
| static gfx::Font* font_; |
| static int font_height_; |
| |
| DISALLOW_COPY_AND_ASSIGN(BaseTab); |
| }; |
| |
| #endif // CHROME_BROWSER_UI_VIEWS_TABS_BASE_TAB_H_ |