phonebookengines/cntsortplugin/src/ccntsortplugin.cpp
changeset 49 74b30151afd6
parent 25 76a2435edfd4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/cntsortplugin/src/ccntsortplugin.cpp	Wed Jul 21 11:09:07 2010 +0300
@@ -0,0 +1,200 @@
+/*
+* 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: 
+*     Contact model ECOM sort plugin.
+*
+*/
+
+
+// INCLUDE FILES
+#include "ccntsortplugin.h"
+
+#include <SortUtil.h>
+#include <cntdef.h>
+
+#include "csortkeyarray.h"
+
+namespace {
+
+#ifdef _DEBUG
+enum TPanicType 
+    {
+    EPanicPreCond_CompareViewContactsL = 1,
+    EPanicSortUtilFactoryReturnedNULL,
+    EPanicInvalidViewParameters,
+    EPanicDefaultCompareFunctionNULL,
+    EPanicDefaultIsSortableFunctionNULL
+    };
+
+void Panic(TPanicType aPanicType)
+    {
+    _LIT(KPanicTxt, "CCntSortPlugin");
+    User::Panic(KPanicTxt, aPanicType);
+    }
+#endif
+} // namespace
+
+// ========================== MEMBER FUNCTIONS ===============================
+
+// ---------------------------------------------------------------------------
+// CCntSortPlugin::NewL
+// ---------------------------------------------------------------------------
+//
+CCntSortPlugin* CCntSortPlugin::NewL(TAny* aParams)
+	{
+	CCntSortPlugin* self = new(ELeave) CCntSortPlugin;
+    CleanupStack::PushL( self );
+    self->ConstructL(static_cast<TSortPluginParams*>(aParams));
+    CleanupStack::Pop();
+	return self;
+	}
+
+// ---------------------------------------------------------------------------
+// CCntSortPlugin::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CCntSortPlugin::ConstructL(TSortPluginParams* aParams)
+    {
+	// Validate parameters
+	if (!aParams || 
+        (aParams->iParametersRevision != KCntSortPluginViewParamsRev1Uid))
+		User::Leave(KErrArgument);
+
+    TSortPluginViewParamsRev1* viewParams = 
+        static_cast<TSortPluginViewParamsRev1*>(aParams->iViewSortParams);
+
+    __ASSERT_DEBUG(viewParams, 
+                   Panic(EPanicInvalidViewParameters));
+    __ASSERT_DEBUG(viewParams->iCompareViewContactsL, 
+                   Panic(EPanicDefaultCompareFunctionNULL));
+    __ASSERT_DEBUG(viewParams->iIsSortable, 
+                   Panic(EPanicDefaultIsSortableFunctionNULL));
+
+    iIsSortable = viewParams->iIsSortable;
+    
+    iSortUtil = CSortUtil::NewL();
+    // Sort Util factory has to return valid pointer
+    // Factory should default to european sorting if nothing else is
+    // applicable
+    __ASSERT_DEBUG(iSortUtil, Panic(EPanicSortUtilFactoryReturnedNULL));
+
+    iLeftSortKeyArray = CSortKeyArray::NewL();
+    iRightSortKeyArray = CSortKeyArray::NewL();
+    }
+
+// ---------------------------------------------------------------------------
+// CCntSortPlugin::CCntSortPlugin
+// ---------------------------------------------------------------------------
+//
+CCntSortPlugin::CCntSortPlugin()
+	{
+	}
+
+// ---------------------------------------------------------------------------
+// CCntSortPlugin::~CCntSortPlugin
+// ---------------------------------------------------------------------------
+//
+CCntSortPlugin::~CCntSortPlugin()
+	{
+    delete iSortUtil;
+    iSortOrder.Close();
+    delete iLeftSortKeyArray;
+    delete iRightSortKeyArray;
+	}
+
+void CCntSortPlugin::SetSortOrderL
+        (const RContactViewSortOrder& aViewSortOrder)
+    {
+    iSortOrder.Close();
+    iSortOrder.CopyL(aViewSortOrder);
+    }
+
+TInt CCntSortPlugin::SortStart(TSortStartTypes aSortStartType, TInt aCount)
+    {
+    TRAPD(ret, DoSortStartL(aSortStartType, aCount));
+    return ret;
+    }
+
+void CCntSortPlugin::DoSortStartL
+        (TSortStartTypes /* aSortStartType */, TInt /* aCount */)
+    {
+    iLeftSortKeyArray->Reset();
+    iRightSortKeyArray->Reset();
+
+    const TInt count = iSortOrder.Count();
+    for (TInt i = 0; i < count; ++i)
+        {
+        TFieldType fieldType = iSortOrder[i];
+        if (fieldType == KUidContactFieldGivenNamePronunciation ||
+            fieldType == KUidContactFieldFamilyNamePronunciation ||
+            fieldType == KUidContactFieldCompanyNamePronunciation)
+            {
+            iLeftSortKeyArray->AppendL
+                (TSortKey(KNullDesC, ESortKeyPronounciation));
+            iRightSortKeyArray->AppendL
+                (TSortKey(KNullDesC, ESortKeyPronounciation));
+            }
+        else
+            {
+            iLeftSortKeyArray->AppendL(TSortKey(KNullDesC, ESortKeyBasic));
+            iRightSortKeyArray->AppendL(TSortKey(KNullDesC, ESortKeyBasic));
+            }
+        }
+    }
+
+void CCntSortPlugin::SortCompleted()
+    {
+    iLeftSortKeyArray->Reset();
+    iRightSortKeyArray->Reset();
+    }
+
+TInt CCntSortPlugin::SortCompareViewContactsL
+        (const CViewContact& aLhs, const CViewContact& aRhs)
+    {
+    __ASSERT_DEBUG(aLhs.FieldCount() == iSortOrder.Count(),
+                   Panic(EPanicPreCond_CompareViewContactsL));
+    __ASSERT_DEBUG(aRhs.FieldCount() == iSortOrder.Count(),
+                   Panic(EPanicPreCond_CompareViewContactsL));
+    __ASSERT_DEBUG(iLeftSortKeyArray && 
+                   iLeftSortKeyArray->SortKeyCount() == iSortOrder.Count(),
+                   Panic(EPanicPreCond_CompareViewContactsL));
+    __ASSERT_DEBUG(iRightSortKeyArray && 
+                   iRightSortKeyArray->SortKeyCount() == iSortOrder.Count(),
+                   Panic(EPanicPreCond_CompareViewContactsL));
+
+    // Change the text in the sortkeys to correspond fields in the contacts
+    const TInt count = iSortOrder.Count();
+    for (TInt i = 0; i < count; ++i)
+        {
+        iLeftSortKeyArray->SetText(aLhs.Field(i), i);
+        iRightSortKeyArray->SetText(aRhs.Field(i), i);
+        }
+
+    return iSortUtil->Interface()->CompareItems
+        (*iLeftSortKeyArray, *iRightSortKeyArray);
+    }
+
+TInt CCntSortPlugin::ApiCompareViewContactsL
+    (const CViewContact& aLhs, const CViewContact& aRhs)
+    {
+    return SortCompareViewContactsL(aLhs, aRhs);
+    }
+
+TBool CCntSortPlugin::ViewContactIsSortable
+        (const CViewContact& aViewContact)
+    {
+    return iIsSortable(aViewContact);
+    }
+
+// End of File