diff options
author | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-09 00:45:07 +0000 |
---|---|---|
committer | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-09 00:45:07 +0000 |
commit | 619a24b515ce3a707d73d8454447e506dadde6a8 (patch) | |
tree | 944ba78bfaf2cd8d3fd83b5a166ae1871323ae32 /chrome/browser | |
parent | 7683968750635359528e238bcffc50c4f586cf24 (diff) | |
download | chromium_src-619a24b515ce3a707d73d8454447e506dadde6a8.zip chromium_src-619a24b515ce3a707d73d8454447e506dadde6a8.tar.gz chromium_src-619a24b515ce3a707d73d8454447e506dadde6a8.tar.bz2 |
GTK: Switch the page/app menus over to the new menu bar helper class.
BUG=19675
Review URL: http://codereview.chromium.org/193052
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@25692 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser')
-rw-r--r-- | chrome/browser/gtk/browser_toolbar_gtk.cc | 71 | ||||
-rw-r--r-- | chrome/browser/gtk/browser_toolbar_gtk.h | 20 |
2 files changed, 34 insertions, 57 deletions
diff --git a/chrome/browser/gtk/browser_toolbar_gtk.cc b/chrome/browser/gtk/browser_toolbar_gtk.cc index 79bd45d..3bced3d 100644 --- a/chrome/browser/gtk/browser_toolbar_gtk.cc +++ b/chrome/browser/gtk/browser_toolbar_gtk.cc @@ -82,7 +82,8 @@ BrowserToolbarGtk::BrowserToolbarGtk(Browser* browser, BrowserWindowGtk* window) model_(browser->toolbar_model()), browser_(browser), window_(window), - profile_(NULL) { + profile_(NULL), + menu_bar_helper_(this) { browser_->command_updater()->AddCommandObserver(IDC_BACK, this); browser_->command_updater()->AddCommandObserver(IDC_FORWARD, this); browser_->command_updater()->AddCommandObserver(IDC_RELOAD, this); @@ -219,6 +220,7 @@ void BrowserToolbarGtk::Init(Profile* profile, GtkWidget* page_menu = BuildToolbarMenuButton( l10n_util::GetStringUTF8(IDS_PAGEMENU_TOOLTIP), &page_menu_button_); + menu_bar_helper_.Add(page_menu_button_.get()); page_menu_image_ = gtk_image_new_from_pixbuf( theme_provider_->GetRTLEnabledPixbufNamed(IDR_MENU_PAGE)); gtk_container_add(GTK_CONTAINER(page_menu), page_menu_image_); @@ -226,24 +228,17 @@ void BrowserToolbarGtk::Init(Profile* profile, encodings_menu_.reset(BuildEncodingsMenu(profile, this)); page_menu_.reset(new MenuGtk(this, GetStandardPageMenu(encodings_menu_.get()), accel_group_)); - g_signal_connect(page_menu_->widget(), "motion-notify-event", - G_CALLBACK(OnPageAppMenuMouseMotion), this); - g_signal_connect(page_menu_->widget(), "move-current", - G_CALLBACK(OnPageAppMenuMoveCurrent), this); gtk_box_pack_start(GTK_BOX(menus_hbox_), page_menu, FALSE, FALSE, 0); GtkWidget* chrome_menu = BuildToolbarMenuButton( l10n_util::GetStringFUTF8(IDS_APPMENU_TOOLTIP, WideToUTF16(l10n_util::GetString(IDS_PRODUCT_NAME))), &app_menu_button_); + menu_bar_helper_.Add(app_menu_button_.get()); app_menu_image_ = gtk_image_new_from_pixbuf( theme_provider_->GetRTLEnabledPixbufNamed(IDR_MENU_CHROME)); gtk_container_add(GTK_CONTAINER(chrome_menu), app_menu_image_); app_menu_.reset(new MenuGtk(this, GetStandardAppMenu(), accel_group_)); - g_signal_connect(app_menu_->widget(), "motion-notify-event", - G_CALLBACK(OnPageAppMenuMouseMotion), this); - g_signal_connect(app_menu_->widget(), "move-current", - G_CALLBACK(OnPageAppMenuMoveCurrent), this); gtk_box_pack_start(GTK_BOX(menus_hbox_), chrome_menu, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(toolbar_), menus_hbox_, FALSE, FALSE, 0); @@ -646,6 +641,7 @@ gboolean BrowserToolbarGtk::OnMenuButtonPressEvent(GtkWidget* button, MenuGtk* menu = button == toolbar->page_menu_button_.get() ? toolbar->page_menu_.get() : toolbar->app_menu_.get(); menu->Popup(button, reinterpret_cast<GdkEvent*>(event)); + toolbar->menu_bar_helper_.MenuStartedShowing(button, menu->widget()); return TRUE; } @@ -653,11 +649,7 @@ gboolean BrowserToolbarGtk::OnMenuButtonPressEvent(GtkWidget* button, // static gboolean BrowserToolbarGtk::OnMenuClicked(GtkWidget* button, BrowserToolbarGtk* toolbar) { - gtk_chrome_button_set_paint_state(GTK_CHROME_BUTTON(button), - GTK_STATE_ACTIVE); - MenuGtk* menu = button == toolbar->page_menu_button_.get() ? - toolbar->page_menu_.get() : toolbar->app_menu_.get(); - menu->PopupAsFromKeyEvent(button); + toolbar->PopupForButton(button); return TRUE; } @@ -685,41 +677,26 @@ void BrowserToolbarGtk::OnDragDataReceived(GtkWidget* widget, } } -// static -gboolean BrowserToolbarGtk::OnPageAppMenuMouseMotion(GtkWidget* menu, - GdkEventMotion* event, BrowserToolbarGtk* toolbar) { - if (gtk_util::WidgetContainsCursor(menu == toolbar->app_menu_->widget() ? - toolbar->page_menu_button_.get() : - toolbar->app_menu_button_.get())) { - toolbar->ChangeActiveMenu(menu, event->time); - return TRUE; - } - - return FALSE; +bool BrowserToolbarGtk::ShouldOnlyShowLocation() const { + // If we're a popup window, only show the location bar (omnibox). + return browser_->type() != Browser::TYPE_NORMAL; } -// static -void BrowserToolbarGtk::OnPageAppMenuMoveCurrent(GtkWidget* menu, - GtkMenuDirectionType dir, BrowserToolbarGtk* toolbar) { - GtkWidget* active_item = GTK_MENU_SHELL(menu)->active_menu_item; - - switch (dir) { - case GTK_MENU_DIR_CHILD: - // The move is going to open a submenu; don't override default behavior. - if (active_item && gtk_menu_item_get_submenu(GTK_MENU_ITEM(active_item))) - break; - // Fall through. - case GTK_MENU_DIR_PARENT: - toolbar->ChangeActiveMenu(menu, gtk_get_current_event_time()); - // This signal doesn't have a return value; we have to manually stop its - // propagation. - g_signal_stop_emission_by_name(menu, "move-current"); - default: - break; - } +void BrowserToolbarGtk::PopupForButton(GtkWidget* button) { + page_menu_->Cancel(); + app_menu_->Cancel(); + + gtk_chrome_button_set_paint_state(GTK_CHROME_BUTTON(button), + GTK_STATE_ACTIVE); + MenuGtk* menu = button == page_menu_button_.get() ? + page_menu_.get() : app_menu_.get(); + menu->PopupAsFromKeyEvent(button); + menu_bar_helper_.MenuStartedShowing(button, menu->widget()); } -bool BrowserToolbarGtk::ShouldOnlyShowLocation() const { - // If we're a popup window, only show the location bar (omnibox). - return browser_->type() != Browser::TYPE_NORMAL; +void BrowserToolbarGtk::PopupForButtonNextTo(GtkWidget* button, + GtkMenuDirectionType dir) { + GtkWidget* other_button = button == page_menu_button_.get() ? + app_menu_button_.get() : page_menu_button_.get(); + PopupForButton(other_button); } diff --git a/chrome/browser/gtk/browser_toolbar_gtk.h b/chrome/browser/gtk/browser_toolbar_gtk.h index 35e0f85..07f0173 100644 --- a/chrome/browser/gtk/browser_toolbar_gtk.h +++ b/chrome/browser/gtk/browser_toolbar_gtk.h @@ -11,6 +11,7 @@ #include "base/scoped_ptr.h" #include "chrome/browser/autocomplete/autocomplete_popup_view.h" #include "chrome/browser/command_updater.h" +#include "chrome/browser/gtk/menu_bar_helper.h" #include "chrome/browser/gtk/menu_gtk.h" #include "chrome/common/notification_observer.h" #include "chrome/common/notification_registrar.h" @@ -34,7 +35,8 @@ class ToolbarStarToggleGtk; class BrowserToolbarGtk : public CommandUpdater::CommandObserver, public MenuGtk::Delegate, public NotificationObserver, - public AutocompletePopupPositioner { + public AutocompletePopupPositioner, + public MenuBarHelper::Delegate { public: explicit BrowserToolbarGtk(Browser* browser, BrowserWindowGtk* window); virtual ~BrowserToolbarGtk(); @@ -89,6 +91,11 @@ class BrowserToolbarGtk : public CommandUpdater::CommandObserver, // Omnibox results popup should go (from the star to the go buttons). virtual gfx::Rect GetPopupBounds() const; + // MenuBarHelper::Delegate implementation ------------------------------------ + virtual void PopupForButton(GtkWidget* button); + virtual void PopupForButtonNextTo(GtkWidget* button, + GtkMenuDirectionType dir); + private: // Builds a toolbar button with all the properties set. // |spacing| is the width of padding (in pixels) on the left and right of the @@ -143,15 +150,6 @@ class BrowserToolbarGtk : public CommandUpdater::CommandObserver, guint info, guint time, BrowserToolbarGtk* toolbar); - // These event handlers are used to fake menu-bar behavior in the page and - // app menus. - static gboolean OnPageAppMenuMouseMotion(GtkWidget* widget, - GdkEventMotion* event, - BrowserToolbarGtk* toolbar); - static void OnPageAppMenuMoveCurrent(GtkWidget* widget, - GtkMenuDirectionType dir, - BrowserToolbarGtk* toolbar); - // Sometimes we only want to show the location w/o the toolbar buttons (e.g., // in a popup window). bool ShouldOnlyShowLocation() const; @@ -207,6 +205,8 @@ class BrowserToolbarGtk : public CommandUpdater::CommandObserver, // rendering. OwnedWidgetGtk offscreen_entry_; + MenuBarHelper menu_bar_helper_; + DISALLOW_COPY_AND_ASSIGN(BrowserToolbarGtk); }; |