taskswitcher/taskswitcherui/taskswitcherapp/src/tsfastswaparea.cpp
branchv5backport
changeset 14 1abc632eb502
parent 13 6205fd287e8a
child 20 636d517f67e6
--- a/taskswitcher/taskswitcherui/taskswitcherapp/src/tsfastswaparea.cpp	Thu Mar 18 14:45:17 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1599 +0,0 @@
-/*
-* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:  Taskswitcher Fast Swap area UI
- *
-*/
-
-
-#include <gulicon.h>
-#include <eikenv.h>
-#include <AknUtils.h>
-#include <AknIconUtils.h>
-#include <AknIconArray.h>
-#include <aknstyluspopupmenu.h>
-#include <AknQueryDialog.h>
-#include <StringLoader.h>
-#include <tstaskswitcher.rsg>
-#include <aknlayoutscalable_apps.cdl.h>
-#include <layoutmetadata.cdl.h>
-#include <aknlists.h>
-#include <touchfeedback.h>
-#include <akntransitionutils.h>
-#include <akntranseffect.h>
-
-#include "tsfastswaparea.h"
-#include "tsapplogging.h"
-#include "tsfswclient.h"
-#include "tsappui.h"
-#include "tsdatachangeobserver.h"
-#include "tseventcontroler.h"
-
-/** command ids for the fsw popup */
-enum TPopupCommands
-    {
-    EFswCmdClose = 10000,
-    EFswCmdCloseAll
-    };
-
-/** Number of closable applications, to show "close all" option. */
-const TInt KTsMaxClosableApps = 2;
-
-/** Interval until which no change in the fsw content is rendered
-    after starting the closing of an application. */
-const TInt KRefreshDelayAfterClose = 2; // seconds
-
-/** Uid of Active Idle application. 
-    Used when movind Ai to specified position.*/
-const TUid KAiUid = TUid::Uid( 0x102750F0 );
-    
-/** Position of Ai in fsw grid.*/
-const TInt KAiPosition = 0;
-
-/** Default grid item to highlight.*/
-const TInt KItemToHighlight = 3;
-
-const TInt KAppKeyTypeShort = 1;
-const TInt KAppKeyTypeLong = 2;
-
-const TInt KLayoutItemCount = 4;
-
-const TInt KRedrawTime = 250000; // 0.25 sec
-const TInt KHighlighActivationTime = 100000; // 100 ms
-const TInt KUpdateGridTime = 1000000; // 1 s
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapArea::NewL
-// -----------------------------------------------------------------------------
-//
-CTsFastSwapArea* CTsFastSwapArea::NewL( const TRect& aRect,
-    CCoeControl& aParent, CTsDeviceState& aDeviceState, 
-    CTsEventControler& aEventHandler )
-    {
-    CTsFastSwapArea* self = CTsFastSwapArea::NewLC(aRect,
-            aParent, aDeviceState, aEventHandler);
-    CleanupStack::Pop( self );
-    return self;
-    }
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapArea::NewLC
-// -----------------------------------------------------------------------------
-//
-CTsFastSwapArea* CTsFastSwapArea::NewLC( const TRect& aRect,
-    CCoeControl& aParent, CTsDeviceState& aDeviceState,
-    CTsEventControler& aEventHandler)
-    {
-    CTsFastSwapArea* self = new (ELeave) CTsFastSwapArea(
-            aParent, aDeviceState, aEventHandler);
-    CleanupStack::PushL( self );
-    self->ConstructL( aRect );
-    return self;
-    }
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapArea::CTsFastSwapArea
-// -----------------------------------------------------------------------------
-//
-CTsFastSwapArea::CTsFastSwapArea(CCoeControl& aParent,
-    CTsDeviceState& aDeviceState,
-    CTsEventControler& aEventHandler) :
-    iParent(aParent), iDeviceState(aDeviceState), iEvtHandler(aEventHandler),
-    iPreviousNoOfItems(0)
-    {
-    // no implementation required
-    }
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapArea::~CTsFastSwapArea
-// -----------------------------------------------------------------------------
-//
-CTsFastSwapArea::~CTsFastSwapArea()
-    {
-    iArray.ResetAndDestroy();
-    delete iGrid;
-    delete iFSClient;
-    delete iPopup;
-    delete iHighlightTimer;
-    delete iRedrawTimer;
-    delete iUpdateGridTimer;
-    }
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapArea::ConstructL
-// -----------------------------------------------------------------------------
-//
-void CTsFastSwapArea::ConstructL( const TRect& aRect )
-    {
-    SetContainerWindowL( iParent );
-
-    SetRect( aRect );
-
-    // setup ganes grid
-    ReCreateGridL();
-
-    // create stylus popup instance
-    PreCreatePopupL();
-
-    // connect to fsw server
-    iFSClient = CTsFswClient::NewL();
-    
-    iEvtHandler.ReInitPhysicsL(GridWorldSize(), ViewSize(), ETrue);
-    
-    // add self to device state observer
-    iDeviceState.AddObserverL( *this, EDeviceType );
-    
-    iHighlightTimer = new (ELeave) CTsFastSwapTimer( *this );
-    iHighlightTimer->ConstructL();
-    
-    iRedrawTimer = new (ELeave) CTsFastSwapTimer( *this );
-    iRedrawTimer->ConstructL();
-
-    iUpdateGridTimer = new (ELeave) CTsFastSwapTimer( *this );
-    iUpdateGridTimer->ConstructL();
-    
-    ActivateL();
-    }
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapArea::ReCreateGridL
-// -----------------------------------------------------------------------------
-//
-void CTsFastSwapArea::ReCreateGridL()
-    {
-    MCoeControlObserver* obs = NULL;
-    TBool wasHighlight = iDeviceState.DeviceType() == 
-                             CTsDeviceState::EHybrid ? ETrue : EFalse;
-    if ( iGrid )
-        {
-        obs = iGrid->Observer();
-        iDeviceState.RemoveObserver(*iGrid);
-        wasHighlight = iGrid->IsHighlightVisible();
-        delete iGrid;
-        iGrid = NULL;
-        }
-    
-    iGrid = new( ELeave ) CTsFastSwapGrid;
-    iGrid->ConstructL( this );
-    iDeviceState.AddObserverL(*iGrid, MTsDeviceStateObserver::ESkin);
-    
-    AknListBoxLayouts::SetupStandardGrid( *iGrid );
-    
-    RArray<TAknLayoutRect> rects;
-    CleanupClosePushL(rects);
-    rects.ReserveL(KLayoutItemCount);
-    GetFastSwapAreaRects(rects);
-    TAknLayoutRect gridAppPane = rects[0];
-    TAknLayoutRect gridItem = rects[1];
-    TAknLayoutRect gridImage = rects[2];
-    TAknLayoutRect gridNextItem = rects[3];
-    CleanupStack::PopAndDestroy(&rects);
-    
-    TInt variety = Layout_Meta_Data::IsLandscapeOrientation() ? 1 : 0;
-    iGrid->SetRect(gridAppPane.Rect());
-    iGrid->SetVisibleViewRect(gridAppPane.Rect());
-    TAknLayoutScalableParameterLimits gridParams = 
-        AknLayoutScalable_Apps::cell_tport_appsw_pane_ParamLimits( variety );
-    TPoint empty( ELayoutEmpty, ELayoutEmpty );
-    
-    AknListBoxLayouts::SetupFormGfxCell( *iGrid, iGrid->ItemDrawer(), 0,
-            AknLayoutScalable_Apps::cell_tport_appsw_pane_g1( variety ).LayoutLine(),
-            empty, empty );
-
-    // Setup text layout
-    TAknLayoutText textLayout;
-    textLayout.LayoutText(
-            Rect(),
-            AknLayoutScalable_Apps::cell_tport_appsw_pane_t1( variety ).LayoutLine() );
-    
-    // Because textLayout.BaselineOffset() does not work (missing lib entry),
-    // we need to calculate offset ourselves
-    TInt baselineOffset = textLayout.TextRect().iBr.iY - textLayout.TextRect().iTl.iY;
-    AknListBoxLayouts::SetupFormTextCell( *iGrid, iGrid->ItemDrawer(), 1 /*Column index*/,
-                                          textLayout.Font() /*Font type*/,
-                                          NULL /*color*/,
-                                          textLayout.TextRect().iTl.iX /*Left margin*/, 0 /*unused*/,
-                                          baselineOffset /*Baseline*/, 0 /*Text width*/,
-                                          textLayout.Align() /*Text alignment*/,
-                                          TPoint(0,0) /*Start pos*/,
-                                          TPoint(0,0) /*End pos*/);
-    // Text colors
-    TRgb textColor;
-    AknsUtils::GetCachedColor( AknsUtils::SkinInstance(), textColor,
-            KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG6 );
-    TRgb highlightTextColor;
-    AknsUtils::GetCachedColor( AknsUtils::SkinInstance(), highlightTextColor,
-            KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG11 );
-    CFormattedCellListBoxData::TColors colors;
-    colors.iText = textColor;
-    colors.iBack = iGrid->ItemDrawer()->BackColor();
-    colors.iHighlightedText = highlightTextColor;
-    colors.iHighlightedBack = iGrid->ItemDrawer()->HighlightedBackColor();
-    iGrid->ItemDrawer()->FormattedCellData()->SetSubCellColorsL(1, colors);
-    
-    // Setup grid observers
-    if ( obs )
-        {
-        iGrid->SetObserver( obs );
-        }
-    iGrid->SetListBoxObserver(this);
-    iGrid->SetFastSwapGridObserver(this);
-    iGrid->SetContainerWindowL(*this);
-    
-    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 )
-        {
-        TInt widthWithGaps =
-            (iMaxItemsOnScreen - 1) * iGridItemGap + iMaxItemsOnScreen * gridItem.Rect().Width();
-        if ( widthWithGaps > Rect().Width() )
-            {
-            iMaxItemsOnScreen--;
-            }
-        }
-    iGridItemWidth = gridItem.Rect().Width();
-    
-    iGrid->ItemDrawer()->ColumnData()->SetDrawBackground(EFalse);
-    
-    // Update state
-    HandleDeviceStateChanged( EDeviceType );
-    if( wasHighlight )
-        {
-        iGrid->ShowHighlight();
-        }
-    else
-        {
-        iGrid->HideHighlight();
-        }
-    
-    // Make sure that there is an ActivateL call even when we are not
-    // called from ConstructL. (in order to have the grid's parent ptr set properly)
-    ActivateL();
-    }
-
-
-// --------------------------------------------------------------------------
-// CTsFastSwapArea::GetFastSwapAreaRects
-// --------------------------------------------------------------------------
-//
-void CTsFastSwapArea::GetFastSwapAreaRects( RArray<TAknLayoutRect>& aRects )
-    {
-    TAknLayoutRect gridAppPane;
-    TAknLayoutRect gridItem;
-    TAknLayoutRect gridImage;
-    TAknLayoutRect gridNextItem;
-    
-    TInt variety = Layout_Meta_Data::IsLandscapeOrientation() ? 1 : 0;
-    
-    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);
-    }
-
-
-// --------------------------------------------------------------------------
-// CTsFastSwapArea::Setup
-// --------------------------------------------------------------------------
-//
-void CTsFastSwapArea::Setup( MCoeControlObserver& aControlObserver )
-    {
-    iGrid->SetObserver( &aControlObserver );
-    }
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapArea::SizeChanged
-// -----------------------------------------------------------------------------
-//
-void CTsFastSwapArea::SizeChanged()
-    {
-    TSLOG_CONTEXT( CTsFastSwapArea::SizeChanged, TSLOG_LOCAL );
-    TSLOG_IN();
-    
-    if ( iGrid )
-        {
-        // Grid needs to be recreated to proper reinitilize
-        // data with new layout values
-        TInt selIdx = SelectedIndex();
-        TRAPD(err, 
-              ReCreateGridL();
-              iEvtHandler.ReInitPhysicsL(GridWorldSize(), ViewSize(), ETrue););
-        if ( err != KErrNone )
-            {
-            TSLOG1( TSLOG_INFO, "ReCreateGridL leaves with %d", err );
-            }
-        HandleFswContentChanged();
-        iGrid->SetCurrentDataIndex(selIdx);
-        UpdateGrid(ETrue, EFalse);
-        DrawDeferred();
-        }
-    TSLOG_OUT();
-    }
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapArea::Draw
-// -----------------------------------------------------------------------------
-//
-void CTsFastSwapArea::Draw( const TRect& /*aRect*/ ) const
-    {
-    CWindowGc& gc = SystemGc();
-    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
-    MAknsControlContext* cc = AknsDrawUtils::ControlContext( this );
-    AknsDrawUtils::Background( skin,
-           cc,
-           this,
-           gc,
-           Rect() );
-    }
-
-// --------------------------------------------------------------------------
-// CTsFastSwapArea::SwitchToApp
-// --------------------------------------------------------------------------
-//
-void CTsFastSwapArea::SwitchToApp( TInt aIndex )
-    {
-    if ( aIndex >= 0 && aIndex < iArray.Count() )
-        {
-        TInt wgId = iArray[aIndex]->WgId();
-        // Move other app to foreground and then move ourselves to background.
-        // Order is important and cannot be reversed.
-        iFSClient->SwitchToApp( wgId );
-        // We do not want to come back to ts if the activated app is closed.
-        // Therefore ts must be moved to background.
-        CTsAppUi* appui =
-            static_cast<CTsAppUi*>( iEikonEnv->AppUi() );
-        appui->MoveAppToBackground( AknTransEffect::EApplicationStartRect );
-        }
-    }
-
-// --------------------------------------------------------------------------
-// CTsFastSwapArea::TryCloseAppL
-// --------------------------------------------------------------------------
-//
-void CTsFastSwapArea::TryCloseAppL( TInt aIndex,
-        TBool aSuppressRendering )
-    {
-    TSLOG_CONTEXT( TryCloseAppL, TSLOG_LOCAL );
-    TSLOG2_IN( "%d %d", aIndex, aSuppressRendering );
-
-    if ( aIndex >= 0 && aIndex < iArray.Count() && CanClose( aIndex ) )
-        {
-        TInt wgId = iArray[aIndex]->WgId();
-        iFSClient->CloseApp( wgId );
-        // The fsw content will change sooner or later
-        // but the updated content (without the closed app) will not
-        // come very fast. It looks better to the user if the item
-        // in the grid is removed right here, right now.
-        // If the app does not close for some reason then this is
-        // not fully correct but the app will then reappear on the next
-        // content-changed notification anyway.
-        delete iArray[aIndex];
-        iArray.Remove( aIndex );
-        NotifyChange();
-        if ( !aSuppressRendering )
-            {
-            RenderContentL();
-            }
-        // Update item selection on the screen if last item was deleted
-        TInt newItemCount = GridItemCount();
-        if ( aIndex == newItemCount )
-            {
-            newItemCount--;
-            iGrid->SetCurrentDataIndex(newItemCount);
-            }
-        iTimeOfLastClose.HomeTime();
-        }
-
-    TSLOG_OUT();
-    }
-
-// --------------------------------------------------------------------------
-// CTsFastSwapArea::TryCloseAllL
-// --------------------------------------------------------------------------
-//
-void CTsFastSwapArea::TryCloseAllL()
-    {
-    // note the direction of the loop, this is needed because
-    // TryCloseAppL may modify the array
-    TBool changed = EFalse;
-    for ( TInt i = iArray.Count() - 1; i >= 0; --i )
-        {
-        if ( CanClose( i ) )
-            {
-            TryCloseAppL( i, ETrue );
-            changed = ETrue;
-            }
-        }
-    if ( changed )
-        {
-        RenderContentL();
-        RestoreSelectedIndex();
-        iGrid->DrawNow();
-        }
-    }
-
-// --------------------------------------------------------------------------
-// CTsFastSwapArea::CanClose
-// --------------------------------------------------------------------------
-//
-TBool CTsFastSwapArea::CanClose( TInt aIndex ) const
-    {
-    CTsFswEntry* e = iArray[aIndex];
-    return !e->AlwaysShown() && !e->SystemApp();
-    }
-
-// --------------------------------------------------------------------------
-// CTsFastSwapArea::CanCloseOthers
-// --------------------------------------------------------------------------
-//
-TBool CTsFastSwapArea::CanCloseAll( TInt aSelectedItem ) const
-    {
-    TInt count( 0 );
-
-    // Count number of closable applications and if number exceeds 2 finish
-    // counting, because it is already enough to show the option.
-    for ( TInt i = iArray.Count(); --i >= 0 && count < KTsMaxClosableApps; )
-        {
-        if ( CanClose( i ) )
-            {
-            count++;
-            }
-        }
-    return ( count >= KTsMaxClosableApps ) ||
-           ( count && !CanClose( aSelectedItem ) );
-    }
-
-// --------------------------------------------------------------------------
-// CTsFastSwapArea::HandleFswContentChanged
-// From MTsFswObserver
-// --------------------------------------------------------------------------
-//
-void CTsFastSwapArea::HandleFswContentChanged()
-    {
-    TSLOG_CONTEXT( HandleFswContentChanged, TSLOG_LOCAL );
-    TSLOG_IN();
-
-    TRAPD( err, HandleFswContentChangedL() );
-    if ( err != KErrNone )
-        {
-        TSLOG1( TSLOG_INFO, "leave occured: %d", err );
-        }
-
-    TSLOG_OUT();
-    }
-
-// --------------------------------------------------------------------------
-// CTsFastSwapArea::HandleFswContentChangedL
-// --------------------------------------------------------------------------
-//
-void CTsFastSwapArea::HandleFswContentChangedL()
-    {
-    TSLOG_CONTEXT( HandleFswContentChangedL, TSLOG_LOCAL );
-    TSLOG_IN();
-
-    // If there was an app close operation started during the last
-    // few seconds then stop, to prevent flickering.
-    TTime now;
-    now.HomeTime();
-    TTimeIntervalSeconds iv;
-    if ( now.SecondsFrom( iTimeOfLastClose, iv ) == KErrNone
-            && iv.Int() <= KRefreshDelayAfterClose )
-        {
-        TSLOG1_OUT( "difference since last close is only %d sec, stop", iv.Int() );
-        return;
-        }
-
-    // get current content from fastswap server
-    iFSClient->GetContentL( iArray );
-    SwapApplicationOrder( iArray );
-
-#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
-
-    // draw
-    RenderContentL();
-
-    // notify observer, if present
-    NotifyChange();
-
-    TSLOG_OUT();
-    }
-
-// --------------------------------------------------------------------------
-// CTsFastSwapArea::RenderContentL
-// --------------------------------------------------------------------------
-//
-void CTsFastSwapArea::RenderContentL()
-    {
-    TSLOG_CONTEXT( RenderContentL, TSLOG_LOCAL );
-    TSLOG_IN();
-
-    _LIT(KSeparator, "\t");
-    
-    CArrayPtr<CGulIcon>* iconArray = new ( ELeave ) CAknIconArray( iArray.Count() );
-    CleanupStack::PushL( iconArray );
-    CDesCArrayFlat* textArray = new ( ELeave ) CDesCArrayFlat( iArray.Count() );
-    CleanupStack::PushL( textArray );
-    RArray<TInt> closeItemArray;
-    CleanupClosePushL(closeItemArray);
-    
-    TInt variety = Layout_Meta_Data::IsLandscapeOrientation() ? 1 : 0;
-    RArray<TAknLayoutRect> rects;
-    CleanupClosePushL(rects);
-    rects.ReserveL(KLayoutItemCount);
-    GetFastSwapAreaRects(rects);
-    TAknLayoutRect gridItem = rects[1];
-    CleanupStack::PopAndDestroy(&rects);
-    if ( AknLayoutUtils::LayoutMirrored() )
-        {
-        iGrid->SetLayoutL( EFalse, EFalse, ETrue, iArray.Count(), 1, gridItem.Rect().Size(), iGridItemGap );
-        }
-    else
-        {
-        iGrid->SetLayoutL( EFalse, ETrue, ETrue, iArray.Count(), 1, gridItem.Rect().Size(), iGridItemGap );
-        }
-    
-    for ( TInt i = 0, ie = iArray.Count(); i != ie; ++i )
-        {
-        const TDesC& appName( iArray[i]->AppName() );
-        const TInt formatLen = 3 + 2;
-        RBuf formAppName;
-        CleanupClosePushL(formAppName);
-        formAppName.CreateL(appName.Length() + formatLen);
-        formAppName.AppendNum(i);
-        formAppName.Append(KSeparator);
-        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 );
-        TInt maskh = 0;
-        CFbsBitmap* mask = 0;
-        if ( !h )
-            {
-            h = iArray[i]->AppIconBitmapHandle();
-            maskh = iArray[i]->AppIconMaskHandle();
-            TSLOG1( TSLOG_INFO, "using appicon, handle = %d", h );
-            }
-        __ASSERT_DEBUG( h, User::Invariant() );
-        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( 3, bitmap ); // mask, bitmap, icon
-        
-        // Check if item can be closed
-        if ( CanClose(i) && AknLayoutUtils::PenEnabled() )
-            {
-            closeItemArray.AppendL(i);
-            }
-        }
-    // Setup grid
-    iGrid->Model()->SetItemTextArray(textArray);
-    CArrayPtr<CGulIcon>* oldIconArray =
-        iGrid->ItemDrawer()->FormattedCellData()->IconArray();
-    if(oldIconArray)
-        {
-        delete oldIconArray;
-        oldIconArray = NULL;
-        }
-    iGrid->ItemDrawer()->FormattedCellData()->SetIconArrayL(iconArray);
-    iGrid->SetCloseItemsL(closeItemArray);
-    
-    // Cleanup
-    CleanupStack::PopAndDestroy(&closeItemArray);
-    CleanupStack::Pop(textArray);
-    CleanupStack::Pop(iconArray);
-    
-    iGrid->ScrollBarFrame()->SetScrollBarVisibilityL(
-                CEikScrollBarFrame::EOff, CEikScrollBarFrame::EOff);
-    
-    // refresh the items in the grid
-    if(iPreviousNoOfItems < iArray.Count())
-        {
-        iGrid->HandleItemAdditionL();
-        }
-    else if(iPreviousNoOfItems > iArray.Count())
-        {
-        iGrid->HandleItemRemovalL();
-        }
-    iPreviousNoOfItems = iArray.Count();
-    iEvtHandler.ReInitPhysicsL( GridWorldSize(), ViewSize(), ETrue );
-    UpdateGrid( ETrue );
-    
-    TSLOG_OUT();
-    }
-
-// --------------------------------------------------------------------------
-// CTsFastSwapArea::CopyBitmapL
-// Copy and scale.
-// --------------------------------------------------------------------------
-//
-CFbsBitmap* CTsFastSwapArea::CopyBitmapL( TInt aFbsHandle, TSize aSize )
-    {
-    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
-// --------------------------------------------------------------------------
-//
-TInt CTsFastSwapArea::CountComponentControls() const
-    {
-    return 1;
-    }
-
-// --------------------------------------------------------------------------
-// CTsFastSwapArea::ComponentControl
-// --------------------------------------------------------------------------
-//
-CCoeControl* CTsFastSwapArea::ComponentControl( TInt aIndex ) const
-    {
-    if ( aIndex == 0 )
-        {
-        return iGrid;
-        }
-    return NULL;
-    }
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapArea::HandleSwitchToBackgroundEvent
-// -----------------------------------------------------------------------------
-//
-void CTsFastSwapArea::HandleSwitchToBackgroundEvent()
-    {
-    // stop listening for changes in fsw content
-    iFSClient->CancelSubscribe();
-    }
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapArea::HandleSwitchToForegroundEvent
-// -----------------------------------------------------------------------------
-//
-void CTsFastSwapArea::HandleSwitchToForegroundEvent()
-    {
-    TSLOG_CONTEXT( CTsFastSwapArea::HandleSwitchToForegroundEvent, TSLOG_LOCAL );
-    TSLOG_IN();
-    
-    // get the current task list
-    HandleFswContentChanged();
-    // and then start listening for changes
-    iFSClient->Subscribe( *this );
-    
-    if ( iDeviceState.DeviceType() == CTsDeviceState::EFullTouch )
-        {
-        iGrid->HideHighlight();
-        }
-    else
-        {
-        iGrid->ShowHighlight();
-        }
-    
-    RestoreSelectedIndex();
-    UpdateGrid(ETrue, EFalse);
-    
-    iRedrawTimer->Cancel();
-    iRedrawTimer->After(KRedrawTime);
-    
-    // give feedback
-    LaunchPopupFeedback();
-
-    TSLOG_OUT();
-    }
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapArea::FocusChanged
-// -----------------------------------------------------------------------------
-//
-void CTsFastSwapArea::FocusChanged( TDrawNow /*aDrawNow*/ )
-    {
-    if ( IsFocused() )
-        {
-        // if in non-touch mode then select (highlight) some item
-        if ( !AknLayoutUtils::PenEnabled()
-            && SelectedIndex() == KErrNotFound
-            && GridItemCount() )
-            {
-            RestoreSelectedIndex();
-            }
-        }
-    else
-        {
-        // store the currently selected index if there is one
-        SaveSelectedIndex();
-        }
-    iGrid->DrawDeferred();
-    }
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapArea::OfferKeyEventL
-// -----------------------------------------------------------------------------
-//
-TKeyResponse CTsFastSwapArea::OfferKeyEventL(
-        const TKeyEvent& aKeyEvent,
-        TEventCode aType )
-    {
-    iKeyEvent = ETrue;
-    iGrid->SetTactileFeedbackSupport(EFalse);
-    // handle the 'clear' key
-    if ( aType == EEventKey && aKeyEvent.iCode == EKeyBackspace )
-        {
-        TInt idx = SelectedIndex();
-        if ( idx >= 0 )
-            {
-            TryCloseAppL( idx );
-            }
-        return EKeyWasConsumed;
-        }
-    
-    //do not forward the event until item is higlighted
-    TKeyResponse response = ShowHighlightOnKeyEvent(aKeyEvent, aType);
-    if( response == EKeyWasConsumed )
-    	{
-    	return EKeyWasConsumed;
-    	}
-    
-    // pass the event to grid
-    // do not pass down and up arrow key events
-    if ( aKeyEvent.iScanCode != EStdKeyUpArrow &&
-         aKeyEvent.iScanCode != EStdKeyDownArrow )
-        {
-        TBool animate(ETrue);
-        TBool redraw(EFalse);
-        TInt prevItem = SelectedIndex();
-        TKeyResponse response = iGrid->OfferKeyEventL( aKeyEvent, aType );
-        if ( prevItem != SelectedIndex() && // item changed
-             ( ( prevItem == 0 &&
-                 SelectedIndex() == GridItemCount() - 1 &&
-                 GridItemCount() > iMaxItemsOnScreen + 1 ) || // loop from first to last item
-               ( prevItem == GridItemCount() - 1 &&
-                 SelectedIndex() == 0 &&
-                 GridItemCount() > iMaxItemsOnScreen + 1) // loop from last to first item
-              ) // loop
-            )
-            {
-            // Loop occured
-            animate = EFalse;
-            }
-        if ( prevItem != SelectedIndex() )
-            {
-            redraw = ETrue;
-            iGrid->ShowHighlight();
-            }
-        UpdateGrid( redraw, animate );
-        return response;
-        }
-    
-    return EKeyWasNotConsumed;
-    }
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapArea::CatchKeyEvent
-// -----------------------------------------------------------------------------
-//
-TKeyResponse CTsFastSwapArea::ShowHighlightOnKeyEvent(
-		const TKeyEvent& aKeyEvent, TEventCode aType)
-	{
-	TKeyResponse retVal(EKeyWasNotConsumed);
-	
-	if (aKeyEvent.iScanCode == EStdKeyLeftArrow ||
-		aKeyEvent.iScanCode == EStdKeyRightArrow)
-		{
-		if (!iGrid->IsHighlightVisible())
-			{
-			if (aType == EEventKey)
-				{
-				ShowHighlight();
-				iConsumeEvent = ETrue;
-				}
-			retVal = EKeyWasConsumed;
-			}
-		else if (iConsumeEvent)
-			{
-			if (aType == EEventKeyUp)
-				{
-				retVal = EKeyWasConsumed;
-				}
-			else
-				{
-				iConsumeEvent = EFalse;
-				}
-			}
-		}
-	return retVal;
-	}
-
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapArea::HandlePointerEventL
-// -----------------------------------------------------------------------------
-//
-void CTsFastSwapArea::HandlePointerEventL( const TPointerEvent& aPointerEvent )
-    {
-    iKeyEvent = EFalse;
-    iGrid->SetTactileFeedbackSupport(ETrue);
-    if(aPointerEvent.iType == TPointerEvent::EButton1Down)
-        {
-        iTapEvent = aPointerEvent;
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapArea::SelectedIndex
-// -----------------------------------------------------------------------------
-//
-TInt CTsFastSwapArea::SelectedIndex() const
-    {
-    return iGrid->CurrentDataIndex();
-    }
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapArea::SaveSelectedIndex
-// -----------------------------------------------------------------------------
-//
-void CTsFastSwapArea::SaveSelectedIndex()
-    {
-    iSavedSelectedIndex = SelectedIndex();
-    }
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapArea::RestoreSelectedIndex
-// -----------------------------------------------------------------------------
-//
-void CTsFastSwapArea::RestoreSelectedIndex()
-    {
-    iSavedSelectedIndex = KErrNotFound;
-    if ( GridItemCount() )
-        {
-        // highlight second recent item (that has index 2) if possible
-        TInt highlightItem = 0;
-        TInt count = GridItemCount();
-        while( highlightItem < count 
-            && highlightItem < KItemToHighlight )
-            {
-            ++highlightItem;
-            }
-        iSavedSelectedIndex = highlightItem - 1;//count from 0
-        iGrid->SetCurrentDataIndex( iSavedSelectedIndex );
-        TBool forceRedraw(ETrue);
-        UpdateGrid(forceRedraw);
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapArea::ProcessCommandL
-// Handle fsw popup commands
-// -----------------------------------------------------------------------------
-//
-void CTsFastSwapArea::ProcessCommandL( TInt aCommandId )
-    {
-    switch ( aCommandId )
-        {
-        case EFswCmdClose:
-            TryCloseAppL( iAppIndexForPopup );
-            break;
-
-        case EFswCmdCloseAll:
-            TryCloseAllL();
-            break;
-
-        case KErrCancel:
-            // popup dismisses automatically when tapping outside or when switching to other app
-            break;
-        }
-    }
-
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapArea::HandleCloseEventL
-// -----------------------------------------------------------------------------
-//
-void CTsFastSwapArea::HandleCloseEventL(TInt aItemIdx)
-    {
-    TryCloseAppL( aItemIdx );
-    }
-
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapArea::HandleDeviceStateChanged
-// -----------------------------------------------------------------------------
-//
-void CTsFastSwapArea::HandleDeviceStateChanged( TChangeType aChangeType )
-    {
-    if ( aChangeType == EDeviceType )
-        {
-        CTsDeviceState::TDeviceType state = iDeviceState.DeviceType();
-        switch ( state )
-            {
-            case CTsDeviceState::EHybrid:
-                {
-                iGrid->SetGridBehaviour( CTsFastSwapGrid::EHybrid );
-                }
-                break;
-            case CTsDeviceState::EFullTouch:
-                {
-                iGrid->SetGridBehaviour( CTsFastSwapGrid::ETouchOnly );
-                }
-                break;
-            default:
-                break;
-            }
-        }
-    }
-
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapArea::TimerCompletedL
-// -----------------------------------------------------------------------------
-//
-void CTsFastSwapArea::TimerCompletedL( CTsFastSwapTimer* aSource )
-    {
-    if(aSource == iHighlightTimer)
-        {
-        iTapEvent.iType = TPointerEvent::EButton1Up;
-        iGrid->HandlePointerEventL(iTapEvent);
-        }
-    else if(aSource == iRedrawTimer)
-        {
-        DrawNow();
-        }
-    else if( aSource == iUpdateGridTimer )
-        {
-        UpdateGrid(ETrue, ETrue);
-        }
-    }
-
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapArea::PreCreatePopupL
-// -----------------------------------------------------------------------------
-//
-void CTsFastSwapArea::PreCreatePopupL()
-    {
-    if ( !iPopup )
-        {
-        iPopup = CAknStylusPopUpMenu::NewL( this, Rect().iTl );
-        HBufC* text = StringLoader::LoadLC( R_TS_FSW_CLOSE );
-        iPopup->AddMenuItemL( *text, EFswCmdClose );
-        CleanupStack::PopAndDestroy( text );
-        text = StringLoader::LoadLC( R_TS_FSW_CLOSE_ALL );
-        iPopup->AddMenuItemL( *text, EFswCmdCloseAll );
-        CleanupStack::PopAndDestroy( text );
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapArea::ShowPopupL
-// -----------------------------------------------------------------------------
-//
-TBool CTsFastSwapArea::ShowPopupL( TInt aIndex, const TPoint& aPoint )
-    {
-    TBool showPopUp(EFalse);
-    TBool showPopupItem;
-    // hide 'close' if app cannot be closed
-    showPopupItem = CanClose( aIndex );
-    iPopup->SetItemDimmed( EFswCmdClose, !showPopupItem );
-    showPopUp = showPopUp || showPopupItem;
-    // hide 'close all' if there are no applications to close.
-    showPopupItem = CanCloseAll( aIndex );
-    iPopup->SetItemDimmed( EFswCmdCloseAll, !showPopupItem );
-    showPopUp = showPopUp || showPopupItem;
-
-    if(showPopUp)
-        {
-        // give feedback
-        LaunchPopupFeedback();
-        // save index for later use & show popup
-        iAppIndexForPopup = aIndex;
-        iPopup->SetPosition( aPoint, CAknStylusPopUpMenu::EPositionTypeLeftBottom );
-        iPopup->ShowMenu();
-        }
-    return showPopUp;
-    }
-
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapArea::Count
-// -----------------------------------------------------------------------------
-//
-TInt CTsFastSwapArea::Count() const
-    {
-    return iArray.Count();
-    }
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapArea::SetDataChangeObserver
-// -----------------------------------------------------------------------------
-//
-void CTsFastSwapArea::SetDataChangeObserver(
-        MTsDataChangeObserver* aDcObserver )
-    {
-    iDcObserver = aDcObserver;
-    }
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapArea::NotifyChange
-// -----------------------------------------------------------------------------
-//
-void CTsFastSwapArea::NotifyChange()
-    {
-    if ( iDcObserver )
-        {
-        iDcObserver->DataChanged( this, Count() );
-        }
-    }
-    
-// -----------------------------------------------------------------------------
-// CTsFastSwapArea::SwapApplicationOrder
-// -----------------------------------------------------------------------------
-//
-void CTsFastSwapArea::SwapApplicationOrder( 
-    RPointerArray<CTsFswEntry>& aArray )
-    {
-    for ( TInt i = 0; i < aArray.Count(); ++i )
-        {
-        if( aArray[i]->AppUid() == KAiUid )
-            {
-            CTsFswEntry* homescreenEntry(0);
-            homescreenEntry = aArray[i];
-            aArray.Remove(i);
-            aArray.Insert(homescreenEntry, KAiPosition);
-            break;
-            }
-        }
-    }
-    
-// -----------------------------------------------------------------------------
-// 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
-// -----------------------------------------------------------------------------
-//
-TInt CTsFastSwapArea::GridItemCount()
-    {
-    return iGrid->Model()->ItemTextArray()->MdcaCount();
-    }
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapArea::HandleListBoxEventL
-// -----------------------------------------------------------------------------
-//
-void CTsFastSwapArea::HandleListBoxEventL(CEikListBox* aListBox, TListBoxEvent aEventType)
-    {
-    if ( aListBox == iGrid )
-        {
-        switch ( aEventType )
-            {
-            case EEventEnterKeyPressed:
-            case EEventItemClicked:
-                {
-                SwitchToApp(SelectedIndex());
-                }
-                break;
-            case EEventPenDownOnItem:
-                {
-                iGrid->ShowHighlight();
-                }
-                break;
-            default:
-                break;
-            }
-        }
-    }
-
-// --------------------------------------------------------------------------
-// CTsFastSwapArea::CalculateSizePreserveRatio
-// --------------------------------------------------------------------------
-//
-TSize CTsFastSwapArea::CalculateSizePreserveRatio(
-        const TSize& aTargetAreaSize,
-        const TSize& aSourceSize )
-    {
-    TSize sz;
-    if ( aSourceSize.iWidth > aSourceSize.iHeight )
-        {
-        sz.iWidth = aTargetAreaSize.iWidth;
-        TReal ratio = aSourceSize.iWidth / (TReal) aSourceSize.iHeight;
-        sz.iHeight = sz.iWidth / ratio;
-        }
-    else
-        {
-        sz.iHeight = aTargetAreaSize.iHeight;
-        TReal ratio = aSourceSize.iHeight / (TReal) aSourceSize.iWidth;
-        sz.iWidth = sz.iHeight / ratio;
-        }
-    return sz;
-    }
-
-// --------------------------------------------------------------------------
-// CTsFastSwapArea::SelectNextItem
-// --------------------------------------------------------------------------
-//
-void CTsFastSwapArea::SelectNextItem()
-    {
-    iKeyEvent = ETrue;
-    iGrid->SetTactileFeedbackSupport(EFalse);
-    TBool forceRedraw(ETrue);
-    TBool animate(ETrue);
-    TInt selectedItem = SelectedIndex();
-    selectedItem++;
-    if ( selectedItem == GridItemCount() )
-        {
-        // Last item is selected, move to first one
-        selectedItem = 0;
-        animate = EFalse;
-        }
-    iGrid->SetCurrentDataIndex(selectedItem);
-    UpdateGrid(forceRedraw, animate);
-    }
-
-// --------------------------------------------------------------------------
-// CTsFastSwapArea::ShowHiglight
-// --------------------------------------------------------------------------
-//
-void CTsFastSwapArea::ShowHighlight()
-    {
-    iGrid->ShowHighlight();
-    UpdateGrid(ETrue, EFalse);
-    }
-
-// --------------------------------------------------------------------------
-// CTsFastSwapArea::CenterItem
-// --------------------------------------------------------------------------
-//
-void CTsFastSwapArea::CenterItem(TInt aRedrawDelay)
-    {
-    if( iMaxItemsOnScreen < GridItemCount() )
-        {
-        TInt visibleItem = ViewToVisibleItem( ViewPos() );
-        if(iKeyEvent)
-            {
-            visibleItem = SelectedIndex();
-            }
-        if(visibleItem != SelectedIndex())
-            {
-            iGrid->SetCurrentDataIndex( visibleItem );
-            DrawNow();
-            }
-        }
-
-    iUpdateGridTimer->Cancel();
-    iUpdateGridTimer->After(aRedrawDelay);
-    }
-
-// --------------------------------------------------------------------------
-// CTsFastSwapArea::GridWorldSize
-// --------------------------------------------------------------------------
-//
-TSize CTsFastSwapArea::GridWorldSize()
-    {
-    return TSize( GridItemCount() * iGridItemWidth + (GridItemCount() - 1) * iGridItemGap, Rect().Height() );
-    }
-
-// --------------------------------------------------------------------------
-// CTsFastSwapArea::UpdateGrid
-// --------------------------------------------------------------------------
-//
-void CTsFastSwapArea::UpdateGrid( TBool aForceRedraw, TBool aAnimate )
-    {
-    TPoint targetPoint = ItemViewPosition( SelectedIndex() );
-    if ( aForceRedraw || targetPoint.iX != ViewPos().iX )
-        {
-        if ( aAnimate )
-            {
-            iEvtHandler.Animate( targetPoint );
-            }
-        else
-            {
-            MoveOffset(targetPoint);
-            iEvtHandler.StopAnimation();
-            }
-        if ( aForceRedraw )
-            {
-            iGrid->DrawNow();
-            }
-        }
-    }
-
-// --------------------------------------------------------------------------
-// CTsFastSwapArea::HandleAppKey
-// --------------------------------------------------------------------------
-//
-void CTsFastSwapArea::HandleAppKey(TInt aType)
-    {
-    if( aType == KAppKeyTypeShort )
-        {
-        if(iGrid->IsHighlightVisible())
-            {
-            SelectNextItem();
-            }
-        else
-            {
-            ShowHighlight();
-            }
-        }
-    else if( aType == KAppKeyTypeLong )
-        {
-        SwitchToApp( SelectedIndex() );
-        }
-    }
-
-// --------------------------------------------------------------------------
-// CTsFastSwapArea::MoveOffset
-// --------------------------------------------------------------------------
-//
-void CTsFastSwapArea::MoveOffset(const TPoint& aPoint)
-    {
-    TSLOG_CONTEXT( CTsFastSwapArea::MoveOffset, TSLOG_LOCAL );
-    TSLOG2_IN("Old position x: %d, y:%d", ViewPos().iX, ViewPos().iY);
-    TSLOG2_IN("New position x: %d, y:%d", aPoint.iX, aPoint.iY);
-    TSLOG_OUT();
-    
-    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() <= iMaxItemsOnScreen)
-        {
-        // Center view
-        gridViewRect.iTl.iX += ( Rect().Width() - GridItemCount() * iGridItemWidth ) / 2;
-        }
-    iGrid->SetRect( gridViewRect );
-    DrawNow();
-    }
-
-// --------------------------------------------------------------------------
-// CTsFastSwapArea::Tap
-// --------------------------------------------------------------------------
-//
-void CTsFastSwapArea::TapL(const TPoint& aPoint)
-    {
-    if(iGrid->Rect().Contains(aPoint))
-        {
-        //provide tap pointer event to grid
-        iGrid->HandlePointerEventL(iTapEvent);
-        iHighlightTimer->Cancel();
-        iHighlightTimer->After(KHighlighActivationTime);
-        }
-    else
-        {
-        //move task switcher to background
-        iEikonEnv->EikAppUi()->HandleCommandL(EAknSoftkeyExit);
-        }
-    }
-
-// --------------------------------------------------------------------------
-// CTsFastSwapArea::LongTap
-// --------------------------------------------------------------------------
-//
-void CTsFastSwapArea::LongTapL(const TPoint& aPoint)
-    {
-    TInt index(KErrNotFound);
-    if( iGrid->GridView()->XYPosToItemIndex(aPoint,index) )
-        {
-        iGrid->SetCurrentItemIndex(index);
-        SaveSelectedIndex();
-        if ( !ShowPopupL(iSavedSelectedIndex, aPoint) )
-            {
-            TapL(aPoint);
-            }
-        else
-            {
-            iGrid->ShowHighlight();
-            DrawNow();
-            }
-        }
-    else
-        {
-        TapL(aPoint);
-        }
-    }
-
-// --------------------------------------------------------------------------
-// CTsFastSwapArea::Drag
-// --------------------------------------------------------------------------
-//
-void CTsFastSwapArea::Drag(
-    const MAknTouchGestureFwDragEvent& /*aEvent*/)
-    {
-    iGrid->SetTactileFeedbackSupport(ETrue);
-    iGrid->HideHighlight();
-    CenterItem( KUpdateGridTime );
-    DrawNow();
-    }
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapArea::ViewSize
-// -----------------------------------------------------------------------------
-//
-TSize CTsFastSwapArea::ViewSize()
-    {
-    return TSize(Rect().Width(), Rect().Height());  
-    }
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapArea::Stop
-// -----------------------------------------------------------------------------
-//
-void CTsFastSwapArea::Stop()
-    {    
-    CenterItem( KUpdateGridTime );
-    DrawNow();
-    }
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapArea::ViewSize
-// -----------------------------------------------------------------------------
-//
-TPoint CTsFastSwapArea::ViewPos() const
-    {
-    TPoint retVal;
-    retVal.iY = iGrid->Rect().iTl.iY + Rect().Height() / 2;
-    retVal.iX = - (iGrid->Rect().iTl.iX - Rect().iTl.iX) + Rect().Width() / 2 ;
-    TInt gridItemCount = iGrid->Model()->ItemTextArray()->MdcaCount();
-    if( gridItemCount <= iMaxItemsOnScreen)
-        {
-        // View centered
-        retVal.iX += ( Rect().Width() - gridItemCount * iGridItemWidth ) / 2;
-        }
-    return retVal;
-    }
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapArea::ItemPosition
-// -----------------------------------------------------------------------------
-//
-TPoint CTsFastSwapArea::ItemViewPosition( TInt aItemIdx )
-    {
-    TPoint retVal = Rect().iTl;
-    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 offsetCheck = GridWorldSize().iWidth;
-        // View inside of grid world rect
-        for ( TInt i = 0 ; i < GridItemCount(); i++ )
-            {
-            TInt offset = aViewPos.iX - ItemViewPosition( i ).iX;
-            if ( Abs( offset ) <= offsetCheck )
-                {
-                offsetCheck = Abs( offset );
-                retVal = i;
-                }
-            else
-                {
-                break;
-                }
-            }
-        }
-    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() );
-            }
-        }
-    }
-
-// End of file