#include "/Mailbox.h"
#include "/protos.h"
#include <libraries/zbbs.h>
#include "globals.c"

enum { GD_select, GD_load, GD_save, GD_edit, GD_neu, GD_loeschen, GD_zurueck };

enum { GD_systemname, GD_pointname, GD_passwort, GD_packer, GD_entpacker, GD_level,
		GD_protocol, GD_gruppen };

VOID EditPoint(struct Point *);

VOID Points()
{
	struct List		PointDataList;
	struct Point	*point;
	struct Gadget	*pointGadgets[7];
	LONG lastitem, sec1, sec2, mic1, mic2, i;

	if(!Config.mail[0])
	{
		MyEasyRequest("Kein gültiges Mail-Directory angegeben.", "Okay.");
		return;
	}
	else
	{
		char file[256];

		NewList(&PointDataList);
		SPrintf(file, "%lsPointData", Config.mail);
		if(!(GetPointDataList(file, &PointDataList)))
		{
			MyEasyRequest("PointListe konnte nicht geladen werden.", "Okay.");
			return;
		}
	}

	point = NULL;
	lastitem = sec1 = mic1 = 0;

	if(glist)
	{
		RemoveGList(Win, glist, -1);
		FreeGadgets(glist);
		glist = NULL;

		SetRast(Win->RPort, 0);
	}

	if(!(g = CreateContext(&glist)))
	{
		MyEasyRequest("Konnte Gadget-Context nicht generieren.", "Okay");
		return;
	}

	ng.ng_LeftEdge		= 265;
	ng.ng_TopEdge		= 70;
	ng.ng_Width			= 230;
	ng.ng_Height		= 100;
	ng.ng_GadgetText	= "Wähle Point";
	ng.ng_TextAttr		= &FontAttr,
	ng.ng_GadgetID		= GD_select;
	ng.ng_Flags			= PLACETEXT_ABOVE;
	ng.ng_VisualInfo	= VisualInfo;

	pointGadgets[GD_select] =
	g = CreateGadget(LISTVIEW_KIND, g, &ng,
		GTLV_Labels,			&PointDataList,
		GTLV_ShowSelected,	NULL,
		GTLV_ScrollWidth,		20,
		TAG_DONE );

	ng.ng_LeftEdge		= 170;
	ng.ng_Width			= 70;
	ng.ng_Height		= 13;
	ng.ng_GadgetText	= "ReLoad";
	ng.ng_GadgetID		= GD_load;
	ng.ng_Flags			= PLACETEXT_IN;

	pointGadgets[GD_load] =
	g = CreateGadget(BUTTON_KIND, g, &ng, TAG_DONE );

	ng.ng_TopEdge		= 85;
	ng.ng_GadgetText	= "Save";
	ng.ng_GadgetID		= GD_save;

	pointGadgets[GD_save] =
	g = CreateGadget(BUTTON_KIND, g, &ng, TAG_DONE );

	ng.ng_TopEdge		= 102;
	ng.ng_GadgetText	= "Edit";
	ng.ng_GadgetID		= GD_edit;

	pointGadgets[GD_edit] =
	g = CreateGadget(BUTTON_KIND, g, &ng, TAG_DONE );

	ng.ng_TopEdge		= 117;
	ng.ng_GadgetText	= "New";
	ng.ng_GadgetID		= GD_neu;

	pointGadgets[GD_neu] =
	g = CreateGadget(BUTTON_KIND, g, &ng, TAG_DONE );

	ng.ng_TopEdge		= 132;
	ng.ng_GadgetText	= "Delete";
	ng.ng_GadgetID		= GD_loeschen;

	pointGadgets[GD_loeschen] =
	g = CreateGadget(BUTTON_KIND, g, &ng, TAG_DONE );

	ng.ng_TopEdge		= 157;
	ng.ng_GadgetText	= "Zurück";
	ng.ng_GadgetID		= GD_zurueck;

	pointGadgets[GD_zurueck] =
	g = CreateGadget(BUTTON_KIND, g, &ng, TAG_DONE );

	if (!g)
	{
		MyEasyRequest("Konnte Gadgets nicht generieren.", "Okay");
		return;
	}

	AddGList(Win, glist, 0, -1, NULL);
	RefreshGList(glist, Win, NULL, -1);
	GT_RefreshWindow(Win, NULL);

	while(TRUE)
	{
		Wait(1L << Win->UserPort->mp_SigBit);

		while(imsg = GT_GetIMsg(Win->UserPort))
		{
			class	= imsg->Class;
			code	= imsg->Code;
			g		= imsg->IAddress;

			GT_ReplyIMsg(imsg);

			if(class == IDCMP_GADGETUP)
			{
				switch(g->GadgetID)
				{
					case GD_select:
						i = code;
						point = GetHead(&PointDataList);
						while(i-- && point)	point = GetSucc(point);

						CurrentTime(&sec2, &mic2);
						if(DoubleClick(sec1, mic1, sec2, mic2) && lastitem == code)
						{
							lastitem = -1;

							EditPoint(point);

							RefreshGList(pointGadgets[GD_select], Win, NULL, 1);
							GT_RefreshWindow(Win, NULL);
						}
						else
						{
							lastitem = code;
							sec1 = sec2;
							mic1 = mic2;
						}
						break;

					case GD_load:
						{
							char file[256];

							GT_SetGadgetAttrs(pointGadgets[GD_select], Win, NULL,
								GTLV_Labels,	~0,
								TAG_END);

							RemList(&PointDataList);
							SPrintf(file, "%lsPointData", Config.mail);
							GetPointDataList(file, &PointDataList);

							GT_SetGadgetAttrs(pointGadgets[GD_select], Win, NULL,
								GTLV_Labels,	&PointDataList,
								TAG_END);

							RefreshGList(pointGadgets[GD_select], Win, NULL, 1);
							GT_RefreshWindow(Win, NULL);
						}
						break;

					case GD_save:
						if(MyEasyRequest("Sicher ?!?", "Ja|Abbruch"))
						{
							if(point = GetHead(&PointDataList))
							{
								char file[256];
								BPTR FH;

								OpenWaitWindow();

								SPrintf(file, "%lsPointData", Config.mail);
								if(FH = Open(file, MODE_NEWFILE))
								{
									while(point)
									{
										FPrintf(FH, "%ls\n", point->systemname);
										FPrintf(FH, "%ls\n", point->pointname);
										FPrintf(FH, "%ls\n", point->passwort);
										FPrintf(FH, "%ld\n", point->gruppe);
										FPrintf(FH, "%ld\n", point->level);
										FPrintf(FH, "%ls\n", point->packer);
										FPrintf(FH, "%ls\n", point->entpacker);
										FPrintf(FH, "%ld\n", point->protocol);

										point = GetSucc(point);
									}
									Close(FH);
								}
								CloseWaitWindow();
							}
						}
						break;

					case GD_edit:
						if(point)
						{
							EditPoint(point);

							RefreshGList(pointGadgets[GD_select], Win, NULL, 1);
							GT_RefreshWindow(Win, NULL);
						}
						break;

					case GD_neu:
						if(point = AllocVec(sizeof(struct Point), MEMF_ANY | MEMF_CLEAR))
						{
							point->node.ln_Name = point->systemname;

							GT_SetGadgetAttrs(pointGadgets[GD_select], Win, NULL,
								GTLV_Labels,	~0,
								TAG_END);

							AddTail(&PointDataList, point);

							GT_SetGadgetAttrs(pointGadgets[GD_select], Win, NULL,
								GTLV_Labels,	&PointDataList,
								TAG_END);

							EditPoint(point);

							RefreshGList(pointGadgets[GD_select], Win, NULL, 1);
							GT_RefreshWindow(Win, NULL);
						}
						break;

					case GD_loeschen:
						if(point)
						{
							GT_SetGadgetAttrs(pointGadgets[GD_select], Win, NULL,
								GTLV_Labels,	~0,
								TAG_END);

							Remove(point);
							FreeVec(point);

							GT_SetGadgetAttrs(pointGadgets[GD_select], Win, NULL,
								GTLV_Labels,	&PointDataList,
								TAG_END);
						}
						break;

					case GD_zurueck:
						GT_SetGadgetAttrs(pointGadgets[GD_select], Win, NULL,
							GTLV_Labels,	~0,
							TAG_END);
						RemList(&PointDataList);
						return;
						break;
				}
			}
		}
	}
}

VOID EditPoint(struct Point *point)
{
	struct Gadget	*editGList;
	struct Window	*EditWin;
	struct Gadget	*editGadgets[8];
	struct Line		*e;

	if(!(g = CreateContext(&editGList)))
	{
		MyEasyRequest("Konnte Gadget-Context nicht generieren.", "Okay");
		return;
	}

	ng.ng_LeftEdge		= 110;
	ng.ng_TopEdge		= 13;
	ng.ng_Width			= 342;
	ng.ng_Height		= 13;
	ng.ng_GadgetText	= "Systemname:";
	ng.ng_TextAttr		= &FontAttr;
	ng.ng_GadgetID		= GD_systemname;
	ng.ng_Flags			= PLACETEXT_LEFT|NG_HIGHLABEL;
	ng.ng_VisualInfo	= VisualInfo;

	editGadgets[GD_systemname] =
	g = CreateGadget(STRING_KIND, g, &ng,
		GTST_String,	point->systemname,
		GTST_MaxChars,	40,
		TAG_DONE );

	ng.ng_TopEdge		= 29;
	ng.ng_GadgetText	= "Pointname.:";
	ng.ng_GadgetID		= GD_pointname;

	editGadgets[GD_pointname] =
	g = CreateGadget(STRING_KIND, g, &ng,
		GTST_String,	point->pointname,
		GTST_MaxChars,	40,
		TAG_DONE );

	ng.ng_TopEdge		= 45;
	ng.ng_GadgetText	= "Passwort..:";
	ng.ng_GadgetID		= GD_passwort;

	editGadgets[GD_passwort] =
	g = CreateGadget(STRING_KIND, g, &ng,
		GTST_String,	point->passwort,
		GTST_MaxChars,	40,
		TAG_DONE );

	ng.ng_TopEdge		= 61;
	ng.ng_GadgetText	= "Packer....:";
	ng.ng_GadgetID		= GD_packer;

	editGadgets[GD_packer] =
	g = CreateGadget(STRING_KIND, g, &ng,
		GTST_String,	point->packer,
		GTST_MaxChars,	40,
		TAG_DONE );

	ng.ng_TopEdge		= 77;
	ng.ng_GadgetText	= "Entpacker.:";
	ng.ng_GadgetID		= GD_entpacker;

	editGadgets[GD_entpacker] =
	g = CreateGadget(STRING_KIND, g, &ng,
		GTST_String,	point->entpacker,
		GTST_MaxChars,	40,
		TAG_DONE );

	ng.ng_TopEdge		= 93;
	ng.ng_Width			= 45;
	ng.ng_GadgetText	= "Level.....:";
	ng.ng_GadgetID		= GD_level;

	editGadgets[GD_level] =
	g = CreateGadget(INTEGER_KIND, g, &ng,
		GTIN_Number,	point->level,
		GTIN_MaxChars,	3,
		TAG_DONE );

	ng.ng_LeftEdge		= 275;
	ng.ng_GadgetText	= "Protokoll:";
	ng.ng_GadgetID		= GD_protocol;

	editGadgets[GD_protocol] =
	g = CreateGadget(INTEGER_KIND, g, &ng,
		GTIN_Number,	point->protocol,
		GTIN_MaxChars,	3,
		TAG_DONE );

	ng.ng_LeftEdge		= 367;
	ng.ng_Width			= 85;
	ng.ng_GadgetText	= "Gruppen";
	ng.ng_GadgetID		= GD_gruppen;
	ng.ng_Flags			= PLACETEXT_IN;

	editGadgets[GD_gruppen] =
	g = CreateGadget(BUTTON_KIND, g, &ng, TAG_DONE );

	if(!g)
	{
		MyEasyRequest("Konnte Gadgets nicht generieren.", "Okay");
		return;
	}

	if(!(EditWin = OpenWindowTags( NULL,
		WA_Left,				(Scr->Width - 470) / 2,
		WA_Top,				(Scr->Height - 110) / 2,
		WA_Width,			470,
		WA_Height,			110,
		WA_IDCMP,			STRINGIDCMP | INTEGERIDCMP | CYCLEIDCMP | CHECKBOXIDCMP |
								IDCMP_CLOSEWINDOW,
		WA_DragBar,			TRUE,
		WA_CloseGadget,	TRUE,
		WA_Activate,		TRUE,
		WA_SmartRefresh,	TRUE,
		WA_Gadgets,			editGList,
		WA_Title,			"Edit Point",
		WA_CustomScreen,	Scr,
		TAG_DONE )))	return;

	GT_RefreshWindow(EditWin, NULL);
	ActivateGadget(editGadgets[GD_systemname], EditWin, NULL);

	e = NULL;

	while(TRUE)
	{
		Wait(1L << EditWin->UserPort->mp_SigBit);

		while(imsg = GT_GetIMsg(EditWin->UserPort))
		{
			class	= imsg->Class;
			code	= imsg->Code;
			g		= imsg->IAddress;

			GT_ReplyIMsg(imsg);

			if(class == IDCMP_GADGETUP)
			{
				switch(g->GadgetID)
				{
					case GD_systemname:
						strcpy(point->systemname, ((struct StringInfo *)g->SpecialInfo)->Buffer);
						ActivateGadget(editGadgets[GD_pointname], EditWin, NULL);
						break;

					case GD_pointname:
						strcpy(point->pointname, ((struct StringInfo *)g->SpecialInfo)->Buffer);
						ActivateGadget(editGadgets[GD_passwort], EditWin, NULL);
						break;

					case GD_passwort:
						strcpy(point->passwort, ((struct StringInfo *)g->SpecialInfo)->Buffer);
						ActivateGadget(editGadgets[GD_packer], EditWin, NULL);
						break;

					case GD_packer:
						strcpy(point->packer, ((struct StringInfo *)g->SpecialInfo)->Buffer);
						ActivateGadget(editGadgets[GD_entpacker], EditWin, NULL);
						break;

					case GD_entpacker:
						strcpy(point->entpacker, ((struct StringInfo *)g->SpecialInfo)->Buffer);
						ActivateGadget(editGadgets[GD_level], EditWin, NULL);
						break;

					case GD_level:
						point->level = ((struct StringInfo *)g->SpecialInfo)->LongInt;
						ActivateGadget(editGadgets[GD_protocol], EditWin, NULL);
						break;

					case GD_protocol:
						point->protocol = ((struct StringInfo *)g->SpecialInfo)->LongInt;
						ActivateGadget(editGadgets[GD_systemname], EditWin, NULL);
						break;

					case GD_gruppen:
						DisplayBeep(Scr);
						break;
				}
			}

			if(class == IDCMP_CLOSEWINDOW)
			{
				CloseWindow(EditWin);
				FreeGadgets(editGList);

				return;
			}
		}
	}
}
