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

Unified Diff: views/controls/menu/menu_model_adapter.cc

Issue 7067032: Add MenuModelAdapter to wrap ui::MenuModel with views::MenuDelegate interface. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Implemented reviewer recommendations. 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « views/controls/menu/menu_model_adapter.h ('k') | views/controls/menu/menu_model_adapter_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: views/controls/menu/menu_model_adapter.cc
diff --git a/views/controls/menu/menu_model_adapter.cc b/views/controls/menu/menu_model_adapter.cc
new file mode 100644
index 0000000000000000000000000000000000000000..93e2005359516d1f5a1241726fedfdfd4acf4896
--- /dev/null
+++ b/views/controls/menu/menu_model_adapter.cc
@@ -0,0 +1,167 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "views/controls/menu/menu_model_adapter.h"
+
+#include "base/logging.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/models/menu_model.h"
+#include "views/controls/menu/submenu_view.h"
+#include "views/views_delegate.h"
+
+namespace views {
+
+MenuModelAdapter::MenuModelAdapter(ui::MenuModel* menu_model)
+ : menu_model_(menu_model) {
+ DCHECK(menu_model);
+}
+
+void MenuModelAdapter::BuildMenu(MenuItemView* menu) {
+ DCHECK(menu);
+
+ // Clear the menu.
+ if (menu->HasSubmenu()) {
+ const int subitem_count = menu->GetSubmenu()->child_count();
+ for (int i = 0; i < subitem_count; ++i)
+ menu->RemoveMenuItemAt(0);
+ }
+
+ menu_map_.clear();
+ menu_map_[menu] = menu_model_;
+
+ // Repopulate the menu.
+ BuildMenuImpl(menu, menu_model_);
+ menu->ChildrenChanged();
+}
+
+// MenuModelAdapter, MenuDelegate implementation:
+
+void MenuModelAdapter::ExecuteCommand(int id) {
+ ui::MenuModel* model = menu_model_;
+ int index = 0;
+ if (ui::MenuModel::GetModelAndIndexForCommandId(id, &model, &index)) {
+ model->ActivatedAt(index);
+ return;
+ }
+
+ NOTREACHED();
+}
+
+void MenuModelAdapter::ExecuteCommand(int id, int mouse_event_flags) {
+ ui::MenuModel* model = menu_model_;
+ int index = 0;
+ if (ui::MenuModel::GetModelAndIndexForCommandId(id, &model, &index)) {
+ const int disposition =
+ ViewsDelegate::views_delegate->GetDispositionForEvent(
+ mouse_event_flags);
+ model->ActivatedAtWithDisposition(index, disposition);
+ return;
+ }
+
+ NOTREACHED();
+}
+
+bool MenuModelAdapter::GetAccelerator(int id,
+ views::Accelerator* accelerator) {
+ ui::MenuModel* model = menu_model_;
+ int index = 0;
+ if (ui::MenuModel::GetModelAndIndexForCommandId(id, &model, &index))
+ return model->GetAcceleratorAt(index, accelerator);
+
+ NOTREACHED();
+ return false;
+}
+
+std::wstring MenuModelAdapter::GetLabel(int id) const {
+ ui::MenuModel* model = menu_model_;
+ int index = 0;
+ if (ui::MenuModel::GetModelAndIndexForCommandId(id, &model, &index))
+ return UTF16ToWide(model->GetLabelAt(index));
+
+ NOTREACHED();
+ return std::wstring();
+}
+
+const gfx::Font& MenuModelAdapter::GetLabelFont(int id) const {
+ ui::MenuModel* model = menu_model_;
+ int index = 0;
+ if (ui::MenuModel::GetModelAndIndexForCommandId(id, &model, &index)) {
+ const gfx::Font* font = model->GetLabelFontAt(index);
+ return font ? *font : MenuDelegate::GetLabelFont(id);
+ }
+
+ NOTREACHED();
+ return MenuDelegate::GetLabelFont(id);
+}
+
+bool MenuModelAdapter::IsCommandEnabled(int id) const {
+ ui::MenuModel* model = menu_model_;
+ int index = 0;
+ if (ui::MenuModel::GetModelAndIndexForCommandId(id, &model, &index))
+ return model->IsEnabledAt(index);
+
+ NOTREACHED();
+ return false;
+}
+
+bool MenuModelAdapter::IsItemChecked(int id) const {
+ ui::MenuModel* model = menu_model_;
+ int index = 0;
+ if (ui::MenuModel::GetModelAndIndexForCommandId(id, &model, &index))
+ return model->IsItemCheckedAt(index);
+
+ NOTREACHED();
+ return false;
+}
+
+void MenuModelAdapter::SelectionChanged(MenuItemView* menu) {
+ const int id = menu->GetCommand();
+ ui::MenuModel* model = menu_model_;
+ int index = 0;
+ if (ui::MenuModel::GetModelAndIndexForCommandId(id, &model, &index)) {
+ model->HighlightChangedTo(index);
+ return;
+ }
+
+ NOTREACHED();
+}
+
+void MenuModelAdapter::WillShowMenu(MenuItemView* menu) {
+ // Look up the menu model for this menu.
+ const std::map<MenuItemView*, ui::MenuModel*>::const_iterator map_iterator =
+ menu_map_.find(menu);
+ if (map_iterator != menu_map_.end()) {
+ map_iterator->second->MenuWillShow();
+ return;
+ }
+
+ NOTREACHED();
+}
+
+// MenuModelAdapter, private:
+
+void MenuModelAdapter::BuildMenuImpl(MenuItemView* menu, ui::MenuModel* model) {
+ DCHECK(menu);
+ DCHECK(model);
+ const int item_count = model->GetItemCount();
+ for (int i = 0; i < item_count; ++i) {
+ const int index = i + model->GetFirstItemIndex(NULL);
+ MenuItemView* item = menu->AppendMenuItemFromModel(
+ model, index, model->GetCommandIdAt(index));
+
+ if (model->GetTypeAt(index) == ui::MenuModel::TYPE_SUBMENU) {
+ DCHECK(item);
+ DCHECK_EQ(MenuItemView::SUBMENU, item->GetType());
+ ui::MenuModel* submodel = model->GetSubmenuModelAt(index);
+ DCHECK(submodel);
+ BuildMenuImpl(item, submodel);
+
+ menu_map_[item] = submodel;
+ }
+ }
+
+ menu->set_has_icons(model->HasIcons());
+}
+
+} // views
« no previous file with comments | « views/controls/menu/menu_model_adapter.h ('k') | views/controls/menu/menu_model_adapter_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698