#include <exec/types.h>
#include <exec/memory.h>
#include <exec/libraries.h>
#include <intuition/gadgetclass.h>
#include <string.h>

#include <proto/exec.h>
#include <proto/intuition.h>
#include <proto/gadtools.h>

#include "/include/server.h"

struct Gadget *glist, *gad, *blank_gdg, *random_gdg, *list_gdg, *args_gdg,
       *time_gdg, *tchange_gdg, *bri_gdg, *snd_gdg;

extern UWORD wwidth, wheight;
extern struct List ClientsList, *ModeList;
extern struct ModeNode *DisplayNode;
extern UWORD delaySecs, changeSecs;
extern UBYTE briLevel, sndLevel;
extern BOOL CommodityActive, RandomClient;
extern UWORD DefaultClient;
extern WORD ActiveClient;

extern void FreeClientsList( void );
extern struct List *CreateModeList( void );
extern void DeleteModeList( void );
extern void GetDisplayNodeFromID( void );
extern struct ClientNode *FindClientNode( WORD );

extern char *msg_timeout, *msg_changetime, *msg_random, *msg_hide,
     *msg_quit, *msg_blank, *msg_killsel, *msg_addcli, *msg_brilevel,
     *msg_sndlevel;


 /****************
 *               *
 * GADGETS STUFF *
 *               *
 ****************/

struct VisualInfo *vi;
UWORD fonth;
struct NewGadget newgdg = { 0, 0, 0, 0, NULL, NULL, 0, 0, 0, 0 };
struct Screen *WBS;
struct Library *GadToolsBase;
struct IntuitionBase *IntuitionBase;
UWORD wleft = (UWORD)~0, wtop = (UWORD)~0;
UWORD zoomdims[4];
struct DrawInfo *dri;

struct IntuiText it = { 0, 0, 0, 0, 0, NULL, NULL, NULL };
UWORD maxstrlen;

UWORD CheckMax( STRPTR text, UWORD add_gdw, UWORD prev )
{
register UWORD ilength;

it.IText = text;
if ( ( ilength = IntuiTextLength( &it ) + add_gdw ) > prev )
	return( ilength );
else
	return( prev );
}


UWORD SetUpGadgets( void )
{
if ( CreateModeList() )
	{
	GetDisplayNodeFromID();

	if ( WBS = LockPubScreen( NULL ) )
		{
		fonth = WBS->Font->ta_YSize;
		if ( fonth < 12 )
			fonth = 12;
		it.ITextFont = WBS->Font;
		newgdg.ng_TextAttr = WBS->Font;
		newgdg.ng_Height = fonth + 4;

		if ( vi = GetVisualInfo( WBS, TAG_END ) )
			{
			newgdg.ng_VisualInfo = vi;
			newgdg.ng_TopEdge = WBS->BarHeight + 3;

			maxstrlen = 0;
			maxstrlen = CheckMax( msg_timeout, 50, maxstrlen );
			maxstrlen = CheckMax( msg_changetime, 50, maxstrlen );
			maxstrlen = CheckMax( msg_brilevel, 50, maxstrlen );
			maxstrlen = CheckMax( msg_random, 26, maxstrlen );
			maxstrlen = CheckMax( msg_hide, 0, maxstrlen );
			maxstrlen = CheckMax( msg_quit, 0, maxstrlen );
			maxstrlen = CheckMax( msg_blank, 0, maxstrlen );
			maxstrlen = CheckMax( msg_killsel, 0, maxstrlen );
			maxstrlen = CheckMax( msg_addcli, 0, maxstrlen );
			newgdg.ng_LeftEdge = WBS->WBorLeft + maxstrlen - 30;

			gad = CreateContext (&glist);

			newgdg.ng_Flags = PLACETEXT_LEFT;
			newgdg.ng_Width = 50;
			newgdg.ng_GadgetText = msg_timeout;
			newgdg.ng_GadgetID = TIMEOUT_GDG;
			gad = time_gdg = CreateGadget( INTEGER_KIND, gad, &newgdg,
				GTIN_Number, delaySecs,
				GTIN_MaxChars, 5,
				GT_Underscore, '_', TAG_END );

			newgdg.ng_TopEdge += gad->Height + 7;
			newgdg.ng_GadgetText = msg_changetime;
			newgdg.ng_GadgetID = CHANGETIME_GDG;
			gad = tchange_gdg = CreateGadget( INTEGER_KIND, gad, &newgdg,
				GTIN_Number, changeSecs,
				GTIN_MaxChars, 5,
				GA_Disabled, !RandomClient,
				GT_Underscore, '_', TAG_END );

			newgdg.ng_TopEdge += gad->Height + 7;
			newgdg.ng_GadgetText = msg_brilevel;
			newgdg.ng_GadgetID = BRILEVEL_GDG;
			gad = bri_gdg = CreateGadget( INTEGER_KIND, gad, &newgdg,
				GTIN_Number, briLevel,
				GTIN_MaxChars, 3,
				GT_Underscore, '_', TAG_END );

			newgdg.ng_TopEdge += gad->Height + 7;
			newgdg.ng_GadgetText = msg_sndlevel;
			newgdg.ng_GadgetID = SNDLEVEL_GDG;
			gad = snd_gdg = CreateGadget( INTEGER_KIND, gad, &newgdg,
				GTIN_Number, sndLevel,
				GTIN_MaxChars, 3,
				GT_Underscore, '_', TAG_END );

			newgdg.ng_Height = fonth - 1;
			newgdg.ng_Width = 26;
			newgdg.ng_GadgetID = RANDOM_GDG;
			newgdg.ng_TopEdge += gad->Height + 7;
			newgdg.ng_LeftEdge = WBS->WBorLeft + maxstrlen - 6;
			newgdg.ng_GadgetText = msg_random;
			random_gdg = gad = CreateGadget( CHECKBOX_KIND, gad, &newgdg,
				GTCB_Checked, RandomClient,
				GTCB_Scaled, TRUE,
				GT_Underscore, '_', TAG_END );

			newgdg.ng_Height = fonth + 4;
			newgdg.ng_GadgetID = HIDE_GDG;
			newgdg.ng_TopEdge += fonth + 2;
			newgdg.ng_LeftEdge = WBS->WBorLeft + 4;
			newgdg.ng_Flags = 0;
			newgdg.ng_Width = maxstrlen + 16;
			newgdg.ng_GadgetText = msg_hide;
			gad = CreateGadget( BUTTON_KIND, gad, &newgdg,
				GT_Underscore, '_', TAG_END );
			
			newgdg.ng_GadgetID = QUIT_GDG;
			newgdg.ng_TopEdge += gad->Height + 1;
			newgdg.ng_GadgetText = msg_quit;
			gad = CreateGadget( BUTTON_KIND, gad, &newgdg,
				GT_Underscore, '_', TAG_END );

			newgdg.ng_GadgetID = BLANK_GDG;
			newgdg.ng_TopEdge += gad->Height + 1;
			newgdg.ng_GadgetText = msg_blank;
			blank_gdg = gad = CreateGadget( BUTTON_KIND, gad, &newgdg,
				GT_Underscore, '_', TAG_END );

			newgdg.ng_GadgetID = KILL_GDG;
			newgdg.ng_LeftEdge = WBS->WBorLeft + maxstrlen + 22;
			newgdg.ng_GadgetText = msg_killsel;
			gad = CreateGadget( BUTTON_KIND, gad, &newgdg,
				GT_Underscore, '_', TAG_END );

			newgdg.ng_GadgetID = ADDCLIENTS_GDG;
			newgdg.ng_TopEdge -= blank_gdg->Height + 1;
			newgdg.ng_GadgetText = msg_addcli;
			gad = CreateGadget( BUTTON_KIND, gad, &newgdg,
				GT_Underscore, '_', TAG_END );

			newgdg.ng_GadgetID = CLIENTARGS_GDG;
			newgdg.ng_TopEdge -= blank_gdg->Height + 1;
			newgdg.ng_GadgetText = NULL;
			args_gdg = gad = CreateGadget( STRING_KIND, gad, &newgdg,
				GTST_MaxChars, ARGS_MAXLENGTH,
				GTST_String, FindClientNode( DefaultClient )->cn_ClientArgs,
				TAG_END );

			newgdg.ng_GadgetID = LIST_GDG;
			newgdg.ng_TopEdge = WBS->BarHeight + 3;
			newgdg.ng_GadgetText = NULL;
			newgdg.ng_Height = gad->TopEdge - newgdg.ng_TopEdge - 2;
			newgdg.ng_Flags = PLACETEXT_ABOVE;
			list_gdg = gad = CreateGadget( LISTVIEW_KIND, gad, &newgdg,
				GTLV_Labels, &ClientsList,
				GTLV_Top, DefaultClient,
				GTLV_Selected, DefaultClient,
				GTLV_ShowSelected, NULL,
				TAG_END );

			newgdg.ng_GadgetID = MODEID_GDG;
			newgdg.ng_TopEdge =  blank_gdg->TopEdge + blank_gdg->Height + 1;
			newgdg.ng_LeftEdge = WBS->WBorLeft + 4;
			newgdg.ng_Width = maxstrlen * 2 + 34;
			newgdg.ng_Height -= fonth << 1;
			newgdg.ng_GadgetText = NULL;
			gad = CreateGadget( LISTVIEW_KIND, gad, &newgdg,
				GTLV_Labels, ModeList,
				GTLV_Top, DisplayNode->mn_Index,
				GTLV_Selected, DisplayNode->mn_Index,
				GTLV_ShowSelected, NULL,
				TAG_END );

			/* Set up gadgets */
			if ( gad )
				{
				wwidth = (UWORD)(gad->LeftEdge + gad->Width + 4 + WBS->WBorRight);
				if ( GadToolsBase->lib_Version < 38 )
					wheight = (UWORD)(gad->TopEdge + 1 + fonth + WBS->WBorBottom);
				else
					wheight = (UWORD)(gad->TopEdge + WBS->WBorBottom);
				if ( wleft == ~0 )
					wleft = (WBS->Width - wwidth)>>1;
				if ( wtop == ~0 )
					wtop = (WBS->Height - wheight)>>1;

				zoomdims[0] = (UWORD)~0;
				zoomdims[1] = (UWORD)~0;
				zoomdims[2] = wwidth;
				zoomdims[3] = wheight + gad->Height + 2;

				return( TRUE );
				}

			FreeGadgets( glist );
			}
		FreeVisualInfo( vi );
		vi = NULL;
		}
	UnlockPubScreen( NULL, WBS );
	}
DeleteModeList();

return( FALSE );
}


void RemoveGadgets( void )
{
FreeGadgets( glist );
FreeVisualInfo( vi );
UnlockPubScreen( NULL, WBS );
DeleteModeList();
}
