summaryrefslogtreecommitdiffstats
path: root/chrome/browser/gtk/browser_toolbar_view_gtk.cc
diff options
context:
space:
mode:
authorestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-02-18 22:30:16 +0000
committerestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-02-18 22:30:16 +0000
commit70b45efc15674aa7241bbb95dc81b3019eac294b (patch)
treeb4b8cae88b43ffb0a669cc7b50aabafa93506a02 /chrome/browser/gtk/browser_toolbar_view_gtk.cc
parentcb71491f6fd9eb062ecbce3df5ca543c77652d91 (diff)
downloadchromium_src-70b45efc15674aa7241bbb95dc81b3019eac294b.zip
chromium_src-70b45efc15674aa7241bbb95dc81b3019eac294b.tar.gz
chromium_src-70b45efc15674aa7241bbb95dc81b3019eac294b.tar.bz2
Port back_forward_menu_model to linux.
* Refactor BackForwardMenuModel. - Create platform-specific subclasses that implement menu delegate interfaces - Push almost all functionality into BackForwardMenuModel * Implement GTK back/forward dropdowns (in MenuGtk and BrowserToolbarViewGtk) Review URL: http://codereview.chromium.org/21440 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@9983 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/gtk/browser_toolbar_view_gtk.cc')
-rw-r--r--chrome/browser/gtk/browser_toolbar_view_gtk.cc92
1 files changed, 76 insertions, 16 deletions
diff --git a/chrome/browser/gtk/browser_toolbar_view_gtk.cc b/chrome/browser/gtk/browser_toolbar_view_gtk.cc
index b2ba34b..4188803 100644
--- a/chrome/browser/gtk/browser_toolbar_view_gtk.cc
+++ b/chrome/browser/gtk/browser_toolbar_view_gtk.cc
@@ -9,6 +9,7 @@
#include "base/path_service.h"
#include "chrome/app/chrome_dll_resource.h"
#include "chrome/browser/browser.h"
+#include "chrome/browser/gtk/back_forward_menu_model_gtk.h"
#include "chrome/browser/gtk/menu_gtk.h"
#include "chrome/browser/gtk/standard_menus.h"
#include "chrome/common/l10n_util.h"
@@ -19,6 +20,9 @@
#include "grit/theme_resources.h"
const int BrowserToolbarGtk::kToolbarHeight = 38;
+// For the back/forward dropdown menus, the time in milliseconds between
+// when the user clicks and the popup menu appears.
+static const int kMenuTimerDelay = 500;
// CustomDrawButton manages the lifetimes of some resources used to make a
// custom-drawn Gtk button. We use them on the toolbar.
@@ -133,18 +137,18 @@ BrowserToolbarGtk::BrowserToolbarGtk(Browser* browser)
entry_(NULL),
model_(browser->toolbar_model()),
browser_(browser),
- profile_(NULL) {
+ profile_(NULL),
+ show_menu_factory_(this) {
browser_->command_updater()->AddCommandObserver(IDC_BACK, this);
browser_->command_updater()->AddCommandObserver(IDC_FORWARD, this);
browser_->command_updater()->AddCommandObserver(IDC_RELOAD, this);
browser_->command_updater()->AddCommandObserver(IDC_HOME, this);
browser_->command_updater()->AddCommandObserver(IDC_STAR, this);
- // TODO(port): Port BackForwardMenuModel
- // back_menu_model_.reset(new BackForwardMenuModel(
- // browser, BackForwardMenuModel::BACKWARD_MENU_DELEGATE));
- // forward_menu_model_.reset(new BackForwardMenuModel(
- // browser, BackForwardMenuModel::FORWARD_MENU_DELEGATE));
+ back_menu_model_.reset(new BackForwardMenuModelGtk(
+ browser, BackForwardMenuModel::BACKWARD_MENU_DELEGATE));
+ forward_menu_model_.reset(new BackForwardMenuModelGtk(
+ browser, BackForwardMenuModel::FORWARD_MENU_DELEGATE));
}
BrowserToolbarGtk::~BrowserToolbarGtk() {
@@ -160,10 +164,12 @@ void BrowserToolbarGtk::Init(Profile* profile) {
toolbar_tooltips_ = gtk_tooltips_new();
- back_.reset(BuildToolbarButton(IDR_BACK, IDR_BACK_P, IDR_BACK_H, IDR_BACK_D,
- l10n_util::GetString(IDS_TOOLTIP_BACK), false));
- forward_.reset(BuildToolbarButton(IDR_FORWARD, IDR_FORWARD_P, IDR_FORWARD_H,
- IDR_FORWARD_D, l10n_util::GetString(IDS_TOOLTIP_FORWARD), false));
+ back_.reset(BuildBackForwardButton(IDR_BACK, IDR_BACK_P, IDR_BACK_H,
+ IDR_BACK_D,
+ l10n_util::GetString(IDS_TOOLTIP_BACK)));
+ forward_.reset(BuildBackForwardButton(IDR_FORWARD, IDR_FORWARD_P,
+ IDR_FORWARD_H, IDR_FORWARD_D,
+ l10n_util::GetString(IDS_TOOLTIP_FORWARD)));
gtk_box_pack_start(GTK_BOX(toolbar_), gtk_label_new(" "), FALSE, FALSE, 0);
@@ -273,7 +279,7 @@ BrowserToolbarGtk::CustomDrawButton* BrowserToolbarGtk::BuildToolbarButton(
WideToUTF8(localized_tooltip).c_str(),
WideToUTF8(localized_tooltip).c_str());
if (menu_button) {
- g_signal_connect(G_OBJECT(button->widget()), "button_press_event",
+ g_signal_connect(G_OBJECT(button->widget()), "button-press-event",
G_CALLBACK(OnMenuButtonPressEvent), this);
} else {
g_signal_connect(G_OBJECT(button->widget()), "clicked",
@@ -284,7 +290,7 @@ BrowserToolbarGtk::CustomDrawButton* BrowserToolbarGtk::BuildToolbarButton(
return button;
}
-/* static */
+// static
void BrowserToolbarGtk::OnEntryActivate(GtkEntry *entry,
BrowserToolbarGtk* toolbar) {
GURL dest(std::string(gtk_entry_get_text(entry)));
@@ -310,14 +316,17 @@ void BrowserToolbarGtk::OnButtonClick(GtkWidget* button,
else if (button == toolbar->star_->widget())
tag = IDC_STAR;
+ if (tag == IDC_BACK || tag == IDC_FORWARD)
+ toolbar->show_menu_factory_.RevokeAll();
+
DCHECK(tag != -1) << "Impossible button click callback";
toolbar->browser_->ExecuteCommand(tag);
}
-/* static */
-gint BrowserToolbarGtk::OnMenuButtonPressEvent(GtkWidget* button,
- GdkEvent* event,
- BrowserToolbarGtk* toolbar) {
+// static
+gboolean 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) {
@@ -335,6 +344,57 @@ gint BrowserToolbarGtk::OnMenuButtonPressEvent(GtkWidget* button,
return FALSE;
}
+BrowserToolbarGtk::CustomDrawButton* BrowserToolbarGtk::BuildBackForwardButton(
+ int normal_id,
+ int active_id,
+ int highlight_id,
+ int depressed_id,
+ const std::wstring& localized_tooltip) {
+ CustomDrawButton* button = new CustomDrawButton(normal_id, active_id,
+ highlight_id, depressed_id);
+
+ // 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()), "button-press-event",
+ G_CALLBACK(OnBackForwardPressEvent), this);
+ g_signal_connect(G_OBJECT(button->widget()), "clicked",
+ G_CALLBACK(OnButtonClick), this);
+
+ gtk_box_pack_start(GTK_BOX(toolbar_), button->widget(), FALSE, FALSE, 0);
+ // Popup the menu as left-aligned relative to this widget rather than the
+ // default of right aligned.
+ g_object_set_data(G_OBJECT(button->widget()), "left-align-popup",
+ reinterpret_cast<void*>(true));
+ return button;
+}
+
+// static
+gboolean BrowserToolbarGtk::OnBackForwardPressEvent(GtkWidget* widget,
+ GdkEventButton* event,
+ BrowserToolbarGtk* toolbar) {
+ // TODO(port): only allow left clicks to open the menu.
+ MessageLoop::current()->PostDelayedTask(FROM_HERE,
+ toolbar->show_menu_factory_.NewRunnableMethod(
+ &BrowserToolbarGtk::ShowBackForwardMenu,
+ widget, event->button),
+ kMenuTimerDelay);
+ return FALSE;
+}
+
+void BrowserToolbarGtk::ShowBackForwardMenu(GtkWidget* widget,
+ gint button_type) {
+ if (widget == back_->widget()) {
+ back_forward_menu_.reset(new MenuGtk(back_menu_model_.get()));
+ } else {
+ back_forward_menu_.reset(new MenuGtk(forward_menu_model_.get()));
+ }
+
+ back_forward_menu_->Popup(widget, button_type, gtk_get_current_event_time());
+}
+
void BrowserToolbarGtk::RunPageMenu(GdkEvent* button_press_event) {
if (page_menu_ == NULL) {
page_menu_.reset(new MenuGtk(this, GetStandardPageMenu()));