lafagnosticuifoundation/animation/src/AnimationTicker.cpp
changeset 0 2f259fa3e83a
--- /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 <e32std.h>
+
+#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<CAnimationTicker*>(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() {}