skins/AknSkins/src/AknsUtils.cpp
author William Roberts <williamr@symbian.org>
Tue, 23 Mar 2010 16:09:27 +0000
branchSymbian3_Theme
changeset 35 838be9535c06
parent 0 05e9090e2422
child 58 a2f9480e2280
permissions -rw-r--r--
Start integration branch for Symbian^3 Theme The theme has been built using Carbide.ui on S60 5th Edition using the N97 plugin The source code in sf/mw/uiresources/skins/Symbian/srcdata was used to generate the installable SIS file which lives in the group directory, but the aim here is to build the theme for delivery in the ROM (preferrably as the default theme). Running "sbs -b bld.inf -c winscw" should build cleanly and deliver a matched set of files which then show up in the Settings | Themes | General list. Attempting to install it produces "Theme Corrupted".

/*
* Copyright (c) 2002-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:  Defines a public static utility class AknsUtils.
*
*/


// INCLUDE FILES
#include "AknsCppPreface.h"

#include <eikenv.h>
#include <coecntrl.h>
#include <gulicon.h>

#include <AknsUtils.h>

#include "AknsAppSkinInstance.h"
#include "AknsContainerDataContext.h"
#include "AknsAppUiParameters.h"
#include "AknsScalabilityUtils.h"

#include "AknsDebug.h"

_LIT(KAknsUtilsTrue, "true");
_LIT(KAknsUtilsFalse, "false");


AKNS_UNDEFINED_METHOD(AknsUtils::AknsUtils)

// ============================ MEMBER FUNCTIONS ===============================

// -----------------------------------------------------------------------------
// AknsUtils::InitSkinSupportL
// -----------------------------------------------------------------------------
//
AKNS_EXPORTED_METHOD(AknsUtils::InitSkinSupportL)
EXPORT_C void AknsUtils::InitSkinSupportL()
    {
    AKNS_TRACE_INFO("AknsUtils::InitSkinSupportL");

    if( !SkinInstance() )
        {
        CAknsAppSkinInstance::CreateSingletonL();
        }

    __ASSERT_DEBUG(SkinInstance(),AKNS_DEBUG_PANIC(EAknsDPanicNotInitialized));
    }

// -----------------------------------------------------------------------------
// AknsUtils::CreateDataContextForContainerL
// -----------------------------------------------------------------------------
//
AKNS_EXPORTED_METHOD(AknsUtils::CreateDataContextForContainerL)
EXPORT_C MAknsDataContext* AknsUtils::CreateDataContextForContainerL()
    {
    return CAknsContainerDataContext::NewL();
    }

// -----------------------------------------------------------------------------
// AknsUtils::CreateBitmapItemDefL
// -----------------------------------------------------------------------------
//
AKNS_EXPORTED_METHOD(AknsUtils::CreateBitmapItemDefL)
EXPORT_C CAknsItemDef* AknsUtils::CreateBitmapItemDefL(
    const TAknsItemID& aID, const TDesC& aFilename,
    const TInt aIndex )
    {
    return CAknsBitmapItemDef::NewL( aID, aFilename, aIndex );
    }

// -----------------------------------------------------------------------------
// AknsUtils::CreateMaskedBitmapItemDefL
// -----------------------------------------------------------------------------
//
AKNS_EXPORTED_METHOD(AknsUtils::CreateMaskedBitmapItemDefL)
EXPORT_C CAknsItemDef* AknsUtils::CreateMaskedBitmapItemDefL(
    const TAknsItemID& aID, const TDesC& aFilename,
    const TInt aIndex, const TInt aMaskIndex )
    {
    return CAknsMaskedBitmapItemDef::NewL( aID, aFilename, aIndex,
        aMaskIndex );
    }

// -----------------------------------------------------------------------------
// AknsUtils::SkinInstance
// -----------------------------------------------------------------------------
//
AKNS_EXPORTED_METHOD(AknsUtils::SkinInstance)
EXPORT_C MAknsSkinInstance* AknsUtils::SkinInstance()
    {
    CAknsAppSkinInstance* skin = static_cast<CAknsAppSkinInstance*>
        (CCoeEnv::Static( KAknsSkinInstanceTls ));
    return skin;
    }

// -----------------------------------------------------------------------------
// AknsUtils::DataContext
// -----------------------------------------------------------------------------
//
AKNS_EXPORTED_METHOD(AknsUtils::DataContext)
EXPORT_C MAknsDataContext* AknsUtils::DataContext( MObjectProvider* aMop )
    {
    MAknsSkinInstance* skin = SkinInstance();
    if( !skin )
        {
        return NULL;
        }

    MAknsDataContext* dc = NULL;
    if( aMop )
        {
        aMop->MopGetObject( dc );
        }

    if( !dc )
        {
        dc = skin->RootDataContext();
        }

    return dc;
    }

// -----------------------------------------------------------------------------
// AknsUtils::CreateIconL
// -----------------------------------------------------------------------------
//
EXPORT_C void AknsUtils::CreateIconL(
    MAknsSkinInstance* aInstance, const TAknsItemID& aID,
    CFbsBitmap*& aBitmap, CFbsBitmap*& aMask,
    const TDesC& aFilename,
    const TInt aFileBitmapId, const TInt aFileMaskId )
    {
    CreateIconLC( aInstance, aID, aBitmap, aMask,
        aFilename, aFileBitmapId, aFileMaskId );
    CleanupStack::Pop(2); // aBitmap, aMask
    }

// -----------------------------------------------------------------------------
// AknsUtils::CreateIconLC
// -----------------------------------------------------------------------------
//
EXPORT_C void AknsUtils::CreateIconLC(
    MAknsSkinInstance* aInstance, const TAknsItemID& aID,
    CFbsBitmap*& aBitmap, CFbsBitmap*& aMask,
    const TDesC& aFilename,
    const TInt aFileBitmapId, const TInt aFileMaskId )
    {
    CFbsBitmap* bitmap = NULL;
    CFbsBitmap* mask = NULL;
    TBool fallback = EFalse;
    if( aInstance )
        {
        CAknsMaskedBitmapItemData* bmpData =
            static_cast<CAknsMaskedBitmapItemData*>(
            aInstance->CreateUncachedItemDataL( aID, EAknsITMaskedBitmap ) );
        CleanupStack::PushL( bmpData );
        if( bmpData && bmpData->Bitmap() && bmpData->Mask() )
            {
            // Detach bitmaps
            bitmap = bmpData->Bitmap();
            bmpData->SetBitmap( NULL );
            mask = bmpData->Mask();
            bmpData->SetMask( NULL );
            }
        CleanupStack::PopAndDestroy( bmpData );
        }

    if( bitmap ) // Mask is also loaded
        {
        CleanupStack::PushL( mask );
        CleanupStack::PushL( bitmap );
        }
    else
        {
        if( !aFilename.Length() )
            {
            User::Leave( KErrNotFound );
            }

        // Fallback
        AknIconUtils::CreateIconLC( bitmap, mask,
            aFilename, aFileBitmapId, aFileMaskId );
        fallback = ETrue;
        }

    if( (bitmap && mask) || fallback)
        {
        // Ownership transferred
        aBitmap = bitmap;
        aMask = mask;
        }
    else
        {
        User::Leave( KErrUnknown );
        }
    }

// -----------------------------------------------------------------------------
// AknsUtils::CreateIconL
// -----------------------------------------------------------------------------
//
EXPORT_C void AknsUtils::CreateIconL(
    MAknsSkinInstance* aInstance, const TAknsItemID& aID,
    CFbsBitmap*& aBitmap,
    const TDesC& aFilename,
    const TInt aFileBitmapId )
    {
    CreateIconLC( aInstance, aID, aBitmap,
        aFilename, aFileBitmapId );
    CleanupStack::Pop( aBitmap );
    }

// -----------------------------------------------------------------------------
// AknsUtils::CreateIconLC
// -----------------------------------------------------------------------------
//
EXPORT_C void AknsUtils::CreateIconLC(
    MAknsSkinInstance* aInstance, const TAknsItemID& aID,
    CFbsBitmap*& aBitmap,
    const TDesC& aFilename,
    const TInt aFileBitmapId )
    {
    CFbsBitmap* bitmap = NULL;

    if( aInstance )
        {
        CAknsBitmapItemData* bmpData =
            static_cast<CAknsBitmapItemData*>(
            aInstance->CreateUncachedItemDataL( aID, EAknsITBitmap ) );
        CleanupStack::PushL( bmpData );
        if( bmpData && bmpData->Bitmap() )
            {
            // Detach bitmap
            bitmap = bmpData->Bitmap();
            bmpData->SetBitmap( NULL );
            }
        CleanupStack::PopAndDestroy( bmpData );
        }

    if( bitmap )
        {
        CleanupStack::PushL( bitmap );
        }
    else
        {
        if( !aFilename.Length() )
            {
            User::Leave( KErrNotFound );
            }

        // Fallback
        bitmap = AknIconUtils::CreateIconL(
            aFilename, aFileBitmapId );

        CleanupStack::PushL( bitmap ); // bitmap
        }

    if( bitmap )
        {
        // Ownership transferred
        aBitmap = bitmap;
        }
    else
        {
        User::Leave( KErrUnknown );
        }
    }

// -----------------------------------------------------------------------------
// AknsUtils::CreateMaskedBitmapL
// -----------------------------------------------------------------------------
//
EXPORT_C CApaMaskedBitmap* AknsUtils::CreateMaskedBitmapL(
    MAknsSkinInstance* aInstance, const TAknsItemID& aID,
    const TDesC& aFilename,
    const TInt aFileIndex, const TInt aFileMaskIndex )
    {
    AKNS_TRACE_OBSOLETE("AknsUtils::CreateMaskedBitmapL (5 param)");

    CFbsBitmap* bitmap = NULL;
    CFbsBitmap* mask = NULL;

    CreateIconLC( aInstance, aID, bitmap, mask,
        aFilename, aFileIndex, aFileMaskIndex );

    // Bitmap and mask always exist here
    CApaMaskedBitmap* maskedBitmap = CApaMaskedBitmap::NewLC();
    // Note that these calls leave with SVG-originating icons
    User::LeaveIfError( maskedBitmap->Duplicate( bitmap->Handle() ) );
    User::LeaveIfError( maskedBitmap->Mask()->Duplicate( mask->Handle() ) );
    CleanupStack::Pop( maskedBitmap );

    CleanupStack::PopAndDestroy( 2 ); // bitmap, mask

    return maskedBitmap;
    }

// -----------------------------------------------------------------------------
// AknsUtils::CreateGulIconL
// -----------------------------------------------------------------------------
//
EXPORT_C CGulIcon* AknsUtils::CreateGulIconL(
    MAknsSkinInstance* aInstance, const TAknsItemID& aID,
    const TDesC& aFilename,
    const TInt aFileIndex, const TInt aFileMaskIndex )
    {
    CFbsBitmap* bitmap = NULL;
    CFbsBitmap* mask = NULL;

    CreateIconLC( aInstance, aID, bitmap, mask,
        aFilename, aFileIndex, aFileMaskIndex );

    CGulIcon* icon = CGulIcon::NewL( bitmap, mask );

    CleanupStack::Pop( 2 ); // bitmap, mask

    return icon;
    }

// -----------------------------------------------------------------------------
// AknsUtils::CreateColorIconL
// -----------------------------------------------------------------------------
//
AKNS_EXPORTED_METHOD(AknsUtils::CreateColorIconL)
EXPORT_C void AknsUtils::CreateColorIconL(
    MAknsSkinInstance* aInstance, const TAknsItemID& aID,
    const TAknsItemID& aColorID, const TInt aColorIndex,
    CFbsBitmap*& aBitmap, CFbsBitmap*& aMask,
    const TDesC& aFilename,
    const TInt aFileBitmapId, const TInt aFileMaskId,
    const TRgb aDefaultColor )
    {
    CreateColorIconLC( aInstance, aID, aColorID, aColorIndex,
        aBitmap, aMask, aFilename, aFileBitmapId, aFileMaskId, aDefaultColor );
    CleanupStack::Pop(2); // aBitmap, aMask
    }

// -----------------------------------------------------------------------------
// AknsUtils::CreateColorIconLC
// -----------------------------------------------------------------------------
//
AKNS_EXPORTED_METHOD(AknsUtils::CreateColorIconLC)
EXPORT_C void AknsUtils::CreateColorIconLC(
    MAknsSkinInstance* aInstance, const TAknsItemID& aID,
    const TAknsItemID& aColorID, const TInt aColorIndex,
    CFbsBitmap*& aBitmap, CFbsBitmap*& aMask,
    const TDesC& aFilename,
    const TInt aFileBitmapId, const TInt aFileMaskId,
    const TRgb aDefaultColor )
    {
    CreateColorIconLC(
        aInstance, aID, aColorID, aColorIndex, aBitmap, aMask,
        aFilename, aFileBitmapId, aFileMaskId, aDefaultColor,
        TSize(-1,-1), EAspectRatioPreserved );
    }

// -----------------------------------------------------------------------------
// AknsUtils::CreateColorIconL
// -----------------------------------------------------------------------------
//
AKNS_EXPORTED_METHOD(AknsUtils::CreateColorIconL)
EXPORT_C void AknsUtils::CreateColorIconL(
    MAknsSkinInstance* aInstance, const TAknsItemID& aID,
    const TAknsItemID& aColorID, const TInt aColorIndex,
    CFbsBitmap*& aBitmap, CFbsBitmap*& aMask,
    const TDesC& aFilename,
    const TInt aFileBitmapId, const TInt aFileMaskId,
    const TRgb aDefaultColor,
    const TSize& aSize, const TScaleMode aScaleMode )
    {
    CreateColorIconLC( aInstance, aID, aColorID, aColorIndex,
        aBitmap, aMask, aFilename, aFileBitmapId, aFileMaskId, aDefaultColor,
        aSize, aScaleMode );
    CleanupStack::Pop(2); // aBitmap, aMask
    }

// -----------------------------------------------------------------------------
// AknsUtils::CreateColorIconLC
// -----------------------------------------------------------------------------
//
AKNS_EXPORTED_METHOD(AknsUtils::CreateColorIconLC)
EXPORT_C void AknsUtils::CreateColorIconLC(
    MAknsSkinInstance* aInstance, const TAknsItemID& aID,
    const TAknsItemID& aColorID, const TInt aColorIndex,
    CFbsBitmap*& aBitmap, CFbsBitmap*& aMask,
    const TDesC& aFilename,
    const TInt aFileBitmapId, const TInt aFileMaskId,
    const TRgb aDefaultColor,
    const TSize& aSize, const TScaleMode aScaleMode )
    {
    CFbsBitmap* bitmap = NULL;
    CFbsBitmap* mask = NULL;

    CreateIconLC( aInstance, aID, bitmap, mask,
        aFilename, aFileBitmapId, aFileMaskId ); // (2)

    TRgb color = aDefaultColor;
    // Return value intentionally ignored
    GetCachedColor( aInstance, color, aColorID, aColorIndex );

    if( AknIconUtils::IsMifIcon( bitmap ) )
        {
        AknIconUtils::SetIconColor( bitmap, color );
        aBitmap = bitmap;
        aMask = mask;
        }
    else // Create Own Icon
        {
        CFbsBitmap* colorBitmap = new (ELeave) CFbsBitmap();
        CleanupStack::PushL( colorBitmap ); // (3)

        TSize size = mask->SizeInPixels();
        User::LeaveIfError(
            colorBitmap->Create( size,
            CEikonEnv::Static()->ScreenDevice()->DisplayMode() ) );

        CFbsBitmapDevice* colorBmpDev = CFbsBitmapDevice::NewL( colorBitmap );
        CleanupStack::PushL( colorBmpDev ); // (4)
        User::LeaveIfError( colorBmpDev->Resize( size ) );

        CFbsBitGc* colorBmpGc = CFbsBitGc::NewL();
        CleanupStack::PushL( colorBmpGc ); // (5)
        colorBmpGc->Activate( colorBmpDev );

        colorBmpGc->SetBrushColor( color );
        colorBmpGc->SetPenStyle( CGraphicsContext::ENullPen );
        colorBmpGc->SetBrushStyle( CGraphicsContext::ESolidBrush );
        colorBmpGc->DrawRect( TRect( TPoint(0,0), size ) );

        CleanupStack::PopAndDestroy( 2 ); // colorBmpGc, colorBmpDev (3)
        CleanupStack::Pop( 3 ); // colorBmp, bitmap, mask (0)
        delete bitmap; // We don't know the order, must destroy manually

        aBitmap = colorBitmap;
        aMask = mask;

        // These are both safe
        CleanupStack::PushL( aBitmap ); // (1)
        CleanupStack::PushL( aMask ); // (2)
        }

    if( aSize.iWidth>=0 )
        {
        // Set the size
        User::LeaveIfError(
            AknIconUtils::SetSize( aBitmap, aSize, aScaleMode ) );
        }
    }

// -----------------------------------------------------------------------------
// AknsUtils::CreateBitmapL
// -----------------------------------------------------------------------------
//
AKNS_EXPORTED_METHOD(AknsUtils::CreateBitmapL)
EXPORT_C CFbsBitmap* AknsUtils::CreateBitmapL(
    MAknsSkinInstance* aInstance, const TAknsItemID& aID )
    {
    CFbsBitmap* bitmap = NULL;
    CreateIconL( aInstance, aID, bitmap, KNullDesC, -1 );

    return bitmap;
    }

// -----------------------------------------------------------------------------
// AknsUtils::CreateMaskedBitmapL
// -----------------------------------------------------------------------------
//
AKNS_EXPORTED_METHOD(AknsUtils::CreateMaskedBitmapL)
EXPORT_C CApaMaskedBitmap* AknsUtils::CreateMaskedBitmapL(
    MAknsSkinInstance* aInstance, const TAknsItemID& aID )
    {
    AKNS_TRACE_OBSOLETE("AknsUtils::CreateMaskedBitmapL (2 param)");
    return CreateMaskedBitmapL( aInstance, aID, KNullDesC, -1, -1 );
    }

// -----------------------------------------------------------------------------
// AknsUtils::CreateGulIconL
// -----------------------------------------------------------------------------
//
AKNS_EXPORTED_METHOD(AknsUtils::CreateGulIconL)
EXPORT_C CGulIcon* AknsUtils::CreateGulIconL(
    MAknsSkinInstance* aInstance, const TAknsItemID& aID,
    const TBool aRequireMask )
    {
    if( !aInstance )
        {
        User::Leave(KErrNotSupported);
        }

    // Forward-query type
    TBool needsDelete = EFalse;
    CAknsItemDef* def =
        static_cast<CAknsAppSkinInstance*>(aInstance)->LookupDef(
        needsDelete, aID, EAknsITMaskedBitmap );
    TBool maskedAvailable = def ? ETrue : EFalse;
    if( needsDelete ) delete def;

    if( maskedAvailable )
        {
        return CreateGulIconL( aInstance, aID, KNullDesC, -1, -1 );
        }
    else if( !aRequireMask )
        {
        CFbsBitmap* bitmap = NULL;
        CreateIconLC( aInstance, aID, bitmap, KNullDesC, -1 );
        CGulIcon* icon = CGulIcon::NewL( bitmap );
        CleanupStack::Pop( bitmap );
        return icon;
        }
    else
        {
        User::Leave( KErrNotFound );
        }

    return NULL; // Never reached
    }

// -----------------------------------------------------------------------------
// AknsUtils::GetCachedBitmap
// -----------------------------------------------------------------------------
//
AKNS_EXPORTED_METHOD(AknsUtils::GetCachedBitmap)
EXPORT_C CFbsBitmap* AknsUtils::GetCachedBitmap(
    MAknsSkinInstance* aInstance, const TAknsItemID& aID )
    {
    if( !aInstance )
        {
        return NULL;
        }

    CAknsItemData* resData = aInstance->GetCachedItemData( aID, EAknsITBitmap );
    if( !resData )
        {
        return NULL;
        }

    return static_cast<CAknsBitmapItemData*>(resData)->Bitmap();
    }

// -----------------------------------------------------------------------------
// AknsUtils::GetCachedMaskedBitmap
// -----------------------------------------------------------------------------
//
AKNS_EXPORTED_METHOD(AknsUtils::GetCachedMaskedBitmap)
EXPORT_C void AknsUtils::GetCachedMaskedBitmap(
    MAknsSkinInstance* aInstance, const TAknsItemID& aID,
    CFbsBitmap*& aBitmap, CFbsBitmap*& aMask )
    {
    aBitmap = NULL;
    aMask = NULL;

    if( !aInstance )
        {
        return;
        }

    CAknsItemData* resData = aInstance->GetCachedItemData( aID, EAknsITBitmap );
    if( !resData )
        {
        return;
        }

    // If found, guaranteed to be at least EAknsITBitmap
    aBitmap = static_cast<CAknsBitmapItemData*>( resData )->Bitmap();

    // Assign mask only, if EAknsITMaskedBitmap
    if( IsDerivedType( EAknsITMaskedBitmap, resData->Type() ) )
        {
        aMask = static_cast<CAknsMaskedBitmapItemData*>( resData )->Mask();
        }
    }

// -----------------------------------------------------------------------------
// AknsUtils::GetCachedColor
// -----------------------------------------------------------------------------
//
AKNS_EXPORTED_METHOD(AknsUtils::GetCachedColor)
EXPORT_C TInt AknsUtils::GetCachedColor(
    MAknsSkinInstance* aInstance, TRgb& aRgb, const TAknsItemID& aID,
    const TInt aIndex )
    {
    if( !aInstance )
        {
        return KErrNotSupported;
        }

    // Check backward compatibility first
    if( AknsScalabilityUtils::GetBackwardCompatibilityColor(
        aInstance, aRgb, aID, aIndex ) )
        {
        // Found and assigned
        return KErrNone;
        }

    CAknsColorTableItemData* colorData = static_cast<CAknsColorTableItemData*>(
        aInstance->GetCachedItemData( aID, EAknsITColorTable ) );
    if( !colorData)
        {
        return KErrNotFound;
        }

    TRAPD( err, colorData->GetColorL( aIndex, aRgb ) );
    return err;
    }

// -----------------------------------------------------------------------------
// AknsUtils::BooleanPropertyL
// -----------------------------------------------------------------------------
//
AKNS_EXPORTED_METHOD(AknsUtils::BooleanPropertyL)
EXPORT_C TBool AknsUtils::BooleanPropertyL( MAknsSkinInstance* aInstance,
    const TAknsItemID& aID )
    {
    if( !aInstance ) User::Leave( KErrNotSupported );

    CAknsStringItemData* data = static_cast<CAknsStringItemData*>(
        aInstance->GetCachedItemData( aID, EAknsITString ) );
    if( !data ) User::Leave( KErrNotFound );

    if( !data->String().CompareF( KAknsUtilsTrue ) ) return ETrue;
    if( !data->String().CompareF( KAknsUtilsFalse ) ) return EFalse;

    User::Leave( KErrArgument );
    return EFalse; // Never reached
    }

// -----------------------------------------------------------------------------
// AknsUtils::IsDerivedType
// -----------------------------------------------------------------------------
//
TBool AknsUtils::IsDerivedType( const TAknsItemType aBaseType,
    const TAknsItemType aDerivedType )
    {
    if( aBaseType == aDerivedType )
        {
        return ETrue;
        }

    switch( aBaseType )
        {
        case EAknsITUnknown:
            {
            return ETrue;
            }

        case EAknsITImage:
            {
            if( (aDerivedType==EAknsITBitmap) ||
                (aDerivedType==EAknsITMaskedBitmap) ||
                (aDerivedType==EAknsITColorTable) ||
                (aDerivedType==EAknsITImageTable) ||
                (aDerivedType==EAknsITBmpAnim ) )
                {
                return ETrue;
                }

            return EFalse;
            }

        case EAknsITBitmap:
            {
            if( aDerivedType == EAknsITMaskedBitmap )
                {
                return ETrue;
                }

            return EFalse;
            }

        case EAknsITImageTable:
            {
            if( aDerivedType == EAknsITBmpAnim )
                {
                return ETrue;
                }

            return EFalse;
            }

        default:
            break;
        } //lint !e788 Other values return EFalse

    return EFalse;
    }

// -----------------------------------------------------------------------------
// AknsUtils::SetAvkonSkinEnabledL
// -----------------------------------------------------------------------------
//
AKNS_EXPORTED_METHOD(AknsUtils::SetAvkonSkinEnabledL)
EXPORT_C void AknsUtils::SetAvkonSkinEnabledL( const TBool aEnabled )
    {
    CAknsAppUiParameters* aup = static_cast<CAknsAppUiParameters*>
        (CCoeEnv::Static( KAknsAppUiParametersTls ));

    if( !aup )
        {
        CAknsAppUiParameters::CreateSingletonL();
        aup = static_cast<CAknsAppUiParameters*>
            (CCoeEnv::Static( KAknsAppUiParametersTls ));
        }

    __ASSERT_DEBUG(aup,AKNS_DEBUG_PANIC(EAknsDPanicNotInitialized));

    aup->SetAvkonSkinEnabled( aEnabled );
    }

// -----------------------------------------------------------------------------
// AknsUtils::AvkonSkinEnabled
// -----------------------------------------------------------------------------
//
AKNS_EXPORTED_METHOD(AknsUtils::AvkonSkinEnabled)
EXPORT_C TBool AknsUtils::AvkonSkinEnabled()
    {
    CAknsAppUiParameters* aup = static_cast<CAknsAppUiParameters*>
        (CCoeEnv::Static( KAknsAppUiParametersTls ));

    if( aup )
        {
        return aup->AvkonSkinEnabled();
        }

    return EFalse;
    }

// -----------------------------------------------------------------------------
// AknsUtils::SetAvkonHighlightAnimationEnabledL
// -----------------------------------------------------------------------------
//
AKNS_EXPORTED_METHOD(AknsUtils::SetAvkonHighlightAnimationEnabledL)
EXPORT_C void AknsUtils::SetAvkonHighlightAnimationEnabledL( const TBool aEnabled )
    {
    CAknsAppUiParameters* aup = static_cast<CAknsAppUiParameters*>
        (CCoeEnv::Static( KAknsAppUiParametersTls ));

    if( !aup )
        {
        CAknsAppUiParameters::CreateSingletonL();
        aup = static_cast<CAknsAppUiParameters*>
            (CCoeEnv::Static( KAknsAppUiParametersTls ));
        }

    __ASSERT_DEBUG(aup,AKNS_DEBUG_PANIC(EAknsDPanicNotInitialized));

    aup->SetAvkonHighlightAnimationEnabled( aEnabled );
    }

// -----------------------------------------------------------------------------
// AknsUtils::AvkonHighlightAnimationEnabled
// -----------------------------------------------------------------------------
//
AKNS_EXPORTED_METHOD(AknsUtils::AvkonHighlightAnimationEnabled)
EXPORT_C TBool AknsUtils::AvkonHighlightAnimationEnabled()
    {
    // Step 1: Check if product variant has disabled animations
    CAknsAppSkinInstance* skin = static_cast<CAknsAppSkinInstance*>
        (CCoeEnv::Static( KAknsSkinInstanceTls ));
    if( skin )
        {
        if( !skin->VariantHighlightAnimationEnabled() )
            {
            // Product variant has disabled highlight animation
            return EFalse;
            }
        }
    else
        {
        // No skin instance -> no skin -> animations can hardly be supported
        return EFalse;
        }

    // Step 2: Product allows animations, check application specific status
    CAknsAppUiParameters* aup = static_cast<CAknsAppUiParameters*>
        (CCoeEnv::Static( KAknsAppUiParametersTls ));

    if( aup )
        {
        return aup->AvkonHighlightAnimationEnabled();
        }

    return ETrue; // By default, highlight animations are enabled
    }

// -----------------------------------------------------------------------------
// AknsUtils::RegisterControlPosition
// -----------------------------------------------------------------------------
//
AKNS_EXPORTED_METHOD(AknsUtils::RegisterControlPosition)
EXPORT_C void AknsUtils::RegisterControlPosition( const CCoeControl* aControl )
    {
    if( aControl && aControl->DrawableWindow() )
        {
        RegisterControlPosition( aControl, aControl->PositionRelativeToScreen() );
        }
    }

// -----------------------------------------------------------------------------
// AknsUtils::RegisterControlPosition
// -----------------------------------------------------------------------------
//
EXPORT_C void AknsUtils::RegisterControlPosition( const CCoeControl* aControl,
    const TPoint& aPoint )
    {
    CAknsAppSkinInstance* skin = static_cast<CAknsAppSkinInstance*>
        (CCoeEnv::Static( KAknsSkinInstanceTls ));

    if( (!skin) || (!aControl) || (!aControl->DrawableWindow()) )
        {
        return;
        }

    TAknsControlPositionEntry entry;
    TInt index;

    entry.iKey = reinterpret_cast<TUint>(aControl);
    if( skin->iControlPositionList.FindInUnsignedKeyOrder(
        entry, index ) == KErrNone )
        {
        skin->iControlPositionList[index].iScreenPos = aPoint;
        }
    else
        {
        entry.iScreenPos = aPoint;
        skin->iControlPositionList.InsertInUnsignedKeyOrder( entry );
        }
    }

// -----------------------------------------------------------------------------
// AknsUtils::DeregisterControlPosition
// -----------------------------------------------------------------------------
//
AKNS_EXPORTED_METHOD(AknsUtils::DeregisterControlPosition)
EXPORT_C void AknsUtils::DeregisterControlPosition( const CCoeControl* aControl )
    {
    CAknsAppSkinInstance* skin = static_cast<CAknsAppSkinInstance*>
        (CCoeEnv::Static( KAknsSkinInstanceTls ));

    if( !skin )
        {
        return;
        }

    TAknsControlPositionEntry entry;
    TInt index;

    entry.iKey = reinterpret_cast<TUint>(aControl);
    if( skin->iControlPositionList.FindInUnsignedKeyOrder(
        entry, index ) == KErrNone )
        {
        skin->iControlPositionList.Remove( index );
        }
    }

// -----------------------------------------------------------------------------
// AknsUtils::GetControlPosition
// -----------------------------------------------------------------------------
//
EXPORT_C TInt AknsUtils::GetControlPosition( const CCoeControl* aControl,
    TPoint& aScreenPos )
    {
    CAknsAppSkinInstance* skin = static_cast<CAknsAppSkinInstance*>
        (CCoeEnv::Static( KAknsSkinInstanceTls ));

    if( !skin )
        {
        return KErrNotFound;
        }

    TAknsControlPositionEntry entry;
    TInt index;

    entry.iKey = reinterpret_cast<TUint>(aControl);
    if( skin->iControlPositionList.FindInUnsignedKeyOrder(
        entry, index ) == KErrNone )
        {
        aScreenPos = skin->iControlPositionList[index].iScreenPos;
        return KErrNone;
        }

    return KErrNotFound;
    }

// -----------------------------------------------------------------------------
// AknsUtils::Reserved
// -----------------------------------------------------------------------------
//
AKNS_EXPORTED_METHOD(AknsUtils::Reserved)
EXPORT_C TInt AknsUtils::Reserved()
    {
    return 0;
    }

//  End of File