/*************************************************************************/
/*	File : CKParameterVariable.h										 */
/*	Author :  Aymeric BARD												 */	
/*																		 */	
/*	Virtools SDK 														 */	 
/*	Copyright (c) Virtools 2002, All Rights Reserved.					 */	
/*************************************************************************/
#ifndef CKParameterVariable_H

#define CKParameterVariable_H

#include "CKParameterLocal.h"

/**************************************************************************
Summary: Base class for parameterized access of the variables registered in the
variable manager.
Remarks:

The class id of CKParameter is CKCID_PARAMETERVARIABLE.
See also: CKVariableManager, CKParameterIn
**********************************************************************************/
class CKParameterVariable : public CKParameterLocal {
public :

///
// New Functions

// Method to bind the parameter with a registered variable
CKERROR	Bind(const char* iName);

///
// Virtuals Overriding

	CKERROR			GetValue(void *buf, CKBOOL update = TRUE);
	CKERROR			SetValue(const void *buf,int size = 0);
	CKERROR			CopyValue(CKParameter *param,CKBOOL UpdateParam=TRUE);

//--------------------------------------------
// Data pointer
	void*			GetReadDataPtr(CKBOOL update = TRUE); 
	void*			GetWriteDataPtr(); 
	void			CheckClass(CKParameterTypeDesc* iType);

//--------------------------------------------
// Convertion from / to string
	CKERROR			SetStringValue(CKSTRING Value);
	int  			GetStringValue(CKSTRING Value,CKBOOL update = TRUE);	 

//-------------------------------------------------------------------
#ifdef DOCJETDUMMY // Docjet secret macro
#else

	//--------------------------------------------
	// Virtual functions 			  
	CKParameterVariable(CKContext *Context,CKSTRING name = NULL);		
	virtual	~CKParameterVariable();													
	virtual CK_CLASSID GetClassID();										

	virtual CKStateChunk *Save(CKFile *file,CKDWORD flags);					
	virtual CKERROR Load(CKStateChunk *chunk,CKFile* file);					

//--------------------------------------------
// Dependencies Functions
	virtual CKERROR RemapDependencies(CKDependenciesContext& context);		
	virtual CKERROR Copy(CKObject& o,CKDependenciesContext& context);		

//--------------------------------------------
// Class Registering
	static CKSTRING		GetClassName();										
	static int			GetDependenciesCount(int mode);						
	static CKSTRING		GetDependencies(int i,int mode);					
	static void			Register();											
	static CKParameterVariable*	CreateInstance(CKContext *Context);					
	static void			ReleaseInstance(CKContext* iContext,CKParameterVariable*);							
	static CK_CLASSID	m_ClassID;											

	struct PostWrite { // Call the post write
		PostWrite(CKContext* iCtx,const char* iName):name(iName),ctx(iCtx) {}
		~PostWrite() {
			if (name) 
				ctx->GetVariableManager()->WatcherPostWrite(name);
		}
		const char* name;
		CKContext*	ctx;
	};

	CKVariableManager::Variable*	m_Variable;

#endif // docjet secret macro

};

#endif
