/*
 * Key Map Editor ver 1.0
 * Process Menu
 *
 * parameter: 	Code - Code returned by IDCMP
 * returns: 	True if execute should be continued
 *		False if Quit option selected
 *
 * by: Tim Friest
 * on: January 1, 1989
 */

#include "KME_Includes.h"
#include "KME_Protos.h"
#include "KME_Defs.h"
#include "KME_Pointers.h"
#include "KME_Globals.h"

extern	UBYTE	FileNameBuff[30];

int ProcMenu(Code)
unsigned short	Code;
{
	int	Num, Item;

	Num = MENUNUM(Code);
	Item = ITEMNUM(Code);

	switch (Num) {
		case 0:	/* Project Menu */
			switch (Item) {
				case 0:	/* Load KeyMap */
					KeyMapIO(FileNameBuff, LOAD);
					break;
				case 1: /* New KeyMap */
					KeyMapNode = MakeNewKeyMap();
					break;
				case 2:	/* Save KeyMap */
					KeyMapIO(FileNameBuff, SAVE);
					break;
				case 4:	/* Exit Editor */
					if (CheckFlag(SF_Modified))
						return(!VerifyReq());
					else
						return(FALSE);
			}
			break;
		case 1:	/* Options Menu */
			switch (Item) {
				case 0:	/* Define Key Codes */
					ClearFlag((SF_Define|SF_Copy|SF_Move|SF_Swap|SF_Clear));
					FromKeyGad = NULL;
					SetFlag(SF_Define);
					if (CheckFlag(SF_Pointer))
						ChangePointer(0);
					break;
				case 1:	/* Copy Key Codes */
					ClearFlag((SF_Define|SF_Copy|SF_Move|SF_Swap|SF_Clear));
					FromKeyGad = NULL;
					SetFlag(SF_Copy);
					ChangePointer(SF_Copy);
					break;
				case 2:	/* Move Key Codes */
					ClearFlag((SF_Define|SF_Copy|SF_Move|SF_Swap|SF_Clear));
					FromKeyGad = NULL;
					SetFlag(SF_Move);
					ChangePointer(SF_Move);
					break;
				case 3:	/* Swap Key Codes */
					ClearFlag((SF_Define|SF_Copy|SF_Move|SF_Swap|SF_Clear));
					FromKeyGad = NULL;
					SetFlag(SF_Swap);
					ChangePointer(SF_Swap);
					break;
				case 4:	/* Clear Key Codes */
					ClearFlag((SF_Define|SF_Copy|SF_Move|SF_Swap|SF_Clear));
					FromKeyGad = NULL;
					SetFlag(SF_Clear);
					ChangePointer(SF_Clear);
			}
	}
	return(TRUE);
}

/*
 * Make New Key Map
 *
 * returns:	KeyMapNode - KeyMapNode Pointer
 */
struct KeyMapNode *MakeNewKeyMap()
{
	struct KeyMapNode *NewKeyMapNode;
	UBYTE	*ptr;
	USHORT	code;

	if (CheckResource(RF_KeyMap))
		FreeKeyMap(KeyMapNode);
	if ((NewKeyMapNode = (struct KeyMapNode *)AllocMem((KeyNodeSize + KeyMapSize), MEMF_CLEAR)) == NULL) {
		Write(Output(), "Memory Allocation failed, MakeNewKeyMapNode\n", 44);
		return(NULL);
	}
	ptr = (UBYTE *)NewKeyMapNode;
	NewKeyMapNode->kn_KeyMap.km_LoKeyMapTypes = (UBYTE *)&ptr[KeyNodeSize];
	NewKeyMapNode->kn_KeyMap.km_LoKeyMap = (ULONG *)&ptr[KeyNodeSize + 0x40];
	NewKeyMapNode->kn_KeyMap.km_LoCapsable = (UBYTE *)&ptr[KeyNodeSize + 0x40 + 0x40*4];
	NewKeyMapNode->kn_KeyMap.km_LoRepeatable = (UBYTE *)&ptr[KeyNodeSize + 0x40 + 0x40*4 + 8];
	NewKeyMapNode->kn_KeyMap.km_HiKeyMapTypes = (UBYTE *)&ptr[KeyNodeSize + (0x40 + 0x40*4 + 8 + 8)];
	NewKeyMapNode->kn_KeyMap.km_HiKeyMap = (ULONG *)&ptr[KeyNodeSize + (0x40 + 0x40*4 + 8 + 8) + 0x38];
	NewKeyMapNode->kn_KeyMap.km_HiCapsable = (UBYTE *)&ptr[KeyNodeSize + (0x40 + 0x40*4 + 8 + 8) + 0x38 + 0x38*4];
	NewKeyMapNode->kn_KeyMap.km_HiRepeatable = (UBYTE *)&ptr[KeyNodeSize + (0x40 + 0x40*4 + 8 + 8) + 0x38 + 0x38*4 + 7];
	for (code = 0; code < 0x40; code++)
		NewKeyMapNode->kn_KeyMap.km_LoKeyMapTypes[code] = KCF_NOP;
	for (code = 0; code < 0x38; code++)
		NewKeyMapNode->kn_KeyMap.km_HiKeyMapTypes[code] = KCF_NOP;
	FlagResource(RF_KeyMap);
	UpdateDisplay(GadgetList, NewKeyMapNode, TRUE);
	return(NewKeyMapNode);
}

/*
 * Verify Requester
 */

struct IntuiText	VerifyReqMsg = {
	0, 1, JAM1,
	15, 20,
	NULL,
	"Key Map has been Modified",
	NULL
};
struct IntuiText	ContinueReqMsg = {
	0, 1, JAM1,
	6, 3,
	NULL,
	"Continue",
	NULL
};
struct IntuiText	CancelReqMsg = {
	0, 1, JAM1,
	6, 3,
	NULL,
	"Cancel",
	NULL
};

int VerifyReq()
{
	return(AutoRequest(KeyMapEdWindow, &VerifyReqMsg, &ContinueReqMsg,
		&CancelReqMsg, NULL, NULL, 250, 75));
}

/*
 * Change Pointer
 *
 * Parameter:	Option - Option bit from StatusFlags
 */
void ChangePointer(Option)
unsigned long Option;
{
	switch (Option) {
		case 0:
			SetPointer(KeyMapEdWindow, NULL, 0, 0, 0, 0);
			ClearFlag(SF_Pointer);
			break;
		case SF_Copy:
			SetPointer(KeyMapEdWindow, (short *)CopyPtrSpriteImage, 31, 12, -2, -1);
			SetFlag(SF_Pointer);
			break;
		case SF_Move:
			SetPointer(KeyMapEdWindow, (short *)MovePtrSpriteImage, 28, 15, -2, -2);
			SetFlag(SF_Pointer);
			break;
		case SF_Swap:
			SetPointer(KeyMapEdWindow, (short *)SwapPtrSpriteImage, 30, 14, -2, -2);
			SetFlag(SF_Pointer);
			break;
		case SF_Clear:
			SetPointer(KeyMapEdWindow, (short *)ClearPtrSpriteImage, 33, 16, -2, -3);
			SetFlag(SF_Pointer);
			break;
		case -1:
			SetPointer(KeyMapEdWindow, (short *)ToPtrSpriteImage,17, 11, -2, -1);
			SetFlag(SF_Pointer);
	} /* switch */
}
