SkEventSink.h revision e16efc1882ab34a0bb3ae361a2d37f840044cf87
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
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
113