diff -r 4ea6f81c838a -r 0e9bb658ef58 widgetmodel/alfwidgetmodel/src/alfanchorlayoutattributesetter.cpp --- /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 +#include +#include + + +//osn includes +#include + +//alf includes +#include +#include +#include +#include +#include + +//dui includes +#include "alf/attrproperty.h" + +//other includes +#include +#include + + + +//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 value ( new ( EMM ) AlfContainer() ); + auto_ptr vtype1(new ( EMM ) AlfVariantType ( valueX->real() )); + value->addItem ( vtype1.get() ); + vtype1.release(); + auto_ptr 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 value ( new ( EMM ) AlfContainer() ); + auto_ptr vtype1(new ( EMM ) AlfVariantType ( dataX->real() )); + value->addItem ( vtype1.get() ); + vtype1.release(); + auto_ptr vtype2( new ( EMM ) AlfVariantType ( aAttrib->unit() ) ); + + value->addItem (vtype2.get()); + vtype2.release(); + aCont->addItem ( value.release() ); + } + } + else + { + auto_ptr value ( new ( EMM ) AlfContainer() ); + auto_ptr vtype1( new ( EMM ) AlfVariantType ( aAttrib->realValue() ) ); + value->addItem (vtype1.get()); + vtype1.release(); + auto_ptr 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 ( &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 ( &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 anchortypecont ( new ( EMM ) AlfContainer() ); + auto_ptr attachmentorigincont ( new ( EMM ) AlfContainer() ); + auto_ptr magnitudecont ( new ( EMM ) AlfContainer() ); + auto_ptr 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 ( Origin->integer() ); + + if ( isMultivalueDataAchment ( value ) ) + { + IAlfVariantType* aType = anchortypecont->item ( counter ); + TAlfAnchorType type = static_cast ( aType->integer() ); + + if ( type == EAlfAnchorTypeNone ) + { + IAlfContainer* magCont1 = static_cast ( magnitudecont->item ( magnitudeindex ) ); + IAlfContainer* magCont2 = static_cast ( magnitudecont->item ( magnitudeindex + 1 ) ); + IAlfContainer* magCont3 = static_cast ( magnitudecont->item ( magnitudeindex + 2 ) ); + IAlfContainer* magCont4 = static_cast ( 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 ( magnitudecont->item ( magnitudeindex ) ); + IAlfContainer* magCont2 = static_cast ( 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 ( typeVar->integer() ); + IAlfContainer* magCont1 = static_cast ( 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 + + + + +