summaryrefslogtreecommitdiffstats
path: root/views/controls/menu/menu_host_win.cc
diff options
context:
space:
mode:
authorsky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-08-24 15:46:45 +0000
committersky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-08-24 15:46:45 +0000
commita87ecb3c7170caa40810def524fbae1aee4d3533 (patch)
tree947732a745f124feda7ace8ac466cf75c746db62 /views/controls/menu/menu_host_win.cc
parentde1b764f404e5fb6975e7cc9de7120d46e28dcfd (diff)
downloadchromium_src-a87ecb3c7170caa40810def524fbae1aee4d3533.zip
chromium_src-a87ecb3c7170caa40810def524fbae1aee4d3533.tar.gz
chromium_src-a87ecb3c7170caa40810def524fbae1aee4d3533.tar.bz2
Further refactoring of menus for GTK. I've now separated out
everything and menus some what work on GTK. I need to get painting working and I'm sure there will be fine tuning, but I want to check in all this splitting of files before someone else needs change one of these files. Thankfully I wrote an interactive ui test that exercises much of this code, and it still passes:) BUG=none TEST=thoroughly test bookmark menus on windows to make sure I didn't break them. Review URL: http://codereview.chromium.org/174274 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@24098 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'views/controls/menu/menu_host_win.cc')
-rw-r--r--views/controls/menu/menu_host_win.cc114
1 files changed, 114 insertions, 0 deletions
diff --git a/views/controls/menu/menu_host_win.cc b/views/controls/menu/menu_host_win.cc
new file mode 100644
index 0000000..d6fd655
--- /dev/null
+++ b/views/controls/menu/menu_host_win.cc
@@ -0,0 +1,114 @@
+// Copyright (c) 2009 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.
+
+#include "views/controls/menu/menu_host_win.h"
+
+#include "base/win_util.h"
+#include "views/controls/menu/menu_controller.h"
+#include "views/controls/menu/menu_host_root_view.h"
+#include "views/controls/menu/menu_item_view.h"
+#include "views/controls/menu/submenu_view.h"
+
+namespace views {
+
+MenuHost::MenuHost(SubmenuView* submenu)
+ : closed_(false),
+ submenu_(submenu),
+ owns_capture_(false) {
+ set_window_style(WS_POPUP);
+ set_initial_class_style(
+ (win_util::GetWinVersion() < win_util::WINVERSION_XP) ?
+ 0 : CS_DROPSHADOW);
+ is_mouse_down_ =
+ ((GetKeyState(VK_LBUTTON) & 0x80) ||
+ (GetKeyState(VK_RBUTTON) & 0x80) ||
+ (GetKeyState(VK_MBUTTON) & 0x80) ||
+ (GetKeyState(VK_XBUTTON1) & 0x80) ||
+ (GetKeyState(VK_XBUTTON2) & 0x80));
+ // Mouse clicks shouldn't give us focus.
+ 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) {
+ WidgetWin::Init(parent, bounds);
+ SetContentsView(contents_view);
+ Show();
+ owns_capture_ = do_capture;
+ if (do_capture) {
+ SetCapture();
+ has_capture_ = true;
+#ifdef DEBUG_MENU
+ DLOG(INFO) << "Doing capture";
+#endif
+ }
+}
+
+void MenuHost::Show() {
+ // 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();
+}
+
+void MenuHost::HideWindow() {
+ // Make sure we release capture before hiding.
+ ReleaseCapture();
+ WidgetWin::Hide();
+}
+
+void MenuHost::OnCaptureChanged(HWND hwnd) {
+ WidgetWin::OnCaptureChanged(hwnd);
+ owns_capture_ = false;
+#ifdef DEBUG_MENU
+ DLOG(INFO) << "Capture changed";
+#endif
+}
+
+void MenuHost::ReleaseCapture() {
+ if (owns_capture_) {
+#ifdef DEBUG_MENU
+ DLOG(INFO) << "released capture";
+#endif
+ owns_capture_ = false;
+ ::ReleaseCapture();
+ }
+}
+
+RootView* MenuHost::CreateRootView() {
+ return new MenuHostRootView(this, submenu_);
+}
+
+void MenuHost::OnCancelMode() {
+ if (!closed_) {
+#ifdef DEBUG_MENU
+ DLOG(INFO) << "OnCanceMode, closing menu";
+#endif
+ submenu_->GetMenuItem()->GetMenuController()->Cancel(true);
+ }
+}
+
+// Overriden to return false, we do NOT want to release capture on mouse
+// release.
+bool MenuHost::ReleaseCaptureOnMouseReleased() {
+ return false;
+}
+
+} // namespace views