diff -r 000000000000 -r e83bab7cf002 widgetmodel/alfwidgetmodel/src/alfmodeloperation.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/widgetmodel/alfwidgetmodel/src/alfmodeloperation.cpp Thu Dec 17 08:56:02 2009 +0200 @@ -0,0 +1,173 @@ +/* +* Copyright (c) 2006 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: This file implements the various types of operations to be performed on model. +* +*/ + + + + +//INCLUDES +#include "alf/alfmodeloperation.h" +#include +#include +#include + +using namespace Alf; + + +OSN_EXPORT AlfModelOperation* AlfModelOperation::create( + OperationType aOperation, int aNumContainerIndices, + int* aContainerIndices, IAlfVariantType* aData ) + { + return new( EMM ) AlfModelOperation( + aOperation, aNumContainerIndices, aContainerIndices, aData ); + } + + +OSN_EXPORT AlfModelOperation* AlfModelOperation::create( OperationType aOperation, int aNumContainerIndices, + int* aContainerIndices, IAlfVariantType* aData, + const UString& aDataName ) + { + return new( EMM ) AlfModelOperation( + aOperation, aNumContainerIndices, aContainerIndices, aData, aDataName ); + } + +AlfModelOperation::AlfModelOperation( + OperationType aOperation, int aNumContainerIndices, + int* aContainerIndices, IAlfVariantType* aData ) + { + mOperation = aOperation ; + mNumContainerIndices = aNumContainerIndices; + mContainerIndices = aContainerIndices ; + mData = aData; + } + + +AlfModelOperation::AlfModelOperation( OperationType aOperation, int aNumContainerIndices, + int* aContainerIndices, IAlfVariantType* aData, + const UString& aDataName ) + { + mOperation = aOperation ; + mNumContainerIndices = aNumContainerIndices; + mContainerIndices = aContainerIndices ; + mDataName = aDataName; + mData = aData; + } + + +OSN_EXPORT AlfModelOperation::~AlfModelOperation() + { + delete mData; + delete [] mContainerIndices; + } + +OSN_EXPORT IAlfVariantType& AlfModelOperation::newData() const + { + if(mOperation == EOperationRemove) + { + ALF_THROW(AlfDataException,EInvalidModelOperation,"AlfModelOperation") + } + return *mData; + } + +OSN_EXPORT const UString& AlfModelOperation::newDataName() const + { + if(mOperation == EOperationRemove) + { + ALF_THROW(AlfDataException,EInvalidModelOperation,"AlfModelOperation") + } + return mDataName; + } + +OSN_EXPORT IAlfVariantType* AlfModelOperation::getNewData() + { + if(mOperation == EOperationRemove) + { + ALF_THROW(AlfDataException,EInvalidModelOperation,"AlfModelOperation") + } + IAlfVariantType* data = mData; + mData = NULL; + return data; + } + +OSN_EXPORT AlfModelOperation::OperationType AlfModelOperation::operation() const + { + return mOperation; + } + + +OSN_EXPORT IAlfVariantType* AlfModelOperation::parentData( IAlfVariantType& aRoot ) const + { + try + { + if ( mNumContainerIndices == 0 ) + { + return NULL; + } + IAlfVariantType* current = &aRoot; + for ( int i = 0; current && i < mNumContainerIndices - 1; ++i ) + { + if ( current->type() == IAlfVariantType::EContainer && + mContainerIndices[i] < current->container()->count() ) + { + current = current->container()->item( mContainerIndices[i] ); + } + else if ( current->type() == IAlfVariantType::EMap && + mContainerIndices[i] < current->map()->count() ) + { + current = current->map()->item( mContainerIndices[i] ); + } + else if ( current->type() == IAlfVariantType::EBranch ) + { + if ( mContainerIndices[i] == 0 ) + { + // Index 0 is for the parent data + current = current->branch()->data(); + } + else if ( mContainerIndices[i] == 1 ) + { + // Index 1 is for the child data + current = current->branch()->childData(); + } + } + else + { + // Not found + return NULL; + } + } + return current; + } + catch(AlfDataException& aException) + { + ALF_THROW(AlfDataException,EInvalidContainerOperation,"AlfModelOperation") + } + } + +OSN_EXPORT int AlfModelOperation::index() const + { + return mContainerIndices[mNumContainerIndices - 1]; + } + +OSN_EXPORT int AlfModelOperation::numContainerIndices() const + { + return mNumContainerIndices; + } + +OSN_EXPORT int AlfModelOperation::containerIndex( int aIndex ) const + { + return mContainerIndices[aIndex]; + } +