172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#ifndef CHROME_BROWSER_UI_GTK_TABS_TAB_RENDERER_GTK_H_
672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#define CHROME_BROWSER_UI_GTK_TABS_TAB_RENDERER_GTK_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <gtk/gtk.h>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <map>
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string16.h"
1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/owned_widget_gtk.h"
16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/common/notification_observer.h"
17dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/common/notification_registrar.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "third_party/skia/include/core/SkBitmap.h"
193f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "ui/base/animation/animation_delegate.h"
2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/gtk/gtk_signal.h"
2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/canvas.h"
2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/font.h"
2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/rect.h"
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace gfx {
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Size;
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace gfx
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass CustomDrawButton;
30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass GtkThemeService;
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TabContents;
323f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
333f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsennamespace ui {
343f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsenclass SlideAnimation;
3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass ThemeProvider;
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ThrobAnimation;
373f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen}
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
393f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsenclass TabRendererGtk : public ui::AnimationDelegate,
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       public NotificationObserver {
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Possible animation states.
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  enum AnimationState {
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ANIMATION_NONE,
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ANIMATION_WAITING,
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ANIMATION_LOADING
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  class LoadingAnimation : public NotificationObserver {
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   public:
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    struct Data {
5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      explicit Data(ui::ThemeProvider* theme_provider);
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Data(int loading, int waiting, int waiting_to_loading);
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      SkBitmap* waiting_animation_frames;
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      SkBitmap* loading_animation_frames;
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      int loading_animation_frame_count;
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      int waiting_animation_frame_count;
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      int waiting_to_loading_frame_count_ratio;
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    };
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    explicit LoadingAnimation(ui::ThemeProvider* theme_provider);
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Used in unit tests to inject specific data.
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    explicit LoadingAnimation(const LoadingAnimation::Data& data);
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
67731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    virtual ~LoadingAnimation();
68731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Advance the loading animation to the next frame, or hide the animation if
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // the tab isn't loading. Returns |true| if the icon area needs to be
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // repainted.
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool ValidateLoadingAnimation(AnimationState animation_state);
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    AnimationState animation_state() const { return animation_state_; }
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int animation_frame() const { return animation_frame_; }
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const SkBitmap* waiting_animation_frames() const {
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return data_->waiting_animation_frames;
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const SkBitmap* loading_animation_frames() const {
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return data_->loading_animation_frames;
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Provide NotificationObserver implementation.
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual void Observe(NotificationType type,
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         const NotificationSource& source,
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         const NotificationDetails& details);
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   private:
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    scoped_ptr<Data> data_;
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Used to listen for theme change notifications.
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NotificationRegistrar registrar_;
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Gives us our throbber images.
96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ui::ThemeProvider* theme_service_;
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Current state of the animation.
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    AnimationState animation_state_;
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // The current index into the Animation image strip.
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int animation_frame_;
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DISALLOW_COPY_AND_ASSIGN(LoadingAnimation);
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  explicit TabRendererGtk(ui::ThemeProvider* theme_provider);
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~TabRendererGtk();
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TabContents. If only the loading state was updated, the loading_only flag
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // should be specified. If other things change, set this flag to false to
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // update everything.
113731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void UpdateData(TabContents* contents, bool app, bool loading_only);
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sets the blocked state of the tab.
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetBlocked(bool pinned);
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool is_blocked() const;
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sets the mini-state of the tab.
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_mini(bool mini) { data_.mini = mini; }
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool mini() const { return data_.mini; }
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sets the app state of the tab.
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_app(bool app) { data_.app = app; }
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool app() const { return data_.app; }
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Are we in the process of animating a mini tab state change on this tab?
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_animating_mini_change(bool value) {
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    data_.animating_mini_change = value;
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Updates the display to reflect the contents of this TabRenderer's model.
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void UpdateFromModel();
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns true if the Tab is selected, false otherwise.
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool IsSelected() const;
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns true if the Tab is visible, false otherwise.
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool IsVisible() const;
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sets the visibility of the Tab.
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void SetVisible(bool visible) const;
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Paints the tab into |canvas|.
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Paint(gfx::Canvas* canvas);
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Paints the tab into a SkBitmap.
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual SkBitmap PaintBitmap();
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Paints the tab, and keeps the result server-side. The returned surface must
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // be freed with cairo_surface_destroy().
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual cairo_surface_t* PaintToSurface();
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // There is no PaintNow available, so the fastest we can do is schedule a
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // paint with the windowing system.
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void SchedulePaint();
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Notifies the Tab that the close button has been clicked.
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void CloseButtonClicked();
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sets the bounds of the tab.
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void SetBounds(const gfx::Rect& bounds);
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Provide NotificationObserver implementation.
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Observe(NotificationType type,
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationSource& source,
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationDetails& details);
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Advance the loading animation to the next frame, or hide the animation if
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the tab isn't loading.  Returns |true| if the icon area needs to be
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // repainted.
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool ValidateLoadingAnimation(AnimationState animation_state);
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Repaint only the area of the tab that contains the favicon.
175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void PaintFaviconArea(GdkEventExpose* event);
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
177513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Returns whether the Tab should display a favicon.
178513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  bool ShouldShowIcon() const;
179513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the minimum possible size of a single unselected Tab.
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static gfx::Size GetMinimumUnselectedSize();
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the minimum possible size of a selected Tab. Selected tabs must
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // always show a close button and have a larger minimum size than unselected
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // tabs.
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static gfx::Size GetMinimumSelectedSize();
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the preferred size of a single Tab, assuming space is
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // available.
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static gfx::Size GetStandardSize();
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the width for mini-tabs. Mini-tabs always have this width.
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static int GetMiniWidth();
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Loads the images to be used for the tab background.
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void LoadTabImages();
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sets the colors used for painting text on the tabs.
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void SetSelectedTitleColor(SkColor color);
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void SetUnselectedTitleColor(SkColor color);
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static gfx::Font* title_font() { return title_font_; }
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the bounds of the Tab.
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int x() const { return bounds_.x(); }
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int y() const { return bounds_.y(); }
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int width() const { return bounds_.width(); }
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int height() const { return bounds_.height(); }
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Rect bounds() const { return bounds_; }
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Rect favicon_bounds() const { return favicon_bounds_; }
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the non-mirrored (LTR) bounds of this tab.
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Rect GetNonMirroredBounds(GtkWidget* parent) const;
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the requested bounds of the tab.
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Rect GetRequisition() const;
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GtkWidget* widget() const { return tab_.get(); }
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Start/stop the mini-tab title animation.
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void StartMiniTabTitleAnimation();
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void StopMiniTabTitleAnimation();
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_vertical_offset(int offset) { background_offset_y_ = offset; }
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const gfx::Rect& title_bounds() const { return title_bounds_; }
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const gfx::Rect& close_button_bounds() const { return close_button_bounds_; }
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the title of the Tab.
2313f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  string16 GetTitle() const;
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // enter-notify-event handler that signals when the mouse enters the tab.
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CHROMEGTK_CALLBACK_1(TabRendererGtk, gboolean, OnEnterNotifyEvent,
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       GdkEventCrossing*);
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // leave-notify-event handler that signals when the mouse enters the tab.
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CHROMEGTK_CALLBACK_1(TabRendererGtk, gboolean, OnLeaveNotifyEvent,
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       GdkEventCrossing*);
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
242ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  class FaviconCrashAnimation;
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The data structure used to hold cached bitmaps.  We need to manually free
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the bitmap in CachedBitmap when we remove it from |cached_bitmaps_|.  We
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // handle this when we replace images in the map and in the destructor.
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  struct CachedBitmap {
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int bg_offset_x;
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int bg_offset_y;
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    SkBitmap* bitmap;
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef std::map<std::pair<const SkBitmap*, const SkBitmap*>, CachedBitmap>
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      BitmapCache;
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Model data. We store this here so that we don't need to ask the underlying
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // model, which is tricky since instances of this object can outlive the
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // corresponding objects in the underlying model.
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  struct TabData {
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    TabData()
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        : is_default_favicon(false),
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          loading(false),
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          crashed(false),
263ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          incognito(false),
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          show_icon(true),
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          mini(false),
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          blocked(false),
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          animating_mini_change(false),
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          app(false) {
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    SkBitmap favicon;
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool is_default_favicon;
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    string16 title;
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool loading;
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool crashed;
276ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    bool incognito;
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool show_icon;
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool mini;
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool blocked;
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool animating_mini_change;
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool app;
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(jhawkins): Move into TabResources class.
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  struct TabImage {
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    SkBitmap* image_l;
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    SkBitmap* image_c;
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    SkBitmap* image_r;
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int l_width;
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int r_width;
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int y_offset;
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2943f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // Overridden from ui::AnimationDelegate:
2953f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual void AnimationProgressed(const ui::Animation* animation);
2963f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual void AnimationCanceled(const ui::Animation* animation);
2973f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual void AnimationEnded(const ui::Animation* animation);
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Starts/Stops the crash animation.
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void StartCrashAnimation();
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void StopCrashAnimation();
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Return true if the crash animation is currently running.
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool IsPerformingCrashAnimation() const;
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Set the temporary offset for the favicon. This is used during animation.
307ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void SetFaviconHidingOffset(int offset);
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
309ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void DisplayCrashedFavicon();
310ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void ResetCrashedFavicon();
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Generates the bounds for the interior items of the tab.
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Layout();
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the local bounds of the tab.  This returns the rect
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // {0, 0, width(), height()} for now, as we don't yet support borders.
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Rect GetLocalBounds();
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Moves the close button widget within the GtkFixed container.
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void MoveCloseButtonWidget();
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the largest of the favicon, title text, and the close button.
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static int GetContentHeight();
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // A helper method for generating the masked bitmaps used to draw the curved
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // edges of tabs.  We cache the generated bitmaps because they can take a
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // long time to compute.
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SkBitmap* GetMaskedBitmap(const SkBitmap* mask,
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            const SkBitmap* background,
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            int bg_offset_x,
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            int bg_offset_y);
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BitmapCache cached_bitmaps_;
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Paints the tab, minus the close button.
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void PaintTab(GdkEventExpose* event);
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Paint various portions of the Tab
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void PaintTitle(gfx::Canvas* canvas);
339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void PaintIcon(gfx::Canvas* canvas);
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void PaintTabBackground(gfx::Canvas* canvas);
341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void PaintInactiveTabBackground(gfx::Canvas* canvas);
342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void PaintActiveTabBackground(gfx::Canvas* canvas);
343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void PaintLoadingAnimation(gfx::Canvas* canvas);
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the number of favicon-size elements that can fit in the tab's
346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // current size.
347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int IconCapacity() const;
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns whether the Tab should display a close button.
351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool ShouldShowCloseBox() const;
352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CustomDrawButton* MakeCloseButton();
354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Gets the throb value for the tab. When a tab is not selected the
356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // active background is drawn at |GetThrobValue()|%. This is used for hover
357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // and mini-tab title change effects.
358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  double GetThrobValue();
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Handles the clicked signal for the close button.
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CHROMEGTK_CALLBACK_0(TabRendererGtk, void, OnCloseButtonClicked);
362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Handles middle clicking the close button.
364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CHROMEGTK_CALLBACK_1(TabRendererGtk, gboolean, OnCloseButtonMouseRelease,
365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       GdkEventButton*);
366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // expose-event handler that redraws the tab.
368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CHROMEGTK_CALLBACK_1(TabRendererGtk, gboolean, OnExposeEvent,
369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       GdkEventExpose*);
370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // size-allocate handler used to update the current bounds of the tab.
372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CHROMEGTK_CALLBACK_1(TabRendererGtk, void, OnSizeAllocate, GtkAllocation*);
373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(jhawkins): Move to TabResources.
375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void InitResources();
376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static bool initialized_;
377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The bounds of various sections of the display.
379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Rect favicon_bounds_;
380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Rect title_bounds_;
381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Rect close_button_bounds_;
382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TabData data_;
384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static TabImage tab_active_;
386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static TabImage tab_inactive_;
387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static TabImage tab_alpha_;
388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static gfx::Font* title_font_;
390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static int title_font_height_;
391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static int close_button_width_;
393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static int close_button_height_;
394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static SkColor selected_title_color_;
396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static SkColor unselected_title_color_;
397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The GtkDrawingArea we draw the tab on.
399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  OwnedWidgetGtk tab_;
400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Whether we're showing the icon. It is cached so that we can detect when it
402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // changes and layout appropriately.
403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool showing_icon_;
404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Whether we are showing the close button. It is cached so that we can
406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // detect when it changes and layout appropriately.
407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool showing_close_button_;
408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The offset used to animate the favicon location.
410ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  int favicon_hiding_offset_;
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The animation object used to swap the favicon with the sad tab icon.
413ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_ptr<FaviconCrashAnimation> crash_animation_;
414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Set when the crashed favicon should be displayed.
416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool should_display_crashed_favicon_;
417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The bounds of this Tab.
419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Rect bounds_;
420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The requested bounds of this tab.  These bounds are relative to the
422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // tabstrip.
423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Rect requisition_;
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Hover animation.
4263f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  scoped_ptr<ui::SlideAnimation> hover_animation_;
427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Animation used when the title of an inactive mini-tab changes.
4293f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  scoped_ptr<ui::ThrobAnimation> mini_title_animation_;
430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Contains the loading animation state.
432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  LoadingAnimation loading_animation_;
433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The offset used to paint the tab theme images.
435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int background_offset_x_;
436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The vertical offset used to paint the tab theme images. Controlled by the
438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // tabstrip and plumbed here to offset the theme image by the size of the
439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // alignment in the BrowserTitlebar.
440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int background_offset_y_;
441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
442ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  GtkThemeService* theme_service_;
443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The close button.
445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<CustomDrawButton> close_button_;
446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The current color of the close button.
448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SkColor close_button_color_;
449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Used to listen for theme change notifications.
451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationRegistrar registrar_;
452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(TabRendererGtk);
454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
45672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#endif  // CHROME_BROWSER_UI_GTK_TABS_TAB_RENDERER_GTK_H_
457