webengine/webkitutils/stmgesturefw/inc/statemachine.h
author Simon Howkins <simonh@symbian.org>
Mon, 15 Nov 2010 14:53:34 +0000
branchRCL_3
changeset 105 871af676edac
parent 42 d39add9822e2
permissions -rw-r--r--
Adjusted to avoid exports, etc, from a top-level bld.inf

/*
* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description: State Machine implementation
*
*/

#ifndef STATEMACHINE_H
#define STATEMACHINE_H

// INCLUDES
#include <e32base.h>
#include <aknwseventobserver.h>

#include <rt_uievent.h>
#include "timerinterface.h"
#include "statemachine_v2.h"

class CCoeEnv;

namespace stmUiEventEngine
{

class CCallbackTimer;
class CStateEngine;
class THwEvent;
class CStateEngineConfiguration;


int Distance(int dx, int dy);

inline int Distance(const TPoint& aP1, const TPoint& aP2)
{
    return Distance(aP1.iX - aP2.iX, aP1.iY - aP2.iY);
}

// CLASS DECLARATION
/**
 *  CStateMachine
 *
 */
NONSHARABLE_CLASS( CStateMachine ): public CBase, 
                                    public MTimerInterface, 
                                    public MAknWsEventObserver, 
                                    public MStateMachine
{
public:
    /**
     * The MStateMachine interface methods
     */
    virtual TRect getTouchArea(TInt aPointerNumber) ;
    virtual void setTouchTimeArea(long fingersize_mm) ;
    virtual void setTouchArea(long fingersize_mm) ;
    virtual TAreaShape getTouchAreaShape() ;
    virtual void setTouchAreaShape(const TAreaShape shape) ;
    virtual unsigned int getTouchTimeout() ;
    virtual void setTouchTimeout(unsigned int) ;
    virtual TRect getHoldArea(TInt aPointerNumber) ;
    virtual void setHoldArea(long fingersize_mm) ;
    virtual TAreaShape getHoldAreaShape() ;
    virtual void setHoldAreaShape(const TAreaShape shape) ;
    virtual unsigned int getHoldTimeout();
    virtual void setHoldTimeout(unsigned int a);
    virtual unsigned int getTouchSuppressTimeout() ;
    virtual void setTouchSuppressTimeout(unsigned int a) ;
    virtual unsigned int getMoveSuppressTimeout() ;
    virtual void setMoveSuppressTimeout(unsigned int a) ;
    virtual bool addUiEventObserver(MUiEventObserver* observer) ;
    virtual bool removeUiEventObserver(MUiEventObserver* observer) ;
    virtual bool wasLastMessageFiltered(TInt aPointerNumber) ;
    virtual void enableCapacitiveUp(bool enable) ;
    virtual void enableLogging(bool aEnable) ;
    virtual void enableYadjustment(bool aEnable) ;
    virtual int getNumberOfPointers() ;

    /**
     * MAknWsEventObserver methods
     */
    virtual void HandleWsEventL(const TWsEvent& aEvent, CCoeControl* aDestination) ;

    /* other methods */
    /**
     * Pointer event handling in case the messaging should be handled that way, note that the target CCoeControl needs to be givem
     */
    void HandlePointerEventL(const TPointerEvent& aPointerEvent, void* target) ;
    /**
     * Simple toggle changes from handling the messages using ...WsEventL or ...PointerEventL
     */
    void EnableWsEventMonitoring(bool aEnable) ;
    /**
     * Method to handle the TPointerEvent
     */
    bool HandleStateEvent(const TPointerEvent& aPointerEvent, void* aTarget, const TTime& aTime) ;
    /*!
     * Setting the Y adjustment useful in capacitive touch
     * Note that there are problems with the adjustment if done at this level,
     * the most proper place would be the window server.
     */

    /**
     * MTimerInterface methods, these are internal and do not need to be exported
     */
    virtual void startTouchTimer(TInt aDelay, TInt aPointerNumber) ;
    virtual void cancelTouchTimer(TInt aPointerNumber)  ;
    virtual void startHoldTimer(TInt aDelay, TInt aPointerNumber)  ;
    virtual void cancelHoldTimer(TInt aPointerNumber)  ;
    virtual void startSuppressTimer(TInt aDelay, TInt aPointerNumber) ;
    virtual void cancelSuppressTimer(TInt aPointerNumber)  ;

public:
    ~CStateMachine();
    static CStateMachine* NewL();
    static CStateMachine* NewLC();

private:
    CStateMachine();
    void ConstructL();

    inline static TInt PointerIndex(const TPointerEvent& aPointerEvent);

    /**
     * Convert pointer event into our own event format (including timestamp)
     */
    void CreateHwEvent(THwEvent& aEvent, 
                       const TPointerEvent& aPointerEvent, 
                       void* aTarget, 
                       const TTime& aTime) ;
    
    void CreateTimerEvent(THwEvent& aEvent, TStateMachineEvent aEventCode) ;
    
    /**
     * the actual state machines implementing the transitions etc.
     */
    CStateEngine* m_impl[KMaxNumberOfPointers] ;
    /*
     * The configuration for state machines
     */
    CStateEngineConfiguration* m_config ;
    /*!
     * convert window coordinates to screen coordinates.
     */
    TPoint screenCoordinates(const TPoint& aPos, void* aGestureTarget) ;

    CCoeEnv* m_coeEnv;

    bool m_WasMessageFiltered ;
    bool m_wseventmonitoringenabled ;
    bool m_loggingenabled ;
    bool m_capacitiveup ;

    int m_3mminpixels ;
    bool m_adjustYposition ;
    // Use same naming scheme with the timers, and variables and methods
    // using macro expansion tricks (with multitouch support starts to look quite ugly):
#define DECLARE_TIMER(x) \
            void start##x##Timer(TInt aPointerNumber) ;\
            CCallbackTimer* m_##x##Timer[KMaxNumberOfPointers] ;\
            void handle##x##Timer(TInt aPointerNumber) ;\
            void cancel##x##Timer(TInt aPointerNumber)

    DECLARE_TIMER(touch) ;
    DECLARE_TIMER(hold) ;
    DECLARE_TIMER(suppress) ;

};
}   // namespace
#endif // STATEMACHINE_H