--- /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