phonebookui/Phonebook/View/src/CPbkChineseFindPrimitives.cpp
changeset 0 e686773b3f54
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook/View/src/CPbkChineseFindPrimitives.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,149 @@
+/*
+* 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: 
+*    Chinese find primitives implementation for Phonebook.
+*
+*/
+
+
+// INCLUDE FILES
+#include "CPbkChineseFindPrimitives.h"
+#include <FindUtil.h>
+#include <CPbkViewContactNameFormatter.h>
+#include <PbkEngUtils.h>
+
+#include <PbkDebug.h>
+#include "PbkProfiling.h"
+
+
+// ==================== MEMBER FUNCTIONS ====================
+
+inline CPbkChineseFindPrimitives::CPbkChineseFindPrimitives()
+    {
+    }
+
+inline void CPbkChineseFindPrimitives::ConstructL
+        (MPbkContactNameFormat& aContactNameFormatter)
+    {
+    __PBK_PROFILE_RESET(PbkProfiling::EContactsMatchingCriteria);
+    iFindUtil = CFindUtil::NewL();
+    if (!iFindUtil)
+        {
+        User::Leave(KErrNotSupported);
+        }
+
+    iViewContactNameFormatter = 
+        CPbkViewContactNameFormatter::NewL(aContactNameFormatter);
+    }
+
+/**
+ * Returns formatted contact title for aViewContact.
+ */
+inline const TDesC& CPbkChineseFindPrimitives::ContactTitleL
+        (const CViewContact& aViewContact)
+    {
+    return iViewContactNameFormatter->ContactTitleL
+        (aViewContact,iContactViewSortOrder);
+    }
+
+/**
+ * Returns ETrue if aCh is a word separator character.
+ */
+inline TBool CPbkChineseFindPrimitives::IsWordSeparator(TChar aCh)
+    {
+	return aCh==' '||aCh=='-'||aCh=='\t';
+    }
+
+/**
+ * Returns true if aTargetText matches aFindText.
+ */
+inline TBool CPbkChineseFindPrimitives::IsMatchL
+        (const TDesC& aTargetText, const TDesC& aFindText)
+    {
+	return iFindUtil->Interface()->MatchRefineL(aTargetText, aFindText);
+    }
+
+CPbkChineseFindPrimitives* CPbkChineseFindPrimitives::NewL
+        (MPbkContactNameFormat& aContactNameFormatter)
+    {
+    CPbkChineseFindPrimitives* self = new(ELeave) CPbkChineseFindPrimitives;
+    CleanupStack::PushL(self);
+    self->ConstructL(aContactNameFormatter);
+    CleanupStack::Pop(self);
+    return self;    
+    }
+
+CPbkChineseFindPrimitives::~CPbkChineseFindPrimitives()
+    {
+    delete iInitialFindText;
+    iContactViewSortOrder.Close();
+    delete iViewContactNameFormatter;
+	delete iFindUtil;
+    }
+
+void CPbkChineseFindPrimitives::SetContactViewSortOrderL
+        (const RContactViewSortOrder& aSortOrder)
+    {
+    iContactViewSortOrder.CopyL(aSortOrder);
+    }
+
+TBool CPbkChineseFindPrimitives::IsFindMatchL
+        (const CViewContact& aViewContact, const TDesC& aFindText)
+    {
+    return IsMatchL(ContactTitleL(aViewContact), aFindText);
+    }
+
+void CPbkChineseFindPrimitives::GetInitialMatchesL
+        (CContactViewBase& aView,
+        const TDesC& aFindText,
+        RPointerArray<CViewContact>& aMatchedContacts)
+    {
+    MDesCArray* findWords = PbkEngUtils::BreakInWordsLC(aFindText, IsWordSeparator);
+    __PBK_PROFILE_START(PbkProfiling::EContactsMatchingCriteria);
+	aView.ContactsMatchingCriteriaL(*findWords, aMatchedContacts);    
+    __PBK_PROFILE_END(PbkProfiling::EContactsMatchingCriteria);
+    // Please note that european Phonebook uses CContactViewBase::ContactsMatchingPrefixL() 
+    CleanupStack::PopAndDestroy();  // findWords
+
+    // Store initial find text
+    iInitialFindText = PbkEngUtils::CopyL(iInitialFindText, aFindText);
+
+    // Filter away any nonmatching contacts returned by 
+    // CContactViewBase::ContactsMatchingCriteriaL
+    for (TInt i = aMatchedContacts.Count()-1; i >= 0; --i)
+        {
+        CViewContact* contact = aMatchedContacts[i];
+        if (!IsMatchL(ContactTitleL(*contact),aFindText))
+            {
+            aMatchedContacts.Remove(i);
+            delete contact;
+            }
+        }
+
+    __PBK_PROFILE_DISPLAY(PbkProfiling::EContactsMatchingCriteria);
+    }
+
+TBool CPbkChineseFindPrimitives::MatchesInitialFindTextL(const TDesC& aText)
+    {
+    return (iInitialFindText ? IsMatchL(aText,*iInitialFindText) : EFalse);
+    }
+
+TBool CPbkChineseFindPrimitives::MatchesInitialFindTextL
+        (const CViewContact& aViewContact)
+    {
+    return MatchesInitialFindTextL(ContactTitleL(aViewContact));
+    }
+
+
+// End of File