OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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_CONTROLLER_H_ | 5 #ifndef VIEWS_CONTROLS_MENU_MENU_CONTROLLER_H_ |
6 #define VIEWS_CONTROLS_MENU_MENU_CONTROLLER_H_ | 6 #define VIEWS_CONTROLS_MENU_MENU_CONTROLLER_H_ |
7 | 7 |
8 #include "build/build_config.h" | 8 #include "build/build_config.h" |
9 | 9 |
10 #include <list> | 10 #include <list> |
(...skipping 20 matching lines...) Expand all Loading... |
31 // MenuController ------------------------------------------------------------- | 31 // MenuController ------------------------------------------------------------- |
32 | 32 |
33 // MenuController is used internally by the various menu classes to manage | 33 // MenuController is used internally by the various menu classes to manage |
34 // showing, selecting and drag/drop for menus. All relevant events are | 34 // showing, selecting and drag/drop for menus. All relevant events are |
35 // forwarded to the MenuController from SubmenuView and MenuHost. | 35 // forwarded to the MenuController from SubmenuView and MenuHost. |
36 class MenuController : public MessageLoopForUI::Dispatcher { | 36 class MenuController : public MessageLoopForUI::Dispatcher { |
37 public: | 37 public: |
38 friend class MenuHostRootView; | 38 friend class MenuHostRootView; |
39 friend class MenuItemView; | 39 friend class MenuItemView; |
40 | 40 |
| 41 // Enumeration of how the menu should exit. |
| 42 enum ExitType { |
| 43 // Don't exit. |
| 44 EXIT_NONE, |
| 45 |
| 46 // All menus, including nested, should be exited. |
| 47 EXIT_ALL, |
| 48 |
| 49 // Only the outermost menu should be exited. |
| 50 EXIT_OUTERMOST, |
| 51 |
| 52 // This is set if the menu is being closed as the result of one of the menus |
| 53 // being destroyed. |
| 54 EXIT_DESTROYED |
| 55 }; |
| 56 |
41 // If a menu is currently active, this returns the controller for it. | 57 // If a menu is currently active, this returns the controller for it. |
42 static MenuController* GetActiveInstance(); | 58 static MenuController* GetActiveInstance(); |
43 | 59 |
44 // Runs the menu at the specified location. If the menu was configured to | 60 // Runs the menu at the specified location. If the menu was configured to |
45 // block, the selected item is returned. If the menu does not block this | 61 // block, the selected item is returned. If the menu does not block this |
46 // returns NULL immediately. | 62 // returns NULL immediately. |
47 MenuItemView* Run(gfx::NativeWindow parent, | 63 MenuItemView* Run(gfx::NativeWindow parent, |
48 MenuButton* button, | 64 MenuButton* button, |
49 MenuItemView* root, | 65 MenuItemView* root, |
50 const gfx::Rect& bounds, | 66 const gfx::Rect& bounds, |
51 MenuItemView::AnchorPosition position, | 67 MenuItemView::AnchorPosition position, |
52 int* mouse_event_flags); | 68 int* mouse_event_flags); |
53 | 69 |
54 // Whether or not Run blocks. | 70 // Whether or not Run blocks. |
55 bool IsBlockingRun() const { return blocking_run_; } | 71 bool IsBlockingRun() const { return blocking_run_; } |
56 | 72 |
57 // Sets the selection to menu_item, a value of NULL unselects everything. | 73 // Sets the selection to menu_item, a value of NULL unselects everything. |
58 // If open_submenu is true and menu_item has a submenu, the submenu is shown. | 74 // If open_submenu is true and menu_item has a submenu, the submenu is shown. |
59 // If update_immediately is true, submenus are opened immediately, otherwise | 75 // If update_immediately is true, submenus are opened immediately, otherwise |
60 // submenus are only opened after a timer fires. | 76 // submenus are only opened after a timer fires. |
61 // | 77 // |
62 // Internally this updates pending_state_ immediatley, and if | 78 // Internally this updates pending_state_ immediatley, and if |
63 // update_immediately is true, CommitPendingSelection is invoked to | 79 // update_immediately is true, CommitPendingSelection is invoked to |
64 // show/hide submenus and update state_. | 80 // show/hide submenus and update state_. |
65 void SetSelection(MenuItemView* menu_item, | 81 void SetSelection(MenuItemView* menu_item, |
66 bool open_submenu, | 82 bool open_submenu, |
67 bool update_immediately); | 83 bool update_immediately); |
68 | 84 |
69 // Cancels the current Run. If all is true, any nested loops are canceled | 85 // Cancels the current Run. See ExitType for a description of what happens |
70 // as well. This immediately hides all menus. | 86 // with the various parameters. |
71 void Cancel(bool all); | 87 void Cancel(ExitType type); |
72 | 88 |
73 // An alternative to Cancel(true) that can be used with a OneShotTimer. | 89 // An alternative to Cancel(EXIT_ALL) that can be used with a OneShotTimer. |
74 void CancelAll() { return Cancel(true); } | 90 void CancelAll() { Cancel(EXIT_ALL); } |
75 | 91 |
76 // Various events, forwarded from the submenu. | 92 // Various events, forwarded from the submenu. |
77 // | 93 // |
78 // NOTE: the coordinates of the events are in that of the | 94 // NOTE: the coordinates of the events are in that of the |
79 // MenuScrollViewContainer. | 95 // MenuScrollViewContainer. |
80 void OnMousePressed(SubmenuView* source, const MouseEvent& event); | 96 void OnMousePressed(SubmenuView* source, const MouseEvent& event); |
81 void OnMouseDragged(SubmenuView* source, const MouseEvent& event); | 97 void OnMouseDragged(SubmenuView* source, const MouseEvent& event); |
82 void OnMouseReleased(SubmenuView* source, const MouseEvent& event); | 98 void OnMouseReleased(SubmenuView* source, const MouseEvent& event); |
83 void OnMouseMoved(SubmenuView* source, const MouseEvent& event); | 99 void OnMouseMoved(SubmenuView* source, const MouseEvent& event); |
84 void OnMouseEntered(SubmenuView* source, const MouseEvent& event); | 100 void OnMouseEntered(SubmenuView* source, const MouseEvent& event); |
85 bool GetDropFormats( | 101 bool GetDropFormats( |
86 SubmenuView* source, | 102 SubmenuView* source, |
87 int* formats, | 103 int* formats, |
88 std::set<OSExchangeData::CustomFormat>* custom_formats); | 104 std::set<OSExchangeData::CustomFormat>* custom_formats); |
89 bool AreDropTypesRequired(SubmenuView* source); | 105 bool AreDropTypesRequired(SubmenuView* source); |
90 bool CanDrop(SubmenuView* source, const OSExchangeData& data); | 106 bool CanDrop(SubmenuView* source, const OSExchangeData& data); |
91 void OnDragEntered(SubmenuView* source, const DropTargetEvent& event); | 107 void OnDragEntered(SubmenuView* source, const DropTargetEvent& event); |
92 int OnDragUpdated(SubmenuView* source, const DropTargetEvent& event); | 108 int OnDragUpdated(SubmenuView* source, const DropTargetEvent& event); |
93 void OnDragExited(SubmenuView* source); | 109 void OnDragExited(SubmenuView* source); |
94 int OnPerformDrop(SubmenuView* source, const DropTargetEvent& event); | 110 int OnPerformDrop(SubmenuView* source, const DropTargetEvent& event); |
95 | 111 |
96 // Invoked from the scroll buttons of the MenuScrollViewContainer. | 112 // Invoked from the scroll buttons of the MenuScrollViewContainer. |
97 void OnDragEnteredScrollButton(SubmenuView* source, bool is_up); | 113 void OnDragEnteredScrollButton(SubmenuView* source, bool is_up); |
98 void OnDragExitedScrollButton(SubmenuView* source); | 114 void OnDragExitedScrollButton(SubmenuView* source); |
99 | 115 |
100 private: | 116 private: |
101 // Enumeration of how the menu should exit. | |
102 enum ExitType { | |
103 // Don't exit. | |
104 EXIT_NONE, | |
105 | |
106 // All menus, including nested, should be exited. | |
107 EXIT_ALL, | |
108 | |
109 // Only the outermost menu should be exited. | |
110 EXIT_OUTERMOST | |
111 }; | |
112 | |
113 class MenuScrollTask; | 117 class MenuScrollTask; |
114 | 118 |
115 // Tracks selection information. | 119 // Tracks selection information. |
116 struct State { | 120 struct State { |
117 State() : item(NULL), submenu_open(false) {} | 121 State() : item(NULL), submenu_open(false) {} |
118 | 122 |
119 // The selected menu item. | 123 // The selected menu item. |
120 MenuItemView* item; | 124 MenuItemView* item; |
121 | 125 |
122 // If item has a submenu this indicates if the submenu is showing. | 126 // If item has a submenu this indicates if the submenu is showing. |
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
402 scoped_ptr<MenuScrollTask> scroll_task_; | 406 scoped_ptr<MenuScrollTask> scroll_task_; |
403 | 407 |
404 MenuButton* menu_button_; | 408 MenuButton* menu_button_; |
405 | 409 |
406 DISALLOW_COPY_AND_ASSIGN(MenuController); | 410 DISALLOW_COPY_AND_ASSIGN(MenuController); |
407 }; | 411 }; |
408 | 412 |
409 } // namespace views | 413 } // namespace views |
410 | 414 |
411 #endif // VIEWS_CONTROLS_MENU_MENU_CONTROLLER_H_ | 415 #endif // VIEWS_CONTROLS_MENU_MENU_CONTROLLER_H_ |
OLD | NEW |