phonebookui/Phonebook/Engine/src/CPbkContactNameFormatter.cpp
changeset 0 e686773b3f54
equal deleted inserted replaced
-1:000000000000 0:e686773b3f54
       
     1 /*
       
     2 * Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description: 
       
    15 *		Concrete Phonebook contact name formatting interface
       
    16 *
       
    17 */
       
    18 
       
    19 
       
    20 // INCLUDE FILES
       
    21 #include    "CPbkContactNameFormatter.h"
       
    22 #include    "MPbkFieldData.h"
       
    23 #include    "TPbkTitleFieldFilter.h"
       
    24 #include    <cntviewbase.h>
       
    25 #include    <PbkEngUtils.h>
       
    26 #include    "CPbkContactEngine.h"
       
    27 #include    "CPbkSortOrderManager.h"
       
    28 
       
    29 
       
    30 namespace {
       
    31 
       
    32 // LOCAL CONSTANTS AND MACROS
       
    33 
       
    34 #ifdef _DEBUG
       
    35 enum TPanicCode
       
    36     {
       
    37     EPanicPostCond_GetContactTitle = 1,
       
    38     EPanicPostCond_GetContactListTitle,
       
    39     EPanicPreCond_PbkFieldAt,
       
    40     EPanicPreCond_PbkFieldTime
       
    41     };
       
    42 #endif
       
    43 
       
    44 enum TTitleType
       
    45     {
       
    46     ETitleTypeNormal = 1,
       
    47     ETitleTypeList
       
    48     };
       
    49 
       
    50 enum TNameOrder
       
    51     {
       
    52     ETopContactOrderNumber = 0,
       
    53     ENameFirstPart,
       
    54     ENameSecondPart
       
    55     };
       
    56 
       
    57 // ==================== LOCAL FUNCTIONS ====================
       
    58 
       
    59 #ifdef _DEBUG
       
    60 void Panic(TInt aReason)
       
    61     {
       
    62     _LIT(KPanicText, "CPbkContactNameFormatter");
       
    63     User::Panic(KPanicText, aReason);
       
    64     }
       
    65 #endif
       
    66 
       
    67 // MODULE DATA STRUCTURES
       
    68 
       
    69 
       
    70 }  // namespace
       
    71 
       
    72 
       
    73 // ==================== MEMBER FUNCTIONS ====================
       
    74 
       
    75 
       
    76 inline CPbkContactNameFormatter::CPbkContactNameFormatter
       
    77         (const CPbkSortOrderManager& aSortOrderManager) :
       
    78     iSortOrderManager(aSortOrderManager)
       
    79     {
       
    80     // CBase::operator new(TLeave) resets all members
       
    81     }
       
    82 
       
    83 inline void CPbkContactNameFormatter::ConstructL
       
    84         (const TDesC& aUnnamedText)
       
    85     {
       
    86     BaseConstructL(aUnnamedText);
       
    87 
       
    88     iTitleFieldFilter = new(ELeave) TTitleFieldFilter();
       
    89     }
       
    90 
       
    91 CPbkContactNameFormatter* CPbkContactNameFormatter::NewL
       
    92         (const TDesC& aUnnamedText,
       
    93 		const CPbkSortOrderManager& aSortOrderManager)
       
    94     {
       
    95     CPbkContactNameFormatter* self = new(ELeave) CPbkContactNameFormatter(aSortOrderManager);
       
    96     CleanupStack::PushL(self);
       
    97     self->ConstructL(aUnnamedText);
       
    98     CleanupStack::Pop(self);
       
    99     return self;
       
   100     }
       
   101 
       
   102 CPbkContactNameFormatter::~CPbkContactNameFormatter()
       
   103     {
       
   104     delete iTitleFieldFilter;
       
   105     }
       
   106 
       
   107 inline void CPbkContactNameFormatter::TrimName
       
   108         (TInt aTitleType,
       
   109         const TDesC& aName,
       
   110         TDes& aTitle) const
       
   111     {
       
   112     if (aTitleType == ETitleTypeList)
       
   113         {
       
   114         // In lists, the leading spaces are not formatted,
       
   115         // only the end of the string is
       
   116         PbkEngUtils::TrimRightAppend(aName, aTitle);
       
   117         }
       
   118     else
       
   119         {
       
   120         // Elsewhere, string is trimmed from beginning and end
       
   121         PbkEngUtils::TrimAllAppend(aName, aTitle);
       
   122         }
       
   123     }
       
   124 
       
   125 void CPbkContactNameFormatter::DoGetContactTitle
       
   126          (const MPbkFieldDataArray& aContactData, 
       
   127 		 TDes& aTitle,
       
   128          TInt aTitleType) const
       
   129     {
       
   130     aTitle.Zero();
       
   131 
       
   132     const RContactViewSortOrder& sortOrder = iSortOrderManager.SortOrder();
       
   133 
       
   134     // Get sort order - order fields according to the sort order
       
   135     TPbkFieldId firstFieldId = PbkContactNameFormattingUtil::GetPbkFieldIdAt(
       
   136             sortOrder, ENameFirstPart);
       
   137     const TDesC& nameFirstPart = PbkContactNameFormattingUtil::FieldText(
       
   138             aContactData, firstFieldId);
       
   139     
       
   140     // The trimming depends on needed title type
       
   141     TrimName(aTitleType, nameFirstPart, aTitle);
       
   142     
       
   143     TPbkFieldId secondFieldId = PbkContactNameFormattingUtil::GetPbkFieldIdAt(
       
   144             sortOrder, ENameSecondPart);
       
   145     const TDesC& nameSecondPart = PbkContactNameFormattingUtil::FieldText(
       
   146             aContactData, secondFieldId);
       
   147     if (RequiresSpaceBetweenNames(nameFirstPart,nameSecondPart))
       
   148         {
       
   149         TChar separator = iSortOrderManager.NameSeparator();
       
   150         if (!separator.Eos())
       
   151             {
       
   152             aTitle.Append(separator);
       
   153             }
       
   154         aTitle.Append(' ');
       
   155         }
       
   156 
       
   157     // The trimming depends on needed title type
       
   158     TrimName(aTitleType, nameSecondPart, aTitle);
       
   159 
       
   160     if (aTitle.Length() == 0)
       
   161         {
       
   162         const TDesC& companyName = PbkContactNameFormattingUtil::FieldText(
       
   163                 aContactData, EPbkFieldIdCompanyName);
       
   164 
       
   165         // The trimming depends on needed title type
       
   166         TrimName(aTitleType, companyName, aTitle);
       
   167         }
       
   168     }
       
   169 
       
   170 
       
   171 void CPbkContactNameFormatter::GetContactTitle
       
   172          (const MPbkFieldDataArray& aContactData, 
       
   173 		 TDes& aTitle) const
       
   174     {
       
   175     DoGetContactTitle(aContactData, aTitle, ETitleTypeNormal);
       
   176 
       
   177     __ASSERT_DEBUG(aTitle.Length() == ContactTitleLength(aContactData),
       
   178         Panic(EPanicPostCond_GetContactTitle));
       
   179     }
       
   180 
       
   181 void CPbkContactNameFormatter::GetContactListTitle
       
   182          (const MPbkFieldDataArray& aContactData, 
       
   183 		 TDes& aTitle) const
       
   184     {
       
   185     DoGetContactTitle(aContactData, aTitle, ETitleTypeList);
       
   186 
       
   187     __ASSERT_DEBUG(aTitle.Length() == ContactListTitleLength(aContactData),
       
   188         Panic(EPanicPostCond_GetContactListTitle));
       
   189     }
       
   190 
       
   191 const MPbkFieldDataArray& CPbkContactNameFormatter::FilterContactTitleFields
       
   192         (const MPbkFieldDataArray& aContactData) const
       
   193     {
       
   194     iTitleFieldFilter->Set(aContactData, iSortOrderManager.SortOrder());
       
   195     return *iTitleFieldFilter;
       
   196 	}
       
   197 
       
   198 const MPbkFieldDataArray& CPbkContactNameFormatter::FilterContactFieldsForFind
       
   199     (const MPbkFieldDataArray& aContactData) const
       
   200     {
       
   201     // Delegate
       
   202     return FilterContactTitleFields(aContactData);
       
   203     }  
       
   204                 
       
   205 TInt CPbkContactNameFormatter::ContactTitleLength
       
   206     (const MPbkFieldDataArray& aContactData) const
       
   207     {
       
   208     TInt length = CPbkContactNameFormatterBase::ContactTitleLength(aContactData);
       
   209 
       
   210     const TDesC& lastName = PbkContactNameFormattingUtil::FieldText(
       
   211             aContactData, EPbkFieldIdLastName);
       
   212     const TDesC& firstName = PbkContactNameFormattingUtil::FieldText(
       
   213         aContactData, EPbkFieldIdFirstName);
       
   214     
       
   215     // If both names exist and a separator character is used, then add one
       
   216     if (RequiresSpaceBetweenNames(lastName,firstName) &&
       
   217         !iSortOrderManager.NameSeparator().Eos())
       
   218         {
       
   219         length++;
       
   220         }
       
   221     return length;
       
   222     }      
       
   223     
       
   224 TInt CPbkContactNameFormatter::ContactListTitleLength
       
   225     (const MPbkFieldDataArray& aContactData) const
       
   226     {
       
   227     TInt length = 
       
   228         CPbkContactNameFormatterBase::ContactListTitleLength(aContactData);
       
   229 
       
   230     const TDesC& lastName = PbkContactNameFormattingUtil::FieldText(
       
   231             aContactData, EPbkFieldIdLastName);
       
   232     const TDesC& firstName = PbkContactNameFormattingUtil::FieldText(
       
   233         aContactData, EPbkFieldIdFirstName);
       
   234     
       
   235     // If both names exist and a separator character is used, then add one
       
   236     if (RequiresSpaceBetweenNames(lastName,firstName) &&
       
   237         !iSortOrderManager.NameSeparator().Eos())
       
   238         {
       
   239         length++;
       
   240         }
       
   241     return length;
       
   242     }      
       
   243 
       
   244 
       
   245 //  End of File