Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4028)

Unified Diff: chrome/browser/ui/gtk/menu_gtk.cc

Issue 6840068: GTK: Add Recently Closed tabs to the History menu in the global menu bar. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Whitespace nit Created 9 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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(

Powered by Google App Engine
This is Rietveld 408576698