| 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/menu_gtk.h" | 5 #include "chrome/browser/gtk/menu_gtk.h" |
| 6 | 6 |
| 7 #include "app/gfx/gtk_util.h" | 7 #include "app/gfx/gtk_util.h" |
| 8 #include "app/l10n_util.h" | 8 #include "app/l10n_util.h" |
| 9 #include "app/menus/menu_model.h" |
| 9 #include "base/logging.h" | 10 #include "base/logging.h" |
| 10 #include "base/message_loop.h" | 11 #include "base/message_loop.h" |
| 11 #include "base/stl_util-inl.h" | 12 #include "base/stl_util-inl.h" |
| 12 #include "base/string_util.h" | 13 #include "base/string_util.h" |
| 13 #include "chrome/browser/gtk/standard_menus.h" | 14 #include "chrome/browser/gtk/standard_menus.h" |
| 14 #include "chrome/common/gtk_util.h" | 15 #include "chrome/common/gtk_util.h" |
| 15 #include "third_party/skia/include/core/SkBitmap.h" | 16 #include "third_party/skia/include/core/SkBitmap.h" |
| 16 | 17 |
| 17 using gtk_util::ConvertAcceleratorsFromWindowsStyle; | 18 using gtk_util::ConvertAcceleratorsFromWindowsStyle; |
| 18 | 19 |
| 19 bool MenuGtk::block_activation_ = false; | 20 bool MenuGtk::block_activation_ = false; |
| 20 | 21 |
| 21 MenuGtk::MenuGtk(MenuGtk::Delegate* delegate, | 22 MenuGtk::MenuGtk(MenuGtk::Delegate* delegate, |
| 22 const MenuCreateMaterial* menu_data, | 23 const MenuCreateMaterial* menu_data, |
| 23 GtkAccelGroup* accel_group) | 24 GtkAccelGroup* accel_group) |
| 24 : delegate_(delegate), | 25 : delegate_(delegate), |
| 26 model_(NULL), |
| 25 dummy_accel_group_(gtk_accel_group_new()), | 27 dummy_accel_group_(gtk_accel_group_new()), |
| 26 menu_(gtk_menu_new()), | 28 menu_(gtk_menu_new()), |
| 27 factory_(this) { | 29 factory_(this) { |
| 28 ConnectSignalHandlers(); | 30 ConnectSignalHandlers(); |
| 29 BuildMenuIn(menu_.get(), menu_data, accel_group); | 31 BuildMenuIn(menu_.get(), menu_data, accel_group); |
| 30 } | 32 } |
| 31 | 33 |
| 32 MenuGtk::MenuGtk(MenuGtk::Delegate* delegate, bool load) | 34 MenuGtk::MenuGtk(MenuGtk::Delegate* delegate, |
| 35 menus::MenuModel* model) |
| 33 : delegate_(delegate), | 36 : delegate_(delegate), |
| 37 model_(model), |
| 34 dummy_accel_group_(NULL), | 38 dummy_accel_group_(NULL), |
| 35 menu_(gtk_menu_new()), | 39 menu_(gtk_menu_new()), |
| 36 factory_(this) { | 40 factory_(this) { |
| 37 ConnectSignalHandlers(); | 41 ConnectSignalHandlers(); |
| 38 if (load) | 42 if (model) |
| 39 BuildMenuFromDelegate(); | 43 BuildMenuFromModel(); |
| 40 } | 44 } |
| 41 | 45 |
| 42 MenuGtk::~MenuGtk() { | 46 MenuGtk::~MenuGtk() { |
| 43 menu_.Destroy(); | 47 menu_.Destroy(); |
| 44 STLDeleteContainerPointers(submenus_we_own_.begin(), submenus_we_own_.end()); | 48 STLDeleteContainerPointers(submenus_we_own_.begin(), submenus_we_own_.end()); |
| 45 if (dummy_accel_group_) | 49 if (dummy_accel_group_) |
| 46 g_object_unref(dummy_accel_group_); | 50 g_object_unref(dummy_accel_group_); |
| 47 } | 51 } |
| 48 | 52 |
| 49 void MenuGtk::ConnectSignalHandlers() { | 53 void MenuGtk::ConnectSignalHandlers() { |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 136 for (; menu_data->type != MENU_END; ++menu_data) { | 140 for (; menu_data->type != MENU_END; ++menu_data) { |
| 137 GtkWidget* menu_item = NULL; | 141 GtkWidget* menu_item = NULL; |
| 138 | 142 |
| 139 std::string label; | 143 std::string label; |
| 140 if (menu_data->label_argument) { | 144 if (menu_data->label_argument) { |
| 141 label = l10n_util::GetStringFUTF8( | 145 label = l10n_util::GetStringFUTF8( |
| 142 menu_data->label_id, | 146 menu_data->label_id, |
| 143 l10n_util::GetStringUTF16(menu_data->label_argument)); | 147 l10n_util::GetStringUTF16(menu_data->label_argument)); |
| 144 } else if (menu_data->label_id) { | 148 } else if (menu_data->label_id) { |
| 145 label = l10n_util::GetStringUTF8(menu_data->label_id); | 149 label = l10n_util::GetStringUTF8(menu_data->label_id); |
| 146 } else if (menu_data->type != MENU_SEPARATOR) { | |
| 147 label = delegate_->GetLabel(menu_data->id); | |
| 148 DCHECK(!label.empty()); | |
| 149 } | 150 } |
| 150 | 151 |
| 151 label = ConvertAcceleratorsFromWindowsStyle(label); | 152 label = ConvertAcceleratorsFromWindowsStyle(label); |
| 152 | 153 |
| 153 switch (menu_data->type) { | 154 switch (menu_data->type) { |
| 154 case MENU_RADIO: | 155 case MENU_RADIO: |
| 155 if (GTK_IS_RADIO_MENU_ITEM(last_menu_item)) { | 156 if (GTK_IS_RADIO_MENU_ITEM(last_menu_item)) { |
| 156 menu_item = gtk_radio_menu_item_new_with_mnemonic_from_widget( | 157 menu_item = gtk_radio_menu_item_new_with_mnemonic_from_widget( |
| 157 GTK_RADIO_MENU_ITEM(last_menu_item), label.c_str()); | 158 GTK_RADIO_MENU_ITEM(last_menu_item), label.c_str()); |
| 158 } else { | 159 } else { |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 216 GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(&icon); | 217 GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(&icon); |
| 217 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item), | 218 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item), |
| 218 gtk_image_new_from_pixbuf(pixbuf)); | 219 gtk_image_new_from_pixbuf(pixbuf)); |
| 219 g_object_unref(pixbuf); | 220 g_object_unref(pixbuf); |
| 220 if (delegate_->AlwaysShowImages()) | 221 if (delegate_->AlwaysShowImages()) |
| 221 gtk_util::SetAlwaysShowImage(menu_item); | 222 gtk_util::SetAlwaysShowImage(menu_item); |
| 222 | 223 |
| 223 return menu_item; | 224 return menu_item; |
| 224 } | 225 } |
| 225 | 226 |
| 226 void MenuGtk::BuildMenuFromDelegate() { | 227 void MenuGtk::BuildMenuFromModel() { |
| 227 // Note that the menu IDs start at 1, not 0. | 228 for (int i = 0; i < model_->GetItemCount(); ++i) { |
| 228 for (int i = 1; i <= delegate_->GetItemCount(); ++i) { | |
| 229 GtkWidget* menu_item = NULL; | 229 GtkWidget* menu_item = NULL; |
| 230 | 230 |
| 231 if (delegate_->IsItemSeparator(i)) { | 231 // TODO(estade): support these commands. |
| 232 DCHECK_NE(model_->GetTypeAt(i), menus::MenuModel::TYPE_CHECK); |
| 233 DCHECK_NE(model_->GetTypeAt(i), menus::MenuModel::TYPE_RADIO); |
| 234 DCHECK_NE(model_->GetTypeAt(i), menus::MenuModel::TYPE_SUBMENU); |
| 235 |
| 236 SkBitmap icon; |
| 237 if (model_->GetTypeAt(i) == menus::MenuModel::TYPE_SEPARATOR) { |
| 232 menu_item = gtk_separator_menu_item_new(); | 238 menu_item = gtk_separator_menu_item_new(); |
| 233 } else if (delegate_->HasIcon(i)) { | 239 } else if (model_->GetIconAt(i, &icon)) { |
| 234 const SkBitmap* icon = delegate_->GetIcon(i); | 240 menu_item = BuildMenuItemWithImage(UTF16ToUTF8(model_->GetLabelAt(i)), |
| 235 menu_item = BuildMenuItemWithImage(delegate_->GetLabel(i), *icon); | 241 icon); |
| 236 } else { | 242 } else { |
| 237 menu_item = gtk_menu_item_new_with_label(delegate_->GetLabel(i).c_str()); | 243 menu_item = gtk_menu_item_new_with_label( |
| 244 UTF16ToUTF8(model_->GetLabelAt(i)).c_str()); |
| 238 } | 245 } |
| 239 | 246 |
| 240 AppendMenuItem(i, menu_item); | 247 AppendMenuItem(i, menu_item); |
| 241 } | 248 } |
| 242 } | 249 } |
| 243 | 250 |
| 244 // static | 251 // static |
| 245 void MenuGtk::OnMenuItemActivated(GtkMenuItem* menuitem, MenuGtk* menu) { | 252 void MenuGtk::OnMenuItemActivated(GtkMenuItem* menuitem, MenuGtk* menu) { |
| 246 if (block_activation_) | 253 if (block_activation_) |
| 247 return; | 254 return; |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 396 gtk_widget_set_sensitive( | 403 gtk_widget_set_sensitive( |
| 397 widget, menu->delegate_->IsCommandEnabled(id)); | 404 widget, menu->delegate_->IsCommandEnabled(id)); |
| 398 | 405 |
| 399 GtkWidget* submenu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(widget)); | 406 GtkWidget* submenu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(widget)); |
| 400 if (submenu) { | 407 if (submenu) { |
| 401 gtk_container_foreach(GTK_CONTAINER(submenu), &SetMenuItemInfo, | 408 gtk_container_foreach(GTK_CONTAINER(submenu), &SetMenuItemInfo, |
| 402 userdata); | 409 userdata); |
| 403 } | 410 } |
| 404 } | 411 } |
| 405 } | 412 } |
| OLD | NEW |