menufw/menufwui/mmwidgets/inc/mmdraweranimator.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 08:40:49 +0200
changeset 0 f72a12da539e
child 38 79311d856354
permissions -rw-r--r--
Revision: 200949 Kit: 200951

/*
* Copyright (c)  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:  CMmDrawerAnimator declaration
*  Version     : %version: MM_17.1.8 % << Don't touch! Updated by Synergy at check-out.
*
*/


#ifndef C_MMDRAWERANIMATOR_H
#define C_MMDRAWERANIMATOR_H

#include <e32base.h>
#include <e32std.h>
#ifdef RD_UI_TRANSITION_EFFECTS_LIST
#include <aknlistloadertfx.h>
#include <aknlistboxtfxinternal.h>
#include <aknlistboxtfx.h>
#endif 
class CMmListBoxItemDrawer;
class TMmFloatingItem;

/**
 * Zoom ratio when no zooming is performed.
 */
const TReal KNormalStateZoomRatio = 1.0f;

/**
 * Zoom ratio when zooming is performed.
 */
const TReal KZoomStateZoomRatio = 1.25f;

/**
 *  Used by Multimedia Menu to draw Animated items.
 *  Drawer animator is an active object, that forces refreshes
 *  while floating items are available in the associated CListBoxItemDrawer.
 *  When no items are available the drawer ceases to redraw the screen.
 *  Active object becomes active when a new animation is triggered.
 *
 *  @code
 *  @endcode
 *  @lib mmwidgets
 *  @since S60 v5.0
 *  @see CListBoxItemDrawer
 *  @ingroup group_mmwidgets
 */
NONSHARABLE_CLASS( CMmDrawerAnimator ) : public CActive
    {
    
public:
    /**
     * Two-phased constructor.
     * 
     * @since S60 v5.0
     * @param aDrawer Item drawer used to draw item.
     */
    static CMmDrawerAnimator* NewL( CMmListBoxItemDrawer& aDrawer );

    /**
     * Two-phased constructor.
     * 
     * @since S60 v5.0
     * @param aDrawer Item drawer used to draw item.
     */
    static CMmDrawerAnimator* NewLC( CMmListBoxItemDrawer& aDrawer );
    
    /**
     * Destructor.
     * 
     * @since S60 v5.0
     */
    virtual ~CMmDrawerAnimator();

    /**
     * Animates transition of the dragged item.
     * The animation starts in the current position of EDrag
     * floating item, and end in the original place of dragging
     * or destination place, if reorder occured.
     *
     * @since S60 v5.0
     */
    void AnimateDragItemTransitionL( );
    
    /**
     * Animates an item with index aItemFrom into position 
     * indexed by aItemTo.
     *
     * @since S60 v5.0
     * @param aItemFrom Which item should be animated.
     * @param aItemTo Where to should the item be animated.
     */
    void AnimateItemSwapL( TInt aItemFrom, TInt aItemTo );

    /**
     * Animates zooming of an item.
     *
     * @since S60 v3.0
     * @param aItemIndex Index of item to be zoomed.
     * @param aZoomIn Is zooming in or out.
     */
    void AnimateItemZoomL( TInt aItemIndex, TBool aZoomIn );

    /**
     * Checks if system is ready for new animation.
     *
     * @since S60 v5.0
     * @return Is system ready so new animation can proceed.
     */
    TBool IsReadyForNewAnimation();
    
    /**
     * Cancel currently running or pending animations.
     *
     * @since S60 v5.0
     */
    void CancelAnimationsL();
    
    /**
     * Triggers animation.
     * This methods sets the Activeobject into active state
     * if floating items are available
     *
     * @since S60 v5.0
     * @return Error code
     */
    TInt Trigger();
    
    /**
     * Marks next redraw to be cancelled.
     * 
     * @return Indicates if redraw occured due to cancel.
     */
    TBool CancelNextRedrawL();
    
    /**
     * Make the next animation redraw the whole screen;
     */
    void SetNextRedrawToWholeScreen();
    
    /**
     * Indicates that draweranimator is in garbage.
     * This is used when suite model has been destroyed so there isn't 
     * anything to draw, therefore any animator attempts should be 
     * dropped.
     */
    void PrepareForGarbage();
    
private:
	
    /**
     * Default constructor.
     * 
     * @since S60 v3.0
     * @param aDrawer Object used to draw items in widgets.
     */
    CMmDrawerAnimator( CMmListBoxItemDrawer& aDrawer );
    
    /**
     * 2nd phase constructor.
     *
     * @since S60 v3.0 
     */
    void ConstructL();

private: // From CActive

    /**
     * Draws next animation phase.
     *
     * @since S60 v3.0
     */
    void RunL();

    /**
     * Cancels animation timer. Stops animation.
     *
     * @since S60 v3.0
     */
    void DoCancel();

    /**
     * Handles error if error an error occured.
     *
     * @since S60 v3.0
     * @param aError Error code which occurred.
     * @return Error code for error handling.
     */
    TInt RunError( TInt aError );
    
    /**
     * Adjusts rect to non touch.
     * 
     * @since S60 v3.0
     * @param aRefreshRect Refresh rect.
     * @return Adjusted rect.
     */
    TRect AdjustRefreshRectToNonTouch( const TRect& aRefreshRect );

private: // Data
	
    /**
     * Timer
     */  
    RTimer iTimer;
    
    /**
     * Associated item drawer.
     */  
    CMmListBoxItemDrawer& iDrawer;
    
    /**
     * Number of animation frames
     */  
    TInt iAnimateFrames;

    /**
     * Delay between redrawing.
     */  
    TTimeIntervalMicroSeconds iDelay;
   
    /**
     * Last redraw time
     */  
    TTime iLastRedrawTime;
      
    /**
     * Effects api.
     */  
    MAknListBoxTfx *iTransTfx;
    
    /**
     * Effects api.
     */  
    MAknListBoxTfxInternal *iTransTfxInternal;
    
    /**
     * Highlight noted when last redraw occured.
     */
    TInt iLastNotedHighlight;
    
    /**
     * Top item index noted when last redraw occured.
     */
    TInt iLastNotedTopItem;
    
    /**
     * Vertical offset noted when last redraw occured.
     */
    TInt iLastNotedVerticalOffset;
    
    /**
     * Holds the previous animation refresh rectangle.
     */
    TRect iPreviousRefreshRect;
    
    /**
     * Holds the number of frames to animate.
     */
    const TInt iUsualAnimationFramesCount;
    
    /**
     * Holds the previous animation refresh rectangle.
     */
    TBool iPreparedForGarbage;
    };

#endif // MMDRAWERANIMATOR_H