/* $Revision Header * Header built automatically - do not edit! *************
 *
 *	(C) Copyright 1991 by Olaf 'Olsen' Barthel & MXM
 *
 *	Name .....: TransferPanel.c
 *	Created ..: Monday 21-Jan-91 20:12
 *	Revision .: 0
 *
 *	Date            Author          Comment
 *	=========       ========        ====================
 *	21-Jan-91       Olsen           Created this file!
 *
 * $Revision Header ********************************************************/

#include "TermGlobal.h"

STATIC struct Gadget	*GadgetList;
STATIC BYTE		 LastStatus = -1;

STATIC WORD		 PositionX = -1,PositionY = -1;

#define WIDTH		(70*8+12)
#define HEIGHT		(16*8+24+27)

#define ORIGIN_X	13
#define ORIGIN_Y	14

enum	{	MEN_ABORT=1,MEN_SKIP,MEN_QUITPANEL };

STATIC struct NewMenu NewTransferMenu[] =
{
	{ NM_TITLE, "Project",			 0 , 0, 0, (APTR)0},
	{  NM_ITEM, "Abort Entire Transfer",	"A", 0, 0, (APTR)MEN_ABORT},
	{  NM_ITEM, "Skip Current File",	"S", 0, 0, (APTR)MEN_SKIP},
	{  NM_ITEM, NM_BARLABEL,		 0 , 0, 0, (APTR)0},
	{  NM_ITEM, "Quit",			"Q", 0, 0, (APTR)MEN_QUITPANEL},
	{ NM_END, 0,				 0 , 0, 0, (APTR)0}
};

STATIC struct Gadget *
CreateAllGadgets(struct Gadget **GadgetArray,struct Gadget **GadgetList,APTR VisualInfo,UWORD TopEdge)
{
	struct Gadget		*Gadget;
	struct NewGadget	 NewGadget;
	UWORD			 Counter = 0;

	memset(&NewGadget,0,sizeof(struct NewGadget));

	if(Gadget = CreateContext(GadgetList))
	{
		NewGadget . ng_TextAttr		= &DefaultFont;
		NewGadget . ng_VisualInfo	= VisualInfo;

		NewGadget . ng_Width		= (WIDTH - 30) >> 1;
		NewGadget . ng_Height		= 12;
		NewGadget . ng_GadgetText	= "_Abort Entire Transfer";
		NewGadget . ng_GadgetID		= Counter;
		NewGadget . ng_Flags		= 0;
		NewGadget . ng_LeftEdge		= 10;
		NewGadget . ng_TopEdge		= HEIGHT - 3 - NewGadget . ng_Height;

		GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
			GT_Underscore,	'_',
		TAG_DONE);

		NewGadget . ng_GadgetText	= "_Skip Current File";
		NewGadget . ng_GadgetID		= Counter;
		NewGadget . ng_LeftEdge		= WIDTH - 10 - NewGadget . ng_Width;

		GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
			GT_Underscore,	'_',
		TAG_DONE);

		NewGadget . ng_Height		= 16;
		NewGadget . ng_GadgetText	= "Data Transferred";
		NewGadget . ng_GadgetID		= Counter;
		NewGadget . ng_Flags		= PLACETEXT_ABOVE;
		NewGadget . ng_LeftEdge		= 10;
		NewGadget . ng_TopEdge		= HEIGHT - 3 - NewGadget . ng_Height - 16;

		GadgetArray[Counter++] = Gadget = CreateGadget(TEXT_KIND,Gadget,&NewGadget,
			GTTX_Border,	TRUE,
		TAG_DONE);

		NewGadget . ng_GadgetText	= "Time To Go";
		NewGadget . ng_GadgetID		= Counter;
		NewGadget . ng_LeftEdge		= WIDTH - 10 - NewGadget . ng_Width;

		GadgetArray[Counter++] = Gadget = CreateGadget(TEXT_KIND,Gadget,&NewGadget,
			GTTX_Border,	TRUE,
		TAG_DONE);
	}

	return(Gadget);
}

VOID __stdargs
TransferInfo(WORD X,WORD Y,BYTE *String,...)
{
	if(String && TransferWindow)
	{
		va_list	VarArgs;

		va_start(VarArgs,String);
		VSPrintf(SharedBuffer,String,VarArgs);
		va_end(VarArgs);

		if(String[0] == '%' && String[2] == 'd')
		{
			strcat(SharedBuffer,"              ");

			SharedBuffer[11] = 0;
		}

		Move(TransferWindow -> RPort,ORIGIN_X + X * 8,ORIGIN_Y + 6 + Y * 4);
		Text(TransferWindow -> RPort,SharedBuffer,strlen(SharedBuffer));
	}
}

VOID
GhostStats(struct Gadget *Gadget)
{
	STATIC ULONG __chip	 Check = 0x5555AAAA;
	struct RastPort		*RPort = TransferWindow -> RPort;
	BYTE			 FgPen = RPort -> FgPen;

	SetAPen(RPort,1);

	SetAfPt(RPort,(UWORD *)&Check,1);

	RectFill(RPort,Gadget -> LeftEdge + 2,Gadget -> TopEdge + 1,Gadget -> LeftEdge + Gadget -> Width - 3,Gadget -> TopEdge + Gadget -> Height - 2);

	SetAPen(RPort,FgPen);

	SetAfPt(RPort,NULL,0);
}

VOID
ShowStats(struct Gadget *Gadget,LONG Value,LONG Max)
{
	if(TransferWindow)
	{
		struct RastPort	*RPort = TransferWindow -> RPort;
		LONG		 MaxWidth = Gadget -> Width - 4,Width;

		if((Width = (MaxWidth * Value) / Max) > 0)
		{
			if(Width != MaxWidth)
			{
				BYTE FgPen = RPort -> FgPen;

				SetAPen(RPort,0);

				RectFill(RPort,Gadget -> LeftEdge + 2 + Width - 1,Gadget -> TopEdge + 1,Gadget -> LeftEdge + Gadget -> Width - 3,Gadget -> TopEdge + Gadget -> Height - 2);

				SetAPen(RPort,FgPen);
			}

			RectFill(RPort,Gadget -> LeftEdge + 2,Gadget -> TopEdge + 1,Gadget -> LeftEdge + Width + 1,Gadget -> TopEdge + Gadget -> Height - 2);
		}
		else
		{
			BYTE FgPen = RPort -> FgPen;

			SetAPen(RPort,0);

			RectFill(RPort,Gadget -> LeftEdge + 2,Gadget -> TopEdge + 1,Gadget -> LeftEdge + Gadget -> Width - 3,Gadget -> TopEdge + Gadget -> Height - 2);

			SetAPen(RPort,FgPen);
		}
	}
}

VOID __stdargs
ShowString(struct Gadget *Gadget,UBYTE *String,...)
{
	if(TransferWindow)
	{
		va_list		 VarArgs;
		WORD		 Len;
		struct RastPort	*RPort = TransferWindow -> RPort;

		va_start(VarArgs,String);
		VSPrintf(SharedBuffer,String,VarArgs);
		va_end(VarArgs);

		Len = strlen(SharedBuffer);

		Move(RPort,Gadget -> LeftEdge + 2 + (Gadget -> Width - 4 - 8 * Len) / 2,Gadget -> TopEdge + 1 + (Gadget -> Height - 2 - 8) / 2 + 6);

		if(Config . ColourMode != COLOUR_MONO)
		{
			BYTE FgPen = RPort -> FgPen,DrawMode = RPort -> DrawMode;

			SetAPen(RPort,2);
			SetDrMd(RPort,JAM1);

			Text(RPort,SharedBuffer,Len);

			SetAPen(RPort,FgPen);
			SetDrMd(RPort,DrawMode);
		}
		else
			Text(RPort,SharedBuffer,Len);
	}
}

BYTE
TransferPanel(UBYTE *Title)
{
	if(Status != STATUS_DOWNLOAD && Status != STATUS_UPLOAD)
	{
		LastStatus = Status;

		Status = STATUS_DOWNLOAD;
	}
	else
		LastStatus = -1;

	if(CreateAllGadgets(&TransferGadgetArray[0],&GadgetList,VisualInfo,Screen -> WBorTop + Screen -> Font -> ta_YSize + 1))
	{
		if(TransferMenu = CreateMenus(NewTransferMenu,
			GTMN_FrontPen, 0,
		TAG_DONE))
		{
			if(LayoutMenus(TransferMenu,VisualInfo,
				GTMN_TextAttr,&DefaultFont,
			TAG_DONE))
			{
				if(PositionX == -1)
					PositionX = (Screen -> Width - WIDTH) >> 1;

				if(PositionY == -1)
					PositionY = (Screen -> Height - HEIGHT) >> 1;

				if(TransferWindow = OpenWindowTags(NULL,
					WA_Width,	WIDTH,
					WA_Height,	HEIGHT,

					WA_Left,	PositionX,
					WA_Top,		PositionY,

					WA_Activate,	TRUE,
					WA_DragBar,	TRUE,
					WA_DepthGadget,	TRUE,
					WA_CloseGadget,	TRUE,
					WA_RMBTrap,	TRUE,

					WA_CustomScreen,Screen,

					WA_IDCMP,	IDCMP_CLOSEWINDOW | BUTTONIDCMP | IDCMP_MENUPICK,

					WA_Title,	Title,
				TAG_DONE))
				{
					BYTE Pen1,Pen2;

					DrawBevelBox(TransferWindow -> RPort,10,12,WIDTH - 20,116,
						GTBB_Recessed,	TRUE,
						GT_VisualInfo,	VisualInfo,
					TAG_DONE);

					switch(Config . ColourMode)
					{
						case COLOUR_AMIGA:	Pen1 = 1;
									Pen2 = 3;
									break;

						case COLOUR_EIGHT:	Pen1 = 4;
									Pen2 = 7;
									break;

						case COLOUR_SIXTEEN:	Pen1 = 15;
									Pen2 = 8;
									break;

						case COLOUR_MONO:	Pen1 = Pen2 = 1;
									break;
					}

					PushWindow(TransferWindow);

					AddGList(TransferWindow,GadgetList,(UWORD)-1,(UWORD)-1,NULL);
					RefreshGList(GadgetList,TransferWindow,NULL,(UWORD)-1);
					GT_RefreshWindow(TransferWindow,NULL);

					SetMenuStrip(TransferWindow,TransferMenu);

					TransferWindow -> Flags &= ~WFLG_RMBTRAP;

					SetAPen(TransferWindow -> RPort,Pen1);
					SetBPen(TransferWindow -> RPort,0);
					SetDrMd(TransferWindow -> RPort,JAM2);

					TransferInfo(0, 0,"Protocol..........:");

					TransferInfo(0, 3,"File..............:");
					TransferInfo(0, 5,"Size..............:");

					TransferInfo(0, 8,"Bytes Transferred.:                Blocks Transferred:");
					TransferInfo(0,10,"Block Check Type..:                Block Size........:");

					TransferInfo(0,13,"Estimated Time....:                Elapsed Time......:");

					TransferInfo(0,16,"Message...........:");
					TransferInfo(0,18,"Last Error........:");

					TransferInfo(0,21,"Number Of Errors..:                Number Of Timeouts:");

					TransferInfo(0,24,"Packet Type.......:                Packet Delay......:");
					TransferInfo(0,26,"Characters/Second.:                Character Delay...:");

					SetAPen(TransferWindow -> RPort,Pen2);

					TransferInfo(20, 0,"Unknown");

					TransferInfo(20, 3,"-");
					TransferInfo(20, 5,"-");

					TransferInfo(20, 8,"-");
					TransferInfo(55, 8,"-");

					TransferInfo(20,10,"-");
					TransferInfo(55,10,"-");

					TransferInfo(20,13,"-");
					TransferInfo(55,13,"-");

					TransferInfo(20,16,"-- None --");
					TransferInfo(20,18,"-- None --");

					TransferInfo(20,21,"-");
					TransferInfo(55,21,"-");

					TransferInfo(20,24,"-");
					TransferInfo(55,24,"-");

					TransferInfo(20,26,"-");
					TransferInfo(55,26,"-");

					GhostStats(TransferGadgetArray[2]);
					GhostStats(TransferGadgetArray[3]);

					return(TRUE);
				}
			}
		}
	}

	return(FALSE);
}

VOID
DeleteTransferPanel()
{
	if(FileMatch)
		MatchEnd(FileAnchor);

	if(LastStatus != -1)
		Status = LastStatus;

	LastStatus = -1;

	if(TransferWindow)
	{
		PositionX	= TransferWindow -> LeftEdge;
		PositionY	= TransferWindow -> TopEdge;

		TransferWindow -> Flags |= WFLG_RMBTRAP;

		ClearMenuStrip(TransferWindow);

		if(GadgetList)
			RemoveGList(TransferWindow,GadgetList,(UWORD)-1);

		PopWindow();

		CloseWindow(TransferWindow);

		TransferWindow = NULL;
	}

	if(TransferMenu)
	{
		FreeMenus(TransferMenu);

		TransferMenu = NULL;
	}

	if(GadgetList)
	{
		FreeGadgets(GadgetList);

		GadgetList = NULL;
	}
}
