/* Essai des objets V0.15
 * Thu Feb  4 12:25:08 1993
 */


#define  INTUITION_PREFERENCES_H 0
#include <intuition/intuition.h>
#include "IObject.h"

/* Je ne veux utiliser que les fontes de la ROM donc je n'ouvre pas la */
/* diskfont.library et je mets DiskfontBase à NULL */
CPTR DiskfontBase=NULL;

struct Window *window=NULL;

struct NewWindow new_window=
{
	50, 25,      /* Position de la fenêtre */
	480, 125,    /* Taille de la fenêtre */
	0, 1,
	CLOSEWINDOW|IDCMP_CYCLE|IDCMP_CHECK|IDCMP_STRING|IDCMP_BUTTON|IDCMP_STRING|
	IDCMP_INTEGER|IDCMP_SCROLLER|VANILLAKEY,   /* IDCMPFlags */
	SMART_REFRESH|WINDOWCLOSE|WINDOWDRAG|WINDOWDEPTH|ACTIVATE|RMBTRAP,	/* Flags*/
	NULL,
	NULL,
	"Test de IObject.lib", /* Titre de la fenetre */
	NULL,
	NULL,
	0, 0,
	0, 0,
	WBENCHSCREEN   /* Type: fenetre Workbench. */
};


struct TextAttr font=
{
	"topaz.font",
	8,
	FS_NORMAL,
	FPF_ROMFONT
};


STRPTR text[]=	/* tableau de chaines pour le cycle */
{
	"IObject.lib",
	"is very",
	"useful.",
	NULL	/* NOTEZ-BIEN: il faut un NULL à la fin du tableau de chaines */
};

struct NewCycle newcycle=
{
	203, 17,
	122, 14,
	LABEL_LEFT|LABEL_HOT_KEY,
	0,
	"C_ycle",
	&font,
	text		/* tableau de chaine de caracteres */
};

struct NewScroller newscroller=
{
	358, 28,
	106, 11,
	LABEL_ABOVE,
	0,
	"Scroller",
	&font,
	0,		/* Pos = 0 */
	25,		/* Partie visible 25 */
	100		/* Maximum 100 */
};


struct NewButton newbutton=
{
	22, 17,
	94, 14,
	LABEL_INSIDE|LABEL_HOT_KEY,
	0,
	"_Button",
	&font
};


struct NewButton newtoggle=
{
	331, 97,
	140, 14,
	LABEL_INSIDE|LABEL_HOT_KEY|LABEL_PEN2,
	BT_TOGGLE,		/* le bouton est interrupteur */
	"_Toggle Button",
	&font
};


struct NewCheck newcheck=
{
	403, 74,
	20, 16,
	LABEL_LEFT|LABEL_HOT_KEY,
	0,
	"_Check",
	&font
};


struct NewInteger newint=
{
	256, 42,
	72, 14,
	LABEL_RIGHT|LABEL_HOT_KEY,
	STR_CENTER,		/* l'entier est centré dans l'IObject */
	"_Integer",
	&font
};

struct NewString newstr=
{
	8, 38,
	162, 12,
	LABEL_RIGHT|LABEL_HOT_KEY,
	STR_SINGLEBORD,		/* Bordure simple */
	"_String",
	&font,
	"Welcome to IObject.lib",		/* texte initial */
	40		/* 40 caracteres au maximum */
};

/* identificateur pour les IObject */
#define ID_CYCLE		0
#define ID_SCROLLER	1
#define ID_BUTTON		2
#define ID_CHECK		3
#define ID_INTEGER	4
#define ID_STRING		5
#define ID_TGBUTTON	6

#define ID_MIN			ID_CYCLE
#define ID_MAX			ID_TGBUTTON

CPTR EZGadget[ID_MAX + 1]={0};		/* Tableau d'IObject */

struct NewTextArea newtextarea=
{
	10, 64,
	312, 57,
	LABEL_ABOVE,
	TAF_CLIP_TEXT,		/* le texte qui dépasse se poursuit à la ligne suivante */
	"TextArea",
	&font,
	1,3,
	1,			/* un pixel entre deux lignes */
	0x03		/* bitplanes 1 et 2 utilisés */
};

CPTR textarea=NULL;		/* pointeur sur le TextAera */

UBYTE HotKeyTable[ID_MAX+1];	/* tableau pour gerer les raccourcis clavier */


/*
 * Cherche un caractère dans un tableau de caracteres
 * Renvoie l'index du caractère dans le tableau ou -1 s'il n'y est pas
*/
WORD FindHotKey(UBYTE hotkey, UBYTE *table, UWORD len)
{
	UWORD ind=0;

	while (len--)
	{
		/* toupper si on ne veut pas faire la difference entre majuscule et minuscule */
		if (toupper(*table++) == toupper(hotkey))
			return (ind);
		ind++;
	}
	return (-1);
}


/*
 * Libere les ressources
*/
VOID clean_exit(void)
{
	COUNT i;

	if (window) CloseWindow(window);
	for (i = ID_MIN; i <= ID_MAX; i++)		/* libère tous les object */
		if (EZGadget[i])
			FreeObject(EZGadget[i]);

	if (textarea)	FreeTextArea(textarea);
	ExitEasyGadget();		/* IL FAUT appeler ExitEasyGadget() avant de partir */
	exit();
}


main()
{
	struct IntuiMessage *message;
	BOOL close_me;
	COUNT i;

	/* On ouvre la fenetre */
	window = (struct Window *) OpenWindow( &new_window );

	/* fenetre ouverte ? */
	if(!window)
		clean_exit();

	/* Initialiser IObject.lib */
	if (!InitEasyGadget())
		clean_exit();

	/* cree le TextArea, on s'en va si il y a une erreur */
	if (!(textarea = CreateTextArea(&newtextarea, window->RPort)))
		clean_exit();

	/* Creer les objets */
	EZGadget[ID_CYCLE]		= CreateCycle(&newcycle, ID_CYCLE);
	EZGadget[ID_SCROLLER] = CreateScroller(&newscroller, ID_SCROLLER);
	EZGadget[ID_BUTTON]	 = CreateButton(&newbutton, ID_BUTTON);
	EZGadget[ID_CHECK]		= CreateCheck(&newcheck, ID_CHECK);
	EZGadget[ID_INTEGER]	= CreateInteger(&newint, ID_INTEGER);
	EZGadget[ID_TGBUTTON] = CreateButton(&newtoggle, ID_TGBUTTON);
	EZGadget[ID_STRING]	 = CreateString(&newstr, ID_STRING);

	/* Verifier que les objects ont été crées */
	for (i = ID_MIN; i <= ID_MAX; i++)
		if (EZGadget[i] == NULL)
			clean_exit();

	/* ajouter les objets à la fenetre et les afficher */
	for (i = ID_MIN; i <= ID_MAX; i++)
		if (EZGadget[i])
		{
			AddObjectToWindow(EZGadget[i], window, NULL);
			DisplayObject(EZGadget[i]);
		}

	/* affiche un message de bienvenue */
	TAPuts(textarea, "Welcome in IObject.lib");

	/* remplit le tableau pour gerer les raccourcis-clavier */
	for (i = ID_MIN; i <= ID_MAX; i++)
		HotKeyTable[i] = GetHotKey(EZGadget[i]);

	/* l'entier doit être compris entre -5000 et 5000 */
	ModifyObject(EZGadget[ID_INTEGER], 0, -5000, 5000);

	/* On reste dans la boucle tant qu'on a pas cliqué dans le gadget de fermeture */
	close_me = FALSE;
	while(close_me == FALSE)
	{
		/* attendre un évenement */
		Wait(1 << window->UserPort->mp_SigBit);

		/* Recuperer l'IntuiMessage */
		while(message = (struct IntuiMessage *) GetMsg(window->UserPort))
		{
			struct IntuiMessage msg;
			BOOL changed;
			CPTR obj;
			UWORD ID;

			changed = FALSE;
			msg = *message;			/* recopier le message */
			ReplyMsg(message);

			/* Traiter l'evenement */
			switch( msg.Class )
			{
				case CLOSEWINDOW:	/* CloseWindow gadget => on s'en va */
					close_me=TRUE;
					break;

				case VANILLAKEY:	/* Raccourcis-clavier */
					if ((ID = FindHotKey(msg.Code, HotKeyTable, ID_MAX+1)) != -1)
					{
						obj = EZGadget[ID];
						ActivateObject(obj);
						changed = TRUE;
					}
					break;

				default:
					if (obj = FindObjectMsg(&msg))
					{
						ID = GetObjectID(obj);
						changed = SendMsgToObject(obj, &msg);
					}
					break;
			}

			if (changed)
			{
				switch (ID)
				{
					case ID_CYCLE:
						TAPrintf(textarea, "Option %s selected.\n", text[ObjectValue(obj)]);
						break;
					case ID_SCROLLER:
						TAPrintf(textarea, "Position = %ld.\n", ObjectValue(obj));
						break;
					case ID_BUTTON:
						TAPuts(textarea, "Button pressed."); 
						break;
					case ID_CHECK:
						if (ObjectValue(obj))
							TAPuts(textarea, "Check is marked.");
						break;
					case ID_INTEGER:
						TAPrintf(textarea, "Integer Value is %ld.\n", ObjectValue(obj));
						break;
					case ID_STRING:
						TAPrintf(textarea, "You have entered the text: %s.\n", ObjectValue(obj));
						break;
					case ID_TGBUTTON:
						TAPrintf(textarea, "Button is %s.\n", ObjectValue(obj) ? "On" : "Off");
						break;
				}
			}
		}
	}
	clean_exit();
}
