/* filterPanel.c 
 *
 *  defines the GUIFront characteristics of the filter panel 
 */
  
#include <stdio.h>  
#include <intuition/gadgetclass.h>
#include <clib/dos_protos.h>
#include "amiCheck.h"
#include "regGadget.h"
#include "edittempPanel.h"
#include "dataBase.h"
#include "filterPanel.h"
#include <string.h>

/* prototypes */
BOOL FilterHandleGadget(struct IntuiMessage *);
void FilterInit(void);
void FilterDisableCR(BOOL);
void FilterDisableAR(BOOL);
void FilterDisableDR(BOOL);
void FilterDisableCAT(BOOL);
void FilterDisablePAYEE(BOOL);
void FilterDisableMEMO(BOOL);
BOOL FilterGoodbye(struct IntuiMessage *, filterSetting *);

struct Window *filtWin;
filterSetting currFilter;
BOOL fretval;
ExtErrorData FilterExtData;
GUIFront *filterGUI;
 
/* quick configure of some gadgets */
STRPTR filterlabels[] =
{
	"N/A",
	"Yes",
	"No",
	NULL,
};

struct TagItem filterCycleTags[] =
{
	{GTCY_Labels, filterlabels},
	{TAG_DONE},
};

STRPTR rangelabels[] =
{
	"N/A",
	"In",
	"Out",
	NULL,
};

struct TagItem rangeCycleTags[] =
{
	{GTCY_Labels, rangelabels},
	{TAG_DONE},
};

/* define gadgetspec */
GadgetSpec FPgadgetspecs[] = 
{
	{CHECKBOX_KIND,0,0, {0,0,0,0,"Chec_ks",NULL,GID_FPCHECKS,
		PLACETEXT_RIGHT},NULL,GS_DefaultTags},

	{CHECKBOX_KIND,0,0, {0,0,0,0,"_Withdrawals",NULL,GID_FPWITHDRAWALS,
		PLACETEXT_RIGHT},NULL,GS_DefaultTags},

	{CHECKBOX_KIND,0,0, {0,0,0,0,"_Deposits",NULL,GID_FPDEPOSITS,
		PLACETEXT_RIGHT},NULL,GS_DefaultTags},

	{CYCLE_KIND,0,1, {0,0,0,0,"_Checks",NULL,GID_FPCHECKRANGE,
		PLACETEXT_LEFT},rangeCycleTags,GS_DefaultTags | GS_NoHeightExtend},

	{INTEGER_KIND,11,1, {0,0,0,0,"From (_1)",NULL,GID_FPCHECKFROM,
		PLACETEXT_LEFT},strCheckTags,GS_DefaultTags},

	{INTEGER_KIND,11,1, {0,0,0,0,"To (_2)",NULL,GID_FPCHECKTO,
		PLACETEXT_LEFT},strCheckTags,GS_DefaultTags},

	{CYCLE_KIND,0,1, {0,0,0,0,"_Amounts",NULL,GID_FPAMNTRANGE,
		PLACETEXT_LEFT},rangeCycleTags,GS_DefaultTags | GS_NoHeightExtend},

	{STRING_KIND,11,1, {0,0,0,0,"From (_3)",NULL,GID_FPAMNTFROM,
		PLACETEXT_LEFT},strAmntTags,GS_DefaultTags},

	{STRING_KIND,11,1, {0,0,0,0,"To (_4)",NULL,GID_FPAMNTTO,
		PLACETEXT_LEFT},strAmntTags,GS_DefaultTags},

	{CYCLE_KIND,0,1, {0,0,0,0,"_Printed",NULL,GID_FPPRINTED,
		PLACETEXT_LEFT},filterCycleTags,GS_DefaultTags | GS_NoHeightExtend },

	{CYCLE_KIND,0,1, {0,0,0,0,"_Voided",NULL,GID_FPVOIDED,
		PLACETEXT_LEFT},filterCycleTags,GS_DefaultTags | GS_NoHeightExtend},

	{CYCLE_KIND,0,1, {0,0,0,0,"C_leared",NULL,GID_FPCLEARED,
		PLACETEXT_LEFT},filterCycleTags,GS_DefaultTags | GS_NoHeightExtend},

	{CYCLE_KIND,0,1, {0,0,0,0,"Ta_x Deduct",NULL,GID_FPTAX,
		PLACETEXT_LEFT},filterCycleTags,GS_DefaultTags | GS_NoHeightExtend},

	{CYCLE_KIND,0,1, {0,0,0,0,"Categor_y",NULL,GID_FPUSECAT,
		PLACETEXT_LEFT},rangeCycleTags,GS_DefaultTags | GS_NoHeightExtend},

	{LISTVIEW_KIND,21,5, {0,0,0,0,NULL,NULL,GID_FPCATEGORY,
		PLACETEXT_ABOVE},ListView,GS_DefaultTags},

	{CYCLE_KIND,0,1, {0,0,0,0,"_Reconciled",NULL,GID_FPRECONCILED,
		PLACETEXT_LEFT},filterCycleTags,GS_DefaultTags | GS_NoHeightExtend},

	{CYCLE_KIND,0,1, {0,0,0,0,"Date_s",NULL,GID_FPDATERANGE,
		PLACETEXT_LEFT},rangeCycleTags,GS_DefaultTags | GS_NoHeightExtend},

	{STRING_KIND,11,1, {0,0,0,0,"From (_5)",NULL,GID_FPDATEFROM,
		PLACETEXT_LEFT},strDateTags,GS_DefaultTags},

	{STRING_KIND,11,1, {0,0,0,0,"To (_6)",NULL,GID_FPDATETO,
		PLACETEXT_LEFT},strDateTags,GS_DefaultTags},

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

        {BUTTON_KIND,0,0,{0,0,0,0,"_Cancel", NULL, GID_FPCANCEL,        
                PLACETEXT_IN}, NULL, GS_DefaultTags},
 
	{CYCLE_KIND,0,1, {0,0,0,0,"_Name",NULL,GID_FPPAYEE,
		PLACETEXT_LEFT},rangeCycleTags,GS_DefaultTags | GS_NoHeightExtend},

	{STRING_KIND,11,1, {0,0,0,0,"(_7)",NULL,GID_FPPAYEESTR,
		PLACETEXT_LEFT},strNameTags,GS_DefaultTags},

	{CYCLE_KIND,0,1, {0,0,0,0,"_Memo",NULL,GID_FPMEMO,
		PLACETEXT_LEFT},rangeCycleTags,GS_DefaultTags | GS_NoHeightExtend},

	{STRING_KIND,11,1, {0,0,0,0,"(_8)",NULL,GID_FPMEMOSTR,
		PLACETEXT_LEFT},strNameTags,GS_DefaultTags},
};

/* set up array of pointers to our specs */
GadgetSpec *FP_FilterSpecs[] =
{
        &FPgadgetspecs[0],
        &FPgadgetspecs[1],
        &FPgadgetspecs[2],
        &FPgadgetspecs[3],
        &FPgadgetspecs[4],
        &FPgadgetspecs[5],
        &FPgadgetspecs[6],
        &FPgadgetspecs[7],
        &FPgadgetspecs[8],
        &FPgadgetspecs[9],
        &FPgadgetspecs[10],
	&FPgadgetspecs[11],
        &FPgadgetspecs[12],
        &FPgadgetspecs[13],
        &FPgadgetspecs[14],
        &FPgadgetspecs[15],
        &FPgadgetspecs[16],
        &FPgadgetspecs[17],
	&FPgadgetspecs[18],
	&FPgadgetspecs[19],
	&FPgadgetspecs[20],
	&FPgadgetspecs[21],
	&FPgadgetspecs[22],
	&FPgadgetspecs[23],
	&FPgadgetspecs[24],

	NULL,
};


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

   GUIL_HorizGroup, 1,
        GUIL_Flags, GUILF_PropShare | GUILF_EqualHeight,
	GUIL_FrameType, GUILFT_Recess,

	GUIL_VertGroup, 1,
		GUIL_Flags, GUILF_EqualWidth | GUILF_PropShare,

		GUIL_VertGroup, 1,
			GUIL_FrameType, GUILFT_Ridge,
			GUIL_FrameHeadline, "Types",

			GUIL_GadgetSpecID, GID_FPCHECKS,
			GUIL_GadgetSpecID, GID_FPWITHDRAWALS,
			GUIL_GadgetSpecID, GID_FPDEPOSITS,
		TAG_DONE,

		GUIL_VertGroup, 1,
				GUIL_Flags, GUILF_LabelAlign,
				GUIL_FrameType, GUILFT_Ridge,
				GUIL_FrameHeadline, "Characteristics",
				GUIL_GadgetSpecID, GID_FPCLEARED,
				GUIL_GadgetSpecID, GID_FPVOIDED,
				GUIL_GadgetSpecID, GID_FPTAX,
				GUIL_GadgetSpecID, GID_FPRECONCILED,
				GUIL_GadgetSpecID, GID_FPPRINTED,
		TAG_DONE,
		
	TAG_DONE,

GUIL_HorizGroup,3,
	GUIL_FrameType, GUILFT_Ridge,
	GUIL_FrameHeadline, "Range Settings",

	GUIL_VertGroup, 2,
		GUIL_Flags, GUILF_LabelAlign,

		GUIL_VertGroup,0,
			GUIL_Flags, GUILF_LabelAlign,
			GUIL_GadgetSpecID, GID_FPCHECKRANGE,
			GUIL_GadgetSpecID, GID_FPCHECKFROM,
			GUIL_GadgetSpecID, GID_FPCHECKTO,
		TAG_DONE,
		GUIL_VertGroup,0,
			GUIL_Flags, GUILF_LabelAlign,
			GUIL_GadgetSpecID, GID_FPAMNTRANGE,
			GUIL_GadgetSpecID, GID_FPAMNTFROM,
			GUIL_GadgetSpecID, GID_FPAMNTTO,
		TAG_DONE,
		GUIL_VertGroup,0,
			GUIL_Flags, GUILF_LabelAlign,
			GUIL_GadgetSpecID, GID_FPDATERANGE,
			GUIL_GadgetSpecID, GID_FPDATEFROM,
			GUIL_GadgetSpecID, GID_FPDATETO,
		TAG_DONE,
	TAG_DONE,


GUIL_VertGroup,1,
	GUIL_Flags, GUILF_LabelAlign | GUILF_PropShare,

	GUIL_VertGroup,0,
		GUIL_Flags, GUILF_LabelAlign,
		GUIL_GadgetSpecID, GID_FPPAYEE,
		GUIL_GadgetSpecID, GID_FPPAYEESTR,
	TAG_DONE,

	GUIL_VertGroup,0,
		GUIL_Flags, GUILF_LabelAlign,
		GUIL_GadgetSpecID, GID_FPMEMO,
		GUIL_GadgetSpecID, GID_FPMEMOSTR,
	TAG_DONE,

	GUIL_VertGroup, 0,
		GUIL_Flags, GUILF_PropShare,
		GUIL_GadgetSpecID, GID_FPUSECAT,
		GUIL_GadgetSpecID, GID_FPCATEGORY,
	TAG_DONE,
TAG_DONE,

TAG_DONE,
		
   TAG_DONE,
    
   GUIL_HorizGroup,1,
	GUIL_Flags, GUILF_EqualSize | GUILF_EqualWidth,
        
           GUIL_GadgetSpecID, GID_FPOK,
           GUIL_GadgetSpecID, GID_FPCANCEL,
           
   TAG_DONE,   
           
TAG_DONE,
};


/****************************************************
* FilterGUI ()
*
*	Creates the GUI for the filter panel.
*****************************************************/
BOOL FilterGUI(void)
{
 BOOL replyval, done = FALSE;
 UWORD ordinal;
 categoryNode *cat;
 ULONG signal;
    
  AmiLock();

  GF_SetGUIAttr(filterGUI,GUI_OpenGUI,TRUE, TAG_DONE);
  /* grab window */
  GF_GetGUIAttr(filterGUI,GUI_Window,&filtWin,TAG_DONE);
  FilterInit();

#if 1
                /* 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))
                    {
			replyval = FALSE;
                        switch (imsg->Class) {
				case IDCMP_REFRESHWINDOW:
					RegRefresh(TRUE);
					break;

                                case IDCMP_CLOSEWINDOW:
					done = TRUE;
					fretval = FALSE;
                                        break;

				case IDCMP_RAWKEY:
					/* check for tab key */

					if (GF_ProcessListView(filterGUI,FP_FilterSpecs[GID_FPCATEGORY],
					    imsg,&ordinal)) {
						cat = (categoryNode *)DataOrd2Node(&categories,ordinal);
						strncpy(currFilter.category,cat->node.ln_Name,CATNAMESIZE);
					}
					else AmiHelpKey(imsg,FILTER_PANEL);
					break;

				case IDCMP_GADGETUP:
					replyval = FALSE;
					done=FilterHandleGadget(imsg);
					break;
                        }
                                     
                              
                        if (replyval) GF_ReplyIMsg(imsg);
                    }
                }
#endif
     GF_SetGadgetAttrs (filterGUI, FP_FilterSpecs[GID_FPCATEGORY]->gs_Gadget,
		GTLV_Labels, ~0,
		TAG_DONE);


     GF_SetGUIAttr(filterGUI, GUI_OpenGUI, FALSE, TAG_DONE);
     AmiUnlock();

 return (fretval);
}

/***************************************************
* FilterHandleGadget()
*
*	Handles gadget events for this panel
****************************************************/
BOOL  FilterHandleGadget(struct IntuiMessage *imsg)
{
 struct Gadget *gad = (struct Gadget *)(imsg->IAddress);
 UWORD code = imsg->Code;
 BOOL done = FALSE;
 categoryNode *cat;
 char newamntstr[AMNTSIZE+1];
 char newdatestr[DATESIZE+1];

 switch (gad->GadgetID) {
	case GID_FPCHECKS:
		currFilter.checks = code;
		break;

	case GID_FPWITHDRAWALS:
		currFilter.withdrawals = code;
		break;

	case GID_FPDEPOSITS:
		currFilter.deposits = code;
		break;

	case GID_FPPRINTED:
		switch (code) {
			case FILTERNA:
				currFilter.andflag &= ~PRINTED;
				currFilter.notflag &= ~PRINTED;
				break;

			case FILTERYES:
				currFilter.andflag |= PRINTED;
				currFilter.notflag &= ~PRINTED;
				break;

			case FILTERNO:
				currFilter.andflag &= ~PRINTED;
				currFilter.notflag |= PRINTED;
				break;
		}
		currFilter.printcode = code;
		break;

	case GID_FPCLEARED:
		switch (code) {
			case FILTERNA:
				currFilter.andflag &= ~CLEARED;
				currFilter.notflag &= ~CLEARED;
				break;

			case FILTERYES:
				currFilter.andflag |= CLEARED;
				currFilter.notflag &= ~CLEARED;
				break;

			case FILTERNO:
				currFilter.andflag &= ~CLEARED;
				currFilter.notflag |= CLEARED;
				break;
		}
		currFilter.clearcode = code;
		break;

	case GID_FPVOIDED:
		switch (code) {
			case FILTERNA:
				currFilter.andflag &= ~VOIDED;
				currFilter.notflag &= ~VOIDED;
				break;

			case FILTERYES:
				currFilter.andflag |= VOIDED;
				currFilter.notflag &= ~VOIDED;
				break;

			case FILTERNO:
				currFilter.andflag &= ~VOIDED;
				currFilter.notflag |= VOIDED;
				break;
		}
		currFilter.voidcode = code;
		break;

	case GID_FPTAX:
		switch (code) {
			case FILTERNA:
				currFilter.andflag &= ~TAXDEDUCT;
				currFilter.notflag &= ~TAXDEDUCT;
				break;

			case FILTERYES:
				currFilter.andflag |= TAXDEDUCT;
				currFilter.notflag &= ~TAXDEDUCT;
				break;

			case FILTERNO:
				currFilter.andflag &= ~TAXDEDUCT;
				currFilter.notflag |= TAXDEDUCT;
				break;
		}
		currFilter.taxcode = code;
		break;

	case GID_FPRECONCILED:
		switch (code) {
			case FILTERNA:
				currFilter.andflag &= ~RECONCILED;
				currFilter.notflag &= ~RECONCILED;
				break;

			case FILTERYES:
				currFilter.andflag |= RECONCILED;
				currFilter.notflag &= ~RECONCILED;
				break;

			case FILTERNO:
				currFilter.andflag &= ~RECONCILED;
				currFilter.notflag |= RECONCILED;
				break;
		}
		currFilter.reconcilecode = code;
		break;

	case GID_FPAMNTRANGE:
		currFilter.amntrange = code;
		FilterDisableAR(!code);
		break;

	case GID_FPCHECKRANGE:
		currFilter.checkrange = code;
		FilterDisableCR(!code);
		break;

	case GID_FPCHECKFROM:
		currFilter.checkfrom  =(UWORD)((struct StringInfo*)gad->SpecialInfo)->LongInt;
		break;

	case GID_FPCHECKTO:
		currFilter.checkto  =(UWORD)((struct StringInfo*)gad->SpecialInfo)->LongInt;
		break;

	case GID_FPAMNTFROM:
		/* special case return early.... activated gadget */
		if (!DataVerifyAmnt(((struct StringInfo*)gad->SpecialInfo)->Buffer,newamntstr) ) {
			DisplayBeep(filtWin->WScreen);
			DataAnnounceAmount(filterGUI);
			GF_ReplyIMsg(imsg);
			DataSitNSpin(FP_FilterSpecs[GID_FPAMNTFROM]->gs_Gadget,filtWin);
		  	return (done);
		}
 		else {
			DataStoreAmnt(&currFilter.amountFrom,newamntstr );
			GF_SetGadgetAttrs(filterGUI,FP_FilterSpecs[GID_FPAMNTFROM]->gs_Gadget,
				GTST_String,newamntstr,
				TAG_DONE);
		}
		break;

	case GID_FPAMNTTO:
		/* special case return early.... activated gadget */
		if (!DataVerifyAmnt(((struct StringInfo*)gad->SpecialInfo)->Buffer,newamntstr) ) {
			DisplayBeep(filtWin->WScreen);
			DataAnnounceAmount(filterGUI);
			GF_ReplyIMsg(imsg);
			DataSitNSpin(FP_FilterSpecs[GID_FPAMNTTO]->gs_Gadget,filtWin);
		   	return (done);
		}
 		else {
			DataStoreAmnt(&currFilter.amountTo,newamntstr );
			GF_SetGadgetAttrs(filterGUI,FP_FilterSpecs[GID_FPAMNTTO]->gs_Gadget,
				GTST_String,newamntstr,
				TAG_DONE);
		}
	
		break;

	case GID_FPMEMO:
		currFilter.usememo = code;
		FilterDisableMEMO(!code);
		break;

	case GID_FPPAYEE:
		currFilter.usepayee = code;
		FilterDisablePAYEE(!code);
		break;

	case GID_FPPAYEESTR:
		strcpy(currFilter.payee,((struct StringInfo*)gad->SpecialInfo)->Buffer);
		break;

	case GID_FPMEMOSTR:
		strcpy(currFilter.payee,((struct StringInfo*)gad->SpecialInfo)->Buffer);
		break;

	case GID_FPUSECAT:
		currFilter.usecategory = code;
		FilterDisableCAT(!code);
		break;
	
	case GID_FPCATEGORY:
		cat = (categoryNode *)DataOrd2Node(&categories,code);
		strncpy(currFilter.category,cat->catname,CATNAMESIZE);
		break;

	case GID_FPDATERANGE:
		currFilter.daterange = code;
		FilterDisableDR(!code);
		break;

	case GID_FPDATEFROM:
		/* special case return early.... activated gadget */
		if (!DataVerifyDate(((struct StringInfo*)gad->SpecialInfo)->Buffer,newdatestr) ) {
			DisplayBeep(filtWin->WScreen);
			DataAnnounceDate(filterGUI);
			GF_ReplyIMsg(imsg);
			DataSitNSpin(FP_FilterSpecs[GID_FPDATEFROM]->gs_Gadget,filtWin);
		  	return (done);
		}
 		else {
			DataStoreDate(&currFilter.dateFrom,newdatestr );
			GF_SetGadgetAttrs(filterGUI,FP_FilterSpecs[GID_FPDATEFROM]->gs_Gadget,
				GTST_String,newdatestr,
				TAG_DONE);
		}
		break;

	case GID_FPDATETO:
		/* special case return early.... activated gadget */
		if (!DataVerifyDate(((struct StringInfo*)gad->SpecialInfo)->Buffer,newdatestr) ) {
			DisplayBeep(filtWin->WScreen);
			DataAnnounceDate(filterGUI);
			GF_ReplyIMsg(imsg);
			DataSitNSpin(FP_FilterSpecs[GID_FPDATETO]->gs_Gadget,filtWin);
		  	return (done);
		}
 		else {
			DataStoreDate(&currFilter.dateTo,newdatestr );
			GF_SetGadgetAttrs(filterGUI,FP_FilterSpecs[GID_FPDATETO]->gs_Gadget,
				GTST_String,newdatestr,
				TAG_DONE);
		}
		break;

	case GID_FPCANCEL:
		fretval = FALSE;
		done = TRUE;
		break;

	case GID_FPOK:
		if (FilterGoodbye(imsg, &currFilter)) {
			amiChangedItems = TRUE;
			done = TRUE;
			fretval = TRUE;
		}
		else return (FALSE);
		break;
 }

 GF_ReplyIMsg(imsg);
 return (done);
}

/****************************************************
* FilterInit()
*
*	Initialize the settings
*****************************************************/
void FilterInit(void)
{
 char amntfrom[AMNTSIZE], amntto[AMNTSIZE];
 char strdate[DATESIZE+1];

 /* grab window */
 GF_GetGUIAttr(filterGUI,GUI_Window,&filtWin,TAG_DONE);

 memcpy(&currFilter, &filterControl, sizeof(filterSetting));
 
 /* update gfx */
 if (currFilter.checkrange == FILTERNA)
	FilterDisableCR(TRUE);

 if (currFilter.amntrange == FILTERNA)
	FilterDisableAR(TRUE); 

 if (currFilter.daterange == FILTERNA)
	 FilterDisableDR(TRUE);

 if (currFilter.usecategory == FILTERNA)
	 FilterDisableCAT(TRUE);

 if (currFilter.usepayee == FILTERNA)
	FilterDisablePAYEE(TRUE);

 if (currFilter.usememo == FILTERNA)
	FilterDisableMEMO(TRUE);

 GF_SetGadgetAttrs (filterGUI, FP_FilterSpecs[GID_FPCATEGORY]->gs_Gadget,
		GTLV_Labels, &categories,
		TAG_DONE);

 GF_SetGadgetAttrs (filterGUI, FP_FilterSpecs[GID_FPCHECKS]->gs_Gadget,
		GTCB_Checked,currFilter.checks,
		TAG_DONE);

 GF_SetGadgetAttrs (filterGUI, FP_FilterSpecs[GID_FPWITHDRAWALS]->gs_Gadget,
		GTCB_Checked,currFilter.withdrawals,
		TAG_DONE);

 GF_SetGadgetAttrs (filterGUI, FP_FilterSpecs[GID_FPDEPOSITS]->gs_Gadget,
		GTCB_Checked,currFilter.deposits,
		TAG_DONE);

 GF_SetGadgetAttrs (filterGUI, FP_FilterSpecs[GID_FPCHECKRANGE]->gs_Gadget,
		GTCY_Active,currFilter.checkrange,
		TAG_DONE);

 GF_SetGadgetAttrs (filterGUI, FP_FilterSpecs[GID_FPAMNTRANGE]->gs_Gadget,
		GTCY_Active,currFilter.amntrange,
		TAG_DONE);

 GF_SetGadgetAttrs (filterGUI, FP_FilterSpecs[GID_FPPRINTED]->gs_Gadget,
		GTCY_Active,currFilter.printcode,
		TAG_DONE);

 GF_SetGadgetAttrs (filterGUI, FP_FilterSpecs[GID_FPVOIDED]->gs_Gadget,
		GTCY_Active, currFilter.voidcode,
		TAG_DONE);

 GF_SetGadgetAttrs (filterGUI, FP_FilterSpecs[GID_FPCLEARED]->gs_Gadget,
		GTCY_Active, currFilter.clearcode,
		TAG_DONE);

 GF_SetGadgetAttrs (filterGUI, FP_FilterSpecs[GID_FPTAX]->gs_Gadget,
		GTCY_Active, currFilter.taxcode,
		TAG_DONE);

 GF_SetGadgetAttrs (filterGUI, FP_FilterSpecs[GID_FPRECONCILED]->gs_Gadget,
		GTCY_Active, currFilter.reconcilecode,
		TAG_DONE);

 GF_SetGadgetAttrs (filterGUI, FP_FilterSpecs[GID_FPPAYEE]->gs_Gadget,
		GTCY_Active, currFilter.usepayee,
		TAG_DONE);

 GF_SetGadgetAttrs (filterGUI, FP_FilterSpecs[GID_FPMEMO]->gs_Gadget,
		GTCY_Active, currFilter.usememo,
		TAG_DONE);

 GF_SetGadgetAttrs (filterGUI, FP_FilterSpecs[GID_FPCHECKFROM]->gs_Gadget,
			GTIN_Number, currFilter.checkfrom,
			TAG_DONE); 

 GF_SetGadgetAttrs (filterGUI, FP_FilterSpecs[GID_FPCHECKTO]->gs_Gadget,
			GTIN_Number, currFilter.checkto,
			TAG_DONE); 

 DataBuildAmnt(TRUE,&currFilter.amountFrom,amntfrom);
 DataBuildAmnt(TRUE,&currFilter.amountTo,amntto);

 GF_SetGadgetAttrs (filterGUI, FP_FilterSpecs[GID_FPAMNTFROM]->gs_Gadget,
	GTST_String,amntfrom,
	TAG_DONE);

 GF_SetGadgetAttrs (filterGUI, FP_FilterSpecs[GID_FPAMNTTO]->gs_Gadget,
	GTST_String,amntto,
	TAG_DONE);

 GF_SetGadgetAttrs (filterGUI, FP_FilterSpecs[GID_FPPAYEESTR]->gs_Gadget,
	GTST_String,currFilter.payee,
	TAG_DONE);

 GF_SetGadgetAttrs (filterGUI, FP_FilterSpecs[GID_FPMEMOSTR]->gs_Gadget,
	GTST_String,currFilter.memo,
	TAG_DONE);

 GF_SetGadgetAttrs (filterGUI, FP_FilterSpecs[GID_FPUSECAT]->gs_Gadget,
		GTCY_Active,currFilter.usecategory,
		TAG_DONE);

 
 GF_SetGadgetAttrs (filterGUI, FP_FilterSpecs[GID_FPCATEGORY]->gs_Gadget,
		GTLV_Selected, DataNode2Ord(&categories,currFilter.category),
		TAG_DONE);

 /* now do the date thing */
 GF_SetGadgetAttrs (filterGUI, FP_FilterSpecs[GID_FPDATERANGE]->gs_Gadget,
	GTCY_Active,currFilter.daterange,
	TAG_DONE);

 DataBuildDate(&currFilter.dateFrom, strdate);
 GF_SetGadgetAttrs (filterGUI, FP_FilterSpecs[GID_FPDATEFROM]->gs_Gadget,
		GTST_String,strdate,
		TAG_DONE);

 DataBuildDate(&currFilter.dateTo, strdate);
 GF_SetGadgetAttrs (filterGUI, FP_FilterSpecs[GID_FPDATETO]->gs_Gadget,
		GTST_String,strdate,
		TAG_DONE);
}

/***************************************************************
* FilterDisableCR()
*
*	Disable/enable check ranging
****************************************************************/
void FilterDisableCR(BOOL dis)
{
  GF_SetGadgetAttrs (filterGUI, FP_FilterSpecs[GID_FPCHECKFROM]->gs_Gadget,
			GA_Disabled, dis,
			TAG_DONE); 

 GF_SetGadgetAttrs (filterGUI, FP_FilterSpecs[GID_FPCHECKTO]->gs_Gadget,
			GA_Disabled, dis,
			TAG_DONE); 
}

/***************************************************************
* FilterDisableAR()
*
*	Disable/enable amount ranging
****************************************************************/
void FilterDisableAR(BOOL dis)
{
  GF_SetGadgetAttrs (filterGUI, FP_FilterSpecs[GID_FPAMNTFROM]->gs_Gadget,
			GA_Disabled, dis,
			TAG_DONE); 

 GF_SetGadgetAttrs (filterGUI, FP_FilterSpecs[GID_FPAMNTTO]->gs_Gadget,
			GA_Disabled, dis,
			TAG_DONE); 
}

/***************************************************************
* FilterDisablePAYEE()
*
*	Disable/enable payee ranging
****************************************************************/
void FilterDisablePAYEE(BOOL dis)
{
  GF_SetGadgetAttrs (filterGUI, FP_FilterSpecs[GID_FPPAYEESTR]->gs_Gadget,
			GA_Disabled, dis,
			TAG_DONE); 
}

/***************************************************************
* FilterDisableMEMO()
*
*	Disable/enable MEMO ranging
****************************************************************/
void FilterDisableMEMO(BOOL dis)
{
  GF_SetGadgetAttrs (filterGUI, FP_FilterSpecs[GID_FPMEMOSTR]->gs_Gadget,
			GA_Disabled, dis,
			TAG_DONE); 
}


/***************************************************************
* FilterDisableDR()
*
*	Disable/enable date ranging
****************************************************************/
void FilterDisableDR(BOOL dis)
{
  GF_SetGadgetAttrs (filterGUI, FP_FilterSpecs[GID_FPDATEFROM]->gs_Gadget,
			GA_Disabled, dis,
			TAG_DONE); 

 GF_SetGadgetAttrs (filterGUI, FP_FilterSpecs[GID_FPDATETO]->gs_Gadget,
			GA_Disabled, dis,
			TAG_DONE); 
}

/***************************************************************
* FilterDisableCAT()
*
*	Disable/enable date ranging
****************************************************************/
void FilterDisableCAT(BOOL dis)
{
  GF_SetGadgetAttrs (filterGUI, FP_FilterSpecs[GID_FPCATEGORY]->gs_Gadget,
			GA_Disabled, dis,
			TAG_DONE); 
}

/***************************************************
* FilterGoodbye()
*
*	Grab strings
****************************************************/
BOOL FilterGoodbye(struct IntuiMessage *imsg, filterSetting *temp)
{
 char newdatestr[DATESIZE+1];
 char newamntstr[AMNTSIZE+1];
 char *grab;

 /* first check "special" entries */
if (temp->daterange) {
 grab = ((struct StringInfo *)(FP_FilterSpecs[GID_FPDATETO]->gs_Gadget)->SpecialInfo)->Buffer;
 if (!DataVerifyDate(grab,newdatestr) ) {
	DisplayBeep(filtWin->WScreen);
	DataAnnounceDate(filterGUI);
	GF_ReplyIMsg(imsg);
	DataSitNSpin(FP_FilterSpecs[GID_FPDATETO]->gs_Gadget,filtWin);
  	return (FALSE);
 }
 else {
	DataStoreDate(&temp->dateTo,newdatestr);
 }

 grab = ((struct StringInfo *)(FP_FilterSpecs[GID_FPDATEFROM]->gs_Gadget)->SpecialInfo)->Buffer;
 if (!DataVerifyDate(grab,newdatestr) ) {
	DisplayBeep(filtWin->WScreen);
	DataAnnounceDate(filterGUI);
	GF_ReplyIMsg(imsg);
	DataSitNSpin(FP_FilterSpecs[GID_FPDATEFROM]->gs_Gadget,filtWin);
   	return (FALSE);
 }
 else {
	DataStoreDate(&temp->dateFrom,newdatestr);
 }
}

if (temp->amntrange) {
 grab = ((struct StringInfo *)(FP_FilterSpecs[GID_FPAMNTFROM]->gs_Gadget)->SpecialInfo)->Buffer;
 if (!DataVerifyAmnt(grab,newamntstr) ) {
	DisplayBeep(filtWin->WScreen);
	DataAnnounceAmount(filterGUI);
	GF_ReplyIMsg(imsg);
	DataSitNSpin(FP_FilterSpecs[GID_FPAMNTFROM]->gs_Gadget,filtWin);
   	return (FALSE);
 }
 else {
	DataStoreAmnt(&temp->amountFrom,newamntstr );
 }

 grab = ((struct StringInfo *)(FP_FilterSpecs[GID_FPAMNTTO]->gs_Gadget)->SpecialInfo)->Buffer;
 if (!DataVerifyAmnt(grab,newamntstr) ) {
	DisplayBeep(filtWin->WScreen);
	DataAnnounceAmount(filterGUI);
	GF_ReplyIMsg(imsg);
	DataSitNSpin(FP_FilterSpecs[GID_FPAMNTTO]->gs_Gadget,filtWin);
 	return (FALSE);
 }
 else {
	DataStoreAmnt(&temp->amountTo,newamntstr );
 }
}

 /* now just stuff in strings */
 temp->checkfrom =(UWORD)((struct StringInfo*)(FP_FilterSpecs[GID_FPCHECKFROM]->gs_Gadget)->SpecialInfo)->LongInt;
 temp->checkto =(UWORD)((struct StringInfo*)(FP_FilterSpecs[GID_FPCHECKTO]->gs_Gadget)->SpecialInfo)->LongInt;

 /* grab memo/payee fields */
 grab = ((struct StringInfo *)(FP_FilterSpecs[GID_FPPAYEESTR]->gs_Gadget)->SpecialInfo)->Buffer;
 strcpy(temp->payee,grab);
 grab = ((struct StringInfo *)(FP_FilterSpecs[GID_FPMEMOSTR]->gs_Gadget)->SpecialInfo)->Buffer;
 strcpy(temp->memo,grab);

 /* create memo/payee patterns */
 ParsePatternNoCase(temp->payee,temp->payeetoken,STRINGSIZE*2+2);
 ParsePatternNoCase(temp->memo,temp->memotoken,STRINGSIZE*2+2);


 return (TRUE);
}
