/* groupPanel.c 
 *
 *  defines the GUIFront characteristics of the group 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 "dataBase.h"
#include "groupPanel.h"
#include <string.h>


/* prototypes */
BOOL GroupHandleGadget(struct IntuiMessage *);
BOOL GroupInit(void);

static BOOL newgroup;
static struct Window *groupWin;
static struct List groupList;
static struct List *cats;
ExtErrorData GroupExtData;
GUIFront *groupGUI;

/* quick configure of some gadgets */

/* define gadgetspec */
GadgetSpec GRPgadgetspecs[] = 
{
	{LISTVIEW_KIND,25,8, {0,0,0,0,NULL,NULL,GID_GRPMAINLIST,
		PLACETEXT_ABOVE},ListView,GS_DefaultTags},

	{LISTVIEW_KIND,25,8, {0,0,0,0,NULL,NULL,GID_GRPLIST,
		PLACETEXT_ABOVE},ListView,GS_DefaultTags},

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

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

/* set up array of pointers to our specs */
GadgetSpec *GRP_GroupSpecs[] =
{
        &GRPgadgetspecs[0],
        &GRPgadgetspecs[1],
        &GRPgadgetspecs[2],
        &GRPgadgetspecs[3],
        NULL,
};

/* define the layout of this panel */
ULONG GRP_GroupPanel[] =
{
   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, "Categories",

				GUIL_GadgetSpecID, GID_GRPMAINLIST,
			TAG_DONE,

			GUIL_HorizGroup,1,

				GUIL_FrameType, GUILFT_Ridge,
				GUIL_FrameHeadline, "Group List",

				GUIL_GadgetSpecID, GID_GRPLIST,

               		TAG_DONE,

		TAG_DONE,

	TAG_DONE,
        
    TAG_DONE,
    
    GUIL_HorizGroup,1,
        GUIL_Flags, GUILF_EqualSize | GUILF_EqualWidth,

           GUIL_GadgetSpecID, GID_GRPOK,
           GUIL_GadgetSpecID, GID_GRPCANCEL,
           
    TAG_DONE,   
           
TAG_DONE,
};


/****************************************************
* GroupGUI ()
*
*	Creates the GUI for the group panel.
*****************************************************/
void GroupGUI(struct List *catlist, struct List *groupcats)
{
 BOOL done = FALSE;
 BOOL noreply;
 UWORD ordinal;
 ULONG signal;
 
 newgroup = FALSE;
    
 AmiLock();

	cats = catlist;
	NewList(&groupList);
	DataCopyList(groupcats, &groupList, DataAddCat);

 	GF_SetGUIAttr(groupGUI, GUI_OpenGUI, TRUE, TAG_DONE);
 	/* grab window */
 	GF_GetGUIAttr(groupGUI,GUI_Window,&groupWin,TAG_DONE);
	if (!GroupInit())
		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_GADGETUP:
					noreply = FALSE;
					done=GroupHandleGadget(imsg);
					break;

				case IDCMP_RAWKEY:
					AmiHelpKey(imsg,GROUP_PANEL);
					break;
                        }
                                     
                              
                        if (noreply) GF_ReplyIMsg(imsg);
                    }
                }

   GF_SetGadgetAttrs(groupGUI,GRPgadgetspecs[GID_GRPLIST].gs_Gadget,
			GTLV_Labels, ~0,
			TAG_DONE);

   GF_SetGadgetAttrs(groupGUI,GRPgadgetspecs[GID_GRPMAINLIST].gs_Gadget,
			GTLV_Labels, ~0,
			TAG_DONE);

   GF_SetGUIAttr(groupGUI, GUI_OpenGUI, FALSE, TAG_DONE);

   /* Copy list back...? */
   if (newgroup == TRUE)
	DataMoveList(&groupList,groupcats);
   else	DataFreeList(&groupList);

   AmiUnlock();
  return;
}

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

 switch (gad->GadgetID) {
	
	case GID_GRPLIST:
		DataListRemove(groupGUI,GRPgadgetspecs[GID_GRPLIST].gs_Gadget,&groupList,&code);
		break;

	case GID_GRPMAINLIST:
		temp = (categoryNode *)DataOrd2Node(cats,code);
		if (DataIsUnique(groupGUI,&groupList,temp->catname,TRUE,"Category is alreay a member.")) {
			GF_SetGadgetAttrs(groupGUI,GRPgadgetspecs[GID_GRPLIST].gs_Gadget,
				GTLV_Labels, ~0,
				TAG_DONE);		
	
			DataAddCat(&groupList,temp);

			GF_SetGadgetAttrs(groupGUI,GRPgadgetspecs[GID_GRPLIST].gs_Gadget,
				GTLV_Labels, &groupList,
				GTLV_MakeVisible,DataCountNodes(&groupList)-1,
				TAG_DONE);	
		}
		break;

	case GID_GRPOK:
		done = TRUE;
		/* copy stuff into new.. */
		newgroup = TRUE;
		break;

	case GID_GRPCANCEL:
		done = TRUE;
		break;

 }

 GF_ReplyIMsg(imsg);
 return (done);
}

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

 GF_SetGadgetAttrs(groupGUI,GRPgadgetspecs[GID_GRPMAINLIST].gs_Gadget,
			GTLV_Labels, cats,
			GTLV_Selected,~0,
			TAG_DONE);

 GF_SetGadgetAttrs(groupGUI,GRPgadgetspecs[GID_GRPLIST].gs_Gadget,
			GTLV_Labels, &groupList,
			GTLV_Selected,~0,
			TAG_DONE);


 return (TRUE);
}
