
/*
 * Copyright 2006 The Android Open Source Project
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */


#ifndef SkEventSink_DEFINED
#define SkEventSink_DEFINED

#include "SkRefCnt.h"
#include "SkEvent.h"

struct SkTagList;

/** \class SkEventSink

    SkEventSink is the base class for all objects that receive SkEvents.
*/
class SkEventSink : public SkRefCnt {
public:
            SkEventSink();
    virtual ~SkEventSink();

    /**
     *  Returns this eventsink's unique ID. Use this to post SkEvents to
     *  this eventsink.
     */
    SkEventSinkID getSinkID() const { return fID; }

    /**
     *  Call this to pass an event to this object for processing. Returns true if the
     *  event was handled.
     */
    bool doEvent(const SkEvent&);

    /** Returns true if the sink (or one of its subclasses) understands the event as a query.
        If so, the sink may modify the event to communicate its "answer".
    */
    bool doQuery(SkEvent* query);

    /**
     *  Add sinkID to the list of listeners, to receive events from calls to sendToListeners()
     *  and postToListeners(). If sinkID already exists in the listener list, no change is made.
     */
    void addListenerID(SkEventSinkID sinkID);

    /**
     *  Copy listeners from one event sink to another, typically from parent to child.
     *  @param from the event sink to copy the listeners from
     */
    void copyListeners(const SkEventSink& from);

    /**
     *  Remove sinkID from the list of listeners. If sinkID does not appear in the list,
     *  no change is made.
     */
    void removeListenerID(SkEventSinkID);

    /**
     *  Returns true if there are 1 or more listeners attached to this eventsink
     */
    bool hasListeners() const;

    /**
     *  Posts a copy of evt to each of the eventsinks in the lisener list.
     *  This ignores the targetID and target proc in evt.
     */
    void postToListeners(const SkEvent& evt, SkMSec delay = 0);

    enum EventResult {
        kHandled_EventResult,       //!< the eventsink returned true from its doEvent method
        kNotHandled_EventResult,    //!< the eventsink returned false from its doEvent method
        kSinkNotFound_EventResult   //!< no matching eventsink was found for the event's getSink().
    };

    /**
     *  DoEvent handles dispatching the event to its target ID or proc.
     */
    static EventResult DoEvent(const SkEvent&);

    /**
     *  Returns the matching eventsink, or null if not found
     */
    static SkEventSink* FindSink(SkEventSinkID);

protected:
    /** Override this to handle events in your subclass. Be sure to call the inherited version
        for events that you don't handle.
    */
    virtual bool onEvent(const SkEvent&);
    virtual bool onQuery(SkEvent*);

    SkTagList*  findTagList(U8CPU tag) const;
    void        addTagList(SkTagList*);
    void        removeTagList(U8CPU tag);

private:
    SkEventSinkID   fID;
    SkTagList*      fTagHead;

    // for our private link-list
    SkEventSink*    fNextSink;
};

#endif

