diff -r aecbbf00d063 -r d48ab3b357f1 akntouchgesturefw/src/akntouchgesturefwutils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/akntouchgesturefw/src/akntouchgesturefwutils.cpp Wed Sep 01 12:16:19 2010 +0100 @@ -0,0 +1,476 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "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: Touch gesture framework utility functions. +* +*/ + +#include + +#include "akntouchgesturefwutils.h" +#include "akntouchgesturefwdefs.h" + +using namespace AknTouchGestureFw; + +_LIT(KAknTouchPointerEventDown, "[GFW] IN P%d DOWN (%d, %d) %S"); +_LIT(KAknTouchPointerEventDrag, "[GFW] IN P%d DRAG (%d, %d) %S"); +_LIT(KAknTouchPointerEventUp, "[GFW] IN P%d UP (%d, %d) %S"); +_LIT(KAknTouchPointerEventHw, "HW"); +_LIT(KAknTouchPointerEventSimulated, "SM"); +_LIT(KAknTouchGestureGeneric, "[GFW] OUT S:%d G:%x T:%x %%:%d"); +_LIT(KAknTouchGesturePointer, + "[GFW] ... %d: SP:(%d,%d) CP:(%d,%d) PP:(%d,%d) S:(%d,%d)"); + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// TPointerEventData::TPointerEventData +// --------------------------------------------------------------------------- +// +AknTouchGestureFw::TPointerEventData::TPointerEventData( + TPointerEvent& aPointerEvent, + TInt aPointerNumber, + const TTime& aTimeStamp, + TBool aSimulated, + TBool aTargetedToControl ) + : iPointerEvent( aPointerEvent ), + iPointerNumber( aPointerNumber ), + iTimeStamp( aTimeStamp ), + iSimulated( aSimulated ), + iTargetedToControl( aTargetedToControl ) + { + } + + +// --------------------------------------------------------------------------- +// TPointEntry::TPointEntry +// --------------------------------------------------------------------------- +// +TPointEntry::TPointEntry( const TPoint& aPos, const TTime& aTime ) + : iPos( aPos ), iTime( aTime ) + { + } + + +// --------------------------------------------------------------------------- +// TPointEntry::TPointEntry +// --------------------------------------------------------------------------- +// +TPointEntry::TPointEntry() + : iPos( TPoint() ), iTime( TTime() ) + { + } + + +// --------------------------------------------------------------------------- +// TVector::TVector +// --------------------------------------------------------------------------- +// +TVector::TVector( const TPoint& aFrom, const TPoint& aTo ) + : iX( aTo.iX - aFrom.iX ), + iY( aTo.iY - aFrom.iY ) + { + } + + +// --------------------------------------------------------------------------- +// TVector::TVector +// --------------------------------------------------------------------------- +// +TVector::TVector( TReal aDeltaX, TReal aDeltaY ) + : iX( aDeltaX ), iY( aDeltaY ) + { + } + + +// --------------------------------------------------------------------------- +// TVector::TVector +// --------------------------------------------------------------------------- +// +TVector::TVector() + : iX( 0 ), iY( 0 ) + { + } + + +// --------------------------------------------------------------------------- +// TVector::Angle +// --------------------------------------------------------------------------- +// +TInt TVector::Angle() const + { + TReal angle = 0; + TReal length = Length(); + if ( Abs( length ) > KEpsilon ) + { + Math::ACos( angle, iX / length ); + if ( iY < 0 ) + { + angle = 2 * KPi - angle; + } + } + + return Degrees( angle ); + } + + +// --------------------------------------------------------------------------- +// TVector::Length +// --------------------------------------------------------------------------- +// +TReal TVector::Length() const + { + TReal length = 0; + Math::Sqrt( length, iX * iX + iY * iY ); + return length; + } + + +// --------------------------------------------------------------------------- +// static TVector::Degrees +// --------------------------------------------------------------------------- +// +TInt TVector::Degrees( TReal aRadians ) + { + return aRadians * 180 / KPi; + } + + +// --------------------------------------------------------------------------- +// TThresholdArea::TThresholdArea +// --------------------------------------------------------------------------- +// +TThresholdArea::TThresholdArea() + : iInitialPosition(), iActive( EFalse ) + { + Reset(); + } + + +// --------------------------------------------------------------------------- +// TThresholdArea::Reset +// --------------------------------------------------------------------------- +// +void TThresholdArea::Reset() + { + iInitialPosition = TPoint(); + iActive = EFalse; + } + + +// --------------------------------------------------------------------------- +// TThresholdArea::IsActive +// --------------------------------------------------------------------------- +// +TBool TThresholdArea::IsActive() const + { + return iActive; + } + + +// --------------------------------------------------------------------------- +// TThresholdArea::InitialPosition +// --------------------------------------------------------------------------- +// +TPoint TThresholdArea::InitialPosition() const + { + TPoint position; + if ( iActive ) + { + position = iInitialPosition; + } + return position; + } + + +// --------------------------------------------------------------------------- +// TThresholdArea::Start +// --------------------------------------------------------------------------- +// +void TThresholdArea::Start( const TPoint& aInitialPosition ) + { + iInitialPosition = aInitialPosition; + iActive = ETrue; + } + + +// --------------------------------------------------------------------------- +// TThresholdArea::Check +// --------------------------------------------------------------------------- +// +TBool TThresholdArea::Check( const TPoint& aNewPosition, TInt aMargin ) const + { + TBool crossed = EFalse; + if ( iActive ) + { + TInt deltaX = aNewPosition.iX - iInitialPosition.iX; + TInt deltaY = aNewPosition.iY - iInitialPosition.iY; + deltaX = Abs( deltaX ); + deltaY = Abs( deltaY ); + crossed = deltaX > aMargin || deltaY > aMargin; + } + return crossed; + } + + +// --------------------------------------------------------------------------- +// Dumps pointer event data to the debug output. +// --------------------------------------------------------------------------- +// +void AknTouchGestureFwUtils::DumpPointerEvent( const TPointerEvent& aEvent, + TBool aSimulated ) + { + TInt pointerNumber = 0; + + if ( aEvent.IsAdvancedPointerEvent() ) + { + pointerNumber = aEvent.AdvancedPointerEvent()->PointerNumber(); + } + + const TDesC* source; + if ( aSimulated ) + { + source = &KAknTouchPointerEventSimulated; + } + else + { + source = &KAknTouchPointerEventHw; + } + + switch ( aEvent.iType ) + { + case TPointerEvent::EButton1Down: + RDebug::Print(KAknTouchPointerEventDown, pointerNumber, + aEvent.iPosition.iX, aEvent.iPosition.iY, source); + break; + + case TPointerEvent::EDrag: + RDebug::Print(KAknTouchPointerEventDrag, pointerNumber, + aEvent.iPosition.iX, aEvent.iPosition.iY, source); + break; + + case TPointerEvent::EButton1Up: + RDebug::Print(KAknTouchPointerEventUp, pointerNumber, + aEvent.iPosition.iX, aEvent.iPosition.iY, source); + break; + + default: + break; + } + } + + +// --------------------------------------------------------------------------- +// Dumps gesture event data to the debug output. +// --------------------------------------------------------------------------- +// +void AknTouchGestureFwUtils::DumpGestureEvent( + MAknTouchGestureFwEvent& aEvent ) + { + TInt movement( 0 ); + TPoint startPos; + TPoint currentPos; + TPoint previousPos; + TPoint speed; + TAknTouchGestureFwState state( EAknTouchGestureFwOn ); + + switch ( aEvent.Group() ) + { + case EAknTouchGestureFwGroupTap: + { + MAknTouchGestureFwTapEvent* tap = + static_cast( &aEvent ); + startPos = tap->Position(); + } + break; + + case EAknTouchGestureFwGroupFlick: + { + MAknTouchGestureFwFlickEvent* flick = + static_cast( &aEvent ); + startPos = flick->Position(); + speed = flick->Speed(); + } + break; + + case EAknTouchGestureFwGroupDrag: + { + MAknTouchGestureFwDragEvent* drag = + static_cast( &aEvent ); + startPos = drag->StartPosition(); + currentPos = drag->CurrentPosition(); + previousPos = drag->PreviousPosition(); + state = drag->State(); + } + break; + + case EAknTouchGestureFwGroupPinch: + { + MAknTouchGestureFwPinchEvent* pinch = + static_cast( &aEvent ); + movement = pinch->Movement(); + state = pinch->State(); + } + break; + + default: + break; + } + + RDebug::Print( KAknTouchGestureGeneric, + state, aEvent.Group(), + aEvent.Type(), movement ); + RDebug::Print(KAknTouchGesturePointer, 0, + startPos.iX, startPos.iY, currentPos.iX, currentPos.iY, + previousPos.iX, previousPos.iY, speed.iX, speed.iY ); + } + + +// --------------------------------------------------------------------------- +// TDirectionTracer::TDirectionTracer +// --------------------------------------------------------------------------- +// +TDirectionTracer::TDirectionTracer() + : iDirection( EDirectionNeutral ), iDirectionChanged( EFalse ), + iChangeDirection( EDirectionNeutral ), iChangeCounter( 0 ) + { + } + +// --------------------------------------------------------------------------- +// TDirectionTracer::Reset +// --------------------------------------------------------------------------- +// +void TDirectionTracer::Reset() + { + iDirection = EDirectionNeutral; + iDirectionChanged = EFalse; + iChangeDirection = EDirectionNeutral; + iChangeCounter = 0; + } + +// --------------------------------------------------------------------------- +// TDirectionTracer::Update +// --------------------------------------------------------------------------- +// +void TDirectionTracer::Update( TInt aDelta, TInt aSensitivity ) + { + iDirectionChanged = EFalse; + + if ( !aDelta ) + { + return; // no change, cannot determine direction + } + + if ( iDirection == EDirectionNeutral ) + { + TDirection direction = EDirectionNeutral; + if ( aDelta > 0 ) + { + direction = EDirectionPositive; + } + else + { + direction = EDirectionNegative; + } + + if ( direction == iChangeDirection ) + { + iChangeCounter++; + + if ( iChangeCounter >= aSensitivity ) + { + iDirection = iChangeDirection; + iDirectionChanged = ETrue; + iChangeCounter = 0; + } + } + else + { + iChangeDirection = direction; + iChangeCounter = 0; + iChangeCounter++; + } + } + else if ( iDirection == EDirectionPositive ) + { + // Subsequent direction changes require a couple of movement + // to same direction + + if ( CheckDirectionChange( -aDelta, aSensitivity, iChangeCounter ) ) + { + iDirection = EDirectionNegative; + iDirectionChanged = ETrue; + } + } + else // iDirection == EDirectionNegative + { + // Subsequent direction changes require a couple of movement + // to same direction + + if ( CheckDirectionChange( aDelta, aSensitivity, iChangeCounter ) ) + { + iDirection = EDirectionPositive; + iDirectionChanged = ETrue; + } + } + } + + +// --------------------------------------------------------------------------- +// TDirectionTracer::IsDirectionChanged +// --------------------------------------------------------------------------- +// +TBool TDirectionTracer::IsDirectionChanged() const + { + return iDirectionChanged; + } + + +// --------------------------------------------------------------------------- +// TDirectionTracer::Direction +// --------------------------------------------------------------------------- +// +TDirectionTracer::TDirection TDirectionTracer::Direction() const + { + return iDirection; + } + + +// --------------------------------------------------------------------------- +// TDirectionTracer::CheckDirectionChange +// --------------------------------------------------------------------------- +// +TBool TDirectionTracer::CheckDirectionChange( + TInt aDelta, TInt aSensitivity, TInt& aCounter) + { + TBool directionChanged = EFalse; + + if ( aDelta > 0 ) + { + aCounter++; + } + else + { + aCounter = 0; + } + + if ( aCounter >= aSensitivity ) + { + aCounter = 0; + directionChanged = ETrue; + } + + return directionChanged; + } + +// End of File