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

Side by Side Diff: chrome/browser/ui/gtk/global_bookmark_menu.cc

Issue 6990049: GTK: Refinements to the global menu. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 7 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « chrome/browser/ui/gtk/bookmarks/bookmark_utils_gtk.cc ('k') | chrome/browser/ui/gtk/global_history_menu.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698