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 113