taskswitcher/teleportui/hgteleportapp/src/hgteleportfastswaparea.cpp
changeset 4 4d54b72983ae
parent 3 fb3763350a08
child 5 c743ef5928ba
--- a/taskswitcher/teleportui/hgteleportapp/src/hgteleportfastswaparea.cpp	Fri Jan 22 09:35:14 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1642 +0,0 @@
-/*
- * ============================================================================
- *  Name        : hgteleportfastswaparea.cpp
- *  Part of     : Hg Teleport
- *  Description : Teleport Fast Swap area UI
- *  Version     : %version: sa1spcx1#74 %
- *
- *  Copyright © 2008 Nokia.  All rights reserved.
- *  This material, including documentation and any related computer
- *  programs, is protected by copyright controlled by Nokia.  All
- *  rights are reserved.  Copying, including reproducing, storing,
- *  adapting or translating, any or all of this material requires the
- *  prior written consent of Nokia.  This material also contains
- *  confidential information which may not be disclosed to others
- *  without the prior written consent of Nokia.
- * ============================================================================
- *
- */
-
-#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 <hgteleport.rsg>
-#include <aknlayoutscalable_apps.cdl.h>
-#include <layoutmetadata.cdl.h>
-#include <aknlists.h>
-#include <touchfeedback.h>
-#include <akntransitionutils.h>
-#include <akntranseffect.h>
-
-#include "hgteleportfastswaparea.h"
-#include "hgteleportapplogging.h"
-#include "hgfswclient.h"
-#include "hgteleportappui.h"
-#include "hgteleportdatachangeobserver.h"
-#include "hgteleporteventcontroler.h"
-
-/** command ids for the fsw popup */
-enum TPopupCommands
-    {
-    EFswCmdClose = 10000,
-    EFswCmdCloseAll
-    };
-
-/** Number of closable applications, to show "close all" option. */
-const TInt KHgMaxClosableApps = 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 = 3;
-
-const TInt KRedrawTime = 250000; // 0.25 sec
-const TInt KHighlighActivationTime = 100000; // 100 ms
-const TInt KUpdateGridTime = 1000000; // 1 s
-
-// -----------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::NewL
-// -----------------------------------------------------------------------------
-//
-CHgTeleportFastSwapArea* CHgTeleportFastSwapArea::NewL( const TRect& aRect,
-    CCoeControl& aParent, CHgTeleportDeviceState& aDeviceState, 
-    CHgTeleportEventControler& aEventHandler )
-    {
-    CHgTeleportFastSwapArea* self = CHgTeleportFastSwapArea::NewLC(aRect,
-            aParent, aDeviceState, aEventHandler);
-    CleanupStack::Pop( self );
-    return self;
-    }
-
-// -----------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::NewLC
-// -----------------------------------------------------------------------------
-//
-CHgTeleportFastSwapArea* CHgTeleportFastSwapArea::NewLC( const TRect& aRect,
-    CCoeControl& aParent, CHgTeleportDeviceState& aDeviceState,
-    CHgTeleportEventControler& aEventHandler)
-    {
-    CHgTeleportFastSwapArea* self = new (ELeave) CHgTeleportFastSwapArea(
-            aParent, aDeviceState, aEventHandler);
-    CleanupStack::PushL( self );
-    self->ConstructL( aRect );
-    return self;
-    }
-
-// -----------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::CHgTeleportFastSwapArea
-// -----------------------------------------------------------------------------
-//
-CHgTeleportFastSwapArea::CHgTeleportFastSwapArea(CCoeControl& aParent,
-    CHgTeleportDeviceState& aDeviceState,
-    CHgTeleportEventControler& aEventHandler) :
-    iParent(aParent), iDeviceState(aDeviceState), iEvtHandler(aEventHandler),
-    iPreviousNoOfItems(0)
-    {
-    // no implementation required
-    }
-
-// -----------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::~CHgTeleportFastSwapArea
-// -----------------------------------------------------------------------------
-//
-CHgTeleportFastSwapArea::~CHgTeleportFastSwapArea()
-    {
-    iArray.ResetAndDestroy();
-    delete iGrid;
-    delete iFSClient;
-    delete iPopup;
-    delete iConfirmCloseQuery;
-    delete iHighlightTimer;
-    delete iRedrawTimer;
-    delete iUpdateGridTimer;
-    }
-
-// -----------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::ConstructL
-// -----------------------------------------------------------------------------
-//
-void CHgTeleportFastSwapArea::ConstructL( const TRect& aRect )
-    {
-    SetContainerWindowL( iParent );
-
-    SetRect( aRect );
-
-    // setup ganes grid
-    ReCreateGridL();
-
-    // create stylus popup instance
-    PreCreatePopupL();
-
-    // connect to fsw server
-    iFSClient = CHgFswClient::NewL();
-    
-    iEvtHandler.ReInitPhysicsL(GridWorldSize(), ViewSize(), ETrue);
-    
-    // add self to device state observer
-    iDeviceState.AddObserverL( *this, EDeviceType );
-    
-    iHighlightTimer = new (ELeave) CHgTeleportFastSwapTimer( *this );
-    iHighlightTimer->ConstructL();
-    
-    iRedrawTimer = new (ELeave) CHgTeleportFastSwapTimer( *this );
-    iRedrawTimer->ConstructL();
-
-    iUpdateGridTimer = new (ELeave) CHgTeleportFastSwapTimer( *this );
-    iUpdateGridTimer->ConstructL();
-    
-    ActivateL();
-    }
-
-// -----------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::ReCreateGridL
-// -----------------------------------------------------------------------------
-//
-void CHgTeleportFastSwapArea::ReCreateGridL()
-    {
-    MCoeControlObserver* obs = NULL;
-    TBool wasHighlight = iDeviceState.DeviceType() == 
-                             CHgTeleportDeviceState::EHybrid ? ETrue : EFalse;
-    if ( iGrid )
-        {
-        obs = iGrid->Observer();
-        iDeviceState.RemoveObserver(*iGrid);
-        wasHighlight = iGrid->IsHighlightVisible();
-        delete iGrid;
-        iGrid = NULL;
-        }
-    
-    iGrid = new( ELeave ) CHgTeleportFastSwapGrid;
-    iGrid->ConstructL( this );
-    iDeviceState.AddObserverL(*iGrid, MHgDeviceStateObserver::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];
-    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 );
-    
-#ifndef TASKSWITCHER_USE_CUSTOM_LAYOUT
-    AknListBoxLayouts::SetupFormGfxCell( *iGrid, iGrid->ItemDrawer(), 0,
-            AknLayoutScalable_Apps::cell_tport_appsw_pane_g1( variety ).LayoutLine(),
-            empty, empty );
-#else
-    TRect imageRect;
-    TRect textRect;
-    TInt leftMargin = ( KFswItemWidth - KFswImageSize ) / 2;
-    TInt topMargin = ( KFswItemHeight - KFswImageSize - KFswTextHeight ) / 3;
-    textRect.iTl = TPoint( leftMargin, topMargin );
-    textRect.iBr = TPoint( leftMargin + KFswImageSize, topMargin + KFswTextHeight );
-    imageRect.iTl = TPoint( leftMargin, topMargin * 2 + KFswTextHeight );
-    imageRect.iBr = TPoint( leftMargin + KFswImageSize, topMargin * 2 + KFswTextHeight + KFswImageSize );
-    
-    AknListBoxLayouts::SetupFormGfxCell( *iGrid, iGrid->ItemDrawer(), 0 /*Column index*/,
-                                         imageRect.iTl.iX  /*Left pos*/, imageRect.iTl.iY /*Top pos*/,
-                                         0 /*unused*/, 0 /*unused*/,
-                                         imageRect.Width() /*Icon width*/,
-                                         imageRect.Height() /*Icon height*/,
-                                         imageRect.iTl /*Start pos*/,
-                                         imageRect.iBr /*End pos*/ );
-#endif
-
-    // Setup text layout
-    TRgb textColor;
-    AknsUtils::GetCachedColor( AknsUtils::SkinInstance(), textColor,
-            KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG9 );
-    
-    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
-#ifndef TASKSWITCHER_USE_CUSTOM_LAYOUT
-    TInt baselineOffset = textLayout.TextRect().iBr.iY - textLayout.TextRect().iTl.iY;
-    AknListBoxLayouts::SetupFormTextCell( *iGrid, iGrid->ItemDrawer(), 1 /*Column index*/,
-                                          textLayout.Font() /*Font type*/,
-                                          textColor.Color16() /*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*/);
-#else    
-    TInt baselineOffset = textRect.iBr.iY - textRect.iTl.iY;
-    AknListBoxLayouts::SetupFormTextCell( *iGrid, iGrid->ItemDrawer(), 1 /*Column index*/,
-                                          textLayout.Font() /*Font type*/,
-                                          textColor.Color16() /*color*/,
-                                          textRect.iTl.iX /*Left margin*/, 0 /*unused*/,
-                                          baselineOffset /*Baseline*/, 0 /*Text width*/,
-                                          CGraphicsContext::ECenter /*Text alignment*/,
-                                          TPoint(0,0) /*Start pos*/,
-                                          TPoint(0,0) /*End pos*/);
-#endif
-    
-    // Setup grid observers
-    if ( obs )
-        {
-        iGrid->SetObserver( obs );
-        }
-    iGrid->SetListBoxObserver(this);
-    iGrid->SetFastSwapGridObserver(this);
-    iGrid->SetContainerWindowL(*this);
-    
-#ifndef TASKSWITCHER_USE_CUSTOM_LAYOUT
-    iMaxItemsOnScreen = Rect().Width() / gridItem.Rect().Width();
-    iGridItemWidth = gridItem.Rect().Width();
-#else
-    iMaxItemsOnScreen = Rect().Width() / KFswItemWidth;
-    iGridItemWidth = KFswItemWidth;
-#endif
-    
-    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();
-    }
-
-
-// --------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::GetFastSwapAreaRects
-// --------------------------------------------------------------------------
-//
-void CHgTeleportFastSwapArea::GetFastSwapAreaRects( RArray<TAknLayoutRect>& aRects )
-    {
-    TAknLayoutRect gridAppPane;
-    TAknLayoutRect gridItem;
-    TAknLayoutRect gridImage;
-    
-    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);
-    }
-
-
-// --------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::Setup
-// --------------------------------------------------------------------------
-//
-void CHgTeleportFastSwapArea::Setup( MCoeControlObserver& aControlObserver )
-    {
-    iGrid->SetObserver( &aControlObserver );
-    }
-
-// -----------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::SizeChanged
-// -----------------------------------------------------------------------------
-//
-void CHgTeleportFastSwapArea::SizeChanged()
-    {
-    HGLOG_CONTEXT( CHgTeleportFastSwapArea::SizeChanged, HGLOG_LOCAL );
-    HGLOG_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 )
-            {
-            HGLOG1( HGLOG_INFO, "ReCreateGridL leaves with %d", err );
-            }
-        HandleFswContentChanged();
-        iGrid->SetCurrentDataIndex(selIdx);
-        UpdateGrid(ETrue, EFalse);
-        DrawDeferred();
-        }
-    HGLOG_OUT();
-    }
-
-// -----------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::Draw
-// -----------------------------------------------------------------------------
-//
-void CHgTeleportFastSwapArea::Draw( const TRect& /*aRect*/ ) const
-    {
-    CWindowGc& gc = SystemGc();
-    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
-    MAknsControlContext* cc = AknsDrawUtils::ControlContext( this );
-    AknsDrawUtils::Background( skin,
-           cc,
-           this,
-           gc,
-           Rect() );
-    }
-
-// --------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::SwitchToApp
-// --------------------------------------------------------------------------
-//
-void CHgTeleportFastSwapArea::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 teleport if the activated app is closed.
-        // Therefore teleport must be moved to background.
-        CHgTeleportAppUi* appui =
-            static_cast<CHgTeleportAppUi*>( iEikonEnv->AppUi() );
-        appui->MoveAppToBackground( AknTransEffect::EApplicationStartRect );
-        }
-    }
-
-// --------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::TryCloseAppL
-// --------------------------------------------------------------------------
-//
-void CHgTeleportFastSwapArea::TryCloseAppL( TInt aIndex,
-        TBool aSuppressRendering )
-    {
-    HGLOG_CONTEXT( TryCloseAppL, HGLOG_LOCAL );
-    HGLOG2_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();
-        }
-
-    HGLOG_OUT();
-    }
-
-// --------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::TryCloseAppWithQueryL
-// --------------------------------------------------------------------------
-//
-void CHgTeleportFastSwapArea::TryCloseAppWithQueryL( TInt aIndex )
-    {
-    if ( aIndex >= 0 && aIndex < iArray.Count()
-            && CanClose( aIndex )
-            && ConfirmCloseL( aIndex ) )
-        {
-        TryCloseAppL( aIndex );
-        }
-    }
-
-// --------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::TryCloseAllL
-// --------------------------------------------------------------------------
-//
-void CHgTeleportFastSwapArea::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();
-        }
-    }
-
-// --------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::CanClose
-// --------------------------------------------------------------------------
-//
-TBool CHgTeleportFastSwapArea::CanClose( TInt aIndex ) const
-    {
-    CHgFswEntry* e = iArray[aIndex];
-    return !e->AlwaysShown() && !e->SystemApp();
-    }
-
-// --------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::CanCloseOthers
-// --------------------------------------------------------------------------
-//
-TBool CHgTeleportFastSwapArea::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 < KHgMaxClosableApps; )
-        {
-        if ( CanClose( i ) )
-            {
-            count++;
-            }
-        }
-    return ( count >= KHgMaxClosableApps ) ||
-           ( count && !CanClose( aSelectedItem ) );
-    }
-
-// --------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::HandleFswContentChanged
-// From MHgFswObserver
-// --------------------------------------------------------------------------
-//
-void CHgTeleportFastSwapArea::HandleFswContentChanged()
-    {
-    HGLOG_CONTEXT( HandleFswContentChanged, HGLOG_LOCAL );
-    HGLOG_IN();
-
-    TRAPD( err, HandleFswContentChangedL() );
-    if ( err != KErrNone )
-        {
-        HGLOG1( HGLOG_INFO, "leave occured: %d", err );
-        }
-
-    HGLOG_OUT();
-    }
-
-// --------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::HandleFswContentChangedL
-// --------------------------------------------------------------------------
-//
-void CHgTeleportFastSwapArea::HandleFswContentChangedL()
-    {
-    HGLOG_CONTEXT( HandleFswContentChangedL, HGLOG_LOCAL );
-    HGLOG_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 )
-        {
-        HGLOG1_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 )
-        {
-        CHgFswEntry* e = iArray[i];
-        const TDesC& name( e->AppName() );
-        HGLOG4( HGLOG_INFO, "[%d]: %d %d %S", i, e->WgId(), e->AppUid(), &name );
-        }
-#endif
-
-    // draw
-    RenderContentL();
-
-    // notify observer, if present
-    NotifyChange();
-
-    HGLOG_OUT();
-    }
-
-// --------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::RenderContentL
-// --------------------------------------------------------------------------
-//
-void CHgTeleportFastSwapArea::RenderContentL()
-    {
-    HGLOG_CONTEXT( RenderContentL, HGLOG_LOCAL );
-    HGLOG_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() )
-        {
-#ifndef TASKSWITCHER_USE_CUSTOM_LAYOUT
-        iGrid->SetLayoutL( EFalse, EFalse, ETrue, iArray.Count(), 1, gridItem.Rect().Size() );
-#else
-        TSize itemSize( KFswItemWidth, KFswItemHeight );
-        iGrid->SetLayoutL( EFalse, EFalse, ETrue, iArray.Count(), 1, itemSize );
-#endif
-        }
-    else
-        {
-#ifndef TASKSWITCHER_USE_CUSTOM_LAYOUT
-        iGrid->SetLayoutL( EFalse, ETrue, ETrue, iArray.Count(), 1, gridItem.Rect().Size() );
-#else
-        TSize itemSize( KFswItemWidth, KFswItemHeight );
-        iGrid->SetLayoutL( EFalse, ETrue, ETrue, iArray.Count(), 1, itemSize );
-#endif
-        }
-    
-    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();
-        HGLOG2( HGLOG_INFO, "'%S' screenshot handle %d", &appName, h );
-        TInt maskh = 0;
-        CFbsBitmap* mask = 0;
-        if ( !h )
-            {
-            h = iArray[i]->AppIconBitmapHandle();
-            maskh = iArray[i]->AppIconMaskHandle();
-            HGLOG1( HGLOG_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 );
-    
-    HGLOG_OUT();
-    }
-
-// --------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::CopyBitmapL
-// Copy and scale.
-// --------------------------------------------------------------------------
-//
-CFbsBitmap* CHgTeleportFastSwapArea::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;
-    }
-
-// --------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::CountComponentControls
-// --------------------------------------------------------------------------
-//
-TInt CHgTeleportFastSwapArea::CountComponentControls() const
-    {
-    return 1;
-    }
-
-// --------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::ComponentControl
-// --------------------------------------------------------------------------
-//
-CCoeControl* CHgTeleportFastSwapArea::ComponentControl( TInt aIndex ) const
-    {
-    if ( aIndex == 0 )
-        {
-        return iGrid;
-        }
-    return NULL;
-    }
-
-// -----------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::HandleSwitchToBackgroundEvent
-// -----------------------------------------------------------------------------
-//
-void CHgTeleportFastSwapArea::HandleSwitchToBackgroundEvent()
-    {
-    // stop listening for changes in fsw content
-    iFSClient->CancelSubscribe();
-    // get rid of the close confirmation query if shown
-    delete iConfirmCloseQuery; // this will cause ExecuteLD to return with 0
-    iConfirmCloseQuery = 0;
-    }
-
-// -----------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::HandleSwitchToForegroundEvent
-// -----------------------------------------------------------------------------
-//
-void CHgTeleportFastSwapArea::HandleSwitchToForegroundEvent()
-    {
-    HGLOG_CONTEXT( CHgTeleportFastSwapArea::HandleSwitchToForegroundEvent, HGLOG_LOCAL );
-    HGLOG_IN();
-    
-    // get the current task list
-    HandleFswContentChanged();
-    // and then start listening for changes
-    iFSClient->Subscribe( *this );
-    
-    if ( iDeviceState.DeviceType() == CHgTeleportDeviceState::EFullTouch )
-        {
-        iGrid->HideHighlight();
-        }
-    else
-        {
-        iGrid->ShowHighlight();
-        }
-    
-    RestoreSelectedIndex();
-    UpdateGrid(ETrue, EFalse);
-    
-    iRedrawTimer->Cancel();
-    iRedrawTimer->After(KRedrawTime);
-    
-    // give feedback
-    LaunchPopupFeedback();
-
-    HGLOG_OUT();
-    }
-
-// -----------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::FocusChanged
-// -----------------------------------------------------------------------------
-//
-void CHgTeleportFastSwapArea::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();
-    }
-
-// -----------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::OfferKeyEventL
-// -----------------------------------------------------------------------------
-//
-TKeyResponse CHgTeleportFastSwapArea::OfferKeyEventL(
-        const TKeyEvent& aKeyEvent,
-        TEventCode aType )
-    {
-    iKeyEvent = ETrue;
-    // handle the 'clear' key
-    if ( aType == EEventKey && aKeyEvent.iCode == EKeyBackspace )
-        {
-        TInt idx = SelectedIndex();
-        if ( idx >= 0 )
-            {
-            TryCloseAppWithQueryL( idx );
-            }
-        return EKeyWasConsumed;
-        }
-    
-    //do not forward the event until item is higlighted
-    if( aKeyEvent.iScanCode == EStdKeyLeftArrow ||
-        aKeyEvent.iScanCode == EStdKeyRightArrow )
-        {
-        if ( !iGrid->IsHighlightVisible() )
-            {
-            if ( aType == EEventKey )
-                {
-                ShowHighlight();
-                iConsumeEvent = ETrue;
-                }
-            return EKeyWasConsumed;
-            }
-        else if(iConsumeEvent)
-            {
-            if (aType == EEventKeyUp)
-                {
-                return EKeyWasConsumed;
-                }
-            iConsumeEvent = EFalse;
-            }
-        }
-    
-    // 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;
-    }
-
-// -----------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::HandlePointerEventL
-// -----------------------------------------------------------------------------
-//
-void CHgTeleportFastSwapArea::HandlePointerEventL( const TPointerEvent& aPointerEvent )
-    {
-    iKeyEvent = EFalse;
-    if(aPointerEvent.iType == TPointerEvent::EButton1Down)
-        {
-        iTapEvent = aPointerEvent;
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::ConfirmCloseL
-// -----------------------------------------------------------------------------
-//
-TBool CHgTeleportFastSwapArea::ConfirmCloseL( TInt aIndex )
-    {
-    HBufC* msg = StringLoader::LoadLC( R_TELEPORT_FSW_CONFIRM_CLOSE,
-        iArray[aIndex]->AppName() );
-    iConfirmCloseQuery = CAknQueryDialog::NewL(
-        CAknQueryDialog::EConfirmationTone );
-    iConfirmCloseQuery->SetPromptL( *msg );
-    CleanupStack::PopAndDestroy( msg );
-    TBool ok = iConfirmCloseQuery->ExecuteLD(
-        R_HG_TELEPORT_FSW_CONFIRM_CLOSE_QUERY );
-    iConfirmCloseQuery = 0;
-    return ok;
-    }
-
-// -----------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::SelectedIndex
-// -----------------------------------------------------------------------------
-//
-TInt CHgTeleportFastSwapArea::SelectedIndex() const
-    {
-    return iGrid->CurrentDataIndex();
-    }
-
-// -----------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::SaveSelectedIndex
-// -----------------------------------------------------------------------------
-//
-void CHgTeleportFastSwapArea::SaveSelectedIndex()
-    {
-    iSavedSelectedIndex = SelectedIndex();
-    }
-
-// -----------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::RestoreSelectedIndex
-// -----------------------------------------------------------------------------
-//
-void CHgTeleportFastSwapArea::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->SetCurrentItemIndex( iSavedSelectedIndex );
-        TBool forceRedraw(ETrue);
-        UpdateGrid(forceRedraw);
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::ProcessCommandL
-// Handle fsw popup commands
-// -----------------------------------------------------------------------------
-//
-void CHgTeleportFastSwapArea::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;
-        }
-    iTapEvent.iType = TPointerEvent::EButton1Up;
-    iGrid->HandlePointerEventL(iTapEvent);
-    }
-
-
-// -----------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::HandleCloseEventL
-// -----------------------------------------------------------------------------
-//
-void CHgTeleportFastSwapArea::HandleCloseEventL(TInt aItemIdx)
-    {
-    if ( !iLongTap )
-        {
-        TryCloseAppWithQueryL( aItemIdx );
-        }
-    // Simulate long tap to prevent item activation
-    iLongTap = ETrue;
-    iTapEvent.iType = TPointerEvent::EButton1Up;
-    iGrid->HandlePointerEventL(iTapEvent);
-    }
-
-
-// -----------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::HandleDeviceStateChanged
-// -----------------------------------------------------------------------------
-//
-void CHgTeleportFastSwapArea::HandleDeviceStateChanged( TChangeType aChangeType )
-    {
-    if ( aChangeType == EDeviceType )
-        {
-        CHgTeleportDeviceState::TDeviceType state = iDeviceState.DeviceType();
-        switch ( state )
-            {
-            case CHgTeleportDeviceState::EHybrid:
-                {
-                iGrid->SetGridBehaviour( CHgTeleportFastSwapGrid::EHybrid );
-                }
-                break;
-            case CHgTeleportDeviceState::EFullTouch:
-                {
-                iGrid->SetGridBehaviour( CHgTeleportFastSwapGrid::ETouchOnly );
-                }
-                break;
-            default:
-                break;
-            }
-        }
-    }
-
-
-// -----------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::TimerCompletedL
-// -----------------------------------------------------------------------------
-//
-void CHgTeleportFastSwapArea::TimerCompletedL( CHgTeleportFastSwapTimer* aSource )
-    {
-    if(aSource == iHighlightTimer)
-        {
-        iTapEvent.iType = TPointerEvent::EButton1Up;
-        iGrid->HandlePointerEventL(iTapEvent);
-        }
-    else if(aSource == iRedrawTimer)
-        {
-        DrawNow();
-        }
-    else if( aSource == iUpdateGridTimer )
-        {
-        UpdateGrid(ETrue, ETrue);
-        }
-    }
-
-
-// -----------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::PreCreatePopupL
-// -----------------------------------------------------------------------------
-//
-void CHgTeleportFastSwapArea::PreCreatePopupL()
-    {
-    if ( !iPopup )
-        {
-        iPopup = CAknStylusPopUpMenu::NewL( this, Rect().iTl );
-        HBufC* text = StringLoader::LoadLC( R_TELEPORT_FSW_CLOSE );
-        iPopup->AddMenuItemL( *text, EFswCmdClose );
-        CleanupStack::PopAndDestroy( text );
-        text = StringLoader::LoadLC( R_TELEPORT_FSW_CLOSE_ALL );
-        iPopup->AddMenuItemL( *text, EFswCmdCloseAll );
-        CleanupStack::PopAndDestroy( text );
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::ShowPopupL
-// -----------------------------------------------------------------------------
-//
-TBool CHgTeleportFastSwapArea::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;
-    }
-
-
-// -----------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::Count
-// -----------------------------------------------------------------------------
-//
-TInt CHgTeleportFastSwapArea::Count() const
-    {
-    return iArray.Count();
-    }
-
-// -----------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::SetDataChangeObserver
-// -----------------------------------------------------------------------------
-//
-void CHgTeleportFastSwapArea::SetDataChangeObserver(
-        MHgTeleportDataChangeObserver* aDcObserver )
-    {
-    iDcObserver = aDcObserver;
-    }
-
-// -----------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::NotifyChange
-// -----------------------------------------------------------------------------
-//
-void CHgTeleportFastSwapArea::NotifyChange()
-    {
-    if ( iDcObserver )
-        {
-        iDcObserver->DataChanged( this, Count() );
-        }
-    }
-    
-// -----------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::SwapApplicationOrder
-// -----------------------------------------------------------------------------
-//
-void CHgTeleportFastSwapArea::SwapApplicationOrder( 
-    RPointerArray<CHgFswEntry>& aArray )
-    {
-    for ( TInt i = 0; i < aArray.Count(); ++i )
-        {
-        if( aArray[i]->AppUid() == KAiUid )
-            {
-            CHgFswEntry* homescreenEntry(0);
-            homescreenEntry = aArray[i];
-            aArray.Remove(i);
-            aArray.Insert(homescreenEntry, KAiPosition);
-            break;
-            }
-        }
-    }
-    
-// -----------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::PreferredImageSize
-// -----------------------------------------------------------------------------
-//
-TSize CHgTeleportFastSwapArea::PreferredImageSize()
-    {
-#ifndef TASKSWITCHER_USE_CUSTOM_LAYOUT
-    TAknLayoutRect gridImage;
-    TRAP_IGNORE(
-        RArray<TAknLayoutRect> rects;
-        CleanupClosePushL(rects);
-        rects.ReserveL(KLayoutItemCount);
-        GetFastSwapAreaRects(rects);
-        gridImage = rects[2];
-        CleanupStack::PopAndDestroy(&rects);
-        );
-    return gridImage.Rect().Size();
-#else
-    return TSize( KFswImageSize, KFswImageSize );
-#endif
-    }
-    
-// -----------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::GridItemCount
-// -----------------------------------------------------------------------------
-//
-TInt CHgTeleportFastSwapArea::GridItemCount()
-    {
-    return iGrid->Model()->ItemTextArray()->MdcaCount();
-    }
-
-// -----------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::HandleListBoxEventL
-// -----------------------------------------------------------------------------
-//
-void CHgTeleportFastSwapArea::HandleListBoxEventL(CEikListBox* aListBox, TListBoxEvent aEventType)
-    {
-    if ( aListBox == iGrid )
-        {
-        switch ( aEventType )
-            {
-            case EEventEnterKeyPressed:
-            case EEventItemClicked:
-                {
-                if (!iLongTap)
-                    {
-                    SwitchToApp(SelectedIndex());
-                    }
-                }
-                break;
-            case EEventPenDownOnItem:
-                {
-                iGrid->HideHighlight();
-                iGrid->ShowHighlight();
-                if (!iLongTap )
-                    {
-                    iHighlightTimer->Cancel();
-                    iHighlightTimer->After(KHighlighActivationTime);
-                    }
-                }
-                break;
-            default:
-                break;
-            }
-        }
-    }
-
-// --------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::CalculateSizePreserveRatio
-// --------------------------------------------------------------------------
-//
-TSize CHgTeleportFastSwapArea::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;
-    }
-
-// --------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::SelectNextItem
-// --------------------------------------------------------------------------
-//
-void CHgTeleportFastSwapArea::SelectNextItem()
-    {
-    iKeyEvent = ETrue;
-    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->SetCurrentItemIndex(selectedItem);
-    UpdateGrid(forceRedraw, animate);
-    }
-
-// --------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::ShowHiglight
-// --------------------------------------------------------------------------
-//
-void CHgTeleportFastSwapArea::ShowHighlight()
-    {
-    iGrid->ShowHighlight();
-    UpdateGrid(ETrue, EFalse);
-    }
-
-// --------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::CenterItem
-// --------------------------------------------------------------------------
-//
-void CHgTeleportFastSwapArea::CenterItem(TInt aRedrawDelay)
-    {
-    if( iMaxItemsOnScreen < GridItemCount() )
-        {
-        TInt visibleItem = ViewToVisibleItem( ViewPos() );
-        if(iKeyEvent)
-            {
-            visibleItem = SelectedIndex();
-            }
-        iGrid->SetCurrentDataIndex( visibleItem );
-        }
-
-    iUpdateGridTimer->Cancel();
-    iUpdateGridTimer->After(aRedrawDelay);
-    }
-
-// --------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::GridWorldSize
-// --------------------------------------------------------------------------
-//
-TSize CHgTeleportFastSwapArea::GridWorldSize()
-    {
-    return TSize( GridItemCount() * iGridItemWidth, Rect().Height() );
-    }
-
-// --------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::UpdateGrid
-// --------------------------------------------------------------------------
-//
-void CHgTeleportFastSwapArea::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();
-            }
-        }
-    }
-
-// --------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::HandleAppKey
-// --------------------------------------------------------------------------
-//
-void CHgTeleportFastSwapArea::HandleAppKey(TInt aType)
-    {
-    if( aType == KAppKeyTypeShort )
-        {
-        if(iGrid->IsHighlightVisible())
-            {
-            SelectNextItem();
-            }
-        else
-            {
-            ShowHighlight();
-            }
-        }
-    else if( aType == KAppKeyTypeLong )
-        {
-        SwitchToApp( SelectedIndex() );
-        }
-    }
-
-// --------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::MoveOffset
-// --------------------------------------------------------------------------
-//
-void CHgTeleportFastSwapArea::MoveOffset(const TPoint& aPoint)
-    {
-    HGLOG_CONTEXT( CHgTeleportFastSwapArea::MoveOffset, HGLOG_LOCAL );
-    HGLOG2_IN("Old position x: %d, y:%d", ViewPos().iX, ViewPos().iY);
-    HGLOG2_IN("New position x: %d, y:%d", aPoint.iX, aPoint.iY);
-    HGLOG_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();
-    }
-
-// --------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::Tap
-// --------------------------------------------------------------------------
-//
-void CHgTeleportFastSwapArea::TapL(const TPoint& aPoint)
-    {
-    iLongTap = EFalse;
-    if(iGrid->Rect().Contains(aPoint))
-        {
-        //provide tap pointer event to grid
-        iGrid->HandlePointerEventL(iTapEvent);
-        }
-    else
-        {
-        //move task switcher to background
-        iEikonEnv->EikAppUi()->HandleCommandL(EAknSoftkeyExit);
-        }
-    }
-
-// --------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::LongTap
-// --------------------------------------------------------------------------
-//
-void CHgTeleportFastSwapArea::LongTapL(const TPoint& aPoint)
-    {
-    iLongTap = ETrue;
-    TInt index(KErrNotFound);
-    if( iGrid->GridView()->XYPosToItemIndex(aPoint,index) )
-        {
-        if ( AknLayoutUtils::LayoutMirrored() )
-            {
-            // Calculate logical item index
-            index = GridItemCount() - 1 - index;
-            }
-        SaveSelectedIndex();
-        iGrid->HandlePointerEventL(iTapEvent);
-        if ( !ShowPopupL(index, aPoint) )
-            {
-            TapL(aPoint);
-            }
-        }
-    else
-        {
-        TapL(aPoint);
-        }
-    }
-
-// --------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::Drag
-// --------------------------------------------------------------------------
-//
-void CHgTeleportFastSwapArea::Drag(
-    const MAknTouchGestureFwDragEvent& /*aEvent*/)
-    {
-    iGrid->HideHighlight();
-    CenterItem( KUpdateGridTime );
-    DrawNow();
-    }
-
-// -----------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::ViewSize
-// -----------------------------------------------------------------------------
-//
-TSize CHgTeleportFastSwapArea::ViewSize()
-    {
-    return TSize(Rect().Width(), Rect().Height());  
-    }
-
-// -----------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::Stop
-// -----------------------------------------------------------------------------
-//
-void CHgTeleportFastSwapArea::Stop()
-    {    
-    CenterItem( KUpdateGridTime );
-    DrawNow();
-    }
-
-// -----------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::ViewSize
-// -----------------------------------------------------------------------------
-//
-TPoint CHgTeleportFastSwapArea::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;
-    }
-
-// -----------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::ItemPosition
-// -----------------------------------------------------------------------------
-//
-TPoint CHgTeleportFastSwapArea::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;
-            }
-        else // normal layout
-            {
-            retVal.iX = iGridItemWidth * aItemIdx - screenMiddleItemOffset;
-            }
-        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;
-    }
-
-// -----------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::ViewToVisibleItem
-// -----------------------------------------------------------------------------
-//
-TInt CHgTeleportFastSwapArea::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;
-    }
-
-
-// -----------------------------------------------------------------------------
-// CHgTeleportFastSwapArea::LaunchPopupFeedback
-// -----------------------------------------------------------------------------
-//
-void CHgTeleportFastSwapArea::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