// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // This class replicates some menubar behaviors that are tricky to get right. // It is used to create a more native feel for the bookmark bar. #ifndef CHROME_BROWSER_GTK_MENU_BAR_HELPER_H_ #define CHROME_BROWSER_GTK_MENU_BAR_HELPER_H_ #pragma once #include #include #include "app/gtk_signal.h" #include "base/scoped_ptr.h" class GtkSignalRegistrar; class MenuBarHelper { public: class Delegate { public: virtual ~Delegate() {} // Called when a the menu for a button ought to be triggered. virtual void PopupForButton(GtkWidget* button) = 0; virtual void PopupForButtonNextTo(GtkWidget* button, GtkMenuDirectionType dir) = 0; }; // |delegate| cannot be null. explicit MenuBarHelper(Delegate* delegate); virtual ~MenuBarHelper(); // Must be called whenever a button's menu starts showing. It triggers the // MenuBarHelper to start listening for certain events. void MenuStartedShowing(GtkWidget* button, GtkWidget* menu); // Add |button| to the set of buttons we care about. void Add(GtkWidget* button); // Remove |button| from the set of buttons we care about. void Remove(GtkWidget* button); // Clear all buttons from the set. void Clear(); private: CHROMEGTK_CALLBACK_0(MenuBarHelper, void, OnMenuHiddenOrDestroyed); CHROMEGTK_CALLBACK_1(MenuBarHelper, gboolean, OnMenuMotionNotify, GdkEventMotion*); CHROMEGTK_CALLBACK_1(MenuBarHelper, void, OnMenuMoveCurrent, GtkMenuDirectionType); // The buttons for which we pop up menus. We do not own these, or even add // refs to them. std::vector buttons_; // The button that is currently showing a menu, or NULL. GtkWidget* button_showing_menu_; // The highest level menu that is currently showing, or NULL. GtkWidget* showing_menu_; // All the submenus of |showing_menu_|. We connect to motion events on all // of them. std::vector submenus_; // Signal handlers that are attached only between the "show" and "hide" events // for the menu. scoped_ptr signal_handlers_; Delegate* delegate_; }; #endif // CHROME_BROWSER_GTK_MENU_BAR_HELPER_H_