/*
**	$Id: termStatus.c,v 1.4 92/08/15 20:15:18 olsen Sta Locker: olsen $
**	$Revision: 1.4 $
**	$Date: 92/08/15 20:15:18 $
**
**	Status information window support routines
**
**	Copyright © 1990-1992 by Olaf `Olsen' Barthel & MXM
**		All Rights Reserved
*/

#include "termGlobal.h"

enum	{	GAD_SESSION,GAD_BYTES_IN,GAD_BYTES_OUT,GAD_CONNECT_STRING,GAD_SCREEN_SIZE,GAD_BUFFER_SIZE,GAD_MEMORY };

STATIC struct Gadget	*InfoGadgetArray[GAD_MEMORY + 1];
STATIC struct Gadget	*InfoGadgetList;
STATIC LONG		 InfoWindowLeft	= -1,
			 InfoWindowTop	= -1;

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

	SZ_SizeSetup(Screen,&UserFont,TRUE);

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

	if(Gadget = CreateContext(GadgetList))
	{
		UBYTE		DummyBuffer[256],
				Time[30],
				Date[30];
		struct DateTime	DateTime;
		LONG		Width,DummyWidth;

		DateTime . dat_Stamp	= SessionStart;
		DateTime . dat_Format	= FORMAT_DOS;
		DateTime . dat_Flags	= 0;
		DateTime . dat_StrDay	= NULL;
		DateTime . dat_StrDate	= Date;
		DateTime . dat_StrTime	= Time;

		if(DateToStr(&DateTime))
			SPrintf(DummyBuffer,"%s %s",Date,Time);
		else
			strcpy(DummyBuffer,"-");

		SZ_AddLeftOffset(SZ_LeftOffsetDelta(MSG_INFOWINDOW_SESSION_START_GAD,MSG_INFOWINDOW_FREE_MEMORY_GAD));

		Width = strlen(BaudBuffer);

		if(Width > 60)
			Width = 60;

		DummyWidth = strlen(DummyBuffer);

		if(DummyWidth > Width)
			Width = DummyWidth;

		SZ_SetWidth(SZ_Width(TEXT_KIND,NULL,Width,NULL));

		NewGadget . ng_GadgetText	= LocaleString(MSG_INFOWINDOW_SESSION_START_GAD);
		NewGadget . ng_TextAttr		= &UserFont;
		NewGadget . ng_VisualInfo	= VisualInfo;
		NewGadget . ng_GadgetID		= Counter;
		NewGadget . ng_Flags		= 0;

		GadgetArray[Counter++] = Gadget = CreateGadget(TEXT_KIND,Gadget,&NewGadget,
			SZ_Adjust,		TRUE,
			SZ_AutoWidth,		TRUE,

			GTTX_Text,		DummyBuffer,
			GTTX_CopyText,		TRUE,
			GTTX_Border,		TRUE,
		TAG_DONE);

		NewGadget . ng_GadgetText	= LocaleString(MSG_INFOWINDOW_BYTES_RECEIVED_GAD);
		NewGadget . ng_GadgetID		= Counter;

		GadgetArray[Counter++] = Gadget = CreateGadget(TEXT_KIND,Gadget,&NewGadget,
			SZ_Adjust,		TRUE,
			SZ_AutoWidth,		TRUE,
			SZ_AlignExtra,		TRUE,

			GTTX_Border,		TRUE,
		TAG_DONE);

		NewGadget . ng_GadgetText	= LocaleString(MSG_INFOWINDOW_BYTES_SENT_GAD);
		NewGadget . ng_GadgetID		= Counter;

		GadgetArray[Counter++] = Gadget = CreateGadget(TEXT_KIND,Gadget,&NewGadget,
			SZ_Adjust,		TRUE,
			SZ_AutoWidth,		TRUE,

			GTTX_Border,		TRUE,
		TAG_DONE);

		NewGadget . ng_GadgetText	= LocaleString(MSG_INFOWINDOW_CONNECTION_MESSAGE_GAD);
		NewGadget . ng_GadgetID		= Counter;

		GadgetArray[Counter++] = Gadget = CreateGadget(TEXT_KIND,Gadget,&NewGadget,
			SZ_Adjust,		TRUE,
			SZ_AutoWidth,		TRUE,

			GTTX_Text,		BaudBuffer[0] ? BaudBuffer : "-",
			GTTX_CopyText,		TRUE,
			GTTX_Border,		TRUE,
		TAG_DONE);

		NewGadget . ng_GadgetText	= LocaleString(MSG_INFOWINDOW_SCREEN_SIZE_GAD);
		NewGadget . ng_GadgetID		= Counter;

		GadgetArray[Counter++] = Gadget = CreateGadget(TEXT_KIND,Gadget,&NewGadget,
			SZ_Adjust,		TRUE,
			SZ_AutoWidth,		TRUE,
			SZ_AlignExtra,		TRUE,

			GTTX_Border,		TRUE,
		TAG_DONE);

		NewGadget . ng_GadgetText	= LocaleString(MSG_INFOWINDOW_BUFFER_SIZE_GAD);
		NewGadget . ng_GadgetID		= Counter;

		GadgetArray[Counter++] = Gadget = CreateGadget(TEXT_KIND,Gadget,&NewGadget,
			SZ_Adjust,		TRUE,
			SZ_AutoWidth,		TRUE,
			SZ_AlignExtra,		TRUE,

			GTTX_Border,		TRUE,
		TAG_DONE);

		NewGadget . ng_GadgetText	= LocaleString(MSG_INFOWINDOW_FREE_MEMORY_GAD);
		NewGadget . ng_GadgetID		= Counter;

		GadgetArray[Counter++] = Gadget = CreateGadget(TEXT_KIND,Gadget,&NewGadget,
			SZ_Adjust,		TRUE,
			SZ_AutoWidth,		TRUE,

			GTTX_Border,		TRUE,
		TAG_DONE);
	}

	return(Gadget);
}

	/* RefreshInfoWindow():
	 *
	 *	Refresh, i.e. redraw, the contents of the info window.
	 */

VOID
RefreshInfoWindow()
{
	if(InfoWindow)
	{
		extern struct LocaleBase	*LocaleBase;
		UBYTE				 DummyBuffer[256];

		if(LocaleBase)
			SPrintf(DummyBuffer,"%lD",BytesIn);
		else
			SPrintf(DummyBuffer,"%ld",BytesIn);

		GT_SetGadgetAttrs(InfoGadgetArray[GAD_BYTES_IN],InfoWindow,NULL,
			GTTX_Text,	DummyBuffer,
		TAG_DONE);

		if(LocaleBase)
			SPrintf(DummyBuffer,"%lD",BytesOut);
		else
			SPrintf(DummyBuffer,"%ld",BytesOut);

		GT_SetGadgetAttrs(InfoGadgetArray[GAD_BYTES_OUT],InfoWindow,NULL,
			GTTX_Text,	DummyBuffer,
		TAG_DONE);

		if(XEmulatorBase && XEM_IO)
		{
			if(XEmulatorBase -> lib_Version >= 4)
			{
				ULONG Result = XEmulatorInfo(XEM_IO,XEMI_CONSOLE_DIMENSIONS);

				SPrintf(DummyBuffer,"%ld × %ld",XEMI_EXTRACT_COLUMNS(Result),XEMI_EXTRACT_LINES(Result));
			}
			else
				strcpy(DummyBuffer,"???");
		}
		else
			SPrintf(DummyBuffer,"%ld × %ld",LastColumn + 1,LastLine + 1);

		GT_SetGadgetAttrs(InfoGadgetArray[GAD_SCREEN_SIZE],InfoWindow,NULL,
			GTTX_Text,	DummyBuffer,
		TAG_DONE);

		if(LocaleBase)
			SPrintf(DummyBuffer,"%lD",BufferSpace);
		else
			SPrintf(DummyBuffer,"%ld",BufferSpace);

		GT_SetGadgetAttrs(InfoGadgetArray[GAD_BUFFER_SIZE],InfoWindow,NULL,
			GTTX_Text,	DummyBuffer,
		TAG_DONE);

		if(LocaleBase)
			SPrintf(DummyBuffer,"%lD",AvailMem(MEMF_ANY));
		else
			SPrintf(DummyBuffer,"%ld",AvailMem(MEMF_ANY));

		GT_SetGadgetAttrs(InfoGadgetArray[GAD_MEMORY],InfoWindow,NULL,
			GTTX_Text,	DummyBuffer,
		TAG_DONE);
	}
}

	/* CloseInfoWindow():
	 *
	 *	Close the info window.
	 */

VOID
CloseInfoWindow()
{
	struct MenuItem *SomeItem;

	if(SomeItem = FindThisItem(MEN_STATUS_WINDOW))
		SomeItem -> Flags &= ~CHECKED;

	if(InfoGadgetList)
	{
		FreeGadgets(InfoGadgetList);

		InfoGadgetList = NULL;
	}

	if(InfoWindow)
	{
		InfoWindowLeft	= InfoWindow -> LeftEdge;
		InfoWindowTop	= InfoWindow -> TopEdge;

		ClearMenuStrip(InfoWindow);

		CloseWindowSafely(InfoWindow);

		InfoWindow = NULL;
	}
}

	/* OpenInfoWindow():
	 *
	 *	Open the info window.
	 */

VOID
OpenInfoWindow()
{
	if(!InfoWindow)
	{
		if(CreateAllGadgets(&InfoGadgetArray[0],&InfoGadgetList,VisualInfo,Screen -> WBorTop + Screen -> Font -> ta_YSize + 1))
		{
			if(InfoWindowLeft == -1)
			{
				InfoWindowLeft	= Screen -> Width - SZ_GetWindowWidth();
				InfoWindowTop	= (Screen -> Height - SZ_GetWindowHeight()) / 2;
			}

			if(InfoWindow = OpenWindowTags(NULL,
				WA_Left,		InfoWindowLeft,
				WA_Top,			InfoWindowTop,
				WA_Width,		SZ_GetWindowWidth(),
				WA_Height,		SZ_GetWindowHeight(),

				WA_DragBar,		TRUE,
				WA_DepthGadget,		TRUE,
				WA_CloseGadget,		TRUE,
				WA_RMBTrap,		TRUE,
				WA_DepthGadget,		TRUE,
				WA_CustomScreen,	Screen,

				WA_Title,		LocaleString(MSG_INFOWINDOW_STATUS_INFORMATION_TXT),
			TAG_DONE))
			{
				struct MenuItem *SomeItem;

				if(SomeItem = FindThisItem(MEN_STATUS_WINDOW))
					SomeItem -> Flags |= CHECKED;

				AddGList(InfoWindow,InfoGadgetList,(UWORD)-1,(UWORD)-1,NULL);
				RefreshGList(InfoGadgetList,InfoWindow,NULL,(UWORD)-1);
				GT_RefreshWindow(InfoWindow,NULL);

				InfoWindow -> UserPort = Window -> UserPort;

				ModifyIDCMP(InfoWindow,Window -> IDCMPFlags);

				SetMenuStrip(InfoWindow,Menu);

				InfoWindow -> Flags &= ~WFLG_RMBTRAP;

				RefreshInfoWindow();
			}
		}
	}
}
