/*************************************************************************/
/*                                                                       */
/*   Includes                                                            */
/*                                                                       */
/*************************************************************************/

#include "NewGui_Includes.h"
#include "DatGUI.h"
#include "list.h"
#include "AMLOCALE.h"
#include <string.h>

/*************************************************************************/
/*                                                                       */
/*   Variables and Structures                                            */
/*                                                                       */
/*************************************************************************/

struct Remember *rem_key3=NULL;
typedef struct {
                  lst_node link;
                  char type[80];
                  char prog[255];
} dtprogs;

struct List lista_tipi;
lst_list *tmplst;
ULONG lcode;
extern struct     LocaleInfo locale;

extern struct FileRequester *FileVis;
extern struct TagItem MyTagsVis[];

extern struct IntuitionBase   *IntuitionBase;
extern struct GfxBase         *GfxBase;

extern struct Library *GadToolsBase ;
extern struct Library *AslBase      ;
extern struct Library *DataTypesBase;

/*************************************************************************/
/*                                                                       */
/*   Defines                                                             */
/*                                                                       */
/*************************************************************************/

#define getstring(x) (((struct StringInfo *)x->SpecialInfo)->Buffer)

#define RASTERX (GfxBase->DefaultFont->tf_XSize)
#define RASTERY (GfxBase->DefaultFont->tf_YSize/2+4)

#define XSIZE(x)  ((x)*RASTERX)
#define YSIZE(x)  ((x)*RASTERY)

#define XPOS(x)   (XSIZE(x)+customscreen->WBorLeft)
#define YPOS(x)   (YSIZE(x)+customscreen->BarHeight+1)

#define ERROR_NO_WINDOW_OPENED      1001L
#define ERROR_NO_PUBSCREEN_LOCKED   1002L
#define ERROR_NO_GADGETS_CREATED    1003L
#define ERROR_NO_VISUALINFO         1004L
#define ERROR_NO_PICTURE_LOADED     1005L
#define ERROR_NO_GADGETLIST_CREATED 1006L
#define ERROR_NO_WINDOW_MENU        1007L
#define ERROR_SCREEN_TOO_SMALL      1008L
#define ERROR_LIST_NOT_INITIALIZED  1009L
struct DT_PrefsData
	{
	BOOL    gd_Disabled_ListType;
	struct List *gd_Labels_ListType;
	UWORD   gd_Selected_ListType;
	UWORD   gd_Top_ListType;
	BOOL    gd_Disabled_ProgDat;
	char    gd_String_ProgDat[64];
	BOOL    gd_Disabled_ProgButton;
	BOOL    gd_Disabled_Gadget7;
	char    gd_Text_Gadget7[256];
	BOOL    gd_Disabled_Gadget9;
	char    gd_Text_Gadget9[256];
	BOOL    gd_Disabled_Gadget10;
	char    gd_Text_Gadget10[256];
	BOOL    gd_Disabled_OKDAT;
	BOOL    gd_Disabled_ANNDAT;
	BOOL    gd_Disabled_DelBut;
	};


/*************************************************************************/
/*                                                                       */
/*   Routines to handle gadgets                                          */
/*                                                                       */
/*************************************************************************/


int HandleGadgetsDT_Prefs(struct Window *win,struct Gadget *wingads[],ULONG gadgetid,ULONG messagecode,struct DT_PrefsData *gadgetdata,lst_list *userdata)
{
      int s=0;
	switch(gadgetid)
		{
		case ListType_ID:
			ListTypeClicked(win,wingads,gadgetid,messagecode,userdata);
			break;
		case ProgDat_ID:
			ProgDatClicked(win,wingads,gadgetid,messagecode,userdata);
			break;
		case ProgButton_ID:
			ProgButtonClicked(win,wingads,gadgetid,messagecode,userdata);
			break;
		case OKDAT_ID:
			OKDATClicked(win,wingads,gadgetid,messagecode,userdata);
                  SaveTypesList(userdata);
                  s=1;
			break;
		case ANNDAT_ID:
//			ANNDATClicked(win,wingads,gadgetid,messagecode,userdata);
                  s=1;
			break;
		case DelBut_ID:
			DelButClicked(win,wingads,gadgetid,messagecode,userdata);
                  SaveTypesList(userdata);
			break;
		}
    return s;
}


/*************************************************************************/
/*                                                                       */
/*   Routines to create gadgets                                          */
/*                                                                       */
/*************************************************************************/

struct Gadget *CreateGadgetsDT_Prefs(struct Gadget **gadgetlist,struct NewGadget newgad[],struct Gadget *wingads[],struct DT_PrefsData *gadgetdata)
{
	struct Gadget *gadget=CreateContext(gadgetlist);
	if (gadget)
		{
		wingads[ListType_ID]=gadget=CreateGadget(LISTVIEW_KIND,gadget,&newgad[ListType_ID],GA_Disabled,gadgetdata->gd_Disabled_ListType,GTLV_Labels,gadgetdata->gd_Labels_ListType,GTLV_ReadOnly,FALSE,GTLV_Selected,gadgetdata->gd_Selected_ListType,GTLV_ShowSelected,NULL,GTLV_Top,gadgetdata->gd_Top_ListType,LAYOUTA_Spacing,0,TAG_END);
		wingads[ProgDat_ID]=gadget=CreateGadget(STRING_KIND,gadget,&newgad[ProgDat_ID],GA_Disabled,gadgetdata->gd_Disabled_ProgDat,GA_TabCycle,TRUE,GTST_MaxChars,64,GTST_String,gadgetdata->gd_String_ProgDat,GA_TabCycle,TRUE,STRINGA_ExitHelp,TRUE,STRINGA_Justification,GACT_STRINGLEFT,STRINGA_ReplaceMode,FALSE,TAG_END);
		wingads[ProgButton_ID]=gadget=CreateGadget(BUTTON_KIND,gadget,&newgad[ProgButton_ID],GA_Disabled,gadgetdata->gd_Disabled_ProgButton,GT_Underscore,'_',TAG_END);
		wingads[TXID_Gadget7]=gadget=CreateGadget(TEXT_KIND,gadget,&newgad[TXID_Gadget7],GA_Disabled,gadgetdata->gd_Disabled_Gadget7,GTTX_Border,FALSE,GTTX_CopyText,TRUE,GTTX_Text,gadgetdata->gd_Text_Gadget7,TAG_END);
		wingads[TXID_Gadget9]=gadget=CreateGadget(TEXT_KIND,gadget,&newgad[TXID_Gadget9],GA_Disabled,gadgetdata->gd_Disabled_Gadget9,GTTX_Border,FALSE,GTTX_CopyText,TRUE,GTTX_Text,gadgetdata->gd_Text_Gadget9,TAG_END);
		wingads[TXID_Gadget10]=gadget=CreateGadget(TEXT_KIND,gadget,&newgad[TXID_Gadget10],GA_Disabled,gadgetdata->gd_Disabled_Gadget10,GTTX_Border,FALSE,GTTX_CopyText,TRUE,GTTX_Text,gadgetdata->gd_Text_Gadget10,TAG_END);
		wingads[OKDAT_ID]=gadget=CreateGadget(BUTTON_KIND,gadget,&newgad[OKDAT_ID],GA_Disabled,gadgetdata->gd_Disabled_OKDAT,GT_Underscore,'_',TAG_END);
		wingads[ANNDAT_ID]=gadget=CreateGadget(BUTTON_KIND,gadget,&newgad[ANNDAT_ID],GA_Disabled,gadgetdata->gd_Disabled_ANNDAT,GT_Underscore,'_',TAG_END);
		wingads[DelBut_ID]=gadget=CreateGadget(BUTTON_KIND,gadget,&newgad[DelBut_ID],GA_Disabled,gadgetdata->gd_Disabled_DelBut,GT_Underscore,'_',TAG_END);
		return gadget;
		}
	else return NULL;
}


/*************************************************************************/
/*                                                                       */
/*   Routines to handle windows                                          */
/*                                                                       */
/*************************************************************************/


void HandleDT_Prefs(struct Screen *customscreen,LONG left,LONG top,lst_list *userdata)
{
	APTR visualinfo;
	visualinfo=GetVisualInfo(customscreen,TAG_DONE);
	if (visualinfo)
		{
		struct Gadget  *gadgetlist = NULL;
		ULONG height=16,width=66,maxheight=1024,maxwidth=1280;
		ULONG bevelcount  = 1;

		struct Gadget *wingads[9];

		char * title                  = "Datatypes Prefs";
		struct Window     *win        = NULL;

		struct TextAttr   textattr;

		struct NewGadget  newgad[]    = {
													 0,0,0,0,NULL,NULL,ListType_ID,PLACETEXT_ABOVE,NULL,NULL,
													 0,0,0,0,NULL,NULL,ProgDat_ID,PLACETEXT_LEFT,NULL,NULL,
													 0,0,0,0,"«",NULL,ProgButton_ID,PLACETEXT_IN,NULL,NULL,
													 0,0,0,0,NULL,NULL,TXID_Gadget7,PLACETEXT_LEFT,NULL,NULL,
													 0,0,0,0,NULL,NULL,TXID_Gadget9,PLACETEXT_LEFT,NULL,NULL,
													 0,0,0,0,NULL,NULL,TXID_Gadget10,PLACETEXT_LEFT,NULL,NULL,
													 0,0,0,0,"OK",NULL,OKDAT_ID,PLACETEXT_IN,NULL,NULL,
													 0,0,0,0,"Cancel",NULL,ANNDAT_ID,PLACETEXT_IN,NULL,NULL,
													 0,0,0,0,"Delete",NULL,DelBut_ID,PLACETEXT_IN,NULL,NULL,
												  };


		struct DT_PrefsData gadgetdata = {
													 /* belongs to a listview gadget */
													 TRUE,
													 (struct List *)~0,
													 0,
													 0,
													 /* belongs to a string gadget */
													 TRUE,
													 "",
													 /* belongs to a button */
													 TRUE,
													 /* belongs to a text gadget */
													 FALSE,
													 "AmyTree",
													 /* belongs to a text gadget */
													 FALSE,
													 "Copyright 1997",
													 /* belongs to a text gadget */
													 FALSE,
													 "Antonio Cervo",
													 /* belongs to a button */
													 TRUE,
													 /* belongs to a button */
													 FALSE,
													 /* belongs to a button */
													 TRUE,
												  };


		struct BevelFrame bevels[]    = {
													 0,0,0,0,"CervoSoft",2,
												  };


		textattr.ta_Name =GfxBase->DefaultFont->tf_Message.mn_Node.ln_Name;
		textattr.ta_YSize=GfxBase->DefaultFont->tf_YSize;
		textattr.ta_Style=FS_NORMAL;
		textattr.ta_Flags=FPF_DISKFONT;

		newgad[ 0].ng_LeftEdge  =XPOS(3);
		newgad[ 0].ng_TopEdge   =YPOS(1);
		newgad[ 0].ng_Width     =XSIZE(28);
		newgad[ 0].ng_Height    =YSIZE(12);
		newgad[ 0].ng_TextAttr  =&textattr;
		newgad[ 0].ng_VisualInfo=visualinfo;
		newgad[ 1].ng_LeftEdge  =XPOS(32);
		newgad[ 1].ng_TopEdge   =YPOS(10);
		newgad[ 1].ng_Width     =XSIZE(26);
		newgad[ 1].ng_Height    =YSIZE(2);
		newgad[ 1].ng_TextAttr  =&textattr;
		newgad[ 1].ng_VisualInfo=visualinfo;
		newgad[ 2].ng_LeftEdge  =XPOS(58);
		newgad[ 2].ng_TopEdge   =YPOS(10);
		newgad[ 2].ng_Width     =XSIZE(4);
		newgad[ 2].ng_Height    =YSIZE(2);
		newgad[ 2].ng_TextAttr  =&textattr;
		newgad[ 2].ng_VisualInfo=visualinfo;
		newgad[ 3].ng_LeftEdge  =XPOS(43);
		newgad[ 3].ng_TopEdge   =YPOS(2);
		newgad[ 3].ng_Width     =XSIZE(7);
		newgad[ 3].ng_Height    =YSIZE(2);
		newgad[ 3].ng_TextAttr  =&textattr;
		newgad[ 3].ng_VisualInfo=visualinfo;
		newgad[ 4].ng_LeftEdge  =XPOS(40);
		newgad[ 4].ng_TopEdge   =YPOS(3);
		newgad[ 4].ng_Width     =XSIZE(14);
		newgad[ 4].ng_Height    =YSIZE(2);
		newgad[ 4].ng_TextAttr  =&textattr;
		newgad[ 4].ng_VisualInfo=visualinfo;
		newgad[ 5].ng_LeftEdge  =XPOS(40);
		newgad[ 5].ng_TopEdge   =YPOS(4);
		newgad[ 5].ng_Width     =XSIZE(15);
		newgad[ 5].ng_Height    =YSIZE(2);
		newgad[ 5].ng_TextAttr  =&textattr;
		newgad[ 5].ng_VisualInfo=visualinfo;
		newgad[ 6].ng_LeftEdge  =XPOS(3);
		newgad[ 6].ng_TopEdge   =YPOS(13);
		newgad[ 6].ng_Width     =XSIZE(17);
		newgad[ 6].ng_Height    =YSIZE(2);
		newgad[ 6].ng_TextAttr  =&textattr;
		newgad[ 6].ng_VisualInfo=visualinfo;
		newgad[ 7].ng_LeftEdge  =XPOS(45);
		newgad[ 7].ng_TopEdge   =YPOS(13);
		newgad[ 7].ng_Width     =XSIZE(17);
		newgad[ 7].ng_Height    =YSIZE(2);
		newgad[ 7].ng_TextAttr  =&textattr;
		newgad[ 7].ng_VisualInfo=visualinfo;
		newgad[ 8].ng_LeftEdge  =XPOS(40);
		newgad[ 8].ng_TopEdge   =YPOS(7);
		newgad[ 8].ng_Width     =XSIZE(16);
		newgad[ 8].ng_Height    =YSIZE(2);
		newgad[ 8].ng_TextAttr  =&textattr;
		newgad[ 8].ng_VisualInfo=visualinfo;

		bevels[ 0].bb_LeftEdge=XPOS(32);
		bevels[ 0].bb_TopEdge =YPOS(1);
		bevels[ 0].bb_Width   =XSIZE(30);
		bevels[ 0].bb_Height  =YSIZE(5);



		height= YSIZE(height);
		width = XSIZE(width) ;
		if (left == -1) left  = (customscreen->Width-width)/2;
		if (top  == -1) top   = (customscreen->Height-height)/2;

		if (CreateGadgetsDT_Prefs(&gadgetlist,newgad,wingads,&gadgetdata) != NULL)
			{
			if (height>customscreen->Height || width>customscreen->Width) GUIC_ErrorReport(NULL,ERROR_SCREEN_TOO_SMALL);
			win=OpenWindowTags(NULL,WA_Activate,         TRUE,
											WA_CloseGadget,      TRUE,
											WA_DepthGadget,      TRUE,
											WA_SizeGadget,       TRUE,
											WA_DragBar,          TRUE,
											WA_Gadgets,          gadgetlist,
											WA_InnerHeight,      height,
											WA_InnerWidth,       width,
											WA_IDCMP,            IDCMP_CLOSEWINDOW|IDCMP_NEWSIZE|IDCMP_VANILLAKEY|IDCMP_REFRESHWINDOW|IDCMP_GADGETUP|BUTTONIDCMP|STRINGIDCMP|LISTVIEWIDCMP,
											WA_Left,             left,
											WA_Top,              top,
											WA_MaxHeight,        maxheight,
											WA_MinHeight,        height,
											WA_MaxWidth,         maxwidth,
											WA_MinWidth,         width,
											WA_SizeBRight,       FALSE,
											WA_SizeBBottom,      TRUE,
											WA_SmartRefresh,     TRUE,
											WA_CustomScreen,     customscreen,
											WA_Title,            title,
											WA_NewLookMenus,     TRUE,
											TAG_END);
			if (win)
				{
							struct IntuiMessage  *imessage   = NULL;
							struct Gadget        *idcmpgad   = NULL;
							struct NewGadget     ngcopy[9];
							struct BevelFrame    bbcopy[1];
							long   double        xscale      = 1.0;
							long   double        yscale      = 1.0;
							char * stringpointer             = NULL;
							ULONG                i           = 0;
							ULONG                gadgetcount = 9;
							ULONG  idcmpclass                = 0;
							UWORD  messagecode               = 0;
							BOOL   running                   = TRUE;
							ULONG  signal                    = 0;
							ULONG  longpointer1              = 0;
							ULONG  longpointer2              = 0;

							CopyMem(newgad,ngcopy,sizeof(ngcopy));
							CopyMem(bevels,bbcopy,sizeof(bbcopy));

							SetFont(win->RPort,GfxBase->DefaultFont);
							CreateBevelFrames(win,visualinfo,bevelcount,bevels);

                                          DrawBevelBox(win->RPort,
                                                       win->BorderLeft,
                                                       win->BorderTop,win->Width-win->BorderRight-win->BorderLeft,
                                                       win->Height-win->BorderBottom-win->BorderTop,
                                                       GT_VisualInfo, visualinfo,
                                                       TAG_DONE);

							GT_RefreshWindow(win,NULL);

							/* User-Setup */
							UserSetupDT_Prefs(win,wingads,userdata);
							do
								{
								WindowLimits(win,width+win->BorderLeft+win->BorderRight,height+win->BorderTop+win->BorderBottom,maxwidth,maxheight);
								if (running) signal=Wait(SIGBREAKF_CTRL_C | 1L << win->UserPort->mp_SigBit);
								if (signal & SIGBREAKF_CTRL_C) running=FALSE;
								WindowLimits(win,win->Width,win->Height,win->Width,win->Height);
								while (running && (imessage=GT_GetIMsg(win->UserPort)))
									{
									idcmpgad=(struct Gadget *)imessage->IAddress;
									idcmpclass=imessage->Class;
									messagecode =imessage->Code;

									GT_ReplyIMsg(imessage);

									switch(idcmpclass)
										{
										case IDCMP_REFRESHWINDOW:
											GT_BeginRefresh(win);
                                                                  DrawBevelBox(win->RPort,
                                                                               win->BorderLeft,
                                                                               win->BorderTop,win->Width-win->BorderRight-win->BorderLeft,
                                                                               win->Height-win->BorderBottom-win->BorderTop,
                                                                               GT_VisualInfo, visualinfo,
                                                                               TAG_DONE);
											GT_EndRefresh(win,TRUE);
											break;
										case IDCMP_NEWSIZE:
											GT_GetGadgetAttrs(wingads[ListType_ID],win,NULL,GA_Disabled,&longpointer1,GTLV_Labels,&longpointer2,TAG_END);
											gadgetdata.gd_Disabled_ListType=(longpointer1 == 0)?FALSE:TRUE;
											gadgetdata.gd_Labels_ListType=(struct List *)longpointer2;
											GT_GetGadgetAttrs(wingads[ListType_ID],win,NULL,GTLV_Top,&longpointer1,GTLV_Selected,&longpointer2,TAG_END);
											gadgetdata.gd_Top_ListType=longpointer1;
											gadgetdata.gd_Selected_ListType=longpointer2;
											GT_GetGadgetAttrs(wingads[ProgDat_ID],win,NULL,GA_Disabled,&longpointer1,GTST_String,&stringpointer,TAG_END);
											gadgetdata.gd_Disabled_ProgDat=(longpointer1 == 0)?FALSE:TRUE;
											strcpy(gadgetdata.gd_String_ProgDat,stringpointer);
											GT_GetGadgetAttrs(wingads[ProgButton_ID],win,NULL,GA_Disabled,&longpointer1,TAG_END);
											gadgetdata.gd_Disabled_ProgButton=(longpointer1 == 0)?FALSE:TRUE;
											GT_GetGadgetAttrs(wingads[TXID_Gadget7],win,NULL,GA_Disabled,&longpointer1,GTTX_Text,&stringpointer,TAG_END);
											gadgetdata.gd_Disabled_Gadget7=(longpointer1 == 0)?FALSE:TRUE;
											strcpy(gadgetdata.gd_Text_Gadget7,stringpointer);
											GT_GetGadgetAttrs(wingads[TXID_Gadget9],win,NULL,GA_Disabled,&longpointer1,GTTX_Text,&stringpointer,TAG_END);
											gadgetdata.gd_Disabled_Gadget9=(longpointer1 == 0)?FALSE:TRUE;
											strcpy(gadgetdata.gd_Text_Gadget9,stringpointer);
											GT_GetGadgetAttrs(wingads[TXID_Gadget10],win,NULL,GA_Disabled,&longpointer1,GTTX_Text,&stringpointer,TAG_END);
											gadgetdata.gd_Disabled_Gadget10=(longpointer1 == 0)?FALSE:TRUE;
											strcpy(gadgetdata.gd_Text_Gadget10,stringpointer);
											GT_GetGadgetAttrs(wingads[OKDAT_ID],win,NULL,GA_Disabled,&longpointer1,TAG_END);
											gadgetdata.gd_Disabled_OKDAT=(longpointer1 == 0)?FALSE:TRUE;
											GT_GetGadgetAttrs(wingads[ANNDAT_ID],win,NULL,GA_Disabled,&longpointer1,TAG_END);
											gadgetdata.gd_Disabled_ANNDAT=(longpointer1 == 0)?FALSE:TRUE;
											GT_GetGadgetAttrs(wingads[DelBut_ID],win,NULL,GA_Disabled,&longpointer1,TAG_END);
											gadgetdata.gd_Disabled_DelBut=(longpointer1 == 0)?FALSE:TRUE;

											RemoveGList(win,gadgetlist,-1);
											SetAPen(win->RPort,0L);
											RectFill(win->RPort,win->BorderLeft,win->BorderTop,win->Width-win->BorderRight-1,win->Height-win->BorderBottom-1);
											RefreshWindowFrame(win);

											xscale=(long double)win->Width /(long double)(width+win->BorderLeft+win->BorderRight);
											yscale=(long double)win->Height/(long double)(height+win->BorderTop+win->BorderBottom);
											for (i=0;i<gadgetcount;i++)
												{
												ngcopy[i].ng_LeftEdge=(WORD)((long double)newgad[i].ng_LeftEdge*xscale);
												ngcopy[i].ng_TopEdge =(WORD)((long double)newgad[i].ng_TopEdge *yscale);
												ngcopy[i].ng_Width   =(WORD)((long double)newgad[i].ng_Width   *xscale);
												ngcopy[i].ng_Height  =(WORD)((long double)newgad[i].ng_Height  *yscale);
												}
											for (i=0;i<bevelcount;i++)
												{
												bbcopy[i].bb_LeftEdge=(WORD)((long double)bevels[i].bb_LeftEdge*xscale);
												bbcopy[i].bb_TopEdge =(WORD)((long double)bevels[i].bb_TopEdge *yscale);
												bbcopy[i].bb_Width   =(WORD)((long double)bevels[i].bb_Width   *xscale);
												bbcopy[i].bb_Height  =(WORD)((long double)bevels[i].bb_Height  *yscale);
												}

											FreeGadgets(gadgetlist);
											gadgetlist=NULL;

											CreateGadgetsDT_Prefs(&gadgetlist,ngcopy,wingads,&gadgetdata);
											AddGList(win,gadgetlist,-1,-1,NULL);
											RefreshGList(gadgetlist,win,NULL,-1);

                                                                  DrawBevelBox(win->RPort,
                                                                               win->BorderLeft,
                                                                               win->BorderTop,win->Width-win->BorderRight-win->BorderLeft,
                                                                               win->Height-win->BorderBottom-win->BorderTop,
                                                                               GT_VisualInfo, visualinfo,
                                                                               TAG_DONE);
                              
											GT_RefreshWindow(win,NULL);

											CreateBevelFrames(win,visualinfo,bevelcount,bbcopy);
											break;
										case IDCMP_VANILLAKEY:
											switch(messagecode)
												{
												case 27:
													running=FALSE;
													break;
												}
											break;
										case IDCMP_CLOSEWINDOW:
											running=FALSE;
											break;
										case IDCMP_GADGETUP:
										case MXIDCMP:
											if((HandleGadgetsDT_Prefs(win,wingads,idcmpgad->GadgetID,messagecode,&gadgetdata,userdata)))
                                                                     running=FALSE;
											break;
										}
									/* end-switch */
									}
								/* end-while */
								}
							while (running);
				if (win) CloseWindow(win);
				}
			else GUIC_ErrorReport(win,ERROR_NO_WINDOW_OPENED);
			if (gadgetlist) FreeGadgets(gadgetlist);
			}
		else GUIC_ErrorReport(NULL,ERROR_NO_GADGETS_CREATED);
		if (visualinfo) FreeVisualInfo(visualinfo);
		}
	else GUIC_ErrorReport(NULL,ERROR_NO_VISUALINFO);
   FreeRemember(&rem_key3,TRUE);
   DelListList(tmplst);
}

void UserSetupDT_Prefs(struct Window *win,struct Gadget *wingads[],lst_list *userdata)
{
   struct Node *nodo;
   dtprogs *nod, *tmpnod;

   NewList(&lista_tipi);
   tmplst=MakeList();   

   nod=HEAD(userdata,dtprogs);
   tmpnod=HEAD(tmplst,dtprogs);
   while(nod){
      nodo = (struct Node *)AllocRemember(&rem_key3,sizeof(struct Node),MEMF_CLEAR);
      nodo->ln_Name=(STRPTR)AllocRemember(&rem_key3,strlen(nod->type)+1,NULL);      
      strcpy(nodo->ln_Name,nod->type);
      AddTail(&lista_tipi,nodo);
      tmpnod=(dtprogs *)malloc(sizeof(dtprogs));
      strcpy(tmpnod->type,nod->type);
      strcpy(tmpnod->prog,nod->prog);
      ADDTAIL(tmplst,tmpnod);
      nod=SUCC(nod,dtprogs);
   }
   if(!ISEMPTY(userdata)){
      GT_SetGadgetAttrs(wingads[ListType_ID], win, NULL,
                       GA_Disabled, FALSE,
                       TAG_DONE);    
      GT_SetGadgetAttrs(wingads[ListType_ID],win,NULL,
                        GTLV_Labels, NULL,
                        TAG_DONE); 
      GT_SetGadgetAttrs(wingads[ListType_ID],win,NULL,
                        GTLV_Labels, ~0,
                        TAG_DONE);
      GT_SetGadgetAttrs(wingads[ListType_ID],win,NULL,
                        GTLV_Labels, &lista_tipi,
                        TAG_DONE);
   }
}

void ListTypeClicked(struct Window *win,struct Gadget *wingads[],ULONG gadgetid,ULONG messagecode,lst_list *userdata)
{
   dtprogs *nod;

   nod=HEAD(userdata,dtprogs);
   lcode=messagecode;
   for(;messagecode;messagecode--) nod=SUCC(nod,dtprogs);
   GT_SetGadgetAttrs(wingads[ProgDat_ID], win, NULL,
                     GA_Disabled, FALSE,
                     TAG_DONE);    
   GT_SetGadgetAttrs(wingads[ProgButton_ID], win, NULL,
                     GA_Disabled, FALSE,
                     TAG_DONE);    
   GT_SetGadgetAttrs(wingads[OKDAT_ID], win, NULL,
                     GA_Disabled, FALSE,
                     TAG_DONE);    
   GT_SetGadgetAttrs(wingads[DelBut_ID], win, NULL,
                     GA_Disabled, FALSE,
                     TAG_DONE);    
   GT_SetGadgetAttrs(wingads[ProgDat_ID],win,NULL,
                     GTST_String, nod->prog,
                     TAG_DONE);
}   

void ProgButtonClicked(struct Window *win,struct Gadget *wingads[],ULONG gadgetid,ULONG messagecode,lst_list *userdata)
{
  char buf[255];
  FileVis=AllocAslRequest(ASL_FileRequest,MyTagsVis);  
  if(AslRequest(FileVis,MyTagsVis)){
     int i;
     dtprogs *nod;
     strcpy(buf,FileVis->rf_Dir);
     AddPart(buf,FileVis->rf_File,255);
     nod=HEAD(tmplst,dtprogs);
     for(i=0;i<lcode;i++) nod=SUCC(nod,dtprogs);
     strcpy(nod->prog,buf);    
     GT_SetGadgetAttrs(wingads[ProgDat_ID], win, NULL,
                       GTST_String, buf,
                       TAG_DONE);
  }
  FreeFileRequest(FileVis);  
}

void ProgDatClicked(struct Window *win,struct Gadget *wingads[],ULONG gadgetid,ULONG messagecode,lst_list *userdata)
{
   int i;
   dtprogs *nod;
   nod=HEAD(tmplst,dtprogs);
   for(i=0;i<lcode;i++) nod=SUCC(nod,dtprogs);
   strcpy(nod->prog,getstring(wingads[ProgDat_ID]));
}    
   
void OKDATClicked(struct Window *win,struct Gadget *wingads[],ULONG gadgetid,ULONG messagecode,lst_list *userdata)
{
   dtprogs *nod, *tmpnod;      
   
   nod=HEAD(userdata,dtprogs);
   tmpnod=HEAD(tmplst,dtprogs);

   while(tmpnod){
      strcpy(nod->prog,tmpnod->prog);
      tmpnod=SUCC(tmpnod,dtprogs);
      nod=SUCC(nod,dtprogs);
   }
} 

void DelButClicked(struct Window *win,struct Gadget *wingads[],ULONG gadgetid,ULONG messagecode,lst_list *userdata)
{
    dtprogs *nod;
    int i;

    if(easyreq(GetString(&locale,MSG_SURE),GetString(&locale,MSG_YESNO))){
       nod=HEAD(userdata,dtprogs);
       for(i=0;i<lcode;i++) nod=SUCC(nod,dtprogs);
       free(REMNODE(userdata,nod,dtprogs));
       UserSetupDT_Prefs(win,wingads,userdata);
       GT_SetGadgetAttrs(wingads[ProgButton_ID], win, NULL,
                         GA_Disabled, TRUE,
                         TAG_DONE);    
       GT_SetGadgetAttrs(wingads[DelBut_ID], win, NULL,
                         GA_Disabled, TRUE,
                         TAG_DONE);    
       GT_SetGadgetAttrs(wingads[OKDAT_ID], win, NULL,
                         GA_Disabled, TRUE,
                         TAG_DONE);    
       GT_SetGadgetAttrs(wingads[ProgDat_ID], win, NULL,
                         GTST_String, NULL,
                         GA_Disabled, TRUE,
                         TAG_DONE);   
   }
}      
