/*
 *  Source machine generated by GadToolsBox V2.0
 *  which is (c) Copyright 1991-1993 Jaba Development
 *
 *  GUI Designed by : Jan van den Baard
 */

#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>

#include "compiler.h"

#include "project.h"

struct Window	      *CompilerWnd = NULL;
struct Window	      *LinkerWnd = NULL;
struct Gadget	      *CompilerGList = NULL;
struct Gadget	      *LinkerGList = NULL;
struct IntuiMessage    CompilerMsg;
struct IntuiMessage    LinkerMsg;
UWORD		       CompilerZoom[4];
UWORD		       LinkerZoom[4];
struct Gadget	      *CompilerGadgets[15];
struct Gadget	      *LinkerGadgets[7];
UWORD		       CompilerLeft = 76;
UWORD		       CompilerTop = 146;
UWORD		       CompilerWidth = 547;
UWORD		       CompilerHeight = 259;
UWORD		       LinkerLeft = 183;
UWORD		       LinkerTop = 226;
UWORD		       LinkerWidth = 384;
UWORD		       LinkerHeight = 104;
UBYTE		      *CompilerWdt = (UBYTE *)"Project Handler : Compiler Options";
UBYTE		      *LinkerWdt = (UBYTE *)"Project Handler : Linker Options";
struct Window	      *GenOptWnd = NULL;
struct Gadget	      *GenOptGList = NULL;
struct IntuiMessage    GenOptMsg;
UWORD		       GenOptZoom[4];
struct Gadget	      *GenOptGadgets[5];
UWORD		       GenOptLeft = 185;
UWORD		       GenOptTop = 150;
UWORD		       GenOptWidth = 335;
UWORD		       GenOptHeight = 88;
UBYTE		      *GenOptWdt = (UBYTE *)"Project Handler : Main Options";

UBYTE *Type1Labels[] = {
	(UBYTE *)"Executable",
	(UBYTE *)"Library",
	(UBYTE *)"Romable",
	NULL };

struct IntuiText GenOptIText[] = {
	1, 0, JAM1,167, 49, NULL, (UBYTE *)".", NULL };

#define GenOpt_TNUM 1

UWORD GenOptGTypes[] = {
	CYCLE_KIND,
	SLIDER_KIND,
	SLIDER_KIND
	BUTTON_KIND,
	BUTTON_KIND
};

struct NewGadget GenOptNGad[] = {
	155, 7, 164, 14, (UBYTE *)"Final Object _Type :", NULL, GD_Type, PLACETEXT_LEFT, NULL, (APTR)GenTypeClicked,
	14, 42, 130, 15, (UBYTE *)"OS _Version", NULL, GD_Ver, PLACETEXT_ABOVE, NULL, (APTR)VerClicked,
	191, 42, 130, 15, (UBYTE *)"OS _Revision", NULL, GD_Rev, PLACETEXT_ABOVE, NULL, (APTR)RevClicked
	46, 66, 102, 14, NULL, NULL, GD_GenOptUse, PLACETEXT_IN, NULL, (APTR)GenOptUseClicked,
	195, 66, 102, 14, NULL, NULL, GD_GenOptCancel, PLACETEXT_IN, NULL, (APTR)GenOptCancelClicked
};

ULONG GenOptGTags[] = {
	(GTCY_Labels), (ULONG)&Type1Labels[ 0 ], (GT_Underscore), '_', (TAG_DONE),
	(GTSL_Min), 1, (GTSL_Max), 9, (GTSL_Level), 2, (GTSL_MaxLevelLen), 4, (GTSL_LevelFormat), (ULONG)"%2ld", (GTSL_LevelPlace), (PLACETEXT_RIGHT), (PGA_Freedom), LORIENT_HORIZ, (GA_RelVerify), TRUE, (GT_Underscore), '_', (TAG_DONE),
	(GTSL_Max), 9, (GTSL_MaxLevelLen), 4, (GTSL_LevelFormat), (ULONG)"%2ld", (PGA_Freedom), LORIENT_HORIZ, (GA_RelVerify), TRUE, (GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE)
};

UBYTE *CPU0Labels[] = {
	(UBYTE *)"680_00/010",
	(UBYTE *)"680_20",
	(UBYTE *)"680_30",
	NULL };

UBYTE *FPU0Labels[] = {
	(UBYTE *)"_None",
	(UBYTE *)"_68881",
	(UBYTE *)"6_8882",
	NULL };

UBYTE *Code0Labels[] = {
	(UBYTE *)"_Small",
	(UBYTE *)"_Large",
	NULL };

UBYTE *Data0Labels[] = {
	(UBYTE *)"S_mall",
	(UBYTE *)"Larg_e",
	NULL };

UBYTE *Calls0Labels[] = {
	(UBYTE *)"_Registerized",
	(UBYTE *)"_Trough Stack",
	NULL };

UBYTE *HunkCode0Labels[] = {
	(UBYTE *)"_Only constants",
	(UBYTE *)"Bot_h constants and strings",
	(UBYTE *)"Constant, string and _PC Relative",
	NULL };

UBYTE *Profile0Labels[] = {
	(UBYTE *)"Disable Profilin_g",
	(UBYTE *)"Source code onl_y",
	(UBYTE *)"Source code and all li_braries",
	NULL };

struct IntuiText CompilerIText[] = {
	2, 0, JAM2,100, 7, NULL, (UBYTE *)" Code Generation ", NULL,
	2, 0, JAM2,242, 7, NULL, (UBYTE *)" Code Model ", NULL,
	2, 0, JAM2,342, 7, NULL, (UBYTE *)" Data Model ", NULL,
	2, 0, JAM2,465, 7, NULL, (UBYTE *)" Procedure Call ", NULL,
	2, 0, JAM2,119, 79, NULL, (UBYTE *)" Constant Hunk Code Content ", NULL,
	2, 0, JAM2,385, 79, NULL, (UBYTE *)" Profiling Options ", NULL,
	2, 0, JAM2,250, 153, NULL, (UBYTE *)" Diverse Compiling Options ", NULL };

#define Compiler_TNUM 7

UWORD CompilerGTypes[] = {
	MX_KIND,
	MX_KIND,
	MX_KIND,
	MX_KIND,
	MX_KIND,
	MX_KIND,
	CHECKBOX_KIND,
	CHECKBOX_KIND,
	CHECKBOX_KIND,
	CHECKBOX_KIND,
	CHECKBOX_KIND,
	CHECKBOX_KIND,
	MX_KIND,
	BUTTON_KIND,
	BUTTON_KIND
};

UWORD LinkerGTypes[] = {
	BUTTON_KIND,
	BUTTON_KIND,
	CHECKBOX_KIND,
	CHECKBOX_KIND,
	CHECKBOX_KIND,
	CHECKBOX_KIND,
	CHECKBOX_KIND
};

struct NewGadget CompilerNGad[] = {
	20, 19, 17, 9, NULL, NULL, GD_CPU, PLACETEXT_RIGHT, NULL, (APTR)CPUClicked,
	117, 19, 17, 9, NULL, NULL, GD_FPU, PLACETEXT_RIGHT, NULL, (APTR)FPUClicked,
	214, 27, 17, 9, NULL, NULL, GD_Code, PLACETEXT_RIGHT, NULL, (APTR)CodeClicked,
	311, 27, 17, 9, NULL, NULL, GD_Data, PLACETEXT_RIGHT, NULL, (APTR)DataClicked,
	408, 27, 17, 9, NULL, NULL, GD_Calls, PLACETEXT_RIGHT, NULL, (APTR)CallsClicked,
	20, 91, 17, 9, NULL, NULL, GD_HunkCode, PLACETEXT_RIGHT, NULL, (APTR)HunkCodeClicked,
	37, 163, 26, 11, (UBYTE *)"_Inline Library Calls", NULL, GD_Inline, PLACETEXT_RIGHT, NULL, (APTR)InlineClicked,
	300, 205, 26, 11, (UBYTE *)"C_++ style comments ( // )", NULL, GD_Gadget70, PLACETEXT_RIGHT, NULL, (APTR)Gadget70Clicked,
	37, 184, 26, 11, (UBYTE *)"Prevent unprototyped _function calls", NULL, GD_Proto, PLACETEXT_RIGHT, NULL, (APTR)ProtoClicked,
	37, 205, 26, 11, (UBYTE *)"Exe_cutable Residentable", NULL, GD_Resident, PLACETEXT_RIGHT, NULL, (APTR)ResidentClicked,
	300, 163, 26, 11, (UBYTE *)"Generate _dynamic stack", NULL, GD_Dynamic, PLACETEXT_RIGHT, NULL, (APTR)DynamicClicked,
	300, 184, 26, 11, (UBYTE *)"Debug Level _1", NULL, GD_DebugL, PLACETEXT_RIGHT, NULL, (APTR)DebugLClicked,
	288, 91, 17, 9, NULL, NULL, GD_Profile, PLACETEXT_RIGHT, NULL, (APTR)ProfileClicked,
	93, 234, 120, 19,NULL , NULL, GD_Use, PLACETEXT_IN, NULL, (APTR)CompilerUseClicked,
	333, 234, 120, 19,NULL, NULL, GD_Cancel, PLACETEXT_IN, NULL, (APTR)CompilerCancelClicked
};

struct NewGadget LinkerNGad[] = {
	13, 77, 120, 19, NULL, NULL, GD_Use, PLACETEXT_IN, NULL, (APTR)LinkerUseClicked,
	253, 77, 120, 19, NULL, NULL, GD_Cancel, PLACETEXT_IN, NULL, (APTR)LinkerCancelClicked,
	9, 7, 26, 11, (UBYTE *)"Force code in Ch_ip", NULL, GD_Chip, PLACETEXT_RIGHT, NULL, (APTR)ChipClicked,
	9, 28, 26, 11, (UBYTE *)"Relocation _Hunks", NULL, GD_RelocHunk, PLACETEXT_RIGHT, NULL, (APTR)RelocHunkClicked,
	9, 49, 26, 11, (UBYTE *)"Include _Debug Information", NULL, GD_DebugI, PLACETEXT_RIGHT, NULL, (APTR)DebugIClicked,
	211, 7, 26, 11, (UBYTE *)"_Fragmented File", NULL, GD_Fragment, PLACETEXT_RIGHT, NULL, (APTR)FragmentClicked,
	211, 28, 26, 11, (UBYTE *)"Use Unix _library", NULL, GD_UnixLib, PLACETEXT_RIGHT, NULL, (APTR)UnixLibClicked
};

ULONG CompilerGTags[] = {
	(GTMX_Labels), (ULONG)&CPU0Labels[ 0 ], (GT_Underscore), '_', (TAG_DONE),
	(GTMX_Labels), (ULONG)&FPU0Labels[ 0 ], (GT_Underscore), '_', (TAG_DONE),
	(GTMX_Labels), (ULONG)&Code0Labels[ 0 ], (GT_Underscore), '_', (TAG_DONE),
	(GTMX_Labels), (ULONG)&Data0Labels[ 0 ], (GT_Underscore), '_', (TAG_DONE),
	(GTMX_Labels), (ULONG)&Calls0Labels[ 0 ], (GT_Underscore), '_', (TAG_DONE),
	(GTMX_Labels), (ULONG)&HunkCode0Labels[ 0 ], (GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE),
	(GTMX_Labels), (ULONG)&Profile0Labels[ 0 ], (GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE)
};

ULONG LinkerGTags[] = {
	(GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE)
};

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

	ComputeFont( CompilerWidth, CompilerHeight );

	DrawBevelBox( CompilerWnd->RPort, OffX + ComputeX( 296 ),
					OffY + ComputeY( 7 ),
					ComputeX( 91 ),
					ComputeY( 62 ),
					GT_VisualInfo, VisualInfo, TAG_DONE );
	DrawBevelBox( CompilerWnd->RPort, OffX + ComputeX( 198 ),
					OffY + ComputeY( 7 ),
					ComputeX( 91 ),
					ComputeY( 62 ),
					GT_VisualInfo, VisualInfo, TAG_DONE );
	DrawBevelBox( CompilerWnd->RPort, OffX + ComputeX( 395 ),
					OffY + ComputeY( 7 ),
					ComputeX( 146 ),
					ComputeY( 62 ),
					GT_VisualInfo, VisualInfo, TAG_DONE );
	DrawBevelBox( CompilerWnd->RPort, OffX + ComputeX( 6 ),
					OffY + ComputeY( 7 ),
					ComputeX( 186 ),
					ComputeY( 62 ),
					GT_VisualInfo, VisualInfo, TAG_DONE );
	DrawBevelBox( CompilerWnd->RPort, OffX + ComputeX( 6 ),
					OffY + ComputeY( 79 ),
					ComputeX( 252 ),
					ComputeY( 62 ),
					GT_VisualInfo, VisualInfo, TAG_DONE );
	DrawBevelBox( CompilerWnd->RPort, OffX + ComputeX( 262 ),
					OffY + ComputeY( 79 ),
					ComputeX( 279 ),
					ComputeY( 62 ),
					GT_VisualInfo, VisualInfo, TAG_DONE );
	DrawBevelBox( CompilerWnd->RPort, OffX + ComputeX( 6 ),
					OffY + ComputeY( 153 ),
					ComputeX( 535 ),
					ComputeY( 75 ),
					GT_VisualInfo, VisualInfo, TAG_DONE );

	for ( cnt = 0; cnt < Compiler_TNUM; cnt++ ) {
		CopyMem(( char * )&CompilerIText[ 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( CompilerWnd->RPort, &it, 0, 0 );
	}
}

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

	while( (CompilerWnd != NULL) && (m = GT_GetIMsg( CompilerWnd->UserPort )) ) {

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

		GT_ReplyIMsg( m );

		switch ( CompilerMsg.Class ) {

			case	IDCMP_REFRESHWINDOW:
				GT_BeginRefresh( CompilerWnd );
				CompilerRender();
				GT_EndRefresh( CompilerWnd, TRUE );
				break;

			case	IDCMP_GADGETUP:
			case	IDCMP_GADGETDOWN:
				func = ( void * )(( struct Gadget * )CompilerMsg.IAddress )->UserData;
				running = func();
				break;
			case	IDCMP_VANILLAKEY:
				CompilerVanillaKey( CompilerMsg.Code );
				break;
			case	IDCMP_RAWKEY:
				if ( CompilerMsg.Code == 95 )
				    ChargeAide( "WIN_Compiler" );
		}
	}
	return( running );
}

int OpenCompilerWindow( void )
{
	struct NewGadget	ng;
	struct Gadget	*g;
	UWORD		lc, tc;
	UWORD		wleft = CompilerLeft, wtop = CompilerTop, ww, wh;

	ComputeFont( CompilerWidth, CompilerHeight );

	ww = ComputeX( CompilerWidth );
	wh = ComputeY( CompilerHeight );

	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 ( ! ( g = CreateContext( &CompilerGList )))
		return( 1L );

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

		CopyMem((char * )&CompilerNGad[ 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);

		CompilerGadgets[ lc ] = g = CreateGadgetA((ULONG)CompilerGTypes[ lc ], g, &ng, ( struct TagItem * )&CompilerGTags[ tc ] );

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

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

	CompilerZoom[0] = CompilerLeft;
	CompilerZoom[1] = CompilerTop;
	CompilerZoom[2] = TextLength( &Scr->RastPort, (UBYTE *)CompilerWdt, strlen((char *)CompilerWdt )) + 80;
	CompilerZoom[3] = Scr->WBorTop + Scr->RastPort.TxHeight + 1;

	if ( ! ( CompilerWnd = OpenWindowTags( NULL,
				WA_Left,	wleft,
				WA_Top, 	wtop,
				WA_Width,	ww + OffX + Scr->WBorRight,
				WA_Height,	wh + OffY + Scr->WBorBottom,
				WA_IDCMP,	MXIDCMP|CHECKBOXIDCMP|BUTTONIDCMP|IDCMP_REFRESHWINDOW|IDCMP_VANILLAKEY|IDCMP_RAWKEY,
				WA_Flags,	WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_SMART_REFRESH|WFLG_ACTIVATE,
				WA_Gadgets,	CompilerGList,
				WA_Title,	CompilerWdt,
				WA_PubScreen,	Scr,
				WA_Zoom,	CompilerZoom,
				WA_Activate,	TRUE,
				TAG_DONE )))
	return( 4L );

	GT_RefreshWindow( CompilerWnd, NULL );

	if ( ROMVersion >= 39 )
	    LendMenus( CompilerWnd , ProjectWnd );
	CompilerRender();

	return( 0L );
}

void CloseCompilerWindow( void )
{
	if ( CompilerWnd        ) {
		CloseWindow( CompilerWnd );
		CompilerWnd = NULL;
	}

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

}

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

	while( (LinkerWnd != NULL ) && (m = GT_GetIMsg( LinkerWnd->UserPort )) ) {

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

		GT_ReplyIMsg( m );

		switch ( LinkerMsg.Class ) {

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

			case	IDCMP_GADGETUP:
				func = ( void * )(( struct Gadget * )LinkerMsg.IAddress )->UserData;
				running = func();
				break;
			case	IDCMP_VANILLAKEY:
				running = LinkerVanillaKey( LinkerMsg.Code );
				break;
			case	IDCMP_RAWKEY:
				if ( LinkerMsg.Code == 95 )
				    ChargeAide( "WIN_Linker" );
				break;
		}
	}
	return( running );
}

int OpenLinkerWindow( void )
{
	struct NewGadget	ng;
	struct Gadget	*g;
	UWORD		lc, tc;
	UWORD		wleft = LinkerLeft, wtop = LinkerTop, ww, wh;

	ComputeFont( LinkerWidth, LinkerHeight );

	ww = ComputeX( LinkerWidth );
	wh = ComputeY( LinkerHeight );

	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 ( ! ( g = CreateContext( &LinkerGList )))
		return( 1L );

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

		CopyMem((char * )&LinkerNGad[ 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);

		LinkerGadgets[ lc ] = g = CreateGadgetA((ULONG)LinkerGTypes[ lc ], g, &ng, ( struct TagItem * )&LinkerGTags[ tc ] );

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

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

	LinkerZoom[0] = LinkerLeft;
	LinkerZoom[1] = LinkerTop;
	LinkerZoom[2] = TextLength( &Scr->RastPort, (UBYTE *)LinkerWdt, strlen((char *)LinkerWdt )) + 80;
	LinkerZoom[3] = Scr->WBorTop + Scr->RastPort.TxHeight + 1;

	if ( ! ( LinkerWnd = OpenWindowTags( NULL,
				WA_Left,	wleft,
				WA_Top, 	wtop,
				WA_Width,	ww + OffX + Scr->WBorRight,
				WA_Height,	wh + OffY + Scr->WBorBottom,
				WA_IDCMP,	BUTTONIDCMP|CHECKBOXIDCMP|IDCMP_REFRESHWINDOW|IDCMP_VANILLAKEY|IDCMP_MENUPICK|IDCMP_RAWKEY,
				WA_Flags,	WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_SIZEBBOTTOM,
				WA_Gadgets,	LinkerGList,
				WA_Title,	LinkerWdt,
				WA_PubScreen,	Scr,
				WA_Zoom,	LinkerZoom,
				WA_Activate,	TRUE,
				TAG_DONE )))
	return( 4L );

	GT_RefreshWindow( LinkerWnd, NULL );

	if ( ROMVersion >= 39 )
	    LendMenus( LinkerWnd , ProjectWnd );

	return( 0L );
}

void CloseLinkerWindow( void )
{
	if ( LinkerWnd        ) {
		CloseWindow( LinkerWnd );
		LinkerWnd = NULL;
	}

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

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

	ComputeFont( GenOptWidth, GenOptHeight );


	for ( cnt = 0; cnt < GenOpt_TNUM; cnt++ ) {
		CopyMem(( char * )&GenOptIText[ 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( GenOptWnd->RPort, &it, 0, 0 );
	}
}

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

	while( (GenOptWnd != NULL) && (m = GT_GetIMsg( GenOptWnd->UserPort) ) ) {

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

		GT_ReplyIMsg( m );

		switch ( GenOptMsg.Class ) {

			case	IDCMP_REFRESHWINDOW:
				GT_BeginRefresh( GenOptWnd );
				GenOptRender();
				GT_EndRefresh( GenOptWnd, TRUE );
				break;

			case	IDCMP_VANILLAKEY:
				running = GenOptVanillaKey();
				break;

			case	IDCMP_RAWKEY:
				if ( GenOptMsg.Code == 95 )
				    ChargeAide( "WIN_MainOpt" );
				break;

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

int OpenGenOptWindow( void )
{
	struct NewGadget	ng;
	struct Gadget	*g;
	UWORD		lc, tc;
	UWORD		wleft = GenOptLeft, wtop = GenOptTop, ww, wh;

	ComputeFont( GenOptWidth, GenOptHeight );

	ww = ComputeX( GenOptWidth );
	wh = ComputeY( GenOptHeight );

	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 ( ! ( g = CreateContext( &GenOptGList )))
		return( 1L );

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

		CopyMem((char * )&GenOptNGad[ 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);

		GenOptGadgets[ lc ] = g = CreateGadgetA((ULONG)GenOptGTypes[ lc ], g, &ng, ( struct TagItem * )&GenOptGTags[ tc ] );

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

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

	GenOptZoom[0] = GenOptLeft;
	GenOptZoom[1] = GenOptTop;
	if ( GenOptWdt )
		GenOptZoom[2] = TextLength( &Scr->RastPort, (UBYTE *)GenOptWdt, strlen((char *)GenOptWdt )) + 80;
	else
		GenOptZoom[2]  = 80L;
		GenOptZoom[3] = Scr->WBorTop + Scr->RastPort.TxHeight + 1;

	if ( ! ( GenOptWnd = OpenWindowTags( NULL,
				WA_Left,	wleft,
				WA_Top, 	wtop,
				WA_Width,	ww + OffX + Scr->WBorRight,
				WA_Height,	wh + OffY + Scr->WBorBottom,
				WA_IDCMP,	CYCLEIDCMP|SLIDERIDCMP|IDCMP_VANILLAKEY|IDCMP_REFRESHWINDOW|IDCMP_MOUSEMOVE|IDCMP_RAWKEY,
				WA_Flags,	WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_SMART_REFRESH,
				WA_Gadgets,	GenOptGList,
				WA_Title,	GenOptWdt,
				WA_PubScreen,	Scr,
				WA_Activate,	TRUE,
				WA_Zoom,	GenOptZoom,
				WA_AutoAdjust,	TRUE,
				TAG_DONE )))
	return( 4L );

	GT_RefreshWindow( GenOptWnd, NULL );

	if ( ROMVersion >= 39 )
	    LendMenus( GenOptWnd , ProjectWnd );

	GenOptRender();

	return( 0L );
}

void CloseGenOptWindow( void )
{
    if ( GenOptWnd        ) {
	CloseWindow( GenOptWnd );
	GenOptWnd = NULL;
    }
    if ( GenOptGList      ) {
	FreeGadgets( GenOptGList );
	GenOptGList = NULL;
    }
}

