/*
**	SpeechPanel.c
**
**	Editing panel for speech configuration
**
**	Copyright © 1990-1993 by Olaf `Olsen' Barthel & MXM
**		All Rights Reserved
*/

#include "termGlobal.h"

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

STATIC STRPTR Sex[3];

STATIC struct Gadget *
CreateAllGadgets(struct SpeechConfig *SpeechConfig,struct Gadget **GadgetArray,struct Gadget **GadgetList)
{
	struct Gadget		*Gadget;
	struct NewGadget	 NewGadget;
	LONG			 Counter = 0,Width;

	SZ_SizeSetup(Window -> WScreen,&UserFont,TRUE);

	LocalizeString(Sex,MSG_SPEECHPANEL_MALE_TXT,MSG_SPEECHPANEL_FEMALE_TXT);

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

	if(Gadget = CreateContext(GadgetList))
	{
		SZ_AddLeftOffset(SZ_LeftOffsetDelta(MSG_SPEECHPANEL_RATE_GAD,MSG_SPEECHPANEL_SPEECH_ENABLED_GAD));

		SZ_ResetMaxWidth();

		SZ_UpdateMaxWidth(CYCLE_KIND,NULL,0,Sex);
		SZ_UpdateMaxWidth(BUTTON_KIND,LocaleString(MSG_SPEECHPANEL_SPEAK_GAD),0,NULL);

		Width = SZ_ResetMaxWidth();

		if(Width < 200)
			Width = 200;

		SZ_SetWidth(Width);

		NewGadget . ng_GadgetText	= LocaleString(MSG_SPEECHPANEL_RATE_GAD);
		NewGadget . ng_GadgetID		= Counter;

		GadgetArray[Counter++] = Gadget = CreateGadget(SLIDER_KIND,Gadget,&NewGadget,
			SZ_Adjust,	TRUE,
			SZ_AutoWidth,	TRUE,

			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;

		GadgetArray[Counter++] = Gadget = CreateGadget(SLIDER_KIND,Gadget,&NewGadget,
			SZ_Adjust,		TRUE,
			SZ_AutoWidth,		TRUE,

			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;

		GadgetArray[Counter++] = Gadget = CreateGadget(SLIDER_KIND,Gadget,&NewGadget,
			SZ_Adjust,		TRUE,
			SZ_AutoWidth,		TRUE,

			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;

		GadgetArray[Counter++] = Gadget = CreateGadget(SLIDER_KIND,Gadget,&NewGadget,
			SZ_Adjust,		TRUE,
			SZ_AutoWidth,		TRUE,

			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;

		GadgetArray[Counter++] = Gadget = CreateGadget(CYCLE_KIND,Gadget,&NewGadget,
			SZ_Adjust,		TRUE,
			SZ_AutoWidth,		TRUE,

			GTCY_Labels,		Sex,
			GTCY_Active,		SpeechConfig -> Sex,
		TAG_DONE);

		NewGadget . ng_GadgetText	= LocaleString(MSG_SPEECHPANEL_SPEECH_ENABLED_GAD);
		NewGadget . ng_GadgetID		= Counter;

		GadgetArray[Counter++] = Gadget = CreateGadget(CHECKBOX_KIND,Gadget,&NewGadget,
			SZ_Adjust,		TRUE,
			SZ_AutoWidth,		TRUE,
			SZ_AlignExtra,		TRUE,

			GTCB_Checked,		SpeechConfig -> Enabled,
		TAG_DONE);

		NewGadget . ng_GadgetText	= LocaleString(MSG_SPEECHPANEL_SPEAK_GAD);
		NewGadget . ng_GadgetID		= Counter;
		NewGadget . ng_Flags		= 0;

		GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
			SZ_Adjust,		TRUE,
			SZ_AutoWidth,		TRUE,
			SZ_AlignExtra,		TRUE,

			GA_Disabled,		SpeechConfig -> Enabled == FALSE,
		TAG_DONE);

		SZ_UpdateMaxWidth(BUTTON_KIND,LocaleString(MSG_GLOBAL_USE_GAD),0,NULL);
		SZ_UpdateMaxWidth(BUTTON_KIND,LocaleString(MSG_GLOBAL_LOAD_GAD),0,NULL);
		SZ_UpdateMaxWidth(BUTTON_KIND,LocaleString(MSG_GLOBAL_SAVE_GAD),0,NULL);
		SZ_UpdateMaxWidth(BUTTON_KIND,LocaleString(MSG_GLOBAL_CANCEL_GAD),0,NULL);

		SZ_SetWidth(SZ_ResetMaxWidth());

		NewGadget . ng_GadgetText	= LocaleString(MSG_GLOBAL_USE_GAD);
		NewGadget . ng_GadgetID		= Counter;
		NewGadget . ng_Flags		= 0;

		GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
			SZ_Adjust,	TRUE,
			SZ_AutoWidth,	TRUE,
			SZ_AlignExtra,	TRUE,
			SZ_AlignBottom,	TRUE,
			SZ_GroupCount,	4,
		TAG_DONE);

		NewGadget . ng_GadgetText	= LocaleString(MSG_GLOBAL_LOAD_GAD);
		NewGadget . ng_GadgetID		= Counter;

		GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
			SZ_Adjust,	TRUE,
			SZ_AutoWidth,	TRUE,
			SZ_GroupNext,	TRUE,
		TAG_DONE);

		NewGadget . ng_GadgetText	= LocaleString(MSG_GLOBAL_SAVE_GAD);
		NewGadget . ng_GadgetID		= Counter;

		GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
			SZ_Adjust,	TRUE,
			SZ_AutoWidth,	TRUE,
			SZ_GroupNext,	TRUE,
		TAG_DONE);

		NewGadget . ng_GadgetText	= LocaleString(MSG_GLOBAL_CANCEL_GAD);
		NewGadget . ng_GadgetID		= Counter;

		GadgetArray[Counter] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
			SZ_Adjust,	TRUE,
			SZ_AutoWidth,	TRUE,
			SZ_GroupNext,	TRUE,
		TAG_DONE);
	}

	return(Gadget);
}

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

	ULONG			 OldCRC;

	OldCRC = DoCRC(&SpeechConfig,sizeof(SpeechConfig));

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

	if(CreateAllGadgets(&SpeechConfig,GadgetArray,&GadgetList))
	{
		if(PanelWindow = OpenWindowTags(NULL,
			WA_Left,	GetScreenLeft(Window) + (GetScreenWidth(Window) - SZ_GetWindowWidth()) / 2,
			WA_Top,		GetScreenTop(Window) + (GetScreenHeight(Window) - SZ_GetWindowHeight())	/ 2,
			WA_Width,	SZ_GetWindowWidth(),
			WA_Height,	SZ_GetWindowHeight(),

			WA_Activate,	TRUE,
			WA_DragBar,	TRUE,
			WA_DepthGadget,	TRUE,
			WA_RMBTrap,	TRUE,
			WA_DepthGadget,	TRUE,
			WA_CloseGadget,	TRUE,
			WA_CustomScreen,Window -> WScreen,

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

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

			GuideContext(CONTEXT_SPEECH);

			PushWindow(PanelWindow);

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

			ClrSignal(SIG_BREAK);

			while(!Terminated)
			{
				if(Wait(PORTMASK(PanelWindow -> UserPort) | SIG_BREAK) & SIG_BREAK)
				{
					CopyMem(&PrivateConfig,&SpeechConfig,sizeof(struct SpeechConfig));

					SpeechSetup();

					break;
				}

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

					GT_ReplyIMsg(Massage);

					KeySelect(GadgetArray,GAD_CANCEL,Code,PanelWindow,&Gadget,&IClass,&Code);

					if(IClass == IDCMP_CLOSEWINDOW)
					{
						CopyMem(&PrivateConfig,&SpeechConfig,sizeof(struct SpeechConfig));

						SpeechSetup();

						Terminated = TRUE;
					}

					if(IClass == 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(IClass == 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 = SZ_GetChecked(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,"#?.prefs",FALSE,FALSE,FALSE,LocaleString(MSG_GLOBAL_LOAD_TXT),TRUE))
								{
									if(!ReadIFFData(DummyBuffer,&SpeechConfig,sizeof(struct SpeechConfig),ID_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();

										SpeechChanged = FALSE;

										OldCRC = DoCRC(&SpeechConfig,sizeof(SpeechConfig));
									}

									FreeAslRequest(FileRequest);
								}

								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,"#?.prefs",TRUE,FALSE,FALSE,LocaleString(MSG_GLOBAL_SAVE_TXT),TRUE))
								{
									if(!WriteIFFData(DummyBuffer,&SpeechConfig,sizeof(struct SpeechConfig),ID_SPEK))
										MyEasyRequest(Window,LocaleString(MSG_SPEECHPANEL_COULD_NOT_SAVE_SPEECH_SETTINGS_TXT),LocaleString(MSG_GLOBAL_CONTINUE_TXT),DummyBuffer);
									else
									{
										strcpy(LastSpeech,DummyBuffer);

										SpeechChanged = FALSE;

										OldCRC = DoCRC(&SpeechConfig,sizeof(SpeechConfig));
									}

									FreeAslRequest(FileRequest);
								}

								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);
		}
	}

	SpeechChanged |= (OldCRC != DoCRC(&SpeechConfig,sizeof(SpeechConfig)));

	FreeGadgets(GadgetList);
}
