Updating trunk VERSION from 2139.0 to 2140.0
[chromium-blink-merge.git] / ui / views / controls / menu / menu.h
blob099a98ee5436bfa228f264e10cc81ccbde373669
1 // Copyright (c) 2012 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.
5 #ifndef UI_VIEWS_CONTROLS_MENU_MENU_H_
6 #define UI_VIEWS_CONTROLS_MENU_MENU_H_
8 #include <string>
10 #include "base/basictypes.h"
11 #include "base/strings/string16.h"
12 #include "ui/gfx/native_widget_types.h"
13 #include "ui/views/views_export.h"
15 namespace gfx {
16 class ImageSkia;
17 class Point;
20 namespace ui {
21 class Accelerator;
24 namespace views {
26 class VIEWS_EXPORT Menu {
27 public:
28 /////////////////////////////////////////////////////////////////////////////
30 // Delegate Interface
32 // Classes implement this interface to tell the menu system more about each
33 // item as it is created.
35 /////////////////////////////////////////////////////////////////////////////
36 class VIEWS_EXPORT Delegate {
37 public:
38 virtual ~Delegate() {}
40 // Whether or not an item should be shown as checked.
41 virtual bool IsItemChecked(int id) const;
43 // Whether or not an item should be shown as the default (using bold).
44 // There can only be one default menu item.
45 virtual bool IsItemDefault(int id) const;
47 // The string shown for the menu item.
48 virtual base::string16 GetLabel(int id) const;
50 // The delegate needs to implement this function if it wants to display
51 // the shortcut text next to each menu item. If there is an accelerator
52 // for a given item id, the implementor must return it.
53 virtual bool GetAcceleratorInfo(int id, ui::Accelerator* accel);
55 // The icon shown for the menu item.
56 virtual const gfx::ImageSkia& GetIcon(int id) const;
58 // The number of items to show in the menu
59 virtual int GetItemCount() const;
61 // Whether or not an item is a separator.
62 virtual bool IsItemSeparator(int id) const;
64 // Shows the context menu with the specified id. This is invoked when the
65 // user does the appropriate gesture to show a context menu. The id
66 // identifies the id of the menu to show the context menu for.
67 // is_mouse_gesture is true if this is the result of a mouse gesture.
68 // If this is not the result of a mouse gesture |p| is the recommended
69 // location to display the content menu at. In either case, |p| is in
70 // screen coordinates.
71 virtual void ShowContextMenu(Menu* source,
72 int id,
73 const gfx::Point& p,
74 bool is_mouse_gesture) {
77 // Whether an item has an icon.
78 virtual bool HasIcon(int id) const;
80 // Notification that the menu is about to be popped up.
81 virtual void MenuWillShow() {
84 // Whether to create a right-to-left menu. The default implementation
85 // returns true if the locale's language is a right-to-left language (such
86 // as Hebrew) and false otherwise. This is generally the right behavior
87 // since there is no reason to show left-to-right menus for right-to-left
88 // locales. However, subclasses can override this behavior so that the menu
89 // is a right-to-left menu only if the view's layout is right-to-left
90 // (since the view can use a different layout than the locale's language
91 // layout).
92 virtual bool IsRightToLeftUILayout() const;
94 // Controller
95 virtual bool SupportsCommand(int id) const;
96 virtual bool IsCommandEnabled(int id) const;
97 virtual bool GetContextualLabel(int id, base::string16* out) const;
98 virtual void ExecuteCommand(int id) {
101 protected:
102 // Returns an empty icon.
103 const gfx::ImageSkia& GetEmptyIcon() const;
106 // How this popup should align itself relative to the point it is run at.
107 enum AnchorPoint {
108 TOPLEFT,
109 TOPRIGHT
112 // Different types of menu items
113 enum MenuItemType {
114 NORMAL,
115 CHECKBOX,
116 RADIO,
117 SEPARATOR
120 // Construct a Menu using the specified controller to determine command
121 // state.
122 // delegate A Menu::Delegate implementation that provides more
123 // information about the Menu presentation.
124 // anchor An alignment hint for the popup menu.
125 // owner The window that the menu is being brought up relative
126 // to. Not actually used for anything but must not be
127 // NULL.
128 Menu(Delegate* delegate, AnchorPoint anchor);
129 Menu();
130 virtual ~Menu();
132 static Menu* Create(Delegate* delegate,
133 AnchorPoint anchor,
134 gfx::NativeView parent);
136 // Creates a new menu with the contents of the system menu for the given
137 // parent window. The caller owns the returned pointer.
138 static Menu* GetSystemMenu(gfx::NativeWindow parent);
140 void set_delegate(Delegate* delegate) { delegate_ = delegate; }
141 Delegate* delegate() const { return delegate_; }
143 AnchorPoint anchor() const { return anchor_; }
145 // Adds an item to this menu.
146 // item_id The id of the item, used to identify it in delegate callbacks
147 // or (if delegate is NULL) to identify the command associated
148 // with this item with the controller specified in the ctor. Note
149 // that this value should not be 0 as this has a special meaning
150 // ("NULL command, no item selected")
151 // label The text label shown.
152 // type The type of item.
153 void AppendMenuItem(int item_id,
154 const base::string16& label,
155 MenuItemType type);
156 void AddMenuItem(int index,
157 int item_id,
158 const base::string16& label,
159 MenuItemType type);
161 // Append a submenu to this menu.
162 // The returned pointer is owned by this menu.
163 Menu* AppendSubMenu(int item_id,
164 const base::string16& label);
165 Menu* AddSubMenu(int index, int item_id, const base::string16& label);
167 // Append a submenu with an icon to this menu
168 // The returned pointer is owned by this menu.
169 // Unless the icon is empty, calling this function forces the Menu class
170 // to draw the menu, instead of relying on Windows.
171 Menu* AppendSubMenuWithIcon(int item_id,
172 const base::string16& label,
173 const gfx::ImageSkia& icon);
174 virtual Menu* AddSubMenuWithIcon(int index,
175 int item_id,
176 const base::string16& label,
177 const gfx::ImageSkia& icon) = 0;
179 // This is a convenience for standard text label menu items where the label
180 // is provided with this call.
181 void AppendMenuItemWithLabel(int item_id, const base::string16& label);
182 void AddMenuItemWithLabel(int index,
183 int item_id,
184 const base::string16& label);
186 // This is a convenience for text label menu items where the label is
187 // provided by the delegate.
188 void AppendDelegateMenuItem(int item_id);
189 void AddDelegateMenuItem(int index, int item_id);
191 // Adds a separator to this menu
192 void AppendSeparator();
193 virtual void AddSeparator(int index) = 0;
195 // Appends a menu item with an icon. This is for the menu item which
196 // needs an icon. Calling this function forces the Menu class to draw
197 // the menu, instead of relying on Windows.
198 void AppendMenuItemWithIcon(int item_id,
199 const base::string16& label,
200 const gfx::ImageSkia& icon);
201 virtual void AddMenuItemWithIcon(int index,
202 int item_id,
203 const base::string16& label,
204 const gfx::ImageSkia& icon);
206 // Enables or disables the item with the specified id.
207 virtual void EnableMenuItemByID(int item_id, bool enabled) = 0;
208 virtual void EnableMenuItemAt(int index, bool enabled) = 0;
210 // Sets menu label at specified index.
211 virtual void SetMenuLabel(int item_id, const base::string16& label) = 0;
213 // Sets an icon for an item with a given item_id. Calling this function
214 // also forces the Menu class to draw the menu, instead of relying on Windows.
215 // Returns false if the item with |item_id| is not found.
216 virtual bool SetIcon(const gfx::ImageSkia& icon, int item_id) = 0;
218 // Shows the menu, blocks until the user dismisses the menu or selects an
219 // item, and executes the command for the selected item (if any).
220 // Warning: Blocking call. Will implicitly run a message loop.
221 virtual void RunMenuAt(int x, int y) = 0;
223 // Cancels the menu.
224 virtual void Cancel() = 0;
226 // Returns the number of menu items.
227 virtual int ItemCount() = 0;
229 #if defined(OS_WIN)
230 // Returns the underlying menu handle
231 virtual HMENU GetMenuHandle() const = 0;
232 #endif // defined(OS_WIN)
234 protected:
235 explicit Menu(Menu* parent);
237 virtual void AddMenuItemInternal(int index,
238 int item_id,
239 const base::string16& label,
240 const gfx::ImageSkia& icon,
241 MenuItemType type) = 0;
243 private:
244 // The delegate that is being used to get information about the presentation.
245 Delegate* delegate_;
247 // How this popup menu should be aligned relative to the point it is run at.
248 AnchorPoint anchor_;
250 DISALLOW_COPY_AND_ASSIGN(Menu);
253 } // namespace views
255 #endif // UI_VIEWS_CONTROLS_MENU_MENU_H_