diff -r a3a1ae9acec6 -r da5135c61bad meetingrequest/mrgui/src/cmrlistpanephysics.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/meetingrequest/mrgui/src/cmrlistpanephysics.cpp Wed Mar 31 21:08:33 2010 +0300 @@ -0,0 +1,302 @@ +/* +* 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: MR listpane physics impl +* +*/ + +#include "cmrlistpanephysics.h" +#include "cmrlistpane.h" +#include "nmrlayoutmanager.h" +#include "cmrfieldcontainer.h" + +#include + +//DEBUG +#include "emailtrace.h" + + +namespace { // codescanner::namespace + +const TInt KCustomDragTreshold( 10 ); + +} // namespace + +// --------------------------------------------------------------------------- +// CMRListPanePhysics::CMRListPanePhysics +// --------------------------------------------------------------------------- +// +CMRListPanePhysics::CMRListPanePhysics( + CCoeControl& aParent, + CMRFieldContainer& aViewControl, + MMRPhysicsObserver& aPhysicsObserver ) + : iParent( aParent ), + iViewControl( aViewControl ), + iPhysicsObserver( aPhysicsObserver ) + { + FUNC_LOG; + } + +// --------------------------------------------------------------------------- +// CMRListPanePhysics::ConstructL +// --------------------------------------------------------------------------- +// +void CMRListPanePhysics::ConstructL() + { + FUNC_LOG; + iFeatureEnabled = CAknPhysics::FeatureEnabled(); + if ( iFeatureEnabled ) + { + // Physics: Create physics + // Give pointer to control that should be able to flick/drag + iPhysics = CAknPhysics::NewL( *this, &iViewControl ); + } + } + +// --------------------------------------------------------------------------- +// CMRListPanePhysics::NewL +// --------------------------------------------------------------------------- +// +CMRListPanePhysics* CMRListPanePhysics::NewL( + CCoeControl& aParent, + CMRFieldContainer& aViewControl, + MMRPhysicsObserver& aPhysicsObserver ) + { + FUNC_LOG; + CMRListPanePhysics* self = + new ( ELeave ) CMRListPanePhysics( + aParent, + aViewControl, + aPhysicsObserver ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CMRListPanePhysics::~CMRListPanePhysics +// --------------------------------------------------------------------------- +// +CMRListPanePhysics::~CMRListPanePhysics() + { + FUNC_LOG; + delete iPhysics; + } + +// --------------------------------------------------------------------------- +// CMRListPanePhysics::HandlePointerEventL +// --------------------------------------------------------------------------- +// +TBool CMRListPanePhysics::HandlePointerEventL( + const TPointerEvent& aPointerEvent, TBool& aEventsBlocked ) + { + FUNC_LOG; + TBool physicsStarted( EFalse ); + if ( !iFeatureEnabled || iPhysics->OngoingPhysicsAction() == + CAknPhysics::EAknPhysicsActionBouncing ) + { + return physicsStarted; + } + + // Down + if ( aPointerEvent.iType == TPointerEvent::EButton1Down ) + { + // Save start time and start point + iStartTime.HomeTime(); + iStartPoint = aPointerEvent.iPosition; + iDragPoint = iStartPoint; + } + + // Drag + else if ( aPointerEvent.iType == TPointerEvent::EDrag ) + { + // Check how position was changed and report to physics + TPoint deltaPoint( iDragPoint - aPointerEvent.iPosition ); + if( Abs( deltaPoint.iY ) < KCustomDragTreshold ) + { + deltaPoint.iX = 0; + deltaPoint.iY = 0; + } + + iDragPoint = aPointerEvent.iPosition; + iPhysics->RegisterPanningPosition( deltaPoint ); + } + + // Up + else if ( aPointerEvent.iType == TPointerEvent::EButton1Up ) + { + // Calculate dragging distance + TPoint drag( iStartPoint - aPointerEvent.iPosition ); + + if( Abs( drag.iY ) < KCustomDragTreshold ) + { + drag.iX = 0; + drag.iY = 0; + } + + // Start physics + physicsStarted = iPhysics->StartPhysics( drag, iStartTime ); + + if( physicsStarted ) + { + aEventsBlocked = ETrue; + } + else + { + aEventsBlocked = EFalse; + } + } + + // Record previous pointer event + iPreviousPointerEvent = aPointerEvent; + + return physicsStarted; + } + +// --------------------------------------------------------------------------- +// CMRListPanePhysics::InitPhysicsL +// --------------------------------------------------------------------------- +// +void CMRListPanePhysics::InitPhysics() + { + FUNC_LOG; + if ( !iFeatureEnabled ) + { + return; + } + TRect parentRect( iParent.Rect() ); + + iWorldSize.iHeight = iViewControl.MinimumSize().iHeight; + iWorldSize.iWidth = iViewControl.MinimumSize().iWidth; + + iViewSize.iHeight = parentRect.Height(); + iViewSize.iWidth = parentRect.Width(); + + if( iWorldSize.iHeight < iViewSize.iHeight ) + { + iWorldSize.iHeight = iViewSize.iHeight; + } + + + + iPhysics->ResetFriction(); + + TRAP_IGNORE( iPhysics->InitPhysicsL( iWorldSize, iViewSize, EFalse ) ); + iPhysics->UpdateViewWindowControl( &iParent ); + } + +// --------------------------------------------------------------------------- +// CMRListPanePhysics::SetWorldHeight +// --------------------------------------------------------------------------- +// +void CMRListPanePhysics::SetWorldHeight( TInt aWorldHeight ) + { + FUNC_LOG; + if ( !iFeatureEnabled ) + { + return; + } + iWorldSize.iHeight = aWorldHeight; + } + +// --------------------------------------------------------------------------- +// CMRListPanePhysics::ViewPositionChanged +// --------------------------------------------------------------------------- +// +void CMRListPanePhysics::ViewPositionChanged( const TPoint& aNewPosition, + TBool aDrawNow, + TUint /*aFlags*/ ) + { + FUNC_LOG; + if ( !iFeatureEnabled ) + { + return; + } + if ( iPhysics->OngoingPhysicsAction() == + CAknPhysics::EAknPhysicsActionBouncing ) + { + return; + } + + iVerScrollIndex = aNewPosition.iY - iViewSize.iHeight / 2; + + // Parents position is taken into account, by + // adding the extra x and y coordinates to field containers + // new position. + iViewControl.SetPosition( TPoint( + iParent.Position().iX, + -iVerScrollIndex + iParent.Position().iY ) ); + + // Draw only when drawing is allowed + if ( aDrawNow ) + { + iParent.DrawDeferred(); + } + } + +// --------------------------------------------------------------------------- +// CMRListPanePhysics::PhysicEmulationEnded +// --------------------------------------------------------------------------- +// +void CMRListPanePhysics::PhysicEmulationEnded() + { + FUNC_LOG; + iPhysicsObserver.PhysicsEmulationEnded(); + } + +// --------------------------------------------------------------------------- +// CMRListPanePhysics::ViewPosition +// --------------------------------------------------------------------------- +// +TPoint CMRListPanePhysics::ViewPosition() const + { + FUNC_LOG; + if ( !iFeatureEnabled ) + { + return TPoint( iParent.Position() ); + } + + // This is the default implementation + TPoint viewPosition( + iViewSize.iWidth / 2, + iViewSize.iHeight / 2 + iVerScrollIndex ); + + return viewPosition; + } + +// --------------------------------------------------------------------------- +// CMRListPanePhysics::UpdateVerticalScrollIndex +// --------------------------------------------------------------------------- +// +void CMRListPanePhysics::UpdateVerticalScrollIndex( TInt aVerScrollIndex ) + { + FUNC_LOG; + if ( iFeatureEnabled ) + { + // Physics' new position is updated to this member, when field + // container is scrolled by someone else than physics. + iVerScrollIndex = aVerScrollIndex; + } + } + +// --------------------------------------------------------------------------- +// CMRListPanePhysics::VerticalScrollIndex +// --------------------------------------------------------------------------- +// +TInt CMRListPanePhysics::VerticalScrollIndex() + { + return iVerScrollIndex; + } +// End of file +