diff -r 000000000000 -r e686773b3f54 phonebookui/Phonebook/Engine/src/CPbkContactNameFormatter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Phonebook/Engine/src/CPbkContactNameFormatter.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,245 @@ +/* +* 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: +* Concrete Phonebook contact name formatting interface +* +*/ + + +// INCLUDE FILES +#include "CPbkContactNameFormatter.h" +#include "MPbkFieldData.h" +#include "TPbkTitleFieldFilter.h" +#include +#include +#include "CPbkContactEngine.h" +#include "CPbkSortOrderManager.h" + + +namespace { + +// LOCAL CONSTANTS AND MACROS + +#ifdef _DEBUG +enum TPanicCode + { + EPanicPostCond_GetContactTitle = 1, + EPanicPostCond_GetContactListTitle, + EPanicPreCond_PbkFieldAt, + EPanicPreCond_PbkFieldTime + }; +#endif + +enum TTitleType + { + ETitleTypeNormal = 1, + ETitleTypeList + }; + +enum TNameOrder + { + ETopContactOrderNumber = 0, + ENameFirstPart, + ENameSecondPart + }; + +// ==================== LOCAL FUNCTIONS ==================== + +#ifdef _DEBUG +void Panic(TInt aReason) + { + _LIT(KPanicText, "CPbkContactNameFormatter"); + User::Panic(KPanicText, aReason); + } +#endif + +// MODULE DATA STRUCTURES + + +} // namespace + + +// ==================== MEMBER FUNCTIONS ==================== + + +inline CPbkContactNameFormatter::CPbkContactNameFormatter + (const CPbkSortOrderManager& aSortOrderManager) : + iSortOrderManager(aSortOrderManager) + { + // CBase::operator new(TLeave) resets all members + } + +inline void CPbkContactNameFormatter::ConstructL + (const TDesC& aUnnamedText) + { + BaseConstructL(aUnnamedText); + + iTitleFieldFilter = new(ELeave) TTitleFieldFilter(); + } + +CPbkContactNameFormatter* CPbkContactNameFormatter::NewL + (const TDesC& aUnnamedText, + const CPbkSortOrderManager& aSortOrderManager) + { + CPbkContactNameFormatter* self = new(ELeave) CPbkContactNameFormatter(aSortOrderManager); + CleanupStack::PushL(self); + self->ConstructL(aUnnamedText); + CleanupStack::Pop(self); + return self; + } + +CPbkContactNameFormatter::~CPbkContactNameFormatter() + { + delete iTitleFieldFilter; + } + +inline void CPbkContactNameFormatter::TrimName + (TInt aTitleType, + const TDesC& aName, + TDes& aTitle) const + { + if (aTitleType == ETitleTypeList) + { + // In lists, the leading spaces are not formatted, + // only the end of the string is + PbkEngUtils::TrimRightAppend(aName, aTitle); + } + else + { + // Elsewhere, string is trimmed from beginning and end + PbkEngUtils::TrimAllAppend(aName, aTitle); + } + } + +void CPbkContactNameFormatter::DoGetContactTitle + (const MPbkFieldDataArray& aContactData, + TDes& aTitle, + TInt aTitleType) const + { + aTitle.Zero(); + + const RContactViewSortOrder& sortOrder = iSortOrderManager.SortOrder(); + + // Get sort order - order fields according to the sort order + TPbkFieldId firstFieldId = PbkContactNameFormattingUtil::GetPbkFieldIdAt( + sortOrder, ENameFirstPart); + const TDesC& nameFirstPart = PbkContactNameFormattingUtil::FieldText( + aContactData, firstFieldId); + + // The trimming depends on needed title type + TrimName(aTitleType, nameFirstPart, aTitle); + + TPbkFieldId secondFieldId = PbkContactNameFormattingUtil::GetPbkFieldIdAt( + sortOrder, ENameSecondPart); + const TDesC& nameSecondPart = PbkContactNameFormattingUtil::FieldText( + aContactData, secondFieldId); + if (RequiresSpaceBetweenNames(nameFirstPart,nameSecondPart)) + { + TChar separator = iSortOrderManager.NameSeparator(); + if (!separator.Eos()) + { + aTitle.Append(separator); + } + aTitle.Append(' '); + } + + // The trimming depends on needed title type + TrimName(aTitleType, nameSecondPart, aTitle); + + if (aTitle.Length() == 0) + { + const TDesC& companyName = PbkContactNameFormattingUtil::FieldText( + aContactData, EPbkFieldIdCompanyName); + + // The trimming depends on needed title type + TrimName(aTitleType, companyName, aTitle); + } + } + + +void CPbkContactNameFormatter::GetContactTitle + (const MPbkFieldDataArray& aContactData, + TDes& aTitle) const + { + DoGetContactTitle(aContactData, aTitle, ETitleTypeNormal); + + __ASSERT_DEBUG(aTitle.Length() == ContactTitleLength(aContactData), + Panic(EPanicPostCond_GetContactTitle)); + } + +void CPbkContactNameFormatter::GetContactListTitle + (const MPbkFieldDataArray& aContactData, + TDes& aTitle) const + { + DoGetContactTitle(aContactData, aTitle, ETitleTypeList); + + __ASSERT_DEBUG(aTitle.Length() == ContactListTitleLength(aContactData), + Panic(EPanicPostCond_GetContactListTitle)); + } + +const MPbkFieldDataArray& CPbkContactNameFormatter::FilterContactTitleFields + (const MPbkFieldDataArray& aContactData) const + { + iTitleFieldFilter->Set(aContactData, iSortOrderManager.SortOrder()); + return *iTitleFieldFilter; + } + +const MPbkFieldDataArray& CPbkContactNameFormatter::FilterContactFieldsForFind + (const MPbkFieldDataArray& aContactData) const + { + // Delegate + return FilterContactTitleFields(aContactData); + } + +TInt CPbkContactNameFormatter::ContactTitleLength + (const MPbkFieldDataArray& aContactData) const + { + TInt length = CPbkContactNameFormatterBase::ContactTitleLength(aContactData); + + const TDesC& lastName = PbkContactNameFormattingUtil::FieldText( + aContactData, EPbkFieldIdLastName); + const TDesC& firstName = PbkContactNameFormattingUtil::FieldText( + aContactData, EPbkFieldIdFirstName); + + // If both names exist and a separator character is used, then add one + if (RequiresSpaceBetweenNames(lastName,firstName) && + !iSortOrderManager.NameSeparator().Eos()) + { + length++; + } + return length; + } + +TInt CPbkContactNameFormatter::ContactListTitleLength + (const MPbkFieldDataArray& aContactData) const + { + TInt length = + CPbkContactNameFormatterBase::ContactListTitleLength(aContactData); + + const TDesC& lastName = PbkContactNameFormattingUtil::FieldText( + aContactData, EPbkFieldIdLastName); + const TDesC& firstName = PbkContactNameFormattingUtil::FieldText( + aContactData, EPbkFieldIdFirstName); + + // If both names exist and a separator character is used, then add one + if (RequiresSpaceBetweenNames(lastName,firstName) && + !iSortOrderManager.NameSeparator().Eos()) + { + length++; + } + return length; + } + + +// End of File