OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/gtk/bookmark_menu_controller_gtk.h" | 5 #include "chrome/browser/gtk/bookmark_menu_controller_gtk.h" |
6 | 6 |
7 #include <gtk/gtk.h> | 7 #include <gtk/gtk.h> |
8 | 8 |
9 #include "app/gtk_dnd_util.h" | 9 #include "app/gtk_dnd_util.h" |
10 #include "app/l10n_util.h" | 10 #include "app/l10n_util.h" |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
98 ignore_button_release_(false), | 98 ignore_button_release_(false), |
99 triggering_widget_(NULL) { | 99 triggering_widget_(NULL) { |
100 menu_ = gtk_menu_new(); | 100 menu_ = gtk_menu_new(); |
101 BuildMenu(node, start_child_index, menu_); | 101 BuildMenu(node, start_child_index, menu_); |
102 g_signal_connect(menu_, "hide", | 102 g_signal_connect(menu_, "hide", |
103 G_CALLBACK(OnMenuHidden), this); | 103 G_CALLBACK(OnMenuHidden), this); |
104 gtk_widget_show_all(menu_); | 104 gtk_widget_show_all(menu_); |
105 } | 105 } |
106 | 106 |
107 BookmarkMenuController::~BookmarkMenuController() { | 107 BookmarkMenuController::~BookmarkMenuController() { |
| 108 |
| 109 if (context_menu_.get()) |
| 110 context_menu_->DelegateDestroyed(); |
108 profile_->GetBookmarkModel()->RemoveObserver(this); | 111 profile_->GetBookmarkModel()->RemoveObserver(this); |
109 gtk_menu_popdown(GTK_MENU(menu_)); | 112 gtk_menu_popdown(GTK_MENU(menu_)); |
110 } | 113 } |
111 | 114 |
112 void BookmarkMenuController::Popup(GtkWidget* widget, gint button_type, | 115 void BookmarkMenuController::Popup(GtkWidget* widget, gint button_type, |
113 guint32 timestamp) { | 116 guint32 timestamp) { |
114 profile_->GetBookmarkModel()->AddObserver(this); | 117 profile_->GetBookmarkModel()->AddObserver(this); |
115 | 118 |
116 triggering_widget_ = widget; | 119 triggering_widget_ = widget; |
117 gtk_chrome_button_set_paint_state(GTK_CHROME_BUTTON(widget), | 120 gtk_chrome_button_set_paint_state(GTK_CHROME_BUTTON(widget), |
118 GTK_STATE_ACTIVE); | 121 GTK_STATE_ACTIVE); |
119 gtk_menu_popup(GTK_MENU(menu_), NULL, NULL, | 122 gtk_menu_popup(GTK_MENU(menu_), NULL, NULL, |
120 &MenuGtk::MenuPositionFunc, | 123 &MenuGtk::MenuPositionFunc, |
121 widget, button_type, timestamp); | 124 widget, button_type, timestamp); |
122 } | 125 } |
123 | 126 |
124 void BookmarkMenuController::BookmarkModelChanged() { | 127 void BookmarkMenuController::BookmarkModelChanged() { |
125 gtk_menu_popdown(GTK_MENU(menu_)); | 128 gtk_menu_popdown(GTK_MENU(menu_)); |
126 } | 129 } |
127 | 130 |
128 void BookmarkMenuController::BookmarkNodeFavIconLoaded( | 131 void BookmarkMenuController::BookmarkNodeFavIconLoaded( |
129 BookmarkModel* model, const BookmarkNode* node) { | 132 BookmarkModel* model, const BookmarkNode* node) { |
130 std::map<const BookmarkNode*, GtkWidget*>::iterator it = | 133 std::map<const BookmarkNode*, GtkWidget*>::iterator it = |
131 node_to_menu_widget_map_.find(node); | 134 node_to_menu_widget_map_.find(node); |
132 if (it != node_to_menu_widget_map_.end()) | 135 if (it != node_to_menu_widget_map_.end()) |
133 SetImageMenuItem(it->second, node, model); | 136 SetImageMenuItem(it->second, node, model); |
134 } | 137 } |
135 | 138 |
| 139 void BookmarkMenuController::WillExecuteCommand() { |
| 140 gtk_menu_popdown(GTK_MENU(menu_)); |
| 141 } |
| 142 |
136 void BookmarkMenuController::NavigateToMenuItem( | 143 void BookmarkMenuController::NavigateToMenuItem( |
137 GtkWidget* menu_item, | 144 GtkWidget* menu_item, |
138 WindowOpenDisposition disposition) { | 145 WindowOpenDisposition disposition) { |
139 const BookmarkNode* node = GetNodeFromMenuItem(menu_item); | 146 const BookmarkNode* node = GetNodeFromMenuItem(menu_item); |
140 DCHECK(node); | 147 DCHECK(node); |
141 DCHECK(page_navigator_); | 148 DCHECK(page_navigator_); |
142 page_navigator_->OpenURL( | 149 page_navigator_->OpenURL( |
143 node->GetURL(), GURL(), disposition, PageTransition::AUTO_BOOKMARK); | 150 node->GetURL(), GURL(), disposition, PageTransition::AUTO_BOOKMARK); |
144 } | 151 } |
145 | 152 |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
238 parent = node->GetParent(); | 245 parent = node->GetParent(); |
239 | 246 |
240 // Show the right click menu and stop processing this button event. | 247 // Show the right click menu and stop processing this button event. |
241 std::vector<const BookmarkNode*> nodes; | 248 std::vector<const BookmarkNode*> nodes; |
242 if (node) | 249 if (node) |
243 nodes.push_back(node); | 250 nodes.push_back(node); |
244 controller->context_menu_.reset( | 251 controller->context_menu_.reset( |
245 new BookmarkContextMenu( | 252 new BookmarkContextMenu( |
246 GTK_WIDGET(controller->parent_window_), controller->profile_, | 253 GTK_WIDGET(controller->parent_window_), controller->profile_, |
247 controller->browser_, controller->page_navigator_, parent, nodes, | 254 controller->browser_, controller->page_navigator_, parent, nodes, |
248 BookmarkContextMenu::BOOKMARK_BAR)); | 255 BookmarkContextMenu::BOOKMARK_BAR, controller)); |
249 | 256 |
250 // Our bookmark folder menu loses the grab to the context menu. When the | 257 // Our bookmark folder menu loses the grab to the context menu. When the |
251 // context menu is hidden, re-assert our grab. | 258 // context menu is hidden, re-assert our grab. |
252 GtkWidget* grabbing_menu = gtk_grab_get_current(); | 259 GtkWidget* grabbing_menu = gtk_grab_get_current(); |
253 g_object_ref(grabbing_menu); | 260 g_object_ref(grabbing_menu); |
254 g_signal_connect(controller->context_menu_->menu(), "hide", | 261 g_signal_connect(controller->context_menu_->menu(), "hide", |
255 G_CALLBACK(OnContextMenuHide), grabbing_menu); | 262 G_CALLBACK(OnContextMenuHide), grabbing_menu); |
256 | 263 |
257 controller->context_menu_->PopupAsContext(event->time); | 264 controller->context_menu_->PopupAsContext(event->time); |
258 return TRUE; | 265 return TRUE; |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
339 // static | 346 // static |
340 void BookmarkMenuController::OnMenuItemDragGet( | 347 void BookmarkMenuController::OnMenuItemDragGet( |
341 GtkWidget* widget, GdkDragContext* context, | 348 GtkWidget* widget, GdkDragContext* context, |
342 GtkSelectionData* selection_data, | 349 GtkSelectionData* selection_data, |
343 guint target_type, guint time, | 350 guint target_type, guint time, |
344 BookmarkMenuController* controller) { | 351 BookmarkMenuController* controller) { |
345 const BookmarkNode* node = bookmark_utils::BookmarkNodeForWidget(widget); | 352 const BookmarkNode* node = bookmark_utils::BookmarkNodeForWidget(widget); |
346 bookmark_utils::WriteBookmarkToSelection(node, selection_data, target_type, | 353 bookmark_utils::WriteBookmarkToSelection(node, selection_data, target_type, |
347 controller->profile_); | 354 controller->profile_); |
348 } | 355 } |
OLD | NEW |