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/l10n_util.h" | 9 #include "app/l10n_util.h" |
10 #include "app/resource_bundle.h" | 10 #include "app/resource_bundle.h" |
11 #include "base/gfx/gtk_util.h" | 11 #include "base/gfx/gtk_util.h" |
12 #include "base/string_util.h" | 12 #include "base/string_util.h" |
13 #include "chrome/browser/gtk/bookmark_context_menu.h" | 13 #include "chrome/browser/gtk/bookmark_context_menu.h" |
14 #include "chrome/browser/gtk/bookmark_utils_gtk.h" | 14 #include "chrome/browser/gtk/bookmark_utils_gtk.h" |
| 15 #include "chrome/browser/gtk/gtk_chrome_button.h" |
15 #include "chrome/browser/gtk/gtk_dnd_util.h" | 16 #include "chrome/browser/gtk/gtk_dnd_util.h" |
16 #include "chrome/browser/gtk/gtk_theme_provider.h" | 17 #include "chrome/browser/gtk/gtk_theme_provider.h" |
17 #include "chrome/browser/gtk/menu_gtk.h" | 18 #include "chrome/browser/gtk/menu_gtk.h" |
18 #include "chrome/browser/profile.h" | 19 #include "chrome/browser/profile.h" |
19 #include "chrome/browser/tab_contents/page_navigator.h" | 20 #include "chrome/browser/tab_contents/page_navigator.h" |
20 #include "chrome/common/gtk_util.h" | 21 #include "chrome/common/gtk_util.h" |
21 #include "grit/app_resources.h" | 22 #include "grit/app_resources.h" |
22 #include "grit/generated_resources.h" | 23 #include "grit/generated_resources.h" |
23 #include "grit/theme_resources.h" | 24 #include "grit/theme_resources.h" |
24 #include "webkit/glue/window_open_disposition.h" | 25 #include "webkit/glue/window_open_disposition.h" |
(...skipping 23 matching lines...) Expand all Loading... |
48 PageNavigator* navigator, | 49 PageNavigator* navigator, |
49 GtkWindow* window, | 50 GtkWindow* window, |
50 const BookmarkNode* node, | 51 const BookmarkNode* node, |
51 int start_child_index, | 52 int start_child_index, |
52 bool show_other_folder) | 53 bool show_other_folder) |
53 : browser_(browser), | 54 : browser_(browser), |
54 profile_(profile), | 55 profile_(profile), |
55 page_navigator_(navigator), | 56 page_navigator_(navigator), |
56 parent_window_(window), | 57 parent_window_(window), |
57 node_(node), | 58 node_(node), |
58 ignore_button_release_(false) { | 59 ignore_button_release_(false), |
| 60 triggering_widget_(NULL) { |
59 menu_.Own(gtk_menu_new()); | 61 menu_.Own(gtk_menu_new()); |
60 BuildMenu(node, start_child_index, menu_.get()); | 62 BuildMenu(node, start_child_index, menu_.get()); |
| 63 g_signal_connect(menu_.get(), "hide", |
| 64 G_CALLBACK(OnMenuHidden), this); |
61 gtk_widget_show_all(menu_.get()); | 65 gtk_widget_show_all(menu_.get()); |
62 } | 66 } |
63 | 67 |
64 BookmarkMenuController::~BookmarkMenuController() { | 68 BookmarkMenuController::~BookmarkMenuController() { |
65 profile_->GetBookmarkModel()->RemoveObserver(this); | 69 profile_->GetBookmarkModel()->RemoveObserver(this); |
66 menu_.Destroy(); | 70 menu_.Destroy(); |
67 } | 71 } |
68 | 72 |
69 void BookmarkMenuController::Popup(GtkWidget* widget, gint button_type, | 73 void BookmarkMenuController::Popup(GtkWidget* widget, gint button_type, |
70 guint32 timestamp) { | 74 guint32 timestamp) { |
71 profile_->GetBookmarkModel()->AddObserver(this); | 75 profile_->GetBookmarkModel()->AddObserver(this); |
72 | 76 |
| 77 triggering_widget_ = widget; |
| 78 gtk_chrome_button_set_paint_state(GTK_CHROME_BUTTON(widget), |
| 79 GTK_STATE_ACTIVE); |
73 gtk_menu_popup(GTK_MENU(menu_.get()), NULL, NULL, | 80 gtk_menu_popup(GTK_MENU(menu_.get()), NULL, NULL, |
74 &MenuGtk::MenuPositionFunc, | 81 &MenuGtk::MenuPositionFunc, |
75 widget, button_type, timestamp); | 82 widget, button_type, timestamp); |
76 } | 83 } |
77 | 84 |
78 void BookmarkMenuController::BookmarkModelChanged() { | 85 void BookmarkMenuController::BookmarkModelChanged() { |
79 gtk_menu_popdown(GTK_MENU(menu_.get())); | 86 gtk_menu_popdown(GTK_MENU(menu_.get())); |
80 } | 87 } |
81 | 88 |
82 void BookmarkMenuController::BookmarkNodeFavIconLoaded( | 89 void BookmarkMenuController::BookmarkNodeFavIconLoaded( |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
150 } | 157 } |
151 | 158 |
152 if (parent->GetChildCount() == 0) { | 159 if (parent->GetChildCount() == 0) { |
153 GtkWidget* empty_menu = gtk_menu_item_new_with_label( | 160 GtkWidget* empty_menu = gtk_menu_item_new_with_label( |
154 l10n_util::GetStringUTF8(IDS_MENU_EMPTY_SUBMENU).c_str()); | 161 l10n_util::GetStringUTF8(IDS_MENU_EMPTY_SUBMENU).c_str()); |
155 gtk_widget_set_sensitive(empty_menu, FALSE); | 162 gtk_widget_set_sensitive(empty_menu, FALSE); |
156 gtk_menu_shell_append(GTK_MENU_SHELL(menu), empty_menu); | 163 gtk_menu_shell_append(GTK_MENU_SHELL(menu), empty_menu); |
157 } | 164 } |
158 } | 165 } |
159 | 166 |
| 167 // static |
160 gboolean BookmarkMenuController::OnButtonPressed( | 168 gboolean BookmarkMenuController::OnButtonPressed( |
161 GtkWidget* sender, | 169 GtkWidget* sender, |
162 GdkEventButton* event, | 170 GdkEventButton* event, |
163 BookmarkMenuController* controller) { | 171 BookmarkMenuController* controller) { |
164 controller->ignore_button_release_ = false; | 172 controller->ignore_button_release_ = false; |
165 | 173 |
166 if (event->button == 3) { | 174 if (event->button == 3) { |
167 // Show the right click menu and stop processing this button event. | 175 // Show the right click menu and stop processing this button event. |
168 const BookmarkNode* node = GetNodeFromMenuItem(sender); | 176 const BookmarkNode* node = GetNodeFromMenuItem(sender); |
169 const BookmarkNode* parent = node->GetParent(); | 177 const BookmarkNode* parent = node->GetParent(); |
170 std::vector<const BookmarkNode*> nodes; | 178 std::vector<const BookmarkNode*> nodes; |
171 nodes.push_back(node); | 179 nodes.push_back(node); |
172 controller->context_menu_.reset( | 180 controller->context_menu_.reset( |
173 new BookmarkContextMenu( | 181 new BookmarkContextMenu( |
174 sender, controller->profile_, controller->browser_, | 182 sender, controller->profile_, controller->browser_, |
175 controller->page_navigator_, parent, nodes, | 183 controller->page_navigator_, parent, nodes, |
176 BookmarkContextMenu::BOOKMARK_BAR)); | 184 BookmarkContextMenu::BOOKMARK_BAR)); |
177 controller->context_menu_->PopupAsContext(event->time); | 185 controller->context_menu_->PopupAsContext(event->time); |
178 return TRUE; | 186 return TRUE; |
179 } | 187 } |
180 | 188 |
181 return FALSE; | 189 return FALSE; |
182 } | 190 } |
183 | 191 |
| 192 // static |
184 gboolean BookmarkMenuController::OnButtonReleased( | 193 gboolean BookmarkMenuController::OnButtonReleased( |
185 GtkWidget* sender, | 194 GtkWidget* sender, |
186 GdkEventButton* event, | 195 GdkEventButton* event, |
187 BookmarkMenuController* controller) { | 196 BookmarkMenuController* controller) { |
188 if (controller->ignore_button_release_) { | 197 if (controller->ignore_button_release_) { |
189 // Don't handle this message; it was a drag. | 198 // Don't handle this message; it was a drag. |
190 controller->ignore_button_release_ = false; | 199 controller->ignore_button_release_ = false; |
191 return FALSE; | 200 return FALSE; |
192 } | 201 } |
193 | 202 |
194 // Releasing either button 1 or 2 should trigger the bookmark menu. | 203 // Releasing either button 1 or 2 should trigger the bookmark menu. |
195 if (event->button == 1 || event->button == 2) { | 204 if (event->button == 1 || event->button == 2) { |
196 WindowOpenDisposition disposition = | 205 WindowOpenDisposition disposition = |
197 event_utils::DispositionFromEventFlags(event->state); | 206 event_utils::DispositionFromEventFlags(event->state); |
198 controller->NavigateToMenuItem(sender, disposition); | 207 controller->NavigateToMenuItem(sender, disposition); |
199 | 208 |
200 // We need to manually dismiss the popup menu because we're overriding | 209 // We need to manually dismiss the popup menu because we're overriding |
201 // button-release-event. | 210 // button-release-event. |
202 gtk_menu_popdown(GTK_MENU(controller->menu_.get())); | 211 gtk_menu_popdown(GTK_MENU(controller->menu_.get())); |
203 return TRUE; | 212 return TRUE; |
204 } | 213 } |
205 | 214 |
206 return FALSE; | 215 return FALSE; |
207 } | 216 } |
208 | 217 |
| 218 // static |
| 219 void BookmarkMenuController::OnMenuHidden(GtkWidget* menu, |
| 220 BookmarkMenuController* controller) { |
| 221 if (controller->triggering_widget_) { |
| 222 gtk_chrome_button_unset_paint_state( |
| 223 GTK_CHROME_BUTTON(controller->triggering_widget_)); |
| 224 } |
| 225 } |
| 226 |
| 227 // static |
209 void BookmarkMenuController::OnMenuItemActivated( | 228 void BookmarkMenuController::OnMenuItemActivated( |
210 GtkMenuItem* menu_item, BookmarkMenuController* controller) { | 229 GtkMenuItem* menu_item, BookmarkMenuController* controller) { |
211 controller->NavigateToMenuItem(GTK_WIDGET(menu_item), CURRENT_TAB); | 230 controller->NavigateToMenuItem(GTK_WIDGET(menu_item), CURRENT_TAB); |
212 } | 231 } |
213 | 232 |
214 // static | 233 // static |
215 void BookmarkMenuController::OnMenuItemDragBegin( | 234 void BookmarkMenuController::OnMenuItemDragBegin( |
216 GtkWidget* menu_item, | 235 GtkWidget* menu_item, |
217 GdkDragContext* drag_context, | 236 GdkDragContext* drag_context, |
218 BookmarkMenuController* controller) { | 237 BookmarkMenuController* controller) { |
(...skipping 29 matching lines...) Expand all Loading... |
248 // static | 267 // static |
249 void BookmarkMenuController::OnMenuItemDragGet( | 268 void BookmarkMenuController::OnMenuItemDragGet( |
250 GtkWidget* widget, GdkDragContext* context, | 269 GtkWidget* widget, GdkDragContext* context, |
251 GtkSelectionData* selection_data, | 270 GtkSelectionData* selection_data, |
252 guint target_type, guint time, | 271 guint target_type, guint time, |
253 BookmarkMenuController* controller) { | 272 BookmarkMenuController* controller) { |
254 const BookmarkNode* node = bookmark_utils::BookmarkNodeForWidget(widget); | 273 const BookmarkNode* node = bookmark_utils::BookmarkNodeForWidget(widget); |
255 bookmark_utils::WriteBookmarkToSelection(node, selection_data, target_type, | 274 bookmark_utils::WriteBookmarkToSelection(node, selection_data, target_type, |
256 controller->profile_); | 275 controller->profile_); |
257 } | 276 } |
OLD | NEW |