diff -r 4ea6f81c838a -r 0e9bb658ef58 mulwidgets/muldatamodel/src/mulvisualitem.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mulwidgets/muldatamodel/src/mulvisualitem.cpp Wed Sep 01 12:23:18 2010 +0100 @@ -0,0 +1,374 @@ +/* +* Copyright (c) 2007-2008 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: Visual item class +* +*/ + + +#include + +#include +#include + +#include +#include + +#include // for Pow function +#include "mul/mulmodelutility.h" + +using namespace osncore; +using namespace std; + +namespace Alf + { +// --------------------------------------------------------------------------- +// Defination of class MulAttribute +// --------------------------------------------------------------------------- +// +class MulVisualItem::MulAttribute + { +public: //Constructor and destructor + + /** + * C++ constructor. + */ + MulAttribute():mValue(NULL),mFlag(0) + { + } + + /** + * C++ constructor. + * + * @param aValue value of the attribute + * @param aAttributeFlags property of this attribute + */ + MulAttribute( IMulVariantType* aValue, int aAttributeFlags = 0 ) + { + mValue = aValue; + mFlag = aAttributeFlags; + } + + /** + * Copy constructor. + * + * @param aAttribute existing attribute + */ + MulAttribute( const MulAttribute& aAttribute ) + { + mValue = aAttribute.mValue->Clone().release(); + mFlag = aAttribute.mFlag; + } + + /** + * Destructor. + */ + ~MulAttribute() + { + delete mValue; + } + +public: //data + + IMulVariantType* mValue ; //own + int mFlag ; + + }; + +// --------------------------------------------------------------------------- +// Constructor +// --------------------------------------------------------------------------- +// +OSN_EXPORT MulVisualItem::MulVisualItem( ) + { + // Clearing dirty bit flags to 0; + mBitAttrFlag1 = 0; + mBitAttrFlag2 = 0; + } + +// --------------------------------------------------------------------------- +// Copy Constructor +// --------------------------------------------------------------------------- +// +OSN_EXPORT MulVisualItem::MulVisualItem( const MulVisualItem& aVisualItem ) + { + map mapToCopy = aVisualItem.mVisualItem; + map::iterator itr; + for( itr = mapToCopy.begin(); itr!= mapToCopy.end(); ++itr ) + { + mVisualItem[itr->first] = new (EMM) MulAttribute( *itr->second ); + } + mBitAttrFlag1 = aVisualItem.mBitAttrFlag1; + mBitAttrFlag2 = aVisualItem.mBitAttrFlag2; + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +OSN_EXPORT MulVisualItem::~MulVisualItem() + { + map::iterator itr; + for( itr = mVisualItem.begin(); itr!= mVisualItem.end(); ++itr ) + { + delete itr->second; + itr->second = NULL; + } + mVisualItem.clear(); + } + +// --------------------------------------------------------------------------- +// Add new attributes to visual item +// --------------------------------------------------------------------------- +// +//OSN_EXPORT void MulVisualItem::SetAttribute( mulvisualitem::TVisualAttribute aName, +// const UString& aValue, int aAttributeFlags ) +// { +// auto_ptr variantdata(new (EMM) MulVariantType( aValue )); +// +// SetAttribute( aName, variantdata.release(),aAttributeFlags,EDoesOwn); +// } + +// --------------------------------------------------------------------------- +// Add new attributes to visual item +// --------------------------------------------------------------------------- +// +OSN_EXPORT void MulVisualItem::SetAttribute( mulvisualitem::TVisualAttribute aName, + const TDesC& aValue, int aAttributeFlags ) + { + auto_ptr variantdata(new (EMM) MulVariantType( aValue )); + + SetAttribute( aName, variantdata.release(),aAttributeFlags,EDoesOwn); + } + + +// --------------------------------------------------------------------------- +// Add new attributes to visual item +// --------------------------------------------------------------------------- +// +OSN_EXPORT void MulVisualItem::SetAttribute( mulvisualitem::TVisualAttribute aName, + int aValue,int aAttributeFlags ) + { + auto_ptr variantdata(new ( EMM ) MulVariantType( aValue )); + + SetAttribute(aName,variantdata.release(),aAttributeFlags,EDoesOwn); + } + + +// --------------------------------------------------------------------------- +// Add new attributes to visual item +// --------------------------------------------------------------------------- +// +OSN_EXPORT void MulVisualItem::SetAttribute( mulvisualitem::TVisualAttribute aName, IMulVariantType* aValue, + int aAttributeFlags , + TAttributeOwnership /*aAttributeOwership*/ ) + { + map::iterator findIter = mVisualItem.find( aName ); + if( findIter != mVisualItem.end() ) + { + delete findIter->second; + findIter->second = NULL; + mVisualItem.erase( aName ); + } + mVisualItem[aName] = new (EMM) MulAttribute(aValue,aAttributeFlags ); + SetDirty(aName, true); + } + + +// --------------------------------------------------------------------------- +// Is the input attribute dirty, to be queried before a redraw +// --------------------------------------------------------------------------- +// +OSN_EXPORT bool MulVisualItem::IsDirty(mulvisualitem::TVisualAttribute aAttr) const +{ + int i = (int)aAttr; + TReal base = 2.0; + TReal r = 0.0; + TReal val = 0.0; + TInt err = KErrNone; + + // If mBitAttrflag is binary 101, AND'ing it with 100(attribute 3) will + // set 100 to return true for attribute 3 being dirty + + // if attribute index <18 check against mBitAttrFlag1, else check + // against mBitAttrFlag2 + if(i < 18) + { + val = i; + err = Math::Pow(r, base, val); + if(KErrNone != err) + return true; + + return mBitAttrFlag1 & (int)r; + } + else + { + val = (int)(mulvisualitem::KMul_n) - i; + err = Math::Pow(r, base, val); + if(KErrNone != err) + return true; + + return mBitAttrFlag2 & (int)r; + } + +} + + +// --------------------------------------------------------------------------- +// Set the attribute as dirty in this Visual item based on input flag +// --------------------------------------------------------------------------- +// +void MulVisualItem::SetDirty(mulvisualitem::TVisualAttribute aAttr, bool aDirty) +{ + int i = (int)aAttr; + TReal base = 2.0; + TReal r = 0.0; + TReal val = i; + TInt err = KErrNone; + // If mBitAttrflag is binary 001, OR'ing it with 100(attribute 3) will + // set 101 to set bit for attribute 3 as 1 in dirty flag + if(aDirty) + { + // if attribute index <18 operate on mBitAttrFlag1 + // else operate against mBitAttrFlag1 + if(i < 18) + { + err = Math::Pow(r,base,val); + mBitAttrFlag1 |= (int)r; + } + else + { + err = Math::Pow(r,base,(TReal)((int)(mulvisualitem::KMul_n) - i)); + mBitAttrFlag2 |= (int)r; + } + } + else + { + // if attribute index <18 operate on mBitAttrFlag1 + // else operate against mBitAttrFlag1 + if(i < 18) + { + err = Math::Pow(r,base,val); + mBitAttrFlag1 &= ~(int)r; + } + else + { + err = Math::Pow(r, base,(TReal)((int)(mulvisualitem::KMul_n) - i)); + mBitAttrFlag2 &= ~(int)r; + } + } + if(KErrNone != err) + throw std::invalid_argument("Error setting dirty flag for attribute"); +} + + +// --------------------------------------------------------------------------- +// ResetDirtyAttribute +// --------------------------------------------------------------------------- +// +void MulVisualItem::ResetDirtyAttribute(const MulVisualItem& aVisualItem) +{ + mBitAttrFlag1 = aVisualItem.mBitAttrFlag1; + mBitAttrFlag2 = aVisualItem.mBitAttrFlag2; +} +// --------------------------------------------------------------------------- +// Attribute +// --------------------------------------------------------------------------- +// +OSN_EXPORT IMulVariantType* MulVisualItem::Attribute( mulvisualitem::TVisualAttribute aName ) const + { + map::const_iterator findIter = mVisualItem.find( aName ); + if( findIter != mVisualItem.end() ) + { + MulAttribute* attribute = findIter->second; + IMulVariantType* attributeValue = attribute->mValue; + return attributeValue; + } + else + { + //throw std::invalid_argument("Invalid attribute name."); + return NULL; + } + } + +// --------------------------------------------------------------------------- +// AttributeAsInt +// --------------------------------------------------------------------------- +// +OSN_EXPORT int MulVisualItem::AttributeAsInt( mulvisualitem::TVisualAttribute aName ) const + { + IMulVariantType* attributeValue = Attribute(aName); + if( attributeValue ) + { + return attributeValue->integer(); + } + throw std::invalid_argument("Invalid attribute name."); + } + +// --------------------------------------------------------------------------- +// AttributeAsString +// --------------------------------------------------------------------------- +// +OSN_EXPORT const TDesC& MulVisualItem::AttributeAsString( mulvisualitem::TVisualAttribute aName ) const + { + IMulVariantType* attributeValue = Attribute(aName); + if( attributeValue ) + { + return attributeValue->DesC(); + } + throw std::invalid_argument("Invalid attribute name."); + } + +// --------------------------------------------------------------------------- +// ExistingAttributes +// --------------------------------------------------------------------------- +// +OSN_EXPORT const std::vector MulVisualItem::Attributes() const + { + map::const_iterator itr; + std::vector attributesName; + for( itr = mVisualItem.begin(); itr!= mVisualItem.end(); ++itr ) + { + attributesName.push_back( itr->first ); + } + return attributesName; + } + +// --------------------------------------------------------------------------- +// Flag +// --------------------------------------------------------------------------- +// +int MulVisualItem::Flag( mulvisualitem::TVisualAttribute aName ) + { + MulAttribute* attribute = mVisualItem.find( aName )->second; + return attribute->mFlag; + } + +// --------------------------------------------------------------------------- +// RemoveAttribute +// --------------------------------------------------------------------------- +// +void MulVisualItem::RemoveAttribute( mulvisualitem::TVisualAttribute aName ) + { + map::iterator findIter = mVisualItem.find( aName ); + if( findIter != mVisualItem.end() ) + { + delete findIter->second; + findIter->second = NULL; + mVisualItem.erase( aName ); + } + } + + }// namespace Alf + +//End of file