OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 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 | 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 #ifndef VIEWS_CONTROLS_MENU_MENU_ITEM_VIEW_H_ | 5 #ifndef VIEWS_CONTROLS_MENU_MENU_ITEM_VIEW_H_ |
6 #define VIEWS_CONTROLS_MENU_MENU_ITEM_VIEW_H_ | 6 #define VIEWS_CONTROLS_MENU_MENU_ITEM_VIEW_H_ |
7 #pragma once | 7 #pragma once |
8 | 8 |
9 #include <string> | 9 #include <string> |
10 #include <vector> | 10 #include <vector> |
(...skipping 15 matching lines...) Expand all Loading... |
26 namespace gfx { | 26 namespace gfx { |
27 class Font; | 27 class Font; |
28 } | 28 } |
29 | 29 |
30 namespace ui { | 30 namespace ui { |
31 class MenuModel; | 31 class MenuModel; |
32 } | 32 } |
33 | 33 |
34 namespace views { | 34 namespace views { |
35 | 35 |
| 36 namespace internal { |
| 37 class MenuRunnerImpl; |
| 38 } |
| 39 |
36 class MenuButton; | 40 class MenuButton; |
| 41 struct MenuConfig; |
37 class MenuController; | 42 class MenuController; |
38 class MenuDelegate; | 43 class MenuDelegate; |
39 class SubmenuView; | 44 class SubmenuView; |
40 | 45 |
41 struct MenuConfig; | |
42 | |
43 // MenuItemView -------------------------------------------------------------- | 46 // MenuItemView -------------------------------------------------------------- |
44 | 47 |
45 // MenuItemView represents a single menu item with a label and optional icon. | 48 // MenuItemView represents a single menu item with a label and optional icon. |
46 // Each MenuItemView may also contain a submenu, which in turn may contain | 49 // Each MenuItemView may also contain a submenu, which in turn may contain |
47 // any number of child MenuItemViews. | 50 // any number of child MenuItemViews. |
48 // | 51 // |
49 // To use a menu create an initial MenuItemView using the constructor that | 52 // To use a menu create an initial MenuItemView using the constructor that |
50 // takes a MenuDelegate, then create any number of child menu items by way | 53 // takes a MenuDelegate, then create any number of child menu items by way |
51 // of the various AddXXX methods. | 54 // of the various AddXXX methods. |
52 // | 55 // |
53 // MenuItemView is itself a View, which means you can add Views to each | 56 // MenuItemView is itself a View, which means you can add Views to each |
54 // MenuItemView. This is normally NOT want you want, rather add other child | 57 // MenuItemView. This is normally NOT want you want, rather add other child |
55 // Views to the submenu of the MenuItemView. Any child views of the MenuItemView | 58 // Views to the submenu of the MenuItemView. Any child views of the MenuItemView |
56 // that are focusable can be navigated to by way of the up/down arrow and can be | 59 // that are focusable can be navigated to by way of the up/down arrow and can be |
57 // activated by way of space/return keys. Activating a focusable child results | 60 // activated by way of space/return keys. Activating a focusable child results |
58 // in |AcceleratorPressed| being invoked. Note, that as menus try not to steal | 61 // in |AcceleratorPressed| being invoked. Note, that as menus try not to steal |
59 // focus from the hosting window child views do not actually get focus. Instead | 62 // focus from the hosting window child views do not actually get focus. Instead |
60 // |SetHotTracked| is used as the user navigates around. | 63 // |SetHotTracked| is used as the user navigates around. |
61 // | 64 // |
62 // There are two ways to show a MenuItemView: | 65 // To show the menu use MenuRunner. See MenuRunner for details on how to run |
63 // 1. Use RunMenuAt. This blocks the caller, executing the selected command | 66 // (show) the menu as well as for details on the life time of the menu. |
64 // on success. | |
65 // 2. Use RunMenuForDropAt. This is intended for use during a drop session | |
66 // and does NOT block the caller. Instead the delegate is notified when the | |
67 // menu closes via the DropMenuClosed method. | |
68 | 67 |
69 class VIEWS_EXPORT MenuItemView : public View { | 68 class VIEWS_EXPORT MenuItemView : public View { |
70 public: | 69 public: |
71 friend class MenuController; | 70 friend class MenuController; |
72 | 71 |
73 // The menu item view's class name. | 72 // The menu item view's class name. |
74 static const char kViewClassName[]; | 73 static const char kViewClassName[]; |
75 | 74 |
76 // ID used to identify menu items. | 75 // ID used to identify menu items. |
77 static const int kMenuItemViewID; | 76 static const int kMenuItemViewID; |
(...skipping 26 matching lines...) Expand all Loading... |
104 enum MenuPosition { | 103 enum MenuPosition { |
105 POSITION_BEST_FIT, | 104 POSITION_BEST_FIT, |
106 POSITION_ABOVE_BOUNDS, | 105 POSITION_ABOVE_BOUNDS, |
107 POSITION_BELOW_BOUNDS | 106 POSITION_BELOW_BOUNDS |
108 }; | 107 }; |
109 | 108 |
110 // Constructor for use with the top level menu item. This menu is never | 109 // Constructor for use with the top level menu item. This menu is never |
111 // shown to the user, rather its use as the parent for all menu items. | 110 // shown to the user, rather its use as the parent for all menu items. |
112 explicit MenuItemView(MenuDelegate* delegate); | 111 explicit MenuItemView(MenuDelegate* delegate); |
113 | 112 |
114 virtual ~MenuItemView(); | |
115 | |
116 // Overridden from View: | 113 // Overridden from View: |
117 virtual bool GetTooltipText(const gfx::Point& p, | 114 virtual bool GetTooltipText(const gfx::Point& p, |
118 std::wstring* tooltip) OVERRIDE; | 115 std::wstring* tooltip) OVERRIDE; |
119 virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE; | 116 virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE; |
120 | 117 |
121 // Returns the preferred height of menu items. This is only valid when the | 118 // Returns the preferred height of menu items. This is only valid when the |
122 // menu is about to be shown. | 119 // menu is about to be shown. |
123 static int pref_menu_height() { return pref_menu_height_; } | 120 static int pref_menu_height() { return pref_menu_height_; } |
124 | 121 |
125 // X-coordinate of where the label starts. | 122 // X-coordinate of where the label starts. |
126 static int label_start() { return label_start_; } | 123 static int label_start() { return label_start_; } |
127 | 124 |
128 // Returns the accessible name to be used with screen readers. Mnemonics are | 125 // Returns the accessible name to be used with screen readers. Mnemonics are |
129 // removed and the menu item accelerator text is appended. | 126 // removed and the menu item accelerator text is appended. |
130 static string16 GetAccessibleNameForMenuItem( | 127 static string16 GetAccessibleNameForMenuItem( |
131 const string16& item_text, const string16& accelerator_text); | 128 const string16& item_text, const string16& accelerator_text); |
132 | 129 |
133 // Run methods. See description above class for details. Both Run methods take | |
134 // a rectangle, which is used to position the menu. |has_mnemonics| indicates | |
135 // whether the items have mnemonics. Mnemonics are identified by way of the | |
136 // character following the '&'. The anchor position is specified for non-RTL | |
137 // languages; the opposite value will be used for RTL. | |
138 void RunMenuAt(Widget* parent, | |
139 MenuButton* button, | |
140 const gfx::Rect& bounds, | |
141 AnchorPosition anchor, | |
142 bool has_mnemonics); | |
143 void RunMenuForDropAt(Widget* parent, | |
144 const gfx::Rect& bounds, | |
145 AnchorPosition anchor); | |
146 | |
147 // Hides and cancels the menu. This does nothing if the menu is not open. | 130 // Hides and cancels the menu. This does nothing if the menu is not open. |
148 void Cancel(); | 131 void Cancel(); |
149 | 132 |
150 // Add an item to the menu at a specified index. ChildrenChanged() should | 133 // Add an item to the menu at a specified index. ChildrenChanged() should |
151 // called after adding menu items if the menu may be active. | 134 // called after adding menu items if the menu may be active. |
152 MenuItemView* AddMenuItemAt(int index, | 135 MenuItemView* AddMenuItemAt(int index, |
153 int item_id, | 136 int item_id, |
154 const std::wstring& label, | 137 const std::wstring& label, |
155 const SkBitmap& icon, | 138 const SkBitmap& icon, |
156 Type type); | 139 Type type); |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
281 virtual void OnPaint(gfx::Canvas* canvas); | 264 virtual void OnPaint(gfx::Canvas* canvas); |
282 | 265 |
283 // Returns the preferred size of this item. | 266 // Returns the preferred size of this item. |
284 virtual gfx::Size GetPreferredSize(); | 267 virtual gfx::Size GetPreferredSize(); |
285 | 268 |
286 // Returns the object responsible for controlling showing the menu. | 269 // Returns the object responsible for controlling showing the menu. |
287 MenuController* GetMenuController(); | 270 MenuController* GetMenuController(); |
288 | 271 |
289 // Returns the delegate. This returns the delegate of the root menu item. | 272 // Returns the delegate. This returns the delegate of the root menu item. |
290 MenuDelegate* GetDelegate(); | 273 MenuDelegate* GetDelegate(); |
| 274 void set_delegate(MenuDelegate* delegate) { delegate_ = delegate; } |
291 | 275 |
292 // Returns the root parent, or this if this has no parent. | 276 // Returns the root parent, or this if this has no parent. |
293 MenuItemView* GetRootMenuItem(); | 277 MenuItemView* GetRootMenuItem(); |
294 | 278 |
295 // Returns the mnemonic for this MenuItemView, or 0 if this MenuItemView | 279 // Returns the mnemonic for this MenuItemView, or 0 if this MenuItemView |
296 // doesn't have a mnemonic. | 280 // doesn't have a mnemonic. |
297 char16 GetMnemonic(); | 281 char16 GetMnemonic(); |
298 | 282 |
299 // Do we have icons? This only has effect on the top menu. Turning this on | 283 // Do we have icons? This only has effect on the top menu. Turning this on |
300 // makes the menus slightly wider and taller. | 284 // makes the menus slightly wider and taller. |
(...skipping 26 matching lines...) Expand all Loading... |
327 // Set the position of the menu with respect to the bounds (top | 311 // Set the position of the menu with respect to the bounds (top |
328 // level only). | 312 // level only). |
329 void set_menu_position(MenuPosition menu_position) { | 313 void set_menu_position(MenuPosition menu_position) { |
330 requested_menu_position_ = menu_position; | 314 requested_menu_position_ = menu_position; |
331 } | 315 } |
332 | 316 |
333 protected: | 317 protected: |
334 // Creates a MenuItemView. This is used by the various AddXXX methods. | 318 // Creates a MenuItemView. This is used by the various AddXXX methods. |
335 MenuItemView(MenuItemView* parent, int command, Type type); | 319 MenuItemView(MenuItemView* parent, int command, Type type); |
336 | 320 |
| 321 // MenuRunner owns MenuItemView and should be the only one deleting it. |
| 322 virtual ~MenuItemView(); |
| 323 |
337 virtual void ChildPreferredSizeChanged(View* child) OVERRIDE; | 324 virtual void ChildPreferredSizeChanged(View* child) OVERRIDE; |
338 | 325 |
339 virtual std::string GetClassName() const OVERRIDE; | 326 virtual std::string GetClassName() const OVERRIDE; |
340 | 327 |
341 private: | 328 private: |
| 329 friend class internal::MenuRunnerImpl; // For access to ~MenuItemView. |
| 330 |
342 // Calculates all sizes that we can from the OS. | 331 // Calculates all sizes that we can from the OS. |
343 // | 332 // |
344 // This is invoked prior to Running a menu. | 333 // This is invoked prior to Running a menu. |
345 static void UpdateMenuPartSizes(bool has_icons); | 334 static void UpdateMenuPartSizes(bool has_icons); |
346 | 335 |
347 // Called by the two constructors to initialize this menu item. | 336 // Called by the two constructors to initialize this menu item. |
348 void Init(MenuItemView* parent, | 337 void Init(MenuItemView* parent, |
349 int command, | 338 int command, |
350 MenuItemView::Type type, | 339 MenuItemView::Type type, |
351 MenuDelegate* delegate); | 340 MenuDelegate* delegate); |
352 | 341 |
353 // Invoked by the MenuController when the menu closes as the result of | |
354 // drag and drop run. | |
355 void DropMenuClosed(bool notify_delegate); | |
356 | |
357 // The RunXXX methods call into this to set up the necessary state before | 342 // The RunXXX methods call into this to set up the necessary state before |
358 // running. | 343 // running. |
359 void PrepareForRun(bool has_mnemonics, bool show_mnemonics); | 344 void PrepareForRun(bool has_mnemonics, bool show_mnemonics); |
360 | 345 |
361 // Returns the flags passed to DrawStringInt. | 346 // Returns the flags passed to DrawStringInt. |
362 int GetDrawStringFlags(); | 347 int GetDrawStringFlags(); |
363 | 348 |
364 // Returns the font to use for menu text. | 349 // Returns the font to use for menu text. |
365 const gfx::Font& GetFont(); | 350 const gfx::Font& GetFont(); |
366 | 351 |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
411 // Calculates the preferred size. | 396 // Calculates the preferred size. |
412 gfx::Size CalculatePreferredSize(); | 397 gfx::Size CalculatePreferredSize(); |
413 | 398 |
414 // Used by MenuController to cache the menu position in use by the | 399 // Used by MenuController to cache the menu position in use by the |
415 // active menu. | 400 // active menu. |
416 MenuPosition actual_menu_position() const { return actual_menu_position_; } | 401 MenuPosition actual_menu_position() const { return actual_menu_position_; } |
417 void set_actual_menu_position(MenuPosition actual_menu_position) { | 402 void set_actual_menu_position(MenuPosition actual_menu_position) { |
418 actual_menu_position_ = actual_menu_position; | 403 actual_menu_position_ = actual_menu_position; |
419 } | 404 } |
420 | 405 |
| 406 void set_controller(MenuController* controller) { controller_ = controller; } |
| 407 |
421 // The delegate. This is only valid for the root menu item. You shouldn't | 408 // The delegate. This is only valid for the root menu item. You shouldn't |
422 // use this directly, instead use GetDelegate() which walks the tree as | 409 // use this directly, instead use GetDelegate() which walks the tree as |
423 // as necessary. | 410 // as necessary. |
424 MenuDelegate* delegate_; | 411 MenuDelegate* delegate_; |
425 | 412 |
426 // Returns the controller for the run operation, or NULL if the menu isn't | 413 // The controller for the run operation, or NULL if the menu isn't showing. |
427 // showing. | |
428 MenuController* controller_; | 414 MenuController* controller_; |
429 | 415 |
430 // Used to detect when Cancel was invoked. | 416 // Used to detect when Cancel was invoked. |
431 bool canceled_; | 417 bool canceled_; |
432 | 418 |
433 // Our parent. | 419 // Our parent. |
434 MenuItemView* parent_menu_item_; | 420 MenuItemView* parent_menu_item_; |
435 | 421 |
436 // Type of menu. NOTE: MenuItemView doesn't itself represent SEPARATOR, | 422 // Type of menu. NOTE: MenuItemView doesn't itself represent SEPARATOR, |
437 // that is handled by an entirely different view class. | 423 // that is handled by an entirely different view class. |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
492 // position of the menu being shown. | 478 // position of the menu being shown. |
493 MenuPosition requested_menu_position_; | 479 MenuPosition requested_menu_position_; |
494 MenuPosition actual_menu_position_; | 480 MenuPosition actual_menu_position_; |
495 | 481 |
496 DISALLOW_COPY_AND_ASSIGN(MenuItemView); | 482 DISALLOW_COPY_AND_ASSIGN(MenuItemView); |
497 }; | 483 }; |
498 | 484 |
499 } // namespace views | 485 } // namespace views |
500 | 486 |
501 #endif // VIEWS_CONTROLS_MENU_MENU_ITEM_VIEW_H_ | 487 #endif // VIEWS_CONTROLS_MENU_MENU_ITEM_VIEW_H_ |
OLD | NEW |