| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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> |
| 11 #include <set> | 11 #include <set> |
| 12 #include <vector> | 12 #include <vector> |
| 13 | 13 |
| 14 #include "base/message_loop.h" | 14 #include "base/message_loop.h" |
| 15 #include "base/scoped_ptr.h" | 15 #include "base/scoped_ptr.h" |
| 16 #include "base/timer.h" | 16 #include "base/timer.h" |
| 17 #include "views/controls/menu/menu_delegate.h" | 17 #include "views/controls/menu/menu_delegate.h" |
| 18 #include "views/controls/menu/menu_item_view.h" | 18 #include "views/controls/menu/menu_item_view.h" |
| 19 | 19 |
| 20 class OSExchangeData; | 20 class OSExchangeData; |
| 21 | 21 |
| 22 namespace views { | 22 namespace views { |
| 23 | 23 |
| 24 class DropTargetEvent; | 24 class DropTargetEvent; |
| 25 class MenuButton; |
| 25 class MenuHostRootView; | 26 class MenuHostRootView; |
| 26 class MouseEvent; | 27 class MouseEvent; |
| 27 class SubmenuView; | 28 class SubmenuView; |
| 28 class View; | 29 class View; |
| 29 | 30 |
| 30 // MenuController ------------------------------------------------------------- | 31 // MenuController ------------------------------------------------------------- |
| 31 | 32 |
| 32 // MenuController is used internally by the various menu classes to manage | 33 // MenuController is used internally by the various menu classes to manage |
| 33 // showing, selecting and drag/drop for menus. All relevant events are | 34 // showing, selecting and drag/drop for menus. All relevant events are |
| 34 // forwarded to the MenuController from SubmenuView and MenuHost. | 35 // forwarded to the MenuController from SubmenuView and MenuHost. |
| 35 class MenuController : public MessageLoopForUI::Dispatcher { | 36 class MenuController : public MessageLoopForUI::Dispatcher { |
| 36 public: | 37 public: |
| 37 friend class MenuHostRootView; | 38 friend class MenuHostRootView; |
| 38 friend class MenuItemView; | 39 friend class MenuItemView; |
| 39 | 40 |
| 40 // If a menu is currently active, this returns the controller for it. | 41 // If a menu is currently active, this returns the controller for it. |
| 41 static MenuController* GetActiveInstance(); | 42 static MenuController* GetActiveInstance(); |
| 42 | 43 |
| 43 // Runs the menu at the specified location. If the menu was configured to | 44 // Runs the menu at the specified location. If the menu was configured to |
| 44 // block, the selected item is returned. If the menu does not block this | 45 // block, the selected item is returned. If the menu does not block this |
| 45 // returns NULL immediately. | 46 // returns NULL immediately. |
| 46 MenuItemView* Run(gfx::NativeWindow parent, | 47 MenuItemView* Run(gfx::NativeWindow parent, |
| 48 MenuButton* button, |
| 47 MenuItemView* root, | 49 MenuItemView* root, |
| 48 const gfx::Rect& bounds, | 50 const gfx::Rect& bounds, |
| 49 MenuItemView::AnchorPosition position, | 51 MenuItemView::AnchorPosition position, |
| 50 int* mouse_event_flags); | 52 int* mouse_event_flags); |
| 51 | 53 |
| 52 // Whether or not Run blocks. | 54 // Whether or not Run blocks. |
| 53 bool IsBlockingRun() const { return blocking_run_; } | 55 bool IsBlockingRun() const { return blocking_run_; } |
| 54 | 56 |
| 55 // Sets the selection to menu_item, a value of NULL unselects everything. | 57 // Sets the selection to menu_item, a value of NULL unselects everything. |
| 56 // If open_submenu is true and menu_item has a submenu, the submenu is shown. | 58 // If open_submenu is true and menu_item has a submenu, the submenu is shown. |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 175 bool OnKeyDown(int key_code, const MSG& msg); | 177 bool OnKeyDown(int key_code, const MSG& msg); |
| 176 #else | 178 #else |
| 177 bool OnKeyDown(int key_code); | 179 bool OnKeyDown(int key_code); |
| 178 #endif | 180 #endif |
| 179 | 181 |
| 180 // Creates a MenuController. If blocking is true, Run blocks the caller | 182 // Creates a MenuController. If blocking is true, Run blocks the caller |
| 181 explicit MenuController(bool blocking); | 183 explicit MenuController(bool blocking); |
| 182 | 184 |
| 183 ~MenuController(); | 185 ~MenuController(); |
| 184 | 186 |
| 187 void UpdateInitialLocation(const gfx::Rect& bounds, |
| 188 MenuItemView::AnchorPosition position); |
| 189 |
| 185 // Invoked when the user accepts the selected item. This is only used | 190 // Invoked when the user accepts the selected item. This is only used |
| 186 // when blocking. This schedules the loop to quit. | 191 // when blocking. This schedules the loop to quit. |
| 187 void Accept(MenuItemView* item, int mouse_event_flags); | 192 void Accept(MenuItemView* item, int mouse_event_flags); |
| 188 | 193 |
| 194 bool ShowSiblingMenu(SubmenuView* source, const MouseEvent& e); |
| 195 |
| 189 // Closes all menus, including any menus of nested invocations of Run. | 196 // Closes all menus, including any menus of nested invocations of Run. |
| 190 void CloseAllNestedMenus(); | 197 void CloseAllNestedMenus(); |
| 191 | 198 |
| 192 // Gets the enabled menu item at the specified location. | 199 // Gets the enabled menu item at the specified location. |
| 193 // If over_any_menu is non-null it is set to indicate whether the location | 200 // If over_any_menu is non-null it is set to indicate whether the location |
| 194 // is over any menu. It is possible for this to return NULL, but | 201 // is over any menu. It is possible for this to return NULL, but |
| 195 // over_any_menu to be true. For example, the user clicked on a separator. | 202 // over_any_menu to be true. For example, the user clicked on a separator. |
| 196 MenuItemView* GetMenuItemAt(View* menu, int x, int y); | 203 MenuItemView* GetMenuItemAt(View* menu, int x, int y); |
| 197 | 204 |
| 198 // If there is an empty menu item at the specified location, it is returned. | 205 // If there is an empty menu item at the specified location, it is returned. |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 323 // opening or closing submenus. This gives a slight delayed effect to | 330 // opening or closing submenus. This gives a slight delayed effect to |
| 324 // submenus as the user moves the mouse around. This is done so that as the | 331 // submenus as the user moves the mouse around. This is done so that as the |
| 325 // user moves the mouse all submenus don't immediately pop. | 332 // user moves the mouse all submenus don't immediately pop. |
| 326 State pending_state_; | 333 State pending_state_; |
| 327 State state_; | 334 State state_; |
| 328 | 335 |
| 329 // If the user accepted the selection, this is the result. | 336 // If the user accepted the selection, this is the result. |
| 330 MenuItemView* result_; | 337 MenuItemView* result_; |
| 331 | 338 |
| 332 // The mouse event flags when the user clicked on a menu. Is 0 if the | 339 // The mouse event flags when the user clicked on a menu. Is 0 if the |
| 333 // user did not use the mousee to select the menu. | 340 // user did not use the mouse to select the menu. |
| 334 int result_mouse_event_flags_; | 341 int result_mouse_event_flags_; |
| 335 | 342 |
| 336 // If not empty, it means we're nested. When Run is invoked from within | 343 // If not empty, it means we're nested. When Run is invoked from within |
| 337 // Run, the current state (state_) is pushed onto menu_stack_. This allows | 344 // Run, the current state (state_) is pushed onto menu_stack_. This allows |
| 338 // MenuController to restore the state when the nested run returns. | 345 // MenuController to restore the state when the nested run returns. |
| 339 std::list<State> menu_stack_; | 346 std::list<State> menu_stack_; |
| 340 | 347 |
| 341 // As the mouse moves around submenus are not opened immediately. Instead | 348 // As the mouse moves around submenus are not opened immediately. Instead |
| 342 // they open after this timer fires. | 349 // they open after this timer fires. |
| 343 base::OneShotTimer<MenuController> show_timer_; | 350 base::OneShotTimer<MenuController> show_timer_; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 369 int drop_y_; | 376 int drop_y_; |
| 370 int last_drop_operation_; | 377 int last_drop_operation_; |
| 371 | 378 |
| 372 // If true, we're in the middle of invoking ShowAt on a submenu. | 379 // If true, we're in the middle of invoking ShowAt on a submenu. |
| 373 bool showing_submenu_; | 380 bool showing_submenu_; |
| 374 | 381 |
| 375 // Task for scrolling the menu. If non-null indicates a scroll is currently | 382 // Task for scrolling the menu. If non-null indicates a scroll is currently |
| 376 // underway. | 383 // underway. |
| 377 scoped_ptr<MenuScrollTask> scroll_task_; | 384 scoped_ptr<MenuScrollTask> scroll_task_; |
| 378 | 385 |
| 386 MenuButton* menu_button_; |
| 387 |
| 379 DISALLOW_COPY_AND_ASSIGN(MenuController); | 388 DISALLOW_COPY_AND_ASSIGN(MenuController); |
| 380 }; | 389 }; |
| 381 | 390 |
| 382 } // namespace views | 391 } // namespace views |
| 383 | 392 |
| 384 #endif // VIEWS_CONTROLS_MENU_MENU_CONTROLLER_H_ | 393 #endif // VIEWS_CONTROLS_MENU_MENU_CONTROLLER_H_ |
| OLD | NEW |