/*
* 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
*
*/


#ifndef __CCntSortPlugin_H__
#define __CCntSortPlugin_H__

// INCLUDES
#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS
#include <cntviewsortplugin.h>
#else
#include <cntviewsortplugin.h>
#include <cntviewsortpluginbase.h>
#endif

// FORWARD DECLARATIONS
class CSortUtil;
class CSortKeyArray;

// CLASS DECLARATION

/**
 * This class implements the functionality promised by 
 * the CViewContactSortInterfaceDefinition definition class.
 */
class CCntSortPlugin : public CViewContactSortPlugin
    {
    public: // Construction / Destruction
        /**
         * Two phase static constructor.
         * @param aParams Parameters for construction.
         * @return Newly created instance of CCntSortPlugin.
         */
        static CCntSortPlugin* NewL(TAny* aParams);
        ~CCntSortPlugin();

    private:	// From CContactViewSortConfigInterface
        void SetSortOrderL(const RContactViewSortOrder& aViewSortOrder);
        TInt SortStart(TSortStartTypes aSortStartType, TInt aCount);
        void SortCompleted();
        TInt SortCompareViewContactsL
            (const CViewContact& aLhs, const CViewContact& aRhs);
        TInt ApiCompareViewContactsL
            (const CViewContact& aLhs, const CViewContact& aRhs);
        TInt CompareViewContactsL(const CViewContact& aLhs, const CViewContact& aRhs);
        TBool ViewContactIsSortable(const CViewContact& aViewContact);

    private: // Implementation
        /**
         * Standard C++ constructor.
         */
        CCntSortPlugin();

        /**
         * 2nd phase constructor.
         */
        void ConstructL(TSortPluginParams* aParams);

        /**
         * Do the actual sort starting.
         * @param aSortStartType Type of the sort to start.
         * @param aCount Approximate number of contacts to process.
         */
        void DoSortStartL(TSortStartTypes aSortStartType, TInt aCount);
    private: // Data
        /// Own: The sort util
        CSortUtil* iSortUtil;
        /// Currently active sort order
        RContactViewSortOrder iSortOrder;
        /// Index of top contact field in iSortOrder
        TInt iTopContactId;
        /// Ref: Is sortable function 
	    TBool(*iIsSortable)(const CViewContact& aViewContact);
        /// Own: sort key array for left hand side
        CSortKeyArray* iLeftSortKeyArray;
        /// Own: sort key array for right hand side
        CSortKeyArray* iRightSortKeyArray;
    };

#endif // __CCntSortPlugin_H__

// End of File
