#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 <tools/tools.h>
#include <stdlib.h>
#include <string.h>

struct Arg
{
long *mode,*res,*dither,*depth;
};

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

char
*cycle_mode[]={"V40 AGA Mode","V43 CGX Mode",0},
*cycle_res[]={"192*128","384*256","768*512","1536*1024","3072*2048","6144*4096",0},
*cycle_dither[]={"No Dithering","Floyd-Steinberg",0};

enum
{
ID_BT_Save=1,
ID_BT_Use,
};

void InitGUI()
{
app=ApplicationObject,
	MUIA_Application_Title,"PCD Datatypes Preferences",
	MUIA_Application_Base,"PCD",
	MUIA_Application_Author,"Achim Stegemann",
	MUIA_Application_Copyright,"© 1998 by Achim Stegemann",
	MUIA_Application_Version,"$VER:PCDPrefs 43.13 (22.01.00)",
	MUIA_Application_Description,"MUI-Preferences 43.13 for PCD",
	MUIA_Application_UseRexx,0,
	MUIA_Application_SingleTask,1,
	SubWindow,window=WindowObject,
		MUIA_Window_Title,"PCD MUI-Preferences",
		MUIA_Window_ID,'PCD',
		WindowContents,VGroup,
			Child,ColGroup(2),
				GroupFrame,
				MUIA_Background,MUII_GroupBack,
				Child,Label1("Mode"),
				Child,CY_Mode=CycleObject,
					MUIA_CycleChain,1,
					MUIA_Cycle_Active,1,
					MUIA_Cycle_Entries,cycle_mode,
				End,
				Child,Label1("Resolution"),
				Child,CY_Res=CycleObject,
					MUIA_CycleChain,1,
					MUIA_Cycle_Active,2,
					MUIA_Cycle_Entries,cycle_res,
				End,
				Child,Label1("V40 Dithermode"),
				Child,CY_Dither=CycleObject,
					MUIA_CycleChain,1,
					MUIA_Cycle_Entries,cycle_dither,
				End,
				Child,Label1("V40 Depth"),
				Child,SLI_Depth=SliderObject,
					MUIA_CycleChain,1,
					MUIA_Numeric_Min,3,
					MUIA_Numeric_Max,8,
					MUIA_Numeric_Value,8,
				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 %lu\n",
MyGetAttr(MUIA_Cycle_Active,CY_Mode),
MyGetAttr(MUIA_Cycle_Active,CY_Res),
MyGetAttr(MUIA_Cycle_Active,CY_Dither),
MyGetAttr(MUIA_Numeric_Value,SLI_Depth));
Flush(file);
}

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

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

void LoadENV()
{
char *var;
if(var=(char *)AllocVec(256,0))
	{
	if(GetVar("ENV:DataTypes/pcd.prefs",var,256,LV_VAR|GVF_GLOBAL_ONLY)>=0)
		{
		RDArgs *rdargs;
      if(rdargs=(RDArgs *)AllocDosObject(DOS_RDARGS,0))
			{
			RDArgs *args;
			Arg para={0,0,0,0};
			rdargs->RDA_Source.CS_Buffer=var;
			rdargs->RDA_Source.CS_Length=strlen(var);
			rdargs->RDA_Source.CS_CurChr=0;
			if(args=ReadArgs("MODE/A/N,RESOLUTION/A/N,DITHER/A/N,DEPTH/A/N",(long *)&para,rdargs))
				{
				long v;
				if(para.mode)
					{
					v=*para.mode;
					if(v<0) v=0;
					else if(v>1) v=1;
					}
				else v=1;
				SetAttrs(CY_Mode,MUIA_Cycle_Active,v,TAG_END);
				if(para.res)
					{
					v=*para.res;
					if(v<0) v=0;
					else if(v>5) v=5;
					}
				else v=2;
				SetAttrs(CY_Res,MUIA_Cycle_Active,v,TAG_END);
				if(para.dither)
					{
					v=*para.dither;
					if(v<0) v=0;
					else if(v>1) v=1;
					}
				else v=0;
				SetAttrs(CY_Dither,MUIA_Cycle_Active,v,TAG_END);
				if(para.depth)
					{
					v=*para.depth;
					if(v<3) v=3;
					else if(v>8) v=8;
					}
				else v=8;
				SetAttrs(SLI_Depth,MUIA_Numeric_Value,v,TAG_END);
				FreeArgs(args);
				}
			FreeDosObject(DOS_RDARGS,rdargs);
			}
		}
	FreeVec(var);
	}
}

void main()
{
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);
	}
}

extern "C" void wbmain()
{
main();
}

