/* $Revision Header *** Header built automatically - do not edit! ***********
 *
 *	(C) Copyright 1991 by Torsten Jürgeleit
 *
 *	Name .....: load.c
 *	Created ..: Sunday 22-Dec-91 21:22:44
 *	Revision .: 2
 *
 *	Date        Author                 Comment
 *	=========   ====================   ====================
 *	02-Oct-92   Michael Bjerking       New realese, better Screen/Window editor
 *	31-Dec-91   Torsten Jürgeleit      new font management
 *	22-Dec-91   Torsten Jürgeleit      Created this file!
 *
 ****************************************************************************
 *
 *	Load template files
 *
 * $Revision Header ********************************************************/

 /* Includes */

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

 /* Defines */

#define LOAD_FILE_READ_BUFFER_SIZE	2000
#define LOAD_FILE_LINE_BUFFER_SIZE	80
#define LOAD_FILE_FLAGS			(TEXT_FILE_FLAG_TRIM_LINE | TEXT_FILE_FLAG_SKIP_COMMENTS | TEXT_FILE_FLAG_SKIP_EMPTY_LINES | TEXT_FILE_FLAG_LINE_CONTINUATION)

#define BLOCK_TYPE_NONE		0
#define BLOCK_TYPE_HEADER	1
#define BLOCK_TYPE_FONT		2
#define BLOCK_TYPE_TEMPLATE	3
#define BLOCK_TYPE_BOX		4
#define BLOCK_TYPE_TEXTLIST	5
#define BLOCK_TYPE_BORDERDATA	6
#define BLOCK_TYPE_TEXTDATA	7
#define BLOCK_TYPE_GADGETDATA	8

#define HEADER_ITEM_TYPE_LEFTEDGE	1
#define HEADER_ITEM_TYPE_TOPEDGE		2
#define HEADER_ITEM_TYPE_WIDTH		3
#define HEADER_ITEM_TYPE_HEIGHT		4
#define HEADER_ITEM_TYPE_MINW			5
#define HEADER_ITEM_TYPE_MINH			6
#define HEADER_ITEM_TYPE_MAXW			7
#define HEADER_ITEM_TYPE_MAXH			8
#define HEADER_ITEM_TYPE_DETAILPEN	9
#define HEADER_ITEM_TYPE_BLOCKPEN	10
#define HEADER_ITEM_TYPE_FLAGS		11
#define HEADER_ITEM_TYPE_WINFLAGS	12
#define HEADER_ITEM_TYPE_IDCMPFLAGS	13
#define HEADER_ITEM_TYPE_ID			14
#define HEADER_ITEM_TYPE_NAME			15

#define FONT_ITEM_TYPE_NAME		1
#define FONT_ITEM_TYPE_YSIZE		2

#define TEMPLATE_ITEM_TYPE_NAME		1
#define TEMPLATE_ITEM_TYPE_TYPE		2
#define TEMPLATE_ITEM_TYPE_FLAGS	3

#define BOX_ITEM_TYPE_X1		1
#define BOX_ITEM_TYPE_Y1		2
#define BOX_ITEM_TYPE_X2		3
#define BOX_ITEM_TYPE_Y2		4

#define TEXTLIST_ITEM_TYPE_TEXT		1

#define BORDERDATA_ITEM_TYPE_TYPE	1

#define TEXTDATA_ITEM_TYPE_TYPE		1
#define TEXTDATA_ITEM_TYPE_FLAGS	2
#define TEXTDATA_ITEM_TYPE_TEXT		3
#define TEXTDATA_ITEM_TYPE_TEXTATTR	4

#define GADGETDATA_ITEM_TYPE_TYPE	1
#define GADGETDATA_ITEM_TYPE_FLAGS	2
#define GADGETDATA_ITEM_TYPE_TEXT	3
#define GADGETDATA_ITEM_TYPE_TEXTATTR	4
#define GADGETDATA_ITEM_TYPE_SPECIAL1	5
#define GADGETDATA_ITEM_TYPE_SPECIAL2	6
#define GADGETDATA_ITEM_TYPE_SPECIAL3	7

 /* Statics */

STATIC struct TemplateList new_template_list;
STATIC struct TemplateFont *new_font;
STATIC struct Template *new_template;

STATIC BYTE *block_keywords[]=
{
	"PROJECTHEADER",
	"FONT",
	"TEMPLATE",
	"BOX",
	"TEXTLIST",
	"BORDERDATA",
	"TEXTDATA",
	"GADGETDATA",
	NULL
};
STATIC BYTE *header_keywords[]=
{
	"LEFTEDGE",
	"TOPEDGE",
	"WIDTH",
	"HEIGHT",
	"MINW",
	"MINH",
	"MAXW",
	"MAXH",
	"DETAILPEN",
	"BLOCKPEN",
	"FLAGS",
	"WINFLAGS",
	"IDCMPFLAGS",
	"ID",
	"NAME",
	NULL
};
STATIC BYTE *font_keywords[]=
{
	"NAME",
	"YSIZE",
	NULL
};
STATIC BYTE *template_keywords[]=
{
	"NAME",
	"TYPE",
	"FLAGS",
	NULL
};
STATIC BYTE *box_keywords[]=
{
	"X1",
	"Y1",
	"X2",
	"Y2",
	NULL
};
STATIC BYTE *textlist_keywords[]=
{
	"TEXT",
	NULL
};
STATIC BYTE *borderdata_keywords[]=
{
	"TYPE",
	NULL
};
STATIC BYTE *textdata_keywords[]=
{
	"TYPE",
	"FLAGS",
	"TEXT",
	"TEXTATTR",
	NULL
};
STATIC BYTE *gadgetdata_keywords[]=
{
	"TYPE",
	"FLAGS",
	"TEXT",
	"TEXTATTR",
	"SPECIAL1",
	"SPECIAL2",
	"SPECIAL3",
	NULL
};
 /* Load project */

SHORT
load_project(USHORT mode)
{
	struct rtFileRequester *freq = project_file_requester;
	SHORT status = EDITOR_STATUS_NORMAL;
	BYTE filename[256], buf[256];		/* <- should define a constant */
	BYTE text[256];

	/* Display ReqTools file requester and check if user selected cancel */
	IChangeMousePointer(ewin, NULL, FALSE);
	if (mode == LOAD_MODE_NORMAL)
	{
		strcpy(text, PROJECT_LOAD_HAIL_TEXT);
	}
	else
	{
		strcpy(text, PROJECT_APPEND_HAIL_TEXT);
	}
	if (rtFileRequest(freq, filename, text, TAG_END))
	{
		struct TemplateList *new_tl = &new_template_list;
		struct FileData *fd;
		SHORT len = strlen(filename) - 4;

		/* Prepare file name and project name */
		if (len < 1 || strcmp(filename + len, ".tpl"))
		{
			strcat(filename, ".tpl");
			len += 4;
		}

		/* path + filename */
		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);
		}

		/* Open file */
		if (!(fd = IOpenTextFile(filename, LOAD_FILE_READ_BUFFER_SIZE,
								 LOAD_FILE_LINE_BUFFER_SIZE, LOAD_FILE_FLAGS)))
		{
			status = EDITOR_ERROR_OPEN_FAILED;
		}
		else
		{

			/* Init new template list */
			NewList((struct List *) & new_tl->tl_Fonts);
			NewList((struct List *) & new_tl->tl_Templates);
			new_tl->tl_BorderTemplates = 0;
			new_tl->tl_TextTemplates = 0;
			new_tl->tl_GadgetTemplates = 0;
			new_tl->tl_Flags = DEFAULT_TEMPLATE_LIST_FLAGS;

			/* Read all templates */
			while ((status = parse_block(fd, new_tl, BLOCK_TYPE_NONE,
										 mode)) == EDITOR_STATUS_NORMAL);
			/* Install and display new template list */
			if (status == EDITOR_STATUS_EOF)
			{
				struct TemplateList *tl = &template_list;
				struct TemplateFont *tf;
				struct Template *tp;
				struct List *list;

				/* First set normal status */
				status = EDITOR_STATUS_NORMAL;

				/* Remove unused template fonts from new template list */
				tf = get_head((struct List *) & new_tl->tl_Fonts);
				while (tf)
				{
					struct TemplateFont *next_tf = get_succ((struct Node *)
															& tf->tf_MinNode);
					if (!tf->tf_UseCount)
					{
						Remove((struct Node *) & tf->tf_MinNode);
						free_template_font(tf);
					}
					tf = next_tf;
				}
				if (mode == LOAD_MODE_NORMAL)
				{

					/* Overwrite old template list */
					if ((status = new_project(tl, new_tl->tl_Flags)) ==
						EDITOR_STATUS_NORMAL)
					{
						/* Copy template fonts from new to original template list */
						list = (struct List *) & new_tl->tl_Fonts;
						while (tf = (struct TemplateFont *) RemHead(list))
						{
							AddTail((struct List *) & tl->tl_Fonts,
									(struct Node *) & tf->tf_MinNode);
						}

						/* Copy templates from new to original template list */
						list = (struct List *) & new_tl->tl_Templates;
						while (tp = (struct Template *) RemHead(list))
						{
							add_template_to_list(tl, tp, FALSE);
							display_template(tp);
						}

						/* Copy template list data */
						tl->tl_Flags = new_tl->tl_Flags &
							~TEMPLATE_LIST_FLAG_CHANGED;
						strcpy(&tl->tl_ProjectID[0], &new_tl->tl_ProjectID[0]);
						change_project_name(tl, filename, len);
					}
				}
				else
				{

					/* Append new template list to old one */
					list = (struct List *) & new_tl->tl_Templates;
					while (tp = (struct Template *) RemHead(list))
					{
						struct TextAttr *old_ta, *new_ta;

						/* Open template font in original template list and close it in new one */
						switch (TEMPLATE_GROUP(tp))
						{
						case TEMPLATE_GROUP_TEXT:
							old_ta = tp->tp_Data.tp_TextData.td_TextAttr;
							if (!(new_ta = open_template_font_by_attributes(tl,
																			(BYTE *) old_ta->ta_Name, old_ta->ta_YSize)))
							{
								status = EDITOR_ERROR_INVALID_FONT;
							}
							else
							{
								tp->tp_Data.tp_TextData.td_TextAttr = new_ta;
								close_template_font(new_tl, old_ta);
							}
							break;

						case TEMPLATE_GROUP_GADGET:
							old_ta = tp->tp_Data.tp_GadgetData.gd_TextAttr;
							if (!(new_ta = open_template_font_by_attributes(tl,
																			(BYTE *) old_ta->ta_Name, old_ta->ta_YSize)))
							{
								status = EDITOR_ERROR_INVALID_FONT;
							}
							else
							{
								tp->tp_Data.tp_GadgetData.gd_TextAttr = new_ta;
								close_template_font(new_tl, old_ta);
							}
							break;
						}

						if (status != EDITOR_STATUS_NORMAL)
						{
							free_template(new_tl, tp);
						}
						else
						{

							/* Add template to original template list */
							if (tp->tp_Flags & TEMPLATE_FLAG_DEFAULT_NAME)
							{
								add_template_to_list(tl, tp, TRUE);
							}
							else
							{
								add_template_to_list(tl, tp, FALSE);
							}
							display_template(tp);
							tl->tl_Flags |= TEMPLATE_LIST_FLAG_CHANGED;
						}
					}
				}
				if (status == EDITOR_STATUS_NORMAL)
				{
					ISetGadgetAttributes(egl, EDITOR_GADGET_TEMPLATES, 0L, 0L,
										 USE_CURRENT_VALUE, USE_CURRENT_VALUE, &tl->tl_Templates);
				}
			}
			ICloseTextFile(fd);

			/* If error then free incomplete loaded template list */
			if (status != EDITOR_STATUS_NORMAL)
			{
				free_template_list(new_tl);
			}
		}
	}
	IRestoreMousePointer(ewin);
	if (status != EDITOR_STATUS_NORMAL)
	{
		show_error(status);
	}
	return (status);
}

 /* Parse block of load file */

STATIC SHORT
parse_block(struct FileData * fd, struct TemplateList * tl,
			USHORT block_type, USHORT mode)
{
	SHORT status = EDITOR_STATUS_NORMAL;

	if (block_type == BLOCK_TYPE_FONT)
	{
		struct TemplateFont *tf;

		if (!(tf = new_font = AllocMem((LONG) sizeof(struct TemplateFont),
									    (LONG) MEMF_PUBLIC | MEMF_CLEAR)))
		{
			status = EDITOR_ERROR_OUT_OF_MEM;
		}
		else
		{
			struct TextAttr *ta = &tf->tf_TextAttr;

			/* Init new template font */
			ta->ta_Style = FS_NORMAL;
			ta->ta_Flags = FPF_ROMFONT;
			tf->tf_UseCount = 0;
		}
	}
	else
	{
		if (block_type == BLOCK_TYPE_TEMPLATE)
		{
			struct Template *tp;

			if (!(tp = new_template = AllocMem((LONG) sizeof(struct Template),
											    (LONG) MEMF_PUBLIC | MEMF_CLEAR)))
			{
				status = EDITOR_ERROR_OUT_OF_MEM;
			}
			else
			{

				/* Init new template */
				NewList(&tp->tp_TextList);
				tp->tp_Node.ln_Name = &tp->tp_TemplateName[0];
			}
		}
	}
	if (status == EDITOR_STATUS_NORMAL)
	{

		/* Block loop */
		do
		{
			BYTE c, *keyword, *arg;

			switch (IReadTextLine(fd))
			{
			case TEXT_FILE_STATUS_NORMAL:

				/* Mark end of keyword */
				keyword = arg = fd->fd_Line;
				while ((c = *arg++) != ' ' && c != '=' && c != '\0');
				if (c == '\0')
				{
					status = EDITOR_ERROR_NO_ARGUMENT;
				}
				else
				{
					*(arg - 1) = '\0';

					/* Strip double quotes from string argument */
					if (*arg == '"')
					{
						arg++;
						*(arg + (strlen(arg) - 1)) = '\0';
					}

					/* Check keyword */
					if (!strcmp(keyword, "BEGIN"))
					{

						/* Begin new block */
						status = parse_block(fd, tl, search_keyword(arg,
																	&block_keywords[0]), mode);
					}
					else
					{
						if (!strcmp(keyword, "END"))
						{

							/* End current block */
							if (search_keyword(arg, &block_keywords[0]) !=
								block_type)
							{
								status = EDITOR_ERROR_END_WRONG_BLOCK;
							}
							else
							{
								status = EDITOR_STATUS_EOB;
							}
						}
						else
						{

							/* Parse item */
							status = parse_item(tl, block_type, keyword, arg,
												mode);
						}
					}
				}
				break;

			case TEXT_FILE_STATUS_EOF:
				status = EDITOR_STATUS_EOF;
				break;

			case TEXT_FILE_ERROR_LINE_TOO_LONG:
				status = EDITOR_ERROR_LINE_TOO_LONG;
				break;

			default:
				status = EDITOR_ERROR_READ_FAILED;
				break;
			}
		}
		while (status == EDITOR_STATUS_NORMAL);
		if (status != EDITOR_STATUS_EOB)
		{

			/* Free incomplete block */
			switch (block_type)
			{
			case BLOCK_TYPE_FONT:
				free_template_font(new_font);
				break;

			case BLOCK_TYPE_TEMPLATE:
				free_template(tl, new_template);
				break;

			case BLOCK_TYPE_TEXTLIST:
				free_template_text_list(new_template);
				break;
			}
		}
		else
		{
			if (block_type == BLOCK_TYPE_FONT)
			{
				AddTail((struct List *) & tl->tl_Fonts,
						(struct Node *) & new_font->tf_MinNode);
			}
			else
			{
				if (block_type == BLOCK_TYPE_TEMPLATE)
				{
					struct Template *tp;
					struct Box *box;
					struct BorderData *bd;
					struct TextData *td;
					struct GadgetData *gd;

					/* Init new template */
					tp = new_template;
					box = &tp->tp_Box;
					tp->tp_Node.ln_Name = &tp->tp_TemplateName[0];
					switch (TEMPLATE_GROUP(tp))
					{
					case TEMPLATE_GROUP_BORDER:

						/* Init border template */
						bd = &tp->tp_Data.tp_BorderData;
						bd->bd_LeftEdge = box->bo_X1;
						bd->bd_TopEdge = box->bo_Y1;
						bd->bd_Width = box->bo_X2 - box->bo_X1 + 1;
						bd->bd_Height = box->bo_Y2 - box->bo_Y1 + 1;
						(bd + 1)->bd_Type = INTUISUP_DATA_END;
						break;

					case TEMPLATE_GROUP_TEXT:

						/* Init text template */
						td = &tp->tp_Data.tp_TextData;
						td->td_LeftEdge = box->bo_X1;
						td->td_TopEdge = box->bo_Y1;
						(td + 1)->td_Type = INTUISUP_DATA_END;
						break;

					case TEMPLATE_GROUP_GADGET:

						/* Init gadget template */
						gd = &tp->tp_Data.tp_GadgetData;
						gd->gd_LeftEdge = box->bo_X1;
						gd->gd_TopEdge = box->bo_Y1;
						gd->gd_Width = box->bo_X2 - box->bo_X1 + 1;
						gd->gd_Height = box->bo_Y2 - box->bo_Y1 + 1;
						(gd + 1)->gd_Type = INTUISUP_DATA_END;
						break;
					}
					add_template_to_list(tl, tp, FALSE);
				}
			}
			status = EDITOR_STATUS_NORMAL;
		}
	}
	return (status);
}

 /* Parse block of load file */

STATIC SHORT
parse_item(struct TemplateList * tl, USHORT block_type, BYTE * keyword,
		   BYTE * arg, USHORT mode)
{
	struct TextAttr *ta;
	struct Template *tp;
	struct Box *box;
	struct BorderData *bd;
	struct TextData *td;
	struct GadgetData *gd;
	SHORT status = EDITOR_STATUS_NORMAL;

	switch (block_type)
	{
	case BLOCK_TYPE_HEADER:

		/* Read header data */
		if (mode == LOAD_MODE_NORMAL)
		{
			struct NewWindow *nwin = &project_new_window;

			switch (search_keyword(keyword, &header_keywords[0]))
			{
			case HEADER_ITEM_TYPE_LEFTEDGE:
				nwin->LeftEdge = atol(arg);
				break;

			case HEADER_ITEM_TYPE_TOPEDGE:
				nwin->TopEdge = atol(arg);
				break;

			case HEADER_ITEM_TYPE_WIDTH:
				nwin->Width = atol(arg);
				break;

			case HEADER_ITEM_TYPE_HEIGHT:
				nwin->Height = atol(arg);
				break;

			case HEADER_ITEM_TYPE_MINW:
				nwin->MinWidth = atol(arg);
				break;

			case HEADER_ITEM_TYPE_MINH:
				nwin->MinHeight = atol(arg);
				break;

			case HEADER_ITEM_TYPE_MAXW:
				nwin->MaxWidth = atol(arg);
				break;

			case HEADER_ITEM_TYPE_MAXH:
				nwin->MaxHeight = atol(arg);
				break;

			case HEADER_ITEM_TYPE_DETAILPEN:
				nwin->DetailPen = atol(arg);
				break;

			case HEADER_ITEM_TYPE_BLOCKPEN:
				nwin->BlockPen = atol(arg);
				break;

			case HEADER_ITEM_TYPE_FLAGS:
				tl->tl_Flags = atol(arg);
				break;

			case HEADER_ITEM_TYPE_WINFLAGS:
				nwin->Flags = atol(arg);
				break;

			case HEADER_ITEM_TYPE_IDCMPFLAGS:
				nwin->IDCMPFlags = atol(arg);
				break;

			case HEADER_ITEM_TYPE_ID:
				strcpy(&tl->tl_ProjectID[0], arg);
				break;

			case HEADER_ITEM_TYPE_NAME:
				strcpy(tl->tl_ProjectWinName, arg);
				break;
			}
		}
		break;

	case BLOCK_TYPE_FONT:

		/* Read template font data */
		ta = &new_font->tf_TextAttr;
		switch (search_keyword(keyword, &font_keywords[0]))
		{
		case FONT_ITEM_TYPE_NAME:
			status = duplicate_string(arg, (BYTE **) & ta->ta_Name);
			break;

		case FONT_ITEM_TYPE_YSIZE:
			ta->ta_YSize = atol(arg);
			break;
		}
		break;

	case BLOCK_TYPE_TEMPLATE:

		/* Read template data */
		tp = new_template;
		switch (search_keyword(keyword, &template_keywords[0]))
		{
		case TEMPLATE_ITEM_TYPE_NAME:
			strcpy(&tp->tp_TemplateName[0], arg);
			break;

		case TEMPLATE_ITEM_TYPE_TYPE:
			tp->tp_Type = atol(arg);
			break;

		case TEMPLATE_ITEM_TYPE_FLAGS:
			tp->tp_Flags = atol(arg);
			break;
		}
		break;

	case BLOCK_TYPE_BOX:

		/* Read box data */
		box = &new_template->tp_Box;
		switch (search_keyword(keyword, &box_keywords[0]))
		{
		case BOX_ITEM_TYPE_X1:
			box->bo_X1 = atol(arg);
			break;

		case BOX_ITEM_TYPE_Y1:
			box->bo_Y1 = atol(arg);
			break;

		case BOX_ITEM_TYPE_X2:
			box->bo_X2 = atol(arg);
			break;

		case BOX_ITEM_TYPE_Y2:
			box->bo_Y2 = atol(arg);
			break;
		}
		break;

	case BLOCK_TYPE_TEXTLIST:

		/* Read text list */
		switch (search_keyword(keyword, &textlist_keywords[0]))
		{
		case TEXTLIST_ITEM_TYPE_TEXT:
			status = add_template_text_list_entry(new_template, arg);
			break;
		}
		break;

	case BLOCK_TYPE_BORDERDATA:

		/* Read border data */
		bd = &new_template->tp_Data.tp_BorderData;
		switch (search_keyword(keyword, &borderdata_keywords[0]))
		{
		case BORDERDATA_ITEM_TYPE_TYPE:
			bd->bd_Type = atol(arg);
			break;
		}
		break;

	case BLOCK_TYPE_TEXTDATA:

		/* Read text data */
		td = &new_template->tp_Data.tp_TextData;
		switch (search_keyword(keyword, &textdata_keywords[0]))
		{
		case TEXTDATA_ITEM_TYPE_TYPE:
			td->td_Type = atol(arg);
			break;

		case TEXTDATA_ITEM_TYPE_FLAGS:
			td->td_Flags = atol(arg);
			break;

		case TEXTDATA_ITEM_TYPE_TEXT:
			if (td->td_Type == TEXT_DATA_TYPE_TEXT)
			{
				status = duplicate_string(arg, &td->td_Text);
			}
			else
			{
				td->td_Text = (BYTE *) atol(arg);
			}
			break;

		case TEXTDATA_ITEM_TYPE_TEXTATTR:
			if (!(td->td_TextAttr = open_template_font_by_num(tl,
															  (USHORT) atol(arg))))
			{
				status = EDITOR_ERROR_INVALID_FONT;
			}
			break;
		}
		break;

	case BLOCK_TYPE_GADGETDATA:

		/* Read gadget data */
		tp = new_template;
		gd = &tp->tp_Data.tp_GadgetData;
		switch (search_keyword(keyword, &gadgetdata_keywords[0]))
		{
		case GADGETDATA_ITEM_TYPE_TYPE:
			gd->gd_Type = atol(arg);
			break;

		case GADGETDATA_ITEM_TYPE_FLAGS:
			gd->gd_Flags = atol(arg);
			break;

		case GADGETDATA_ITEM_TYPE_TEXT:
			if (*arg == '0')
			{
				gd->gd_Text = NULL;
			}
			else
			{
				status = duplicate_string(arg, &gd->gd_Text);
			}
			break;

		case GADGETDATA_ITEM_TYPE_TEXTATTR:
			if (!(gd->gd_TextAttr = open_template_font_by_num(tl,
															  (USHORT) atol(arg))))
			{
				status = EDITOR_ERROR_INVALID_FONT;
			}
			break;

		case GADGETDATA_ITEM_TYPE_SPECIAL1:
			gd->gd_SpecialData.gd_Data.gd_Data1 = atol(arg);
			break;

		case GADGETDATA_ITEM_TYPE_SPECIAL2:
			gd->gd_SpecialData.gd_Data.gd_Data2 = atol(arg);
			break;

		case GADGETDATA_ITEM_TYPE_SPECIAL3:
			switch (gd->gd_Type)
			{
			case GADGET_DATA_TYPE_BUTTON:
			case GADGET_DATA_TYPE_CHECK:
			case GADGET_DATA_TYPE_INTEGER:
			case GADGET_DATA_TYPE_SLIDER:
			case GADGET_DATA_TYPE_SCROLLER:
			case GADGET_DATA_TYPE_COUNT:
			case GADGET_DATA_TYPE_PALETTE:
				gd->gd_SpecialData.gd_Data.gd_Data3 = (VOID *) atol(arg);
				break;
			case GADGET_DATA_TYPE_STRING:
				status = duplicate_string(arg,
										  (BYTE **) & gd->gd_SpecialData.gd_Data.gd_Data3);
				break;
			case GADGET_DATA_TYPE_MX:
			case GADGET_DATA_TYPE_CYCLE:
				status = build_template_text_array(tp);
				break;
			case GADGET_DATA_TYPE_LISTVIEW:
				gd->gd_SpecialData.gd_ListViewData.gd_ListViewList = &tp->tp_TextList;
				break;
			}
			break;
		}
		break;
	}
	return (status);
}

 /* Search keyword in given list */

STATIC USHORT
search_keyword(BYTE * keyword, BYTE ** keyword_list)
{
	BYTE *word;
	USHORT count = 0, num = 0;

	while (word = *keyword_list++)
	{
		count++;
		if (!strcmp(word, keyword))
		{
			num = count;
			break;
		}
	}
	return (num);
}
