/*
** GUI Functions
*/

#include <stdio.h>

#include <proto/exec.h>
#include <proto/muimaster.h>
#include <libraries/mui.h>
#ifndef MAKE_ID
#define MAKE_ID(a,b,c,d) ((ULONG) (a)<<24 | (ULONG) (b)<<16 | (ULONG) (c)<<8 | (ULONG) (d))
#endif
#define MUIF __saveds ULONG __asm
#define REG(x) register __ ## x

struct Library *MUIMasterBase;

#include "prefs.h"
#include "jlp.h"
#include "gui.h"
#include "jlogo.h"

void gui_setprefs(void);
void gui_useprefs(void);
void gui_bwin(int mode);
MUIF guif_jlup(REG(a0) struct Hook *h,REG(a2) Object *app);
MUIF guif_jldown(REG(a0) struct Hook *h,REG(a2) Object *app);
MUIF guif_pbut(REG(a0) struct Hook *h,REG(a2) Object *app, REG(a1) u_long *butid);
MUIF guif_mbut(REG(a0) struct Hook *h,REG(a2) Object *app, REG(a1) u_long *butid);


int gui_Setup(void) {

	u_long temp;
	static struct Hook jlupHook = {{0,0}, &guif_jlup, NULL, NULL};
	static struct Hook jldownHook = {{0,0}, &guif_jldown, NULL, NULL};
	static struct MUI_Command RexxCmds[] = {
		{ "jlup", NULL, NULL, &jlupHook },
		{ "jldown", NULL, NULL, &jldownHook },
		{ NULL, NULL, NULL, NULL }
	};
	static struct Hook pbutHook = {{0,0}, &guif_pbut, NULL, NULL};
	static struct Hook mbutHook = {{0,0}, &guif_mbut, NULL, NULL};

	if ((MUIMasterBase = OpenLibrary(MUIMASTER_NAME,MUIMASTER_VMIN)) == 0) {
		printf("Cannot open muimaster.library!\n");
		return(-1);
	}

	if (!(mygui->app = ApplicationObject,
		MUIA_Application_Title,		"JL dyndns",
		MUIA_Application_Version,	"$VER: JL dyndns v1.0 (09-04-98)",
		MUIA_Application_Author,		"Palpa <palpa@garanti.net.tr>",
		MUIA_Application_Description,	"JustLinux Dynamic DNS Client",
		MUIA_Application_Base,		"JLDYNDNS",
		MUIA_Application_Commands,	RexxCmds,

		SubWindow, mygui->mwin = WindowObject,
			MUIA_Window_ID, MAKE_ID('M','A','I','N'),
			MUIA_Window_Title, "JL dyndns",
			MUIA_Window_ScreenTitle, "JL dyndns v1.0 coded by Palpa (http://palpa.cjb.net)",
			MUIA_Window_Menustrip, MenustripObject,
				Child, MenuObject,
					MUIA_Menu_Title, "JL dyndns",
					Child, mygui->amuimenu = MenuitemObject,
						MUIA_Menuitem_Title, "About MUI...",
					End,
					Child, mygui->msetmenu = MenuitemObject,
						MUIA_Menuitem_Title, "MUI Settings...",
					End,
					Child, mygui->quitmenu = MenuitemObject,
						MUIA_Menuitem_Title, "Quit",
					End,
				End,
			End,
			WindowContents, VGroup,
				Child, BodychunkObject,
					MUIA_FixWidth, JLOGO_WIDTH,
					MUIA_FixHeight, JLOGO_HEIGHT,
					MUIA_Bitmap_Width, JLOGO_WIDTH,
					MUIA_Bitmap_Height, JLOGO_HEIGHT,
					MUIA_Bodychunk_Depth, JLOGO_DEPTH,
					MUIA_Bodychunk_Body, (ULONG *)JLOGO_body,
					MUIA_Bodychunk_Compression, JLOGO_COMP,
					MUIA_Bodychunk_Masking, JLOGO_MASK,
					MUIA_Bitmap_SourceColors, (ULONG *)JLOGO_colors,
				End,
				Child, mygui->mupbut = SimpleButton("_Update"),
				Child, mygui->moffbut = SimpleButton("_Down"),
				Child, mygui->mprfbut = SimpleButton("_Settings..."),
				Child, mygui->mtext = TextObject,
					TextFrame,
					MUIA_Background, MUII_TextBack,
					MUIA_Text_PreParse, "\33c",
					MUIA_Text_Contents, "Welcome to JL dyndns :)",
				End,
			End,
		End,

		SubWindow, mygui->pwin = WindowObject,
			MUIA_Window_ID, MAKE_ID('P','R','E','F'),
			MUIA_Window_Title, "Preferences",
			WindowContents, VGroup,
				Child, ColGroup(2),
					Child, TextObject,
						MUIA_HorizWeight, 25,
						MUIA_Text_Contents, "\33rUsername",
					End,
					Child, mygui->puserstr = StringObject,
						MUIA_HorizWeight, 75,
						StringFrame,
						MUIA_String_AdvanceOnCR, TRUE,
						MUIA_CycleChain, 1,
					End,
					Child, TextObject,
						MUIA_HorizWeight, 25,
						MUIA_Text_Contents, "\33rPassword",
					End,
					Child, mygui->ppassstr = StringObject,
						MUIA_HorizWeight, 75,
						StringFrame,
						MUIA_String_AdvanceOnCR, TRUE,
						MUIA_CycleChain, 1,
					End,
					Child, TextObject,
						MUIA_HorizWeight, 25,
						MUIA_Text_Contents, "\33rHostname",
					End,
					Child, mygui->phoststr = StringObject,
						MUIA_HorizWeight, 75,
						StringFrame,
						MUIA_CycleChain, 1,
					End,
				End,
				Child, HGroup,
					Child, mygui->psavbut = SimpleButton("_Save"),
					Child, mygui->pusebut = SimpleButton("_Use"),
					Child, mygui->pcanbut = SimpleButton("_Cancel"),
				End,
			End,
		End,

		SubWindow, mygui->bwin = WindowObject,
			MUIA_Window_ID, MAKE_ID('B','U','S','Y'),
			MUIA_Window_Title, "Updating",
			WindowContents, VGroup,
				Child, TextObject,
					TextFrame,
					MUIA_Background, MUII_TextBack,
					MUIA_Text_Contents, "Updating IP number on the JustLinux server...",
				End,
			End,
		End,
	End)) {
		printf("Cannot create mui app!\n");
		CloseLibrary(MUIMasterBase);
		return(-1);
	}

	gui_setprefs();

	DoMethod(mygui->mprfbut,MUIM_Notify,MUIA_Pressed,FALSE,mygui->app,3,MUIM_CallHook,&pbutHook,0);
	DoMethod(mygui->psavbut,MUIM_Notify,MUIA_Pressed,FALSE,mygui->app,3,MUIM_CallHook,&pbutHook,1);
	DoMethod(mygui->pusebut,MUIM_Notify,MUIA_Pressed,FALSE,mygui->app,3,MUIM_CallHook,&pbutHook,2);
	DoMethod(mygui->pcanbut,MUIM_Notify,MUIA_Pressed,FALSE,mygui->app,3,MUIM_CallHook,&pbutHook,3);
	DoMethod(mygui->pwin,MUIM_Notify,MUIA_Window_CloseRequest,TRUE,mygui->app,3,MUIM_CallHook,&pbutHook,3);

	DoMethod(mygui->mupbut,MUIM_Notify,MUIA_Pressed,FALSE,mygui->app,3,MUIM_CallHook,&mbutHook,0);
	DoMethod(mygui->moffbut,MUIM_Notify,MUIA_Pressed,FALSE,mygui->app,3,MUIM_CallHook,&mbutHook,1);

	DoMethod(mygui->amuimenu,MUIM_Notify,MUIA_Menuitem_Trigger,MUIV_EveryTime,mygui->app,2,MUIM_Application_AboutMUI,mygui->mwin);
	DoMethod(mygui->msetmenu,MUIM_Notify,MUIA_Menuitem_Trigger,MUIV_EveryTime,mygui->app,2,MUIM_Application_OpenConfigWindow,0);
	DoMethod(mygui->quitmenu,MUIM_Notify,MUIA_Menuitem_Trigger,MUIV_EveryTime,mygui->app,2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit);
	DoMethod(mygui->mwin,MUIM_Notify,MUIA_Window_CloseRequest,TRUE,mygui->app,2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit);
	set(mygui->mwin,MUIA_Window_Open,TRUE);
	get(mygui->mwin,MUIA_Window_Open,&temp);
	if (temp!=TRUE) {
		printf("Failed to open main window.\n");
		MUI_DisposeObject(mygui->app);
		CloseLibrary(MUIMasterBase);
		return(-1);
	}

	if (prf_Get(PRFA_USER)==0) {
		set(mygui->pwin,MUIA_Window_Open,TRUE);
		set(mygui->pwin,MUIA_Window_ActiveObject,mygui->puserstr);
	}

	return(0);

}


void gui_Loop(long signum) {

	ULONG sigs=0;
	ULONG sigmask;

	sigmask = (1L << signum);

	while(DoMethod(mygui->app,MUIM_Application_NewInput,&sigs) != MUIV_Application_ReturnID_Quit) {
		if (sigs) {
			sigs = Wait(sigs|SIGBREAKF_CTRL_C);
			if (sigs&SIGBREAKF_CTRL_C)
				break;
			/* if (sigs&sigmask)
				func_Recv(); */
		}
	}

}


void gui_Free(void) {

	MUI_DisposeObject(mygui->app);
	CloseLibrary(MUIMasterBase);

}


MUIF guif_jlup(REG(a0) struct Hook *h,REG(a2) Object *app) {

	int ret;

	gui_bwin(1);
	ret = jlp_DoItBabe(MODE_UP);
	gui_bwin(0);
	return((ULONG)ret);

}


MUIF guif_jldown(REG(a0) struct Hook *h,REG(a2) Object *app) {

	int ret;

	gui_bwin(1);
	ret = jlp_DoItBabe(MODE_OFF);
	gui_bwin(0);
	return((ULONG)ret);

}


MUIF guif_mbut(REG(a0) struct Hook *h,REG(a2) Object *app, REG(a1) u_long *butid) {

	gui_bwin(1);
	switch(*butid) {
		case 0:
			jlp_DoItBabe(MODE_UP);
			break;
		case 1:
			jlp_DoItBabe(MODE_OFF);
			break;
	}
	gui_bwin(0);
	return(0);

}


void gui_bwin(int mode) {

	switch(mode) {
		case 1:
			set(mygui->bwin,MUIA_Window_Open,TRUE);
			break;
		case 0:
			set(mygui->bwin,MUIA_Window_Open,FALSE);
			break;
	}

}


void gui_Say(char *mesg) {

	set(mygui->mtext,MUIA_Text_Contents,mesg);

}


/* Prefs functions */

MUIF guif_pbut(REG(a0) struct Hook *h,REG(a2) Object *app, REG(a1) u_long *butid) {

	switch(*butid) {
		case 0:
			set(mygui->pwin,MUIA_Window_Open,TRUE);
			set(mygui->pwin,MUIA_Window_ActiveObject,mygui->puserstr);
			return(0);
		case 1:
			gui_useprefs();
			prf_Save();
			break;
		case 2:
			gui_useprefs();
			break;
		case 3:
			gui_setprefs();
			break;
	}
	set(mygui->pwin,MUIA_Window_Open,FALSE);
	return(0);

}


void gui_setprefs(void) {

	set(mygui->puserstr,MUIA_String_Contents,prf_Get(PRFA_USER));
	set(mygui->ppassstr,MUIA_String_Contents,prf_Get(PRFA_PASS));
	set(mygui->phoststr,MUIA_String_Contents,prf_Get(PRFA_HOST));

}


void gui_useprefs(void) {

	u_long temp;

	GetAttr(MUIA_String_Acknowledge,mygui->puserstr,&temp);
	if (((char *)temp)[0]!=0) prf_Set(PRFA_USER,temp); else prf_Set(PRFA_USER,0);
	GetAttr(MUIA_String_Acknowledge,mygui->ppassstr,&temp);
	if (((char *)temp)[0]!=0) prf_Set(PRFA_PASS,temp); else prf_Set(PRFA_PASS,0);
	GetAttr(MUIA_String_Acknowledge,mygui->phoststr,&temp);
	if (((char *)temp)[0]!=0) prf_Set(PRFA_HOST,temp); else prf_Set(PRFA_HOST,0);

}
