diff -r 000000000000 -r f72a12da539e idlehomescreen/nativeuicontroller/src/ainavipaneanimator.cpp --- /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( 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; + }