diff -r 000000000000 -r eb1f2e154e89 textinput/peninputarc/src/peninputanim/penpointereventsuppressor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/textinput/peninputarc/src/peninputanim/penpointereventsuppressor.cpp Tue Feb 02 01:02:04 2010 +0200 @@ -0,0 +1,120 @@ +/* +* 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: +* +*/ + +#include + +const TInt KPenPointerEventSuppressorDefaultMaxTapDuration = 400000; // 0.4 seconds +const TInt KPenPointerEventSuppressorDefaultMinInterDragInterval = 0; +const TInt KPenPointerEventSuppressorDefaultMovement = 6; + +CPenPointerEventSuppressor* CPenPointerEventSuppressor::NewL() + { + return new (ELeave) CPenPointerEventSuppressor; + } + +CPenPointerEventSuppressor::~CPenPointerEventSuppressor() + { + + } + +CPenPointerEventSuppressor::CPenPointerEventSuppressor() +: iMaxTapDuration(KPenPointerEventSuppressorDefaultMaxTapDuration), + iMinInterDragInterval(KPenPointerEventSuppressorDefaultMinInterDragInterval), + iTap(EFalse) + { + // default move limit is 6 units, which seems to be a forgiving value for finger touch + iMaxTapMove.iWidth = KPenPointerEventSuppressorDefaultMovement; + iMaxTapMove.iHeight = KPenPointerEventSuppressorDefaultMovement; + } + +TBool CPenPointerEventSuppressor::SuppressPointerEvent( + const TPointerEvent& aPointerEvent) + { + switch ( aPointerEvent.iType ) + { + case TPointerEvent::EButton1Down: + { + iDownTime.HomeTime(); + iTap = ETrue; + iDownPos = aPointerEvent.iPosition; + iLastEventTime = iDownTime; + break; + } + case TPointerEvent::EDrag: + { + TTime now; + now.HomeTime(); + if (iTap) + { + TPoint delta = aPointerEvent.iPosition - iDownPos; + if (Abs(delta.iX) > iMaxTapMove.iWidth || + Abs(delta.iY) > iMaxTapMove.iHeight || + now.MicroSecondsFrom(iDownTime) >= iMaxTapDuration) + { + // This touch action has gone outside the parameters of a tap + // the drag event should be handled + iTap = EFalse; + iLastEventTime = now; + return EFalse; + } + else + { + // still a tap, so suppress the drag event + return ETrue; + } + } + else if (now.MicroSecondsFrom(iLastEventTime) < iMinInterDragInterval) + { + // too soon since the last drag, suppress it + return ETrue; + } + + // this drag event should be handled + iLastEventTime = now; + break; + } + case TPointerEvent::EButton1Up: + { + iTap = EFalse; + break; + } + case TPointerEvent::ENullType: + break; + default: + break; + } + + // all non-drag events should be handled + return EFalse; + } + +void CPenPointerEventSuppressor::SetMaxTapDuration( + TTimeIntervalMicroSeconds aDuration) + { + iMaxTapDuration = aDuration; + } + +void CPenPointerEventSuppressor::SetMaxTapMove(TSize aMoveLimits) + { + iMaxTapMove = aMoveLimits; + } + +void CPenPointerEventSuppressor::SetMinInterDragInterval( + TTimeIntervalMicroSeconds aInterval) + { + iMinInterDragInterval = aInterval; + }