/*
**	$Id: SpeechPanel.c,v 1.5 92/04/21 16:59:44 olsen Sta Locker: olsen $
**	$Revision: 1.5 $
**	$Date: 92/04/21 16:59:44 $
**
**	Editing panel for speech configuration
**
**	Copyright © 1990-1992 by Olaf `Olsen' Barthel & MXM
**		All Rights Reserved
*/

#include "termGlobal.h"

#define WIDTH	464
#define HEIGHT	112

	/* Some layout assistance. */

#define GADGET_WIDTH	88
#define GADGET_COUNT	4
#define GADGET_SPACE	(GADGET_WIDTH + ((WIDTH - 20) - (GADGET_COUNT * GADGET_WIDTH)) / (GADGET_COUNT - 1))

enum	{	GAD_RATE,GAD_PITCH,GAD_FREQUENCY,GAD_VOLUME,
		GAD_SEX,GAD_SPEECH,GAD_SPEAK,
		GAD_USE,GAD_LOAD,GAD_SAVE,GAD_CANCEL };

STATIC UBYTE *Sex[3] =
{
	NULL,
	NULL,
	NULL
};

STATIC struct Gadget *
CreateAllGadgets(struct SpeechConfig *SpeechConfig,struct Gadget **GadgetArray,struct Gadget **GadgetList,APTR VisualInfo,UWORD TopEdge)
{
	struct Gadget		*Gadget;
	struct NewGadget	 NewGadget;
	LONG			 Counter = 0;

	LocalizeString(Sex,MSG_SPEECHPANEL_MALE_TXT,MSG_SPEECHPANEL_FEMALE_TXT);

	memset(&NewGadget,0,sizeof(struct NewGadget));

	if(Gadget = CreateContext(GadgetList))
	{
		extern APTR LocaleBase;

		NewGadget . ng_Width		= 252;
		NewGadget . ng_Height		= 10;
		NewGadget . ng_GadgetText	= LocaleString(MSG_SPEECHPANEL_RATE_GAD);
		NewGadget . ng_TextAttr		= &DefaultFont;
		NewGadget . ng_VisualInfo	= VisualInfo;
		NewGadget . ng_GadgetID		= Counter;
		NewGadget . ng_LeftEdge		= (GadToolsLongestString(MSG_SPEECHPANEL_RATE_GAD,MSG_SPEECHPANEL_SPEECH_ENABLED_GAD) + 2) * 8 + 1;
		NewGadget . ng_TopEdge		= 1 + TopEdge;

		GadgetArray[Counter++] = Gadget = CreateGadget(SLIDER_KIND,Gadget,&NewGadget,
			GT_Underscore,		'_',
			GTSL_Min,		MINRATE,
			GTSL_Max,		MAXRATE,
			GTSL_Level,		SpeechConfig -> Rate,
			GTSL_LevelFormat,	"%3ld",
			GTSL_MaxLevelLen,	3,
		TAG_DONE);

		NewGadget . ng_GadgetText	= LocaleString(MSG_SPEECHPANEL_PITCH_GAD);
		NewGadget . ng_GadgetID		= Counter;
		NewGadget . ng_TopEdge		= NewGadget . ng_TopEdge + NewGadget . ng_Height + 1;

		GadgetArray[Counter++] = Gadget = CreateGadget(SLIDER_KIND,Gadget,&NewGadget,
			GT_Underscore,		'_',
			GTSL_Min,		MINPITCH,
			GTSL_Max,		MAXPITCH,
			GTSL_Level,		SpeechConfig -> Pitch,
			GTSL_LevelFormat,	"%3ld",
			GTSL_MaxLevelLen,	3,
		TAG_DONE);

		NewGadget . ng_GadgetText	= LocaleString(MSG_SPEECHPANEL_FREQUENCY_GAD);
		NewGadget . ng_GadgetID		= Counter;
		NewGadget . ng_TopEdge		= NewGadget . ng_TopEdge + NewGadget . ng_Height + 1;

		GadgetArray[Counter++] = Gadget = CreateGadget(SLIDER_KIND,Gadget,&NewGadget,
			GT_Underscore,		'_',
			GTSL_Min,		MINFREQ,
			GTSL_Max,		MAXFREQ,
			GTSL_Level,		SpeechConfig -> Frequency,
			GTSL_LevelFormat,	LocaleBase ? "%6lD" : "%6ld",
			GTSL_MaxLevelLen,	6,
		TAG_DONE);

		NewGadget . ng_GadgetText	= LocaleString(MSG_SPEECHPANEL_VOLUME_GAD);
		NewGadget . ng_GadgetID		= Counter;
		NewGadget . ng_TopEdge		= NewGadget . ng_TopEdge + NewGadget . ng_Height + 1;

		GadgetArray[Counter++] = Gadget = CreateGadget(SLIDER_KIND,Gadget,&NewGadget,
			GT_Underscore,		'_',
			GTSL_Min,		MINVOL,
			GTSL_Max,		MAXVOL,
			GTSL_Level,		SpeechConfig -> Volume,
			GTSL_LevelFormat,	"%2ld",
			GTSL_MaxLevelLen,	2,
		TAG_DONE);

		NewGadget . ng_GadgetText	= LocaleString(MSG_SPEECHPANEL_SEX_GAD);
		NewGadget . ng_GadgetID		= Counter;
		NewGadget . ng_TopEdge		= NewGadget . ng_TopEdge + NewGadget . ng_Height + 1;
		NewGadget . ng_Height		= 12;

		GadgetArray[Counter++] = Gadget = CreateGadget(CYCLE_KIND,Gadget,&NewGadget,
			GT_Underscore,		'_',
			GTCY_Labels,		Sex,
			GTCY_Active,		SpeechConfig -> Sex,
		TAG_DONE);

		NewGadget . ng_GadgetText	= LocaleString(MSG_SPEECHPANEL_SPEECH_ENABLED_GAD);
		NewGadget . ng_GadgetID		= Counter;
		NewGadget . ng_TopEdge		= NewGadget . ng_TopEdge + NewGadget . ng_Height + 1;
		NewGadget . ng_Width		= 26;
		NewGadget . ng_Height		= 11;

		GadgetArray[Counter++] = Gadget = CreateGadget(CHECKBOX_KIND,Gadget,&NewGadget,
			GT_Underscore,		'_',
			GTCB_Checked,		SpeechConfig -> Enabled,
		TAG_DONE);

		NewGadget . ng_GadgetText	= LocaleString(MSG_SPEECHPANEL_SPEAK_GAD);
		NewGadget . ng_GadgetID		= Counter;
		NewGadget . ng_LeftEdge		= 10;
		NewGadget . ng_Width		= WIDTH - 20;
		NewGadget . ng_TopEdge		= NewGadget . ng_TopEdge + NewGadget . ng_Height + 1;
		NewGadget . ng_Height		= 12;

		GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
			GT_Underscore,		'_',
			GA_Disabled,		SpeechConfig -> Enabled == FALSE,
		TAG_DONE);

		NewGadget . ng_Width		= 88;
		NewGadget . ng_Height		= 12;
		NewGadget . ng_GadgetText	= LocaleString(MSG_GLOBAL_USE_GAD);
		NewGadget . ng_GadgetID		= Counter;
		NewGadget . ng_Flags		= 0;
		NewGadget . ng_LeftEdge		= 10;
		NewGadget . ng_TopEdge		= HEIGHT - 3 - NewGadget . ng_Height;

		GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
			GT_Underscore,	'_',
		TAG_DONE);

		NewGadget . ng_GadgetText	= LocaleString(MSG_GLOBAL_LOAD_GAD);
		NewGadget . ng_GadgetID		= Counter;
		NewGadget . ng_LeftEdge		= NewGadget . ng_LeftEdge + GADGET_SPACE;

		GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
			GT_Underscore,	'_',
		TAG_DONE);

		NewGadget . ng_GadgetText	= LocaleString(MSG_GLOBAL_SAVE_GAD);
		NewGadget . ng_GadgetID		= Counter;
		NewGadget . ng_LeftEdge		= NewGadget . ng_LeftEdge + GADGET_SPACE;

		GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
			GT_Underscore,	'_',
		TAG_DONE);

		NewGadget . ng_GadgetText	= LocaleString(MSG_GLOBAL_CANCEL_GAD);
		NewGadget . ng_GadgetID		= Counter;
		NewGadget . ng_LeftEdge		= NewGadget . ng_LeftEdge + GADGET_SPACE;

		GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
			GT_Underscore,	'_',
		TAG_DONE);
	}

	return(Gadget);
}

VOID
SpeechPanel()
{
	struct Window		*PanelWindow;
	struct Gadget		*GadgetList = NULL;
	struct Gadget		*GadgetArray[GAD_CANCEL + 1];
	struct SpeechConfig	 PrivateConfig;
	UBYTE		 	 DummyBuffer[256],*DummyChar;
	struct FileRequest	*FileRequest;

	CopyMem(&SpeechConfig,&PrivateConfig,sizeof(struct SpeechConfig));

	if(CreateAllGadgets(&SpeechConfig,&GadgetArray[0],&GadgetList,VisualInfo,Screen -> WBorTop + Screen -> Font -> ta_YSize + 1))
	{
		if(PanelWindow = OpenWindowTags(NULL,
			WA_Left,	(Screen -> Width - WIDTH) >> 1,
			WA_Top,		(Screen -> Height - HEIGHT) >> 1,
			WA_Width,	WIDTH,
			WA_Height,	HEIGHT,

			WA_Activate,	TRUE,
			WA_DragBar,	TRUE,
			WA_DepthGadget,	TRUE,
			WA_RMBTrap,	TRUE,
			WA_DepthGadget,	TRUE,
			WA_CloseGadget,	TRUE,
			WA_CustomScreen,Screen,

			WA_IDCMP,	IDCMP_CLOSEWINDOW | IDCMP_VANILLAKEY | SLIDERIDCMP | CHECKBOXIDCMP | BUTTONIDCMP | CYCLEIDCMP,

			WA_Title,	LocaleString(MSG_SPEECHPANEL_SPEECH_PREFERENCES_TXT),
		TAG_DONE))
		{
			struct IntuiMessage	*Massage;
			ULONG			 Class,Code;
			struct Gadget		*Gadget;
			BYTE			 Terminated = FALSE;

			PushWindow(PanelWindow);

			AddGList(PanelWindow,GadgetList,(UWORD)-1,(UWORD)-1,NULL);
			RefreshGList(GadgetList,PanelWindow,NULL,(UWORD)-1);
			GT_RefreshWindow(PanelWindow,NULL);

			while(!Terminated)
			{
				WaitPort(PanelWindow -> UserPort);

				while(!Terminated && (Massage = (struct IntuiMessage *)GT_GetIMsg(PanelWindow -> UserPort)))
				{
					Class	= Massage -> Class;
					Code	= Massage -> Code;
					Gadget	= (struct Gadget *)Massage -> IAddress;

					GT_ReplyIMsg(Massage);

					if(Class == IDCMP_VANILLAKEY)
						KeySelect(GadgetArray,GAD_CANCEL,Code,PanelWindow,&Gadget,&Class,&Code);

					if(Class == IDCMP_CLOSEWINDOW)
						Terminated = TRUE;

					if(Class == IDCMP_MOUSEMOVE)
					{
						switch(Gadget -> GadgetID)
						{
							case GAD_RATE:		SpeechConfig . Rate = Code;
										break;

							case GAD_PITCH:		SpeechConfig . Pitch = Code;
										break;

							case GAD_FREQUENCY:	SpeechConfig . Frequency = Code;
										break;

							case GAD_VOLUME:	SpeechConfig . Volume = Code;
										break;
						}
					}

					if(Class == IDCMP_GADGETUP)
					{
						BYTE OldEnglish = English;

						switch(Gadget -> GadgetID)
						{
							case GAD_USE:		Terminated = TRUE;
										break;

							case GAD_CANCEL:	Terminated = TRUE;
										CopyMem(&PrivateConfig,&SpeechConfig,sizeof(struct SpeechConfig));
										SpeechSetup();
										break;

							case GAD_SEX:		SpeechConfig . Sex = Code;
										break;

							case GAD_SPEECH:	SpeechConfig . Enabled = GT_CHECKED(Gadget);

										GT_SetGadgetAttrs(GadgetArray[GAD_SPEAK],PanelWindow,NULL,
											GA_Disabled,	SpeechConfig . Enabled == FALSE,
										TAG_DONE);

										break;

							case GAD_LOAD:		strcpy(DummyBuffer,LastSpeech);

										DummyChar = PathPart(DummyBuffer);

										*DummyChar = 0;

										BlockWindow(PanelWindow);

										if(FileRequest = GetFile(LocaleString(MSG_SPEECHPANEL_LOAD_SPEECH_SETTINGS_TXT),DummyBuffer,FilePart(LastSpeech),DummyBuffer,"term#?",FALSE,FALSE,FALSE,LocaleString(MSG_GLOBAL_LOAD_TXT)))
										{
											if(!ReadIFFData(DummyBuffer,&SpeechConfig,sizeof(struct SpeechConfig),'SPEK'))
												MyEasyRequest(Window,LocaleString(MSG_SPEECHPANEL_COULD_NOT_LOAD_SPEECH_SETTINGS_TXT),LocaleString(MSG_GLOBAL_CONTINUE_TXT),DummyBuffer);
											else
											{
												strcpy(LastSpeech,DummyBuffer);

												GT_SetGadgetAttrs(GadgetArray[GAD_RATE],PanelWindow,NULL,
													GTSL_Level,SpeechConfig . Rate,
												TAG_DONE);

												GT_SetGadgetAttrs(GadgetArray[GAD_PITCH],PanelWindow,NULL,
													GTSL_Level,SpeechConfig . Pitch,
												TAG_DONE);

												GT_SetGadgetAttrs(GadgetArray[GAD_FREQUENCY],PanelWindow,NULL,
													GTSL_Level,SpeechConfig . Frequency,
												TAG_DONE);

												GT_SetGadgetAttrs(GadgetArray[GAD_VOLUME],PanelWindow,NULL,
													GTSL_Level,SpeechConfig . Volume,
												TAG_DONE);

												GT_SetGadgetAttrs(GadgetArray[GAD_SEX],PanelWindow,NULL,
													GTCY_Active,SpeechConfig . Sex,
												TAG_DONE);

												GT_SetGadgetAttrs(GadgetArray[GAD_SPEECH],PanelWindow,NULL,
													GTCB_Checked,SpeechConfig . Enabled,
												TAG_DONE);

												GT_SetGadgetAttrs(GadgetArray[GAD_SPEAK],PanelWindow,NULL,
													GA_Disabled,	SpeechConfig . Enabled == FALSE,
												TAG_DONE);

												SpeechSetup();
											}
										}

										ReleaseWindow(PanelWindow);

										break;

							case GAD_SAVE:		strcpy(DummyBuffer,LastSpeech);

										DummyChar = PathPart(DummyBuffer);

										*DummyChar = 0;

										BlockWindow(PanelWindow);

										if(FileRequest = GetFile(LocaleString(MSG_SPEECHPANEL_SAVE_SPEECH_SETTINGS_TXT),DummyBuffer,FilePart(LastSpeech),DummyBuffer,"term#?",TRUE,FALSE,FALSE,LocaleString(MSG_GLOBAL_SAVE_TXT)))
										{
											if(!WriteIFFData(DummyBuffer,&SpeechConfig,sizeof(struct SpeechConfig),'SPEK'))
												MyEasyRequest(Window,LocaleString(MSG_SPEECHPANEL_COULD_NOT_SAVE_SPEECH_SETTINGS_TXT),LocaleString(MSG_GLOBAL_CONTINUE_TXT),DummyBuffer);
											else
												strcpy(LastSpeech,DummyBuffer);
										}

										ReleaseWindow(PanelWindow);

										break;

							case GAD_SPEAK:		SpeechSetup();

										English = TRUE;

										Say(LocaleString(MSG_SPEECHPANEL_THIS_IS_TERM_SPEAKING_TXT));

										English = OldEnglish;

										break;
						}
					}
				}
			}

			RemoveGList(PanelWindow,GadgetList,(UWORD)-1);

			PopWindow();

			CloseWindow(PanelWindow);
		}
	}

	FreeGadgets(GadgetList);
}
