diff options
Diffstat (limited to 'views/controls/menu/simple_menu_model.h')
-rw-r--r-- | views/controls/menu/simple_menu_model.h | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/views/controls/menu/simple_menu_model.h b/views/controls/menu/simple_menu_model.h new file mode 100644 index 0000000..dbab73f --- /dev/null +++ b/views/controls/menu/simple_menu_model.h @@ -0,0 +1,93 @@ +// Copyright (c) 2009 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. + +#ifndef CONTROLS_MENU_VIEWS_SIMPLE_MENU_MODEL_H_ +#define CONTROLS_MENU_VIEWS_SIMPLE_MENU_MODEL_H_ + +#include <vector> + +#include "views/controls/menu/menu_2.h" + +namespace views { + +// A simple Menu2Model implementation with an imperative API for adding menu +// items. This makes it easy to construct fixed menus. Menus populated by +// dynamic data sources may be better off implementing Menu2Model directly. +// The breadth of Menu2Model is not exposed through this API. +class SimpleMenuModel : public Menu2Model { + public: + class Delegate { + public: + // Methods for determining the state of specific command ids. + virtual bool IsCommandIdChecked(int command_id) const = 0; + virtual bool IsCommandIdEnabled(int command_id) const = 0; + + // Gets the accelerator for the specified command id. Returns true if the + // command id has a valid accelerator, false otherwise. + virtual bool GetAcceleratorForCommandId( + int command_id, + views::Accelerator* accelerator) = 0; + + // Some command ids have labels that change over time. + virtual bool IsLabelForCommandIdDynamic(int command_id) const = 0; + virtual std::wstring GetLabelForCommandId(int command_id) const = 0; + }; + + // The Delegate can be NULL, though if it is items can't be checked or + // disabled. + explicit SimpleMenuModel(Delegate* delegate); + virtual ~SimpleMenuModel(); + + // Methods for adding items to the model. + void AddItem(int command_id, const std::wstring& label); + void AddItemWithStringId(int command_id, int string_id); + void AddSeparator(); + void AddCheckItem(int command_id, const std::wstring& label); + void AddCheckItemWithStringId(int command_id, int string_id); + void AddRadioItem(int command_id, const std::wstring& label, int group_id); + void AddRadioItemWithStringId(int command_id, int string_id, int group_id); + void AddSubMenu(const std::wstring& label, Menu2Model* model); + void AddSubMenuWithStringId(int string_id, Menu2Model* model); + + // Overridden from Menu2Model: + virtual bool HasIcons() const; + virtual int GetItemCount() const; + virtual ItemType GetTypeAt(int index) const; + virtual int GetCommandIdAt(int index) const; + virtual std::wstring GetLabelAt(int index) const; + virtual bool IsLabelDynamicAt(int index) const; + virtual bool GetAcceleratorAt(int index, + views::Accelerator* accelerator) const; + virtual bool IsItemCheckedAt(int index) const; + virtual int GetGroupIdAt(int index) const; + virtual bool GetIconAt(int index, SkBitmap* icon) const; + virtual bool IsEnabledAt(int index) const; + virtual Menu2Model* GetSubmenuModelAt(int index) const; + + protected: + // Some variants of this model (SystemMenuModel) relies on items to be + // inserted backwards. This is counter-intuitive for the API, so rather than + // forcing customers to insert things backwards, we return the indices + // backwards instead. That's what this method is for. By default, it just + // returns what it's passed. + virtual int FlipIndex(int index) const { return index; } + + private: + struct Item { + int command_id; + std::wstring label; + ItemType type; + int group_id; + Menu2Model* submenu; + }; + std::vector<Item> items_; + + Delegate* delegate_; + + DISALLOW_COPY_AND_ASSIGN(SimpleMenuModel); +}; + +} // namespace views + +#endif // CONTROLS_MENU_VIEWS_SIMPLE_MENU_MODEL_H_ |