| Index: chrome/browser/ui/gtk/menu_gtk.cc
|
| diff --git a/chrome/browser/ui/gtk/menu_gtk.cc b/chrome/browser/ui/gtk/menu_gtk.cc
|
| index 19e4d1264494556eebd6e4a2238be1f6d8c1bf55..5c68350c6300764f78ad70fc72ed0c59be22437b 100644
|
| --- a/chrome/browser/ui/gtk/menu_gtk.cc
|
| +++ b/chrome/browser/ui/gtk/menu_gtk.cc
|
| @@ -114,7 +114,7 @@ int CalculateMenuYPosition(const GdkRectangle* screen_rect,
|
|
|
| } // namespace
|
|
|
| -GtkWidget* MenuGtk::Delegate::GetDefaultImageForCommandId(int command_id) {
|
| +GtkWidget* MenuCreator::Delegate::GetDefaultImageForCommandId(int command_id) {
|
| const char* stock;
|
| switch (command_id) {
|
| case IDC_NEW_TAB:
|
| @@ -270,15 +270,132 @@ GtkWidget* MenuGtk::Delegate::GetDefaultImageForCommandId(int command_id) {
|
| return stock ? gtk_image_new_from_stock(stock, GTK_ICON_SIZE_MENU) : NULL;
|
| }
|
|
|
| -GtkWidget* MenuGtk::Delegate::GetImageForCommandId(int command_id) const {
|
| +GtkWidget* MenuCreator::Delegate::GetImageForCommandId(int command_id) const {
|
| return GetDefaultImageForCommandId(command_id);
|
| }
|
|
|
| +MenuCreator::MenuCreator(Delegate* delegate)
|
| + : delegate_(delegate),
|
| + dummy_accel_group_(gtk_accel_group_new()) {
|
| +}
|
| +
|
| +MenuCreator::~MenuCreator() {
|
| + g_object_unref(dummy_accel_group_);
|
| +}
|
| +
|
| +void MenuCreator::BuildSubmenuFromModel(ui::MenuModel* model, GtkWidget* menu) {
|
| + std::map<int, GtkWidget*> radio_groups;
|
| + GtkWidget* menu_item = NULL;
|
| + for (int i = 0; i < model->GetItemCount(); ++i) {
|
| + SkBitmap icon;
|
| + std::string label =
|
| + gfx::ConvertAcceleratorsFromWindowsStyle(
|
| + UTF16ToUTF8(model->GetLabelAt(i)));
|
| + bool connect_to_activate = true;
|
| +
|
| + switch (model->GetTypeAt(i)) {
|
| + case ui::MenuModel::TYPE_SEPARATOR:
|
| + menu_item = gtk_separator_menu_item_new();
|
| + break;
|
| +
|
| + case ui::MenuModel::TYPE_CHECK:
|
| + menu_item = gtk_check_menu_item_new_with_mnemonic(label.c_str());
|
| + break;
|
| +
|
| + case ui::MenuModel::TYPE_RADIO: {
|
| + std::map<int, GtkWidget*>::iterator iter =
|
| + radio_groups.find(model->GetGroupIdAt(i));
|
| +
|
| + if (iter == radio_groups.end()) {
|
| + menu_item = gtk_radio_menu_item_new_with_mnemonic(
|
| + NULL, label.c_str());
|
| + radio_groups[model->GetGroupIdAt(i)] = menu_item;
|
| + } else {
|
| + menu_item = gtk_radio_menu_item_new_with_mnemonic_from_widget(
|
| + GTK_RADIO_MENU_ITEM(iter->second), label.c_str());
|
| + }
|
| + break;
|
| + }
|
| + case ui::MenuModel::TYPE_BUTTON_ITEM: {
|
| + ui::ButtonMenuItemModel* button_menu_item_model =
|
| + model->GetButtonMenuItemAt(i);
|
| + menu_item = BuildButtonMenuItem(button_menu_item_model, menu);
|
| + if (!menu_item)
|
| + continue;
|
| + connect_to_activate = false;
|
| + break;
|
| + }
|
| + case ui::MenuModel::TYPE_SUBMENU:
|
| + case ui::MenuModel::TYPE_COMMAND: {
|
| + int command_id = model->GetCommandIdAt(i);
|
| + if (model->GetIconAt(i, &icon))
|
| + menu_item = BuildMenuItemWithImage(label, icon);
|
| + else
|
| + menu_item = BuildMenuItemWithLabel(label, command_id);
|
| + if (delegate_ && delegate_->AlwaysShowIconForCmd(command_id) &&
|
| + GTK_IS_IMAGE_MENU_ITEM(menu_item))
|
| + gtk_util::SetAlwaysShowImage(menu_item);
|
| + break;
|
| + }
|
| +
|
| + default:
|
| + NOTREACHED();
|
| + }
|
| +
|
| + if (model->GetTypeAt(i) == ui::MenuModel::TYPE_SUBMENU) {
|
| + GtkWidget* submenu = gtk_menu_new();
|
| + BuildSubmenuFromModel(model->GetSubmenuModelAt(i), submenu);
|
| + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu);
|
| + }
|
| +
|
| + ui::AcceleratorGtk accelerator;
|
| + if (model->GetAcceleratorAt(i, &accelerator)) {
|
| + gtk_widget_add_accelerator(menu_item,
|
| + "activate",
|
| + dummy_accel_group_,
|
| + accelerator.GetGdkKeyCode(),
|
| + accelerator.gdk_modifier_type(),
|
| + GTK_ACCEL_VISIBLE);
|
| + }
|
| +
|
| + g_object_set_data(G_OBJECT(menu_item), "model", model);
|
| + AppendMenuItemToMenu(i, model, menu_item, menu, connect_to_activate);
|
| +
|
| + menu_item = NULL;
|
| + }
|
| +}
|
| +
|
| +GtkWidget* MenuCreator::BuildMenuItemWithImage(const std::string& label,
|
| + GtkWidget* image) const {
|
| + GtkWidget* menu_item =
|
| + gtk_image_menu_item_new_with_mnemonic(label.c_str());
|
| + gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item), image);
|
| + return menu_item;
|
| +}
|
| +
|
| +GtkWidget* MenuCreator::BuildMenuItemWithImage(const std::string& label,
|
| + const SkBitmap& icon) const {
|
| + GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(&icon);
|
| + GtkWidget* menu_item = BuildMenuItemWithImage(label,
|
| + gtk_image_new_from_pixbuf(pixbuf));
|
| + g_object_unref(pixbuf);
|
| + return menu_item;
|
| +}
|
| +
|
| +GtkWidget* MenuCreator::BuildMenuItemWithLabel(const std::string& label,
|
| + int command_id) const {
|
| + GtkWidget* img =
|
| + delegate_ ? delegate_->GetImageForCommandId(command_id) :
|
| + MenuGtk::Delegate::GetDefaultImageForCommandId(command_id);
|
| + return img ? BuildMenuItemWithImage(label, img) :
|
| + gtk_menu_item_new_with_mnemonic(label.c_str());
|
| +}
|
| +
|
| MenuGtk::MenuGtk(MenuGtk::Delegate* delegate,
|
| ui::MenuModel* model)
|
| - : delegate_(delegate),
|
| + : MenuCreator(delegate),
|
| + delegate_(delegate),
|
| model_(model),
|
| - dummy_accel_group_(gtk_accel_group_new()),
|
| menu_(gtk_custom_menu_new()),
|
| factory_(this) {
|
| DCHECK(model);
|
| @@ -294,7 +411,6 @@ MenuGtk::~MenuGtk() {
|
| g_object_unref(menu_);
|
|
|
| STLDeleteContainerPointers(submenus_we_own_.begin(), submenus_we_own_.end());
|
| - g_object_unref(dummy_accel_group_);
|
| }
|
|
|
| void MenuGtk::ConnectSignalHandlers() {
|
| @@ -404,116 +520,10 @@ void MenuGtk::UpdateMenu() {
|
| gtk_container_foreach(GTK_CONTAINER(menu_), SetMenuItemInfo, this);
|
| }
|
|
|
| -GtkWidget* MenuGtk::BuildMenuItemWithImage(const std::string& label,
|
| - GtkWidget* image) {
|
| - GtkWidget* menu_item =
|
| - gtk_image_menu_item_new_with_mnemonic(label.c_str());
|
| - gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item), image);
|
| - return menu_item;
|
| -}
|
| -
|
| -GtkWidget* MenuGtk::BuildMenuItemWithImage(const std::string& label,
|
| - const SkBitmap& icon) {
|
| - GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(&icon);
|
| - GtkWidget* menu_item = BuildMenuItemWithImage(label,
|
| - gtk_image_new_from_pixbuf(pixbuf));
|
| - g_object_unref(pixbuf);
|
| - return menu_item;
|
| -}
|
| -
|
| -GtkWidget* MenuGtk::BuildMenuItemWithLabel(const std::string& label,
|
| - int command_id) {
|
| - GtkWidget* img =
|
| - delegate_ ? delegate_->GetImageForCommandId(command_id) :
|
| - MenuGtk::Delegate::GetDefaultImageForCommandId(command_id);
|
| - return img ? BuildMenuItemWithImage(label, img) :
|
| - gtk_menu_item_new_with_mnemonic(label.c_str());
|
| -}
|
| -
|
| void MenuGtk::BuildMenuFromModel() {
|
| BuildSubmenuFromModel(model_, menu_);
|
| }
|
|
|
| -void MenuGtk::BuildSubmenuFromModel(ui::MenuModel* model, GtkWidget* menu) {
|
| - std::map<int, GtkWidget*> radio_groups;
|
| - GtkWidget* menu_item = NULL;
|
| - for (int i = 0; i < model->GetItemCount(); ++i) {
|
| - SkBitmap icon;
|
| - std::string label =
|
| - gfx::ConvertAcceleratorsFromWindowsStyle(
|
| - UTF16ToUTF8(model->GetLabelAt(i)));
|
| - bool connect_to_activate = true;
|
| -
|
| - switch (model->GetTypeAt(i)) {
|
| - case ui::MenuModel::TYPE_SEPARATOR:
|
| - menu_item = gtk_separator_menu_item_new();
|
| - break;
|
| -
|
| - case ui::MenuModel::TYPE_CHECK:
|
| - menu_item = gtk_check_menu_item_new_with_mnemonic(label.c_str());
|
| - break;
|
| -
|
| - case ui::MenuModel::TYPE_RADIO: {
|
| - std::map<int, GtkWidget*>::iterator iter =
|
| - radio_groups.find(model->GetGroupIdAt(i));
|
| -
|
| - if (iter == radio_groups.end()) {
|
| - menu_item = gtk_radio_menu_item_new_with_mnemonic(
|
| - NULL, label.c_str());
|
| - radio_groups[model->GetGroupIdAt(i)] = menu_item;
|
| - } else {
|
| - menu_item = gtk_radio_menu_item_new_with_mnemonic_from_widget(
|
| - GTK_RADIO_MENU_ITEM(iter->second), label.c_str());
|
| - }
|
| - break;
|
| - }
|
| - case ui::MenuModel::TYPE_BUTTON_ITEM: {
|
| - ui::ButtonMenuItemModel* button_menu_item_model =
|
| - model->GetButtonMenuItemAt(i);
|
| - menu_item = BuildButtonMenuItem(button_menu_item_model, menu);
|
| - connect_to_activate = false;
|
| - break;
|
| - }
|
| - case ui::MenuModel::TYPE_SUBMENU:
|
| - case ui::MenuModel::TYPE_COMMAND: {
|
| - int command_id = model->GetCommandIdAt(i);
|
| - if (model->GetIconAt(i, &icon))
|
| - menu_item = BuildMenuItemWithImage(label, icon);
|
| - else
|
| - menu_item = BuildMenuItemWithLabel(label, command_id);
|
| - if (delegate_ && delegate_->AlwaysShowIconForCmd(command_id) &&
|
| - GTK_IS_IMAGE_MENU_ITEM(menu_item))
|
| - gtk_util::SetAlwaysShowImage(menu_item);
|
| - break;
|
| - }
|
| -
|
| - default:
|
| - NOTREACHED();
|
| - }
|
| -
|
| - if (model->GetTypeAt(i) == ui::MenuModel::TYPE_SUBMENU) {
|
| - GtkWidget* submenu = gtk_menu_new();
|
| - BuildSubmenuFromModel(model->GetSubmenuModelAt(i), submenu);
|
| - gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu);
|
| - }
|
| -
|
| - ui::AcceleratorGtk accelerator;
|
| - if (model->GetAcceleratorAt(i, &accelerator)) {
|
| - gtk_widget_add_accelerator(menu_item,
|
| - "activate",
|
| - dummy_accel_group_,
|
| - accelerator.GetGdkKeyCode(),
|
| - accelerator.gdk_modifier_type(),
|
| - GTK_ACCEL_VISIBLE);
|
| - }
|
| -
|
| - g_object_set_data(G_OBJECT(menu_item), "model", model);
|
| - AppendMenuItemToMenu(i, model, menu_item, menu, connect_to_activate);
|
| -
|
| - menu_item = NULL;
|
| - }
|
| -}
|
| -
|
| GtkWidget* MenuGtk::BuildButtonMenuItem(ui::ButtonMenuItemModel* model,
|
| GtkWidget* menu) {
|
| GtkWidget* menu_item = gtk_custom_menu_item_new(
|
|
|