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

/* prototypes */
BOOL SearchHandleGadget(struct IntuiMessage *);
BOOL SearchHandleKey(struct IntuiMessage *);
void SearchInit(void);
BOOL SearchGoodbye(struct IntuiMessage *, searchState *);

BOOL searchretval;
ExtErrorData SearchExtData;
GUIFront *searchGUI;
searchState tempsearch;
struct Window *searchWin;

/* define gadgetspec */
GadgetSpec SEPgadgetspecs[] = 
{
	{CHECKBOX_KIND,0,0, {0,0,0,0,"C_heck Number",NULL,GID_SEPCHECK,
		PLACETEXT_LEFT},NULL,GS_DefaultTags},

	{CHECKBOX_KIND,0,0, {0,0,0,0,"_Name Field",NULL,GID_SEPNAME,
		PLACETEXT_LEFT},NULL,GS_DefaultTags},

	{CHECKBOX_KIND,0,0, {0,0,0,0,"_Memo Field",NULL,GID_SEPMEMO,
		PLACETEXT_LEFT},NULL,GS_DefaultTags},

	{CHECKBOX_KIND,0,0, {0,0,0,0,"Transaction Dat_e",NULL,GID_SEPDATE,
		PLACETEXT_LEFT},NULL,GS_DefaultTags},

	{CHECKBOX_KIND,0,0, {0,0,0,0,"_Amount",NULL,GID_SEPAMNT,
		PLACETEXT_LEFT},NULL,GS_DefaultTags},

	{CHECKBOX_KIND,0,0, {0,0,0,0,"Cate_gory",NULL,GID_SEPCATEGORY,
		PLACETEXT_LEFT},NULL,GS_DefaultTags},

	{INTEGER_KIND, 20,0, {0,0,0,0,NULL,NULL,GID_SEPSCHECK,
		PLACETEXT_RIGHT},strCheckTags,GS_DefaultTags},

	{STRING_KIND, 20,0, {0,0,0,0,NULL,NULL,GID_SEPSNAME,
		PLACETEXT_RIGHT},strNameTags,GS_DefaultTags},


	{STRING_KIND, 20,0, {0,0,0,0,NULL,NULL,GID_SEPSMEMO,
		PLACETEXT_RIGHT},strMemoTags,GS_DefaultTags},


	{STRING_KIND, 20,0, {0,0,0,0,NULL,NULL,GID_SEPSDATE,
		PLACETEXT_RIGHT},strDateTags,GS_DefaultTags},


	{STRING_KIND, 20,0, {0,0,0,0,NULL,NULL,GID_SEPSAMNT,
		PLACETEXT_RIGHT},strAmntTags,GS_DefaultTags},

	{STRING_KIND, 20,0, {0,0,0,0,NULL,NULL,GID_SEPSCATEGORY,
		PLACETEXT_RIGHT},strNameTags,GS_DefaultTags},

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

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

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


/* define the layout of this panel */
ULONG SEP_SearchPanel[] =
{
   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_LabelAlign | GUILF_EqualWidth,
		GUIL_FrameType, GUILFT_Ridge,
		GUIL_FrameHeadline, "Search Criteria",

		GUIL_HorizGroup,1,		
		GUIL_GadgetSpecID, GID_SEPCHECK,
		GUIL_GadgetSpecID, GID_SEPSCHECK,
		TAG_DONE,

		GUIL_HorizGroup,1,	
		GUIL_GadgetSpecID, GID_SEPDATE,
		GUIL_GadgetSpecID, GID_SEPSDATE,
		TAG_DONE,

		GUIL_HorizGroup,1,	
		GUIL_GadgetSpecID, GID_SEPAMNT,
		GUIL_GadgetSpecID, GID_SEPSAMNT,
		TAG_DONE,

		GUIL_HorizGroup,1,	
		GUIL_GadgetSpecID, GID_SEPNAME,
		GUIL_GadgetSpecID, GID_SEPSNAME,
		TAG_DONE,

		GUIL_HorizGroup,1,	
		GUIL_GadgetSpecID, GID_SEPMEMO,
		GUIL_GadgetSpecID, GID_SEPSMEMO,
		TAG_DONE,

		GUIL_HorizGroup,1,	
		GUIL_GadgetSpecID, GID_SEPCATEGORY,
		GUIL_GadgetSpecID, GID_SEPSCATEGORY,
		TAG_DONE,

	TAG_DONE,
    
    TAG_DONE,
    
    GUIL_HorizGroup,1,
        GUIL_Flags, GUILF_EqualSize | GUILF_EqualWidth,
        
           GUIL_GadgetSpecID, GID_SEPOK,
           GUIL_GadgetSpecID, GID_SEPCANCEL,
           
    TAG_DONE,   
           
TAG_DONE,
};


/****************************************************
* SearchGUI ()
*
*	Creates the GUI for the search panel.
*****************************************************/
BOOL SearchGUI(UWORD *row)
{
 BOOL done = FALSE;
 BOOL noreply = TRUE;
 ULONG signal;
    
   AmiLock();
 
		
		GF_SetGUIAttr(searchGUI, GUI_OpenGUI, TRUE, TAG_DONE);
		/* grab window */
 		GF_GetGUIAttr(searchGUI,GUI_Window,&searchWin,TAG_DONE);
		SearchInit();


                /* 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=SearchHandleGadget(imsg);
					break;

				case IDCMP_RAWKEY:
					noreply = FALSE;
					done = SearchHandleKey(imsg);
					break;
                        }
                                     
                              
                        if (noreply) 
				GF_ReplyIMsg(imsg);
                    }
                }

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

 return (searchretval);
}

/***************************************************
* SearchHandleKey()
*
*	Handles gadget events for this panel
****************************************************/
BOOL  SearchHandleKey(struct IntuiMessage *imsg)
{
 BOOL done = FALSE;
 UWORD code = imsg->Code;
 WORD entry = -1;


 switch (code) {
	case 0x42:
		if (tempsearch.check) 
			entry = GID_SEPSCHECK;
		else if (tempsearch.date)
			entry = GID_SEPSDATE;
		else if (tempsearch.amnt)
			entry = GID_SEPSAMNT;
		else if (tempsearch.name)
			entry = GID_SEPSNAME;
		else if (tempsearch.memo)
			entry = GID_SEPSMEMO;
		else if (tempsearch.category)
			entry = GID_SEPSCATEGORY;

	 	if (entry != -1) {
   			GF_ReplyIMsg(imsg);
			/*DataSitNSpin();*/
			if (!simpleRefresh)
   				ActivateGadget(SEP_SearchSpecs[entry]->gs_Gadget,searchWin,NULL);		
			return (FALSE);
 		}

		break;

	default:
		AmiHelpKey(imsg,SEARCH_PANEL);
		break;
 } 

 GF_ReplyIMsg(imsg);
 return (done);
}

/***************************************************
* SearchHandleGadget()
*
*	Handles gadget events for this panel
****************************************************/
BOOL  SearchHandleGadget(struct IntuiMessage *imsg)
{
 BOOL done = FALSE;
 struct Gadget *gad =  (struct Gadget *)(imsg->IAddress);
 UWORD code = imsg->Code;
 char amntstr[AMNTSIZE+1];
 char datestr[DATESIZE+1];
 
 switch (gad->GadgetID) {

	case GID_SEPCHECK:
		tempsearch.check = code;
		GF_SetGadgetAttrs (searchGUI, SEP_SearchSpecs[GID_SEPSCHECK]->gs_Gadget,
		GA_Disabled, !tempsearch.check,
			TAG_DONE);
		break;

	case GID_SEPDATE:
		tempsearch.date = code;
		GF_SetGadgetAttrs (searchGUI, SEP_SearchSpecs[GID_SEPSDATE]->gs_Gadget,
		GA_Disabled, !tempsearch.date,
			TAG_DONE);
		break;

	case GID_SEPAMNT:
		tempsearch.amnt = code;
		GF_SetGadgetAttrs (searchGUI, SEP_SearchSpecs[GID_SEPSAMNT]->gs_Gadget,
		GA_Disabled, !tempsearch.amnt,
			TAG_DONE);
		break;

	case GID_SEPNAME:
		tempsearch.name = code;
		GF_SetGadgetAttrs (searchGUI, SEP_SearchSpecs[GID_SEPSNAME]->gs_Gadget,
		GA_Disabled, !tempsearch.name,
			TAG_DONE);
		break;

	case GID_SEPMEMO:
		tempsearch.memo = code;
		GF_SetGadgetAttrs (searchGUI, SEP_SearchSpecs[GID_SEPSMEMO]->gs_Gadget,
		GA_Disabled, !tempsearch.memo,
			TAG_DONE);
		break;

	case GID_SEPCATEGORY:
		tempsearch.category = code;
		GF_SetGadgetAttrs (searchGUI, SEP_SearchSpecs[GID_SEPSCATEGORY]->gs_Gadget,
		GA_Disabled, !tempsearch.category,
			TAG_DONE);
		break;

	case GID_SEPSCHECK:
		tempsearch.checknum = (UWORD)((struct StringInfo*)gad->SpecialInfo)->LongInt;
		break;

	case GID_SEPSNAME:
		strcpy(tempsearch.namestr,((struct StringInfo*)gad->SpecialInfo)->Buffer);
		break;

	case GID_SEPSMEMO:
		strcpy(tempsearch.memostr,((struct StringInfo*)gad->SpecialInfo)->Buffer);
		break;

	case GID_SEPSCATEGORY:
		strcpy(tempsearch.catstr,((struct StringInfo*)gad->SpecialInfo)->Buffer);
		break;

	case GID_SEPSAMNT:
		if (!DataVerifyAmnt(((struct StringInfo*)gad->SpecialInfo)->Buffer,amntstr) ) {
			DisplayBeep(searchWin->WScreen);
			DataAnnounceAmount(searchGUI);
			GF_ReplyIMsg(imsg);
			DataSitNSpin(SEP_SearchSpecs[GID_SEPSAMNT]->gs_Gadget,searchWin);
			return (done);
		}
 		else {
			DataStoreAmnt(&tempsearch.amount,amntstr );

			GF_SetGadgetAttrs(searchGUI,SEP_SearchSpecs[GID_SEPSAMNT]->gs_Gadget,
				GTST_String,amntstr,
				TAG_DONE);
		}
		break;

	case GID_SEPSDATE:
		if (!DataVerifyDate(((struct StringInfo*)gad->SpecialInfo)->Buffer,datestr) ) {
			DisplayBeep(searchWin->WScreen);
			DataAnnounceDate(searchGUI);
			GF_ReplyIMsg(imsg);
			DataSitNSpin(SEP_SearchSpecs[GID_SEPSDATE]->gs_Gadget,searchWin);
			return (done);
		}
 		else {
			DataStoreDate(&tempsearch.searchdate,datestr );
			GF_SetGadgetAttrs(searchGUI,SEP_SearchSpecs[GID_SEPSDATE]->gs_Gadget,
				GTST_String,datestr,
				TAG_DONE);
		}
		break;

	case GID_SEPCANCEL:
		done = TRUE;
		break;
                                                         
	case GID_SEPOK:
		if (SearchGoodbye(imsg,&tempsearch)) {
			amiChangedItems = TRUE;
			memcpy(&searchControl,&tempsearch,sizeof(searchState));
			searchControl.lastrow = -1;
			searchretval = TRUE;
			done = TRUE;
		}
		else return (FALSE);
 		break;
 }

 GF_ReplyIMsg(imsg);
 return (done);
}

/****************************************************
* SearchInit()
*
*	Set up some globals
*****************************************************/
void SearchInit(void)
{
char datestr[DATESIZE+1];
char amntstr[AMNTSIZE+1];

 memcpy(&tempsearch,&searchControl,sizeof(searchState));
 
 /* grab window */
 GF_GetGUIAttr(searchGUI,GUI_Window,&searchWin,TAG_DONE);

 /* set gadgets */
 GF_SetGadgetAttrs (searchGUI, SEP_SearchSpecs[GID_SEPCHECK]->gs_Gadget,
		GTCB_Checked, tempsearch.check,
		TAG_DONE);
 GF_SetGadgetAttrs (searchGUI, SEP_SearchSpecs[GID_SEPAMNT]->gs_Gadget,
		GTCB_Checked, tempsearch.amnt,
		TAG_DONE);
 GF_SetGadgetAttrs (searchGUI, SEP_SearchSpecs[GID_SEPDATE]->gs_Gadget,
		GTCB_Checked, tempsearch.date,
		TAG_DONE);
 GF_SetGadgetAttrs (searchGUI, SEP_SearchSpecs[GID_SEPNAME]->gs_Gadget,
		GTCB_Checked, tempsearch.name,
		TAG_DONE); 
 GF_SetGadgetAttrs (searchGUI, SEP_SearchSpecs[GID_SEPMEMO]->gs_Gadget,
		GTCB_Checked, tempsearch.memo,
		TAG_DONE);
 GF_SetGadgetAttrs (searchGUI, SEP_SearchSpecs[GID_SEPCATEGORY]->gs_Gadget,
		GTCB_Checked, tempsearch.category,
		TAG_DONE);

 DataBuildAmnt(TRUE,&tempsearch.amount,amntstr);
 DataBuildDate(&tempsearch.searchdate,datestr);

 GF_SetGadgetAttrs (searchGUI, SEP_SearchSpecs[GID_SEPSCHECK]->gs_Gadget,
		GTIN_Number, tempsearch.checknum,
		GA_Disabled, !tempsearch.check,
		TAG_DONE);
 GF_SetGadgetAttrs (searchGUI, SEP_SearchSpecs[GID_SEPSAMNT]->gs_Gadget,
		GTST_String, amntstr,
		GA_Disabled, !tempsearch.amnt,
		TAG_DONE);
 GF_SetGadgetAttrs (searchGUI, SEP_SearchSpecs[GID_SEPSDATE]->gs_Gadget,
		GTST_String, datestr,
		GA_Disabled, !tempsearch.date,
		TAG_DONE);
 GF_SetGadgetAttrs (searchGUI, SEP_SearchSpecs[GID_SEPSNAME]->gs_Gadget,
		GTST_String, tempsearch.namestr,
		GA_Disabled, !tempsearch.name,
		TAG_DONE); 
 GF_SetGadgetAttrs (searchGUI, SEP_SearchSpecs[GID_SEPSMEMO]->gs_Gadget,
		GTST_String, tempsearch.memostr,
		GA_Disabled, !tempsearch.memo,
		TAG_DONE);
 GF_SetGadgetAttrs (searchGUI, SEP_SearchSpecs[GID_SEPSCATEGORY]->gs_Gadget,
		GTST_String, tempsearch.catstr,
		GA_Disabled, !tempsearch.category,
		TAG_DONE);

}

/**************************************************
* SearchGoodbye()
*
*	grabs strings
***************************************************/
BOOL SearchGoodbye(struct IntuiMessage *imsg, searchState *temp)
{
 char *grab;
 char amntstr[AMNTSIZE+1];
 char datestr[DATESIZE+1];

if (temp->date) {
 grab = ((struct StringInfo *)(SEP_SearchSpecs[GID_SEPSDATE]->gs_Gadget)->SpecialInfo)->Buffer;
 if (!DataVerifyDate(grab,datestr) ) {
	DisplayBeep(searchWin->WScreen);
	DataAnnounceDate(searchGUI);
	GF_ReplyIMsg(imsg);
	DataSitNSpin(SEP_SearchSpecs[GID_SEPSDATE]->gs_Gadget,searchWin);
	return (FALSE);
 }
 else {
	DataStoreDate(&temp->searchdate,datestr );
 }
}

if (temp->amnt) {
 grab = ((struct StringInfo *)(SEP_SearchSpecs[GID_SEPSAMNT]->gs_Gadget)->SpecialInfo)->Buffer;
 if (!DataVerifyAmnt(grab,amntstr) ) {
	DisplayBeep(searchWin->WScreen);
	DataAnnounceAmount(searchGUI);
	GF_ReplyIMsg(imsg);
	DataSitNSpin(SEP_SearchSpecs[GID_SEPSAMNT]->gs_Gadget,searchWin);
	return (FALSE);
 }
 else {
	DataStoreAmnt(&temp->amount,amntstr );
 }
}

 /* just grab the rest */
 temp->checknum = (UWORD)((struct StringInfo*)(SEP_SearchSpecs[GID_SEPSCHECK]->gs_Gadget)->SpecialInfo)->LongInt;

 grab = ((struct StringInfo *)(SEP_SearchSpecs[GID_SEPSNAME]->gs_Gadget)->SpecialInfo)->Buffer; 
 strcpy(temp->namestr,grab);
 ParsePatternNoCase(temp->namestr,temp->namestrtoken,STRINGSIZE*2 + 2);

 grab = ((struct StringInfo *)(SEP_SearchSpecs[GID_SEPSMEMO]->gs_Gadget)->SpecialInfo)->Buffer;
 strcpy(temp->memostr,grab);
 ParsePatternNoCase(temp->memostr,temp->memostrtoken,STRINGSIZE*2 + 2);

 ParsePatternNoCase(temp->catstr,temp->catstrtoken,STRINGSIZE*2 + 2);

 return (TRUE);
}
