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/base/events/event_target.h"
6
7#include <algorithm>
8
9#include "base/logging.h"
10#include "ui/base/events/event.h"
11
12namespace ui {
13
14EventTarget::EventTarget()
15    : target_handler_(NULL) {
16}
17
18EventTarget::~EventTarget() {
19}
20
21void EventTarget::AddPreTargetHandler(EventHandler* handler) {
22  pre_target_list_.push_back(handler);
23}
24
25void EventTarget::PrependPreTargetHandler(EventHandler* handler) {
26  pre_target_list_.insert(pre_target_list_.begin(), handler);
27}
28
29void EventTarget::RemovePreTargetHandler(EventHandler* handler) {
30  EventHandlerList::iterator find =
31      std::find(pre_target_list_.begin(),
32                pre_target_list_.end(),
33                handler);
34  if (find != pre_target_list_.end())
35    pre_target_list_.erase(find);
36}
37
38void EventTarget::AddPostTargetHandler(EventHandler* handler) {
39  post_target_list_.push_back(handler);
40}
41
42void EventTarget::RemovePostTargetHandler(EventHandler* handler) {
43  EventHandlerList::iterator find =
44      std::find(post_target_list_.begin(),
45                post_target_list_.end(),
46                handler);
47  if (find != post_target_list_.end())
48    post_target_list_.erase(find);
49}
50
51void EventTarget::OnEvent(Event* event) {
52  CHECK_EQ(this, event->target());
53  if (target_handler_)
54    target_handler_->OnEvent(event);
55  else
56    EventHandler::OnEvent(event);
57}
58
59void EventTarget::OnKeyEvent(KeyEvent* event) {
60  CHECK_EQ(this, event->target());
61  if (target_handler_)
62    target_handler_->OnKeyEvent(event);
63}
64
65void EventTarget::OnMouseEvent(MouseEvent* event) {
66  CHECK_EQ(this, event->target());
67  if (target_handler_)
68    target_handler_->OnMouseEvent(event);
69}
70
71void EventTarget::OnScrollEvent(ScrollEvent* event) {
72  CHECK_EQ(this, event->target());
73  if (target_handler_)
74    target_handler_->OnScrollEvent(event);
75}
76
77void EventTarget::OnTouchEvent(TouchEvent* event) {
78  CHECK_EQ(this, event->target());
79  if (target_handler_)
80    target_handler_->OnTouchEvent(event);
81}
82
83void EventTarget::OnGestureEvent(GestureEvent* event) {
84  CHECK_EQ(this, event->target());
85  if (target_handler_)
86    target_handler_->OnGestureEvent(event);
87}
88
89void EventTarget::GetPreTargetHandlers(EventHandlerList* list) {
90  EventTarget* target = this;
91  while (target) {
92    EventHandlerList::reverse_iterator it, rend;
93    for (it = target->pre_target_list_.rbegin(),
94            rend = target->pre_target_list_.rend();
95        it != rend;
96        ++it) {
97      list->insert(list->begin(), *it);
98    }
99    target = target->GetParentTarget();
100  }
101}
102
103void EventTarget::GetPostTargetHandlers(EventHandlerList* list) {
104  EventTarget* target = this;
105  while (target) {
106    for (EventHandlerList::iterator it = target->post_target_list_.begin(),
107        end = target->post_target_list_.end(); it != end; ++it) {
108      list->push_back(*it);
109    }
110    target = target->GetParentTarget();
111  }
112}
113
114}  // namespace ui
115