summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authorerg@google.com <erg@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-05-06 22:03:00 +0000
committererg@google.com <erg@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-05-06 22:03:00 +0000
commit29cc841ee15bbb8b31baf7ece0b2a3e2d3b55b5c (patch)
tree6cc5dd709d48346ba0c6669f67263cbc714fbc9d /chrome
parent901065b013787109038f232c0707b245af796599 (diff)
downloadchromium_src-29cc841ee15bbb8b31baf7ece0b2a3e2d3b55b5c.zip
chromium_src-29cc841ee15bbb8b31baf7ece0b2a3e2d3b55b5c.tar.gz
chromium_src-29cc841ee15bbb8b31baf7ece0b2a3e2d3b55b5c.tar.bz2
Clicking on a folder in the bookmark bar now shows its contents as a menu.
http://crbug.com/11250 Review URL: http://codereview.chromium.org/114005 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@15463 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/bookmarks/bookmark_menu_controller_gtk.cc107
-rw-r--r--chrome/browser/bookmarks/bookmark_menu_controller_gtk.h79
-rw-r--r--chrome/browser/bookmarks/bookmark_menu_controller_win.cc (renamed from chrome/browser/bookmarks/bookmark_menu_controller.cc)2
-rw-r--r--chrome/browser/bookmarks/bookmark_menu_controller_win.h (renamed from chrome/browser/bookmarks/bookmark_menu_controller.h)6
-rw-r--r--chrome/browser/browser.vcproj4
-rw-r--r--chrome/browser/gtk/bookmark_bar_gtk.cc12
-rw-r--r--chrome/browser/gtk/bookmark_bar_gtk.h5
-rw-r--r--chrome/browser/gtk/menu_gtk.cc108
-rw-r--r--chrome/browser/gtk/menu_gtk.h22
-rw-r--r--chrome/browser/views/bookmark_bar_view.h2
-rw-r--r--chrome/browser/views/bookmark_menu_button.h2
-rw-r--r--chrome/chrome.gyp6
12 files changed, 325 insertions, 30 deletions
diff --git a/chrome/browser/bookmarks/bookmark_menu_controller_gtk.cc b/chrome/browser/bookmarks/bookmark_menu_controller_gtk.cc
new file mode 100644
index 0000000..f94ba58
--- /dev/null
+++ b/chrome/browser/bookmarks/bookmark_menu_controller_gtk.cc
@@ -0,0 +1,107 @@
+// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/bookmarks/bookmark_menu_controller_gtk.h"
+
+#include "base/string_util.h"
+#include "chrome/browser/bookmarks/bookmark_context_menu.h"
+#include "chrome/browser/profile.h"
+#include "chrome/browser/tab_contents/page_navigator.h"
+#include "app/resource_bundle.h"
+#include "grit/theme_resources.h"
+#include "webkit/glue/window_open_disposition.h"
+
+BookmarkMenuController::BookmarkMenuController(Browser* browser,
+ Profile* profile,
+ PageNavigator* navigator,
+ GtkWindow* window,
+ BookmarkNode* node,
+ int start_child_index,
+ bool show_other_folder)
+ : browser_(browser),
+ profile_(profile),
+ page_navigator_(navigator),
+ parent_window_(window),
+ node_(node) {
+ menu_.reset(new MenuGtk(this, false));
+ int next_menu_id = 1;
+ BuildMenu(node, start_child_index, menu_.get(), &next_menu_id);
+
+ // TODO(erg): Add the BuildOtherFolderMenu() to handle the overflow case from
+ // the chevron on the bookmark bar.
+ //
+ // if (show_other_folder)
+ // BuildOtherFolderMenu(&next_menu_id);
+}
+
+BookmarkMenuController::~BookmarkMenuController() {
+ profile_->GetBookmarkModel()->RemoveObserver(this);
+}
+
+void BookmarkMenuController::Popup(GtkWidget* widget, gint button_type,
+ guint32 timestamp) {
+ profile_->GetBookmarkModel()->AddObserver(this);
+ menu_->Popup(widget, button_type, timestamp);
+}
+
+void BookmarkMenuController::BookmarkModelChanged() {
+ menu_->Cancel();
+}
+
+void BookmarkMenuController::BookmarkNodeFavIconLoaded(BookmarkModel* model,
+ BookmarkNode* node) {
+ if (node_to_menu_id_map_.find(node) != node_to_menu_id_map_.end())
+ menu_->SetIcon(node->GetFavIcon(), node_to_menu_id_map_[node]);
+}
+
+bool BookmarkMenuController::IsCommandEnabled(int id) const {
+ return true;
+}
+
+void BookmarkMenuController::ExecuteCommand(int id) {
+ DCHECK(page_navigator_);
+ DCHECK(menu_id_to_node_map_.find(id) != menu_id_to_node_map_.end());
+ GURL url = menu_id_to_node_map_[id]->GetURL();
+ page_navigator_->OpenURL(
+ url, GURL(),
+ // TODO(erg): Plumb mouse events here so things like shift-click or
+ // ctrl-click do the right things.
+ //
+ // event_utils::DispositionFromEventFlags(mouse_event_flags),
+ CURRENT_TAB,
+ PageTransition::AUTO_BOOKMARK);
+}
+
+void BookmarkMenuController::BuildMenu(BookmarkNode* parent,
+ int start_child_index,
+ MenuGtk* menu,
+ int* next_menu_id) {
+ DCHECK(!parent->GetChildCount() ||
+ start_child_index < parent->GetChildCount());
+ for (int i = start_child_index; i < parent->GetChildCount(); ++i) {
+ BookmarkNode* node = parent->GetChild(i);
+ int id = *next_menu_id;
+
+ (*next_menu_id)++;
+ if (node->is_url()) {
+ SkBitmap icon = node->GetFavIcon();
+ if (icon.width() == 0) {
+ icon = *ResourceBundle::GetSharedInstance().
+ GetBitmapNamed(IDR_DEFAULT_FAVICON);
+ }
+ menu->AppendMenuItemWithIcon(id, WideToUTF8(node->GetTitle()), icon);
+ node_to_menu_id_map_[node] = id;
+ } else if (node->is_folder()) {
+ SkBitmap* folder_icon = ResourceBundle::GetSharedInstance().
+ GetBitmapNamed(IDR_BOOKMARK_BAR_FOLDER);
+ MenuGtk* submenu =
+ menu->AppendSubMenuWithIcon(id, WideToUTF8(node->GetTitle()),
+ *folder_icon);
+ BuildMenu(node, 0, submenu, next_menu_id);
+ } else {
+ NOTREACHED();
+ }
+ menu_id_to_node_map_[id] = node;
+ }
+}
diff --git a/chrome/browser/bookmarks/bookmark_menu_controller_gtk.h b/chrome/browser/bookmarks/bookmark_menu_controller_gtk.h
new file mode 100644
index 0000000..b7914c3
--- /dev/null
+++ b/chrome/browser/bookmarks/bookmark_menu_controller_gtk.h
@@ -0,0 +1,79 @@
+// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_BOOKMARKS_BOOKMARK_MENU_CONTROLLER_GTK_H_
+#define CHROME_BROWSER_BOOKMARKS_BOOKMARK_MENU_CONTROLLER_GTK_H_
+
+#include <map>
+
+#include "base/scoped_ptr.h"
+#include "chrome/browser/bookmarks/base_bookmark_model_observer.h"
+#include "chrome/browser/gtk/menu_gtk.h"
+
+class BookmarkContextMenu;
+class Browser;
+class Profiler;
+class PageNavigator;
+class BookmarkModel;
+class BookmarkNode;
+
+typedef struct _GtkWidget GtkWidget;
+
+class BookmarkMenuController : public BaseBookmarkModelObserver,
+ public MenuGtk::Delegate {
+ public:
+ // Creates a BookmarkMenuController showing the children of |node| starting
+ // at index |start_child_index|.
+ BookmarkMenuController(Browser* browser,
+ Profile* profile,
+ PageNavigator* page_navigator,
+ GtkWindow* window,
+ BookmarkNode* node,
+ int start_child_index,
+ bool show_other_folder);
+ virtual ~BookmarkMenuController();
+
+ void Popup(GtkWidget* widget, gint button_type, guint32 timestamp);
+
+ // Overridden from BaseBookmarkModelObserver:
+ virtual void BookmarkModelChanged();
+ virtual void BookmarkNodeFavIconLoaded(BookmarkModel* model,
+ BookmarkNode* node);
+
+ // Overridden from MenuGtk::Delegate:
+ virtual bool IsCommandEnabled(int id) const;
+ virtual void ExecuteCommand(int id);
+
+ private:
+ void BuildMenu(BookmarkNode* parent,
+ int start_child_index,
+ MenuGtk* menu,
+ int* next_menu_id);
+
+ Browser* browser_;
+ Profile* profile_;
+ PageNavigator* page_navigator_;
+
+ // Parent window of this menu.
+ GtkWindow* parent_window_;
+
+ // The node we're showing the contents of.
+ BookmarkNode* node_;
+
+ scoped_ptr<MenuGtk> menu_;
+
+ // Maps from menu id to BookmarkNode.
+ std::map<int, BookmarkNode*> menu_id_to_node_map_;
+
+ // Mapping from node to menu id. This only contains entries for nodes of type
+ // URL.
+ std::map<BookmarkNode*, int> node_to_menu_id_map_;
+
+ // Used when a context menu is shown.
+ scoped_ptr<BookmarkContextMenu> context_menu_;
+
+ DISALLOW_COPY_AND_ASSIGN(BookmarkMenuController);
+};
+
+#endif // CHROME_BROWSER_BOOKMARKS_BOOKMARK_MENU_CONTROLLER_GTK_H_
diff --git a/chrome/browser/bookmarks/bookmark_menu_controller.cc b/chrome/browser/bookmarks/bookmark_menu_controller_win.cc
index 7f90a52..f02ff7e 100644
--- a/chrome/browser/bookmarks/bookmark_menu_controller.cc
+++ b/chrome/browser/bookmarks/bookmark_menu_controller_win.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "chrome/browser/bookmarks/bookmark_menu_controller.h"
+#include "chrome/browser/bookmarks/bookmark_menu_controller_win.h"
#include "app/l10n_util.h"
#include "app/os_exchange_data.h"
diff --git a/chrome/browser/bookmarks/bookmark_menu_controller.h b/chrome/browser/bookmarks/bookmark_menu_controller_win.h
index 96bce0e..1f83233 100644
--- a/chrome/browser/bookmarks/bookmark_menu_controller.h
+++ b/chrome/browser/bookmarks/bookmark_menu_controller_win.h
@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef CHROME_BROWSER_BOOKMARKS_BOOKMARK_MENU_CONTROLLER_H_
-#define CHROME_BROWSER_BOOKMARKS_BOOKMARK_MENU_CONTROLLER_H_
+#ifndef CHROME_BROWSER_BOOKMARKS_BOOKMARK_MENU_CONTROLLER_WIN_H_
+#define CHROME_BROWSER_BOOKMARKS_BOOKMARK_MENU_CONTROLLER_WIN_H_
#include <map>
@@ -142,4 +142,4 @@ class BookmarkMenuController : public BaseBookmarkModelObserver,
DISALLOW_COPY_AND_ASSIGN(BookmarkMenuController);
};
-#endif // CHROME_BROWSER_BOOKMARKS_BOOKMARK_MENU_CONTROLLER_H_
+#endif // CHROME_BROWSER_BOOKMARKS_BOOKMARK_MENU_CONTROLLER_WIN_H_
diff --git a/chrome/browser/browser.vcproj b/chrome/browser/browser.vcproj
index 997fdc0..879c790 100644
--- a/chrome/browser/browser.vcproj
+++ b/chrome/browser/browser.vcproj
@@ -610,11 +610,11 @@
>
</File>
<File
- RelativePath=".\bookmarks\bookmark_menu_controller.cc"
+ RelativePath=".\bookmarks\bookmark_menu_controller_win.cc"
>
</File>
<File
- RelativePath=".\bookmarks\bookmark_menu_controller.h"
+ RelativePath=".\bookmarks\bookmark_menu_controller_win.h"
>
</File>
<File
diff --git a/chrome/browser/gtk/bookmark_bar_gtk.cc b/chrome/browser/gtk/bookmark_bar_gtk.cc
index 6c3d85f..9f4f0ce 100644
--- a/chrome/browser/gtk/bookmark_bar_gtk.cc
+++ b/chrome/browser/gtk/bookmark_bar_gtk.cc
@@ -8,6 +8,7 @@
#include "app/resource_bundle.h"
#include "base/gfx/gtk_util.h"
#include "chrome/browser/bookmarks/bookmark_context_menu.h"
+#include "chrome/browser/bookmarks/bookmark_menu_controller_gtk.h"
#include "chrome/browser/bookmarks/bookmark_utils.h"
#include "chrome/browser/browser.h"
#include "chrome/browser/gtk/custom_button.h"
@@ -353,6 +354,8 @@ GtkWidget* BookmarkBarGtk::CreateBookmarkButton(
GtkToolItem* BookmarkBarGtk::CreateBookmarkToolItem(BookmarkNode* node) {
GtkWidget* button = CreateBookmarkButton(node);
+ g_object_set_data(G_OBJECT(button), "left-align-popup",
+ reinterpret_cast<void*>(true));
GtkToolItem* item = gtk_tool_item_new();
gtk_container_add(GTK_CONTAINER(item), button);
@@ -537,7 +540,14 @@ gboolean BookmarkBarGtk::OnFolderButtonReleased(GtkWidget* sender,
DCHECK(node);
DCHECK(bar->page_navigator_);
- NOTIMPLEMENTED() << "Flesh this out once I can make folders.";
+ bar->current_menu_.reset(
+ new BookmarkMenuController(bar->browser_, bar->profile_,
+ bar->page_navigator_,
+ GTK_WINDOW(gtk_widget_get_toplevel(sender)),
+ node,
+ 0,
+ false));
+ bar->current_menu_->Popup(sender, event->button, event->time);
// Allow other handlers to run so the button state is updated correctly.
return FALSE;
diff --git a/chrome/browser/gtk/bookmark_bar_gtk.h b/chrome/browser/gtk/bookmark_bar_gtk.h
index 17f508f..8c02765 100644
--- a/chrome/browser/gtk/bookmark_bar_gtk.h
+++ b/chrome/browser/gtk/bookmark_bar_gtk.h
@@ -14,6 +14,7 @@
#include "chrome/browser/bookmarks/bookmark_model.h"
class BookmarkContextMenu;
+class BookmarkMenuController;
class Browser;
class CustomContainerButton;
class PageNavigator;
@@ -200,6 +201,10 @@ class BookmarkBarGtk : public BookmarkModelObserver {
// The last displayed right click menu, or NULL if no menus have been
// displayed yet.
scoped_ptr<BookmarkContextMenu> current_context_menu_;
+
+ // The last displayed left click menu, or NULL if no menus have been
+ // displayed yet.
+ scoped_ptr<BookmarkMenuController> current_menu_;
};
#endif // CHROME_BROWSER_GTK_BOOKMARK_BAR_GTK_H_
diff --git a/chrome/browser/gtk/menu_gtk.cc b/chrome/browser/gtk/menu_gtk.cc
index fd63e44..6d12f26 100644
--- a/chrome/browser/gtk/menu_gtk.cc
+++ b/chrome/browser/gtk/menu_gtk.cc
@@ -6,10 +6,36 @@
#include "app/l10n_util.h"
#include "base/logging.h"
+#include "base/stl_util-inl.h"
#include "base/string_util.h"
#include "chrome/common/gtk_util.h"
#include "skia/include/SkBitmap.h"
+namespace {
+
+struct SetIconState {
+ bool found;
+ const SkBitmap* icon;
+ int id;
+};
+
+void SetIconImpl(GtkWidget* widget, void* raw) {
+ SetIconState* data = reinterpret_cast<SetIconState*>(raw);
+ int this_id =
+ reinterpret_cast<int>(g_object_get_data(G_OBJECT(widget), "menu-id"));
+
+ if (this_id == data->id) {
+ GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(data->icon);
+ gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(widget),
+ gtk_image_new_from_pixbuf(pixbuf));
+ g_object_unref(pixbuf);
+
+ data->found = true;
+ }
+}
+
+} // namespace
+
MenuGtk::MenuGtk(MenuGtk::Delegate* delegate,
const MenuCreateMaterial* menu_data,
GtkAccelGroup* accel_group)
@@ -28,6 +54,7 @@ MenuGtk::MenuGtk(MenuGtk::Delegate* delegate, bool load)
}
MenuGtk::~MenuGtk() {
+ STLDeleteElements(&children_);
menu_.Destroy();
if (dummy_accel_group_)
g_object_unref(dummy_accel_group_);
@@ -36,15 +63,28 @@ MenuGtk::~MenuGtk() {
void MenuGtk::AppendMenuItemWithLabel(int command_id,
const std::string& label) {
GtkWidget* menu_item = gtk_menu_item_new_with_label(label.c_str());
+ AddMenuItemWithId(menu_item, command_id);
+}
- g_object_set_data(G_OBJECT(menu_item), "menu-id",
- reinterpret_cast<void*>(command_id));
+void MenuGtk::AppendMenuItemWithIcon(int command_id,
+ const std::string& label,
+ const SkBitmap& icon) {
+ GtkWidget* menu_item = BuildMenuItemWithImage(label, icon);
+ AddMenuItemWithId(menu_item, command_id);
+}
- g_signal_connect(G_OBJECT(menu_item), "activate",
- G_CALLBACK(OnMenuItemActivatedById), this);
+MenuGtk* MenuGtk::AppendSubMenuWithIcon(int command_id,
+ const std::string& label,
+ const SkBitmap& icon) {
+ GtkWidget* menu_item = BuildMenuItemWithImage(label, icon);
- gtk_widget_show(menu_item);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu_.get()), menu_item);
+ MenuGtk* submenu = new MenuGtk(delegate_, false);
+ gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu->menu_.get());
+ children_.push_back(submenu);
+
+ AddMenuItemWithId(menu_item, command_id);
+
+ return submenu;
}
void MenuGtk::AppendSeparator() {
@@ -82,6 +122,25 @@ void MenuGtk::Cancel() {
gtk_menu_popdown(GTK_MENU(menu_.get()));
}
+bool MenuGtk::SetIcon(const SkBitmap& icon, int item_id) {
+ // First search items in this menu.
+ SetIconState state;
+ state.found = false;
+ state.icon = &icon;
+ state.id = item_id;
+ gtk_container_foreach(GTK_CONTAINER(menu_.get()), SetIconImpl, &state);
+ if (state.found)
+ return true;
+
+ for (std::vector<MenuGtk*>::iterator it = children_.begin();
+ it != children_.end(); ++it) {
+ if ((*it)->SetIcon(icon, item_id))
+ return true;
+ }
+
+ return false;
+}
+
// static
std::string MenuGtk::ConvertAcceleratorsFromWindowsStyle(
const std::string& label) {
@@ -178,6 +237,18 @@ void MenuGtk::BuildMenuIn(GtkWidget* menu,
}
}
+GtkWidget* MenuGtk::BuildMenuItemWithImage(const std::string& label,
+ const SkBitmap& icon) {
+ GtkWidget* menu_item = gtk_image_menu_item_new_with_label(label.c_str());
+
+ GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(&icon);
+ gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),
+ gtk_image_new_from_pixbuf(pixbuf));
+ g_object_unref(pixbuf);
+
+ return menu_item;
+}
+
void MenuGtk::BuildMenuFromDelegate() {
// Note that the menu IDs start at 1, not 0.
for (int i = 1; i <= delegate_->GetItemCount(); ++i) {
@@ -186,26 +257,25 @@ void MenuGtk::BuildMenuFromDelegate() {
if (delegate_->IsItemSeparator(i)) {
menu_item = gtk_separator_menu_item_new();
} else if (delegate_->HasIcon(i)) {
- menu_item = gtk_image_menu_item_new_with_label(
- delegate_->GetLabel(i).c_str());
const SkBitmap* icon = delegate_->GetIcon(i);
- GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(icon);
- GtkWidget* widget = gtk_image_new_from_pixbuf(pixbuf);
- gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item), widget);
- g_object_unref(pixbuf);
+ menu_item = BuildMenuItemWithImage(delegate_->GetLabel(i), *icon);
} else {
menu_item = gtk_menu_item_new_with_label(delegate_->GetLabel(i).c_str());
}
- g_object_set_data(G_OBJECT(menu_item), "menu-id",
- reinterpret_cast<void*>(i));
+ AddMenuItemWithId(menu_item, i);
+ }
+}
+
+void MenuGtk::AddMenuItemWithId(GtkWidget* menu_item, int id) {
+ g_object_set_data(G_OBJECT(menu_item), "menu-id",
+ reinterpret_cast<void*>(id));
- g_signal_connect(G_OBJECT(menu_item), "activate",
- G_CALLBACK(OnMenuItemActivatedById), this);
+ g_signal_connect(G_OBJECT(menu_item), "activate",
+ G_CALLBACK(OnMenuItemActivatedById), this);
- gtk_widget_show(menu_item);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu_.get()), menu_item);
- }
+ gtk_widget_show(menu_item);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu_.get()), menu_item);
}
// static
diff --git a/chrome/browser/gtk/menu_gtk.h b/chrome/browser/gtk/menu_gtk.h
index 371ed58..b7afd67 100644
--- a/chrome/browser/gtk/menu_gtk.h
+++ b/chrome/browser/gtk/menu_gtk.h
@@ -7,6 +7,7 @@
#include <gtk/gtk.h>
#include <string>
+#include <vector>
#include "chrome/browser/gtk/standard_menus.h"
#include "chrome/common/owned_widget_gtk.h"
@@ -48,6 +49,10 @@ class MenuGtk {
// These methods are used to build the menu dynamically.
void AppendMenuItemWithLabel(int command_id, const std::string& label);
+ void AppendMenuItemWithIcon(int command_id, const std::string& label,
+ const SkBitmap& icon);
+ MenuGtk* AppendSubMenuWithIcon(int command_id, const std::string& label,
+ const SkBitmap& icon);
void AppendSeparator();
// Displays the menu. |timestamp| is the time of activation. The popup is
@@ -67,6 +72,11 @@ class MenuGtk {
// Closes the menu.
void Cancel();
+ // Sets an icon for an item with a given item_id. This method searches both
+ // this MenuGtk object and all child submenus. Returns false if the item with
+ // |item_id| is not found.
+ bool SetIcon(const SkBitmap& icon, int item_id);
+
// Change windows accelerator style to GTK style. (GTK uses _ for
// accelerators. Windows uses & with && as an escape for &.)
static std::string ConvertAcceleratorsFromWindowsStyle(
@@ -79,10 +89,18 @@ class MenuGtk {
const MenuCreateMaterial* menu_data,
GtkAccelGroup* accel_group);
+ // Builds a GtkImageMenuItem.
+ GtkWidget* BuildMenuItemWithImage(const std::string& label,
+ const SkBitmap& icon);
+
// A function that creates a GtkMenu from |delegate_|. This function is not
// recursive and does not support sub-menus.
void BuildMenuFromDelegate();
+ // Helper method that sets properties on a GtkMenuItem and then adds it to
+ // our internal |menu_|.
+ void AddMenuItemWithId(GtkWidget* menu_item, int id);
+
// Callback for when a menu item is clicked. Used when the menu is created
// via a MenuCreateMaterial.
static void OnMenuItemActivated(GtkMenuItem* menuitem, MenuGtk* menu);
@@ -116,6 +134,10 @@ class MenuGtk {
// gtk_menu_popup() does not appear to take ownership of popup menus, so
// MenuGtk explicitly manages the lifetime of the menu.
OwnedWidgetGtk menu_;
+
+ // MenuGtk instances of submenus; we keep references to these objects just to
+ // clean up during our destructor.
+ std::vector<MenuGtk*> children_;
};
#endif // CHROME_BROWSER_GTK_MENU_GTK_H_
diff --git a/chrome/browser/views/bookmark_bar_view.h b/chrome/browser/views/bookmark_bar_view.h
index a5d1a4b..a6c7ca8 100644
--- a/chrome/browser/views/bookmark_bar_view.h
+++ b/chrome/browser/views/bookmark_bar_view.h
@@ -7,7 +7,7 @@
#include "app/slide_animation.h"
#include "chrome/browser/bookmarks/bookmark_drag_data.h"
-#include "chrome/browser/bookmarks/bookmark_menu_controller.h"
+#include "chrome/browser/bookmarks/bookmark_menu_controller_win.h"
#include "chrome/browser/bookmarks/bookmark_model.h"
#include "chrome/browser/extensions/extensions_service.h"
#include "chrome/views/controls/button/menu_button.h"
diff --git a/chrome/browser/views/bookmark_menu_button.h b/chrome/browser/views/bookmark_menu_button.h
index e9da8d0..ed6dc5b 100644
--- a/chrome/browser/views/bookmark_menu_button.h
+++ b/chrome/browser/views/bookmark_menu_button.h
@@ -7,7 +7,7 @@
#include "base/timer.h"
#include "chrome/browser/bookmarks/bookmark_drag_data.h"
-#include "chrome/browser/bookmarks/bookmark_menu_controller.h"
+#include "chrome/browser/bookmarks/bookmark_menu_controller_win.h"
#include "chrome/views/controls/button/menu_button.h"
#include "chrome/views/controls/menu/view_menu_delegate.h"
diff --git a/chrome/chrome.gyp b/chrome/chrome.gyp
index 82ff2d0..273327f 100644
--- a/chrome/chrome.gyp
+++ b/chrome/chrome.gyp
@@ -577,8 +577,10 @@
'browser/bookmarks/bookmark_folder_tree_model.h',
'browser/bookmarks/bookmark_html_writer.cc',
'browser/bookmarks/bookmark_html_writer.h',
- 'browser/bookmarks/bookmark_menu_controller.cc',
- 'browser/bookmarks/bookmark_menu_controller.h',
+ 'browser/bookmarks/bookmark_menu_controller_gtk.cc',
+ 'browser/bookmarks/bookmark_menu_controller_gtk.h',
+ 'browser/bookmarks/bookmark_menu_controller_win.cc',
+ 'browser/bookmarks/bookmark_menu_controller_win.h',
'browser/bookmarks/bookmark_model.cc',
'browser/bookmarks/bookmark_model.h',
'browser/bookmarks/bookmark_service.h',