• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 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/view_targeter.h"
6 
7 #include "ui/events/event_target.h"
8 #include "ui/views/focus/focus_manager.h"
9 #include "ui/views/view.h"
10 
11 namespace views {
12 
ViewTargeter()13 ViewTargeter::ViewTargeter() {}
~ViewTargeter()14 ViewTargeter::~ViewTargeter() {}
15 
BoundsForEvent(const ui::LocatedEvent & event) const16 gfx::RectF ViewTargeter::BoundsForEvent(const ui::LocatedEvent& event) const {
17   gfx::RectF event_bounds(event.location_f(), gfx::SizeF(1, 1));
18   if (event.IsGestureEvent()) {
19     const ui::GestureEvent& gesture =
20         static_cast<const ui::GestureEvent&>(event);
21     event_bounds = gesture.details().bounding_box_f();
22   }
23 
24   return event_bounds;
25 }
26 
FindTargetForEvent(ui::EventTarget * root,ui::Event * event)27 ui::EventTarget* ViewTargeter::FindTargetForEvent(ui::EventTarget* root,
28                                                   ui::Event* event) {
29   View* view = static_cast<View*>(root);
30   if (event->IsKeyEvent())
31     return FindTargetForKeyEvent(view, *static_cast<ui::KeyEvent*>(event));
32   else if (event->IsScrollEvent())
33     return EventTargeter::FindTargetForEvent(root, event);
34 
35   NOTREACHED() << "ViewTargeter does not yet support this event type.";
36   return NULL;
37 }
38 
FindNextBestTarget(ui::EventTarget * previous_target,ui::Event * event)39 ui::EventTarget* ViewTargeter::FindNextBestTarget(
40     ui::EventTarget* previous_target,
41     ui::Event* event) {
42   return previous_target->GetParentTarget();
43 }
44 
SubtreeCanAcceptEvent(ui::EventTarget * target,const ui::LocatedEvent & event) const45 bool ViewTargeter::SubtreeCanAcceptEvent(
46     ui::EventTarget* target,
47     const ui::LocatedEvent& event) const {
48   views::View* view = static_cast<views::View*>(target);
49   if (!view->visible())
50     return false;
51 
52   if (!view->CanProcessEventsWithinSubtree())
53     return false;
54 
55   return true;
56 }
57 
EventLocationInsideBounds(ui::EventTarget * target,const ui::LocatedEvent & event) const58 bool ViewTargeter::EventLocationInsideBounds(
59     ui::EventTarget* target,
60     const ui::LocatedEvent& event) const {
61   views::View* view = static_cast<views::View*>(target);
62   gfx::Rect rect(event.location(), gfx::Size(1, 1));
63   gfx::RectF rect_in_view_coords_f(rect);
64   if (view->parent())
65     View::ConvertRectToTarget(view->parent(), view, &rect_in_view_coords_f);
66   gfx::Rect rect_in_view_coords = gfx::ToEnclosingRect(rect_in_view_coords_f);
67 
68   // TODO(tdanderson): Don't call into HitTestRect() directly here.
69   //                   See crbug.com/370579.
70   return view->HitTestRect(rect_in_view_coords);
71 }
72 
FindTargetForKeyEvent(View * view,const ui::KeyEvent & key)73 View* ViewTargeter::FindTargetForKeyEvent(View* view, const ui::KeyEvent& key) {
74   if (view->GetFocusManager())
75     return view->GetFocusManager()->GetFocusedView();
76   return NULL;
77 }
78 
79 }  // namespace aura
80