diff options
Diffstat (limited to 'chromium/ui/views/controls/menu/menu_controller.h')
-rw-r--r-- | chromium/ui/views/controls/menu/menu_controller.h | 63 |
1 files changed, 39 insertions, 24 deletions
diff --git a/chromium/ui/views/controls/menu/menu_controller.h b/chromium/ui/views/controls/menu/menu_controller.h index 1404d54e5d6..30c56f0f04b 100644 --- a/chromium/ui/views/controls/menu/menu_controller.h +++ b/chromium/ui/views/controls/menu/menu_controller.h @@ -13,30 +13,39 @@ #include "base/compiler_specific.h" #include "base/memory/scoped_ptr.h" -#include "base/message_loop/message_loop.h" #include "base/timer/timer.h" +#include "ui/events/event.h" #include "ui/events/event_constants.h" +#include "ui/events/platform/platform_event_dispatcher.h" +#include "ui/views/controls/menu/menu_config.h" #include "ui/views/controls/menu/menu_delegate.h" -#include "ui/views/controls/menu/menu_item_view.h" #include "ui/views/widget/widget_observer.h" -namespace ui { -class NativeTheme; -class OSExchangeData; +namespace base { +class MessagePumpDispatcher; } namespace gfx { class Screen; } +namespace ui { +class NativeTheme; +class OSExchangeData; +class ScopedEventDispatcher; +} namespace views { class MenuButton; class MenuHostRootView; +class MenuItemView; +class MenuMessageLoop; class MouseEvent; class SubmenuView; class View; namespace internal { class MenuControllerDelegate; +class MenuEventDispatcher; +class MenuMessagePumpDispatcher; class MenuRunnerImpl; } @@ -45,8 +54,7 @@ class MenuRunnerImpl; // MenuController is used internally by the various menu classes to manage // showing, selecting and drag/drop for menus. All relevant events are // forwarded to the MenuController from SubmenuView and MenuHost. -class VIEWS_EXPORT MenuController : public base::MessageLoop::Dispatcher, - public WidgetObserver { +class VIEWS_EXPORT MenuController : public WidgetObserver { public: // Enumeration of how the menu should exit. enum ExitType { @@ -74,7 +82,7 @@ class VIEWS_EXPORT MenuController : public base::MessageLoop::Dispatcher, MenuButton* button, MenuItemView* root, const gfx::Rect& bounds, - MenuItemView::AnchorPosition position, + MenuAnchorPosition position, bool context_menu, int* event_flags); @@ -84,8 +92,12 @@ class VIEWS_EXPORT MenuController : public base::MessageLoop::Dispatcher, // Whether or not drag operation is in progress. bool drag_in_progress() const { return drag_in_progress_; } + // Returns the owner of child windows. + // WARNING: this may be NULL. + Widget* owner() { return owner_; } + // Get the anchor position wich is used to show this menu. - MenuItemView::AnchorPosition GetAnchorPosition() { return state_.anchor; } + MenuAnchorPosition GetAnchorPosition() { return state_.anchor; } // Cancels the current Run. See ExitType for a description of what happens // with the various parameters. @@ -101,7 +113,7 @@ class VIEWS_EXPORT MenuController : public base::MessageLoop::Dispatcher, // Returns the time from the event which closed the menu - or 0. base::TimeDelta closing_event_time() const { return closing_event_time_; } - void set_accept_on_f4(bool accept_on_f4) { accept_on_f4_ = accept_on_f4; } + void set_is_combobox(bool is_combobox) { is_combobox_ = is_combobox; } // Various events, forwarded from the submenu. // @@ -112,9 +124,7 @@ class VIEWS_EXPORT MenuController : public base::MessageLoop::Dispatcher, void OnMouseReleased(SubmenuView* source, const ui::MouseEvent& event); void OnMouseMoved(SubmenuView* source, const ui::MouseEvent& event); void OnMouseEntered(SubmenuView* source, const ui::MouseEvent& event); -#if defined(USE_AURA) bool OnMouseWheel(SubmenuView* source, const ui::MouseWheelEvent& event); -#endif void OnGestureEvent(SubmenuView* source, ui::GestureEvent* event); bool GetDropFormats( @@ -142,7 +152,10 @@ class VIEWS_EXPORT MenuController : public base::MessageLoop::Dispatcher, static void TurnOffMenuSelectionHoldForTest(); private: + friend class internal::MenuEventDispatcher; + friend class internal::MenuMessagePumpDispatcher; friend class internal::MenuRunnerImpl; + friend class MenuControllerTest; friend class MenuHostRootView; friend class MenuItemView; friend class SubmenuView; @@ -194,7 +207,7 @@ class VIEWS_EXPORT MenuController : public base::MessageLoop::Dispatcher, gfx::Rect initial_bounds; // Position of the initial menu. - MenuItemView::AnchorPosition anchor; + MenuAnchorPosition anchor; // The direction child menus have opened in. std::list<bool> open_leading; @@ -253,10 +266,6 @@ class VIEWS_EXPORT MenuController : public base::MessageLoop::Dispatcher, const ui::LocatedEvent& event); void StartDrag(SubmenuView* source, const gfx::Point& location); - // Dispatcher method. This returns true if the menu was canceled, or - // if the message is such that the menu should be closed. - virtual bool Dispatch(const base::NativeEvent& event) OVERRIDE; - // Key processing. The return value of this is returned from Dispatch. // In other words, if this returns false (which happens if escape was // pressed, or a matching mnemonic was found) the message loop returns. @@ -279,7 +288,7 @@ class VIEWS_EXPORT MenuController : public base::MessageLoop::Dispatcher, SendAcceleratorResultType SendAcceleratorToHotTrackedView(); void UpdateInitialLocation(const gfx::Rect& bounds, - MenuItemView::AnchorPosition position, + MenuAnchorPosition position, bool context_menu); // Invoked when the user accepts the selected item. This is only used @@ -416,8 +425,8 @@ class VIEWS_EXPORT MenuController : public base::MessageLoop::Dispatcher, // |match_function| is used to determine which menus match. SelectByCharDetails FindChildForMnemonic( MenuItemView* parent, - char16 key, - bool (*match_function)(MenuItemView* menu, char16 mnemonic)); + base::char16 key, + bool (*match_function)(MenuItemView* menu, base::char16 mnemonic)); // Selects or accepts the appropriate menu item based on |details|. Returns // true if |Accept| was invoked (which happens if there aren't multiple item @@ -426,7 +435,7 @@ class VIEWS_EXPORT MenuController : public base::MessageLoop::Dispatcher, // Selects by mnemonic, and if that doesn't work tries the first character of // the title. Returns true if a match was selected and the menu should exit. - bool SelectByChar(char16 key); + bool SelectByChar(base::char16 key); // For Windows and Aura we repost an event for some events that dismiss // the context menu. The event is then reprocessed to cause its result @@ -468,9 +477,12 @@ class VIEWS_EXPORT MenuController : public base::MessageLoop::Dispatcher, void SetActiveMouseView(View* view); View* GetActiveMouseView(); - // Sets exit type. + // Sets exit type. Calling this can terminate the active nested message-loop. void SetExitType(ExitType type); + // Terminates the current nested message-loop. + void TerminateNestedMessageLoop(); + // Returns true if SetExitType() should quit the message loop. bool ShouldQuitNow() const; @@ -584,12 +596,15 @@ class VIEWS_EXPORT MenuController : public base::MessageLoop::Dispatcher, // screen coordinates). Otherwise this will be (0, 0). gfx::Point menu_start_mouse_press_loc_; - // Whether the menu should accept on F4, like Windows native Combobox menus. - bool accept_on_f4_; + // Controls behavior differences between a combobox and other types of menu + // (like a context menu). + bool is_combobox_; // Set to true if the menu item was selected by touch. bool item_selected_by_touch_; + scoped_ptr<MenuMessageLoop> message_loop_; + DISALLOW_COPY_AND_ASSIGN(MenuController); }; |