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