1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef UI_EVENTS_EVENT_TARGET_H_
6#define UI_EVENTS_EVENT_TARGET_H_
7
8#include <vector>
9
10#include "base/basictypes.h"
11#include "base/compiler_specific.h"
12#include "base/memory/scoped_ptr.h"
13#include "ui/events/event_handler.h"
14#include "ui/events/events_export.h"
15
16namespace ui {
17
18class EventDispatcher;
19class EventTargeter;
20class EventTargetIterator;
21class LocatedEvent;
22
23class EVENTS_EXPORT EventTarget : public EventHandler {
24 public:
25  class DispatcherApi {
26   public:
27    explicit DispatcherApi(EventTarget* target) : target_(target) {}
28
29    const EventHandlerList& pre_target_list() const {
30      return target_->pre_target_list_;
31    }
32
33   private:
34    DispatcherApi();
35    EventTarget* target_;
36
37    DISALLOW_COPY_AND_ASSIGN(DispatcherApi);
38  };
39
40  EventTarget();
41  virtual ~EventTarget();
42
43  virtual bool CanAcceptEvent(const Event& event) = 0;
44
45  // Returns the parent EventTarget in the event-target tree.
46  virtual EventTarget* GetParentTarget() = 0;
47
48  // Returns an iterator an EventTargeter can use to iterate over the list of
49  // child EventTargets.
50  virtual scoped_ptr<EventTargetIterator> GetChildIterator() const = 0;
51
52  // Returns the EventTargeter that should be used to find the target for an
53  // event in the subtree rooted at this EventTarget.
54  virtual EventTargeter* GetEventTargeter() = 0;
55
56  // Updates the states in |event| (e.g. location) to be suitable for |target|,
57  // so that |event| can be dispatched to |target|.
58  virtual void ConvertEventToTarget(EventTarget* target,
59                                    LocatedEvent* event);
60
61  // Adds a handler to receive events before the target. The handler must be
62  // explicitly removed from the target before the handler is destroyed. The
63  // EventTarget does not take ownership of the handler.
64  void AddPreTargetHandler(EventHandler* handler);
65
66  // Same as AddPreTargetHandler except that the |handler| is added to the front
67  // of the list so it is the first one to receive events.
68  void PrependPreTargetHandler(EventHandler* handler);
69  void RemovePreTargetHandler(EventHandler* handler);
70
71  // Adds a handler to receive events after the target. The handler must be
72  // explicitly removed from the target before the handler is destroyed. The
73  // EventTarget does not take ownership of the handler.
74  void AddPostTargetHandler(EventHandler* handler);
75  void RemovePostTargetHandler(EventHandler* handler);
76
77  // Returns true if the event pre target list is empty.
78  bool IsPreTargetListEmpty() const;
79
80  void set_target_handler(EventHandler* handler) {
81    target_handler_ = handler;
82  }
83
84 protected:
85  EventHandler* target_handler() { return target_handler_; }
86
87  // Overridden from EventHandler:
88  virtual void OnEvent(Event* event) OVERRIDE;
89  virtual void OnKeyEvent(KeyEvent* event) OVERRIDE;
90  virtual void OnMouseEvent(MouseEvent* event) OVERRIDE;
91  virtual void OnScrollEvent(ScrollEvent* event) OVERRIDE;
92  virtual void OnTouchEvent(TouchEvent* event) OVERRIDE;
93  virtual void OnGestureEvent(GestureEvent* event) OVERRIDE;
94
95 private:
96  friend class EventDispatcher;
97  friend class EventTargetTestApi;
98
99  // Returns the list of handlers that should receive the event before the
100  // target. The handlers from the outermost target are first in the list, and
101  // the handlers on |this| are the last in the list.
102  void GetPreTargetHandlers(EventHandlerList* list);
103
104  // Returns the list of handlers that should receive the event after the
105  // target. The handlers from the outermost target are last in the list, and
106  // the handlers on |this| are the first in the list.
107  void GetPostTargetHandlers(EventHandlerList* list);
108
109  EventHandlerList pre_target_list_;
110  EventHandlerList post_target_list_;
111  EventHandler* target_handler_;
112
113  DISALLOW_COPY_AND_ASSIGN(EventTarget);
114};
115
116}  // namespace ui
117
118#endif  // UI_EVENTS_EVENT_TARGET_H_
119