menufw/menufwui/mmwidgets/src/mmlistboxitemdrawer.cpp
changeset 4 4d54b72983ae
parent 0 f72a12da539e
child 5 c743ef5928ba
--- a/menufw/menufwui/mmwidgets/src/mmlistboxitemdrawer.cpp	Fri Jan 22 09:35:14 2010 +0200
+++ b/menufw/menufwui/mmwidgets/src/mmlistboxitemdrawer.cpp	Tue Jan 26 11:48:23 2010 +0200
@@ -73,6 +73,8 @@
 	iRedrawBackground = ETrue;
 	iZoomIconIndex = -1;
 	iIconAnimationZoomRatio = 1;
+	// this is needed to get iColors initialized on first use:
+	iLastDrawnItemWasFloating = ETrue;
     SetFlags( CListItemDrawer::EDisableHighlight );
 	}
 
@@ -86,8 +88,6 @@
 	delete iItemsDataCache;
 	delete iAnimator;
 	delete iSubcellText;
-	delete ColumnData()->IconArray();
-    ColumnData()->SetIconArray( NULL );
 	}
 
 // -----------------------------------------------------------------------------
@@ -96,8 +96,11 @@
 //
 void CMmListBoxItemDrawer::EnableCachedDataUse( TBool aEnable )
     {
-    __ASSERT_DEBUG( !( aEnable && IsEditMode() ), User::Invariant() );
     iUseCache = aEnable;
+    if ( aEnable )
+        {
+        RemoveFloatingItems();
+        }
     }
 
 // -----------------------------------------------------------------------------
@@ -351,6 +354,9 @@
         {
         if ( !Widget()->View()->RedrawDisabled() )
             {
+            TBool highlightVisible =
+                !( Flags() & CListItemDrawer::ESingleClickDisabledHighlight );
+            aItemIsCurrent = aItemIsCurrent && highlightVisible;
             DoDrawItem( aItemIndex, aItemRectPos, aItemIsSelected,
                     aItemIsCurrent, aViewIsEmphasized, aViewIsDimmed);
             }
@@ -444,19 +450,20 @@
         SetupSubCellsL( aItemIsCurrent, aItemIndex );
         }
     __ASSERT_DEBUG( cache->IsValid(), User::Invariant() );
-    CArrayPtr<CGulIcon>* oldIconList = FormattedCellData()->IconArray();
+    
     FormattedCellData()->SetIconArray( cache->GetIconListL() );
-    delete oldIconList;
-    oldIconList = NULL;
 
-
-    TBool highlightShown = ETrue;
-	CFormattedCellListBoxData::TColors colors;
-
-	colors = SetupColors( IsFloating( aItemIndex ) );
+	TBool isFloating = !iUseCache && IsFloating( aItemIndex );
+	if ( !!isFloating != !!iLastDrawnItemWasFloating ) // Ex-OR
+	    {
+	    iLastDrawnItemWasFloating = isFloating;
+	    iColors = SetupColors( isFloating );
+	    }
 
 	CFormattedCellListBoxData* data = static_cast<CFormattedCellListBoxData*>(iData);
 	data->EnableMarqueeL( EFalse );
+	
+    TBool highlightShown = ETrue;
 	if (FormattedCellData()->RespectFocus() && !aViewIsEmphasized)
 		{
 #ifdef RD_UI_TRANSITION_EFFECTS_LIST
@@ -468,9 +475,9 @@
 #endif
 		highlightShown = EFalse;
 		}
-	
+
     data->Draw( Properties(aItemIndex), *iGc, &( cache->GetItemText() ), aItemTextRect,
-    		GetHighlightVisibility( aItemIndex, aItemIsCurrent, highlightShown ), colors );
+    		GetHighlightVisibility( aItemIndex, aItemIsCurrent, highlightShown ), iColors );
 
 #ifdef RD_UI_TRANSITION_EFFECTS_LIST
 	MAknListBoxTfxInternal *transApi = CAknListLoader::TfxApiInternal( iGc );
@@ -493,7 +500,6 @@
 		}
 #endif
 
-	delete ColumnData()->IconArray();
 	ColumnData()->SetIconArray( NULL );
     }
 
@@ -624,7 +630,7 @@
 
 		{
 		if (iMarqueeAdapter && IsTextClippedL( aSubCellTemplate, *iSubcellText )
-			&& STATIC_CAST(CMmWidgetContainer*,Widget()->Parent())->IsTimerActive() )
+			&& STATIC_CAST(CMmWidgetContainer*,Widget()->Parent())->IsHighlightVisible() )
 		    {
 		    data->SetSubCellSizeL( aIndex, TSize(0,0));
     		const_cast<CMmListBoxItemDrawer*>(this)->AddSubcellMarqueeElementL(
@@ -751,6 +757,7 @@
 void CMmListBoxItemDrawer::AddFloatingItemL( TMmFloatingItem& aFloatingItem,
         TInt aPosition )
     {
+    EnableCachedDataUse( EFalse );
     if (aPosition != KErrNotFound)
         {
         iFloatingItems.InsertL( aFloatingItem, aPosition );
@@ -1202,13 +1209,9 @@
         	}
         else
             {
-            // Even when there is no graphics in the model, it is
-            // necessary to set up an empty subcell in place of
-            // what would normally be an icon (graphics) subcell.
-            // This ensures that TMmSubcellsSetupCode will work
-            // properly.
-            SetupSubNoCellL( aSubcellIncrement, aItemIndex );
-            aSubcellIncrement++;
+            // Mark the fact that subcell was not set to ensure that TMmSubcellsSetupCode
+            // works properly.
+            iLastSubcellsSetupCode.AddSubcellInfo( TMmSubcellsSetupCode::ESkippedSubcell );
             }
 		}
 
@@ -1336,7 +1339,7 @@
         TInt aItemIndex ) const
     {
     CMmCacheForItem* cache = iItemsDataCache->GetItemCacheL( aItemIndex );
-    cache->SetValid( EFalse );
+    cache->SetValidL( EFalse );
     
     const TDesC8& mmTemplate = iMmModel->GetAttributeAsText( aItemIndex, KMmTemplate8 );
     if ( !mmTemplate.Compare( KNullDesC8 ) || !mmTemplate.Compare( KEmpty8 ) )
@@ -1397,8 +1400,12 @@
     		SetupIconSubcellL( templateChildArray, i, aItemIndex, itemText, subcellIncrement );
     		}
 		}
+	TInt subcellsJustSet = subcellIncrement;
+	iCurrentNumberOfSubcellsSet = Max( iCurrentNumberOfSubcellsSet, subcellsJustSet );
+	__ASSERT_DEBUG( iCurrentNumberOfSubcellsSet <= MmTemplateContants::KSubCellsCount,
+	        User::Invariant() );
 
-	for ( TInt i = subcellIncrement; i < MmTemplateContants::KSubCellsCount; i++ )
+	for ( TInt i = subcellIncrement; i < iCurrentNumberOfSubcellsSet; i++ )
 	    {
 	    SetupSubNoCellL( i, aItemIndex );
 	    }
@@ -1412,7 +1419,7 @@
 	cache->SetSubcellsSetupCode( iLastSubcellsSetupCode );
 	// the line below is here only to make the cached information complete
 	GetItemSize( aItemIndex, aItemIsCurrent );
-	cache->SetValid( ETrue );
+	cache->SetValidL( ETrue );
 	}
 
 // -----------------------------------------------------------------------------
@@ -1491,7 +1498,7 @@
 			ItemHasFloatingType( aItemIndex, EDrag ) ||
 			ItemHasFloatingType( aItemIndex, EDragTransition );
 		
-		if ( ( STATIC_CAST(CMmWidgetContainer*,Widget()->Parent())->IsTimerActive()
+		if ( ( STATIC_CAST(CMmWidgetContainer*,Widget()->Parent())->IsHighlightVisible()
 				&& aItemIsCurrent && aAllowHighlightForNonDraggedItem )
 				|| currentlyDraggedItem )
 			{
@@ -1516,7 +1523,7 @@
     		&& !currentlyDraggedItem /* backdrop is disabled for dragged items */
     		&& !iIsIndicatorItem /* in non-touch backdrop is not drawn, just "move indicators" */
     		&& !iLeftOverAreaUnderAnimatedItem /* is the currently drawn item the area left over behind dragged item*/
-    		&& !( STATIC_CAST( CMmWidgetContainer*,Widget()->Parent() )->IsTimerActive() 
+    		&& !( STATIC_CAST( CMmWidgetContainer*,Widget()->Parent() )->IsHighlightVisible() 
     				&& aItemIsCurrent );/*if the timer is active then we want to draw highlight (not backdrop) on the current index*/
 	}