mulwidgets/muldatamodel/src/mulpushmode.cpp
changeset 0 e83bab7cf002
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mulwidgets/muldatamodel/src/mulpushmode.cpp	Thu Dec 17 08:56:02 2009 +0200
@@ -0,0 +1,302 @@
+/*
+* 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:  Base implementation of pull and push mode
+ *
+*/
+
+
+
+//Includes
+#include "mulpushmode.h"
+
+#include "mulassert.h"
+#include "mulcachemanager.h"
+#include "mulpagedatawindow.h"
+#include "mullog.h"
+
+namespace Alf
+    { 
+    	  
+// ---------------------------------------------------------------------------
+// MulPushMode()
+// ---------------------------------------------------------------------------
+//
+MulPushMode::MulPushMode( MulPageDataWindow& aDataWindow )
+			: mDataWindow(aDataWindow)
+	{   	
+	mCacheManager.reset( new ( EMM ) MulCacheManager());		
+	}
+
+// ---------------------------------------------------------------------------
+// ~MulPushMode()
+// ---------------------------------------------------------------------------
+//
+MulPushMode::~MulPushMode()
+	{
+	// No implementation is required.
+	}
+
+// ---------------------------------------------------------------------------
+// Insert
+// ---------------------------------------------------------------------------
+//
+bool MulPushMode::Insert(int aIndex, int aCount, const MulDataPath& aPath )
+	{
+	__MUL_ASSERT( aIndex >= 0 && aIndex <= mCacheManager->ExpandedNodeCount() && aCount > 0, KLInvalidArgument );
+	
+	int modelCountBefore  = mCacheManager->ExpandedNodeCount();	
+	mCacheManager->CreateNodes( aIndex, aCount, aPath );
+
+	int modelCount = mCacheManager->ExpandedNodeCount();
+		
+	// if there is a change in expanded node count of model then update
+	// the alf model. THis case would happen if we are inserting childnodes
+	// for a node which is not expanded. Then no need to update the alf model
+	if(mDataWindow.IsWindowEnabled() && modelCount != modelCountBefore)
+		{
+		ModelCountChanged(modelCountBefore,modelCount);
+		}
+		
+	// The highlight is the same but its relative index is changed 
+	// because the buffer offsets are changed. Even in this case widget has to update the visualization
+	return false;
+	}
+
+// ---------------------------------------------------------------------------
+// Remove
+// ---------------------------------------------------------------------------
+//
+bool MulPushMode::Remove( int aIndex, int aCount,const MulDataPath& aPath)
+	{
+	__MUL_ASSERT( aIndex >= 0 && aCount > 0 && aIndex+aCount <= mCacheManager->ExpandedNodeCount(), KLInvalidArgument );
+
+	int modelCountBefore  = mCacheManager->ExpandedNodeCount();
+
+	mCacheManager->RemoveVisualItem( aIndex, aCount, aPath );
+	
+	int modelCount = mCacheManager->ExpandedNodeCount();
+	
+	// To inform the calling class whether the highlight has changed 
+	// If the current highlight is more than the total number of items. Then udjust teh highlight
+	bool highlightUpdated = ValidateCurrentHighlight();
+	
+	// if there is a change in expanded node count of model then update
+	// the alf model. This case would happen if we are removing childnodes
+	// for a node which is not expanded. Then no need to update the alf model			
+	if(mDataWindow.IsWindowEnabled() && modelCount != modelCountBefore)
+		{
+		ModelCountChanged(modelCountBefore,modelCount);
+		}
+		
+	// If the highlight is changed because it was greater than current model count or if
+	// the buffer offsets are changed then return true		
+	return ( highlightUpdated );
+	}
+
+// ---------------------------------------------------------------------------
+// Update
+// ---------------------------------------------------------------------------
+//
+void MulPushMode::Update(int /*aIndex*/, int /*aCount*/, const MulDataPath& /*aPath*/)
+    {
+    //no implementation required
+    }
+
+// ---------------------------------------------------------------------------
+// Refresh
+// ---------------------------------------------------------------------------
+//
+void MulPushMode::Refresh( int /*aCount*/, const MulDataPath& /*aPath*/)
+    {
+    // throw exception not implemented in push mode 
+    throw std::logic_error("Not Implemented");
+    }
+
+
+// ---------------------------------------------------------------------------
+// SetTemplate
+// ---------------------------------------------------------------------------
+//
+void MulPushMode::SetTemplate( mulwidget::TLogicalTemplate aTemplateId )
+    {
+    mDefaultTemplate =  aTemplateId ;
+    
+    MulDataPath path;
+    for( int i = 0 ; i < mCacheManager->Count() ; i++ )
+        {
+        MulPushMode::SetTemplate( i, mDefaultTemplate, path );           
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Template
+// ---------------------------------------------------------------------------
+//
+mulwidget::TLogicalTemplate MulPushMode::Template( ) 
+    {
+    return mDefaultTemplate;
+    }
+
+// ---------------------------------------------------------------------------
+// Data
+// ---------------------------------------------------------------------------
+//
+const MulVisualItem* MulPushMode::Data( int aIndex, const MulDataPath& /*aPath*/) const
+	{
+	__MUL_ASSERT( aIndex >= 0 && aIndex < mCacheManager->ExpandedNodeCount(), KLInvalidArgument );
+	
+	return mCacheManager->Data( aIndex );			
+	}
+
+// ---------------------------------------------------------------------------
+// SetData
+// ---------------------------------------------------------------------------
+//
+void MulPushMode::SetData( int aIndex, std::auto_ptr<MulVisualItem> aVisualItem, 
+                          const MulDataPath& aPath)
+    {
+    __MUL_ASSERT( aIndex >= 0 && aIndex < mCacheManager->ExpandedNodeCount(),_L("Invalid Argument"));
+
+    MulVisualItem* visualItem = mCacheManager->Data( aIndex );
+    MUL_LOG_INFO2("MUL::MulPushMode::SetData() Index:%d,item:%x",aIndex, visualItem);
+    if( visualItem )
+        {
+        mCacheManager->UpdateVisualItem( *aVisualItem , aPath, aIndex );
+        }
+    else
+        {
+        // Validating input visual item
+        ValidateVisualItem( *aVisualItem );
+        mCacheManager->AddVisualItem( aVisualItem, aPath, aIndex );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Count
+// ---------------------------------------------------------------------------
+//
+int MulPushMode::Count(const MulDataPath& /*aPath*/) const
+	{
+	return mCacheManager->ExpandedNodeCount();
+	} 
+
+// ---------------------------------------------------------------------------
+// SetTemplate
+// ---------------------------------------------------------------------------
+//
+void MulPushMode::SetTemplate( int aItemIndex, mulwidget::TLogicalTemplate aTemplateId, 
+	                    	  const MulDataPath& /*aPath*/ )
+	{	
+	MUL_LOG_ENTRY_EXIT("MUL::MulPushMode::SetTemplate");
+	
+    MulVisualItem* visualItem = mCacheManager->Data( aItemIndex );	
+    if( visualItem )
+        {
+        mulwidget::TLogicalTemplate logicalTemplate = (mulwidget::TLogicalTemplate) visualItem->AttributeAsInt( mulvisualitem::KAttributeTemplate );
+    	//if template is not same then only change it		
+        if( logicalTemplate != aTemplateId  )
+        	{
+        	visualItem->SetAttribute( mulvisualitem::KAttributeTemplate, aTemplateId );   		
+        	}
+        }
+	}
+	
+// ---------------------------------------------------------------------------
+// CurrentItemCount
+// ---------------------------------------------------------------------------
+//  
+int MulPushMode::CurrentItemCount() const
+	{
+	return mCacheManager->ExpandedNodeCount();		
+	}
+
+// ---------------------------------------------------------------------------
+// CacheManager
+// ---------------------------------------------------------------------------
+//
+MulCacheManager& MulPushMode::CacheManager() const
+	{
+	return *mCacheManager;
+	}
+
+// ---------------------------------------------------------------------------
+//ValidateVisualItem
+// ---------------------------------------------------------------------------
+//
+void MulPushMode::ValidateVisualItem( MulVisualItem& aVisualItem )
+	{
+	//add default template to item if template is not already set and default template is not null
+	IMulVariantType* itemTemplate = aVisualItem.Attribute( mulvisualitem::KAttributeTemplate );
+	if( !itemTemplate )
+		{
+		if( mDefaultTemplate != mulwidget::KTemplateUnknown )
+			{
+			//add default template to this visual item	
+			aVisualItem.SetAttribute( mulvisualitem::KAttributeTemplate, mDefaultTemplate, 0 );
+			}
+		else
+			{
+			//template must be there
+			throw std::invalid_argument("Default template not available.");
+			}
+		}
+	}
+
+// ---------------------------------------------------------------------------
+// ModelCountChanged
+// ---------------------------------------------------------------------------
+//
+void MulPushMode::ModelCountChanged(int aOldCount, int aNewCount)
+	{
+	MUL_LOG_ENTRY_EXIT("MUL::MulPushMode::ModelCountChanged()");
+	
+	MUL_LOG_INFO2("MUL::MulPushMode::ModelCountChanged() aOldCount:%d,aNewCount:%d", aOldCount, aNewCount );
+	
+	mDataWindow.AdjustOffset();	
+	}
+
+// ---------------------------------------------------------------------------
+// ValidateCurrentHighlight
+// ---------------------------------------------------------------------------
+//
+bool MulPushMode::ValidateCurrentHighlight()
+	{
+	// To inform the calling class whether the highlight has changed
+	int modelCount = mCacheManager->ExpandedNodeCount();
+	if( mDataWindow.Highlight() >= modelCount)
+		{
+		mDataWindow.UpdateHighlight( modelCount-1 );
+		return true;
+		}
+	return false;
+	}
+
+// ---------------------------------------------------------------------------
+// Item
+// ---------------------------------------------------------------------------
+//
+const MulVisualItem& MulPushMode::Item( int aAbsoluteIndex )
+    {
+    MulVisualItem* visualItem = mCacheManager->Data( aAbsoluteIndex );
+    if(!visualItem)
+        {
+        throw std::invalid_argument(KInvalidArgument);  
+        }
+    return *visualItem; 
+    }
+	
+	} // namespace ends here
+  
+//End of file
+