Index: chrome/browser/gtk/browser_toolbar_view_gtk.cc |
diff --git a/chrome/browser/gtk/browser_toolbar_view_gtk.cc b/chrome/browser/gtk/browser_toolbar_view_gtk.cc |
index 57f481a2221ebf8f373860e4ced1caae35663890..67840c7127fd9d5fd53de1a9375662933060d882 100644 |
--- a/chrome/browser/gtk/browser_toolbar_view_gtk.cc |
+++ b/chrome/browser/gtk/browser_toolbar_view_gtk.cc |
@@ -9,6 +9,8 @@ |
#include "base/path_service.h" |
#include "chrome/app/chrome_dll_resource.h" |
#include "chrome/browser/browser.h" |
+#include "chrome/browser/gtk/menu_gtk.h" |
+#include "chrome/browser/gtk/standard_menus.h" |
#include "chrome/common/l10n_util.h" |
#include "chromium_strings.h" |
@@ -21,7 +23,7 @@ class BrowserToolbarGtk::CustomDrawButton { |
// The constructor takes a filename, which is used as the base filename |
// in loading the theme graphics pngs. This will be replaced by the |
// ResourceBundle graphics soon. |
- CustomDrawButton(const std::string& filename); |
+ explicit CustomDrawButton(const std::string& filename); |
~CustomDrawButton(); |
GtkWidget* widget() const { return widget_; } |
@@ -140,36 +142,41 @@ void BrowserToolbarGtk::Init(Profile* profile) { |
toolbar_tooltips_ = gtk_tooltips_new(); |
back_.reset(BuildToolbarButton("back", |
- l10n_util::GetString(IDS_TOOLTIP_BACK))); |
+ l10n_util::GetString(IDS_TOOLTIP_BACK), |
+ false)); |
forward_.reset(BuildToolbarButton("forward", |
- l10n_util::GetString(IDS_TOOLTIP_FORWARD))); |
+ l10n_util::GetString(IDS_TOOLTIP_FORWARD), |
+ false)); |
gtk_box_pack_start(GTK_BOX(toolbar_), gtk_label_new(" "), FALSE, FALSE, 0); |
reload_.reset(BuildToolbarButton("reload", |
- l10n_util::GetString(IDS_TOOLTIP_RELOAD))); |
+ l10n_util::GetString(IDS_TOOLTIP_RELOAD), |
+ false)); |
home_.reset(BuildToolbarButton("home", |
- l10n_util::GetString(IDS_TOOLTIP_HOME))); |
+ l10n_util::GetString(IDS_TOOLTIP_HOME), |
+ false)); |
gtk_box_pack_start(GTK_BOX(toolbar_), gtk_label_new(" "), FALSE, FALSE, 0); |
star_.reset(BuildToolbarButton("star", |
- l10n_util::GetString(IDS_TOOLTIP_STAR))); |
+ l10n_util::GetString(IDS_TOOLTIP_STAR), |
+ false)); |
GtkWidget* entry = gtk_entry_new(); |
gtk_widget_set_size_request(entry, 0, 27); |
gtk_box_pack_start(GTK_BOX(toolbar_), entry, TRUE, TRUE, 0); |
- go_.reset(BuildToolbarButton("go", L"")); |
+ go_.reset(BuildToolbarButton("go", L"", false)); |
// TODO(port): these buttons need even stranger drawing than the others. |
- page_menu_.reset(BuildToolbarButton("menu_page", |
- l10n_util::GetString(IDS_PAGEMENU_TOOLTIP))); |
+ page_menu_button_.reset(BuildToolbarButton("menu_page", |
+ l10n_util::GetString(IDS_PAGEMENU_TOOLTIP), true)); |
// TODO(port): Need to get l10n_util::GetStringF working under linux to get |
// the correct string here. |
- app_menu_.reset(BuildToolbarButton("menu_chrome", |
- l10n_util::GetString(IDS_APPMENU_TOOLTIP))); |
+ app_menu_button_.reset(BuildToolbarButton("menu_chrome", |
+ l10n_util::GetString(IDS_APPMENU_TOOLTIP), true)); |
// TODO(erg): wchar_t mismatch on linux. Fix later. |
// show_home_button_.Init(prefs::kShowHomeButton, profile->GetPrefs(), this); |
@@ -204,6 +211,23 @@ void BrowserToolbarGtk::EnabledStateChangedForCommand(int id, bool enabled) { |
gtk_widget_set_sensitive(widget, enabled); |
} |
+bool BrowserToolbarGtk::IsCommandEnabled(int command_id) const { |
+ return browser_->command_updater()->IsCommandEnabled(command_id); |
+} |
+ |
+bool BrowserToolbarGtk::IsItemChecked(int id) const { |
+ if (!profile_) |
+ return false; |
+ if (id == IDC_SHOW_BOOKMARK_BAR) |
+ return profile_->GetPrefs()->GetBoolean(prefs::kShowBookmarkBar); |
+ // TODO(port): Fix this when we get some items that want checking! |
+ return false; |
+} |
+ |
+void BrowserToolbarGtk::ExecuteCommand(int id) { |
+ browser_->ExecuteCommand(id); |
+} |
+ |
void BrowserToolbarGtk::SetProfile(Profile* profile) { |
if (profile == profile_) |
return; |
@@ -217,23 +241,29 @@ void BrowserToolbarGtk::SetProfile(Profile* profile) { |
// TODO(port): This needs to deal with our styled pixmaps. |
BrowserToolbarGtk::CustomDrawButton* BrowserToolbarGtk::BuildToolbarButton( |
const std::string& filename, |
- const std::wstring& localized_tooltip) { |
+ const std::wstring& localized_tooltip, |
+ bool menu_button) { |
CustomDrawButton* button = new CustomDrawButton(filename); |
// TODO(erg): Mismatch between wstring and string. |
// gtk_tooltips_set_tip(GTK_TOOLTIPS(toolbar_tooltips_), |
// GTK_WIDGET(back_), |
// localized_tooltip, localized_tooltip); |
- g_signal_connect(G_OBJECT(button->widget()), "clicked", |
- G_CALLBACK(ButtonClickCallback), this); |
- gtk_box_pack_start(GTK_BOX(toolbar_), button->widget(), FALSE, FALSE, 0); |
+ if (menu_button) { |
+ g_signal_connect(G_OBJECT(button->widget()), "button_press_event", |
+ G_CALLBACK(OnMenuButtonPressEvent), this); |
+ } else { |
+ g_signal_connect(G_OBJECT(button->widget()), "clicked", |
+ G_CALLBACK(OnButtonClick), this); |
+ } |
+ gtk_box_pack_start(GTK_BOX(toolbar_), button->widget(), FALSE, FALSE, 0); |
return button; |
} |
/* static */ |
-void BrowserToolbarGtk::ButtonClickCallback(GtkWidget* button, |
- BrowserToolbarGtk* toolbar) { |
+void BrowserToolbarGtk::OnButtonClick(GtkWidget* button, |
+ BrowserToolbarGtk* toolbar) { |
int tag = -1; |
if (button == toolbar->back_->widget()) |
tag = IDC_BACK; |
@@ -246,9 +276,43 @@ void BrowserToolbarGtk::ButtonClickCallback(GtkWidget* button, |
else if (button == toolbar->star_->widget()) |
tag = IDC_STAR; |
- if (tag != -1) { |
- toolbar->browser_->ExecuteCommand(tag); |
- } else { |
- // TODO(erg): The menu buttons are special; they need to spawn menus. |
+ DCHECK(tag != -1) << "Impossible button click callback"; |
+ toolbar->browser_->ExecuteCommand(tag); |
+} |
+ |
+/* static */ |
+gint BrowserToolbarGtk::OnMenuButtonPressEvent(GtkWidget* button, |
+ GdkEvent* event, |
+ BrowserToolbarGtk* toolbar) { |
+ if (event->type == GDK_BUTTON_PRESS) { |
+ GdkEventButton* event_button = reinterpret_cast<GdkEventButton*>(event); |
+ if (event_button->button == 1) { |
+ // We have a button press we should respond to. |
+ if (button == toolbar->page_menu_button_->widget()) { |
+ toolbar->RunPageMenu(event); |
+ return TRUE; |
+ } else if (button == toolbar->app_menu_button_->widget()) { |
+ toolbar->RunAppMenu(event); |
+ return TRUE; |
+ } |
+ } |
+ } |
+ |
+ return FALSE; |
+} |
+ |
+void BrowserToolbarGtk::RunPageMenu(GdkEvent* button_press_event) { |
+ if (page_menu_ == NULL) { |
+ page_menu_.reset(new MenuGtk(this, GetStandardPageMenu())); |
} |
+ |
+ page_menu_->Popup(page_menu_button_->widget(), button_press_event); |
+} |
+ |
+void BrowserToolbarGtk::RunAppMenu(GdkEvent* button_press_event) { |
+ if (app_menu_ == NULL) { |
+ app_menu_.reset(new MenuGtk(this, GetStandardAppMenu())); |
+ } |
+ |
+ app_menu_->Popup(app_menu_button_->widget(), button_press_event); |
} |