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

#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 "HangmanGui.h"

struct Screen         *Scr = NULL;
UBYTE                 *PubScreenName = NULL;
APTR                   VisualInfo = NULL;
struct Window         *Project0Wnd = NULL;
struct Window         *Project1Wnd = NULL;
struct Window         *Project2Wnd = NULL;
struct Window         *Project3Wnd = NULL;
struct Gadget         *Project0GList = NULL;
struct Gadget         *Project1GList = NULL;
struct Gadget         *Project2GList = NULL;
struct Gadget         *Project3GList = NULL;
struct Menu           *Project0Menus = NULL;
struct IntuiMessage    Project0Msg;
struct IntuiMessage    Project1Msg;
struct IntuiMessage    Project2Msg;
struct IntuiMessage    Project3Msg;
struct Gadget         *Project0Gadgets[8];
struct Gadget         *Project1Gadgets[2];
struct Gadget         *Project2Gadgets[2];
struct Gadget         *Project3Gadgets[2];
UWORD                  Project0Left = 29;
UWORD                  Project0Top = 9;
UWORD                  Project0Width = 609;
UWORD                  Project0Height = 239;
UWORD                  Project1Left = 153;
UWORD                  Project1Top = 32;
UWORD                  Project1Width = 397;
UWORD                  Project1Height = 177;
UWORD                  Project2Left = 130;
UWORD                  Project2Top = 38;
UWORD                  Project2Width = 398;
UWORD                  Project2Height = 179;
UWORD                  Project3Left = 145;
UWORD                  Project3Top = 40;
UWORD                  Project3Width = 400;
UWORD                  Project3Height = 154;
UBYTE                 *Project0Wdt = (UBYTE *)"Hangman";
UBYTE                 *Project1Wdt = (UBYTE *)"Hangman Winner";
UBYTE                 *Project2Wdt = (UBYTE *)"Hangman Loser!!!";
UBYTE                 *Project3Wdt = (UBYTE *)"About Hangman";
struct TextAttr       *Font, Attr;
UWORD                  FontX, FontY;
UWORD                  OffX, OffY;
struct TextFont       *Project0Font = NULL;
struct TextFont       *Project1Font = NULL;
struct TextFont       *Project2Font = NULL;
struct TextFont       *Project3Font = NULL;

extern struct MinList Gadget133List;

struct Node Gadget133Nodes[] = {
	&Gadget133Nodes[1], ( struct Node * )&Gadget133List.mlh_Head, 0, 0, "Hangman 1997 - Steve Boxall",
	&Gadget133Nodes[2], &Gadget133Nodes[0], 0, 0, " ",
	&Gadget133Nodes[3], &Gadget133Nodes[1], 0, 0, "This is my first program purely for the Amiga.",
	&Gadget133Nodes[4], &Gadget133Nodes[2], 0, 0, " ",
	&Gadget133Nodes[5], &Gadget133Nodes[3], 0, 0, "It is written in 'C' using Gadtools & DICE 'C' ",
	&Gadget133Nodes[6], &Gadget133Nodes[4], 0, 0, " ",
	&Gadget133Nodes[7], &Gadget133Nodes[5], 0, 0, "You can guess a letter or the whole word",
	&Gadget133Nodes[8], &Gadget133Nodes[6], 0, 0, " ",
	&Gadget133Nodes[9], &Gadget133Nodes[7], 0, 0, "You may add new data files using a text editor",
	&Gadget133Nodes[10], &Gadget133Nodes[8], 0, 0, "( one word per line in UPPERCASE MAX 100 words)",
	&Gadget133Nodes[11], &Gadget133Nodes[9], 0, 0, " ",
	&Gadget133Nodes[12], &Gadget133Nodes[10], 0, 0, " ",
	&Gadget133Nodes[13], &Gadget133Nodes[11], 0, 0, "If you like it good, else why worry?",
	&Gadget133Nodes[14], &Gadget133Nodes[12], 0, 0, " ",
	( struct Node * )&Gadget133List.mlh_Tail, &Gadget133Nodes[13], 0, 0, "Hangman 1997 is FREEWARE" };

struct MinList Gadget133List = {
	( struct MinNode * )&Gadget133Nodes[0], ( struct MinNode * )NULL, ( struct MinNode * )&Gadget133Nodes[14] };

struct NewMenu Project0NewMenu[] = {
	NM_TITLE, (STRPTR)"Game", NULL, 0, NULL, NULL,
	NM_ITEM, (STRPTR)"New Game", (STRPTR)"n", 0, 0L, (APTR)Project0GameItem0,
	NM_ITEM, (STRPTR)"Load Words", (STRPTR)"l", 0, 0L, (APTR)Project0GameItem1,
	NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
	NM_ITEM, (STRPTR)"About", (STRPTR)"a", 0, 0L, (APTR)Project0GameItem2,
	NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
	NM_ITEM, (STRPTR)"Exit", (STRPTR)"e", 0, 0L, (APTR)Project0GameItem3,
	NM_END, NULL, NULL, 0, 0L, NULL };

UWORD Project0GTypes[] = {
	STRING_KIND,
	TEXT_KIND,
	TEXT_KIND,
	TEXT_KIND,
	TEXT_KIND,
	BUTTON_KIND,
	BUTTON_KIND,
	BUTTON_KIND
};

UWORD Project1GTypes[] = {
	BUTTON_KIND,
	TEXT_KIND
};

UWORD Project2GTypes[] = {
	BUTTON_KIND,
	TEXT_KIND
};

UWORD Project3GTypes[] = {
	BUTTON_KIND,
	LISTVIEW_KIND
};

struct NewGadget Project0NGad[] = {
	182, 20, 219, 23, NULL, NULL, GD_GuessIt, 0, NULL, (APTR)GuessItClicked,
	18, 24, 137, 17, NULL, NULL, GD_UserGuess, 0, NULL, NULL,
	186, 60, 215, 23, NULL, NULL, GD_GuessWord, 0, NULL, NULL,
	18, 64, 137, 17, NULL, NULL, GD_GuessText, 0, NULL, NULL,
	20, 116, 381, 53, NULL, NULL, GD_Guesses, 0, NULL, NULL,
	18, 214, 113, 17, (UBYTE *)"New Game", NULL, GD_NewGame, PLACETEXT_IN, NULL, (APTR)NewGameClicked,
	239, 214, 113, 17, (UBYTE *)"Load Words", NULL, GD_LoadWords, PLACETEXT_IN, NULL, (APTR)LoadWordsClicked,
	460, 214, 113, 17, (UBYTE *)"Exit", NULL, GD_ExitGame, PLACETEXT_IN, NULL, (APTR)ExitGameClicked
};

struct NewGadget Project1NGad[] = {
	28, 142, 341, 27, (UBYTE *)"Continue", NULL, GD_WinnerOk, PLACETEXT_IN, NULL, (APTR)WinnerOkClicked,
	136, 28, 119, 23, NULL, NULL, GD_Gadget11, 0, NULL, NULL
};

struct NewGadget Project2NGad[] = {
	26, 148, 347, 23, (UBYTE *)"Continue", NULL, GD_LostOk, PLACETEXT_IN, NULL, (APTR)LostOkClicked,
	146, 24, 103, 25, NULL, NULL, GD_Gadget12, 0, NULL, NULL
};

struct NewGadget Project3NGad[] = {
	42, 122, 315, 25, (UBYTE *)"Ok", NULL, GD_AboutOk, PLACETEXT_IN, NULL, (APTR)AboutOkClicked,
	44, 20, 313, 77, NULL, NULL, GD_Gadget13, 0, NULL, (APTR)Gadget13Clicked
};

ULONG Project0GTags[] = {
	(GTST_MaxChars), 256, (TAG_DONE),
	(GTTX_Text), (ULONG)" Your Guess", (GTTX_Border), TRUE, (TAG_DONE),
	(GTTX_Border), TRUE, (TAG_DONE),
	(GTTX_Text), (ULONG)" Word to Guess", (GTTX_Border), TRUE, (TAG_DONE),
	(GTTX_Text), (ULONG)"Guesses so far :", (GTTX_Border), TRUE, (TAG_DONE),
	(TAG_DONE),
	(TAG_DONE),
	(TAG_DONE)
};

ULONG Project1GTags[] = {
	(TAG_DONE),
	(GTTX_Text), (ULONG)"YOU ARE A WINNER!!!", (GTTX_Border), TRUE, (TAG_DONE)
};

ULONG Project2GTags[] = {
	(TAG_DONE),
	(GTTX_Text), (ULONG)"YOU HAVE LOST !!!", (GTTX_Border), TRUE, (TAG_DONE)
};

ULONG Project3GTags[] = {
	(TAG_DONE),
	(GTLV_Labels), (ULONG)&Gadget133List, (GTLV_ReadOnly), TRUE, (TAG_DONE)
};

static UWORD ComputeX( UWORD value )
{
	return(( UWORD )((( FontX * value ) + 3 ) / 6 ));
}

static UWORD ComputeY( UWORD value )
{
	return(( UWORD )((( FontY * value ) + 5 ) / 11 ));
}

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 Project0Render( void )
{
	ComputeFont( Project0Width, Project0Height );

	DrawBevelBox( Project0Wnd->RPort, OffX + ComputeX( 420 ),
					OffY + ComputeY( 20 ),
					ComputeX( 177 ),
					ComputeY( 169 ),
					GT_VisualInfo, VisualInfo, TAG_DONE );
}

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

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

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

		GT_ReplyIMsg( m );

		switch ( Project0Msg.Class ) {

			case	IDCMP_REFRESHWINDOW:
				GT_BeginRefresh( Project0Wnd );
				Project0Render();
				GT_EndRefresh( Project0Wnd, TRUE );
				break;

			case	IDCMP_CLOSEWINDOW:
				running = HangmanRequest(Project0Wnd);
				break;

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

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

int OpenProject0Window( void )
{
	struct NewGadget	ng;
	struct Gadget	*g;
	UWORD		lc, tc;
	UWORD		wleft = Project0Left, wtop = Project0Top, ww, wh;

	ComputeFont( Project0Width, Project0Height );

	ww = ComputeX( Project0Width );
	wh = ComputeY( Project0Height );

	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 ( ! ( Project0Font = OpenDiskFont( Font )))
		return( 5L );

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

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

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

		Project0Gadgets[ lc ] = g = CreateGadgetA((ULONG)Project0GTypes[ lc ], g, &ng, ( struct TagItem * )&Project0GTags[ tc ] );

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

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

	if ( ! ( Project0Menus = CreateMenus( Project0NewMenu, GTMN_FrontPen, 0L, TAG_DONE )))
		return( 3L );

	LayoutMenus( Project0Menus, VisualInfo, TAG_DONE );

	if ( ! ( Project0Wnd = OpenWindowTags( NULL,
				WA_Left,	wleft,
				WA_Top,		wtop,
				WA_Width,	ww + OffX + Scr->WBorRight,
				WA_Height,	wh + OffY + Scr->WBorBottom,
				WA_IDCMP,	STRINGIDCMP|TEXTIDCMP|BUTTONIDCMP|IDCMP_MENUPICK|IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW,
				WA_Flags,	WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_SMART_REFRESH|WFLG_ACTIVATE,
				WA_Gadgets,	Project0GList,
				WA_Title,	Project0Wdt,
				WA_ScreenTitle,	"Hangman 1997",
				WA_PubScreen,	Scr,
				TAG_DONE )))
	return( 4L );

	SetMenuStrip( Project0Wnd, Project0Menus );
	GT_RefreshWindow( Project0Wnd, NULL );

	Project0Render();

	return( 0L );
}

void CloseProject0Window( void )
{
	if ( Project0Menus      ) {
		ClearMenuStrip( Project0Wnd );
		FreeMenus( Project0Menus );
		Project0Menus = NULL;	}

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

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

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

void Project1Render( void )
{
	ComputeFont( Project1Width, Project1Height );

	DrawBevelBox( Project1Wnd->RPort, OffX + ComputeX( 24 ),
					OffY + ComputeY( 10 ),
					ComputeX( 349 ),
					ComputeY( 63 ),
					GT_VisualInfo, VisualInfo, TAG_DONE );
}

int HandleProject1IDCMP( void )
{
	struct IntuiMessage	*m;
	int			(*func)();
	int			runninga = 0;

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

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

		GT_ReplyIMsg( m );

		switch ( Project1Msg.Class ) {

			case	IDCMP_REFRESHWINDOW:
				GT_BeginRefresh( Project1Wnd );
				Project1Render();
				GT_EndRefresh( Project1Wnd, TRUE );
				break;

			case	IDCMP_CLOSEWINDOW:
				runninga = 100;
				break;

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

int OpenProject1Window( void )
{
	struct NewGadget	ng;
	struct Gadget	*g;
	UWORD		lc, tc;
	UWORD		wleft = Project1Left, wtop = Project1Top, ww, wh;

	ComputeFont( Project1Width, Project1Height );

	ww = ComputeX( Project1Width );
	wh = ComputeY( Project1Height );

	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 ( ! ( Project1Font = OpenDiskFont( Font )))
		return( 5L );

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

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

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

		Project1Gadgets[ lc ] = g = CreateGadgetA((ULONG)Project1GTypes[ lc ], g, &ng, ( struct TagItem * )&Project1GTags[ tc ] );

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

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

	if ( ! ( Project1Wnd = OpenWindowTags( NULL,
				WA_Left,	wleft,
				WA_Top,		wtop,
				WA_Width,	ww + OffX + Scr->WBorRight,
				WA_Height,	wh + OffY + Scr->WBorBottom,
				WA_IDCMP,	BUTTONIDCMP|TEXTIDCMP|IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW,
				WA_Flags,	WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_SMART_REFRESH|WFLG_ACTIVATE,
				WA_Gadgets,	Project1GList,
				WA_Title,	Project1Wdt,
				WA_ScreenTitle,	"Hangman 1997",
				WA_PubScreen,	Scr,
				TAG_DONE )))
	return( 4L );

	GT_RefreshWindow( Project1Wnd, NULL );

	Project1Render();

	return( 0L );
}

void CloseProject1Window( void )
{
	if ( Project1Wnd        ) {
		CloseWindow( Project1Wnd );
		Project1Wnd = NULL;
	}

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

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

void Project2Render( void )
{
	ComputeFont( Project2Width, Project2Height );

	DrawBevelBox( Project2Wnd->RPort, OffX + ComputeX( 20 ),
					OffY + ComputeY( 14 ),
					ComputeX( 365 ),
					ComputeY( 49 ),
					GT_VisualInfo, VisualInfo, TAG_DONE );
}

int HandleProject2IDCMP( void )
{
	struct IntuiMessage	*m;
	int			(*func)();
	int			runninga = 0;

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

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

		GT_ReplyIMsg( m );

		switch ( Project2Msg.Class ) {

			case	IDCMP_REFRESHWINDOW:
				GT_BeginRefresh( Project2Wnd );
				Project2Render();
				GT_EndRefresh( Project2Wnd, TRUE );
				break;

			case	IDCMP_CLOSEWINDOW:
				runninga = 100;
				break;

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

int OpenProject2Window( void )
{
	struct NewGadget	ng;
	struct Gadget	*g;
	UWORD		lc, tc;
	UWORD		wleft = Project2Left, wtop = Project2Top, ww, wh;

	ComputeFont( Project2Width, Project2Height );

	ww = ComputeX( Project2Width );
	wh = ComputeY( Project2Height );

	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 ( ! ( Project2Font = OpenDiskFont( Font )))
		return( 5L );

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

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

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

		Project2Gadgets[ lc ] = g = CreateGadgetA((ULONG)Project2GTypes[ lc ], g, &ng, ( struct TagItem * )&Project2GTags[ tc ] );

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

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

	if ( ! ( Project2Wnd = OpenWindowTags( NULL,
				WA_Left,	wleft,
				WA_Top,		wtop,
				WA_Width,	ww + OffX + Scr->WBorRight,
				WA_Height,	wh + OffY + Scr->WBorBottom,
				WA_IDCMP,	BUTTONIDCMP|TEXTIDCMP|IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW,
				WA_Flags,	WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_SMART_REFRESH|WFLG_ACTIVATE,
				WA_Gadgets,	Project2GList,
				WA_Title,	Project2Wdt,
				WA_ScreenTitle,	"Hangman 1997",
				WA_PubScreen,	Scr,
				TAG_DONE )))
	return( 4L );

	GT_RefreshWindow( Project2Wnd, NULL );

	Project2Render();

	return( 0L );
}

void CloseProject2Window( void )
{
	if ( Project2Wnd        ) {
		CloseWindow( Project2Wnd );
		Project2Wnd = NULL;
	}

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

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

void Project3Render( void )
{
	ComputeFont( Project3Width, Project3Height );

	DrawBevelBox( Project3Wnd->RPort, OffX + ComputeX( 16 ),
					OffY + ComputeY( 6 ),
					ComputeX( 367 ),
					ComputeY( 105 ),
					GT_VisualInfo, VisualInfo, TAG_DONE );
}

int HandleProject3IDCMP( void )
{
	struct IntuiMessage	*m;
	int			(*func)();
	int			runninga = 0;

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

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

		GT_ReplyIMsg( m );

		switch ( Project3Msg.Class ) {

			case	IDCMP_REFRESHWINDOW:
				GT_BeginRefresh( Project3Wnd );
				Project3Render();
				GT_EndRefresh( Project3Wnd, TRUE );
				break;

			case	IDCMP_CLOSEWINDOW:
				runninga = 100;
				break;

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

int OpenProject3Window( void )
{
	struct NewGadget	ng;
	struct Gadget	*g;
	UWORD		lc, tc;
	UWORD		wleft = Project3Left, wtop = Project3Top, ww, wh;

	ComputeFont( Project3Width, Project3Height );

	ww = ComputeX( Project3Width );
	wh = ComputeY( Project3Height );

	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 ( ! ( Project3Font = OpenDiskFont( Font )))
		return( 5L );

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

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

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

		Project3Gadgets[ lc ] = g = CreateGadgetA((ULONG)Project3GTypes[ lc ], g, &ng, ( struct TagItem * )&Project3GTags[ tc ] );

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

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

	if ( ! ( Project3Wnd = 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,	Project3GList,
				WA_Title,	Project3Wdt,
				WA_ScreenTitle,	"Hangman 1997",
				WA_PubScreen,	Scr,
				TAG_DONE )))
	return( 4L );

	GT_RefreshWindow( Project3Wnd, NULL );

	Project3Render();

	return( 0L );
}

void CloseProject3Window( void )
{
	if ( Project3Wnd        ) {
		CloseWindow( Project3Wnd );
		Project3Wnd = NULL;
	}

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

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

