1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef UI_VIEWS_CONTROLS_MENU_MENU_HOST_H_ 6 #define UI_VIEWS_CONTROLS_MENU_MENU_HOST_H_ 7 8 #include "base/compiler_specific.h" 9 #include "ui/gfx/rect.h" 10 #include "ui/views/widget/widget.h" 11 12 namespace views { 13 14 class NativeWidget; 15 class SubmenuView; 16 class View; 17 class Widget; 18 19 // SubmenuView uses a MenuHost to house the SubmenuView. 20 // 21 // SubmenuView owns the MenuHost. When SubmenuView is done with the MenuHost 22 // |DestroyMenuHost| is invoked. The one exception to this is if the native 23 // OS destroys the widget out from under us, in which case |MenuHostDestroyed| 24 // is invoked back on the SubmenuView and the SubmenuView then drops references 25 // to the MenuHost. 26 class MenuHost : public Widget { 27 public: 28 explicit MenuHost(SubmenuView* submenu); 29 virtual ~MenuHost(); 30 31 // Initializes and shows the MenuHost. 32 // WARNING: |parent| may be NULL. 33 void InitMenuHost(Widget* parent, 34 const gfx::Rect& bounds, 35 View* contents_view, 36 bool do_capture); 37 38 // Returns true if the menu host is visible. 39 bool IsMenuHostVisible(); 40 41 // Shows the menu host. If |do_capture| is true the menu host should do a 42 // mouse grab. 43 void ShowMenuHost(bool do_capture); 44 45 // Hides the menu host. 46 void HideMenuHost(); 47 48 // Destroys and deletes the menu host. 49 void DestroyMenuHost(); 50 51 // Sets the bounds of the menu host. 52 void SetMenuHostBounds(const gfx::Rect& bounds); 53 54 // Releases a mouse grab installed by |ShowMenuHost|. 55 void ReleaseMenuHostCapture(); 56 57 private: 58 // Overridden from Widget: 59 virtual internal::RootView* CreateRootView() OVERRIDE; 60 virtual void OnMouseCaptureLost() OVERRIDE; 61 virtual void OnNativeWidgetDestroyed() OVERRIDE; 62 virtual void OnOwnerClosing() OVERRIDE; 63 64 // The view we contain. 65 SubmenuView* submenu_; 66 67 // If true, DestroyMenuHost has been invoked. 68 bool destroying_; 69 70 // If true and capture is lost we don't notify the delegate. 71 bool ignore_capture_lost_; 72 73 DISALLOW_COPY_AND_ASSIGN(MenuHost); 74 }; 75 76 } // namespace views 77 78 #endif // UI_VIEWS_CONTROLS_MENU_MENU_HOST_H_ 79