emailuis/uicomponents/src/fstreevisualizerbase.cpp
branchRCL_3
changeset 12 4ce476e64c59
parent 10 f5907b1a1053
child 16 b5fbb9b25d57
--- a/emailuis/uicomponents/src/fstreevisualizerbase.cpp	Mon Mar 15 12:39:10 2010 +0200
+++ b/emailuis/uicomponents/src/fstreevisualizerbase.cpp	Wed Mar 31 21:08:33 2010 +0300
@@ -35,6 +35,7 @@
 #include <alf/alfflowlayout.h>
 #include <alf/alfdecklayout.h>
 #include <alf/alfgridlayout.h>
+#include <alf/alfanchorlayout.h>
 //brushes
 #include <alf/alfbrusharray.h>
 #include <alf/alfbrush.h>
@@ -72,9 +73,13 @@
 #include "fsalfscrollbarlayout.h"
 #include "fsalftextstylemanager.h"
 #include "fsinteractioninterval.h"
+#include "muicscrollbar.h"
+#include "cuicaknscrollbaradapter.h"
+#include "cuicscrollbar.h"
 
 #include <aknphysics.h>
 
+
 //CONSTANTS
 const TInt KDefaultShadowWidth = 4;
 const TInt KFSListDefaultSelectorBorderWidth = 0;
@@ -83,7 +88,7 @@
 
 // check from aknphysicsconstants.h
 const TInt KFlickMaxDuration( 500000 );
-const TInt KDefaultFriction( 35 ); // avkon default is 10
+const TInt KDefaultFriction( 25 ); // avkon default is 10
 
 // ======== LOCAL FUNCTIONS ========
 
@@ -456,7 +461,7 @@
 // ---------------------------------------------------------------------------
 // TWorld::GetItemRect
 // ---------------------------------------------------------------------------
-TInt TWorld::GetItemRect(const TFsTreeItemId aItemId, TRect& aRect, 
+TInt TWorld::GetItemRect(const TFsTreeItemId aItemId, TRect& aRect,
         const TInt aStartIndex ) const
     {
     TInt result(KErrNotFound);
@@ -913,11 +918,11 @@
 //
 EXPORT_C CFsTreeVisualizerBase* CFsTreeVisualizerBase::NewL(
         CAlfControl* aOwnerControl, CAlfLayout& aParent,
-        const TBool aDirectTouchMode)
+        const TBool aPopUpMode)
     {
     FUNC_LOG;
     CFsTreeVisualizerBase* self = new (ELeave) CFsTreeVisualizerBase(
-            aOwnerControl, aParent, aDirectTouchMode);
+            aOwnerControl, aParent, aPopUpMode);
     CleanupStack::PushL(self);
     self->ConstructL();
     CleanupStack::Pop(self);
@@ -947,9 +952,10 @@
     delete iWatermark;
     delete iTextStyleManager;
     delete iIntx;
-    // <cmail> Change scrollbar to avkon (to support skinning & touch)
-    delete iScrollBar;
-    // </cmail>
+    if ( iScrollBar )
+        {
+        iScrollBar->Destroy();
+        }
     }
 
 // ---------------------------------------------------------------------------
@@ -1726,7 +1732,7 @@
     }
 
 // ---------------------------------------------------------------------------
-// Gets item vertical position in the list 
+// Gets item vertical position in the list
 // ---------------------------------------------------------------------------
 //
 TInt CFsTreeVisualizerBase::GetItemWorldPosition( const TInt aIdx )
@@ -1932,7 +1938,7 @@
         const TBool aSlideOut)
     {
     FUNC_LOG;
-    iScrollBar->MakeVisible(EFalse);
+    iScrollBar->Show( EFalse );
     if (iDragHandler)
         {
         iDragHandler->Reset();
@@ -2529,41 +2535,44 @@
 void CFsTreeVisualizerBase::SetItemsAlwaysExtendedL(TBool aAlwaysExtended)
     {
     FUNC_LOG;
-    iFlags.Assign(EItemsAlwaysExtended, aAlwaysExtended);
-    TFsTreeIterator treeIter(
-            iTreeData->Iterator(KFsTreeRootID, KFsTreeRootID));
-    while (treeIter.HasNext())
-        {
-        TFsTreeItemId itemId(treeIter.Next());
-        if (itemId != KFsTreeNoneID && !iTreeData->IsNode(itemId))
+    if (iFlags.IsSet(EItemsAlwaysExtended) != aAlwaysExtended )
+        {
+        iFlags.Assign(EItemsAlwaysExtended, aAlwaysExtended);
+        TFsTreeIterator treeIter(
+                iTreeData->Iterator(KFsTreeRootID, KFsTreeRootID));
+        while (treeIter.HasNext())
             {
-            MFsTreeItemVisualizer* itemviz(iTreeData->ItemVisualizer(itemId));
-            ApplyListSpecificValuesToItem(itemviz);
+            TFsTreeItemId itemId(treeIter.Next());
+            if (itemId != KFsTreeNoneID && !iTreeData->IsNode(itemId))
+                {
+                MFsTreeItemVisualizer* itemviz(iTreeData->ItemVisualizer(itemId));
+                ApplyListSpecificValuesToItem(itemviz);
+                }
+            }
+            const TBool isUpdating(iWorld.IsUpdating());
+        if (!isUpdating)
+            {
+            iWorld.BeginUpdate();
             }
-        }
-        const TBool isUpdating(iWorld.IsUpdating());
-    if (!isUpdating)
-        {
-        iWorld.BeginUpdate();
-        }
-    iWorld.RemoveAllL();
-    treeIter = iTreeData->Iterator(KFsTreeRootID, KFsTreeRootID,
-            KFsTreeIteratorSkipCollapsedFlag);
-    while (treeIter.HasNext())
-        {
-        TFsTreeItemId itemId(treeIter.Next());
-        if (itemId != KFsTreeNoneID)
+        iWorld.RemoveAllL();
+        treeIter = iTreeData->Iterator(KFsTreeRootID, KFsTreeRootID,
+                KFsTreeIteratorSkipCollapsedFlag);
+        while (treeIter.HasNext())
             {
-            MFsTreeItemVisualizer* itemviz(iTreeData->ItemVisualizer(itemId));
-            iWorld.AppendL(itemId, itemviz->Size());
+            TFsTreeItemId itemId(treeIter.Next());
+            if (itemId != KFsTreeNoneID)
+                {
+                MFsTreeItemVisualizer* itemviz(iTreeData->ItemVisualizer(itemId));
+                iWorld.AppendL(itemId, itemviz->Size());
+                }
             }
-        }
-        // Below line commetned out. ViewPort is now not moved to the top of mail list
-        //iViewPort.SetPositionL(TPoint(), EFalse);
-    iViewPort.ClearCache();
-    if (!isUpdating)
-        {
-        iWorld.EndUpdateL();
+            // Below line commetned out. ViewPort is now not moved to the top of mail list
+            //iViewPort.SetPositionL(TPoint(), EFalse);
+        iViewPort.ClearCache();
+        if (!isUpdating)
+            {
+            iWorld.EndUpdateL();
+            }
         }
     }
 
@@ -2820,6 +2829,10 @@
             break;
         case EFsTreeRemovedAll:
             {
+            if ( iPhysics )
+                {
+                iPhysics->StopPhysics();
+                }
             if (!iWorld.IsUpdating())
                 {
                 iRootVisualizer->ShowL(*iRootLayout);
@@ -3229,7 +3242,7 @@
                 }
             else if (iVisualizationState == EFsTreeFadingOut)
                 {
-                iScrollBar->MakeVisible(EFalse);
+                iScrollBar->Show( EFalse );
                 iVisualizationState = EFsTreeHidden;
                 }
             break;
@@ -3291,7 +3304,7 @@
                 }
             else if (iVisualizationState == EFsTreeSlidingOut)
                 {
-                iScrollBar->MakeVisible(EFalse);
+                iScrollBar->Show( EFalse );
                 iVisualizationState = EFsTreeHidden;
                 }
             break;
@@ -3328,24 +3341,18 @@
 void CFsTreeVisualizerBase::HandleActionL(
         const TAlfActionCommand& aActionCommand)
     {
-    // <cmail> Change scrollbar to avkon (to support skinning & touch)
     if (KAknsMessageSkinChange == aActionCommand.Id())
-        {//layoout has changed
-        //        HideList(EFalse, EFalse);
-        //        ShowListL(ETrue, EFalse);
-        iScrollBar->HandleResourceChange(KAknsMessageSkinChange);
-        }
-    // </cmail>
+        {
+        iScrollBar->NotifyThemeChanged();
+        }
     }
 
 // ---------------------------------------------------------------------------
 // Hides visible list items. Clears the visible items table.
 // ---------------------------------------------------------------------------
 //
-// <cmail>
 void CFsTreeVisualizerBase::ClearVisibleItemsListL(TBool /*aRemoveAll*/,
         TBool /*aScrollList*/)
-// </cmail>
     {
     FUNC_LOG;
     }
@@ -3665,10 +3672,22 @@
     FUNC_LOG;
     if (iScrollBar->ThumbPosition() != iViewPort.Position().iY)
         {
-        iScrollbarModel.SetFocusPosition(iViewPort.Position().iY);
-        iScrollBar->SetModelL(&iScrollbarModel);
-        iScrollBar->DrawDeferred();
-        }
+        SetScrollBarModelValues();
+        iScrollBar->UpdateModelL(iScrollBarModel);
+        iScrollBar->Redraw();
+        }
+    }
+
+// ---------------------------------------------------------------------------
+//  Sets scrollbar model values.
+// ---------------------------------------------------------------------------
+//
+void CFsTreeVisualizerBase::SetScrollBarModelValues()
+    {
+    const TInt pageSize(iViewPort.Size().iHeight);
+    iScrollBarModel.SetHeight(Max(iWorld.Height(), pageSize));
+    iScrollBarModel.SetWindowHeight(pageSize);
+    iScrollBarModel.SetWindowPosition(iViewPort.Position().iY);    
     }
 
 // ---------------------------------------------------------------------------
@@ -3682,19 +3701,23 @@
     TRect mainPaneRect;
     AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect);
     TRect listRect(iRootLayout->DisplayRectTarget());
-    listRect.Move(mainPaneRect.iTl);
+    if (!(iScrollBar->LayoutHints() & MUiCScrollBar::ELayoutRelativeToList))
+        {
+        listRect.Move(mainPaneRect.iTl);
+        }
+    else
+        {
+        const TPoint& tl( listRect.iTl );
+        listRect.Move( -tl.iX, -tl.iY );
+        }
     TRect scrollPane, listPane;
     CFsLayoutManager::LayoutMetricsRect(listRect,
             CFsLayoutManager::EFsLmSpFsScrollPane, scrollPane);
     CFsLayoutManager::LayoutMetricsRect(listRect,
             CFsLayoutManager::EFsLmMainSpFsListPane, listPane);
-
-    const TInt pageSize(iViewPort.Size().iHeight);
-    iScrollbarModel.SetScrollSpan(Max(iWorld.Height(), pageSize));
-    iScrollbarModel.SetWindowSize(pageSize);
-    iScrollbarModel.SetFocusPosition(iViewPort.Position().iY);
-    iScrollBar->SetModelL(&iScrollbarModel);
-    iScrollBar->DrawDeferred();
+    SetScrollBarModelValues();
+    iScrollBar->UpdateModelL(iScrollBarModel);
+    iScrollBar->Redraw();
 
     RArray<TInt> columns;
     CleanupClosePushL(columns);
@@ -3705,16 +3728,32 @@
         iScrollBar->SetRect(scrollPane);
         if (AknLayoutUtils::LayoutMirrored())
             {
-            columns.AppendL(scrollPane.Width());
-            columns.AppendL(listPane.Width());
+            if (iScrollBar->LayoutHints() & MUiCScrollBar::ELayoutOnTopOfList)
+                {
+                columns.AppendL(0);
+                columns.AppendL(listRect.Width());
+                }
+            else
+                {
+                columns.AppendL(scrollPane.Width());
+                columns.AppendL(listPane.Width());
+                }
             }
         else
             {
-            columns.AppendL(listPane.Width());
-            columns.AppendL(scrollPane.Width());
+            if (iScrollBar->LayoutHints() & MUiCScrollBar::ELayoutOnTopOfList)
+                {
+                columns.AppendL(listRect.Width());
+                columns.AppendL(0);
+                }
+            else
+                {
+                columns.AppendL(listPane.Width());
+                columns.AppendL(scrollPane.Width());
+                }
             }
         iComponentLayout->SetColumnsL(columns);
-        iScrollBar->MakeVisible(ETrue);
+        iScrollBar->Show(ETrue);
         updateLayouts = ETrue;
         }
     else if (!iViewPort.IsScrollBarNeeded())
@@ -3722,15 +3761,15 @@
         if (AknLayoutUtils::LayoutMirrored())
             {
             columns.AppendL(0);
-            columns.AppendL(listPane.Width());
+            columns.AppendL(listRect.Width());
             }
         else
             {
-            columns.AppendL(listPane.Width());
+            columns.AppendL(listRect.Width());
             columns.AppendL(0);
             }
         iComponentLayout->SetColumnsL(columns);
-        iScrollBar->MakeVisible(EFalse);
+        iScrollBar->Show(EFalse);
         updateLayouts = ETrue;
         }
     CleanupStack::PopAndDestroy(); // columns.Close()
@@ -4604,7 +4643,7 @@
 // ---------------------------------------------------------------------------
 //
 CFsTreeVisualizerBase::CFsTreeVisualizerBase( CAlfControl* aOwnerControl,
-        CAlfLayout& aParent, const TBool aDirectTouchMode )
+        CAlfLayout& aParent, const TBool aPopUpMode )
     : iVisualizationState(EFsTreeHidden),
       iOwnerControl ( aOwnerControl ),
       iParentLayout ( aParent ),
@@ -4640,8 +4679,8 @@
       iViewPort( *this, iWorld )
     {
     FUNC_LOG;
-    iFlags.Set(EAutoRefresh);
-    iFlags.Assign(EDirectTouchMode, aDirectTouchMode);
+    iFlags.Set( EAutoRefresh );
+    iFlags.Assign( EPopupMode, aPopUpMode );
     iFlags.Set( EExpandCollapseOnLongTap );
     }
 // </cmail>
@@ -4660,7 +4699,7 @@
         iPhysics = CAknPhysics::NewL(*this, NULL );
         iDragHandler = CDragHandler::NewL(*this,
                 iPhysics->HighlightTimeout(), iFlags);
-        iPhysics->SetFriction(KDefaultFriction);                        
+        iPhysics->SetFriction(KDefaultFriction);
         }
 
     iRootData = CFsTreePlainOneLineItemData::NewL();
@@ -4746,17 +4785,24 @@
 
     iScrollbarVisibility = EFsScrollbarShowAlways;
 
-    iScrollBar = new (ELeave) CAknDoubleSpanScrollBar(0);
-    iScrollBar->ConstructL(ETrue, this, 0, CEikScrollBar::EVertical, 1000);
-
-    iScrollbarModel.SetScrollSpan(iComponentLayout->Size().Target().iY);
-    iScrollbarModel.SetFocusPosition(iViewPort.Position().iY);
-    iScrollbarModel.SetWindowSize(iListLayout->Size().iY.Target());
-
-    iScrollBar->MakeVisible(EFalse);
-    iScrollBar->SetModelL(&iScrollbarModel);
-
-    // </cmail>
+    iScrollBarLayout = CAlfAnchorLayout::AddNewL( *iOwnerControl, iListDeck );
+    iScrollBarLayout->SetFlags( EAlfVisualFlagIgnorePointer );
+
+    if ( iFlags.IsSet( EPopupMode ) )
+        {
+        iScrollBar = CUiCAknScrollBarAdapter::NewL( *this );
+        }
+    else
+        {
+        iScrollBar = CUiCScrollBar::NewL( iOwnerControl->Env(), iScrollBarLayout );
+        }
+
+    iScrollBarModel.SetHeight(iComponentLayout->Size().Target().iY);
+    iScrollBarModel.SetWindowPosition(iViewPort.Position().iY);
+    iScrollBarModel.SetWindowHeight(iListLayout->Size().iY.Target());
+
+    iScrollBar->Show( EFalse );
+    iScrollBar->UpdateModelL( iScrollBarModel );
 
     iFadeEffect = CFsFadeEffect::NewL(iOwnerControl, this, iRootLayout, 0);
     iSlideEffect = CFsSlideEffect::NewL(iOwnerControl, this, iRootLayout, 0);
@@ -4773,38 +4819,27 @@
     UpdateViewPortL();
     }
 
-// <cmail> Change scrollbar to avkon (to support skinning & touch)
 // ---------------------------------------------------------------------------
 //  Handle scrollbar events
 // ---------------------------------------------------------------------------
 //
-void CFsTreeVisualizerBase::HandleScrollEventL(CEikScrollBar* aScrollBar,
-        TEikScrollEvent aEventType)
+void CFsTreeVisualizerBase::HandleScrollEventL( const MUiCScrollBar& aScrollBar,
+        MUiCScrollBar::TEvent aEvent )
     {
     FUNC_LOG;
-
-    if (iPhysics)
-        {
-        iPhysics->StopPhysics();
-        }
-
-    if (aScrollBar == iScrollBar)
-        {
-
-        switch (aEventType)
-            {
-            case EEikScrollHome:
-                //Jump to beginning
-                break;
-            case EEikScrollEnd:
-                //Jump to end
-                break;
-            default:
-                TPoint position(iViewPort.Position());
-                position.iY = aScrollBar->ThumbPosition();
-                iViewPort.SetPositionL(position);
-                break;
-            }
+    switch (aEvent)
+        {
+        case MUiCScrollBar::EScrollHome:
+            // Home
+            break;
+        case MUiCScrollBar::EScrollEnd:
+            // End
+            break;
+        default:
+            TPoint position(iViewPort.Position());
+            position.iY = aScrollBar.ThumbPosition();
+            iViewPort.SetPositionL(position);
+            break;
         }
     }
 
@@ -4822,7 +4857,7 @@
         }
     else
         {
-        iScrollBar->MakeVisible(EFalse);
+        iScrollBar->Show( EFalse );
         }
     }
 
@@ -4891,14 +4926,14 @@
     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]);
@@ -4906,7 +4941,7 @@
     			{
     			MFsTreeItemVisualizer* visualizer = iTreeData->ItemVisualizer(
     											itemId);
-    			visualizer->UpdateL(iTreeData->ItemData(itemId), 
+    			visualizer->UpdateL(iTreeData->ItemData(itemId),
     							IsItemFocused(itemId) && IsFocusShown(),
     							iTreeData->Level(itemId), iMarkIcon, iMenuIcon,
     							0);
@@ -4960,21 +4995,14 @@
             visualizer->ShowL(*iListLayout);
             TSize size(visualizer->Size());
             TInt listInnerWidth(iListLayout->Size().IntTarget().iX);
-            TAlfTimedPoint tpItemSize(listInnerWidth, size.iHeight);
-            tpItemSize.SetTarget(TAlfRealPoint(listInnerWidth, size.iHeight),
-                    0);
+            TAlfTimedPoint tpItemSize( listInnerWidth, size.iHeight );
             CAlfLayout& visualizerLayout(visualizer->Layout());
             visualizerLayout.SetSize(tpItemSize);
+        	visualizer->UpdateL(iTreeData->ItemData(itemId),
+                IsItemFocused(itemId) && IsFocusShown(),
+                iTreeData->Level(itemId), iMarkIcon, iMenuIcon,
+                0);
             visualizerLayout.PropertySetIntegerL(KPropertyItemId(), 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);
@@ -5054,7 +5082,7 @@
         const TSize worldSize(viewSize.iWidth, Max(iWorld.Height(),
                 viewSize.iHeight));
         iPhysics->InitPhysicsL(worldSize, viewSize, EFalse);
-        iPhysics->SetFriction(KDefaultFriction);                        
+        iPhysics->SetFriction(KDefaultFriction);
         }
     }
 
@@ -5089,9 +5117,9 @@
 void CFsTreeVisualizerBase::PhysicEmulationEnded()
     {
     FUNC_LOG;
-    
+
     TRAP_IGNORE( iViewPort.SetCenterPositionL(iViewPort.CenterPosition(), ETrue, EUpdatedByPhisicEnd));
-    
+
     iFlags.Clear(EPhysicsOn);
     if (iFlags.IsSet(EUpdatePhysicsAfterSimulationFinished))
         {