OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 <map> | 7 #include <map> |
8 | 8 |
9 #include "app/menus/accelerator_gtk.h" | 9 #include "app/menus/accelerator_gtk.h" |
10 #include "app/menus/button_menu_item_model.h" | 10 #include "app/menus/button_menu_item_model.h" |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
207 } | 207 } |
208 | 208 |
209 GtkWidget* MenuGtk::AppendSeparator() { | 209 GtkWidget* MenuGtk::AppendSeparator() { |
210 GtkWidget* menu_item = gtk_separator_menu_item_new(); | 210 GtkWidget* menu_item = gtk_separator_menu_item_new(); |
211 gtk_widget_show(menu_item); | 211 gtk_widget_show(menu_item); |
212 gtk_menu_shell_append(GTK_MENU_SHELL(menu_), menu_item); | 212 gtk_menu_shell_append(GTK_MENU_SHELL(menu_), menu_item); |
213 return menu_item; | 213 return menu_item; |
214 } | 214 } |
215 | 215 |
216 GtkWidget* MenuGtk::AppendMenuItem(int command_id, GtkWidget* menu_item) { | 216 GtkWidget* MenuGtk::AppendMenuItem(int command_id, GtkWidget* menu_item) { |
217 return AppendMenuItemToMenu(command_id, menu_item, menu_, true); | 217 return AppendMenuItemToMenu(command_id, NULL, menu_item, menu_, true); |
218 } | 218 } |
219 | 219 |
220 GtkWidget* MenuGtk::AppendMenuItemToMenu(int command_id, | 220 GtkWidget* MenuGtk::AppendMenuItemToMenu(int index, |
| 221 menus::MenuModel* model, |
221 GtkWidget* menu_item, | 222 GtkWidget* menu_item, |
222 GtkWidget* menu, | 223 GtkWidget* menu, |
223 bool connect_to_activate) { | 224 bool connect_to_activate) { |
224 // Native menu items do their own thing, so only selectively listen for the | 225 // Native menu items do their own thing, so only selectively listen for the |
225 // activate signal. | 226 // activate signal. |
226 if (connect_to_activate) { | 227 if (connect_to_activate) { |
227 SetMenuItemID(menu_item, command_id); | 228 SetMenuItemID(menu_item, index); |
228 g_signal_connect(menu_item, "activate", | 229 g_signal_connect(menu_item, "activate", |
229 G_CALLBACK(OnMenuItemActivated), this); | 230 G_CALLBACK(OnMenuItemActivated), this); |
230 } | 231 } |
231 | 232 |
232 gtk_widget_show(menu_item); | 233 // AppendMenuItemToMenu is used both internally when we control menu creation |
| 234 // from a model (where the model can choose to hide certain menu items), and |
| 235 // with immediate commands which don't provide the option. |
| 236 if (model) { |
| 237 if (model->IsVisibleAt(index)) |
| 238 gtk_widget_show(menu_item); |
| 239 } else { |
| 240 gtk_widget_show(menu_item); |
| 241 } |
233 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); | 242 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); |
234 return menu_item; | 243 return menu_item; |
235 } | 244 } |
236 | 245 |
237 void MenuGtk::Popup(GtkWidget* widget, GdkEvent* event) { | 246 void MenuGtk::Popup(GtkWidget* widget, GdkEvent* event) { |
238 DCHECK(event->type == GDK_BUTTON_PRESS) | 247 DCHECK(event->type == GDK_BUTTON_PRESS) |
239 << "Non-button press event sent to RunMenuAt"; | 248 << "Non-button press event sent to RunMenuAt"; |
240 | 249 |
241 Popup(widget, event->button.button, event->button.time); | 250 Popup(widget, event->button.button, event->button.time); |
242 } | 251 } |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
354 if (model->GetAcceleratorAt(i, &accelerator)) { | 363 if (model->GetAcceleratorAt(i, &accelerator)) { |
355 gtk_widget_add_accelerator(menu_item, | 364 gtk_widget_add_accelerator(menu_item, |
356 "activate", | 365 "activate", |
357 dummy_accel_group_, | 366 dummy_accel_group_, |
358 accelerator.GetGdkKeyCode(), | 367 accelerator.GetGdkKeyCode(), |
359 accelerator.gdk_modifier_type(), | 368 accelerator.gdk_modifier_type(), |
360 GTK_ACCEL_VISIBLE); | 369 GTK_ACCEL_VISIBLE); |
361 } | 370 } |
362 | 371 |
363 g_object_set_data(G_OBJECT(menu_item), "model", model); | 372 g_object_set_data(G_OBJECT(menu_item), "model", model); |
364 AppendMenuItemToMenu(i, menu_item, menu, connect_to_activate); | 373 AppendMenuItemToMenu(i, model, menu_item, menu, connect_to_activate); |
365 | 374 |
366 if (model->IsLabelDynamicAt(i)) { | 375 if (model->IsLabelDynamicAt(i)) { |
367 g_signal_connect(menu, "show", G_CALLBACK(OnSubmenuShow), | 376 g_signal_connect(menu, "show", G_CALLBACK(OnSubmenuShow), |
368 GINT_TO_POINTER(i)); | 377 GINT_TO_POINTER(i)); |
369 } | 378 } |
370 | 379 |
371 menu_item = NULL; | 380 menu_item = NULL; |
372 } | 381 } |
373 } | 382 } |
374 | 383 |
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
596 // root of the MenuGtk and we want to disable *all* MenuGtks, including | 605 // root of the MenuGtk and we want to disable *all* MenuGtks, including |
597 // submenus. | 606 // submenus. |
598 block_activation_ = true; | 607 block_activation_ = true; |
599 gtk_check_menu_item_set_active(item, model->IsItemCheckedAt(id)); | 608 gtk_check_menu_item_set_active(item, model->IsItemCheckedAt(id)); |
600 block_activation_ = false; | 609 block_activation_ = false; |
601 } | 610 } |
602 | 611 |
603 if (GTK_IS_MENU_ITEM(widget)) { | 612 if (GTK_IS_MENU_ITEM(widget)) { |
604 gtk_widget_set_sensitive(widget, model->IsEnabledAt(id)); | 613 gtk_widget_set_sensitive(widget, model->IsEnabledAt(id)); |
605 | 614 |
| 615 if (model->IsVisibleAt(id)) |
| 616 gtk_widget_show(widget); |
| 617 else |
| 618 gtk_widget_hide(widget); |
| 619 |
606 GtkWidget* submenu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(widget)); | 620 GtkWidget* submenu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(widget)); |
607 if (submenu) { | 621 if (submenu) { |
608 gtk_container_foreach(GTK_CONTAINER(submenu), &SetMenuItemInfo, | 622 gtk_container_foreach(GTK_CONTAINER(submenu), &SetMenuItemInfo, |
609 userdata); | 623 userdata); |
610 } | 624 } |
611 } | 625 } |
612 } | 626 } |
OLD | NEW |