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

Side by Side Diff: chrome/browser/gtk/menu_gtk.cc

Issue 501168: Make back forward menu model a MenuModel.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years, 11 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) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 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/gtk/menu_gtk.h" 5 #include "chrome/browser/gtk/menu_gtk.h"
6 6
7 #include "app/gfx/gtk_util.h" 7 #include "app/gfx/gtk_util.h"
8 #include "app/l10n_util.h" 8 #include "app/l10n_util.h"
9 #include "app/menus/menu_model.h"
9 #include "base/logging.h" 10 #include "base/logging.h"
10 #include "base/message_loop.h" 11 #include "base/message_loop.h"
11 #include "base/stl_util-inl.h" 12 #include "base/stl_util-inl.h"
12 #include "base/string_util.h" 13 #include "base/string_util.h"
13 #include "chrome/browser/gtk/standard_menus.h" 14 #include "chrome/browser/gtk/standard_menus.h"
14 #include "chrome/common/gtk_util.h" 15 #include "chrome/common/gtk_util.h"
15 #include "third_party/skia/include/core/SkBitmap.h" 16 #include "third_party/skia/include/core/SkBitmap.h"
16 17
17 using gtk_util::ConvertAcceleratorsFromWindowsStyle; 18 using gtk_util::ConvertAcceleratorsFromWindowsStyle;
18 19
19 bool MenuGtk::block_activation_ = false; 20 bool MenuGtk::block_activation_ = false;
20 21
21 MenuGtk::MenuGtk(MenuGtk::Delegate* delegate, 22 MenuGtk::MenuGtk(MenuGtk::Delegate* delegate,
22 const MenuCreateMaterial* menu_data, 23 const MenuCreateMaterial* menu_data,
23 GtkAccelGroup* accel_group) 24 GtkAccelGroup* accel_group)
24 : delegate_(delegate), 25 : delegate_(delegate),
26 model_(NULL),
25 dummy_accel_group_(gtk_accel_group_new()), 27 dummy_accel_group_(gtk_accel_group_new()),
26 menu_(gtk_menu_new()), 28 menu_(gtk_menu_new()),
27 factory_(this) { 29 factory_(this) {
28 ConnectSignalHandlers(); 30 ConnectSignalHandlers();
29 BuildMenuIn(menu_.get(), menu_data, accel_group); 31 BuildMenuIn(menu_.get(), menu_data, accel_group);
30 } 32 }
31 33
32 MenuGtk::MenuGtk(MenuGtk::Delegate* delegate, bool load) 34 MenuGtk::MenuGtk(MenuGtk::Delegate* delegate,
35 menus::MenuModel* model)
33 : delegate_(delegate), 36 : delegate_(delegate),
37 model_(model),
34 dummy_accel_group_(NULL), 38 dummy_accel_group_(NULL),
35 menu_(gtk_menu_new()), 39 menu_(gtk_menu_new()),
36 factory_(this) { 40 factory_(this) {
37 ConnectSignalHandlers(); 41 ConnectSignalHandlers();
38 if (load) 42 if (model)
39 BuildMenuFromDelegate(); 43 BuildMenuFromModel();
40 } 44 }
41 45
42 MenuGtk::~MenuGtk() { 46 MenuGtk::~MenuGtk() {
43 menu_.Destroy(); 47 menu_.Destroy();
44 STLDeleteContainerPointers(submenus_we_own_.begin(), submenus_we_own_.end()); 48 STLDeleteContainerPointers(submenus_we_own_.begin(), submenus_we_own_.end());
45 if (dummy_accel_group_) 49 if (dummy_accel_group_)
46 g_object_unref(dummy_accel_group_); 50 g_object_unref(dummy_accel_group_);
47 } 51 }
48 52
49 void MenuGtk::ConnectSignalHandlers() { 53 void MenuGtk::ConnectSignalHandlers() {
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
136 for (; menu_data->type != MENU_END; ++menu_data) { 140 for (; menu_data->type != MENU_END; ++menu_data) {
137 GtkWidget* menu_item = NULL; 141 GtkWidget* menu_item = NULL;
138 142
139 std::string label; 143 std::string label;
140 if (menu_data->label_argument) { 144 if (menu_data->label_argument) {
141 label = l10n_util::GetStringFUTF8( 145 label = l10n_util::GetStringFUTF8(
142 menu_data->label_id, 146 menu_data->label_id,
143 l10n_util::GetStringUTF16(menu_data->label_argument)); 147 l10n_util::GetStringUTF16(menu_data->label_argument));
144 } else if (menu_data->label_id) { 148 } else if (menu_data->label_id) {
145 label = l10n_util::GetStringUTF8(menu_data->label_id); 149 label = l10n_util::GetStringUTF8(menu_data->label_id);
146 } else if (menu_data->type != MENU_SEPARATOR) {
147 label = delegate_->GetLabel(menu_data->id);
148 DCHECK(!label.empty());
149 } 150 }
150 151
151 label = ConvertAcceleratorsFromWindowsStyle(label); 152 label = ConvertAcceleratorsFromWindowsStyle(label);
152 153
153 switch (menu_data->type) { 154 switch (menu_data->type) {
154 case MENU_RADIO: 155 case MENU_RADIO:
155 if (GTK_IS_RADIO_MENU_ITEM(last_menu_item)) { 156 if (GTK_IS_RADIO_MENU_ITEM(last_menu_item)) {
156 menu_item = gtk_radio_menu_item_new_with_mnemonic_from_widget( 157 menu_item = gtk_radio_menu_item_new_with_mnemonic_from_widget(
157 GTK_RADIO_MENU_ITEM(last_menu_item), label.c_str()); 158 GTK_RADIO_MENU_ITEM(last_menu_item), label.c_str());
158 } else { 159 } else {
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
216 GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(&icon); 217 GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(&icon);
217 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item), 218 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),
218 gtk_image_new_from_pixbuf(pixbuf)); 219 gtk_image_new_from_pixbuf(pixbuf));
219 g_object_unref(pixbuf); 220 g_object_unref(pixbuf);
220 if (delegate_->AlwaysShowImages()) 221 if (delegate_->AlwaysShowImages())
221 gtk_util::SetAlwaysShowImage(menu_item); 222 gtk_util::SetAlwaysShowImage(menu_item);
222 223
223 return menu_item; 224 return menu_item;
224 } 225 }
225 226
226 void MenuGtk::BuildMenuFromDelegate() { 227 void MenuGtk::BuildMenuFromModel() {
227 // Note that the menu IDs start at 1, not 0. 228 for (int i = 0; i < model_->GetItemCount(); ++i) {
228 for (int i = 1; i <= delegate_->GetItemCount(); ++i) {
229 GtkWidget* menu_item = NULL; 229 GtkWidget* menu_item = NULL;
230 230
231 if (delegate_->IsItemSeparator(i)) { 231 // TODO(estade): support these commands.
232 DCHECK_NE(model_->GetTypeAt(i), menus::MenuModel::TYPE_CHECK);
233 DCHECK_NE(model_->GetTypeAt(i), menus::MenuModel::TYPE_RADIO);
234 DCHECK_NE(model_->GetTypeAt(i), menus::MenuModel::TYPE_SUBMENU);
235
236 SkBitmap icon;
237 if (model_->GetTypeAt(i) == menus::MenuModel::TYPE_SEPARATOR) {
232 menu_item = gtk_separator_menu_item_new(); 238 menu_item = gtk_separator_menu_item_new();
233 } else if (delegate_->HasIcon(i)) { 239 } else if (model_->GetIconAt(i, &icon)) {
234 const SkBitmap* icon = delegate_->GetIcon(i); 240 menu_item = BuildMenuItemWithImage(UTF16ToUTF8(model_->GetLabelAt(i)),
235 menu_item = BuildMenuItemWithImage(delegate_->GetLabel(i), *icon); 241 icon);
236 } else { 242 } else {
237 menu_item = gtk_menu_item_new_with_label(delegate_->GetLabel(i).c_str()); 243 menu_item = gtk_menu_item_new_with_label(
244 UTF16ToUTF8(model_->GetLabelAt(i)).c_str());
238 } 245 }
239 246
240 AppendMenuItem(i, menu_item); 247 AppendMenuItem(i, menu_item);
241 } 248 }
242 } 249 }
243 250
244 // static 251 // static
245 void MenuGtk::OnMenuItemActivated(GtkMenuItem* menuitem, MenuGtk* menu) { 252 void MenuGtk::OnMenuItemActivated(GtkMenuItem* menuitem, MenuGtk* menu) {
246 if (block_activation_) 253 if (block_activation_)
247 return; 254 return;
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
396 gtk_widget_set_sensitive( 403 gtk_widget_set_sensitive(
397 widget, menu->delegate_->IsCommandEnabled(id)); 404 widget, menu->delegate_->IsCommandEnabled(id));
398 405
399 GtkWidget* submenu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(widget)); 406 GtkWidget* submenu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(widget));
400 if (submenu) { 407 if (submenu) {
401 gtk_container_foreach(GTK_CONTAINER(submenu), &SetMenuItemInfo, 408 gtk_container_foreach(GTK_CONTAINER(submenu), &SetMenuItemInfo,
402 userdata); 409 userdata);
403 } 410 }
404 } 411 }
405 } 412 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698