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

Side by Side Diff: chrome/browser/ui/gtk/gtk_menu_creator.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: Maybe abandoning this way 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "chrome/browser/ui/gtk/gtk_menu_creator.h"
6
7 #include <gtk/gtk.h>
8 #include <map>
9
10 #include "base/logging.h"
11 #include "base/utf_string_conversions.h"
12 #include "chrome/app/chrome_command_ids.h"
13 #include "chrome/browser/ui/gtk/accelerators_gtk.h"
14 #include "chrome/browser/ui/gtk/gtk_util.h"
15 #include "ui/base/models/menu_model.h"
16 #include "ui/gfx/gtk_util.h"
17 #include "third_party/skia/include/core/SkBitmap.h"
18
19 bool GtkMenuCreator::IconSource::AlwaysShowIconForCmd(int command_id) const {
20 return false;
21 }
22
23 GtkWidget* GtkMenuCreator::IconSource::GetImageForCommandId(
24 int command_id) const {
25 return GetDefaultImageForCommandId(command_id);
26 }
27
28 GtkIconSet* GtkMenuCreator::IconSource::GetIconSetForId(int idr) {
29 return NULL;
30 }
31
32 GtkWidget* GtkMenuCreator::GetDefaultImageForCommandId(int command_id) {
33 const char* stock;
34 switch (command_id) {
35 case IDC_NEW_TAB:
36 case IDC_CONTENT_CONTEXT_OPENIMAGENEWTAB:
37 case IDC_CONTENT_CONTEXT_OPENLINKNEWTAB:
38 case IDC_CONTENT_CONTEXT_OPENAVNEWTAB:
39 stock = GTK_STOCK_NEW;
40 break;
41
42 case IDC_CLOSE_TAB:
43 stock = GTK_STOCK_CLOSE;
44 break;
45
46 case IDC_CONTENT_CONTEXT_SAVEIMAGEAS:
47 case IDC_CONTENT_CONTEXT_SAVEAVAS:
48 case IDC_CONTENT_CONTEXT_SAVELINKAS:
49 stock = GTK_STOCK_SAVE_AS;
50 break;
51
52 case IDC_SAVE_PAGE:
53 stock = GTK_STOCK_SAVE;
54 break;
55
56 case IDC_COPY:
57 case IDC_COPY_URL:
58 case IDC_CONTENT_CONTEXT_COPYIMAGELOCATION:
59 case IDC_CONTENT_CONTEXT_COPYLINKLOCATION:
60 case IDC_CONTENT_CONTEXT_COPYAVLOCATION:
61 case IDC_CONTENT_CONTEXT_COPYEMAILADDRESS:
62 case IDC_CONTENT_CONTEXT_COPY:
63 stock = GTK_STOCK_COPY;
64 break;
65
66 case IDC_CUT:
67 case IDC_CONTENT_CONTEXT_CUT:
68 stock = GTK_STOCK_CUT;
69 break;
70
71 case IDC_PASTE:
72 case IDC_CONTENT_CONTEXT_PASTE:
73 stock = GTK_STOCK_PASTE;
74 break;
75
76 case IDC_CONTENT_CONTEXT_DELETE:
77 case IDC_BOOKMARK_BAR_REMOVE:
78 stock = GTK_STOCK_DELETE;
79 break;
80
81 case IDC_CONTENT_CONTEXT_UNDO:
82 stock = GTK_STOCK_UNDO;
83 break;
84
85 case IDC_CONTENT_CONTEXT_REDO:
86 stock = GTK_STOCK_REDO;
87 break;
88
89 case IDC_SEARCH:
90 case IDC_FIND:
91 case IDC_CONTENT_CONTEXT_SEARCHWEBFOR:
92 stock = GTK_STOCK_FIND;
93 break;
94
95 case IDC_CONTENT_CONTEXT_SELECTALL:
96 stock = GTK_STOCK_SELECT_ALL;
97 break;
98
99 case IDC_CLEAR_BROWSING_DATA:
100 stock = GTK_STOCK_CLEAR;
101 break;
102
103 case IDC_BACK:
104 stock = GTK_STOCK_GO_BACK;
105 break;
106
107 case IDC_RELOAD:
108 stock = GTK_STOCK_REFRESH;
109 break;
110
111 case IDC_FORWARD:
112 stock = GTK_STOCK_GO_FORWARD;
113 break;
114
115 case IDC_PRINT:
116 stock = GTK_STOCK_PRINT;
117 break;
118
119 case IDC_CONTENT_CONTEXT_VIEWPAGEINFO:
120 stock = GTK_STOCK_INFO;
121 break;
122
123 case IDC_SPELLCHECK_MENU:
124 stock = GTK_STOCK_SPELL_CHECK;
125 break;
126
127 case IDC_RESTORE_TAB:
128 stock = GTK_STOCK_UNDELETE;
129 break;
130
131 case IDC_HOME:
132 stock = GTK_STOCK_HOME;
133 break;
134
135 case IDC_STOP:
136 stock = GTK_STOCK_STOP;
137 break;
138
139 case IDC_ABOUT:
140 stock = GTK_STOCK_ABOUT;
141 break;
142
143 case IDC_EXIT:
144 stock = GTK_STOCK_QUIT;
145 break;
146
147 case IDC_HELP_PAGE:
148 stock = GTK_STOCK_HELP;
149 break;
150
151 case IDC_OPTIONS:
152 stock = GTK_STOCK_PREFERENCES;
153 break;
154
155 case IDC_CONTENT_CONTEXT_GOTOURL:
156 stock = GTK_STOCK_JUMP_TO;
157 break;
158
159 case IDC_DEV_TOOLS_INSPECT:
160 case IDC_CONTENT_CONTEXT_INSPECTELEMENT:
161 stock = GTK_STOCK_PROPERTIES;
162 break;
163
164 case IDC_BOOKMARK_BAR_ADD_NEW_BOOKMARK:
165 stock = GTK_STOCK_ADD;
166 break;
167
168 case IDC_BOOKMARK_BAR_RENAME_FOLDER:
169 case IDC_BOOKMARK_BAR_EDIT:
170 stock = GTK_STOCK_EDIT;
171 break;
172
173 case IDC_BOOKMARK_BAR_NEW_FOLDER:
174 stock = GTK_STOCK_DIRECTORY;
175 break;
176
177 case IDC_BOOKMARK_BAR_OPEN_ALL:
178 stock = GTK_STOCK_OPEN;
179 break;
180
181 default:
182 stock = NULL;
183 }
184
185 return stock ? gtk_image_new_from_stock(stock, GTK_ICON_SIZE_MENU) : NULL;
186 }
187
188 GtkMenuCreator::GtkMenuCreator(IconSource* icon_source)
189 : icon_source_(icon_source),
190 dummy_accel_group_(gtk_accel_group_new()) {
191 }
192
193 GtkMenuCreator::~GtkMenuCreator() {
194 g_object_unref(dummy_accel_group_);
195 }
196
197 void GtkMenuCreator::BuildSubmenuFromModel(ui::MenuModel* model,
198 GtkWidget* menu) {
199 std::map<int, GtkWidget*> radio_groups;
200 GtkWidget* menu_item = NULL;
201 for (int i = 0; i < model->GetItemCount(); ++i) {
202 SkBitmap icon;
203 std::string label =
204 gfx::ConvertAcceleratorsFromWindowsStyle(
205 UTF16ToUTF8(model->GetLabelAt(i)));
206
207 switch (model->GetTypeAt(i)) {
208 case ui::MenuModel::TYPE_SEPARATOR:
209 menu_item = gtk_separator_menu_item_new();
210 break;
211
212 case ui::MenuModel::TYPE_CHECK:
213 menu_item = gtk_check_menu_item_new_with_mnemonic(label.c_str());
214 break;
215
216 case ui::MenuModel::TYPE_RADIO: {
217 std::map<int, GtkWidget*>::iterator iter =
218 radio_groups.find(model->GetGroupIdAt(i));
219
220 if (iter == radio_groups.end()) {
221 menu_item = gtk_radio_menu_item_new_with_mnemonic(
222 NULL, label.c_str());
223 radio_groups[model->GetGroupIdAt(i)] = menu_item;
224 } else {
225 menu_item = gtk_radio_menu_item_new_with_mnemonic_from_widget(
226 GTK_RADIO_MENU_ITEM(iter->second), label.c_str());
227 }
228 break;
229 }
230 case ui::MenuModel::TYPE_BUTTON_ITEM: {
231 ui::ButtonMenuItemModel* button_menu_item_model =
232 model->GetButtonMenuItemAt(i);
233 menu_item = BuildButtonMenuItem(button_menu_item_model, menu);
234 if (!menu_item)
235 continue;
236 break;
237 }
238 case ui::MenuModel::TYPE_SUBMENU:
239 case ui::MenuModel::TYPE_COMMAND: {
240 int command_id = model->GetCommandIdAt(i);
241 if (model->GetIconAt(i, &icon))
242 menu_item = BuildMenuItemWithImage(label, icon);
243 else
244 menu_item = BuildMenuItemWithLabel(label, command_id);
245 if (icon_source_ && icon_source_->AlwaysShowIconForCmd(command_id) &&
246 GTK_IS_IMAGE_MENU_ITEM(menu_item))
247 gtk_util::SetAlwaysShowImage(menu_item);
248 break;
249 }
250
251 default:
252 NOTREACHED();
253 }
254
255 if (model->GetTypeAt(i) == ui::MenuModel::TYPE_SUBMENU) {
256 GtkWidget* submenu = gtk_menu_new();
257 BuildSubmenuFromModel(model->GetSubmenuModelAt(i), submenu);
258 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu);
259 }
260
261 ui::AcceleratorGtk accelerator;
262 if (model->GetAcceleratorAt(i, &accelerator)) {
263 gtk_widget_add_accelerator(menu_item,
264 "activate",
265 dummy_accel_group_,
266 accelerator.GetGdkKeyCode(),
267 accelerator.gdk_modifier_type(),
268 GTK_ACCEL_VISIBLE);
269 }
270
271 g_object_set_data(G_OBJECT(menu_item), "model", model);
272 AppendMenuItemToMenu(i, model, menu_item, menu);
273 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
274
275 menu_item = NULL;
276 }
277 }
278
279 GtkWidget* GtkMenuCreator::BuildMenuItemWithImage(const std::string& label,
280 GtkWidget* image) const {
281 GtkWidget* menu_item =
282 gtk_image_menu_item_new_with_mnemonic(label.c_str());
283 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item), image);
284 return menu_item;
285 }
286
287 GtkWidget* GtkMenuCreator::BuildMenuItemWithImage(const std::string& label,
288 const SkBitmap& icon) const {
289 GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(&icon);
290 GtkWidget* menu_item = BuildMenuItemWithImage(
291 label, gtk_image_new_from_pixbuf(pixbuf));
292 g_object_unref(pixbuf);
293 return menu_item;
294 }
295
296 GtkWidget* GtkMenuCreator::BuildMenuItemWithLabel(const std::string& label,
297 int command_id) const {
298 GtkWidget* img =
299 icon_source_ ? icon_source_->GetImageForCommandId(command_id) :
300 GtkMenuCreator::GetDefaultImageForCommandId(command_id);
301 return img ? BuildMenuItemWithImage(label, img) :
302 gtk_menu_item_new_with_mnemonic(label.c_str());
303 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698