Index: chrome/browser/tab_contents/render_view_context_menu_gtk.cc |
=================================================================== |
--- chrome/browser/tab_contents/render_view_context_menu_gtk.cc (revision 99616) |
+++ chrome/browser/tab_contents/render_view_context_menu_gtk.cc (working copy) |
@@ -7,6 +7,7 @@ |
#include <gtk/gtk.h> |
#include "base/string_util.h" |
+#include "base/utf_string_conversions.h" |
#include "chrome/app/chrome_command_ids.h" |
#include "chrome/browser/ui/gtk/gtk_util.h" |
#include "content/browser/renderer_host/render_widget_host_view_gtk.h" |
@@ -16,6 +17,60 @@ |
#include "ui/gfx/gtk_util.h" |
#include "webkit/glue/context_menu.h" |
+namespace { |
+ |
+// A callback function for gtk_container_foreach(). This callback just checks |
+// the menu ID and set the given user data if it is same as the specified ID. |
+struct GtkWidgetAtParam { |
+ int index; |
+ GtkWidget* widget; |
+}; |
+ |
+void GtkWidgetAt(GtkWidget* widget, gpointer user_data) { |
+ GtkWidgetAtParam* param = reinterpret_cast<GtkWidgetAtParam*>(user_data); |
+ |
+ gpointer data = g_object_get_data(G_OBJECT(widget), "menu-id"); |
+ if (data && (GPOINTER_TO_INT(data) - 1) == param->index && |
+ GTK_IS_MENU_ITEM(widget)) { |
+ param->widget = widget; |
+ } |
+} |
+ |
+// Retrieves a GtkWidget which has the specified command_id. This function |
+// traverses the given |model| in the depth-first order. When this function |
+// finds an item whose command_id is the same as the given |command_id|, it |
+// returns the GtkWidget associated with the item. This function emulates |
+// views::MenuItemViews::GetMenuItemByID() for GTK. |
+GtkWidget* GetMenuItemByID(ui::MenuModel* model, |
+ GtkWidget* menu, |
+ int command_id) { |
+ if (!menu) |
+ return NULL; |
+ |
+ for (int i = 0; i < model->GetItemCount(); ++i) { |
+ if (model->GetCommandIdAt(i) == command_id) { |
+ GtkWidgetAtParam param; |
+ param.index = i; |
+ param.widget = NULL; |
+ gtk_container_foreach(GTK_CONTAINER(menu), &GtkWidgetAt, ¶m); |
+ return param.widget; |
+ } |
+ |
+ ui::MenuModel* submenu = model->GetSubmenuModelAt(i); |
+ if (submenu) { |
+ GtkWidget* subitem = GetMenuItemByID( |
+ submenu, |
+ gtk_menu_item_get_submenu(GTK_MENU_ITEM(menu)), |
+ command_id); |
+ if (subitem) |
+ return subitem; |
+ } |
+ } |
+ return NULL; |
+} |
+ |
+} // namespace |
+ |
RenderViewContextMenuGtk::RenderViewContextMenuGtk( |
TabContents* web_contents, |
const ContextMenuParams& params, |
@@ -70,3 +125,16 @@ |
return command_id >= IDC_EXTENSIONS_CONTEXT_CUSTOM_FIRST && |
command_id <= IDC_EXTENSIONS_CONTEXT_CUSTOM_LAST; |
} |
+ |
+void RenderViewContextMenuGtk::UpdateMenuItem(int command_id, |
+ bool enabled, |
+ const string16& title) { |
+ GtkWidget* item = GetMenuItemByID(&menu_model_, menu_gtk_->widget(), |
+ command_id); |
+ if (!item || !GTK_IS_MENU_ITEM(item)) |
+ return; |
+ |
+ // Enable (or disable) the menu item and updates its text. |
+ gtk_widget_set_sensitive(item, enabled); |
+ gtk_menu_item_set_label(GTK_MENU_ITEM(item), UTF16ToUTF8(title).c_str()); |
+} |