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" |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
103 // 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. |
104 const BookmarkNode* other_node = model->other_node(); | 104 const BookmarkNode* other_node = model->other_node(); |
105 if (other_node->child_count()) { | 105 if (other_node->child_count()) { |
106 GtkWidget* submenu = gtk_menu_new(); | 106 GtkWidget* submenu = gtk_menu_new(); |
107 AddNodeToMenu(other_node, submenu); | 107 AddNodeToMenu(other_node, submenu); |
108 | 108 |
109 AddBookmarkMenuItem(bookmark_menu_.get(), gtk_separator_menu_item_new()); | 109 AddBookmarkMenuItem(bookmark_menu_.get(), gtk_separator_menu_item_new()); |
110 | 110 |
111 GtkWidget* menu_item = gtk_image_menu_item_new_with_label( | 111 GtkWidget* menu_item = gtk_image_menu_item_new_with_label( |
112 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); | 113 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu); |
115 gtk_image_menu_item_set_image( | 114 gtk_image_menu_item_set_image( |
116 GTK_IMAGE_MENU_ITEM(menu_item), | 115 GTK_IMAGE_MENU_ITEM(menu_item), |
117 gtk_image_new_from_pixbuf(default_folder_)); | 116 gtk_image_new_from_pixbuf(default_folder_)); |
| 117 gtk_util::SetAlwaysShowImage(menu_item); |
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); | |
144 ConfigureMenuItem(child, item); | 143 ConfigureMenuItem(child, item); |
145 bookmark_nodes_[child] = item; | 144 bookmark_nodes_[child] = item; |
146 | 145 |
147 if (child->is_folder()) { | 146 if (child->is_folder()) { |
148 GtkWidget* submenu = gtk_menu_new(); | 147 GtkWidget* submenu = gtk_menu_new(); |
149 AddNodeToMenu(child, submenu); | 148 AddNodeToMenu(child, submenu); |
150 gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu); | 149 gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu); |
151 } else { | 150 } else { |
152 g_object_set_data(G_OBJECT(item), "bookmark-node", | 151 g_object_set_data(G_OBJECT(item), "bookmark-node", |
153 const_cast<BookmarkNode*>(child)); | 152 const_cast<BookmarkNode*>(child)); |
154 g_signal_connect(item, "activate", | 153 g_signal_connect(item, "activate", |
155 G_CALLBACK(OnBookmarkItemActivatedThunk), this); | 154 G_CALLBACK(OnBookmarkItemActivatedThunk), this); |
156 } | 155 } |
157 | 156 |
158 AddBookmarkMenuItem(menu, item); | 157 AddBookmarkMenuItem(menu, item); |
159 } | 158 } |
160 } | 159 } |
161 } | 160 } |
162 | 161 |
163 void GlobalBookmarkMenu::ConfigureMenuItem(const BookmarkNode* node, | 162 void GlobalBookmarkMenu::ConfigureMenuItem(const BookmarkNode* node, |
164 GtkWidget* menu_item) { | 163 GtkWidget* menu_item) { |
| 164 CHECK(node); |
| 165 CHECK(menu_item); |
| 166 |
165 // This check is only to make things compile on Hardy; this code won't | 167 // This check is only to make things compile on Hardy; this code won't |
166 // display any visible widgets in older systems that don't have a global menu | 168 // display any visible widgets in older systems that don't have a global menu |
167 // bar. | 169 // bar. |
168 if (gtk_menu_item_set_label_sym) { | 170 if (gtk_menu_item_set_label_sym) { |
169 gtk_menu_item_set_label_sym( | 171 gtk_menu_item_set_label_sym( |
170 GTK_MENU_ITEM(menu_item), | 172 GTK_MENU_ITEM(menu_item), |
171 bookmark_utils::BuildMenuLabelFor(node).c_str()); | 173 bookmark_utils::BuildMenuLabelFor(node).c_str()); |
172 } | 174 } |
173 | 175 |
174 if (node->is_url()) { | 176 if (node->is_url()) { |
175 gtk_widget_set_tooltip_markup( | 177 gtk_widget_set_tooltip_markup( |
176 menu_item, | 178 menu_item, |
177 bookmark_utils::BuildTooltipFor(node).c_str()); | 179 bookmark_utils::BuildTooltipFor(node).c_str()); |
178 } | 180 } |
179 | 181 |
180 const SkBitmap& bitmap = profile_->GetBookmarkModel()->GetFavicon(node); | 182 const SkBitmap& bitmap = profile_->GetBookmarkModel()->GetFavicon(node); |
181 if (!bitmap.isNull()) { | 183 if (!bitmap.isNull()) { |
182 GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(&bitmap); | 184 GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(&bitmap); |
183 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item), | 185 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item), |
184 gtk_image_new_from_pixbuf(pixbuf)); | 186 gtk_image_new_from_pixbuf(pixbuf)); |
185 g_object_unref(pixbuf); | 187 g_object_unref(pixbuf); |
186 } else { | 188 } else { |
187 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item), | 189 GdkPixbuf* pixbuf = node->is_url() ? default_favicon_ : default_folder_; |
188 gtk_image_new_from_pixbuf( | 190 CHECK(pixbuf); |
189 node->is_url() ? default_favicon_ : | 191 GtkWidget* image = gtk_image_new_from_pixbuf(pixbuf); |
190 default_folder_)); | 192 CHECK(image); |
| 193 |
| 194 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item), image); |
191 } | 195 } |
| 196 |
| 197 gtk_util::SetAlwaysShowImage(menu_item); |
192 } | 198 } |
193 | 199 |
194 GtkWidget* GlobalBookmarkMenu::MenuItemForNode(const BookmarkNode* node) { | 200 GtkWidget* GlobalBookmarkMenu::MenuItemForNode(const BookmarkNode* node) { |
195 if (!node) | 201 if (!node) |
196 return NULL; | 202 return NULL; |
197 std::map<const BookmarkNode*, GtkWidget*>::iterator it = | 203 std::map<const BookmarkNode*, GtkWidget*>::iterator it = |
198 bookmark_nodes_.find(node); | 204 bookmark_nodes_.find(node); |
199 if (it == bookmark_nodes_.end()) | 205 if (it == bookmark_nodes_.end()) |
200 return NULL; | 206 return NULL; |
201 return it->second; | 207 return it->second; |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
286 void GlobalBookmarkMenu::OnBookmarkItemActivated(GtkWidget* menu_item) { | 292 void GlobalBookmarkMenu::OnBookmarkItemActivated(GtkWidget* menu_item) { |
287 // The actual mouse event that generated this activated event was in a | 293 // The actual mouse event that generated this activated event was in a |
288 // different process. Go with something default. | 294 // different process. Go with something default. |
289 const BookmarkNode* node = static_cast<const BookmarkNode*>( | 295 const BookmarkNode* node = static_cast<const BookmarkNode*>( |
290 g_object_get_data(G_OBJECT(menu_item), "bookmark-node")); | 296 g_object_get_data(G_OBJECT(menu_item), "bookmark-node")); |
291 | 297 |
292 browser_->OpenURL(node->GetURL(), GURL(), NEW_FOREGROUND_TAB, | 298 browser_->OpenURL(node->GetURL(), GURL(), NEW_FOREGROUND_TAB, |
293 PageTransition::AUTO_BOOKMARK); | 299 PageTransition::AUTO_BOOKMARK); |
294 } | 300 } |
295 | 301 |
OLD | NEW |