/*
**	CursorPanel.c
**
**	Editing panel for cursor key configuration
**
**	Copyright © 1990-1995 by Olaf `Olsen' Barthel
**		All Rights Reserved
*/

#include "termGlobal.h"

enum	{	GAD_QUALIFIER=1,GAD_UP,GAD_DOWN,GAD_RIGHT,GAD_LEFT,
		GAD_USE,GAD_LOAD,GAD_SAVE,GAD_CANCEL,GAD_DEFAULT,
	};

BOOLEAN __regargs
CursorPanel(struct CursorKeys *CursorKeys,STRPTR LastCursorKeys,struct Window *Parent)
{
	struct CursorKeys	*Keys;
	ULONG			 OldCRC;
	BOOLEAN			 CursorKeysChanged = FALSE;

	OldCRC = DoCRC(CursorKeys,sizeof(struct CursorKeys));

	if(Keys = (struct CursorKeys *)AllocVecPooled(sizeof(struct CursorKeys),MEMF_ANY))
	{
		struct LayoutHandle *Handle;

		CopyMem(CursorKeys,Keys,sizeof(struct CursorKeys));

		if(Handle = LT_CreateHandleTags(Window -> WScreen,
			LH_LocaleHook,	&LocaleHook,
		TAG_DONE))
		{
			struct Window *PanelWindow;

			LT_New(Handle,
				LA_Type,	VERTICAL_KIND,
			TAG_DONE);
			{
				LT_New(Handle,
					LA_Type,	VERTICAL_KIND,
					LA_LabelID,	MSG_V36_0029,
				TAG_DONE);
				{
					LT_New(Handle,
						LA_Type,		VERTICAL_KIND,
					TAG_DONE);
					{
						LT_New(Handle,
							LA_Type,	CYCLE_KIND,
							LA_LabelID,	MSG_MACROPANEL_KEY_MODIFIER_GAD,
							LA_ID,		GAD_QUALIFIER,
							LACY_TabKey,	TRUE,
							LACY_FirstLabel,MSG_MACROPANEL_NONE_TXT,
							LACY_LastLabel,	MSG_MACROPANEL_CONTROL_TXT,
						TAG_DONE);

						LT_New(Handle,
							LA_Type,	XBAR_KIND,
						TAG_DONE);

						LT_EndGroup(Handle);
					}

					LT_New(Handle,
						LA_Type,		VERTICAL_KIND,
					TAG_DONE);
					{
						LT_New(Handle,
							LA_Type,	STRING_KIND,
							LA_LabelID,	MSG_CURSORPANEL_CURSOR_UP_GAD,
							LA_Chars,	30,
							LA_ID,		GAD_UP,
							GTST_MaxChars,	255,
						TAG_DONE);

						LT_New(Handle,
							LA_Type,	STRING_KIND,
							LA_LabelID,	MSG_CURSORPANEL_CURSOR_DOWN_GAD,
							LA_Chars,	30,
							LA_ID,		GAD_DOWN,
							GTST_MaxChars,	255,
						TAG_DONE);

						LT_New(Handle,
							LA_Type,	STRING_KIND,
							LA_LabelID,	MSG_CURSORPANEL_CURSOR_RIGHT_GAD,
							LA_Chars,	30,
							LA_ID,		GAD_RIGHT,
							GTST_MaxChars,	255,
						TAG_DONE);

						LT_New(Handle,
							LA_Type,	STRING_KIND,
							LA_LabelID,	MSG_CURSORPANEL_CURSOR_LEFT_GAD,
							LA_Chars,	30,
							LA_ID,		GAD_LEFT,
							GTST_MaxChars,	255,
						TAG_DONE);

						LT_EndGroup(Handle);
					}

					LT_EndGroup(Handle);
				}

				LT_New(Handle,
					LA_Type,VERTICAL_KIND,
				TAG_DONE);
				{
					LT_New(Handle,
						LA_Type,	XBAR_KIND,
						LAXB_FullSize,	TRUE,
					TAG_DONE);

					LT_EndGroup(Handle);
				}

				LT_New(Handle,LA_Type,HORIZONTAL_KIND,
					LAGR_SameSize,	TRUE,
					LAGR_Spread,	TRUE,
				TAG_DONE);
				{
					LT_New(Handle,
						LA_Type,	BUTTON_KIND,
						LA_LabelID,	MSG_GLOBAL_USE_GAD,
						LA_ID,		GAD_USE,
						LABT_ReturnKey,	TRUE,
						LABT_ExtraFat,	TRUE,
					TAG_DONE);

					LT_New(Handle,
						LA_Type,	BUTTON_KIND,
						LA_LabelID,	MSG_GLOBAL_DEFAULT_GAD,
						LA_ID,		GAD_DEFAULT,
						LABT_ExtraFat,	TRUE,
					TAG_DONE);

					LT_New(Handle,
						LA_Type,	BUTTON_KIND,
						LA_LabelID,	MSG_GLOBAL_LOAD_GAD,
						LA_ID,		GAD_LOAD,
						LABT_ExtraFat,	TRUE,
					TAG_DONE);

					LT_New(Handle,
						LA_Type,	BUTTON_KIND,
						LA_LabelID,	MSG_GLOBAL_SAVE_GAD,
						LA_ID,		GAD_SAVE,
						LABT_ExtraFat,	TRUE,
					TAG_DONE);

					LT_New(Handle,
						LA_Type,	BUTTON_KIND,
						LA_LabelID,	MSG_GLOBAL_CANCEL_GAD,
						LA_ID,		GAD_CANCEL,
						LABT_EscKey,	TRUE,
						LABT_ExtraFat,	TRUE,
					TAG_DONE);

					LT_EndGroup(Handle);
				}

				LT_EndGroup(Handle);
			}

			if(PanelWindow = LT_Layout(Handle,LocaleString(MSG_CURSORPANEL_CURSOR_PREFERENCES_TXT),NULL,0,0,IDCMP_CLOSEWINDOW,0,
				LAWN_HelpHook,		&GuideHook,
				LAWN_Parent,		Parent,
				WA_DepthGadget,		TRUE,
				WA_CloseGadget,		TRUE,
				WA_DragBar,		TRUE,
				WA_RMBTrap,		TRUE,
				WA_Activate,		TRUE,
			TAG_DONE))
			{
				struct IntuiMessage	*Message;
				BOOLEAN			 Done = FALSE;
				ULONG			 MsgClass,
							 MsgQualifier;
				UWORD			 MsgCode;
				struct Gadget		*MsgGadget;
				UBYTE			 DummyBuffer[MAX_FILENAME_LENGTH],
							*DummyChar;
				struct FileRequester	*FileRequest;
				LONG			 Modifier = 0,i;

				GuideContext(CONTEXT_CURSOR);

				PushWindow(PanelWindow);

				LT_ShowWindow(Handle,TRUE);

				for(i = 0 ; i < 4 ; i++)
				{
					LT_SetAttributes(Handle,GAD_UP + i,
						GTST_String,Keys -> Keys[Modifier][i],
					TAG_DONE);
				}

				do
				{
					if(Wait(PORTMASK(PanelWindow -> UserPort) | SIG_BREAK) & SIG_BREAK)
					{
						CopyMem(CursorKeys,Keys,sizeof(struct CursorKeys));

						break;
					}

					while(Message = (struct IntuiMessage *)GT_GetIMsg(PanelWindow -> UserPort))
					{
						MsgClass	= Message -> Class;
						MsgQualifier	= Message -> Qualifier;
						MsgCode		= Message -> Code;
						MsgGadget	= (struct Gadget *)Message -> IAddress;

						GT_ReplyIMsg(Message);

						LT_HandleInput(Handle,MsgQualifier,&MsgClass,&MsgCode,&MsgGadget);

						if(MsgClass == IDCMP_CLOSEWINDOW)
						{
							CopyMem(CursorKeys,Keys,sizeof(struct CursorKeys));

							Done = TRUE;
						}

						if(MsgClass == IDCMP_GADGETUP)
						{
							switch(MsgGadget -> GadgetID)
							{
								case GAD_DEFAULT:

									ResetCursorKeys(Keys);

									for(i = 0 ; i < 4 ; i++)
									{
										LT_SetAttributes(Handle,GAD_UP + i,
											GTST_String,Keys -> Keys[Modifier][i],
										TAG_DONE);
									}

									break;

								case GAD_QUALIFIER:

									for(i = 0 ; i < 4 ; i++)
										strcpy(Keys -> Keys[Modifier][i],(STRPTR)LT_GetAttributes(Handle,GAD_UP + i,TAG_DONE));

									Modifier = MsgCode;

									for(i = 0 ; i < 4 ; i++)
									{
										LT_SetAttributes(Handle,GAD_UP + i,
											GTST_String,Keys -> Keys[Modifier][i],
										TAG_DONE);
									}

									break;

								case GAD_USE:

									for(i = 0 ; i < 4 ; i++)
										strcpy(Keys -> Keys[Modifier][i],(STRPTR)LT_GetAttributes(Handle,GAD_UP + i,TAG_DONE));

									CopyMem(Keys,CursorKeys,sizeof(struct CursorKeys));

									Done = TRUE;
									break;

								case GAD_CANCEL:

									CopyMem(CursorKeys,Keys,sizeof(struct CursorKeys));

									Done = TRUE;
									break;

								case GAD_LOAD:

									strcpy(DummyBuffer,LastCursorKeys);

									DummyChar = PathPart(DummyBuffer);

									*DummyChar = 0;

									LT_LockWindow(PanelWindow);

									if(FileRequest = GetFile(PanelWindow,LocaleString(MSG_CURSORPANEL_LOAD_CURSOR_KEYS_TXT),DummyBuffer,FilePart(LastCursorKeys),DummyBuffer,"#?.prefs",FALSE,FALSE,FALSE,LocaleString(MSG_GLOBAL_LOAD_TXT),TRUE))
									{
										if(!ReadIFFData(DummyBuffer,Keys,sizeof(struct CursorKeys),ID_KEYS))
											ShowError(PanelWindow,ERR_LOAD_ERROR,IoErr(),DummyBuffer);
										else
										{
											OldCRC = DoCRC(Keys,sizeof(struct CursorKeys));

											CursorKeysChanged = FALSE;

											strcpy(Config -> FileConfig -> CursorFileName,DummyBuffer);

											strcpy(LastCursorKeys,DummyBuffer);

											for(i = 0 ; i < 4 ; i++)
											{
												LT_SetAttributes(Handle,GAD_UP + i,
													GTST_String,Keys -> Keys[Modifier][i],
												TAG_DONE);
											}
										}

										FreeAslRequest(FileRequest);
									}

									LT_UnlockWindow(PanelWindow);

									break;

								case GAD_SAVE:

									strcpy(DummyBuffer,LastCursorKeys);

									DummyChar = PathPart(DummyBuffer);

									*DummyChar = 0;

									LT_LockWindow(PanelWindow);

									for(i = 0 ; i < 4 ; i++)
										strcpy(Keys -> Keys[Modifier][i],(STRPTR)LT_GetAttributes(Handle,GAD_UP + i,TAG_DONE));

									if(FileRequest = GetFile(PanelWindow,LocaleString(MSG_CURSORPANEL_SAVE_CURSOR_KEYS_TXT),DummyBuffer,FilePart(LastCursorKeys),DummyBuffer,"#?.prefs",TRUE,FALSE,FALSE,LocaleString(MSG_GLOBAL_SAVE_TXT),TRUE))
									{
										if(!WriteIFFData(DummyBuffer,Keys,sizeof(struct CursorKeys),ID_KEYS))
											ShowError(PanelWindow,ERR_SAVE_ERROR,IoErr(),DummyBuffer);
										else
										{
											strcpy(LastCursorKeys,DummyBuffer);

											CursorKeysChanged = FALSE;

											OldCRC = DoCRC(Keys,sizeof(struct CursorKeys));
										}

										FreeAslRequest(FileRequest);
									}

									LT_UnlockWindow(PanelWindow);

									break;
							}
						}
					}
				}
				while(!Done);

				PopWindow();
			}

			LT_DeleteHandle(Handle);
		}

		FreeVecPooled(Keys);
	}

	CursorKeysChanged |= (OldCRC != DoCRC(CursorKeys,sizeof(struct CursorKeys)));

	return(CursorKeysChanged);
}
