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_RELOAD_BUTTON_GTK_H_
672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#define CHROME_BROWSER_UI_GTK_RELOAD_BUTTON_GTK_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <gtk/gtk.h>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/timer.h"
1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/custom_button.h"
1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/owned_widget_gtk.h"
15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/common/notification_observer.h"
16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/common/notification_registrar.h"
1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/gtk/gtk_signal.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Browser;
20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass GtkThemeService;
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass LocationBarViewGtk;
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Task;
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ReloadButtonGtk : public NotificationObserver {
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  enum Mode { MODE_RELOAD = 0, MODE_STOP };
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ReloadButtonGtk(LocationBarViewGtk* location_bar, Browser* browser);
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ~ReloadButtonGtk();
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GtkWidget* widget() const { return widget_.get(); }
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Ask for a specified button state.  If |force| is true this will be applied
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // immediately.
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ChangeMode(Mode mode, bool force);
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Provide NotificationObserver implementation.
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Observe(NotificationType type,
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationSource& source,
40513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                       const NotificationDetails& /* details */);
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
43513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  friend class ReloadButtonGtkTest;
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CHROMEGTK_CALLBACK_0(ReloadButtonGtk, void, OnClicked);
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CHROMEGTK_CALLBACK_1(ReloadButtonGtk, gboolean, OnExpose, GdkEventExpose*);
47513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  CHROMEGTK_CALLBACK_1(ReloadButtonGtk,
48513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                       gboolean,
49513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                       OnLeaveNotify,
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       GdkEventCrossing*);
51513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  CHROMEGTK_CALLBACK_4(ReloadButtonGtk,
52513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                       gboolean,
53513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                       OnQueryTooltip,
54513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                       gint,
55513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                       gint,
56513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                       gboolean,
57513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                       GtkTooltip*);
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void UpdateThemeButtons();
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
61513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void OnDoubleClickTimer();
62513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void OnStopToReloadTimer();
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
64513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  base::OneShotTimer<ReloadButtonGtk> double_click_timer_;
65513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  base::OneShotTimer<ReloadButtonGtk> stop_to_reload_timer_;
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
67513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // These may be NULL when testing.
68513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  LocationBarViewGtk* const location_bar_;
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Browser* const browser_;
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
71513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // The mode we should be in assuming no timers are running.
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Mode intended_mode_;
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
74513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // The currently-visible mode - this may differ from the intended mode.
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Mode visible_mode_;
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
77513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Used to listen for theme change notifications.
78513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  NotificationRegistrar registrar_;
79513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  GtkThemeService* theme_service_;
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CustomDrawButtonBase reload_;
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CustomDrawButtonBase stop_;
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CustomDrawHoverController hover_controller_;
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  OwnedWidgetGtk widget_;
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
88513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // The delay times for the timers.  These are members so that tests can modify
89513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // them.
90513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  base::TimeDelta double_click_timer_delay_;
91513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  base::TimeDelta stop_to_reload_timer_delay_;
92513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
93513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // TESTING ONLY
94513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // True if we should pretend the button is hovered.
95513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  bool testing_mouse_hovered_;
96513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Increments when we would tell the browser to "reload", so
97513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // test code can tell whether we did so (as there may be no |browser_|).
98513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  int testing_reload_count_;
99513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_IMPLICIT_CONSTRUCTORS(ReloadButtonGtk);
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
10372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#endif  // CHROME_BROWSER_UI_GTK_RELOAD_BUTTON_GTK_H_
104