• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
16 namespace ui {
17 
18 class EventDispatcher;
19 class EventTargeter;
20 class EventTargetIterator;
21 class LocatedEvent;
22 
23 class EVENTS_EXPORT EventTarget : public EventHandler {
24  public:
25   class DispatcherApi {
26    public:
DispatcherApi(EventTarget * target)27     explicit DispatcherApi(EventTarget* target) : target_(target) {}
28 
pre_target_list()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 
set_target_handler(EventHandler * handler)80   void set_target_handler(EventHandler* handler) {
81     target_handler_ = handler;
82   }
83 
84  protected:
target_handler()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