/*
* 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:  Contains the implementation of response area
 *
*/

#ifndef CESMRRESPONSEFIELD_H
#define CESMRRESPONSEFIELD_H

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

#include "cesmrfield.h"
#include "resmrpluginextensionstatic.h"

// FORWARD DECLARATIONS
class CLayoutManager;
class MESMRResponseObserver;
class CESMRConflictPopup;
class CESMRResponseItem;

/**
 * Response field is the actual field that receives focus when scrolling in the
 * viewer list. This field constructs the items and sets texts, fonts and sizes for those,
 * This field is also responsible of scrolling between the items and calling the response observer
 * when answer is selected (e.g. by pressing accept item).
 */
NONSHARABLE_CLASS( CESMRResponseField ) : public CESMRField
    {
    public:
        /**
         * Creates new response field. Response field is responsible
         * of creating all the items needed in the area.
         * @return New response field object.
         */
        static CESMRResponseField* NewL(MESMRResponseObserver* aResponseObserver);
    
        /**
         * C++ Destructor.
         */
        ~CESMRResponseField();
    
    public: // From CCoeControl
        TInt CountComponentControls() const;
        CCoeControl* ComponentControl( TInt aInd ) const;
        void SizeChanged();
        TKeyResponse OfferKeyEventL( const TKeyEvent& aKeyEvent,  TEventCode aType );
        void FocusChanged( TDrawNow aDrawNow );
        TSize MinimumSize();
        
    public: // From CESMRField
        void InitializeL();
        void InternalizeL( MESMRCalEntry& aEntry );
        TBool ExecuteGenericCommandL( TInt aCommand );
        void SetOutlineFocusL( TBool aFocus );
        TBool HandleSingletapEventL( const TPoint& aPosition );
        void HandleLongtapEventL( const TPoint& aPosition );
        
    public: // New methods
        /**
         * Set the response observer for this class.
         *
         * @param aResponseObserver - Response observer
         */
        void AddObserver( MESMRResponseObserver* aResponseObserver );
    
        /**
         * Calls onwards the SetFont() method for all the items in the array
         *
         * @param aFont - Font to be set.
         */
        void SetFont( const CFont* aFont );
        
        /**
         * Selects the current item.
         * @return ETrue if item is selectable
         */
        TBool ItemSelectedL();
    
    private: // Implementation
        CESMRResponseField(MESMRResponseObserver* aResponseObserver);
        void ConstructL();
        void HandleCancelledEventItemsL( MESMRCalEntry& aEntry );
        CCoeControl* ControlItem( TInt aIndex );
        TBool HandleTapEventL( const TPoint& aPosition );
    
    private:
        /// Own: Conflict popup
        CESMRConflictPopup* iConfPopup ;
        /// Array for the response items. Owns the items.
        RPointerArray <CESMRResponseItem> iResponseItemArray;
        /// Observer for the response
        MESMRResponseObserver* iResponseObserver;
        /// Currently selected index 
        TInt iSelectionIndex;
        /// Font for the label text
        const CFont* iFont;
        /// Own: Static TLS data handler
        RESMRPluginExtensionStatic iESMRStatic;
        /// iESMRstatic accessed
        TBool iESMRStaticAccessed;
        /// whether a normal response
        TBool iNormalResponse;  
        /// whether a remove response
        TBool iRemoveResponse;      
        /// Judge if there is any event conflict with current event.
        TBool iConflicted;
        /// Judge whether it has implemented HandleSingletapEventL
        TBool iPointEvent;
        /// Judge whether the long tap have been consumed. 
        /// To avoid the same event be handled by
        /// HandleSingletapEventL() when HandleLongtapEventL().
        TBool iLongTapEventConsumed;
     
    };


#endif // CESMRRESPONSEFIELD_H
