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

#ifndef CESMREDITORDIALOG_H
#define CESMREDITORDIALOG_H

#include <AknDialog.h>
#include <akntoolbarobserver.h>
#include <AknServerApp.h>
#include "mesmruibase.h"
#include "mesmrresponseobserver.h"
#include "mesmrfieldeventobserver.h"
#include "cesmrfieldbuilderinterface.h"

class CESMRPolicy;
class MESMRCalEntry;
class CESMRView;
class MAgnEntryUiCallback;
class CESMRSendUI;
class CESMRField;
class CESMRTitlePaneHandler;
class CCalenInterimUtils2;
class CESMRLocationPluginHandler;
class CESMRAddressInfoHandler;
class CESMRFeatureSettings;
class CMRToolbar;
class MMRInfoProvider;
class TDataType;
class MMRFocusStrategy;
class MESMRMeetingRequestEntry;

/**
 *  CESMREditorDialog implements the editor dialog for meeting requests.
 *
 *  @see mesmruibase.h, mesmruifactory.h
 *  @lib esmrgui.lib
 */
NONSHARABLE_CLASS( CESMREditorDialog ) :
		public CAknDialog,
		public MESMRUiBase,
		public MESMRResponseObserver,
		public MESMRFieldEventObserver,
		public MAknToolbarObserver
    {
public:
    /**
     * Two-phased constructor.
     *
     * @param aPolicy contains all the fields for list component.
     * @param aEntry ESMR calendar entry (wraps the CCalEntry object)
     * @param aCallback Callback interface for AgnEntryUI
     * @return Pointer to created and initialized esmr editor dialog.
     */
    IMPORT_C static CESMREditorDialog* NewL(
            MMRInfoProvider& aInfoProvider,
            MAgnEntryUiCallback& aCallback );

    /*
     * Destructor.
     */
    ~CESMREditorDialog();

public: // From CAknDialog
    SEikControlInfo CreateCustomControlL( TInt aType );
    TKeyResponse OfferKeyEventL(
            const TKeyEvent& aEvent,
            TEventCode aType);
    TBool OkToExitL ( TInt aButtonId );
    void ActivateL();
    void ProcessCommandL( TInt aCommand );
    void DynInitMenuPaneL( TInt aResourceId, CEikMenuPane* aMenuPane );

public: // From MESMRUIBase
    TInt ExecuteViewLD();
    
public: // From MAknToolbarObserver
    void DynInitToolbarL ( TInt aResourceId, CAknToolbar* aToolbar );
    void OfferToolbarEventL ( TInt aCommand );  
    
public: // From MESMRResponseObserver
    TBool Response( TInt aCommand );
    void ExitDialog();
    void ChangeReadyResponseL();
    
protected: // From MESMRFieldEventObserver
    void HandleFieldEventL( const MESMRFieldEvent& aEvent );

private: // Implementation

    void DoProcessCommandL( TInt aCommand );

    /**
     * Constructor.
     *
     * @param aEntry ESMR calendar entry (wraps the CCalEntry object)
     * @param aCallback Callback interface for AgnEntryUI
     */
    CESMREditorDialog(
            MMRInfoProvider& aPolicyProvider,
            MAgnEntryUiCallback& aCallback );

    /**
     * Second phase constructor.
     *
     * @param aPolicy contains all the fields for list component.
     */
    void ConstructL();

    /**
     * Handles dialog exit, saves entry etc.
     * @return TInt
     */
    TInt HandleExitL();

    /**
     * Handles dialog exit, saves, no queries.
     * @param aShowConfirmationQuery ETrue shows 'save changes' query before saving entry.
     * @return TInt
     */
    TInt HandleForcedExitL( TBool aShowConfirmationQuery = EFalse );

    /**
     * Sends calendar entry.
     * @param aCommandId
     */
    void SendCalendarEntryL(TInt aCommandId);

    /**
     * Tries to add send menu item to options menu if needed.
     * @param aMenuPane
     */
    void TryInsertSendMenuL(CEikMenuPane* aMenuPane);

    /**
     * Executes user related queries whether the entry should be
     * save or not.
     * @return TBool
     */
    TBool IsAllowedToSaveL();

    /**
     * Checks if cfsmailbox supports given capability.
     * @param aCapa, the capability
     * @return TBool
     */
    TBool SupportsMailBoxCapabilityL( 
            MESMRBuilderExtension::TMRCFSMailBoxCapability aCapa );
    
    /**
     * Handle options menu command "open"
     */
    void HandleOpenCmdL();

    /**
     * Handles Location Options submenu content
     * 
     * @param aResourceId Menu resource id
     * @param aMenuPane menu pane 
     */
    void HandleLocationOptionsL( TInt aResourceId, CEikMenuPane* aMenuPane );
    
    CESMRLocationPluginHandler& LocationPluginHandlerL();
    CESMRAddressInfoHandler& AddressInfoHandlerL();
    void HandleFieldCommandEventL( const MESMRFieldEvent& aEvent );
    void HandleFieldChangeEventL( const MESMRFieldEvent& aEvent );
    TBool SetContextMenuL();
    void SwitchEntryTypeL( TInt aCommand, TBool aAdjustView );
    inline const CESMRPolicy& Policy() const;
    void SetTitleL();
    void VerifyMeetingRequestL();
    TBool TryOpenAttachmentL();
    TInt TryRemoveAttachmentL();   
    TInt TryRemoveAllAttachmentsL();
    TInt TryAddAttachmentL();
    void ShowContextMenuL();
    
    /**
     * Check mr is past
     * 
     * @param aEvent
     * @return TBool
     */
    TBool OccursInPastL( const MESMRFieldEvent& aEvent );    
    TBool OccursInPast( const TTime& aStartUtc );
    void ChangeRightSoftkeyL( TBool aOccursInPast, TBool aIsOrganizer );
    
    TInt TryToSaveEntryL();
    
private:

    /**
     * Ref: Info provider for accessing entry and policy
     */
    MMRInfoProvider& iInfoProvider;

    /**
     * Ref: The only control in this dialog. Fwk deletes.
     */
    CESMRView* iView;

    /**
     * Ref: Agn Entry UI callback interface
     */
    MAgnEntryUiCallback& iCallback;

    /**
     * Own: Calendar Global data
     */
    CESMRSendUI* iESMRSendUI;

    /**
     * Own: Boolean indicating if required attendees field contains items.
     */
    TBool iRequiredAttendeesEnabled;

    /**
     * Own: Boolean indicating if optional attendees field contains items.
     */
    TBool iOptionalAttendeesEnabled;

    /// Own: Titlepane handler
    CESMRTitlePaneHandler* iTitlePane;

    /**
     * Pointer to instance of CCalenInterimUtils2.
     * Own: Release on destruct.
     */
    CCalenInterimUtils2* iInterimUtils;
    
	/**
	 * Location plugin handler.
	 * Own.
	 */
    CESMRLocationPluginHandler* iLocationPluginHandler;
	
    /**
     * Address info handler.
     * Own.
     */
    CESMRAddressInfoHandler* iAddressInfoHandler;
    
    /**
     * Feature settings.
     * Own.
     */
    CESMRFeatureSettings* iFeatures;
    
    /**
     * Indicates if location has been modified.
     */
    TBool iLocationModified;
    /// Own: Toolbar handler
    CMRToolbar* iToolbar;
    
    /// Own: Context menu resource id
    TInt iContextMenuResourceId;
    /// Own: Focus strategy of the editor
    MMRFocusStrategy* iFocusStrategy;
    
    // record time after time field updated
    TTime iStartTimeUtc;
    };

#endif  // CESMREDITORDIALOG_H
