#include <clib/alib_protos.h>
#include <pragma/dos_lib.h>
#include <pragma/exec_lib.h>
#include <pragma/icon_lib.h>
#include <pragma/intuition_lib.h>
#include <pragma/muimaster_lib.h>
#include <mui/xpk_mcc.h>
#include <tools/tools.h>
#include <stdlib.h>
#include <string.h>

struct Arg
{
long *mode,*dither,*depth;
char *xpk;
long *xpkmode;
char *password;
};

APTR
app,window,
CY_Mode,CY_Dither,SLI_Depth,XPK_Obj,
BT_Save,BT_Use,BT_Quit;

char
*cycle_mode[]={"V40 AGA Mode","V43 CGX Mode",0},
*cycle_dither[]={"No Dithering","Floyd-Steinberg",0};

enum
{
ID_BT_Save=1,
ID_BT_Use
};

void InitGUI()
{
static char *reg[3]={
"Graphics","Xpk",0};

app=ApplicationObject,
	MUIA_Application_Title,"RGFX Datatypes Preferences",
	MUIA_Application_Base,"RGFX",
	MUIA_Application_Author,"Achim Stegemann",
	MUIA_Application_Copyright,"© 1998-2000 by Achim Stegemann",
	MUIA_Application_Version,"$VER:RGFXPrefs 43.13 (21.01.00)",
	MUIA_Application_Description,"MUI-Preferences 43.13 for RGFX",
	MUIA_Application_UseRexx,0,
	MUIA_Application_SingleTask,1,
	SubWindow,window=WindowObject,
		MUIA_Window_Title,"RGFX MUI-Preferences",
		MUIA_Window_ID,'RGFX',
		WindowContents,VGroup,
			Child,RegisterGroup(reg),
				Child,ColGroup(2),
					GroupFrame,
					MUIA_Background,MUII_GroupBack,
					Child,Label1("Gfx Mode"),
					Child,CY_Mode=CycleObject,
						MUIA_CycleChain,1,
						MUIA_Cycle_Active,1,
						MUIA_Cycle_Entries,cycle_mode,
					End,
					Child,Label1("V40 Dithermode"),
					Child,CY_Dither=CycleObject,
						MUIA_CycleChain,1,
						MUIA_Cycle_Entries,cycle_dither,
					End,
					Child,Label1("V40 CLUT Depth"),
					Child,SLI_Depth=SliderObject,
						MUIA_CycleChain,1,
						MUIA_Numeric_Min,3,
						MUIA_Numeric_Max,8,
						MUIA_Numeric_Value,8,
					End,
				End,
				Child,XPK_Obj=XpkObject,
					MUIA_Xpk_Method,"NUKE",
				End,
			End,
			Child,HGroup,
				Child,BT_Save=TextObject,
					ButtonFrame,
					MUIA_Background,MUII_ButtonBack,
					MUIA_CycleChain,1,
					MUIA_ControlChar,'s',
					MUIA_InputMode,MUIV_InputMode_RelVerify,
					MUIA_Text_PreParse,MUIX_C,
					MUIA_Text_HiCharIdx,'_',
					MUIA_Text_Contents,"_Save",
				End,
				Child,BT_Use=TextObject,
					ButtonFrame,
					MUIA_Background,MUII_ButtonBack,
					MUIA_CycleChain,1,
					MUIA_ControlChar,'u',
					MUIA_InputMode,MUIV_InputMode_RelVerify,
					MUIA_Text_PreParse,MUIX_C,
					MUIA_Text_HiCharIdx,'_',
					MUIA_Text_Contents,"_Use",
				End,
				Child,BT_Quit=TextObject,
					ButtonFrame,
					MUIA_Background,MUII_ButtonBack,
					MUIA_CycleChain,1,
					MUIA_ControlChar,'c',
					MUIA_InputMode,MUIV_InputMode_RelVerify,
					MUIA_Text_PreParse,MUIX_C,
					MUIA_Text_HiCharIdx,'_',
					MUIA_Text_Contents,"_Cancel",
				End,
			End,
		End,
	End,
End;
if(!app) exit(20);
NotifyAppClose(window);
NotifyButton(BT_Save,ID_BT_Save);
NotifyButton(BT_Use,ID_BT_Use);
NotifyButton(BT_Quit,MUIV_Application_ReturnID_Quit);
}

void Ende()
{
if(app) MUI_DisposeObject(app);
}

void Save(BPTR file)
{
FPrintf(file,"%lu %lu %lu %s %lu %s\n",
MyGetAttr(MUIA_Cycle_Active,CY_Mode),
MyGetAttr(MUIA_Cycle_Active,CY_Dither),
MyGetAttr(MUIA_Numeric_Value,SLI_Depth),
MyGetAttr(MUIA_Xpk_Method,XPK_Obj),
MyGetAttr(MUIA_Xpk_Mode,XPK_Obj),
MyGetAttr(MUIA_Xpk_Password,XPK_Obj));
}

void SaveENV()
{
BPTR file;
if(file=Open("ENV:DataTypes/rgfx.prefs",MODE_NEWFILE))
	{
	Save(file);
	Close(file);
	}
}

void SaveENVARC()
{
BPTR file;
if(file=Open("ENVARC:DataTypes/rgfx.prefs",MODE_NEWFILE))
	{
	Save(file);
	Close(file);
	}
}

void LoadENV()
{
char *var;
if(var=(char *)AllocVec(256,0))
	{
	if(GetVar("ENV:DataTypes/rgfx.prefs",var,256,LV_VAR|GVF_GLOBAL_ONLY)>=0)
		{
		RDArgs *rdargs;
      if(rdargs=(RDArgs *)AllocDosObject(DOS_RDARGS,0))
			{
			RDArgs *args;
			Arg para;
			rdargs->RDA_Source.CS_Buffer=var;
			rdargs->RDA_Source.CS_Length=strlen(var);
			rdargs->RDA_Source.CS_CurChr=0;
			memset(&para,0,sizeof(Arg));
			if(args=ReadArgs("MODE/A/N,DITHER/A/N,DEPTH/A/N,XPK/A,XPKMODE/A/N,PASSWORD",(long *)&para,rdargs))
				{
				long v;
				char xpk[5];
				v=*para.mode;
				if(v<0) v=0;
				else if(v>1) v=1;
				SetAttrs(CY_Mode,MUIA_Cycle_Active,v,TAG_END);
				v=*para.dither;
				if(v<0) v=0;
				else if(v>1) v=1;
				SetAttrs(CY_Dither,MUIA_Cycle_Active,v,TAG_END);
				v=*para.depth;
				if(v<3) v=3;
				else if(v>8) v=8;
				SetAttrs(SLI_Depth,MUIA_Numeric_Value,v,TAG_END);
				strncpy(xpk,para.xpk,4);
				xpk[4]=0;
				SetAttrs(XPK_Obj,MUIA_Xpk_Method,xpk,TAG_END);
				v=*para.xpkmode;
				if(v<0) v=0;
				else if(v>100) v=100;
				SetAttrs(XPK_Obj,MUIA_Xpk_Mode,v,TAG_END);
				if(para.password) SetAttrs(XPK_Obj,MUIA_Xpk_Password,para.password,TAG_END);
				FreeArgs(args);
				}
			FreeDosObject(DOS_RDARGS,rdargs);
			}
		}
	FreeVec(var);
	}
}

void prg()
{
UWORD ende=0;
atexit(Ende);
InitGUI();
LoadENV();
SetAttrs(window,MUIA_Window_Open,1,TAG_END);
while(!ende)
	{
	ULONG signals;
	switch(DoMethod(app,MUIM_Application_NewInput,&signals))
		{
		case MUIV_Application_ReturnID_Quit:
			ende=1;
			break;
		case ID_BT_Save:
			SaveENVARC();
		case ID_BT_Use:
			SaveENV();
			ende=1;
		}
	if(signals) signals=Wait(signals);
	}
}

void main()
{
prg();
}

void wbmain(WBStartup *w)
{
prg();
}
