Home | History | Annotate | Download | only in gtk
      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:
     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