diff -r 000000000000 -r e686773b3f54 phonebookui/Phonebook2/ccapplication/ccacommlauncherplugin/src/ccappcommlauncherheadertextorder.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Phonebook2/ccapplication/ccacommlauncherplugin/src/ccappcommlauncherheadertextorder.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,982 @@ +/* +* Copyright (c) 2008-2008 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: Implementation of the class which takes care of placing the correct texts in the header +* +*/ + +#include "ccappcommlauncherheaders.h" +#include "cmscontact.h" +#include +#include +#include +#include + +const TInt KContactTypeNotSet = -1; + +namespace { + +/// These enumerations must have same values as in the specification +/// and in the qtn_phob_name_order. These are different compared to +/// TPbk2NameOrderInCenRep because TPbk2NameOrderInCenRep values +/// must be same as in old PbkEng TPbkNameOrder to keep data compatibility +/// of the CenRep. +enum TPbk2NameOrderInUiSpecification + { + EPbk2UiSpecFirstNameLastName, + EPbk2UiSpecLastNameFirstName + }; + +#ifdef _DEBUG + +enum TPanicCode + { + EPanicInvalidNameConfiguration + }; + +void Panic(TPanicCode aReason) + { + _LIT(KPanicText, "CPbk2SortOrderManagerImpl"); + User::Panic(KPanicText,aReason); + } + +#endif // _DEBUG + +/** + * Gets a digit from a descriptor. + * + * @param aReaderToBuf Resource reader pointed to a descriptor resource. + * @return The digit. + */ +TInt GetDigitFromDescriptorL( TResourceReader& aReaderToBuf ) + { + HBufC* orderBuf = aReaderToBuf.ReadHBufCL(); + CleanupStack::PushL( orderBuf ); + + // The setting should be 1 digit + __ASSERT_DEBUG( orderBuf->Length() == 1, + Panic( EPanicInvalidNameConfiguration ) ); + + TInt result = KErrNotFound; + TPtrC ptr( orderBuf->Des() ); + if ( ptr.Length() > 0 && TChar(ptr[0]).IsDigit() ) + { + result = TChar(ptr[0]).GetNumericValue(); + } + + CleanupStack::PopAndDestroy( orderBuf ); + return result; + } +} // namespace + +// --------------------------------------------------------------------------- +// NewL, two-phase construction +// --------------------------------------------------------------------------- +// +CCCAppCommLauncherHeaderTextOrder* CCCAppCommLauncherHeaderTextOrder::NewL() + { + CCCAppCommLauncherHeaderTextOrder* self= new (ELeave) CCCAppCommLauncherHeaderTextOrder(); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +// --------------------------------------------------------------------------- +// C++ (first phase) constructor +// --------------------------------------------------------------------------- +// +CCCAppCommLauncherHeaderTextOrder::CCCAppCommLauncherHeaderTextOrder() + { + for (TInt i=0; i < KCCAppCommLauncherHeaderTextOrderLastField - KCCAppCommLauncherHeaderTextOrderFirstField + 1; i++) + { + iGroupPriorities[i] = NULL; + iIndividualPriorities[i] = NULL; + } + + // Group 8 + SetPriority(CCmsContactFieldItem::ECmsImpp, ETrue, 1); + SetPriority(CCmsContactFieldItem::ECmsUrlGeneric, ETrue, 1); + SetPriority(CCmsContactFieldItem::ECmsUrlHome, ETrue, 1); + SetPriority(CCmsContactFieldItem::ECmsUrlWork, ETrue, 1); + SetPriority(CCmsContactFieldItem::ECmsSipAddress, ETrue, 1); + SetPriority(CCmsContactFieldItem::ECmsEmailGeneric, ETrue, 1); + SetPriority(CCmsContactFieldItem::ECmsEmailHome, ETrue, 1); + SetPriority(CCmsContactFieldItem::ECmsEmailWork, ETrue, 1); + SetPriority(CCmsContactFieldItem::ECmsMobilePhoneGeneric, ETrue, 1); + SetPriority(CCmsContactFieldItem::ECmsMobilePhoneHome, ETrue, 1); + SetPriority(CCmsContactFieldItem::ECmsMobilePhoneWork, ETrue, 1); + SetPriority(CCmsContactFieldItem::ECmsLandPhoneGeneric, ETrue, 1); + SetPriority(CCmsContactFieldItem::ECmsLandPhoneHome, ETrue, 1); + SetPriority(CCmsContactFieldItem::ECmsLandPhoneWork, ETrue, 1); + SetPriority(CCmsContactFieldItem::ECmsVideoNumberGeneric, ETrue, 1); + SetPriority(CCmsContactFieldItem::ECmsVideoNumberHome, ETrue, 1); + SetPriority(CCmsContactFieldItem::ECmsVideoNumberWork, ETrue, 1); + SetPriority(CCmsContactFieldItem::ECmsAssistantNumber, ETrue, 1); + SetPriority(CCmsContactFieldItem::ECmsCarPhone, ETrue, 1); + SetPriority(CCmsContactFieldItem::ECmsPagerNumber, ETrue, 1); + SetPriority(CCmsContactFieldItem::ECmsPushToTalk, ETrue, 1); + SetPriority(CCmsContactFieldItem::ECmsShareView, ETrue, 1); + + SetPriority(CCmsContactFieldItem::ECmsVoipNumberGeneric, ETrue, 1); + + SetPriority(CCmsContactFieldItem::ECmsImpp, EFalse, 1); + + SetPriority(CCmsContactFieldItem::ECmsUrlWork, EFalse, 2); + SetPriority(CCmsContactFieldItem::ECmsUrlHome, EFalse, 3); + SetPriority(CCmsContactFieldItem::ECmsUrlGeneric, EFalse, 4); + + SetPriority(CCmsContactFieldItem::ECmsSipAddress, EFalse, 5); + SetPriority(CCmsContactFieldItem::ECmsShareView, EFalse, 6); + SetPriority(CCmsContactFieldItem::ECmsPushToTalk, EFalse, 7); + + SetPriority(CCmsContactFieldItem::ECmsEmailWork, EFalse, 8); + SetPriority(CCmsContactFieldItem::ECmsEmailHome, EFalse, 9); + SetPriority(CCmsContactFieldItem::ECmsEmailGeneric, EFalse, 10); + + SetPriority(CCmsContactFieldItem::ECmsAssistantNumber, EFalse, 11); + SetPriority(CCmsContactFieldItem::ECmsPagerNumber, EFalse, 12); + SetPriority(CCmsContactFieldItem::ECmsVideoNumberWork, EFalse, 13); + SetPriority(CCmsContactFieldItem::ECmsVideoNumberHome, EFalse, 14); + SetPriority(CCmsContactFieldItem::ECmsVideoNumberGeneric, EFalse, 15); + SetPriority(CCmsContactFieldItem::ECmsCarPhone, EFalse, 16); + SetPriority(CCmsContactFieldItem::ECmsLandPhoneWork, EFalse, 17); + SetPriority(CCmsContactFieldItem::ECmsLandPhoneHome, EFalse, 18); + SetPriority(CCmsContactFieldItem::ECmsLandPhoneGeneric, EFalse, 19); + SetPriority(CCmsContactFieldItem::ECmsMobilePhoneWork, EFalse, 20); + SetPriority(CCmsContactFieldItem::ECmsMobilePhoneHome, EFalse, 21); + SetPriority(CCmsContactFieldItem::ECmsMobilePhoneGeneric, EFalse, 22); + + + // Group 7 + SetPriority(CCmsContactFieldItem::ECmsLastName, ETrue, 2); + SetPriority(CCmsContactFieldItem::ECmsMiddleName, ETrue, 2); + SetPriority(CCmsContactFieldItem::ECmsFirstName, ETrue, 2); + + SetPriority(CCmsContactFieldItem::ECmsLastName, EFalse, 1); + SetPriority(CCmsContactFieldItem::ECmsMiddleName, EFalse, 2); + SetPriority(CCmsContactFieldItem::ECmsFirstName, EFalse, 3); + + + // Group 6 + SetPriority(CCmsContactFieldItem::ECmsAddrCountryGeneric, ETrue, 3); + SetPriority(CCmsContactFieldItem::ECmsAddrRegionGeneric, ETrue, 3); + SetPriority(CCmsContactFieldItem::ECmsAddrLocalGeneric, ETrue, 3); + SetPriority(CCmsContactFieldItem::ECmsAddrStreetGeneric, ETrue, 3); + + SetPriority(CCmsContactFieldItem::ECmsAddrCountryGeneric, EFalse, 1); + SetPriority(CCmsContactFieldItem::ECmsAddrRegionGeneric, EFalse, 2); + SetPriority(CCmsContactFieldItem::ECmsAddrLocalGeneric, EFalse, 3); + SetPriority(CCmsContactFieldItem::ECmsAddrStreetGeneric, EFalse, 4); + + + // Group 5 + SetPriority(CCmsContactFieldItem::ECmsAddrCountryWork, ETrue, 4); + SetPriority(CCmsContactFieldItem::ECmsAddrRegionWork, ETrue, 4); + SetPriority(CCmsContactFieldItem::ECmsAddrLocalWork, ETrue, 4); + SetPriority(CCmsContactFieldItem::ECmsAddrStreetWork, ETrue, 4); + + SetPriority(CCmsContactFieldItem::ECmsAddrCountryWork, EFalse, 1); + SetPriority(CCmsContactFieldItem::ECmsAddrRegionWork, EFalse, 2); + SetPriority(CCmsContactFieldItem::ECmsAddrLocalWork, EFalse, 3); + SetPriority(CCmsContactFieldItem::ECmsAddrStreetWork, EFalse, 4); + + + // Group 4 + SetPriority(CCmsContactFieldItem::ECmsAddrCountryHome, ETrue, 5); + SetPriority(CCmsContactFieldItem::ECmsAddrRegionHome, ETrue, 5); + SetPriority(CCmsContactFieldItem::ECmsAddrLocalHome, ETrue, 5); + SetPriority(CCmsContactFieldItem::ECmsAddrStreetHome, ETrue, 5); + + SetPriority(CCmsContactFieldItem::ECmsAddrCountryHome, EFalse, 1); + SetPriority(CCmsContactFieldItem::ECmsAddrRegionHome, EFalse, 2); + SetPriority(CCmsContactFieldItem::ECmsAddrLocalHome, EFalse, 3); + SetPriority(CCmsContactFieldItem::ECmsAddrStreetHome, EFalse, 4); + + + // Group 3 (prio 6) + SetPriority(CCmsContactFieldItem::ECmsDepartment, ETrue, 6); + SetPriority(CCmsContactFieldItem::ECmsCompanyName, ETrue, 6); + SetPriority(CCmsContactFieldItem::ECmsJobTitle, ETrue, 6); + SetPriority(CCmsContactFieldItem::ECmsNickname, ETrue, 6); + + SetPriority(CCmsContactFieldItem::ECmsDepartment, EFalse, 1); + SetPriority(CCmsContactFieldItem::ECmsCompanyName, EFalse, 2); + SetPriority(CCmsContactFieldItem::ECmsJobTitle, EFalse, 3); + SetPriority(CCmsContactFieldItem::ECmsNickname, EFalse, 4); + + + // Group 1 (prio 7) + SetPriority(CCmsContactFieldItem::ECmsNote, ETrue, 7); + + SetPriority(CCmsContactFieldItem::ECmsNote, EFalse, 1); + + } + +// --------------------------------------------------------------------------- +// Helper function for reading a descriptor from repository +// --------------------------------------------------------------------------- +// +HBufC* GetStringFromRepoLC(CRepository* aRepository, TUint32 aKey) + { + HBufC* prioStr = HBufC::NewLC(NCentralRepositoryConstants::KMaxUnicodeStringLength); + TInt trueLength = 0; + TPtr ptr = prioStr->Des(); + TInt error = aRepository->Get(aKey, ptr, trueLength); + if (error == KErrOverflow) + { + CleanupStack::PopAndDestroy(prioStr); + prioStr = HBufC::NewLC(trueLength); + User::LeaveIfError(aRepository->Get(aKey, ptr)); + } + else if (error != KErrNone) + { +#ifdef _DEBUG + CCA_DP(KCommLauncherLogFile, CCA_L("CCCAppCommLauncherHeaderTextOrder::getStringFromRepoLC - Header text priority variation error (repository field)")); + CCA_DP(KCommLauncherLogFile, CCA_L("CCCAppCommLauncherHeaderTextOrder::getStringFromRepoLC - err: %d"), error ); + CEikonEnv::Static()->InfoMsg(_L("Header text priority variation error. See logs.")); +#endif//_DEBUG + CleanupStack::PopAndDestroy(prioStr); + return 0; + } + return prioStr; + } + +// --------------------------------------------------------------------------- +// ConstructL, second phase constructor +// --------------------------------------------------------------------------- +// +void CCCAppCommLauncherHeaderTextOrder::ConstructL() + { + for (TInt i = 0; i < KCCAppCommLauncherHeaderTextOrderLineCount; i++) + { + iHeaderRows.AppendL(0); + iHeaderRowsClipped.AppendL(0); + iHeaderTypes[i] = KContactTypeNotSet; + } + + CRepository* prioOrderRepo = CRepository::NewLC(KCRUidCCACommLauncher); + HBufC* prioStr = 0; + + HBufC* prioStr1 = GetStringFromRepoLC(prioOrderRepo, KHeaderGroupPriorities); + User::LeaveIfNull(prioStr1); + + HBufC* prioStr2 = GetStringFromRepoLC(prioOrderRepo, KHeaderGroupPriorities2); + if (prioStr2) + { + prioStr = HBufC::NewL(prioStr1->Length() + prioStr2->Length()); + prioStr->Des().Append(*prioStr1); + prioStr->Des().Append(*prioStr2); + CleanupStack::PopAndDestroy(prioStr2); + CleanupStack::PopAndDestroy(prioStr1); + CleanupStack::PushL(prioStr); + } + else + { + prioStr = prioStr1; + } + + + TLex groupPrioLex(*prioStr); + while (groupPrioLex.Offset() < prioStr->Length() - 1) + { + TPtrC nameToken = groupPrioLex.NextToken(); + CCmsContactFieldItem::TCmsContactField type; + if (MapStringToContactField(nameToken, type) == KErrNone) + { + TPtrC numToken = groupPrioLex.NextToken(); + TPtrC numToken2 = groupPrioLex.NextToken(); + TLex groupPrioNumLex(numToken); + TLex individualPrioNumLex(numToken2); + TInt priority = 0; + if (groupPrioNumLex.Val(priority) == KErrNone) + { + SetPriority(type, ETrue, priority); + } +#ifdef _DEBUG_ + else + { + CCA_DP(KCommLauncherLogFile, CCA_L("CCCAppCommLauncherHeaderTextOrder::ConstructL - Priority value is not a number: %S"), &numToken ); + CEikonEnv::Static()->InfoMsg(_L("Header text priority variation error. See logs.")); + } +#endif //_DEBUG_ + if (individualPrioNumLex.Val(priority) == KErrNone) + { + SetPriority(type, EFalse, priority); + } +#ifdef _DEBUG_ + else + { + CCA_DP(KCommLauncherLogFile, CCA_L("CCCAppCommLauncherHeaderTextOrder::ConstructL - Priority value is not a number: %S"), &numToken ); + CEikonEnv::Static()->InfoMsg(_L("Header text priority variation error. See logs.")); + } +#endif //_DEBUG_ + } +#ifdef _DEBUG + else + { + CCA_DP(KCommLauncherLogFile, CCA_L("CCCAppCommLauncherHeaderTextOrder::ConstructL - Header text priority variation, field name not recognized)")); + CCA_DP(KCommLauncherLogFile, CCA_L("CCCAppCommLauncherHeaderTextOrder::ConstructL - field name: %S"), &nameToken ); + } +#endif //_DEBUG + } + CleanupStack::PopAndDestroy(prioStr); + + CleanupStack::PopAndDestroy(prioOrderRepo); + + // Open resource file for reading language specific default values + RPbk2LocalizedResourceFile resFile; + resFile.OpenLC( KPbk2RomFileDrive, + KDC_RESOURCE_FILES_DIR, + Pbk2PresentationUtils::PresentationResourceFile() ); + + // Read the name order value from the resource file + TResourceReader reader; + reader.SetBuffer( resFile.AllocReadLC( R_QTN_PHOB_NAME_ORDER ) ); + TInt orderInResFile = GetDigitFromDescriptorL( reader ); + CleanupStack::PopAndDestroy(); // reader + + CleanupStack::PopAndDestroy(); // resFile + + // Converting from TPbk2NameOrderInUiSpecification to TPbk2NameOrderInCenRep + TInt orderInCenRep = EPbk2CenRepNameOrderUndefined; + + CRepository* sortOrderSettings = CRepository::NewLC(TUid::Uid(KCRUidPhonebook)); + sortOrderSettings->Get(KPhonebookNameOrdering, orderInCenRep); + + switch ( orderInResFile ) + { + case EPbk2UiSpecLastNameFirstName: + { + orderInCenRep = EPbk2CenRepLastNameFirstName; + break; + } + + case EPbk2UiSpecFirstNameLastName: // FALL THROUGH + + // If the name order is not defined in the UI Specification, + // and... + default: + { + // ... also not defined in the CenRep, + // then use the "First Name" "Last Name" order + // for most number of languages. + if ( EPbk2CenRepNameOrderUndefined == orderInCenRep ) + { + orderInCenRep = EPbk2CenRepFirstNameLastName; + } + break; + } + + } // end switch + + if (orderInCenRep == EPbk2CenRepLastNameFirstName) + { + SetPriority(CCmsContactFieldItem::ECmsMiddleName, EFalse, 1); + SetPriority(CCmsContactFieldItem::ECmsFirstName, EFalse, 2); + SetPriority(CCmsContactFieldItem::ECmsLastName, EFalse, 3); + } + else + { + SetPriority(CCmsContactFieldItem::ECmsFirstName, EFalse, 3); + SetPriority(CCmsContactFieldItem::ECmsMiddleName, EFalse, 2); + SetPriority(CCmsContactFieldItem::ECmsLastName, EFalse, 1); + } + + CleanupStack::PopAndDestroy(sortOrderSettings); + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CCCAppCommLauncherHeaderTextOrder::~CCCAppCommLauncherHeaderTextOrder() + { + iHeaderRows.ResetAndDestroy(); + iHeaderRowsClipped.ResetAndDestroy(); + delete iCurrentDbName; + } + +// --------------------------------------------------------------------------- +// CCCAppCommLauncherHeaderTextOrder::SetPriority +// --------------------------------------------------------------------------- +// +void CCCAppCommLauncherHeaderTextOrder::SetPriority(CCmsContactFieldItem::TCmsContactField aContactField, TBool aGroup, TInt aPriority) + { + if (aGroup) + { + iGroupPriorities[aContactField - KCCAppCommLauncherHeaderTextOrderFirstField] = aPriority; + } + else + { + iIndividualPriorities[aContactField - KCCAppCommLauncherHeaderTextOrderFirstField] = aPriority; + } + } + +// --------------------------------------------------------------------------- +// CCCAppCommLauncherHeaderTextOrder::GetPriority +// --------------------------------------------------------------------------- +// +TInt CCCAppCommLauncherHeaderTextOrder::GetPriority(CCmsContactFieldItem::TCmsContactField aContactField, TBool aGroup) + { + if (aGroup) + { + return iGroupPriorities[aContactField - KCCAppCommLauncherHeaderTextOrderFirstField]; + } + else + { + return iIndividualPriorities[aContactField - KCCAppCommLauncherHeaderTextOrderFirstField]; + } + } + + +// --------------------------------------------------------------------------- +// CCCAppCommLauncherHeaderTextOrder::GetTextForRow +// --------------------------------------------------------------------------- +// +const TDesC& CCCAppCommLauncherHeaderTextOrder::GetTextForRow(TInt aRow) + { + if (aRow >= 0 && aRow < iHeaderRowsClipped.Count() && aRow < iHeaderRows.Count()) + { + if (iHeaderRowsClipped[aRow]) + { + TPtr ptr(iHeaderRowsClipped[aRow]->Des()); + // Replace characters that can not be displayed correctly. + Pbk2PresentationUtils::ReplaceNonGraphicCharacters(ptr, ' '); + return *iHeaderRowsClipped[aRow]; + } + else if (iHeaderRows[aRow]) + { + TPtr ptr(iHeaderRows[aRow]->Des()); + Pbk2PresentationUtils::ReplaceNonGraphicCharacters(ptr, ' '); + return *iHeaderRows[aRow]; + } + } + return KNullDesC(); + } + +// --------------------------------------------------------------------------- +// CCCAppCommLauncherHeaderTextOrder::SelectContactFieldL +// --------------------------------------------------------------------------- +// +void CCCAppCommLauncherHeaderTextOrder::SelectContactFieldL( + const CCmsContactField& aContactField, + TInt aTopGroupPriority) + { + CCmsContactFieldItem::TCmsContactField type = aContactField.Type(); + const RPointerArray& fields = aContactField.Items(); + + for (TInt i=0; i < fields.Count(); i++) + { + for (TInt i2 = 0; i2 < KCCAppCommLauncherHeaderTextOrderLineCount; i2++) + { + if ( GetPriority(type, ETrue) == aTopGroupPriority && + (iHeaderTypes[i2] < 0 || GetPriority(type, EFalse) > GetPriority((CCmsContactFieldItem::TCmsContactField)iHeaderTypes[i2], EFalse)) ) + { + if(StrippedLengthL(*fields[i])) //Skip blank fields + { + TInt typeMem = KContactTypeNotSet; + for (TInt i3 = i2; i3 < KCCAppCommLauncherHeaderTextOrderLineCount; i3++) + { + TInt typeTemp = iHeaderTypes[i3]; + iHeaderTypes[i3] = typeMem; + typeMem = typeTemp; + } + iHeaderTypes[i2] = type; + break; + } + } + } + } + } + +// --------------------------------------------------------------------------- +// CCCAppCommLauncherHeaderTextOrder::ProcessContactFieldsL +// --------------------------------------------------------------------------- +// +void CCCAppCommLauncherHeaderTextOrder::ProcessContactFieldsL( + RArray aCmsContactFields) + { + TInt topGroupPriority = 0; + delete iCurrentDbName; + iCurrentDbName = NULL; + TInt count = aCmsContactFields.Count(); + TInt i; + + //1. Get the topmost group of fields containing displayable sdata + for(i=0; i < count ; i++ ) + { + for(TInt j=0; j < aCmsContactFields[i].Items().Count(); j++ ) + { + CCmsContactFieldItem::TCmsContactField type = aCmsContactFields[i].Type(); + if(StrippedLengthL(aCmsContactFields[i].ItemL(j))) + { + if ( GetPriority(type, ETrue) > topGroupPriority ) + { + topGroupPriority = GetPriority(type, ETrue); + } + } + } + } + + //2. Select preferred fields from top group + for(i=0; i < count ; i++ ) + { + SelectContactFieldL( aCmsContactFields[i], topGroupPriority ); + } + if (KCCAppCommLauncherHeaderTextOrderLineCount > 1 && iHeaderTypes[1] == KContactTypeNotSet) + { + iHeadersWrapped = ETrue; + } + + //3. Process the selected fields + for(i=0; i < count ; i++ ) + { + ProcessContactFieldL( aCmsContactFields[i] ); + } + } + +// --------------------------------------------------------------------------- +// CCCAppCommLauncherHeaderTextOrder::ProcessContactFieldL +// --------------------------------------------------------------------------- +// +void CCCAppCommLauncherHeaderTextOrder::ProcessContactFieldL(const CCmsContactField& aContactField) + { + for (TInt i = 0; i < KCCAppCommLauncherHeaderTextOrderLineCount; i++) + { + if (iHeaderRowsClipped[i]) + { + delete iHeaderRowsClipped[i]; + iHeaderRowsClipped[i] = 0; + } + if (aContactField.Type() == iHeaderTypes[i] && !iHeaderRows[i]) + { + //Check is there anything from current database for this header row[i] + TInt itemCountForDb = ItemCountForCurrentDbL( aContactField ); + if(!itemCountForDb) + { + //nothing to show, skip this contact field + break; + } + + if (itemCountForDb > 1) + { + iHeadersWrapped = EFalse; + + HBufC* mem = 0; + TInt typeMem = KContactTypeNotSet; + for (TInt i2 = i + itemCountForDb-1; i2 < KCCAppCommLauncherHeaderTextOrderLineCount; i2++) + { + HBufC* temp = iHeaderRows[i2]; + TInt typeTemp = iHeaderTypes[i2]; + iHeaderRows[i2] = mem; + iHeaderTypes[i2] = typeMem; + mem = temp; + typeMem = typeTemp; + } + delete mem; + } + for (unsigned i2 = i; i2 < KCCAppCommLauncherHeaderTextOrderLineCount && i2-i < itemCountForDb; i2++) + { + //Add only rows from current db + TPtrC info = aContactField.ItemL(i2-i).Info(); + if( iCurrentDbName && *iCurrentDbName == info ) + { + iHeaderRows[i2] = aContactField.ItemL(i2-i).Data().AllocL(); + iHeaderTypes[i2] = aContactField.Type(); + } + } + break; + } + } + } + +// --------------------------------------------------------------------------- +// CCCAppCommLauncherHeaderTextOrder::StrippedLengthL +// --------------------------------------------------------------------------- +// +TInt CCCAppCommLauncherHeaderTextOrder::StrippedLengthL( + const CCmsContactFieldItem& aCmsContactFieldItem) + { + HBufC* buf1 = aCmsContactFieldItem.Data().AllocLC(); + TPtr buf1Ptr = buf1->Des(); + buf1Ptr.TrimAll(); + + DeleteCharL(buf1Ptr, 0x000d); //KCarriageReturn = 0x000d + DeleteCharL(buf1Ptr, 0x000a); //KLineFeed = 0x000a + buf1Ptr.TrimAll(); //if any whitespace left after first trim... + + TInt strippedLength = buf1Ptr.Length(); + CleanupStack::PopAndDestroy(buf1); + return strippedLength; + } + +// --------------------------------------------------------------------------- +// CCCAppCommLauncherHeaderTextOrder::ProcessContactFieldsL +// --------------------------------------------------------------------------- +// +void CCCAppCommLauncherHeaderTextOrder::DeleteCharL(TDes& aDest, TChar aChar) + { + TBuf<1> str; + str.Append(aChar); + + TInt delPos = aDest.Find(str); + while( delPos != KErrNotFound ) + { + aDest.Delete(delPos, 1); + delPos = aDest.Find(str); + } + } + +// --------------------------------------------------------------------------- +// CCCAppCommLauncherHeaderTextOrder::ItemCountForCurrentDbL +// --------------------------------------------------------------------------- +// +TInt CCCAppCommLauncherHeaderTextOrder::ItemCountForCurrentDbL( + const CCmsContactField& aContactField ) + { + TInt ret(0); + + for(TInt i=0; i < aContactField.ItemCount(); i++ ) + { + if( !iCurrentDbName ) + { + //From now on accept only data from this database + iCurrentDbName = aContactField.ItemL(i).Info().AllocL(); + } + + TPtrC info = aContactField.ItemL(i).Info(); + if( *iCurrentDbName == info ) + { + ret++; + } + } + return ret; + } + +// --------------------------------------------------------------------------- +// CCCAppCommLauncherHeaderTextOrder::Reset +// --------------------------------------------------------------------------- +// +void CCCAppCommLauncherHeaderTextOrder::Reset() + { + for (TInt i = 0; i < KCCAppCommLauncherHeaderTextOrderLineCount; i++) + { + delete iHeaderRows[i]; + iHeaderRows[i] = NULL; + delete iHeaderRowsClipped[i]; + iHeaderRowsClipped[i] = NULL; + iHeaderTypes[i] = KContactTypeNotSet; + } + iHeadersWrapped = EFalse; + } + +// --------------------------------------------------------------------------- +// CCCAppCommLauncherHeaderTextOrder::ClipL +// --------------------------------------------------------------------------- +// +void CCCAppCommLauncherHeaderTextOrder::ClipL(const CFont& aFont, TInt aLineWidth) + { + iHeaderRowsClipped.ResetAndDestroy(); + if (iHeadersWrapped && iHeaderRows[0]) + { + HBufC* textTemp = HBufC::NewLC(iHeaderRows[0]->Length() + 1); + CArrayFixFlat * lineWidths = new (ELeave) CArrayFixFlat(KCCAppCommLauncherHeaderTextOrderLineCount); + CleanupStack::PushL(lineWidths); + lineWidths->AppendL(aLineWidth); + lineWidths->AppendL(aLineWidth); + lineWidths->AppendL(aLineWidth); + CArrayFixFlat* lines = new (ELeave) CArrayFixFlat(KCCAppCommLauncherHeaderTextOrderLineCount); + CleanupStack::PushL(lines); + TPtr ptr = textTemp->Des(); + ptr.Copy(*iHeaderRows[0]); + AknTextUtils::WrapToArrayAndClipL(ptr, *lineWidths, aFont, *lines); + for (TInt i=0; i < KCCAppCommLauncherHeaderTextOrderLineCount; i++) + { + if (i < lines->Count()) + { + iHeaderRowsClipped.AppendL(lines->At(i).AllocL()); + } + else + { + iHeaderRowsClipped.AppendL(KNullDesC().AllocL()); + } + } + CleanupStack::PopAndDestroy(3); + } + else + { + for (TInt i = 0; i < KCCAppCommLauncherHeaderTextOrderLineCount; i++) + { + iHeaderRowsClipped.AppendL(0); + if (iHeaderRows[i]) + { + AknTextUtils::TClipDirection clipDirection = MapContactFieldToClipDirection((CCmsContactFieldItem::TCmsContactField)iHeaderTypes[i]); + iHeaderRowsClipped[i] = iHeaderRows[i]->AllocL(); + TPtr ptr = iHeaderRowsClipped[i]->Des(); + AknTextUtils::ClipToFit(ptr, aFont, aLineWidth, clipDirection); + } + } + } + } + +// --------------------------------------------------------------------------- +// CCCAppCommLauncherHeaderTextOrder::MapStringToContactField +// --------------------------------------------------------------------------- +// + TInt CCCAppCommLauncherHeaderTextOrder::MapStringToContactField(const TDesC& aDesc, CCmsContactFieldItem::TCmsContactField& aType) + { + _LIT(KECmsLastName, "ECmsLastName"); + _LIT(KECmsMiddleName, "ECmsMiddleName"); + _LIT(KECmsFirstName, "ECmsFirstName"); + _LIT(KECmsUndefined, "ECmsUndefined"); + _LIT(KECmsPresenceData, "ECmsPresenceData"); + _LIT(KECmsBrandedAvailability, "ECmsBrandedAvailability"); + _LIT(KECmsThumbnailPic, "ECmsThumbnailPic"); + _LIT(KECmsSipAddress, "ECmsSipAddress"); + _LIT(KECmsLandPhoneHome, "ECmsLandPhoneHome"); + _LIT(KECmsMobilePhoneHome, "ECmsMobilePhoneHome"); + _LIT(KECmsFaxNumberHome, "ECmsFaxNumberHome"); + _LIT(KECmsVideoNumberHome, "ECmsVideoNumberHome"); + _LIT(KECmsVoipNumberHome, "ECmsVoipNumberHome"); + _LIT(KECmsEmailHome, "ECmsEmailHome"); + _LIT(KECmsUrlHome, "ECmsUrlHome"); + _LIT(KECmsLandPhoneWork, "ECmsLandPhoneWork"); + _LIT(KECmsMobilePhoneWork, "ECmsMobilePhoneWork"); + _LIT(KECmsVideoNumberWork, "ECmsVideoNumberWork"); + _LIT(KECmsFaxNumberWork, "ECmsFaxNumberWork"); + _LIT(KECmsVoipNumberWork, "ECmsVoipNumberWork"); + _LIT(KECmsEmailWork, "ECmsEmailWork"); + _LIT(KECmsUrlWork, "ECmsUrlWork"); + _LIT(KECmsEmailGeneric, "ECmsEmailGeneric"); + _LIT(KECmsUrlGeneric, "ECmsUrlGeneric"); + _LIT(KECmsLandPhoneGeneric, "ECmsLandPhoneGeneric"); + _LIT(KECmsMobilePhoneGeneric, "ECmsMobilePhoneGeneric"); + _LIT(KECmsVideoNumberGeneric, "ECmsVideoNumberGeneric"); + _LIT(KECmsAddrLabelGeneric, "ECmsAddrLabelGeneric"); + _LIT(KECmsAddrPOGeneric, "ECmsAddrPOGeneric"); + _LIT(KECmsAddrExtGeneric, "ECmsAddrExtGeneric"); + _LIT(KECmsAddrStreetGeneric, "ECmsAddrStreetGeneric"); + _LIT(KECmsAddrLocalGeneric, "ECmsAddrLocalGeneric"); + _LIT(KECmsAddrRegionGeneric, "ECmsAddrRegionGeneric"); + _LIT(KECmsAddrPostcodeGeneric, "ECmsAddrPostcodeGeneric"); + _LIT(KECmsAddrCountryGeneric, "ECmsAddrCountryGeneric"); + _LIT(KECmsVoipNumberGeneric, "ECmsVoipNumberGeneric"); + _LIT(KECmsAddrLabelHome, "ECmsAddrLabelHome"); + _LIT(KECmsAddrPOHome, "ECmsAddrPOHome"); + _LIT(KECmsAddrExtHome, "ECmsAddrExtHome"); + _LIT(KECmsAddrStreetHome, "ECmsAddrStreetHome"); + _LIT(KECmsAddrLocalHome, "ECmsAddrLocalHome"); + _LIT(KECmsAddrRegionHome, "ECmsAddrRegionHome"); + _LIT(KECmsAddrPostcodeHome, "ECmsAddrPostcodeHome"); + _LIT(KECmsAddrCountryHome, "ECmsAddrCountryHome"); + _LIT(KECmsAddrLabelWork, "ECmsAddrLabelWork"); + _LIT(KECmsAddrPOWork, "ECmsAddrPOWork"); + _LIT(KECmsAddrExtWork, "ECmsAddrExtWork"); + _LIT(KECmsAddrStreetWork, "ECmsAddrStreetWork"); + _LIT(KECmsAddrLocalWork, "ECmsAddrLocalWork"); + _LIT(KECmsAddrRegionWork, "ECmsAddrRegionWork"); + _LIT(KECmsAddrPostcodeWork, "ECmsAddrPostcodeWork"); + _LIT(KECmsAddrCountryWork, "ECmsAddrCountryWork"); + _LIT(KECmsImpp, "ECmsImpp"); + _LIT(KECmsFullName, "ECmsFullName"); + _LIT(KECmsNote, "ECmsNote"); + _LIT(KECmsNickname, "ECmsNickname"); + _LIT(KECmsJobTitle, "ECmsJobTitle"); + _LIT(KECmsDepartment, "ECmsDepartment"); + _LIT(KECmsBirthday, "ECmsBirthday"); + _LIT(KECmsAnniversary, "ECmsAnniversary"); + _LIT(KECmsCompanyName, "ECmsCompanyName"); + _LIT(KECmsAssistantNumber, "ECmsAssistantNumber"); + _LIT(KECmsCarPhone, "ECmsCarPhone"); + _LIT(KECmsPagerNumber, "ECmsPagerNumber"); + _LIT(KECmsPushToTalk, "ECmsPushToTalk"); + _LIT(KECmsShareView, "ECmsShareView"); + + + if (!aDesc.Compare(KECmsLastName)) + aType = CCmsContactFieldItem::ECmsLastName; + else if (!aDesc.Compare(KECmsMiddleName)) + aType = CCmsContactFieldItem::ECmsMiddleName; + else if (!aDesc.Compare(KECmsFirstName)) + aType = CCmsContactFieldItem::ECmsFirstName; + else if (!aDesc.Compare(KECmsUndefined)) + aType = CCmsContactFieldItem::ECmsUndefined; + else if (!aDesc.Compare(KECmsPresenceData)) + aType = CCmsContactFieldItem::ECmsPresenceData; + else if (!aDesc.Compare(KECmsBrandedAvailability)) + aType = CCmsContactFieldItem::ECmsBrandedAvailability; + else if (!aDesc.Compare(KECmsThumbnailPic)) + aType = CCmsContactFieldItem::ECmsThumbnailPic; + else if (!aDesc.Compare(KECmsSipAddress)) + aType = CCmsContactFieldItem::ECmsSipAddress; + else if (!aDesc.Compare(KECmsLandPhoneHome)) + aType = CCmsContactFieldItem::ECmsLandPhoneHome; + else if (!aDesc.Compare(KECmsMobilePhoneHome)) + aType = CCmsContactFieldItem::ECmsMobilePhoneHome; + else if (!aDesc.Compare(KECmsFaxNumberHome)) + aType = CCmsContactFieldItem::ECmsFaxNumberHome; + else if (!aDesc.Compare(KECmsVideoNumberHome)) + aType = CCmsContactFieldItem::ECmsVideoNumberHome; + else if (!aDesc.Compare(KECmsVoipNumberHome)) + aType = CCmsContactFieldItem::ECmsVoipNumberHome; + else if (!aDesc.Compare(KECmsEmailHome)) + aType = CCmsContactFieldItem::ECmsEmailHome; + else if (!aDesc.Compare(KECmsUrlHome)) + aType = CCmsContactFieldItem::ECmsUrlHome; + else if (!aDesc.Compare(KECmsLandPhoneWork)) + aType = CCmsContactFieldItem::ECmsLandPhoneWork; + else if (!aDesc.Compare(KECmsMobilePhoneWork)) + aType = CCmsContactFieldItem::ECmsMobilePhoneWork; + else if (!aDesc.Compare(KECmsVideoNumberWork)) + aType = CCmsContactFieldItem::ECmsVideoNumberWork; + else if (!aDesc.Compare(KECmsFaxNumberWork)) + aType = CCmsContactFieldItem::ECmsFaxNumberWork; + else if (!aDesc.Compare(KECmsVoipNumberWork)) + aType = CCmsContactFieldItem::ECmsVoipNumberWork; + else if (!aDesc.Compare(KECmsEmailWork)) + aType = CCmsContactFieldItem::ECmsEmailWork; + else if (!aDesc.Compare(KECmsUrlWork)) + aType = CCmsContactFieldItem::ECmsUrlWork; + else if (!aDesc.Compare(KECmsEmailGeneric)) + aType = CCmsContactFieldItem::ECmsEmailGeneric; + else if (!aDesc.Compare(KECmsUrlGeneric)) + aType = CCmsContactFieldItem::ECmsUrlGeneric; + else if (!aDesc.Compare(KECmsLandPhoneGeneric)) + aType = CCmsContactFieldItem::ECmsLandPhoneGeneric; + else if (!aDesc.Compare(KECmsMobilePhoneGeneric)) + aType = CCmsContactFieldItem::ECmsMobilePhoneGeneric; + else if (!aDesc.Compare(KECmsVideoNumberGeneric)) + aType = CCmsContactFieldItem::ECmsVideoNumberGeneric; + else if (!aDesc.Compare(KECmsAddrLabelGeneric)) + aType = CCmsContactFieldItem::ECmsAddrLabelGeneric; + else if (!aDesc.Compare(KECmsAddrPOGeneric)) + aType = CCmsContactFieldItem::ECmsAddrPOGeneric; + else if (!aDesc.Compare(KECmsAddrExtGeneric)) + aType = CCmsContactFieldItem::ECmsAddrExtGeneric; + else if (!aDesc.Compare(KECmsAddrStreetGeneric)) + aType = CCmsContactFieldItem::ECmsAddrStreetGeneric; + else if (!aDesc.Compare(KECmsAddrLocalGeneric)) + aType = CCmsContactFieldItem::ECmsAddrLocalGeneric; + else if (!aDesc.Compare(KECmsAddrRegionGeneric)) + aType = CCmsContactFieldItem::ECmsAddrRegionGeneric; + else if (!aDesc.Compare(KECmsAddrPostcodeGeneric)) + aType = CCmsContactFieldItem::ECmsAddrPostcodeGeneric; + else if (!aDesc.Compare(KECmsAddrCountryGeneric)) + aType = CCmsContactFieldItem::ECmsAddrCountryGeneric; + else if (!aDesc.Compare(KECmsVoipNumberGeneric)) + aType = CCmsContactFieldItem::ECmsVoipNumberGeneric; + else if (!aDesc.Compare(KECmsAddrLabelHome)) + aType = CCmsContactFieldItem::ECmsAddrLabelHome; + else if (!aDesc.Compare(KECmsAddrPOHome)) + aType = CCmsContactFieldItem::ECmsAddrPOHome; + else if (!aDesc.Compare(KECmsAddrExtHome)) + aType = CCmsContactFieldItem::ECmsAddrExtHome; + else if (!aDesc.Compare(KECmsAddrStreetHome)) + aType = CCmsContactFieldItem::ECmsAddrStreetHome; + else if (!aDesc.Compare(KECmsAddrLocalHome)) + aType = CCmsContactFieldItem::ECmsAddrLocalHome; + else if (!aDesc.Compare(KECmsAddrRegionHome)) + aType = CCmsContactFieldItem::ECmsAddrRegionHome; + else if (!aDesc.Compare(KECmsAddrPostcodeHome)) + aType = CCmsContactFieldItem::ECmsAddrPostcodeHome; + else if (!aDesc.Compare(KECmsAddrCountryHome)) + aType = CCmsContactFieldItem::ECmsAddrCountryHome; + + else if (!aDesc.Compare(KECmsAddrLabelWork)) + aType = CCmsContactFieldItem::ECmsAddrLabelWork; + else if (!aDesc.Compare(KECmsAddrPOWork)) + aType = CCmsContactFieldItem::ECmsAddrPOWork; + else if (!aDesc.Compare(KECmsAddrExtWork)) + aType = CCmsContactFieldItem::ECmsAddrExtWork; + else if (!aDesc.Compare(KECmsAddrStreetWork)) + aType = CCmsContactFieldItem::ECmsAddrStreetWork; + else if (!aDesc.Compare(KECmsAddrLocalWork)) + aType = CCmsContactFieldItem::ECmsAddrLocalWork; + else if (!aDesc.Compare(KECmsAddrRegionWork)) + aType = CCmsContactFieldItem::ECmsAddrRegionWork; + else if (!aDesc.Compare(KECmsAddrPostcodeWork)) + aType = CCmsContactFieldItem::ECmsAddrPostcodeWork; + else if (!aDesc.Compare(KECmsAddrCountryWork)) + aType = CCmsContactFieldItem::ECmsAddrCountryWork; + + else if (!aDesc.Compare(KECmsImpp)) + aType = CCmsContactFieldItem::ECmsImpp; + else if (!aDesc.Compare(KECmsFullName)) + aType = CCmsContactFieldItem::ECmsFullName; + else if (!aDesc.Compare(KECmsNote)) + aType = CCmsContactFieldItem::ECmsNote; + else if (!aDesc.Compare(KECmsNickname)) + aType = CCmsContactFieldItem::ECmsNickname; + else if (!aDesc.Compare(KECmsJobTitle)) + aType = CCmsContactFieldItem::ECmsJobTitle; + else if (!aDesc.Compare(KECmsDepartment)) + aType = CCmsContactFieldItem::ECmsDepartment; + else if (!aDesc.Compare(KECmsBirthday)) + aType = CCmsContactFieldItem::ECmsBirthday; + else if (!aDesc.Compare(KECmsAnniversary)) + aType = CCmsContactFieldItem::ECmsAnniversary; + else if (!aDesc.Compare(KECmsCompanyName)) + aType = CCmsContactFieldItem::ECmsCompanyName; + else if (!aDesc.Compare(KECmsAssistantNumber)) + aType = CCmsContactFieldItem::ECmsAssistantNumber; + else if (!aDesc.Compare(KECmsCarPhone)) + aType = CCmsContactFieldItem::ECmsCarPhone; + else if (!aDesc.Compare(KECmsPagerNumber)) + aType = CCmsContactFieldItem::ECmsPagerNumber; + else if (!aDesc.Compare(KECmsPushToTalk)) + aType = CCmsContactFieldItem::ECmsPushToTalk; + else if (!aDesc.Compare(KECmsShareView)) + aType = CCmsContactFieldItem::ECmsShareView; + else + return KErrNotFound; + return KErrNone; + } + + // --------------------------------------------------------------------------- + // CCCAppCommLauncherHeaderTextOrder::MapContactFieldToClipDirection + // --------------------------------------------------------------------------- + // + AknTextUtils::TClipDirection CCCAppCommLauncherHeaderTextOrder::MapContactFieldToClipDirection(CCmsContactFieldItem::TCmsContactField aType) + { + switch (aType) + { + case CCmsContactFieldItem::ECmsMobilePhoneGeneric: + case CCmsContactFieldItem::ECmsMobilePhoneWork: + case CCmsContactFieldItem::ECmsMobilePhoneHome: + case CCmsContactFieldItem::ECmsLandPhoneGeneric: + case CCmsContactFieldItem::ECmsLandPhoneWork: + case CCmsContactFieldItem::ECmsLandPhoneHome: + case CCmsContactFieldItem::ECmsVideoNumberGeneric: + case CCmsContactFieldItem::ECmsVideoNumberWork: + case CCmsContactFieldItem::ECmsVideoNumberHome: + case CCmsContactFieldItem::ECmsFaxNumberHome: + case CCmsContactFieldItem::ECmsFaxNumberWork: + case CCmsContactFieldItem::ECmsEmailGeneric: + case CCmsContactFieldItem::ECmsEmailWork: + case CCmsContactFieldItem::ECmsEmailHome: + case CCmsContactFieldItem::ECmsVoipNumberGeneric: + case CCmsContactFieldItem::ECmsVoipNumberHome: + case CCmsContactFieldItem::ECmsVoipNumberWork: + case CCmsContactFieldItem::ECmsSipAddress: + case CCmsContactFieldItem::ECmsImpp: + case CCmsContactFieldItem::ECmsAssistantNumber: + case CCmsContactFieldItem::ECmsCarPhone: + case CCmsContactFieldItem::ECmsPagerNumber: + case CCmsContactFieldItem::ECmsPushToTalk: + case CCmsContactFieldItem::ECmsShareView: + return AknTextUtils::EClipFromBeginning; + default: + return AknTextUtils::EClipFromEnd; + } + }