diff -r 4ea6f81c838a -r 0e9bb658ef58 mulwidgets/muldatamodel/src/mulcachemanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mulwidgets/muldatamodel/src/mulcachemanager.cpp Wed Sep 01 12:23:18 2010 +0100 @@ -0,0 +1,435 @@ +/* +* 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: Cache Manager class + * +*/ + + +#include "mulcachemanager.h" + +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include "mulassert.h" +#include "mulmodeldef.h" +#include "mulmodelimpl.h" +#include "mul/mulmodelutility.h" +#include "mullog.h" + +namespace Alf + { + +// --------------------------------------------------------------------------- +// Constructor +// --------------------------------------------------------------------------- +// +MulCacheManager::MulCacheManager() + : mTotalCount(0) + { + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +MulCacheManager::~MulCacheManager() + { + MulVisualItemMap::iterator itr; + for( itr = mVisualItemMap.begin(); itr!= mVisualItemMap.end(); ++itr ) + { + delete itr->second; + itr->second = NULL; + } + mVisualItemMap.clear(); + } + +// --------------------------------------------------------------------------- +// CreateNodes +// --------------------------------------------------------------------------- +// +void MulCacheManager::CreateNodes(int aStartIndex, int aCount, const MulDataPath& /*aPath*/) + { + MUL_LOG_ENTRY_EXIT("MUL::MulCacheManager::CreateNodes()"); + + __MUL_ASSERT_DEBUG( aStartIndex >= 0 && aStartIndex <= ExpandedNodeCount() && aCount > 0 , KLInvalidArgument ); + + if(mTotalCount > 0 && aStartIndex < mTotalCount ) + { + UpdataPathInMapAfterInsert(mVisualItemMap, aStartIndex, aCount); + UpdataPathInMapAfterInsert(mSelectionMap, aStartIndex, aCount); + } + + mTotalCount += aCount; + } + +// --------------------------------------------------------------------------- +// AddVisualItem +// --------------------------------------------------------------------------- +// +void MulCacheManager::AddVisualItem( std::auto_ptr aVisualItem, + const MulDataPath& /*aPath*/ , int aIndex) + { + MUL_LOG_ENTRY_EXIT("MUL::MulCacheManager::AddVisualItem()"); + __MUL_ASSERT_DEBUG( aIndex >= 0 && aIndex < ExpandedNodeCount() , KLInvalidArgument ); + + //adding item now + mVisualItemMap[aIndex] = aVisualItem.release(); + } + +// --------------------------------------------------------------------------- +// AddVisualItem +// --------------------------------------------------------------------------- +// +//void MulCacheManager::AddVisualItem( std::auto_ptr aVisualItem, int aItemIndex ) +// { +// MUL_LOG_ENTRY_EXIT("MUL::MulCacheManager::AddVisualItem()"); +// __MUL_ASSERT_DEBUG( aItemIndex >= 0 && aItemIndex < ExpandedNodeCount() , KLInvalidArgument ); +// +// MulDataPath path ;//= mTree.FindNode( aItemIndex ); +// AddVisualItem( aVisualItem, path, aItemIndex ); +// } + +// --------------------------------------------------------------------------- +// RemoveVisualItem +// --------------------------------------------------------------------------- +// +void MulCacheManager::RemoveVisualItem( int aIndex ) + { + MUL_LOG_ENTRY_EXIT("MUL::MulCacheManager::RemoveVisualItem()"); + + __MUL_ASSERT_DEBUG( aIndex >= 0 && aIndex < ExpandedNodeCount() , KLInvalidArgument ); + + //MulDataPath path = mTree.FindNode( aIndex ); + MulDataPath path; + RemoveItemFromMap( path, aIndex ); + } + +// --------------------------------------------------------------------------- +// RemoveVisualItem +// --------------------------------------------------------------------------- +// +void MulCacheManager::RemoveVisualItem(const MulDataPath& aPath , int aIndex ) + { + MUL_LOG_ENTRY_EXIT("MUL::MulCacheManager::RemoveVisualItem()"); + + __MUL_ASSERT_DEBUG( aIndex >= 0 && aIndex < ExpandedNodeCount() , KLInvalidArgument ); + + RemoveItemFromMap( aPath, aIndex ); + mSelectionMap.erase( aIndex ); //remove marking information for this path, index + + UpdataPathInMapAfterRemove( mVisualItemMap, aIndex,1 ); + UpdataPathInMapAfterRemove( mSelectionMap, aIndex,1 ); + mTotalCount--; + } + +// --------------------------------------------------------------------------- +// RemoveVisualItem +// --------------------------------------------------------------------------- +// +void MulCacheManager::RemoveVisualItem(int aIndex, int aCount, const MulDataPath& aPath) + { + MUL_LOG_ENTRY_EXIT("MUL::MulCacheManager::RemoveVisualItem()"); + + __MUL_ASSERT_DEBUG( aIndex >= 0 && aIndex+aCount <= ExpandedNodeCount() , KLInvalidArgument ); + + for(int i = aIndex ; i < aIndex+aCount; i++ ) + { + RemoveItemFromMap( aPath, i ); + mSelectionMap.erase( i ); //remove marking information for this path, index + } + + if(aIndex + aCount < ExpandedNodeCount() ) + { + UpdataPathInMapAfterRemove( mVisualItemMap, aIndex, aCount); + UpdataPathInMapAfterRemove( mSelectionMap, aIndex, aCount ); + } + + mTotalCount-= aCount; + } + +// --------------------------------------------------------------------------- +// RemoveItemFromMap +// --------------------------------------------------------------------------- +// +void MulCacheManager::RemoveItemFromMap( const MulDataPath& /*aPath*/ , int aIndex ) + { + MUL_LOG_ENTRY_EXIT("MUL::MulCacheManager::RemoveItemFromMap()"); + + MulVisualItemMap::iterator findIter = mVisualItemMap.find(aIndex); + if( findIter!= mVisualItemMap.end() ) + { + delete findIter->second; + findIter->second = NULL; + mVisualItemMap.erase( aIndex ); + } + } + +// --------------------------------------------------------------------------- +// UpdataPathInMapAftreRemove +// --------------------------------------------------------------------------- +// +template void MulCacheManager::UpdataPathInMapAfterRemove( std::map& aMap, int aIndex, int aCount ) + { + MUL_LOG_ENTRY_EXIT("MUL::MulCacheManager::UpdataPathInMapAfterRemove()"); + + //loop through all items + //for(int i = 0 ; i < ExpandedNodeCount() ; ++i ) + for(int i = aIndex ; i < ExpandedNodeCount() ; ++i ) + { + // if index is greater than path index then index need to be modified + //if( i >= aIndex ) + { + + if( aMap.find( i ) != aMap.end() ) + { + T item = aMap.find( i )->second; + aMap.erase( i ); + aMap[i-aCount] = item; //add item in to new index + } + } + } + + } + +// --------------------------------------------------------------------------- +// UpdataPathInMapAftreInsert +// --------------------------------------------------------------------------- +// +template void MulCacheManager::UpdataPathInMapAfterInsert( std::map& aMap, int aIndex, int aCount ) + { + MUL_LOG_ENTRY_EXIT("MUL::MulCacheManager::UpdataPathInMapAfterInsert()"); + + //for( int i = ExpandedNodeCount() ; i > 0 ; --i ) + for( int i = ExpandedNodeCount() ; i >= aIndex ; --i ) + { + // if index is greater than path index then index need to be modified + //if( i >= aIndex ) + { + + if( aMap.find( i ) != aMap.end() ) + { + T item = aMap.find( i )->second; + aMap.erase( i ); + aMap[ i + aCount] = item; //add item in to new index + } + } + } + } + +// --------------------------------------------------------------------------- +// UpdateVisualItem +// --------------------------------------------------------------------------- +// +void MulCacheManager::UpdateVisualItem( MulVisualItem& aUpdatedVisualItem, int aItemIndex ) + { + MUL_LOG_ENTRY_EXIT("MUL::MulCacheManager::UpdateVisualItem()"); + + __MUL_ASSERT_DEBUG( aItemIndex >= 0 && aItemIndex < ExpandedNodeCount() , KLInvalidArgument ); + + MulDataPath path ; + UpdateVisualItem( aUpdatedVisualItem, path, aItemIndex ); + } + +// --------------------------------------------------------------------------- +// UpdateVisualItem +// --------------------------------------------------------------------------- +// +void MulCacheManager::UpdateVisualItem( MulVisualItem& aVisualItem,const MulDataPath& /*aPath*/, int aIndex ) + { + MUL_LOG_ENTRY_EXIT("MUL::MulCacheManager::UpdateVisualItem()"); + + MulVisualItem* visualItem = Data( aIndex ); + std::vector existingAttributes = aVisualItem.Attributes( ); + for( int i = 0 ; i < existingAttributes.size() ; ++i ) + { + mulvisualitem::TVisualAttribute attributeName = existingAttributes[i]; + IMulVariantType* newValue = aVisualItem.Attribute( attributeName ); + if(newValue) + { + std::auto_ptr cloneValue = newValue->Clone(); + int newflags = aVisualItem.Flag( attributeName ); + + visualItem->SetAttribute( attributeName , cloneValue.get(), newflags ); + cloneValue.release(); + } + } + visualItem->ResetDirtyAttribute(aVisualItem); + } + +// --------------------------------------------------------------------------- +// Data +// --------------------------------------------------------------------------- +// +MulVisualItem* MulCacheManager::Data(const MulDataPath& /*aPath*/, int aIndex ) const + { + MUL_LOG_ENTRY_EXIT("MUL::MulCacheManager::Data()"); + + //__MUL_ASSERT_DEBUG( aIndex >= 0 && aIndex < ExpandedNodeCount() , KLInvalidArgument ); + + MulVisualItemMap::const_iterator findIter = mVisualItemMap.find(aIndex); + if( findIter != mVisualItemMap.end() ) + { + return findIter->second; + } + else + { + return NULL; + } + } + +// --------------------------------------------------------------------------- +// Data +// --------------------------------------------------------------------------- +// +MulVisualItem* MulCacheManager::Data( int aIndex ) const + { + MUL_LOG_ENTRY_EXIT("MUL::MulCacheManager::Data()"); + + __MUL_ASSERT_DEBUG( aIndex >= 0 && aIndex < ExpandedNodeCount() , KLInvalidArgument ); + + MulDataPath path ; + return Data( path, aIndex ); + } + +// --------------------------------------------------------------------------- +// Count +// --------------------------------------------------------------------------- +// +int MulCacheManager::Count() const + { + return mVisualItemMap.size(); + } + +// --------------------------------------------------------------------------- +// ExpandedNodeCount +// --------------------------------------------------------------------------- +// +int MulCacheManager::ExpandedNodeCount( ) const + { + //return mTree.ExpandedNodeCount(); + return mTotalCount; + } + +// --------------------------------------------------------------------------- +// SetMarkedIndices +// --------------------------------------------------------------------------- +// +void MulCacheManager::SetMarkedIndices( MulWidgetDef::TMulWidgetMarkingType aType , + const std::vector& aItemsIndex, + const MulDataPath& /*aPath*/) + + { + MUL_LOG_ENTRY_EXIT("MUL::MulCacheManager::SetMarkedIndices()"); + + bool selection( false ); + // If selection type is not mark or unmark throw invalid argument exception + aType == MulWidgetDef::EMulMark || aType == MulWidgetDef::EMulUnmark ? + selection = ( aType == MulWidgetDef::EMulMark ) : + throw std::invalid_argument( KInvalidArgument ); + + // Add selected indices to vector and remove unselected + for(int i = 0 ; i < aItemsIndex.size() ; i++ ) + { + int index = aItemsIndex[i]; + selection ? mSelectionMap[index] = index : mSelectionMap.erase(index); + } + } + +// --------------------------------------------------------------------------- +// SetMarkedIndices +// --------------------------------------------------------------------------- +// +void MulCacheManager::SetMarkedIndices(MulWidgetDef::TMulWidgetMarkingType aType) + { + MUL_LOG_ENTRY_EXIT("MUL::MulCacheManager::SetMarkedIndices()"); + + bool selection(false); + // If selection type is not mark all or unmark all throw invalid argument exception + aType == MulWidgetDef::EMulMarkAll || aType == MulWidgetDef::EMulUnmarkAll ? + selection = ( aType == MulWidgetDef::EMulMarkAll ) : + throw std::invalid_argument( KInvalidArgument ); + + int count = ExpandedNodeCount(); + for(int i = 0 ; i < count ; ++i ) + { + selection ? mSelectionMap[i] = i : mSelectionMap.erase(i); + } + } + +// --------------------------------------------------------------------------- +// MarkedIndices +// --------------------------------------------------------------------------- +// +const std::vector& MulCacheManager::MarkedIndices( const MulDataPath& /*aPath*/ ) + { + MUL_LOG_ENTRY_EXIT("MUL::MulCacheManager::MarkedIndices()"); + + mSelectionVector.clear(); + + int count = ExpandedNodeCount(); + for( int i=0; i < count ;++i ) + { + MulSelectionMap::const_iterator itr = mSelectionMap.find(i); + if( itr != mSelectionMap.end() ) + { + mSelectionVector.insert(i); + } + } + return mSelectionVector.actualVector(); + } + +// --------------------------------------------------------------------------- +// IsItemMarked +// --------------------------------------------------------------------------- +// +bool MulCacheManager::IsItemMarked( int aIndex ) const + { + MUL_LOG_ENTRY_EXIT("MUL::MulCacheManager::IsItemMarked()"); + + __MUL_ASSERT_DEBUG( aIndex >= 0 && aIndex < ExpandedNodeCount() , KLInvalidArgument ); + + MulSelectionMap::const_iterator itr = mSelectionMap.find( aIndex ); + return ( itr != mSelectionMap.end() ); + } + +// --------------------------------------------------------------------------- +// SetMarkedIndex +// --------------------------------------------------------------------------- +// +void MulCacheManager::SetMarkedIndex( MulWidgetDef::TMulWidgetMarkingType aType, int aIndex ) + { + MUL_LOG_ENTRY_EXIT("MUL::MulCacheManager::SetMarkedIndex()"); + + __MUL_ASSERT_DEBUG( aIndex >= 0 && aIndex < ExpandedNodeCount() , KLInvalidArgument ); + + bool selection( false ); + // If selection type is not mark or unmark throw invalid argument exception + aType == MulWidgetDef::EMulMark || aType == MulWidgetDef::EMulUnmark ? + selection = ( aType == MulWidgetDef::EMulMark ) : + throw std::invalid_argument( KInvalidArgument ); + + selection ? mSelectionMap[aIndex] = aIndex : mSelectionMap.erase(aIndex); + } + +} //end of namespace alf + +//end of file