/*
* Copyright (c) 2009 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:  ESMR field storage definition
*
*/

#ifndef CESMRFIELDSTORAGE_H
#define CESMRFIELDSTORAGE_H

#include <e32base.h>
//<cmail>
#include "esmrdef.h"
//</cmail>
#include "mesmrfieldstorage.h"
#include "cesmrfieldbuilderinterface.h"

class CESMRField;
class MESMRCalEntry;
class MESMRFieldEventObserver;
class CESMRFieldEventQueue;
class CESMRPolicy;
class CMRSystemNotifier;

/**
 * CESMRFieldStorage is a base class for different storage classes.
 * Storage class owns the fields needed to draw UI. This class also has methods
 * to add new fields into field array.
 *
 * fields for the ui are created are created in a separate ecom plugin 
 * loaded here
 */
NONSHARABLE_CLASS( CESMRFieldStorage ): public CBase, 
										public MESMRFieldStorage
    {
public:
    // Destructor
    virtual ~CESMRFieldStorage();

public:
    /**
     * Adds new field into field array.
     *
     * @param aField - field to be added
     */
    void AddFieldL( CESMRField* aField );

    /**
     * Adds new field into field array.
     *
     * @param aField - field to be added
     * @param aVisible - is this field visible by default ot not.
     */
    void AddFieldL( CESMRField* aField, TBool aVisible );

   /**
     * Creates editor field.
     *
     * @param aValidator - time validator
     * @param aField - field to be created
     */
    CESMRField* CreateEditorFieldL(
                MESMRFieldValidator* aValidator,
                TESMREntryField aField );

    /**
     * Creates viewer field.
     *
     * @param aResponseObserver - observer to be called when e.g.
     *                            answer is ready to be sent.
     * @param aField - field to be created
     * @param aResponseReady - NOT IN USE
     */
    CESMRField* CreateViewerFieldL(
                MESMRResponseObserver* aResponseObserver,
                TESMREntryField aField,
                TBool aResponseReady );

public: // From MESMRFieldStorage
    TInt Count() const;
    CESMRField* Field( TInt aInd ) const;
    CESMRField* FieldById( TESMREntryFieldId aId ) const;
    void InternalizeL( MESMRCalEntry& aEntry );
    void ExternalizeL( MESMRCalEntry& aEntry );
    TInt Validate( TESMREntryFieldId& aId, TBool aForceValidate );
    void ChangePolicyL( const CESMRPolicy& aNewPolicy,
                        MESMRCalEntry& aEntry );

protected:
    // C++ constructor
    CESMRFieldStorage(
            MESMRFieldEventObserver& aEventObserver );

    void BaseConstructL();
    
    CESMRFieldEventQueue& EventQueueL();
    
    void RemoveField( TInt aInd );
    
    void InsertFieldL( CESMRField* aField, TInt aIndex );
    
    void ReserveL( TInt aCount );
    
    void Reset();
    
private:
    /**
     * loads fieldbuilder ecom plugin
     * delayed until the first time the plugin is needed
     */
    void LoadPluginL();

    MESMRFieldBuilder* FieldBuilderL();    

private:
    /// Own: Array that owns all the fields
    RPointerArray< CESMRField > iArray;
    /// Own: ecom field builder interface
    CESMRFieldBuilderInterface* iPlugin;
    /// Ref: composite class of field builder interface
    MESMRFieldBuilder* iFieldBuilder;
    /// Ref: Event observer
    MESMRFieldEventObserver& iEventObserver;
    /// Own: Event Queue
    CESMRFieldEventQueue* iEventQueue;
    /// Own: System notifier
    CMRSystemNotifier* iSystemNotifier;
    };

#endif // CESMRFIELDSTORAGE_H

// EOF

