/*
* Copyright (c) 2006-2007 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:  Navi pane animator.
*
*/


#ifndef C_AINAVIPANEANIMATOR_H
#define C_AINAVIPANEANIMATOR_H

#include <e32base.h>
#include "ainativeuimodel.h"

namespace AiNativeUiController
{

class CAiStatusPanel;
class MAiNaviPaneAnimatorCallback;

/**
 *  Navi pane animator.
 *
 *  This class handles the navi pane animation when XML Idle gets the focus.
 *  It owns an array that is used for storing all data that is shown in form of
 *  soft indicators. It animates all items in the array in one second intervals. 
 *
 *  @since S60 3.2
 */
class CAiNaviPaneAnimator : public CBase
    {

public:

    static CAiNaviPaneAnimator* NewL( CAiStatusPanel& aStatusPane,
                AiNativeUiModel::TRenderingPriorities& aPriorities, 
                MAiNaviPaneAnimatorCallback& aCallback );

    virtual ~CAiNaviPaneAnimator();
    
    /**
     * Adds content item to the animator array.
     * @param aContentId Content item which value needs to be updated.
                            If item with same aContentId already exists in 
                            the array, it's value is updated. If not, new
                            item is created.
     * @param aText New value for aContentId.
     */
    void AddItemL( TInt aContentId, const TDesC16& aText );

    /**
     * Removes content item with given content id.
     * @param aContentId Content item which needs to be removed.
     */
    void RemoveItem( TInt aContentId );
     
    /**
     * Animates the content of the array.
     */
    void AnimateL();
     
    /**
     * Cancels ongoing animation (if there is one).
     */
    void CancelAnimationL();
    
    /**
     * Called by CPeriodic when timer expires.
     */
    static TInt CAiNaviPaneAnimator::AnimCallback( TAny* aPtr );     

    /**
     * Draws the text to navi pane.
     * This method is called by timer. It checks if there still are items left
     * in the animation array. If yes, it draws the current item's value. 
     * If not,it cancels the timer.
     */
    TBool DrawTextL();

    /**
     * Sorts iAnimArray in priority order defined by TRenderingPriorities.
     */
    void SortAnimArrayL();
    
    /**
     * Is ongoing animation
     */
    TBool IsActive();


private:

    CAiNaviPaneAnimator( CAiStatusPanel& aStatusPane,
                AiNativeUiModel::TRenderingPriorities& aPriorities, 
                MAiNaviPaneAnimatorCallback& aCallback );

    void ConstructL();
    
    /**
     * Helper class for animation array items.
     * Can be defined as an inner class since not used outside parent class.
     */
    class CAiNameValuePair : public CBase
        {
        public:
        
            static CAiNameValuePair* NewLC( const TInt aName, 
                                            const TDesC& aValue );

            ~CAiNameValuePair();

            TInt Name() const;

            const TDesC16& Value() const;

            void SetValueL( const TDesC& aValue );
            
        private:
        
            void ConstructL( const TInt aName, const TDesC& aValue );
        
        private:    // data
        
            /// Name of the item in name/value pair
            TInt iName;
            
            /// Value or the item in name/value pair
            HBufC* iValue;
        };        


private: // data

    /**
     * Used for doing the animation.
     * Own.
     */
    CPeriodic* iPeriodic;
    
    /// Status pane handler.
    CAiStatusPanel& iStatusPane;
    
    /// Navi pane rendering priorities
    AiNativeUiModel::TRenderingPriorities& iPriorities;
    
    /// Reference for informing about completed animation.
    MAiNaviPaneAnimatorCallback& iCallback;

    /// Array for holding data to be animated.
    RPointerArray<CAiNameValuePair> iAnimArray;
    
    /// Currently ongoing iteration of the animator array.
    TInt iCurrentItem;

    };
    
} // namespace AiNativeUiController

#endif // C_AINAVIPANEANIMATOR_H
