// EDITWATC.H
//
// Copyright (C) Symbian Ltd 1998
//

// MODULE - Msv operation for app watching

#if !defined(__EDITWATC_H__)
#define __EDITWATC_H__

#if !defined(__MSVAPI_H__)
#include <msvapi.h>
#endif

#if !defined(__APPARC_H__)
#include <apparc.h>
#endif

//
class CEikDocument;
class CCommandAbsorbingControl;
//

//////////////////////////////////////////////////////////////////////
//	MsgEditorLauncher												//
//////////////////////////////////////////////////////////////////////
//	Static class which launches editor application (provided editor	//
//	conforms to \MSGEIK\EDIT architecture.							//
//																	//
//	The returned operation completes when the launched application	//
//	closes down.													//
//////////////////////////////////////////////////////////////////////
class MsgEditorLauncher
	{
public:
	IMPORT_C static CMsvOperation* LaunchEditorApplicationEmbeddedL(CMsvSession& aSession, TUid aMtmType, TRequestStatus& aStatus, 
														   const TEditorParameters& aParams, const TDesC& aAppName);

	IMPORT_C static CMsvOperation* LaunchEditorApplicationEmbeddedL(CMsvSession& aSession, TUid aMtmType, TRequestStatus& aStatus, 
														   const TEditorParameters& aParams, const TDesC& aAppName, const TDesC8& aProgressPack);

	IMPORT_C static CMsvOperation* LaunchEditorApplicationL(CMsvSession& aSession, TUid aMtmType, TRequestStatus& aStatus, 
														   const TEditorParameters& aParams, const TDesC& aAppName, const TDesC8* aAddtionalParams=NULL);

	IMPORT_C static CMsvOperation* LaunchEditorApplicationL(CMsvSession& aSession, TUid aMtmType, TRequestStatus& aStatus, 
														   const TEditorParameters& aParams, const TDesC& aAppName, const TDesC8& aProgressPack, const TDesC8* aAddtionalParams=NULL);
	};


//////////////////////////////////////////////////////////////////////////////
//	CMsgEditorWatchingOperation												//
//////////////////////////////////////////////////////////////////////////////
//	Simple operation class which watches a thread id (editor application),	//
//	completing when that thread closes.										//
//																			//
//	The passed CMsvSession is not used (merely required to base-construct	//
//	a CMsvOperation.														//
//////////////////////////////////////////////////////////////////////////////
class CMsgEditorWatchingOperation : public CMsvOperation
	{
public:
	IMPORT_C CMsgEditorWatchingOperation(CMsvSession& aMsvSession, TInt aPriority, TRequestStatus& aObserverRequestStatus, TUid aMtm);
	IMPORT_C ~CMsgEditorWatchingOperation();
	IMPORT_C void SetProgressPackageL(const TDesC8& aProgress);
	void TakeAbsorberControl(CCommandAbsorbingControl* aCommandAbsorbingControl);

protected:
	// From CMsvOperation
	virtual const TDesC8& ProgressL();

	// From CActive
	virtual void RunL();
	virtual void DoCancel();
	
	// Specific
	void Start();

protected:// Data
	HBufC8*		iProgress;
	CCommandAbsorbingControl* iCommandAbsorbingControl;
	};

class CMsgEmbeddedEditorWatchingOperation : public CMsgEditorWatchingOperation, public MApaEmbeddedDocObserver
	{
public:
	IMPORT_C CMsgEmbeddedEditorWatchingOperation(CMsvSession& aMsvSession, TInt aPriority, TRequestStatus& aObserverRequestStatus, TUid aMtm);
	IMPORT_C ~CMsgEmbeddedEditorWatchingOperation();
	IMPORT_C TInt SetDocumentToWatch(CEikDocument* aDocument);

private: 
	// From MApaEmbeddedDocObserver
	virtual void NotifyExit(TExitMode aMode); // called on completion of editing of an embedded document

	// From CMsgEditorWatchingOperation
	virtual void RunL();

private: 
	CEikDocument*	iDocument;
	};

class CMsgEditorThreadWatchingOperation : public CMsgEditorWatchingOperation
	{
public:
	IMPORT_C CMsgEditorThreadWatchingOperation(CMsvSession& aMsvSession, TInt aPriority, TRequestStatus& aObserverRequestStatus, TUid aMtm);
	IMPORT_C ~CMsgEditorThreadWatchingOperation();
	IMPORT_C TInt SetThreadIdToWatch(TThreadId anId);

protected://
	virtual void DoCancel();

protected:// Data
	RThread		iWatchingThread;
	};

#endif // __EDITWATC_H__
