#include "list.h"

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

#include "NewGUI_Includes.h"
#include "ExtGUI.h"

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

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

extern lst_list *ExtList;

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

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

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

#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 ExtWinData
	{
	BOOL    gd_Disabled_ListExt;
	struct List *gd_Labels_ListExt;
	UWORD   gd_Selected_ListExt;
	UWORD   gd_Top_ListExt;
	BOOL    gd_Disabled_StringExt;
	char    gd_String_StringExt[64];
	BOOL    gd_Disabled_AddExt;
	BOOL    gd_Disabled_DelExt;
	BOOL    gd_Disabled_ProgExt;
	char    gd_String_ProgExt[64];
	BOOL    gd_Disabled_ProgSel;
	};


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


void HandleGadgetsExtWin(struct Window *win,struct Gadget *wingads[],ULONG gadgetid,ULONG messagecode,struct ExtWinData *gadgetdata,lst_list *userdata)
{
	switch(gadgetid)
		{
		case ListExt_Gadget:
			ListExtClicked(win,wingads,gadgetid,messagecode,userdata);
			break;
		case StringExt_Gadget:
			StringExtClicked(win,wingads,gadgetid,messagecode,userdata);
			break;
		case AddExt_Gadget:
			AddExtClicked(win,wingads,gadgetid,messagecode,userdata);
			break;
		case DelExt_Gadget:
			DelExtClicked(win,wingads,gadgetid,messagecode,userdata);
			break;
		case ProgExt_Gadget5:
			ProgExtClicked(win,wingads,gadgetid,messagecode,userdata);
			break;
		case ProgSel_Gadget:
			ProgSelClicked(win,wingads,gadgetid,messagecode,userdata);
			break;
		};
}


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

struct Gadget *CreateGadgetsExtWin(struct Gadget **gadgetlist,struct NewGadget newgad[],struct Gadget *wingads[],struct ExtWinData *gadgetdata)
{
	struct Gadget *gadget=CreateContext(gadgetlist);
	if (gadget)
		{
		wingads[StringExt_Gadget]=gadget=CreateGadget(STRING_KIND,gadget,&newgad[StringExt_Gadget],GA_Disabled,gadgetdata->gd_Disabled_StringExt,GA_TabCycle,TRUE,GTST_MaxChars,64,GTST_String,gadgetdata->gd_String_StringExt,GA_TabCycle,TRUE,STRINGA_ExitHelp,TRUE,STRINGA_Justification,GACT_STRINGLEFT,STRINGA_ReplaceMode,FALSE,TAG_END);
		wingads[ListExt_Gadget]=gadget=CreateGadget(LISTVIEW_KIND,gadget,&newgad[ListExt_Gadget],GA_Disabled,gadgetdata->gd_Disabled_ListExt,GTLV_Labels,gadgetdata->gd_Labels_ListExt,GTLV_ReadOnly,FALSE,GTLV_Selected,gadgetdata->gd_Selected_ListExt,GTLV_ShowSelected,NULL,GTLV_Top,gadgetdata->gd_Top_ListExt,LAYOUTA_Spacing,0,TAG_END);
		wingads[AddExt_Gadget]=gadget=CreateGadget(BUTTON_KIND,gadget,&newgad[AddExt_Gadget],GA_Disabled,gadgetdata->gd_Disabled_AddExt,GT_Underscore,'_',TAG_END);
		wingads[DelExt_Gadget]=gadget=CreateGadget(BUTTON_KIND,gadget,&newgad[DelExt_Gadget],GA_Disabled,TRUE,GT_Underscore,'_',TAG_END);
		wingads[ProgExt_Gadget5]=gadget=CreateGadget(STRING_KIND,gadget,&newgad[ProgExt_Gadget5],GA_Disabled,TRUE,GA_TabCycle,TRUE,GTST_MaxChars,64,GTST_String,gadgetdata->gd_String_ProgExt,GA_TabCycle,TRUE,STRINGA_ExitHelp,TRUE,STRINGA_Justification,GACT_STRINGLEFT,STRINGA_ReplaceMode,FALSE,TAG_END);
		wingads[ProgSel_Gadget]=gadget=CreateGadget(BUTTON_KIND,gadget,&newgad[ProgSel_Gadget],GA_Disabled,gadgetdata->gd_Disabled_ProgSel,GT_Underscore,'_',TAG_END);
		wingads[LAID_Gadget10]=gadget=CreateGadget(TEXT_KIND,gadget,&newgad[LAID_Gadget10],GT_Underscore,'_',GTTX_Border,TRUE,TAG_END);
		return gadget;
		}
	else return NULL;
}


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


void HandleExtWin(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=80,maxheight=1024,maxwidth=1280;
		ULONG bevelcount  = 1;

		struct Gadget *wingads[7];

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

		struct TextAttr   textattr;

		struct NewGadget  newgad[]    = {
													 0,0,0,0,NULL,NULL,ListExt_Gadget,PLACETEXT_ABOVE,NULL,NULL,
													 0,0,0,0,NULL,NULL,StringExt_Gadget,PLACETEXT_LEFT,NULL,NULL,
													 0,0,0,0,"Add",NULL,AddExt_Gadget,PLACETEXT_IN,NULL,NULL,
													 0,0,0,0,"Del",NULL,DelExt_Gadget,PLACETEXT_IN,NULL,NULL,
													 0,0,0,0,NULL,NULL,ProgExt_Gadget5,PLACETEXT_LEFT,NULL,NULL,
													 0,0,0,0,"«",NULL,ProgSel_Gadget,PLACETEXT_IN,NULL,NULL,
													 0,0,0,0,"CervoSoft 1997",NULL,LAID_Gadget10,PLACETEXT_IN,NULL,NULL,
												  };


		struct ExtWinData gadgetdata = {
													 /* belongs to a listview gadget */
													 FALSE,
													 (struct List *)~0,
													 0,
													 0,
													 /* belongs to a string gadget */
													 FALSE,
													 "",
													 /* belongs to a button */
													 FALSE,
													 /* belongs to a button */
													 FALSE,
													 /* belongs to a string gadget */
													 FALSE,
													 "",
													 /* belongs to a button */
													 FALSE,
												  };


		struct BevelFrame bevels[]    = {
													 0,0,0,0,"Program",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(2);
		newgad[ 0].ng_TopEdge   =YPOS(1);
		newgad[ 0].ng_Width     =XSIZE(31);
		newgad[ 0].ng_Height    =YSIZE(11);
		newgad[ 0].ng_TextAttr  =&textattr;
		newgad[ 0].ng_VisualInfo=visualinfo;
		newgad[ 1].ng_LeftEdge  =XPOS(2);
		newgad[ 1].ng_TopEdge   =YPOS(12);
		newgad[ 1].ng_Width     =XSIZE(31);
		newgad[ 1].ng_Height    =YSIZE(2);
		newgad[ 1].ng_TextAttr  =&textattr;
		newgad[ 1].ng_VisualInfo=visualinfo;
		newgad[ 2].ng_LeftEdge  =XPOS(34);
		newgad[ 2].ng_TopEdge   =YPOS(1);
		newgad[ 2].ng_Width     =XSIZE(10);
		newgad[ 2].ng_Height    =YSIZE(2);
		newgad[ 2].ng_TextAttr  =&textattr;
		newgad[ 2].ng_VisualInfo=visualinfo;
		newgad[ 3].ng_LeftEdge  =XPOS(34);
		newgad[ 3].ng_TopEdge   =YPOS(4);
		newgad[ 3].ng_Width     =XSIZE(10);
		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(12);
		newgad[ 4].ng_Width     =XSIZE(32);
		newgad[ 4].ng_Height    =YSIZE(2);
		newgad[ 4].ng_TextAttr  =&textattr;
		newgad[ 4].ng_VisualInfo=visualinfo;
		newgad[ 5].ng_LeftEdge  =XPOS(72);
		newgad[ 5].ng_TopEdge   =YPOS(12);
		newgad[ 5].ng_Width     =XSIZE(4);
		newgad[ 5].ng_Height    =YSIZE(2);
		newgad[ 5].ng_TextAttr  =&textattr;
		newgad[ 5].ng_VisualInfo=visualinfo;
		newgad[ 6].ng_LeftEdge  =XPOS(48);
		newgad[ 6].ng_TopEdge   =YPOS(1);
		newgad[ 6].ng_Width     =XSIZE(28);
		newgad[ 6].ng_Height    =YSIZE(8);
		newgad[ 6].ng_TextAttr  =&textattr;
		newgad[ 6].ng_VisualInfo=visualinfo;

		bevels[ 0].bb_LeftEdge=XPOS(38);
		bevels[ 0].bb_TopEdge =YPOS(11);
		bevels[ 0].bb_Width   =XSIZE(40);
		bevels[ 0].bb_Height  =YSIZE(4);



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

		if (CreateGadgetsExtWin(&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[7];
							struct BevelFrame    bbcopy[1];
							long   double        xscale      = 1.0;
							long   double        yscale      = 1.0;
							char * stringpointer             = NULL;
							ULONG                i           = 0;
							ULONG                gadgetcount = 7;
							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 */
//							UserSetupExtWin(win,wingads,userdata);
                                          AggiornaListExt(win,wingads,ExtList);
							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[ListExt_Gadget],win,NULL,GA_Disabled,&longpointer1,GTLV_Labels,&longpointer2,TAG_END);
											gadgetdata.gd_Disabled_ListExt=(longpointer1 == 0)?FALSE:TRUE;
											gadgetdata.gd_Labels_ListExt=(struct List *)longpointer2;
											GT_GetGadgetAttrs(wingads[ListExt_Gadget],win,NULL,GTLV_Top,&longpointer1,GTLV_Selected,&longpointer2,TAG_END);
											gadgetdata.gd_Top_ListExt=longpointer1;
											gadgetdata.gd_Selected_ListExt=longpointer2;
											GT_GetGadgetAttrs(wingads[StringExt_Gadget],win,NULL,GA_Disabled,&longpointer1,GTST_String,&stringpointer,TAG_END);
											gadgetdata.gd_Disabled_StringExt=(longpointer1 == 0)?FALSE:TRUE;
											strcpy(gadgetdata.gd_String_StringExt,stringpointer);
											GT_GetGadgetAttrs(wingads[AddExt_Gadget],win,NULL,GA_Disabled,&longpointer1,TAG_END);
											gadgetdata.gd_Disabled_AddExt=(longpointer1 == 0)?FALSE:TRUE;
											GT_GetGadgetAttrs(wingads[DelExt_Gadget],win,NULL,GA_Disabled,&longpointer1,TAG_END);
											gadgetdata.gd_Disabled_DelExt=(longpointer1 == 0)?FALSE:TRUE;
											GT_GetGadgetAttrs(wingads[ProgExt_Gadget5],win,NULL,GA_Disabled,&longpointer1,GTST_String,&stringpointer,TAG_END);
											gadgetdata.gd_Disabled_ProgExt=(longpointer1 == 0)?FALSE:TRUE;
											strcpy(gadgetdata.gd_String_ProgExt,stringpointer);
											GT_GetGadgetAttrs(wingads[ProgSel_Gadget],win,NULL,GA_Disabled,&longpointer1,TAG_END);
											gadgetdata.gd_Disabled_ProgSel=(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;

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

											CreateBevelFrames(win,visualinfo,bevelcount,bbcopy);
                                                                  DrawBevelBox(win->RPort,
                                                                               win->BorderLeft,
                                                                               win->BorderTop,win->Width-win->BorderRight-win->BorderLeft,
                                                                               win->Height-win->BorderBottom-win->BorderTop,
                                                                               GT_VisualInfo, visualinfo,
                                                                               TAG_DONE);
											break;
										case IDCMP_VANILLAKEY:
											switch(messagecode)
												{
												case 27:
													running=FALSE;
													break;
												}
											break;
										case IDCMP_CLOSEWINDOW:
											running=FALSE;
                                                                  SaveExtList(ExtList);
											break;
										case IDCMP_GADGETUP:
										case MXIDCMP:
											HandleGadgetsExtWin(win,wingads,idcmpgad->GadgetID,messagecode,&gadgetdata,userdata);
											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);
}

