/*************************************************************************/
/*	File : CKBehaviorIO.h			 				 					 */
/*	Author :  Nicolas Galinotti											 */	
/*																		 */	
/*	Virtools SDK 														 */	 
/*	Copyright (c) Virtools 2000, All Rights Reserved.					 */	
/*************************************************************************/
#ifndef CKBEHAVIORIO_H

#define CKBEHAVIORIO_H "$Id:$"

#include "CKObject.h"

/**************************************************************************
Summary: Behaviors Input and Outputs

Remarks:
{Image:BehaviorIO}
	
+ This class is rarely used since all the methods needed to check or trigger inputs/outputs
activity are available in CKBehaviorClass

+ A CKBehaviorIO is created by CKBehavior::CreateInput,CKBehavior::CreateOutput methods.

+ The class id of CKBehaviorIO is CKCID_BEHAVIORIO.


See also: CKBehavior
***************************************************************************/
class CKBehaviorIO : public CKObject {
friend class CKBehavior;
friend class CKBehaviorLink;
public :

/*************************************************
Summary: Specifies if the behavior IO is an input or output.
Arguments:
	Type: CK_BEHAVIORIO_IN if this Io is an input or CK_BEHAVIORIO_OUT if it is an output.
See also: GetType
*************************************************/
void SetType(int Type) { 	m_ObjectFlags &= ~CK_OBJECT_IOTYPEMASK; m_ObjectFlags |= Type; }
/*************************************************
Summary: Returns whether the behavior IO is an input or output.
Return Value:
	Returns CK_BEHAVIORIO_IN if this Io is an input.
	Returns CK_BEHAVIORIO_OUT if it is an output.
See also: GetType
*************************************************/
int  GetType()		   { 	return m_ObjectFlags & CK_OBJECT_IOTYPEMASK; }

/*************************************************
Summary: Activates or deactivates the behavior IO.
Arguments:
	Active: TRUE to activate the behavior IO.
See also:IsActive
*************************************************/
void Activate(CKBOOL Active=TRUE) { if (Active)	m_ObjectFlags |= CK_BEHAVIORIO_ACTIVE; else m_ObjectFlags &= ~CK_BEHAVIORIO_ACTIVE; }
/*************************************************
Summary: Returns whether the behavior IO is active.
Return Value:
	TRUE if IO is curerntly active, FALSE otherwise
See also: Activate
*************************************************/
CKBOOL IsActive() { 	return (m_ObjectFlags & CK_BEHAVIORIO_ACTIVE);  }

/*************************************************
Summary: Returns the owner behavior.
Return Value:
	A pointer to the CKBehavior this IO belongs to.
See also: SetOwner
*************************************************/
CKBehavior *GetOwner()			{ return m_OwnerBehavior; } 

//-------------------------------------------------------------------------
// Internal functions 
#ifdef DOCJETDUMMY // DOCJET secret macro
#else

	void SetOwner(CKBehavior *b) {	m_OwnerBehavior = b; }							

			CKBehaviorIO(CKContext *Context,CKSTRING name=NULL);					
	virtual	~CKBehaviorIO();														
	virtual CK_CLASSID GetClassID();												

	virtual CKStateChunk*	Save(CKFile *file,CKDWORD flags);						
	virtual CKERROR			Load(CKStateChunk *chunk,CKFile* file);					

	virtual void			PreDelete();											

	virtual int				GetMemoryOccupation();									

	//--------------------------------------------
	// Dependencies functions	{secret}											
	virtual CKERROR RemapDependencies(CKDependenciesContext& context);				
	virtual CKERROR Copy(CKObject& o,CKDependenciesContext& context);				

	//--------------------------------------------
	
	static CKSTRING  GetClassName();												
	static int		 GetDependenciesCount(int mode);								
	static CKSTRING  GetDependencies(int i,int mode);								
	static void		 Register();													
	static CKBehaviorIO* CreateInstance(CKContext *Context);						
	static void		 ReleaseInstance(CKContext* iContext,CKBehaviorIO*);							
	static CK_CLASSID m_ClassID;													

	// Dynamic Cast method (returns NULL if the object can't be casted)
	static CKBehaviorIO* Cast(CKObject* iO) 
	{
		return CKIsChildClassOf(iO,CKCID_BEHAVIORIO)?(CKBehaviorIO*)iO:NULL;
	}

	//--- Ensure Links that are on the same behavior are the last in the list
	void SortLinks();
	bool ActiveIOAndBB();


protected :
	XSObjectPointerArray	m_Links; 
	CKBehavior*				m_OwnerBehavior; 

	void	SetOldFlags(int Type);
	int		GetOldFlags();
#endif // Docjet secret macro
};

#endif