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

  1. /* formPanel.c 
  2.  *
  3.  *  defines the GUIFront characteristics of the form panel 
  4.  */
  5.   
  6. #include <stdio.h>  
  7. #include <intuition/gadgetclass.h>
  8. #include <clib/intuition_protos.h>
  9. #include <clib/asl_protos.h>
  10. #include <libraries/asl.h>
  11. #include <string.h>
  12. #include <stdio.h>
  13. #include "amiCheck.h"
  14. #include "dataBase.h"
  15. #include "formPanel.h"
  16. #include "printPanel.h"
  17. #include "regGadget.h"
  18.  
  19. /* prototypes */
  20. BOOL FormHandleGadget(struct IntuiMessage *);
  21. void FormInit(void);
  22. void FormChangeTemplate(int template);
  23. void FormTestPrint(void);
  24. BOOL FormCheckField(ULONG margin, ULONG width, ULONG line, char *resp);
  25. BOOL FormGoodbye(struct IntuiMessage *imsg);
  26.  
  27. static checkForm outofbounds = {
  28.     FALSE,
  29.      MAXCHECKLINES,    /* lines per check */
  30.     10,                /* checks per page */
  31.  
  32.     MAXCHECKCOLS,    /* pay margin */
  33.     STRINGSIZE,             /* pay width */
  34.     MAXCHECKLINES,    /* pay line */
  35.  
  36.     MAXCHECKCOLS,    /* date margin */
  37.     DATESIZE,            /* date width */
  38.     MAXCHECKLINES,    /* date line */
  39.  
  40.     MAXCHECKCOLS,    /* amnt margin */
  41.     AMNTSIZE,             /* amnt width */
  42.     MAXCHECKLINES,    /* amnt line */
  43.     
  44.     MAXCHECKCOLS,    /* memo margin */
  45.     STRINGSIZE,             /* memo width */
  46.     MAXCHECKLINES,    /* memo line */
  47.  
  48.  
  49.     4,                /* voucher type */
  50.     MAXCHECKCOLS,    /* voucher margin */
  51.     MAXCHECKCOLS,    /* voucher width */
  52.  
  53.     MAXCHECKCOLS,        /* string stuff */
  54.     MAXCHECKCOLS,
  55.     MAXCHECKLINES,
  56.  
  57.     MAXCHECKLINES,       /* top check lines */
  58.        MAXCHECKCOLS         /* check cols */
  59. };
  60.  
  61. formControl localForms;
  62. ExtErrorData FormExtData;
  63. GUIFront *formGUI;
  64. static struct Window *myWin;
  65.  
  66.  
  67. STRPTR fpvlabels[] =
  68. {
  69.     "none",
  70.     "Left/Right",
  71.     "Above+Below",
  72.     "Two Below",
  73.        "One Above",
  74.        "One Below",
  75.     NULL,
  76. };
  77.  
  78. struct TagItem fopdev[] = {
  79.     {ALT_Image, ALTI_GetFile},
  80.     {ALT_AslRequester, FALSE},
  81.     /*{GA_Immediate,TRUE},*/
  82.     {TAG_DONE},
  83. };
  84.  
  85. struct TagItem  fptcytags[] = {
  86.     {GTCY_Labels,fptlabels},
  87.     {TAG_DONE},
  88. };
  89.  
  90. struct TagItem  fpvcytags[] = {
  91.     {GTCY_Labels,fpvlabels},
  92.     {TAG_DONE},
  93. };
  94.  
  95.  
  96. /* define gadgetspec */
  97. GadgetSpec FOPgadgetspecs[] = 
  98. {
  99.     {CYCLE_KIND,10,0,{0,0,0,0,"_Use Template:",NULL, GID_FOPTEMPLATE,
  100.         PLACETEXT_LEFT}, fptcytags, GS_DefaultTags},
  101.  
  102.         {INTEGER_KIND,4,0,{0,0,0,0,"_Lines per Check:", NULL, GID_FOPCHECKLINES,         
  103.                 PLACETEXT_LEFT}, TxtInt, GS_DefaultTags},
  104.  
  105.         {INTEGER_KIND,4,0,{0,0,0,0,"O_rder margin:", NULL, GID_FOPPAYMARGIN,         
  106.                 PLACETEXT_LEFT}, TxtInt, GS_DefaultTags},
  107.  
  108.         {INTEGER_KIND,4,0,{0,0,0,0,"Order width:", NULL, GID_FOPPAYWIDTH,         
  109.                 PLACETEXT_LEFT}, TxtInt, GS_DefaultTags},
  110.  
  111.         {INTEGER_KIND,4,0,{0,0,0,0,"Order line#:", NULL, GID_FOPPAYLINE,         
  112.                 PLACETEXT_LEFT}, TxtInt, GS_DefaultTags},
  113.  
  114.         {INTEGER_KIND,4,0,{0,0,0,0,"_Date margin:", NULL, GID_FOPDATEMARGIN,         
  115.                 PLACETEXT_LEFT}, TxtInt, GS_DefaultTags},
  116.  
  117.         {INTEGER_KIND,4,0,{0,0,0,0,"Date width:", NULL, GID_FOPDATEWIDTH,         
  118.                 PLACETEXT_LEFT}, TxtInt, GS_DefaultTags},
  119.  
  120.         {INTEGER_KIND,4,0,{0,0,0,0,"Date line#:", NULL, GID_FOPDATELINE,         
  121.                 PLACETEXT_LEFT}, TxtInt, GS_DefaultTags},
  122.  
  123.         {INTEGER_KIND,4,0,{0,0,0,0,"_$ margin:", NULL, GID_FOPAMNTMARGIN,         
  124.                 PLACETEXT_LEFT}, TxtInt, GS_DefaultTags},
  125.  
  126.         {INTEGER_KIND,4,0,{0,0,0,0,"$ width:", NULL, GID_FOPAMNTWIDTH,         
  127.                 PLACETEXT_LEFT}, TxtInt, GS_DefaultTags},
  128.  
  129.         {INTEGER_KIND,4,0,{0,0,0,0,"$ line#:", NULL, GID_FOPAMNTLINE,         
  130.                 PLACETEXT_LEFT}, TxtInt, GS_DefaultTags},
  131.  
  132.         {INTEGER_KIND,4,0,{0,0,0,0,"_Memo margin:", NULL, GID_FOPMEMOMARGIN,         
  133.                 PLACETEXT_LEFT}, TxtInt, GS_DefaultTags},
  134.  
  135.         {INTEGER_KIND,4,0,{0,0,0,0,"Memo width:", NULL, GID_FOPMEMOWIDTH,         
  136.                 PLACETEXT_LEFT}, TxtInt, GS_DefaultTags},
  137.  
  138.         {INTEGER_KIND,4,0,{0,0,0,0,"Memo line#:", NULL, GID_FOPMEMOLINE,         
  139.                 PLACETEXT_LEFT}, TxtInt, GS_DefaultTags},
  140.  
  141.     {CYCLE_KIND,4,0,{0,0,0,0,"_Voucher Type:",NULL, GID_FOPVOUCHERTYPE,
  142.         PLACETEXT_LEFT}, fpvcytags, GS_DefaultTags},
  143.  
  144.         {INTEGER_KIND,4,0,{0,0,0,0,"Voucher margin:", NULL, GID_FOPVOUCHERMARGIN,         
  145.             PLACETEXT_LEFT}, TxtInt, GS_DefaultTags},
  146.  
  147.         {INTEGER_KIND,4,0,{0,0,0,0,"Voucher width:", NULL, GID_FOPVOUCHERWIDTH,         
  148.                 PLACETEXT_LEFT}, TxtInt, GS_DefaultTags},
  149.  
  150.         {INTEGER_KIND,4,0,{0,0,0,0,"Checks per Pa_ge:", NULL, GID_FOPCHECKSPAGE,         
  151.             PLACETEXT_LEFT}, TxtInt, GS_DefaultTags},
  152.  
  153.     {CHECKBOX_KIND,0,0,{0,0,0,0,"S_heet",NULL,GID_FOPFF,
  154.         PLACETEXT_LEFT},NULL,GS_DefaultTags},
  155.  
  156.         {BUTTON_KIND,0,0,{0,0,0,0,"_OK", NULL, GID_FOPOK,         
  157.                 PLACETEXT_IN}, NULL, GS_DefaultTags}, 
  158.  
  159.         {BUTTON_KIND,0,0,{0,0,0,0,"_Test", NULL, GID_FOPTEST,         
  160.                 PLACETEXT_IN}, NULL, GS_DefaultTags},
  161.  
  162.         {BUTTON_KIND,0,0,{0,0,0,0,"_Cancel", NULL, GID_FOPCANCEL,         
  163.                 PLACETEXT_IN}, NULL, GS_DefaultTags},
  164.  
  165.     {STRING_KIND,10,0,{0,0,0,0,"Output Devi_ce:", NULL, GID_FOPDEVICE,
  166.         PLACETEXT_LEFT},NULL,GS_DefaultTags},
  167.  
  168.     {GETALT_KIND,0,0,{0,0,0,0,NULL, NULL, GID_FOPFILE,
  169.         PLACETEXT_LEFT},fopdev,GS_DefaultTags},
  170.  
  171.     {INTEGER_KIND,0,0,{0,0,0,0,"Columns",NULL,GID_FOPCOLS,
  172.         PLACETEXT_LEFT},TxtInt,GS_DefaultTags},
  173.  
  174.         {INTEGER_KIND,4,0,{0,0,0,0,"_Pay margin:", NULL, GID_FOPSTRMARGIN,         
  175.                 PLACETEXT_LEFT}, TxtInt, GS_DefaultTags},
  176.  
  177.         {INTEGER_KIND,4,0,{0,0,0,0,"Pay width:", NULL, GID_FOPSTRWIDTH,         
  178.                 PLACETEXT_LEFT}, TxtInt, GS_DefaultTags},
  179.  
  180.         {INTEGER_KIND,4,0,{0,0,0,0,"Pay line#:", NULL, GID_FOPSTRLINE,         
  181.                 PLACETEXT_LEFT}, TxtInt, GS_DefaultTags},
  182.  
  183.         {INTEGER_KIND,4,0,{0,0,0,0,"Top Lines:", NULL, GID_FOPTOPLINES,         
  184.                 PLACETEXT_LEFT}, TxtInt, GS_DefaultTags},
  185.     
  186. };
  187.  
  188. /* set up array of pointers to our specs */
  189. GadgetSpec *FP_FormSpecs[] =
  190. {
  191.         &FOPgadgetspecs[0],
  192.         &FOPgadgetspecs[1],
  193.         &FOPgadgetspecs[2],
  194.         &FOPgadgetspecs[3],
  195.         &FOPgadgetspecs[4],
  196.         &FOPgadgetspecs[5],
  197.         &FOPgadgetspecs[6],
  198.         &FOPgadgetspecs[7],
  199.         &FOPgadgetspecs[8],
  200.         &FOPgadgetspecs[9],
  201.         &FOPgadgetspecs[10],        
  202.     &FOPgadgetspecs[11],
  203.         &FOPgadgetspecs[12],
  204.         &FOPgadgetspecs[13],    
  205.     &FOPgadgetspecs[14],    
  206.     &FOPgadgetspecs[15], 
  207.     &FOPgadgetspecs[16], 
  208.     &FOPgadgetspecs[17], 
  209.     &FOPgadgetspecs[18],
  210.     &FOPgadgetspecs[19],  
  211.     &FOPgadgetspecs[20], 
  212.     &FOPgadgetspecs[21], 
  213.      &FOPgadgetspecs[22],
  214.     &FOPgadgetspecs[23],
  215.     &FOPgadgetspecs[24],
  216.     &FOPgadgetspecs[25],
  217.     &FOPgadgetspecs[26],
  218.     &FOPgadgetspecs[27],
  219.     &FOPgadgetspecs[28],
  220.     NULL,
  221. };
  222.  
  223.  
  224. /* define the layout of this panel */
  225. ULONG FP_FormPanel[] =
  226. {
  227.    GUIL_Flags, GUILF_PropShare | GUILF_EqualWidth,
  228.  
  229.    GUIL_HorizGroup, 1,
  230.         GUIL_Flags, GUILF_PropShare | GUILF_EqualHeight,
  231.     GUIL_FrameType, GUILFT_Recess,
  232.         
  233.         GUIL_VertGroup, 1,
  234.                 GUIL_VertGroup, 1,
  235.             GUIL_FrameType, GUILFT_Ridge,
  236.             GUIL_FrameHeadline, "Print Settings",
  237.             GUIL_Flags, GUILF_LabelAlign | GUILF_EqualShare | GUILF_EqualWidth,
  238.  
  239.             GUIL_GadgetSpecID, GID_FOPTEMPLATE,
  240.             GUIL_HorizGroup,0,
  241.                 GUIL_Flags, GUILF_PropShare | GUILF_EqualHeight,
  242.                 GUIL_GadgetSpecID, GID_FOPDEVICE,
  243.                 GUIL_GadgetSpecID, GID_FOPFILE,
  244.             TAG_DONE,
  245.             TAG_DONE,
  246.  
  247.             GUIL_VertGroup,1,
  248.                 GUIL_FrameType, GUILFT_Ridge,
  249.                 GUIL_FrameHeadline, "Page Settings",
  250.  
  251.                 GUIL_Flags, GUILF_EqualShare | GUILF_LabelAlign | GUILF_EqualWidth,
  252.                 GUIL_GadgetSpecID, GID_FOPCHECKSPAGE,
  253.                 GUIL_GadgetSpecID, GID_FOPCHECKLINES,
  254.                 GUIL_GadgetSpecID, GID_FOPVOUCHERTYPE,
  255.                 GUIL_GadgetSpecID, GID_FOPVOUCHERMARGIN,
  256.                 GUIL_GadgetSpecID, GID_FOPVOUCHERWIDTH,
  257.                         GUIL_HorizGroup,1,
  258.                                 GUIL_Flags, GUILF_PropShare,
  259.                                 GUIL_GadgetSpecID, GID_FOPCOLS,
  260.                         GUIL_GadgetSpecID, GID_FOPFF,
  261.                         TAG_DONE,                                
  262.             TAG_DONE,
  263.  
  264.         TAG_DONE, /* print settings */
  265.  
  266.         GUIL_HorizGroup, 1,
  267.             GUIL_FrameType, GUILFT_Ridge,
  268.             GUIL_FrameHeadline, "Field Settings",
  269.             GUIL_Flags, GUILF_PropShare | GUILF_LabelAlign | GUILF_EqualWidth,
  270.  
  271.             GUIL_VertGroup,0,
  272.                 GUIL_Flags, GUILF_EqualHeight | GUILF_LabelAlign | GUILF_EqualWidth,
  273.                 GUIL_GadgetSpecID, GID_FOPDATEMARGIN,
  274.                 GUIL_GadgetSpecID, GID_FOPDATEWIDTH,
  275.                 GUIL_GadgetSpecID, GID_FOPDATELINE,
  276.                 GUIL_GadgetSpecID, GID_FOPAMNTMARGIN,
  277.                 GUIL_GadgetSpecID, GID_FOPAMNTWIDTH,
  278.                 GUIL_GadgetSpecID, GID_FOPAMNTLINE,
  279.                 GUIL_GadgetSpecID, GID_FOPSTRMARGIN,
  280.                 GUIL_GadgetSpecID, GID_FOPSTRWIDTH,
  281.             TAG_DONE,
  282.  
  283.             GUIL_VertGroup,0,
  284.                 GUIL_Flags, GUILF_EqualHeight | GUILF_LabelAlign | GUILF_EqualWidth,
  285.                 GUIL_GadgetSpecID, GID_FOPSTRLINE,
  286.                 GUIL_GadgetSpecID, GID_FOPPAYMARGIN,
  287.                 GUIL_GadgetSpecID, GID_FOPPAYWIDTH,
  288.                 GUIL_GadgetSpecID, GID_FOPPAYLINE,
  289.                 GUIL_GadgetSpecID, GID_FOPMEMOMARGIN,
  290.                 GUIL_GadgetSpecID, GID_FOPMEMOWIDTH,
  291.                 GUIL_GadgetSpecID, GID_FOPMEMOLINE,
  292.                 GUIL_GadgetSpecID, GID_FOPTOPLINES,
  293.                     
  294.             TAG_DONE,
  295.         TAG_DONE, /* field settings */
  296.  
  297.     TAG_DONE, /* horiz group of window */
  298.  
  299.     GUIL_HorizGroup,1,
  300.         GUIL_Flags, GUILF_EqualSize | GUILF_EqualWidth,
  301.         
  302.            GUIL_GadgetSpecID, GID_FOPOK,
  303.        GUIL_GadgetSpecID, GID_FOPTEST,
  304.        GUIL_GadgetSpecID, GID_FOPCANCEL,
  305.            
  306.     TAG_DONE,   
  307.            
  308. TAG_DONE,
  309. };
  310.  
  311.  
  312. /****************************************************
  313. * FormGUI ()
  314. *
  315. *    Creates the GUI for the form panel.
  316. *****************************************************/
  317. void  FormGUI(void)
  318. {
  319.  BOOL done = FALSE;
  320.  BOOL reply = TRUE;    
  321.  ULONG signal;
  322.  
  323.  AmiLock();
  324.  GF_SetGUIAttr(formGUI, GUI_OpenGUI, TRUE, TAG_DONE);
  325.  /* grab window */
  326.  GF_GetGUIAttr(formGUI,GUI_Window,&myWin,TAG_DONE);
  327.  FormInit();
  328.  
  329.  /* Process input events */
  330.  while (!done) {
  331.          struct IntuiMessage *imsg;
  332.  
  333.     /* Wait for an event to occur */
  334.     signal = GF_Wait(guiapp,AmigaGuideSignal(agc));
  335.     if (signal & AmigaGuideSignal(agc)) {
  336.         AmiHelpMsg();
  337.         continue;
  338.     }
  339.  
  340.         /* We only bother to listen for CLOSEWINDOW events.
  341.          * Of course, in a real application, you would be
  342.          * examining the Class field for IDCMP_GADGETUP
  343.          * messages and act accordingly.
  344.          */
  345.  
  346.          while (imsg = GF_GetIMsg(guiapp)) {
  347.         reply = TRUE;
  348.                 switch (imsg->Class) {
  349.             case IDCMP_REFRESHWINDOW:
  350.                 RegRefresh(TRUE);
  351.                 break;
  352.  
  353.                         case IDCMP_CLOSEWINDOW:
  354.                 done = TRUE;
  355.                                 break;
  356.  
  357.             case IDCMP_GADGETUP:
  358.                 reply = FALSE;
  359.                 done=FormHandleGadget(imsg);
  360.                 break;
  361.  
  362.             case IDCMP_RAWKEY:
  363.                 AmiHelpKey(imsg,FORMS_PANEL);
  364.                 break;
  365.                 }
  366.                                                                   
  367.         if (reply)
  368.                            GF_ReplyIMsg(imsg);
  369.           }
  370.  }
  371.  
  372.  GF_SetGUIAttr(formGUI, GUI_OpenGUI, FALSE, TAG_DONE);               
  373.  AmiUnlock();
  374. }
  375.  
  376. /***************************************************
  377. * FormHandleGadget()
  378. *
  379. *    Handles gadget events for this panel
  380. ****************************************************/
  381. BOOL FormHandleGadget(struct IntuiMessage *imsg)
  382. {
  383.  BOOL done = FALSE;
  384.  struct Gadget *gad = (struct Gadget *)(imsg->IAddress);
  385.  UWORD code = imsg->Code;
  386.  int val;
  387.  char resp[STRINGSIZE];
  388.  
  389.  switch (gad->GadgetID) {
  390.  
  391.     case GID_FOPDEVICE:
  392.         strcpy(localForms.device,((struct StringInfo*)gad->SpecialInfo)->Buffer);
  393.         break;
  394.  
  395.     case GID_FOPFILE:
  396.         if (AmiGetFile(formGUI,devASL,localForms.device,STRINGSIZE)) {
  397.             GF_SetGadgetAttrs (formGUI, FP_FormSpecs[GID_FOPDEVICE]->gs_Gadget,
  398.                 GTST_String, localForms.device,
  399.                 TAG_DONE);
  400.         }
  401.         break;
  402.  
  403.     case GID_FOPTEMPLATE:
  404.         FormChangeTemplate(code);
  405.         break;
  406.  
  407.     case GID_FOPFF:
  408.         localForms.userForm.sheet_feed = code;
  409.         break;
  410.  
  411.        case GID_FOPCOLS:
  412.             val = (UWORD)((struct StringInfo*)gad->SpecialInfo)->LongInt;
  413.         if (val > outofbounds.columns || val < 20) {
  414.             DisplayBeep(myWin->WScreen);
  415.             DataAnnounce(formGUI, "Value too large/small");
  416.             GF_ReplyIMsg(imsg);
  417.             DataSitNSpin(FP_FormSpecs[GID_FOPCOLS]->gs_Gadget,myWin);
  418.             return (done);
  419.         }
  420.         else localForms.userForm.columns = val;
  421.         break;
  422.         
  423.     case GID_FOPTOPLINES:
  424.         val = (UWORD)((struct StringInfo*)gad->SpecialInfo)->LongInt;
  425.         if (val > outofbounds.top_lines) {
  426.             DisplayBeep(myWin->WScreen);
  427.             DataAnnounce(formGUI, "Value too large");
  428.             GF_ReplyIMsg(imsg);
  429.             DataSitNSpin(FP_FormSpecs[GID_FOPTOPLINES]->gs_Gadget,myWin);
  430.                return (done);
  431.         }
  432.         else localForms.userForm.top_lines = val;
  433.         break;
  434.  
  435.     case GID_FOPCHECKLINES:
  436.         /* test for ridiculous value */
  437.         val = (UWORD)((struct StringInfo*)gad->SpecialInfo)->LongInt;
  438.         if (val > outofbounds.lines_check) {
  439.             DisplayBeep(myWin->WScreen);
  440.             DataAnnounce(formGUI, "Value too large");
  441.             GF_ReplyIMsg(imsg);
  442.             DataSitNSpin(FP_FormSpecs[GID_FOPCHECKLINES]->gs_Gadget,myWin);
  443.             return (done);
  444.         }
  445.         else localForms.userForm.lines_check = val;
  446.         break;
  447.  
  448.     case GID_FOPCHECKSPAGE:
  449.         /* test for ridiculous value */
  450.         val = (UWORD)((struct StringInfo*)gad->SpecialInfo)->LongInt;
  451.         if (val > outofbounds.checks_page) {
  452.             DisplayBeep(myWin->WScreen);
  453.             DataAnnounce(formGUI, "Value too large");
  454.             GF_ReplyIMsg(imsg);
  455.             DataSitNSpin(FP_FormSpecs[GID_FOPCHECKSPAGE]->gs_Gadget,myWin);
  456.                return (done);
  457.         }
  458.         else localForms.userForm.checks_page = val;
  459.         break;
  460.  
  461.     case GID_FOPPAYMARGIN:
  462.         /* test for ridiculous value */
  463.         val = (UWORD)((struct StringInfo*)gad->SpecialInfo)->LongInt;
  464.         if (!FormCheckField(val,localForms.userForm.pay_width,localForms.userForm.pay_line,resp)) {
  465.             DisplayBeep(myWin->WScreen);
  466.             DataAnnounce(formGUI, resp);
  467.             GF_ReplyIMsg(imsg);
  468.             DataSitNSpin(FP_FormSpecs[GID_FOPPAYMARGIN]->gs_Gadget,myWin);
  469.             return (done);
  470.         }
  471.         else localForms.userForm.pay_margin = val;
  472.         break;
  473.  
  474.     case GID_FOPPAYWIDTH:
  475.         /* test for ridiculous value */
  476.         val = (UWORD)((struct StringInfo*)gad->SpecialInfo)->LongInt;
  477.         if (!FormCheckField(localForms.userForm.pay_margin,val,localForms.userForm.pay_line,resp)) {
  478.             DisplayBeep(myWin->WScreen);
  479.             DataAnnounce(formGUI, resp);
  480.             GF_ReplyIMsg(imsg);
  481.             DataSitNSpin(FP_FormSpecs[GID_FOPPAYWIDTH]->gs_Gadget,myWin);
  482.                return (done);
  483.         }
  484.         else localForms.userForm.pay_width = val;
  485.         break;
  486.  
  487.     case GID_FOPPAYLINE:
  488.         /* test for ridiculous value */
  489.         val = (UWORD)((struct StringInfo*)gad->SpecialInfo)->LongInt;
  490.         if (!FormCheckField(localForms.userForm.pay_margin,localForms.userForm.pay_width,val,resp)) {
  491.             DisplayBeep(myWin->WScreen);
  492.             DataAnnounce(formGUI, resp);
  493.             GF_ReplyIMsg(imsg);
  494.             DataSitNSpin(FP_FormSpecs[GID_FOPPAYLINE]->gs_Gadget,myWin);
  495.             return (done);
  496.         }
  497.         else localForms.userForm.pay_line = val;
  498.         break;
  499.  
  500.     case GID_FOPSTRMARGIN:
  501.         /* test for ridiculous value */
  502.         val = (UWORD)((struct StringInfo*)gad->SpecialInfo)->LongInt;
  503.         if (!FormCheckField(val,localForms.userForm.str_width,localForms.userForm.str_line,resp)) {
  504.             DisplayBeep(myWin->WScreen);
  505.             DataAnnounce(formGUI, resp);
  506.             GF_ReplyIMsg(imsg);
  507.             DataSitNSpin(FP_FormSpecs[GID_FOPSTRMARGIN]->gs_Gadget,myWin);
  508.              return (done);
  509.         }
  510.         else localForms.userForm.str_margin = val;
  511.         break;
  512.  
  513.     case GID_FOPSTRWIDTH:
  514.         /* test for ridiculous value */
  515.         val = (UWORD)((struct StringInfo*)gad->SpecialInfo)->LongInt;
  516.         if (!FormCheckField(localForms.userForm.str_margin,val,localForms.userForm.str_line,resp)) {
  517.             DisplayBeep(myWin->WScreen);
  518.             DataAnnounce(formGUI, resp);
  519.             GF_ReplyIMsg(imsg);
  520.             DataSitNSpin(FP_FormSpecs[GID_FOPSTRWIDTH]->gs_Gadget,myWin);
  521.             return (done);
  522.         }
  523.         else localForms.userForm.str_width = val;
  524.         break;
  525.  
  526.     case GID_FOPSTRLINE:
  527.         /* test for ridiculous value */
  528.         val = (UWORD)((struct StringInfo*)gad->SpecialInfo)->LongInt;
  529.         if (!FormCheckField(localForms.userForm.str_margin,localForms.userForm.str_width,val,resp)) {
  530.             DisplayBeep(myWin->WScreen);
  531.             DataAnnounce(formGUI, resp);
  532.             GF_ReplyIMsg(imsg);
  533.             DataSitNSpin(FP_FormSpecs[GID_FOPSTRLINE]->gs_Gadget,myWin);
  534.              return (done);
  535.         }
  536.         else localForms.userForm.str_line = val;
  537.         break;
  538.  
  539.     case GID_FOPDATEMARGIN:
  540.         /* test for ridiculous value */
  541.         val = (UWORD)((struct StringInfo*)gad->SpecialInfo)->LongInt;
  542.         if (!FormCheckField(val,localForms.userForm.date_width,localForms.userForm.date_line,resp)) {
  543.             DisplayBeep(myWin->WScreen);
  544.             DataAnnounce(formGUI, resp);
  545.             GF_ReplyIMsg(imsg);
  546.             DataSitNSpin(FP_FormSpecs[GID_FOPDATEMARGIN]->gs_Gadget,myWin);
  547.              return (done);
  548.         }
  549.         else localForms.userForm.date_margin = val;
  550.         break;
  551.  
  552.     case GID_FOPDATEWIDTH:
  553.         /* test for ridiculous value */
  554.         val = (UWORD)((struct StringInfo*)gad->SpecialInfo)->LongInt;
  555.         if (!FormCheckField(localForms.userForm.date_margin,val,localForms.userForm.date_line,resp)) {
  556.             DisplayBeep(myWin->WScreen);
  557.             DataAnnounce(formGUI, resp);
  558.             GF_ReplyIMsg(imsg);
  559.             DataSitNSpin(FP_FormSpecs[GID_FOPDATEWIDTH]->gs_Gadget,myWin);
  560.             return (done);
  561.         }
  562.         else localForms.userForm.date_width = val;
  563.         break;
  564.  
  565.     case GID_FOPDATELINE:
  566.         /* test for ridiculous value */
  567.         val = (UWORD)((struct StringInfo*)gad->SpecialInfo)->LongInt;
  568.         if (!FormCheckField(localForms.userForm.date_margin,localForms.userForm.date_width,val,resp)) {
  569.             DisplayBeep(myWin->WScreen);
  570.             DataAnnounce(formGUI, resp);
  571.             GF_ReplyIMsg(imsg);
  572.             DataSitNSpin(FP_FormSpecs[GID_FOPDATELINE]->gs_Gadget,myWin);
  573.             return (done);
  574.         }
  575.         else localForms.userForm.date_line = val;
  576.         break;
  577.  
  578.     case GID_FOPAMNTMARGIN:
  579.         /* test for ridiculous value */
  580.         val = (UWORD)((struct StringInfo*)gad->SpecialInfo)->LongInt;
  581.         if (!FormCheckField(val,localForms.userForm.amnt_width,localForms.userForm.amnt_line,resp)) {
  582.             DisplayBeep(myWin->WScreen);
  583.             DataAnnounce(formGUI, resp);
  584.             GF_ReplyIMsg(imsg);
  585.             DataSitNSpin(FP_FormSpecs[GID_FOPAMNTMARGIN]->gs_Gadget,myWin);
  586.              return (done);
  587.         }
  588.         else localForms.userForm.amnt_margin = val;
  589.         break;
  590.  
  591.     case GID_FOPAMNTWIDTH:
  592.         /* test for ridiculous value */
  593.         val = (UWORD)((struct StringInfo*)gad->SpecialInfo)->LongInt;
  594.         if (!FormCheckField(localForms.userForm.amnt_margin,val,localForms.userForm.amnt_line,resp)) {
  595.             DisplayBeep(myWin->WScreen);
  596.             DataAnnounce(formGUI, resp);
  597.             GF_ReplyIMsg(imsg);
  598.             DataSitNSpin(FP_FormSpecs[GID_FOPAMNTWIDTH]->gs_Gadget,myWin);
  599.              return (done);
  600.         }
  601.         else localForms.userForm.amnt_width = val;
  602.         break;
  603.  
  604.     case GID_FOPAMNTLINE:
  605.         /* test for ridiculous value */
  606.         val = (UWORD)((struct StringInfo*)gad->SpecialInfo)->LongInt;
  607.         if (!FormCheckField(localForms.userForm.amnt_margin,localForms.userForm.amnt_width,val,resp)) {
  608.             DisplayBeep(myWin->WScreen);
  609.             DataAnnounce(formGUI, resp);
  610.             GF_ReplyIMsg(imsg);
  611.             DataSitNSpin(FP_FormSpecs[GID_FOPAMNTLINE]->gs_Gadget,myWin);
  612.             return (done);
  613.         }
  614.         else localForms.userForm.amnt_line = val;
  615.         break;
  616.  
  617.     case GID_FOPMEMOMARGIN:
  618.         /* test for ridiculous value */
  619.         val = (UWORD)((struct StringInfo*)gad->SpecialInfo)->LongInt;
  620.         if (!FormCheckField(val,localForms.userForm.memo_width,localForms.userForm.memo_line,resp)) {
  621.             DisplayBeep(myWin->WScreen);
  622.             DataAnnounce(formGUI, resp);
  623.             GF_ReplyIMsg(imsg);
  624.             DataSitNSpin(FP_FormSpecs[GID_FOPMEMOMARGIN]->gs_Gadget,myWin);
  625.               return (done);
  626.         }
  627.         else localForms.userForm.memo_margin = val;
  628.         break;
  629.  
  630.     case GID_FOPMEMOWIDTH:
  631.         /* test for ridiculous value */
  632.         val = (UWORD)((struct StringInfo*)gad->SpecialInfo)->LongInt;
  633.         if (!FormCheckField(localForms.userForm.memo_width,val,localForms.userForm.memo_line,resp)) {
  634.             DisplayBeep(myWin->WScreen);
  635.             DataAnnounce(formGUI, resp);
  636.             GF_ReplyIMsg(imsg);
  637.             DataSitNSpin(FP_FormSpecs[GID_FOPMEMOWIDTH]->gs_Gadget,myWin);
  638.              return (done);
  639.         }
  640.         else localForms.userForm.memo_width = val;
  641.         break;
  642.  
  643.     case GID_FOPMEMOLINE:
  644.         /* test for ridiculous value */
  645.         val = (UWORD)((struct StringInfo*)gad->SpecialInfo)->LongInt;
  646.         if (!FormCheckField(localForms.userForm.memo_margin,localForms.userForm.memo_width,val,resp)) {
  647.             DisplayBeep(myWin->WScreen);
  648.             DataAnnounce(formGUI, resp);
  649.             GF_ReplyIMsg(imsg);
  650.             DataSitNSpin(FP_FormSpecs[GID_FOPMEMOLINE]->gs_Gadget,myWin);
  651.              return (done);
  652.         }
  653.         else localForms.userForm.memo_line = val;
  654.         break;
  655.  
  656.     case GID_FOPVOUCHERTYPE:
  657.         localForms.userForm.voucher_type = code;
  658.     
  659.          /* disable voucher fields if needed */
  660.           GF_SetGadgetAttrs (formGUI, FP_FormSpecs[GID_FOPVOUCHERMARGIN]->gs_Gadget,
  661.             GA_Disabled, (localForms.userForm.voucher_type != VT_LEFTRIGHT),
  662.             TAG_DONE);
  663.  
  664.           GF_SetGadgetAttrs (formGUI, FP_FormSpecs[GID_FOPVOUCHERWIDTH]->gs_Gadget,
  665.             GA_Disabled, (localForms.userForm.voucher_type != VT_LEFTRIGHT),
  666.             TAG_DONE);
  667.  
  668.         break;
  669.  
  670.     case GID_FOPVOUCHERMARGIN:
  671.         /* test for ridiculous value */
  672.         val = (UWORD)((struct StringInfo*)gad->SpecialInfo)->LongInt;
  673.         if (val > outofbounds.voucher_margin) {
  674.             DisplayBeep(myWin->WScreen);
  675.             DataAnnounce(formGUI, "Value too large");
  676.             GF_ReplyIMsg(imsg);
  677.             DataSitNSpin(FP_FormSpecs[GID_FOPVOUCHERMARGIN]->gs_Gadget,myWin);
  678.             return (done);
  679.         }
  680.         else localForms.userForm.voucher_margin = val;
  681.         break;
  682.  
  683.     case GID_FOPVOUCHERWIDTH:
  684.         /* test for ridiculous value */
  685.         val = (UWORD)((struct StringInfo*)gad->SpecialInfo)->LongInt;
  686.         if (val > outofbounds.voucher_width) {
  687.             DisplayBeep(myWin->WScreen);
  688.             DataAnnounce(formGUI, "Value too large");
  689.             GF_ReplyIMsg(imsg);
  690.             DataSitNSpin(FP_FormSpecs[GID_FOPVOUCHERWIDTH]->gs_Gadget,myWin);
  691.             return (done);
  692.         }
  693.         else localForms.userForm.voucher_width = val;
  694.         break;
  695.  
  696.     case GID_FOPTEST:
  697.         if (FormGoodbye(imsg))
  698.             FormTestPrint();
  699.         return (FALSE);
  700.         break;
  701.  
  702.     case GID_FOPCANCEL:
  703.         done = TRUE;    
  704.         break;
  705.     
  706.     case GID_FOPOK:
  707.         amiChangedItems = TRUE;
  708.         /* verify stuff? FormGoodbye() */
  709.         if (FormGoodbye(imsg) == TRUE) {
  710.             memcpy (&checkForms,&localForms,sizeof(formControl));
  711.             done = TRUE;    
  712.         }
  713.         else return (FALSE);
  714.         break;
  715.  }
  716.  
  717.  GF_ReplyIMsg(imsg);
  718.  return (done);
  719. }
  720.  
  721. /****************************************************
  722. * FormInit()
  723. *
  724. *    Set up some globals
  725. *****************************************************/
  726. void FormInit(void)
  727. {
  728.  /* grab active form */
  729.  memcpy (&localForms,&checkForms,sizeof(formControl));
  730.  
  731.  /* fill in form details */
  732.  GF_SetGadgetAttrs (formGUI, FP_FormSpecs[GID_FOPTEMPLATE]->gs_Gadget,
  733.     GTCY_Active, NUMCHECKFORMS,
  734.     TAG_DONE);
  735.  
  736.  GF_SetGadgetAttrs (formGUI, FP_FormSpecs[GID_FOPDEVICE]->gs_Gadget,
  737.     GTST_String, localForms.device,
  738.     TAG_DONE);
  739.  
  740.  FormChangeTemplate(NUMCHECKFORMS);
  741. }
  742.  
  743. /****************************************************************************
  744. * FormChangeTemplate()
  745. *
  746. *    change the template for the user
  747. *****************************************************************************/
  748. void FormChangeTemplate(int template)
  749. {
  750.  BOOL dis = TRUE;
  751.  
  752.  if (template < NUMCHECKFORMS) 
  753.      memcpy(&localForms.userForm, &checkForms.forms[template],sizeof(checkForm));
  754.  else    memcpy(&localForms.userForm, &checkForms.userForm,sizeof(checkForm));
  755.  
  756.  GF_SetGadgetAttrs (formGUI, FP_FormSpecs[GID_FOPFF]->gs_Gadget,
  757.     GTCB_Checked, localForms.userForm.sheet_feed,
  758.     TAG_DONE);
  759.  
  760.  GF_SetGadgetAttrs (formGUI, FP_FormSpecs[GID_FOPPAYMARGIN]->gs_Gadget,
  761.     GTIN_Number, localForms.userForm.pay_margin,
  762.     TAG_DONE);
  763.  
  764.  GF_SetGadgetAttrs (formGUI, FP_FormSpecs[GID_FOPPAYWIDTH]->gs_Gadget,
  765.     GTIN_Number, localForms.userForm.pay_width,
  766.     TAG_DONE);
  767.  
  768.  GF_SetGadgetAttrs (formGUI, FP_FormSpecs[GID_FOPPAYLINE]->gs_Gadget,
  769.     GTIN_Number, localForms.userForm.pay_line,
  770.     TAG_DONE);
  771.  
  772.  GF_SetGadgetAttrs (formGUI, FP_FormSpecs[GID_FOPSTRMARGIN]->gs_Gadget,
  773.     GTIN_Number, localForms.userForm.str_margin,
  774.     TAG_DONE);
  775.  
  776.  GF_SetGadgetAttrs (formGUI, FP_FormSpecs[GID_FOPSTRWIDTH]->gs_Gadget,
  777.     GTIN_Number, localForms.userForm.str_width,
  778.     TAG_DONE);
  779.  
  780.  GF_SetGadgetAttrs (formGUI, FP_FormSpecs[GID_FOPSTRLINE]->gs_Gadget,
  781.     GTIN_Number, localForms.userForm.str_line,
  782.     TAG_DONE);
  783.  
  784.  GF_SetGadgetAttrs (formGUI, FP_FormSpecs[GID_FOPDATEMARGIN]->gs_Gadget,
  785.     GTIN_Number, localForms.userForm.date_margin,
  786.     TAG_DONE);
  787.  
  788.  GF_SetGadgetAttrs (formGUI, FP_FormSpecs[GID_FOPDATEWIDTH]->gs_Gadget,
  789.     GA_Disabled, TRUE,
  790.     GTIN_Number, localForms.userForm.date_width,
  791.     TAG_DONE);
  792.  
  793.  GF_SetGadgetAttrs (formGUI, FP_FormSpecs[GID_FOPDATELINE]->gs_Gadget,
  794.     GTIN_Number, localForms.userForm.date_line,
  795.     TAG_DONE);
  796.  
  797.  GF_SetGadgetAttrs (formGUI, FP_FormSpecs[GID_FOPAMNTMARGIN]->gs_Gadget,
  798.     GTIN_Number, localForms.userForm.amnt_margin,
  799.     TAG_DONE);
  800.  
  801.  GF_SetGadgetAttrs (formGUI, FP_FormSpecs[GID_FOPAMNTWIDTH]->gs_Gadget,
  802.     GTIN_Number, localForms.userForm.amnt_width,
  803.     TAG_DONE);
  804.  
  805.  GF_SetGadgetAttrs (formGUI, FP_FormSpecs[GID_FOPAMNTLINE]->gs_Gadget,
  806.     GTIN_Number, localForms.userForm.amnt_line,
  807.     TAG_DONE);
  808.  
  809.  GF_SetGadgetAttrs (formGUI, FP_FormSpecs[GID_FOPMEMOMARGIN]->gs_Gadget,
  810.     GTIN_Number, localForms.userForm.memo_margin,
  811.     TAG_DONE);
  812.  
  813.  GF_SetGadgetAttrs (formGUI, FP_FormSpecs[GID_FOPMEMOWIDTH]->gs_Gadget,
  814.     GTIN_Number, localForms.userForm.memo_width,
  815.     TAG_DONE);
  816.  
  817.  GF_SetGadgetAttrs (formGUI, FP_FormSpecs[GID_FOPMEMOLINE]->gs_Gadget,
  818.     GTIN_Number, localForms.userForm.memo_line,
  819.     TAG_DONE);
  820.  
  821.  GF_SetGadgetAttrs (formGUI, FP_FormSpecs[GID_FOPVOUCHERMARGIN]->gs_Gadget,
  822.     GTIN_Number, localForms.userForm.voucher_margin,
  823.     TAG_DONE);
  824.  
  825.  GF_SetGadgetAttrs (formGUI, FP_FormSpecs[GID_FOPVOUCHERWIDTH]->gs_Gadget,
  826.     GTIN_Number, localForms.userForm.voucher_width,
  827.     TAG_DONE);
  828.  
  829.  GF_SetGadgetAttrs (formGUI, FP_FormSpecs[GID_FOPVOUCHERTYPE]->gs_Gadget,
  830.     GTCY_Active, localForms.userForm.voucher_type,
  831.     TAG_DONE);
  832.  
  833.  GF_SetGadgetAttrs (formGUI, FP_FormSpecs[GID_FOPCHECKSPAGE]->gs_Gadget,
  834.     GTIN_Number, localForms.userForm.checks_page,
  835.     TAG_DONE);
  836.  
  837.  GF_SetGadgetAttrs (formGUI, FP_FormSpecs[GID_FOPCHECKLINES]->gs_Gadget,
  838.     GTIN_Number, localForms.userForm.lines_check,
  839.     TAG_DONE);
  840.  
  841.  GF_SetGadgetAttrs (formGUI, FP_FormSpecs[GID_FOPTOPLINES]->gs_Gadget,
  842.     GTIN_Number, localForms.userForm.top_lines,
  843.     TAG_DONE);
  844.  
  845.  GF_SetGadgetAttrs (formGUI, FP_FormSpecs[GID_FOPCOLS]->gs_Gadget,
  846.     GTIN_Number, localForms.userForm.columns,
  847.     TAG_DONE);
  848.  
  849.  /* disable voucher fields if needed */
  850.  if (localForms.userForm.voucher_type == VT_LEFTRIGHT)
  851.     dis = FALSE;
  852.  
  853.  GF_SetGadgetAttrs (formGUI, FP_FormSpecs[GID_FOPVOUCHERMARGIN]->gs_Gadget,
  854.     GA_Disabled, dis,
  855.     TAG_DONE);
  856.  
  857.  GF_SetGadgetAttrs (formGUI, FP_FormSpecs[GID_FOPVOUCHERWIDTH]->gs_Gadget,
  858.     GA_Disabled, dis,
  859.     TAG_DONE);
  860. }
  861.  
  862. /****************************************************************
  863. * FormTestPrint()
  864. *
  865. *    Test-print a form 
  866. *****************************************************************/
  867. void FormTestPrint(void)
  868. {
  869.  int bogus = 1;
  870.  FILE *out;
  871.  BOOL fail = FALSE;
  872.  entryNode entry;
  873.  filterNode filt;
  874.  UBYTE decim = usrAccount.decimal;
  875.  
  876.  strcpy(entry.name,"PAYEE FIELD");
  877.  strcpy(entry.memo,"MEMO FIELD");
  878.  strcpy(entry.category,"CATEGORY");
  879.  entry.flags = CLEARED | TAXDEDUCT | RECONCILED;
  880.  entry.type = CHECKTYPE;
  881.  entry.check = 1;
  882.  entry.amount = 12345;
  883.  memcpy(&entry.date,&currDate,sizeof(dateType));
  884.  
  885.  filt.entry = &entry;
  886.  
  887.  
  888.  /* now open the check device */
  889.  if ( (out = fopen(localForms.device,"w")) == NULL) {
  890.     AmiAnnounce("Device Failure.\nCannot open device.");
  891.     return;
  892.  }
  893.  
  894.  GF_LockGUI(formGUI);
  895.  
  896.  usrAccount.decimal = 2;
  897.  
  898.  checkImage = PrintCheckAlloc(&localForms.userForm);
  899.  if (checkImage) {
  900.      fail = !PrintItem(out,&filt,&localForms, TRUE,TRUE, &bogus);
  901.     free (checkImage);
  902.  }
  903.  else AmiAnnounce("Cannot allocate RAM for check print\n");
  904.  
  905.  usrAccount.decimal = decim;
  906.  
  907.  GF_UnlockGUI(formGUI);
  908.  fclose(out);
  909.  
  910.  if (fail) 
  911.     AmiAnnounce("Printer failure.\nOperation cancelled.");
  912.  
  913. }
  914.  
  915. /*********************************************************
  916. * FormCheckField()
  917. *
  918. *    Validates user input
  919. **********************************************************/
  920. BOOL FormCheckField(ULONG margin, ULONG width, ULONG line, char *resp)
  921. {
  922.  ULONG lines = localForms.userForm.lines_check;
  923.  
  924.  /* check line */
  925.  if (line + 1 > lines) {
  926.     strcpy(resp,"Field on illegal line.\n");
  927.     return (FALSE);
  928.  }
  929.  
  930.  /* check width */
  931.  if (width > MAXCHECKCOLS - margin) {
  932.     strcpy(resp,"Field too wide or margin off.\n");
  933.     return (FALSE);
  934.  }
  935.  
  936.  /* check stupid width */
  937.  if (width < 5) {
  938.     strcpy(resp,"Field width too small.\n");
  939.     return (FALSE);
  940.  }
  941.  
  942.  /* check against items too large */
  943.  if (width > MAXCHECKCOLS) {
  944.     strcpy(resp,"Field width too large.\n");
  945.     return (FALSE);
  946.  }
  947.  
  948.  /* this should never happen, but... */
  949.  if (margin > MAXCHECKCOLS) {
  950.     strcpy(resp,"Field margin too far to right.\n");
  951.     return (FALSE);
  952.  }
  953.  
  954.  return (TRUE);
  955. }
  956.  
  957. /*******************************************************
  958. * FormGoodbye()
  959. *
  960. *     Verifies user input before accepting an OK
  961. *    _or_ a TEST.
  962. ********************************************************/
  963. BOOL FormGoodbye(struct IntuiMessage *imsg)
  964. {
  965.  ULONG val;
  966.  char resp[STRINGSIZE];
  967.  
  968.  val = (UWORD)((struct StringInfo*)(FP_FormSpecs[GID_FOPCHECKLINES]->gs_Gadget)->SpecialInfo)->LongInt;
  969.  if (val > outofbounds.lines_check) {
  970.     DisplayBeep(myWin->WScreen);
  971.     DataAnnounce(formGUI, "Lines/Check Value too large");
  972.     GF_ReplyIMsg(imsg);
  973.     DataSitNSpin(FP_FormSpecs[GID_FOPCHECKLINES]->gs_Gadget,myWin);
  974.     return (FALSE);
  975.  }
  976.  else localForms.userForm.lines_check = val;
  977.  
  978.  val = (UWORD)((struct StringInfo*)(FP_FormSpecs[GID_FOPCOLS]->gs_Gadget)->SpecialInfo)->LongInt;
  979.  if (val > outofbounds.columns || val < 20) {
  980.     DisplayBeep(myWin->WScreen);
  981.     DataAnnounce(formGUI, "Columns value too large/small");
  982.     GF_ReplyIMsg(imsg);
  983.     DataSitNSpin(FP_FormSpecs[GID_FOPCOLS]->gs_Gadget,myWin);
  984.     return (FALSE);
  985.  }
  986.  else localForms.userForm.columns = val; 
  987.  
  988.  val = (UWORD)((struct StringInfo*)(FP_FormSpecs[GID_FOPCHECKSPAGE]->gs_Gadget)->SpecialInfo)->LongInt;
  989.  if (val > outofbounds.checks_page) {
  990.     DisplayBeep(myWin->WScreen);
  991.     DataAnnounce(formGUI, "Checks/Page Value too large");
  992.     GF_ReplyIMsg(imsg);
  993.     DataSitNSpin(FP_FormSpecs[GID_FOPCHECKSPAGE]->gs_Gadget,myWin);
  994.     return (FALSE);
  995.  }
  996.  else localForms.userForm.checks_page = val;
  997.     
  998.  /* grab all payfield data */
  999.  localForms.userForm.pay_margin = 
  1000.         (UWORD)((struct StringInfo*)(FP_FormSpecs[GID_FOPPAYMARGIN]->gs_Gadget)->SpecialInfo)->LongInt;
  1001.  localForms.userForm.pay_width = 
  1002.         (UWORD)((struct StringInfo*)(FP_FormSpecs[GID_FOPPAYWIDTH]->gs_Gadget)->SpecialInfo)->LongInt;
  1003.  localForms.userForm.pay_line = 
  1004.         (UWORD)((struct StringInfo*)(FP_FormSpecs[GID_FOPPAYLINE]->gs_Gadget)->SpecialInfo)->LongInt;
  1005.  
  1006.  if (!FormCheckField(localForms.userForm.pay_margin,localForms.userForm.pay_width,localForms.userForm.pay_line,resp)) {
  1007.     DisplayBeep(myWin->WScreen);
  1008.     DataAnnounce(formGUI, "Payee field illegal.");
  1009.     GF_ReplyIMsg(imsg);
  1010.     DataSitNSpin(FP_FormSpecs[GID_FOPPAYMARGIN]->gs_Gadget,myWin);
  1011.     return (FALSE);
  1012.  }
  1013.  
  1014.  /* grab all memo data */
  1015.  localForms.userForm.memo_margin = 
  1016.         (UWORD)((struct StringInfo*)(FP_FormSpecs[GID_FOPMEMOMARGIN]->gs_Gadget)->SpecialInfo)->LongInt;
  1017.  localForms.userForm.memo_width = 
  1018.         (UWORD)((struct StringInfo*)(FP_FormSpecs[GID_FOPMEMOWIDTH]->gs_Gadget)->SpecialInfo)->LongInt;
  1019.  localForms.userForm.memo_line = 
  1020.         (UWORD)((struct StringInfo*)(FP_FormSpecs[GID_FOPMEMOLINE]->gs_Gadget)->SpecialInfo)->LongInt;
  1021.  
  1022.  if (!FormCheckField(localForms.userForm.memo_margin,localForms.userForm.memo_width,localForms.userForm.memo_line,resp)) {
  1023.     DisplayBeep(myWin->WScreen);
  1024.     DataAnnounce(formGUI, "Memo field illegal.");
  1025.     GF_ReplyIMsg(imsg);
  1026.     DataSitNSpin(FP_FormSpecs[GID_FOPMEMOMARGIN]->gs_Gadget,myWin);
  1027.     return (FALSE);
  1028.  }
  1029.  
  1030.  /* grab all amntstr stuff */
  1031.  localForms.userForm.str_margin = 
  1032.         (UWORD)((struct StringInfo*)(FP_FormSpecs[GID_FOPSTRMARGIN]->gs_Gadget)->SpecialInfo)->LongInt;
  1033.  localForms.userForm.str_width = 
  1034.         (UWORD)((struct StringInfo*)(FP_FormSpecs[GID_FOPSTRWIDTH]->gs_Gadget)->SpecialInfo)->LongInt;
  1035.  localForms.userForm.str_line = 
  1036.         (UWORD)((struct StringInfo*)(FP_FormSpecs[GID_FOPSTRLINE]->gs_Gadget)->SpecialInfo)->LongInt;
  1037.  
  1038.  if (!FormCheckField(localForms.userForm.str_margin,localForms.userForm.str_width,localForms.userForm.str_line,resp)) {
  1039.     DisplayBeep(myWin->WScreen);
  1040.     DataAnnounce(formGUI, "Amount string field illegal.");
  1041.     GF_ReplyIMsg(imsg);
  1042.     DataSitNSpin(FP_FormSpecs[GID_FOPSTRMARGIN]->gs_Gadget,myWin);
  1043.     return (FALSE);
  1044.  }
  1045.  
  1046.  /* grab all date stuff */
  1047.  localForms.userForm.date_margin = 
  1048.         (UWORD)((struct StringInfo*)(FP_FormSpecs[GID_FOPDATEMARGIN]->gs_Gadget)->SpecialInfo)->LongInt;
  1049.  localForms.userForm.date_width = 
  1050.         (UWORD)((struct StringInfo*)(FP_FormSpecs[GID_FOPDATEWIDTH]->gs_Gadget)->SpecialInfo)->LongInt;
  1051.  localForms.userForm.date_line = 
  1052.         (UWORD)((struct StringInfo*)(FP_FormSpecs[GID_FOPDATELINE]->gs_Gadget)->SpecialInfo)->LongInt;
  1053.  
  1054.  if (!FormCheckField(localForms.userForm.date_margin,localForms.userForm.date_width,localForms.userForm.date_line,resp)) {
  1055.     DisplayBeep(myWin->WScreen);
  1056.     DataAnnounce(formGUI, "Date field illegal.");
  1057.     GF_ReplyIMsg(imsg);
  1058.     DataSitNSpin(FP_FormSpecs[GID_FOPDATEMARGIN]->gs_Gadget,myWin);
  1059.     return (FALSE);
  1060.  }
  1061.  
  1062.  /* grab all amnt stuff */
  1063.  localForms.userForm.amnt_margin = 
  1064.         (UWORD)((struct StringInfo*)(FP_FormSpecs[GID_FOPAMNTMARGIN]->gs_Gadget)->SpecialInfo)->LongInt;
  1065.  localForms.userForm.amnt_width = 
  1066.         (UWORD)((struct StringInfo*)(FP_FormSpecs[GID_FOPAMNTWIDTH]->gs_Gadget)->SpecialInfo)->LongInt;
  1067.  localForms.userForm.amnt_line = 
  1068.         (UWORD)((struct StringInfo*)(FP_FormSpecs[GID_FOPAMNTLINE]->gs_Gadget)->SpecialInfo)->LongInt;
  1069.  
  1070.  if (!FormCheckField(localForms.userForm.amnt_margin,localForms.userForm.amnt_width,localForms.userForm.amnt_line,resp)) {
  1071.     DisplayBeep(myWin->WScreen);
  1072.     DataAnnounce(formGUI, "Amount field illegal.");
  1073.     GF_ReplyIMsg(imsg);
  1074.     DataSitNSpin(FP_FormSpecs[GID_FOPAMNTMARGIN]->gs_Gadget,myWin);
  1075.     return (FALSE);
  1076.  }
  1077.  
  1078.  /* test top lines field */    
  1079.  localForms.userForm.top_lines = 
  1080.         (UWORD)((struct StringInfo*)(FP_FormSpecs[GID_FOPTOPLINES]->gs_Gadget)->SpecialInfo)->LongInt;
  1081.  if (localForms.userForm.top_lines > outofbounds.top_lines) {
  1082.             DisplayBeep(myWin->WScreen);
  1083.             DataAnnounce(formGUI, "Top Lines: Value too large");
  1084.             GF_ReplyIMsg(imsg);
  1085.             DataSitNSpin(FP_FormSpecs[GID_FOPTOPLINES]->gs_Gadget,myWin);
  1086.              return (FALSE);
  1087.  }
  1088.  
  1089.  /* verify voucher stuff */
  1090.  localForms.userForm.voucher_margin = 
  1091.         (UWORD)((struct StringInfo*)(FP_FormSpecs[GID_FOPVOUCHERMARGIN]->gs_Gadget)->SpecialInfo)->LongInt;
  1092.  localForms.userForm.voucher_width = 
  1093.         (UWORD)((struct StringInfo*)(FP_FormSpecs[GID_FOPVOUCHERWIDTH]->gs_Gadget)->SpecialInfo)->LongInt;
  1094.  
  1095.  if (localForms.userForm.voucher_type) {
  1096.      if (localForms.userForm.voucher_margin > outofbounds.voucher_margin ||
  1097.                  localForms.userForm.voucher_width > outofbounds.voucher_width) {
  1098.         DisplayBeep(myWin->WScreen);
  1099.         DataAnnounce(formGUI, "Voucher field: illegal width or margin");
  1100.         GF_ReplyIMsg(imsg);
  1101.         DataSitNSpin(FP_FormSpecs[GID_FOPAMNTMARGIN]->gs_Gadget,myWin);
  1102.         return (FALSE);
  1103.     }
  1104.  }
  1105.  
  1106.  /* grab file device */
  1107.  strcpy(localForms.device, 
  1108.     ((struct StringInfo *)(FP_FormSpecs[GID_FOPDEVICE]->gs_Gadget)->SpecialInfo)->Buffer);
  1109.  
  1110.  return (TRUE);
  1111. }
  1112.