summaryrefslogtreecommitdiffstats
path: root/chrome/browser
diff options
context:
space:
mode:
authorestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-09-09 00:45:07 +0000
committerestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-09-09 00:45:07 +0000
commit619a24b515ce3a707d73d8454447e506dadde6a8 (patch)
tree944ba78bfaf2cd8d3fd83b5a166ae1871323ae32 /chrome/browser
parent7683968750635359528e238bcffc50c4f586cf24 (diff)
downloadchromium_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.cc71
-rw-r--r--chrome/browser/gtk/browser_toolbar_gtk.h20
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);
};