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