idlehomescreen/nativeuicontroller/src/ainavipaneanimator.cpp
changeset 0 f72a12da539e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/nativeuicontroller/src/ainavipaneanimator.cpp	Thu Dec 17 08:40:49 2009 +0200
@@ -0,0 +1,228 @@
+/*
+* Copyright (c) 2005-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:  Navipane animator.
+*
+*/
+
+
+#include "ainavipaneanimator.h"
+#include "aistatuspanel.h"
+#include "ainavipaneanimatorcallback.h"
+
+using namespace AiNativeUiController;
+
+const TInt KAnimDelay = 2000000;
+
+
+CAiNaviPaneAnimator::CAiNaviPaneAnimator( CAiStatusPanel& aStatusPane,
+                AiNativeUiModel::TRenderingPriorities& aPriorities,
+                MAiNaviPaneAnimatorCallback& aCallback )
+    : iStatusPane( aStatusPane ),
+        iPriorities( aPriorities ),
+        iCallback( aCallback )
+    {
+    }
+
+
+void CAiNaviPaneAnimator::ConstructL()
+    {
+    iPeriodic = CPeriodic::NewL( CActive::EPriorityStandard );
+    }
+
+
+CAiNaviPaneAnimator* CAiNaviPaneAnimator::NewL( CAiStatusPanel& aStatusPane,
+                AiNativeUiModel::TRenderingPriorities& aPriorities,
+                MAiNaviPaneAnimatorCallback& aCallback )
+    {
+    CAiNaviPaneAnimator* self = new( ELeave )CAiNaviPaneAnimator( aStatusPane,
+                                                            aPriorities,
+                                                            aCallback );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+CAiNaviPaneAnimator::~CAiNaviPaneAnimator()
+    {
+    iAnimArray.ResetAndDestroy();
+    if( iPeriodic )
+        {
+        iPeriodic->Cancel();
+        delete iPeriodic;
+        }
+    }
+
+
+void CAiNaviPaneAnimator::AddItemL( TInt aContentId, const TDesC16& aText )
+    {
+    const TInt count = iAnimArray.Count();
+    for( TInt i = 0; i < count; i++ )
+        {
+        if( iAnimArray[i]->Name() == aContentId )
+            {
+            iAnimArray[i]->SetValueL( aText );
+            return;
+            }
+        }
+
+    CAiNameValuePair* newItem = CAiNameValuePair::NewLC(
+                                                    aContentId,
+                                                    aText );
+    User::LeaveIfError( iAnimArray.Append( newItem ) );
+    CleanupStack::Pop( newItem );
+    }
+
+
+void CAiNaviPaneAnimator::RemoveItem( TInt aContentId )
+    {
+    const TInt count = iAnimArray.Count();
+    for( TInt i = 0; i < count; i++ )
+        {
+        if( iAnimArray[i]->Name() == aContentId )
+            {
+            delete iAnimArray[i];
+            iAnimArray[i] = NULL;
+            iAnimArray.Remove( i );
+            return;
+            }
+        }
+    }
+
+
+void CAiNaviPaneAnimator::CancelAnimationL()
+    {
+    if( iPeriodic->IsActive() )
+        {
+        iPeriodic->Cancel();
+        iCurrentItem = 0;
+        iCallback.AnimationCompleteL();
+        }
+    }
+
+TBool CAiNaviPaneAnimator::IsActive()
+	{
+	return iPeriodic->IsActive();
+	}
+
+void CAiNaviPaneAnimator::AnimateL()
+    {
+    if( !iPeriodic->IsActive() )
+        {
+        SortAnimArrayL();
+        //draw first item immediately
+        if( DrawTextL() )
+            {
+            iPeriodic->Start( KAnimDelay, KAnimDelay, TCallBack( AnimCallback, this ) );
+            }
+        }
+    }
+
+
+TInt CAiNaviPaneAnimator::AnimCallback( TAny* aPtr )
+    {
+    CAiNaviPaneAnimator* self = static_cast<CAiNaviPaneAnimator*>( aPtr );
+
+    if( self )
+        {
+        TRAP_IGNORE( self->DrawTextL() );
+        }
+
+    return KErrNone;
+    }
+
+
+TBool CAiNaviPaneAnimator::DrawTextL()
+    {
+    if( iCurrentItem < iAnimArray.Count() )
+        {
+        iStatusPane.SetNaviPaneTextL( iAnimArray[iCurrentItem]->Value() );
+        iStatusPane.RenderNaviPaneL();
+        ++iCurrentItem;
+        return ETrue;
+        }
+    else
+        {
+        iPeriodic->Cancel();
+        iCurrentItem = 0;
+        iCallback.AnimationCompleteL();
+        return EFalse;
+        }
+    }
+
+void CAiNaviPaneAnimator::SortAnimArrayL()
+    {
+    const TInt count = iAnimArray.Count();
+    
+    // loop through the animator array and sort items in priority order
+    for( TInt i = 0; i < count - 1; i++ )
+        {
+        for( TInt k = i + 1; k < count; k++)
+            {
+            if( iPriorities.RenderingPriority( iAnimArray[i]->Name() ) <
+                iPriorities.RenderingPriority( iAnimArray[k]->Name() ) )
+                {
+                CAiNameValuePair* temp = iAnimArray[k];
+                iAnimArray[k] = iAnimArray[i];
+                iAnimArray[i] = temp;
+                }
+            }
+        }
+    }
+
+
+CAiNaviPaneAnimator::CAiNameValuePair*
+CAiNaviPaneAnimator::CAiNameValuePair::NewLC( const TInt aName,
+                                                const TDesC& aValue )
+    {
+    CAiNameValuePair* self = new( ELeave ) CAiNameValuePair();
+    CleanupStack::PushL( self );
+    self->ConstructL( aName, aValue );
+    return self;
+    }
+
+
+void CAiNaviPaneAnimator::CAiNameValuePair::ConstructL( const TInt aName,
+                                                        const TDesC& aValue )
+    {
+    iName = aName;
+    iValue = aValue.AllocL();
+    }
+
+
+CAiNaviPaneAnimator::CAiNameValuePair::~CAiNameValuePair()
+    {
+    delete iValue;
+    }
+
+
+TInt CAiNaviPaneAnimator::CAiNameValuePair::Name() const
+    {
+    return iName;
+    }
+
+
+const TDesC16& CAiNaviPaneAnimator::CAiNameValuePair::Value() const
+    {
+    return *iValue;
+    }
+
+
+void CAiNaviPaneAnimator::CAiNameValuePair::SetValueL( const TDesC& aValue )
+    {
+    HBufC* temp = aValue.AllocL();
+    delete iValue;
+    iValue = temp;
+    }