|
1 |
|
2 /* |
|
3 * Copyright 2006 The Android Open Source Project |
|
4 * |
|
5 * Use of this source code is governed by a BSD-style license that can be |
|
6 * found in the LICENSE file. |
|
7 */ |
|
8 |
|
9 |
|
10 #ifndef SkEventSink_DEFINED |
|
11 #define SkEventSink_DEFINED |
|
12 |
|
13 #include "SkRefCnt.h" |
|
14 #include "SkEvent.h" |
|
15 |
|
16 struct SkTagList; |
|
17 |
|
18 /** \class SkEventSink |
|
19 |
|
20 SkEventSink is the base class for all objects that receive SkEvents. |
|
21 */ |
|
22 class SkEventSink : public SkRefCnt { |
|
23 public: |
|
24 SK_DECLARE_INST_COUNT(SkEventSink) |
|
25 |
|
26 SkEventSink(); |
|
27 virtual ~SkEventSink(); |
|
28 |
|
29 /** |
|
30 * Returns this eventsink's unique ID. Use this to post SkEvents to |
|
31 * this eventsink. |
|
32 */ |
|
33 SkEventSinkID getSinkID() const { return fID; } |
|
34 |
|
35 /** |
|
36 * Call this to pass an event to this object for processing. Returns true if the |
|
37 * event was handled. |
|
38 */ |
|
39 bool doEvent(const SkEvent&); |
|
40 |
|
41 /** Returns true if the sink (or one of its subclasses) understands the event as a query. |
|
42 If so, the sink may modify the event to communicate its "answer". |
|
43 */ |
|
44 bool doQuery(SkEvent* query); |
|
45 |
|
46 /** |
|
47 * Add sinkID to the list of listeners, to receive events from calls to sendToListeners() |
|
48 * and postToListeners(). If sinkID already exists in the listener list, no change is made. |
|
49 */ |
|
50 void addListenerID(SkEventSinkID sinkID); |
|
51 |
|
52 /** |
|
53 * Copy listeners from one event sink to another, typically from parent to child. |
|
54 * @param from the event sink to copy the listeners from |
|
55 */ |
|
56 void copyListeners(const SkEventSink& from); |
|
57 |
|
58 /** |
|
59 * Remove sinkID from the list of listeners. If sinkID does not appear in the list, |
|
60 * no change is made. |
|
61 */ |
|
62 void removeListenerID(SkEventSinkID); |
|
63 |
|
64 /** |
|
65 * Returns true if there are 1 or more listeners attached to this eventsink |
|
66 */ |
|
67 bool hasListeners() const; |
|
68 |
|
69 /** |
|
70 * Posts a copy of evt to each of the eventsinks in the lisener list. |
|
71 * This ignores the targetID and target proc in evt. |
|
72 */ |
|
73 void postToListeners(const SkEvent& evt, SkMSec delay = 0); |
|
74 |
|
75 enum EventResult { |
|
76 kHandled_EventResult, //!< the eventsink returned true from its doEvent method |
|
77 kNotHandled_EventResult, //!< the eventsink returned false from its doEvent method |
|
78 kSinkNotFound_EventResult //!< no matching eventsink was found for the event's getSink(). |
|
79 }; |
|
80 |
|
81 /** |
|
82 * DoEvent handles dispatching the event to its target ID or proc. |
|
83 */ |
|
84 static EventResult DoEvent(const SkEvent&); |
|
85 |
|
86 /** |
|
87 * Returns the matching eventsink, or null if not found |
|
88 */ |
|
89 static SkEventSink* FindSink(SkEventSinkID); |
|
90 |
|
91 protected: |
|
92 /** Override this to handle events in your subclass. Be sure to call the inherited version |
|
93 for events that you don't handle. |
|
94 */ |
|
95 virtual bool onEvent(const SkEvent&); |
|
96 virtual bool onQuery(SkEvent*); |
|
97 |
|
98 SkTagList* findTagList(U8CPU tag) const; |
|
99 void addTagList(SkTagList*); |
|
100 void removeTagList(U8CPU tag); |
|
101 |
|
102 private: |
|
103 SkEventSinkID fID; |
|
104 SkTagList* fTagHead; |
|
105 |
|
106 // for our private link-list |
|
107 SkEventSink* fNextSink; |
|
108 |
|
109 typedef SkRefCnt INHERITED; |
|
110 }; |
|
111 |
|
112 #endif |