phonebookui/Phonebook2/Presentation/src/CPbk2JapaneseContactNameFormatter.cpp
changeset 0 e686773b3f54
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/Presentation/src/CPbk2JapaneseContactNameFormatter.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,265 @@
+/*
+* Copyright (c) 2002-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: 
+*     Japanese contact name formatter.
+*
+*/
+
+
+#include "CPbk2JapaneseContactNameFormatter.h"
+#include <CVPbkContactFieldIterator.h>
+#include <MVPbkFieldType.h>
+#include <CVPbkFieldTypeRefsList.h>
+
+namespace {
+
+enum TNameOrder
+    {
+    ETopContactOrderNumber = 0,
+    EReadingFirstPart,
+    EReadingSecondPart,
+    ENameFirstPart,
+    ENameSecondPart
+    };
+} // namespace
+
+// -----------------------------------------------------------------------------
+// CPbk2JapaneseContactNameFormatter::CPbk2JapaneseContactNameFormatter
+// -----------------------------------------------------------------------------
+//
+CPbk2JapaneseContactNameFormatter::CPbk2JapaneseContactNameFormatter(
+    const MVPbkFieldTypeList& aMasterFieldTypeList,
+    const CPbk2SortOrderManager& aSortOrderManager)
+    :   CPbk2ContactNameFormatterBase( aMasterFieldTypeList,
+            aSortOrderManager )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CPbk2JapaneseContactNameFormatter::NewL
+// -----------------------------------------------------------------------------
+//
+CPbk2JapaneseContactNameFormatter* CPbk2JapaneseContactNameFormatter::NewL
+    (
+    const MVPbkFieldTypeList& aMasterFieldTypeList,
+    const CPbk2SortOrderManager& aSortOrderManager,
+    CVPbkFieldTypeSelector* aTitleFieldSelector,
+    const TDesC& aUnnamedText
+    )
+    {
+    CPbk2JapaneseContactNameFormatter* self = 
+        new(ELeave) CPbk2JapaneseContactNameFormatter(
+            aMasterFieldTypeList, aSortOrderManager );
+    CleanupStack::PushL(self);
+    self->ConstructL( aUnnamedText, aTitleFieldSelector );
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CPbk2JapaneseContactNameFormatter::ConstructL
+// -----------------------------------------------------------------------------
+//
+inline void CPbk2JapaneseContactNameFormatter::ConstructL
+        (const TDesC& aUnnamedText,
+         CVPbkFieldTypeSelector* aTitleFieldSelector )
+    {
+    // Base class takes ownership of aTitleFieldSelector.
+    // Must not leave after BaseConstructL
+    BaseConstructL( aUnnamedText, aTitleFieldSelector );
+    }
+
+// -----------------------------------------------------------------------------
+// CPbk2JapaneseContactNameFormatter::~CPbk2JapaneseContactNameFormatter
+// -----------------------------------------------------------------------------
+//
+CPbk2JapaneseContactNameFormatter::~CPbk2JapaneseContactNameFormatter()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CPbk2JapaneseContactNameFormatter::GetContactTitle
+// -----------------------------------------------------------------------------
+//
+void CPbk2JapaneseContactNameFormatter::GetContactTitle
+        (const MVPbkBaseContactFieldCollection& aContactFields,
+        TDes& aTitle, TUint32 aFormattingFlags)
+    {
+    aTitle.Zero();
+    SetFieldMapper( aContactFields );
+
+    // Try to create title using last/first name.
+    DoGetContactTitle(aTitle, aFormattingFlags,
+        ENameFirstPart, ENameSecondPart );
+
+    // If no last/first name, use reading fields
+    if ( aTitle.Length() == 0 && 
+         AreTitleFieldsEmpty( ENameFirstPart, ENameSecondPart ) )
+        {
+        DoGetContactTitle(aTitle, aFormattingFlags,
+            EReadingFirstPart, EReadingSecondPart );
+        }
+
+    // If there there was no data use rest of the fields
+    if ( aTitle.Length() == 0 &&
+         AreTitleFieldsEmpty( EReadingFirstPart, EReadingSecondPart ) )
+        {
+        // Find the next field in the sort order that has
+        // data to build the title
+        const TInt count = iFieldMapper.FieldCount();
+        DoGetContactTitle( aTitle, aFormattingFlags,
+            ENameSecondPart+1 , count-1 ); // zero-based
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CPbk2JapaneseContactNameFormatter::GetContactTitleForFind
+// -----------------------------------------------------------------------------
+//
+void CPbk2JapaneseContactNameFormatter::GetContactTitleForFind
+        (const MVPbkBaseContactFieldCollection& aContactFields,
+        TDes& aTitle, TUint32 aFormattingFlags)
+    {
+    aTitle.Zero();
+    SetFieldMapper( aContactFields );
+
+    // Try to use the name fields "reading first part", "reading second part", 
+    // "first part" and "second part"
+    DoGetContactTitle( aTitle, aFormattingFlags,
+        EReadingFirstPart, ENameSecondPart );
+
+    // If there there was no data in the name fields then
+    // use the rest of the fields in the sort order for the find
+    if ( aTitle.Length() == 0 &&
+         AreTitleFieldsEmpty( EReadingFirstPart, ENameSecondPart ) )
+        {
+        // Find the next title field in the sort order that has
+        // data to build the title
+        const TInt count = iFieldMapper.FieldCount();
+        DoGetContactTitle( aTitle, aFormattingFlags,
+            ENameSecondPart+1 , count-1 ); // zero-based
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CPbk2JapaneseContactNameFormatter::ActualTitleFieldsLC
+// See CPbk2JapaneseContactNameFormatter::GetContactTitle.
+// -----------------------------------------------------------------------------
+//
+CVPbkBaseContactFieldTypeListIterator*
+CPbk2JapaneseContactNameFormatter::ActualTitleFieldsLC(
+        CVPbkFieldTypeRefsList& aFieldTypeList,
+        const MVPbkBaseContactFieldCollection& aContactFields)
+    {
+    aFieldTypeList.Reset();
+
+    SetFieldMapper( aContactFields );
+
+    DoAppendNonEmptyTitleFieldTypesL(
+            aFieldTypeList,
+            ENameFirstPart,
+            ENameSecondPart);
+
+    if( aFieldTypeList.FieldTypeCount() == 0 )
+        {
+        DoAppendNonEmptyTitleFieldTypesL(
+                aFieldTypeList,
+                EReadingFirstPart,
+                EReadingSecondPart);
+        }
+
+    if( aFieldTypeList.FieldTypeCount() == 0 )
+        {
+        const TInt count = iFieldMapper.FieldCount();
+        DoAppendNonEmptyTitleFieldTypesL(
+                aFieldTypeList,
+                ENameSecondPart+1,
+                count-1);
+        }
+
+    return CVPbkBaseContactFieldTypeListIterator::NewLC(
+            aFieldTypeList,
+            aContactFields);
+    }
+
+// -----------------------------------------------------------------------------
+// CPbk2JapaneseContactNameFormatter::MaxTitleLength
+// -----------------------------------------------------------------------------
+//
+TInt CPbk2JapaneseContactNameFormatter::MaxTitleLength
+        (const MVPbkBaseContactFieldCollection& aContactFields,
+        const TUint32 aFormattingFlags)
+    {
+    TInt result = 0;
+    SetFieldMapper( aContactFields );
+
+    // Last/First name
+    result = DoCalculateMaxTitleLength
+        (aFormattingFlags, ENameFirstPart, ENameSecondPart);
+
+    // Last/First name reading
+    if (result == 0)
+        {
+        result = DoCalculateMaxTitleLength
+            ( aFormattingFlags, EReadingFirstPart, EReadingSecondPart );
+        }
+
+    if (result == 0)
+        {
+        // Use the rest of the fields in sort order to
+        // build the title (ie. the company name)
+        const TInt count = iFieldMapper.FieldCount();
+        result = DoCalculateMaxTitleLength
+            (aFormattingFlags, ENameSecondPart+1, count-1); // zero-based
+        }
+
+    return result;
+    }
+
+// -----------------------------------------------------------------------------
+// CPbk2JapaneseContactNameFormatter::MaxTitleLengthForFind
+// -----------------------------------------------------------------------------
+//
+TInt CPbk2JapaneseContactNameFormatter::MaxTitleLengthForFind
+        (const MVPbkBaseContactFieldCollection& aContactFields,
+        const TUint32 aFormattingFlags)
+    {
+    TInt result = 0;
+    SetFieldMapper( aContactFields );
+
+    const TInt count = iFieldMapper.FieldCount();
+    result = DoCalculateMaxTitleLength
+        ( aFormattingFlags, EReadingFirstPart, ENameSecondPart );
+
+    // Rest of the title fields
+    if( result == 0 )
+        {
+        result = DoCalculateMaxTitleLength
+            ( aFormattingFlags, ENameSecondPart + 1, count - 1 );
+        }
+
+    return result;
+    }
+
+// -----------------------------------------------------------------------------
+// CPbk2JapaneseContactNameFormatter::IsFindSeparatorChar
+// -----------------------------------------------------------------------------
+//
+TBool CPbk2JapaneseContactNameFormatter::IsFindSeparatorChar( TChar aCh )
+    {
+    return aCh.IsSpace();
+    }
+
+
+// End of File