diff options
Diffstat (limited to 'views/controls/menu/menu_host_win.cc')
-rw-r--r-- | views/controls/menu/menu_host_win.cc | 121 |
1 files changed, 67 insertions, 54 deletions
diff --git a/views/controls/menu/menu_host_win.cc b/views/controls/menu/menu_host_win.cc index f2c2c2c..384229f 100644 --- a/views/controls/menu/menu_host_win.cc +++ b/views/controls/menu/menu_host_win.cc @@ -12,8 +12,13 @@ namespace views { -MenuHost::MenuHost(SubmenuView* submenu) - : closed_(false), +// static +MenuHost* MenuHost::Create(SubmenuView* submenu_view) { + return new MenuHostWin(submenu_view); +} + +MenuHostWin::MenuHostWin(SubmenuView* submenu) + : destroying_(false), submenu_(submenu), owns_capture_(false) { set_window_style(WS_POPUP); @@ -30,88 +35,96 @@ MenuHost::MenuHost(SubmenuView* submenu) set_window_ex_style(WS_EX_TOPMOST | WS_EX_NOACTIVATE); } -void MenuHost::Init(HWND parent, - const gfx::Rect& bounds, - View* contents_view, - bool do_capture) { +MenuHostWin::~MenuHostWin() { +} + +void MenuHostWin::Init(HWND parent, + const gfx::Rect& bounds, + View* contents_view, + bool do_capture) { WidgetWin::Init(parent, bounds); SetContentsView(contents_view); - Show(); - if (do_capture) - DoCapture(); + ShowMenuHost(do_capture); } -void MenuHost::Show() { +bool MenuHostWin::IsMenuHostVisible() { + return IsVisible(); +} + +void MenuHostWin::ShowMenuHost(bool do_capture) { // We don't want to take focus away from the hosting window. ShowWindow(SW_SHOWNA); -} -void MenuHost::Hide() { - if (closed_) { - // We're already closed, nothing to do. - // This is invoked twice if the first time just hid us, and the second - // time deleted Closed (deleted) us. - return; - } - // The menus are freed separately, and possibly before the window is closed, - // remove them so that View doesn't try to access deleted objects. - static_cast<MenuHostRootView*>(GetRootView())->suspend_events(); - GetRootView()->RemoveAllChildViews(false); - closed_ = true; - ReleaseCapture(); - WidgetWin::Hide(); + if (do_capture) + DoCapture(); } -void MenuHost::HideWindow() { +void MenuHostWin::HideMenuHost() { // Make sure we release capture before hiding. - ReleaseCapture(); + ReleaseMenuHostCapture(); + WidgetWin::Hide(); } -void MenuHost::OnCaptureChanged(HWND hwnd) { - WidgetWin::OnCaptureChanged(hwnd); - owns_capture_ = false; -#ifdef DEBUG_MENU - DLOG(INFO) << "Capture changed"; -#endif +void MenuHostWin::DestroyMenuHost() { + HideMenuHost(); + destroying_ = true; + CloseNow(); } -void MenuHost::DoCapture() { - owns_capture_ = true; - SetCapture(); - has_capture_ = true; -#ifdef DEBUG_MENU - DLOG(INFO) << "Doing capture"; -#endif +void MenuHostWin::SetMenuHostBounds(const gfx::Rect& bounds) { + SetBounds(bounds); } -void MenuHost::ReleaseCapture() { +void MenuHostWin::ReleaseMenuHostCapture() { if (owns_capture_) { -#ifdef DEBUG_MENU - DLOG(INFO) << "released capture"; -#endif owns_capture_ = false; ::ReleaseCapture(); } } -RootView* MenuHost::CreateRootView() { - return new MenuHostRootView(this, submenu_); +gfx::NativeWindow MenuHostWin::GetMenuHostWindow() { + return GetNativeView(); +} + +void MenuHostWin::OnDestroy() { + if (!destroying_) { + // We weren't explicitly told to destroy ourselves, which means the menu was + // deleted out from under us (the window we're parented to was closed). Tell + // the SubmenuView to drop references to us. + submenu_->MenuHostDestroyed(); + } + WidgetWin::OnDestroy(); } -void MenuHost::OnCancelMode() { - if (!closed_) { +void MenuHostWin::OnCaptureChanged(HWND hwnd) { + WidgetWin::OnCaptureChanged(hwnd); + owns_capture_ = false; #ifdef DEBUG_MENU - DLOG(INFO) << "OnCanceMode, closing menu"; + DLOG(INFO) << "Capture changed"; #endif - submenu_->GetMenuItem()->GetMenuController()->Cancel(true); - } } -// Overriden to return false, we do NOT want to release capture on mouse -// release. -bool MenuHost::ReleaseCaptureOnMouseReleased() { +void MenuHostWin::OnCancelMode() { + submenu_->GetMenuItem()->GetMenuController()->Cancel( + MenuController::EXIT_ALL); +} + +RootView* MenuHostWin::CreateRootView() { + return new MenuHostRootView(this, submenu_); +} + +bool MenuHostWin::ReleaseCaptureOnMouseReleased() { return false; } +void MenuHostWin::DoCapture() { + owns_capture_ = true; + SetCapture(); + has_capture_ = true; +#ifdef DEBUG_MENU + DLOG(INFO) << "Doing capture"; +#endif +} + } // namespace views |