taskswitcher/taskswitcherui/taskswitcherapp/src/tsfastswapareautils.cpp
branchRCL_3
changeset 102 ba63c83f4716
parent 93 b01126ce0bec
child 103 966d119a7e67
--- a/taskswitcher/taskswitcherui/taskswitcherapp/src/tsfastswapareautils.cpp	Wed Sep 15 12:00:00 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,592 +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 <w32std.h>
-#include <eikenv.h>
-#include <layoutmetadata.cdl.h>
-#include <touchfeedback.h>
-#include <akntransitionutils.h>
-#include <akntranseffect.h>
-#include <aknlayoutscalable_apps.cdl.h>
-#include <bitmaptransforms.h>
-
-
-#include "tsfastswapareautils.h"
-#include "tsfastswaparea.h"
-#include "tsappui.h"
-#include "tsfswentry.h"
-
-
-const TInt KLayoutItemCount = 4;
-
- /* ================================================================================
-  * CTsFastSwapTimer
-  * ================================================================================
-  */
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapTimer::CTsFastSwapTimer
-// -----------------------------------------------------------------------------
-//
-CTsFastSwapTimer::CTsFastSwapTimer( MTsFastSwapTimerObserver& aObserver )
-: CTimer( EPriorityStandard ),
-  iObserver( &aObserver )
-    {
-    }
-
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapTimer::CTsGridHighlightTimer
-// -----------------------------------------------------------------------------
-//
-CTsFastSwapTimer::~CTsFastSwapTimer()
-    {
-    Cancel();
-    }
-
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapTimer::ConstructL
-// -----------------------------------------------------------------------------
-//
-void CTsFastSwapTimer::ConstructL()
-    {
-    CTimer::ConstructL();
-    CActiveScheduler::Add( this );
-    }
-
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapTimer::CTsGridHighlightTimer
-// -----------------------------------------------------------------------------
-//
-void CTsFastSwapTimer::RunL()
-    {
-    iObserver->TimerCompletedL(this);
-    }
- 
-
-
-/* ================================================================================
- * CTsBitmapScaleTask
- * ================================================================================
- */
-
-// -----------------------------------------------------------------------------
-// CTsBitmapScaleTask::
-// -----------------------------------------------------------------------------
-//
-CTsBitmapScaleTask::CTsBitmapScaleTask( CTsFastSwapAreaExtension& aObserver )
-: CActive(EPriorityStandard),
-  iObserver( aObserver )
-    {
-    CActiveScheduler::Add( this );
-    }
-
-
-// -----------------------------------------------------------------------------
-// CTsBitmapScaleTask::
-// -----------------------------------------------------------------------------
-//
-CTsBitmapScaleTask::~CTsBitmapScaleTask()
-    {
-    Cancel();
-    delete iScaler;
-    delete iSourceBmp;
-    }
-
-
-// -----------------------------------------------------------------------------
-// CTsBitmapScaleTask::
-// -----------------------------------------------------------------------------
-//
-void CTsBitmapScaleTask::StartLD( CFbsBitmap* aSourceBitmap,
-                                  CFbsBitmap* aTargetBitmap )
-    {
-    if ( !iScaler )
-        {
-        iSourceBmp = aSourceBitmap;
-        iScaler = CBitmapScaler::NewL();
-        iScaler->Scale( &iStatus, *aSourceBitmap, *aTargetBitmap );
-        SetActive();
-        }
-    }
-
-
-// -----------------------------------------------------------------------------
-// CTsBitmapScaleTask::
-// -----------------------------------------------------------------------------
-//
-void CTsBitmapScaleTask::RunL()
-    {
-    iObserver.ScaleFinished( this );
-    delete this;
-    }
-
-
-// -----------------------------------------------------------------------------
-// CTsBitmapScaleTask::
-// -----------------------------------------------------------------------------
-//
-void CTsBitmapScaleTask::DoCancel()
-    {
-    iScaler->Cancel();
-    }
-
-
-/* ================================================================================
- * CTsFastSwapAreaExtension
- * ================================================================================
- */
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapAreaExtension::NewL
-// -----------------------------------------------------------------------------
-//
-CTsFastSwapAreaExtension* CTsFastSwapAreaExtension::NewL( CTsFastSwapArea& aFastSwapArea,
-                                                  CEikonEnv& aEnv )
-    {
-    CTsFastSwapAreaExtension* self = CTsFastSwapAreaExtension::NewLC(
-            aFastSwapArea, aEnv );
-    CleanupStack::Pop( self );
-    return self;
-    }
-
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapAreaExtension::NewLC
-// -----------------------------------------------------------------------------
-//
-CTsFastSwapAreaExtension* CTsFastSwapAreaExtension::NewLC( CTsFastSwapArea& aFastSwapArea,
-                                                   CEikonEnv& aEnv )
-    {
-    CTsFastSwapAreaExtension* self = new (ELeave) CTsFastSwapAreaExtension(
-            aFastSwapArea, aEnv );
-    CleanupStack::PushL( self );
-    self->ConstructL();
-    return self;
-    }
-
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapAreaExtension::~CTsFastSwapAreaExtension
-// -----------------------------------------------------------------------------
-//
-CTsFastSwapAreaExtension::~CTsFastSwapAreaExtension()
-    {
-    iScaleTasks.ResetAndDestroy();
-    }
-
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapAreaExtension::ConstructL
-// -----------------------------------------------------------------------------
-//
-void CTsFastSwapAreaExtension::ConstructL()
-    {
-    }
-
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapAreaExtension::CTsFastSwapAreaExtension
-// -----------------------------------------------------------------------------
-//
-CTsFastSwapAreaExtension::CTsFastSwapAreaExtension( CTsFastSwapArea& aFastSwapArea,
-                                            CEikonEnv& aEnv )
-: iFastSwapArea( aFastSwapArea ),
-  iEnv( aEnv )
-    {
-    }
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapAreaExtension::GetCurrentScreenOrientation
-// -----------------------------------------------------------------------------
-//
-TInt CTsFastSwapAreaExtension::GetCurrentScreenOrientation()
-    {
-    TPixelsAndRotation availableRect;
-    iEnv.ScreenDevice()->GetDefaultScreenSizeAndRotation(availableRect);
-    return availableRect.iPixelSize.iWidth > availableRect.iPixelSize.iHeight;
-    }
-
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapAreaExtension::GetVariety
-// -----------------------------------------------------------------------------
-//
-TBool CTsFastSwapAreaExtension::GetVariety( TInt& aVariety )
-    {
-    aVariety = Layout_Meta_Data::IsLandscapeOrientation() ? 1 : 0;
-    TBool foreground = static_cast<CTsAppUi*>(iEnv.AppUi())->IsForeground();
-    if ( foreground )
-        {
-        TInt screenOrientation = GetCurrentScreenOrientation();
-        if ( aVariety != screenOrientation )
-            {
-            aVariety = screenOrientation;
-            return ETrue;
-            }
-        }
-    return EFalse;
-    }
-
-
-// --------------------------------------------------------------------------
-// CTsFastSwapAreaExtension::GetFastSwapAreaRects
-// --------------------------------------------------------------------------
-//
-void CTsFastSwapAreaExtension::GetFastSwapAreaRects( RArray<TAknLayoutRect>& aRects )
-    {
-    TAknLayoutRect gridAppPane;
-    TAknLayoutRect gridItem;
-    TAknLayoutRect gridImage;
-    TInt variety;
-    TBool disable = GetVariety(variety);
-    if ( disable )
-        {
-        TRAP_IGNORE(static_cast<CTsAppUi*>(iEnv.AppUi())->RequestPopUpL());
-        }
-    variety = Layout_Meta_Data::IsLandscapeOrientation() ? 1 : 0; // double check to avoid layout panic
-    gridAppPane.LayoutRect( iFastSwapArea.Rect(), 
-            AknLayoutScalable_Apps::tport_appsw_pane_g1( 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);
-    
-    if ( disable )
-        {
-        TRAP_IGNORE(static_cast<CTsAppUi*>(iEnv.AppUi())->DisablePopUpL());
-        }
-    }
-
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapAreaExtension::ItemPosition
-// -----------------------------------------------------------------------------
-//
-TPoint CTsFastSwapAreaExtension::ItemViewPosition( TInt aItemIdx )
-    {
-    TPoint retVal = iFastSwapArea.Rect().iTl;
-    TInt maxItemsOnScreen = iFastSwapArea.GetGridItemData( CTsFastSwapArea::EMaxItemsOnScreen );
-    TInt gridItemWidth = iFastSwapArea.GetGridItemData( CTsFastSwapArea::EGridItemWidth );
-    TInt gridItemGap = iFastSwapArea.GetGridItemData( CTsFastSwapArea::EGridItemGap );
-    
-    if ( aItemIdx < 0 )
-        {
-        // No items
-        retVal.iX = 0;
-        }
-    else if ( aItemIdx == 0 )
-        {
-        // First item
-        if( AknLayoutUtils::LayoutMirrored() )
-            {
-            if ( iFastSwapArea.GridItemCount() > maxItemsOnScreen )
-                {
-                retVal.iX = iFastSwapArea.GridWorldSize().iWidth - iFastSwapArea.Rect().Width();
-                }
-            else
-                {
-                retVal.iX = 0;
-                }
-            }
-        else // normal layout
-            {
-            retVal.iX = 0;
-            }
-        }
-    else if ( aItemIdx == iFastSwapArea.GridItemCount() - 1 )
-        {
-        // Last item selected
-        if( AknLayoutUtils::LayoutMirrored() )
-            {
-            retVal.iX = 0;
-            }
-        else // normal layout
-            {
-            if ( iFastSwapArea.GridItemCount() > maxItemsOnScreen )
-                {
-                retVal.iX = iFastSwapArea.GridWorldSize().iWidth - iFastSwapArea.Rect().Width();
-                }
-            else
-                {
-                retVal.iX = 0;
-                }
-            }
-        }
-    else
-        {
-        // Middle item
-        TInt screenMiddleItemOffset = ( iFastSwapArea.Rect().Width() - gridItemWidth ) / 2;
-        if( AknLayoutUtils::LayoutMirrored() )
-            {
-            retVal.iX = gridItemWidth * ( iFastSwapArea.GridItemCount() - 1 - aItemIdx ) - screenMiddleItemOffset;
-            retVal.iX += ( iFastSwapArea.GridItemCount() - 1 - aItemIdx ) * gridItemGap;
-            }
-        else // normal layout
-            {
-            retVal.iX = gridItemWidth * aItemIdx - screenMiddleItemOffset;
-            retVal.iX += gridItemGap * aItemIdx;
-            }
-        if ( retVal.iX < 0 )
-            {
-            retVal.iX = 0;
-            }
-        // aligin to grid end edge in case
-        // (item's position + draw area) extends over grid area and
-        // (all items cover more than grid area or penultimate item)
-        else if ( retVal.iX + iFastSwapArea.Rect().Width() > iFastSwapArea.GridWorldSize().iWidth &&
-              (iFastSwapArea.GridWorldSize().iWidth > gridItemWidth * iFastSwapArea.GridItemCount() ||
-               (aItemIdx > 1 &&   aItemIdx == iFastSwapArea.GridItemCount() - 2 )) )
-            {
-            retVal.iX = iFastSwapArea.GridWorldSize().iWidth - iFastSwapArea.Rect().Width();
-            }
-        }
-    
-    // Return middle of the view rectangle
-    retVal.iX += iFastSwapArea.Rect().Width() / 2;
-    
-    return retVal;
-    }
-
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapAreaExtension::ViewToVisibleItem
-// -----------------------------------------------------------------------------
-//
-TInt CTsFastSwapAreaExtension::ViewToVisibleItem( const TPoint aViewPos )
-    {
-    TInt retVal(0);
-    TPoint absViewPos = aViewPos;
-    absViewPos.iX -= iFastSwapArea.Rect().Width() / 2;
-    if ( absViewPos.iX < 0 )
-        {
-        if ( AknLayoutUtils::LayoutMirrored() )
-            {
-            // View crossed left border of grid world rect, last item selected
-            retVal = iFastSwapArea.GridItemCount() - 1;
-            }
-        else // normal layout
-            {
-            // View crossed left border of grid world rect, first item selected
-            retVal = 0;
-            }
-        }
-    else if ( absViewPos.iX + iFastSwapArea.Rect().Width() > iFastSwapArea.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 = iFastSwapArea.GridItemCount() - 1;
-            }
-        }
-    else
-        {
-        TInt retItemPosX(0);
-        TInt offsetCheck = iFastSwapArea.GridWorldSize().iWidth;
-        // View inside of grid world rect
-        for ( TInt i = 0 ; i < iFastSwapArea.GridItemCount(); i++ )
-            {
-            TInt itemPosX = ItemViewPosition( i ).iX;
-            TInt offset = aViewPos.iX - itemPosX;
-            if ( Abs( offset ) <= offsetCheck )
-                {
-                offsetCheck = Abs( offset );
-                retVal = i;
-                retItemPosX = itemPosX;
-                }
-            else
-                {
-                break;
-                }
-            }
-        // Check if item is fully visible. If not
-        // return next one if possible
-        TInt gridItemWidth = iFastSwapArea.GetGridItemData( CTsFastSwapArea::EGridItemWidth );
-        if ( retItemPosX - gridItemWidth / 2 < absViewPos.iX &&
-             retVal + 1 < iFastSwapArea.GridItemCount() )
-            {
-            retVal++;
-            }
-        }
-    
-    return retVal;
-    }
-
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapAreaExtension::LaunchPopupFeedback
-// -----------------------------------------------------------------------------
-//
-void CTsFastSwapAreaExtension::LaunchPopupFeedback()
-    {
-    if ( AknLayoutUtils::PenEnabled() )
-        {
-        MTouchFeedback* feedback = MTouchFeedback::Instance();
-        if ( feedback )
-            {
-            TTouchLogicalFeedback fbLogicalType = ETouchFeedbackPopUp;
-            if ( CAknTransitionUtils::TransitionsEnabled(
-                 AknTransEffect::EComponentTransitionsOff ) )
-                {
-                fbLogicalType = ETouchFeedbackIncreasingPopUp;
-                }
-            feedback->InstantFeedback( &iFastSwapArea,
-                                       fbLogicalType,
-                                       ETouchFeedbackVibra,
-                                       TPointerEvent() );
-            }
-        }
-    }
-
-
-// -----------------------------------------------------------------------------
-// CTsFastSwapAreaExtension::PreferredImageSize
-// -----------------------------------------------------------------------------
-//
-TSize CTsFastSwapAreaExtension::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();
-    }
-
-// --------------------------------------------------------------------------
-// CTsFastSwapAreaExtension::CalculateSizePreserveRatio
-// --------------------------------------------------------------------------
-//
-TSize CTsFastSwapAreaExtension::CalculateSizePreserveRatio(
-        const TSize& aTargetAreaSize,
-        const TSize& aSourceSize )
-    {
-    const TReal 
-      resizedAspectRatio(aTargetAreaSize.iWidth/(TReal)aTargetAreaSize.iHeight);
-    const TReal 
-      orginalAspectRatio(aSourceSize.iWidth/(TReal)aSourceSize.iHeight);
-    //this condition avoid empty margins ( bigger output ). to realy fit area change it
-    const TReal scaleFactor = 
-        ( orginalAspectRatio > resizedAspectRatio ) ? 
-        (aTargetAreaSize.iHeight /(TReal)aSourceSize.iHeight) ://scale by height
-        (aTargetAreaSize.iWidth /(TReal)aSourceSize.iWidth) ;//scale by width
-    return TSize(aSourceSize.iWidth * scaleFactor, aSourceSize.iHeight * scaleFactor);
-    }
-
-
-// --------------------------------------------------------------------------
-// CTsFastSwapAreaExtension::CopyBitmapL
-// Copy and scale.
-// --------------------------------------------------------------------------
-//
-CFbsBitmap* CTsFastSwapAreaExtension::CopyBitmapL( TInt aFbsHandle, TSize aSize, TBool aIsScreenshot  )
-    {
-    CFbsBitmap* ret = new (ELeave) CFbsBitmap();
-    CleanupStack::PushL( ret );
-
-    CFbsBitmap* bmp = DuplicateBitmapLC( aFbsHandle );
-    
-    // First scale using normal method, to show "draft" screenshots.
-    // 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 );
-    
-    // Second, if it is screenshot, perform quality improvement scaling
-    if ( aIsScreenshot )
-        {
-        ScaleBitmapL( bmp, ret );
-        CleanupStack::Pop( bmp );
-        }
-    else
-        {
-        CleanupStack::PopAndDestroy( bmp );
-        }
-    
-    CleanupStack::Pop( ret );
-    return ret;
-    }
-
-// --------------------------------------------------------------------------
-// CTsFastSwapAreaExtension::DuplicateBitmapL
-// --------------------------------------------------------------------------
-//
-CFbsBitmap* CTsFastSwapAreaExtension::DuplicateBitmapLC( TInt aFbsHandle  )
-    {
-    CFbsBitmap* bmp = new (ELeave) CFbsBitmap();
-    CleanupStack::PushL( bmp );
-    User::LeaveIfError( bmp->Duplicate( aFbsHandle ) );
-    return bmp;
-    }
-
-// --------------------------------------------------------------------------
-// CTsFastSwapAreaExtension::ScaleBitmapL
-// --------------------------------------------------------------------------
-//
-void CTsFastSwapAreaExtension::ScaleBitmapL( CFbsBitmap* aSourceBitmap,
-        CFbsBitmap* aTargetBitmap )
-    {
-    CTsBitmapScaleTask* rotaTask = new (ELeave) CTsBitmapScaleTask( *this );
-    CleanupStack::PushL( rotaTask );
-    iScaleTasks.AppendL( rotaTask );
-    rotaTask->StartLD( aSourceBitmap, aTargetBitmap ); 
-    // ownership of bmp transferred
-    CleanupStack::Pop( rotaTask );
-    }
-
-// --------------------------------------------------------------------------
-// CTsFastSwapAreaExtension::CancelScaleTasks
-// --------------------------------------------------------------------------
-//
-void CTsFastSwapAreaExtension::CancelScaleTasks()
-    {
-    iScaleTasks.ResetAndDestroy();
-    }
-
-
-// --------------------------------------------------------------------------
-// CTsFastSwapAreaExtension::ScaleFinished
-// --------------------------------------------------------------------------
-//
-void CTsFastSwapAreaExtension::ScaleFinished( CTsBitmapScaleTask* iFinishedTask )
-    {
-    TInt task = iScaleTasks.Find( iFinishedTask );
-    if ( task != KErrNotFound )
-        {
-        iScaleTasks.Remove( task );
-        }
-    iFastSwapArea.DrawDeferred();
-    }
-
- // End of file