Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / ui / views / controls / menu / menu_host_root_view.cc
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 #include "ui/views/controls/menu/menu_host_root_view.h"
6
7 #include "ui/views/controls/menu/menu_controller.h"
8 #include "ui/views/controls/menu/menu_item_view.h"
9 #include "ui/views/controls/menu/submenu_view.h"
10
11 namespace views {
12
13 MenuHostRootView::MenuHostRootView(Widget* widget,
14                                    SubmenuView* submenu)
15     : internal::RootView(widget),
16       submenu_(submenu),
17       forward_drag_to_menu_controller_(true) {
18 }
19
20 bool MenuHostRootView::OnMousePressed(const ui::MouseEvent& event) {
21   forward_drag_to_menu_controller_ =
22       !GetLocalBounds().Contains(event.location()) ||
23       !RootView::OnMousePressed(event) ||
24       DoesEventTargetEmptyMenuItem(event);
25
26   if (forward_drag_to_menu_controller_ && GetMenuController())
27     GetMenuController()->OnMousePressed(submenu_, event);
28   return true;
29 }
30
31 bool MenuHostRootView::OnMouseDragged(const ui::MouseEvent& event) {
32   if (forward_drag_to_menu_controller_ && GetMenuController()) {
33     GetMenuController()->OnMouseDragged(submenu_, event);
34     return true;
35   }
36   return RootView::OnMouseDragged(event);
37 }
38
39 void MenuHostRootView::OnMouseReleased(const ui::MouseEvent& event) {
40   RootView::OnMouseReleased(event);
41   if (forward_drag_to_menu_controller_ && GetMenuController()) {
42     forward_drag_to_menu_controller_ = false;
43     GetMenuController()->OnMouseReleased(submenu_, event);
44   }
45 }
46
47 void MenuHostRootView::OnMouseMoved(const ui::MouseEvent& event) {
48   RootView::OnMouseMoved(event);
49   if (GetMenuController())
50     GetMenuController()->OnMouseMoved(submenu_, event);
51 }
52
53 bool MenuHostRootView::OnMouseWheel(const ui::MouseWheelEvent& event) {
54   return GetMenuController() &&
55       GetMenuController()->OnMouseWheel(submenu_, event);
56 }
57
58 void MenuHostRootView::OnEventProcessingFinished(ui::Event* event) {
59   RootView::OnEventProcessingFinished(event);
60
61   // Forward unhandled gesture events to our menu controller.
62   // TODO(tdanderson): Investigate whether this should be moved into a
63   //                   post-target handler installed on |this| instead
64   //                   (invoked only if event->target() == this).
65   if (event->IsGestureEvent() && !event->handled() && GetMenuController())
66     GetMenuController()->OnGestureEvent(submenu_, event->AsGestureEvent());
67 }
68
69 MenuController* MenuHostRootView::GetMenuController() {
70   return submenu_ ? submenu_->GetMenuItem()->GetMenuController() : NULL;
71 }
72
73 bool MenuHostRootView::DoesEventTargetEmptyMenuItem(
74     const ui::MouseEvent& event) {
75   View* view = GetEventHandlerForPoint(event.location());
76   return view && view->id() == MenuItemView::kEmptyMenuItemViewID;
77 }
78
79 }  // namespace views