home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 6
/
AACD06.ISO
/
AACD
/
Utilities
/
amiCheck
/
Source
/
reportPanel.c
< prev
next >
Wrap
C/C++ Source or Header
|
1998-06-11
|
15KB
|
633 lines
/* reportPanel.c
*
* defines the GUIFront characteristics of the reporting panel
*/
#include <stdio.h>
#include <intuition/gadgetclass.h>
#include <clib/asl_protos.h>
#include <libraries/asl.h>
#include "amiCheck.h"
#include "regGadget.h"
#include "dataBase.h"
#include "reportPanel.h"
#include <string.h>
#define MINROW 5
#define MAXROW 300
#define MINCOL 40
#define MAXCOL 300
/* prototypes */
BOOL ReportHandleGadget(struct IntuiMessage *);
void ReportInit(void);
BOOL ReportGoodbye(struct IntuiMessage *, reportSetting *);
BOOL ReportOutput(void);
void ReportCompact(entryNode *, char *);
void ReportNormal(entryNode *, char *, char *);
void ReportVerbose(entryNode *, char *, char *, char *);
BOOL genrep;
struct Window *repWin;
ExtErrorData ReportExtData;
GUIFront *repGUI;
reportSetting localrep;
STRPTR replabels[] =
{
"Compact",
"Normal",
"Verbose",
NULL,
};
struct TagItem repcytags[] = {
{GTCY_Labels,replabels},
{TAG_DONE},
};
/* define gadgetspec */
GadgetSpec REPgadgetspecs[] =
{
{CHECKBOX_KIND,0,0,{0,0,0,0,"To _File", NULL, GID_REPTOFILE,
PLACETEXT_RIGHT}, NULL, GS_DefaultTags},
{CHECKBOX_KIND,0,0,{0,0,0,0,"_Pad Blank Line", NULL, GID_REPBLANK,
PLACETEXT_RIGHT}, NULL, GS_DefaultTags},
{CYCLE_KIND,0,0,{0,0,0,0,"Report _Style", NULL, GID_REPSTYLE,
PLACETEXT_LEFT}, repcytags, GS_DefaultTags},
{CHECKBOX_KIND,0,0,{0,0,0,0,"_Include Summary & Info", NULL, GID_REPSUMMARY,
PLACETEXT_RIGHT}, NULL, GS_DefaultTags},
{INTEGER_KIND,0,0,{0,0,0,0,"Cols Per _Line", NULL, GID_REPCOLS,
PLACETEXT_LEFT}, NULL, GS_DefaultTags},
{INTEGER_KIND,0,0,{0,0,0,0,"_Rows Per Page", NULL, GID_REPROWS,
PLACETEXT_LEFT},NumBorder, GS_DefaultTags},
{BUTTON_KIND,0,0,{0,0,0,0,"_OK", NULL, GID_REPOK,
PLACETEXT_IN}, NULL, GS_DefaultTags},
{BUTTON_KIND,0,0,{0,0,0,0,"_Cancel", NULL, GID_REPCANCEL,
PLACETEXT_IN}, NULL, GS_DefaultTags},
{CHECKBOX_KIND,0,0,{0,0,0,0,"_Transaction State", NULL, GID_REPSTATE,
PLACETEXT_RIGHT}, NULL, GS_DefaultTags},
};
/* set up array of pointers to our specs */
GadgetSpec *REP_ReportSpecs[] =
{
&REPgadgetspecs[0],
&REPgadgetspecs[1],
&REPgadgetspecs[2],
&REPgadgetspecs[3],
&REPgadgetspecs[4],
&REPgadgetspecs[5],
&REPgadgetspecs[6],
&REPgadgetspecs[7],
&REPgadgetspecs[8],
NULL,
};
/* define the layout of this panel */
ULONG REP_ReportPanel[] =
{
GUIL_Flags, GUILF_PropShare | GUILF_EqualWidth,
GUIL_HorizGroup, 2,
GUIL_Flags, GUILF_PropShare | GUILF_EqualHeight,
GUIL_FrameType, GUILFT_Recess,
GUIL_VertGroup, 1,
GUIL_Flags, GUILF_LabelAlign | GUILF_EqualWidth,
GUIL_GadgetSpecID, GID_REPSTYLE,
GUIL_GadgetSpecID, GID_REPCOLS,
GUIL_GadgetSpecID, GID_REPROWS,
TAG_DONE,
GUIL_VertGroup, 1,
GUIL_Flags, GUILF_LabelAlign,
GUIL_GadgetSpecID, GID_REPTOFILE,
GUIL_GadgetSpecID, GID_REPSUMMARY,
GUIL_GadgetSpecID, GID_REPSTATE,
GUIL_GadgetSpecID, GID_REPBLANK,
TAG_DONE,
TAG_DONE,
GUIL_HorizGroup,1,
GUIL_Flags, GUILF_EqualSize | GUILF_EqualWidth,
GUIL_GadgetSpecID, GID_REPOK,
GUIL_GadgetSpecID, GID_REPCANCEL,
TAG_DONE,
TAG_DONE,
};
/****************************************************
* ReportGUI ()
*
* Creates the GUI for the stat panel.
*****************************************************/
void ReportGUI(void)
{
BOOL done = FALSE;
BOOL reply;
ULONG signal;
AmiLock();
GF_SetGUIAttr(repGUI, GUI_OpenGUI, TRUE, TAG_DONE);
GF_GetGUIAttr(repGUI, GUI_Window, &repWin, TAG_DONE);
ReportInit();
/* 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))
{
reply = TRUE;
switch (imsg->Class) {
case IDCMP_REFRESHWINDOW:
RegRefresh(TRUE);
break;
case IDCMP_CLOSEWINDOW:
done = TRUE;
break;
case IDCMP_GADGETUP:
reply = FALSE;
done=ReportHandleGadget(imsg);
break;
case IDCMP_RAWKEY:
AmiHelpKey(imsg,REPORT_PANEL);
break;
}
if (reply)
GF_ReplyIMsg(imsg);
}
}
GF_SetGUIAttr(repGUI, GUI_OpenGUI, FALSE, TAG_DONE);
if (genrep) {
GF_LockGUI(repGUI);
if (!ReportOutput())
AmiAnnounce("Printer Failure.\nOperation cancelled.");
GF_UnlockGUI(repGUI);
}
AmiUnlock();
}
/***************************************************
* ReportHandleGadget()
*
* Handles gadget events for this panel
****************************************************/
BOOL ReportHandleGadget(struct IntuiMessage *imsg)
{
BOOL done = FALSE;
struct Gadget *gad = (struct Gadget *)(imsg->IAddress);
UWORD code = imsg->Code;
switch (gad->GadgetID) {
case GID_REPTOFILE:
localrep.tofile = code;
break;
case GID_REPSTATE:
localrep.state = code;
break;
case GID_REPSUMMARY:
localrep.summary = code;
break;
case GID_REPBLANK:
localrep.padline = code;
break;
case GID_REPSTYLE:
localrep.style = code;
break;
case GID_REPROWS:
localrep.rows = (UWORD)((struct StringInfo*)(REP_ReportSpecs[GID_REPROWS]->gs_Gadget)->
SpecialInfo)->LongInt;
if (localrep.rows < MINROW || localrep.rows > MAXROW) {
DisplayBeep(repWin->WScreen);
DataAnnounce(repGUI, "Illegal rows per page");
GF_ReplyIMsg(imsg);
DataSitNSpin(REP_ReportSpecs[GID_REPROWS]->gs_Gadget,repWin);
return (done);
}
break;
case GID_REPCOLS:
localrep.cols = (UWORD)((struct StringInfo*)(REP_ReportSpecs[GID_REPCOLS]->gs_Gadget)->
SpecialInfo)->LongInt;
if (localrep.cols < MINCOL || localrep.cols > MAXCOL) {
DisplayBeep(repWin->WScreen);
DataAnnounce(repGUI, "Illegal columns per line");
GF_ReplyIMsg(imsg);
DataSitNSpin(REP_ReportSpecs[GID_REPCOLS]->gs_Gadget,repWin);
return (done);
}
break;
case GID_REPCANCEL:
done = TRUE;
break;
case GID_REPOK:
if (ReportGoodbye(imsg, &localrep)) {
done = TRUE;
memcpy(&reportControl,&localrep,sizeof(reportSetting));
amiChangedItems = TRUE;
genrep = TRUE;
}
else return (FALSE);
break;
}
GF_ReplyIMsg(imsg);
return (done);
}
/****************************************************
* ReportInit()
*
* Set up some globals
*****************************************************/
void ReportInit(void)
{
genrep = FALSE;
memcpy(&localrep,&reportControl,sizeof(reportSetting));
GF_SetGadgetAttrs (repGUI, REP_ReportSpecs[GID_REPTOFILE]->gs_Gadget,
GTCB_Checked,localrep.tofile,
TAG_DONE);
GF_SetGadgetAttrs (repGUI, REP_ReportSpecs[GID_REPSUMMARY]->gs_Gadget,
GTCB_Checked,localrep.summary,
TAG_DONE);
GF_SetGadgetAttrs (repGUI, REP_ReportSpecs[GID_REPBLANK]->gs_Gadget,
GTCB_Checked,localrep.padline,
TAG_DONE);
GF_SetGadgetAttrs (repGUI, REP_ReportSpecs[GID_REPSTYLE]->gs_Gadget,
GTCY_Active,localrep.style,
TAG_DONE);
GF_SetGadgetAttrs (repGUI, REP_ReportSpecs[GID_REPROWS]->gs_Gadget,
GTIN_Number, localrep.rows,
TAG_DONE);
GF_SetGadgetAttrs (repGUI, REP_ReportSpecs[GID_REPCOLS]->gs_Gadget,
GTIN_Number, localrep.cols,
TAG_DONE);
GF_SetGadgetAttrs (repGUI, REP_ReportSpecs[GID_REPSTATE]->gs_Gadget,
GTCB_Checked,localrep.state,
TAG_DONE);
}
/****************************************************
* ReportGoodbye()
*
* Capture strings
*****************************************************/
BOOL ReportGoodbye(struct IntuiMessage *imsg, reportSetting *temp)
{
UWORD val;
val = (UWORD)((struct StringInfo*)(REP_ReportSpecs[GID_REPROWS]->gs_Gadget)->SpecialInfo)->LongInt;
if (val < MINROW || val > MAXROW) {
DisplayBeep(repWin->WScreen);
DataAnnounce(repGUI, "Illegal rows per page");
GF_ReplyIMsg(imsg);
DataSitNSpin(REP_ReportSpecs[GID_REPROWS]->gs_Gadget,repWin);
return (FALSE);
}
else temp->rows = val;
val = (UWORD)((struct StringInfo*)(REP_ReportSpecs[GID_REPCOLS]->gs_Gadget)->SpecialInfo)->LongInt;
if (val < MINCOL || val > MAXCOL) {
DisplayBeep(repWin->WScreen);
DataAnnounce(repGUI, "Illegal columns per line");
GF_ReplyIMsg(imsg);
DataSitNSpin(REP_ReportSpecs[GID_REPCOLS]->gs_Gadget,repWin);
return (FALSE);
}
else temp->cols = val;
return (TRUE);
}
/***********************************************************
* ReportOutput()
*
* Actual printing of data
************************************************************/
BOOL ReportOutput(void)
{
char fname[100];
char tempstr[200],tempAmnt[AMNTSIZE+1];
char outstr[3][MAXCOL+1];
int r,x;
FILE *temp;
amountType zero=0;
balanceType amnt;
filterNode *filt = (filterNode *)filtered.mlh_Head;
if (filtered.mlh_TailPred == &filtered)
return FALSE;
if (reportControl.tofile) {
/* asl save req */
if (!(AmiGetFile(repGUI,reportASL,fname,100)))
return FALSE;
}
else sprintf(fname,"prt:");
if ((temp = fopen(fname,"w")) == NULL) {
AmiAnnounce("Trouble generating report.");
return FALSE;
}
/* fill temp file up */
r = 0;
DataInitBal(DEPOSITTYPE,&zero,&amnt);
/* include account info */
if (reportControl.summary) {
sprintf(tempstr,"\nAccount Holder: %s\n",usrAccount.holder);
if (fprintf(temp,tempstr) != strlen(tempstr)) {
fclose(temp);
return (FALSE);
}
sprintf(tempstr,"Institution : %s\n",usrAccount.bank);
if (fprintf(temp,tempstr) != strlen(tempstr)) {
fclose(temp);
return (FALSE);
}
sprintf(tempstr,"Account# : %s\n",usrAccount.accnt);
if (fprintf(temp,tempstr) != strlen(tempstr)) {
fclose(temp);
return (FALSE);
}
if (fprintf(temp,"\n") != strlen("\n")) {
fclose(temp);
return (FALSE);
}
r += 5;
}
do {
/* by style, output columns */
switch (reportControl.style) {
case 0:
ReportCompact(filt->entry,outstr[0]);
break;
case 1:
ReportNormal(filt->entry,outstr[0], outstr[1]);
break;
case 2:
ReportVerbose(filt->entry,outstr[0], outstr[1], outstr[2]);
break;
}
if (!(filt->entry->flags & VOIDED)) {
DataAddBal(filt->entry->type,&filt->entry->amount,&amnt);
}
if (r+reportControl.style+2 >= reportControl.rows && !reportControl.tofile) {
if (fprintf(temp,"\f\n") != strlen("\f\n")) {
fclose(temp);
return (FALSE);
}
r = 1;
}
for (x=0;x<=reportControl.style;x++) {
if (fprintf(temp,"%s",outstr[x]) != strlen(outstr[x])) {
fclose(temp);
return (FALSE);
}
}
r += reportControl.style + 1;
if (reportControl.padline && r < reportControl.rows-1){
if (fprintf(temp,"\n") != strlen("\n")) {
fclose(temp);
return (FALSE);
}
r++;
}
filt = (filterNode *)DataGetNext((struct List *)&filtered,(struct Node *)filt);
} while (filt != NULL);
/* fill in summary */
if (reportControl.summary) {
if (r + 4 > reportControl.rows-1)
if (fprintf(temp,"\f\n") != strlen("\f\n")) {
fclose(temp);
return (FALSE);
}
if (fprintf(temp,"\n") != strlen("\n")) {
fclose(temp);
return (FALSE);
}
DataBuildBal(usrAccount.decimal,&amnt,tempAmnt);
sprintf(tempstr,"Report Balance : %s\n",tempAmnt);
if (fprintf(temp,tempstr) != strlen(tempstr)) {
fclose(temp);
return (FALSE);
}
DataBuildBal(usrAccount.decimal,&amntState.currAmnt,tempAmnt);
sprintf(tempstr,"Current Balance : %s\n",tempAmnt);
if (fprintf(temp,tempstr) != strlen(tempstr)) {
fclose(temp);
return (FALSE);
}
DataBuildBal(usrAccount.decimal,&amntState.stateAmnt,tempAmnt);
sprintf(tempstr,"Statement Balance: %s\n",tempAmnt);
if (fprintf(temp,tempstr) != strlen(tempstr)) {
fclose(temp);
return (FALSE);
}
}
fclose(temp);
/* output icon */
if (reportControl.tofile)
DataAttachIcon(iconPath,"AC_Report",fname);
return (TRUE);
}
/**************************************************************
* ReportCompact()
*
* Fills in string for compact output
**************************************************************/
void ReportCompact(entryNode *en, char *line)
{
char type[11];
char tempAmnt[AMNTSIZE+1];
char amnt[13];
char date[DATESIZE+1];
char name[MAXCOL];
char flags[7];
int x,y, namesize;
switch (en->type) {
case CHECKTYPE:
sprintf(type,"%05d ",en->check);
break;
case DEPOSITTYPE:
sprintf(type,"Deposit ");
break;
case WITHDRAWALTYPE:
sprintf(type,"Withdrawal");
break;
}
if (reportControl.state) {
sprintf(flags,"[ ]");
if (en->flags & VOIDED)
flags[1]='V';
if (en->flags & TAXDEDUCT)
flags[2]='T';
if (en->flags & CLEARED)
flags[3]='C';
if (en->flags & RECONCILED)
flags[4]='R';
}
else flags[0] = NULL;
DataBuildAmnt(TRUE,&en->amount,tempAmnt);
sprintf(amnt,"%c% 9s%c\n",(en->type != DEPOSITTYPE)?'(':' ',tempAmnt,
(en->type != DEPOSITTYPE)?')':' '
);
DataBuildDate(&en->date,date);
namesize = reportControl.cols - (strlen(type)+strlen(date)+strlen(flags)+strlen(amnt));
strncpy(name,en->name,namesize);
y = strlen(name);
if (y < namesize) {
for (x=0;x< (namesize-y)-1; x++)
name[x+y] = '.';
name[x+y]=NULL;
}
else name[namesize-1] = NULL;
bzero(line,reportControl.cols);
sprintf(line,"%s %s %s%s%s",type, date, name, flags, amnt);
}
/****************************************************************************************
* ReportNormal()
*
* two line entries
*****************************************************************************************/
void ReportNormal(entryNode *en, char *line1, char *line2)
{
ReportCompact(en,line1);
bzero(line2,reportControl.cols);
sprintf(line2," Memo: ");
strncat(line2,en->memo,reportControl.cols-strlen(line2)-11 );
strcat(line2,"\n");
}
/****************************************************************************************
* ReportVerbose()
*
* three line entries
*****************************************************************************************/
void ReportVerbose(entryNode *en, char *line1, char *line2, char *line3)
{
char filler[30];
char cat[CATNAMESIZE];
char tempstr[MAXCOL];
int x,y;
ReportNormal(en,line1,line2);
sprintf(filler," Category: ");
bzero(cat,CATNAMESIZE);
strcpy(cat,en->category);
y = strlen(cat);
if (y < CATNAMESIZE-1) {
for (x=y;x<CATNAMESIZE-1;x++)
cat[x]=' ';
cat[x] = NULL;
}
sprintf(tempstr,"%s%s %s\n",filler,cat,(en->flags&RECONCILED)?"RECONCILED":"");
bzero(line3,reportControl.cols);
strncpy(line3,tempstr,reportControl.cols-10);
line3[strlen(line3)-1] = '\n';
}