1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_UI_GTK_BACK_FORWARD_BUTTON_GTK_H_ 6 #define CHROME_BROWSER_UI_GTK_BACK_FORWARD_BUTTON_GTK_H_ 7 #pragma once 8 9 #include "base/memory/scoped_ptr.h" 10 #include "base/task.h" 11 #include "chrome/browser/ui/gtk/custom_button.h" 12 #include "chrome/browser/ui/gtk/menu_gtk.h" 13 #include "ui/base/gtk/gtk_signal.h" 14 15 class BackForwardMenuModel; 16 class Browser; 17 18 typedef struct _GtkWidget GtkWidget; 19 20 // When clicked, these buttons will navigate forward or backward. When 21 // pressed and held, they show a dropdown menu of recent web sites. 22 class BackForwardButtonGtk : MenuGtk::Delegate { 23 public: 24 BackForwardButtonGtk(Browser* browser, bool is_forward); 25 virtual ~BackForwardButtonGtk(); 26 27 // MenuGtk::Delegate implementation. 28 virtual void StoppedShowing(); 29 virtual bool AlwaysShowIconForCmd(int command_id) const; 30 widget()31 GtkWidget* widget() { return button_->widget(); } 32 33 private: 34 // Executes the browser command. 35 CHROMEGTK_CALLBACK_0(BackForwardButtonGtk, void, OnClick); 36 37 // Starts a timer to show the dropdown menu. 38 CHROMEGTK_CALLBACK_1(BackForwardButtonGtk, gboolean, OnButtonPress, 39 GdkEventButton*); 40 41 // If there is a timer to show the dropdown menu, and the mouse has moved 42 // sufficiently down the screen, cancel the timer and immediately show the 43 // menu. 44 CHROMEGTK_CALLBACK_1(BackForwardButtonGtk, gboolean, OnMouseMove, 45 GdkEventMotion*); 46 47 // Shows the dropdown menu. 48 void ShowBackForwardMenu(int button, guint32 event_time); 49 50 // The menu gets reset every time it is shown. 51 scoped_ptr<MenuGtk> menu_; 52 53 scoped_ptr<CustomDrawButton> button_; 54 55 // The browser to which we will send commands. 56 Browser* browser_; 57 58 // Whether this button is a forward button. 59 bool is_forward_; 60 61 // The dropdown menu model. 62 scoped_ptr<BackForwardMenuModel> menu_model_; 63 64 // The y position of the last mouse down event. 65 int y_position_of_last_press_; 66 67 ScopedRunnableMethodFactory<BackForwardButtonGtk> show_menu_factory_; 68 69 DISALLOW_COPY_AND_ASSIGN(BackForwardButtonGtk); 70 }; 71 72 #endif // CHROME_BROWSER_UI_GTK_BACK_FORWARD_BUTTON_GTK_H_ 73