diff -r 000000000000 -r 15bf7259bb7c uiacceltk/hitchcock/Client/src/alftexturegroup.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uiacceltk/hitchcock/Client/src/alftexturegroup.cpp Tue Feb 02 07:56:43 2010 +0200 @@ -0,0 +1,444 @@ +/* +* Copyright (c) 2006 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: Group of textures. +* +*/ + + + + +#include "alf/alftexturegroup.h" +#include "alf/alfenv.h" +#include "alf/alftexture.h" + + +NONSHARABLE_CLASS( CAlfInternalTextureLoadObserver ) : public CBase, public MAlfTextureLoadingCompletedObserver + { +public: + + /** + * Static factory method. + * @param aEnv Environment + */ + static CAlfInternalTextureLoadObserver* NewL(CAlfTextureGroup& aTextureGroup); + + /** + * Static factory method. + * @param aEnv Environment + */ + static CAlfInternalTextureLoadObserver* NewLC(CAlfTextureGroup& aTextureGroup); + + /** + * Destructor + */ + virtual ~CAlfInternalTextureLoadObserver(); + + /** + * From MAlfTextureLoadingCompletedObserver + */ + void TextureLoadingCompleted(CAlfTexture& aTexture, + TInt aTextureId, + TInt aErrorCode); + +private: + + /** + * Constructor. + */ + CAlfInternalTextureLoadObserver(); + + /** + * Constructor. + */ + void ConstructL(CAlfTextureGroup& aTextureGroup); + +private: + + CAlfTextureGroup* iTextureGroup; // Not owned + }; + +// Private structure +struct CAlfTextureGroup::TPrivateData + { + /** Environment */ + CAlfEnv* iEnv; + + /** Queue of texture group loading observers. */ + RPointerArray iLoadObserverQueue; + + /** Queue of textures of this group. Textures are not owned by this class */ + RPointerArray iTextures; + + /** Error */ + TInt iError; + + /** Flag to enable/disable observing notifications */ + TBool iObservingNotificationsEnabled; + + /** Observer for texture laodings */ + CAlfInternalTextureLoadObserver* iTextureLoadObserver; + }; + + + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// Constructor +// --------------------------------------------------------------------------- +// +EXPORT_C CAlfTextureGroup::CAlfTextureGroup() + { + + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +EXPORT_C CAlfTextureGroup::~CAlfTextureGroup() + { + while (Count()) + { + RemoveTexture(Texture(Count()-1)); + } + + if ( iData ) + { + iData->iLoadObserverQueue.Close(); + iData->iTextures.Close(); + + delete iData->iTextureLoadObserver; + iData->iTextureLoadObserver = NULL; + } + + delete iData; + } +// --------------------------------------------------------------------------- +// NewL +// --------------------------------------------------------------------------- +// +EXPORT_C CAlfTextureGroup* CAlfTextureGroup::NewL(CAlfEnv& aEnv) + { + CAlfTextureGroup* self = CAlfTextureGroup::NewLC(aEnv); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// NewLC +// --------------------------------------------------------------------------- +// +EXPORT_C CAlfTextureGroup* CAlfTextureGroup::NewLC(CAlfEnv& aEnv) + { + CAlfTextureGroup* self = new( ELeave ) CAlfTextureGroup(); + CleanupStack::PushL( self ); + self->ConstructL(aEnv); + return self; + } + +// --------------------------------------------------------------------------- +// 2nd phase constructor +// --------------------------------------------------------------------------- +// +EXPORT_C void CAlfTextureGroup::ConstructL(CAlfEnv& aEnv) + { + iData = new (ELeave) TPrivateData; + // Zero all data + iData->iEnv = &aEnv; + iData->iError = KErrNone; + iData->iObservingNotificationsEnabled = ETrue; + iData->iTextureLoadObserver = NULL; + + iData->iTextureLoadObserver = CAlfInternalTextureLoadObserver::NewL(*this); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +EXPORT_C void CAlfTextureGroup::AddTextureL(CAlfTexture& aTexture) + { + if (!IsTextureInGroup(aTexture)) + { + TBool addLoadObserver = ETrue; + for(TInt i = 0; i < Count(); i++) + { + if (iData->iTextures[i]->TextureManager() == aTexture.TextureManager()) + { + addLoadObserver = EFalse; + break; + } + } + + iData->iTextures.Append(&aTexture); + + if (addLoadObserver) + { + RegisterAsTextureLoadObserverL(aTexture.TextureManager()); + } + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +EXPORT_C void CAlfTextureGroup::RemoveTexture(CAlfTexture& aTexture) + { + if (IsTextureInGroup(aTexture)) + { + for(TInt i = 0; i < Count(); i++) + { + if (iData->iTextures[i] == &aTexture) + { + iData->iTextures.Remove(i); + iData->iTextures.Compress(); + break; + } + } + + TBool removeLoadObserver = ETrue; + for(TInt i = 0; i < Count(); i++) + { + if (iData->iTextures[i]->TextureManager() == aTexture.TextureManager()) + { + removeLoadObserver = EFalse; + break; + } + } + + if (removeLoadObserver) + { + UnRegisterAsTextureLoadObserver(aTexture.TextureManager()); + } + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +EXPORT_C TBool CAlfTextureGroup::IsLoadingCompleted() const + { + for (TInt i=0; iiTextures.Count(); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +EXPORT_C CAlfTexture& CAlfTextureGroup::Texture( TInt aIndex ) const + { + return *iData->iTextures[aIndex]; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +EXPORT_C void CAlfTextureGroup::AddLoadObserverL(MAlfTextureGroupLoadingCompletedObserver& aObserver) + { + iData->iLoadObserverQueue.Append(&aObserver); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +EXPORT_C void CAlfTextureGroup::RemoveLoadObserver(MAlfTextureGroupLoadingCompletedObserver& aObserver) + { + TInt count = iData->iLoadObserverQueue.Count(); + for(TInt i = 0; i < count; i++) + { + if (iData->iLoadObserverQueue[i] == &aObserver) + { + iData->iLoadObserverQueue.Remove(i); + iData->iLoadObserverQueue.Compress(); + break; + } + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +EXPORT_C void CAlfTextureGroup::EnableLoadObservers(TBool aEnable) + { + iData->iObservingNotificationsEnabled = aEnable; + } + + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CAlfTextureGroup::NotifyTextureAvailability(CAlfTexture& aTexture, + TInt aErrorCode) + { + if (IsTextureInGroup(aTexture)) + { + if (aErrorCode != KErrNone) + { + iData->iError = aErrorCode; + } + + if (IsLoadingCompleted() && iData->iObservingNotificationsEnabled) + { + NotifyObservers(); + } + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TBool CAlfTextureGroup::IsTextureInGroup(CAlfTexture& aTexture) const + { + TInt count = iData->iTextures.Count(); + for(TInt i = 0; i < Count(); i++) + { + if (iData->iTextures[i] == &aTexture) + { + return ETrue; + } + } + return EFalse; + } + + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CAlfTextureGroup::NotifyObservers() + { + TInt count = iData->iLoadObserverQueue.Count(); + for(TInt i = 0; i < count; i++) + { + iData->iLoadObserverQueue[i]->TextureGroupLoadingCompleted(*this,iData->iError); + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CAlfTextureGroup::RegisterAsTextureLoadObserverL(CAlfTextureManager* aManager) + { + if (aManager) + { + aManager->AddLoadObserverL(iData->iTextureLoadObserver); + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CAlfTextureGroup::UnRegisterAsTextureLoadObserver(CAlfTextureManager* aManager) + { + if (aManager) + { + aManager->RemoveLoadObserver(iData->iTextureLoadObserver); + } + } + + + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CAlfInternalTextureLoadObserver* CAlfInternalTextureLoadObserver::NewL(CAlfTextureGroup& aTextureGroup) + { + CAlfInternalTextureLoadObserver* self = CAlfInternalTextureLoadObserver::NewLC(aTextureGroup); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CAlfInternalTextureLoadObserver* CAlfInternalTextureLoadObserver::NewLC(CAlfTextureGroup& aTextureGroup) + { + CAlfInternalTextureLoadObserver* self = new( ELeave ) CAlfInternalTextureLoadObserver(); + CleanupStack::PushL( self ); + self->ConstructL(aTextureGroup); + return self; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CAlfInternalTextureLoadObserver::~CAlfInternalTextureLoadObserver() + { + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CAlfInternalTextureLoadObserver::CAlfInternalTextureLoadObserver() + { + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CAlfInternalTextureLoadObserver::ConstructL(CAlfTextureGroup& aTextureGroup) + { + iTextureGroup = &aTextureGroup; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CAlfInternalTextureLoadObserver::TextureLoadingCompleted(CAlfTexture& aTexture, + TInt /*aTextureId*/, + TInt aErrorCode) + { + iTextureGroup->NotifyTextureAvailability(aTexture, aErrorCode); + } +