home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 6 / AACD06.ISO / AACD / Utilities / amiCheck / Source / statsPanel.c < prev    next >
C/C++ Source or Header  |  1998-06-11  |  15KB  |  581 lines

  1. /* statsPanel.c 
  2.  *
  3.  *  defines the GUIFront characteristics of the stats panel 
  4.  */
  5.   
  6. #include <stdio.h>  
  7. #include <intuition/gadgetclass.h>
  8. #include "amiCheck.h"
  9. #include "regGadget.h"
  10. #include "dataBase.h"
  11. #include "statsPanel.h"
  12. #include <string.h>
  13.  
  14.  
  15. /* prototypes */
  16. BOOL StatHandleGadget(struct IntuiMessage *);
  17. void StatInit(void);
  18. void StatReport(categoryNode *);
  19. void StatGroupReport(groupNode *);
  20. void StatFill(void);
  21. void StatReportZero(void);
  22.  
  23. ExtErrorData StatExtData;
  24. GUIFront *statGUI;
  25. WORD    statlistActive;
  26.  
  27. struct {
  28.     UWORD     filttrans;
  29.     balanceType      fbal;
  30.     balanceType    fdep;
  31.     balanceType    fwith;
  32.     
  33.     UWORD     regtrans;
  34.     balanceType     rbal;
  35.     balanceType    rdep;
  36.     balanceType    rwith;
  37.  
  38. } statReport;
  39.  
  40. static int listtype = 0;
  41. char fbalstr[AMNTSIZE+1];
  42. char fdepstr[AMNTSIZE+1];
  43. char fwithstr[AMNTSIZE+1];
  44. char rbalstr[AMNTSIZE+1];
  45. char rdepstr[AMNTSIZE+1];
  46. char rwithstr[AMNTSIZE+1];
  47.  
  48. /* quick definition of some tags */
  49. struct TagItem statsCatList[] =
  50. {
  51.         {GTLV_ShowSelected, NULL},
  52.                 /*
  53.     {GTLV_Labels, ~0},
  54.     {GTLV_Selected,~0},
  55.         */
  56.         {TAG_DONE},
  57. };
  58.  
  59. STRPTR listtypelabels[] =
  60. {
  61.     "Categories",
  62.     "Groups",
  63.     NULL,
  64. };
  65.  
  66. struct TagItem listtypeTags[] =
  67. {
  68.     {GTCY_Labels, listtypelabels},
  69.     {TAG_DONE},
  70. };
  71.  
  72. /* define gadgetspec */
  73. GadgetSpec STPgadgetspecs[] = 
  74. {
  75.     {LISTVIEW_KIND,30,8, {0,0,0,0,NULL,NULL,GID_STPCATLIST,
  76.         PLACETEXT_ABOVE},statsCatList,GS_DefaultTags},
  77.  
  78.         {TEXT_KIND,AMNTSIZE-4,0,{0,0,0,0,"Balance", NULL, GID_STPFILTSUM,         
  79.                 PLACETEXT_LEFT}, TxtBorder, GS_DefaultTags},
  80.  
  81.         {TEXT_KIND,AMNTSIZE-4,0,{0,0,0,0,"Balance", NULL, GID_STPTOTSUM,         
  82.                 PLACETEXT_LEFT}, TxtBorder, GS_DefaultTags},
  83.  
  84.         {NUMBER_KIND,0,0,{0,0,0,0,"Transactions", NULL, GID_STPFILTNUM,         
  85.                 PLACETEXT_LEFT}, NumBorder, GS_DefaultTags},
  86.  
  87.         {NUMBER_KIND,0,0,{0,0,0,0,"Transactions", NULL, GID_STPTOTNUM,         
  88.                 PLACETEXT_LEFT}, NumBorder, GS_DefaultTags},
  89.  
  90.         {TEXT_KIND,0,0,{0,0,0,0,"Deposits", NULL, GID_STPTOTDEP,         
  91.                 PLACETEXT_LEFT}, TxtBorder, GS_DefaultTags},
  92.  
  93.         {TEXT_KIND,0,0,{0,0,0,0,"Withdrawals", NULL, GID_STPTOTWITH,         
  94.                 PLACETEXT_LEFT}, TxtBorder, GS_DefaultTags},
  95.  
  96.         {TEXT_KIND,0,0,{0,0,0,0,"Deposits", NULL, GID_STPFILTDEP,         
  97.                 PLACETEXT_LEFT}, TxtBorder, GS_DefaultTags},
  98.  
  99.         {TEXT_KIND,0,0,{0,0,0,0,"Withdrawals", NULL, GID_STPFILTWITH,         
  100.                 PLACETEXT_LEFT}, TxtBorder, GS_DefaultTags},
  101.  
  102.         {BUTTON_KIND,6,0,{0,0,0,0,"_OK", NULL, GID_STPOK,         
  103.                 PLACETEXT_IN}, NULL, GS_DefaultTags}, 
  104.  
  105.     {CYCLE_KIND,0,1, {0,0,0,0,"_List",NULL,GID_STPLIST,
  106.         PLACETEXT_LEFT},listtypeTags,GS_DefaultTags| GS_NoHeightExtend},
  107.  
  108. };
  109.  
  110. /* set up array of pointers to our specs */
  111. GadgetSpec *STP_StatSpecs[] =
  112. {
  113.         &STPgadgetspecs[0],
  114.         &STPgadgetspecs[1],
  115.         &STPgadgetspecs[2],
  116.         &STPgadgetspecs[3],
  117.         &STPgadgetspecs[4],
  118.         &STPgadgetspecs[5],
  119.         &STPgadgetspecs[6],
  120.         &STPgadgetspecs[7],
  121.         &STPgadgetspecs[8],
  122.         &STPgadgetspecs[9],
  123.     &STPgadgetspecs[10],
  124.         NULL,
  125. };
  126.  
  127.  
  128. /* define the layout of this panel */
  129. ULONG STP_StatPanel[] =
  130. {
  131.    GUIL_Flags, GUILF_PropShare | GUILF_EqualWidth,
  132.  
  133.    GUIL_HorizGroup, 1,
  134.         GUIL_Flags, GUILF_PropShare,
  135.     /*GUIL_FrameType, GUILFT_Recess,*/
  136.         
  137.     GUIL_VertGroup, 1,
  138.  
  139.         GUIL_HorizGroup,2,
  140.             GUIL_FrameType, GUILFT_Ridge,
  141.             GUIL_VertGroup,0,
  142.                 GUIL_GadgetSpecID, GID_STPLIST,
  143.                 GUIL_GadgetSpecID, GID_STPCATLIST,
  144.             TAG_DONE,
  145.  
  146.                GUIL_VertGroup,1,
  147.                 GUIL_Flags, GUILF_EqualWidth,
  148.                     GUIL_VertGroup,0,
  149.                 GUIL_FrameType, GUILFT_Ridge,
  150.                 GUIL_FrameHeadline, "Filter-based",
  151.                             GUIL_Flags, GUILF_PropShare | GUILF_EqualWidth | GUILF_LabelAlign,
  152.                                               
  153.                 GUIL_GadgetSpecID, GID_STPFILTNUM,
  154.                 GUIL_GadgetSpecID, GID_STPFILTSUM,
  155.                 GUIL_GadgetSpecID, GID_STPFILTDEP,
  156.                 GUIL_GadgetSpecID, GID_STPFILTWITH,
  157.                     TAG_DONE,
  158.  
  159.             GUIL_VertGroup,0,
  160.                 GUIL_FrameType, GUILFT_Ridge,
  161.                 GUIL_FrameHeadline, "Register-based",
  162.                             GUIL_Flags, GUILF_PropShare | GUILF_EqualWidth | GUILF_LabelAlign,
  163.                                               
  164.                 GUIL_GadgetSpecID, GID_STPTOTNUM,
  165.                 GUIL_GadgetSpecID, GID_STPTOTSUM,
  166.                 GUIL_GadgetSpecID, GID_STPTOTDEP,
  167.                 GUIL_GadgetSpecID, GID_STPTOTWITH,
  168.                     TAG_DONE,
  169.             TAG_DONE,
  170.  
  171.  
  172.  
  173.         TAG_DONE,
  174.  
  175.     TAG_DONE,
  176.         
  177.     TAG_DONE,
  178. #if 0    
  179.     GUIL_HorizGroup,1,
  180.         GUIL_Flags, GUILF_EqualSize | GUILF_EqualWidth,
  181.         
  182.            GUIL_GadgetSpecID, GID_STPOK,
  183.            
  184.     TAG_DONE,   
  185. #endif
  186.            
  187. TAG_DONE,
  188. };
  189.  
  190.  
  191. /****************************************************
  192. * StatGUI ()
  193. *
  194. *    Creates the GUI for the stat panel.
  195. *****************************************************/
  196. void  StatGUI(void)
  197. {
  198.  BOOL done = FALSE;
  199.  UWORD ordinal;
  200.  categoryNode *cat;
  201.  ULONG signal;
  202.      
  203.  AmiLock();
  204.  
  205.  
  206.         GF_SetGUIAttr(statGUI, GUI_OpenGUI, TRUE, TAG_DONE);
  207.          StatInit();
  208.  
  209.                 /* Process input events */
  210.                 while (!done)
  211.                 {
  212.                     struct IntuiMessage *imsg;
  213.  
  214.                     /* Wait for an event to occur */
  215.  
  216.                     signal = GF_Wait(guiapp,AmigaGuideSignal(agc));
  217.             if (signal & AmigaGuideSignal(agc)) {
  218.             AmiHelpMsg();
  219.             continue;
  220.             }
  221.     
  222.                     /* We only bother to listen for CLOSEWINDOW events.
  223.                      * Of course, in a real application, you would be
  224.                      * examining the Class field for IDCMP_GADGETUP
  225.                      * messages and act accordingly.
  226.                      */
  227.  
  228.                     while (imsg = GF_GetIMsg(guiapp))
  229.                     {
  230.                         switch (imsg->Class) {
  231.                                 case IDCMP_CLOSEWINDOW:
  232.                     done = TRUE;
  233.                                         break;
  234.  
  235.                 case IDCMP_RAWKEY:
  236.                     if (GF_ProcessListView(statGUI,STP_StatSpecs[GID_STPCATLIST],
  237.                         imsg,&ordinal)) {
  238.                         cat = (categoryNode *)DataOrd2Node(&categories,ordinal);
  239.                         StatReport(cat);
  240.                         StatFill();                            
  241.                     }
  242.                     else AmiHelpKey(imsg,STATS_PANEL);
  243.                     break;
  244.  
  245.                 case IDCMP_GADGETUP:
  246.                     done=StatHandleGadget(imsg);
  247.                     break;
  248.  
  249.                 case IDCMP_REFRESHWINDOW:
  250.                     RegRefresh(TRUE);
  251.                     break;
  252.                         }
  253.                                      
  254.                               
  255.                         GF_ReplyIMsg(imsg);
  256.                }
  257.  
  258.         }
  259.    GF_SetGadgetAttrs(statGUI,STPgadgetspecs[GID_STPCATLIST].gs_Gadget,
  260.             GTLV_Labels, ~0,
  261.             TAG_DONE);
  262.    GF_SetGUIAttr(statGUI, GUI_OpenGUI, FALSE, TAG_DONE);               
  263.    AmiUnlock();
  264. }
  265.  
  266. /***************************************************
  267. * StatHandleGadget()
  268. *
  269. *    Handles gadget events for this panel
  270. ****************************************************/
  271. BOOL StatHandleGadget(struct IntuiMessage *imsg)
  272. {
  273.  BOOL done = FALSE;
  274.  struct Gadget *gad = (struct Gadget *)(imsg->IAddress);
  275.  UWORD code = imsg->Code;
  276.  categoryNode *cat;
  277.  
  278.  switch (gad->GadgetID) {
  279.  
  280.     case GID_STPLIST:
  281.         listtype = code;
  282.         StatReportZero();
  283.         GF_SetGadgetAttrs(statGUI,STPgadgetspecs[GID_STPCATLIST].gs_Gadget,
  284.             GTLV_Labels, ~0,
  285.             GTLV_Selected, ~0,
  286.             TAG_DONE);
  287.         
  288.         GF_SetGadgetAttrs(statGUI,STPgadgetspecs[GID_STPCATLIST].gs_Gadget,
  289.             GTLV_Labels, (listtype==0)?&categories:&grouplist,
  290.             GTLV_Selected, ~0,
  291.             TAG_DONE);
  292.  
  293.         break;
  294.     
  295.     case GID_STPCATLIST:
  296.         if (listtype == 0) {
  297.             cat = (categoryNode *)DataOrd2Node(&categories,code);
  298.             StatReport(cat);
  299.             StatFill();
  300.         }
  301.         else {
  302.             StatGroupReport((groupNode *)DataOrd2Node(&grouplist,code));
  303.             StatFill();
  304.         }
  305.         break;
  306.  
  307.     case GID_STPOK:
  308.         done = TRUE;    
  309.         break;
  310.  }
  311.  
  312.  return (done);
  313. }
  314.  
  315. /****************************************************
  316. * StatInit()
  317. *
  318. *    Set up some globals
  319. *****************************************************/
  320. void StatInit(void)
  321. {
  322.  memset(&statReport,0,sizeof(statReport));
  323.  GF_SetGadgetAttrs(statGUI,STPgadgetspecs[GID_STPCATLIST].gs_Gadget,
  324.             GTLV_Labels, &categories,
  325.             GTLV_Selected, ~0,
  326.             /*GTLV_MakeVisible,0,*/
  327.             TAG_DONE);
  328.  
  329.  GF_SetGadgetAttrs(statGUI,STPgadgetspecs[GID_STPLIST].gs_Gadget,
  330.             GTCY_Active, 0,
  331.             TAG_DONE);
  332.  
  333.   StatReportZero();
  334. }
  335.  
  336. /******************************************************
  337. * StatReportZero()
  338. *
  339. *******************************************************/
  340. void StatReportZero(void)
  341. {
  342.  amountType zero = 0;
  343.  
  344.  /* reset to 0 */
  345.  DataInitBal(DEPOSITTYPE,&zero,&statReport.rdep);
  346.  DataInitBal(DEPOSITTYPE,&zero,&statReport.fdep);
  347.  DataInitBal(DEPOSITTYPE,&zero,&statReport.rwith);
  348.  DataInitBal(DEPOSITTYPE,&zero,&statReport.fwith);
  349.  
  350.  statReport.regtrans = statReport.filttrans = 0;
  351.  
  352.  GF_SetGadgetAttrs(statGUI,STPgadgetspecs[GID_STPFILTSUM].gs_Gadget,
  353.     GTTX_Text,"",
  354.     TAG_DONE);
  355.  
  356.  GF_SetGadgetAttrs(statGUI,STPgadgetspecs[GID_STPTOTSUM].gs_Gadget,
  357.     GTTX_Text,"",
  358.     TAG_DONE);
  359.  
  360.  GF_SetGadgetAttrs(statGUI,STPgadgetspecs[GID_STPFILTDEP].gs_Gadget,
  361.     GTTX_Text,"",
  362.     TAG_DONE);
  363.  
  364.  GF_SetGadgetAttrs(statGUI,STPgadgetspecs[GID_STPFILTWITH].gs_Gadget,
  365.     GTTX_Text,"",
  366.     TAG_DONE);
  367.  
  368.  GF_SetGadgetAttrs(statGUI,STPgadgetspecs[GID_STPTOTDEP].gs_Gadget,
  369.     GTTX_Text,"",
  370.     TAG_DONE);
  371.  
  372.  GF_SetGadgetAttrs(statGUI,STPgadgetspecs[GID_STPTOTWITH].gs_Gadget,
  373.     GTTX_Text,"",
  374.     TAG_DONE);
  375.  
  376.  GF_SetGadgetAttrs(statGUI,STPgadgetspecs[GID_STPFILTNUM].gs_Gadget,
  377.     GTNM_Number,statReport.filttrans,
  378.     TAG_DONE);
  379.  
  380.  GF_SetGadgetAttrs(statGUI,STPgadgetspecs[GID_STPTOTNUM].gs_Gadget,
  381.     GTNM_Number,statReport.regtrans,
  382.     TAG_DONE);
  383. }
  384.  
  385. /****************************************************
  386. * StatReport()
  387. *
  388. *    Calculate values and report them
  389. *****************************************************/
  390. void StatReport(categoryNode *cat)
  391. {
  392.  amountType zero = 0;
  393.  entryNode *work = (entryNode *)entries.mlh_Head, *next;
  394.  filterNode *fwork= (filterNode*)filtered.mlh_Head, *fnext;
  395.  
  396.  DataInitBal(DEPOSITTYPE,&zero,&statReport.rdep);
  397.  DataInitBal(DEPOSITTYPE,&zero,&statReport.fdep);
  398.  DataInitBal(DEPOSITTYPE,&zero,&statReport.rwith);
  399.  DataInitBal(DEPOSITTYPE,&zero,&statReport.fwith);
  400.  
  401.  statReport.regtrans = statReport.filttrans = 0;
  402.  
  403.  if (entries.mlh_TailPred != &entries)  {
  404.  
  405.     /* calculate totals */
  406.     while ( (next = (entryNode *)work->node.mln_Succ) ) {
  407.         if ( !(work->flags & VOIDED) && 
  408.             strcmpi(cat->catname,work->category) == 0) {
  409.  
  410.             statReport.regtrans++;
  411.             
  412.             if (work->type == DEPOSITTYPE) {
  413.                 DataAddBal(DEPOSITTYPE,&work->amount,&statReport.rdep);
  414.             }
  415.             else {
  416.                 DataAddBal(DEPOSITTYPE,&work->amount,&statReport.rwith);
  417.             }
  418.         }
  419.     
  420.         work = next;
  421.     }
  422.  }
  423.  
  424.  if (filtered.mlh_TailPred != &filtered) {
  425.  
  426.     /* calculate filtered */
  427.     while ( (fnext = (filterNode *)fwork->node.mln_Succ) ) {
  428.     
  429.         if ( !(fwork->entry->flags & VOIDED) &&
  430.              strcmpi(cat->catname,fwork->entry->category) == 0) {
  431.  
  432.             statReport.filttrans++;
  433.  
  434.             if (fwork->entry->type == DEPOSITTYPE) {
  435.                 DataAddBal(DEPOSITTYPE,&fwork->entry->amount,&statReport.fdep);
  436.             }
  437.             else {
  438.                 DataAddBal(DEPOSITTYPE,&fwork->entry->amount,&statReport.fwith);
  439.             }
  440.         }
  441.  
  442.         fwork = fnext;
  443.     }
  444.  }
  445.  
  446.  statReport.rwith.neg = TRUE;
  447.  statReport.fwith.neg = TRUE;
  448.  DataBalAddBal(usrAccount.decimal,&statReport.rbal,&statReport.rdep, &statReport.rwith);
  449.  DataBalAddBal(usrAccount.decimal,&statReport.fbal,&statReport.fdep, &statReport.fwith);
  450.  statReport.rwith.neg = FALSE;
  451.  statReport.fwith.neg = FALSE;
  452.  
  453.  return;
  454. }
  455.  
  456. /****************************************************
  457. * StatGroupReport()
  458. *
  459. *    Calculate values and report them
  460. *****************************************************/
  461. void StatGroupReport(groupNode *group)
  462. {
  463.  amountType zero = 0;
  464.  categoryNode *cat = NULL;
  465.  entryNode *work = (entryNode *)entries.mlh_Head, *next;
  466.  filterNode *fwork= (filterNode*)filtered.mlh_Head, *fnext;
  467.  
  468.  statReport.regtrans = statReport.filttrans = 0;
  469.  DataInitBal(DEPOSITTYPE,&zero,&statReport.rdep);
  470.  DataInitBal(DEPOSITTYPE,&zero,&statReport.fdep);
  471.  DataInitBal(DEPOSITTYPE,&zero,&statReport.rwith);
  472.  DataInitBal(DEPOSITTYPE,&zero,&statReport.fwith);
  473.  
  474.  
  475. while ( (cat = (categoryNode *)DataGetNext(&group->catlist,cat)) != NULL) {
  476.  work = (entryNode *)entries.mlh_Head;
  477.  fwork= (filterNode*)filtered.mlh_Head;
  478.  
  479.  if (entries.mlh_TailPred != &entries)  {
  480.  
  481.     /* calculate totals */
  482.     while ( (next = (entryNode *)work->node.mln_Succ) ) {
  483.         if ( !(work->flags & VOIDED) && 
  484.             strcmpi(cat->catname,work->category) == 0) {
  485.  
  486.             statReport.regtrans++;
  487.  
  488.             if (work->type == DEPOSITTYPE) {
  489.                 DataAddBal(DEPOSITTYPE,&work->amount,&statReport.rdep);
  490.             }
  491.             else {
  492.                 DataAddBal(DEPOSITTYPE,&work->amount,&statReport.rwith);
  493.             }
  494.         }
  495.     
  496.         work = next;
  497.     }
  498.  }
  499.  
  500.  if (filtered.mlh_TailPred != &filtered) {
  501.  
  502.     /* calculate filtered */
  503.     while ( (fnext = (filterNode *)fwork->node.mln_Succ) ) {
  504.     
  505.         if ( !(fwork->entry->flags & VOIDED) &&
  506.              strcmpi(cat->catname,fwork->entry->category) == 0) {
  507.  
  508.             statReport.filttrans++;
  509.  
  510.             if (fwork->entry->type == DEPOSITTYPE) {
  511.                 DataAddBal(DEPOSITTYPE,&fwork->entry->amount,&statReport.fdep);
  512.             }
  513.             else {
  514.                 DataAddBal(DEPOSITTYPE,&fwork->entry->amount,&statReport.fwith);
  515.             }
  516.         }
  517.  
  518.         fwork = fnext;
  519.     }
  520.  }
  521.  
  522. }
  523.  
  524.  statReport.rwith.neg = TRUE;
  525.  statReport.fwith.neg = TRUE;
  526.  DataBalAddBal(usrAccount.decimal,&statReport.rbal,&statReport.rdep, &statReport.rwith);
  527.  DataBalAddBal(usrAccount.decimal,&statReport.fbal,&statReport.fdep, &statReport.fwith);
  528.  statReport.rwith.neg = FALSE;
  529.  statReport.fwith.neg = FALSE;
  530.  
  531.  return;
  532. }
  533.  
  534.  
  535. /************************************************
  536. * StatFill()
  537. *
  538. *    fill the report entries into the panel
  539. *************************************************/
  540. void StatFill(void)
  541. {
  542.  
  543.  DataBuildBal(usrAccount.decimal,&statReport.fbal,fbalstr);
  544.  GF_SetGadgetAttrs(statGUI,STPgadgetspecs[GID_STPFILTSUM].gs_Gadget,
  545.     GTTX_Text,fbalstr,
  546.     TAG_DONE);
  547.  
  548.  DataBuildBal(usrAccount.decimal,&statReport.rbal,rbalstr);
  549.  GF_SetGadgetAttrs(statGUI,STPgadgetspecs[GID_STPTOTSUM].gs_Gadget,
  550.     GTTX_Text,rbalstr,
  551.     TAG_DONE);
  552.  
  553.  DataBuildBal(usrAccount.decimal,&statReport.fdep,fdepstr);
  554.  GF_SetGadgetAttrs(statGUI,STPgadgetspecs[GID_STPFILTDEP].gs_Gadget,
  555.     GTTX_Text,fdepstr,
  556.     TAG_DONE);
  557.  
  558.  DataBuildBal(usrAccount.decimal,&statReport.fwith,fwithstr);
  559.  GF_SetGadgetAttrs(statGUI,STPgadgetspecs[GID_STPFILTWITH].gs_Gadget,
  560.     GTTX_Text,fwithstr,
  561.     TAG_DONE);
  562.  
  563.  DataBuildBal(usrAccount.decimal,&statReport.rdep,rdepstr);
  564.  GF_SetGadgetAttrs(statGUI,STPgadgetspecs[GID_STPTOTDEP].gs_Gadget,
  565.     GTTX_Text,rdepstr,
  566.     TAG_DONE);
  567.  
  568.  DataBuildBal(usrAccount.decimal,&statReport.rwith,rwithstr);
  569.  GF_SetGadgetAttrs(statGUI,STPgadgetspecs[GID_STPTOTWITH].gs_Gadget,
  570.     GTTX_Text,rwithstr,
  571.     TAG_DONE);
  572.  
  573.  GF_SetGadgetAttrs(statGUI,STPgadgetspecs[GID_STPFILTNUM].gs_Gadget,
  574.     GTNM_Number,statReport.filttrans,
  575.     TAG_DONE);
  576.  
  577.  GF_SetGadgetAttrs(statGUI,STPgadgetspecs[GID_STPTOTNUM].gs_Gadget,
  578.     GTNM_Number,statReport.regtrans,
  579.     TAG_DONE);
  580. }
  581.