#include <exec/types.h>
#include <exec/memory.h>
#include <intuition/intuition.h>

#include <clib/exec_protos.h>
#include <clib/commodities_protos.h>
#include <clib/intuition_protos.h>
#include <clib/graphics_protos.h>
#include <clib/gadtools_protos.h>
#include <clib/dos_protos.h>
#include <clib/alib_protos.h>
#include <stdio.h>

#include "/include/server.h"

#define MUST_RETRY 0
#define MUST_BLANK 1

extern struct List ClientsList;

extern UWORD fonth, wleft, wtop, DefaultClient, delaySecs, delayEvents;
extern BOOL Blanking, RandomClient, CommodityActive, StayCool, BlankStatus;
extern struct Gadget *glist, *random_gdg, *active_gdg, *modeid_gdg, *list_gdg;
extern CxObj *broker;

extern struct Screen *WBS;
extern struct VisualInfo *vi;
extern struct TextAttr topazFont;

extern BOOL SetUpGadgets(void);
extern void RemoveGadgets(void);

extern void AskFiles( void );

extern void ClearPendingMessages( struct MsgPort * );

extern void StartBlanking( void );
extern void RemoveClient( UWORD, char * );
extern void SendCommandToClient( ULONG );

extern void GetDisplayIDFromNode( UWORD );
extern struct ModeNode *DisplayNode;
extern ULONG DisplayID;

 /***************
 *              *
 * WINDOW STUFF *
 *              *
 ***************/

struct Window *window;
char wname[100];
ULONG windowSignal = NULL;


void DetachGadgets( void )
{
GT_SetGadgetAttrs( list_gdg, window, NULL, GTLV_Labels, ~0, TAG_END );
}


void AttachGadgets( void )
{
GT_SetGadgetAttrs( list_gdg, window, NULL, GTLV_Labels, &ClientsList, GTLV_Selected, DefaultClient,	TAG_END );
}


BOOL PopUpWindow( void )
{
if ( window )
	{
	ActivateWindow( window );
	WindowToFront( window );
	return( TRUE );
	}

if ( SetUpGadgets() )
	{
	if ( window = OpenWindowTags( NULL,
					WA_Width, 300,
					WA_Height, 138 + fonth,
					WA_Left, wleft,
					WA_Top, wtop,
					WA_Gadgets, glist,
					WA_Title, wname,
					WA_ScreenTitle, PROGRAMNAME" "PROGRAMVERSION" © 1994 by Stefano Reksten of 3AM",
					WA_IDCMP, IDCMP_RAWKEY | IDCMP_GADGETUP | IDCMP_CLOSEWINDOW | INTEGERIDCMP | LISTVIEWIDCMP | BUTTONIDCMP | CHECKBOXIDCMP,
					WA_Flags, WFLG_DEPTHGADGET | WFLG_DRAGBAR | WFLG_CLOSEGADGET | WFLG_ACTIVATE,
					TAG_END ) )
		{
		GT_RefreshWindow( window, NULL );
		AttachGadgets();
		windowSignal = 1L << window->UserPort->mp_SigBit;
		return( TRUE );
		}
	RemoveGadgets();
	}
DisplayBeep( NULL );
return( FALSE );
}


void ShutWindow( void )
{
if ( window )
	{
	ClearPendingMessages( window->UserPort );
	wleft = window->LeftEdge;
	wtop = window->TopEdge;
	CloseWindow( window );
	window = NULL;
	windowSignal = NULL;
	RemoveGadgets();
	}
}


void HandleWindowMessages( void )
{
struct IntuiMessage *imsg;
ULONG class;
UWORD code;
ULONG addr;

while( window && ( imsg = GT_GetIMsg( window->UserPort ) ) )
	{
	class = imsg->Class;
	code = imsg->Code;
	addr = (ULONG)imsg->IAddress;
	GT_ReplyIMsg( imsg );

	switch( class )
		{
		case IDCMP_RAWKEY:
			switch( code )
				{
				case 0x13:
					RandomClient ^= TRUE;
					GT_SetGadgetAttrs( random_gdg, window, NULL, GTCB_Checked, RandomClient, TAG_END );
					break;
				case 0x20:
					CommodityActive ^= TRUE;
					GT_SetGadgetAttrs( active_gdg, window, NULL, GTCB_Checked, CommodityActive, TAG_END );
					break;
				case 0x25:
					ShutWindow();
					break;
				case 0x10:
					StayCool = FALSE;
					break;
				case 0x35:
					if ( CommodityActive && !Blanking && BlankStatus != MUST_BLANK )
						{
						Delay( 10 );
						BlankStatus = MUST_BLANK;
						StartBlanking();
						}
					break;
				case 0x33:
					AskFiles();
					break;
				case 0x27:
					RemoveClient( DefaultClient, NULL );
					break;
				}
			break;
		case IDCMP_REFRESHWINDOW:
			GT_BeginRefresh( window );
			GT_EndRefresh( window, TRUE );
			break;
		case IDCMP_CLOSEWINDOW:
			ShutWindow();
			break;
		case IDCMP_GADGETUP:
			switch( ((struct Gadget *)addr)->GadgetID )
				{
				case TIMEOUT_GDG:
					delaySecs = ((struct StringInfo *)((struct Gadget *)addr)->SpecialInfo)->LongInt;
					delayEvents = delaySecs * 10;
					break;
				case RANDOM_GDG:
					RandomClient ^= TRUE;
					break;
				case ACTIVE_GDG:
					CommodityActive ^= TRUE;
					break;
				case HIDE_GDG:
					ShutWindow();
					break;
				case QUIT_GDG:
					StayCool = FALSE;
					break;
				case BLANK_GDG:
					if ( CommodityActive && !Blanking && BlankStatus != MUST_BLANK )
						{
						Delay( 10 );
						BlankStatus = MUST_BLANK;
						StartBlanking();
						}
					break;
				case MODEID_GDG:
					GetDisplayIDFromNode( code );
					break;
				case SHOWINTERFACE_GDG:
					AskFiles();
					break;
				case KILL_GDG:
					RemoveClient( DefaultClient, NULL );
					break;
				case LIST_GDG:
					DefaultClient = code;
					break;
				}
			break;
		}
	}
}
