phonebookui/Phonebook2/UIControls/src/CPbk2ThumbnailManager.cpp
branchRCL_3
changeset 3 04ab22b956c2
parent 0 e686773b3f54
child 6 e8e3147d53eb
--- a/phonebookui/Phonebook2/UIControls/src/CPbk2ThumbnailManager.cpp	Tue Feb 02 10:12:17 2010 +0200
+++ b/phonebookui/Phonebook2/UIControls/src/CPbk2ThumbnailManager.cpp	Fri Feb 19 22:40:27 2010 +0200
@@ -47,6 +47,8 @@
 #include <Pbk2UIControls.rsg>
 #include <Pbk2UID.h>
 
+namespace {
+
 // Default size for thumbnail images
 #define KDefaultThumbnailSize TSize(36,36)
 // icon offset. Thumbnail indexing starts from 10000 in CPbk2IconArray, so that there is 0 - 9999 indexes free for 
@@ -58,6 +60,10 @@
 const TInt KQueueLimit = 25;
 // Denotes Start Index for an item in the any Queue
 const TInt KStartIndex = 0;
+// Granularity of the thumbnail array
+const TInt KThumbnailArrayGranularity = 200;
+
+}
 
 /*
  * Helper class for mapping between contact link + image + index on listbox
@@ -330,7 +336,6 @@
    return self;
    }
 
-
 // --------------------------------------------------------------------------
 // CPbk2ThumbnailManager::CPbk2ThumbnailManager
 // --------------------------------------------------------------------------
@@ -338,12 +343,12 @@
 CPbk2ThumbnailManager::CPbk2ThumbnailManager( 
     CVPbkContactManager& aContactManager ) :
         iState( EIdle ),
+        iContactThumbnails( KThumbnailArrayGranularity ),
         iContactManager( aContactManager ),
         iDefaultIconIndex( KErrNotFound )
 	{
 	}
 
-
 // --------------------------------------------------------------------------
 // CPbk2ThumbnailManager::~CPbk2ThumbnailManager()
 // --------------------------------------------------------------------------
@@ -360,7 +365,6 @@
     iPriorityArray.Reset();
     }
 
-
 // --------------------------------------------------------------------------
 // CPbk2ThumbnailManager::ConstructL()
 // --------------------------------------------------------------------------
@@ -371,11 +375,8 @@
 	iManager = CPbk2ImageManager::NewL( iContactManager );
 	// read file type for thumbnail field
 	ReadFieldTypeL();
-	//reset thumbnail array
-	iContactThumbnails.Reset();
 	}
 
-
 // --------------------------------------------------------------------------
 // CPbk2ThumbnailManager::SetObserver()
 // --------------------------------------------------------------------------
@@ -403,107 +404,79 @@
 	return iContactThumbnails.Count();
 	}
 
-
 // --------------------------------------------------------------------------
-// CPbk2ThumbnailManager::GetPbkIconIndex()
+// CPbk2ThumbnailManager::GetPbkIconIndexL()
 // --------------------------------------------------------------------------
 //
-TInt CPbk2ThumbnailManager::GetPbkIconIndex( TInt aListboxIndex, const MVPbkBaseContact& aContactLink )
+TInt CPbk2ThumbnailManager::GetPbkIconIndexL( TInt aListboxIndex, const MVPbkBaseContact& aContactLink )
 	{
-	TBool reLoadThumbnail = EFalse;
 	TInt arrIndex = iDefaultIconIndex;
 	
 	// check that requested thumbnail is allready added to thumbnail array
-	if( aListboxIndex < iContactThumbnails.Count() )
+	if( Rng( 0, aListboxIndex, iContactThumbnails.Count() - 1 ) )
 		{
 		CPbk2TmItem* item = iContactThumbnails[ aListboxIndex ];
-		
-        // This is because when find is in use, the indexes are not mapped
-		// directly to thumbnail managers indexes
-		if( !item->GetLink()->RefersTo( aContactLink ) )
+		if( !item )
 		    {
-            // try to find correct one from the array based on contact link
-            item = FindItem( aContactLink );
+            item = CPbk2TmItem::NewL( aContactLink.CreateLinkLC(), aListboxIndex );
+            CleanupStack::Pop(); // link
+            // set default icon index
+            item->SetIconArrayIndexAndId( iDefaultIconIndex,iDefaultIconId );
+            item->SetHasThumbnail( ETrue );
+            iContactThumbnails[ aListboxIndex ] = item;
 		    }
 		
-		if( item )
-		    {
-            // if item has a thumbnail image, but it is not loaded yet ( queue )
-            if( item->HasThumbnail() && !item->GetBitmap() )
+        // if item has a thumbnail image, but it is not loaded yet ( queue )
+        if( item->HasThumbnail() && !item->GetBitmap() )
+            {
+            TBool reOrderItem = ETrue;
+            TInt res = iLoadingQueue.Find( item );
+            //remove from array if duplicate
+            if( res != KErrNotFound )
                 {
-                reLoadThumbnail = ETrue;
-                }
-            else
-                {
-                arrIndex = item->GetIconArrayIndex();
+                // if item's position is 0 or 1, dont reorder
+                if( res <= 1 )
+                    {
+                    reOrderItem = EFalse;
+                    }
+                // else remove item from the array for reordering
+                else
+                    {
+                    iLoadingQueue.Remove( res );
+                    }
                 }
-		    }
-			
-		//if item and thumbnail index was not found ( queue limit ), reload thumbnail
-		if( reLoadThumbnail )
-			{
-			TBool reOrderItem = ETrue;
-			TInt res = iLoadingQueue.Find( item );
-			//remove from array if duplicate
-			if( res != KErrNotFound )
-				{
-				// if item's position is 0 or 1, dont reorder
-				if( res <= 1 )
-					{
-					reOrderItem = EFalse;
-					}
-				// else remove item from the array for reordering
-				else
-					{
-					iLoadingQueue.Remove( res );
-					}
-				}
-			
-			// if item is to be reordered
-			if( reOrderItem )
-				{
-				// if there are more than 2 items
-				if( iLoadingQueue.Count() > 2 && iState == ELoading )
-					{
-					// insert to second position, first one is under loading
-					iLoadingQueue.Insert( item, 1 );
-					}
-				// else append to first or second
-				else
-					{
-					iLoadingQueue.Append( item );
-					}
-				}
-			
-			//if idle, start loading
-			if( iState == EIdle )
-				{
-				StartLoading();
-				}
-			}
+            
+            // if item is to be reordered
+            if( reOrderItem )
+                {
+                // if there are more than 2 items
+                if( iLoadingQueue.Count() > 2 && iState == ELoading )
+                    {
+                    // insert to second position, first one is under loading
+                    iLoadingQueue.Insert( item, 1 );
+                    }
+                // else append to first or second
+                else
+                    {
+                    iLoadingQueue.Append( item );
+                    }
+                }
+            
+            //if idle, start loading
+            if( iState == EIdle )
+                {
+                StartLoading();
+                }
+            }
+        else
+            {
+            arrIndex = item->GetIconArrayIndex();
+            }
 		}
 	return arrIndex;
 	}
 
 // --------------------------------------------------------------------------
-// CPbk2ThumbnailManager::FindItem()
-// --------------------------------------------------------------------------
-//
-CPbk2TmItem* CPbk2ThumbnailManager::FindItem( const MVPbkBaseContact& aContactLink )
-	{
-	const TInt count = iContactThumbnails.Count();
-	for( TInt i = 0; i < count; ++i )
-		{
-		if( iContactThumbnails[ i ]->GetLink()->RefersTo( aContactLink ) )
-			{
-			return iContactThumbnails[i];
-			}
-		}
-	// shouldn't come here ever
-	return NULL;
-	}
-
-// --------------------------------------------------------------------------
 // CPbk2ThumbnailManager::SetDefaultIconId()
 // --------------------------------------------------------------------------
 //
@@ -516,7 +489,6 @@
 	iDefaultIconId = aDefaultIconId;
 	}
 
-
 // --------------------------------------------------------------------------
 // CPbk2ThumbnailManager::GetDefaultIconIndex()
 // --------------------------------------------------------------------------
@@ -526,7 +498,6 @@
 	return iDefaultIconId;
 	}
 
-
 // --------------------------------------------------------------------------
 // CPbk2ThumbnailManager::SetPbkIconArray()
 // --------------------------------------------------------------------------
@@ -536,7 +507,6 @@
 	iIconArray = aIconArray;
 	}
 
-
 // --------------------------------------------------------------------------
 // CPbk2ThumbnailManager::RemoveIconArray()
 // --------------------------------------------------------------------------
@@ -550,53 +520,30 @@
 	// set all the indexes to default because there is no items in icon array to refer to
 	for( TInt i = 0; i < count; ++i )
 		{
-		iContactThumbnails[i]->SetIconArrayIndexAndId( iDefaultIconIndex, iDefaultIconId );
+        CPbk2TmItem* item = iContactThumbnails[i];
+		if( item )
+		    {
+            item->SetIconArrayIndexAndId( iDefaultIconIndex, iDefaultIconId );
+		    }
 		}
 	iIconIdCounter = 0;
 	}
 
-
-// --------------------------------------------------------------------------
-// CPbk2ThumbnailManager::IncreaseIndexes()
-// --------------------------------------------------------------------------
-//
-void CPbk2ThumbnailManager::IncreaseIndexes( TInt aListboxIndex )
-	{
-	TInt i;
-	TInt index = 0;
-	const TInt count = iContactThumbnails.Count();
-	// go through all contacts
-	for( i = 0; i < count; ++i )
-		{
-		index = iContactThumbnails[i]->GetListboxIndex();
-		// increase by one all the indexes that are bigger than newly added index
-		if( index  >= aListboxIndex )
-			{
-			iContactThumbnails[i]->SetListboxIndex( index+1 );
-			}
-		}
-	}
-
-
 // --------------------------------------------------------------------------
 // CPbk2ThumbnailManager::DecreaseIndexes()
 // --------------------------------------------------------------------------
 //
-void CPbk2ThumbnailManager::DecreaseIndexes( TInt aListboxIndex )
+void CPbk2ThumbnailManager::ResetIndexes()
 	{
-	TInt i;
+    // go through items
 	const TInt count = iContactThumbnails.Count();
-	TInt index = 0;
-	
-	// go through items
-	for( i = 0; i < count; ++i )
+	for( TInt i = 0; i < count; ++i )
 		{
-		index = iContactThumbnails[i]->GetListboxIndex();
-		// decrease all indexes that were bigger than removed index
-		if( index > aListboxIndex )
-			{
-			iContactThumbnails[i]->SetListboxIndex( index-1 );
-			}
+        CPbk2TmItem* item = iContactThumbnails[i];
+        if( item )
+            {
+            item->SetListboxIndex( i );
+            }
 		}
 	}
 
@@ -638,119 +585,35 @@
 	}
 
 // --------------------------------------------------------------------------
-// CPbk2ThumbnailManager::LoadThumbnailL()
+// CPbk2ThumbnailManager::SetContactViewL()
 // --------------------------------------------------------------------------
 //
-void CPbk2ThumbnailManager::LoadThumbnailL( const MVPbkContactLink& aContactLink, TInt aListboxIndex )
-	{
-	// check if the thumbnail is already loaded
-	if( aListboxIndex < iContactThumbnails.Count() &&
-		iContactThumbnails[aListboxIndex]->GetLink()->IsSame( aContactLink ) )
-		{
-		CFbsBitmap* tmp = iContactThumbnails[ aListboxIndex ]->GetBitmap();
-		// if there is icon for the contact allready loaded
-		if( tmp )
-			{
-			//inform observer 
-			if( iObserver )
-				{
-				//if icon array exists
-				if( iIconArray )
-					{
-					//create icon and pass it to the array
-					CGulIcon* icon = CGulIcon::NewL( DuplicateBitmapL( tmp ) );
-					// counter to add icon ids
-					TPbk2IconId iconID( TUid::Uid(KPbk2UID3 ), 
-							KIconIndexOffset + iIconIdCounter );
-					iIconIdCounter++;
-					iIconArray->AppendIconL( icon, iconID );
-					// store the index
-					iContactThumbnails[ aListboxIndex ]->SetIconArrayIndexAndId( iIconArray->FindIcon( iconID ), iconID );
-					iObserver->ThumbnailLoadingComplete( KErrNone,iContactThumbnails[ aListboxIndex]->GetListboxIndex() );
-					}
-				}
-			}
-		else
-			{
-			// has a default icon
-			iObserver->ThumbnailLoadingComplete( KErrNotFound,iContactThumbnails[ aListboxIndex]->GetListboxIndex() );
-			}
-		}
-	// new contact, add new CPbk2TmItem to thumbnail array
-	else
-		{
-		// create new contact item. Thumbnail is not yet loaded so it's set to NULL
-		CPbk2TmItem* item = CPbk2TmItem::NewL( aContactLink.CloneLC(), aListboxIndex );
-		CleanupStack::Pop();
-		// set default icon index
-		item->SetIconArrayIndexAndId( iDefaultIconIndex,iDefaultIconId );
-		item->SetHasThumbnail( ETrue );
-		
-		
-		// if thumbnail to be loaded is added middle of the list (new contact), handle indexes
-		const TInt lastIndex = iContactThumbnails.Count() - 1;
-		if( lastIndex >= 0 && 
-				aListboxIndex <= iContactThumbnails[ lastIndex ]->GetListboxIndex() )
-			{
-			// make room for the new thumbnail. Function does nothing if priority array is not full 
-			// This is because we need to get the thumbnail showing right away when new contact is added
-			MakeRoomForNextThumbnail();
-			// increase indexes after this added index
-			IncreaseIndexes( aListboxIndex );
-			}
-		
-		// add item
-		TLinearOrder<CPbk2TmItem> sorter( CPbk2TmItem::CompareByListboxIndex );
-		iContactThumbnails.InsertInOrderL( item, sorter );
-		
-		// also add item to loading queue. This is because the actual array is sorted between thumbnail loading
-		// list doesn't own the items
-		// if added item's listbox index is smaller than already added, add to start end on loading queue
-		const TInt queueCount = iLoadingQueue.Count();
-		if( aListboxIndex <  queueCount && queueCount > 2  )
-			{
-			//add to second place, first one is under loading
-			iLoadingQueue.Insert( item, 1 );
-			}
-		// just add last place on the list
-		else
-			{
-			iLoadingQueue.Append( item );
-			}
-		
-		//if idle, start loading
-		if( iState == EIdle )
-			{
-			StartLoading();
-			}
-		}
-	}
+void CPbk2ThumbnailManager::SetContactViewL( MPbk2FilteredViewStack* aView )
+    {
+    iView = aView;
+    if( iView )
+        {
+        iView->AddObserverL( *this );
+        iView->AddStackObserverL( *this );
+        }
+    Reset();
+    }
 
 // --------------------------------------------------------------------------
 // CPbk2ThumbnailManager::RemoveThumbnail()
 // --------------------------------------------------------------------------
 //
-TInt CPbk2ThumbnailManager::RemoveThumbnail( const MVPbkContactLink& aContactLink, TInt aListboxIndex  )
+void CPbk2ThumbnailManager::RemoveThumbnail( 
+    const MVPbkContactLink& /*aContactLink*/, TInt aListboxIndex  )
 	{
-	TInt i;
-	const TInt count = iContactThumbnails.Count();
-	CPbk2TmItem* item = NULL;
-	TInt listBoxIndex = 0;
-	
-	for( i = 0; i < count; ++i )
-		{
-		item = iContactThumbnails[i];
-		if( item->GetLink()->IsSame( aContactLink ) )
-			{
-			// store listbox index before updating
-			listBoxIndex = item->GetListboxIndex();
-		
-            // handle indexes
-		    DecreaseIndexes( aListboxIndex );
-
-			// remove item from the list
-			iContactThumbnails.Remove( i );
-			
+    const TInt count = iContactThumbnails.Count();
+    if( count > aListboxIndex )
+        {
+        CPbk2TmItem* item = iContactThumbnails[aListboxIndex];
+        iContactThumbnails.Remove( aListboxIndex );
+        ResetIndexes();
+        if( item )
+            {
 			// check that the icon is not a default icon
 			if( item->GetIconArrayIndex() != iDefaultIconIndex )
 				{
@@ -763,49 +626,42 @@
 				UpdateIconIndexes();
 				}
 			
-			//remove item from priority array if in it
-			const TInt index = iPriorityArray.Find( item->GetLink() );
-			//remove if found
-			if( index != KErrNotFound )
-				{
-				iPriorityArray.Remove( index );
-				}
-			
-			//The item might be even in the loading queue
-			//Remove from loading queue
-			//remove item from priority array if in it
+            // remove from priority list
+            const TInt priIndex = iPriorityArray.Find( item->GetLink() );
+            if( priIndex != KErrNotFound )
+                {
+                iPriorityArray.Remove( priIndex );
+                }
+            
+            // remove from loading queue
             const TInt loadIndex = iLoadingQueue.Find( item );
-            //remove if found
             if( loadIndex != KErrNotFound )
                 {
                 iLoadingQueue.Remove( loadIndex );
                 }
-			
-			// inform observer
-			if( iObserver )
-				{
-				iObserver->ThumbnailRemoved( *item->GetLink(),listBoxIndex );
-				}
-			
-			//The item at 0th position, denotes the current item
-			//whose thumbnail load is in progress.			
-			if ( KStartIndex == loadIndex && !iInProgressItemToBeRemoved )
-			    {
-			    //Remove it when its safe
-			    iInProgressItemToBeRemoved = item;
-			    }
-			else
-			    {
-			    //can be safely deleted immediately
-			    delete item;
-			    }
-			return KErrNone;
-			}
-		}
-	return KErrNotFound;
+            
+            // inform observer
+            if( iObserver )
+                {
+                iObserver->ThumbnailRemoved( *item->GetLink(), aListboxIndex );
+                }
+            
+            //The item at 0th position, denotes the current item
+            //whose thumbnail load is in progress.          
+            if ( KStartIndex == loadIndex && !iInProgressItemToBeRemoved )
+                {
+                //Remove it when its safe
+                iInProgressItemToBeRemoved = item;
+                }
+            else
+                {
+                //can be safely deleted immediately
+                delete item;
+                }
+            }
+        }
 	}
 
-
 // --------------------------------------------------------------------------
 // CPbk2ThumbnailManager::UpdateIconIndexes()
 // --------------------------------------------------------------------------
@@ -818,18 +674,17 @@
 		const TInt count = iContactThumbnails.Count();
 		for( TInt i = 0; i < count; ++i )
 			{
-			if( !( iDefaultIconId == iContactThumbnails[ i ]->GetIconId() ) ) 
+            CPbk2TmItem* item = iContactThumbnails[ i ];
+			if( item && !( iDefaultIconId == item->GetIconId() ) ) 
 				{
 				// icon is removed from the CPbk2IconArray, update indexes
-				TPbk2IconId id = iContactThumbnails[ i ]->GetIconId();	
-				iContactThumbnails[ i ]->SetIconArrayIndexAndId( iIconArray->FindIcon( id ), id );
+				TPbk2IconId id = item->GetIconId();	
+				item->SetIconArrayIndexAndId( iIconArray->FindIcon( id ), id );
 				}
 			}
 		}
 	}
 
-
-
 // --------------------------------------------------------------------------
 // CPbk2ThumbnailManager::DuplicateBitmapL()
 // --------------------------------------------------------------------------
@@ -850,12 +705,11 @@
 	return dstbitmap;
 	}
 
-
 // --------------------------------------------------------------------------
 // CPbk2ThumbnailManager::StartLoading()
 // --------------------------------------------------------------------------
 //
-void CPbk2ThumbnailManager::StartLoading( )
+void CPbk2ThumbnailManager::StartLoading()
 	{
 	//its safe to delete the item here
 	if ( iInProgressItemToBeRemoved )
@@ -889,7 +743,6 @@
 			StartLoading();
 			}
 		}
-		
 	// no more items
 	else
 		{
@@ -941,7 +794,6 @@
     StartLoading();
     }
 
-
 // --------------------------------------------------------------------------
 // CPbk2ThumbnailManager::DoLoadThumbnail()
 // --------------------------------------------------------------------------
@@ -982,12 +834,12 @@
 				{
 				iIconSize = KDefaultThumbnailSize;
 				}
-			TInt useCropping = 0x0008;
 			// set params
 			params.iSize = iIconSize;
 			params.iFlags = TPbk2ImageManagerParams::EScaleImage |
-							TPbk2ImageManagerParams::EKeepAspectRatio |
-							useCropping;	//CROP IMAGE	//TODO change value
+			                TPbk2ImageManagerParams::EUseSpeedOptimizedScaling |
+							TPbk2ImageManagerParams::ECropImage ;
+			params.iDisplayMode = EColor16MU;
 			// fetch the image
 			TRAP( err, iThumbOperation =
 				iManager->GetImageAsyncL( &params, aContact, *iFieldType, *this ) );
@@ -1026,7 +878,6 @@
 		}
 	}
 
-
 // --------------------------------------------------------------------------
 // CPbk2ThumbnailManager::MakeRoomForNextThumbnail
 // --------------------------------------------------------------------------
@@ -1041,9 +892,10 @@
 		const TInt count = iContactThumbnails.Count();
 		for( TInt i = 0; i < count; ++i )
 			{
-			if( iContactThumbnails[ i ]->GetLink()->IsSame( *iPriorityArray[ KStartIndex ] ) )
+            CPbk2TmItem* item = iContactThumbnails[ i ];
+			if( item && item->GetLink()->IsSame( *iPriorityArray[ KStartIndex ] ) )
 				{
-				rem = iContactThumbnails[i];
+				rem = item;
 				break;
 				}
 			}
@@ -1068,8 +920,6 @@
 		}
 	}
 
-
-
 // --------------------------------------------------------------------------
 // CPbk2ThumbnailManager::Pbk2ImageGetComplete
 // --------------------------------------------------------------------------
@@ -1163,48 +1013,43 @@
 void CPbk2ThumbnailManager::DoContactViewReadyL( MVPbkContactViewBase& aView )
     {   
     // get contact count
-    const TInt contactCount = aView.ContactCountL();
     const TInt thumbnailCount = iContactThumbnails.Count();
-    
     if( thumbnailCount == 0 )
         {
-        // first time initialization
-        for( TInt i = 0; i < contactCount; ++i )
-            {
-            CPbk2TmItem* item = CPbk2TmItem::NewL( aView.CreateLinkLC( i ), i );
-            CleanupStack::Pop(); // link
-            CleanupStack::PushL( item );
-            // set default icon index
-            item->SetIconArrayIndexAndId( iDefaultIconIndex,iDefaultIconId );
-            item->SetHasThumbnail( ETrue );
-            
-            // add item
-            iContactThumbnails.AppendL( item );
-            CleanupStack::Pop( item );
-            }
+        PreCreateThumbnailArrayL( aView );
         }
     else
         {
         // there is items in the listbox that are not loaded yet. If there is favorite contacts, 
         // those are added afterwards to the list. normal items are added first.
-        const TInt itemCount = contactCount - thumbnailCount;
+        const TInt itemCount = aView.ContactCountL() - thumbnailCount;
         for( TInt i = 0; i < itemCount; ++i )
-            {            
-            MVPbkContactLink* link = aView.CreateLinkLC( i );
-            // if link exists and some thumbnails are not loaded
-            if( link  )
-                {
-                // add to thumb manager and load thumbnail
-                LoadThumbnailL( *link,i );
-                // created link
-                CleanupStack::PopAndDestroy();
-                }
+            {
+            iContactThumbnails.InsertL( NULL, 0 );
+            }
+        if( itemCount > 0 )
+            {
+            ResetIndexes();
             }
         }  
     }
 
 // --------------------------------------------------------------------------
-// CPbk2ThumbnailManager::ContactAddedToView
+// CPbk2ThumbnailManager::PreCreateThumbnailArrayL
+// --------------------------------------------------------------------------
+//
+void CPbk2ThumbnailManager::PreCreateThumbnailArrayL( MVPbkContactViewBase& aView )
+    {
+    iContactThumbnails.ResetAndDestroy();
+    const TInt contactCount = aView.ContactCountL();
+    for( TInt i = 0; i < contactCount; ++i )
+        {
+        iContactThumbnails.AppendL( NULL );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ThumbnailManager::ContactViewUnavailable
 // --------------------------------------------------------------------------
 //
 void CPbk2ThumbnailManager::ContactViewUnavailable( 
@@ -1220,13 +1065,14 @@
 void CPbk2ThumbnailManager::ContactAddedToView(
     MVPbkContactViewBase& /*aView*/, 
     TInt aIndex, 
-    const MVPbkContactLink& aContactLink )
+    const MVPbkContactLink& /*aContactLink*/ )
     {
-    TRAP_IGNORE( LoadThumbnailL( aContactLink, aIndex ) );
+    iContactThumbnails.Insert( NULL, aIndex );
+    ResetIndexes();
     }
 
 // --------------------------------------------------------------------------
-// CPbk2ThumbnailManager::ContactViewError
+// CPbk2ThumbnailManager::ContactRemovedFromView
 // --------------------------------------------------------------------------
 //
 void CPbk2ThumbnailManager::ContactRemovedFromView(
@@ -1250,6 +1096,54 @@
     }
 
 // --------------------------------------------------------------------------
+// CPbk2ThumbnailManager::TopViewChangedL
+// --------------------------------------------------------------------------
+//
+void CPbk2ThumbnailManager::TopViewChangedL( MVPbkContactViewBase& /*aOldView*/ )
+    {
+    Reset();
+    if( iView )
+        {
+        PreCreateThumbnailArrayL( *iView );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ThumbnailManager::TopViewUpdatedL
+// --------------------------------------------------------------------------
+//
+void CPbk2ThumbnailManager::TopViewUpdatedL()
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ThumbnailManager::BaseViewChangedL
+// --------------------------------------------------------------------------
+//
+void CPbk2ThumbnailManager::BaseViewChangedL()
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ThumbnailManager::ViewStackError
+// --------------------------------------------------------------------------
+//
+void CPbk2ThumbnailManager::ViewStackError( TInt /*aError*/ )
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ThumbnailManager::ContactAddedToBaseView
+// --------------------------------------------------------------------------
+//
+void CPbk2ThumbnailManager::ContactAddedToBaseView( 
+    MVPbkContactViewBase& /*aBaseView*/,
+    TInt /*aIndex*/,
+    const MVPbkContactLink& /*aContactLink*/ )
+    {
+    }
+
+// --------------------------------------------------------------------------
 // CPbk2ThumbnailManager::ReadFieldTypeL
 // --------------------------------------------------------------------------
 //