webengine/webkitutils/stmgesturefw/inc/stateengine.h
changeset 28 d39add9822e2
child 37 ac77f89b1d9e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webengine/webkitutils/stmgesturefw/inc/stateengine.h	Tue Feb 02 00:56:45 2010 +0200
@@ -0,0 +1,180 @@
+/*
+* 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 Engine
+*
+*/
+#ifndef STATEENGINE_H_
+#define STATEENGINE_H_
+
+#include "rt_uievent.h"
+#include "timerinterface.h"
+#include "statemachine_v2.h"
+#include "uieventsender.h"
+#include "stateengineconfiguration.h"
+
+namespace stmUiEventEngine
+{
+
+/*!
+ * Define THwEvent since we need the point, the type and timestamp to be stored.
+ * The HW event is used also to handle the timer events so that the wrapper class calling the
+ * state machine will handle the starting, canceling etc. of the timers and the state machine
+ * sees the timers as messages.  This hopefully makes it easier to keep the core state machine as
+ * OS agnostic as possible.
+ */
+class THwEvent
+{
+public:
+    THwEvent() {} ;
+    THwEvent(const THwEvent& ev):
+        iType(ev.iType), iPosition(ev.iPosition),
+        iTime(ev.iTime), iTarget(ev.iTarget), iPointerNumber(ev.iPointerNumber) {}
+    THwEvent(TStateMachineEvent code, 
+             const TPoint& pos, 
+             TTime time, 
+             void* aTarget, 
+             TInt aPointerNr):
+             iType(code), iPosition(pos),
+             iTime(time), iTarget(aTarget), iPointerNumber(aPointerNr) 
+             {
+             }
+
+    TStateMachineEvent iType ;
+    TPoint  iPosition ;
+    TTime   iTime ;
+    void*   iTarget ;
+	TInt	iPointerNumber ;
+};
+
+
+NONSHARABLE_CLASS( CStateEngine ) : public CBase
+{
+public:
+    /**
+     * constructor and destructor
+     */
+	CStateEngine(CStateEngineConfiguration* aConfig, MTimerInterface* timerif, int index) ;
+
+    ~CStateEngine() ;
+    /**
+     *  The methods needed for state machine
+     */
+    void ConsumeEvent() ;
+    bool IsTouchTimer() ;
+    bool IsHoldTimer() ;
+    bool IsSuppressTimer() ;
+    bool IsTouchTimeArea() ;
+    bool IsTouchArea() ;
+    bool IsHoldArea() ;
+    bool InsideTouchTimeArea() ;
+    bool InsideTouchArea() ;
+    bool InsideHoldArea() ;
+    bool LooksLikeHold() ;
+    void ErrorEvent() ;
+    void InitTouchTimer() ;
+    void InitHoldTimer() ;
+    void RestartHoldTimer() ;
+    void InitTouchSuppressTimer() ;
+    void InitMoveSuppressTimer() ;
+    void ClearTouchTimer() ;
+    void ClearHoldTimer() ;
+    void ClearSuppressTimer() ;
+    void ProduceTouch() ;
+    void ProduceMove() ;
+    void ProduceRelease() ;
+    void ProduceHold() ;
+    void RenameToDrag() ;
+    void PrepareTouchTimeArea() ;
+    void PrepareTouchArea() ;
+    void PrepareHoldArea() ;
+    void SetCurrentPos() ;
+    void SetGestureStart() ;
+    void AddToTouch() ;
+    void AddDraggingPos() ;
+    void StoreMovePos() ;
+
+    /**
+     * The event interface
+     */
+
+    THwEvent& initEvent()
+    {
+        m_hwe.iPointerNumber = m_index;
+        return m_hwe;
+    }
+
+    // event returned by initEvent() must initialized first
+	bool handleStateEvent()  ;
+
+	TRect getTouchArea() ;
+	TRect getHoldArea() ;
+	bool wasLastMessageFiltered() ;
+
+private:
+    bool m_eventConsumed ;
+    THwEvent m_hwe ;
+
+    bool isNewHoldingPoint() ;
+    RPointerArray<THwEvent> iDragPoints;
+    MTimerInterface* m_timerif ;
+
+    RArray<THwEvent> iTouchPoints;
+
+    // Variables for running the state machine
+    TStateMachineState m_currentState ;
+    bool m_isTimerEvent ;                   // We need to separate the pointer events and the timer events
+    TPoint m_currentTouchXY ;               // This is the touching point
+    TPoint m_gestureStartXY ;               // gesture started at this point
+    TPoint m_uiEventXY ;                    // The UI event XY point.
+    TPoint m_previousPointerEventPosition ;
+    TPoint m_deltaVector ;
+    TRect m_touchRect ;
+    TRect m_holdRect ;
+
+    bool m_wasFiltered ;
+    void CalculateDelta() ;
+    void CalculateTouchAverage() ;
+    void CalculateCurrentVector() ;
+    TPoint calculateTouchAverageFromPoints() ;
+    bool InsideArea(const TPoint& point, 
+                    const TRect& rect, 
+                    TAreaShape shape, 
+                    const TPoint& tolerance);
+    void setTolerance(long fingersize_mm, TPoint& tolerance, TAreaShape shape) ;
+
+    void DebugPrintState(TStateMachineState anextstate) ;
+    inline static TRect ToleranceRect( const TPoint& aCenterPoint, const TPoint& tolerance) ;
+    void turnStateMachine() ;
+
+    TPoint     m_touchCentre ;
+    TPoint     m_holdCentre ;
+
+    void*       m_gestureTarget ;
+    TTimeIntervalMicroSeconds getInterval() ;
+    TTime       m_lastMessageTime ;
+    CUiEvent* createUIEventL(TUiEventCode code, const TPoint& aPos) ;
+    TPoint getPreviousXY(const TPoint& aXY) ;
+    TPoint m_previousXY ;
+    bool isTimerMessage() ;
+    int  m_index ;
+    TUiEventCode m_previousUiGenerated ;
+    TPoint m_lastFilteredPosition ;
+    TTime m_lastFilteredMessageTime ;
+
+	CStateEngineConfiguration* m_config ;
+
+};
+}   // namespace
+
+#endif /* STATEENGINE_H_ */