/*
* Copyright (c) 2005-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:  Phonebook 2 presentation level contact field collection.
*
*/



#ifndef CPBK2PRESENTATIONCONTACTFIELDCOLLECTION_H
#define CPBK2PRESENTATIONCONTACTFIELDCOLLECTION_H

//  INCLUDES
#include <e32base.h>
#include <MVPbkStoreContactFieldCollection.h>

// FORWARD DECLARATIONS
class CPbk2PresentationContactField;
class MPbk2FieldPropertyArray;
class MPbk2FieldProperty;
class CPbk2FieldPropertyGroup;
class MVPbkStoreContactField;

// CLASS DECLARATION

/**
 * Phonebook 2 presentation level contact field collection.
 */
class CPbk2PresentationContactFieldCollection : public CBase,
                                                public MVPbkStoreContactFieldCollection
    {
    public: // Constructors and destructor

        /**
         * Creates a new instance of this class.
         *
         * @param aFieldProperties  An array of field properties.
         * @param aFieldCollection  A collection of store fields.
         * @param aParentContact    The contact that owns this collection.
         * @return  A new instance of this class.
         */
        IMPORT_C static CPbk2PresentationContactFieldCollection* NewL(
                const MPbk2FieldPropertyArray& aFieldProperties,
                MVPbkStoreContactFieldCollection& aFieldCollection,
                MVPbkStoreContact& aParentContact );

        /**
         * Destructor.
         */
        virtual ~CPbk2PresentationContactFieldCollection();

    public: // Interface

        /**
         * Returns the presentation level field.
         *
         * @param aIndex    The index of the field in the array.
         * @return  Presentation level field.
         */
        IMPORT_C CPbk2PresentationContactField& At(
                TInt aIndex ) const;

        /**
         * Checks if there is a field with given property in the collection.
         *
         * @param aProperty     The property to search for.
         * @return  The index of the field or KErrNotFound.
         */
        IMPORT_C TInt ContainsField(
                const MPbk2FieldProperty& aProperty ) const;

        /**
         * Checks if the collection contains a field from the group of
         * properties.
         *
         * @param aPropertyGroup    A group of field properties.
         * @return  ETrue if the collection has at least one field
         *          with the property in the group.
         */
        IMPORT_C TBool ContainsFieldFromGroup(
                const CPbk2FieldPropertyGroup& aPropertyGroup ) const;

        /**
         * Returns the index of the given field or
         * KErrNotFound if not found.
         *
         * @param aField    The field that is searched for.
         * @return  The index of the field in this collection.
         */
        IMPORT_C TInt FindFieldIndex(
                const MVPbkStoreContactField& aField ) const;

        /**
         * Gets the index of the field in the store contact.
         *
         * @param aFieldIndex   The index of the field in this collection.
         * @return  The index of the field in the
         *          store contact field collection.
         */
        IMPORT_C TInt StoreIndexOfField(
                TInt aFieldIndex ) const;

        /**
         * get index if field by store field index
         * 
         * @param aStoreFieldIndex, a store field's index
         * @return the index of the field.
         */
        IMPORT_C TInt FieldIndexOfStoreField( TInt aStoreFieldIndex ) const;
        
        /**
         * Returns the field properties.
         *
         * @return  Field properties.
         */
        inline const MPbk2FieldPropertyArray& FieldProperties() const;

        /**
         * Adds a new field mapping. The field must belong to
         * the same contact as this field collection.
         *
         * @param aField    A new store contact field for the mapping.
         * @param aName     A new store contact field property name for the mapping.
         */
        void AddFieldMappingL(const MVPbkStoreContactField& aField,
                const TDesC& aName);

        /**
         * Deletes the field mapping from the given index.
         *
         * @param aIndex    The index from where to remove mapping.
         */
        void RemoveFieldMapping(
                TInt aIndex );

        /**
         * Destroys all the field mappings.
         */
        void ResetFieldMappings();

    public: // From MVPbkStoreContactFieldCollection
        MVPbkBaseContact& ParentContact() const;
        TInt FieldCount() const;
        const MVPbkStoreContactField& FieldAt(
                TInt aIndex ) const;
        MVPbkStoreContactField& FieldAt(
                TInt aIndex );
        MVPbkStoreContactField* FieldAtLC(
                TInt aIndex ) const;
        MVPbkStoreContact& ParentStoreContact() const;
        MVPbkStoreContactField* RetrieveField(
                const MVPbkContactLink& aContactLink ) const;

    private: // Implementation
        CPbk2PresentationContactFieldCollection(
                const MPbk2FieldPropertyArray& aFieldProperties,
                MVPbkStoreContactFieldCollection& aFieldCollection,
                MVPbkStoreContact& aParentContact );
        void ConstructL();

    private: // Data
        /// Ref: An array of field properties
        const MPbk2FieldPropertyArray& iFieldProperties;
        /// Ref: A collection of store fields
        MVPbkStoreContactFieldCollection& iFieldCollection;
        /// Ref: The parent contact of the collection
        MVPbkStoreContact& iParentContact;
        /// Own: Phonebook 2 presentation contact fields
        RPointerArray<CPbk2PresentationContactField> iFields;
    };

// INLINE IMPLEMENTATION

// --------------------------------------------------------------------------
// CPbk2PresentationContactFieldCollection::FieldProperties
// --------------------------------------------------------------------------
//
inline const MPbk2FieldPropertyArray&
        CPbk2PresentationContactFieldCollection::FieldProperties() const
    {
    return iFieldProperties;
    }

#endif // CPBK2PRESENTATIONCONTACTFIELDCOLLECTION_H

// End of File
