diff -r ebe688cedc25 -r 7fdbb852d323 messagingappbase/mce/src/MceOneRowMessageListBitmapResolver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingappbase/mce/src/MceOneRowMessageListBitmapResolver.cpp Wed Sep 01 12:31:54 2010 +0100 @@ -0,0 +1,650 @@ +/* +* Copyright (c) 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: +* Handles different mce bitmaps. +* First collects all the bitmaps from different mtm's and also local +* folder's bitmaps to icon array. +* +*/ + + + +// INCLUDE FILES +#include "MceOneRowMessageListBitmapResolver.h" +#include // cbasemtmuidata +#include "MtmRegistryObserver.h" // mmtmuidataregistryobserver +#include +#include // fixed entry ids +#include // CGulIcon +#include // cakniconarray +#include // CFbsFont +#include // bitmap enums +#include // bitmap enums +#include // EMtudEntryStateOpen +#include // mtm uids +#include + +#include "MceUtils.h" + +// security data caging +#include +#include +#include + + +// LOCAL CONSTANTS AND MACROS + +_LIT( KMceDirAndFileMuiu,"muiu.mbm" ); + +const TInt KMceIconArrayGranularity = 10; + +// ================= MEMBER FUNCTIONS ======================= + +CMceOneRowBitmapResolver* CMceOneRowBitmapResolver::NewL( + CMsvSessionPtr aSession, + MMtmUiDataRegistryObserver& aRegObserver ) + { // static + CMceOneRowBitmapResolver* self=new(ELeave) CMceOneRowBitmapResolver( + aSession, + aRegObserver ); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); // self + return self; + } + +CMceOneRowBitmapResolver::CMceOneRowBitmapResolver( + CMsvSessionPtr aSession, + MMtmUiDataRegistryObserver& aRegObserver ) + : + iRegObserver( aRegObserver ), + iSession( aSession ), + iBitmapsLoaded( 0 ) + { + } + +CMceOneRowBitmapResolver::~CMceOneRowBitmapResolver() + { + if ( iIcons ) + { + iIcons->ResetAndDestroy(); + } + delete iIcons; + iIconArray.Close(); + } + + +// ---------------------------------------------------- +// CMceOneRowBitmapResolver::ConstructL +// ---------------------------------------------------- +void CMceOneRowBitmapResolver::ConstructL() + { + // security data caging + TParse fp; + fp.Set( AknIconUtils::AvkonIconFileName(), &KDC_RESOURCE_FILES_DIR , NULL ); + iFilenameAvkon = fp.FullName(); + + fp.Set( KMceDirAndFileMuiu, &KDC_APP_BITMAP_DIR , NULL ); + iFilenameMuiu = fp.FullName(); + + iIcons = new(ELeave) CAknIconArray( KMceIconArrayGranularity ); + ChangeBitmapInIconArrayL(); + + iIconArray.Reset(); + for ( TInt i = EMceBitmapIndexUnknown; i < EMceBitmapIndexLastIconIndex; i++ ) + { + TMceHierListIconEntry iconEntry; + iconEntry.iBitmapPointer = 0; + iconEntry.iIconId = 0; + iIconArray.AppendL( iconEntry ); + } + + } + +// ---------------------------------------------------- +// CMceOneRowBitmapResolver::CreateAndAppendIconL +// ---------------------------------------------------- +void CMceOneRowBitmapResolver::CreateAndAppendIconL( + MAknsSkinInstance* aSkin, + TAknsItemID aId, + const TDesC& aFileName, + TInt aBitmapIndex, + TMceOneRowBitmapLoadType aBitmapType ) + { + CFbsBitmap* bitmap = NULL; + CFbsBitmap* mask = NULL; + + if ( aBitmapType == EMceOneRowBitmapLoadNormal ) + { + AknsUtils::CreateIconL( + aSkin, + aId, + bitmap, + mask, + aFileName, + aBitmapIndex, + aBitmapIndex + 1 ); + + } + else if ( aBitmapType == EMceOneRowBitmapLoadSkinned ) + { + AknsUtils::CreateColorIconL( + aSkin, + aId, + KAknsIIDQsnIconColors, + EAknsCIQsnIconColorsCG13, + bitmap, + mask, + aFileName, + aBitmapIndex, + aBitmapIndex + 1, + KRgbBlack ); + } + else + { + AknsUtils::CreateColorIconL( + aSkin, + aId, + KAknsIIDQsnIconColors, + EAknsCIQsnIconColorsCG16, + bitmap, + mask, + aFileName, + aBitmapIndex, + aBitmapIndex + 1, + KRgbBlack ); + } + CGulIcon* icon = CGulIcon::NewL( bitmap, mask ); + + CleanupStack::PushL( icon ); + iIcons->AppendL( icon ); + CleanupStack::Pop(); // icon + + iBitmapsLoaded = iIcons->Count(); + } + + +// ---------------------------------------------------- +// CMceOneRowBitmapResolver::IconArray +// ---------------------------------------------------- +CArrayPtrFlat* CMceOneRowBitmapResolver::IconArray() + { + return iIcons; + } + +// ---------------------------------------------------- +// CMceOneRowBitmapResolver::BitmapIndex +// ---------------------------------------------------- +TInt CMceOneRowBitmapResolver::BitmapIndex( const TMsvEntry& aEntry ) + { + TInt foundIndex = KErrNotFound; + const TMsvId id = aEntry.Id(); + if ( aEntry.iMtm == KUidMsvLocalServiceMtm && + aEntry.iType == KUidMsvFolderEntry ) + { + foundIndex = LocalEntryBitmapIndex( id ); + + // check if folder has unread messages + if ( id == KMsvGlobalInBoxIndexEntryId || +// id == KMceDocumentsEntryId || + id >= KFirstFreeEntryId + ) + { + TBool unreadMessages = EFalse; + TRAPD(err, ( unreadMessages = HasUnreadMessagesL( id ) ) ); + if (err == KErrNone && unreadMessages ) + { + foundIndex++; + } + } + } + + if ( foundIndex == KErrNotFound ) + { + TRAPD(err, ( foundIndex = LoadBitmapL( aEntry ) ) ); + if (err != KErrNone ) + { + foundIndex = KErrNotFound; + } + } + + return ( foundIndex == KErrNotFound ? + EMceBitmapIndexUnknown : foundIndex ); + } + +// ---------------------------------------------------- +// CMceOneRowBitmapResolver::LoadBitmapL +// ---------------------------------------------------- +TInt CMceOneRowBitmapResolver::LoadBitmapL( const TMsvEntry& aEntry ) + { + CBaseMtmUiData* uiData = iRegObserver.GetMtmUiDataL(aEntry.iMtm); + + if ( uiData ) + { + TInt flags = 0; + if ( aEntry.iType.iUid == KUidMsvServiceEntryValue || + aEntry.iType == KUidMsvFolderEntry) + { + TBool unreadMessages = EFalse; + TRAPD( err, ( unreadMessages = HasUnreadMessagesL( aEntry.Id() ) ) ); + // leave error codes are filtered, because it is not important to know + // if there are unread messages or not, + // just different icon would be displayed + if (err == KErrNone && unreadMessages ) + { + flags = EMtudEntryStateOpen; // includes unread messages + } + + //check for sub folders + + TMsvSelectionOrdering selectionOrdering( KMsvGroupByType, EMsvSortByNone, ETrue ); + CMsvEntry* entry = iSession->GetEntryL( aEntry.Id() ); + entry->SetSortTypeL( selectionOrdering ); + CleanupStack::PushL( entry ); + TInt index = entry->Count()-1; + while ( ( index>=0 ) && ( (*entry)[index].iType != KUidMsvFolderEntry ) ) + { + index--; + } + CleanupStack::PopAndDestroy( entry ); + if( index != -1 ) + { + flags |= EMtudEntryStateSubFolder; + } + + } + + const CBaseMtmUiData::CBitmapArray* bitmaps = NULL; + bitmaps = &uiData->ContextIcon( aEntry, flags ); + + if ( bitmaps ) + { + CGulIcon* tempBmp = NULL; + + if ( bitmaps->Count() == 1 ) + { + tempBmp = CGulIcon::NewL( bitmaps->At( 0 ) ); + } + else if ( bitmaps->Count() > 1 ) + { + tempBmp = CGulIcon::NewL( bitmaps->At( 0 ), bitmaps->At( 1 ) ); + } + + if ( tempBmp ) + { + CleanupStack::PushL( tempBmp ); + tempBmp->SetBitmapsOwnedExternally( ETrue ); + + TInt index = iIcons->Count() - 1; + iIcons->AppendL( tempBmp ); // Array will be of count 22 + // index greater than 20 so 21 or 22 + if ( index > iBitmapsLoaded ) + { + while ( iIcons->Count() != iBitmapsLoaded+1 ) + { + CGulIcon* iconToBeDelete = iIcons->At( index ); + iIcons->Delete( index ); + delete iconToBeDelete; + index--; + } + } + else + { + CGulIcon* iconToBeDelete = iIcons->At( index ); + iIcons->Delete( index ); + delete iconToBeDelete; + } + + CleanupStack::Pop(); // tempBmp + } + } + else + { + return KErrNotFound; + } + } + else + { + // something is wrong + return EMceBitmapIndexUnknown; + } + return iIcons->Count() - 1; + } + + +// ---------------------------------------------------- +// CMceOneRowBitmapResolver::GetBitmapL +// ---------------------------------------------------- +TInt CMceOneRowBitmapResolver::GetBitmapL( TMsvEntry& aEntry, CFbsBitmap*& aBitmap, CFbsBitmap*& aMask ) + { + TInt index = BitmapIndex( aEntry ); + if ( index >= 0 ) + { + CFbsBitmap* bitmap = NULL; + CFbsBitmap* bitmapMask = NULL; + CGulIcon* foundIcon = iIcons->At( index ); + bitmap = foundIcon->Bitmap(); + bitmapMask = foundIcon->Mask(); + aBitmap = bitmap; + aMask = bitmapMask; + + // if this is found from the array already + index = KErrNotFound; + const TInt iconCount = iIconArray.Count(); + for (TInt i = 0; i < iconCount && index == KErrNotFound; i++) + { + if ( iIconArray.operator[](i).iBitmapPointer == bitmap ) + { + index = iIconArray.operator[](i).iIconId; + } + } + } + + return (index < 0 ? KErrNotFound : index ); + } + +// ---------------------------------------------------- +// CMceOneRowBitmapResolver::GetBitmapL +// ---------------------------------------------------- +TInt CMceOneRowBitmapResolver::GetBitmapL( TMceBitmapArrayIndexes aBitmapIndex, CFbsBitmap*& aBitmap, CFbsBitmap*& aMask ) + { + // or should it be ok just return iIconArray.operator[](aBitmapIndex).iIconId; + CGulIcon* foundIcon = iIcons->At( aBitmapIndex ); + CFbsBitmap* bitmap = NULL; + CFbsBitmap* bitmapMask = NULL; + bitmap = foundIcon->Bitmap(); + bitmapMask = foundIcon->Mask(); + aBitmap = bitmap; + aMask = bitmapMask; + + // if this is found from the array already + TInt index = KErrNotFound; + const TInt iconCount = iIconArray.Count(); + for (TInt i = 0; i < iconCount && index == KErrNotFound; i++) + { + if ( iIconArray.operator[](i).iBitmapPointer == bitmap ) + { + index = iIconArray.operator[](i).iIconId; + } + } + return index; + } + +// ---------------------------------------------------- +// CMceOneRowBitmapResolver::AddTreeIconIdL +// ---------------------------------------------------- +TInt CMceOneRowBitmapResolver::AddTreeIconIdL( + CFbsBitmap* aBitmap, + TInt aTreeIconIndex, + TUid aMtmUid ) + { + TMceHierListIconEntry iconEntry; + iconEntry.iBitmapPointer = aBitmap; + iconEntry.iIconId = aTreeIconIndex; + iconEntry.iMtmUid = aMtmUid; + iIconArray.AppendL( iconEntry ); + return iIconArray.Count(); + } + +// ---------------------------------------------------- +// CMceOneRowBitmapResolver::SetTreeIconId +// ---------------------------------------------------- +void CMceOneRowBitmapResolver::SetTreeIconId( TMceBitmapArrayIndexes aBitmapIndex, TInt aTreeIconIndex ) + { + iIconArray.operator[](aBitmapIndex).iIconId = aTreeIconIndex; + } + +// ---------------------------------------------------- +// CMceOneRowBitmapResolver::TreeIconId +// ---------------------------------------------------- +TInt CMceOneRowBitmapResolver::TreeIconId( TMceBitmapArrayIndexes aBitmapIndex ) + { + return iIconArray.operator[](aBitmapIndex).iIconId; + } + + + +// ---------------------------------------------------- +// CMceOneRowBitmapResolver::HasUnreadMessagesL +// ---------------------------------------------------- +TBool CMceOneRowBitmapResolver::HasUnreadMessagesL( const TMsvId aId ) + { + TBool unreadMessages = EFalse; + CMsvEntry* entry = iSession->GetEntryL( aId ); + CleanupStack::PushL( entry ); + + const TInt count = entry->Count(); + for ( TInt loop = 0; !unreadMessages && loop < count; loop++ ) + { + if ( (*entry)[loop].iType.iUid == KUidMsvFolderEntryValue ) + { + unreadMessages = HasUnreadMessagesL( (*entry)[loop].Id() ); + } + else + { + unreadMessages = (*entry)[loop].Unread(); + } + } + + CleanupStack::PopAndDestroy(); // entry + + return unreadMessages; + } + +// ---------------------------------------------------- +// CMceOneRowBitmapResolver::LocalEntryBitmapIndex +// ---------------------------------------------------- +TInt CMceOneRowBitmapResolver::LocalEntryBitmapIndex( TMsvId aEntryId ) const + { + TInt foundIndex = EMceBitmapIndexFolderSmall; + switch( aEntryId ) + { + case 0x1009: //KMceTemplatesEntryId: + foundIndex = EMceBitmapIndexFolderTemp; + break; + default: + // set in foundIndex declaration + break; + } + return foundIndex; + } + +// ---------------------------------------------------- +// CMceOneRowBitmapResolver::ChangeBitmapInIconArrayL +// ---------------------------------------------------- +void CMceOneRowBitmapResolver::ChangeBitmapInIconArrayL( ) + { + if ( !iIcons ) + { + // should not happen! + return; + } + + iIcons->ResetAndDestroy(); + + MAknsSkinInstance* skins = AknsUtils::SkinInstance(); + CreateAndAppendIconL( + skins, + KAknsIIDQgnPropMceUnknownRead, + iFilenameMuiu, + EMbmMuiuQgn_prop_mce_unknown_read, + EMceOneRowBitmapLoadNormal ); + + CreateAndAppendIconL( + skins, + KAknsIIDQgnPropMceTemplate, + iFilenameAvkon, + EMbmAvkonQgn_prop_folder_temp, + EMceOneRowBitmapLoadNormal ); + + CreateAndAppendIconL( + skins, + KAknsIIDQgnPropFolderSmall, + iFilenameAvkon, + EMbmAvkonQgn_prop_folder_small, + EMceOneRowBitmapLoadNormal ); + + CreateAndAppendIconL( + skins, + KAknsIIDQgnPropFolderSmallNew, + iFilenameAvkon, + EMbmAvkonQgn_prop_folder_small_new, + EMceOneRowBitmapLoadNormal ); + + CreateAndAppendIconL( + skins, + KAknsIIDQgnIndiAttachementAdd, + iFilenameMuiu, + EMbmMuiuQgn_indi_attach_add, + EMceOneRowBitmapLoadSkinned ); + + CreateAndAppendIconL( + skins, + KAknsIIDQgnIndiAttachementAdd, + iFilenameMuiu, + EMbmMuiuQgn_indi_attach_add, + EMceOneRowBitmapLoadSkinnedHighlight ); + + CreateAndAppendIconL( + skins, + KAknsIIDQgnIndiMcePriorityHigh, + iFilenameAvkon, + EMbmAvkonQgn_indi_mce_priority_high, + EMceOneRowBitmapLoadSkinned ); + + CreateAndAppendIconL( + skins, + KAknsIIDQgnIndiMcePriorityHigh, + iFilenameAvkon, + EMbmAvkonQgn_indi_mce_priority_high, + EMceOneRowBitmapLoadSkinnedHighlight ); + + CreateAndAppendIconL( + skins, + KAknsIIDQgnIndiMcePriorityLow, + iFilenameAvkon, + EMbmAvkonQgn_indi_mce_priority_low, + EMceOneRowBitmapLoadSkinned ); + + CreateAndAppendIconL( + skins, + KAknsIIDQgnIndiMcePriorityLow, + iFilenameAvkon, + EMbmAvkonQgn_indi_mce_priority_low, + EMceOneRowBitmapLoadSkinnedHighlight ); + + CreateAndAppendIconL( + skins, + KAknsIIDQgnPropMceSubSender, + iFilenameMuiu, + EMbmMuiuQgn_prop_mce_sub_sender, + EMceOneRowBitmapLoadNormal ); + + CreateAndAppendIconL( + skins, + KAknsIIDQgnPropMceSubSenderUnread, + iFilenameMuiu, + EMbmMuiuQgn_prop_mce_sub_sender_unread, + EMceOneRowBitmapLoadNormal ); + + CreateAndAppendIconL( + skins, + KAknsIIDQgnPropMceSubSubject, + iFilenameMuiu, + EMbmMuiuQgn_prop_mce_sub_subject, + EMceOneRowBitmapLoadNormal); + + CreateAndAppendIconL( + skins, + KAknsIIDQgnPropMceSubSubjectUnread, + iFilenameMuiu, + EMbmMuiuQgn_prop_mce_sub_subject_unread, + EMceOneRowBitmapLoadNormal ); + + CreateAndAppendIconL( + skins, + KAknsIIDQgnPropMceSubTime, + iFilenameMuiu, + EMbmMuiuQgn_prop_mce_sub_time, + EMceOneRowBitmapLoadNormal ); + + CreateAndAppendIconL( + skins, + KAknsIIDQgnPropMceSubTimeUnread, + iFilenameMuiu, + EMbmMuiuQgn_prop_mce_sub_time_unread, + EMceOneRowBitmapLoadNormal ); + + // add one dummy item which will be replaced when querying message items icons + CreateAndAppendIconL( + skins, + KAknsIIDQgnPropMceUnknownRead, + iFilenameMuiu, + EMbmMuiuQgn_prop_mce_unknown_read, + EMceOneRowBitmapLoadNormal ); + + } + +// ---------------------------------------------------- +// CMceOneRowBitmapResolver::SkinChangedL +// ---------------------------------------------------- +void CMceOneRowBitmapResolver::SkinChangedL( CAknSingleColumnStyleTreeList* aListbox ) + { + // first update default icons... + ChangeBitmapInIconArrayL(); + // then assign new bitmaps to tree listbox + TInt i = 0; + for ( i = EMceBitmapIndexUnknown; i < EMceBitmapIndexLastIconIndex; i++ ) + { + CFbsBitmap* bitmap = NULL; + CFbsBitmap* bitmapMask = NULL; + if ( GetBitmapL( (TMceBitmapArrayIndexes)i, bitmap, bitmapMask ) < 0 ) + { + aListbox->AssignIconL( + iIconArray.operator[](i).iIconId, + bitmap, + bitmapMask, + EFalse, + EAspectRatioPreserved ); + iIconArray.operator[](i).iBitmapPointer = bitmap; + } + } + + // and then remove all the messaging icons + const TInt count = iIconArray.Count(); + for ( i = iIconArray.Count()-1; i > EMceBitmapIndexLastIconIndex-1; i-- ) + { + aListbox->RemoveIconL( iIconArray.operator[](i).iIconId ); + iIconArray.Remove( i ); + } + // and finally start refresh of the list, that will re-load all the messaging icons + } + + +// ---------------------------------------------------- +// CMceOneRowBitmapResolver::UpdateIconArrayL +// ---------------------------------------------------- +void CMceOneRowBitmapResolver::UpdateIconArrayL( CAknSingleColumnStyleTreeList* aListbox ) + { + for ( TInt i = iIconArray.Count()-1; i > EMceBitmapIndexLastIconIndex-1; i-- ) + { + if ( !MceUtils::IsMtmBuiltIn( iIconArray.operator[](i).iMtmUid ) ) + { + aListbox->RemoveIconL( iIconArray.operator[](i).iIconId ); + iIconArray.Remove( i ); + } + } + } + +// End of File