blob: 6da8266576c439089ca5d1b8bc78cbc6b7bf9508 [file] [log] [blame]
// 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_