1// Copyright (c) 2013 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/events/event_targeter.h"
6
7#include "ui/events/event.h"
8#include "ui/events/event_target.h"
9#include "ui/events/event_target_iterator.h"
10
11namespace ui {
12
13EventTargeter::~EventTargeter() {
14}
15
16EventTarget* EventTargeter::FindTargetForEvent(EventTarget* root,
17                                               Event* event) {
18  if (event->IsMouseEvent() ||
19      event->IsScrollEvent() ||
20      event->IsTouchEvent() ||
21      event->IsGestureEvent()) {
22    return FindTargetForLocatedEvent(root,
23                                     static_cast<LocatedEvent*>(event));
24  }
25  return root;
26}
27
28EventTarget* EventTargeter::FindTargetForLocatedEvent(EventTarget* root,
29                                                      LocatedEvent* event) {
30  scoped_ptr<EventTargetIterator> iter = root->GetChildIterator();
31  if (iter) {
32    EventTarget* target = root;
33    for (EventTarget* child = iter->GetNextTarget(); child;
34         child = iter->GetNextTarget()) {
35      EventTargeter* targeter = child->GetEventTargeter();
36      if (!targeter)
37        targeter = this;
38      if (!targeter->SubtreeShouldBeExploredForEvent(child, *event))
39        continue;
40      target->ConvertEventToTarget(child, event);
41      target = child;
42      EventTarget* child_target = targeter ?
43          targeter->FindTargetForLocatedEvent(child, event) :
44          FindTargetForLocatedEvent(child, event);
45      if (child_target)
46        return child_target;
47    }
48    target->ConvertEventToTarget(root, event);
49  }
50  return root->CanAcceptEvent(*event) ? root : NULL;
51}
52
53bool EventTargeter::SubtreeShouldBeExploredForEvent(EventTarget* target,
54                                                    const LocatedEvent& event) {
55  return SubtreeCanAcceptEvent(target, event) &&
56         EventLocationInsideBounds(target, event);
57}
58
59EventTarget* EventTargeter::FindNextBestTarget(EventTarget* previous_target,
60                                               Event* event) {
61  return NULL;
62}
63
64bool EventTargeter::SubtreeCanAcceptEvent(EventTarget* target,
65                                          const LocatedEvent& event) const {
66  return true;
67}
68
69bool EventTargeter::EventLocationInsideBounds(EventTarget* target,
70                                              const LocatedEvent& event) const {
71  return true;
72}
73
74}  // namespace ui
75