diff -r 5253a20d2a1e -r a4d6f1ea0416 emailuis/uicomponents/src/fstreevisualizerbase.cpp --- 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& 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 visibleItems; RArray removableItems; TInt scrollOffset; @@ -4841,6 +4855,30 @@ rm = CAlfStatic::Env().RefreshMode(); CAlfStatic::Env().SetRefreshMode(EAlfRefreshModeManual); iListLayout->SetFlag(EAlfVisualFlagFreezeLayout); + + if(aUpdateByPhysic == EUpdatedByPhisicEnd) + { + RArray 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)) {