/* $Revision Header * Header built automatically - do not edit! *************
 *
 *	(C) Copyright 1991 by Olaf 'Olsen' Barthel & MXM
 *
 *	Name .....: FastMacroPanel.c
 *	Created ..: Monday 19-Aug-91 19:42
 *	Revision .: 0
 *
 *	Date            Author          Comment
 *	=========       ========        ====================
 *	19-Aug-91       Olsen           Created this file!
 *
 * $Revision Header ********************************************************/

#include "TermGlobal.h"

#define WIDTH	288
#define HEIGHT	137

enum	{	GAD_LIST,GAD_MACRO,GAD_CODE,GAD_NEW,GAD_DELETE,GAD_LOAD,GAD_SAVE };

enum	{	MEN_NEW=1,MEN_DELETE,MEN_LOAD,MEN_SAVEMACROS,MEN_QUITMACROS };

STATIC struct NewMenu MacroMenu[] =
{
	{ NM_TITLE, "Project",		 0 , 0, 0, (APTR)0},
	{  NM_ITEM, "New",		"N", 0, 0, (APTR)MEN_NEW},
	{  NM_ITEM, "Delete",		"D", 0, 0, (APTR)MEN_DELETE},
	{  NM_ITEM, NM_BARLABEL,	 0 , 0, 0, (APTR)0},
	{  NM_ITEM, "Load",		"L", 0, 0, (APTR)MEN_LOAD},
	{  NM_ITEM, "Save",		"S", 0, 0, (APTR)MEN_SAVEMACROS},
	{  NM_ITEM, NM_BARLABEL,	 0 , 0, 0, (APTR)0},
	{  NM_ITEM, "Quit",		"Q", 0, 0, (APTR)MEN_QUITMACROS},
	{ NM_END, 0,			 0 , 0, 0, (APTR)0}
};

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		= 180;
		NewGadget . ng_TextAttr		= &DefaultFont;
		NewGadget . ng_VisualInfo	= VisualInfo;
		NewGadget . ng_Flags		= PLACETEXT_LEFT;
		NewGadget . ng_Height		= 78;
		NewGadget . ng_GadgetText	= "Macro List";
		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,
			GTLV_Labels,	&FastMacroList,
		TAG_DONE);

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

			GadgetArray[Counter++] = Gadget = CreateGadget(STRING_KIND,Gadget,&NewGadget,
				GTST_MaxChars,	20,
				GTST_EditHook,	&CommandHook,
			TAG_DONE);

			NewGadget . ng_Height		= 14;
			NewGadget . ng_GadgetText	= "Macro Text";
			NewGadget . ng_GadgetID		= Counter;
			NewGadget . ng_TopEdge		= NewGadget . ng_TopEdge + NewGadget . ng_Height + 1;

			GadgetArray[Counter++] = Gadget = CreateGadget(STRING_KIND,Gadget,&NewGadget,
				GTST_MaxChars,	256,
				GTST_EditHook,	&CommandHook,
			TAG_DONE);

			NewGadget . ng_Width		= 52;
			NewGadget . ng_Height		= 12;
			NewGadget . ng_GadgetText	= "_New";
			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	= "_Delete";
			NewGadget . ng_GadgetID		= Counter;
			NewGadget . ng_LeftEdge		= NewGadget . ng_LeftEdge + WIDTH / 4 + 4;

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

			NewGadget . ng_GadgetText	= "_Load";
			NewGadget . ng_GadgetID		= Counter;
			NewGadget . ng_LeftEdge		= NewGadget . ng_LeftEdge + WIDTH / 4 + 4;

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

			NewGadget . ng_GadgetText	= "_Save";
			NewGadget . ng_GadgetID		= Counter;
			NewGadget . ng_LeftEdge		= WIDTH - 10 - NewGadget . ng_Width;

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

	return(Gadget);
}

VOID
FastMacroPanel()
{
	struct Window		*PanelWindow;
	struct Menu		*PanelMenu;
	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(PanelMenu = CreateMenus(MacroMenu,
			GTMN_FrontPen, 0,
		TAG_DONE))
		{
			if(LayoutMenus(PanelMenu,VisualInfo,
				GTMN_TextAttr,&DefaultFont,
			TAG_DONE))
			{
				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_MENUPICK | IDCMP_RAWKEY | IDCMP_ACTIVEWINDOW | IDCMP_GADGETDOWN | LISTVIEWIDCMP | STRINGIDCMP | BUTTONIDCMP,

					WA_Title,	"Fast! Macro Preferences",
				TAG_DONE))
				{
					struct IntuiMessage	*Massage;
					ULONG			 Class,Code;
					struct Gadget		*Gadget;
					BYTE			 Terminated = FALSE;
					struct MacroNode	*Node,*Selected = NULL;

					PushWindow(PanelWindow);

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

					SetMenuStrip(PanelWindow,PanelMenu);

					PanelWindow -> Flags &= ~WFLG_RMBTRAP;

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

					ActiveGadget = GadgetArray[GAD_MACRO];

					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_GADGETDOWN)
							{
								if((Gadget -> GadgetType & GTYP_GTYPEMASK) == STRGADGET)
									ActiveGadget = Gadget;
							}

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

							if(Class == IDCMP_RAWKEY)
							{
								if(Code == IECODE_UP_PREFIX|103 && CommandWindow == PanelWindow)
									ActivateGadget(CommandGadget,PanelWindow,NULL);
							}

							if(Class == IDCMP_MENUPICK)
							{
								struct MenuItem *MenuItem;

								while(Code != MENUNULL)
								{
									MenuItem = ItemAddress(PanelMenu,Code);

									switch((ULONG)GTMENUITEM_USERDATA(MenuItem))
									{
										case MEN_NEW:		Class = IDCMP_GADGETUP;
													Gadget = GadgetArray[GAD_NEW];
													break;

										case MEN_DELETE:	Class = IDCMP_GADGETUP;
													Gadget = GadgetArray[GAD_DELETE];
													break;

										case MEN_LOAD:		Class = IDCMP_GADGETUP;
													Gadget = GadgetArray[GAD_LOAD];
													break;

										case MEN_SAVEMACROS:	Class = IDCMP_GADGETUP;
													Gadget = GadgetArray[GAD_SAVE];
													break;

										case MEN_QUITMACROS:		Terminated = TRUE;
													break;

										default:		break;
									}

									Code = MenuItem -> NextSelect;
								}

								if(ActiveGadget)
									ActivateGadget(ActiveGadget,PanelWindow,NULL);
							}

							if(Class == IDCMP_CLOSEWINDOW)
								Terminated = TRUE;

							if(Class == IDCMP_GADGETUP)
							{
								switch(Gadget -> GadgetID)
								{
									case GAD_NEW:		if(Node = NewFastMacro("-- Unnamed --",""))
												{
													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);
													}

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

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

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

													Selected = Node;
												}
												else
													DisplayBeep(Screen);

												break;

									case GAD_DELETE:	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;
													}

													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)
													{
														Selected = NULL;

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

														GT_SetGadgetAttrs(GadgetArray[GAD_MACRO],PanelWindow,NULL,
															GTST_String,	"",
														TAG_DONE);
													}
													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))
												{
													GT_SetGadgetAttrs(GadgetArray[GAD_MACRO],PanelWindow,NULL,
														GTST_String,	Selected -> mn_Macro,
													TAG_DONE);

													GT_SetGadgetAttrs(GadgetArray[GAD_CODE],PanelWindow,NULL,
														GTST_String,	Selected -> mn_Code,
													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,((struct StringInfo *)Gadget -> SpecialInfo) -> Buffer);

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

													ActivateGadget(ActiveGadget = GadgetArray[GAD_CODE],PanelWindow,NULL);
												}

												break;

									case GAD_CODE:		if(Selected)
													strcpy(Selected -> mn_Code,((struct StringInfo *)Gadget -> SpecialInfo) -> Buffer);

												break;

									case GAD_LOAD:		strcpy(DummyBuffer,LastFastMacros);

												DummyChar = PathPart(DummyBuffer);

												*DummyChar = 0;

												SetWait(PanelWindow);

												PanelWindow -> Flags |= WFLG_RMBTRAP;

												if(FileRequest = GetFile("Load Fast! Macro Settings",DummyBuffer,FilePart(LastFastMacros),DummyBuffer,"#?.term",FALSE,FALSE,FALSE,"Load"))
												{
													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(!LoadFastMacros(DummyBuffer))
													{
														MyEasyRequest(Window,"Couldn't load fast! macro settings\n\"%s\"!","Continue",DummyBuffer);

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

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

														Selected = NULL;
													}
													else
													{
														if(Selected)
														{
															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);

															GT_SetGadgetAttrs(GadgetArray[GAD_MACRO],PanelWindow,NULL,
																GTST_String,	Selected -> mn_Macro,
															TAG_DONE);
														}
														else
														{
															GT_SetGadgetAttrs(GadgetArray[GAD_LIST],PanelWindow,NULL,
																GTLV_Labels,	&FastMacroList,
															TAG_DONE);

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

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

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

												ClearPointer(PanelWindow);
												PanelWindow -> Flags &= ~WFLG_RMBTRAP;

												break;

									case GAD_SAVE:		strcpy(DummyBuffer,LastFastMacros);

												DummyChar = PathPart(DummyBuffer);

												*DummyChar = 0;

												SetWait(PanelWindow);
												PanelWindow -> Flags |= WFLG_RMBTRAP;

												if(FileRequest = GetFile("Save Fast! Macro Settings",DummyBuffer,FilePart(LastFastMacros),DummyBuffer,"#?.term",TRUE,FALSE,FALSE,"Save"))
												{
													if(!SaveFastMacros(DummyBuffer))
														MyEasyRequest(Window,"Couldn't save fast! macro settings\n\"%s\"!","Continue",DummyBuffer);
													else
														strcpy(LastFastMacros,DummyBuffer);
												}

												ClearPointer(PanelWindow);
												PanelWindow -> Flags &= ~WFLG_RMBTRAP;

												break;
								}
							}
						}
					}

					PanelWindow -> Flags |= WFLG_RMBTRAP;

					ClearMenuStrip(PanelWindow);

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

					PopWindow();

					CloseWindow(PanelWindow);
				}
			}

			FreeMenus(PanelMenu);
		}
	}

	FreeGadgets(GadgetList);
}
