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)#ifndef UI_EVENTS_EVENT_TARGET_H_ 6d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#define UI_EVENTS_EVENT_TARGET_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include <vector> 9a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 13d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_handler.h" 1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/events/events_export.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class EventDispatcher; 19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class EventTargeter; 20a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class EventTargetIterator; 21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class LocatedEvent; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class EVENTS_EXPORT EventTarget : public EventHandler { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class DispatcherApi { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit DispatcherApi(EventTarget* target) : target_(target) {} 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const EventHandlerList& pre_target_list() const { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return target_->pre_target_list_; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DispatcherApi(); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EventTarget* target_; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DispatcherApi); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EventTarget(); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~EventTarget(); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual bool CanAcceptEvent(const Event& event) = 0; 44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Returns the parent EventTarget in the event-target tree. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual EventTarget* GetParentTarget() = 0; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Returns an iterator an EventTargeter can use to iterate over the list of 49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // child EventTargets. 50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual scoped_ptr<EventTargetIterator> GetChildIterator() const = 0; 51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Returns the EventTargeter that should be used to find the target for an 53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // event in the subtree rooted at this EventTarget. 54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual EventTargeter* GetEventTargeter() = 0; 55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Updates the states in |event| (e.g. location) to be suitable for |target|, 57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // so that |event| can be dispatched to |target|. 58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void ConvertEventToTarget(EventTarget* target, 59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LocatedEvent* event); 60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds a handler to receive events before the target. The handler must be 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // explicitly removed from the target before the handler is destroyed. The 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // EventTarget does not take ownership of the handler. 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddPreTargetHandler(EventHandler* handler); 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Same as AddPreTargetHandler except that the |handler| is added to the front 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // of the list so it is the first one to receive events. 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void PrependPreTargetHandler(EventHandler* handler); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RemovePreTargetHandler(EventHandler* handler); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds a handler to receive events after the target. The handler must be 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // explicitly removed from the target before the handler is destroyed. The 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // EventTarget does not take ownership of the handler. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddPostTargetHandler(EventHandler* handler); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RemovePostTargetHandler(EventHandler* handler); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Returns true if the event pre target list is empty. 784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool IsPreTargetListEmpty() const; 794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_target_handler(EventHandler* handler) { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_handler_ = handler; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) protected: 8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EventHandler* target_handler() { return target_handler_; } 8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from EventHandler: 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnEvent(Event* event) OVERRIDE; 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnKeyEvent(KeyEvent* event) OVERRIDE; 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnMouseEvent(MouseEvent* event) OVERRIDE; 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnScrollEvent(ScrollEvent* event) OVERRIDE; 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnTouchEvent(TouchEvent* event) OVERRIDE; 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnGestureEvent(GestureEvent* event) OVERRIDE; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class EventDispatcher; 97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) friend class EventTargetTestApi; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the list of handlers that should receive the event before the 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // target. The handlers from the outermost target are first in the list, and 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the handlers on |this| are the last in the list. 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GetPreTargetHandlers(EventHandlerList* list); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the list of handlers that should receive the event after the 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // target. The handlers from the outermost target are last in the list, and 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the handlers on |this| are the first in the list. 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GetPostTargetHandlers(EventHandlerList* list); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EventHandlerList pre_target_list_; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EventHandlerList post_target_list_; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EventHandler* target_handler_; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(EventTarget); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ui 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 118d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif // UI_EVENTS_EVENT_TARGET_H_ 119