phonebookui/Phonebook2/CommonUI/src/CPbk2IconFactory.cpp
branchRCL_3
changeset 20 f4a778e096c2
child 21 9da50d567e3c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/CommonUI/src/CPbk2IconFactory.cpp	Wed Sep 01 12:29:52 2010 +0100
@@ -0,0 +1,400 @@
+/*
+* Copyright (c) 2005-2007 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:  Phonebook 2 icon factory.
+*
+*/
+
+
+#include <CPbk2IconFactory.h>
+
+// Phonebook2
+#include "CPbk2IconInfo.h"
+#include <RPbk2LocalizedResourceFile.h>
+#include <Pbk2DataCaging.hrh>
+#include <Pbk2CommonUi.rsg>
+#include <CPbk2IconInfoContainer.h>
+
+// System includes
+#include <AknUtils.h>
+#include <aknlayoutscalable_avkon.cdl.h>
+#include <AknsUtils.h>
+#include <aknenv.h>
+#include <barsread.h>
+#include <gulicon.h>
+
+#include <CPbk2ServiceManager.h> 
+#include <MPbk2ApplicationServices.h>
+#include <CPbk2ApplicationServices.h>
+// Debugging headers
+#include <Pbk2Debug.h>
+
+/// Unnamed namespace for local definitions
+namespace {
+
+_LIT( KPbk2CommonUiResFile, "Pbk2CommonUi.rsc" );
+
+/**
+ * Creates a bitmap from given icon info using Avkon services.
+ *
+ * @param aSkin         Skin instance.
+ * @param aBitmap       Created bitmap.
+ * @param aMask         Created mask.
+ * @param aIconInfo     Icon information.
+ */
+void CreateBitmapsLC(
+        MAknsSkinInstance* aSkin,
+        CFbsBitmap*& aBitmap,
+        CFbsBitmap*& aMask,
+        const CPbk2IconInfo& aIconInfo )
+    {
+    //Instantiate external bitmaps. We use rather graceful approach because we're
+    //handling external bitmaps. So if problems we don't leave and paralyse system
+    //but just try to continue if possible.
+    if (aIconInfo.IsIconExternal() )
+        {
+        //Check external bitmaps really exist
+        if(!aIconInfo.ExternalBitmap() || !aIconInfo.ExternalMask())
+            {
+            User::Leave(KErrBadHandle);
+            }
+
+        //Calculate size for external icon
+        TSize size = aIconInfo.ExternalIconSize();
+
+        //Try to instantiate ext bitmaps if not yet done, otherwise duplicating fails
+        if(!aIconInfo.ExternalBitmap()->Handle())
+            {
+            CFbsBitmap* tmp = const_cast<CFbsBitmap*>(aIconInfo.ExternalBitmap());
+            AknIconUtils::SetSize( tmp, size );
+            tmp = const_cast<CFbsBitmap*>(aIconInfo.ExternalMask());
+            AknIconUtils::SetSize( tmp, size );
+            }
+
+        //Create bitmaps and try to duplicate their handles to point to external bitmaps
+        aBitmap = new( ELeave ) CFbsBitmap();
+        CleanupStack::PushL( aBitmap );
+        aMask = new( ELeave ) CFbsBitmap();
+        CleanupStack::PushL( aMask );
+        aBitmap->Duplicate( aIconInfo.ExternalBitmap()->Handle() );
+        aMask->Duplicate( aIconInfo.ExternalMask()->Handle() );
+
+        //Try always to set size as ext icon may have been used by some other app too.
+        AknIconUtils::SetSize( aBitmap, size );
+        AknIconUtils::SetSize( aMask, size );
+        return;
+        }
+
+    if ( aIconInfo.ColorId() == KAknsIIDNone )
+        {
+        AknsUtils::CreateIconLC(
+             aSkin, aIconInfo.SkinId(), aBitmap, aMask,
+             aIconInfo.MbmFileName(),
+             aIconInfo.IconId(), aIconInfo.MaskId() );
+        }
+    else
+        {
+        AknsUtils::CreateColorIconLC(
+             aSkin, aIconInfo.SkinId(),
+             aIconInfo.ColorId(), aIconInfo.ColorIndex(),
+             aBitmap, aMask,
+             aIconInfo.MbmFileName(),
+             aIconInfo.IconId(), aIconInfo.MaskId(),
+             AKN_LAF_COLOR_STATIC( aIconInfo.DefaultColorIndex() ) );
+        }
+    }
+
+/**
+ * Creates a bitmap from given icon info using Avkon services.
+ *
+ * @param aSkin         Skin instance.
+ * @param aBitmap       Created bitmap.
+ * @param aMask         Created mask.
+ * @param aIconInfo     Icon information.
+ */
+void CreateBitmapsL(
+        MAknsSkinInstance* aSkin,
+        CFbsBitmap*& aBitmap,
+        CFbsBitmap*& aMask,
+        const CPbk2IconInfo& aIconInfo )
+    {
+    CreateBitmapsLC( aSkin, aBitmap, aMask, aIconInfo );
+    CleanupStack::Pop( 2 ); // bitmap, mask
+    }
+
+} /// namespace
+
+// --------------------------------------------------------------------------
+// CPbk2IconFactory::CPbk2IconFactory
+// --------------------------------------------------------------------------
+//
+CPbk2IconFactory::CPbk2IconFactory(
+        const CPbk2IconInfoContainer* aIconContainer ) :
+            iIconContainer( aIconContainer )
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2IconFactory::~CPbk2IconFactory
+// --------------------------------------------------------------------------
+//
+CPbk2IconFactory::~CPbk2IconFactory()
+    {
+    delete iAllIconsContainer;
+    Release( iAppServices );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2IconFactory::NewLC
+// --------------------------------------------------------------------------
+//
+EXPORT_C CPbk2IconFactory* CPbk2IconFactory::NewL()
+    {
+    CPbk2IconFactory* self = NewLC();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2IconFactory::NewLC
+// --------------------------------------------------------------------------
+//
+EXPORT_C CPbk2IconFactory* CPbk2IconFactory::NewLC()
+    {
+    CPbk2IconFactory* self = new( ELeave ) CPbk2IconFactory( NULL );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2IconFactory::NewL
+// --------------------------------------------------------------------------
+//
+EXPORT_C CPbk2IconFactory* CPbk2IconFactory::NewL(
+        const CPbk2IconInfoContainer& aIconContainer )
+    {
+    CPbk2IconFactory* self = NewLC( aIconContainer );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2IconFactory::NewLC
+// --------------------------------------------------------------------------
+//
+EXPORT_C CPbk2IconFactory* CPbk2IconFactory::NewLC(
+        const CPbk2IconInfoContainer& aIconContainer )
+    {
+    CPbk2IconFactory* self = new( ELeave )
+        CPbk2IconFactory( &aIconContainer );
+    CleanupStack::PushL( self );
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2IconFactory::ConstructL
+// --------------------------------------------------------------------------
+//
+void CPbk2IconFactory::ConstructL()
+    {
+    CCoeEnv& coeEnv = *CCoeEnv::Static();
+
+    RPbk2LocalizedResourceFile resFile( coeEnv );
+    resFile.OpenLC( KPbk2RomFileDrive,
+                   KDC_RESOURCE_FILES_DIR, KPbk2CommonUiResFile );
+
+    TResourceReader reader;
+    coeEnv.CreateResourceReaderLC( reader, R_PBK2_ICON_INFO_ARRAY );
+
+    iAllIconsContainer = CPbk2IconInfoContainer::NewL( reader );
+    
+    //Calculate preferred size for xsp service icons 
+    TRect mainPane;
+    AknLayoutUtils::LayoutMetricsRect(
+        AknLayoutUtils::EMainPane, mainPane );
+    TAknLayoutRect listLayoutRect;
+    listLayoutRect.LayoutRect(
+        mainPane,
+        AknLayoutScalable_Avkon::list_single_graphic_pane_g1(0).LayoutLine() );
+    TSize size(listLayoutRect.Rect().Size());
+
+    // Add xsp service icons2
+    if ( !iAppServices )
+    	{
+    	iAppServices = CPbk2ApplicationServices::InstanceL();
+    	}
+    CPbk2ServiceManager& servMan( iAppServices->ServiceManager()); 
+    
+    const CPbk2ServiceManager::RServicesArray& services = servMan.Services();
+    TUid uid;
+    uid.iUid = KPbk2ServManId;
+    for ( TInt i = 0; i < services.Count(); i++ )
+        {
+        const CPbk2ServiceManager::TService& service = services[i];
+        if ( service.iBitmapId && service.iBitmap )
+            {
+            TPbk2IconId id = TPbk2IconId( uid, services[i].iBitmapId );
+            CPbk2IconInfo* info = CPbk2IconInfo::NewLC(
+                id, services[i].iBitmap, services[i].iMask, size );
+            iAllIconsContainer->AppendIconL(info);
+            CleanupStack::Pop(info);
+            }
+        }    
+    
+    CleanupStack::PopAndDestroy( 2 ); // resFile, reader
+    iIconContainer = iAllIconsContainer;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2IconFactory::CreateIconL
+// --------------------------------------------------------------------------
+//
+EXPORT_C CGulIcon* CPbk2IconFactory::CreateIconL(
+        const TPbk2IconId& aIconId ) const
+    {
+    CGulIcon* icon = CreateIconLC( aIconId );
+    if ( icon )
+        {
+        CleanupStack::Pop( icon );
+        }
+    return icon;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2IconFactory::CreateIconLC
+// --------------------------------------------------------------------------
+//
+EXPORT_C CGulIcon* CPbk2IconFactory::CreateIconLC(
+        const TPbk2IconId& aIconId ) const
+    {
+    CGulIcon* icon = CGulIcon::NewLC();
+
+    const CPbk2IconInfo* iconInfo = iIconContainer->Find( aIconId );
+
+    if ( !iconInfo )
+        {
+        return icon;
+        }
+
+    PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+        ("CPbk2IconInfoContainer::LoadBitmapL icon found"));
+
+    icon->SetBitmapsOwnedExternally(EFalse);
+
+    CFbsBitmap* bitmap = NULL;
+    CFbsBitmap* mask = NULL;
+
+    PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+        ("CPbk2IconInfoContainer::LoadBitmapL about to create icon"));
+
+    CreateBitmapsL( AknsUtils::SkinInstance(),
+        bitmap, mask, *iconInfo );
+
+    PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING
+        ( "CPbk2IconInfoContainer::LoadBitmapL icon create done" ) );
+
+    icon->SetBitmap(bitmap);
+    icon->SetMask(mask);
+
+    return icon;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2IconFactory::CreateIconL
+// --------------------------------------------------------------------------
+//
+EXPORT_C void CPbk2IconFactory::CreateIconL( const TPbk2IconId& aIconId,
+        MAknsSkinInstance& aSkin, CFbsBitmap*& aBitmap, CFbsBitmap*& aMask )
+    {
+    CreateIconLC( aIconId, aSkin, aBitmap, aMask );
+    CleanupStack::Pop( 2 ); // aBitmap, aMask
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2IconFactory::CreateIconLC
+// --------------------------------------------------------------------------
+//
+EXPORT_C void CPbk2IconFactory::CreateIconLC( const TPbk2IconId& aIconId,
+        MAknsSkinInstance& aSkin, CFbsBitmap*& aBitmap, CFbsBitmap*& aMask )
+    {
+    const CPbk2IconInfo* iconInfo = iIconContainer->Find( aIconId );
+    if ( iconInfo )
+        {
+        CreateBitmapsLC( &aSkin, aBitmap, aMask, *iconInfo );
+        }
+    else
+        {
+        User::Leave( KErrNotFound );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2IconFactory::CreateImageL
+// --------------------------------------------------------------------------
+//
+EXPORT_C CEikImage* CPbk2IconFactory::CreateImageL(
+        const TPbk2IconId& aIconId ) const
+    {
+    CEikImage* image = CreateImageLC( aIconId );
+    if ( image )
+        {
+        CleanupStack::Pop( image );
+        }
+    return image;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2IconFactory::CreateImageLC
+// --------------------------------------------------------------------------
+//
+EXPORT_C CEikImage* CPbk2IconFactory::CreateImageLC(
+        const TPbk2IconId& aIconId ) const
+    {
+    CEikImage* image = NULL;
+    const CPbk2IconInfo* iconInfo = iIconContainer->Find( aIconId );
+    if ( iconInfo )
+        {
+        image = new(ELeave) CEikImage;
+        CleanupStack::PushL( image );
+
+        CFbsBitmap* bitmap = NULL;
+        CFbsBitmap* mask = NULL;
+
+        CreateBitmapsL( AknsUtils::SkinInstance(),
+            bitmap, mask, *iconInfo );
+
+        image->SetBitmap( bitmap );
+        image->SetMask( mask );
+        }
+
+    return image;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2IconFactory::AppendIconL
+// --------------------------------------------------------------------------
+//
+EXPORT_C void CPbk2IconFactory::AppendIconL(
+        CPbk2IconInfo* aIconInfo )
+    {
+    if( !iAllIconsContainer )
+        {
+        ConstructL();
+        }
+
+    iAllIconsContainer->AppendIconL(aIconInfo);
+    iIconContainer = iAllIconsContainer;
+    }
+
+// End of File