| Index: chrome/browser/tab_contents/render_view_context_menu_gtk.cc
|
| ===================================================================
|
| --- chrome/browser/tab_contents/render_view_context_menu_gtk.cc (revision 98595)
|
| +++ 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());
|
| +}
|
|
|