phonebookui/Phonebook/Engine/src/CPbkContactNameFormatter.cpp
changeset 0 e686773b3f54
--- /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    <cntviewbase.h>
+#include    <PbkEngUtils.h>
+#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