event_target.cc revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_target.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EventTarget::EventTarget()
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : target_handler_(NULL) {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EventTarget::~EventTarget() {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void EventTarget::AddPreTargetHandler(EventHandler* handler) {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pre_target_list_.push_back(handler);
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void EventTarget::PrependPreTargetHandler(EventHandler* handler) {
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pre_target_list_.insert(pre_target_list_.begin(), handler);
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void EventTarget::RemovePreTargetHandler(EventHandler* handler) {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EventHandlerList::iterator find =
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::find(pre_target_list_.begin(),
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                pre_target_list_.end(),
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                handler);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (find != pre_target_list_.end())
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pre_target_list_.erase(find);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void EventTarget::AddPostTargetHandler(EventHandler* handler) {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  post_target_list_.push_back(handler);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void EventTarget::RemovePostTargetHandler(EventHandler* handler) {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EventHandlerList::iterator find =
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::find(post_target_list_.begin(),
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                post_target_list_.end(),
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                handler);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (find != post_target_list_.end())
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    post_target_list_.erase(find);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool EventTarget::IsPreTargetListEmpty() const {
524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return pre_target_list_.empty();
534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void EventTarget::OnEvent(Event* event) {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK_EQ(this, event->target());
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (target_handler_)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    target_handler_->OnEvent(event);
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EventHandler::OnEvent(event);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void EventTarget::OnKeyEvent(KeyEvent* event) {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK_EQ(this, event->target());
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (target_handler_)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    target_handler_->OnKeyEvent(event);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void EventTarget::OnMouseEvent(MouseEvent* event) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK_EQ(this, event->target());
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (target_handler_)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    target_handler_->OnMouseEvent(event);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void EventTarget::OnScrollEvent(ScrollEvent* event) {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK_EQ(this, event->target());
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (target_handler_)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    target_handler_->OnScrollEvent(event);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void EventTarget::OnTouchEvent(TouchEvent* event) {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK_EQ(this, event->target());
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (target_handler_)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    target_handler_->OnTouchEvent(event);
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void EventTarget::OnGestureEvent(GestureEvent* event) {
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK_EQ(this, event->target());
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (target_handler_)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    target_handler_->OnGestureEvent(event);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void EventTarget::GetPreTargetHandlers(EventHandlerList* list) {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EventTarget* target = this;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (target) {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EventHandlerList::reverse_iterator it, rend;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (it = target->pre_target_list_.rbegin(),
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            rend = target->pre_target_list_.rend();
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        it != rend;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ++it) {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      list->insert(list->begin(), *it);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    target = target->GetParentTarget();
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void EventTarget::GetPostTargetHandlers(EventHandlerList* list) {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EventTarget* target = this;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (target) {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (EventHandlerList::iterator it = target->post_target_list_.begin(),
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        end = target->post_target_list_.end(); it != end; ++it) {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      list->push_back(*it);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    target = target->GetParentTarget();
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ui
119