11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
20b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2006 The Android Open Source Project
40b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
70b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger */
80b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#ifndef SkEventSink_DEFINED
110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#define SkEventSink_DEFINED
120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkRefCnt.h"
140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkEvent.h"
150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstruct SkTagList;
170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger/** \class SkEventSink
190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkEventSink is the base class for all objects that receive SkEvents.
210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger*/
220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass SkEventSink : public SkRefCnt {
230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpublic:
240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            SkEventSink();
250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    virtual ~SkEventSink();
260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Returns this eventsink's unique ID. Use this to post SkEvents to
291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  this eventsink.
301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkEventSinkID getSinkID() const { return fID; }
320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Call this to pass an event to this object for processing. Returns true if the
351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  event was handled.
361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    bool doEvent(const SkEvent&);
381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /** Returns true if the sink (or one of its subclasses) understands the event as a query.
400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        If so, the sink may modify the event to communicate its "answer".
410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    */
420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    bool doQuery(SkEvent* query);
430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Add sinkID to the list of listeners, to receive events from calls to sendToListeners()
461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  and postToListeners(). If sinkID already exists in the listener list, no change is made.
471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void addListenerID(SkEventSinkID sinkID);
491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Copy listeners from one event sink to another, typically from parent to child.
521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  @param from the event sink to copy the listeners from
531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    void copyListeners(const SkEventSink& from);
551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Remove sinkID from the list of listeners. If sinkID does not appear in the list,
581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  no change is made.
591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void removeListenerID(SkEventSinkID);
611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Returns true if there are 1 or more listeners attached to this eventsink
641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool hasListeners() const;
661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Posts a copy of evt to each of the eventsinks in the lisener list.
691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  This ignores the targetID and target proc in evt.
701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void postToListeners(const SkEvent& evt, SkMSec delay = 0);
720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    enum EventResult {
740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        kHandled_EventResult,       //!< the eventsink returned true from its doEvent method
750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        kNotHandled_EventResult,    //!< the eventsink returned false from its doEvent method
760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        kSinkNotFound_EventResult   //!< no matching eventsink was found for the event's getSink().
770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    };
780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  DoEvent handles dispatching the event to its target ID or proc.
811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static EventResult DoEvent(const SkEvent&);
831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Returns the matching eventsink, or null if not found
861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    static SkEventSink* FindSink(SkEventSinkID);
880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprotected:
900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /** Override this to handle events in your subclass. Be sure to call the inherited version
910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        for events that you don't handle.
920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    */
930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    virtual bool onEvent(const SkEvent&);
940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    virtual bool onQuery(SkEvent*);
950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkTagList*  findTagList(U8CPU tag) const;
970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    void        addTagList(SkTagList*);
980b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    void        removeTagList(U8CPU tag);
990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1000b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprivate:
1010b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkEventSinkID   fID;
1020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkTagList*      fTagHead;
1030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1040b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // for our private link-list
1050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkEventSink*    fNextSink;
1060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger};
1070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1080b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#endif
1090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
110