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.
5 #include "ui/views/view_targeter.h"
7 #include "ui/events/event_target.h"
8 #include "ui/views/focus/focus_manager.h"
9 #include "ui/views/view.h"
13 ViewTargeter::ViewTargeter() {}
14 ViewTargeter::~ViewTargeter() {}
16 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();
27 ui::EventTarget
* ViewTargeter::FindTargetForEvent(ui::EventTarget
* root
,
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
);
35 NOTREACHED() << "ViewTargeter does not yet support this event type.";
39 ui::EventTarget
* ViewTargeter::FindNextBestTarget(
40 ui::EventTarget
* previous_target
,
42 return previous_target
->GetParentTarget();
45 bool ViewTargeter::SubtreeCanAcceptEvent(
46 ui::EventTarget
* target
,
47 const ui::LocatedEvent
& event
) const {
48 views::View
* view
= static_cast<views::View
*>(target
);
52 if (!view
->CanProcessEventsWithinSubtree())
58 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
);
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
);
68 // TODO(tdanderson): Don't call into HitTestRect() directly here.
69 // See crbug.com/370579.
70 return view
->HitTestRect(rect_in_view_coords
);
73 View
* ViewTargeter::FindTargetForKeyEvent(View
* view
, const ui::KeyEvent
& key
) {
74 if (view
->GetFocusManager())
75 return view
->GetFocusManager()->GetFocusedView();