/*
**	SaversWin.c
**
**	Copyright (C) 1994,95,96 Bernardo Innocenti
**
**	Savers panel handling functions.
*/


#include <intuition/intuition.h>
#include <intuition/gadgetclass.h>
#include <libraries/gadtools.h>

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

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



/*!*/
/* Replaced by format properties stored inside hooks
UBYTE FormatProperties[] =
{
	XMSF_NO_INSTRUMENTS|XMSF_NO_NAMES,			// MED
	XMSF_NO_INSTRUMENTS|XMSF_NO_NAMES,			// OctaMED
	ALLOWS_NO_INST|ALLOWS_NO_NAMES				// MIDI File
};

	"MED",
	"OctaMED",
	"ScreamTracker",
	"MIDI File",
*/




/* Gadgets IDs */
enum {
	GD_SaversGroup0,
		GD_SaversGroup1,
			GD_SaversList,
//			GD_SaversGroup2,
				GD_SaversGroup3,
					GD_SaveSequence,
					GD_SaveInstruments,
					GD_SavePatterns,
					GD_SaveNames,
					GD_SaveIcons,
//				GD_SaversGroup4,
//					GD_PackMode,
//					GD_PackOptions,
		GD_SaversGroup5,
			GD_FormatDescription,
			GD_FormatAuthor,
			GD_SaversGroup6,
				GD_SaversGroup7,
					GD_MaxLength,
					GD_MaxTracks,
					GD_MaxInstruments,
				GD_SaversGroup8,
					GD_MaxPatterns,
					GD_MaxPattLen,
					GD_MaxSampleLen,
		GD_SaversGroup9,
			GD_FormatUse,
			GD_FormatCancel,
	Savers_CNT
};




/*****************************/
/* Local function prototypes */
/*****************************/

static void SaversPostOpen	(void);
static void UpdateSaverInfo		(void);

static void SaversListClicked	(struct WinUserData *wud);
/* static void PackModeClicked		(struct WinUserData *wud);
static void PackOptionsClicked	(struct WinUserData *wud); */
static void FormatUseClicked	(struct WinUserData *wud);
static void FormatCancelClicked	(struct WinUserData *wud);



XDEF struct SaveSwitches SaveSwitches = {1, 1, 1, 0, 1};
XDEF struct SaveSwitches SaveSwitchesBackup;



/*
static STRPTR PackModeLabels[] =
{
	(STRPTR)MSG_NONE_GAD,
	(STRPTR)MSG_XPK_GAD,
	(STRPTR)MSG_LHA_GAD,
	(STRPTR)0
};
*/


static ULONG SaversArgs[] =
{
	HGROUP_KIND, 0,
		LISTVIEW_KIND,	(ULONG)SaversListClicked, 0, NULL, TAG_DONE,
//		VGROUP_KIND, 0,
			VGROUP_KIND, BBFT_RIDGE,
				CHECKBOX_KIND,	NULL, MSG_SF_SEQUENCE_GAD,		(ULONG)&SaveSwitches.SaveSeq,	TAG_DONE,
				CHECKBOX_KIND,	NULL, MSG_SF_INSTRUMENTS_GAD,	(ULONG)&SaveSwitches.SaveInstr,	TAG_DONE,
				CHECKBOX_KIND,	NULL, MSG_SF_PATTERNS_GAD,		(ULONG)&SaveSwitches.SavePatt,	TAG_DONE,
				CHECKBOX_KIND,	NULL, MSG_SF_NAMES_GAD,			(ULONG)&SaveSwitches.SaveNames,	TAG_DONE,
				CHECKBOX_KIND,	NULL, MSG_ADD_ICON_GAD,			(ULONG)&SaveSwitches.SaveIcons,	TAG_DONE,
				ENDGROUP_KIND,
//			VGROUP_KIND, BBFT_RIDGE,
//				CYCLE_KIND,		(ULONG)PackModeClicked,		MSG_MODE_GAD,			(ULONG)PackModeLabels,	TAG_DONE,
//				BUTTON_KIND,	(ULONG)PackOptionsClicked,	MSG_OPTIONS_DOTS_GAD,							TAG_DONE,
//				ENDGROUP_KIND,
//			ENDGROUP_KIND,
		ENDGROUP_KIND,
	VGROUP_KIND, BBFT_RIDGE,
		TEXT_KIND,		MSG_DESCRIPTION,	25,		GTTX_Border, TRUE, TAG_DONE,
		TEXT_KIND,		MSG_AUTHOR,			15,		GTTX_Border, TRUE, TAG_DONE,
		HGROUP_KIND,	0,
			VGROUP_KIND,	0,
				NUMBER_KIND,	MSG_MAXLENGTH,		3,	TAG_DONE,
				NUMBER_KIND,	MSG_MAXTRACKS,		3,	TAG_DONE,
				NUMBER_KIND,	MSG_MAXINSTRUMENTS,	3,	TAG_DONE,
				ENDGROUP_KIND,
			VGROUP_KIND,	0,
				NUMBER_KIND,	MSG_MAXPATTERNS,	5,	TAG_DONE,
				NUMBER_KIND,	MSG_MAXPATTLEN,		5,	TAG_DONE,
				NUMBER_KIND,	MSG_MAXSAMPLELEN,	9,	TAG_DONE,
				ENDGROUP_KIND,
			ENDGROUP_KIND,
		ENDGROUP_KIND,
	HGROUP_KIND, 0,
		BUTTON_KIND,	(ULONG)FormatUseClicked,	MSG_UNDERSCORE_USE_GAD,		TAG_DONE,
		BUTTON_KIND,	(ULONG)FormatCancelClicked,	MSG_UNDERSCORE_CANCEL_GAD,	TAG_DONE,
		ENDGROUP_KIND,
	ENDGROUP_KIND
};



XDEF LONG SaversWinTags[] =
{
	XMWIN_LayoutArgs,	(LONG)SaversArgs,
	XMWIN_GCount,		Savers_CNT,
	XMWIN_Title,		MSG_SAVERS_TITLE,
	XMWIN_WindowFlags,	WFLG_CLOSEGADGET,
	XMWIN_IDCMPFlags,	CHECKBOXIDCMP|LISTVIEWIDCMP|BUTTONIDCMP|CYCLEIDCMP|IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW,
	XMWIN_PostOpenFunc,	(LONG)SaversPostOpen,
	XMWIN_HelpNode,		(LONG)"Savers",
	TAG_DONE
};



static void SaversPostOpen (void)
{
	UpdateSaveSwitches();

	/* Backup SaveSwitches for "Cancel" option */
	memcpy (&SaveSwitchesBackup, &SaveSwitches, sizeof (SaveSwitchesBackup));
}



GLOBALCALL void UpdateSaveSwitches (void)
{
	struct WinUserData *wud = WDescr[WID_SAVERS].Wud;
	struct XMHook *saver;

	if (wud && wud->Win)
	{
		LONG savernum;

#ifdef OS30_ONLY
		ObtainSemaphoreShared (&XModuleBase->xm_BaseLock);
#else
		/* Workaround for Pre-V39 ObtainSemaphoreShared() bug (see autodoc) */

		/* Try to get the shared semaphore */
		if (!AttemptSemaphoreShared (&XModuleBase->xm_BaseLock))
			/* Check if we can get the exclusive version */
			if (!AttemptSemaphore (&XModuleBase->xm_BaseLock))
				/* Oh well, wait for the shared lock */
				ObtainSemaphoreShared (&XModuleBase->xm_BaseLock);
#endif

		if (saver = XModuleBase->xm_DefaultSaver)
		{
			struct XMHook *tmp = (struct XMHook *)XModuleBase->xm_Savers.mlh_Head;
			savernum = 0;

			while (tmp != saver)
			{
				tmp = (struct XMHook *)tmp->xmh_Link.ln_Succ;
				savernum++;
			}
		}
		else savernum = ~0;

		GT_SetGadgetAttrs (wud->Gadgets[GD_SaversList], wud->Win, NULL,
			GTLV_Labels,		&XModuleBase->xm_Savers,
			GTLV_Selected,		savernum,
			GTLV_MakeVisible,	savernum,
			TAG_DONE);

		UpdateSaverInfo ();

		ReleaseSemaphore (&XModuleBase->xm_BaseLock);
	}
}



static void UpdateSaverInfo (void)
{
	struct XMHook *saver = XModuleBase->xm_DefaultSaver;
	struct WinUserData *wud = WDescr[WID_SAVERS].Wud;

	if (wud && wud->Win)
	{
		SetGadgets (wud,
			GD_SaveSequence,		SaveSwitches.SaveSeq,
			GD_SaveInstruments,		SaveSwitches.SaveInstr,
			GD_SavePatterns,		SaveSwitches.SavePatt,
			GD_SaveIcons,			SaveSwitches.SaveIcons,
			GD_SaveNames,			SaveSwitches.SaveNames,
			GD_FormatDescription,	saver ? saver->xmh_Descr : NULL,
			GD_FormatAuthor,		saver ? saver->xmh_Author : NULL,
			GD_MaxLength,			saver ? saver->xmh_MaxLength : 0,
			GD_MaxTracks,			saver ? saver->xmh_MaxTracks : 0,
			GD_MaxInstruments,		saver ? saver->xmh_MaxInstruments : 0,
			GD_MaxPatterns,			saver ? saver->xmh_MaxPatterns : 0,
			GD_MaxPattLen,			saver ? saver->xmh_MaxPattLen : 0,
			GD_MaxSampleLen,		saver ? saver->xmh_MaxSampleLen : 0,
			-1);

		if (saver)
		{
			GT_SetGadgetAttrs (wud->Gadgets[GD_SaveSequence], wud->Win, NULL,
				GA_Disabled, !(saver->xmh_Flags & XMHF_EXCLUDE_SEQUENCE),
				TAG_DONE);

			GT_SetGadgetAttrs (wud->Gadgets[GD_SavePatterns], wud->Win, NULL,
				GA_Disabled, !(saver->xmh_Flags & XMHF_EXCLUDE_PATTERNS),
				TAG_DONE);

			GT_SetGadgetAttrs (wud->Gadgets[GD_SaveInstruments], wud->Win, NULL,
				GA_Disabled, !(saver->xmh_Flags & XMHF_EXCLUDE_INSTRUMENTS),
				TAG_DONE);

			GT_SetGadgetAttrs (wud->Gadgets[GD_SaveNames], wud->Win, NULL,
				GA_Disabled, !(saver->xmh_Flags & XMHF_EXCLUDE_NAMES),
				TAG_DONE);
		}
	}
}



/******************/
/* Savers Gadgets */
/******************/

static void SaversListClicked (struct WinUserData *wud)
{
	WORD i;
	struct XMHook *tmp;

	ObtainSemaphoreShared (&XModuleBase->xm_BaseLock);

	tmp = (struct XMHook *)XModuleBase->xm_Savers.mlh_Head;

	for (i = IntuiMsg.Code; (i > 0) && tmp ; i--)
		tmp = (struct XMHook *)tmp->xmh_Link.ln_Succ;

	if (tmp) XModuleBase->xm_DefaultSaver = tmp;

	UpdateSaverInfo();

	ReleaseSemaphore (&XModuleBase->xm_BaseLock);
}



/*
static void PackModeClicked (struct WinUserData *wud)
{

}



static void PackOptionsClicked (struct WinUserData *wud)
{

}
*/



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



static void FormatCancelClicked (struct WinUserData *wud)
{
	/* Restore old SaveSwitches */
	memcpy (&SaveSwitches, &SaveSwitchesBackup, sizeof (SaveSwitchesBackup));

	MyCloseWindow (wud);
}
