Skip to content
Snippets Groups Projects
Commit 13cdde22 authored by estade@chromium.org's avatar estade@chromium.org
Browse files

GTK: Dismiss the bookmark folder menu(s) when a context menu item is executed.

BUG=22372

Review URL: http://codereview.chromium.org/211056

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@26890 0039d316-1c4b-4281-b951-d872f2087c98
parent 5c2b9cd0
No related merge requests found
......@@ -414,6 +414,9 @@ void BookmarkBarGtk::SetInstructionState() {
}
void BookmarkBarGtk::SetChevronState() {
if (!GTK_WIDGET_VISIBLE(bookmark_toolbar_.get()))
return;
int extra_space = 0;
if (GTK_WIDGET_VISIBLE(overflow_button_))
......@@ -647,7 +650,7 @@ void BookmarkBarGtk::PopupMenuForNode(GtkWidget* sender,
current_context_menu_.reset(new BookmarkContextMenu(
sender, profile_, browser_, page_navigator_,
parent, nodes,
BookmarkContextMenu::BOOKMARK_BAR));
BookmarkContextMenu::BOOKMARK_BAR, NULL));
current_context_menu_->PopupAsContext(event->time);
}
......
......@@ -215,7 +215,8 @@ BookmarkContextMenu::BookmarkContextMenu(
PageNavigator* navigator,
const BookmarkNode* parent,
const std::vector<const BookmarkNode*>& selection,
ConfigurationType configuration)
ConfigurationType configuration,
Delegate* delegate)
: wnd_(wnd),
profile_(profile),
browser_(browser),
......@@ -223,7 +224,8 @@ BookmarkContextMenu::BookmarkContextMenu(
parent_(parent),
selection_(selection),
model_(profile->GetBookmarkModel()),
configuration_(configuration) {
configuration_(configuration),
delegate_(delegate) {
DCHECK(profile_);
DCHECK(model_->IsLoaded());
CreateMenuObject();
......@@ -294,7 +296,14 @@ BookmarkContextMenu::~BookmarkContextMenu() {
model_->RemoveObserver(this);
}
void BookmarkContextMenu::DelegateDestroyed() {
delegate_ = NULL;
}
void BookmarkContextMenu::ExecuteCommand(int id) {
if (delegate_)
delegate_->WillExecuteCommand();
switch (id) {
case IDS_BOOMARK_BAR_OPEN_ALL:
case IDS_BOOMARK_BAR_OPEN_ALL_INCOGNITO:
......
......@@ -50,6 +50,12 @@ class BookmarkContextMenu : public BookmarkModelObserver,
BOOKMARK_MANAGER_ORGANIZE_MENU_OTHER
};
class Delegate {
public:
// Called when one of the menu items is selected and executed.
virtual void WillExecuteCommand() = 0;
};
// Creates the bookmark context menu.
// |profile| is used for opening urls as well as enabling 'open incognito'.
// |browser| is used to determine the PageNavigator and may be null.
......@@ -63,7 +69,8 @@ class BookmarkContextMenu : public BookmarkModelObserver,
PageNavigator* navigator,
const BookmarkNode* parent,
const std::vector<const BookmarkNode*>& selection,
ConfigurationType configuration);
ConfigurationType configuration,
Delegate* delegate);
virtual ~BookmarkContextMenu();
#if defined(TOOLKIT_VIEWS)
......@@ -80,6 +87,9 @@ class BookmarkContextMenu : public BookmarkModelObserver,
GtkWidget* menu() const { return menu_->widget(); }
#endif
// Should be called by the delegate when it is no longer valid.
void DelegateDestroyed();
// Menu::Delegate / MenuGtk::Delegate methods.
virtual void ExecuteCommand(int id);
virtual bool IsItemChecked(int id) const;
......@@ -143,6 +153,7 @@ class BookmarkContextMenu : public BookmarkModelObserver,
std::vector<const BookmarkNode*> selection_;
BookmarkModel* model_;
ConfigurationType configuration_;
Delegate* delegate_;
#if defined(OS_WIN) || defined(TOOLKIT_VIEWS)
scoped_ptr<views::MenuItemView> menu_;
......
......@@ -607,7 +607,8 @@ void BookmarkManagerGtk::ResetOrganizeMenu(bool left) {
MessageLoop::current()->DeleteSoon(FROM_HERE, old_menu);
organize_menu_.reset(new BookmarkContextMenu(window_, profile_, NULL, NULL,
parent, nodes, BookmarkContextMenu::BOOKMARK_MANAGER_ORGANIZE_MENU));
parent, nodes, BookmarkContextMenu::BOOKMARK_MANAGER_ORGANIZE_MENU,
NULL));
#if defined(TOOLKIT_GTK)
gtk_menu_item_set_submenu(GTK_MENU_ITEM(organize_), organize_menu_->menu());
#else
......
......@@ -105,6 +105,9 @@ BookmarkMenuController::BookmarkMenuController(Browser* browser,
}
BookmarkMenuController::~BookmarkMenuController() {
if (context_menu_.get())
context_menu_->DelegateDestroyed();
profile_->GetBookmarkModel()->RemoveObserver(this);
gtk_menu_popdown(GTK_MENU(menu_));
}
......@@ -133,6 +136,10 @@ void BookmarkMenuController::BookmarkNodeFavIconLoaded(
SetImageMenuItem(it->second, node, model);
}
void BookmarkMenuController::WillExecuteCommand() {
gtk_menu_popdown(GTK_MENU(menu_));
}
void BookmarkMenuController::NavigateToMenuItem(
GtkWidget* menu_item,
WindowOpenDisposition disposition) {
......@@ -245,7 +252,7 @@ gboolean BookmarkMenuController::OnButtonPressed(
new BookmarkContextMenu(
GTK_WIDGET(controller->parent_window_), controller->profile_,
controller->browser_, controller->page_navigator_, parent, nodes,
BookmarkContextMenu::BOOKMARK_BAR));
BookmarkContextMenu::BOOKMARK_BAR, controller));
// Our bookmark folder menu loses the grab to the context menu. When the
// context menu is hidden, re-assert our grab.
......
......@@ -11,10 +11,10 @@
#include "base/scoped_ptr.h"
#include "chrome/browser/bookmarks/base_bookmark_model_observer.h"
#include "chrome/browser/gtk/bookmark_context_menu.h"
#include "chrome/common/owned_widget_gtk.h"
#include "webkit/glue/window_open_disposition.h"
class BookmarkContextMenu;
class Browser;
class Profile;
class Profiler;
......@@ -22,7 +22,8 @@ class PageNavigator;
class BookmarkModel;
class BookmarkNode;
class BookmarkMenuController : public BaseBookmarkModelObserver {
class BookmarkMenuController : public BaseBookmarkModelObserver,
public BookmarkContextMenu::Delegate {
public:
// Creates a BookmarkMenuController showing the children of |node| starting
// at index |start_child_index|.
......@@ -45,6 +46,9 @@ class BookmarkMenuController : public BaseBookmarkModelObserver {
virtual void BookmarkNodeFavIconLoaded(BookmarkModel* model,
const BookmarkNode* node);
// Overridden from BookmarkContextMenu::Delegate:
virtual void WillExecuteCommand();
private:
// Recursively change the bookmark hierarchy rooted in |parent| into a set of
// gtk menus rooted in |menu|.
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment