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