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"
10 #include "ui/views/view_targeter_delegate.h"
14 ViewTargeter::ViewTargeter(ViewTargeterDelegate
* delegate
)
15 : delegate_(delegate
) {
19 ViewTargeter::~ViewTargeter() {}
21 bool ViewTargeter::DoesIntersectRect(const View
* target
,
22 const gfx::Rect
& rect
) const {
23 return delegate_
->DoesIntersectRect(target
, rect
);
26 View
* ViewTargeter::TargetForRect(View
* root
, const gfx::Rect
& rect
) const {
27 return delegate_
->TargetForRect(root
, rect
);
30 ui::EventTarget
* ViewTargeter::FindTargetForEvent(ui::EventTarget
* root
,
32 View
* view
= static_cast<View
*>(root
);
34 if (event
->IsKeyEvent())
35 return FindTargetForKeyEvent(view
, *static_cast<ui::KeyEvent
*>(event
));
37 if (event
->IsScrollEvent()) {
38 return FindTargetForScrollEvent(view
,
39 *static_cast<ui::ScrollEvent
*>(event
));
42 if (event
->IsGestureEvent()) {
43 ui::GestureEvent
* gesture
= event
->AsGestureEvent();
44 View
* gesture_target
= FindTargetForGestureEvent(view
, *gesture
);
45 root
->ConvertEventToTarget(gesture_target
, gesture
);
46 return gesture_target
;
49 NOTREACHED() << "ViewTargeter does not yet support this event type.";
53 ui::EventTarget
* ViewTargeter::FindNextBestTarget(
54 ui::EventTarget
* previous_target
,
59 if (event
->IsGestureEvent()) {
60 ui::GestureEvent
* gesture
= event
->AsGestureEvent();
61 ui::EventTarget
* next_target
=
62 FindNextBestTargetForGestureEvent(previous_target
, *gesture
);
63 previous_target
->ConvertEventToTarget(next_target
, gesture
);
67 return previous_target
->GetParentTarget();
70 bool ViewTargeter::SubtreeCanAcceptEvent(
71 ui::EventTarget
* target
,
72 const ui::LocatedEvent
& event
) const {
77 bool ViewTargeter::EventLocationInsideBounds(
78 ui::EventTarget
* target
,
79 const ui::LocatedEvent
& event
) const {
84 View
* ViewTargeter::FindTargetForKeyEvent(View
* root
, const ui::KeyEvent
& key
) {
85 if (root
->GetFocusManager())
86 return root
->GetFocusManager()->GetFocusedView();
90 View
* ViewTargeter::FindTargetForScrollEvent(View
* root
,
91 const ui::ScrollEvent
& scroll
) {
92 gfx::Rect
rect(scroll
.location(), gfx::Size(1, 1));
93 return root
->GetEffectiveViewTargeter()->TargetForRect(root
, rect
);
96 View
* ViewTargeter::FindTargetForGestureEvent(View
* root
,
97 const ui::GestureEvent
& gesture
) {
98 // TODO(tdanderson): The only code path that performs targeting for gestures
99 // uses the ViewTargeter installed on the RootView (i.e.,
100 // a RootViewTargeter). Provide a default implementation
101 // here if we need to be able to perform gesture targeting
102 // starting at an arbitrary node in a Views tree.
107 ui::EventTarget
* ViewTargeter::FindNextBestTargetForGestureEvent(
108 ui::EventTarget
* previous_target
,
109 const ui::GestureEvent
& gesture
) {