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