blob: 01d4f7a252f677d2e2aff2e45560f6332a6d991f [file] [log] [blame]
David Ghandehari9e5b5872016-07-28 09:50:04 -07001
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
16struct SkTagList;
17
18/** \class SkEventSink
19
20 SkEventSink is the base class for all objects that receive SkEvents.
21*/
22class SkEventSink : public SkRefCnt {
23public:
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
91protected:
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
102private:
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