event_dispatcher.h revision d0247b1b59f9c528cb6df88b4f2b9afaf80d181e
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"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/ui_export.h"
10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h"
11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_constants.h"
12d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_target.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class EventDispatcher;
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class UI_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.
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class UI_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