event_dispatcher.h revision 68043e1e95eeb07d5cae7aca370b26518b0867d6
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) 1868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class EVENTS_EXPORT EventDispatcherDelegate { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EventDispatcherDelegate(); 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~EventDispatcherDelegate(); 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns whether an event can still be dispatched to a target. (e.g. during 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // event dispatch, one of the handlers may have destroyed the target, in which 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // case the event can no longer be dispatched to the target). 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool CanDispatchToTarget(EventTarget* target) = 0; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns the event being dispatched (or NULL if no event is being 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // dispatched). 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Event* current_event(); 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Dispatches the event to the target. Returns true if the delegate is still 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // alive after dispatching event, and false if the delegate was destroyed 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // during the event dispatch. 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool DispatchEvent(EventTarget* target, Event* event); 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EventDispatcher* dispatcher_; 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(EventDispatcherDelegate); 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Dispatches events to appropriate targets. 4568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class EVENTS_EXPORT EventDispatcher { 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit EventDispatcher(EventDispatcherDelegate* delegate); 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~EventDispatcher(); 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ProcessEvent(EventTarget* target, Event* event); 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Event* current_event() const { return current_event_; } 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Event* current_event() { return current_event_; } 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool delegate_destroyed() const { return !delegate_; } 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnHandlerDestroyed(EventHandler* handler); 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnDispatcherDelegateDestroyed(); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void DispatchEventToEventHandlers(EventHandlerList& list, 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Event* event); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Dispatches an event, and makes sure it sets ER_CONSUMED on the 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // event-handling result if the dispatcher itself has been destroyed during 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // dispatching the event to the event handler. 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void DispatchEvent(EventHandler* handler, Event* event); 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EventDispatcherDelegate* delegate_; 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Event* current_event_; 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EventHandlerList handler_list_; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(EventDispatcher); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ui 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 80d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif // UI_EVENTS_EVENT_DISPATCHER_H_ 81