diff -r 000000000000 -r 2f259fa3e83a uifw/EikStd/coctlsrc/gfxtransextension.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uifw/EikStd/coctlsrc/gfxtransextension.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,301 @@ +/* +* Copyright (c) 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: Utility class for passing data between controls. +* +*/ + + +#include "gfxtransextension.h" + +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// +CGfxTransExtension::TDataEntry::TDataEntry( const TInt aKey, + const TDesC8* aData ) : + iKey( aKey ), iData( aData ) + { + } + +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// +TBool CGfxTransExtension::TDataEntry::SameKey( const TDataEntry& aEntry1, + const TDataEntry& aEntry2 ) + { + return aEntry1.iKey == aEntry2.iKey; + } + + +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// +CGfxTransExtension::TTransitionObserver::TTransitionObserver( + const TInt aKey, const TInt aEventType, + MAknTransitionUtilsObserver* aObserver ) : + iKey( aKey ), iObserver( aObserver ), iEventType( ( TEvents )aEventType ) + { + } + +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// +TBool CGfxTransExtension::TTransitionObserver::SameKey( + const TTransitionObserver& aObserver1, + const TTransitionObserver& aObserver2 ) + { + return aObserver1.iKey == aObserver2.iKey; + } + +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// +TBool CGfxTransExtension::TTransitionObserver::Equal( + const TTransitionObserver& aObserver1, + const TTransitionObserver& aObserver2 ) + { + return ( aObserver1.iObserver == aObserver2.iObserver ) && + ( aObserver1.iEventType == aObserver2.iEventType ); + } + +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// +CGfxTransExtension::~CGfxTransExtension() + { + TInt count = iUserData.Count(); + + for ( TInt i = 0; i < count; i++ ) + { + delete iUserData[i].iData; + } + + iUserData.Reset(); + iObservers.Reset(); + }; + +/* + static TInt GetState(TInt aEvent, TInt* aState, TDes8* aParams = NULL); + + // FIXME: TDes8 instead of TAny + static TInt SetData( const TInt aKey, TAny* aData ); + static TAny* GetData( const TInt aKey ); + static void RemoveData( const TInt aKey ); +*/ + +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// +TInt CGfxTransExtension::AddObserver( MAknTransitionUtilsObserver* aObserver, + TInt aEvent, + const TDesC8* aParams ) + { + CGfxTransExtension* singleton = + reinterpret_cast(CCoeEnv::Static( KGfxTransExtensionUid ) ); + if ( !singleton ) + { + return KErrNoMemory; + } + + TInt key = ( TInt )aParams; + TInt count = singleton->iObservers.Count(); + TBool exists = EFalse; + for ( TInt i = 0; i < count; i++ ) + { + TTransitionObserver o = singleton->iObservers[i]; + if ( ( o.iEventType == aEvent ) && ( o.iObserver == aObserver ) ) + { + exists = ETrue; + break; + } + } + + if ( !exists ) + { + TTransitionObserver observer( key, aEvent, aObserver ); + singleton->iObservers.Append( observer ); + } + + if ( aEvent == EEventControlTransitionFinished ) + { + GfxTransEffect::SetTransitionObserver( singleton ); + singleton->iNumControlTransitionObservers++; + } + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// +TInt CGfxTransExtension::RemoveObserver( + MAknTransitionUtilsObserver* aObserver, TInt aEvent ) + { + CGfxTransExtension* singleton = CGfxTransExtension::Static(); + if ( !singleton ) + { + return KErrNotFound; + } + + TIdentityRelation identity( TTransitionObserver::Equal ); + TTransitionObserver tmp( 0, aEvent, aObserver ); + TInt index = singleton->iObservers.Find( tmp, identity ); + if ( index != KErrNotFound ) + { + singleton->iObservers.Remove( index ); + if ( aEvent == EEventControlTransitionFinished ) + { + singleton->iNumControlTransitionObservers--; + } + + if ( singleton->iNumControlTransitionObservers == 0 ) + { + GfxTransEffect::SetTransitionObserver( NULL ); + } + + return KErrNone; + } + + return KErrNotFound; + } + +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// +TInt CGfxTransExtension::GetState(TInt /*aEvent*/, TInt* /*aState*/, TDes8* /*aParams*/ ) + { + return 0; + } + +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// +void CGfxTransExtension::TransitionFinished( const CCoeControl* aControl, + TUint /* aAction */ ) + { + CGfxTransExtension* singleton = + reinterpret_cast(CCoeEnv::Static( KGfxTransExtensionUid ) ); + if ( !singleton ) + { + return; + } + + TInt key = ( TInt )aControl; + + TInt count = singleton->iObservers.Count(); + for ( TInt i = 0; i < count; i++ ) + { + if ( singleton->iObservers[i].iKey == key ) + { + singleton->iObservers[i].iObserver->AknTransitionCallback( + EEventControlTransitionFinished, 0, ( const TDesC8* )aControl ); + } + } + } + +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// +void CGfxTransExtension::RemoveData( const TInt aKey ) + { + CGfxTransExtension* singleton = CGfxTransExtension::Static(); + if ( !singleton ) + { + return; + } + + // Find the data + TIdentityRelation identity( TDataEntry::SameKey ); + TDataEntry tmp( aKey, NULL ); + TInt index = singleton->iUserData.Find( tmp, identity ); + if ( index != KErrNotFound ) + { + delete singleton->iUserData[index].iData; + singleton->iUserData.Remove( index ); + } + } + +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// +TInt CGfxTransExtension::SetData( const TInt aKey, const TDesC8* aData ) + { + CGfxTransExtension* singleton = CGfxTransExtension::Static(); + if ( !singleton ) + { + return KErrNoMemory; + } + + TIdentityRelation identity( TDataEntry::SameKey ); + TDataEntry tmp( aKey, aData ); + TInt index = singleton->iUserData.Find( tmp, identity ); + if ( index != KErrNotFound ) + { + delete singleton->iUserData[index].iData; + singleton->iUserData[index].iData = aData; + } + else + { + singleton->iUserData.Append( tmp ); + } + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// +const TDesC8* CGfxTransExtension::GetData( const TInt aKey ) + { + CGfxTransExtension* singleton = CGfxTransExtension::Static(); + if ( !singleton ) + { + return NULL; + } + + TIdentityRelation identity( TDataEntry::SameKey ); + TDataEntry tmp( aKey, NULL ); + TInt index = singleton->iUserData.Find( tmp, identity ); + if ( index != KErrNotFound ) + { + return singleton->iUserData[index].iData; + } + else + { + return NULL; + } + } + +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// +CGfxTransExtension::CGfxTransExtension() : + CCoeStatic( KGfxTransExtensionUid, -1, CCoeStatic::EThread ), + iNumControlTransitionObservers( 0 ) + { + } + +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// +CGfxTransExtension* CGfxTransExtension::Static() + { + CGfxTransExtension* singleton = + reinterpret_cast(CCoeEnv::Static( KGfxTransExtensionUid ) ); + if ( !singleton ) + { + singleton = new CGfxTransExtension(); + } + + return singleton; + }