Commit 619a24b5 authored by estade@chromium.org's avatar estade@chromium.org

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
parent 76839687
...@@ -82,7 +82,8 @@ BrowserToolbarGtk::BrowserToolbarGtk(Browser* browser, BrowserWindowGtk* window) ...@@ -82,7 +82,8 @@ BrowserToolbarGtk::BrowserToolbarGtk(Browser* browser, BrowserWindowGtk* window)
model_(browser->toolbar_model()), model_(browser->toolbar_model()),
browser_(browser), browser_(browser),
window_(window), window_(window),
profile_(NULL) { profile_(NULL),
menu_bar_helper_(this) {
browser_->command_updater()->AddCommandObserver(IDC_BACK, this); browser_->command_updater()->AddCommandObserver(IDC_BACK, this);
browser_->command_updater()->AddCommandObserver(IDC_FORWARD, this); browser_->command_updater()->AddCommandObserver(IDC_FORWARD, this);
browser_->command_updater()->AddCommandObserver(IDC_RELOAD, this); browser_->command_updater()->AddCommandObserver(IDC_RELOAD, this);
...@@ -219,6 +220,7 @@ void BrowserToolbarGtk::Init(Profile* profile, ...@@ -219,6 +220,7 @@ void BrowserToolbarGtk::Init(Profile* profile,
GtkWidget* page_menu = BuildToolbarMenuButton( GtkWidget* page_menu = BuildToolbarMenuButton(
l10n_util::GetStringUTF8(IDS_PAGEMENU_TOOLTIP), l10n_util::GetStringUTF8(IDS_PAGEMENU_TOOLTIP),
&page_menu_button_); &page_menu_button_);
menu_bar_helper_.Add(page_menu_button_.get());
page_menu_image_ = gtk_image_new_from_pixbuf( page_menu_image_ = gtk_image_new_from_pixbuf(
theme_provider_->GetRTLEnabledPixbufNamed(IDR_MENU_PAGE)); theme_provider_->GetRTLEnabledPixbufNamed(IDR_MENU_PAGE));
gtk_container_add(GTK_CONTAINER(page_menu), page_menu_image_); gtk_container_add(GTK_CONTAINER(page_menu), page_menu_image_);
...@@ -226,24 +228,17 @@ void BrowserToolbarGtk::Init(Profile* profile, ...@@ -226,24 +228,17 @@ void BrowserToolbarGtk::Init(Profile* profile,
encodings_menu_.reset(BuildEncodingsMenu(profile, this)); encodings_menu_.reset(BuildEncodingsMenu(profile, this));
page_menu_.reset(new MenuGtk(this, GetStandardPageMenu(encodings_menu_.get()), page_menu_.reset(new MenuGtk(this, GetStandardPageMenu(encodings_menu_.get()),
accel_group_)); 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); gtk_box_pack_start(GTK_BOX(menus_hbox_), page_menu, FALSE, FALSE, 0);
GtkWidget* chrome_menu = BuildToolbarMenuButton( GtkWidget* chrome_menu = BuildToolbarMenuButton(
l10n_util::GetStringFUTF8(IDS_APPMENU_TOOLTIP, l10n_util::GetStringFUTF8(IDS_APPMENU_TOOLTIP,
WideToUTF16(l10n_util::GetString(IDS_PRODUCT_NAME))), WideToUTF16(l10n_util::GetString(IDS_PRODUCT_NAME))),
&app_menu_button_); &app_menu_button_);
menu_bar_helper_.Add(app_menu_button_.get());
app_menu_image_ = gtk_image_new_from_pixbuf( app_menu_image_ = gtk_image_new_from_pixbuf(
theme_provider_->GetRTLEnabledPixbufNamed(IDR_MENU_CHROME)); theme_provider_->GetRTLEnabledPixbufNamed(IDR_MENU_CHROME));
gtk_container_add(GTK_CONTAINER(chrome_menu), app_menu_image_); gtk_container_add(GTK_CONTAINER(chrome_menu), app_menu_image_);
app_menu_.reset(new MenuGtk(this, GetStandardAppMenu(), accel_group_)); 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(menus_hbox_), chrome_menu, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(toolbar_), menus_hbox_, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(toolbar_), menus_hbox_, FALSE, FALSE, 0);
...@@ -646,6 +641,7 @@ gboolean BrowserToolbarGtk::OnMenuButtonPressEvent(GtkWidget* button, ...@@ -646,6 +641,7 @@ gboolean BrowserToolbarGtk::OnMenuButtonPressEvent(GtkWidget* button,
MenuGtk* menu = button == toolbar->page_menu_button_.get() ? MenuGtk* menu = button == toolbar->page_menu_button_.get() ?
toolbar->page_menu_.get() : toolbar->app_menu_.get(); toolbar->page_menu_.get() : toolbar->app_menu_.get();
menu->Popup(button, reinterpret_cast<GdkEvent*>(event)); menu->Popup(button, reinterpret_cast<GdkEvent*>(event));
toolbar->menu_bar_helper_.MenuStartedShowing(button, menu->widget());
return TRUE; return TRUE;
} }
...@@ -653,11 +649,7 @@ gboolean BrowserToolbarGtk::OnMenuButtonPressEvent(GtkWidget* button, ...@@ -653,11 +649,7 @@ gboolean BrowserToolbarGtk::OnMenuButtonPressEvent(GtkWidget* button,
// static // static
gboolean BrowserToolbarGtk::OnMenuClicked(GtkWidget* button, gboolean BrowserToolbarGtk::OnMenuClicked(GtkWidget* button,
BrowserToolbarGtk* toolbar) { BrowserToolbarGtk* toolbar) {
gtk_chrome_button_set_paint_state(GTK_CHROME_BUTTON(button), toolbar->PopupForButton(button);
GTK_STATE_ACTIVE);
MenuGtk* menu = button == toolbar->page_menu_button_.get() ?
toolbar->page_menu_.get() : toolbar->app_menu_.get();
menu->PopupAsFromKeyEvent(button);
return TRUE; return TRUE;
} }
...@@ -685,41 +677,26 @@ void BrowserToolbarGtk::OnDragDataReceived(GtkWidget* widget, ...@@ -685,41 +677,26 @@ void BrowserToolbarGtk::OnDragDataReceived(GtkWidget* widget,
} }
} }
// static bool BrowserToolbarGtk::ShouldOnlyShowLocation() const {
gboolean BrowserToolbarGtk::OnPageAppMenuMouseMotion(GtkWidget* menu, // If we're a popup window, only show the location bar (omnibox).
GdkEventMotion* event, BrowserToolbarGtk* toolbar) { return browser_->type() != Browser::TYPE_NORMAL;
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;
} }
// static void BrowserToolbarGtk::PopupForButton(GtkWidget* button) {
void BrowserToolbarGtk::OnPageAppMenuMoveCurrent(GtkWidget* menu, page_menu_->Cancel();
GtkMenuDirectionType dir, BrowserToolbarGtk* toolbar) { app_menu_->Cancel();
GtkWidget* active_item = GTK_MENU_SHELL(menu)->active_menu_item;
gtk_chrome_button_set_paint_state(GTK_CHROME_BUTTON(button),
switch (dir) { GTK_STATE_ACTIVE);
case GTK_MENU_DIR_CHILD: MenuGtk* menu = button == page_menu_button_.get() ?
// The move is going to open a submenu; don't override default behavior. page_menu_.get() : app_menu_.get();
if (active_item && gtk_menu_item_get_submenu(GTK_MENU_ITEM(active_item))) menu->PopupAsFromKeyEvent(button);
break; menu_bar_helper_.MenuStartedShowing(button, menu->widget());
// 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;
}
} }
bool BrowserToolbarGtk::ShouldOnlyShowLocation() const { void BrowserToolbarGtk::PopupForButtonNextTo(GtkWidget* button,
// If we're a popup window, only show the location bar (omnibox). GtkMenuDirectionType dir) {
return browser_->type() != Browser::TYPE_NORMAL; GtkWidget* other_button = button == page_menu_button_.get() ?
app_menu_button_.get() : page_menu_button_.get();
PopupForButton(other_button);
} }
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "base/scoped_ptr.h" #include "base/scoped_ptr.h"
#include "chrome/browser/autocomplete/autocomplete_popup_view.h" #include "chrome/browser/autocomplete/autocomplete_popup_view.h"
#include "chrome/browser/command_updater.h" #include "chrome/browser/command_updater.h"
#include "chrome/browser/gtk/menu_bar_helper.h"
#include "chrome/browser/gtk/menu_gtk.h" #include "chrome/browser/gtk/menu_gtk.h"
#include "chrome/common/notification_observer.h" #include "chrome/common/notification_observer.h"
#include "chrome/common/notification_registrar.h" #include "chrome/common/notification_registrar.h"
...@@ -34,7 +35,8 @@ class ToolbarStarToggleGtk; ...@@ -34,7 +35,8 @@ class ToolbarStarToggleGtk;
class BrowserToolbarGtk : public CommandUpdater::CommandObserver, class BrowserToolbarGtk : public CommandUpdater::CommandObserver,
public MenuGtk::Delegate, public MenuGtk::Delegate,
public NotificationObserver, public NotificationObserver,
public AutocompletePopupPositioner { public AutocompletePopupPositioner,
public MenuBarHelper::Delegate {
public: public:
explicit BrowserToolbarGtk(Browser* browser, BrowserWindowGtk* window); explicit BrowserToolbarGtk(Browser* browser, BrowserWindowGtk* window);
virtual ~BrowserToolbarGtk(); virtual ~BrowserToolbarGtk();
...@@ -89,6 +91,11 @@ class BrowserToolbarGtk : public CommandUpdater::CommandObserver, ...@@ -89,6 +91,11 @@ class BrowserToolbarGtk : public CommandUpdater::CommandObserver,
// Omnibox results popup should go (from the star to the go buttons). // Omnibox results popup should go (from the star to the go buttons).
virtual gfx::Rect GetPopupBounds() const; virtual gfx::Rect GetPopupBounds() const;
// MenuBarHelper::Delegate implementation ------------------------------------
virtual void PopupForButton(GtkWidget* button);
virtual void PopupForButtonNextTo(GtkWidget* button,
GtkMenuDirectionType dir);
private: private:
// Builds a toolbar button with all the properties set. // Builds a toolbar button with all the properties set.
// |spacing| is the width of padding (in pixels) on the left and right of the // |spacing| is the width of padding (in pixels) on the left and right of the
...@@ -143,15 +150,6 @@ class BrowserToolbarGtk : public CommandUpdater::CommandObserver, ...@@ -143,15 +150,6 @@ class BrowserToolbarGtk : public CommandUpdater::CommandObserver,
guint info, guint time, guint info, guint time,
BrowserToolbarGtk* toolbar); 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., // Sometimes we only want to show the location w/o the toolbar buttons (e.g.,
// in a popup window). // in a popup window).
bool ShouldOnlyShowLocation() const; bool ShouldOnlyShowLocation() const;
...@@ -207,6 +205,8 @@ class BrowserToolbarGtk : public CommandUpdater::CommandObserver, ...@@ -207,6 +205,8 @@ class BrowserToolbarGtk : public CommandUpdater::CommandObserver,
// rendering. // rendering.
OwnedWidgetGtk offscreen_entry_; OwnedWidgetGtk offscreen_entry_;
MenuBarHelper menu_bar_helper_;
DISALLOW_COPY_AND_ASSIGN(BrowserToolbarGtk); DISALLOW_COPY_AND_ASSIGN(BrowserToolbarGtk);
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment