--- /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
+
+
+
+
+