// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef UI_VIEWS_CONTROLS_MENU_MENU_HOST_H_ #define UI_VIEWS_CONTROLS_MENU_MENU_HOST_H_ #include "base/compiler_specific.h" #include "base/macros.h" #include "base/memory/scoped_ptr.h" #include "ui/gfx/geometry/rect.h" #include "ui/views/widget/widget.h" namespace views { class NativeWidget; class SubmenuView; class View; class Widget; namespace internal { // This class is internal to views. class PreMenuEventDispatchHandler; } // internal // SubmenuView uses a MenuHost to house the SubmenuView. // // SubmenuView owns the MenuHost. When SubmenuView is done with the MenuHost // |DestroyMenuHost| is invoked. The one exception to this is if the native // OS destroys the widget out from under us, in which case |MenuHostDestroyed| // is invoked back on the SubmenuView and the SubmenuView then drops references // to the MenuHost. class MenuHost : public Widget { public: explicit MenuHost(SubmenuView* submenu); ~MenuHost() override; // Initializes and shows the MenuHost. // WARNING: |parent| may be NULL. void InitMenuHost(Widget* parent, const gfx::Rect& bounds, View* contents_view, bool do_capture); // Returns true if the menu host is visible. bool IsMenuHostVisible(); // Shows the menu host. If |do_capture| is true the menu host should do a // mouse grab. void ShowMenuHost(bool do_capture); // Hides the menu host. void HideMenuHost(); // Destroys and deletes the menu host. void DestroyMenuHost(); // Sets the bounds of the menu host. void SetMenuHostBounds(const gfx::Rect& bounds); // Releases a mouse grab installed by |ShowMenuHost|. void ReleaseMenuHostCapture(); private: // Overridden from Widget: internal::RootView* CreateRootView() override; void OnMouseCaptureLost() override; void OnNativeWidgetDestroyed() override; void OnOwnerClosing() override; void OnDragWillStart() override; void OnDragComplete() override; // The view we contain. SubmenuView* submenu_; // If true, DestroyMenuHost has been invoked. bool destroying_; // If true and capture is lost we don't notify the delegate. bool ignore_capture_lost_; #if !defined(OS_MACOSX) // Handles raw touch events at the moment. scoped_ptr pre_dispatch_handler_; #endif DISALLOW_COPY_AND_ASSIGN(MenuHost); }; } // namespace views #endif // UI_VIEWS_CONTROLS_MENU_MENU_HOST_H_