emailuis/uicomponents/src/fstreevisualizerbase.cpp
changeset 3 a4d6f1ea0416
parent 2 5253a20d2a1e
child 4 e7aa27f58ae1
--- a/emailuis/uicomponents/src/fstreevisualizerbase.cpp	Mon Jan 18 20:08:26 2010 +0200
+++ b/emailuis/uicomponents/src/fstreevisualizerbase.cpp	Tue Jan 26 11:45:42 2010 +0200
@@ -362,38 +362,22 @@
         }
     else if (aY > 0)
         {
-        TInt top(0);
-        TInt bottom(iItems.Count() - 1);
-        while (top <= bottom)
+        TInt min(0);
+        TInt max(iItems.Count() - 1);
+        while (min <= max)
             {
-            TInt middle(top + (bottom - top) / 2);
-            TInt topCoord(iItems[middle].Top());
-            TInt bottomCoord(iItems[middle].Bottom());
-            if (aY < topCoord)
+            const TInt middle(min + (max - min) / 2);
+            if (aY < iItems[middle].Top())
                 {
-                if (bottom == middle)
-                    {
-                    bottom--;
-                    }
-                else
-                    {
-                    bottom = middle;
-                    }
+                max = middle - 1;
                 }
-            else if (aY > bottomCoord)
+            else if (aY > iItems[middle].Bottom())
                 {
-                if (top == middle)
-                    {
-                    top++;
-                    }
-                else
-                    {
-                    top = middle;
-                    }
+                min = middle + 1;
                 }
             else
                 {
-                aOffset = aY - topCoord;
+                aOffset = aY - iItems[middle].Top();
                 aHeight += aOffset;
                 i = middle;
                 break;
@@ -542,14 +526,14 @@
 // TViewPort::SetCenterPositionL
 // ---------------------------------------------------------------------------
 void TViewPort::SetCenterPositionL(const TPoint& aPosition,
-        TBool aInformUpdate)
+        TBool aInformUpdate, TUpdatedByPhysic aUpdateByPhysic)
     {
     iPosition = TPoint(aPosition.iX - iSize.iWidth / 2, aPosition.iY
             - iSize.iHeight / 2);
     // Do validation!
     if (aInformUpdate)
         {
-        UpdatedL();
+        UpdatedL(aUpdateByPhysic);
         }
     }
 
@@ -607,6 +591,14 @@
     }
 
 // ---------------------------------------------------------------------------
+// TViewPort::GetVisibleItemsL
+// ---------------------------------------------------------------------------
+void TViewPort::GetVisibleItemsL(RArray<TFsTreeItemId>& aVisible, TInt& aOffset)
+	{
+	iWorld.GetItemsL(aVisible, iPosition.iY, iSize.iHeight, aOffset);
+	}
+
+// ---------------------------------------------------------------------------
 // TViewPort::IsScrollBarNeeded
 // ---------------------------------------------------------------------------
 TBool TViewPort::IsScrollBarNeeded() const
@@ -617,9 +609,9 @@
 // ---------------------------------------------------------------------------
 // TViewPort::UpdatedL
 // ---------------------------------------------------------------------------
-void TViewPort::UpdatedL()
-    {
-    iObserver.ViewPortUpdatedL(*this);
+void TViewPort::UpdatedL(TUpdatedByPhysic aUpdateByPhysic)
+    {
+    iObserver.ViewPortUpdatedL(*this, aUpdateByPhysic);
     }
 
 // ---------------------------------------------------------------------------
@@ -1695,8 +1687,7 @@
 
     if ( visualizer )
         {
-        TBool focused = IsFocusShown();
-        visualizer->UpdateL( iTreeData->ItemData( iFocusedItem ), focused,
+        visualizer->UpdateL( iTreeData->ItemData( iFocusedItem ), IsFocusShown(),
                 iTreeData->Level( iFocusedItem ), iMarkIcon, iMenuIcon, 0 );
         }
 
@@ -1792,7 +1783,7 @@
         const TBool aSlideIn)
     {
     FUNC_LOG;
-    UpdateViewPortL();
+    iVisualizationState = EFsTreeVisible;
     if (iTreeData->Count() == 0)
         {
         iRootVisualizer->ShowL(*iRootLayout);
@@ -1800,29 +1791,28 @@
         }
     else
         {
-        TBool showFocus = IsFocusShown();
+        const TBool showFocus = IsFocusShown();
         for (TUint i = 0; i < iVisibleItems.Count(); ++i)
             {
             TFsTreeItemId itemId(iVisibleItems[i]);
             MFsTreeItemVisualizer* visualizer = iTreeData->ItemVisualizer(
                     itemId);
 
-            TBool itemFocused( EFalse );
-            if( showFocus )
-                {
-                itemFocused = IsItemFocused(itemId);
-                }
-            visualizer->UpdateL(iTreeData->ItemData(itemId), itemFocused,
-                    iTreeData->Level(itemId), iMarkIcon, iMenuIcon,
-                    0);
+            TBool itemFocused( showFocus && IsItemFocused(itemId) );
+			if ( visualizer )
+				{
+	        	visualizer->UpdateL(iTreeData->ItemData(itemId), itemFocused,
+	                iTreeData->Level(itemId), iMarkIcon, iMenuIcon,
+	                0);
+				}
             }
         }
+    UpdateViewPortL();
 
     TInt fadeInTime(KZero), slideInTime(KZero);
     CFsSlideEffect::TSlideEffectDirection slideInDir(
             CFsSlideEffect::ESlideNone);
 
-    iVisualizationState = EFsTreeVisible;
 
     if (aFadeIn)
         {
@@ -2517,7 +2507,11 @@
             ApplyListSpecificValuesToItem(itemviz);
             }
         }
-    iWorld.BeginUpdate();
+        const TBool isUpdating(iWorld.IsUpdating());
+    if (!isUpdating)
+        {
+        iWorld.BeginUpdate();
+        }
     iWorld.RemoveAllL();
     treeIter = iTreeData->Iterator(KFsTreeRootID, KFsTreeRootID,
             KFsTreeIteratorSkipCollapsedFlag);
@@ -2532,7 +2526,10 @@
         }
     iViewPort.SetPositionL(TPoint(), EFalse);
     iViewPort.ClearCache();
-    iWorld.EndUpdateL();
+    if (!isUpdating)
+        {
+        iWorld.EndUpdateL();
+        }
     }
 
 // ---------------------------------------------------------------------------
@@ -2788,10 +2785,13 @@
             break;
         case EFsTreeRemovedAll:
             {
-            iRootVisualizer->ShowL(*iRootLayout);
-            iRootVisualizer->UpdateL(*iRootData, EFalse, 0, iMarkIcon,
-                    iMenuIcon);
-            //iListLayout->RemoveAndDestroyAllD();
+            if (!iWorld.IsUpdating())
+                {
+                iRootVisualizer->ShowL(*iRootLayout);
+                iRootVisualizer->UpdateL(*iRootData, EFalse, 0, iMarkIcon,
+                        iMenuIcon);
+                }
+            iVisibleItems.Reset();
             iWorld.RemoveAllL();
             iFocusedItem = KFsTreeNoneID;
             }
@@ -3514,38 +3514,42 @@
     {
     FUNC_LOG;
     TInt listItemsHeight = 0;
-    MFsTreeItemVisualizer* vis = 0;
+    MFsTreeItemVisualizer* visualizer = 0;
     TFsTreeItemId itemId;
     TInt itemCount = iVisibleItems.Count();
 
     for (TInt index = 0; index < itemCount; ++index)
         {
         itemId = iVisibleItems[index];
-        vis = iTreeData->ItemVisualizer(itemId);
-
-        if (itemId == iFocusedItem)
+        visualizer = iTreeData->ItemVisualizer(itemId);
+
+
+        if (visualizer)
             {
-            if (vis->IsExtendable())
+            if (itemId == iFocusedItem)
                 {
-                listItemsHeight += vis->ExtendedSize().iHeight;
+                if (visualizer->IsExtendable())
+                    {
+                    listItemsHeight += visualizer->ExtendedSize().iHeight;
+                    }
+                else
+                    {
+                    listItemsHeight += visualizer->Size().iHeight;
+                    }
+                }
+            else if (itemId == aPrevious && iFocusedItem != aPrevious)
+                {
+                listItemsHeight += visualizer->Size().iHeight;
+                }
+            else if (visualizer->IsExtended() && visualizer->IsExtendable())
+                {
+                listItemsHeight += visualizer->ExtendedSize().iHeight;
                 }
             else
                 {
-                listItemsHeight += vis->Size().iHeight;
+                listItemsHeight += visualizer->Size().iHeight;
                 }
             }
-        else if (itemId == aPrevious && iFocusedItem != aPrevious)
-            {
-            listItemsHeight += vis->Size().iHeight;
-            }
-        else if (vis->IsExtended() && vis->IsExtendable())
-            {
-            listItemsHeight += vis->ExtendedSize().iHeight;
-            }
-        else
-            {
-            listItemsHeight += vis->Size().iHeight;
-            }
         }
 
     return listItemsHeight;
@@ -3702,10 +3706,13 @@
         for (TUint i = 0; i < iVisibleItems.Count(); ++i)
             {
             TFsTreeItemId itemId(iVisibleItems[i]);
-            MFsTreeItemVisualizer* viz = iTreeData->ItemVisualizer(itemId);
-            viz->UpdateL(iTreeData->ItemData(itemId),
-                    IsItemFocused(itemId) && IsFocusShown(),
+            MFsTreeItemVisualizer* visualizer = iTreeData->ItemVisualizer(itemId);
+            if (visualizer)
+                {
+                visualizer->UpdateL(iTreeData->ItemData(itemId),
+					IsItemFocused(itemId) && IsFocusShown(),
                     iTreeData->Level(itemId), iMarkIcon, iMenuIcon, 0, EFalse);
+                }
             }
         UpdateSelectorVisualL();
         }
@@ -4826,9 +4833,16 @@
 // ViewPort updated
 // ---------------------------------------------------------------------------
 //
-void CFsTreeVisualizerBase::ViewPortUpdatedL(TViewPort& aViewPort)
+void CFsTreeVisualizerBase::ViewPortUpdatedL(TViewPort& aViewPort, TUpdatedByPhysic aUpdateByPhysic)
     {
     FUNC_LOG;
+
+    // Only upadte view if the list is visible
+    if (iVisualizationState != EFsTreeVisible)
+        {
+        return;
+        }
+
     RArray<TFsTreeItemId> visibleItems;
     RArray<TFsTreeItemId> removableItems;
     TInt scrollOffset;
@@ -4841,6 +4855,30 @@
     rm = CAlfStatic::Env().RefreshMode();
     CAlfStatic::Env().SetRefreshMode(EAlfRefreshModeManual);
     iListLayout->SetFlag(EAlfVisualFlagFreezeLayout);
+    
+	if(aUpdateByPhysic == EUpdatedByPhisicEnd)
+		{
+    	RArray<TFsTreeItemId> myVisibleItems;
+    	TInt myOffset;
+    	CleanupClosePushL(myVisibleItems);
+    	aViewPort.GetVisibleItemsL(myVisibleItems, myOffset);
+    			
+    	for (TInt i = 0; i < myVisibleItems.Count(); i++)
+    		{
+    		const TFsTreeItemId itemId(myVisibleItems[i]);
+    		if (itemId != KFsTreeNoneID)
+    			{
+    			MFsTreeItemVisualizer* visualizer = iTreeData->ItemVisualizer(
+    											itemId);
+    			visualizer->UpdateL(iTreeData->ItemData(itemId), 
+    							IsItemFocused(itemId) && IsFocusShown(),
+    							iTreeData->Level(itemId), iMarkIcon, iMenuIcon,
+    							0);
+    			}
+    		}
+    	CleanupStack::PopAndDestroy();
+    	}
+
     // clear list
     TInt removed(0);
     if (fullUpdate)
@@ -4856,14 +4894,21 @@
         {
         for (TInt i = 0; i < removableItems.Count(); i++)
             {
-            CAlfVisual* visual(
-                    &iTreeData->ItemVisualizer(removableItems[i])->Layout());
-            if (iListLayout->FindVisual(visual) != KErrNotFound)
+            MFsTreeItemVisualizer* itemVisualizer(iTreeData->ItemVisualizer(removableItems[i]));
+            if (itemVisualizer)
                 {
-                removed++;
+                CAlfVisual* visual(&itemVisualizer->Layout());
+                if (iListLayout->FindVisual(visual) != KErrNotFound)
+                    {
+                    removed++;
+                    }
+                itemVisualizer->Hide();
+                const TInt index(iVisibleItems.Find(removableItems[i]));
+                if (index != KErrNotFound)
+                    {
+                    iVisibleItems.Remove(index);
+                    }
                 }
-            iTreeData->ItemVisualizer(removableItems[i])->Hide();
-            iVisibleItems.Remove(iVisibleItems.Find(removableItems[i]));
             }
         }
 
@@ -4885,10 +4930,15 @@
             CAlfLayout& visualizerLayout(visualizer->Layout());
             visualizerLayout.SetSize(tpItemSize);
             visualizerLayout.PropertySetIntegerL(KPropertyItemId(), itemId);
-            visualizer->UpdateL(iTreeData->ItemData(itemId),
+            
+            if(aUpdateByPhysic != EUpdatedByPhisic)
+            	{
+            	visualizer->UpdateL(iTreeData->ItemData(itemId),
                     IsItemFocused(itemId) && IsFocusShown(),
                     iTreeData->Level(itemId), iMarkIcon, iMenuIcon,
                     0);
+            	}
+            
             visualizerLayout.Brushes()->AppendL(iBorderBrush,
                     EAlfDoesNotHaveOwnership);
             CAlfBrush* bgBrush(NULL);
@@ -4978,7 +5028,7 @@
     {
     FUNC_LOG;
     TInt error(KErrNone);
-    TRAP( error, iViewPort.SetCenterPositionL(aNewPosition) );
+    TRAP( error, iViewPort.SetCenterPositionL(aNewPosition, ETrue, EUpdatedByPhisic) );
     ERROR_1( error, "iViewPort.SetCenterPositionL failed with error: %d", error );
     }
 
@@ -4989,6 +5039,9 @@
 void CFsTreeVisualizerBase::PhysicEmulationEnded()
     {
     FUNC_LOG;
+    
+    TRAP_IGNORE( iViewPort.SetCenterPositionL(iViewPort.CenterPosition(), ETrue, EUpdatedByPhisicEnd));
+    
     iFlags.Clear(EPhysicsOn);
     if (iFlags.IsSet(EUpdatePhysicsAfterSimulationFinished))
         {