/* reconcilePanel.c 
 *
 *  defines the GUIFront characteristics of the reconcile panel 
 */
  
#include <stdio.h>  
#include <intuition/gadgetclass.h>
#include "amiCheck.h"
#include "mainPanel.h"
#include "reconcilePanel.h"
#include "dataBase.h"
#include <string.h>
#include "regGadget.h"


/* prototypes */
BOOL RecHandleGadget(struct IntuiMessage *);
void RecInit(void);

ExtErrorData RecExtData;
GUIFront *recGUI;
char recstr[AMNTSIZE+1];
BOOL doit = FALSE;

/* quick configure of some gadgets */
struct TagItem warnTags[] =
{
	{GTTX_Text,"If this does not match statement,"}, 
	{TAG_DONE},
};

struct TagItem resTags[] =
{
	{GTTX_Text,"POSTPONE reconcile by canceling."},
	{TAG_DONE},
};


/* define gadgetspec */
GadgetSpec RCPgadgetspecs[] = 
{
	{TEXT_KIND,AMNTSIZE,0,{0,0,0,0,"Reconcile Result:",NULL,GID_RCPCURR,
		PLACETEXT_LEFT},TxtBorder,GS_DefaultTags},

	{TEXT_KIND,0,0,{0,0,0,0,NULL,NULL,GID_RCPWARN,
		PLACETEXT_LEFT},warnTags,GS_DefaultTags},

	{TEXT_KIND,0,0,{0,0,0,0,NULL,NULL,GID_RCPRESULTS,
		PLACETEXT_LEFT},resTags,GS_DefaultTags},

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

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

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


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

   GUIL_HorizGroup, 2,
        GUIL_Flags, GUILF_PropShare | GUILF_EqualHeight,
	GUIL_FrameType, GUILFT_Recess,
        
	GUIL_VertGroup, 3,
		GUIL_Flags, GUILF_PropShare | GUILF_EqualWidth,

		GUIL_GadgetSpecID, GID_RCPCURR,

		GUIL_VertGroup,0,
			GUIL_GadgetSpecID, GID_RCPWARN,
			GUIL_GadgetSpecID, GID_RCPRESULTS,
		TAG_DONE,
	TAG_DONE,
    TAG_DONE,
    
    GUIL_HorizGroup,1,
        GUIL_Flags, GUILF_EqualSize | GUILF_EqualWidth,
        
           GUIL_GadgetSpecID, GID_RCPOK,
           GUIL_GadgetSpecID, GID_RCPCANCEL,
           
    TAG_DONE,   
           
TAG_DONE,
};


/****************************************************
* ReconcileGUI ()
*
*	Creates the GUI for the sort panel.
*****************************************************/
void ReconcileGUI(void)
{
 BOOL done = FALSE;
 ULONG signal;

   AmiLock();
   doit = FALSE;   
		
		GF_SetGUIAttr(recGUI, GUI_OpenGUI, TRUE, TAG_DONE);
		RecInit();
                /* Process input events */
                while (!done)
                {
                    struct IntuiMessage *imsg;

                    /* Wait for an event to occur */

                    signal = GF_Wait(guiapp,AmigaGuideSignal(agc));

                    /* 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.
                     */

		    if (signal & AmigaGuideSignal(agc)) {
			AmiHelpMsg();
			continue;
		    }

                    while (imsg = GF_GetIMsg(guiapp))
                    {
                        switch (imsg->Class) {
				case IDCMP_RAWKEY:
					AmiHelpKey(imsg,RECONCILE_PANEL);
					break;

                                case IDCMP_CLOSEWINDOW:
					done = TRUE;
                                        break;

				case IDCMP_GADGETUP:
					done=RecHandleGadget(imsg);
					break;

				case IDCMP_REFRESHWINDOW:
					RegRefresh(TRUE);
					break;
                        }
                                     
                              
                        GF_ReplyIMsg(imsg);
                    }
                }

   GF_SetGUIAttr(recGUI, GUI_OpenGUI, FALSE, TAG_DONE);   
   AmiUnlock();
  
   if (doit == TRUE) {
	/* re-filter now that we have potentially marked up flags */
	AmiDisableSel(TRUE);
	AmiLock();
	DataRebuildFilters();
	if (autosort == TRUE && !IsListEmpty(&sortfields))
		DataSortFilter((filterNode *)filtered.mlh_Head,
			(filterNode *)filtered.mlh_TailPred,
			(sortNode *)sortfields.lh_Head);
	RegNewFilter();

	/* update the filter balance */
	DataFilterBalance(&filtered);
	DataBuildBal(usrAccount.decimal,&filtAmnt,filtStr);
	AmiUpdateFilt(filtStr);
	
	AmiUnlock();
  }
 
 return;
}

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

 char amntstr[AMNTSIZE+1];

 switch (gad->GadgetID) {

	case GID_RCPCANCEL:
		done = TRUE;
		break;
                                                         
	case GID_RCPOK:
		amiChangedItems = TRUE;
		amntState.stateAmnt = DataReconcile(TRUE);
		DataBuildBal(usrAccount.decimal,&amntState.stateAmnt,amntstr);
		AmiUpdateState(amntstr);	

		done= doit= TRUE;
 		break;
 }

 return (done);
}

/****************************************************
* RecInit()
*
*	Set up some globals
*****************************************************/
void RecInit(void)
{
 balanceType bal;
 
 bal = DataReconcile(FALSE);
 DataBuildBal(usrAccount.decimal,&bal,recstr);

 /* initialize our amount */
 GF_SetGadgetAttrs (recGUI, RCP_RecSpecs[GID_RCPCURR]->gs_Gadget,
		GTTX_Text, recstr,
		TAG_DONE);

}
