| 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/global_bookmark_menu.h" | 5 #include "chrome/browser/ui/gtk/global_bookmark_menu.h" |
| 6 | 6 |
| 7 #include <dlfcn.h> | 7 #include <dlfcn.h> |
| 8 #include <gtk/gtk.h> | 8 #include <gtk/gtk.h> |
| 9 | 9 |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| 11 #include "base/utf_string_conversions.h" | 11 #include "base/utf_string_conversions.h" |
| 12 #include "chrome/browser/bookmarks/bookmark_model.h" | 12 #include "chrome/browser/bookmarks/bookmark_model.h" |
| 13 #include "chrome/browser/profiles/profile.h" | 13 #include "chrome/browser/profiles/profile.h" |
| 14 #include "chrome/browser/ui/browser.h" | 14 #include "chrome/browser/ui/browser.h" |
| 15 #include "chrome/browser/ui/gtk/bookmarks/bookmark_utils_gtk.h" |
| 15 #include "chrome/browser/ui/gtk/global_bookmark_menu.h" | 16 #include "chrome/browser/ui/gtk/global_bookmark_menu.h" |
| 16 #include "chrome/browser/ui/gtk/global_menu_bar.h" | 17 #include "chrome/browser/ui/gtk/global_menu_bar.h" |
| 17 #include "chrome/browser/ui/gtk/gtk_theme_service.h" | 18 #include "chrome/browser/ui/gtk/gtk_theme_service.h" |
| 18 #include "chrome/browser/ui/gtk/gtk_util.h" | 19 #include "chrome/browser/ui/gtk/gtk_util.h" |
| 19 #include "content/common/notification_service.h" | 20 #include "content/common/notification_service.h" |
| 20 #include "grit/generated_resources.h" | 21 #include "grit/generated_resources.h" |
| 21 #include "ui/base/l10n/l10n_util.h" | 22 #include "ui/base/l10n/l10n_util.h" |
| 22 #include "ui/gfx/gtk_util.h" | 23 #include "ui/gfx/gtk_util.h" |
| 23 | 24 |
| 24 namespace { | 25 namespace { |
| 25 | 26 |
| 26 const int kMaxChars = 50; | |
| 27 | |
| 28 // We need to know whether we're using a newer GTK at run time because we need | 27 // We need to know whether we're using a newer GTK at run time because we need |
| 29 // to prevent. | 28 // to prevent. |
| 30 // | 29 // |
| 31 // TODO(erg): Once we've dropped Hardy support, remove this hack. | 30 // TODO(erg): Once we've dropped Hardy support, remove this hack. |
| 32 typedef void (*gtk_menu_item_set_label_func)(GtkMenuItem*, const gchar*); | 31 typedef void (*gtk_menu_item_set_label_func)(GtkMenuItem*, const gchar*); |
| 33 gtk_menu_item_set_label_func gtk_menu_item_set_label_sym = | 32 gtk_menu_item_set_label_func gtk_menu_item_set_label_sym = |
| 34 #if GTK_CHECK_VERSION(2, 16, 1) | 33 #if GTK_CHECK_VERSION(2, 16, 1) |
| 35 gtk_menu_item_set_label; | 34 gtk_menu_item_set_label; |
| 36 #else | 35 #else |
| 37 NULL; | 36 NULL; |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 104 // Only display the other bookmarks folder in the menu if it has items in it. | 103 // Only display the other bookmarks folder in the menu if it has items in it. |
| 105 const BookmarkNode* other_node = model->other_node(); | 104 const BookmarkNode* other_node = model->other_node(); |
| 106 if (other_node->child_count()) { | 105 if (other_node->child_count()) { |
| 107 GtkWidget* submenu = gtk_menu_new(); | 106 GtkWidget* submenu = gtk_menu_new(); |
| 108 AddNodeToMenu(other_node, submenu); | 107 AddNodeToMenu(other_node, submenu); |
| 109 | 108 |
| 110 AddBookmarkMenuItem(bookmark_menu_.get(), gtk_separator_menu_item_new()); | 109 AddBookmarkMenuItem(bookmark_menu_.get(), gtk_separator_menu_item_new()); |
| 111 | 110 |
| 112 GtkWidget* menu_item = gtk_image_menu_item_new_with_label( | 111 GtkWidget* menu_item = gtk_image_menu_item_new_with_label( |
| 113 l10n_util::GetStringUTF8(IDS_BOOMARK_BAR_OTHER_FOLDER_NAME).c_str()); | 112 l10n_util::GetStringUTF8(IDS_BOOMARK_BAR_OTHER_FOLDER_NAME).c_str()); |
| 113 gtk_util::SetAlwaysShowImage(menu_item); |
| 114 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu); | 114 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu); |
| 115 gtk_image_menu_item_set_image( | 115 gtk_image_menu_item_set_image( |
| 116 GTK_IMAGE_MENU_ITEM(menu_item), | 116 GTK_IMAGE_MENU_ITEM(menu_item), |
| 117 gtk_image_new_from_pixbuf(default_folder_)); | 117 gtk_image_new_from_pixbuf(default_folder_)); |
| 118 | 118 |
| 119 AddBookmarkMenuItem(bookmark_menu_.get(), menu_item); | 119 AddBookmarkMenuItem(bookmark_menu_.get(), menu_item); |
| 120 } | 120 } |
| 121 } | 121 } |
| 122 | 122 |
| 123 void GlobalBookmarkMenu::AddBookmarkMenuItem(GtkWidget* menu, | 123 void GlobalBookmarkMenu::AddBookmarkMenuItem(GtkWidget* menu, |
| 124 GtkWidget* menu_item) { | 124 GtkWidget* menu_item) { |
| 125 g_object_set_data(G_OBJECT(menu_item), "type-tag", | 125 g_object_set_data(G_OBJECT(menu_item), "type-tag", |
| 126 GINT_TO_POINTER(GlobalMenuBar::TAG_BOOKMARK_CLEARABLE)); | 126 GINT_TO_POINTER(GlobalMenuBar::TAG_BOOKMARK_CLEARABLE)); |
| 127 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); | 127 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); |
| 128 gtk_widget_show(menu_item); | 128 gtk_widget_show(menu_item); |
| 129 } | 129 } |
| 130 | 130 |
| 131 void GlobalBookmarkMenu::AddNodeToMenu(const BookmarkNode* node, | 131 void GlobalBookmarkMenu::AddNodeToMenu(const BookmarkNode* node, |
| 132 GtkWidget* menu) { | 132 GtkWidget* menu) { |
| 133 int child_count = node->child_count(); | 133 int child_count = node->child_count(); |
| 134 if (!child_count) { | 134 if (!child_count) { |
| 135 GtkWidget* item = gtk_menu_item_new_with_label( | 135 GtkWidget* item = gtk_menu_item_new_with_label( |
| 136 l10n_util::GetStringUTF8(IDS_MENU_EMPTY_SUBMENU).c_str()); | 136 l10n_util::GetStringUTF8(IDS_MENU_EMPTY_SUBMENU).c_str()); |
| 137 gtk_widget_set_sensitive(item, FALSE); | 137 gtk_widget_set_sensitive(item, FALSE); |
| 138 AddBookmarkMenuItem(menu, item); | 138 AddBookmarkMenuItem(menu, item); |
| 139 } else { | 139 } else { |
| 140 for (int i = 0; i < child_count; i++) { | 140 for (int i = 0; i < child_count; i++) { |
| 141 const BookmarkNode* child = node->GetChild(i); | 141 const BookmarkNode* child = node->GetChild(i); |
| 142 GtkWidget* item = gtk_image_menu_item_new(); | 142 GtkWidget* item = gtk_image_menu_item_new(); |
| 143 gtk_util::SetAlwaysShowImage(item); |
| 143 ConfigureMenuItem(child, item); | 144 ConfigureMenuItem(child, item); |
| 144 bookmark_nodes_[child] = item; | 145 bookmark_nodes_[child] = item; |
| 145 | 146 |
| 146 if (child->is_folder()) { | 147 if (child->is_folder()) { |
| 147 GtkWidget* submenu = gtk_menu_new(); | 148 GtkWidget* submenu = gtk_menu_new(); |
| 148 AddNodeToMenu(child, submenu); | 149 AddNodeToMenu(child, submenu); |
| 149 gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu); | 150 gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu); |
| 150 } else { | 151 } else { |
| 151 g_object_set_data(G_OBJECT(item), "bookmark-node", | 152 g_object_set_data(G_OBJECT(item), "bookmark-node", |
| 152 const_cast<BookmarkNode*>(child)); | 153 const_cast<BookmarkNode*>(child)); |
| 153 g_signal_connect(item, "activate", | 154 g_signal_connect(item, "activate", |
| 154 G_CALLBACK(OnBookmarkItemActivatedThunk), this); | 155 G_CALLBACK(OnBookmarkItemActivatedThunk), this); |
| 155 } | 156 } |
| 156 | 157 |
| 157 AddBookmarkMenuItem(menu, item); | 158 AddBookmarkMenuItem(menu, item); |
| 158 } | 159 } |
| 159 } | 160 } |
| 160 } | 161 } |
| 161 | 162 |
| 162 void GlobalBookmarkMenu::ConfigureMenuItem(const BookmarkNode* node, | 163 void GlobalBookmarkMenu::ConfigureMenuItem(const BookmarkNode* node, |
| 163 GtkWidget* menu_item) { | 164 GtkWidget* menu_item) { |
| 164 // This check is only to make things compile on Hardy; this code won't | 165 // This check is only to make things compile on Hardy; this code won't |
| 165 // display any visible widgets in older systems that don't have a global menu | 166 // display any visible widgets in older systems that don't have a global menu |
| 166 // bar. | 167 // bar. |
| 167 if (gtk_menu_item_set_label_sym) { | 168 if (gtk_menu_item_set_label_sym) { |
| 168 string16 elided_name = | 169 gtk_menu_item_set_label_sym( |
| 169 l10n_util::TruncateString(node->GetTitle(), kMaxChars); | 170 GTK_MENU_ITEM(menu_item), |
| 170 gtk_menu_item_set_label_sym(GTK_MENU_ITEM(menu_item), | 171 bookmark_utils::BuildMenuLabelFor(node).c_str()); |
| 171 UTF16ToUTF8(elided_name).c_str()); | |
| 172 } | 172 } |
| 173 | 173 |
| 174 if (node->is_url()) { | 174 if (node->is_url()) { |
| 175 std::string tooltip = gtk_util::BuildTooltipTitleFor(node->GetTitle(), | 175 gtk_widget_set_tooltip_markup( |
| 176 node->GetURL()); | 176 menu_item, |
| 177 gtk_widget_set_tooltip_markup(menu_item, tooltip.c_str()); | 177 bookmark_utils::BuildTooltipFor(node).c_str()); |
| 178 } | 178 } |
| 179 | 179 |
| 180 const SkBitmap& bitmap = profile_->GetBookmarkModel()->GetFavicon(node); | 180 const SkBitmap& bitmap = profile_->GetBookmarkModel()->GetFavicon(node); |
| 181 if (!bitmap.isNull()) { | 181 if (!bitmap.isNull()) { |
| 182 GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(&bitmap); | 182 GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(&bitmap); |
| 183 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item), | 183 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item), |
| 184 gtk_image_new_from_pixbuf(pixbuf)); | 184 gtk_image_new_from_pixbuf(pixbuf)); |
| 185 g_object_unref(pixbuf); | 185 g_object_unref(pixbuf); |
| 186 } else { | 186 } else { |
| 187 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item), | 187 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item), |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 286 void GlobalBookmarkMenu::OnBookmarkItemActivated(GtkWidget* menu_item) { | 286 void GlobalBookmarkMenu::OnBookmarkItemActivated(GtkWidget* menu_item) { |
| 287 // The actual mouse event that generated this activated event was in a | 287 // The actual mouse event that generated this activated event was in a |
| 288 // different process. Go with something default. | 288 // different process. Go with something default. |
| 289 const BookmarkNode* node = static_cast<const BookmarkNode*>( | 289 const BookmarkNode* node = static_cast<const BookmarkNode*>( |
| 290 g_object_get_data(G_OBJECT(menu_item), "bookmark-node")); | 290 g_object_get_data(G_OBJECT(menu_item), "bookmark-node")); |
| 291 | 291 |
| 292 browser_->OpenURL(node->GetURL(), GURL(), NEW_FOREGROUND_TAB, | 292 browser_->OpenURL(node->GetURL(), GURL(), NEW_FOREGROUND_TAB, |
| 293 PageTransition::AUTO_BOOKMARK); | 293 PageTransition::AUTO_BOOKMARK); |
| 294 } | 294 } |
| 295 | 295 |
| OLD | NEW |