Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1842)

Unified Diff: chrome/browser/gtk/bookmark_manager_gtk.cc

Issue 132048: Don't crash when reusing a bookmark context menu. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/gtk/bookmark_manager_gtk.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/gtk/bookmark_manager_gtk.cc
===================================================================
--- chrome/browser/gtk/bookmark_manager_gtk.cc (revision 18907)
+++ chrome/browser/gtk/bookmark_manager_gtk.cc (working copy)
@@ -263,6 +263,7 @@
BookmarkManagerGtk::BookmarkManagerGtk(Profile* profile)
: profile_(profile),
model_(profile->GetBookmarkModel()),
+ organize_is_for_left_(true),
search_factory_(this),
select_file_dialog_(SelectFileDialog::Create(this)) {
InitWidgets();
@@ -289,14 +290,9 @@
// IDS_BOOKMARK_MANAGER_DIALOG_HEIGHT_LINES.
gtk_window_set_default_size(GTK_WINDOW(window_), 640, 480);
- std::vector<BookmarkNode*> nodes;
- organize_menu_.reset(new BookmarkContextMenu(window_, profile_, NULL, NULL,
- NULL, nodes, BookmarkContextMenu::BOOKMARK_MANAGER_ORGANIZE_MENU));
-
// Build the organize and tools menus.
- GtkWidget* organize = gtk_menu_item_new_with_label(
+ organize_ = gtk_menu_item_new_with_label(
l10n_util::GetStringUTF8(IDS_BOOKMARK_MANAGER_ORGANIZE_MENU).c_str());
- gtk_menu_item_set_submenu(GTK_MENU_ITEM(organize), organize_menu_->menu());
GtkWidget* import_item = gtk_menu_item_new_with_mnemonic(
gtk_util::ConvertAcceleratorsFromWindowsStyle(
@@ -319,7 +315,7 @@
gtk_menu_item_set_submenu(GTK_MENU_ITEM(tools), tools_menu);
GtkWidget* menu_bar = gtk_menu_bar_new();
- gtk_menu_shell_append(GTK_MENU_SHELL(menu_bar), organize);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu_bar), organize_);
gtk_menu_shell_append(GTK_MENU_SHELL(menu_bar), tools);
SetMenuBarStyle();
gtk_widget_set_name(menu_bar, "chrome-bm-menubar");
@@ -351,6 +347,8 @@
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(vbox), paned, TRUE, TRUE, 0);
gtk_container_add(GTK_CONTAINER(window_), vbox);
+
+ ResetOrganizeMenu(true);
}
GtkWidget* BookmarkManagerGtk::MakeLeftPane() {
@@ -373,6 +371,8 @@
// it.
g_signal_connect(left_tree_view_, "row-collapsed",
G_CALLBACK(OnLeftTreeViewRowCollapsed), this);
+ g_signal_connect(left_tree_view_, "focus-in-event",
+ G_CALLBACK(OnLeftTreeViewFocusIn), this);
// The left side is only a drag destination (not a source).
gtk_drag_dest_set(left_tree_view_, GTK_DEST_DEFAULT_DROP,
@@ -427,6 +427,8 @@
G_CALLBACK(OnRightTreeViewRowActivated), this);
g_signal_connect(right_selection(), "changed",
G_CALLBACK(OnRightSelectionChanged), this);
+ g_signal_connect(right_tree_view_, "focus-in-event",
+ G_CALLBACK(OnRightTreeViewFocusIn), this);
// We don't advertise GDK_ACTION_COPY, but since we don't explicitly do
// any deleting following a succesful move, this should work.
@@ -458,6 +460,20 @@
return scrolled;
}
+void BookmarkManagerGtk::ResetOrganizeMenu(bool left) {
+ organize_is_for_left_ = left;
+ BookmarkNode* parent = GetFolder();
+ std::vector<BookmarkNode*> nodes;
+ if (!left)
+ nodes = GetRightSelection();
+ else if (parent)
+ nodes.push_back(parent);
+
+ organize_menu_.reset(new BookmarkContextMenu(window_, profile_, NULL, NULL,
+ parent, nodes, BookmarkContextMenu::BOOKMARK_MANAGER_ORGANIZE_MENU));
+ gtk_menu_item_set_submenu(GTK_MENU_ITEM(organize_), organize_menu_->menu());
+}
+
void BookmarkManagerGtk::BuildLeftStore() {
GtkTreeIter select_iter;
bookmark_utils::AddToTreeStore(model_,
@@ -685,27 +701,20 @@
// (specifically, when the user collapses an ancestor of the selected row).
// The context menu and right store will momentarily be stale, but we should
// presently receive another selection changed event that will refresh them.
- if (gtk_tree_selection_count_selected_rows(bm->left_selection()) == 0)
+ if (gtk_tree_selection_count_selected_rows(selection) == 0)
return;
- BookmarkNode* parent = bm->GetFolder();
-
- // Update the context menu.
- bm->organize_menu_->set_parent(parent);
- std::vector<BookmarkNode*> nodes;
- if (parent)
- nodes.push_back(parent);
- bm->organize_menu_->set_selection(nodes);
-
+ bm->ResetOrganizeMenu(true);
bm->BuildRightStore();
}
// static
void BookmarkManagerGtk::OnRightSelectionChanged(GtkTreeSelection* selection,
BookmarkManagerGtk* bookmark_manager) {
- // Update the context menu.
- bookmark_manager->organize_menu_->set_selection(
- bookmark_manager->GetRightSelection());
+ if (gtk_tree_selection_count_selected_rows(selection) == 0)
+ return;
+
+ bookmark_manager->ResetOrganizeMenu(false);
}
// statuc
@@ -921,6 +930,20 @@
}
// static
+void BookmarkManagerGtk::OnLeftTreeViewFocusIn(GtkTreeView* tree_view,
+ GdkEventFocus* event, BookmarkManagerGtk* bm) {
+ if (!bm->organize_is_for_left_)
+ bm->ResetOrganizeMenu(true);
+}
+
+// static
+void BookmarkManagerGtk::OnRightTreeViewFocusIn(GtkTreeView* tree_view,
+ GdkEventFocus* event, BookmarkManagerGtk* bm) {
+ if (bm->organize_is_for_left_)
+ bm->ResetOrganizeMenu(false);
+}
+
+// static
void BookmarkManagerGtk::OnImportItemActivated(GtkMenuItem* menuitem,
BookmarkManagerGtk* bm) {
SelectFileDialog::FileTypeInfo file_type_info;
« no previous file with comments | « chrome/browser/gtk/bookmark_manager_gtk.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698