diff -r 000000000000 -r 2f259fa3e83a akntouchgesturefw/src/akntouchgesturefwdragrecognizer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/akntouchgesturefw/src/akntouchgesturefwdragrecognizer.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,299 @@ +/* +* 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: Drag touch gesture recognizer. +* +*/ + +#include "akntouchgesturefwdefs.h" +#include "akntouchgesturefwevent.h" +#include "akntouchgesturefwdragrecognizer.h" +#include "akntouchgesturefwsettings.h" + +using namespace AknTouchGestureFw; + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +CAknTouchGestureFwDragRecognizer* CAknTouchGestureFwDragRecognizer::NewL( + CAknTouchGestureFwRecognitionEngine& aEngine ) + { + CAknTouchGestureFwDragRecognizer* self = + CAknTouchGestureFwDragRecognizer::NewLC( aEngine ); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +CAknTouchGestureFwDragRecognizer* CAknTouchGestureFwDragRecognizer::NewLC( + CAknTouchGestureFwRecognitionEngine& aEngine ) + { + CAknTouchGestureFwDragRecognizer* self + = new ( ELeave ) CAknTouchGestureFwDragRecognizer( aEngine ); + CleanupStack::PushL( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CAknTouchGestureFwDragRecognizer::~CAknTouchGestureFwDragRecognizer() + { + } + + +// --------------------------------------------------------------------------- +// Returns the drag gesture group. +// --------------------------------------------------------------------------- +// +TAknTouchGestureFwGroup CAknTouchGestureFwDragRecognizer::GestureGroup() const + { + return EAknTouchGestureFwGroupDrag; + } + + +// --------------------------------------------------------------------------- +// Cancels the drag gesture recognition. +// --------------------------------------------------------------------------- +// +void CAknTouchGestureFwDragRecognizer::CancelRecognizing() + { + if ( iContinuousFeedback ) + { + StopContinuousFeedback(); + iContinuousFeedback = EFalse; + } + if ( iDragDetected ) + { + // We ignore the possible leave in order to ensure that the + // state gets reset. + TRAP_IGNORE( SendDragEventL( EAknTouchGestureFwStop ) ); + } + Reset(); + } + + +// --------------------------------------------------------------------------- +// Handles single-touch pointer events. +// --------------------------------------------------------------------------- +// +void CAknTouchGestureFwDragRecognizer::HandleSinglePointerEventL( + const TPointerEventData& aPointerData ) + { + switch ( aPointerData.iPointerEvent.iType ) + { + case TPointerEvent::EButton1Down: + { + StartSingleRecognizing( aPointerData.iPointerEvent.iPosition ); + break; + } + case TPointerEvent::EDrag: + { + if ( iStartOnSingleTouchDrag ) + { + // Start clears iStartOnSingleTouchDrag + StartSingleRecognizing( aPointerData.iPointerEvent.iPosition ); + } + else + { + SingleRecognizeL( aPointerData.iPointerEvent.iPosition ); + } + break; + } + case TPointerEvent::EButton1Up: + { + CompleteSingleRecognizingL(); + break; + } + default: + { + break; + } + } + } + + +// --------------------------------------------------------------------------- +// Handles multi-touch pointer events. +// --------------------------------------------------------------------------- +// +void CAknTouchGestureFwDragRecognizer::HandleMultiPointerEventL( + const TPointerEventData& aPointerData, + const TPoint& /*aFirstPointerPosition*/, + const TPoint& /*aSecondPointerPosition*/ ) + { + switch ( aPointerData.iPointerEvent.iType ) + { + case TPointerEvent::EButton1Down: + { + // Multi touch begin completes single recognizing + CompleteSingleRecognizingL(); + break; + } + case TPointerEvent::EDrag: + { + break; + } + case TPointerEvent::EButton1Up: + { + // Upon next single touch drag, start recognition. + // Current position is not necessarily accurate. + iStartOnSingleTouchDrag = ETrue; + break; + } + default: + { + break; + } + } + } + + +// --------------------------------------------------------------------------- +// C++ constructor. +// --------------------------------------------------------------------------- +// +CAknTouchGestureFwDragRecognizer::CAknTouchGestureFwDragRecognizer( + CAknTouchGestureFwRecognitionEngine& aEngine ) + : CAknTouchGestureFwBaseRecognizer( aEngine ), + iStartPosition( 0, 0 ), + iCurrentPosition( 0, 0 ), + iPreviousPosition( 0, 0 ), + iDragDetected( EFalse ), + iDragArea() + { + Reset(); + } + + +// --------------------------------------------------------------------------- +// Starts recognizing the drag gesture. +// --------------------------------------------------------------------------- +// +void CAknTouchGestureFwDragRecognizer::StartSingleRecognizing( + const TPoint& aPointerPos ) + { + iDragDetected = EFalse; + iDragArea.Start( aPointerPos ); + iStartPosition = aPointerPos; + iCurrentPosition = aPointerPos; + iPreviousPosition.SetXY( 0, 0 ); + iStartOnSingleTouchDrag = EFalse; + } + + +// --------------------------------------------------------------------------- +// Continues recognizing the drag gesture, called on drag pointer events. +// --------------------------------------------------------------------------- +// +void CAknTouchGestureFwDragRecognizer::SingleRecognizeL( + const TPoint& aPointerPos ) + { + iPreviousPosition = iCurrentPosition; + iCurrentPosition = aPointerPos; + + if ( !iDragDetected ) + { + // Check if points form a drag. + iDragDetected = iDragArea.Check( aPointerPos, DragThreshold() ); + if ( iDragDetected ) + { + SendDragEventL( EAknTouchGestureFwStart ); + } + } + else // iDragDetected holds + { + // Send update event if position changed. + if ( iPreviousPosition != iCurrentPosition ) + { + SendDragEventL( EAknTouchGestureFwOn ); + } + } + } + + +// --------------------------------------------------------------------------- +// Ends the drag gesture recognition. +// --------------------------------------------------------------------------- +// +void CAknTouchGestureFwDragRecognizer::CompleteSingleRecognizingL() + { + if ( iContinuousFeedback ) + { + StopContinuousFeedback(); + iContinuousFeedback = EFalse; + } + + // Send drag stopped event only if drag was detected. + if ( iDragDetected ) + { + iDragDetected = EFalse; + SendDragEventL( EAknTouchGestureFwStop ); + } + } + + +// --------------------------------------------------------------------------- +// Send a drag gesture event to the observer. +// --------------------------------------------------------------------------- +// +void CAknTouchGestureFwDragRecognizer::SendDragEventL( + TAknTouchGestureFwState aGestureState ) + { + if ( aGestureState != EAknTouchGestureFwStop ) + { + TTouchFeedbackType feedbackType( + FeedbackType( EAknTouchGestureFwDrag ) ); + + if ( feedbackType & ETouchFeedbackVibra ) + { + StartContinuousFeedback( ETouchContinuousSmooth, + KAknTouchGestureFwFeedbackIntensity, + KAknTouchGestureFwDragFeedbackTimeout ); + iContinuousFeedback = ETrue; + } + } + + TAknTouchGestureFwDragEvent drag; + drag.SetState( aGestureState ); + drag.SetStartPosition( iStartPosition ); + drag.SetCurrentPosition( iCurrentPosition ); + drag.SetPreviousPosition( iPreviousPosition ); + SendGestureEventL( drag ); + } + + +// --------------------------------------------------------------------------- +// Resets recognizer's state. +// --------------------------------------------------------------------------- +// +void CAknTouchGestureFwDragRecognizer::Reset() + { + iStartPosition.SetXY( 0, 0 ); + iCurrentPosition.SetXY( 0, 0 ); + iPreviousPosition.SetXY( 0, 0 ); + iDragDetected = EFalse; + iDragArea.Reset(); + iStartOnSingleTouchDrag = EFalse; + } + +// End of File