• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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      */
getSinkID()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
113