diff -r d2ab7c3d0c48 -r 11157e26c4a7 dependencies/physics_api/inc/aknphysics.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dependencies/physics_api/inc/aknphysics.h Thu Mar 25 16:25:17 2010 +0100 @@ -0,0 +1,462 @@ +/* +* 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: AknPhysics +* +*/ + +#ifndef C_AKNPHYSICS_H +#define C_AKNPHYSICS_H + +#include + +class MAknPhysicsObserver; +class CAknPhysicsParameterProvider; +class CAknPhysicsRestrictor; +class CAknPhysicsConeObserver; +class CAknPhysicsEngine; +class CCoeControl; +class CAknHighResPeriodic; +class MTouchFeedback; + + +/** + * CAknPhysics + * + * @lib aknphysics + * @since S60 v5.0 + */ +NONSHARABLE_CLASS( CAknPhysics ) : public CBase + { + +public: + + /** CAknPhysics action definition */ + enum TAknPhysicsAction + { + EAknPhysicsActionNone = 1, + EAknPhysicsActionFlicking, + EAknPhysicsActionBouncing, + EAknPhysicsActionDragging + }; + + + /** + * Two-phased constructor. + * @param aObserver Observer of the physics object. + * @param aViewControl Physics view control. + */ + IMPORT_C static CAknPhysics* NewL( MAknPhysicsObserver& aObserver, + CCoeControl* aViewControl ); + + /** + * Destructor. + */ + virtual ~CAknPhysics(); + +public: + + /** + * Physics initialization. + * + * @since S60 v5.0 + * @param aWorldSize Physics world size. + * @param aViewSize Physics (visible) view size. + * @param aLandscape ETrue if physics should work in landscape. + */ + IMPORT_C void InitPhysicsL( const TSize& aWorldSize, + const TSize& aViewSize, + TBool aLandscape ); + + /** + * Starts physics simulation and applies drag event. The action is + * done only if the drag distance is greater than the drag threshold. + * Drag distance is adjusted by physics, if the dragging direction + * has been changed during the dragging event. + * + * @param aDrag Drag distance. + * @param aStartTime Dragging start time. + * @return ETrue if physics was started and drag was applied. + */ + IMPORT_C TBool StartPhysics( TPoint& aDrag, const TTime& aStartTime ); + + /** + * Stops physics simulation. + * + * @since S60 v5.0 + */ + IMPORT_C void StopPhysics(); + + /** + * Returns CAknPhysics action code i.e. which action CAknPhysics + * is currently performing. + * + * @since S60 v5.0 + * @return TAknPhysicsAction type action code. + */ + IMPORT_C TInt OngoingPhysicsAction() const; + + + /** + * Registers view panning position. Used when view is panned + * (dragged). + * + * @since S60 v5.0 + * @param aDelta Dragging distance. + */ + IMPORT_C void RegisterPanningPosition( const TPoint& aDelta ); + + /** + * Sets friction. + * + * @since S60 v5.0 + * @param aFriction + */ + IMPORT_C void SetFriction( TReal aFriction ); + + /** + * Resets friction. + * + * @since S60 v5.0 + */ + IMPORT_C void ResetFriction(); + + /** + * Returns highlight timeout parameter. + * + * @since S60 v5.0 + * @return Highlight timeout. + */ + IMPORT_C TInt HighlightTimeout() const; + + /** + * Returns drag threshold parameter. + * + * @since S60 v5.0 + * @return Drag threshold. + */ + IMPORT_C TInt DragThreshold() const; + + /** + * Returns feature enabled parameter. + * + * @since S60 v5.0 + * @return ETrue if kinetic scrolling feature is enabled. + */ + IMPORT_C static TBool FeatureEnabled(); + + /** + * Returns EFalse if events should not be handled. This is the case if + * flick is interrupted via key or pointer event or view is bouncing. + * + * @since S60 v5.0 + * @return ETrue if key and pointer events can be handled normally. + */ + IMPORT_C TBool EventHandlingAllowed() const; + + /** + * Updates view window control (in case e.g. view control container + * window has changed). + * + * @since S60 v5.0 + * @param aControl New view control if view control itself has changed. + */ + IMPORT_C void UpdateViewWindowControl( CCoeControl* aControl = NULL ); + + /** + * Suspends physics simulation, but doesn't reset current force or + * velocity. When simulation is suspended, it is possible to change + * view position. + * + * @since S60 v5.2 + */ + IMPORT_C void SuspendPhysics(); + + /** + * Resumes physics simulation with current view position, force + * and velocity. + * + * @since S60 v5.2 + */ + IMPORT_C void ResumePhysics(); + +// internal AknPhysics methods + + /** + * Checks if view position needs updating. + * + * @since S60 v5.0 + * @internal + */ + void UpdateViewPosition(); + + /** + * Returns ETrue if physics works in landscape. + * + * @since S60 v5.0 + * @internal + * @return ETrue if physics works in landscape. + */ + const TBool& Landscape(); + + /** + * Returns current view size. + * + * @since S60 v5.0 + * @internal + * @return Current view size. + */ + const TSize& ViewSize(); + + /** + * Returns current world size. + * + * @since S60 v5.0 + * @internal + * @return Current world size. + */ + const TSize& WorldSize(); + + /** + * Returns current surface erp value. + * + * @since S60 v5.0 + * @internal + * @return Current surface erp value. + */ + TInt SurfaceErp() const; + + /** + * Returns current surface cfm value. + * + * @since S60 v5.0 + * @internal + * @return Current surface cfm value. + */ + TInt SurfaceCfm() const; + + /** + * Returns frame delay value. + * + * @since S60 v5.0 + * @internal + * @return Frame delay. + */ + TInt FrameDelay() const; + + /** + * Returns min frame interval value. + * + * @since S60 v5.0 + * @internal + * @return Min frame interval. + */ + TInt MinFrameInterval() const; + + /** + * Draws the view in the current position. + */ + void DrawViewInCurrentPosition(); + + /** + * Sets the iBounceTactileFeedback flag value. + * + * @since S60 v5.2 + * @param aBounceTactileFeedback Whether tactile feedback is to be + * produced for bounce or not. + */ + void SetBounceTactileFeedback( TBool aBounceTactileFeedback ); + + /** + * Checks if view is not drawn during panning + * because of high CPU usage + * + * @since S60 v5.2 + * @internal + */ + TBool IsPanningDrawOmitted() const; + +protected: + + /** + * C++ constructor. + */ + CAknPhysics( MAknPhysicsObserver& aObserver ); + + /** + * Symbian second-phase constructor. + */ + void ConstructL( CCoeControl* aViewControl ); + +private: + + /** + * Physics start. + */ + void StartPhysics(); + + /** + * Apply drag. + * + * @param aDrag Dragging distance. + * @param aMoveTime Dragging movetime. + */ + void ApplyDrag( TPoint aDrag, TInt aMoveTime ); + + /** + * Timer callback. + */ + static TInt Simulate(TAny* aSelf); + + /** + * Physics simulation function. + */ + void DoSimulation(); + + /** + * Cancels the physics timer and resets action state. + */ + void CancelPhysicsTimer(); + + /** + * Updates ongoing action state according to whether physics timer is + * active or not and collision status. + */ + void UpdateActionState(); + + /** + * Returns ETrue if observer view position reveals empty space i.e. + * view is about to bounce. + * + * @return ETrue if observer view position reveals empty space. + */ + TBool ViewAboutToBounce(); + + /** + * Wrapper method for notifying observer of view position change. + * + * @param aPosition New view position. + * @param aDrawNow @c ETrue to inform the observer that it's + * view should be drawn, @c EFalse otherwise, + * in which case the observer should only update + * the logical position. + */ + void NotifyViewPositionChanged( const TPoint& aPosition, + TBool aDrawNow = ETrue ); + +private: // data + + /** + * Simulation timer. + */ + CAknHighResPeriodic* iPhysics; // Own + + /** + * Physics observer. + */ + MAknPhysicsObserver& iObserver; + + /** + * Current world size. + */ + TSize iWorldSize; + + /** + * Current view size. + */ + TSize iViewSize; + + /** + * ETrue if physics works in landscape. + */ + TBool iLandscape; + + /** + * Ongoing action. + */ + TAknPhysicsAction iOngoingAction; + + /** + * Counter to keep track of same successive view positions. + */ + TInt iSamePositionCounter; + + /** + * Physics parameter provider. + * Own. + */ + CAknPhysicsParameterProvider* iParamProvider; + + /** + * Physics restrictor. + * Own. + */ + CAknPhysicsRestrictor* iRestrictor; + + /** + * CONE observer. + * Own. + */ + CAknPhysicsConeObserver* iConeObserver; + + /** + * Physics engine. + * Own. + */ + CAknPhysicsEngine* iEngine; + + /** + * ETrue if maximum flick time exceeded. + */ + TBool iFlickTimeExceeded; + + /** + * Handle to the null thread, used for performance monitoring. + */ + RThread iNullThread; + + /** + * CPU time used by the null thread after the last view draw. + */ + TInt64 iNullThreadTime; + + /** + * Time of the last view draw. + */ + TTime iTimeOfLastDraw; + + /** + * Pointer to touch feedback instance + * Not own. + */ + MTouchFeedback* iFeedback; + + /** + * Flag that indicates whether or not to give tactile feedback when + * bouncing. + */ + TBool iBounceTactileFeedback; + + /** + * ETrue if a panning frame is not drawn on screen because of + * high CPU usage. + */ + TBool iPanningDrawOmitted; + + /** + * ETrue if physics simulation is suspended. + */ + TBool iSuspended; + }; + +#endif // C_AKNPHYSICS_H