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 // This class replicates some menubar behaviors that are tricky to get right. 6 // It is used to create a more native feel for the bookmark bar. 7 8 #ifndef CHROME_BROWSER_UI_GTK_MENU_BAR_HELPER_H_ 9 #define CHROME_BROWSER_UI_GTK_MENU_BAR_HELPER_H_ 10 #pragma once 11 12 #include <gtk/gtk.h> 13 14 #include <vector> 15 16 #include "base/memory/scoped_ptr.h" 17 #include "ui/base/gtk/gtk_signal.h" 18 19 namespace ui { 20 class GtkSignalRegistrar; 21 } 22 23 class MenuBarHelper { 24 public: 25 class Delegate { 26 public: ~Delegate()27 virtual ~Delegate() {} 28 29 // Called when a the menu for a button ought to be triggered. 30 virtual void PopupForButton(GtkWidget* button) = 0; 31 virtual void PopupForButtonNextTo(GtkWidget* button, 32 GtkMenuDirectionType dir) = 0; 33 }; 34 35 // |delegate| cannot be null. 36 explicit MenuBarHelper(Delegate* delegate); 37 virtual ~MenuBarHelper(); 38 39 // Must be called whenever a button's menu starts showing. It triggers the 40 // MenuBarHelper to start listening for certain events. 41 void MenuStartedShowing(GtkWidget* button, GtkWidget* menu); 42 43 // Add |button| to the set of buttons we care about. 44 void Add(GtkWidget* button); 45 46 // Remove |button| from the set of buttons we care about. 47 void Remove(GtkWidget* button); 48 49 // Clear all buttons from the set. 50 void Clear(); 51 52 private: 53 CHROMEGTK_CALLBACK_0(MenuBarHelper, void, OnMenuHiddenOrDestroyed); 54 CHROMEGTK_CALLBACK_1(MenuBarHelper, gboolean, OnMenuMotionNotify, 55 GdkEventMotion*); 56 CHROMEGTK_CALLBACK_1(MenuBarHelper, void, OnMenuMoveCurrent, 57 GtkMenuDirectionType); 58 59 // The buttons for which we pop up menus. We do not own these, or even add 60 // refs to them. 61 std::vector<GtkWidget*> buttons_; 62 63 // The button that is currently showing a menu, or NULL. 64 GtkWidget* button_showing_menu_; 65 66 // The highest level menu that is currently showing, or NULL. 67 GtkWidget* showing_menu_; 68 69 // All the submenus of |showing_menu_|. We connect to motion events on all 70 // of them. 71 std::vector<GtkWidget*> submenus_; 72 73 // Signal handlers that are attached only between the "show" and "hide" events 74 // for the menu. 75 scoped_ptr<ui::GtkSignalRegistrar> signal_handlers_; 76 77 Delegate* delegate_; 78 }; 79 80 #endif // CHROME_BROWSER_UI_GTK_MENU_BAR_HELPER_H_ 81