/*     
      SCOL ENVIRONMENT . Magma 1.0 . 1997 . Sylvain HUET

         scolobj.h : gestion des objets de l'environnement SCOL
		   definitions
*/
//
// Modifications History
//
//$ LB(17/07/2001) : add the OBJsetHandsys function
//
//
//$ LB (13/06/2002) : introduce a management of objects handler, in order to
//                    centralize the handler system of the ObjBitmaps, according to the
//                    new ObjBitmap structure.

#include "scolPrerequisites.h"
#include "scolConstants.h"

//$BB pass from 128 to 256
//TODO change the method to optimize callbacks
extern int msghook[MAXHOOK];
extern int nbhook;

#if SCOL_PLATFORM == SCOL_PLATFORM_WINDOWS
	int OBJdefEvent(int event,int (*cbevent)(mmachine m, ScolWindowHandle hwnd, unsigned msg, UINT wParam, LONG lParam, int* ret));
	extern int (*cbhook[MAXHOOK])(mmachine m, ScolWindowHandle hwnd, unsigned msg, UINT wParam, LONG lParam, int* ret);
#endif


/****************************************************************************/
/* scol v 4                                                                 */
/*                                                                          */
/* int OBJsetHandsys (mmachine m, int typ, int oldHandsys, int newHandsys)  */
/*                                                                          */
/* replace the system handler of the object                                 */
/*                                                                          */
/****************************************************************************/
int OBJsetHandsys (mmachine m, int typ, int oldHandsys, int newHandsys);


/* enregistrement d'un nouveau type d'objet */
int OBJregister(int nbrefl,int recrefl,
				int (*destroy)(mmachine m,int handsys,int objm),char *name);

/* determine un numero de type en fonction du nom */
int OBJtypebyname(char *name);


/* obtention d'un nouvel evenement utilisateur */
int OBJgetUserEvent();

/* trouve un objet en fonction du handler systeme (notation int) et du typ (notation int)
 retourne le pointeur ou -1 si introuvable */
int OBJfindTH(mmachine m,int typ,int handsys);

/* trouve un objet en fonction de l'objet magma (notation obj) et du typ (notation int)
 retourne le pointeur ou -1 si introuvable */
int OBJfindTM(mmachine m,int typ,int objm);

/* creation d'un nouvel objet
en 1 : canal
en 0 : objet magma
retourne : 
en 0 : objet inchange
*/
int OBJcreate(mmachine m,int typ,int handsys,int typpere,int handsyspere);

/* definition d'un reflexe
en 2 : objet magma
en 1 : fonction magma
en 0 : argument user
retourne :
en 0 : objet
*/
int OBJaddreflex(mmachine m,int typ, int num);

/* commence le traitement d'un reflexe d'un certain type, avec un certain handler
et un certain numero de reflexe.
retourne :
 0 si OK
 1 si objet non trouve
 autre si erreur RUNTIME
 */
int OBJbeginreflex(mmachine m,int typ,int handsys,int num);

/* appel du reflexe
  nbarg est le nombre d'arguments ajoutes par l'utilisateur */
int OBJcallreflex(mmachine m,int nbarg);

/* destruction d'un objet en fonction de son type et du handler systeme */
int OBJdelTH(mmachine m,int typ,int handsys);

/* destruction d'un objet en fonction de son type et de l'objet magma */
int OBJdelTM(mmachine m,int typ,int q);

/* destruction de tous les objets lies a un canal (notation obj) */
int OBJdelChn(mmachine m,int canal);

/* donne a un canal tous les objets d'un autre */
int OBJchgchannel(mmachine m,int oldchn, int newchn);

/* destruction d'un objet */
int OBJdel(mmachine m,int p,int flag);

int OBJdestroy(mmachine m, int typ,int handsys,int objm,int flag);

/* compte le nombre d'objets d'un certain type */
int OBJcountT(mmachine m,int typ);
/* initialisation de la gestion des objets */
int OBJinit();
