/* scriptPanel.c 
 *
 *  defines the GUIFront characteristics of the script panel 
 */
  
#include <stdio.h>  
#include <intuition/gadgetclass.h>
#include <exec/memory.h>
#include <clib/exec_protos.h>
#include <clib/asl_protos.h>
#include <libraries/asl.h>

#include "amiCheck.h"
#include "regGadget.h"
#include "dataBase.h"
#include "scriptPanel.h"
#include <string.h>


/* prototypes */
BOOL ScriptHandleGadget(struct IntuiMessage *);
BOOL ScriptInit(void);
void ScriptDisableGads(BOOL);
scriptNode *ScriptAddNode(char *);
BOOL ScriptSave (char *);
BOOL ScriptLoad (char *);

WORD scriptEntries;
struct Window *scriptWin;
struct List scriptList;
ExtErrorData ScriptExtData;
GUIFront *scriptGUI;
UWORD	scriptlistActive;
char sctitle[100];
char fname[100];

/* quick configure of some gadgets */

/* define gadgetspec */
GadgetSpec SCPgadgetspecs[] = 
{
	{LISTVIEW_KIND,20,8, {0,0,0,0,NULL,NULL,GID_SCPTEMPLIST,
		PLACETEXT_ABOVE},ListView,GS_DefaultTags},

	{LISTVIEW_KIND,20,8, {0,0,0,0,NULL,NULL,GID_SCPLIST,
		PLACETEXT_ABOVE},ListView,GS_DefaultTags},

        {BUTTON_KIND,0,0,{0,0,0,0,"_Open", NULL, GID_SCPOPEN,         
                PLACETEXT_IN}, NULL, GS_DefaultTags},

        {BUTTON_KIND,0,0,{0,0,0,0,"_Save", NULL, GID_SCPSAVE,         
                PLACETEXT_IN}, NULL, GS_DefaultTags},

        {BUTTON_KIND,0,0,{0,0,0,0,"Save _As", NULL, GID_SCPSAVEAS,         
                PLACETEXT_IN}, NULL, GS_DefaultTags},

        {BUTTON_KIND,0,0,{0,0,0,0,"_Up", NULL, GID_SCPUP,         
                PLACETEXT_IN}, NULL, GS_DefaultTags},

        {BUTTON_KIND,0,0,{0,0,0,0,"_Down", NULL, GID_SCPDOWN,         
                PLACETEXT_IN}, NULL, GS_DefaultTags},

        {BUTTON_KIND,0,0,{0,0,0,0,"_Top", NULL, GID_SCPTOP,         
                PLACETEXT_IN}, NULL, GS_DefaultTags},

        {BUTTON_KIND,0,0,{0,0,0,0,"_Bottom", NULL, GID_SCPBOTTOM,         
                PLACETEXT_IN}, NULL, GS_DefaultTags},

        {BUTTON_KIND,0,0,{0,0,0,0,"_Remove", NULL, GID_SCPREMOVE,         
                PLACETEXT_IN}, NULL, GS_DefaultTags},

        {BUTTON_KIND,0,0,{0,0,0,0,"_Cancel", NULL, GID_SCPCANCEL,        
                PLACETEXT_IN}, NULL, GS_DefaultTags},
};

/* set up array of pointers to our specs */
GadgetSpec *SCP_ScriptSpecs[] =
{
        &SCPgadgetspecs[0],
        &SCPgadgetspecs[1],
        &SCPgadgetspecs[2],
        &SCPgadgetspecs[3],
        &SCPgadgetspecs[4],
        &SCPgadgetspecs[5],
        &SCPgadgetspecs[6],
        &SCPgadgetspecs[7],
        &SCPgadgetspecs[8],
        &SCPgadgetspecs[9],
	&SCPgadgetspecs[10],
        NULL,
};


/* define the layout of this panel */
ULONG SCP_ScriptPanel[] =
{
   GUIL_Flags, GUILF_PropShare | GUILF_EqualWidth,

   GUIL_HorizGroup, 1,
        GUIL_Flags, GUILF_PropShare,
	GUIL_FrameType, GUILFT_Recess,
        
	GUIL_VertGroup, 1,

		GUIL_HorizGroup,1,

			GUIL_HorizGroup,1,
				GUIL_FrameType, GUILFT_Ridge,
				GUIL_FrameHeadline, "Templates",

				GUIL_GadgetSpecID, GID_SCPTEMPLIST,
			TAG_DONE,

			GUIL_HorizGroup,1,

				GUIL_FrameType, GUILFT_Ridge,
				GUIL_FrameHeadline, "Script List",

				GUIL_GadgetSpecID, GID_SCPLIST,

                		GUIL_VertGroup,1,
                        		GUIL_Flags, GUILF_PropShare | GUILF_EqualWidth | GUILF_EqualHeight,
                                              
					GUIL_GadgetSpecID, GID_SCPUP,
					GUIL_GadgetSpecID, GID_SCPDOWN,
					GUIL_GadgetSpecID, GID_SCPTOP,
					GUIL_GadgetSpecID, GID_SCPBOTTOM,
					GUIL_GadgetSpecID, GID_SCPREMOVE,
				TAG_DONE,
               		TAG_DONE,

		TAG_DONE,

	TAG_DONE,
        
    TAG_DONE,
    
    GUIL_HorizGroup,1,
        GUIL_Flags, GUILF_EqualSize | GUILF_EqualWidth,
        
	   GUIL_GadgetSpecID, GID_SCPSAVE,
	   GUIL_GadgetSpecID, GID_SCPSAVEAS,
           GUIL_GadgetSpecID, GID_SCPOPEN,
           GUIL_GadgetSpecID, GID_SCPCANCEL,
           
    TAG_DONE,   
           
TAG_DONE,
};


/****************************************************
* ScriptGUI ()
*
*	Creates the GUI for the script panel.
*****************************************************/
void ScriptGUI(void)
{
 BOOL done = FALSE;
 BOOL noreply;
 UWORD ordinal;
 ULONG signal;
     
 AmiLock();

 	GF_SetGUIAttr(scriptGUI, GUI_OpenGUI, TRUE, TAG_DONE);
 	/* grab window */
 	GF_GetGUIAttr(scriptGUI,GUI_Window,&scriptWin,TAG_DONE);
	if (!ScriptInit())
		done = TRUE;


                /* Process input events */
                while (!done)
                {
                    struct IntuiMessage *imsg;

                    /* Wait for an event to occur */

                    signal = GF_Wait(guiapp,AmigaGuideSignal(agc));
		    if (signal & AmigaGuideSignal(agc)) {
			AmiHelpMsg();
			continue;
		    }

                    /* We only bother to listen for CLOSEWINDOW events.
                     * Of course, in a real application, you would be
                     * examining the Class field for IDCMP_GADGETUP
                     * messages and act accordingly.
                     */

                    while (imsg = GF_GetIMsg(guiapp))
                    {
			noreply = TRUE;
                        switch (imsg->Class) {
				case IDCMP_REFRESHWINDOW:
					RegRefresh(TRUE);
					break;

                                case IDCMP_CLOSEWINDOW:
					done = TRUE;
                                        break;

				case IDCMP_RAWKEY:
					AmiHelpKey(imsg,SCRIPT_PANEL);

					if (IsListEmpty(&scriptList))
						break;
					if (GF_ProcessListView(scriptGUI,SCP_ScriptSpecs[GID_SCPLIST],
						imsg,&ordinal)) {
							scriptlistActive = ordinal;
							ScriptDisableGads(FALSE);
					}
					break;

				case IDCMP_GADGETUP:
					noreply = FALSE;
					done=ScriptHandleGadget(imsg);
					break;
                        }
                                     
                              
                        if (noreply) GF_ReplyIMsg(imsg);
                    }
                }

    GF_SetGadgetAttrs(scriptGUI,SCPgadgetspecs[GID_SCPLIST].gs_Gadget,
			GTLV_Labels, ~0,
			TAG_DONE);

    GF_SetGadgetAttrs(scriptGUI,SCPgadgetspecs[GID_SCPTEMPLIST].gs_Gadget,
			GTLV_Labels, ~0,
			TAG_DONE);

   DataFreeList(&scriptList);
   GF_SetGUIAttr(scriptGUI, GUI_OpenGUI, FALSE, TAG_DONE);
   AmiUnlock();
  return;
}

/***************************************************
* ScriptHandleGadget()
*
*	Handles gadget events for this panel
****************************************************/
BOOL  ScriptHandleGadget(struct IntuiMessage *imsg)
{
 BOOL done = FALSE;
 struct Gadget *gad = (struct Gadget *)(imsg->IAddress);
 UWORD code = imsg->Code;
 templateNode *temp;
 scriptNode *scr;

 switch (gad->GadgetID) {
	
	case GID_SCPTEMPLIST:
		if (code == SCRIPTTYPE)
			break;

		temp = (templateNode *)DataOrd2Node(&templates,code);
		GF_SetGadgetAttrs(scriptGUI,SCPgadgetspecs[GID_SCPLIST].gs_Gadget,
			GTLV_Labels, ~0,
			TAG_DONE);

		scr=ScriptAddNode(temp->tempname);
		scriptlistActive = scriptEntries;
		GF_SetGadgetAttrs(scriptGUI,SCPgadgetspecs[GID_SCPLIST].gs_Gadget,
			GTLV_Labels, &scriptList,
			GTLV_Selected,scriptlistActive,
			TAG_DONE);
		
		scriptEntries++;
		ScriptDisableGads(FALSE);

		GF_SetGadgetAttrs(scriptGUI,SCPgadgetspecs[GID_SCPSAVEAS].gs_Gadget,
			GA_Disabled, FALSE,
			TAG_DONE);
		break;

	case GID_SCPLIST:
		scriptlistActive = code;
		ScriptDisableGads(FALSE);
		break;

	case GID_SCPSAVE:
			if (ScriptSave(fname) != TRUE)
				AmiAnnounce("Encountered trouble trying to save script.");
		break;
	
	case GID_SCPSAVEAS:
		GF_LockGUI(scriptGUI);
		if (AmiGetFile(scriptGUI,scriptsaveASL,fname,100)) {
			if (ScriptSave(fname) != TRUE)
				AmiAnnounce("Encountered trouble trying to save script.");

			DataAttachIcon(iconPath,"AC_Script",fname);
			GF_SetGadgetAttrs(scriptGUI,SCPgadgetspecs[GID_SCPSAVE].gs_Gadget,
				GA_Disabled, FALSE,
				TAG_DONE);

			sprintf(sctitle,"Script Editor: %s",scriptsaveASL->fr_File);
			SetWindowTitles(scriptWin,sctitle,(UBYTE *)-1);
		}
		GF_UnlockGUI(scriptGUI);

		break;

	case GID_SCPOPEN:
		GF_LockGUI(scriptGUI);
		if (AmiGetFile(scriptGUI,scriptASL,fname,100)) {
			GF_SetGadgetAttrs(scriptGUI,SCPgadgetspecs[GID_SCPLIST].gs_Gadget,
				GTLV_Labels, ~0,
				TAG_DONE);

			DataFreeList(&scriptList);
			sprintf(sctitle,"Script Editor: %s",scriptASL->fr_File);
			SetWindowTitles(scriptWin,sctitle,(UBYTE *)-1);
			
			if (ScriptLoad(fname) != TRUE) 
				AmiAnnounce("Encountered trouble trying to load script.");

			GF_SetGadgetAttrs(scriptGUI,SCPgadgetspecs[GID_SCPSAVE].gs_Gadget,
				GA_Disabled, FALSE,
				TAG_DONE);

			GF_SetGadgetAttrs(scriptGUI,SCPgadgetspecs[GID_SCPSAVEAS].gs_Gadget,
				GA_Disabled, FALSE,
				TAG_DONE);

			GF_SetGadgetAttrs(scriptGUI,SCPgadgetspecs[GID_SCPLIST].gs_Gadget,
				GTLV_Labels, &scriptList,
				GTLV_Selected, ~0,
				TAG_DONE);

			ScriptDisableGads(TRUE);
		}
		GF_UnlockGUI(scriptGUI);
		break;

	case GID_SCPREMOVE:
		DataListRemove(scriptGUI, SCPgadgetspecs[GID_SCPLIST].gs_Gadget, 
			&scriptList, &scriptlistActive);

		if (IsListEmpty(&scriptList))
			ScriptDisableGads(TRUE);

		scriptEntries--;
		break;

	case GID_SCPUP:
		DataListUp(scriptGUI, SCPgadgetspecs[GID_SCPLIST].gs_Gadget, 
			&scriptList, &scriptlistActive);
		break;

	case GID_SCPDOWN:
		DataListDown(scriptGUI, SCPgadgetspecs[GID_SCPLIST].gs_Gadget, 
			&scriptList, &scriptlistActive);
		break;

	case GID_SCPTOP:
		DataListTop(scriptGUI, SCPgadgetspecs[GID_SCPLIST].gs_Gadget, 
			&scriptList, &scriptlistActive,0);
		break;

	case GID_SCPBOTTOM:
		DataListBottom(scriptGUI, SCPgadgetspecs[GID_SCPLIST].gs_Gadget, 
			&scriptList, &scriptlistActive, scriptEntries);
		break;
	
	case GID_SCPCANCEL:
		done = TRUE;
		break;

 }

 GF_ReplyIMsg(imsg);
 return (done);
}

/****************************************************
* ScriptInit()
*
*	Set up some globals
*****************************************************/
BOOL ScriptInit(void)
{

 sprintf(sctitle,"Script Editor: untitled.ACscript");
 SetWindowTitles(scriptWin,sctitle,(UBYTE *)-1);

 NewList (&scriptList);

 scriptlistActive = -1;
 scriptEntries = 0;
 GF_SetGadgetAttrs(scriptGUI,SCPgadgetspecs[GID_SCPTEMPLIST].gs_Gadget,
			GTLV_Labels, &templates,
			GTLV_Selected,~0,
			TAG_DONE);

 GF_SetGadgetAttrs(scriptGUI,SCPgadgetspecs[GID_SCPLIST].gs_Gadget,
			GTLV_Labels, ~0,
			GTLV_Selected,~0,
			TAG_DONE);

 GF_SetGadgetAttrs(scriptGUI,SCPgadgetspecs[GID_SCPSAVE].gs_Gadget,
	GA_Disabled, TRUE,
	TAG_DONE);

 GF_SetGadgetAttrs(scriptGUI,SCPgadgetspecs[GID_SCPSAVEAS].gs_Gadget,
	GA_Disabled, TRUE,
	TAG_DONE);

 ScriptDisableGads(TRUE);

 return (TRUE);
}

/****************************************************
* ScriptDisableGads()
*
*	Disable/Enable extra gadgets
*****************************************************/
void ScriptDisableGads(BOOL dis)
{

 GF_SetGadgetAttrs(scriptGUI,SCPgadgetspecs[GID_SCPREMOVE].gs_Gadget,
	GA_Disabled, dis,
	TAG_DONE);

 GF_SetGadgetAttrs(scriptGUI,SCPgadgetspecs[GID_SCPUP].gs_Gadget,
	GA_Disabled, dis,
	TAG_DONE);

 GF_SetGadgetAttrs(scriptGUI,SCPgadgetspecs[GID_SCPDOWN].gs_Gadget,
	GA_Disabled, dis,
	TAG_DONE);

 GF_SetGadgetAttrs(scriptGUI,SCPgadgetspecs[GID_SCPTOP].gs_Gadget,
	GA_Disabled, dis,
	TAG_DONE);

 GF_SetGadgetAttrs(scriptGUI,SCPgadgetspecs[GID_SCPBOTTOM].gs_Gadget,
	GA_Disabled, dis,
	TAG_DONE);

}

/****************************************************
* ScriptAddNode()
*
*	Add a node to the script list
*****************************************************/
scriptNode *ScriptAddNode(char *name)
{
 scriptNode *temp;

 temp = (scriptNode *)AllocVec(sizeof(scriptNode),MEMF_CLEAR);
 if (temp == NULL)
	return(NULL);

 strcpy(temp->scname, name);
 temp->node.ln_Name = temp->scname;
 AddTail(&scriptList,temp);

 return (temp);
}

/**************************************************************************
* ScriptSave()
*
*	Saves a script file
***************************************************************************/
BOOL ScriptSave (char *fname)
{
 scriptNode *temp = (scriptNode *)scriptList.lh_Head, *next;
 FILE *file;

 if (IsListEmpty(&scriptList))
	return(TRUE);

 if ( (file = fopen(fname,"w")) == NULL)
	return (FALSE);

 while ( (next = (scriptNode *)(temp->node.ln_Succ)) ) {
		fprintf(file,"%s",temp->scname);
		if (temp->node.ln_Succ != NULL)
			fprintf(file,"\n");
		temp = next;
 }

 fclose(file);
 return (TRUE);
}

/**************************************************************************
* ScriptLoad()
*
*	Loads a script file
***************************************************************************/
BOOL ScriptLoad (char *fname)
{
 char template[100];
 FILE *file;

 NewList(&scriptList);
 scriptEntries = 0;

 if ( (file = fopen(fname,"r")) == NULL)
	return (FALSE);

 /* while ( fscanf(file,"%s",template) != EOF) {*/
   while ( fgets(template,99,file) != NULL) {
		if (strlen(template) > 0)
			template[strlen(template)-1] = 0;

		ScriptAddNode(template);
		scriptEntries ++;
 }

 fclose(file);
 return (TRUE);
}
