#include "startup.h"
#include "xsb.h"

struct Window *w;
struct RastPort *rp;
struct Gadget *glist;

void brokeron(void);
void brokeroff(void);
void doblank(char*);
void doprefs(char*);

extern struct Library *XSBBase;

extern char popkey[],hotkey[],xsbname[];
long blankmouse,mousetimeout=30/5;
long screentimeout=300/5,randomblanker;

static long activeblankernum;

void LockWindow(struct Window*);
void UnlockWindow(struct Window*);

extern char version[];

static long __regargs slidercalc(long val)
{
	return(val*5);
}

void loadprefs(void)
{
	BPTR f;

	if(f=CreateDir("ENV:XSB")) UnLock(f);
	if(f=CreateDir("ENVARC:XSB")) UnLock(f);

	f=Open("ENV:XSB/XSB.prefs",MODE_OLDFILE);
	if(!f) return;

	Read(f,popkey,40);
	Read(f,hotkey,40);
	Read(f,xsbname,30);
	Read(f,&blankmouse,4);
	Read(f,&mousetimeout,4);
	Read(f,&screentimeout,4);
	Read(f,&randomblanker,4);
	Close(f);
}

void saveprefs(char *name)
{
	BPTR f=Open(name,MODE_NEWFILE);
	if(!f) return;

	Write(f,popkey,40);
	Write(f,hotkey,40);
	Write(f,xsbname,30);
	Write(f,&blankmouse,4);
	Write(f,&mousetimeout,4);
	Write(f,&screentimeout,4);
	Write(f,&randomblanker,4);
	Write(f,version,strlen(version));
	Close(f);
}
	

static struct List labels;
static void getxsblist(void)
{
	char parsed[64];
	struct Node *node;
	char *mem,*p;
	long blankercount=0;

	struct ExAllData *ead=AllocVec(8192,MEMF_CLEAR);
	struct ExAllControl *eac=AllocDosObjectTagList(DOS_EXALLCONTROL,TAG_DONE);
	BPTR lock=Lock("LIBS:",SHARED_LOCK);
	if(!ead || !eac || !lock) goto xit;
	NewList(&labels);
	activeblankernum=0;
	ParsePatternNoCase("XSB#?.library",parsed,64);
	eac->eac_MatchString=parsed;
	ExAll(lock,ead,8192,ED_NAME,eac);
	if(!eac->eac_Entries) goto xit;

	while(ead) {
		node=AllocVec(sizeof(struct Node),MEMF_CLEAR);
		if(!stricmp(ead->ed_Name,xsbname)) activeblankernum=blankercount;
		p=&ead->ed_Name[3];
		while(*p!='.') p++; *p=0;
		p=&ead->ed_Name[3];
		mem=AllocVec(strlen(p),0);
		strcpy(mem,p);
		node->ln_Name=mem;
		AddTail(&labels,node);
		ead=ead->ed_Next;
		blankercount++;
	}
xit:
	if(ead) FreeVec(ead);
	if(eac) FreeDosObject(DOS_EXALLCONTROL,eac);
	if(lock) UnLock(lock);
}

static void freelabels(void)
{
	struct Node *l;

	while(l=RemHead(&labels)) {
		FreeVec(l->ln_Name);
		FreeVec(l);
	}
}

struct Node *findnode(int num)
{
	struct Node *n=labels.lh_Head;
	int c;

	for(c=0; c<num; c++) n=n->ln_Succ;
	return(n);
}

static void doblankerinfo(char *name)
{
	if(!(XSBBase=OldOpenLibrary(name))) {
		doreq("XSBCX","Can't open blanker library\n%s","Cancel",name);
		return;
	}
	LockWindow(w);
	doreq(name,XSBGetID(),"OK");
	CloseLibrary(XSBBase);
	UnlockWindow(w);
}


void popup(void)
{
	struct IntuiMessage *im;
	long code,class;
	struct Gadget *g;
	int running=1;
	long tempblankmouse=blankmouse;
	long tempmousetimeout=mousetimeout;
	long tempscreentimeout=screentimeout;
	long temprandomblanker=randomblanker;
	char tempxsbname[40],temppopkey[40],temphotkey[40];
	
	strcpy(tempxsbname,xsbname);
	strcpy(temphotkey,hotkey);
	strcpy(temppopkey,popkey);
	
	getxsblist();
	if(!(w=OpenWindowTags(0,
		WA_Left,50,WA_Top,50,
		WA_Width,450,WA_Height,175,
		WA_Title,"XSBCX Setup Window",
		WA_ScreenTitle,"XSBCX V1.0 (" __DATE__ ") © 1992 by Oliver Wagner, All Rights Reserved",
		WA_Flags,ACTIVATE|WINDOWDRAG|WINDOWDEPTH|WINDOWCLOSE|REPORTMOUSE,
		WA_IDCMP,CLOSEWINDOW|GADGETUP|GADGETDOWN|MOUSEMOVE,
		WA_AutoAdjust,TRUE,
		TAG_DONE))) return;
	rp=w->RPort;
	gt_init();
	glist=gt_newlist();
	gt_drawbox(8,15,434,40,1);
	gt_drawbox(196,57,234+12,33,1);
	gt_drawbox(192,57+34,234+12+4,56,1);
	gt_drawbox(8,57,186,90,1);
	SetAPen(rp,0);
	RectFill(rp,192,57+34+1,195,57+34+1+53);

	gt_createg(40,152, 70,15, BUTTON_KIND, "Save", 0, TAG_DONE);
	gt_createg(225-35,152, 70,15, BUTTON_KIND, "Use", 0, TAG_DONE);
	gt_createg(340,152, 70,15, BUTTON_KIND, "Cancel", 0, TAG_DONE);

	gt_createg(105,20,328,14, STRING_KIND, "Blank Key:", NG_HIGHLABEL, GTST_String,hotkey, GTST_MaxChars,40, TAG_DONE); 
	gt_createg(105,36,328,14, STRING_KIND, "Popup Key:", NG_HIGHLABEL, GTST_String,popkey, GTST_MaxChars,40, TAG_DONE); 

	gt_createg(309,62, 40,14, CHECKBOX_KIND, "Blank Mouse:", NG_HIGHLABEL, GTCB_Checked, blankmouse, TAG_DONE);
	gt_createg(309,63+13, 85,10, SLIDER_KIND, "Timeout:", NG_HIGHLABEL, GTSL_Min,1, GTSL_Max,36, GTSL_MaxLevelLen,4, GTSL_LevelFormat, "%-3lds", GTSL_LevelPlace,PLACETEXT_RIGHT, GTSL_DispFunc, slidercalc, PGA_Freedom, LORIENT_HORIZ, GTSL_Level,mousetimeout,GA_RelVerify,TRUE,TAG_DONE);

	gt_createg(309,62+33, 40,14, CHECKBOX_KIND, "Pick Random:", NG_HIGHLABEL, GTCB_Checked, randomblanker, TAG_DONE);
	gt_createg(309,63+13+33, 85,10, SLIDER_KIND,"Timeout:", NG_HIGHLABEL, GTSL_Min,1, GTSL_Max,36*3, GTSL_MaxLevelLen,4, GTSL_LevelFormat, "%-3lds", GTSL_LevelPlace,PLACETEXT_RIGHT, GTSL_DispFunc, slidercalc, PGA_Freedom, LORIENT_HORIZ, GA_RelVerify,TRUE,GTSL_Level,screentimeout,TAG_DONE);

	gt_createg(220,63+33+13+18, 50,13, BUTTON_KIND, "Test", 0,TAG_DONE);
	gt_createg(220+75,63+33+13+18, 50,13, BUTTON_KIND, "Info", 0,TAG_DONE);
	gt_createg(220+150,63+33+13+18, 50,13, BUTTON_KIND, "Prefs", 0,TAG_DONE);

	gt_createg(20,75,160,70, LISTVIEW_KIND, "Avaible Blankers:", NG_HIGHLABEL|PLACETEXT_ABOVE, 
		GTLV_Top,0,GTLV_Selected,activeblankernum,
		GTLV_Labels,&labels,
		GTLV_ScrollWidth,16,
		GTLV_ShowSelected,0,
		TAG_DONE);

	gt_endlist();

	while(running) {
		while(!(im=GT_GetIMsg(w->UserPort))) WaitPort(w->UserPort);
		class=im->Class;
		code=im->Code;
		g=im->IAddress;
		GT_ReplyIMsg(im);
		switch(class) {
			case CLOSEWINDOW: running=0; break;
			case GADGETUP: switch(g->GadgetID) {
				case 1:
				case 2: 
					strcpy(xsbname,tempxsbname);
					blankmouse=tempblankmouse;
					mousetimeout=tempmousetimeout;
					randomblanker=temprandomblanker;
					screentimeout=tempscreentimeout;
					strcpy(hotkey,gt_findstring(4));
					strcpy(popkey,gt_findstring(5));
					if(g->GadgetID==1) saveprefs("ENVARC:XSB/XSB.prefs");
					saveprefs("ENV:XSB/XSB.prefs");

				case 3: running=0; break;
				case 4: ActivateGadget(gt_findid(5),w,0); break;
/*				case 5: break;*/
				case 6: tempblankmouse=gt_findstate(6); break;
				case 7: tempmousetimeout=code; break;
				case 8: temprandomblanker=gt_findstate(8); break;
				case 9: tempscreentimeout=code; break;
				case 10: Delay(10); LockWindow(w); brokeron(); doblank(tempxsbname); brokeroff(); UnlockWindow(w); break;
				case 11: doblankerinfo(tempxsbname); break;
				case 12: LockWindow(w); doprefs(tempxsbname); UnlockWindow(w); break;
				case 13: sprintf(tempxsbname,"xsb%s.library",findnode(code)->ln_Name); break;
			}
		}
	}

	gt_remlist(glist);
	CloseWindow(w);
	freelabels();
}
