Home | History | Annotate | Download | only in views
      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 
     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