/* edittempPanel.c 
 *
 *  defines the GUIFront characteristics of the edit template panel 
 */
  
#include <stdio.h>  
#include <intuition/gadgetclass.h>
#include "amiCheck.h"
#include "regGadget.h"
#include "edittempPanel.h"
#include "dataBase.h"
#include "newTempPanel.h"
#include "seltempPanel.h"
#include <string.h>


/* prototypes */
BOOL EditHandleGadget(struct IntuiMessage*);
void EditEnableGads(void);
void EditDisableGads(void);
void EditTempInit(void);

ExtErrorData EditExtData;
GUIFront *edittempGUI;
UWORD	listActive;
WORD currSelOrd;
BOOL	noItem;

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

        {BUTTON_KIND,0,0,{0,0,0,0,"_New", NULL, GID_TPNEW,         
                PLACETEXT_IN}, NULL, GS_DefaultTags},

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

        {BUTTON_KIND,0,0,{0,0,0,0,"_Edit", NULL, GID_TPEDIT,         
                PLACETEXT_IN}, NULL, GS_DefaultTags},

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

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

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

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

        {BUTTON_KIND,0,0,{0,0,0,0,"_OK", NULL, GID_TPOK,         
                PLACETEXT_IN}, NULL, GS_DefaultTags},

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

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


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

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

		GUIL_HorizGroup,1,
			GUIL_FrameType, GUILFT_Ridge,
			GUIL_FrameHeadline, "Current Templates",
			GUIL_GadgetSpecID, GID_TPTEMPLIST,

                	GUIL_VertGroup,1,
                        	GUIL_Flags, GUILF_PropShare | GUILF_EqualWidth | GUILF_EqualHeight,
                                              
				GUIL_GadgetSpecID, GID_TPUP,
				GUIL_GadgetSpecID, GID_TPDOWN,
				GUIL_GadgetSpecID, GID_TPTOP,
				GUIL_GadgetSpecID, GID_TPBOTTOM,
	                                       
                	TAG_DONE,

		TAG_DONE,

		GUIL_HorizGroup,1,
			GUIL_FrameType, GUILFT_Ridge,
			GUIL_Flags, GUILF_EqualSize | GUILF_EqualWidth,
			GUIL_GadgetSpecID, GID_TPEDIT,
			GUIL_GadgetSpecID, GID_TPDEL,
			GUIL_GadgetSpecID, GID_TPNEW,
		TAG_DONE,

	TAG_DONE,
        
    TAG_DONE,
    
    GUIL_HorizGroup,1,
        GUIL_Flags, GUILF_EqualSize | GUILF_EqualWidth,
        
           GUIL_GadgetSpecID, GID_TPOK,
           GUIL_GadgetSpecID, GID_TPCANCEL,
           
    TAG_DONE,   
           
TAG_DONE,
};


/****************************************************
* EditTempGUI ()
*
*	Creates the GUI for the edit temp panel.
*****************************************************/
void EditTempGUI(void)
{
 BOOL done = FALSE;
 UWORD ordinal;
 ULONG signal;
     
   AmiLock();

   /* install temporary list */
   NewList(&testtemps);
   DataCopyList(&templates,&testtemps, DataAddTemp);

   GF_SetGUIAttr(edittempGUI,GUI_OpenGUI, TRUE, TAG_DONE);
   EditTempInit();
		
   /* 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))      {
          	switch (imsg->Class) {
				case IDCMP_REFRESHWINDOW:
					RegRefresh(TRUE);
					break;

                        case IDCMP_CLOSEWINDOW:
					DataFreeList(&testtemps);
					NewList(&testtemps);
                                        done = TRUE;
                                        break;

				case IDCMP_RAWKEY:
					if (GF_ProcessListView(edittempGUI,TP_EditTempSpecs[GID_TPTEMPLIST],
						imsg,&ordinal)) {
							currSelOrd = listActive = ordinal;
							if (listActive >= DEFAULT_TEMPS && noItem==TRUE)
								EditEnableGads();
							else if (listActive < DEFAULT_TEMPS)
								EditDisableGads();
													
					}
					else AmiHelpKey(imsg,EDITTEMP_PANEL);
					break;

				case IDCMP_GADGETUP:
					done=EditHandleGadget(imsg);
					break;
                        }
                                     
                              
                        GF_ReplyIMsg(imsg);
                    }
            }

   

	 GF_SetGadgetAttrs(edittempGUI,TPgadgetspecs[GID_TPTEMPLIST].gs_Gadget,
		GTLV_Labels, ~0,
		TAG_DONE);
    GF_SetGUIAttr(edittempGUI,GUI_OpenGUI, FALSE, TAG_DONE);
    
    AmiUnlock();
}

/***************************************************
* EditHandleGadget()
*
*	Handles gadget events for this panel
****************************************************/
BOOL  EditHandleGadget(struct IntuiMessage *imsg)
{
 static ULONG micros = 0, secs = 0;
 struct Gadget *gad = (struct Gadget *)(imsg->IAddress);
 UWORD code = imsg->Code;
 BOOL done = FALSE;
 templateNode *curr, *copy;

 switch (gad->GadgetID) {
	case GID_TPDEL:
		if (listActive >= DEFAULT_TEMPS) {
			DataListRemove(edittempGUI,TPgadgetspecs[GID_TPTEMPLIST].gs_Gadget,
				&testtemps, &listActive);
			if (IsListEmpty(&testtemps))
				currSelOrd = -1;
			else currSelOrd = listActive;
			
			if (listActive < DEFAULT_TEMPS)
				EditDisableGads();
		}
		break;

	case GID_TPUP:
		if (listActive > DEFAULT_TEMPS) {
			DataListUp(edittempGUI,TPgadgetspecs[GID_TPTEMPLIST].gs_Gadget,
				&testtemps, &listActive);
			currSelOrd = listActive;
		}
		break;

	case GID_TPDOWN:
		if (listActive >= DEFAULT_TEMPS) {
			DataListDown(edittempGUI,TPgadgetspecs[GID_TPTEMPLIST].gs_Gadget,
				&testtemps, &listActive);
			currSelOrd = listActive;
		}	
		break;

	case GID_TPBOTTOM:
		if (listActive >= DEFAULT_TEMPS) {
			DataListBottom(edittempGUI,TPgadgetspecs[GID_TPTEMPLIST].gs_Gadget,
				&testtemps, &listActive, DataCountNodes(&testtemps));
			currSelOrd = listActive;
		}
		break;

	case GID_TPTOP:
		if (listActive > DEFAULT_TEMPS) {
			DataListTop(edittempGUI,TPgadgetspecs[GID_TPTEMPLIST].gs_Gadget,
				&testtemps, &listActive, DEFAULT_TEMPS);
		}
		break;
		
	case GID_TPTEMPLIST:
		if (listActive == code && listActive >= DEFAULT_TEMPS) {
			if (DoubleClick(secs,micros,imsg->Seconds,imsg->Micros))
				goto EDITLABEL;	
		}

		listActive = code;
		secs = imsg->Seconds;
		micros = imsg->Micros;

		if ( listActive >= DEFAULT_TEMPS && noItem == TRUE) 		
			EditEnableGads();
		else if (listActive < DEFAULT_TEMPS)	
			EditDisableGads();
		break;

	case GID_TPNEW:
		curr = NewTempGUI(NULL,"Enter NEW Template");
		if (curr != NULL) {
			GF_SetGadgetAttrs(edittempGUI,TPgadgetspecs[GID_TPTEMPLIST].gs_Gadget,
				GTLV_Labels, ~0,
				TAG_DONE);

			DataAddTemp(&testtemps, curr);
			listActive = DataNode2Ord(&testtemps,curr->tempname);

			GF_SetGadgetAttrs(edittempGUI,TPgadgetspecs[GID_TPTEMPLIST].gs_Gadget,
				GTLV_Labels, &testtemps,
				GTLV_Selected,listActive,
				GTLV_MakeVisible,listActive,
				TAG_DONE);

			if (noItem == TRUE) 	
				EditEnableGads();

		}
		break;

	case GID_TPEDIT:
	EDITLABEL:
		copy = (templateNode *)DataOrd2Node(&testtemps,(LONG)listActive);
		curr = NewTempGUI(copy, "Edit Template");
		if (curr != NULL) {
			GF_SetGadgetAttrs(edittempGUI,TPgadgetspecs[GID_TPTEMPLIST].gs_Gadget,
				GTLV_Labels, ~0,
				TAG_DONE);

			memcpy(&(copy->template),&(curr->template),sizeof(entryNode));
			memcpy(copy->tempname,curr->tempname,TEMPNAMESIZE);

			GF_SetGadgetAttrs(edittempGUI,TPgadgetspecs[GID_TPTEMPLIST].gs_Gadget,
				GTLV_Labels, &testtemps,
				GTLV_Selected, listActive,
				TAG_DONE);
		}
		break;

	case GID_TPCANCEL:
		DataFreeList(&testtemps);
		NewList(&testtemps);
		done = TRUE;
		break;

	case GID_TPOK:
		amiChangedItems = TRUE;
		if (selWin != NULL)
			SelTempStrip();

		DataMoveList(&testtemps,&templates);

		if (selWin != NULL)
			SelTempInstall();

		NewList(&testtemps);
		done = TRUE;
		if (currSelOrd != -1)
			amntState.currTemplate = currSelOrd;
			
		break;
 }

 return (done);
}


/*****************************************************
* EditEnableGads()
*
*	Enable the gadgets if an item has been selected
******************************************************/
void EditEnableGads(void)
{
 int x;

 if (noItem == FALSE)
	return;

 for (x=GID_TPDEL;x<=GID_TPBOTTOM;x++)
 	GF_SetGadgetAttrs(edittempGUI,TP_EditTempSpecs[x]->gs_Gadget,
		GA_Disabled,FALSE,
		TAG_DONE);

 noItem = FALSE;
}

/*****************************************************
* EditDisableGads()
*
*	Disable the gadgets if an item is not selected
******************************************************/
void EditDisableGads(void)
{
 int x;

 if (noItem == TRUE)
	return;

 for (x=GID_TPDEL;x<=GID_TPBOTTOM;x++)
 	GF_SetGadgetAttrs(edittempGUI,TP_EditTempSpecs[x]->gs_Gadget,
		GA_Disabled,TRUE,
		TAG_DONE);

 noItem = TRUE;
}

/****************************************************
* EditTempInit()
*
*	Set up some globals
*****************************************************/
void EditTempInit(void)
{
	listActive = 0;
	

	/* grab template ord info */
	listActive = currSelOrd = amntState.currTemplate;

	/* make curr sel the active one for convenience */
	GF_SetGadgetAttrs(edittempGUI,TPgadgetspecs[GID_TPTEMPLIST].gs_Gadget,
		GTLV_Labels, &testtemps,
		GTLV_Selected,listActive,
		GTLV_MakeVisible,listActive,
		TAG_DONE);
	
	if (listActive < DEFAULT_TEMPS) {
		noItem = FALSE;
		EditDisableGads();
	}
	else {
		noItem = TRUE;
		EditEnableGads();
	}
}
