widgetmodel/alfwidgetmodel/src/alfanchorlayoutattributesetter.cpp
branchRCL_3
changeset 20 0e9bb658ef58
parent 0 e83bab7cf002
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/widgetmodel/alfwidgetmodel/src/alfanchorlayoutattributesetter.cpp	Wed Sep 01 12:23:18 2010 +0100
@@ -0,0 +1,457 @@
+/*
+* 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:   Implements attributesetters for anchorlayout.
+*
+*/
+
+
+
+//includes
+
+//widget model includes
+#include "alf/alfattributecontainer.h"
+#include "alf/alfattributevaluetype.h"
+#include "alf/alfattribute.h"
+#include "alf/alfanchorlayoutattributesetter.h"
+#include <alf/alfvisualexception.h>
+#include <alf/alfdataexception.h>
+#include <alf/alfattributeexception.h>
+
+
+//osn includes
+#include <osn/ustring.h>
+
+//alf includes
+#include <alf/alfenv.h>
+#include <alf/alfanchorlayout.h>
+#include <alf/alftexture.h>
+#include <alf/alfeventhandler.h>
+#include <alf/alfevent.h>
+
+//dui includes
+#include "alf/attrproperty.h"
+
+//other includes
+#include <libc/string.h>
+#include <utf.h>
+
+
+
+//namespaces
+
+using namespace osncore;
+
+using namespace duiuimodel::anchorlayoutinput;
+
+using namespace duiuimodel::layoutattributes;
+
+using namespace duiuimodel::anchor;
+
+using namespace duiuimodel::metric;
+
+namespace Alf
+	{
+
+bool isMultivalueDataAchment ( TAlfAnchorAttachmentOrigin val )
+	{
+	return ( val == EAlfAnchorAttachmentOriginNone||
+			 val == EAlfAnchorAttachmentOriginTopLeft ||
+	         val == EAlfAnchorAttachmentOriginTopCenter ||
+	         val == EAlfAnchorAttachmentOriginTopRight ||
+	         val == EAlfAnchorAttachmentOriginCenterLeft ||
+	         val == EAlfAnchorAttachmentOriginCenter ||
+	         val == EAlfAnchorAttachmentOriginCenterRight ||
+	         val == EAlfAnchorAttachmentOriginBottomLeft ||
+	         val == EAlfAnchorAttachmentOriginBottomCenter ||
+	         val == EAlfAnchorAttachmentOriginBottomRight );
+	}
+
+typedef void ( *pFunc ) ( AlfContainer* aCont, AlfAttribute* aAttrib, IAlfMap* aData );
+
+void addToAnchortypecont ( AlfContainer* aCont, AlfAttribute* aAttrib, IAlfMap* aData )
+	{
+
+	if ( aData )
+		{
+		IAlfVariantType* dataX = aData->item ( UString(aAttrib->getDataField() ));
+
+		if ( dataX && dataX->type() == IAlfVariantType::EInt )
+			{
+			aCont->addItem ( new ( EMM ) AlfVariantType ( dataX->integer() ) );
+			}
+		}
+	else
+		{
+		aCont->addItem ( new ( EMM ) AlfVariantType ( aAttrib->intValue() ) );
+		}
+
+	}
+
+void addToAttachmentcont ( AlfContainer* aCont, AlfAttribute* aAttrib, IAlfMap* aData )
+	{
+
+	if ( aData )
+		{
+		IAlfVariantType* dataX = aData->item ( UString(aAttrib->getDataField()));
+
+		if ( dataX && dataX->type() == IAlfVariantType::EInt )
+			{
+			aCont->addItem ( new ( EMM ) AlfVariantType ( dataX->integer() ) );
+			}
+		}
+	else
+		{
+		aCont->addItem ( new ( EMM ) AlfVariantType ( aAttrib->intValue() ) );
+		}
+	}
+
+void addToMagnitudecont ( AlfContainer* aCont, AlfAttribute* aAttrib, IAlfMap* aData )
+	{
+
+	if ( aData )
+		{
+		IAlfVariantType* dataX = aData->item ( UString(aAttrib->getDataField()) );
+
+		if ( dataX != NULL && dataX->type() == IAlfVariantType::EMap )
+			{
+			IAlfVariantType* valueX = dataX->map()->item ( UString("value"));
+			IAlfVariantType* unitX = dataX->map()->item ( UString("unit"));
+			auto_ptr<AlfContainer> value ( new ( EMM ) AlfContainer() );
+			auto_ptr<AlfVariantType> vtype1(new ( EMM ) AlfVariantType ( valueX->real() ));
+			value->addItem ( vtype1.get() );
+			vtype1.release();
+			auto_ptr<AlfVariantType> vtype2(new ( EMM ) AlfVariantType ( unitX->integer() ));
+			value->addItem ( vtype2.get() );
+			vtype2.release();
+			aCont->addItem ( value.release() );
+
+			}
+		else if ( dataX != NULL && dataX->type() == IAlfVariantType::EReal )
+			{
+			auto_ptr<AlfContainer> value ( new ( EMM ) AlfContainer() );
+			auto_ptr<AlfVariantType> vtype1(new ( EMM ) AlfVariantType ( dataX->real() ));
+			value->addItem ( vtype1.get() );
+			vtype1.release();
+			auto_ptr<AlfVariantType> vtype2( new ( EMM ) AlfVariantType ( aAttrib->unit() ) );
+			
+			value->addItem (vtype2.get());
+			vtype2.release();
+			aCont->addItem ( value.release() );
+			}
+		}
+	else
+		{
+		auto_ptr<AlfContainer> value ( new ( EMM ) AlfContainer() );
+		auto_ptr<AlfVariantType> vtype1( new ( EMM ) AlfVariantType ( aAttrib->realValue() ) );
+		value->addItem (vtype1.get());
+		vtype1.release();
+		auto_ptr<AlfVariantType> vtype2( new ( EMM ) AlfVariantType ( aAttrib->unit() ) );
+		
+		value->addItem (vtype2.get());
+		vtype2.release();
+		aCont->addItem ( value.release() );
+
+		}
+
+	}
+
+void addToTextstylecont ( AlfContainer* /*aCont*/, AlfAttribute* /*aAttrib*/, IAlfMap* /*aData*/ )
+	{
+	}
+
+struct anchormap
+	{
+	const char* name;
+	pFunc addToContainer;
+	AlfContainer* pData;
+	};
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// Constructor.
+// ---------------------------------------------------------------------------
+//
+OSN_EXPORT AlfAnchorLayoutAttributeSetter::AlfAnchorLayoutAttributeSetter()
+	{
+	}
+
+// ---------------------------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------------------------
+//
+OSN_EXPORT AlfAnchorLayoutAttributeSetter::~AlfAnchorLayoutAttributeSetter()
+	{
+	}
+	
+// ---------------------------------------------------------------------------
+// Sets Attribute Value. Delegates based on attribute Category.
+// ---------------------------------------------------------------------------
+//
+OSN_EXPORT void AlfAnchorLayoutAttributeSetter::setAttributeValue (
+    CAlfVisual &aVisual,
+    AlfAttributeContainer* aContainer,
+    IAlfMap* aData )
+	{
+	
+	CAlfAnchorLayout* layout = dynamic_cast<CAlfAnchorLayout*> ( &aVisual );
+
+	if ( !layout )
+		{
+		ALF_THROW ( AlfVisualException, EInvalidVisual, 
+		    "AlfAnchorLayoutAttributeSetter" )
+		}
+		
+    AlfCommonLayoutAttributeSetter::setAttributeValue(aVisual, 
+        aContainer, aData);
+	}
+	
+
+// ---------------------------------------------------------------------------
+// Deprecated
+// ---------------------------------------------------------------------------
+//
+OSN_EXPORT TAlfCommand* AlfAnchorLayoutAttributeSetter::createCommand ( CAlfVisual& /*aVisual*/,
+        AlfAttributeContainer* /*aContainer*/, IAlfMap* /*aData*/,
+        int /*aTransitionTime*/, CAlfVisual* /*aRefVisual*/ )
+	{
+	//deprecated
+	TAlfCommand* cmd = NULL;
+	return cmd;
+	}
+
+// ---------------------------------------------------------------------------
+// Sends a command to Env
+// ---------------------------------------------------------------------------
+//
+OSN_EXPORT void AlfAnchorLayoutAttributeSetter::createAndSendCommands (
+    CAlfVisual& aVisual,
+    AlfAttributeContainer* aContainer,
+    CAlfVisual* aRefVisual )
+	{
+	//no animatable attributes in grid layout.
+	AlfCommonLayoutAttributeSetter::createAndSendCommands ( aVisual, aContainer, aRefVisual );
+	}
+
+// ---------------------------------------------------------------------------
+// Sets dynamic attributes to visual
+// ---------------------------------------------------------------------------
+//
+void AlfAnchorLayoutAttributeSetter::handleDynamicAttribute ( CAlfVisual &aVisual, AlfAttribute& aAttr, AlfAttributeContainer& aContainer )
+	{
+	//no dynamic attributes in anchor layout.
+	AlfCommonLayoutAttributeSetter::handleDynamicAttribute(aVisual, aAttr, aContainer);
+	}
+	
+// ---------------------------------------------------------------------------
+// Sets static attributes to visual
+// ---------------------------------------------------------------------------
+//		
+void AlfAnchorLayoutAttributeSetter::handleStaticAttribute ( 
+    CAlfVisual &aVisual, AlfAttribute& aAttr, AlfAttributeContainer& aContainer )
+    {
+    if (!doHandleStaticAttribute(aVisual, aAttr, aContainer, NULL))
+        {
+        AlfCommonLayoutAttributeSetter::handleStaticAttribute(aVisual, aAttr, aContainer);
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Sets static attributes to visual
+// ---------------------------------------------------------------------------
+//
+bool AlfAnchorLayoutAttributeSetter::doHandleStaticAttribute( CAlfVisual &aVisual, 
+    AlfAttribute& aAttr, AlfAttributeContainer& aContainer, IAlfMap* aData )
+	{
+    bool handled = true;
+	const char* attrName = aAttr.name();
+	CAlfAnchorLayout* layout = dynamic_cast<CAlfAnchorLayout*> ( &aVisual );
+	if(!layout)
+	    {
+	    return false;
+	    }
+
+	if ( !strcmp ( attrName, KChildOrdinal )||!strcmp ( attrName, KAttachmentOrdinal ) 
+			|| !strcmp ( attrName, KAnchorType )||!strcmp ( attrName, KAttachmentOrigin )
+			||!strcmp ( attrName, KMagnitude )||!strcmp ( attrName, KTextStyleId ) )
+		{
+		AlfAttribute& attachmentordinal = aContainer.getAttributeByName ( KAttachmentOrdinal );
+		AlfAttribute& aAttrChildOrdinal = aContainer.getAttributeByName ( KChildOrdinal );
+		float ordianal=0;
+		float attachordinalval=-1;
+		if(aData)
+			{
+			IAlfVariantType* data = aData->item ( UString(aAttrChildOrdinal.getDataField()) );
+
+			if ( data && data->type() == IAlfVariantType::EReal )
+				{
+					ordianal=data->real();	
+				}
+			data = aData->item ( UString(attachmentordinal.getDataField()) );
+			if ( data && data->type() == IAlfVariantType::EReal )
+				{
+					attachordinalval=data->real();	
+				}
+			}
+		else
+			{
+			ordianal=aAttrChildOrdinal.realValue();
+			attachordinalval=attachmentordinal.realValue();
+			}
+		auto_ptr<AlfContainer> anchortypecont ( new ( EMM ) AlfContainer() );
+		auto_ptr<AlfContainer> attachmentorigincont ( new ( EMM ) AlfContainer() );
+		auto_ptr<AlfContainer> magnitudecont ( new ( EMM ) AlfContainer() );
+		auto_ptr<AlfContainer> textstyleidcont ( new ( EMM ) AlfContainer() );
+
+		anchormap maptable[] =
+			{
+			{KAnchorType, addToAnchortypecont, NULL},
+			{KAttachmentOrigin, addToAttachmentcont, NULL},
+			{KMagnitude, addToMagnitudecont, NULL},
+			{KTextStyleId, addToTextstylecont, NULL}
+			};
+		unsigned int tableCount = sizeof ( maptable ) / sizeof ( anchormap );
+		maptable[0].pData = anchortypecont.get();
+		maptable[1].pData = attachmentorigincont.get();
+		maptable[2].pData = magnitudecont.get();
+		maptable[3].pData = textstyleidcont.get();
+
+		unsigned int attrCount = aContainer.attributeCount();
+
+		for ( int i = 0;i < attrCount;i++ )
+			{
+			for ( int j = 0;j < tableCount;j++ )
+				{
+				if ( !strcmp ( maptable[j].name, aContainer.getAttribute ( i ).name() ) )
+					{
+					maptable[j].addToContainer ( maptable[j].pData, &aContainer.getAttribute ( i ), aData );
+					aContainer.getAttribute ( i ).setDirty(false);
+					}
+				}
+			}
+
+		unsigned int totalApitocall = attachmentorigincont->count();
+
+		unsigned int magnitudeindex = 0;
+
+		for ( int counter = 0;counter < totalApitocall;counter++ )
+			{
+			IAlfVariantType* Origin = attachmentorigincont->item ( counter );
+			TAlfAnchorAttachmentOrigin value = static_cast<TAlfAnchorAttachmentOrigin> ( Origin->integer() );
+
+			if ( isMultivalueDataAchment ( value ) )
+				{
+				IAlfVariantType* aType = anchortypecont->item ( counter );
+				TAlfAnchorType type = static_cast<TAlfAnchorType> ( aType->integer() );
+
+				if ( type == EAlfAnchorTypeNone )
+					{
+					IAlfContainer* magCont1 = static_cast<IAlfContainer*> ( magnitudecont->item ( magnitudeindex ) );
+					IAlfContainer* magCont2 = static_cast<IAlfContainer*> ( magnitudecont->item ( magnitudeindex + 1 ) );
+					IAlfContainer* magCont3 = static_cast<IAlfContainer*> ( magnitudecont->item ( magnitudeindex + 2 ) );
+					IAlfContainer* magCont4 = static_cast<IAlfContainer*> ( magnitudecont->item ( magnitudeindex + 3 ) );
+
+					TAlfMetric metric1 ( magCont1->item ( 0 )->real(), magCont1->item ( 1 )->integer() );
+					TAlfMetric metric2 ( magCont2->item ( 0 )->real(), magCont2->item ( 1 )->integer() );
+					TAlfMetric metric3 ( magCont3->item ( 0 )->real(), magCont3->item ( 1 )->integer() );
+					TAlfMetric metric4 ( magCont4->item ( 0 )->real(), magCont4->item ( 1 )->integer() );
+					TAlfBoxMetric boxmetric ( metric1, metric2, metric3, metric4 );
+					int err=layout->Attach ( ordianal, boxmetric, value, attachordinalval );
+					if(err!=KErrNone)
+						{
+						ALF_THROW ( AlfVisualException, err, "Anchor Attach Failed" )
+						}
+					magnitudeindex += 4;
+					}
+				else
+					{
+					IAlfContainer* magCont1 = static_cast<IAlfContainer*> ( magnitudecont->item ( magnitudeindex ) );
+					IAlfContainer* magCont2 = static_cast<IAlfContainer*> ( magnitudecont->item ( magnitudeindex + 1 ) );
+
+					TAlfMetric metric1 ( magCont1->item ( 0 )->real(), magCont1->item ( 1 )->integer() );
+					TAlfMetric metric2 ( magCont2->item ( 0 )->real(), magCont2->item ( 1 )->integer() );
+
+
+
+					TAlfXYMetric xymetric ( metric1, metric2 );
+				
+					int err=layout->Attach ( ordianal, type, xymetric, value, attachordinalval );
+					if(err!=KErrNone)
+						{
+						ALF_THROW ( AlfVisualException, err, "Anchor Attach Failed" )
+						}
+
+					magnitudeindex += 2;
+					}
+				}
+			else
+				{
+				IAlfVariantType* typeVar = anchortypecont->item ( counter );
+				TAlfAnchorType type = static_cast<TAlfAnchorType> ( typeVar->integer() );
+				IAlfContainer* magCont1 = static_cast<IAlfContainer*> ( magnitudecont->item ( magnitudeindex ) );
+
+				TAlfMetric metric ( magCont1->item ( 0 )->real(), magCont1->item ( 1 )->integer() );
+
+
+				int err=layout->Attach ( ordianal, type, metric, value, attachordinalval );
+				if(err!=KErrNone)
+					{
+					ALF_THROW ( AlfVisualException, err, "Anchor Attach Failed" )
+					}
+
+				magnitudeindex++;
+				}
+			}
+			
+		attachmentordinal.setDirty(false);
+		aAttrChildOrdinal.setDirty(false);
+		}
+	else 
+		{
+		handled = false;
+		}
+		
+    return handled;
+	}
+
+
+// ---------------------------------------------------------------------------
+// Sets dynamic attributes to visual from data
+// ---------------------------------------------------------------------------
+//
+void AlfAnchorLayoutAttributeSetter::handleDynamicDataAttribute ( CAlfVisual &aVisual, AlfAttribute& aAttr, AlfAttributeContainer& aContainer, IAlfMap* aData )
+	{
+	AlfCommonLayoutAttributeSetter::handleDynamicDataAttribute ( aVisual, aAttr, aContainer, aData );
+	}
+
+// ---------------------------------------------------------------------------
+// Sets static attributes to visual  from data
+// ---------------------------------------------------------------------------
+//
+void AlfAnchorLayoutAttributeSetter::handleStaticDataAttribute ( CAlfVisual &aVisual, AlfAttribute& aAttr, AlfAttributeContainer& aContainer, IAlfMap* aData )
+	{
+	if (!doHandleStaticAttribute(aVisual, aAttr, aContainer, aData))
+	    {
+	    AlfCommonLayoutAttributeSetter::handleStaticDataAttribute(aVisual, aAttr, aContainer, aData);
+	    }
+	}
+
+	} // namespace Alf
+
+// End of file
+
+
+
+
+