Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/ui/gtk/menu_gtk.h" | 5 #include "chrome/browser/ui/gtk/menu_gtk.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 | 8 |
| 9 #include "base/i18n/rtl.h" | 9 #include "base/i18n/rtl.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 277 MenuGtk::MenuGtk(MenuGtk::Delegate* delegate, | 277 MenuGtk::MenuGtk(MenuGtk::Delegate* delegate, |
| 278 ui::MenuModel* model) | 278 ui::MenuModel* model) |
| 279 : delegate_(delegate), | 279 : delegate_(delegate), |
| 280 model_(model), | 280 model_(model), |
| 281 dummy_accel_group_(gtk_accel_group_new()), | 281 dummy_accel_group_(gtk_accel_group_new()), |
| 282 menu_(gtk_custom_menu_new()), | 282 menu_(gtk_custom_menu_new()), |
| 283 factory_(this) { | 283 factory_(this) { |
| 284 DCHECK(model); | 284 DCHECK(model); |
| 285 g_object_ref_sink(menu_); | 285 g_object_ref_sink(menu_); |
| 286 ConnectSignalHandlers(); | 286 ConnectSignalHandlers(); |
| 287 model_->SetMenuModelDelegate(this); | |
| 287 BuildMenuFromModel(); | 288 BuildMenuFromModel(); |
| 288 } | 289 } |
| 289 | 290 |
| 290 MenuGtk::~MenuGtk() { | 291 MenuGtk::~MenuGtk() { |
| 291 Cancel(); | 292 Cancel(); |
| 292 | 293 |
| 293 gtk_widget_destroy(menu_); | 294 gtk_widget_destroy(menu_); |
| 294 g_object_unref(menu_); | 295 g_object_unref(menu_); |
| 295 | 296 |
| 296 STLDeleteContainerPointers(submenus_we_own_.begin(), submenus_we_own_.end()); | 297 STLDeleteContainerPointers(submenus_we_own_.begin(), submenus_we_own_.end()); |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 393 | 394 |
| 394 void MenuGtk::PopupAsFromKeyEvent(GtkWidget* widget) { | 395 void MenuGtk::PopupAsFromKeyEvent(GtkWidget* widget) { |
| 395 PopupForWidget(widget, 0, gtk_get_current_event_time()); | 396 PopupForWidget(widget, 0, gtk_get_current_event_time()); |
| 396 gtk_menu_shell_select_first(GTK_MENU_SHELL(menu_), FALSE); | 397 gtk_menu_shell_select_first(GTK_MENU_SHELL(menu_), FALSE); |
| 397 } | 398 } |
| 398 | 399 |
| 399 void MenuGtk::Cancel() { | 400 void MenuGtk::Cancel() { |
| 400 gtk_menu_popdown(GTK_MENU(menu_)); | 401 gtk_menu_popdown(GTK_MENU(menu_)); |
| 401 } | 402 } |
| 402 | 403 |
| 404 void MenuGtk::OnIconChanged(int model_index) { | |
| 405 gtk_container_foreach(GTK_CONTAINER(menu_), UpdateMenuIcon, &model_index); | |
|
Evan Stade
2011/04/07 18:25:00
Try:
GList* items = gtk_container_get_children(me
dill
2011/04/08 15:48:46
Thanks, much cleaner.
| |
| 406 } | |
| 407 | |
| 403 void MenuGtk::UpdateMenu() { | 408 void MenuGtk::UpdateMenu() { |
| 404 gtk_container_foreach(GTK_CONTAINER(menu_), SetMenuItemInfo, this); | 409 gtk_container_foreach(GTK_CONTAINER(menu_), SetMenuItemInfo, this); |
| 405 } | 410 } |
| 406 | 411 |
| 407 GtkWidget* MenuGtk::BuildMenuItemWithImage(const std::string& label, | 412 GtkWidget* MenuGtk::BuildMenuItemWithImage(const std::string& label, |
| 408 GtkWidget* image) { | 413 GtkWidget* image) { |
| 409 GtkWidget* menu_item = | 414 GtkWidget* menu_item = |
| 410 gtk_image_menu_item_new_with_mnemonic(label.c_str()); | 415 gtk_image_menu_item_new_with_mnemonic(label.c_str()); |
| 411 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item), image); | 416 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item), image); |
| 412 return menu_item; | 417 return menu_item; |
| (...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 716 if (event) | 721 if (event) |
| 717 gdk_event_free(event); | 722 gdk_event_free(event); |
| 718 } | 723 } |
| 719 | 724 |
| 720 void MenuGtk::OnMenuShow(GtkWidget* widget) { | 725 void MenuGtk::OnMenuShow(GtkWidget* widget) { |
| 721 MessageLoop::current()->PostTask(FROM_HERE, | 726 MessageLoop::current()->PostTask(FROM_HERE, |
| 722 factory_.NewRunnableMethod(&MenuGtk::UpdateMenu)); | 727 factory_.NewRunnableMethod(&MenuGtk::UpdateMenu)); |
| 723 } | 728 } |
| 724 | 729 |
| 725 void MenuGtk::OnMenuHidden(GtkWidget* widget) { | 730 void MenuGtk::OnMenuHidden(GtkWidget* widget) { |
| 731 model_->SetMenuModelDelegate(NULL); | |
| 726 if (delegate_) | 732 if (delegate_) |
| 727 delegate_->StoppedShowing(); | 733 delegate_->StoppedShowing(); |
| 728 model_->MenuClosed(); | 734 model_->MenuClosed(); |
| 729 } | 735 } |
| 730 | 736 |
| 731 // static | 737 // static |
| 732 void MenuGtk::SetButtonItemInfo(GtkWidget* button, gpointer userdata) { | 738 void MenuGtk::SetButtonItemInfo(GtkWidget* button, gpointer userdata) { |
| 733 ui::ButtonMenuItemModel* model = | 739 ui::ButtonMenuItemModel* model = |
| 734 reinterpret_cast<ui::ButtonMenuItemModel*>( | 740 reinterpret_cast<ui::ButtonMenuItemModel*>( |
| 735 g_object_get_data(G_OBJECT(button), "button-model")); | 741 g_object_get_data(G_OBJECT(button), "button-model")); |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 823 gtk_widget_hide(widget); | 829 gtk_widget_hide(widget); |
| 824 } | 830 } |
| 825 | 831 |
| 826 GtkWidget* submenu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(widget)); | 832 GtkWidget* submenu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(widget)); |
| 827 if (submenu) { | 833 if (submenu) { |
| 828 gtk_container_foreach(GTK_CONTAINER(submenu), &SetMenuItemInfo, | 834 gtk_container_foreach(GTK_CONTAINER(submenu), &SetMenuItemInfo, |
| 829 userdata); | 835 userdata); |
| 830 } | 836 } |
| 831 } | 837 } |
| 832 } | 838 } |
| 839 | |
| 840 // static | |
| 841 void MenuGtk::UpdateMenuIcon(GtkWidget* widget, gpointer userdata) { | |
| 842 if (GTK_IS_MENU_ITEM(widget)) { | |
| 843 int model_index = *static_cast<int*>(userdata); | |
| 844 int menu_id; | |
| 845 GetMenuItemID(widget, &menu_id); | |
| 846 if (menu_id != model_index) { | |
| 847 return; | |
| 848 } | |
| 849 SkBitmap icon; | |
| 850 ui::MenuModel* model = ModelForMenuItem(GTK_MENU_ITEM(widget)); | |
| 851 if (model->GetIconAt(model_index, &icon)) { | |
| 852 GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(&icon); | |
| 853 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(widget), | |
| 854 gtk_image_new_from_pixbuf(pixbuf)); | |
| 855 g_object_unref(pixbuf); | |
| 856 } | |
| 857 } | |
| 858 } | |
| OLD | NEW |