diff -r 1fc85118c3ae -r 870918037e16 landmarksui/uicontrols/src/CLmkSelectorIconMgr.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/landmarksui/uicontrols/src/CLmkSelectorIconMgr.cpp Wed Sep 01 12:31:27 2010 +0100 @@ -0,0 +1,394 @@ +/* +* Copyright (c) 2002 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: LandmarksUi Content File - +* +*/ + + + + + + + + +// INCLUDE FILES +#include "CLmkSelectorIconMgr.h" +#include "LmkConsts.h" +#include "CLmkUiUtils.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +// CONSTANTS +/// Unnamed namespace for local definitions +namespace { +const TInt KLmkIconCacheGranularity = 30; +const TInt KLmkIconFilesGranularity = 5; +#if defined(_DEBUG) + +_LIT(KPanicMsg,"CLmkSelectorIconMgr"); + +void Panic( TPanicCode aReason ) + { + User::Panic( KPanicMsg, aReason ); + } +#endif +} // namespace + +// ---------------------------------------------------- +// CLmkSelectorIconMgr::TIconData +// ---------------------------------------------------- +// +CLmkSelectorIconMgr::TIconData::TIconData(): + iFileIndex( KErrNotFound ), + iIconIndexWithinFile( KErrNotFound ), + iIconType( EDefinedIcon ), + iIconArrayId( KErrNotFound ) + { + } + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CLmkSelectorIconMgr::CLmkSelectorIconMgr +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CLmkSelectorIconMgr::CLmkSelectorIconMgr( CAknIconArray& aArray ) + : iArray( &aArray ), + iCache( KLmkIconCacheGranularity ) + { + } + +// ----------------------------------------------------------------------------- +// CLmkSelectorIconMgr::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CLmkSelectorIconMgr::ConstructL() + { + iIconFiles = new( ELeave ) CDesCArrayFlat( KLmkIconFilesGranularity ); + ResetMgrL(); + } + +// ----------------------------------------------------------------------------- +// CLmkSelectorIconMgr::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// + +CLmkSelectorIconMgr* CLmkSelectorIconMgr::NewL( + CAknIconArray& aArray ) + { + CLmkSelectorIconMgr* self = new( ELeave ) CLmkSelectorIconMgr( aArray ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + + return self; + } + +// ---------------------------------------------------- +// CLmkSelectorIconMgr::~CLmkSelectorIconMgr +// ---------------------------------------------------- +// +CLmkSelectorIconMgr::~CLmkSelectorIconMgr() + { + iCache.Close(); + delete iIconFiles; + } + +// ---------------------------------------------------- +// CLmkSelectorIconMgr::GetIconL +// ---------------------------------------------------- +// +TInt CLmkSelectorIconMgr::GetIconL( + const TDesC& aMbmFileName, + TInt aIconIdInFile ) + { + TInt position( 0 ); + if ( iIconFiles->Find( aMbmFileName, position, ECmpNormal ) == 0 ) + { // same file has been used already and so it exists in the array + TInt count = iCache.Count(); + for ( TInt i( 0 ); i < count; ++i ) + { + if ( position == iCache[i].iFileIndex && + aIconIdInFile == iCache[i].iIconIndexWithinFile ) + { // icon was found in icon manager! + // If Array Index was not set properly, then set the index propely + if (( iCache[i].iIconArrayId < 0) || + (iCache[i].iIconArrayId > KLmkIconCacheGranularity) ) + { + break; + } + return iCache[i].iIconArrayId; + } + } + } + + // aMbmFileName does not yet exist in the file name array OR it exists but + // this specific icon hasn't been requested yet: + + // create icon manager item: + TInt iconMgrId = CreateIconMgrItemL( aMbmFileName, aIconIdInFile ); + + // try to load new icon: + iCache[iconMgrId].iIconArrayId = + LoadAndAppendIconL( aMbmFileName, aIconIdInFile ); + + return iCache[iconMgrId].iIconArrayId; + } + +// ---------------------------------------------------- +// CLmkSelectorIconMgr::GetDefaultIconL +// ---------------------------------------------------- +// +TInt CLmkSelectorIconMgr::GetDefaultIconL( TIconType aIcon ) + { + TInt count = iCache.Count(); + for ( TInt i( 0 ); i < count ; ++i ) + { + TIconData tmp = iCache[i]; + if ( tmp.iIconType == aIcon ) + { // default icon was found + if ( tmp.iIconArrayId < 0 ) + { // try to load new icon. + TPtrC iconFile = ( *iIconFiles )[tmp.iFileIndex]; + tmp.iIconArrayId = + LoadAndAppendIconL( iconFile, tmp.iIconIndexWithinFile ); + } + return tmp.iIconArrayId; + } + } + return KErrNotFound; // default icon was not found + } + +// ---------------------------------------------------- +// CLmkSelectorIconMgr::SetDefaultIconL +// ---------------------------------------------------- +// +void CLmkSelectorIconMgr::SetDefaultIconL( + TIconType aIcon, + const TDesC& aMbmFileName, + TInt aIconIdInFile ) + { + if ( GetDefaultIconL( aIcon ) >= 0 ) + { // default icon already set + User::Leave( KErrAlreadyExists ); + } + + TInt iconMgrId = CreateIconMgrItemL( aMbmFileName, aIconIdInFile ); + iCache[iconMgrId].iIconType = aIcon; + // Added for updating Icon index + iCache[iconMgrId].iIconArrayId = + LoadAndAppendIconL( aMbmFileName, aIconIdInFile ); + } + +// ---------------------------------------------------- +// CLmkSelectorIconMgr::SetIconAtIndexZeroL +// ---------------------------------------------------- +// +void CLmkSelectorIconMgr::SetIconAtIndexZeroL( + const TDesC& aMbmFileName, + TAknsItemID aSkinID, + TInt aIconId, + TInt aMaskId ) + { + __ASSERT_DEBUG( iArray->Count() >= 2, + Panic( KLmkPanicIndexesZeroOneNotSet ) ); + + CGulIcon* icon = LoadIconL( aMbmFileName, aSkinID, aIconId, aMaskId ); + CleanupStack::PushL( icon ); + + CGulIcon* old = iArray->At( 0 ); + iArray->Delete( 0 ); + delete old; + iArray->InsertL( 0, icon ); + + CleanupStack::Pop( icon ); // ownership transferred to icon array + } + +// ---------------------------------------------------- +// CLmkSelectorIconMgr::SetIconAtIndexOneL +// ---------------------------------------------------- +// +void CLmkSelectorIconMgr::SetIconAtIndexOneL( + const TDesC& aMbmFileName, + TAknsItemID aSkinID, + TInt aIconId, + TInt aMaskId ) + { + __ASSERT_DEBUG( iArray->Count() >= 2, + Panic( KLmkPanicIndexesZeroOneNotSet ) ); + + CGulIcon* icon = LoadIconL( aMbmFileName, aSkinID, aIconId, aMaskId ); + CleanupStack::PushL( icon ); + + CGulIcon* old = iArray->At( 1 ); + iArray->Delete( 1 ); + delete old; + iArray->InsertL( 1, icon ); + + CleanupStack::Pop( icon ); // ownership transferred to icon array + } + +// ---------------------------------------------------- +// CLmkSelectorIconMgr::ResetMgrL +// ---------------------------------------------------- +// +void CLmkSelectorIconMgr::ResetMgrL() + { + iArray->ResetAndDestroy(); + iIconFiles->Reset(); + iCache.Reset(); + + // By default set empty icons as selection icons: + + TFileName* iconFile = CLmkUiUtils::AvkonIconFileLC(); + CGulIcon* icon = LoadIconL( *iconFile, + KAknsIIDQgnPropEmpty, + EMbmAvkonQgn_prop_empty, + EMbmAvkonQgn_prop_empty_mask ); + CleanupStack::PushL( icon ); + iArray->AppendL( icon ); + CleanupStack::Pop( icon ); // ownership transferred to icon array + icon = NULL; + + icon = LoadIconL( *iconFile, + KAknsIIDQgnPropEmpty, + EMbmAvkonQgn_prop_empty, + EMbmAvkonQgn_prop_empty_mask ); + CleanupStack::PushL( icon ); + iArray->AppendL( icon ); + CleanupStack::Pop( icon ); // ownership transferred to icon array + CleanupStack::PopAndDestroy( ); // iconFile + } + +// ============================= HELPER METHODS ================================ + +// ---------------------------------------------------- +// CLmkSelectorIconMgr::LoadIconL +// ---------------------------------------------------- +// +CGulIcon* CLmkSelectorIconMgr::LoadIconL( + const TDesC& aMbmFileName, + TInt aIconIdInFile ) + { + CFbsBitmap* bitmap = NULL; + CFbsBitmap* bitmapMask = NULL; + + AknIconUtils::CreateIconLC(bitmap, bitmapMask, aMbmFileName, + aIconIdInFile, aIconIdInFile + 1); + CGulIcon* icon = CGulIcon::NewL( bitmap, bitmapMask ); + CleanupStack::Pop( 2 ); // bitmapMask, bitmap. icon has now ownership + return icon; + } + +// ---------------------------------------------------- +// CLmkSelectorIconMgr::LoadIconL +// ---------------------------------------------------- +// +CGulIcon* CLmkSelectorIconMgr::LoadIconL( + const TDesC& aMbmFileName, + TAknsItemID aSkinID, + TInt aIconId, + TInt aMaskId ) + { + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + + CFbsBitmap* bitmap = NULL; + CFbsBitmap* bitmapMask = NULL; + AknsUtils::CreateIconLC( skin, aSkinID, bitmap, bitmapMask, aMbmFileName, + aIconId, aMaskId ); + CGulIcon* icon = CGulIcon::NewL( bitmap, bitmapMask ); + CleanupStack::Pop( 2 ); // bitmapMask, bitmap. icon has now ownership + return icon; + } + +// ---------------------------------------------------- +// CLmkSelectorIconMgr::LoadAndAppendIconL +// ---------------------------------------------------- +// +TInt CLmkSelectorIconMgr::LoadAndAppendIconL( + const TDesC& aMbmFileName, + TInt aIconIdInFile ) + { + CGulIcon* icon = LoadIconL( aMbmFileName, aIconIdInFile ); + CleanupStack::PushL( icon ); + iArray->AppendL( icon ); + CleanupStack::Pop( icon ); + // Added for avoiding returning -1 as bitmap Index + if (iArray->Count() > 0) + { + return iArray->Count() - 1; + } + else + { + return 0; + } + } + +// ---------------------------------------------------- +// CLmkSelectorIconMgr::CreateIconMgrItemL +// ---------------------------------------------------- +// +TInt CLmkSelectorIconMgr::CreateIconMgrItemL( + const TDesC& aMbmFileName, + TInt aIconIdInFile ) + { + TIconData tmp; + + + tmp.iFileIndex = AppendedIconFileIndexL( aMbmFileName ); + tmp.iIconIndexWithinFile = aIconIdInFile; + + User::LeaveIfError( iCache.Append( tmp ) ); + if (iCache.Count() > 0) + { + return iCache.Count() - 1; + } + else + { + return 0; + } + } + +// ---------------------------------------------------- +// CLmkSelectorIconMgr::AppendedIconFileIndexL +// ---------------------------------------------------- +// +TInt CLmkSelectorIconMgr::AppendedIconFileIndexL( const TDesC& aMbmFileName ) + { + TInt position( 0 ); + if ( iIconFiles->Find( aMbmFileName, position, ECmpNormal ) != 0 ) + { // file does not yet exist in the file name array + iIconFiles->AppendL( aMbmFileName ); + return iIconFiles->Count() - 1; + } + else + { // file already exists, just return its position + return position; + } + } + +// End of File