| 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 |