gfx/skia/trunk/include/views/SkEventSink.h

branch
TOR_BUG_3246
changeset 7
129ffea94266
equal deleted inserted replaced
-1:000000000000 0:7391c173b245
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

mercurial