diff -r 000000000000 -r 2f259fa3e83a lafagnosticuifoundation/animation/src/AnimationTicker.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lafagnosticuifoundation/animation/src/AnimationTicker.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,164 @@ +// Copyright (c) 2004-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: +// + +#include "AnimationTicker.h" + +#include + +#include "AnimationMixins.h" + +/** +Two stage constructor. + +After construction, the ticker is already active. + +Creates a new CAnimationTicker with the specified time period in microseconds. +The time period aTickLength must be greater than 0 otherwise the caller will be panicked. See CPeriodic for the panic code raised. + +@see MAnimationTickee +@see CPeriodic +@param aTickLength The resolution of the timer. +@return The new object +*/ +EXPORT_C CAnimationTicker* CAnimationTicker::NewL(TTimeIntervalMicroSeconds32 aTickLength) + { + CAnimationTicker* self = new (ELeave) CAnimationTicker; + CleanupStack::PushL(self); + self->ConstructL(aTickLength); + CleanupStack::Pop(self); + return self; + } + +/** Destructor.*/ +EXPORT_C CAnimationTicker::~CAnimationTicker() + { + delete iPeriodic; + iTickees.Reset(); + } + +CAnimationTicker::CAnimationTicker() + { + } + +static TInt OnTickCb(TAny* self) + { + TRAPD(err, static_cast(self)->OnTick()); + return err; + } + +void CAnimationTicker::ConstructL(TTimeIntervalMicroSeconds32 aTickLength) + { + iTickLength = aTickLength; + } + +void CAnimationTicker::StartTickingL() + { + if(!iPeriodic) + { + iPeriodic = CPeriodic::NewL(EPriorityLess); + TCallBack callback(OnTickCb, this); + iPeriodic->Start(iTickLength, iTickLength, callback); + } + } + +void CAnimationTicker::StopTicking() + { + delete iPeriodic; + iPeriodic = 0; + } + +void CAnimationTicker::OnTick() + { + if (iFreeze == 0) + { + for (TInt tt = iTickees.Count() - 1; tt >= 0; --tt) + { + iTickees[tt]->Tick(); + } + } + } + +/** +Adds a new tickee to the internal list. All added tickees will be called +once every tick. +@param aTickee An object derived from MAnimationTickee +@return KErrNone or one of the other system wide error codes +*/ +EXPORT_C TInt CAnimationTicker::Add(MAnimationTickee* aTickee) + { + TInt err = iTickees.Append(aTickee); + if (err == KErrNone) + { + TRAP(err,StartTickingL()) + }; + return err; + } + +/** +Removes a tickee from the internal list. Attempting to remove a tickee +that has not been added is not an error, and has no effect. +@param aTickee An object added using Add() +@return KErrNone or KErrNotFound +*/ +EXPORT_C TInt CAnimationTicker::Remove(MAnimationTickee* aTickee) + { + TInt entry = iTickees.Find(aTickee); + if (entry >= 0) + { + iTickees.Remove(entry); + if (iTickees.Count() < 1) + StopTicking(); + return KErrNone; + } + return KErrNotFound; + } + +/** +Freezes this ticker + +This allows asynchronous actions to be taken for more than one animation without the +animations getting out of synch with each other. + +It is possible to freeze multiple times. Doing so will increment a reference counter +and the ticker will not be unfrozen until every freeze has been matched by a call +to unfreeze. + +You should not need to call this function unless you are writing a new animation type. +@see CAnimationTicker::Unfreeze() +*/ +EXPORT_C void CAnimationTicker::Freeze() + { + ++iFreeze; + } + +/** +Under some circumstances it may be necessary to handle unfreezing directly, +instead of through the item on the cleanupstack. In this case the cleanup item +should be popped and then Unfreeze called when appropriate. + +You should not need to call this function unless you are writing a new animation type. +@see CAnimationTicker::Freeze() +*/ +EXPORT_C void CAnimationTicker::Unfreeze() + { + if(iFreeze > 0) + --iFreeze; + } + +/** Reserved for future use */ +EXPORT_C void CAnimationTicker::CAnimationTicker_Reserved1() {} + +/** Reserved for future use */ +EXPORT_C void CAnimationTicker::CAnimationTicker_Reserved2() {}