event_dispatcher.h revision f2477e01787aa58f445919b809d89e252beef54f
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_DISPATCHER_H_ 6d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#define UI_EVENTS_EVENT_DISPATCHER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/auto_reset.h" 9d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h" 10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_constants.h" 11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_target.h" 1268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/events/events_export.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class EventDispatcher; 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)struct EventDispatchDetails { 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EventDispatchDetails() 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : dispatcher_destroyed(false), 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) target_destroyed(false) {} 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool dispatcher_destroyed; 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool target_destroyed; 24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class EVENTS_EXPORT EventDispatcherDelegate { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EventDispatcherDelegate(); 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~EventDispatcherDelegate(); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns whether an event can still be dispatched to a target. (e.g. during 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // event dispatch, one of the handlers may have destroyed the target, in which 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // case the event can no longer be dispatched to the target). 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool CanDispatchToTarget(EventTarget* target) = 0; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns the event being dispatched (or NULL if no event is being 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // dispatched). 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Event* current_event(); 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Dispatches the event to the target. Returns true if the delegate is still 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // alive after dispatching event, and false if the delegate was destroyed 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // during the event dispatch. 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EventDispatchDetails DispatchEvent(EventTarget* target, Event* event) 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) WARN_UNUSED_RESULT; 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EventDispatcher* dispatcher_; 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(EventDispatcherDelegate); 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Dispatches events to appropriate targets. 5468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class EVENTS_EXPORT EventDispatcher { 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit EventDispatcher(EventDispatcherDelegate* delegate); 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~EventDispatcher(); 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ProcessEvent(EventTarget* target, Event* event); 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Event* current_event() const { return current_event_; } 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Event* current_event() { return current_event_; } 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool delegate_destroyed() const { return !delegate_; } 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const EventDispatchDetails& details() const { return details_; } 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnHandlerDestroyed(EventHandler* handler); 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnDispatcherDelegateDestroyed(); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) void DispatchEventToEventHandlers(EventHandlerList* list, Event* event); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Dispatches an event, and makes sure it sets ER_CONSUMED on the 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // event-handling result if the dispatcher itself has been destroyed during 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // dispatching the event to the event handler. 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void DispatchEvent(EventHandler* handler, Event* event); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EventDispatcherDelegate* delegate_; 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Event* current_event_; 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EventHandlerList handler_list_; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EventDispatchDetails details_; 85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(EventDispatcher); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ui 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 91d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif // UI_EVENTS_EVENT_DISPATCHER_H_ 92