mulwidgets/common/src/mulimagevisualattributesetter.cpp
changeset 0 e83bab7cf002
--- /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 <alf/alfattributeexception.h>
+#include <alf/alfvisualexception.h>
+#include "alf/alfattributecontainer.h"
+#include <alf/alfimagevisual.h>
+#include <alf/alftexture.h> 
+#include <alf/alfenv.h>
+#include <alf/alfdataexception.h>
+#include <alf/alfdisplay.h>
+#include <alf/alfbrusharray.h>
+#include <alf/alfframebrush.h>
+#include <alf/alfimageloaderutil.h>
+#include <alf/alfbitmapprovider.h>
+#include <alf/alfresourcepool.h> //for resource pooling
+#include <alf/alfwidgetenvextension.h> //for resource pooling
+// Osn headers
+#include <osn/ustring.h>
+#include <osn/alfptrvector.h>
+//#include <osn/osnlogicerror.h>
+// Std headers
+#include <libc/string.h>
+#include <utf.h>
+// 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<CAlfTexture> 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; i<mLoadedTextures.count ();i++)
+		{
+		CAlfTexture* texture = mLoadedTextures[i];
+		mEnv->TextureManager().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<CAlfImageVisual*>(&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<CAlfImageVisual*>(&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<CAlfImageVisual*>(&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