/*	--------------------------------------------------------------------
	Beispielprogramm fr Accessory-/Programmbetrieb

	Das Programm darf als Grundlage fr eigene Programme genutzt werden.

	Copyright 1992 by D. Rabich, Dlmen.
	Alle Rechte vorbehalten!
	-------------------------------------------------------------------- */

/* Headerdateien */
#include <stdio.h>
#include <wega.h>
#include <acc_prg.rsh>

#include "routines.h"

/* Makros */
#define	PRGNAME	"ACC_PRG"
#define	ACCNAME	"  " PRGNAME "..."
#define	NOAUTO	"Das Programm " PRGNAME " kann nicht\n"	\
				"aus dem AUTO-Ordner gestartet werden!\a"

/* Variablen */
static WORD		appl_id,
				menu_id;
static BOOLEAN	rsc_initialized	= FALSE,
				wega_init		= FALSE;
static OBJECT	*menue;

/* Prototypen */
static BOOLEAN rinit(OBJECT*, WORD, VOID*);
static BOOLEAN AppInit(VOID);
static VOID AppExit(VOID);
static VOID simulate(WORD*, WORD*, OBJECT*, WORD, WORD);
VOID main(VOID);

/* Initialisierung eines Objekts */
#pragma warn -par
static BOOLEAN rinit(OBJECT *tree, WORD obj, VOID *data)
{
	rsrc_obfix(tree, obj);
	return(FALSE);
}
#pragma warn .par

/* Initialisierung der Resourcen */
static VOID rsc_init(VOID)
{
	menue	= rs_trindex[MENUE];
	GTreeWalk(menue, ROOT, rinit, NULL);
	rsc_initialized	= TRUE;
}

/* Anmeldung der Applikation */
static BOOLEAN AppInit(VOID)
{
	GEM_VERSION	= 0;
	appl_id		= appl_init();

	/* Haben die AES die Versionsnummer nicht eingetragen? */
	if(!GEM_VERSION)
	{
		puts(NOAUTO);
		return(FALSE);
	}

	if(appl_id < 0)
		return(FALSE);

	if(APPLICATION)
	{
		wega_init	= GWegaInit();
		if(!wega_init)
			return(FALSE);
		rsc_init();
		GSetMenu(menue);
		GMArrow();
	}
	else
	{
		menu_id	= menu_register(appl_id, ACCNAME);
		if(menu_id < 0)
			return(FALSE);
	}

	return(TRUE);
}

/* Abmeldung der Applikation */
static VOID AppExit(VOID)
{
	GDelMenu(menue);
	if(wega_init)
		GWegaDone();
	wega_init	= FALSE;
	appl_exit();
}

/* Menanwahl simulieren */
static VOID simulate(WORD *evnt, WORD *msg, OBJECT *tree, WORD dm, WORD item)
{
	*evnt	|= MU_MESAG;
	*evnt	&= ~MU_KEYBD;
	msg[0]	= MN_SELECTED;
	msg[3]	= dm;
	msg[4]	= item;
	menu_tnormal(tree, dm, 0);
}

/* Hauptprogramm */
VOID main(VOID)
{
	WORD	msg[8];

	if(AppInit())
	{
		WORD	dummy, keystate, keyreturn, evnt;
		BOOLEAN	cont	= TRUE;

		/* Schleife fr Eventabfrage */
		while(cont || ACCESSORY)
		{
			evnt	= evnt_multi(MU_KEYBD | MU_MESAG,
									0, 0, 0,
									0, 0, 0, 0, 0,
									0, 0, 0, 0, 0,
									msg,
									0, 0,
									&dummy, &dummy,
									&dummy,
									&keystate, &keyreturn,
									&dummy);

			/* Keyboard-Event? */
			if(evnt & MU_KEYBD)
			{
				KEY	key;

				GMapKey(&key, keyreturn, keystate);
				if(key.state.control && !key.state.scancode)
				{
					switch(key.key)
					{
						case 'a':
						case 'A':
							simulate(&evnt, msg, menue, MINFO, IINFO);
							break;
						case 'o':
						case 'O':
							simulate(&evnt, msg, menue, MFILE, IACTION);
							break;
						case 'q':
						case 'Q':
							simulate(&evnt, msg, menue, MFILE, IQUIT);
							break;
					}
				}
			}

			/* Message-Event */
			if(evnt & MU_MESAG)
				switch(msg[0])
				{
					case 0x4711:
					case AC_OPEN:
						if(GWegaInit())
						{
							if(!rsc_initialized)
								rsc_init();
							do_action();
							GWegaDone();
						}
						break;

					case MN_SELECTED:
						switch(msg[3])
						{
							case MINFO:
								switch(msg[4])
								{
									case IINFO:
										do_info();
										break;
								}
								break;

							case MFILE:
								switch(msg[4])
								{
									case IACTION:
										do_action();
										break;
									case IQUIT:
										cont	= FALSE;
										break;
								}
								break;
						}
						menu_tnormal(menue, msg[3], 1);
						break;
				}
		}
		AppExit();
	}

	/* Accessories drfen nicht verlassen werden */
	if(ACCESSORY)
		for(;;)
			evnt_mesag(msg);
}