/*
**	$Id: FastMacroPanel.c,v 1.6 92/05/02 18:53:19 olsen Sta Locker: olsen $
**	$Revision: 1.6 $
**	$Date: 92/05/02 18:53:19 $
**
**	Editing panel for fast! macros
**
**	Copyright © 1990-1992 by Olaf `Olsen' Barthel & MXM
**		All Rights Reserved
*/

#include "termGlobal.h"

#define WIDTH	432
#define HEIGHT	150

	/* 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_LIST,GAD_MACRO,GAD_CODE,
		GAD_TOP,GAD_UP,GAD_DOWN,GAD_END,
		GAD_NEW,GAD_REMOVE,GAD_LOAD,GAD_SAVE };

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

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

	if(Gadget = CreateContext(GadgetList))
	{
		NewGadget . ng_Width		= 324;
		NewGadget . ng_TextAttr		= &DefaultFont;
		NewGadget . ng_VisualInfo	= VisualInfo;
		NewGadget . ng_Flags		= PLACETEXT_LEFT;
		NewGadget . ng_Height		= 78;
		NewGadget . ng_GadgetText	= LocaleString(MSG_FASTMACROPANEL_MACRO_LIST_GAD);
		NewGadget . ng_GadgetID		= Counter;
		NewGadget . ng_LeftEdge		= (strlen(NewGadget . ng_GadgetText) + 2) * 8 + 2;
		NewGadget . ng_TopEdge		= 1 + TopEdge;

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

		if(Gadget)
		{
			NewGadget . ng_Height		= 14;
			NewGadget . ng_GadgetText	= LocaleString(MSG_FASTMACROPANEL_MACRO_GAD);
			NewGadget . ng_GadgetID		= Counter;
			NewGadget . ng_TopEdge		= Gadget -> TopEdge + Gadget -> Height + 1;

			GadgetArray[Counter++] = Gadget = CreateGadget(STRING_KIND,Gadget,&NewGadget,
				GT_Underscore,	'_',
				GTST_MaxChars,	19,
				GTST_EditHook,	&CommandHook,
				GA_Disabled,	TRUE,
				GA_Immediate,	TRUE,
			TAG_DONE);

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

			GadgetArray[Counter++] = Gadget = CreateGadget(STRING_KIND,Gadget,&NewGadget,
				GT_Underscore,	'_',
				GTST_MaxChars,	255,
				GTST_EditHook,	&CommandHook,
				GA_Disabled,	TRUE,
				GA_Immediate,	TRUE,
			TAG_DONE);

			NewGadget . ng_Width		= GADGET_WIDTH;
			NewGadget . ng_TopEdge		= NewGadget . ng_TopEdge + NewGadget . ng_Height + 1;
			NewGadget . ng_Height		= 12;
			NewGadget . ng_GadgetText	= LocaleString(MSG_FASTMACROPANEL_TOP_GAD);
			NewGadget . ng_GadgetID		= Counter;
			NewGadget . ng_Flags		= 0;
			NewGadget . ng_LeftEdge		= 10;

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

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

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

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

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

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

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

			NewGadget . ng_GadgetText	= LocaleString(MSG_FASTMACROPANEL_NEW_GAD);
			NewGadget . ng_GadgetID		= Counter;
			NewGadget . ng_LeftEdge		= 10;
			NewGadget . ng_TopEdge		= NewGadget . ng_TopEdge + NewGadget . ng_Height + 4;

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

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

			GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
				GT_Underscore,	'_',
				GA_Disabled,	TRUE,
			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,	'_',
				GA_Disabled,	TRUE,
			TAG_DONE);
		}
	}

	return(Gadget);
}

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

	if(CreateAllGadgets(&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_NoCareRefresh,	TRUE,

			WA_IDCMP,		IDCMP_CLOSEWINDOW | IDCMP_VANILLAKEY | IDCMP_ACTIVEWINDOW | IDCMP_GADGETDOWN | LISTVIEWIDCMP | STRINGIDCMP | BUTTONIDCMP,

			WA_Title,		LocaleString(MSG_FASTMACROPANEL_FAST_MACRO_PREFERENCES_TXT),
		TAG_DONE))
		{
			struct IntuiMessage	*Massage;
			ULONG			 Class,Code;
			struct Gadget		*Gadget;
			BYTE			 Terminated = FALSE;
			struct MacroNode	*Node,*Selected = NULL;
			ULONG			 Offset = 0;

			PushWindow(PanelWindow);

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

			if(FastMacroList . lh_Head -> ln_Succ)
			{
				GT_SetGadgetAttrs(GadgetArray[GAD_SAVE],PanelWindow,NULL,
					GA_Disabled,	FALSE,
				TAG_DONE);
			}
			else
			{
				GT_SetGadgetAttrs(GadgetArray[GAD_SAVE],PanelWindow,NULL,
					GA_Disabled,	TRUE,
				TAG_DONE);
			}

			ActiveGadget = 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_SAVE,Code,PanelWindow,&Gadget,&Class,&Code);

					if(Class == IDCMP_GADGETDOWN)
					{
						if((Gadget -> GadgetType & GTYP_GTYPEMASK) == GTYP_STRGADGET)
							ActiveGadget = Gadget;
					}

					if(Class == IDCMP_ACTIVEWINDOW && ActiveGadget)
						ActivateGadget(ActiveGadget,PanelWindow,NULL);

					if(Class == IDCMP_CLOSEWINDOW)
						Terminated = TRUE;

					if(Class == IDCMP_GADGETUP)
					{
						switch(Gadget -> GadgetID)
						{
							case GAD_TOP:		GT_SetGadgetAttrs(GadgetArray[GAD_LIST],PanelWindow,NULL,
											GTLV_Labels,	~0,
										TAG_DONE);

										if(FastWindow)
										{
											GT_SetGadgetAttrs(FastGadget,FastWindow,NULL,
												GTLV_Labels,	~0,
											TAG_DONE);
										}

										Remove((struct Node *)Selected);

										AddHead(&FastMacroList,(struct Node *)Selected);

										if(FastWindow)
										{
											GT_SetGadgetAttrs(FastGadget,FastWindow,NULL,
												GTLV_Labels,	&FastMacroList,
											TAG_DONE);
										}

										Offset = 0;

										GT_SetGadgetAttrs(GadgetArray[GAD_LIST],PanelWindow,NULL,
											GTLV_Labels,	&FastMacroList,
											GTLV_Selected,	Offset,
											GTLV_Top,	Offset,
										TAG_DONE);

										GT_SetGadgetAttrs(GadgetArray[GAD_TOP],PanelWindow,NULL,
											GA_Disabled,	TRUE,
										TAG_DONE);

										GT_SetGadgetAttrs(GadgetArray[GAD_UP],PanelWindow,NULL,
											GA_Disabled,	TRUE,
										TAG_DONE);

										if(Selected -> mn_Succ -> mn_Succ)
										{
											GT_SetGadgetAttrs(GadgetArray[GAD_DOWN],PanelWindow,NULL,
												GA_Disabled,	FALSE,
											TAG_DONE);

											GT_SetGadgetAttrs(GadgetArray[GAD_END],PanelWindow,NULL,
												GA_Disabled,	FALSE,
											TAG_DONE);
										}
										else
										{
											GT_SetGadgetAttrs(GadgetArray[GAD_DOWN],PanelWindow,NULL,
												GA_Disabled,	TRUE,
											TAG_DONE);

											GT_SetGadgetAttrs(GadgetArray[GAD_END],PanelWindow,NULL,
												GA_Disabled,	TRUE,
											TAG_DONE);
										}

										break;

							case GAD_UP:		GT_SetGadgetAttrs(GadgetArray[GAD_LIST],PanelWindow,NULL,
											GTLV_Labels,	~0,
										TAG_DONE);

										if(FastWindow)
										{
											GT_SetGadgetAttrs(FastGadget,FastWindow,NULL,
												GTLV_Labels,	~0,
											TAG_DONE);
										}

										Node = Selected -> mn_Pred -> mn_Pred;

										Remove((struct Node *)Selected);

										Insert(&FastMacroList,(struct Node *)Selected,(struct Node *)Node);

										if(FastWindow)
										{
											GT_SetGadgetAttrs(FastGadget,FastWindow,NULL,
												GTLV_Labels,	&FastMacroList,
											TAG_DONE);
										}

										Offset--;

										GT_SetGadgetAttrs(GadgetArray[GAD_LIST],PanelWindow,NULL,
											GTLV_Labels,	&FastMacroList,
											GTLV_Selected,	Offset,
											GTLV_Top,	Offset,
										TAG_DONE);

										if(Selected -> mn_Pred -> mn_Pred)
										{
											GT_SetGadgetAttrs(GadgetArray[GAD_TOP],PanelWindow,NULL,
												GA_Disabled,	FALSE,
											TAG_DONE);

											GT_SetGadgetAttrs(GadgetArray[GAD_UP],PanelWindow,NULL,
												GA_Disabled,	FALSE,
											TAG_DONE);
										}
										else
										{
											GT_SetGadgetAttrs(GadgetArray[GAD_TOP],PanelWindow,NULL,
												GA_Disabled,	TRUE,
											TAG_DONE);

											GT_SetGadgetAttrs(GadgetArray[GAD_UP],PanelWindow,NULL,
												GA_Disabled,	TRUE,
											TAG_DONE);
										}

										if(Selected -> mn_Succ -> mn_Succ)
										{
											GT_SetGadgetAttrs(GadgetArray[GAD_DOWN],PanelWindow,NULL,
												GA_Disabled,	FALSE,
											TAG_DONE);

											GT_SetGadgetAttrs(GadgetArray[GAD_END],PanelWindow,NULL,
												GA_Disabled,	FALSE,
											TAG_DONE);
										}
										else
										{
											GT_SetGadgetAttrs(GadgetArray[GAD_DOWN],PanelWindow,NULL,
												GA_Disabled,	TRUE,
											TAG_DONE);

											GT_SetGadgetAttrs(GadgetArray[GAD_END],PanelWindow,NULL,
												GA_Disabled,	TRUE,
											TAG_DONE);
										}

										break;

							case GAD_DOWN:		GT_SetGadgetAttrs(GadgetArray[GAD_LIST],PanelWindow,NULL,
											GTLV_Labels,	~0,
										TAG_DONE);

										if(FastWindow)
										{
											GT_SetGadgetAttrs(FastGadget,FastWindow,NULL,
												GTLV_Labels,	~0,
											TAG_DONE);
										}

										Node = Selected -> mn_Succ;

										Remove((struct Node *)Selected);

										Insert(&FastMacroList,(struct Node *)Selected,(struct Node *)Node);

										if(FastWindow)
										{
											GT_SetGadgetAttrs(FastGadget,FastWindow,NULL,
												GTLV_Labels,	&FastMacroList,
											TAG_DONE);
										}

										Offset++;

										GT_SetGadgetAttrs(GadgetArray[GAD_LIST],PanelWindow,NULL,
											GTLV_Labels,	&FastMacroList,
											GTLV_Selected,	Offset,
											GTLV_Top,		Offset,
										TAG_DONE);

										if(Selected -> mn_Pred -> mn_Pred)
										{
											GT_SetGadgetAttrs(GadgetArray[GAD_TOP],PanelWindow,NULL,
												GA_Disabled,	FALSE,
											TAG_DONE);

											GT_SetGadgetAttrs(GadgetArray[GAD_UP],PanelWindow,NULL,
												GA_Disabled,	FALSE,
											TAG_DONE);
										}
										else
										{
											GT_SetGadgetAttrs(GadgetArray[GAD_TOP],PanelWindow,NULL,
												GA_Disabled,	TRUE,
											TAG_DONE);

											GT_SetGadgetAttrs(GadgetArray[GAD_UP],PanelWindow,NULL,
												GA_Disabled,	TRUE,
											TAG_DONE);
										}

										if(Selected -> mn_Succ -> mn_Succ)
										{
											GT_SetGadgetAttrs(GadgetArray[GAD_DOWN],PanelWindow,NULL,
												GA_Disabled,	FALSE,
											TAG_DONE);

											GT_SetGadgetAttrs(GadgetArray[GAD_END],PanelWindow,NULL,
												GA_Disabled,	FALSE,
											TAG_DONE);
										}
										else
										{
											GT_SetGadgetAttrs(GadgetArray[GAD_DOWN],PanelWindow,NULL,
												GA_Disabled,	TRUE,
											TAG_DONE);

											GT_SetGadgetAttrs(GadgetArray[GAD_END],PanelWindow,NULL,
												GA_Disabled,	TRUE,
											TAG_DONE);
										}

										break;

							case GAD_END:		GT_SetGadgetAttrs(GadgetArray[GAD_LIST],PanelWindow,NULL,
											GTLV_Labels,	~0,
										TAG_DONE);

										if(FastWindow)
										{
											GT_SetGadgetAttrs(FastGadget,FastWindow,NULL,
												GTLV_Labels,	~0,
											TAG_DONE);
										}

										Remove((struct Node *)Selected);

										AddTail(&FastMacroList,(struct Node *)Selected);

										if(FastWindow)
										{
											GT_SetGadgetAttrs(FastGadget,FastWindow,NULL,
												GTLV_Labels,	&FastMacroList,
											TAG_DONE);
										}

										Offset = FastMacroCount - 1;

										GT_SetGadgetAttrs(GadgetArray[GAD_LIST],PanelWindow,NULL,
											GTLV_Labels,	&FastMacroList,
											GTLV_Selected,	Offset,
											GTLV_Top,		Offset,
										TAG_DONE);

										GT_SetGadgetAttrs(GadgetArray[GAD_DOWN],PanelWindow,NULL,
											GA_Disabled,	TRUE,
										TAG_DONE);

										GT_SetGadgetAttrs(GadgetArray[GAD_END],PanelWindow,NULL,
											GA_Disabled,	TRUE,
										TAG_DONE);

										if(Selected -> mn_Pred -> mn_Pred)
										{
											GT_SetGadgetAttrs(GadgetArray[GAD_TOP],PanelWindow,NULL,
												GA_Disabled,	FALSE,
											TAG_DONE);

											GT_SetGadgetAttrs(GadgetArray[GAD_UP],PanelWindow,NULL,
												GA_Disabled,	FALSE,
											TAG_DONE);
										}
										else
										{
											GT_SetGadgetAttrs(GadgetArray[GAD_TOP],PanelWindow,NULL,
												GA_Disabled,	TRUE,
											TAG_DONE);

											GT_SetGadgetAttrs(GadgetArray[GAD_UP],PanelWindow,NULL,
												GA_Disabled,	TRUE,
											TAG_DONE);
										}

										break;

							case GAD_NEW:		if(Node = NewFastMacro(LocaleString(MSG_FASTMACROPANEL_UNNAMED_TXT),""))
										{
											GT_SetGadgetAttrs(GadgetArray[GAD_LIST],PanelWindow,NULL,
												GTLV_Labels,	~0,
											TAG_DONE);

											if(FastWindow)
											{
												GT_SetGadgetAttrs(FastGadget,FastWindow,NULL,
													GTLV_Labels,	~0,
												TAG_DONE);
											}

											AddTail(&FastMacroList,(struct Node *)Node);

											if(FastWindow)
											{
												GT_SetGadgetAttrs(FastGadget,FastWindow,NULL,
													GTLV_Labels,	&FastMacroList,
												TAG_DONE);
											}

											Offset = FastMacroCount;

											GT_SetGadgetAttrs(GadgetArray[GAD_LIST],PanelWindow,NULL,
												GTLV_Labels,	&FastMacroList,
												GTLV_Selected,	FastMacroCount++,
											TAG_DONE);

											GT_SetGadgetAttrs(GadgetArray[GAD_CODE],PanelWindow,NULL,
												GTST_String,	"",
												GA_Disabled,	FALSE,
											TAG_DONE);

											GT_SetGadgetAttrs(GadgetArray[GAD_MACRO],PanelWindow,NULL,
												GTST_String,	Node -> mn_Macro,
												GA_Disabled,	FALSE,
											TAG_DONE);

											GT_SetGadgetAttrs(GadgetArray[GAD_REMOVE],PanelWindow,NULL,
												GA_Disabled,	FALSE,
											TAG_DONE);

											GT_SetGadgetAttrs(GadgetArray[GAD_SAVE],PanelWindow,NULL,
												GA_Disabled,	FALSE,
											TAG_DONE);

											if(FastMacroCount > 1)
											{
												GT_SetGadgetAttrs(GadgetArray[GAD_TOP],PanelWindow,NULL,
													GA_Disabled,	FALSE,
												TAG_DONE);

												GT_SetGadgetAttrs(GadgetArray[GAD_UP],PanelWindow,NULL,
													GA_Disabled,	FALSE,
												TAG_DONE);
											}
											else
											{
												GT_SetGadgetAttrs(GadgetArray[GAD_TOP],PanelWindow,NULL,
													GA_Disabled,	TRUE,
												TAG_DONE);

												GT_SetGadgetAttrs(GadgetArray[GAD_UP],PanelWindow,NULL,
													GA_Disabled,	TRUE,
												TAG_DONE);
											}

											GT_SetGadgetAttrs(GadgetArray[GAD_DOWN],PanelWindow,NULL,
												GA_Disabled,	FALSE,
											TAG_DONE);

											GT_SetGadgetAttrs(GadgetArray[GAD_END],PanelWindow,NULL,
												GA_Disabled,	FALSE,
											TAG_DONE);

											Selected = Node;

											Offset = Code;

											ActivateGadget(GadgetArray[GAD_MACRO],PanelWindow,NULL);

											ActiveGadget = GadgetArray[GAD_MACRO];
										}
										else
											DisplayBeep(Screen);

										break;

							case GAD_REMOVE:	if(Selected)
										{
											GT_SetGadgetAttrs(GadgetArray[GAD_LIST],PanelWindow,NULL,
												GTLV_Labels,	~0,
											TAG_DONE);

											if(FastWindow)
											{
												GT_SetGadgetAttrs(FastGadget,FastWindow,NULL,
													GTLV_Labels,	~0,
												TAG_DONE);
											}

											if(--FastMacroCount)
											{
												if(Selected -> mn_Succ -> mn_Succ)
													Node = Selected -> mn_Succ;
												else
												{
													Node = Selected -> mn_Pred;

													Offset = 0;
												}
											}

											RemFastMacro(Selected);

											if(FastWindow)
											{
												GT_SetGadgetAttrs(FastGadget,FastWindow,NULL,
													GTLV_Labels,	&FastMacroList,
												TAG_DONE);
											}

											GT_SetGadgetAttrs(GadgetArray[GAD_LIST],PanelWindow,NULL,
												GTLV_Labels,	&FastMacroList,
												GTLV_Selected,	Node -> mn_Succ ? GetFastMacroOffset(Node) : ~0,
											TAG_DONE);

											if(FastMacroCount < 2)
											{
												GT_SetGadgetAttrs(GadgetArray[GAD_TOP],PanelWindow,NULL,
													GA_Disabled,	TRUE,
												TAG_DONE);

												GT_SetGadgetAttrs(GadgetArray[GAD_UP],PanelWindow,NULL,
													GA_Disabled,	TRUE,
												TAG_DONE);

												GT_SetGadgetAttrs(GadgetArray[GAD_DOWN],PanelWindow,NULL,
													GA_Disabled,	TRUE,
												TAG_DONE);

												GT_SetGadgetAttrs(GadgetArray[GAD_END],PanelWindow,NULL,
													GA_Disabled,	TRUE,
												TAG_DONE);
											}
											else
											{
												if(FastMacroCount)
												{
													if(!Node -> mn_Succ -> mn_Succ)
													{
														GT_SetGadgetAttrs(GadgetArray[GAD_DOWN],PanelWindow,NULL,
															GA_Disabled,	TRUE,
														TAG_DONE);

														GT_SetGadgetAttrs(GadgetArray[GAD_END],PanelWindow,NULL,
															GA_Disabled,	TRUE,
														TAG_DONE);
													}
												}
											}

											if(!FastMacroCount)
											{
												Selected = NULL;

												GT_SetGadgetAttrs(GadgetArray[GAD_CODE],PanelWindow,NULL,
													GTST_String,	"",
													GA_Disabled,	TRUE,
												TAG_DONE);

												GT_SetGadgetAttrs(GadgetArray[GAD_MACRO],PanelWindow,NULL,
													GTST_String,	"",
													GA_Disabled,	TRUE,
												TAG_DONE);

												GT_SetGadgetAttrs(GadgetArray[GAD_REMOVE],PanelWindow,NULL,
													GA_Disabled,	TRUE,
												TAG_DONE);

												GT_SetGadgetAttrs(GadgetArray[GAD_SAVE],PanelWindow,NULL,
													GA_Disabled,	TRUE,
												TAG_DONE);

												ActiveGadget = NULL;
											}
											else
											{
												Selected = Node;

												GT_SetGadgetAttrs(GadgetArray[GAD_CODE],PanelWindow,NULL,
													GTST_String,	Selected -> mn_Code,
												TAG_DONE);

												GT_SetGadgetAttrs(GadgetArray[GAD_MACRO],PanelWindow,NULL,
													GTST_String,	Selected -> mn_Macro,
												TAG_DONE);
											}
										}

										break;

							case GAD_LIST:		if(Selected = GetFastMacro(Code))
										{
											Offset = Code;

											GT_SetGadgetAttrs(GadgetArray[GAD_MACRO],PanelWindow,NULL,
												GTST_String,	Selected -> mn_Macro,
												GA_Disabled,	FALSE,
											TAG_DONE);

											GT_SetGadgetAttrs(GadgetArray[GAD_CODE],PanelWindow,NULL,
												GTST_String,	Selected -> mn_Code,
												GA_Disabled,	FALSE,
											TAG_DONE);

											GT_SetGadgetAttrs(GadgetArray[GAD_REMOVE],PanelWindow,NULL,
												GA_Disabled,	FALSE,
											TAG_DONE);

											if(Selected -> mn_Pred -> mn_Pred)
											{
												GT_SetGadgetAttrs(GadgetArray[GAD_TOP],PanelWindow,NULL,
													GA_Disabled,	FALSE,
												TAG_DONE);

												GT_SetGadgetAttrs(GadgetArray[GAD_UP],PanelWindow,NULL,
													GA_Disabled,	FALSE,
												TAG_DONE);
											}
											else
											{
												GT_SetGadgetAttrs(GadgetArray[GAD_TOP],PanelWindow,NULL,
													GA_Disabled,	TRUE,
												TAG_DONE);

												GT_SetGadgetAttrs(GadgetArray[GAD_UP],PanelWindow,NULL,
													GA_Disabled,	TRUE,
												TAG_DONE);
											}

											if(Selected -> mn_Succ -> mn_Succ)
											{
												GT_SetGadgetAttrs(GadgetArray[GAD_DOWN],PanelWindow,NULL,
													GA_Disabled,	FALSE,
												TAG_DONE);

												GT_SetGadgetAttrs(GadgetArray[GAD_END],PanelWindow,NULL,
													GA_Disabled,	FALSE,
												TAG_DONE);
											}
											else
											{
												GT_SetGadgetAttrs(GadgetArray[GAD_DOWN],PanelWindow,NULL,
													GA_Disabled,	TRUE,
												TAG_DONE);

												GT_SetGadgetAttrs(GadgetArray[GAD_END],PanelWindow,NULL,
													GA_Disabled,	TRUE,
												TAG_DONE);
											}
										}

										break;

							case GAD_MACRO:		if(Selected)
										{
											GT_SetGadgetAttrs(GadgetArray[GAD_LIST],PanelWindow,NULL,
												GTLV_Labels,	~0,
											TAG_DONE);

											if(FastWindow)
											{
												GT_SetGadgetAttrs(FastGadget,FastWindow,NULL,
													GTLV_Labels,	~0,
												TAG_DONE);
											}

											strcpy(Selected -> mn_Macro,GT_STRING(Gadget));

											if(FastWindow)
											{
												GT_SetGadgetAttrs(FastGadget,FastWindow,NULL,
													GTLV_Labels,	&FastMacroList,
												TAG_DONE);
											}

											GT_SetGadgetAttrs(GadgetArray[GAD_LIST],PanelWindow,NULL,
												GTLV_Labels,	&FastMacroList,
												GTLV_Selected,	GetFastMacroOffset(Selected),
											TAG_DONE);

											GT_SetGadgetAttrs(GadgetArray[GAD_CODE],PanelWindow,NULL,
												GTST_String,	Selected -> mn_Code,
											TAG_DONE);
										}

										break;

							case GAD_CODE:		if(Selected)
											strcpy(Selected -> mn_Code,GT_STRING(Gadget));

										break;

							case GAD_LOAD:		strcpy(DummyBuffer,LastFastMacros);

										DummyChar = PathPart(DummyBuffer);

										*DummyChar = 0;

										BlockWindow(PanelWindow);

										if(FileRequest = GetFile(LocaleString(MSG_FASTMACROPANEL_LOAD_FAST_MACRO_SETTINGS_TXT),DummyBuffer,FilePart(LastFastMacros),DummyBuffer,"term#?",FALSE,FALSE,FALSE,LocaleString(MSG_GLOBAL_LOAD_TXT)))
										{
											GT_SetGadgetAttrs(GadgetArray[GAD_LIST],PanelWindow,NULL,
												GTLV_Labels,	~0,
											TAG_DONE);

											if(FastWindow)
											{
												GT_SetGadgetAttrs(FastGadget,FastWindow,NULL,
													GTLV_Labels,	~0,
												TAG_DONE);
											}

											Selected = NULL;

											if(!LoadFastMacros(DummyBuffer))
												MyEasyRequest(Window,LocaleString(MSG_FASTMACROPANEL_COULD_NOT_LOAD_FAST_MACRO_SETTINGS_TXT),LocaleString(MSG_GLOBAL_CONTINUE_TXT),DummyBuffer);
											else
											{
												strcpy(Config . FastMacroFile,DummyBuffer);

												strcpy(LastFastMacros,DummyBuffer);
											}

											GT_SetGadgetAttrs(GadgetArray[GAD_LIST],PanelWindow,NULL,
												GTLV_Labels,	&FastMacroList,
											TAG_DONE);

											GT_SetGadgetAttrs(GadgetArray[GAD_CODE],PanelWindow,NULL,
												GTST_String,	"",
												GA_Disabled,	TRUE,
											TAG_DONE);

											GT_SetGadgetAttrs(GadgetArray[GAD_MACRO],PanelWindow,NULL,
												GTST_String,	"",
												GA_Disabled,	TRUE,
											TAG_DONE);

											GT_SetGadgetAttrs(GadgetArray[GAD_REMOVE],PanelWindow,NULL,
												GA_Disabled,	TRUE,
											TAG_DONE);

											GT_SetGadgetAttrs(GadgetArray[GAD_TOP],PanelWindow,NULL,
												GA_Disabled,	TRUE,
											TAG_DONE);

											GT_SetGadgetAttrs(GadgetArray[GAD_UP],PanelWindow,NULL,
												GA_Disabled,	TRUE,
											TAG_DONE);

											GT_SetGadgetAttrs(GadgetArray[GAD_DOWN],PanelWindow,NULL,
												GA_Disabled,	TRUE,
											TAG_DONE);

											GT_SetGadgetAttrs(GadgetArray[GAD_END],PanelWindow,NULL,
												GA_Disabled,	TRUE,
											TAG_DONE);

											ActiveGadget = NULL;

											if(FastWindow)
											{
												GT_SetGadgetAttrs(FastGadget,FastWindow,NULL,
													GTLV_Labels,	&FastMacroList,
												TAG_DONE);
											}
										}

										if(FastMacroList . lh_Head -> ln_Succ)
										{
											GT_SetGadgetAttrs(GadgetArray[GAD_SAVE],PanelWindow,NULL,
												GA_Disabled,	FALSE,
											TAG_DONE);
										}
										else
										{
											GT_SetGadgetAttrs(GadgetArray[GAD_SAVE],PanelWindow,NULL,
												GA_Disabled,	TRUE,
											TAG_DONE);
										}

										ReleaseWindow(PanelWindow);

										break;

							case GAD_SAVE:		strcpy(DummyBuffer,LastFastMacros);

										DummyChar = PathPart(DummyBuffer);

										*DummyChar = 0;

										BlockWindow(PanelWindow);

										if(FileRequest = GetFile(LocaleString(MSG_FASTMACROPANEL_SAVE_FAST_MACRO_SETTINGS_TXT),DummyBuffer,FilePart(LastFastMacros),DummyBuffer,"term#?",TRUE,FALSE,FALSE,LocaleString(MSG_GLOBAL_SAVE_TXT)))
										{
											if(!SaveFastMacros(DummyBuffer))
												MyEasyRequest(Window,LocaleString(MSG_FASTMACROPANEL_COULD_NOT_SAVE_FAST_MACRO_SETTINGS_TXT),LocaleString(MSG_GLOBAL_CONTINUE_TXT),DummyBuffer);
											else
												strcpy(LastFastMacros,DummyBuffer);
										}

										ReleaseWindow(PanelWindow);

										break;
						}
					}
				}
			}

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

			PopWindow();

			CloseWindow(PanelWindow);
		}
	}

	FreeGadgets(GadgetList);
}
