Home | History | Annotate | Download | only in menu
      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::DispatchGestureEvent(ui::GestureEvent* event) {
     59   RootView::DispatchGestureEvent(event);
     60   if (event->handled())
     61     return;
     62   // ChromeOS uses MenuController to forward events like other
     63   // mouse events.
     64   if (!GetMenuController())
     65     return;
     66   GetMenuController()->OnGestureEvent(submenu_, event);
     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
     80