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