taskswitcher/taskswitcherui/taskswitcherapp/src/tsfastswaparea.cpp
branchRCL_3
changeset 102 ba63c83f4716
parent 93 b01126ce0bec
--- a/taskswitcher/taskswitcherui/taskswitcherapp/src/tsfastswaparea.cpp	Wed Sep 15 12:00:00 2010 +0300
+++ b/taskswitcher/taskswitcherui/taskswitcherapp/src/tsfastswaparea.cpp	Wed Oct 13 14:18:30 2010 +0300
@@ -28,11 +28,12 @@
 #include <aknlayoutscalable_apps.cdl.h>
 #include <layoutmetadata.cdl.h>
 #include <aknlists.h>
+#include <touchfeedback.h>
+#include <akntransitionutils.h>
+#include <akntranseffect.h>
 #include <aknlongtapanimation.h>
-#include <aknpointereventsuppressor.h>
 
 #include "tsfastswaparea.h"
-#include "tsfastswapareautils.h"
 #include "tsapplogging.h"
 #include "tsfswclient.h"
 #include "tsappui.h"
@@ -57,7 +58,6 @@
 const TInt KAppKeyTypeLong = 2;
 
 const TInt KLayoutItemCount = 4;
-const TInt KLayoutItemGap = 0;
 
 const TInt KRedrawTime = 250000; // 0.25 sec
 const TInt KRedrawTimeForLayoutSwitch = 700000; // 0.7 sec
@@ -66,17 +66,12 @@
 const TInt KOrientationSwitchTime = 1000000; // 1 sec
 const TInt KLongTapAnimationInitTime = 150000; // 0.15 sec
 const TInt KLongTapAnimationTimeout = 1000000; // 1 sec
-const TInt KPointerEventSuppressorMaxTapDuration = 400000;	// 0.4 sec
-const TInt KPointerEventSuppressorMaxTapMoveWidth = 3;
-const TInt KPointerEventSuppressorMaxTapMoveHeight = 8;
 
 const TInt KMaxGranularity = 4;
 
 const TUid KTsMenuUid = { 0x101f4cd2 };
 const TUid KTsHomescreenUid = { 0x102750f0 };
 
-
-
 // -----------------------------------------------------------------------------
 // CTsFastSwapArea::NewL
 // -----------------------------------------------------------------------------
@@ -114,9 +109,7 @@
     CTsDeviceState& aDeviceState,
     CTsEventControler& aEventHandler) :
     iParent(aParent), iDeviceState(aDeviceState), iEvtHandler(aEventHandler),
-    iGridItemGap(KLayoutItemGap), iIgnoreLayoutSwitch(EFalse), 
-    iSupressDrag(EFalse),iWidgetClosingCount(0),
-    iLongTapAnimationRunning(EFalse)
+    iIgnoreLayoutSwitch(EFalse), iWidgetClosingCount(0), iLongTapAnimationRunning(EFalse)
     {
     // no implementation required
     }
@@ -138,10 +131,6 @@
     delete iOrientationSignalTimer;
     delete iLongTapAnimation;
     delete iLongTapAnimationTimer;
-    delete iFastSwapExt;
-    iPrevScreenshots.Close();
-    iPrevWgIds.Close();
-    delete iEventSupressor;
     }
 
 // -----------------------------------------------------------------------------
@@ -154,9 +143,6 @@
 
     SetRect( aRect );
 
-    // Create utility class
-    iFastSwapExt = CTsFastSwapAreaExtension::NewL( *this, *iEikonEnv );
-    
     // setup grid
     ReCreateGridL();
 
@@ -189,12 +175,6 @@
     iActivateOnPointerRelease = TPoint();
     iHandlePointerCandidate = EFalse;
     
-    iEventSupressor = CAknPointerEventSuppressor::NewL();
-    TSize maxTapMove(KPointerEventSuppressorMaxTapMoveWidth, 
-                     KPointerEventSuppressorMaxTapMoveHeight );
-    iEventSupressor->SetMaxTapMove(maxTapMove);
-    iEventSupressor->SetMaxTapDuration(KPointerEventSuppressorMaxTapDuration);
-    
     ActivateL();
     }
 
@@ -261,34 +241,25 @@
 //
 void CTsFastSwapArea::LayoutGridL()
     {
-    TSLOG_CONTEXT( CTsFastSwapArea::LayoutGridL, TSLOG_LOCAL );
-    TSLOG_IN();
-    
     RArray<TAknLayoutRect> rects;
     CleanupClosePushL(rects);
     rects.ReserveL(KLayoutItemCount);
-    iFastSwapExt->GetFastSwapAreaRects(rects);
+    GetFastSwapAreaRects(rects);
     TAknLayoutRect gridAppPane = rects[0];
     TAknLayoutRect gridItem = rects[1];
     TAknLayoutRect gridImage = rects[2];
-
+    TAknLayoutRect gridNextItem = rects[3];
     CleanupStack::PopAndDestroy(&rects);
     
-    TPoint position = iFastSwapExt->ItemViewPosition( SelectedIndex() );
-    iGrid->SetRect( CountCenteredGridRect( position ) );
-
-    
-    
-    CTsAppUi* appUi = static_cast<CTsAppUi*>(iEikonEnv->AppUi());
+    iGrid->SetRect(gridAppPane.Rect());
     
     TInt variety;
-    TBool disable = iFastSwapExt->GetVariety(variety);
+    TBool disable = GetVariety(variety);
     if ( disable )
         {
-        TRAP_IGNORE(appUi->RequestPopUpL());
+        TRAP_IGNORE(static_cast<CTsAppUi*>(iEikonEnv->AppUi())->RequestPopUpL());
         }
     variety = Layout_Meta_Data::IsLandscapeOrientation() ? 1 : 0; // double check to avoid layout panic
-    TSLOG1( TSLOG_INFO, "variety %d", variety );
     
     TAknLayoutScalableParameterLimits gridParams = 
         AknLayoutScalable_Apps::cell_tport_appsw_pane_ParamLimits( variety );
@@ -319,6 +290,14 @@
     iGrid->ItemDrawer()->FormattedCellData()->SetSubCellColorsL(1, colors);
     iGrid->SetStrokeColors(textColor, highlightTextColor);
     
+    if ( AknLayoutUtils::LayoutMirrored() )
+        {
+        iGridItemGap = gridItem.Rect().iTl.iX - gridNextItem.Rect().iBr.iX;
+        }
+    else
+        {
+        iGridItemGap = gridNextItem.Rect().iTl.iX - gridItem.Rect().iBr.iX;
+        }
     iMaxItemsOnScreen = Rect().Width() / gridItem.Rect().Width();
     if ( iMaxItemsOnScreen > 1 )
         {
@@ -330,6 +309,7 @@
             }
         }
     iGridItemWidth = gridItem.Rect().Width();
+    
     // Update item drawer
     iGrid->UpdateItemDrawerLayoutDataL();
     
@@ -338,10 +318,8 @@
     
     if ( disable )
         {
-        TRAP_IGNORE(appUi->DisablePopUpL());
+        TRAP_IGNORE(static_cast<CTsAppUi*>(iEikonEnv->AppUi())->DisablePopUpL());
         }
-    
-    TSLOG_OUT();
     }
 
 
@@ -354,7 +332,7 @@
     RArray<TAknLayoutRect> rects;
     CleanupClosePushL(rects);
     rects.ReserveL(KLayoutItemCount);
-    iFastSwapExt->GetFastSwapAreaRects(rects);
+    GetFastSwapAreaRects(rects);
     TAknLayoutRect gridItem = rects[1];
     CleanupStack::PopAndDestroy(&rects);
     if ( aItemCount )
@@ -383,6 +361,48 @@
         }
     }
 
+
+// --------------------------------------------------------------------------
+// CTsFastSwapArea::GetFastSwapAreaRects
+// --------------------------------------------------------------------------
+//
+void CTsFastSwapArea::GetFastSwapAreaRects( RArray<TAknLayoutRect>& aRects )
+    {
+    TAknLayoutRect gridAppPane;
+    TAknLayoutRect gridItem;
+    TAknLayoutRect gridImage;
+    TAknLayoutRect gridNextItem;
+    
+    TInt variety;
+    TBool disable = GetVariety(variety);
+    if ( disable )
+        {
+        TRAP_IGNORE(static_cast<CTsAppUi*>(iEikonEnv->AppUi())->RequestPopUpL());
+        }
+    variety = Layout_Meta_Data::IsLandscapeOrientation() ? 1 : 0; // double check to avoid layout panic
+    
+    gridAppPane.LayoutRect( Rect(), 
+            AknLayoutScalable_Apps::tport_appsw_pane( variety ) );
+    aRects.Append(gridAppPane);
+    
+    gridItem.LayoutRect( gridAppPane.Rect(),
+            AknLayoutScalable_Apps::cell_tport_appsw_pane( variety, 0, 0 ) );
+    aRects.Append(gridItem);
+    
+    gridImage.LayoutRect( gridItem.Rect(),
+            AknLayoutScalable_Apps::cell_tport_appsw_pane_g1( variety ) ); 
+    aRects.Append(gridImage);
+    gridNextItem.LayoutRect( gridAppPane.Rect(),
+            AknLayoutScalable_Apps::cell_tport_appsw_pane_cp03( variety ) );
+    aRects.Append(gridNextItem);
+    
+    if ( disable )
+        {
+        TRAP_IGNORE(static_cast<CTsAppUi*>(iEikonEnv->AppUi())->DisablePopUpL());
+        }
+    }
+
+
 // --------------------------------------------------------------------------
 // CTsFastSwapArea::Setup
 // --------------------------------------------------------------------------
@@ -534,7 +554,7 @@
             }
         
         // Orientation update
-        iPrevScreenOrientation = iFastSwapExt->GetCurrentScreenOrientation();
+        iPrevScreenOrientation = GetCurrentScreenOrientation();
         iOrientationSignalTimer->Cancel();
         iOrientationSignalTimer->After(KOrientationSwitchTime);
         }
@@ -604,31 +624,8 @@
     {
     TSLOG_CONTEXT( HandleFswContentChanged, TSLOG_LOCAL );
     TSLOG_IN();
-    
-    //prepare grid with current content from fastswap server 
-    GetContentForGrid();
-    // draw
-    UpdateGrid( ETrue, ETrue );
-    // notify observer, if present
-    NotifyChange();
-    
-    TSLOG_OUT();
-    }
 
-// --------------------------------------------------------------------------
-// CTsFastSwapArea::GetContentForGrid
-// --------------------------------------------------------------------------
-//
-void CTsFastSwapArea::GetContentForGrid()
-    {
-    TSLOG_CONTEXT( GetContentForGrid, TSLOG_LOCAL );
-    TSLOG_IN();
-    TRAPD( err,
-        // get current content from fastswap server
-        GetContentL();
-        // prepare grid content
-        RenderContentL();
-    )
+    TRAPD( err, HandleFswContentChangedL() );
     if ( err != KErrNone )
         {
         TSLOG1( TSLOG_INFO, "leave occured: %d", err );
@@ -638,23 +635,25 @@
     }
 
 // --------------------------------------------------------------------------
-// CTsFastSwapArea::GetContentL
+// CTsFastSwapArea::HandleFswContentChangedL
 // --------------------------------------------------------------------------
 //
-void CTsFastSwapArea::GetContentL()
+void CTsFastSwapArea::HandleFswContentChangedL()
     {
-    TSLOG_CONTEXT( GetContentL, TSLOG_LOCAL );
+    TSLOG_CONTEXT( HandleFswContentChangedL, TSLOG_LOCAL );
     TSLOG_IN();
+
+    // get current content from fastswap server
     iFSClient->GetContentL( iArray );
-    
-    #ifdef _DEBUG
+
+#ifdef _DEBUG
     for ( TInt i = 0, ie = iArray.Count(); i != ie; ++i )
         {
         CTsFswEntry* e = iArray[i];
         const TDesC& name( e->AppName() );
         TSLOG4( TSLOG_INFO, "[%d]: %d %d %S", i, e->WgId(), e->AppUid(), &name );
         }
-    #endif
+#endif
     
     // Update closing widget count if necessary
     if ( iWidgetClosingCount )
@@ -669,6 +668,13 @@
             }
         iWidgetClosingCount = widgetCount;
         }
+
+    // draw
+    RenderContentL();
+
+    // notify observer, if present
+    NotifyChange();
+
     TSLOG_OUT();
     }
 
@@ -676,16 +682,13 @@
 // CTsFastSwapArea::RenderContentL
 // --------------------------------------------------------------------------
 //
-void CTsFastSwapArea::RenderContentL( )
+void CTsFastSwapArea::RenderContentL( TBool aSuppressAnimation )
     {
     TSLOG_CONTEXT( RenderContentL, TSLOG_LOCAL );
     TSLOG_IN();
 
     _LIT(KSeparator, "\t");
     
-    // Cancel ongoing scaling
-    iFastSwapExt->CancelScaleTasks();
-    
     CArrayPtr<CGulIcon>* iconArray = new ( ELeave ) CAknIconArray( KMaxGranularity );
     CleanupStack::PushL( iconArray );
     CDesCArrayFlat* textArray = new ( ELeave ) CDesCArrayFlat( KMaxGranularity );
@@ -694,17 +697,10 @@
     CleanupClosePushL(closeItemArray);
     RArray<TInt> strokeItemArray;
     CleanupClosePushL(strokeItemArray);
-    RArray<TInt> screenshotList;
-    CleanupClosePushL(screenshotList);
-    RArray<TInt> wgIdList;
-    CleanupClosePushL(wgIdList);
     
     // Update view based on number of items
     LayoutGridViewL( iArray.Count() );
     
-    CArrayPtr<CGulIcon>* oldIconArray =
-        iGrid->ItemDrawer()->FormattedCellData()->IconArray();
-    
     for ( TInt i = 0; i < iArray.Count(); ++i )
         {
         const TDesC& appName( iArray[i]->AppName() );
@@ -717,16 +713,19 @@
         formAppName.Append(appName);
         textArray->AppendL(formAppName);
         CleanupStack::PopAndDestroy(&formAppName);
-        
+        TSize sz = PreferredImageSize();
+
         // take the screenshot or appicon+mask and make a copy and scale
+        CFbsBitmap* bitmap = 0;
         TInt h = iArray[i]->ScreenshotHandle();
         TSLOG2( TSLOG_INFO, "'%S' screenshot handle %d", &appName, h );
-        TBool isScreenshot( ETrue );
+        TInt maskh = 0;
+        CFbsBitmap* mask = 0;
         if ( !h )
             {
             // No screenshot, take app icon
             h = iArray[i]->AppIconBitmapHandle();
-            isScreenshot = EFalse;
+            maskh = iArray[i]->AppIconMaskHandle();
             TSLOG1( TSLOG_INFO, "using appicon, handle = %d", h );
             }
         else
@@ -735,36 +734,29 @@
             strokeItemArray.AppendL(i);
             }
         __ASSERT_DEBUG( h, User::Invariant() );
-        
-        // check screenshot - if it exists already, use it
-        // so there is no unnecessary scaling performed
-        CGulIcon* icon = CreateItemIconLC( iArray[i], isScreenshot );
+        bitmap = CopyBitmapL( h, sz );
+        CleanupStack::PushL( bitmap );
+        if ( maskh )
+            {
+            mask = CopyBitmapL( maskh, sz );
+            }
+        CleanupStack::PushL( mask );
+
+        CGulIcon* icon = CGulIcon::NewL( bitmap, mask );
+        CleanupStack::PushL(icon);
         iconArray->AppendL(icon);
-        CleanupStack::Pop( icon ); //icon
+        CleanupStack::Pop( 3, bitmap ); // mask, bitmap, icon
         
-        screenshotList.AppendL( h );
-        wgIdList.AppendL( iArray[i]->WgId() );
-                
         // Check if item can be closed
         if ( CanClose(i) && AknLayoutUtils::PenEnabled() )
             {
             closeItemArray.AppendL(i);
             }
         }
-    // Update screenshot list
-    iPrevScreenshots.Reset();
-    iPrevWgIds.Reset();
-    for ( TInt i = 0; 
-            i < screenshotList.Count() && i < wgIdList.Count(); i++ )
-        {
-        iPrevScreenshots.AppendL( screenshotList[i] );
-        iPrevWgIds.AppendL( wgIdList[i] );
-        }
-    CleanupStack::PopAndDestroy( &wgIdList );
-    CleanupStack::PopAndDestroy( &screenshotList );
-    
     // Setup grid
     iGrid->Model()->SetItemTextArray(textArray);
+    CArrayPtr<CGulIcon>* oldIconArray =
+        iGrid->ItemDrawer()->FormattedCellData()->IconArray();
     if(oldIconArray)
         {
         delete oldIconArray;
@@ -793,91 +785,38 @@
         {
         iGrid->SetCurrentDataIndex( GridItemCount() - 1 );
         }
+    UpdateGrid( ETrue, !aSuppressAnimation );
+    
     TSLOG_OUT();
     }
 
 // --------------------------------------------------------------------------
-// CTsFastSwapArea::CreateItemIconLC
+// CTsFastSwapArea::CopyBitmapL
+// Copy and scale.
 // --------------------------------------------------------------------------
 //
-CGulIcon* CTsFastSwapArea::CreateItemIconLC( CTsFswEntry* aEntry,
-                TBool aIsScreenshot )
+CFbsBitmap* CTsFastSwapArea::CopyBitmapL( TInt aFbsHandle, TSize aSize )
     {
-    TSize sz = iFastSwapExt->PreferredImageSize();
-    CArrayPtr<CGulIcon>* oldIconArray =
-            iGrid->ItemDrawer()->FormattedCellData()->IconArray();
-    
-    CFbsBitmap* bitmap = NULL;
-    CFbsBitmap* mask = NULL;
-    
-    TInt h = 0;
-    TInt maskh = 0;
-    if ( aIsScreenshot )
-        {
-        h = aEntry->ScreenshotHandle();
-        }
-    else
-        {
-        h = aEntry->AppIconBitmapHandle();
-        maskh = aEntry->AppIconMaskHandle();
-        }
-        
-    TInt idx = iPrevScreenshots.Find( h );
-    TInt wgIdIdx = iPrevWgIds.Find( aEntry->WgId() );
-        
-    if ( idx != KErrNotFound && idx == wgIdIdx 
-            && oldIconArray && idx < oldIconArray->Count() )
-        {
-        CGulIcon* existingIcon = oldIconArray->At( idx );
-        if ( existingIcon->Bitmap() )
-            {
-            bitmap = iFastSwapExt->DuplicateBitmapLC(
-                    existingIcon->Bitmap()->Handle() );
-            if ( existingIcon->Mask() )
-                {
-                maskh = existingIcon->Mask()->Handle();
-                mask = iFastSwapExt->DuplicateBitmapLC( maskh );
-                }
-            }
-        }
-    else if ( idx == KErrNotFound && wgIdIdx != KErrNotFound
-            && oldIconArray && wgIdIdx < oldIconArray->Count() )
-        {
-        CGulIcon* existingIcon = oldIconArray->At( wgIdIdx );
-        if ( existingIcon->Bitmap() 
-                && !existingIcon->Mask() )
-            {
-            bitmap = iFastSwapExt->DuplicateBitmapLC(
-                    existingIcon->Bitmap()->Handle() );
-            CFbsBitmap* source = iFastSwapExt->DuplicateBitmapLC( h );
-            iFastSwapExt->ScaleBitmapL( source, bitmap );
-            CleanupStack::Pop( source );
-            }
-        }
-    
-    // create bitmap for grid item
-    if ( !bitmap )
-        {
-        bitmap = iFastSwapExt->CopyBitmapL( h, sz, aIsScreenshot );
-        CleanupStack::PushL( bitmap );
-        }
-    if ( !mask && maskh )
-        {
-        mask = iFastSwapExt->CopyBitmapL( maskh, sz, EFalse );
-        CleanupStack::PushL( mask );
-        }
-    else if ( !mask )
-        {
-        CleanupStack::PushL( mask );
-        }
-    
-    CGulIcon* icon = CGulIcon::NewL( bitmap, mask );
-    CleanupStack::Pop( 2, bitmap );
-    CleanupStack::PushL( icon );
-    return icon;
+    CFbsBitmap* ret = new (ELeave) CFbsBitmap();
+    CleanupStack::PushL( ret );
+
+    CFbsBitmap* bmp = new (ELeave) CFbsBitmap();
+    CleanupStack::PushL( bmp );
+    User::LeaveIfError( bmp->Duplicate( aFbsHandle ) );
+
+    // do not always use aSize, preserving the aspect ratio is quite
+    // important when showing app icons instead of screenshots
+    TSize sz = CalculateSizePreserveRatio( aSize, bmp->SizeInPixels() );
+    User::LeaveIfError( ret->Create( sz, bmp->DisplayMode() ) );
+
+    AknIconUtils::ScaleBitmapL( sz, ret, bmp );
+
+    CleanupStack::PopAndDestroy( bmp );
+    CleanupStack::Pop( ret );
+
+    return ret;
     }
 
-
 // --------------------------------------------------------------------------
 // CTsFastSwapArea::CountComponentControls
 // --------------------------------------------------------------------------
@@ -952,22 +891,19 @@
         iGrid->ShowHighlight();
         }
     
-    //prepare grid with current content from fastswap server
-    GetContentForGrid();    
-    //restore default selection
-    RestoreSelectedIndex();
-    // draw
-    UpdateGrid( ETrue, EFalse );
-    // notify observer, if present
-    NotifyChange();
+    // get the current task list
+    HandleFswContentChanged();
     // and then start listening for changes
     iFSClient->Subscribe( *this );
     
+    RestoreSelectedIndex();
+    UpdateGrid(EFalse, EFalse);
+    
     iRedrawTimer->Cancel();
     iRedrawTimer->After(KRedrawTime);
     
     // give feedback
-    iFastSwapExt->LaunchPopupFeedback();
+    LaunchPopupFeedback();
     
     iPrevAppCount = iArray.Count();
     
@@ -1113,11 +1049,9 @@
 //
 void CTsFastSwapArea::HandlePointerEventL( const TPointerEvent& aPointerEvent )
     {
-    TBool supressed = iEventSupressor->SuppressPointerEvent( aPointerEvent );
     iKeyEvent = EFalse;
     if(aPointerEvent.iType == TPointerEvent::EButton1Down)
         {
-        iSupressDrag = EFalse;
         iHandlePointerCandidate = ETrue;
         iTapEvent = aPointerEvent;
         iGrid->EnableAknEventHandling(EFalse);
@@ -1130,25 +1064,15 @@
             iLongTapAnimationTimer->After(KLongTapAnimationInitTime);
             }
         }
-    else if( aPointerEvent.iType == TPointerEvent::EDrag )
-        {
-        iSupressDrag = supressed;
-        }
     else if ( aPointerEvent.iType == TPointerEvent::EButton1Up )
         {
         CancelLongTapAnimation( EFalse );
         if( iActivateOnPointerRelease != TPoint() )
             {
             iHandlePointerCandidate = ETrue;
-            TapL( iActivateOnPointerRelease );
+            TapL(iActivateOnPointerRelease);
             iActivateOnPointerRelease = TPoint();
             }
-        else if( iSupressDrag )
-            {
-            iSupressDrag = EFalse;
-            iHandlePointerCandidate = ETrue;
-            TapL( iTapEvent.iParentPosition );
-            }
         }
     }
 
@@ -1277,7 +1201,7 @@
         }
     else if ( aSource == iOrientationSignalTimer )
         {
-        TInt currentOrientation = iFastSwapExt->GetCurrentScreenOrientation();
+        TInt currentOrientation = GetCurrentScreenOrientation();
         if ( currentOrientation != iPrevScreenOrientation )
             {
             // Order layout change
@@ -1351,7 +1275,7 @@
         {
         static_cast<CTsAppUi*>(iEikonEnv->AppUi())->RequestPopUpL();
         // give feedback
-        iFastSwapExt->LaunchPopupFeedback();
+        LaunchPopupFeedback();
         // save index for later use & show popup
         iAppIndexForPopup = aIndex;
         iPopup->SetPosition( aPoint, CAknStylusPopUpMenu::EPositionTypeLeftBottom );
@@ -1393,6 +1317,24 @@
     }
     
 // -----------------------------------------------------------------------------
+// CTsFastSwapArea::PreferredImageSize
+// -----------------------------------------------------------------------------
+//
+TSize CTsFastSwapArea::PreferredImageSize()
+    {
+    TAknLayoutRect gridImage;
+    TRAP_IGNORE(
+        RArray<TAknLayoutRect> rects;
+        CleanupClosePushL(rects);
+        rects.ReserveL(KLayoutItemCount);
+        GetFastSwapAreaRects(rects);
+        gridImage = rects[2];
+        CleanupStack::PopAndDestroy(&rects);
+        );
+    return gridImage.Rect().Size();
+    }
+    
+// -----------------------------------------------------------------------------
 // CTsFastSwapArea::GridItemCount
 // -----------------------------------------------------------------------------
 //
@@ -1401,32 +1343,6 @@
     return iGrid->Model()->ItemTextArray()->MdcaCount();
     }
 
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapArea::GridItemCount
-// -----------------------------------------------------------------------------
-//
-TInt CTsFastSwapArea::GetGridItemData( TsFastSwapAreaGridData aDataType )
-    {
-    TInt retVal;
-    switch ( aDataType )
-        {
-        case EMaxItemsOnScreen:
-            retVal = iMaxItemsOnScreen;
-            break;
-        case EGridItemWidth:
-            retVal = iGridItemWidth;
-            break;
-        case EGridItemGap:
-            retVal = iGridItemGap;
-            break;
-        default:
-            retVal = KErrArgument;
-            break;
-        }
-    return retVal;
-    }
-
 // -----------------------------------------------------------------------------
 // CTsFastSwapArea::HandleListBoxEventL
 // -----------------------------------------------------------------------------
@@ -1455,6 +1371,25 @@
         }
     }
 
+// --------------------------------------------------------------------------
+// CTsFastSwapArea::CalculateSizePreserveRatio
+// --------------------------------------------------------------------------
+//
+TSize CTsFastSwapArea::CalculateSizePreserveRatio(
+        const TSize& aTargetAreaSize,
+        const TSize& aSourceSize )
+    {
+    const TReal 
+      resizedAspectRatio(aTargetAreaSize.iWidth/(TReal)aTargetAreaSize.iHeight);
+    const TReal 
+      orginalAspectRatio(aSourceSize.iWidth/(TReal)aSourceSize.iHeight);
+    //this condition avoid empty margins ( bigger output ). to realy fit area change it
+    const TReal scaleFactor = 
+        ( orginalAspectRatio > resizedAspectRatio ) ? 
+        (aTargetAreaSize.iHeight /(TReal)aSourceSize.iHeight) ://scale by height
+        (aTargetAreaSize.iWidth /(TReal)aSourceSize.iWidth) ;//scale by width
+    return TSize(aSourceSize.iWidth * scaleFactor, aSourceSize.iHeight * scaleFactor);
+    }
 
 // --------------------------------------------------------------------------
 // CTsFastSwapArea::SelectNextItem
@@ -1486,7 +1421,7 @@
     {
     if( iMaxItemsOnScreen < GridItemCount() )
         {
-        TInt visibleItem = iFastSwapExt->ViewToVisibleItem( ViewPos() );
+        TInt visibleItem = ViewToVisibleItem( ViewPos() );
         if(iKeyEvent)
             {
             visibleItem = SelectedIndex();
@@ -1527,7 +1462,7 @@
 //
 void CTsFastSwapArea::UpdateGrid( TBool aForceRedraw, TBool aAnimate )
     {
-    TPoint targetPoint = iFastSwapExt->ItemViewPosition( SelectedIndex() );
+    TPoint targetPoint = ItemViewPosition( SelectedIndex() );
     if ( aForceRedraw || targetPoint.iX != ViewPos().iX )
         {
         if ( aAnimate )
@@ -1593,7 +1528,17 @@
     
     if ( aDrawNow )
         {
-        TRect gridViewRect = CountCenteredGridRect( aPoint );
+        TInt currentXPos = aPoint.iX;
+        currentXPos -= Rect().Width() / 2;
+        TRect gridViewRect = Rect();
+        gridViewRect.iTl.iX = -currentXPos;
+        // Take edge offset into account
+        gridViewRect.iTl.iX += Rect().iTl.iX;
+        if(GridItemCount() && GridItemCount() <= iMaxItemsOnScreen)
+            {
+            // Center view
+            gridViewRect.iTl.iX += ( Rect().Width() - GridItemCount() * iGridItemWidth ) / 2;
+            }
         //iParent.DrawDeferred();
         iGrid->DrawDeferred();
         iGrid->SetRect( gridViewRect );
@@ -1656,10 +1601,6 @@
             {
             iActivateOnPointerRelease = aPoint;
             }
-        else
-            {
-            iSupressDrag = EFalse;
-            }
         iGrid->ShowHighlight();
         DrawNow();
         }
@@ -1705,7 +1646,7 @@
     }
 
 // -----------------------------------------------------------------------------
-// CTsFastSwapArea::ViewPos
+// CTsFastSwapArea::ViewSize
 // -----------------------------------------------------------------------------
 //
 TPoint CTsFastSwapArea::ViewPos() const
@@ -1723,6 +1664,211 @@
     return retVal;
     }
 
+// -----------------------------------------------------------------------------
+// CTsFastSwapArea::ItemPosition
+// -----------------------------------------------------------------------------
+//
+TPoint CTsFastSwapArea::ItemViewPosition( TInt aItemIdx )
+    {
+    TPoint retVal = Rect().iTl;
+    if ( aItemIdx < 0 )
+        {
+        // No items
+        retVal.iX = 0;
+        }
+    else if ( aItemIdx == 0 )
+        {
+        // First item
+        if( AknLayoutUtils::LayoutMirrored() )
+            {
+            if ( GridItemCount() > iMaxItemsOnScreen )
+                {
+                retVal.iX = GridWorldSize().iWidth - Rect().Width();
+                }
+            else
+                {
+                retVal.iX = 0;
+                }
+            }
+        else // normal layout
+            {
+            retVal.iX = 0;
+            }
+        }
+    else if ( aItemIdx == GridItemCount() - 1 )
+        {
+        // Last item selected
+        if( AknLayoutUtils::LayoutMirrored() )
+            {
+            retVal.iX = 0;
+            }
+        else // normal layout
+            {
+            if ( GridItemCount() > iMaxItemsOnScreen )
+                {
+                retVal.iX = GridWorldSize().iWidth - Rect().Width();
+                }
+            else
+                {
+                retVal.iX = 0;
+                }
+            }
+        }
+    else
+        {
+        // Middle item
+        TInt screenMiddleItemOffset = ( Rect().Width() - iGridItemWidth ) / 2;
+        if( AknLayoutUtils::LayoutMirrored() )
+            {
+            retVal.iX = iGridItemWidth * ( GridItemCount() - 1 - aItemIdx ) - screenMiddleItemOffset;
+            retVal.iX += ( GridItemCount() - 1 - aItemIdx ) * iGridItemGap;
+            }
+        else // normal layout
+            {
+            retVal.iX = iGridItemWidth * aItemIdx - screenMiddleItemOffset;
+            retVal.iX += iGridItemGap * aItemIdx;
+            }
+        if ( retVal.iX < 0 )
+            {
+            retVal.iX = 0;
+            }
+        else if ( retVal.iX + Rect().Width() > GridWorldSize().iWidth )
+            {
+            retVal.iX = GridWorldSize().iWidth - Rect().Width();
+            }
+        }
+    
+    // Return middle of the view rectangle
+    retVal.iX += Rect().Width() / 2;
+    
+    return retVal;
+    }
+
+// -----------------------------------------------------------------------------
+// CTsFastSwapArea::ViewToVisibleItem
+// -----------------------------------------------------------------------------
+//
+TInt CTsFastSwapArea::ViewToVisibleItem( const TPoint aViewPos )
+    {
+    TInt retVal(0);
+    TPoint absViewPos = aViewPos;
+    absViewPos.iX -= Rect().Width() / 2;
+    if ( absViewPos.iX < 0 )
+        {
+        if ( AknLayoutUtils::LayoutMirrored() )
+            {
+            // View crossed left border of grid world rect, last item selected
+            retVal = GridItemCount() - 1;
+            }
+        else // normal layout
+            {
+            // View crossed left border of grid world rect, first item selected
+            retVal = 0;
+            }
+        }
+    else if ( absViewPos.iX + Rect().Width() > GridWorldSize().iWidth )
+        {
+        if ( AknLayoutUtils::LayoutMirrored() )
+            {
+            // View crossed right border of grid world rect, first item selected
+            retVal = 0;
+            }
+        else // normal layout
+            {
+            // View crossed right border of grid world rect, last item selected
+            retVal = GridItemCount() - 1;
+            }
+        }
+    else
+        {
+        TInt retItemPosX(0);
+        TInt offsetCheck = GridWorldSize().iWidth;
+        // View inside of grid world rect
+        for ( TInt i = 0 ; i < GridItemCount(); i++ )
+            {
+            TInt itemPosX = ItemViewPosition( i ).iX;
+            TInt offset = aViewPos.iX - itemPosX;
+            if ( Abs( offset ) <= offsetCheck )
+                {
+                offsetCheck = Abs( offset );
+                retVal = i;
+                retItemPosX = itemPosX;
+                }
+            else
+                {
+                break;
+                }
+            }
+        // Check if item is fully visible. If not
+        // return next one if possible
+        if ( retItemPosX - iGridItemWidth / 2 < absViewPos.iX &&
+             retVal + 1 < GridItemCount() )
+            {
+            retVal++;
+            }
+        }
+    
+    return retVal;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CTsFastSwapArea::LaunchPopupFeedback
+// -----------------------------------------------------------------------------
+//
+void CTsFastSwapArea::LaunchPopupFeedback()
+    {
+    if ( AknLayoutUtils::PenEnabled() )
+        {
+        MTouchFeedback* feedback = MTouchFeedback::Instance();
+        if ( feedback )
+            {
+            TTouchLogicalFeedback fbLogicalType = ETouchFeedbackPopUp;
+            if ( CAknTransitionUtils::TransitionsEnabled(
+                 AknTransEffect::EComponentTransitionsOff ) )
+                {
+                fbLogicalType = ETouchFeedbackIncreasingPopUp;
+                }
+            feedback->InstantFeedback( this,
+                                       fbLogicalType,
+                                       ETouchFeedbackVibra,
+                                       TPointerEvent() );
+            }
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CTsFastSwapArea::GetCurrentScreenOrientation
+// -----------------------------------------------------------------------------
+//
+TInt CTsFastSwapArea::GetCurrentScreenOrientation()
+    {
+    TPixelsAndRotation availableRect;
+    iEikonEnv->ScreenDevice()->GetDefaultScreenSizeAndRotation(availableRect);
+    return availableRect.iPixelSize.iWidth > availableRect.iPixelSize.iHeight;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CTsFastSwapArea::GetVariety
+// -----------------------------------------------------------------------------
+//
+TBool CTsFastSwapArea::GetVariety( TInt& aVariety )
+    {
+    aVariety = Layout_Meta_Data::IsLandscapeOrientation() ? 1 : 0;
+    TBool foreground = static_cast<CTsAppUi*>(iEikonEnv->AppUi())->IsForeground();
+    if ( foreground )
+        {
+        TInt screenOrientation = GetCurrentScreenOrientation();
+        if ( aVariety != screenOrientation )
+            {
+            aVariety = screenOrientation;
+            return ETrue;
+            }
+        }
+    return EFalse;
+    }
 
 // -----------------------------------------------------------------------------
 // CTsFastSwapArea::IsAppClosing
@@ -1778,7 +1924,6 @@
         {
         retVal = ETrue;
         }
-    
     iPrevAppCount = appCount;
     return retVal;
     }
@@ -1823,24 +1968,4 @@
     return EFalse;
     }
 
-// -----------------------------------------------------------------------------
-// CTsFastSwapArea::CountCenteredGridRect
-// -----------------------------------------------------------------------------
-//
-TRect CTsFastSwapArea::CountCenteredGridRect( TPoint aItemPosition)
-    {
-    TInt currentXPos = aItemPosition.iX;
-    currentXPos -= Rect().Width() / 2;
-    TRect gridViewRect = Rect();
-    gridViewRect.iTl.iX = -currentXPos;
-    // Take edge offset into account
-    gridViewRect.iTl.iX += Rect().iTl.iX;
-    if(GridItemCount() && GridItemCount() <= iMaxItemsOnScreen)
-        {
-        // Center view
-        gridViewRect.iTl.iX += ( Rect().Width() - GridItemCount() * iGridItemWidth ) / 2;
-        }
-    return gridViewRect;
-    }
-
 // End of file