/* $Revision Header *** Header built automatically - do not edit! ***********
 *
 *	(C) Copyright 1991 by Torsten Jürgeleit
 *
 *	Name .....: source.c
 *	Created ..: Sunday 22-Dec-91 21:35:45
 *	Revision .: 0
 *
 *	Date        Author                 Comment
 *	=========   ====================   ====================
 *	02-Oct-92   Michael Bjerking       New realese, better Screen/Window editor
 *	22-Dec-91   Torsten Jürgeleit      Created this file!
 *
 ****************************************************************************
 *
 *	C source code generator
 *
 * $Revision Header ********************************************************/

 /* Includes */

#include "includes.h"
#include "defines.h"
#include "imports.h"
#include "protos.h"

 /* Defines */

#define GADGET_TEXT	(gads ? gad_y : gad_n)
#define GADGET_ALL(x) (((x) & GADGET_IDCMP_FLAGS_ALL) && (IDCMPflags & GADGET_IDCMP_FLAGS_ALL))

 /* Defines for source title */

#define SOURCE_TITLE_LEFT_EDGE	0
#define SOURCE_TITLE_TOP_EDGE	5
#define SOURCE_TITLE_TYPE	TEXT_DATA_TYPE_TEXT
#define SOURCE_TITLE_FLAGS	(TEXT_DATA_FLAG_CENTER | TEXT_DATA_FLAG_BOLD)
#define SOURCE_TITLE_TEXT	"Save C source code of project"
#define SOURCE_TITLE_TEXT_ATTR	&topaz80_attr

 /* Defines for source gadgets */

#define SOURCE_SELECTION_OK	1

#define SOURCE_GADGET_OK	0
#define SOURCE_GADGET_CANCEL	1
#define SOURCE_GADGET_ID	2
#define SOURCE_GADGET_STATIC	3
#define SOURCE_GADGET_INNER	4
#define SOURCE_GADGET_WINDOW	5
#define SOURCE_GADGET_PROGRAM	6

#define SOURCE_GADGET1_TYPE		GADGET_DATA_TYPE_BUTTON
#define SOURCE_GADGET1_FLAGS		GADGET_DATA_FLAG_HOTKEY
#define SOURCE_GADGET1_TEXT		"_Ok"
#define SOURCE_GADGET1_LEFT_EDGE	((EDITOR_WINDOW_WIDTH / 2 - SOURCE_GADGET1_WIDTH) / 2)
#define SOURCE_GADGET1_TOP_EDGE		(EDITOR_WINDOW_HEIGHT - SOURCE_GADGET1_HEIGHT - 5)
#define SOURCE_GADGET1_WIDTH		((6 + 2) * 8)
#define SOURCE_GADGET1_HEIGHT		15
#define SOURCE_GADGET1_TEXT_ATTR	&topaz80_attr

#define SOURCE_GADGET2_TYPE		GADGET_DATA_TYPE_BUTTON
#define SOURCE_GADGET2_FLAGS		GADGET_DATA_FLAG_HOTKEY
#define SOURCE_GADGET2_TEXT		"_Cancel"
#define SOURCE_GADGET2_LEFT_EDGE	(EDITOR_WINDOW_WIDTH / 2 + (EDITOR_WINDOW_WIDTH / 2 - SOURCE_GADGET1_WIDTH) / 2)
#define SOURCE_GADGET2_TOP_EDGE		(EDITOR_WINDOW_HEIGHT - SOURCE_GADGET1_HEIGHT - 5)
#define SOURCE_GADGET2_WIDTH		SOURCE_GADGET1_WIDTH
#define SOURCE_GADGET2_HEIGHT		SOURCE_GADGET1_HEIGHT
#define SOURCE_GADGET2_TEXT_ATTR	&topaz80_attr

#define SOURCE_GADGET3_TYPE		GADGET_DATA_TYPE_STRING
#define SOURCE_GADGET3_FLAGS		(GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_TEXT_LEFT)
#define SOURCE_GADGET3_LEFT_EDGE	(110 + (10 + 1) * 8)
#define SOURCE_GADGET3_TOP_EDGE		22
#define SOURCE_GADGET3_WIDTH		76
#define SOURCE_GADGET3_HEIGHT		12
#define SOURCE_GADGET3_TEXT		"Project I_D"
#define SOURCE_GADGET3_TEXT_ATTR	&topaz80_attr
#define SOURCE_GADGET3_INPUT_LEN	MAX_PROJECT_ID_LEN
#define SOURCE_GADGET3_INPUT_ACTIVATE	0
#define SOURCE_GADGET3_INPUT_DEFAULT	NULL

#define SOURCE_GADGET4_TYPE		GADGET_DATA_TYPE_CHECK
#define SOURCE_GADGET4_FLAGS		(GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_TEXT_RIGHT)
#define SOURCE_GADGET4_TEXT		"_Static data"
#define SOURCE_GADGET4_LEFT_EDGE	(SOURCE_GADGET3_LEFT_EDGE + SOURCE_GADGET3_WIDTH + 50)
#define SOURCE_GADGET4_TOP_EDGE		(SOURCE_GADGET3_TOP_EDGE + 1)
#define SOURCE_GADGET4_WIDTH		0
#define SOURCE_GADGET4_HEIGHT		0
#define SOURCE_GADGET4_TEXT_ATTR	&topaz80_attr

#define SOURCE_GADGET5_TYPE		GADGET_DATA_TYPE_CHECK
#define SOURCE_GADGET5_FLAGS		(GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_TEXT_RIGHT)
#define SOURCE_GADGET5_TEXT		"_Inner window"
#define SOURCE_GADGET5_LEFT_EDGE	SOURCE_GADGET4_LEFT_EDGE
#define SOURCE_GADGET5_TOP_EDGE		(SOURCE_GADGET4_TOP_EDGE + 16)
#define SOURCE_GADGET5_WIDTH		0
#define SOURCE_GADGET5_HEIGHT		0
#define SOURCE_GADGET5_TEXT_ATTR	&topaz80_attr

#define SOURCE_GADGET6_TYPE		GADGET_DATA_TYPE_CHECK
#define SOURCE_GADGET6_FLAGS		(GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_TEXT_RIGHT)
#define SOURCE_GADGET6_TEXT		"_Window"
#define SOURCE_GADGET6_LEFT_EDGE	SOURCE_GADGET5_LEFT_EDGE
#define SOURCE_GADGET6_TOP_EDGE		(SOURCE_GADGET5_TOP_EDGE + 16)
#define SOURCE_GADGET6_WIDTH		0
#define SOURCE_GADGET6_HEIGHT		0
#define SOURCE_GADGET6_TEXT_ATTR	&topaz80_attr

#define SOURCE_GADGET7_TYPE		GADGET_DATA_TYPE_CHECK
#define SOURCE_GADGET7_FLAGS		(GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_TEXT_RIGHT)
#define SOURCE_GADGET7_TEXT		"_Program"
#define SOURCE_GADGET7_LEFT_EDGE	SOURCE_GADGET6_LEFT_EDGE
#define SOURCE_GADGET7_TOP_EDGE		(SOURCE_GADGET6_TOP_EDGE + 16)
#define SOURCE_GADGET7_WIDTH		0
#define SOURCE_GADGET7_HEIGHT		0
#define SOURCE_GADGET7_TEXT_ATTR	&topaz80_attr

 /* Statics for source requester */

STATIC struct GadgetData source_gadget_data[]=
{
	{
		SOURCE_GADGET1_TYPE,	/* gd_Type */
		SOURCE_GADGET1_FLAGS,	/* gd_Flags */
		SOURCE_GADGET1_LEFT_EDGE,		/* gd_LeftEdge */
		SOURCE_GADGET1_TOP_EDGE,/* gd_TopEdge */
		SOURCE_GADGET1_WIDTH,	/* gd_Width */
		SOURCE_GADGET1_HEIGHT,	/* gd_Height */
		SOURCE_GADGET1_TEXT,	/* *gd_Text */
		SOURCE_GADGET1_TEXT_ATTR,		/* *gd_TextAttr */
		{0, 0, 0}
	},
	{
		SOURCE_GADGET2_TYPE,	/* gd_Type */
		SOURCE_GADGET2_FLAGS,	/* gd_Flags */
		SOURCE_GADGET2_LEFT_EDGE,		/* gd_LeftEdge */
		SOURCE_GADGET2_TOP_EDGE,/* gd_TopEdge */
		SOURCE_GADGET2_WIDTH,	/* gd_Width */
		SOURCE_GADGET2_HEIGHT,	/* gd_Height */
		SOURCE_GADGET2_TEXT,	/* *gd_Text */
		SOURCE_GADGET2_TEXT_ATTR,		/* *gd_TextAttr */
		{0, 0, 0}
	},
	{
		SOURCE_GADGET3_TYPE,	/* gd_Type */
		SOURCE_GADGET3_FLAGS,	/* gd_Flags */
		SOURCE_GADGET3_LEFT_EDGE,		/* gd_LeftEdge */
		SOURCE_GADGET3_TOP_EDGE,/* gd_TopEdge */
		SOURCE_GADGET3_WIDTH,	/* gd_Width */
		SOURCE_GADGET3_HEIGHT,	/* gd_Height */
		SOURCE_GADGET3_TEXT,	/* *gd_Text */
		SOURCE_GADGET3_TEXT_ATTR,		/* *gd_TextAttr */
		{
			SOURCE_GADGET3_INPUT_LEN,	/* gd_InputLen */
			SOURCE_GADGET3_INPUT_ACTIVATE,		/* gd_InputActivate */
			SOURCE_GADGET3_INPUT_DEFAULT		/* gd_InputDefault */
		}
	},
	{
		SOURCE_GADGET4_TYPE,	/* gd_Type */
		SOURCE_GADGET4_FLAGS,	/* gd_Flags */
		SOURCE_GADGET4_LEFT_EDGE,		/* gd_LeftEdge */
		SOURCE_GADGET4_TOP_EDGE,/* gd_TopEdge */
		SOURCE_GADGET4_WIDTH,	/* gd_Width */
		SOURCE_GADGET4_HEIGHT,	/* gd_Height */
		SOURCE_GADGET4_TEXT,	/* *gd_Text */
		SOURCE_GADGET4_TEXT_ATTR,		/* *gd_TextAttr */
		{0, 0, 0}
	},
	{
		SOURCE_GADGET5_TYPE,	/* gd_Type */
		SOURCE_GADGET5_FLAGS,	/* gd_Flags */
		SOURCE_GADGET5_LEFT_EDGE,		/* gd_LeftEdge */
		SOURCE_GADGET5_TOP_EDGE,/* gd_TopEdge */
		SOURCE_GADGET5_WIDTH,	/* gd_Width */
		SOURCE_GADGET5_HEIGHT,	/* gd_Height */
		SOURCE_GADGET5_TEXT,	/* *gd_Text */
		SOURCE_GADGET5_TEXT_ATTR,		/* *gd_TextAttr */
		{0, 0, 0}
	},
	{
		SOURCE_GADGET6_TYPE,	/* gd_Type */
		SOURCE_GADGET6_FLAGS,	/* gd_Flags */
		SOURCE_GADGET6_LEFT_EDGE,		/* gd_LeftEdge */
		SOURCE_GADGET6_TOP_EDGE,/* gd_TopEdge */
		SOURCE_GADGET6_WIDTH,	/* gd_Width */
		SOURCE_GADGET6_HEIGHT,	/* gd_Height */
		SOURCE_GADGET6_TEXT,	/* *gd_Text */
		SOURCE_GADGET6_TEXT_ATTR,		/* *gd_TextAttr */
		{0, 0, 0}
	},
	{
		SOURCE_GADGET7_TYPE,	/* gd_Type */
		SOURCE_GADGET7_FLAGS,	/* gd_Flags */
		SOURCE_GADGET7_LEFT_EDGE,		/* gd_LeftEdge */
		SOURCE_GADGET7_TOP_EDGE,/* gd_TopEdge */
		SOURCE_GADGET7_WIDTH,	/* gd_Width */
		SOURCE_GADGET7_HEIGHT,	/* gd_Height */
		SOURCE_GADGET7_TEXT,	/* *gd_Text */
		SOURCE_GADGET7_TEXT_ATTR,		/* *gd_TextAttr */
		{0, 0, 0}
	},
	{
		INTUISUP_DATA_END		/* mark end of gadget data */
	}
};
 /* Save project as C source code */

SHORT
save_c_source(VOID)
{
	struct TemplateList *tl = &template_list;
	struct GadgetData *gd = &source_gadget_data[0];
	APTR gl;
	USHORT flags = tl->tl_Flags;
	SHORT status;

	/* Init gadgets with current project data */
	(gd + SOURCE_GADGET_ID)->gd_SpecialData.gd_InputData.gd_InputDefault = &tl->tl_ProjectID[0];
	(gd + SOURCE_GADGET_STATIC)->gd_SpecialData.gd_CheckData.gd_CheckSelected = (flags & TEMPLATE_LIST_FLAG_SOURCE_STATIC_DATA ? 1 : 0);
	(gd + SOURCE_GADGET_INNER)->gd_SpecialData.gd_CheckData.gd_CheckSelected = (flags & TEMPLATE_LIST_FLAG_SOURCE_INNER_WINDOW ? 1 : 0);
	(gd + SOURCE_GADGET_WINDOW)->gd_SpecialData.gd_CheckData.gd_CheckSelected = (flags & TEMPLATE_LIST_FLAG_SOURCE_WINDOW ? 1 : 0);
	(gd + SOURCE_GADGET_PROGRAM)->gd_SpecialData.gd_CheckData.gd_CheckSelected = (flags & TEMPLATE_LIST_FLAG_SOURCE_PROGRAM ? 1 : 0);

	/* Print title and display gadgets */
	IClearWindow(eri, ewin, 0, 0, EDITOR_WINDOW_WIDTH, EDITOR_WINDOW_HEIGHT,
				 0);
	IPrintText(eri, ewin, SOURCE_TITLE_TEXT, SOURCE_TITLE_LEFT_EDGE,
			   SOURCE_TITLE_TOP_EDGE, SOURCE_TITLE_TYPE, SOURCE_TITLE_FLAGS,
			   SOURCE_TITLE_TEXT_ATTR);
	if (!(gl = ICreateGadgets(eri, &source_gadget_data[0], 0, 0, NULL)))
	{
		status = EDITOR_ERROR_OUT_OF_MEM;
	}
	else
	{
		IDisplayGadgets(ewin, gl);
		status = save_c_source_action(gl, tl);
		IRemoveGadgets(gl);
		IFreeGadgets(gl);

		/* Generate C source */
		if (status == SOURCE_SELECTION_OK)
		{
			status = generate_c_source(tl);
		}
	}
	return (status);
}

 /* Perform action for source code generator */

STATIC SHORT
save_c_source_action(APTR gl, struct TemplateList * tl)
{
	struct MsgPort *up = ewin->UserPort;
	BYTE *id = NULL;
	USHORT flags = tl->tl_Flags;
	BOOL keepon = TRUE;
	SHORT status = EDITOR_STATUS_NORMAL;

	do
	{
		struct IntuiMessage *msg;

		WaitPort(up);
		while (msg = IGetMsg(up))
		{
			ULONG value;

			switch (msg->Class)
			{
			case CLOSEWINDOW:
				status = EDITOR_STATUS_QUIT;
				keepon = FALSE;
				break;

			case ISUP_ID:
				value = (ULONG) msg->IAddress;
				switch (msg->Code)
				{
				case SOURCE_GADGET_OK:

					/* Change template list data */
					if (id)
					{
						strcpy(&tl->tl_ProjectID[0], id);
					}
					tl->tl_Flags = flags;

					/* Set status to generate C source code */
					status = SOURCE_SELECTION_OK;
					keepon = FALSE;
					break;

				case SOURCE_GADGET_CANCEL:
					keepon = FALSE;
					break;

				case SOURCE_GADGET_ID:
					id = (BYTE *) value;
					flags |= TEMPLATE_LIST_FLAG_CHANGED;
					break;

				case SOURCE_GADGET_STATIC:
					if (value)
					{
						flags |= TEMPLATE_LIST_FLAG_SOURCE_STATIC_DATA;
					}
					else
					{
						flags &= ~TEMPLATE_LIST_FLAG_SOURCE_STATIC_DATA;
					}
					flags |= TEMPLATE_LIST_FLAG_CHANGED;
					break;

				case SOURCE_GADGET_INNER:
					if (value)
					{
						flags |= TEMPLATE_LIST_FLAG_SOURCE_INNER_WINDOW;
					}
					else
					{
						flags &= ~TEMPLATE_LIST_FLAG_SOURCE_INNER_WINDOW;
					}
					flags |= TEMPLATE_LIST_FLAG_CHANGED;
					break;

				case SOURCE_GADGET_WINDOW:
					if (value)
					{
						flags |= TEMPLATE_LIST_FLAG_SOURCE_WINDOW;
					}
					else
					{
						flags &= ~TEMPLATE_LIST_FLAG_SOURCE_WINDOW;
					}
					flags |= TEMPLATE_LIST_FLAG_CHANGED;
					break;

				case SOURCE_GADGET_PROGRAM:
					if (value)
					{
						flags |= TEMPLATE_LIST_FLAG_SOURCE_PROGRAM;
						if (!(flags & TEMPLATE_LIST_FLAG_SOURCE_WINDOW))
						{
							flags |= TEMPLATE_LIST_FLAG_SOURCE_WINDOW;
							ISetGadgetAttributes(gl, SOURCE_GADGET_WINDOW,
												 0L, 0L, 1L, USE_CURRENT_VALUE,
												 (VOID *) USE_CURRENT_VALUE);
						}
					}
					else
					{
						flags &= ~TEMPLATE_LIST_FLAG_SOURCE_PROGRAM;
					}
					flags |= TEMPLATE_LIST_FLAG_CHANGED;
					break;
				}
				break;
			}
			IReplyMsg(msg);
		}
	}
	while (keepon == TRUE);
	return (status);
}

 /* C source code generator */

STATIC SHORT
generate_c_source(struct TemplateList * tl)
{
	struct rtFileRequester *freq = csource_file_requester;
	SHORT status = EDITOR_STATUS_NORMAL;
	BYTE filename[256], buf[256];		/* <- should define a constant */

	/* Display ReqTools file requester and check if user selected cancel */
	IChangeMousePointer(ewin, NULL, FALSE);

	if (rtFileRequest(freq, filename, CSOURCE_SAVE_HAIL_TEXT, TAG_END))
	{
		struct TemplateList *tl = &template_list;
		FILE *fh;
		SHORT len = strlen(filename) - 2;

		/* Prepare file name */
		if (len < 1 || strcmp(filename + len, ".c"))
		{
			strcat(filename, ".c");
			len += 2;
		}

		/* filename = path + name */
		if (strlen(freq->Dir) > 0)
		{
			strcpy(buf, filename);
			if (strncmp(buf + strlen(buf) - 1, ":", (size_t) 1) == 0)
				sprintf(filename, "%s/%s", freq->Dir, buf);
			else
				sprintf(filename, "%s%s", freq->Dir, buf);
		}

		/* Check if file already exists and inform user */
		if (fh = fopen(filename, "r"))
			fclose(fh);

		if (!fh || ok_cancel_requester(" Save C source ", "File already"
									   " exists.\\n\\nDo you really want to overwrite?") == TRUE)
		{

			/* Open file and write C source */
			if (!(fh = fopen(filename, "w+")))
			{
				status = EDITOR_ERROR_OPEN_FAILED;
			}
			else
			{
				if ((status = write_project_window(fh, tl)) ==
					EDITOR_STATUS_NORMAL)
				{
					if ((status = write_project_borders(fh, tl)) ==
						EDITOR_STATUS_NORMAL)
					{
						if ((status = write_project_fonts(fh, tl)) ==
							EDITOR_STATUS_NORMAL)
						{
							if ((status = write_project_texts(fh, tl)) ==
								EDITOR_STATUS_NORMAL)
							{
								if ((status = write_project_gadgets(fh, tl)) ==
									EDITOR_STATUS_NORMAL)
								{
									status = write_project_program(fh, tl);
								}
							}
						}
					}
				}
				fclose(fh);

				/* If any error then delete incomplete C source file */
				if (status != EDITOR_STATUS_NORMAL)
				{
					DeleteFile(filename);
				}
			}
		}
	}
	IRestoreMousePointer(ewin);
	if (status != EDITOR_STATUS_NORMAL)
	{
		show_error(status);
	}
	return (status);
}

 /* Write project window data to save file */

STATIC SHORT
write_project_window(FILE * fh, struct TemplateList * tl)
{
	USHORT flags = tl->tl_Flags;
	ULONG IDCMPflags = tl->tl_IDCMPFlags, WINflags = pwin->Flags;
	SHORT status = EDITOR_STATUS_NORMAL;

	if (fprintf(fh, "\t\t/* Project: %s */\n\n", &tl->tl_ProjectName[0]) == -1L)
	{
		status = EDITOR_ERROR_WRITE_FAILED;
	}

	if (status == EDITOR_STATUS_NORMAL && flags & TEMPLATE_LIST_FLAG_SOURCE_PROGRAM)
	{
		if (fprintf(fh,
					"\t/* Includes */\n\n"
					"#include <exec/types.h>\n"
					"#include <exec/lists.h>\n"
					"#include <intuition/intuition.h>\n"
					"#include <libraries/intuisup.h>\n"
					"#ifdef AZTEC_C\n"
					"#include <functions.h>\n"
					"#endif\n"
					"#ifdef LATTICE\n"
					"#include <proto/all.h>\n"
					"#endif\n\n"
			)== -1L)
		{
			status = EDITOR_ERROR_WRITE_FAILED;
		}
	}

	if (status == EDITOR_STATUS_NORMAL && flags & TEMPLATE_LIST_FLAG_SOURCE_WINDOW)
	{
		struct Window *win = pwin;
		BYTE id[MAX_PROJECT_ID_LEN];

		lower_string(&tl->tl_ProjectID[0], &id[0]);
		if (fprintf(fh,
					"\t/* Defines and data for window */\n\n"
					"#define RENDER_INFO_FLAGS  %d\n"
					"#define OPEN_WINDOW_FLAGS  %d\n\n"
					"#define WINDOW_LEFT_EDGE   %d\n"
					"#define WINDOW_TOP_EDGE    %d\n"
					"#define WINDOW_WIDTH       %d\n"
					"#define WINDOW_HEIGHT      %d\n\n"
					"%sstruct NewWindow  %s_new_window = {\n"
					"	WINDOW_LEFT_EDGE, WINDOW_TOP_EDGE, WINDOW_WIDTH, WINDOW_HEIGHT,\n"
					"	%d, %d,\n"
					"%s"
					"%s"
					"%s"
					"%s"
					"%s"
					"%s"
					"%s"
					"%s"
					"%s"
					"%s"
					"%s"
					"%s"
					"%s"
					"%s"
					"%s"
					"%s"
					"%s"
					"%s"
					"%s"
					"%s"
					"%s"
					"%s"
					"%s"
					"%s,\n"

					"%s"
					"%s"
					"%s"
					"%s"
					"%s"
					"%s"
					"%s"
					"%s"
					"%s"
					"%s"
					"%s"
					"%s"
					"%s"
					"%s,\n"

					"	NULL, NULL,\n"
					"	(UBYTE *)\"%s\",\n"
					"	NULL, NULL,\n"
					"	%d, %d, %d, %d,\n"
					"	WBENCHSCREEN\n"
					"};\n",

					((flags & TEMPLATE_LIST_FLAG_SOURCE_INNER ? RENDER_INFO_FLAG_INNER_WINDOW : 0) | (flags & TEMPLATE_LIST_FLAG_BACK_FILL ? RENDER_INFO_FLAG_BACK_FILL : 0)),
					(flags & TEMPLATE_LIST_FLAG_RENDER_COLORS ? OPEN_WINDOW_FLAG_RENDER_PENS : 0),
					win->LeftEdge,
					win->TopEdge,
					(flags & TEMPLATE_LIST_FLAG_SOURCE_INNER_WINDOW ? win->Width - win->BorderLeft - win->BorderRight : win->Width),
					(flags & TEMPLATE_LIST_FLAG_SOURCE_INNER_WINDOW ? win->Height - win->BorderTop - win->BorderBottom : win->Height),
					(flags & TEMPLATE_LIST_FLAG_SOURCE_STATIC_DATA ? "STATIC " : ""),
					&id[0],
					(USHORT) win->DetailPen,
					(USHORT) win->BlockPen,

					((IDCMPflags & GADGETDOWN) && !GADGET_ALL(GADGETDOWN) ? " | GADGETDOWN" : ""),
					((IDCMPflags & GADGETUP) && !GADGET_ALL(GADGETUP) ? " | GADGETUP" : ""),
					((IDCMPflags & CLOSEWINDOW) && !GADGET_ALL(CLOSEWINDOW) ? " | CLOSEWINDOW" : ""),
					((IDCMPflags & REQSET) && !GADGET_ALL(REQSET) ? " | REQSET" : ""),
					((IDCMPflags & REQCLEAR) && !GADGET_ALL(REQCLEAR) ? " | REQCLEAR" : ""),
					((IDCMPflags & REQVERIFY) && !GADGET_ALL(REQVERIFY) ? " | REQVERIFY" : ""),
					((IDCMPflags & MENUPICK) && !GADGET_ALL(MENUPICK) ? " | MENUPICK" : ""),
					((IDCMPflags & MENUVERIFY) && !GADGET_ALL(MENUVERIFY) ? " | MENUVERIFY" : ""),
					((IDCMPflags & MOUSEBUTTONS) && !GADGET_ALL(MOUSEBUTTONS) ? " | MOUSEBUTTONS" : ""),
					((IDCMPflags & MOUSEMOVE) && !GADGET_ALL(MOUSEMOVE) ? " | MOUSEMOVE" : ""),
					((IDCMPflags & DELTAMOVE) && !GADGET_ALL(DELTAMOVE) ? " | DELTAMOVE" : ""),
					((IDCMPflags & NEWSIZE) && !GADGET_ALL(NEWSIZE) ? " | NEWSIZE" : ""),
					((IDCMPflags & SIZEVERIFY) && !GADGET_ALL(SIZEVERIFY) ? " | SIZEVERIFY" : ""),
					((IDCMPflags & REFRESHWINDOW) && !GADGET_ALL(REFRESHWINDOW) ? " | REFRESHWINDOW" : ""),
					((IDCMPflags & ACTIVEWINDOW) && !GADGET_ALL(ACTIVEWINDOW) ? " | ACTIVEWINDOW" : ""),
					((IDCMPflags & INACTIVEWINDOW) && !GADGET_ALL(INACTIVEWINDOW) ? " | INACTIVEWINDOW" : ""),
					((IDCMPflags & RAWKEY) && !GADGET_ALL(RAWKEY) ? " | RAWKEY" : ""),
					((IDCMPflags & VANILLAKEY) && !GADGET_ALL(VANILLAKEY) ? " | VANILLAKEY" : ""),
					((IDCMPflags & DISKINSERTED) && !GADGET_ALL(DISKINSERTED) ? " | DISKINSERTED" : ""),
					((IDCMPflags & DISKREMOVED) && !GADGET_ALL(DISKREMOVED) ? " | DISKREMOVED" : ""),
					((IDCMPflags & NEWPREFS) && !GADGET_ALL(NEWPREFS) ? " | NEWPREFS" : ""),
					((IDCMPflags & INTUITICKS) && !GADGET_ALL(INTUITICKS) ? " | INTUITICKS" : ""),
					((IDCMPflags & WBENCHMESSAGE) && !GADGET_ALL(WBENCHMESSAGE) ? " | WBENCHMESSAGE" : ""),
					(IDCMPflags & GADGET_IDCMP_FLAGS_ALL ? " | GADGET_IDCMP_FLAGS_ALL" : ""),

					(WINflags & WINDOWCLOSE ? " | WINDOWCLOSE" : ""),
					(WINflags & WINDOWDRAG ? " | WINDOWDRAG" : ""),
					(WINflags & WINDOWDEPTH ? " | WINDOWDEPTH" : ""),
					(WINflags & WINDOWSIZING ? " | WINDOWSIZING" : ""),
					(WINflags & BACKDROP ? " | BACKDROP" : ""),
					(WINflags & BORDERLESS ? " | BORDERLESS" : ""),
					(WINflags & GIMMEZEROZERO ? " | GIMMEZEROZERO" : ""),
					(WINflags & SUPER_BITMAP ? " | SUPER_BITMAP" : ""),
					(WINflags & SIMPLE_REFRESH ? " | SIMPLE_REFRESH" : ""),
					(WINflags & SMART_REFRESH ? " | SMART_REFRESH" : ""),
					(flags & TEMPLATE_LIST_FLAG_REPORTMOUSE ? " | REPORTMOUSE" : ""),
					(WINflags & NOCAREREFRESH ? " | NOCAREREFRESH" : ""),
					(WINflags & RMBTRAP ? " | RMBTRAP" : ""),
					(WINflags & ACTIVATE ? " | ACTIVATE" : ""),

					&tl->tl_ProjectWinName[0],

					win->MinWidth,
					win->MinHeight,
					win->MaxWidth,
					win->MaxHeight)
			== -1L)
		{
			status = EDITOR_ERROR_WRITE_FAILED;
		}
	}

	return (status);
}

 /* Write project border defines and data to save file */

STATIC SHORT
write_project_borders(FILE * fh, struct TemplateList * tl)
{
	SHORT status = EDITOR_STATUS_NORMAL;

	if (tl->tl_BorderTemplates)
	{
		if (fprintf(fh, "\t/* Defines and data for borders */\n\n") == -1L)
		{
			status = EDITOR_ERROR_WRITE_FAILED;
		}
		if (status == EDITOR_STATUS_NORMAL)
		{
			struct Template *tp;
			BYTE id[MAX_PROJECT_ID_LEN + 1];
			USHORT count;

			/* Write defines */
			upper_string(&tl->tl_ProjectID[0], &id[0]);
			for (count = 0, tp = get_head((struct List *) & tl->tl_Templates);
				 tp && status == EDITOR_STATUS_NORMAL;
				 count++, tp = get_succ(&tp->tp_Node))
			{
				if (TEMPLATE_GROUP(tp) == TEMPLATE_GROUP_BORDER)
				{
					BYTE name[MAX_TEMPLATE_NAME_LEN + 1];

					upper_string(&tp->tp_TemplateName[0], &name[0]);
					if (fprintf(fh, "#define %s_BORDER_%s   %d\n",
								&id[0], &name[0], count) == -1L)
					{
						status = EDITOR_ERROR_WRITE_FAILED;
					}
				}
			}
			if (status == EDITOR_STATUS_NORMAL)
			{
				USHORT flags = tl->tl_Flags;

				/* Write border data */
				lower_string(&tl->tl_ProjectID[0], &id[0]);
				if (fprintf(fh, "\n%sstruct BorderData  %s_border_data[] = {\n"
							"   {\n",
							(flags & TEMPLATE_LIST_FLAG_SOURCE_STATIC_DATA ?
							 "STATIC " : ""), &id[0]) == -1L)
				{
					status = EDITOR_ERROR_WRITE_FAILED;
				}
				else
				{
					struct Window *win = pwin;

					for (tp = get_head((struct List *) & tl->tl_Templates);
						 tp && status == EDITOR_STATUS_NORMAL;
						 tp = get_succ(&tp->tp_Node))
					{
						if (TEMPLATE_GROUP(tp) == TEMPLATE_GROUP_BORDER)
						{
							struct BorderData *bd = &tp->tp_Data.tp_BorderData;

							if (fprintf(fh, "      %d, %d, %d, %d, %d\n"
										"   }, {\n", bd->bd_Type,
										(flags & TEMPLATE_LIST_FLAG_SOURCE_INNER_WINDOW ?
										 bd->bd_LeftEdge - win->BorderLeft :
										 bd->bd_LeftEdge),
										(flags & TEMPLATE_LIST_FLAG_SOURCE_INNER_WINDOW ?
										 bd->bd_TopEdge - win->BorderTop :
										 bd->bd_TopEdge),
										bd->bd_Width, bd->bd_Height) == -1L)
							{
								status = EDITOR_ERROR_WRITE_FAILED;
							}
						}
					}
					if (status == EDITOR_STATUS_NORMAL)
					{
						if (fprintf(fh, "      INTUISUP_DATA_END\n"
									"   }\n"
									"};\n") == -1L)
						{
							status = EDITOR_ERROR_WRITE_FAILED;
						}
					}
				}
			}
		}
	}
	return (status);
}

 /* Write project font data to save file */

STATIC SHORT
write_project_fonts(FILE * fh, struct TemplateList * tl)
{
	SHORT status = EDITOR_STATUS_NORMAL;

	if (tl->tl_TextTemplates || tl->tl_GadgetTemplates)
	{
		BYTE id[MAX_PROJECT_ID_LEN + 1];

		lower_string(&tl->tl_ProjectID[0], &id[0]);
		if (fprintf(fh, "\t/* Data for fonts */\n\n"
					"%sstruct TextAttr  %s_text_attr[] = {\n"
					"   {\n",
					(tl->tl_Flags & TEMPLATE_LIST_FLAG_SOURCE_STATIC_DATA ?
					 "STATIC " : ""), &id[0]) == -1L)
		{
			status = EDITOR_ERROR_WRITE_FAILED;
		}
		else
		{
			struct TemplateFont *tf = get_head((struct List *) & tl->tl_Fonts);

			while (tf && status == EDITOR_STATUS_NORMAL)
			{
				struct TextAttr *ta = &tf->tf_TextAttr;

				tf = get_succ((struct Node *) & tf->tf_MinNode);
				if (fprintf(fh, "      (STRPTR)\"%s\", %d, FS_NORMAL, FPF_ROMFONT\n"
							"   }%s", ta->ta_Name, ta->ta_YSize,
							(tf ? ", {\n" : "\n};\n")) == -1L)
				{
					status = EDITOR_ERROR_WRITE_FAILED;
				}
			}
		}
	}
	return (status);
}

 /* Write project text defines and data to save file */

STATIC SHORT
write_project_texts(FILE * fh, struct TemplateList * tl)
{
	SHORT status = EDITOR_STATUS_NORMAL;

	if (tl->tl_TextTemplates)
	{
		if (fprintf(fh, "\t/* Defines and data for texts */\n\n") == -1L)
		{
			status = EDITOR_ERROR_WRITE_FAILED;
		}
		if (status == EDITOR_STATUS_NORMAL)
		{
			struct Template *tp;
			BYTE id[MAX_PROJECT_ID_LEN + 1];
			USHORT count;

			/* Write defines */
			upper_string(&tl->tl_ProjectID[0], &id[0]);
			for (count = 0, tp = get_head((struct List *) & tl->tl_Templates);
				 tp && status == EDITOR_STATUS_NORMAL;
				 tp = get_succ(&tp->tp_Node))
			{
				if (TEMPLATE_GROUP(tp) == TEMPLATE_GROUP_TEXT)
				{
					BYTE name[MAX_TEMPLATE_NAME_LEN + 1];

					upper_string(&tp->tp_TemplateName[0], &name[0]);
					if (fprintf(fh, "#define %s_TEXT_%s   %d\n",
								&id[0], &name[0], count) == -1L)
					{
						status = EDITOR_ERROR_WRITE_FAILED;
					}
					else
					{
						count++;
					}
				}
			}
			if (status == EDITOR_STATUS_NORMAL)
			{
				USHORT flags = tl->tl_Flags;

				/* Write text data */
				lower_string(&tl->tl_ProjectID[0], &id[0]);
				if (fprintf(fh, "\n%sstruct TextData  %s_text_data[] = {\n"
							"   {\n",
							(flags & TEMPLATE_LIST_FLAG_SOURCE_STATIC_DATA ?
							 "STATIC " : ""), &id[0]) == -1L)
				{
					status = EDITOR_ERROR_WRITE_FAILED;
				}
				else
				{
					struct Window *win = pwin;

					for (tp = get_head((struct List *) & tl->tl_Templates);
						 tp && status == EDITOR_STATUS_NORMAL;
						 tp = get_succ(&tp->tp_Node))
					{
						if (TEMPLATE_GROUP(tp) == TEMPLATE_GROUP_TEXT)
						{
							struct TextData *td = &tp->tp_Data.tp_TextData;

							if (fprintf(fh, "      %d, %d, %d, %d,\n"
										"      \"%s\", &%s_text_attr[%d]\n"
										"   }, {\n", td->td_Type, td->td_Flags,
										(flags & TEMPLATE_LIST_FLAG_SOURCE_INNER_WINDOW ?
										 td->td_LeftEdge - win->BorderLeft :
										 td->td_LeftEdge),
										(flags & TEMPLATE_LIST_FLAG_SOURCE_INNER_WINDOW ?
										 td->td_TopEdge - win->BorderTop :
										 td->td_TopEdge),
										td->td_Text, &id[0], get_template_font_num(tl,
																				   td->td_TextAttr)) == -1L)
							{
								status = EDITOR_ERROR_WRITE_FAILED;
							}
						}
					}
					if (status == EDITOR_STATUS_NORMAL)
					{
						if (fprintf(fh, "      INTUISUP_DATA_END\n"
									"   }\n"
									"};\n") == -1L)
						{
							status = EDITOR_ERROR_WRITE_FAILED;
						}
					}
				}
			}
		}
	}
	return (status);
}

 /* Write project gadget defines and data to save file */

STATIC SHORT
write_project_gadgets(FILE * fh, struct TemplateList * tl)
{
	SHORT status = EDITOR_STATUS_NORMAL;

	if (tl->tl_GadgetTemplates)
	{
		if (fprintf(fh, "\t/* Defines and data for gadgets */\n\n") == -1L)
		{
			status = EDITOR_ERROR_WRITE_FAILED;
		}
		if (status == EDITOR_STATUS_NORMAL)
		{
			struct Template *tp;
			BYTE id[MAX_PROJECT_ID_LEN + 1];
			USHORT count;

			/* Write defines */
			upper_string(&tl->tl_ProjectID[0], &id[0]);
			for (count = 0, tp = get_head((struct List *) & tl->tl_Templates);
				 tp && status == EDITOR_STATUS_NORMAL;
				 tp = get_succ(&tp->tp_Node))
			{
				if (TEMPLATE_GROUP(tp) == TEMPLATE_GROUP_GADGET)
				{
					BYTE name[MAX_TEMPLATE_NAME_LEN + 1];

					upper_string(&tp->tp_TemplateName[0], &name[0]);
					if (fprintf(fh, "#define %s_GADGET_%s   %d\n",
								&id[0], &name[0], count) == -1L)
					{
						status = EDITOR_ERROR_WRITE_FAILED;
					}
					else
					{
						count++;
					}
				}
			}
			if (status == EDITOR_STATUS_NORMAL)
			{
				if (fprintf(fh, "\n") == -1L)
				{
					status = EDITOR_ERROR_WRITE_FAILED;
				}
				else
				{

					/* Write text arrays and lists */
					lower_string(&tl->tl_ProjectID[0], &id[0]);
					for (count = 1, tp = get_head((struct List *) & tl->tl_Templates);
						 tp && status == EDITOR_STATUS_NORMAL;
						 tp = get_succ(&tp->tp_Node))
					{
						if (TEMPLATE_GROUP(tp) == TEMPLATE_GROUP_GADGET)
						{
							struct GadgetData *gd = &tp->tp_Data.tp_GadgetData;

							switch (gd->gd_Type)
							{
							case GADGET_DATA_TYPE_MX:
								status = write_gadget_text_array(fh, tl, &id[0], count,
																 gd->gd_SpecialData.gd_MXData.gd_MXTextArray);
								break;

							case GADGET_DATA_TYPE_CYCLE:
								status = write_gadget_text_array(fh, tl, &id[0], count,
																 gd->gd_SpecialData.gd_CycleData.gd_CycleTextArray);
								break;

							case GADGET_DATA_TYPE_LISTVIEW:
								status = write_gadget_list(fh, tl, &id[0], count,
														   gd->gd_SpecialData.gd_ListViewData.gd_ListViewList);
								break;
							}
							count++;
						}
					}
					if (status == EDITOR_STATUS_NORMAL)
					{
						USHORT flags = tl->tl_Flags;

						/* Write gadget data */
						if (fprintf(fh, "%sstruct GadgetData  %s_gadget_data[] = {\n"
									"   {\n",
									(flags & TEMPLATE_LIST_FLAG_SOURCE_STATIC_DATA ?
									 "STATIC " : ""), &id[0]) == -1L)
						{
							status = EDITOR_ERROR_WRITE_FAILED;
						}
						else
						{
							struct Window *win = pwin;

							for (count = 1, tp = get_head((struct List *)
														  & tl->tl_Templates);
								 tp && status == EDITOR_STATUS_NORMAL;
								 tp = get_succ(&tp->tp_Node))
							{
								if (TEMPLATE_GROUP(tp) == TEMPLATE_GROUP_GADGET)
								{
									struct GadgetData *gd = &tp->tp_Data.tp_GadgetData;

									if (fprintf(fh, "      %ld, %ld, %d, %d, %d, %d,\n"
												"      \"%s\", &%s_text_attr[%d],\n",
												gd->gd_Type, gd->gd_Flags,
												(flags & TEMPLATE_LIST_FLAG_SOURCE_INNER_WINDOW ?
												 gd->gd_LeftEdge - win->BorderLeft :
												 gd->gd_LeftEdge),
												(flags & TEMPLATE_LIST_FLAG_SOURCE_INNER_WINDOW ?
												 gd->gd_TopEdge - win->BorderTop :
												 gd->gd_TopEdge),
												gd->gd_Width, gd->gd_Height, gd->gd_Text,
												&id[0], get_template_font_num(tl,
																			  gd->gd_TextAttr)) == -1L)
									{
										status = EDITOR_ERROR_WRITE_FAILED;
									}
									else
									{
										if ((status = write_gadget_special_data(fh, &id[0],
																				count, gd)) == EDITOR_STATUS_NORMAL)
										{
											count++;
										}
									}
								}
							}
							if (status == EDITOR_STATUS_NORMAL)
							{
								if (fprintf(fh, "      INTUISUP_DATA_END\n"
											"   }\n"
											"};\n") == -1L)
								{
									status = EDITOR_ERROR_WRITE_FAILED;
								}
							}
						}
					}
				}
			}
		}
	}
	return (status);
}

 /* Write gadget text array to save file*/

STATIC SHORT
write_gadget_text_array(FILE * fh, struct TemplateList * tl, BYTE * id, USHORT count, BYTE ** array)
{
	SHORT status = EDITOR_STATUS_NORMAL;

	if (fprintf(fh, "%sBYTE *%s_gadget%d_text_array[] = {\n",
				(tl->tl_Flags & TEMPLATE_LIST_FLAG_SOURCE_STATIC_DATA ?
				 "STATIC " : ""), id, count) == -1L)
	{
		status = EDITOR_ERROR_WRITE_FAILED;
	}
	else
	{
		BYTE *text;

		while ((text = *array++) && status == EDITOR_STATUS_NORMAL)
		{
			if (fprintf(fh, "   \"%s\",\n", text) == -1L)
			{
				status = EDITOR_ERROR_WRITE_FAILED;
			}
		}
		if (status == EDITOR_STATUS_NORMAL)
		{
			if (fprintf(fh, "   NULL\n"
						"};\n") == -1L)
			{
				status = EDITOR_ERROR_WRITE_FAILED;
			}
		}
	}
	return (status);
}

 /* Write gadget list to save file*/

STATIC SHORT
write_gadget_list(FILE * fh, struct TemplateList * tl, BYTE * id, USHORT count, struct List * list)
{
	USHORT num = 0;
	SHORT status = EDITOR_STATUS_NORMAL;

	if (list->lh_Head->ln_Succ)
	{
		if (fprintf(fh, "IMPORT struct List  %s_gadget%d_list;\n"
					"%sstruct Node  %s_gadget%d_node[] = {\n"
					"   {\n", id, count,
					(tl->tl_Flags & TEMPLATE_LIST_FLAG_SOURCE_STATIC_DATA ?
					 "STATIC " : ""), id, count) == -1L)
		{
			status = EDITOR_ERROR_WRITE_FAILED;
		}
		else
		{
			struct Node *node = get_head(list);

			/* Write node array */
			while (node && status == EDITOR_STATUS_NORMAL)
			{
				BYTE *text = node->ln_Name;

				/* Write node pred */
				node = get_succ(node);
				if (node)
				{
					if (fprintf(fh, "      &%s_gadget%d_node[%d], ",
								&id[0], count, num + 1) == -1L)
					{
						status = EDITOR_ERROR_WRITE_FAILED;
					}
				}
				else
				{
					if (fprintf(fh, "      (struct Node *)"
								"&%s_gadget%d_list.lh_Tail, ", &id[0], count) == -1L)
					{
						status = EDITOR_ERROR_WRITE_FAILED;
					}
				}
				if (status == EDITOR_STATUS_NORMAL)
				{

					/* Write node succ */
					if (num)
					{
						if (fprintf(fh, "&%s_gadget%d_node[%d]",
									&id[0], count, num - 1) == -1L)
						{
							status = EDITOR_ERROR_WRITE_FAILED;
						}
					}
					else
					{
						if (fprintf(fh, "(struct Node *)&%s_gadget%d_list.lh_Head",
									&id[0], count) == -1L)
						{
							status = EDITOR_ERROR_WRITE_FAILED;
						}
					}
					if (status == EDITOR_STATUS_NORMAL)
					{

						/* Write node text */
						if (fprintf(fh, ", 0, 0,\n"
									"      \"%s\"\n"
									"   }%s", text,
									(node ? ", {\n" : "\n};\n")) == -1L)
						{
							status = EDITOR_ERROR_WRITE_FAILED;
						}
						else
						{
							num++;
						}
					}
				}
			}
		}
	}
	if (status == EDITOR_STATUS_NORMAL)
	{

		/* Write list */
		if (fprintf(fh, "%sstruct List  %s_gadget%d_list = {\n",
					(tl->tl_Flags & TEMPLATE_LIST_FLAG_SOURCE_STATIC_DATA ?
					 "/* STATIC */ " : ""), id, count) == -1L)
		{
			status = EDITOR_ERROR_WRITE_FAILED;
		}
		else
		{

			/* Write list head */
			if (num)
			{
				if (fprintf(fh, "   &%s_gadget%d_node[0], NULL,\n",
							id, count) == -1L)
				{
					status = EDITOR_ERROR_WRITE_FAILED;
				}
			}
			else
			{
				if (fprintf(fh, "   (struct Node *)&%s_gadget%d_list.lh_Tail,"
							" NULL,\n", id, count) == -1L)
				{
					status = EDITOR_ERROR_WRITE_FAILED;
				}
			}
			if (status == EDITOR_STATUS_NORMAL)
			{

				/* Write list tail */
				if (num)
				{
					if (fprintf(fh, "   &%s_gadget%d_node[%d]",
								id, count, num - 1) == -1L)
					{
						status = EDITOR_ERROR_WRITE_FAILED;
					}
				}
				else
				{
					if (fprintf(fh, "   (struct Node *)&%s_gadget%d_list.lh_Head",
								id, count) == -1L)
					{
						status = EDITOR_ERROR_WRITE_FAILED;
					}
				}
				if (status == EDITOR_STATUS_NORMAL)
				{

					/* Write list type */
					if (fprintf(fh, ", 0, 0\n"
								"};\n") == -1L)
					{
						status = EDITOR_ERROR_WRITE_FAILED;
					}
				}
			}
		}
	}
	return (status);
}

 /* Write special gadget data */

STATIC SHORT
write_gadget_special_data(FILE * fh, BYTE * id, USHORT count, struct GadgetData * gd)
{
	SHORT status = EDITOR_STATUS_NORMAL;

	if (fprintf(fh, "      { ") == -1L)
	{
		status = EDITOR_ERROR_WRITE_FAILED;
	}
	else
	{
		switch (gd->gd_Type)
		{
		case GADGET_DATA_TYPE_MX:
		case GADGET_DATA_TYPE_CYCLE:
			if (fprintf(fh, "%ld, %ld, &%s_gadget%d_text_array[0]",
						gd->gd_SpecialData.gd_Data.gd_Data1,
						gd->gd_SpecialData.gd_Data.gd_Data2, id, count) == -1L)
			{
				status = EDITOR_ERROR_WRITE_FAILED;
			}
			break;

		case GADGET_DATA_TYPE_STRING:
			if (fprintf(fh, "%ld, %ld, \"%s\"",
						gd->gd_SpecialData.gd_Data.gd_Data1,
						gd->gd_SpecialData.gd_Data.gd_Data2,
						gd->gd_SpecialData.gd_Data.gd_Data3) == -1L)
			{
				status = EDITOR_ERROR_WRITE_FAILED;
			}
			break;

		case GADGET_DATA_TYPE_LISTVIEW:
			if (fprintf(fh, "%ld, %ld, &%s_gadget%d_list",
						gd->gd_SpecialData.gd_Data.gd_Data1,
						gd->gd_SpecialData.gd_Data.gd_Data2, id, count) == -1L)
			{
				status = EDITOR_ERROR_WRITE_FAILED;
			}
			break;

		default:
			if (fprintf(fh, "%ld, %ld, (VOID *)%ld",
						gd->gd_SpecialData.gd_Data.gd_Data1,
						gd->gd_SpecialData.gd_Data.gd_Data2,
						gd->gd_SpecialData.gd_Data.gd_Data3) == -1L)
			{
				status = EDITOR_ERROR_WRITE_FAILED;
			}
			break;
		}
		if (status == EDITOR_STATUS_NORMAL)
		{
			if (fprintf(fh, " }\n"
						"   }, {\n") == -1L)
			{
				status = EDITOR_ERROR_WRITE_FAILED;
			}
		}
	}
	return (status);
}

 /* Write project test program */

STATIC SHORT
write_project_program(FILE * fh, struct TemplateList * tl)
{
	SHORT status = EDITOR_STATUS_NORMAL;

	if (tl->tl_Flags & TEMPLATE_LIST_FLAG_SOURCE_PROGRAM)
	{
		BYTE id[MAX_PROJECT_ID_LEN + 1];
		USHORT gads = tl->tl_GadgetTemplates;
		struct Template *tp;
		USHORT count;


		lower_string(&tl->tl_ProjectID[0], &id[0]);
		if (fprintf(fh,
					"\n	/* Global var. */\n"
					"struct Library  *IntuiSupBase = NULL;\n"
					"APTR ri = NULL;\n"
					"struct Window* win = NULL;\n"
					"%s%c\n"
					"\t/* Protos */\n"
					"BOOL %s_init(VOID);\n"
					"VOID %s_close(VOID);\n"
					"VOID %s_action(VOID);\n"
					"%s%s%s\n"
					"\t/* Test program */\n\n"
					"	LONG\n"
					"main(VOID)\n"
					"{\n"
					"\n"
					"	if(! %s_init(VOID))\n"
					"	{\n"
					"		%s_close(VOID);\n"
					"		return(1L);\n"
					"	}\n\n",
					(gads ? "APTR gl = NULL;" : ""),
					(gads ? 10 : 32),
					&id[0],
					&id[0],
					&id[0],
					(pwin->Flags & SUPER_BITMAP ? "VOID " : ""),
					(pwin->Flags & SUPER_BITMAP ? &id[0] : ""),
					(pwin->Flags & SUPER_BITMAP ? "_init_bitmap(struct BitMap*);" : ""),
					&id[0],
					&id[0]) == -1L)
		{
			return EDITOR_ERROR_WRITE_FAILED;
		}


		if (tl->tl_BorderTemplates && fprintf(fh,
											  "	IDisplayBorders(ri, win, &%s_border_data[0], 0, 0);\n",
											  &id[0]) == -1L)
		{
			return EDITOR_ERROR_WRITE_FAILED;
		}

		if (tl->tl_TextTemplates && fprintf(fh,
											"	IDisplayTexts(ri, win,&%s_text_data[0], 0, 0, NULL);\n",
											&id[0]) == -1L)
		{
			return EDITOR_ERROR_WRITE_FAILED;
		}

		if (gads && fprintf(fh,
							"	IDisplayGadgets(win,gl);\n"
			)== -1L)
		{
			return EDITOR_ERROR_WRITE_FAILED;
		}

		if (fprintf(fh,
					"\n"
					"	%s_action(VOID);\n\n"
					"	%s_close(VOID);\n\n"
					"	return(0L);\n"
					"}\n\n",
					&id[0],
					&id[0]) == -1L)
		{
			return EDITOR_ERROR_WRITE_FAILED;
		}

		if (fprintf(fh,
					"BOOL %s_init(VOID)\n"
					"{\n"
					"	if (!(IntuiSupBase = (struct Library*)OpenLibrary(IntuiSupName,IntuiSupVersion)) )\n"
					"		return FALSE;\n"
					"\n"
					"	if (!(ri = IGetRenderInfo(NULL, RENDER_INFO_FLAGS)) )\n"
					"		return FALSE;\n"
					"\n"
					"%s%s%c%c"
					"	if (!(win = IOpenWindow(ri, &%s_new_window,OPEN_WINDOW_FLAGS)) )\n"
					"		return FALSE;\n"
					"\n",
					&id[0],
					(pwin->Flags & SUPER_BITMAP ? &id[0] : ""),
					(pwin->Flags & SUPER_BITMAP ? "_init_bitmap(&bitmap);" : ""),
					(pwin->Flags & SUPER_BITMAP ? 10 : 32),
					(pwin->Flags & SUPER_BITMAP ? 10 : 32),
					&id[0]) == -1L)
		{
			return EDITOR_ERROR_WRITE_FAILED;
		}


		if (gads && fprintf(fh,
							"	if (!(gl = ICreateGadgets(ri,&%s_gadget_data[0], 0, 0, NULL)) )\n"
							"		return FALSE;\n"
							"\n",
							&id[0]) == -1L)
		{
			return EDITOR_ERROR_WRITE_FAILED;
		}


		if (fprintf(fh,
					"	return TRUE;\n"
					"}\n"
					"\n"
					"	VOID\n"
					"%s_close(VOID)\n"
					"{\n"
					"	if(gl) IRemoveGadgets(gl);\n"
					"	if(gl) IFreeGadgets(gl);\n"
					"	if(win) ICloseWindow(win, FALSE);\n"
					"	if(ri) IFreeRenderInfo(ri);\n"
					"	if(IntuiSupBase) CloseLibrary(IntuiSupBase);\n"
					"}\n",
					&id[0],
					&id[0],
					&id[0]) == -1L)
		{
			return EDITOR_ERROR_WRITE_FAILED;
		}

		if (fprintf(fh,
					"\n	VOID\n"
					"%s_action(VOID)\n"
					"{\n"
					"	BOOL keepon = TRUE;\n\n"
					"	do {\n"
					"		struct IntuiMessage  *msg;\n\n"
					"		WaitPort(win->UserPort);\n"
					"		while (msg = IGetMsg(win->UserPort)) {\n"
					"			ULONG		Class=msg->Class;\n"
					"			USHORT	Code=msg->Code;\n"
					"			LONG		IAddress=(LONG)msg->IAddress;\n\n"
					"			IReplyMsg(msg);\n\n"
					"			switch(Class)\n"
					"			{\n"
					"				case CLOSEWINDOW:\n"
					"					keepon = FALSE;\n"
					"					break;\n\n"
					"%s",
					&id[0],
					(pwin->Flags & RMBTRAP ? "" :
					 "				case MENUPICK:\n"
					 "					printf(\"MENUPICK: \");\n"
					 "					break;\n\n")
			)== -1L)
		{
			return EDITOR_ERROR_WRITE_FAILED;
		}

		if (gads)
		{
			if (fprintf(fh,
						"				case ISUP_ID:\n"
						"					switch(Code)\n"
						"					{\n"
				)== -1L)
			{
				return EDITOR_ERROR_WRITE_FAILED;
			}

			upper_string(&tl->tl_ProjectID[0], &id[0]);
			for (count = 0, tp = get_head((struct List *) & tl->tl_Templates); tp && status == EDITOR_STATUS_NORMAL; tp = get_succ(&tp->tp_Node))
			{
				if (TEMPLATE_GROUP(tp) == TEMPLATE_GROUP_GADGET)
				{
					BYTE name[MAX_TEMPLATE_NAME_LEN + 1];
					struct GadgetData *gd = &tp->tp_Data.tp_GadgetData;

					upper_string(&tp->tp_TemplateName[0], &name[0]);

					switch (gd->gd_Type)
					{
					case GADGET_DATA_TYPE_STRING:
						if (fprintf(fh,
									"						case	%s_GADGET_%s:\n"
									"							printf(\"%s_GADGET_%s: %s\\n\",IAddress);\n"
									"							break;\n\n",
									&id[0],
									&name[0],
									&id[0],
									&name[0],
									"%s") == -1L)
						{
							return EDITOR_ERROR_WRITE_FAILED;
						}
						break;

					default:
						if (fprintf(fh,
									"						case	%s_GADGET_%s:\n"
									"							printf(\"%s_GADGET_%s: %s\\n\",IAddress);\n"
									"							break;\n\n",
									&id[0],
									&name[0],
									&id[0],
									&name[0],
									"%ld") == -1L)
						{
							return EDITOR_ERROR_WRITE_FAILED;
						}
					}

					count++;
				}
			}

			if (fprintf(fh,
						"					}\n"
				)== -1L)
			{
				return EDITOR_ERROR_WRITE_FAILED;
			}

			lower_string(&tl->tl_ProjectID[0], &id[0]);
		}

		if (fprintf(fh,
					"			}\n"
					"		}\n"
					"	} while (keepon == TRUE);\n"
					"}\n"
			)== -1L)
		{
			return EDITOR_ERROR_WRITE_FAILED;
		}
	}

	return (status);
}
