/*
**	OptimizationWin.c
**
**	Copyright (C) 1994,95,96 Bernardo Innocenti
**
**	Song optimization panel.
*/


#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"



/* Local functions prototypes */

static void OptPerformClicked (struct WinUserData *wud);



/* Gadgets IDs */

enum
{
	GD_OptimizationGroup0,
		GD_OptimizationGroup1,
			GD_RemPatts,
			GD_RemDupPatts,
			GD_RemInstr,
			GD_RemDupInstr,
			GD_CutAfterLoop,
			GD_CutZeroTail,
			GD_CutPatterns,
			GD_RemapInstr,
		GD_OptPerform,

	Optimization_CNT
};




XDEF struct OptSwitches OptSwitches = { 1, 1, 1, 1, 1, 1, 0, 0 };




static ULONG OptimizationArgs[] =
{
	VGROUP_KIND, BBFT_RIDGE,
		CHECKBOX_KIND,	NULL,	MSG_REM_UNUSED_PATTS_GAD,	(ULONG)&OptSwitches.RemPatts,		TAG_DONE,
		CHECKBOX_KIND,	NULL,	MSG_REM_DUPLICATE_PATTS_GAD,(ULONG)&OptSwitches.RemDupPatts,	TAG_DONE,
		CHECKBOX_KIND,	NULL,	MSG_REM_UNUSED_INSTR_GAD,	(ULONG)&OptSwitches.RemInstr,		TAG_DONE,
		CHECKBOX_KIND,	NULL,	MSG_REM_DUP_INSTR_GAD,		(ULONG)&OptSwitches.RemDupInstr,	TAG_DONE,
		CHECKBOX_KIND,	NULL,	MSG_CUT_AFTER_LOOP_GAD,		(ULONG)&OptSwitches.CutAfterLoop,	TAG_DONE,
		CHECKBOX_KIND,	NULL,	MSG_CUT_ZERO_TAILS_GAD,		(ULONG)&OptSwitches.CutZeroTail,	TAG_DONE,
		CHECKBOX_KIND,	NULL,	MSG_CUT_PATTERNS_GAD,		(ULONG)&OptSwitches.CutPatts,		TAG_DONE,
		CHECKBOX_KIND,	NULL,	MSG_REMAP_INSTRUMENTS_GAD,	(ULONG)&OptSwitches.RemapInstr,		TAG_DONE,
		ENDGROUP_KIND,
	BUTTON_KIND,	(ULONG)OptPerformClicked,	MSG_OPTIMIZE_GAD,	TAG_DONE,
	ENDGROUP_KIND
};



XDEF LONG OptimizationWinTags[] =
{
	XMWIN_LayoutArgs,	(LONG)OptimizationArgs,
	XMWIN_GCount,		Optimization_CNT,
	XMWIN_Title,		MSG_OPTIMIZATION_TITLE,
	XMWIN_WindowFlags,	WFLG_CLOSEGADGET,
	XMWIN_IDCMPFlags,	CHECKBOXIDCMP | BUTTONIDCMP | IDCMP_CLOSEWINDOW | IDCMP_REFRESHWINDOW,
	XMWIN_HelpNode,		(LONG)"Optimization",
	TAG_DONE
};



GLOBALCALL void UpdateOptSwitches (void)
{
	struct WinUserData *wud = WDescr[WID_OPTIMIZATION].Wud;

	if (wud && wud->Win)
		SetGadgets (wud,
			GD_RemPatts,		OptSwitches.RemPatts,
			GD_RemDupPatts,		OptSwitches.RemDupPatts,
			GD_RemInstr,		OptSwitches.RemInstr,
			GD_RemDupInstr,		OptSwitches.RemDupInstr,
			GD_CutAfterLoop,	OptSwitches.CutAfterLoop,
			GD_CutZeroTail,		OptSwitches.CutZeroTail,
			GD_CutPatterns,		OptSwitches.CutPatts,
			GD_RemapInstr,		OptSwitches.RemapInstr,
			-1);
}



/************************/
/* Optimization Gadgets */
/************************/

static void OptPerformClicked (struct WinUserData *wud)
{
	struct SongInfo *si;
	ULONG oldsize, newsize;

	if (si = xmLockActiveSong (SM_EXCLUSIVE))
	{
		oldsize = CalcSongSize (si);

		xmProcessSong (si, NULL,
			XMSNG_Optimize,	XMOF_DEFAULT,
			TAG_DONE);

		UpdateSongInfo();

		newsize = CalcSongSize (si);

		ReleaseSemaphore (&si->Lock);

		xmDisplayMessage (XMDMF_NOTE | XMDMF_USECATALOG, (STRPTR)MSG_SAVED_X_BYTES,
			oldsize - newsize, ((oldsize - newsize) * 100) / oldsize );
	}

	MyCloseWindow (wud);
}

