 /*
 *  Source machine generated by GadToolsBox V1.4
 *  which is (c) Copyright 1991,92 Jaba Development
 */

#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/dos_protos.h>
#include <clib/intuition_protos.h>
#include <clib/gadtools_protos.h>
#include <clib/graphics_protos.h>
#include <clib/utility_protos.h>
#include <clib/diskfont_protos.h>

#include <ctype.h>
#include <string.h>
#include <stdlib.h>

#define CATCOMP_NUMBERS

#include "project.catalog.h"

#include "project.h"

UWORD ProjectLeft = 0;
UWORD ProjectTop = 409;
UWORD ProjectWidth = 728;
UWORD ProjectHeight = 144;

UWORD MessLeft = 0;
UWORD MessTop = 426;
UWORD MessWidth = 728;
UWORD MessHeight = 127;

struct Window	      *ParmsLineWnd = NULL;
struct Gadget	      *ParmsLineGList = NULL;
struct Gadget	      *ParmsLineGadgets[3];

struct Screen	      *Scr = NULL;
APTR		       VisualInfo = NULL;
struct Window	      *ProjectWnd = NULL;
struct Window	      *MessWnd = NULL;
struct Window	      *DirSetWnd = NULL;
struct Window	      *CompileWnd = NULL;
struct Gadget	      *ProjectGList = NULL;
struct Gadget	      *MessGList = NULL;
struct Gadget	      *DirSetGList = NULL;
struct Gadget	      *CompileGList = NULL;
struct Menu	      *ProjectMenus = NULL;
struct IntuiMessage    ProjectMsg;
struct IntuiMessage    MessMsg;
struct IntuiMessage    DirSetMsg;
struct IntuiMessage    CompileMsg;
struct TextFont       *NFont	   = NULL;
struct Gadget	      *ProjectGadgets[1];
struct Gadget	      *MessGadgets[1];
struct Gadget	      *DirSetGadgets[16];
struct Gadget	      *CompileGadgets[2];
UWORD		       DirSetZoom[4],ProjectZoom[4],MessZoom[4],ParmsLineZoom[4],CompileZoom[4];
UBYTE		      *ProjectWdt = (UBYTE *)"Project Handler : Sources Window / Project Name : No Name";
UBYTE		      *DirSetWdt = (UBYTE *)"Project Handler : Directory settings";
UBYTE		      *MessWdt = (UBYTE *)"Project Handler : Messages Window";
UBYTE		      *ParmsLineWdt = (UBYTE *)"Project Handler : Parameters Line";
UBYTE		      *CompileWdt = (UBYTE *)"Project Handler : Processing";
struct TextAttr       *Font, Attr;
UWORD		       FontX, FontY;
UWORD		       OffX, OffY;

struct NewScreen ns = { 0,0,0,0,2,0,1,0,0,NULL,
    "DICE Project Handler Screen 2.0 ©1993 by Cedric Counotte",
  };

struct TextAttr times13 = {
	( STRPTR )"times.font", 13, 0x00, 0x20 };

struct TextAttr topaz8 = {
	( STRPTR )"topaz.font", 8, 0x00, 0x20 };

struct IntuiText ProjectIText[] = {
	1, 0, JAM1,10, 9, &topaz8, (UBYTE *)"Source Object  C Module Name", NULL };

#define Project_TNUM 1

struct IntuiText CompileIText[] = {
	1, 0, JAM2,148, 14, &times13, NULL, NULL,
	2, 0, JAM1,147, 13, &times13, NULL, NULL };

#define Compile_TNUM 2

struct NewMenu ProjectNewMenu[] = {
	NM_TITLE, (STRPTR)"Project", NULL, 0, NULL, NULL,
	NM_ITEM, (STRPTR)"New", (STRPTR)"N", 0, 0L, (APTR)ProjectNew,
	NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
	NM_ITEM, (STRPTR)"Open", (STRPTR)"O", 0, 0L, (APTR)ProjectOpen,
	NM_ITEM, (STRPTR)"Save", (STRPTR)"S", 0, 0L, (APTR)ProjectSave,
	NM_ITEM, (STRPTR)"Save as", (STRPTR)"K", 0, 0L, (APTR)ProjectSaveas,
	NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
	NM_ITEM, (STRPTR)"Iconify", (STRPTR)"I", 0, 0L, (APTR)ProjectIcon,
	NM_ITEM, (STRPTR)"About...", (STRPTR)"J", 0, 0L, (APTR)ProjectAbout,
	NM_ITEM, "Help..." , (STRPTR)"H" , 0 , 0L , (APTR)ProjectHelp,
	NM_ITEM, (STRPTR)"Quit", (STRPTR)"Q", 0, 0L, (APTR)ProjectQuit,
	NM_TITLE, (STRPTR)"Objects", NULL, 0, NULL, NULL,
	NM_ITEM, (STRPTR)"Edit", (STRPTR)"E", 0, 0L, (APTR)ProjectEdit,
	NM_ITEM, (STRPTR)"Include Files", (STRPTR)"F", 0, 0L, (APTR)ProjectInclude,
	NM_ITEM, (STRPTR)"Comments", NULL , 0 , 0L , NULL,
	NM_SUB , (STRPTR)"Edit",(STRPTR)"+" , 0 , 0L , (APTR)ProjectComment,
	NM_SUB , (STRPTR)"Remove",(STRPTR)"-" , 0 , 0L , (APTR)ProjectCommentKill,
	NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
	NM_ITEM, (STRPTR)"Add", (STRPTR)"A", 0, 0L, (APTR)ProjectAdd,
	NM_ITEM, (STRPTR)"Remove", (STRPTR)"R", 0, 0L, (APTR)ProjectRem,
	NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
	NM_ITEM, (STRPTR)"Open Extern", (STRPTR)"X", 0, 0L, (APTR)ProjectOther,
	NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
	NM_ITEM, "Open Autodocs" , "D" , 0 , 0L , (APTR)ProjectAutoDocs,
	NM_TITLE, (STRPTR)"Code", NULL, 0, NULL, NULL,
	NM_ITEM, "Make Final Object" , (STRPTR)"M" , 0 , 0L , (APTR)ProjectMakeFO,
	NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
	NM_ITEM, (STRPTR)"Compile", (STRPTR)"C", 0, 0L, (APTR)ProjectCompile,
	NM_ITEM, (STRPTR)"Compile all", (STRPTR)"G", 0, 0L, (APTR)ProjectGenerate,
	NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
	NM_ITEM, (STRPTR)"Launch" , NULL , 0 , 0L , NULL ,
	NM_SUB ,(STRPTR)"From CLI" , (STRPTR)"T" , 0 , 0L , (APTR)ProjectLaunch,
	NM_SUB , (STRPTR)"Parameters Line" , (STRPTR)"L" , 0 , 0L , (APTR)ProjectLaunchOpt,
	NM_ITEM, (STRPTR)"Information", (STRPTR)"Y", 0, 0L, (APTR)ProjectCodeInfo,
	NM_TITLE, (STRPTR)"Preferences", NULL, 0, NULL, NULL,
	NM_ITEM, "Main Options", "1", 0, 0L, (APTR)ProjectMainOpt,
	NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
	NM_ITEM, (STRPTR)"Compiler", "2", 0, 0L, (APTR)ProjectCompilerOpt,
	NM_ITEM, (STRPTR)"Linker" , "3" , 0 , 0L , (APTR)ProjectLinkerOpt,
	NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
	NM_ITEM, (STRPTR)"Directories", "4", 0, 0L, (APTR)ProjectDirectory,
	NM_ITEM, (STRPTR)"Editor" , "5" , 0 , 0L , (APTR)ProjectEditorOpt,
	NM_ITEM, (STRPTR)"Screen", "6", 0, 0L, (APTR)ProjectScreenOpt,
	NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
	NM_ITEM, (STRPTR)"Close Workbench", "W" , NULL ,0,(APTR)ProjectCloseWB,
	NM_ITEM,(STRPTR)"Open Workbench" , "Z" , NULL , 0 , (APTR)ProjectOpenWB,
	NM_ITEM, (STRPTR)"Save Preferences" , "V",0,0L,(APTR)SavePrefs,
	NM_END, NULL, NULL, 0, 0L, NULL };

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

struct NewGadget ParmsLineNGad[] = {
	33, 29, 101, 18, NULL, NULL, 1, PLACETEXT_IN, NULL, (APTR)NULL,
	222, 29, 101, 18, NULL, NULL, 2, PLACETEXT_IN, NULL, (APTR)NULL,
	8, 6, 346, 17, NULL, NULL, 3, PLACETEXT_ABOVE, NULL, (APTR)NULL
};

ULONG ParmsLineGTags[] = {
	(GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (GTST_MaxChars), 256, (TAG_DONE)
};

UWORD ProjectGTypes[] = {
	LISTVIEW_KIND
};

UWORD MessGTypes[] = {
	LISTVIEW_KIND
};

UWORD DirSetGTypes[] = {
	BUTTON_KIND, BUTTON_KIND, BUTTON_KIND, BUTTON_KIND, BUTTON_KIND, BUTTON_KIND,
	TEXT_KIND, TEXT_KIND, TEXT_KIND, TEXT_KIND, TEXT_KIND TEXT_KIND,
	BUTTON_KIND,TEXT_KIND
	BUTTON_KIND, BUTTON_KIND,
};

UWORD CompileGTypes[] = {
	TEXT_KIND, BUTTON_KIND
};

struct NewGadget ProjectNGad[] = {
	3, 15, -6, -25, NULL, NULL, GD_ModuleList, 0, NULL, (APTR)ModuleListClicked
};

struct NewGadget MessNGad[] = {
	3, 3, -6, -14, NULL, NULL, GD_ModuleList, 0, NULL, (APTR)MessListClicked
};

struct NewGadget DirSetNGad[] = {
	5, 4, 101, 15, (UBYTE *)"_Sources", NULL, GD_Source, PLACETEXT_IN, NULL, (APTR)SourceClicked,
	5, 26, 101, 15, (UBYTE *)"Des_tination", NULL, GD_Dest, PLACETEXT_IN, NULL, (APTR)DestClicked,
	5, 48, 101, 15, (UBYTE *)"_Includes", NULL, GD_Include, PLACETEXT_IN, NULL, (APTR)IncludeClicked,
	5, 70, 101, 15, (UBYTE *)"_Libraries", NULL, GD_Lib, PLACETEXT_IN, NULL, (APTR)LibClicked,
	5, 92, 101, 15, (UBYTE *)"_Objects", NULL, GD_Obj, PLACETEXT_IN, NULL, (APTR)ObjClicked,
	5, 114, 101, 15, (UBYTE *)"_DICE", NULL, GD_Prg, PLACETEXT_IN, NULL, (APTR)PrgClicked,
	113, 4, 206, 15, NULL, NULL, GD_SourceString, 0, NULL, NULL,
	113, 26, 206, 15, NULL, NULL, GD_DestString, 0, NULL, NULL,
	113, 48, 206, 15, NULL, NULL, GD_IncludeString, 0, NULL, NULL,
	113, 70, 206, 15, NULL, NULL, GD_LibString, 0, NULL, NULL,
	113, 92, 206, 15, NULL, NULL, GD_ObjString, 0, NULL, NULL,
	113, 114, 206, 15, NULL, NULL, GD_PrgString, 0, NULL, NULL,
	5, 136, 101, 15, (UBYTE *)"Auto_docs", NULL, GD_Prg, PLACETEXT_IN, NULL, (APTR)AutoDocClicked,
	113, 136, 206, 15, NULL, NULL, GD_PrgString+1, 0, NULL, NULL,
	30, 158 , 100 , 15 , NULL , NULL , 50 , PLACETEXT_IN , NULL , DirSetUseClicked,
	189 , 158 , 100 , 15 , NULL , NULL , 50 , PLACETEXT_IN , NULL , DirSetCancelClicked,
};

struct NewGadget CompileNGad[] = {
	5, 19, 284, 12, NULL, NULL, GD_CompileName, 0, NULL, NULL,
};

ULONG ProjectGTags[] = {
	(GTLV_ShowSelected), NULL, (TAG_DONE)
};

ULONG MessGTags[] = {
	(TAG_DONE)
};

ULONG DirSetGTags[] = {
	(GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE),
	(GTTX_Border), TRUE, (TAG_DONE),
	(GTTX_Border), TRUE, (TAG_DONE),
	(GTTX_Border), TRUE, (TAG_DONE),
	(GTTX_Border), TRUE, (TAG_DONE),
	(GTTX_Border), TRUE, (TAG_DONE),
	(GTTX_Border), TRUE, (TAG_DONE),
	(GA_Disabled) , FALSE , (GT_Underscore), '_', (TAG_DONE),
	(GA_Disabled) , FALSE , (GTTX_Border), TRUE, (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE),
};

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

struct ColorSpec ScreenColors[] = {
	 0, 0x0C, 0x0B, 0x09,
	 1, 0x00, 0x00, 0x00,
	 2, 0x0F, 0x0F, 0x0F,
	 3, 0x08, 0x06, 0x05,
	 4, 0x00, 0x00, 0x0F,
	 5, 0x0F, 0x00, 0x00,
	 6, 0x00, 0x0F, 0x00,
	 7, 0x0F, 0x0F, 0x00,
	 8, 0x06, 0x02, 0x00,
	 9, 0x0A, 0x06, 0x04,
	10, 0x0E, 0x0A, 0x08,
	11, 0x00, 0x0A, 0x00,
	12, 0x08, 0x0F, 0x0A,
	13, 0x08, 0x08, 0x08,
	14, 0x06, 0x06, 0x06,
	15, 0x0C, 0x0C, 0x0C,
	~0, 0x00, 0x00, 0x00 };

UWORD DriPens[] = {
	0,1,1,2,1,3,1,0,2,~0 };

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

UWORD ComputeY( UWORD value )
{
	return(( UWORD )((( FontY * value ) + 6 ) / 13 ));
}

UWORD IComputeX( UWORD value )
{
	return(( UWORD )((( 7 * value ) - 3 ) / FontX ));
}

UWORD IComputeY( UWORD value )
{
	return(( UWORD )((( 13 * value ) - 6 ) / FontY ));
}

void ComputeFont( UWORD width, UWORD height )
{
	Font = &Attr;
	Font->ta_Name = (STRPTR)Scr->RastPort.Font->tf_Message.mn_Node.ln_Name;
	Font->ta_YSize = FontY = Scr->RastPort.Font->tf_YSize;
	FontX = Scr->RastPort.Font->tf_XSize;

	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;
}

char PubName[20] = "DICE_Project";

BOOL Owner;

int SetupScreen( void )
{
  LONG PubNum = 9;
  char *temp,*temp2;
  struct TagItem *ti;

    if ( Scr )
	return(0);
    if ( ti = FindTagItem( SA_Pens , ScreenTags ) )
	if ( ((UWORD *)ti->ti_Data)[0]!=~0 )
	{
	    ns.DetailPen = ((UWORD *)ti->ti_Data)[0];
	    ns.BlockPen = ((UWORD *)ti->ti_Data)[1];
	}
	else
	{
	    ns.DetailPen = 0;
	    ns.BlockPen = 1;
	}
    ti = FindTagItem( SA_PubName , ScreenTags );
    Owner = FALSE;
    if ( ti )
    {
	temp2 = (char *)ti->ti_Data;
	temp = malloc( strlen( temp2 ) + 3 );
	strcpy( temp , temp2 );
	strcat( temp , ".0" );
	while ( !( Scr = OpenScreenTagList( &ns , ScreenTags ) ) && PubNum-- )
	{
	    ti->ti_Data = temp;
	    temp[ strlen(temp) - 1 ] ++;
	}
	if ( (char *)(ti->ti_Data) == temp )
	    free( temp2 );
	if ( !Scr )
	    Message( StrMessages[MSG_MESSAGE_CANT_OPEN_PUBSCR] , StrMessages[MSG_MESSAGE_ABORT] );
	Owner = TRUE;
    } else
	if ( !(Scr = LockPubScreen( NULL ) ) )
	    Message( StrMessages[MSG_MESSAGE_WHERE_WB] , StrMessages[MSG_MESSAGE_ABORT] );
    if ( Scr )
    {
	ti = FindTagItem( SA_Font , ScreenTags );
	if ( ti )
	    NFont = OpenDiskFont( (struct TextAttr *)ti->ti_Data );
	else
	    NFont = OpenDiskFont( &times13 );
	VisualInfo = GetVisualInfoA( Scr , NULL );
	ComputeFont( 0, 0 );
	if ( !(Scr->Flags&WBENCHSCREEN) )
	    PubScreenStatus( Scr , ~PSNF_PRIVATE );
	SetPubScreenModes( SHANGHAI|POPPUBSCREEN );
	return( 0L );
    }
    return( 1L );
}

int CloseDownScreen( void )
{
  BOOL succ=NULL,retry=TRUE;

    if ( Owner )
    {
	while ( !(succ = CloseScreen( Scr )) && retry )
	{
	    ActivateWindow( Scr->FirstWindow );
	    retry =  Message( StrMessages[MSG_MESSAGE_CANT_CLOSESCR] , StrMessages[MSG_MESSAGE_RETRY_ABORT] );
	}
	if ( succ )
	    Scr = NULL;
	else
	    return(0);
    }
    else
    {
	UnlockPubScreen( NULL , Scr );
	Scr = NULL;
    }
    if ( VisualInfo ) {
	FreeVisualInfo( VisualInfo );
	VisualInfo = NULL;
    }
    if ( NFont ) {
	CloseFont( NFont );
	NFont = NULL;
    }
}

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

	for ( cnt = 0; cnt < Project_TNUM; cnt++ ) {
		CopyMem(( char * )&ProjectIText[ cnt ], ( char * )&it, (long)sizeof( struct IntuiText ));
		it.ITextFont = &topaz8;
		it.TopEdge   = OffY + ComputeY( it.TopEdge ) - ( Font->ta_YSize >> 1 );
		PrintIText( ProjectWnd->RPort, &it, 0, 0 );
	}
}

BOOL Changed;

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

	Changed = FALSE;
	while( !Changed && (m = GT_GetIMsg( ProjectWnd->UserPort )) ) {

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

		GT_ReplyIMsg( m );

		switch ( ProjectMsg.Class ) {

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

			case	IDCMP_CLOSEWINDOW:
				return( ProjectCloseWindow() );
				break;

			case	IDCMP_NEWSIZE:
				running = ProjectNewSize();
				return( running );
				break;

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

			case	IDCMP_MENUPICK:
				while( ProjectMsg.Code != MENUNULL ) {
					n = ItemAddress( ProjectMenus, ProjectMsg.Code );
					func = (void *)(GTMENUITEM_USERDATA( n ));
					running = func();
					if ( Changed )
					    return;
					ProjectMsg.Code = n->NextSelect;
				}
				break;
			case	IDCMP_VANILLAKEY:
				switch( ProjectMsg.Code ) {
				  case 27:
				    running = MessCloseWindow();
				    break;
				  case 13:
				    ProjectEdit( );
				    break;
				  default:
				    ProjectMsg.Code = tolower( ProjectMsg.Code );
				    if ( isalpha(ProjectMsg.Code) ) {
					FindSelectedModule( ProjectMsg.Code );
				    }
				    break;
				}
				break;
			case	IDCMP_RAWKEY:
				switch( ProjectMsg.Code ) {
				  case CURSORUP:
				    if ( ProjectMsg.Qualifier & (IEQUALIFIER_LSHIFT|IEQUALIFIER_RSHIFT) )
					PrevMessage( );
				    else
					PrevModule( );
				    break;
				  case CURSORDOWN:
				    if ( ProjectMsg.Qualifier & (IEQUALIFIER_LSHIFT|IEQUALIFIER_RSHIFT) )
					NextMessage( );
				    else
					NextModule( );
				    break;
				  case 95:
				    ChargeAide( "WIN_Sources" );
				    break;
				}
		}
	}
	return( running );
}

int OpenProjectWindow( void )
{
	struct NewGadget	ng;
	struct Gadget	*g;
	UWORD		lc, tc;
	UWORD		wleft = ProjectLeft, wtop = ProjectTop, ww, wh;

	ww = ComputeX( ProjectWidth );
	wh = ComputeY( ProjectHeight );

	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 (( wleft + ww ) > Scr->Width ) ww = Scr->Width - OffX - Scr->WBorRight;
	if (( wtop + wh ) > Scr->Height ) wh = Scr->Height - OffY - Scr->WBorBottom ;

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

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

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

		ng.ng_VisualInfo = VisualInfo;
		ng.ng_TextAttr	 = &topaz8;
		ng.ng_LeftEdge = OffX + ComputeX( ng.ng_LeftEdge );
		ng.ng_TopEdge = OffY + ComputeY( ng.ng_TopEdge );
		ng.ng_Width = IComputeX( ww ) + ng.ng_Width;
		ng.ng_Height = IComputeY( wh ) + ng.ng_Height;
		ng.ng_Width = ComputeX( ng.ng_Width );
		ng.ng_Height = ComputeY( ng.ng_Height);

		ProjectGadgets[ lc ] = g = CreateGadgetA((ULONG)ProjectGTypes[ lc ], g, &ng, ( struct TagItem * )&ProjectGTags[ tc ] );

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

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

	if ( ! ( ProjectMenus = CreateMenusA( ProjectNewMenu, 0L )))
		return( 3L );

	LayoutMenus( ProjectMenus, VisualInfo, TAG_DONE );


	ProjectZoom[0] = ProjectLeft;
	ProjectZoom[1] = ProjectTop;
	ProjectZoom[2] = TextLength( &Scr->RastPort, (UBYTE *)ProjectWdt, strlen((char *)ProjectWdt )) + 80;
	ProjectZoom[3] = Scr->WBorTop + Scr->RastPort.TxHeight + 1;

	if ( ! ( ProjectWnd = OpenWindowTags( NULL,
				WA_Left,	wleft,
				WA_Top, 	wtop,
				WA_Width,	ww + OffX + Scr->WBorRight,
				WA_Height,	wh + OffY + Scr->WBorBottom,
				WA_IDCMP,	IDCMP_NEWSIZE|LISTVIEWIDCMP|IDCMP_MENUPICK|IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW|IDCMP_VANILLAKEY|IDCMP_RAWKEY,
				WA_Flags,	WFLG_SIZEGADGET|WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_SIZEBBOTTOM|WFLG_SMART_REFRESH,
				WA_Gadgets,	ProjectGList,
				WA_Title,	ProjectWdt,
				WA_PubScreen,	Scr,
				WA_Activate ,	TRUE,
				WA_MinWidth,	360,
				WA_MinHeight,	100,
				WA_MaxWidth,	~0,
				WA_MaxHeight,	~0,
				WA_Zoom , ProjectZoom,
				TAG_DONE )))
	return( 4L );

	SetMenuStrip( ProjectWnd, ProjectMenus );
	GT_RefreshWindow( ProjectWnd, NULL );

	ProjectRender();

	return( 0L );
}

void CloseProjectWindow( void )
{
	ProjectTop = ProjectWnd->TopEdge;
	ProjectLeft = ProjectWnd->LeftEdge;

	ProjectWidth = IComputeX( ProjectWnd->Width - OffX - Scr->WBorRight + 1 );
	ProjectHeight = IComputeY( ProjectWnd->Height - OffY - Scr->WBorBottom + 1 );

	Changed = TRUE;

	if ( ProjectMenus      ) {
		ClearMenuStrip( ProjectWnd );
		FreeMenus( ProjectMenus );
		ProjectMenus = NULL;	}

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

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

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

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

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

		GT_ReplyIMsg( m );

		switch ( MessMsg.Class ) {

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

			case	IDCMP_VANILLAKEY:
				switch( MessMsg.Code ) {
				  case 27:
				    running = MessCloseWindow();
				    return( running );
				    break;
				  case 13:
				    ProjectEdit( );
				    break;
				}
				break;
			case	IDCMP_RAWKEY:
				switch( MessMsg.Code ) {
				  case CURSORUP:
				    if ( MessMsg.Qualifier & (IEQUALIFIER_LSHIFT|IEQUALIFIER_RSHIFT) )
					PrevMessage( );
				    else
					PrevModule( );
				    break;
				  case CURSORDOWN:
				    if ( MessMsg.Qualifier & (IEQUALIFIER_LSHIFT|IEQUALIFIER_RSHIFT) )
					NextMessage( );
				    else
					NextModule( );
				    break;
				  case 95:
				    ChargeAide( "WIN_Messages" );
				}
				break;
			case	IDCMP_CLOSEWINDOW:
				running = MessCloseWindow();
				return( running );
				break;

			case	IDCMP_NEWSIZE:
				running = MessNewSize();
				return(0);
				break;

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

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

int OpenMessWindow( void )
{
	struct NewGadget	ng;
	struct Gadget	*g;
	UWORD		lc, tc;
	UWORD		wleft = MessLeft, wtop = MessTop, ww, wh;

	ww = ComputeX( MessWidth );
	wh = ComputeY( MessHeight );

	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( &MessGList )))
		return( 1L );

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

		CopyMem((char * )&MessNGad[ 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( MessWidth + ng.ng_Width );
		ng.ng_Height	 = ComputeY( MessHeight + ng.ng_Height);

		MessGadgets[ lc ] = g = CreateGadgetA((ULONG)MessGTypes[ lc ], g, &ng, ( struct TagItem * )&MessGTags[ tc ] );

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

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


	MessZoom[0] = MessLeft;
	MessZoom[1] = MessTop;
	MessZoom[2] = TextLength( &Scr->RastPort, (UBYTE *)MessWdt, strlen((char *)MessWdt )) + 80;
	MessZoom[3] = Scr->WBorTop + Scr->RastPort.TxHeight + 1;

	if ( ! ( MessWnd = OpenWindowTags( NULL,
				WA_Left,	wleft,
				WA_Top, 	wtop,
				WA_Width,	ww + OffX + Scr->WBorRight,
				WA_Height,	wh + OffY + Scr->WBorBottom,
				WA_IDCMP,	IDCMP_NEWSIZE|LISTVIEWIDCMP|IDCMP_MENUPICK|IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW|IDCMP_VANILLAKEY|IDCMP_RAWKEY,
				WA_Flags,	WFLG_SIZEGADGET|WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_SIZEBBOTTOM|WFLG_SMART_REFRESH,
				WA_Gadgets,	MessGList,
				WA_Title,	MessWdt,
				WA_PubScreen,	     Scr,
				WA_MinWidth,	360,
				WA_MinHeight,	70,
				WA_MaxWidth,	~0,
				WA_MaxHeight,	~0,
				WA_Zoom,	MessZoom,
				TAG_DONE )))
	return( 4L );

	if ( ROMVersion >= 39 )
	    LendMenus( MessWnd , ProjectWnd );
	else
	    SetMenuStrip( MessWnd, ProjectMenus );
	GT_RefreshWindow( MessWnd, NULL );

	return( 0L );
}

void CloseMessWindow( void )
{
	MessTop = MessWnd->TopEdge;
	MessLeft = MessWnd->LeftEdge;

	MessWidth = IComputeX( MessWnd->Width - OffX - Scr->WBorRight + 1 );
	MessHeight = IComputeY( MessWnd->Height - OffY - Scr->WBorBottom + 1);

	if ( ProjectMenus      )
		ClearMenuStrip( MessWnd );

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

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

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

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

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

		GT_ReplyIMsg( m );

		switch ( DirSetMsg.Class ) {

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

			case	IDCMP_VANILLAKEY:
				switch( DirSetMsg.Code )  {
				  case 's':
				  case 'S':
				    running = SourceClicked( );
				    break;
				  case 't':
				  case 'T':
				    running = DestClicked( );
				    break;
				  case 'i':
				  case 'I':
				    running = IncludeClicked( );
				    break;
				  case 'l':
				  case 'L':
				    running = LibClicked( );
				    break;
				  case 'o':
				  case 'O':
				    running = ObjClicked( );
				    break;
				  case 'd':
				  case 'D':
				    running = PrgClicked( );
				    break;
				  case 'u':
				  case 'U':
				    running = DirSetUseClicked( );
				    break;
				  case 'A':
				  case 'a':
				    running = DirSetCancelClicked( );
				    break;
				  case 'c':
				  case 'C':
				    running = AutoDocClicked( );
				}
				break;

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

				break;
			case	IDCMP_RAWKEY:
				if ( DirSetMsg.Code == 95 )
				    ChargeAide( "WIN_Dir" );
				break;
		}
	}
	return( running );
}

int OpenDirSetWindow( void )
{
	struct NewGadget	ng;
	struct Gadget	*g;
	UWORD		lc, tc;
	UWORD		wleft = 182, wtop = 200, ww, wh;

	ComputeFont( 325, 179 );

	ww = ComputeX( 325 );
	wh = ComputeY( 179 );

	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( &DirSetGList )))
		return( 1L );

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

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

		DirSetGadgets[ lc ] = g = CreateGadgetA((ULONG)DirSetGTypes[ lc ], g, &ng, ( struct TagItem * )&DirSetGTags[ tc ] );

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

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


	DirSetZoom[0] = 182;
	DirSetZoom[1] = 200;
	DirSetZoom[2] = TextLength( &Scr->RastPort, (UBYTE *)DirSetWdt, strlen((char *)DirSetWdt )) + 80;
	DirSetZoom[3] = Scr->WBorTop + Scr->RastPort.TxHeight + 1;

	if ( ! ( DirSetWnd = OpenWindowTags( NULL,
				WA_Left,	wleft,
				WA_Top, 	wtop,
				WA_Width,	ww + OffX + Scr->WBorRight,
				WA_Height,	wh + OffY + Scr->WBorBottom,
				WA_IDCMP,	IDCMP_VANILLAKEY|BUTTONIDCMP|TEXTIDCMP|IDCMP_REFRESHWINDOW|IDCMP_RAWKEY,
				WA_Flags,	WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_SMART_REFRESH,
				WA_Gadgets,	DirSetGList,
				WA_Title,	DirSetWdt,
				WA_Activate ,	TRUE,
				WA_PubScreen,	Scr,
				WA_Zoom,	DirSetZoom,
				TAG_DONE )))
	return( 4L );

	if ( ROMVersion > 38 )
	    LendMenus( DirSetWnd , ProjectWnd );

	GT_RefreshWindow( DirSetWnd, NULL );

	return( 0L );
}

void CloseDirSetWindow( void )
{
	if ( DirSetWnd        ) {
		CloseWindow( DirSetWnd );
		DirSetWnd = NULL;
	}

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

void CompileRender( char *title )
{
	struct IntuiText	it;
	UWORD			cnt;

	SetAPen( CompileWnd->RPort , 0 );
	RectFill( CompileWnd->RPort , OffX , OffY , ComputeX( 288 ) , ComputeY(Font->ta_YSize + 14) );
	for ( cnt = 0; cnt < Compile_TNUM; cnt++ ) {
		CopyMem(( char * )&CompileIText[ cnt ], ( char * )&it, (long)sizeof( struct IntuiText ));
		it.IText = title;
		it.ITextFont = &topaz8;
		it.LeftEdge  = OffX + ComputeX( it.LeftEdge ) - ( IntuiTextLength( &it ) >> 1 );
		it.TopEdge   = OffY + ComputeY( it.TopEdge ) - ( Font->ta_YSize >> 1 );
		PrintIText( CompileWnd->RPort, &it, 0, 0 );
	}
}

int OpenCompileWindow( char *title )
{
	struct NewGadget	ng;
	struct Gadget	*g;
	UWORD		lc, tc;
	UWORD		wleft = ProjectWnd->LeftEdge + (ProjectWnd->Width>>1) - 146, wtop = ProjectWnd->TopEdge + (ProjectWnd->Height>>1) - 22, ww, wh;

	ww = ComputeX( 293 );
	wh = ComputeY( 44 );

	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( &CompileGList )))
		return( 1L );

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

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

		ng.ng_VisualInfo = VisualInfo;
		ng.ng_TextAttr	 = &topaz8;
		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);

		CompileGadgets[ lc ] = g = CreateGadgetA((ULONG)CompileGTypes[ lc ], g, &ng, ( struct TagItem * )&CompileGTags[ tc ] );

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

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

	CompileZoom[0] = 0;
	CompileZoom[1] = 0;
	CompileZoom[2] = 80;
	CompileZoom[3] = Scr->WBorTop + Scr->RastPort.TxHeight + 1;

	if ( ! ( CompileWnd = OpenWindowTags( NULL,
				WA_Left,	wleft,
				WA_Top, 	wtop,
				WA_Width,	ww + OffX + Scr->WBorRight,
				WA_Height,	wh + OffY + Scr->WBorBottom,
				WA_IDCMP,	IDCMP_CLOSEWINDOW|TEXTIDCMP|BUTTONIDCMP|IDCMP_REFRESHWINDOW,
				WA_Flags,	WFLG_CLOSEGADGET|WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_SMART_REFRESH|WFLG_RMBTRAP,
				WA_Gadgets,	CompileGList,
				WA_Zoom,	CompileZoom,
				WA_Title,	CompileWdt,
				WA_PubScreen,	     Scr,
				TAG_DONE )))
	return( 4L );

	GT_RefreshWindow( CompileWnd, NULL );

	CompileRender( title );
	return( 0L );
}

void CloseCompileWindow( void )
{
	if ( CompileWnd        ) {
		CloseWindow( CompileWnd );
		CompileWnd = NULL;
	}

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

int OpenParmsLineWindow( void )
{
	struct NewGadget	ng;
	struct Gadget	*g;
	UWORD		lc, tc;
	UWORD		wleft = 188, wtop = 258, ww, wh;

	ComputeFont( 358, 50 );

	ww = ComputeX( 358 );
	wh = ComputeY( 50 );

	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( &ParmsLineGList )))
		return( 1L );

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

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

		ParmsLineGadgets[ lc ] = g = CreateGadgetA((ULONG)ParmsLineGTypes[ lc ], g, &ng, ( struct TagItem * )&ParmsLineGTags[ tc ] );

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

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

	ParmsLineZoom[0] = 188;
	ParmsLineZoom[1] = 258;
	ParmsLineZoom[2] = TextLength( &Scr->RastPort, (UBYTE *)ParmsLineWdt, strlen((char *)ParmsLineWdt )) + 80;
	ParmsLineZoom[3] = Scr->WBorTop + Scr->RastPort.TxHeight + 1;

	if ( ! ( ParmsLineWnd = OpenWindowTags( NULL,
				WA_Left,	wleft,
				WA_Top, 	wtop,
				WA_Width,	ww + OffX + Scr->WBorRight,
				WA_Height,	wh + OffY + Scr->WBorBottom,
				WA_IDCMP,	IDCMP_VANILLAKEY|BUTTONIDCMP|STRINGIDCMP|IDCMP_REFRESHWINDOW|IDCMP_RAWKEY,
				WA_Flags,	WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_SMART_REFRESH,
				WA_Gadgets,	ParmsLineGList,
				WA_Title, ParmsLineWdt,
				WA_Zoom,ParmsLineZoom,
				WA_Activate ,	TRUE,
				WA_PubScreen,	Scr,
				TAG_DONE )))
	return( 4L );

	GT_RefreshWindow( ParmsLineWnd, NULL );

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

	return( 0L );
}

void CloseParmsLineWindow( void )
{
	if ( ParmsLineWnd        ) {
		CloseWindow( ParmsLineWnd );
		ParmsLineWnd = NULL;
	}

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

