diff -r 000000000000 -r e83bab7cf002 mulwidgets/common/src/mulimagevisualattributesetter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mulwidgets/common/src/mulimagevisualattributesetter.cpp Thu Dec 17 08:56:02 2009 +0200 @@ -0,0 +1,360 @@ +/* +* 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: Attribute setter implementation for mulimage visual. + * +*/ + + +// Class header +#include "../inc/mulimagevisualattributesetter.h" + +// Alf headers +#include "alf/alfattribute.h" +#include +#include +#include "alf/alfattributecontainer.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include //for resource pooling +#include //for resource pooling +// Osn headers +#include +#include +//#include +// Std headers +#include +#include +// DUI headers +#include "alf/attrproperty.h" + +//for logs +#include "mullog.h" +#include "mulutility.h" + +using namespace osncore; + +using namespace duiuimodel::imagevisualattributes; +using namespace duiuimodel::commonvisualattributes; +using namespace duiuimodel::layoutattributes; + +namespace Alf + { + +class MulImageVisualAttributeSetterImpl + { +public: + MulImageVisualAttributeSetterImpl(); + ~MulImageVisualAttributeSetterImpl(); +public: + //Keep track of loaded texture for imagevisuals. + //Texture manager doesn't unload the texture from memory untill Env is deleted. + //Hence need to unload them once attribute setter is deleted. + AlfPtrVector mLoadedTextures; + //Env needed to access TextureManager while unloading textures. + CAlfEnv* mEnv; + }; + + +// --------------------------------------------------------------------------- +// Constructor +// --------------------------------------------------------------------------- +// +MulImageVisualAttributeSetterImpl::MulImageVisualAttributeSetterImpl() + { + MUL_LOG_INFO("aakash::CMulImageVisualAttributeSetterImpl::MulImageVisualAttributeSetterImpl"); + //Do not delete textures here as they may be in use by the visuals that have not been deleted. + mLoadedTextures.setAutoDelete (false); + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +MulImageVisualAttributeSetterImpl::~MulImageVisualAttributeSetterImpl() + { + MUL_LOG_INFO("aakash::CMulImageVisualAttributeSetterImpl::~MulImageVisualAttributeSetterImpl"); + //Unload all loaded textures created by this attributesetter to free up the memory. + for (int i =0; iTextureManager().UnloadTexture (texture->Id ()); + } + mLoadedTextures.clear (); + } + +// --------------------------------------------------------------------------- +// Constructor +// --------------------------------------------------------------------------- +// + OSN_EXPORT MulImageVisualAttributeSetter::MulImageVisualAttributeSetter() + { + MUL_LOG_INFO("aakash::CMulImageVisualAttributeSetter::MulImageVisualAttributeSetter"); + mImpl.reset(new (EMM) MulImageVisualAttributeSetterImpl()); + mImageAttrSetter.reset(new (EMM) AlfImageVisualAttributeSetter()); + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +OSN_EXPORT MulImageVisualAttributeSetter::~MulImageVisualAttributeSetter() + { + MUL_LOG_INFO("aakash::CMulImageVisualAttributeSetter::~MulImageVisualAttributeSetter"); + } + +// --------------------------------------------------------------------------- +// Sets Attribute Value. Delegates based on attribute Category. +// --------------------------------------------------------------------------- +// +OSN_EXPORT void MulImageVisualAttributeSetter::setAttributeValue ( + CAlfVisual &aVisual, + AlfAttributeContainer* aContainer, + IAlfMap* aData ) + { + MUL_LOG_INFO("aakash::CMulImageVisualAttributeSetter::setAttributeValue"); + mData = aData; + CAlfImageVisual* imageVisual = dynamic_cast(&aVisual); + if (!imageVisual) + { + ALF_THROW ( AlfVisualException, EInvalidVisual, "AlfImageVisualAttributeSetter") + } + AlfCommonVisualAttributeSetter::setAttributeValue(aVisual,aContainer, aData); + } +// --------------------------------------------------------------------------- +// HandleStaticDataAttribute +// --------------------------------------------------------------------------- +// +void MulImageVisualAttributeSetter::handleStaticDataAttribute( + CAlfVisual &aVisual, AlfAttribute& aAttr, + AlfAttributeContainer& aContainer, IAlfMap* aData) + { + MUL_LOG_INFO("aakash::CMulImageVisualAttributeSetter::handleStaticDataAttribute"); + CAlfImageVisual* imageVisual = dynamic_cast(&aVisual); + if ( !imageVisual) + { + ALF_THROW ( AlfVisualException, EInvalidVisual, "CAlfImageVisualAttributeSetter") + } + + if ( !aData) ALF_THROW ( AlfDataException, EInvalidVariantDataType, "CAlfTextVisualAttributeSetter" ) + + const char* dataField = aAttr.getDataField (); + if ( !dataField) ALF_THROW ( AlfDataException, EInvalidAttribute, "CAlfTextVisualAttributeSetter" ) + + IAlfVariantType* data = aData->item (UString( dataField )); + const char* attrName = aAttr.name (); + if ( data) + { + if( !strcmp(attrName, KImagePath)) + { + if ( data->type ()== IAlfVariantType::EString) + { + if ( IsSVGImage (data->string ())) + { + LoadImageFromSvg(data->string (),*imageVisual); + } + else if (MulUtility::IsPoolResource(data->string ())) + { + //using resource pooling mechanism for image visual + ResourcePool& pool = AlfWidgetEnvExtension::resourcePool(imageVisual->Env()); + imageVisual->SetImage(pool.getImageResource((data->string ().getUtf8()))); + } + else + { + //AlfImageVisualAttributeSetter::handleStaticDataAttribute(aVisual,aAttr,aContainer,aData); + mImageAttrSetter->setAttributeValue(aVisual,&aContainer,aData); + } + } + else if ( data->type ()== IAlfVariantType::EInt) + { + LoadImageFromTexture(data->integer(),*imageVisual); + } + } + else if( !strcmp(attrName, KSecondaryImagePath)) + { + if ( data->type ()== IAlfVariantType::EString) + { + if ( IsSVGImage (data->string ())) + { + LoadImageFromSvg(data->string (),*imageVisual); + } + else if (MulUtility::IsPoolResource(data->string ())) + { + //using resource pooling mechanism for image visual + ResourcePool& pool1 = AlfWidgetEnvExtension::resourcePool(imageVisual->Env()); + imageVisual->SetImage(pool1.getImageResource((data->string ().getUtf8()))); + } + else + { + mImageAttrSetter->setAttributeValue(aVisual,&aContainer,aData); + } + } + else if ( data->type ()== IAlfVariantType::EInt) + { + LoadImageFromTexture(data->integer(),*imageVisual); + } + } + else + { + mImageAttrSetter->setAttributeValue(aVisual,&aContainer,aData); + } + } + } + +// --------------------------------------------------------------------------- +// handleStaticAttribute +// --------------------------------------------------------------------------- +// +void MulImageVisualAttributeSetter::handleStaticAttribute( CAlfVisual& aVisual, + AlfAttribute& aAttr, + AlfAttributeContainer& aContainer ) + { + MUL_LOG_INFO("aakash::CMulImageVisualAttributeSetter::handleStaticAttribute"); + CAlfImageVisual* imageVisual = dynamic_cast(&aVisual); + if ( !imageVisual) + { + ALF_THROW ( AlfVisualException, EInvalidVisual, "AlfImageVisualAttributeSetter") + } + + const char* attrName = aAttr.name (); + if( !strcmp(attrName, KImagePath)) + { + if ( IsSVGImage ( aAttr.stringValue())) + { + LoadImageFromSvg( aAttr.stringValue(),*imageVisual); + } + + else + { + mImageAttrSetter->setAttributeValue(aVisual,&aContainer,mData); + } + } + else if( !strcmp(attrName, KSecondaryImagePath)) + { + if ( IsSVGImage (aAttr.stringValue())) + { + LoadImageFromSvg(aAttr.stringValue(),*imageVisual); + } + + else + { + mImageAttrSetter->setAttributeValue(aVisual,&aContainer,mData); + } + } + else + { + mImageAttrSetter->setAttributeValue(aVisual,&aContainer,mData); + } + } + +// --------------------------------------------------------------------------- +// handleDynamicDataAttribute +// --------------------------------------------------------------------------- +// +void MulImageVisualAttributeSetter::handleDynamicDataAttribute(CAlfVisual &aVisual, + AlfAttribute& /*aAttr*/, + AlfAttributeContainer& aContainer, + IAlfMap* aData) + { + MUL_LOG_INFO("aakash::CMulImageVisualAttributeSetter::handleDynamicDataAttribute"); + mImageAttrSetter->setAttributeValue(aVisual,&aContainer,aData); + } + +// --------------------------------------------------------------------------- +// handleDynamicDataAttribute +// --------------------------------------------------------------------------- +// +void MulImageVisualAttributeSetter::handleDynamicAttribute(CAlfVisual &aVisual, + AlfAttribute& /*aAttr*/, + AlfAttributeContainer& aContainer) + { + MUL_LOG_INFO("aakash::CMulImageVisualAttributeSetter::handleDynamicAttribute"); + mImageAttrSetter->setAttributeValue(aVisual,&aContainer,mData); + } + +// --------------------------------------------------------------------------- +// IsSVGImage +// --------------------------------------------------------------------------- +// +OSN_EXPORT bool MulImageVisualAttributeSetter::IsSVGImage(const UString& aImagePath) + { + MUL_LOG_INFO("aakash::CMulImageVisualAttributeSetter::IsSVGImage"); + TPtrC8 src((TUint8*)aImagePath.getUtf8()); + HBufC* srcBuf = HBufC::NewLC(src.Length()); + + srcBuf->Des().Copy(src); + srcBuf->Des().LowerCase(); + + _LIT(KSvgFile,".svg"); + + bool retval = ( KErrNotFound != srcBuf->FindC(KSvgFile)); + + CleanupStack::PopAndDestroy( srcBuf ); + + return retval; + } + +// --------------------------------------------------------------------------- +// LoadImageFromSvg +// --------------------------------------------------------------------------- +// +OSN_EXPORT void MulImageVisualAttributeSetter::LoadImageFromSvg(const UString& aSvgFilePath, + CAlfImageVisual& aImageVisual ) + { + MUL_LOG_INFO("aakash::CMulImageVisualAttributeSetter::LoadImageFromSvg"); + TPtrC8 src((TUint8*)aSvgFilePath.getUtf8()); + HBufC* imagePath = CnvUtfConverter::ConvertToUnicodeFromUtf8L (src); + CleanupStack::PushL( imagePath ); + + CAlfImageLoaderUtil imgLoaderUtil; + imgLoaderUtil.SetSize (TSize (50, 50)); + + MAlfBitmapProvider* iSvgBitMapProv= imgLoaderUtil.CreateSVGImageLoaderL (*imagePath); + CAlfTexture &texture = aImageVisual.Env().TextureManager().CreateTextureL ( + KAlfAutoGeneratedTextureId, + iSvgBitMapProv, + EAlfTextureFlagDefault); + + aImageVisual.SetScaleMode (CAlfImageVisual::EScaleFit); + aImageVisual.SetImage (TAlfImage (texture)); + + CleanupStack::PopAndDestroy(imagePath); + } + +// --------------------------------------------------------------------------- +// LoadImageFromTexture +// --------------------------------------------------------------------------- +// +OSN_EXPORT void MulImageVisualAttributeSetter::LoadImageFromTexture( int aTextureId, + CAlfImageVisual& aImageVisual ) + { + MUL_LOG_INFO("aakash::CMulImageVisualAttributeSetter::LoadImageFromTexture"); + //Seems like the Env's Texture Manager is not returning a copy. And When Env gets deleted the texture is destroyed + //So ownership is not with the client + const CAlfTexture* texture = aImageVisual.Env().TextureManager().Texture (aTextureId); + if(!texture) + { + ALF_THROW ( AlfDataException, EInvalidAttribute, "AlfImageVisualAttributeSetter" ) + } + aImageVisual.SetImage (TAlfImage (*texture)); + } + + +}// Alf