/*
 *  Source machine generated by GadToolsBox V2.0b
 *  which is (c) Copyright 1991-1993 Jaba Development
 *
 *  GUI Designed by : Jochen Wiedmann
 */

#include <exec/types.h>
#include <intuition/intuition.h>
#include <intuition/classes.h>
#include <intuition/classusr.h>
#include <intuition/imageclass.h>
#include <intuition/gadgetclass.h>
#include <libraries/gadtools.h>
#include <graphics/displayinfo.h>
#include <graphics/gfxbase.h>
#include <clib/exec_protos.h>
#include <clib/intuition_protos.h>
#include <clib/gadtools_protos.h>
#include <clib/graphics_protos.h>
#include <clib/utility_protos.h>
#include <string.h>
#include <clib/diskfont_protos.h>

#ifdef AZTEC_C
#include <pragmas/exec_lib.h>
#include <pragmas/intuition_lib.h>
#include <pragmas/gadtools_lib.h>
#include <pragmas/graphics_lib.h>
#include <pragmas/utility_lib.h>
#endif

#include "GadTools.h"

struct Screen	      *Scr = NULL;
UBYTE		      *PubScreenName = "Workbench";
APTR		       VisualInfo = NULL;
struct Window	      *MainWnd = NULL;
struct Window	      *TurniereingabeWnd = NULL;
struct Window	      *TeilnehmereingabeWnd = NULL;
struct Window	      *TeilnehmerauswahlWnd = NULL;
struct Window	      *ErgebniseingabeWnd = NULL;
struct Window	      *AusgabeWnd = NULL;
struct Gadget	      *MainGList = NULL;
struct Gadget	      *TurniereingabeGList = NULL;
struct Gadget	      *TeilnehmereingabeGList = NULL;
struct Gadget	      *TeilnehmerauswahlGList = NULL;
struct Gadget	      *ErgebniseingabeGList = NULL;
struct Gadget	      *AusgabeGList = NULL;
struct Menu	      *MainMenus = NULL;
struct IntuiMessage    MainMsg;
struct IntuiMessage    TurniereingabeMsg;
struct IntuiMessage    TeilnehmereingabeMsg;
struct IntuiMessage    TeilnehmerauswahlMsg;
struct IntuiMessage    ErgebniseingabeMsg;
struct IntuiMessage    AusgabeMsg;
struct Gadget	      *MainGadgets[5];
struct Gadget	      *TurniereingabeGadgets[3];
struct Gadget	      *TeilnehmereingabeGadgets[18];
struct Gadget	      *TeilnehmerauswahlGadgets[2];
struct Gadget	      *ErgebniseingabeGadgets[5];
struct Gadget	      *AusgabeGadgets[1];
UWORD		       MainLeft = 0;
UWORD		       MainTop = 4;
UWORD		       MainWidth = 632;
UWORD		       MainHeight = 183;
UWORD		       TurniereingabeLeft = 0;
UWORD		       TurniereingabeTop = 46;
UWORD		       TurniereingabeWidth = 632;
UWORD		       TurniereingabeHeight = 69;
UWORD		       TeilnehmereingabeLeft = 0;
UWORD		       TeilnehmereingabeTop = 1;
UWORD		       TeilnehmereingabeWidth = 631;
UWORD		       TeilnehmereingabeHeight = 186;
UWORD		       TeilnehmerauswahlLeft = 144;
UWORD		       TeilnehmerauswahlTop = 2;
UWORD		       TeilnehmerauswahlWidth = 327;
UWORD		       TeilnehmerauswahlHeight = 185;
UWORD		       ErgebniseingabeLeft = 0;
UWORD		       ErgebniseingabeTop = 0;
UWORD		       ErgebniseingabeWidth = 627;
UWORD		       ErgebniseingabeHeight = 187;
UWORD		       AusgabeLeft = 2;
UWORD		       AusgabeTop = 0;
UWORD		       AusgabeWidth = 633;
UWORD		       AusgabeHeight = 187;
UBYTE		      *MainWdt = (UBYTE *)"Chaos V5.1a   © 1993   by  Jochen Wiedmann";
UBYTE		      *TurniereingabeWdt = (UBYTE *)"Input of Tournament-data";
UBYTE		      *TeilnehmereingabeWdt = (UBYTE *)"Input of Player-data";
UBYTE		      *TeilnehmerauswahlWdt = (UBYTE *)"Player-selection";
UBYTE		      *ErgebniseingabeWdt = (UBYTE *)"Input of results";
UBYTE		      *AusgabeWdt = (UBYTE *)"Ausgabe";
struct TextAttr       *Font, Attr;
UWORD		       FontX, FontY;
UWORD		       OffX, OffY;
struct TextFont       *MainFont = NULL;
struct TextFont       *TurniereingabeFont = NULL;
struct TextFont       *TeilnehmereingabeFont = NULL;
struct TextFont       *TeilnehmerauswahlFont = NULL;
struct TextFont       *ErgebniseingabeFont = NULL;
struct TextFont       *AusgabeFont = NULL;

UBYTE *Ergebnis4Labels[] = {
	(UBYTE *)"White wins",
	(UBYTE *)"Draw",
	(UBYTE *)"Black wins",
	(UBYTE *)"Result missing",
	NULL };

UBYTE *Kampflos4Labels[] = {
	(UBYTE *)"Settled out",
	(UBYTE *)"Without fight",
	NULL };

struct IntuiText MainIText[] = {
	1, 0, JAM1,279, 156, NULL, (UBYTE *)"C h a o s  V 5.1a", NULL,
	1, 0, JAM1,286, 171, NULL, (UBYTE *)"The Chess Happening Organisation System", NULL };

#define Main_TNUM 2

struct IntuiText TeilnehmereingabeIText[] = {
	1, 0, JAM1,277, 101, NULL, (UBYTE *)"(dd.mm.yy)", NULL };

#define Teilnehmereingabe_TNUM 1

struct IntuiText AusgabeIText[] = {
	1, 0, JAM1,30, 7, NULL, (UBYTE *)"Zeile1", NULL,
	1, 0, JAM1,30, 17, NULL, (UBYTE *)"Zeile2", NULL,
	1, 0, JAM1,26, 27, NULL, (UBYTE *)"Zeile", NULL };

#define Ausgabe_TNUM 3

struct NewMenu MainNewMenu[] = {
	NM_TITLE, (STRPTR)"Tournament", NULL, 0, NULL, NULL,
	NM_ITEM, (STRPTR)"New", NULL, 0, 0L, (APTR)MainNeuesTurnier,
	NM_ITEM, (STRPTR)"Load", (STRPTR)"L", 0, 0L, (APTR)MainLadeTurnier,
	NM_ITEM, (STRPTR)"Save", (STRPTR)"S", 0, 0L, (APTR)MainSpeichereTurnier,
	NM_ITEM, (STRPTR)"Save as", (STRPTR)"A", 0, 0L, (APTR)MainSpeichereTurnierAls,
	NM_ITEM, (STRPTR)"About", (STRPTR)"I", 0, 0L, (APTR)MainInformationen,
	NM_ITEM, (STRPTR)"Quit", NULL, 0, 0L, (APTR)MainProgrammende,
	NM_TITLE, (STRPTR)"Players", NULL, 0, NULL, NULL,
	NM_ITEM, (STRPTR)"Add", (STRPTR)"N", 0, 0L, (APTR)MainNeuerTeilnehmer,
	NM_ITEM, (STRPTR)"Modify", (STRPTR)"Ä", 0, 0L, (APTR)MainTeilnehmerAendern,
	NM_ITEM, (STRPTR)"Delete", NULL, 0, 0L, (APTR)MainTeilnehmerLoeschen,
	NM_TITLE, (STRPTR)"Round", NULL, 0, NULL, NULL,
	NM_ITEM, (STRPTR)"Make pairings", NULL, 0, NULL, NULL,
	NM_SUB, (STRPTR)"SwissPairing", NULL, 0, 0L, (APTR)MainSwissPairing,
	NM_SUB, (STRPTR)"Round-Robin", NULL, 0, 0L, (APTR)MainRoundRobin,
	NM_SUB, (STRPTR)"Round-Robin (slide)", NULL, 0, 0L, (APTR)MainRoundRobinSlide,
	NM_ITEM, (STRPTR)"Input results", NULL, 0, NULL, NULL,
	NM_SUB, (STRPTR)"1", NULL, 0, 0L, (APTR)MainErgebnisEingabe,
	NM_TITLE, (STRPTR)"Output", NULL, 0, NULL, NULL,
	NM_ITEM, (STRPTR)"List of players", NULL, 0, NULL, NULL,
	NM_SUB, (STRPTR)"Short", NULL, 0, 0L, (APTR)MainKurz,
	NM_SUB, (STRPTR)"Long", NULL, 0, 0L, (APTR)MainLang,
	NM_ITEM, (STRPTR)"Internal ratings", NULL, 0, 0L, (APTR)MainRangliste,
	NM_ITEM, (STRPTR)"Round", NULL, 0, NULL, NULL,
	NM_SUB, (STRPTR)"1", NULL, 0, 0L, (APTR)MainRunde,
	NM_ITEM, (STRPTR)"Table", NULL, 0, NULL, NULL,
	NM_SUB, (STRPTR)"All", NULL, 0, 0L, (APTR)MainGesamt,
	NM_SUB, (STRPTR)"Seniors", NULL, 0, 0L, (APTR)MainSenioren,
	NM_SUB, (STRPTR)"Juniors", NULL, 0, 0L, (APTR)MainJunioren,
	NM_SUB, (STRPTR)"Women", NULL, 0, 0L, (APTR)MainDamen,
	NM_SUB, (STRPTR)"Juniors (A)", NULL, 0, 0L, (APTR)MainAJugend,
	NM_SUB, (STRPTR)"Juniors (B)", NULL, 0, 0L, (APTR)MainBJugend,
	NM_SUB, (STRPTR)"Juniors (C)", NULL, 0, 0L, (APTR)MainCJugend,
	NM_SUB, (STRPTR)"Juniors (D)", NULL, 0, 0L, (APTR)MainDJugend,
	NM_SUB, (STRPTR)"Juniors (E)", NULL, 0, 0L, (APTR)MainEJugend,
	NM_ITEM, (STRPTR)"Table of advance", NULL, 0, 0L, (APTR)MainFortschrittstabelle,
	NM_ITEM, (STRPTR)"DWZ-rating", NULL, 0, 0L, (APTR)MainDWZWertung,
	NM_ITEM, (STRPTR)"Cross-table", NULL, 0, 0L, (APTR)MainKreuztabelle,
	NM_ITEM, (STRPTR)"Player-cards", NULL, 0, 0L, (APTR)MainSpielerkarten,
	NM_TITLE, (STRPTR)"Preferences", NULL, 0, NULL, NULL,
	NM_ITEM, (STRPTR)"Table-mode", NULL, 0, NULL, NULL,
	NM_SUB, (STRPTR)"Simple", NULL, CHECKIT|CHECKED, 14L, (APTR)MainEinfach,
	NM_SUB, (STRPTR)"Buchholz", NULL, CHECKIT, 13L, (APTR)MainBuchholz,
	NM_SUB, (STRPTR)"Extended Buchholz", NULL, CHECKIT, 11L, (APTR)MainVerfBuchholz,
	NM_SUB, (STRPTR)"Sonneborn-Berger", NULL, CHECKIT, 7L, (APTR)MainSonnebornBerger,
	NM_ITEM, (STRPTR)"Output-Device", NULL, 0, NULL, NULL,
	NM_SUB, (STRPTR)"Screen", NULL, CHECKIT|CHECKED, 6L, (APTR)MainBildschirm,
	NM_SUB, (STRPTR)"Printer (Draft)", NULL, CHECKIT, 5L, (APTR)MainDrucker,
	NM_SUB, (STRPTR)"Printer (LQ)", NULL, CHECKIT, 3L, (APTR)MainDruckerLQ,
	NM_ITEM, (STRPTR)"Make Icons", NULL, CHECKIT|MENUTOGGLE, 0L, (APTR)MainMakeIcons,
	NM_END, NULL, NULL, 0, 0L, NULL };

UWORD MainGTypes[] = {
	NUMBER_KIND,
	NUMBER_KIND,
	TEXT_KIND,
	TEXT_KIND,
	TEXT_KIND
};

UWORD TurniereingabeGTypes[] = {
	BUTTON_KIND,
	BUTTON_KIND,
	STRING_KIND
};

UWORD TeilnehmereingabeGTypes[] = {
	CHECKBOX_KIND,
	CHECKBOX_KIND,
	CHECKBOX_KIND,
	CHECKBOX_KIND,
	CHECKBOX_KIND,
	CHECKBOX_KIND,
	CHECKBOX_KIND,
	CHECKBOX_KIND,
	BUTTON_KIND,
	BUTTON_KIND,
	STRING_KIND,
	STRING_KIND,
	STRING_KIND,
	STRING_KIND,
	STRING_KIND,
	STRING_KIND,
	STRING_KIND,
	INTEGER_KIND
};

UWORD TeilnehmerauswahlGTypes[] = {
	BUTTON_KIND,
	LISTVIEW_KIND
};

UWORD ErgebniseingabeGTypes[] = {
	BUTTON_KIND,
	BUTTON_KIND,
	MX_KIND,
	MX_KIND,
	LISTVIEW_KIND
};

UWORD AusgabeGTypes[] = {
	LISTVIEW_KIND
};

struct NewGadget MainNGad[] = {
	131, 69, 61, 14, (UBYTE *)"Players:", NULL, GD_NumTeilnehmerOut, PLACETEXT_LEFT, NULL, NULL,
	131, 84, 61, 14, (UBYTE *)"Rounds:", NULL, GD_NumRundenOut, PLACETEXT_LEFT, NULL, NULL,
	131, 40, 501, 14, (UBYTE *)"Tournamentname:", NULL, GD_TurniernameOut, PLACETEXT_LEFT, NULL, NULL,
	131, 54, 501, 14, (UBYTE *)"Tournamentfile:", NULL, GD_TurnierfileOut, PLACETEXT_LEFT, NULL, NULL,
	131, 99, 261, 14, (UBYTE *)"Tournamentmode:", NULL, GD_TurniermodusOut, PLACETEXT_LEFT, NULL, NULL
};

struct NewGadget TurniereingabeNGad[] = {
	19, 45, 91, 14, (UBYTE *)"Ok", NULL, GD_Ok0, PLACETEXT_IN, NULL, (APTR)Ok0Clicked,
	520, 45, 91, 14, (UBYTE *)"Cancel", NULL, GD_Cancel0, PLACETEXT_IN, NULL, (APTR)Cancel0Clicked,
	130, 12, 501, 13, (UBYTE *)"Tournamentname:", NULL, GD_Turniername, PLACETEXT_LEFT, NULL, (APTR)TurniernameClicked
};

struct NewGadget TeilnehmereingabeNGad[] = {
	467, 9, 26, 11, (UBYTE *)"Senior", NULL, GD_Senioren, PLACETEXT_RIGHT, NULL, (APTR)SeniorenClicked,
	467, 24, 26, 11, (UBYTE *)"Junior", NULL, GD_Junioren, PLACETEXT_RIGHT, NULL, (APTR)JuniorenClicked,
	467, 39, 26, 11, (UBYTE *)"Woman", NULL, GD_Damen, PLACETEXT_RIGHT, NULL, (APTR)DamenClicked,
	467, 62, 26, 11, (UBYTE *)"Junior (A)", NULL, GD_AJugend, PLACETEXT_RIGHT, NULL, (APTR)AJugendClicked,
	467, 77, 26, 11, (UBYTE *)"Junior (B)", NULL, GD_BJugend, PLACETEXT_RIGHT, NULL, (APTR)BJugendClicked,
	467, 91, 26, 11, (UBYTE *)"Junior (C)", NULL, GD_CJugend, PLACETEXT_RIGHT, NULL, (APTR)CJugendClicked,
	467, 106, 26, 11, (UBYTE *)"Junior (D)", NULL, GD_DJugend, PLACETEXT_RIGHT, NULL, (APTR)DJugendClicked,
	467, 121, 26, 11, (UBYTE *)"Junior (E)", NULL, GD_EJugend, PLACETEXT_RIGHT, NULL, (APTR)EJugendClicked,
	21, 167, 91, 14, (UBYTE *)"Ok", NULL, GD_Ok1, PLACETEXT_IN, NULL, (APTR)Ok1Clicked,
	515, 167, 91, 14, (UBYTE *)"Cancel", NULL, GD_Cancel1, PLACETEXT_IN, NULL, (APTR)Cancel1Clicked,
	123, 9, 261, 13, (UBYTE *)"Name:", NULL, GD_Name, PLACETEXT_LEFT, NULL, (APTR)NameClicked,
	123, 24, 261, 13, (UBYTE *)"Home    ", NULL, GD_Strasse, PLACETEXT_LEFT, NULL, (APTR)StrasseClicked,
	123, 39, 261, 13, (UBYTE *)"Address:", NULL, GD_Wohnort, PLACETEXT_LEFT, NULL, (APTR)WohnortClicked,
	123, 54, 261, 13, (UBYTE *)"Chess-club:", NULL, GD_Schachclub, PLACETEXT_LEFT, NULL, (APTR)SchachclubClicked,
	123, 69, 181, 13, (UBYTE *)"Phone:", NULL, GD_TelNr, PLACETEXT_LEFT, NULL, (APTR)TelNrClicked,
	123, 94, 101, 13, (UBYTE *)"Birthday:", NULL, GD_GebDatum, PLACETEXT_LEFT, NULL, (APTR)GebDatumClicked,
	123, 119, 101, 13, (UBYTE *)"DWZ:", NULL, GD_DWZ, PLACETEXT_LEFT, NULL, (APTR)DWZClicked,
	323, 119, 61, 13, (UBYTE *)"ELO:", NULL, GD_ELO, PLACETEXT_LEFT, NULL, (APTR)ELOClicked
};

struct NewGadget TeilnehmerauswahlNGad[] = {
	216, 169, 91, 14, (UBYTE *)"Cancel", NULL, GD_Cancel2, PLACETEXT_IN, NULL, (APTR)Cancel2Clicked,
	2, 0, 325, 168, NULL, NULL, GD_Teilnehmer, 0, NULL, (APTR)TeilnehmerClicked
};

struct NewGadget ErgebniseingabeNGad[] = {
	11, 166, 91, 14, (UBYTE *)"Ok", NULL, GD_Ok3, PLACETEXT_IN, NULL, (APTR)Ok3Clicked,
	525, 165, 91, 14, (UBYTE *)"Cancel", NULL, GD_Cancel3, PLACETEXT_IN, NULL, (APTR)Cancel3Clicked,
	275, 147, 17, 9, NULL, NULL, GD_Ergebnis, PLACETEXT_LEFT, NULL, (APTR)ErgebnisClicked,
	337, 147, 17, 9, NULL, NULL, GD_Kampflos, PLACETEXT_RIGHT, NULL, (APTR)KampflosClicked,
	2, 4, 625, 144, NULL, NULL, GD_Spielliste, 0, NULL, (APTR)SpiellisteClicked
};

struct NewGadget AusgabeNGad[] = {
	0, 33, 633, 152, NULL, NULL, GD_Ausgabe, 0, NULL, (APTR)AusgabeClicked
};

ULONG *MainGTags[] = {
	(ULONG *)(TAG_DONE),
	(ULONG *)(TAG_DONE),
	(ULONG *)(GTTX_Border), (ULONG *)TRUE, (ULONG *)(TAG_DONE),
	(ULONG *)(GTTX_Border), (ULONG *)TRUE, (ULONG *)(TAG_DONE),
	(ULONG *)(GTTX_Border), (ULONG *)TRUE, (ULONG *)(TAG_DONE)
};

ULONG *TurniereingabeGTags[] = {
	(ULONG *)(TAG_DONE),
	(ULONG *)(TAG_DONE),
	(ULONG *)(GTST_MaxChars), (ULONG *)60, (ULONG *)(TAG_DONE)
};

ULONG *TeilnehmereingabeGTags[] = {
	(ULONG *)(TAG_DONE),
	(ULONG *)(TAG_DONE),
	(ULONG *)(TAG_DONE),
	(ULONG *)(TAG_DONE),
	(ULONG *)(TAG_DONE),
	(ULONG *)(TAG_DONE),
	(ULONG *)(TAG_DONE),
	(ULONG *)(TAG_DONE),
	(ULONG *)(TAG_DONE),
	(ULONG *)(TAG_DONE),
	(ULONG *)(GTST_MaxChars), (ULONG *)30, (ULONG *)(TAG_DONE),
	(ULONG *)(GTST_MaxChars), (ULONG *)30, (ULONG *)(TAG_DONE),
	(ULONG *)(GTST_MaxChars), (ULONG *)30, (ULONG *)(TAG_DONE),
	(ULONG *)(GTST_MaxChars), (ULONG *)30, (ULONG *)(TAG_DONE),
	(ULONG *)(GTST_MaxChars), (ULONG *)20, (ULONG *)(TAG_DONE),
	(ULONG *)(GTST_MaxChars), (ULONG *)10, (ULONG *)(TAG_DONE),
	(ULONG *)(GTST_MaxChars), (ULONG *)10, (ULONG *)(TAG_DONE),
	(ULONG *)(GTIN_Number), (ULONG *)0, (ULONG *)(GTIN_MaxChars), (ULONG *)5, (ULONG *)(TAG_DONE)
};

ULONG *TeilnehmerauswahlGTags[] = {
	(ULONG *)(TAG_DONE),
	(ULONG *)(TAG_DONE)
};

ULONG *ErgebniseingabeGTags[] = {
	(ULONG *)(TAG_DONE),
	(ULONG *)(TAG_DONE),
	(ULONG *)(GTMX_Labels), (ULONG *)&Ergebnis4Labels[ 0 ], (ULONG *)(TAG_DONE),
	(ULONG *)(GTMX_Labels), (ULONG *)&Kampflos4Labels[ 0 ], (ULONG *)(TAG_DONE),
	(ULONG *)(GTLV_ShowSelected), (ULONG *)NULL, (ULONG *)(TAG_DONE)
};

ULONG *AusgabeGTags[] = {
	(ULONG *)(GTLV_ReadOnly), (ULONG *)TRUE, (ULONG *)(TAG_DONE)
};

static UWORD ComputeX( UWORD value )
{
	return(( UWORD )((( FontX * value ) + 4 ) / 8 ));
}

static UWORD ComputeY( UWORD value )
{
	return(( UWORD )((( FontY * value ) + 4 ) / 8 ));
}

static void ComputeFont( UWORD width, UWORD height )
{
	Forbid();
	Font = &Attr;
	Font->ta_Name = (STRPTR)GfxBase->DefaultFont->tf_Message.mn_Node.ln_Name;
	Font->ta_YSize = FontY = GfxBase->DefaultFont->tf_YSize;
	FontX = GfxBase->DefaultFont->tf_XSize;
	Permit();

	OffX = Scr->WBorLeft;
	OffY = Scr->RastPort.TxHeight + Scr->WBorTop + 1;

	if ( width && height ) {
		if (( ComputeX( width ) + OffX + Scr->WBorRight ) > Scr->Width )
			goto UseTopaz;
		if (( ComputeY( height ) + OffY + Scr->WBorBottom ) > Scr->Height )
			goto UseTopaz;
	}
	return;

UseTopaz:
	Font->ta_Name = (STRPTR)"topaz.font";
	FontX = FontY = Font->ta_YSize = 8;
}

int SetupScreen( void )
{
	if ( ! ( Scr = LockPubScreen( PubScreenName )))
		return( 1L );

	ComputeFont( 0, 0 );

	if ( ! ( VisualInfo = GetVisualInfo( Scr, TAG_DONE )))
		return( 2L );

	return( 0L );
}

void CloseDownScreen( void )
{
	if ( VisualInfo ) {
		FreeVisualInfo( VisualInfo );
		VisualInfo = NULL;
	}

	if ( Scr        ) {
		UnlockPubScreen( NULL, Scr );
		Scr = NULL;
	}
}

void MainRender( void )
{
	struct IntuiText	it;
	UWORD			cnt;

	ComputeFont( MainWidth, MainHeight );


	for ( cnt = 0; cnt < Main_TNUM; cnt++ ) {
		CopyMem(( char * )&MainIText[ cnt ], ( char * )&it, (long)sizeof( struct IntuiText ));
		it.ITextFont = Font;
		it.LeftEdge  = OffX + ComputeX( it.LeftEdge ) - ( IntuiTextLength( &it ) >> 1 );
		it.TopEdge   = OffY + ComputeY( it.TopEdge ) - ( Font->ta_YSize >> 1 );
		PrintIText( MainWnd->RPort, &it, 0, 0 );
	}
}

int HandleMainIDCMP( void )
{
	struct IntuiMessage	*m;
	struct MenuItem 	*n;
	int			(*func)();
	BOOL			running = TRUE;

	while( m = GT_GetIMsg( MainWnd->UserPort )) {

		CopyMem(( char * )m, ( char * )&MainMsg, (long)sizeof( struct IntuiMessage ));

		GT_ReplyIMsg( m );

		switch ( MainMsg.Class ) {

			case	IDCMP_REFRESHWINDOW:
				GT_BeginRefresh( MainWnd );
				MainRender();
				GT_EndRefresh( MainWnd, TRUE );
				break;

			case	IDCMP_MENUPICK:
				while( MainMsg.Code != MENUNULL ) {
					n = ItemAddress( MainMenus, MainMsg.Code );
					func = (void *)(GTMENUITEM_USERDATA( n ));
					running = func();
					MainMsg.Code = n->NextSelect;
				}
				break;
		}
	}
	return( running );
}

int OpenMainWindow( void )
{
	struct NewGadget	ng;
	struct Gadget	*g;
	UWORD		lc, tc;
	UWORD		wleft = MainLeft, wtop = MainTop, ww, wh;

	ComputeFont( MainWidth, MainHeight );

	ww = ComputeX( MainWidth );
	wh = ComputeY( MainHeight );

	if (( wleft + ww + OffX + Scr->WBorRight ) > Scr->Width ) wleft = Scr->Width - ww;
	if (( wtop + wh + OffY + Scr->WBorBottom ) > Scr->Height ) wtop = Scr->Height - wh;

	if ( ! ( MainFont = OpenDiskFont( Font )))
		return( 5L );

	if ( ! ( g = CreateContext( &MainGList )))
		return( 1L );

	for( lc = 0, tc = 0; lc < Main_CNT; lc++ ) {

		CopyMem((char * )&MainNGad[ lc ], (char * )&ng, (long)sizeof( struct NewGadget ));

		ng.ng_VisualInfo = VisualInfo;
		ng.ng_TextAttr	 = Font;
		ng.ng_LeftEdge	 = OffX + ComputeX( ng.ng_LeftEdge );
		ng.ng_TopEdge	 = OffY + ComputeY( ng.ng_TopEdge );
		ng.ng_Width	 = ComputeX( ng.ng_Width );
		ng.ng_Height	 = ComputeY( ng.ng_Height);

		MainGadgets[ lc ] = g = CreateGadgetA((ULONG)MainGTypes[ lc ], g, &ng, ( struct TagItem * )&MainGTags[ tc ] );

		while( MainGTags[ tc ] ) tc += 2;
		tc++;

		if ( NOT g )
			return( 2L );
	}

	if ( ! ( MainMenus = CreateMenus( MainNewMenu, GTMN_FrontPen, 0L, TAG_DONE )))
		return( 3L );

	LayoutMenus( MainMenus, VisualInfo, TAG_DONE );

	if ( ! ( MainWnd = OpenWindowTags( NULL,
				WA_Left,	wleft,
				WA_Top, 	wtop,
				WA_Width,	ww + OffX + Scr->WBorRight,
				WA_Height,	wh + OffY + Scr->WBorBottom,
				WA_IDCMP,	NUMBERIDCMP|TEXTIDCMP|IDCMP_MENUPICK|IDCMP_REFRESHWINDOW,
				WA_Flags,	WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_SMART_REFRESH|WFLG_ACTIVATE,
				WA_Gadgets,	MainGList,
				WA_Title,	MainWdt,
				WA_ScreenTitle, "Workbench",
				TAG_DONE )))
	return( 4L );

	SetMenuStrip( MainWnd, MainMenus );
	GT_RefreshWindow( MainWnd, NULL );

	MainRender();

	return( 0L );
}

void CloseMainWindow( void )
{
	if ( MainMenus      ) {
		ClearMenuStrip( MainWnd );
		FreeMenus( MainMenus );
		MainMenus = NULL;	}

	if ( MainWnd        ) {
		CloseWindow( MainWnd );
		MainWnd = NULL;
	}

	if ( MainGList      ) {
		FreeGadgets( MainGList );
		MainGList = NULL;
	}

	if ( MainFont ) {
		CloseFont( MainFont );
		MainFont = NULL;
	}
}

int HandleTurniereingabeIDCMP( void )
{
	struct IntuiMessage	*m;
	int			(*func)();
	BOOL			running = TRUE;

	while( m = GT_GetIMsg( TurniereingabeWnd->UserPort )) {

		CopyMem(( char * )m, ( char * )&TurniereingabeMsg, (long)sizeof( struct IntuiMessage ));

		GT_ReplyIMsg( m );

		switch ( TurniereingabeMsg.Class ) {

			case	IDCMP_REFRESHWINDOW:
				GT_BeginRefresh( TurniereingabeWnd );
				GT_EndRefresh( TurniereingabeWnd, TRUE );
				break;

			case	IDCMP_CLOSEWINDOW:
				running = TurniereingabeCloseWindow();
				break;

			case	IDCMP_RAWKEY:
				running = TurniereingabeRawKey();
				break;

			case	IDCMP_GADGETUP:
				func = ( void * )(( struct Gadget * )TurniereingabeMsg.IAddress )->UserData;
				running = func();
				break;
		}
	}
	return( running );
}

int OpenTurniereingabeWindow( void )
{
	struct NewGadget	ng;
	struct Gadget	*g;
	UWORD		lc, tc;
	UWORD		wleft = TurniereingabeLeft, wtop = TurniereingabeTop, ww, wh;

	ComputeFont( TurniereingabeWidth, TurniereingabeHeight );

	ww = ComputeX( TurniereingabeWidth );
	wh = ComputeY( TurniereingabeHeight );

	if (( wleft + ww + OffX + Scr->WBorRight ) > Scr->Width ) wleft = Scr->Width - ww;
	if (( wtop + wh + OffY + Scr->WBorBottom ) > Scr->Height ) wtop = Scr->Height - wh;

	if ( ! ( TurniereingabeFont = OpenDiskFont( Font )))
		return( 5L );

	if ( ! ( g = CreateContext( &TurniereingabeGList )))
		return( 1L );

	for( lc = 0, tc = 0; lc < Turniereingabe_CNT; lc++ ) {

		CopyMem((char * )&TurniereingabeNGad[ lc ], (char * )&ng, (long)sizeof( struct NewGadget ));

		ng.ng_VisualInfo = VisualInfo;
		ng.ng_TextAttr	 = Font;
		ng.ng_LeftEdge	 = OffX + ComputeX( ng.ng_LeftEdge );
		ng.ng_TopEdge	 = OffY + ComputeY( ng.ng_TopEdge );
		ng.ng_Width	 = ComputeX( ng.ng_Width );
		ng.ng_Height	 = ComputeY( ng.ng_Height);

		TurniereingabeGadgets[ lc ] = g = CreateGadgetA((ULONG)TurniereingabeGTypes[ lc ], g, &ng, ( struct TagItem * )&TurniereingabeGTags[ tc ] );

		while( TurniereingabeGTags[ tc ] ) tc += 2;
		tc++;

		if ( NOT g )
			return( 2L );
	}

	if ( ! ( TurniereingabeWnd = OpenWindowTags( NULL,
				WA_Left,	wleft,
				WA_Top, 	wtop,
				WA_Width,	ww + OffX + Scr->WBorRight,
				WA_Height,	wh + OffY + Scr->WBorBottom,
				WA_IDCMP,	BUTTONIDCMP|STRINGIDCMP|IDCMP_CLOSEWINDOW|IDCMP_RAWKEY|IDCMP_REFRESHWINDOW,
				WA_Flags,	WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_SMART_REFRESH|WFLG_ACTIVATE,
				WA_Gadgets,	TurniereingabeGList,
				WA_Title,	TurniereingabeWdt,
				WA_ScreenTitle, "Workbench",
				TAG_DONE )))
	return( 4L );

	GT_RefreshWindow( TurniereingabeWnd, NULL );

	return( 0L );
}

void CloseTurniereingabeWindow( void )
{
	if ( TurniereingabeWnd        ) {
		CloseWindow( TurniereingabeWnd );
		TurniereingabeWnd = NULL;
	}

	if ( TurniereingabeGList      ) {
		FreeGadgets( TurniereingabeGList );
		TurniereingabeGList = NULL;
	}

	if ( TurniereingabeFont ) {
		CloseFont( TurniereingabeFont );
		TurniereingabeFont = NULL;
	}
}

void TeilnehmereingabeRender( void )
{
	struct IntuiText	it;
	UWORD			cnt;

	ComputeFont( TeilnehmereingabeWidth, TeilnehmereingabeHeight );


	for ( cnt = 0; cnt < Teilnehmereingabe_TNUM; cnt++ ) {
		CopyMem(( char * )&TeilnehmereingabeIText[ cnt ], ( char * )&it, (long)sizeof( struct IntuiText ));
		it.ITextFont = Font;
		it.LeftEdge  = OffX + ComputeX( it.LeftEdge ) - ( IntuiTextLength( &it ) >> 1 );
		it.TopEdge   = OffY + ComputeY( it.TopEdge ) - ( Font->ta_YSize >> 1 );
		PrintIText( TeilnehmereingabeWnd->RPort, &it, 0, 0 );
	}
}

int HandleTeilnehmereingabeIDCMP( void )
{
	struct IntuiMessage	*m;
	int			(*func)();
	BOOL			running = TRUE;

	while( m = GT_GetIMsg( TeilnehmereingabeWnd->UserPort )) {

		CopyMem(( char * )m, ( char * )&TeilnehmereingabeMsg, (long)sizeof( struct IntuiMessage ));

		GT_ReplyIMsg( m );

		switch ( TeilnehmereingabeMsg.Class ) {

			case	IDCMP_REFRESHWINDOW:
				GT_BeginRefresh( TeilnehmereingabeWnd );
				TeilnehmereingabeRender();
				GT_EndRefresh( TeilnehmereingabeWnd, TRUE );
				break;

			case	IDCMP_CLOSEWINDOW:
				running = TeilnehmereingabeCloseWindow();
				break;

			case	IDCMP_RAWKEY:
				running = TeilnehmereingabeRawKey();
				break;

			case	IDCMP_GADGETUP:
				func = ( void * )(( struct Gadget * )TeilnehmereingabeMsg.IAddress )->UserData;
				running = func();
				break;
		}
	}
	return( running );
}

int OpenTeilnehmereingabeWindow( void )
{
	struct NewGadget	ng;
	struct Gadget	*g;
	UWORD		lc, tc;
	UWORD		wleft = TeilnehmereingabeLeft, wtop = TeilnehmereingabeTop, ww, wh;

	ComputeFont( TeilnehmereingabeWidth, TeilnehmereingabeHeight );

	ww = ComputeX( TeilnehmereingabeWidth );
	wh = ComputeY( TeilnehmereingabeHeight );

	if (( wleft + ww + OffX + Scr->WBorRight ) > Scr->Width ) wleft = Scr->Width - ww;
	if (( wtop + wh + OffY + Scr->WBorBottom ) > Scr->Height ) wtop = Scr->Height - wh;

	if ( ! ( TeilnehmereingabeFont = OpenDiskFont( Font )))
		return( 5L );

	if ( ! ( g = CreateContext( &TeilnehmereingabeGList )))
		return( 1L );

	for( lc = 0, tc = 0; lc < Teilnehmereingabe_CNT; lc++ ) {

		CopyMem((char * )&TeilnehmereingabeNGad[ lc ], (char * )&ng, (long)sizeof( struct NewGadget ));

		ng.ng_VisualInfo = VisualInfo;
		ng.ng_TextAttr	 = Font;
		ng.ng_LeftEdge	 = OffX + ComputeX( ng.ng_LeftEdge );
		ng.ng_TopEdge	 = OffY + ComputeY( ng.ng_TopEdge );
		ng.ng_Width	 = ComputeX( ng.ng_Width );
		ng.ng_Height	 = ComputeY( ng.ng_Height);

		TeilnehmereingabeGadgets[ lc ] = g = CreateGadgetA((ULONG)TeilnehmereingabeGTypes[ lc ], g, &ng, ( struct TagItem * )&TeilnehmereingabeGTags[ tc ] );

		while( TeilnehmereingabeGTags[ tc ] ) tc += 2;
		tc++;

		if ( NOT g )
			return( 2L );
	}

	if ( ! ( TeilnehmereingabeWnd = OpenWindowTags( NULL,
				WA_Left,	wleft,
				WA_Top, 	wtop,
				WA_Width,	ww + OffX + Scr->WBorRight,
				WA_Height,	wh + OffY + Scr->WBorBottom,
				WA_IDCMP,	CHECKBOXIDCMP|BUTTONIDCMP|STRINGIDCMP|INTEGERIDCMP|IDCMP_CLOSEWINDOW|IDCMP_RAWKEY|IDCMP_REFRESHWINDOW,
				WA_Flags,	WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_SMART_REFRESH|WFLG_ACTIVATE,
				WA_Gadgets,	TeilnehmereingabeGList,
				WA_Title,	TeilnehmereingabeWdt,
				WA_ScreenTitle, "Workbench",
				TAG_DONE )))
	return( 4L );

	GT_RefreshWindow( TeilnehmereingabeWnd, NULL );

	TeilnehmereingabeRender();

	return( 0L );
}

void CloseTeilnehmereingabeWindow( void )
{
	if ( TeilnehmereingabeWnd        ) {
		CloseWindow( TeilnehmereingabeWnd );
		TeilnehmereingabeWnd = NULL;
	}

	if ( TeilnehmereingabeGList      ) {
		FreeGadgets( TeilnehmereingabeGList );
		TeilnehmereingabeGList = NULL;
	}

	if ( TeilnehmereingabeFont ) {
		CloseFont( TeilnehmereingabeFont );
		TeilnehmereingabeFont = NULL;
	}
}

int HandleTeilnehmerauswahlIDCMP( void )
{
	struct IntuiMessage	*m;
	int			(*func)();
	BOOL			running = TRUE;

	while( m = GT_GetIMsg( TeilnehmerauswahlWnd->UserPort )) {

		CopyMem(( char * )m, ( char * )&TeilnehmerauswahlMsg, (long)sizeof( struct IntuiMessage ));

		GT_ReplyIMsg( m );

		switch ( TeilnehmerauswahlMsg.Class ) {

			case	IDCMP_REFRESHWINDOW:
				GT_BeginRefresh( TeilnehmerauswahlWnd );
				GT_EndRefresh( TeilnehmerauswahlWnd, TRUE );
				break;

			case	IDCMP_CLOSEWINDOW:
				running = TeilnehmerauswahlCloseWindow();
				break;

			case	IDCMP_GADGETUP:
			case	IDCMP_GADGETDOWN:
				func = ( void * )(( struct Gadget * )TeilnehmerauswahlMsg.IAddress )->UserData;
				running = func();
				break;
		}
	}
	return( running );
}

int OpenTeilnehmerauswahlWindow( void )
{
	struct NewGadget	ng;
	struct Gadget	*g;
	UWORD		lc, tc;
	UWORD		wleft = TeilnehmerauswahlLeft, wtop = TeilnehmerauswahlTop, ww, wh;

	ComputeFont( TeilnehmerauswahlWidth, TeilnehmerauswahlHeight );

	ww = ComputeX( TeilnehmerauswahlWidth );
	wh = ComputeY( TeilnehmerauswahlHeight );

	if (( wleft + ww + OffX + Scr->WBorRight ) > Scr->Width ) wleft = Scr->Width - ww;
	if (( wtop + wh + OffY + Scr->WBorBottom ) > Scr->Height ) wtop = Scr->Height - wh;

	if ( ! ( TeilnehmerauswahlFont = OpenDiskFont( Font )))
		return( 5L );

	if ( ! ( g = CreateContext( &TeilnehmerauswahlGList )))
		return( 1L );

	for( lc = 0, tc = 0; lc < Teilnehmerauswahl_CNT; lc++ ) {

		CopyMem((char * )&TeilnehmerauswahlNGad[ lc ], (char * )&ng, (long)sizeof( struct NewGadget ));

		ng.ng_VisualInfo = VisualInfo;
		ng.ng_TextAttr	 = Font;
		ng.ng_LeftEdge	 = OffX + ComputeX( ng.ng_LeftEdge );
		ng.ng_TopEdge	 = OffY + ComputeY( ng.ng_TopEdge );
		ng.ng_Width	 = ComputeX( ng.ng_Width );
		ng.ng_Height	 = ComputeY( ng.ng_Height);

		TeilnehmerauswahlGadgets[ lc ] = g = CreateGadgetA((ULONG)TeilnehmerauswahlGTypes[ lc ], g, &ng, ( struct TagItem * )&TeilnehmerauswahlGTags[ tc ] );

		while( TeilnehmerauswahlGTags[ tc ] ) tc += 2;
		tc++;

		if ( NOT g )
			return( 2L );
	}

	if ( ! ( TeilnehmerauswahlWnd = OpenWindowTags( NULL,
				WA_Left,	wleft,
				WA_Top, 	wtop,
				WA_Width,	ww + OffX + Scr->WBorRight,
				WA_Height,	wh + OffY + Scr->WBorBottom,
				WA_IDCMP,	BUTTONIDCMP|LISTVIEWIDCMP|IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW,
				WA_Flags,	WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_SMART_REFRESH|WFLG_ACTIVATE,
				WA_Gadgets,	TeilnehmerauswahlGList,
				WA_Title,	TeilnehmerauswahlWdt,
				WA_ScreenTitle, "Workbench",
				TAG_DONE )))
	return( 4L );

	GT_RefreshWindow( TeilnehmerauswahlWnd, NULL );

	return( 0L );
}

void CloseTeilnehmerauswahlWindow( void )
{
	if ( TeilnehmerauswahlWnd        ) {
		CloseWindow( TeilnehmerauswahlWnd );
		TeilnehmerauswahlWnd = NULL;
	}

	if ( TeilnehmerauswahlGList      ) {
		FreeGadgets( TeilnehmerauswahlGList );
		TeilnehmerauswahlGList = NULL;
	}

	if ( TeilnehmerauswahlFont ) {
		CloseFont( TeilnehmerauswahlFont );
		TeilnehmerauswahlFont = NULL;
	}
}

int HandleErgebniseingabeIDCMP( void )
{
	struct IntuiMessage	*m;
	int			(*func)();
	BOOL			running = TRUE;

	while( m = GT_GetIMsg( ErgebniseingabeWnd->UserPort )) {

		CopyMem(( char * )m, ( char * )&ErgebniseingabeMsg, (long)sizeof( struct IntuiMessage ));

		GT_ReplyIMsg( m );

		switch ( ErgebniseingabeMsg.Class ) {

			case	IDCMP_REFRESHWINDOW:
				GT_BeginRefresh( ErgebniseingabeWnd );
				GT_EndRefresh( ErgebniseingabeWnd, TRUE );
				break;

			case	IDCMP_CLOSEWINDOW:
				running = ErgebniseingabeCloseWindow();
				break;

			case	IDCMP_RAWKEY:
				running = ErgebniseingabeRawKey();
				break;

			case	IDCMP_GADGETUP:
			case	IDCMP_GADGETDOWN:
				func = ( void * )(( struct Gadget * )ErgebniseingabeMsg.IAddress )->UserData;
				running = func();
				break;
		}
	}
	return( running );
}

int OpenErgebniseingabeWindow( void )
{
	struct NewGadget	ng;
	struct Gadget	*g;
	UWORD		lc, tc;
	UWORD		wleft = ErgebniseingabeLeft, wtop = ErgebniseingabeTop, ww, wh;

	ComputeFont( ErgebniseingabeWidth, ErgebniseingabeHeight );

	ww = ComputeX( ErgebniseingabeWidth );
	wh = ComputeY( ErgebniseingabeHeight );

	if (( wleft + ww + OffX + Scr->WBorRight ) > Scr->Width ) wleft = Scr->Width - ww;
	if (( wtop + wh + OffY + Scr->WBorBottom ) > Scr->Height ) wtop = Scr->Height - wh;

	if ( ! ( ErgebniseingabeFont = OpenDiskFont( Font )))
		return( 5L );

	if ( ! ( g = CreateContext( &ErgebniseingabeGList )))
		return( 1L );

	for( lc = 0, tc = 0; lc < Ergebniseingabe_CNT; lc++ ) {

		CopyMem((char * )&ErgebniseingabeNGad[ lc ], (char * )&ng, (long)sizeof( struct NewGadget ));

		ng.ng_VisualInfo = VisualInfo;
		ng.ng_TextAttr	 = Font;
		ng.ng_LeftEdge	 = OffX + ComputeX( ng.ng_LeftEdge );
		ng.ng_TopEdge	 = OffY + ComputeY( ng.ng_TopEdge );
		ng.ng_Width	 = ComputeX( ng.ng_Width );
		ng.ng_Height	 = ComputeY( ng.ng_Height);

		ErgebniseingabeGadgets[ lc ] = g = CreateGadgetA((ULONG)ErgebniseingabeGTypes[ lc ], g, &ng, ( struct TagItem * )&ErgebniseingabeGTags[ tc ] );

		while( ErgebniseingabeGTags[ tc ] ) tc += 2;
		tc++;

		if ( NOT g )
			return( 2L );
	}

	if ( ! ( ErgebniseingabeWnd = OpenWindowTags( NULL,
				WA_Left,	wleft,
				WA_Top, 	wtop,
				WA_Width,	ww + OffX + Scr->WBorRight,
				WA_Height,	wh + OffY + Scr->WBorBottom,
				WA_IDCMP,	BUTTONIDCMP|MXIDCMP|LISTVIEWIDCMP|IDCMP_CLOSEWINDOW|IDCMP_RAWKEY|IDCMP_REFRESHWINDOW,
				WA_Flags,	WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_SMART_REFRESH|WFLG_ACTIVATE,
				WA_Gadgets,	ErgebniseingabeGList,
				WA_Title,	ErgebniseingabeWdt,
				WA_ScreenTitle, "Workbench",
				TAG_DONE )))
	return( 4L );

	GT_RefreshWindow( ErgebniseingabeWnd, NULL );

	return( 0L );
}

void CloseErgebniseingabeWindow( void )
{
	if ( ErgebniseingabeWnd        ) {
		CloseWindow( ErgebniseingabeWnd );
		ErgebniseingabeWnd = NULL;
	}

	if ( ErgebniseingabeGList      ) {
		FreeGadgets( ErgebniseingabeGList );
		ErgebniseingabeGList = NULL;
	}

	if ( ErgebniseingabeFont ) {
		CloseFont( ErgebniseingabeFont );
		ErgebniseingabeFont = NULL;
	}
}

void AusgabeRender( void )
{
	struct IntuiText	it;
	UWORD			cnt;

	ComputeFont( AusgabeWidth, AusgabeHeight );


	for ( cnt = 0; cnt < Ausgabe_TNUM; cnt++ ) {
		CopyMem(( char * )&AusgabeIText[ cnt ], ( char * )&it, (long)sizeof( struct IntuiText ));
		it.ITextFont = Font;
		it.LeftEdge  = OffX + ComputeX( it.LeftEdge ) - ( IntuiTextLength( &it ) >> 1 );
		it.TopEdge   = OffY + ComputeY( it.TopEdge ) - ( Font->ta_YSize >> 1 );
		PrintIText( AusgabeWnd->RPort, &it, 0, 0 );
	}
}

int HandleAusgabeIDCMP( void )
{
	struct IntuiMessage	*m;
	int			(*func)();
	BOOL			running = TRUE;

	while( m = GT_GetIMsg( AusgabeWnd->UserPort )) {

		CopyMem(( char * )m, ( char * )&AusgabeMsg, (long)sizeof( struct IntuiMessage ));

		GT_ReplyIMsg( m );

		switch ( AusgabeMsg.Class ) {

			case	IDCMP_REFRESHWINDOW:
				GT_BeginRefresh( AusgabeWnd );
				AusgabeRender();
				GT_EndRefresh( AusgabeWnd, TRUE );
				break;

			case	IDCMP_CLOSEWINDOW:
				running = AusgabeCloseWindow();
				break;

			case	IDCMP_RAWKEY:
				running = AusgabeRawKey();
				break;

			case	IDCMP_GADGETUP:
			case	IDCMP_GADGETDOWN:
				func = ( void * )(( struct Gadget * )AusgabeMsg.IAddress )->UserData;
				running = func();
				break;
		}
	}
	return( running );
}

int OpenAusgabeWindow( void )
{
	struct NewGadget	ng;
	struct Gadget	*g;
	UWORD		lc, tc;
	UWORD		wleft = AusgabeLeft, wtop = AusgabeTop, ww, wh;

	ComputeFont( AusgabeWidth, AusgabeHeight );

	ww = ComputeX( AusgabeWidth );
	wh = ComputeY( AusgabeHeight );

	if (( wleft + ww + OffX + Scr->WBorRight ) > Scr->Width ) wleft = Scr->Width - ww;
	if (( wtop + wh + OffY + Scr->WBorBottom ) > Scr->Height ) wtop = Scr->Height - wh;

	if ( ! ( AusgabeFont = OpenDiskFont( Font )))
		return( 5L );

	if ( ! ( g = CreateContext( &AusgabeGList )))
		return( 1L );

	for( lc = 0, tc = 0; lc < Ausgabe_CNT; lc++ ) {

		CopyMem((char * )&AusgabeNGad[ lc ], (char * )&ng, (long)sizeof( struct NewGadget ));

		ng.ng_VisualInfo = VisualInfo;
		ng.ng_TextAttr	 = Font;
		ng.ng_LeftEdge	 = OffX + ComputeX( ng.ng_LeftEdge );
		ng.ng_TopEdge	 = OffY + ComputeY( ng.ng_TopEdge );
		ng.ng_Width	 = ComputeX( ng.ng_Width );
		ng.ng_Height	 = ComputeY( ng.ng_Height);

		AusgabeGadgets[ lc ] = g = CreateGadgetA((ULONG)AusgabeGTypes[ lc ], g, &ng, ( struct TagItem * )&AusgabeGTags[ tc ] );

		while( AusgabeGTags[ tc ] ) tc += 2;
		tc++;

		if ( NOT g )
			return( 2L );
	}

	if ( ! ( AusgabeWnd = OpenWindowTags( NULL,
				WA_Left,	wleft,
				WA_Top, 	wtop,
				WA_Width,	ww + OffX + Scr->WBorRight,
				WA_Height,	wh + OffY + Scr->WBorBottom,
				WA_IDCMP,	LISTVIEWIDCMP|IDCMP_CLOSEWINDOW|IDCMP_RAWKEY|IDCMP_REFRESHWINDOW,
				WA_Flags,	WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_SMART_REFRESH|WFLG_ACTIVATE,
				WA_Gadgets,	AusgabeGList,
				WA_Title,	AusgabeWdt,
				WA_ScreenTitle, "Workbench",
				TAG_DONE )))
	return( 4L );

	GT_RefreshWindow( AusgabeWnd, NULL );

	AusgabeRender();

	return( 0L );
}

void CloseAusgabeWindow( void )
{
	if ( AusgabeWnd        ) {
		CloseWindow( AusgabeWnd );
		AusgabeWnd = NULL;
	}

	if ( AusgabeGList      ) {
		FreeGadgets( AusgabeGList );
		AusgabeGList = NULL;
	}

	if ( AusgabeFont ) {
		CloseFont( AusgabeFont );
		AusgabeFont = NULL;
	}
}

