/*
**	PrefsWin.c
**
**	Copyright (C) 1994,95,96,97 by Bernardo Innocenti
**
**	Preferences panel handling routines.
*/

#include <intuition/intuition.h>
#include <intuition/gadgetclass.h>
#include <libraries/gadtools.h>
#include <libraries/asl.h>
#include <graphics/displayinfo.h>

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

#include "XModulePriv.h"
#include "Gui.h"
#include "CustomClasses.h"



/* Gadgets IDs */

enum {
	GD_PrefsGroup0,
		GD_PrefsGroup1,
			GD_PrefsGroup2,
				GD_PubScreen,
				GD_GetPubScreen,
			GD_PrefsGroup3,
				GD_DisplayMode,
				GD_GetDisplayMode,
			GD_PrefsGroup4,
				GD_WindowFont,
				GD_GetWindowFont,
			GD_PrefsGroup5,
				GD_ListViewFont,
				GD_GetListViewFont,
		GD_PrefsGroup6,
			GD_PrefsGroup7,
				GD_Requesters,
				GD_Refresh,
			GD_PrefsGroup8,
				GD_UseDataTypes,
				GD_AppIcon,
		GD_PrefsGroup9,
			GD_LogLevel,
			GD_PrefsGroup10,
				GD_LogToFile,
				GD_LogFile,
		GD_PrefsGroup11,
			GD_PrefsGroup12,
				GD_AutosaveTime,
				GD_AskAutosave,
			GD_PrefsGroup13,
				GD_DoBackups,
				GD_BackupVersions,
			GD_BackupTemplate,
		GD_PrefsGroup14,
			GD_PrefsUse,
			GD_PrefsCancel,

	Prefs_CNT
};



/* Local functions prototypes */

static void PrefsPostOpen			(struct WinUserData *wud);
static void PrefsPostClose			(void);

static void PubScreenClicked		(struct WinUserData *wud);
static void GetPubScreenClicked		(struct WinUserData *wud);
static void GetDisplayModeClicked	(struct WinUserData *wud);
static void GetWindowFontClicked	(struct WinUserData *wud);
static void GetListViewFontClicked	(struct WinUserData *wud);
static void RequestersClicked		(struct WinUserData *wud);
static void RefreshClicked			(struct WinUserData *wud);
static void LogLevelClicked			(struct WinUserData *wud);
static void LogFileClicked			(struct WinUserData *wud);
static void	BackupTemplateClicked	(struct WinUserData *wud);
static void BackupVersionsClicked	(struct WinUserData *wud);
static void AutosaveTimeClicked		(struct WinUserData *wud);
static void PrefsUseClicked			(struct WinUserData *wud);
static void PrefsCancelClicked		(struct WinUserData *wud);



/* Local data */

static struct ScrInfo NewScrInfo;
static struct GuiSwitches NewGuiSwitches;
static struct TextAttr NewWindowAttr;
static struct TextAttr NewListAttr;



static UBYTE *RequestersLabels[] = {
	(UBYTE *)MSG_ASL_GAD,
	(UBYTE *)MSG_REQTOOLS_GAD,
	NULL
};


static UBYTE *RefreshLabels[] = {
	(UBYTE *)MSG_SIMPLE_GAD,
	(UBYTE *)MSG_SMART_GAD,
	NULL
};



static ULONG PrefsArgs[] =
{
	VGROUP_KIND, BBFT_RIDGE,
		HGROUP_KIND, 0,
			STRING_KIND,		(ULONG)PubScreenClicked,	MSG_PUBLIC_SCREEN_GAD,	32,	TAG_DONE,
			IMAGEBUTTON_KIND,	(ULONG)GetPubScreenClicked,	IM_PICK,					TAG_DONE,
			ENDGROUP_KIND,
		HGROUP_KIND, 0,
			TEXT_KIND,			MSG_DISPLAY_MODE_GAD,			0,			GTTX_Border,	TRUE,	TAG_DONE,
			IMAGEBUTTON_KIND,	(ULONG)GetDisplayModeClicked,	IM_PICK,	TAG_DONE,
			ENDGROUP_KIND,
		HGROUP_KIND, 0,
			TEXT_KIND,			MSG_WINDOW_FONT_GAD,			0,			GTTX_Border,	TRUE,	TAG_DONE,
			IMAGEBUTTON_KIND,	(ULONG)GetWindowFontClicked,	IM_PICK,	TAG_DONE,
			ENDGROUP_KIND,
		HGROUP_KIND, 0,
			TEXT_KIND,			MSG_LISTVIEW_FONT_GAD,			0,			GTTX_Border,	TRUE,	TAG_DONE,
			IMAGEBUTTON_KIND,	(ULONG)GetListViewFontClicked,	IM_PICK,	TAG_DONE,
			ENDGROUP_KIND,
		ENDGROUP_KIND,
	HGROUP_KIND, BBFT_RIDGE,
		VGROUP_KIND, 0,
			CYCLE_KIND,		(ULONG)RequestersClicked,	MSG_REQUESTERS_GAD,	(ULONG)RequestersLabels,	TAG_DONE,
			CYCLE_KIND,		(ULONG)RefreshClicked,		MSG_REFRESH_GAD,	(ULONG)RefreshLabels,		TAG_DONE,
			ENDGROUP_KIND,
		VGROUP_KIND, 0,
			CHECKBOX_KIND,	NULL,	MSG_USE_DATATYPES_GAD,	(ULONG)&NewGuiSwitches.UseDataTypes,	TAG_DONE,
			CHECKBOX_KIND,	NULL,	MSG_APPICON_GAD,		(ULONG)&NewGuiSwitches.ShowAppIcon,		TAG_DONE,
			ENDGROUP_KIND,
		ENDGROUP_KIND,
		VGROUP_KIND, BBFT_RIDGE,
			SLIDER_KIND,	(ULONG)LogLevelClicked,	MSG_LOG_LEVEL_GAD, 0, 8, (ULONG)"%lu", 2, GA_Immediate, TRUE, TAG_DONE,
			HGROUP_KIND,	0,
				CHECKBOX_KIND,	NULL,					MSG_LOG_TO_FILE_GAD,	(ULONG)&NewGuiSwitches.LogToFile,	TAG_DONE,
				STRING_KIND,	(ULONG)LogFileClicked,	0,						128, TAG_DONE,
				ENDGROUP_KIND,
			ENDGROUP_KIND,
		VGROUP_KIND, BBFT_RIDGE,
			HGROUP_KIND, 0,
				CHECKBOX_KIND,	NULL,							MSG_ASK_AUTOSAVE_GAD, (ULONG)&NewGuiSwitches.AskAutosave, TAG_DONE,
				SLIDER_KIND,	(ULONG)AutosaveTimeClicked,		MSG_AUTOSAVE_TIME_GAD,		0,	99,	(ULONG)"%lu",	3, TAG_DONE,
				ENDGROUP_KIND,
		HGROUP_KIND, 0,
			CHECKBOX_KIND,	NULL,							MSG_DO_BACKUPS_GAD, (ULONG)&NewGuiSwitches.DoBackups, TAG_DONE,
			SLIDER_KIND,	(ULONG)BackupVersionsClicked,	MSG_BACKUP_VERSIONS_GAD,	1,	99,	(ULONG)"%lu",	3, TAG_DONE,
			ENDGROUP_KIND,
		STRING_KIND,	(ULONG)BackupTemplateClicked,	MSG_BACKUP_TEMPLATE_GAD, 64, TAG_DONE,
		ENDGROUP_KIND,
	HGROUP_KIND, 0,
		BUTTON_KIND,	(ULONG)PrefsUseClicked,		MSG_UNDERSCORE_USE_GAD,		TAG_DONE,
		BUTTON_KIND,	(ULONG)PrefsCancelClicked,	MSG_UNDERSCORE_CANCEL_GAD,	TAG_DONE,
		ENDGROUP_KIND,
	ENDGROUP_KIND
};



XDEF LONG PrefsWinTags[] =
{
	XMWIN_LayoutArgs,	(LONG)PrefsArgs,
	XMWIN_GCount,		Prefs_CNT,
	XMWIN_Title,		MSG_PREFS_TITLE,
	XMWIN_WindowFlags,	WFLG_CLOSEGADGET,
	XMWIN_IDCMPFlags,	TEXTIDCMP|STRINGIDCMP|CHECKBOXIDCMP|BUTTONIDCMP|CYCLEIDCMP|SLIDERIDCMP|IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW,
	XMWIN_PostOpenFunc,	(LONG)PrefsPostOpen,
	XMWIN_PostCloseFunc,(LONG)PrefsPostClose,
	XMWIN_HelpNode,		(LONG)"Prefs",
	TAG_DONE
};



static void PrefsPostOpen (struct WinUserData *wud)
{
	memcpy (&NewScrInfo, &ScrInfo, sizeof (struct ScrInfo));
	memcpy (&NewGuiSwitches, &GuiSwitches, sizeof (struct GuiSwitches));
	CopyTextAttrPooled (Pool, &WindowAttr,	&NewWindowAttr);
	CopyTextAttrPooled (Pool, &ListAttr,	&NewListAttr);

	UpdatePrefsWindow();
}



static void PrefsPostClose (void)
{
	FreeVecPooled (Pool, NewWindowAttr.ta_Name);	NewWindowAttr.ta_Name	= NULL;
	FreeVecPooled (Pool, NewListAttr.ta_Name);		NewListAttr.ta_Name		= NULL;
}



/********************/
/* Prefs Functions  */
/********************/

GLOBALCALL void UpdatePrefsWindow()
{
	/* These variables are declared static because gadtools text
	 * gadgets do not buffer their texts and require them to be
	 * accessible whenever a refresh is needed :-(.
	 */
	static UBYTE windowfont[40], listfont[40];
	static struct NameInfo nameinfo;

	struct WinUserData *wud = WDescr[WID_PREFS].Wud;


	if (wud && wud->Win)
	{
		if (NewScrInfo.DisplayID)
			GetDisplayInfoData (NULL, (void *)&nameinfo, sizeof (nameinfo), DTAG_NAME, NewScrInfo.DisplayID);
		else
			strcpy (nameinfo.Name, STR(MSG_CLONE_DEF_SCREEN));

		SPrintf (windowfont, "%s/%ld", NewWindowAttr.ta_Name, NewWindowAttr.ta_YSize);
		SPrintf (listfont, "%s/%ld", NewListAttr.ta_Name, NewListAttr.ta_YSize);

		SetGadgets (wud,
			GD_Requesters,		NewGuiSwitches.UseReqTools,
			GD_UseDataTypes,	NewGuiSwitches.UseDataTypes,
			GD_Refresh,			NewGuiSwitches.SmartRefresh,
			GD_AppIcon,			NewGuiSwitches.ShowAppIcon,
			GD_DisplayMode,		nameinfo.Name,
			GD_PubScreen,		NewScrInfo.PubScreenName,
			GD_WindowFont,		windowfont,
			GD_ListViewFont,	listfont,
			GD_LogLevel,		NewGuiSwitches.LogLevel,
			GD_LogToFile,		NewGuiSwitches.LogToFile,
			GD_LogFile,			NewGuiSwitches.LogFile,
			GD_AskAutosave,		NewGuiSwitches.AskAutosave,
			GD_AutosaveTime,	NewGuiSwitches.AutosaveTime,
			GD_DoBackups,		NewGuiSwitches.DoBackups,
			GD_BackupTemplate,	NewGuiSwitches.BackupTemplate,
			GD_BackupVersions,	NewGuiSwitches.BackupVersions,
			-1);
	}
}



/******************/
/* Prefs Gadgets  */
/******************/

static void PubScreenClicked (struct WinUserData *wud)
{
	strcpy (NewScrInfo.PubScreenName, GetString (wud->Gadgets[GD_PubScreen]));
}



static void GetPubScreenClicked (struct WinUserData *wud)
{
	/**/
}



static void GetDisplayModeClicked (struct WinUserData *wud)
{
	ScrModeRequest (&NewScrInfo);
	UpdatePrefsWindow();
}

static void GetWindowFontClicked (struct WinUserData *wud)
{
	FontRequest (&NewWindowAttr, 0);
	UpdatePrefsWindow();
}

static void GetListViewFontClicked (struct WinUserData *wud)
{
	FontRequest (&NewListAttr, 0);
	UpdatePrefsWindow();
}



static void RequestersClicked (struct WinUserData *wud)
{
	NewGuiSwitches.UseReqTools ^= 1;
}



static void RefreshClicked (struct WinUserData *wud)
{
	NewGuiSwitches.SmartRefresh ^= 1;
}



static void LogLevelClicked	(struct WinUserData *wud)
{
	NewGuiSwitches.LogLevel = IntuiMsg.Code;
}



static void LogFileClicked (struct WinUserData *wud)
{
	strcpy (NewGuiSwitches.LogFile, GetString (wud->Gadgets[GD_LogFile]));
}



static void AutosaveTimeClicked (struct WinUserData *wud)
{
	NewGuiSwitches.AutosaveTime = IntuiMsg.Code;
}



static void	BackupTemplateClicked (struct WinUserData *wud)
{
	strcpy (NewGuiSwitches.BackupTemplate, GetString (wud->Gadgets[GD_BackupTemplate]));
}



static void BackupVersionsClicked (struct WinUserData *wud)
{
	NewGuiSwitches.BackupVersions = IntuiMsg.Code;
}



static void PrefsUseClicked (struct WinUserData *wud)
{
	BOOL	change_screen	= FALSE,
			change_reqs		= FALSE;

	if (memcmp (&ScrInfo, &NewScrInfo, sizeof (struct ScrInfo)))
	{
		change_screen = TRUE;
		memcpy (&ScrInfo, &NewScrInfo, sizeof (struct ScrInfo));
	}

	if (memcmp (&GuiSwitches, &NewGuiSwitches, sizeof (struct GuiSwitches)))
	{
		if (GuiSwitches.UseReqTools != NewGuiSwitches.UseReqTools)
			change_reqs = TRUE;
		if (GuiSwitches.SmartRefresh != NewGuiSwitches.SmartRefresh)
			change_screen = TRUE;

		memcpy (&GuiSwitches, &NewGuiSwitches, sizeof (struct GuiSwitches));
	}

	if (CmpTextAttr (&NewWindowAttr, &WindowAttr))
	{
		CopyTextAttrPooled (Pool, &NewWindowAttr, &WindowAttr);
		change_screen = TRUE;
	}

	if (CmpTextAttr (&NewListAttr, &ListAttr))
	{
		CopyTextAttrPooled (Pool, &NewListAttr, &ListAttr);
		change_screen = TRUE;
	}

	MyCloseWindow (wud);

	if (change_reqs)
		SetupRequesters();

	if (GuiSwitches.ShowAppIcon)
		CreateAppIcon (ToolBoxDropIcon);
	else
		DeleteAppIcon ();

	if (change_screen)
	{
		CloseDownScreen();
		if (SetupScreen())
		{
			/* For some reason we have lost the screen: exit immediatly! */
			Quit = TRUE;
			ShowRequesters = FALSE;
		}
	}
}



static void PrefsCancelClicked (struct WinUserData *wud)
{
	MyCloseWindow (wud);
}

