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

#include "NewGui_Includes.h"
#include "IDatGui.h"
#include <string.h>

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

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 IDatWinData
	{
	BOOL    gd_Disabled_TextDat;
	char    gd_Text_TextDat[256];
	BOOL    gd_Disabled_StrIDat;
	char    gd_String_StrIDat[64];
	BOOL    gd_Disabled_ButIDat;
	BOOL    gd_Disabled_OK_DATI;
	};


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


int HandleGadgetsIDatWin(struct Window *win,struct Gadget *wingads[],ULONG gadgetid,ULONG messagecode,struct IDatWinData *gadgetdata,APTR userdata)
{
      int retvalue=0;
	switch(gadgetid)
		{
/*
		case StrIDat_ID:
			StrIDatClicked(win,wingads,gadgetid,messagecode,userdata);
			break;
*/
		case ButIDat_ID:
			ButIDatClicked(win,wingads,gadgetid,messagecode,userdata);
			break;
		case OK_DATI_ID:
			OK_DATIClicked(win,wingads,gadgetid,messagecode,userdata);
                  retvalue=1;
			break;
		}
return retvalue;
}


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

struct Gadget *CreateGadgetsIDatWin(struct Gadget **gadgetlist,struct NewGadget newgad[],struct Gadget *wingads[],struct IDatWinData *gadgetdata)
{
	struct Gadget *gadget=CreateContext(gadgetlist);
	if (gadget)
		{
		wingads[TextDat_ID]=gadget=CreateGadget(TEXT_KIND,gadget,&newgad[TextDat_ID],GA_Disabled,gadgetdata->gd_Disabled_TextDat,GTTX_Border,TRUE,GTTX_CopyText,TRUE,GTTX_Text,gadgetdata->gd_Text_TextDat,TAG_END);
		wingads[StrIDat_ID]=gadget=CreateGadget(STRING_KIND,gadget,&newgad[StrIDat_ID],GA_Disabled,gadgetdata->gd_Disabled_StrIDat,GA_TabCycle,TRUE,GTST_MaxChars,64,GTST_String,gadgetdata->gd_String_StrIDat,GA_TabCycle,TRUE,STRINGA_ExitHelp,TRUE,STRINGA_Justification,GACT_STRINGLEFT,STRINGA_ReplaceMode,FALSE,TAG_END);
		wingads[ButIDat_ID]=gadget=CreateGadget(BUTTON_KIND,gadget,&newgad[ButIDat_ID],GA_Disabled,gadgetdata->gd_Disabled_ButIDat,GT_Underscore,'_',TAG_END);
		wingads[OK_DATI_ID]=gadget=CreateGadget(BUTTON_KIND,gadget,&newgad[OK_DATI_ID],GA_Disabled,gadgetdata->gd_Disabled_OK_DATI,GT_Underscore,'_',TAG_END);
		return gadget;
		}
	else return NULL;
}


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


int HandleIDatWin(struct Screen *customscreen,LONG left,LONG top,APTR userdata)
{
      int retvalue=0;
	APTR visualinfo;
	visualinfo=GetVisualInfo(customscreen,TAG_DONE);
	if (visualinfo)
		{
		struct Gadget  *gadgetlist = NULL;
		ULONG height=7,width=77,maxheight=1024,maxwidth=1280;

		struct Gadget *wingads[4];

		char * title                  = "Select program for this datatype";
		struct Window     *win        = NULL;

		struct TextAttr   textattr;

		struct NewGadget  newgad[]    = {
													 0,0,0,0,NULL,NULL,TextDat_ID,PLACETEXT_LEFT,NULL,NULL,
													 0,0,0,0,NULL,NULL,StrIDat_ID,PLACETEXT_LEFT,NULL,NULL,
													 0,0,0,0,"«",NULL,ButIDat_ID,PLACETEXT_IN,NULL,NULL,
													 0,0,0,0,"OK",NULL,OK_DATI_ID,PLACETEXT_IN,NULL,NULL,
												  };


		struct IDatWinData gadgetdata = {
													 /* belongs to a text gadget */
													 FALSE,
													 "",
													 /* belongs to a string gadget */
													 FALSE,
													 "",
													 /* belongs to a button */
													 FALSE,
													 /* belongs to a button */
													 FALSE,
												  };


		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(1);
		newgad[ 0].ng_TopEdge   =YPOS(1);
		newgad[ 0].ng_Width     =XSIZE(35);
		newgad[ 0].ng_Height    =YSIZE(2);
		newgad[ 0].ng_TextAttr  =&textattr;
		newgad[ 0].ng_VisualInfo=visualinfo;
		newgad[ 1].ng_LeftEdge  =XPOS(38);
		newgad[ 1].ng_TopEdge   =YPOS(1);
		newgad[ 1].ng_Width     =XSIZE(34);
		newgad[ 1].ng_Height    =YSIZE(2);
		newgad[ 1].ng_TextAttr  =&textattr;
		newgad[ 1].ng_VisualInfo=visualinfo;
		newgad[ 2].ng_LeftEdge  =XPOS(72);
		newgad[ 2].ng_TopEdge   =YPOS(1);
		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(30);
		newgad[ 3].ng_TopEdge   =YPOS(4);
		newgad[ 3].ng_Width     =XSIZE(16);
		newgad[ 3].ng_Height    =YSIZE(2);
		newgad[ 3].ng_TextAttr  =&textattr;
		newgad[ 3].ng_VisualInfo=visualinfo;




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

		if (CreateGadgetsIDatWin(&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,
											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[4];
							long   double        xscale      = 1.0;
							long   double        yscale      = 1.0;
							char * stringpointer             = NULL;
							ULONG                i           = 0;
							ULONG                gadgetcount = 4;
							ULONG  idcmpclass                = 0;
							UWORD  messagecode               = 0;
							BOOL   running                   = TRUE;
							ULONG  signal                    = 0;
							ULONG  longpointer1              = 0;
//							ULONG  longpointer2              = 0;

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

							SetFont(win->RPort,GfxBase->DefaultFont);

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

                                             GT_SetGadgetAttrs(wingads[TextDat_ID], win, NULL, 
                                                               GTTX_Text, userdata,
                                                               TAG_DONE);    


							/* User-Setup */
//							UserSetupIDatWin(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[TextDat_ID],win,NULL,GA_Disabled,&longpointer1,GTTX_Text,&stringpointer,TAG_END);
											gadgetdata.gd_Disabled_TextDat=(longpointer1 == 0)?FALSE:TRUE;
											strcpy(gadgetdata.gd_Text_TextDat,stringpointer);
											GT_GetGadgetAttrs(wingads[StrIDat_ID],win,NULL,GA_Disabled,&longpointer1,GTST_String,&stringpointer,TAG_END);
											gadgetdata.gd_Disabled_StrIDat=(longpointer1 == 0)?FALSE:TRUE;
											strcpy(gadgetdata.gd_String_StrIDat,stringpointer);
											GT_GetGadgetAttrs(wingads[ButIDat_ID],win,NULL,GA_Disabled,&longpointer1,TAG_END);
											gadgetdata.gd_Disabled_ButIDat=(longpointer1 == 0)?FALSE:TRUE;
											GT_GetGadgetAttrs(wingads[OK_DATI_ID],win,NULL,GA_Disabled,&longpointer1,TAG_END);
											gadgetdata.gd_Disabled_OK_DATI=(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);
												}

											FreeGadgets(gadgetlist);
											gadgetlist=NULL;

											CreateGadgetsIDatWin(&gadgetlist,ngcopy,wingads,&gadgetdata);
											AddGList(win,gadgetlist,-1,-1,NULL);
											RefreshGList(gadgetlist,win,NULL,-1);
											GT_RefreshWindow(win,NULL);
                                                                  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;
											break;
										case IDCMP_GADGETUP:
										case MXIDCMP:
											retvalue=HandleGadgetsIDatWin(win,wingads,idcmpgad->GadgetID,messagecode,&gadgetdata,userdata);
                                                                  if(retvalue) 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);
   return retvalue;
}

