diff -r 5b6f26637ad3 -r f4a778e096c2 phonebookui/Phonebook2/CommonUI/src/CPbk2IconFactory.cpp --- /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 + +// Phonebook2 +#include "CPbk2IconInfo.h" +#include +#include +#include +#include + +// System includes +#include +#include +#include +#include +#include +#include + +#include +#include +#include +// Debugging headers +#include + +/// 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(aIconInfo.ExternalBitmap()); + AknIconUtils::SetSize( tmp, size ); + tmp = const_cast(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