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             SkEventSink();
     25     virtual ~SkEventSink();
     26 
     27     /**
     28      *  Returns this eventsink's unique ID. Use this to post SkEvents to
     29      *  this eventsink.
     30      */
     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