home *** CD-ROM | disk | FTP | other *** search
/ Amiga Times / AmigaTimes.iso / sonstiges / tools / amiCheck / Source / amiCheck.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-10-06  |  93.8 KB  |  3,747 lines

  1. /************** AMICHECK main driver ****************/
  2.  
  3. /* Include everything */
  4. #define INTUI_V36_NAMES_ONLY
  5. #include <dos.h>  /* let us use the WBarg stuff */
  6. #include <stdio.h>
  7. #include <proto/dos.h>
  8. #include <proto/exec.h>
  9. #include <intuition/gadgetclass.h>
  10. #include <clib/intuition_protos.h>
  11. #include <clib/graphics_protos.h>
  12. #include <devices/inputevent.h>
  13. #include <clib/keymap_protos.h>
  14. #include <string.h>
  15. #include <clib/asl_protos.h>
  16. #include <libraries/asl.h>
  17. #include <fcntl.h>
  18. #include <clib/icon_protos.h>
  19. #include <intuition/pointerclass.h>
  20. #include <intuition/classusr.h>
  21. #include <clib/utility_protos.h>
  22.  
  23. #include <dos/dostags.h>
  24.  
  25. #include "amiCheck.h"
  26. #include "mainPanel.h"
  27. #include "regGadget.h"
  28. #include "libraries.h"
  29. #include "enterPanel.h"
  30. #include "seltempPanel.h"
  31. #include "dataBase.h"
  32. #include "edittempPanel.h"
  33. #include "filterPanel.h"
  34. #include "sortPanel.h"
  35. #include "acctPanel.h"
  36. #include "reconcilePanel.h"
  37. #include "searchPanel.h"
  38. #include "categoryPanel.h"
  39. #include "statsPanel.h"
  40. #include "newtempPanel.h"
  41. #include "reportPanel.h"
  42. #include "scriptPanel.h"
  43. #include "analysisPanel.h"
  44. #include "formPanel.h"
  45. #include "netPanel.h"
  46. #include "qdatePanel.h"
  47. #include "qmemoPanel.h"
  48. #include "memoPanel.h"
  49. #include "namePanel.h"
  50. #include "amntPanel.h"
  51. #include "qnamePanel.h"
  52. #include "qamntPanel.h"
  53. #include "impexp.h"
  54. #include "printPanel.h"
  55. #include "groupPanel.h"
  56. #include "arexx.h"
  57. #include "keyPanel.h"
  58. #include "budgetPanel.h"
  59.  
  60. AMIGAGUIDECONTEXT agc = NULL;
  61. struct NewAmigaGuide newAG = {NULL};
  62.  
  63. static const char *VersionString = "\0$VER:" ACVERSION " " __AMIGADATE__;
  64.  
  65. STRPTR AC_AppID       = "amiCheck";
  66.  
  67. STRPTR AC_Version     = ACVERSION,
  68.        AC_LongDesc    = "Checkbook Software",
  69.        AC_Author      = "Douglas M. Dyer",
  70.     AC_Date          = __AMIGADATE__;
  71.  
  72. STRPTR AC_WindowTitle = "amiCheck";
  73.  
  74. #if 0
  75. #ifdef AC020
  76. STRPTR AC_Title        = "amiCheck '020 " ACVERSION " " __AMIGADATE__;
  77. #else
  78. #ifdef EVALUATION
  79. STRPTR AC_Title        = "amiCheck " ACVERSION " [limit 30 entries/account] " __AMIGADATE__;
  80. #else
  81. STRPTR AC_Title        = "amiCheck " ACVERSION " " __AMIGADATE__;
  82. #endif
  83. #endif
  84. #endif
  85.  
  86. STRPTR AC_Title        = "amiCheck " ACVERSION " " __AMIGADATE__;
  87. STRPTR AC_Demo         = "The unregistered version is\nlimited to 30 entries.\n\nPlease see the documents for \nregistration information. Thanks!";
  88.     
  89. #define DEFAULT_FILEPATTERN    "#?.AC"
  90. #define DEFAULT_IMPORTPATTERN    "#?.txt"
  91. #define DEFAULT_SCRIPTPATTERN    "#?.ACscript"
  92. #define DEFAULT_NETPATTERN    "#?.ACnet"
  93.  
  94. /* Library bases */
  95. struct Library *GUIFrontBase;
  96.  
  97. /* Imported from the main panel module */
  98.  
  99. extern STRPTR AC_Version,
  100.               AC_LongDesc,
  101.               AC_Author,
  102.               AC_Date;
  103.  
  104. extern STRPTR AC_WindowTitle;
  105. extern STRPTR AC_AppID;
  106.  
  107. extern AC_InitialOrientation;
  108.  
  109. /* globals */
  110. char currStr[AMNTSIZE+1];
  111. char stateStr[AMNTSIZE+1];
  112. char filtStr[AMNTSIZE+1];
  113. char filePattern[FILEPATTERN_SIZE];
  114. char importPattern[FILEPATTERN_SIZE];
  115. char scriptPattern[FILEPATTERN_SIZE];
  116. char netPattern[FILEPATTERN_SIZE];
  117.  
  118. /* global help links */
  119. __far char *guideLinks[] = {
  120.     "LINK MAIN_PANEL",
  121.     "LINK SELTEMP_PANEL",
  122.     "LINK NEWTEMP_PANEL",
  123.     "LINK EDITTEMP_PANEL",
  124.     "LINK FILTER_PANEL",
  125.     "LINK SORT_PANEL",
  126.     "LINK ANALYSIS_PANEL",
  127.     "LINK FORMS_PANEL",
  128.     "LINK ENTRY_PANEL",
  129.     "LINK RECONCILE_PANEL",
  130.     "LINK ACCOUNT_PANEL",
  131.     "LINK SEARCH_PANEL",
  132.     "LINK CAT_PANEL",
  133.     "LINK STATS_PANEL",
  134.     "LINK REPORT_PANEL",
  135.     "LINK SCRIPT_PANEL",
  136.     "LINK QUICKMEMO_PANEL",
  137.     "LINK QUICKDATE_PANEL",
  138.     "LINK QUICKNAME_PANEL",
  139.     "LINK QUICKAMNT_PANEL",
  140.     "LINK MEMO_PANEL",
  141.     "LINK AMNT_PANEL",
  142.     "LINK NAME_PANEL",
  143.     "LINK NET_PANEL",
  144.     "LINK PRINT_PANEL",
  145.     "LINK GROUP_PANEL",
  146.     "LINK AREXX_PANEL",
  147.     "LINK KEY_PANEL",
  148.    };
  149.  
  150. usrkey dummykey = {0,NULL,""};
  151. UBYTE dclicktype = 0;
  152. BOOL amigaguide = FALSE;
  153. BOOL bootfile = FALSE;
  154. BOOL layoutwarn = TRUE;
  155. BOOL batchmode = FALSE;
  156. GUIFrontApp *guiapp;
  157. GUIFront *gui;
  158. ExtErrorData exterr;
  159. struct InputEvent ie;
  160. struct Menu *menuStrip = NULL;
  161. extern BOOL skipped;
  162. char currFile[FILESIZE] = "";
  163. char currNode[FILESIZE];
  164. char *iconPath = "PROGDIR:AC_Icons/";
  165. char *guidePath = "PROGDIR:documents/amiCheck.guide";
  166. char arexxTemp[FILESIZE];
  167. BOOL autosort = FALSE;
  168. BOOL alldisabled=FALSE;
  169. BOOL seldone = FALSE;
  170. BOOL simpleRefresh = FALSE;
  171. ULONG amiAslHeight = 200L;
  172.  
  173. char amiWindowTitle[100];
  174. char *quitstr = "Are you sure you want to quit amiCheck?\nAll changes to the current account will be lost.";
  175. char *newstr =  "Are you sure you want to start a new account?\nAll changes to the current account will be lost.";
  176. char *openstr = "Are you sure you want to open an account?\nAll changes to the current account will be lost.";
  177. BOOL FALLBACK = FALSE;
  178.  
  179. struct NewMenu amiMenu[] =
  180. {
  181.  {NM_TITLE, "File",         0,0,0,0,},
  182.  {NM_ITEM, "New...",        "N",0,0,0,},
  183.  {NM_ITEM, NM_BARLABEL,     0,0,0,0,},
  184.  {NM_ITEM, "Open...",         "O", 0,0,0,},
  185.  {NM_ITEM, "Save",            "S", 0,0,0,},
  186.  {NM_ITEM, "Save and Exit",    "X", 0,0,0,},
  187.  {NM_ITEM, "Save As...",     "A",0,0,0,},
  188.  {NM_ITEM, NM_BARLABEL,        0,0,0,0,},
  189.  {NM_ITEM, "Import",        0,0,0,0,},
  190.  {NM_SUB,  "Ascii Format...",    0,0,0,0,},
  191.  {NM_ITEM, "Export",        0,0,0,0,},
  192.  {NM_SUB,  "Ascii Format...",    0,0,0,0,},
  193.  {NM_ITEM, NM_BARLABEL,     0,0,0,0,},
  194.  {NM_ITEM, "Reconcile...",    ";",0,0,0,},    
  195.  {NM_ITEM, NM_BARLABEL,     0,0,0,0,},
  196.  {NM_ITEM, "Print Checks...",     "P",0,0,0,},
  197.  {NM_ITEM, NM_BARLABEL,     0,0,0,0,},
  198.  {NM_ITEM, "About",         0,0,0,0,},
  199.  {NM_SUB,  "Third Parties...",    0,0,0,0,},
  200.  {NM_SUB,  "amiCheck...",    0,0,0,0,},
  201.  {NM_ITEM,  "Register...",    0,0,0,0,},
  202.  {NM_ITEM, NM_BARLABEL,     0,0,0,0,},
  203.  {NM_ITEM, "Quit",         "Q",0,0,0,},
  204.  
  205.  
  206.  {NM_TITLE, "Search",        0,0,0,0,},
  207.  {NM_ITEM, "Search...",        "[",0,0,0,},
  208.  {NM_ITEM, "Search Again",    "]",0,0,0,},
  209.  {NM_ITEM, NM_BARLABEL,        0,0,0,0,},
  210.  {NM_ITEM, "Jump to Selected",    "J",NM_ITEMDISABLED,0,0,},
  211.  
  212.  {NM_TITLE, "Edit",         0,0,0,0,},
  213.  {NM_ITEM, "Quick Transaction", 0,0,0,0,},
  214.  {NM_SUB, "Check...",         "C",0,0,0,},
  215.  {NM_SUB, "Withdrawal...",     "W",0,0,0,},
  216.  {NM_SUB, "Deposit...",     "D",0,0,0,},
  217.  {NM_SUB, "Script...",         "P",0,0,0,},
  218.  {NM_SUB, "Use Template...",    "U",0,0,0,},
  219.  {NM_ITEM, "Duplicate Entry...","E",0,0,0,},
  220.  {NM_ITEM, "Batch Mode",     "B", CHECKIT | MENUTOGGLE,0,0,},
  221.  {NM_ITEM, NM_BARLABEL,        0,0,0,0,},
  222.  {NM_ITEM, "Clear",        "/",NM_ITEMDISABLED,0,0,},
  223.  {NM_ITEM, "Unclear",        "\\",NM_ITEMDISABLED,0,0,},
  224.  {NM_ITEM, NM_BARLABEL,     0,0,0,0,},
  225.  {NM_ITEM, "Apply Order...",    0,0,0,0,},
  226.  {NM_ITEM, "Move Entry",    0,NM_ITEMDISABLED,0,0,},
  227.  {NM_ITEM, "Unfilter Item",    "L",NM_ITEMDISABLED,0,0,},
  228.  {NM_ITEM, "Range Actions",    0,NM_ITEMDISABLED,0,0,},
  229.  {NM_SUB, "Clear All...",    0,0,0,0,},
  230.  {NM_SUB, "Unclear All...",    0,0,0,0,},
  231.  {NM_SUB, NM_BARLABEL,         0,0,0,0,},
  232.  {NM_SUB, "Mark All Deducible...",    0,0,0,0,},
  233.  {NM_SUB, "Mark All Non-Deductible...",    0,0,0,0,},
  234.  {NM_SUB, "Mark All Printed...",0,0,0,0,},
  235.  {NM_SUB, "Mark All Unprinted...",    0,0,0,0,},
  236.  {NM_SUB, NM_BARLABEL,         0,0,0,0,},
  237.  {NM_SUB, "Void All...",    0,0,0,0,},
  238.  {NM_SUB, "Unvoid All...",    0,0,0,0,},
  239.  {NM_SUB, NM_BARLABEL,         0,0,0,0,},
  240.  {NM_SUB, "Remove All...",    0,0,0,0,},
  241.  
  242.  {NM_ITEM, NM_BARLABEL,        0,0,0,0,},
  243.  {NM_ITEM, "Account Info...",    "I",0,0,0,},
  244.  {NM_ITEM, "Quick Data",     0,0,0,0,},
  245.  {NM_SUB, "Memo Editor...",     0,0,0,0,},
  246.  {NM_SUB, "Payee Editor...",     0,0,0,0,},
  247.  {NM_SUB, "Amounts Editor...",     0,0,0,0,},
  248.  
  249.  
  250.  {NM_TITLE, "Utility",        0,0,0,0,},
  251.  {NM_ITEM, "Report Generator...",    "R",0,0,0,},
  252.  {NM_ITEM, NM_BARLABEL,     0,0,0,0,},
  253.  {NM_ITEM, "Script Editor...",    0,0,0,0,},
  254.  {NM_ITEM, NM_BARLABEL,     0,0,0,0,},
  255.  {NM_ITEM, "Net Worth...",    "T",0,0,0,},
  256.  
  257.  {NM_TITLE, "ARexx",        0,NM_ITEMDISABLED,0,0,},
  258.  {NM_ITEM, "Assign Macros...",    "M",0,0,0,},
  259.  {NM_ITEM, NM_BARLABEL,     0,0,0,0,},
  260.  {NM_ITEM, arexxMacros[0].macroname,     "1",0,0,0,},
  261.  {NM_ITEM, arexxMacros[1].macroname,     "2",0,0,0,},
  262.  {NM_ITEM, arexxMacros[2].macroname,    "3",0,0,0,},
  263.  {NM_ITEM, arexxMacros[3].macroname,     "4",0,0,0,},
  264.  {NM_ITEM, arexxMacros[4].macroname,     "5",0,0,0,},
  265.  {NM_ITEM, arexxMacros[5].macroname,     "6",0,0,0,},
  266.  {NM_ITEM, arexxMacros[6].macroname,     "7",0,0,0,},
  267.  {NM_ITEM, arexxMacros[7].macroname,     "8",0,0,0,},
  268.  {NM_ITEM, arexxMacros[8].macroname,     "9",0,0,0,},
  269.  {NM_ITEM, arexxMacros[9].macroname,     "0",0,0,0,},
  270.  {NM_ITEM, "Other...",     0,0,0,0,},
  271.  
  272. #if 0
  273.  {NM_ITEM, NM_BARLABEL,     0,0,0,0,},
  274.  {NM_ITEM, "Start Recording",     0,NM_ITEMDISABLED,0,0,},
  275.  {NM_ITEM, "Stop Recording...",    0,NM_ITEMDISABLED,0,0,},
  276. #endif
  277.  {NM_ITEM, NM_BARLABEL,     0,NM_ITEMDISABLED,0,0,},
  278.  {NM_ITEM, "Open CommandShell",    0,0,0,0,},
  279.  {NM_ITEM, "Close CommandShell",0,0,0,0,},
  280.  
  281.  
  282.  {NM_TITLE, "Preferences",    0,0,0,0,},
  283.  {NM_ITEM, "Window",        0,0,0,0,},
  284.  {NM_SUB, "Show Memos",        "=",CHECKIT | MENUTOGGLE,0,0,},
  285.  {NM_ITEM, "Double Click",    0,0,0,0,},
  286.  {NM_SUB, "Edit Transaction",    0,CHECKIT | MENUTOGGLE, ~1,0,},
  287.  {NM_SUB, "Toggle Clear",    0,CHECKIT | MENUTOGGLE, ~2,0,},
  288.  {NM_SUB, "Unfilter",        0,CHECKIT | MENUTOGGLE, ~4,0,},
  289.  {NM_ITEM, "Date Format",    0,0,0,0,},
  290.  {NM_SUB, "12/31/99",        0,CHECKIT | MENUTOGGLE, ~1,0,},
  291.  {NM_SUB, "31/12/99",        0,CHECKIT | MENUTOGGLE, ~2,0,},
  292.  {NM_SUB, "DEC-31-99",        0,CHECKIT | MENUTOGGLE, ~4,0,},
  293.  {NM_SUB, "31-DEC-99",        0,CHECKIT | MENUTOGGLE, ~8,0,},
  294.  {NM_ITEM, NM_BARLABEL,     0,0,0,0,},
  295.  {NM_ITEM, "Check Forms...",    "F",0,0,0,},
  296.  
  297.  {NM_END, NULL, 0,0,0,0,},
  298. };
  299.  
  300. /* "flexible" menu arrangement aid */
  301. #define FILETITLE    0
  302. #define SEARCHTITLE    1
  303. #define EDITTITLE    2
  304. #define UTILITYTITLE    3
  305. #define AREXXTITLE    4
  306. #define PREFSTITLE    5
  307.  
  308. #define FILENEW        0
  309. #define FILEOPEN    2
  310. #define FILESAVE    3
  311. #define FILESAVEEXIT    4
  312. #define FILESAVEAS    5
  313. #define FILEIMPORT    7
  314. #define FILEEXPORT    8
  315. #define FILERECON    10
  316. #define FILEPRINT    12
  317. #define FILEABOUT    14
  318. #define FILEABOUTAC    1
  319. #define FILEABOUTPART    0
  320. #define FILEREGISTER    15
  321. #define FILEQUIT    17
  322.  
  323. #define FILEIMPASCII    0
  324. #define FILEEXPASCII    0
  325.  
  326. #define SEARCHSEARCH    0
  327. #define SEARCHAGAIN    1
  328. #define SEARCHJUMP    3
  329.  
  330. #define EDITQUICK    0
  331. #define EDITQCHECK    0
  332. #define EDITQWITHDRAWAL    1
  333. #define EDITQDEPOSIT    2
  334. #define EDITQSCRIPT    3
  335. #define EDITQTEMPLATE    4
  336. #define EDITDUPLICATE    1
  337. #define EDITBATCH    2
  338. #define EDITCLEAR    4
  339. #define EDITUNCLEAR    5
  340. #define EDITAPPLYSORT    7
  341. #define EDITMOVE    8
  342. #define EDITUNFILT    9
  343. #define EDITRANGE    10
  344. #define EDITRANGECLR    0
  345. #define EDITRANGEUCL    1
  346. #define EDITRANGEDED    3
  347. #define EDITRANGEUND    4
  348. #define EDITRANGEPR    5
  349. #define EDITRANGEUPR    6
  350. #define EDITRANGEVD    8
  351. #define EDITRANGEUVD    9
  352. #define EDITRANGERM    11
  353. #define EDITACCT    12
  354. #define EDITDATA    13
  355. #define EDITDMEMO    0
  356. #define EDITDNAME    1
  357. #define EDITDAMNT    2
  358.  
  359.  
  360. #define UTILITYREPORT    0
  361. #define UTILITYSCRIPT    2
  362. #define UTILITYNET    4
  363.  
  364. #define AREXXASSIGN    0
  365. #define AREXXM1        2
  366. #define AREXXM2        3
  367. #define AREXXM3        4
  368. #define AREXXM4        5
  369. #define AREXXM5        6
  370. #define AREXXM6        7
  371. #define AREXXM7        8
  372. #define AREXXM8        9
  373. #define AREXXM9        10
  374. #define AREXXM10    11
  375. #define AREXXOTHER    12
  376.  
  377. #if 0
  378. #define AREXXBEGINREC    14
  379. #define AREXXENDREC    15
  380. #endif
  381.  
  382. #define AREXXOPENCMD    14
  383. #define AREXXCLOSECMD    15
  384.  
  385.  
  386. #define PREFSWINDOW    0
  387. #define PREFSWINDOWMEMO    0
  388. #define PREFSDCLICK    1
  389. #define PREFSDCLICKE    0
  390. #define PREFSDCLICKC    1
  391. #define PREFSDCLICKU    2
  392. #define PREFSDATE    2
  393. #define PREFSDATE1    0
  394. #define PREFSDATE2    1
  395. #define PREFSDATE3    2
  396. #define PREFSDATE4    3
  397. #define PREFSFORM    4
  398.  
  399. static BOOL dokey;
  400.  
  401. UWORD __chip busyPointer37[] =
  402. {
  403.     0x0000,0x0000,
  404.  
  405.     0x0400,0x07c0,
  406.     0x0000,0x07c0,
  407.     0x0100,0x0380,
  408.     0x0000,0x07e0,
  409.     0x07c0,0x1ff8,
  410.     0x1ff0,0x3fec,
  411.     0x3ff8,0x7fde,
  412.     0x3ff8,0x7fbe,
  413.     0x7ffc,0xff7f,
  414.     0x7efc,0xffff,
  415.     0x7ffc,0xffff,
  416.     0x3ff8,0x7ffe,
  417.     0x3ff8,0x7ffe,
  418.     0x1ff0,0x3ffc,
  419.     0x07c0,0x1ff8,
  420.     0x0000,0x07e0,
  421.  
  422.     0x0000,0x0000,
  423. };
  424.  
  425. UWORD __chip movePointer37[] =
  426. {
  427.     0x0000,0x0000,
  428.  
  429.     0x0180,0x0180,
  430.     0x0f80,0x0e00,
  431.     0xfffc,0xf07c,
  432.     0x7ffc,0x8000,
  433.     0x0f80,0xf07c,
  434.     0x0180,0x0e00,
  435.     0x0000,0x0180,
  436.  
  437.     0x0000,0x0000,
  438. };
  439.  
  440. UWORD __chip movePointer39[2][7] = {
  441. {
  442.     0x0180,
  443.     0x0f80,
  444.     0xfffc,
  445.     0x7ffc,
  446.     0x0f80,
  447.     0x0180,
  448.     0x0000,
  449. },
  450. {
  451.     0x0180,
  452.     0x0e00,
  453.     0xf07c,
  454.     0x8000,
  455.     0xf07c,
  456.     0x0e00,
  457.     0x0180,
  458. },
  459. };
  460.  
  461. struct BitMap ptrBM;
  462. APTR moveObj;
  463. BOOL OS39 = TRUE, moveActive = FALSE;
  464. filterNode *moveNode;
  465. WORD moveRow = -1;
  466.  
  467. BOOL amidone;
  468.  
  469. struct TagItem *aslTagList;
  470.  
  471. struct TagItem scriptloadtags[] =
  472. {
  473.     ASL_Hail, (ULONG)"Select Script File:",
  474.     ASL_File, (ULONG)"",
  475.     ASL_Dir, (ULONG)"PROGDIR:macros",
  476.     ASL_Pattern, (ULONG)scriptPattern, /*"#?.ACscript",*/
  477.     ASL_FuncFlags, FILF_PATGAD,
  478.     TAG_DONE,
  479. };
  480.  
  481. struct TagItem scriptsavetags[] =
  482. {
  483.     ASL_Hail, (ULONG)"Save Script As:",
  484.     ASL_File, (ULONG)"untitled.ACscript",
  485.     ASL_Pattern,(ULONG)"~(#?.info)",
  486.     ASL_FuncFlags,    FILF_SAVE,
  487.     ASL_Dir, (ULONG)"PROGDIR:macros",
  488.     TAG_DONE,
  489. };
  490.  
  491. struct TagItem rexxtags[] =
  492. {
  493.     ASL_Hail, (ULONG)"Select ARexx Macro:",
  494.     ASL_File, (ULONG)"",
  495.     ASL_FuncFlags, FILF_PATGAD,
  496.     ASL_Dir, (ULONG)"PROGDIR:macros",
  497.     TAG_DONE,
  498. };
  499.  
  500. struct TagItem loadtags[] =
  501. {
  502.     ASL_Hail, (ULONG)"Open Account:",
  503.     ASL_File, (ULONG)"",
  504.     ASL_Pattern,(ULONG)filePattern, /*"#?.AC",*/
  505.     ASL_FuncFlags, FILF_PATGAD,
  506.     ASL_Dir, (ULONG)"PROGDIR:",
  507.     TAG_DONE,
  508. };
  509.  
  510. struct TagItem savetags[] =
  511. {
  512.     ASL_Hail, (ULONG)"Save Account As:",
  513.     ASL_File, (ULONG)"untitled.AC",
  514.     ASL_Pattern,(ULONG)"~(#?.info)",
  515.     ASL_Dir, (ULONG)"PROGDIR:",
  516.     ASL_FuncFlags,    FILF_SAVE,
  517.     TAG_DONE,
  518. };
  519.  
  520. struct TagItem impasciitags[] =
  521. {
  522.     ASL_Hail, (ULONG)"Import ASCII:",
  523.     ASL_File, (ULONG)"",
  524.     ASL_Pattern,(ULONG)importPattern, /*"#?.txt",*/
  525.     ASL_FuncFlags, FILF_PATGAD,
  526.     ASL_Dir, (ULONG)"PROGDIR:",
  527.     TAG_DONE,
  528. };
  529.  
  530. STRPTR *demoptr;
  531.  
  532. struct TagItem expasciitags[] =
  533. {
  534.     ASL_Hail, (ULONG)"Export Filter as ASCII:",
  535.     ASL_File, (ULONG)"untitled.txt",
  536.     ASL_Pattern,(ULONG)"~(#?.info)",
  537.     ASL_Dir, (ULONG)"PROGDIR:",
  538.     ASL_FuncFlags,    FILF_SAVE,
  539.     TAG_DONE,
  540. };
  541.  
  542. struct TagItem devtags[] =
  543. {
  544.     ASL_Hail, (ULONG)"Select Output Device:",
  545.     /*ASL_File, (ULONG)"",*/
  546.     ASL_Pattern,(ULONG)"~(#?.info)",
  547.     /*ASL_Dir, (ULONG)"PROGDIR:",*/
  548.     ASL_FuncFlags,    FILF_SAVE,
  549.     TAG_DONE,
  550. };
  551.  
  552. struct TagItem reporttags[] = {
  553.     ASL_Hail, (ULONG)"Save Report To:",
  554.     ASL_File, (ULONG)"untitled.ACreport",
  555.     ASL_Pattern,(ULONG)"#?.ACreport",
  556.     ASL_Dir, (ULONG)"PROGDIR:",
  557.     ASL_FuncFlags,    FILF_SAVE,
  558.     TAG_DONE,
  559. };
  560.  
  561.  
  562. struct TagItem netloadtags[] =
  563. {
  564.     ASL_Hail, (ULONG)"Select Summary  File:",
  565.     ASL_File, (ULONG)"",
  566.     ASL_Pattern, (ULONG)netPattern, /*"#?.ACnet",*/
  567.     ASL_Dir, (ULONG)"PROGDIR:",
  568.     ASL_FuncFlags, FILF_PATGAD,
  569.     TAG_DONE,
  570. };
  571.  
  572. struct TagItem netsavetags[] =
  573. {
  574.     ASL_Hail, (ULONG)"Save Summary As:",
  575.     ASL_File, (ULONG)"untitled.ACnet",
  576.     ASL_Pattern,(ULONG)"#?.ACnet",
  577.     ASL_Dir, (ULONG)"PROGDIR:",
  578.     ASL_FuncFlags,    FILF_SAVE,
  579.     TAG_DONE,
  580. };
  581.  
  582. struct Window *amiWindow;
  583. struct FileRequester *impasciiASL = NULL, *expasciiASL = NULL;
  584. struct FileRequester *scriptASL = NULL, *devASL = NULL, *reportASL = NULL;
  585. struct FileRequester *loadASL = NULL, *scriptsaveASL = NULL;
  586. struct FileRequester *saveASL = NULL, *netloadASL = NULL, *netsaveASL = NULL;
  587. struct FileRequester *otherRexxASL = NULL;
  588.  
  589. /* prototypes */
  590. BOOL AmiInit(void);
  591. void AmiShutdown(void);
  592. void AmiSetupMemo(void);
  593. void AmiHandleGadget(struct IntuiMessage *);
  594. void AmiHandleScript(void);
  595. void AmiEditEntry(void);
  596. void AmiProcessRawkeys(struct IntuiMessage *);
  597. void AmiRangeMark(long);
  598. BOOL AmiHandleMenu(struct IntuiMessage *);
  599. BOOL AmiAsk(char *);
  600. void AmiAbout(void);
  601. void AmiAboutPart(void);
  602. void AmiHandleGadgetDown(struct IntuiMessage *);
  603. void AmiSearchFail(void);
  604. BOOL AmiCountVerify(void);
  605. BOOL AmiAllocRequesters(void);
  606. void AmiResetBals(void);
  607. void AmiDisableAll(BOOL);
  608. void AmiParseCmd(int, char **);
  609. BOOL AmiOpenGUI(void);
  610. void AmiCloseGUI(void);
  611. void AmiMoveRestore(void);
  612. void AmiMoveActive(void);
  613. void AmiCheckRenumber(char,long);
  614. void AmiLocalMsg(struct IntuiMessage *);
  615. void AmiSetupDclick(void);
  616. void AmiSetupDate(void);
  617. void AmiDuplicateEntry(void);
  618. void AmiToggleClear(void);
  619. void AmiArexxMenu(void);
  620. void AmiApplySort(void);
  621. LONG AmiBaseHelp(void);
  622. void AmiBaseLink(char *);
  623. void AmiHelpMsg(void);
  624. void AmiRunMacro(char *fname);
  625.  
  626. /* Code */
  627. /*********************************************************************************/
  628. main(int argc, char **argv)
  629.  ULONG signal, sigmask;
  630.  
  631.  seltempGUI = edittempGUI = newGUI = filterGUI = sortGUI = analGUI = formGUI = NULL;
  632.  entryGUI = recGUI = acctGUI =  searchGUI = catGUI = statGUI = repGUI = scriptGUI = NULL;
  633.  qdateGUI = qmemoGUI = qamntGUI = qnameGUI = memoGUI = amntGUI = nameGUI = netGUI = NULL;
  634.  printGUI = groupGUI = arexxGUI = keyGUI = NULL;
  635.  
  636.  
  637.    /* support either command or tooltypes or wbench */
  638.     if (argc == 0) {
  639.         argc = _WBArgc;
  640.         argv = _WBArgv;
  641.     }
  642.  
  643.     AmiParseCmd(argc,argv);
  644.  
  645.     sprintf(amiWindowTitle,AC_WindowTitle);
  646.     ptrKey = &usrKey;
  647.  
  648.     /* Attempt to open library */ 
  649.     if (GUIFrontBase = OpenLibrary(GUIFRONTNAME, GUIFRONTVERSION))
  650.     {
  651.         /* Create our application anchor structure */
  652.  
  653.         if (guiapp = GF_CreateGUIApp(AC_AppID,
  654.             GFA_Version,    AC_Version,
  655.             GFA_LongDesc,   AC_LongDesc,
  656.             GFA_Author,     AC_Author,
  657.             GFA_Date,       AC_Date,
  658.             TAG_DONE))
  659.         {
  660.               
  661.             /* Create a gui for our application */
  662.        TRYLABEL:
  663.             if (gui = GF_CreateGUI(guiapp, AC_MainPanel,AC_MainSpecs,
  664.                 GUI_InitialOrientation, AC_InitialOrientation,
  665.                 GUI_ExtendedError,      &exterr,
  666.                 GUI_WindowTitle,        amiWindowTitle,
  667.                 GUI_OpenGUI,            TRUE,
  668.                 GUI_ExtraIDCMP,         IDCMP_RAWKEY|IDCMP_ACTIVEWINDOW|IDCMP_REFRESHWINDOW,
  669.         GUI_NewMenu,        amiMenu,
  670.         GUI_ScreenTitle,    AC_Title,
  671.                 TAG_DONE))
  672.             {
  673.                 amidone = FALSE;
  674.         
  675.                DataListInit();
  676.            
  677.             /* initialize application interface */
  678.             if (!amidone && AmiInit() != TRUE) amidone = TRUE;
  679.  
  680.         if (AmigaGuideBase != NULL) {
  681.             amigaguide = TRUE;
  682.             AmiBaseHelp();
  683.         }
  684.  
  685.             AmiLock();
  686.         KeyVerify(ptrKey);
  687.  
  688.         /* open panels */
  689.         if (!amidone && AmiOpenGUI() != TRUE) amidone = TRUE;
  690.         if (!amidone && DataInit() != TRUE) amidone = TRUE;
  691.         if (!amidone && AnalysisSetup() != TRUE) amidone = TRUE;
  692.          
  693.         if (!amidone) GF_GetGUIAttr(gui,GUI_MenuStrip, &menuStrip, TAG_DONE);
  694.         if (menuStrip == NULL) amidone = TRUE;
  695.  
  696.         KeyVerify(&dummykey);
  697.  
  698.         if (!amidone && EasyRexxBase != NULL) {
  699.             if (axOpen() == FALSE) amidone = TRUE;
  700.             sigmask = ER_SIGNAL(axContext);
  701.             OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,NOITEM,NOSUB));
  702.             sprintf(arexxTemp,"T:%s",axContext->portname);
  703.         }
  704.         else     { 
  705.             sigmask = 0;
  706.             axContext = NULL;
  707.             OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,NOITEM,NOSUB));
  708.         }
  709.  
  710. /*        GF_SetAliasKey(gui,0x40,GID_GETSELTYPE);*/
  711.  
  712.         AmiArexxMenu();
  713.  
  714.         demoptr = &AC_Demo;
  715.  
  716.         if (!amidone && bootfile) 
  717.             AmiOpen(currFile,TRUE);
  718.  
  719.         /* set up showMenu check */
  720.         if (!amidone) AmiSetupMemo();
  721.  
  722.         if (!amidone) AmiSetupDclick();
  723.     
  724.         if (!amidone) AmiSetupDate();
  725.  
  726.         AmiUnlock();
  727.                 
  728.         if (amidone)     {
  729.             AmiAnnounce("Failed to initialize application:\nTry a smaller font?\nTry more overscan?\nTry a proportional font (ie:helvetica)?");
  730.         }
  731.         else if (FALLBACK && layoutwarn)
  732.             AmiAnnounce("Font did not fit properly:\nCompromised window layout.\n(cosmetic warning only)");
  733.  
  734.  
  735.         if (!dokey) AmiAnnounce(*demoptr);
  736.  
  737.         /* Process input events */
  738.                 while (!amidone || (axContext && ER_SAFETOQUIT(axContext)==FALSE))
  739.                 {
  740.                     struct IntuiMessage *imsg;
  741.  
  742.                     /* Wait for an event to occur */
  743.  
  744.                     signal = GF_Wait(guiapp,ER_SIGNAL(axContext) | AmigaGuideSignal(agc));
  745.  
  746.             /* AREXX message? */
  747.             ER_SETSIGNALS(axContext,signal);
  748.             if (signal & ER_SIGNAL(axContext)) {
  749.             amidone = axHandle(axContext);
  750.             continue;
  751.             }
  752.  
  753.             /* Amigaguide message? */
  754.             else if (signal & AmigaGuideSignal(agc)) {
  755.             AmiHelpMsg();
  756.             continue;
  757.             }
  758.             
  759.                     /* We only bother to listen for CLOSEWINDOW events.
  760.                      * Of course, in a real application, you would be
  761.                      * examining the Class field for IDCMP_GADGETUP
  762.                      * messages and act accordingly.
  763.                      */
  764.  
  765.                     while (imsg = GF_GetIMsg(guiapp))
  766.                     {    
  767.             if (imsg->IDCMPWindow->UserData == seltempGUI) {
  768.                 if (selWin != NULL) 
  769.                     seldone = SelTempMsg(imsg);
  770.             }
  771.             else    if (imsg->IDCMPWindow->UserData == gui) {
  772.                 AmiLocalMsg(imsg);                                  
  773.             }
  774.  
  775.                         GF_ReplyIMsg(imsg);
  776.                     }
  777.  
  778.             if (seldone == TRUE) {
  779.             GF_SetGUIAttr(seltempGUI, GUI_OpenGUI, FALSE, TAG_DONE);
  780.             selWin = NULL;
  781.             seldone = FALSE;
  782.             }
  783.                 }
  784.  
  785.                 /* We're done with the GUI, so free it. GF_DestroyGUIApp
  786.                  * actually does this for us, but it still looks nicer if
  787.                  * we do it manually (I think :-)
  788.                  */
  789.         AmiLock();
  790.         if (amigaguide && agc) CloseAmigaGuide(agc);
  791.         DataFreeAll();    
  792.             AmiShutdown();
  793.         AmiUnlock();
  794.         if (EasyRexxBase != NULL) {
  795.             axClose();
  796.             remove(arexxTemp);
  797.         }
  798.             GF_DestroyGUI(gui);
  799.         LibClose();
  800.             }
  801.             else {
  802.                 Printf("Unable to create GUI (Error data: %ld.%ld)\n", exterr.ee_ErrorCode, exterr.ee_ErrorData);
  803.         
  804.         /* attempt to fall back */
  805.         if (AC_MainPanel[21] == GUILF_EqualShare) {
  806.             AC_MainPanel[21] = GUILF_PropShare;
  807.             FALLBACK = TRUE;
  808.             goto TRYLABEL;
  809.         }
  810.         }
  811.  
  812.             /* Destroy application anchor structure */
  813.             GF_DestroyGUIApp(guiapp);
  814.         }
  815.         else
  816.             PutStr("Unable to open guifront.library\n");
  817.  
  818.         CloseLibrary(GUIFrontBase);
  819.     }
  820.     else
  821.         PutStr("Requires guifront.library V37+\n");
  822.  
  823. }
  824.  
  825. /**********************************************************
  826. * AmiLocalMsg()
  827. *
  828. *    Handles messages from afar
  829. ***********************************************************/
  830. void AmiLocalMsg(struct IntuiMessage *imsg)
  831. {
  832.     switch (imsg->Class) {
  833.                                        
  834.                            case IDCMP_RAWKEY:
  835.                     AmiProcessRawkeys(imsg);
  836.                     break;
  837.  
  838.                case IDCMP_MENUPICK:
  839.                     amidone = AmiHandleMenu(imsg);
  840.                     break;
  841.  
  842.                            case IDCMP_GADGETDOWN:
  843.                     AmiHandleGadgetDown(imsg);
  844.                     break;
  845.                                         
  846.                case IDCMP_MOUSEMOVE:
  847.                     RegMoveList(&filtered,imsg->Code);
  848.                     RegRefresh(FALSE);
  849.                     break;
  850.  
  851.                            case IDCMP_CLOSEWINDOW:
  852.                                         amidone = AmiAsk(quitstr);
  853.                     break;
  854.                               
  855.                            case IDCMP_GADGETUP:
  856.                     AmiHandleGadget(imsg);
  857.                                         break;
  858.                                    
  859.                case IDCMP_REFRESHWINDOW:
  860.                     RegRefresh(TRUE);
  861.                     break;
  862.      
  863.                            default:
  864.                                         RegRefresh(TRUE);
  865.                                         break;                                           
  866.                         }
  867. }
  868.  
  869. /**********************************************************
  870. * AmiInit()
  871. *
  872. *    Initialize basic variables and images
  873. ***********************************************************/
  874. BOOL AmiInit(void)
  875. {
  876.  char buffer[50];
  877.  PrefsHandle *ph;
  878.  
  879.     OS39 = TRUE;
  880.         if (LibOpen(39L) != TRUE) {
  881.         if (LibOpen(37L) != TRUE)
  882.             return (FALSE);
  883.         OS39 = FALSE;    
  884.     }
  885.  
  886.     GF_GetGUIAttr(gui,GUI_Window,&amiWindow,TAG_DONE);
  887.  
  888.         if (RegInit() != TRUE) return (FALSE);
  889.     if (AmiAllocRequesters() != TRUE) return (FALSE);
  890.  
  891.     GF_LockPrefsList();
  892.         for (ph = GF_FirstPrefsNode(); ph != NULL; ph = GF_NextPrefsNode(ph)) {
  893.             GF_CopyAppID(ph,buffer);
  894.             if (strcmpi(buffer,AC_AppID) == 0)
  895.                 break;
  896.         }
  897.         if (ph == NULL)
  898.             buffer[0]=0;
  899.  
  900.         GF_GetPrefsAttr (buffer,
  901.             PRF_SimpleRefresh, &simpleRefresh,
  902.             TAG_DONE);
  903.  
  904.     GF_UnlockPrefsList();
  905.     
  906.     if (simpleRefresh)
  907.         simpleRefresh = TRUE;
  908.  
  909.  
  910.     /* otherwise, */
  911.     AmiDisableAll(TRUE);        
  912.  
  913.      dokey = KeyReadFile();
  914.  
  915.   if (OS39) {
  916.     InitBitMap(&ptrBM,2,16,7);
  917.     ptrBM.Planes[0] = (char *)movePointer39[0];
  918.     ptrBM.Planes[1] = (char *)movePointer39[1];
  919.     moveObj = NewObject(NULL,POINTERCLASS,
  920.         POINTERA_XOffset,0,
  921.         POINTERA_YOffset,-3,
  922.         POINTERA_XResolution, POINTERXRESN_HIRES,
  923.         POINTERA_YResolution, POINTERYRESN_HIGHASPECT,
  924.         POINTERA_BitMap, &ptrBM,
  925.         TAG_DONE);
  926.   }
  927.     
  928.         return (TRUE);
  929. }
  930.  
  931. /**********************************************************
  932. * AmiShutdown()
  933. *
  934. *    Quitting the application
  935. **********************************************************/
  936. void AmiShutdown(void) 
  937. {
  938.     if (OS39) {
  939.         /*printf("os39 specifics\n");*/
  940.         DisposeObject(moveObj);
  941.     }
  942.  
  943.     AmiCloseGUI();
  944.     if (scriptASL) FreeAslRequest(scriptASL);
  945.     if (loadASL) FreeAslRequest(loadASL);
  946.      if (saveASL) FreeAslRequest(saveASL);
  947.      if (impasciiASL) FreeAslRequest(impasciiASL);
  948.      if (expasciiASL) FreeAslRequest(expasciiASL);
  949.     if (otherRexxASL) FreeAslRequest(otherRexxASL);
  950.  
  951.     if (aslTagList) FreeTagItems(aslTagList);
  952.  
  953.     RegFreeAll();
  954.     AnalysisFree();
  955. }
  956.  
  957. /*********************************************************
  958. * AmiHandleGadget()
  959. *
  960. *    Handle gadget activity of this panel
  961. **********************************************************/
  962. void AmiHandleGadget( struct IntuiMessage *imsg)
  963. {
  964.  struct Gadget *gad = (struct Gadget *)(imsg->IAddress);
  965.  /*UWORD code = imsg->Code; */
  966.  
  967.  if (moveActive)
  968.     AmiMoveRestore();
  969.  
  970.  switch (gad->GadgetID) {
  971.  
  972.     case GID_ANALYSIS:
  973.         if (AnalysisGUI())
  974.             AmiDisableSel(FALSE);
  975.         break;
  976.  
  977.     case GID_SORT:
  978.         if (SortGUI() == TRUE) {
  979.             AmiLock();
  980.             /*DataRebuildFilters();*/
  981.             if (!IsListEmpty(&sortfields))
  982.                 DataSortFilter((filterNode *)filtered.mlh_Head,
  983.                            (filterNode *)filtered.mlh_TailPred,
  984.                            (sortNode *)sortfields.lh_Head);
  985.             else DataRebuildFilters();
  986.             RegNewFilter();
  987.             AmiUnlock();
  988.         }
  989.         break;
  990.  
  991.     case GID_GETSELTYPE:
  992.         SelTempGUI();
  993.         AmiNewTemp();
  994.         break;
  995.  
  996.     case GID_STATS:
  997.         StatGUI();
  998.         break;
  999.  
  1000.     case GID_BUDGET:
  1001.         CatGUI();
  1002.         break;
  1003.  
  1004.     case GID_NEWTYPE:
  1005.         EditTempGUI();
  1006.         
  1007.         /* update type field */
  1008.         AmiNewTemp();
  1009.         break;
  1010.  
  1011.     case GID_FILTER:
  1012.         if (FilterGUI() == TRUE) {
  1013.             AmiLock();
  1014.             memcpy(&filterControl, &currFilter, sizeof(filterSetting));
  1015.             DataRebuildFilters();
  1016.             if (autosort == TRUE && !IsListEmpty(&sortfields))
  1017.                 DataSortFilter((filterNode *)filtered.mlh_Head,
  1018.                            (filterNode *)filtered.mlh_TailPred,
  1019.                            (sortNode *)sortfields.lh_Head);
  1020.             RegNewFilter();
  1021.             DataFilterBalance(&filtered);
  1022.             DataBuildBal(usrAccount.decimal,&filtAmnt,filtStr);
  1023.             AmiUpdateFilt(filtStr);
  1024.             AmiUnlock();
  1025.         }
  1026.         break;
  1027.  
  1028.     case GID_EDIT:
  1029.         AmiEditEntry();
  1030.         break;
  1031.  
  1032. #if 0
  1033.     case GID_RECONCILE:
  1034.         ReconcileGUI();
  1035.         break;
  1036. #endif
  1037.  
  1038.      }
  1039. }
  1040.  
  1041. /******************************************************************
  1042. * AmiEnterData()
  1043. *
  1044. *    Called by seltemp
  1045. *******************************************************************/
  1046. void AmiEnterData(void)
  1047. {
  1048.  entryNode *entry;
  1049.  filterNode *filt;
  1050.  BOOL del;
  1051.  
  1052. if (entryCount >= 30)
  1053.     if (AmiCountVerify()) return;
  1054. #ifdef EVALUATION
  1055.         if (entryCount >= 30) {
  1056.             AmiAnnounce("You have met or exceeded the evaluation\nlimit of 30 entries.\n\nPlease see the documents for registration information.\nThanks!");
  1057.             return;
  1058.         }
  1059. #endif
  1060.         if (amntState.currTemplate == SCRIPTTYPE) 
  1061.             AmiHandleScript();
  1062.         else do {
  1063.             entry = EntryGUI("Enter New Transaction",FALSE, NULL, &del);
  1064.             if (entry != NULL) {
  1065.                 DataAddEntry(entry,&entries, &filt);
  1066.                             
  1067.                 /* update curr balance */
  1068.                 if (!(entry->flags & VOIDED)) {
  1069.                     DataUpdateBal(entry->type, &entry->amount,
  1070.                         &amntState.currAmnt,currStr);
  1071.                     AmiUpdateCurr(currStr);
  1072.                 }
  1073.         
  1074.                 if (filt != NULL) {
  1075.                     RegAddEntry(filt);
  1076.                     if ( !(entry->flags & VOIDED)) {
  1077.                         DataUpdateBal(entry->type, &entry->amount,
  1078.                             &filtAmnt,filtStr);
  1079.                         AmiUpdateFilt(filtStr);
  1080.                     }
  1081.                     AmiDisableSel(TRUE);
  1082.                 }
  1083.                 
  1084.                 memcpy(&currDate,&entry->date,sizeof(dateType));
  1085.                 currCentury = entry->date.year/100;
  1086.             }
  1087.         
  1088.         } while (entry != NULL && batchmode);
  1089.  
  1090.  return;
  1091. }
  1092.  
  1093. /*******************************************************************
  1094. * AmiHandleScript()
  1095. *
  1096. *    scripting engine
  1097. ********************************************************************/
  1098. void AmiHandleScript(void)
  1099. {
  1100. char fname[FILESIZE], line[FILESIZE];
  1101. FILE *scr;
  1102. BOOL del = FALSE;
  1103. entryNode *entry;
  1104. filterNode *filt;
  1105.  
  1106.  /* open requester */
  1107.  AmiLock();
  1108.  
  1109.  if (AmiGetFile(gui,scriptASL,fname,FILESIZE)) {
  1110.  
  1111.     if ( !(scr = fopen(fname,"r")) ) {
  1112.         AmiAnnounce("Could not open script file.");
  1113.         return;
  1114.      }
  1115.  
  1116.     /*while (fscanf(scr,"%s",line) != EOF) */
  1117.     while (fgets(line,FILESIZE-1,scr) != NULL) {
  1118.         /* remove \n */
  1119.         if (strlen(line)>0)
  1120.             line[strlen(line)-1]=0;
  1121.  
  1122.         amntState.currTemplate = DataNode2Ord(&templates,line);
  1123.         
  1124.         entry = EntryGUI("Enter New Transaction", TRUE, NULL, &del);
  1125.         if (entry != NULL && !skipped) {
  1126.             DataAddEntry(entry,&entries, &filt);
  1127.                 
  1128.             /* update curr balance */
  1129.             if (!(entry->flags & VOIDED)) {
  1130.                 DataUpdateBal(entry->type, &entry->amount,
  1131.                     &amntState.currAmnt, currStr);
  1132.                 AmiUpdateCurr(currStr);
  1133.             }
  1134.         
  1135.             if (filt != NULL) {
  1136.                 if ( !(entry->flags & VOIDED)) {
  1137.                     DataUpdateBal(entry->type, &entry->amount, 
  1138.                         &filtAmnt, filtStr);
  1139.                     AmiUpdateFilt(filtStr);
  1140.  
  1141.                 }
  1142.                 RegAddEntry(filt);
  1143.             }
  1144.  
  1145.             memcpy(&currDate,&entry->date,sizeof(dateType));
  1146.             currCentury = entry->date.year/100;
  1147.         }
  1148.     
  1149.         /* if enter data was canceled (not skipped), quit script */
  1150.         if (entry == NULL && !skipped)
  1151.             break;
  1152.     }
  1153.      /* close file */
  1154.     fclose(scr);
  1155.  
  1156.      /* return curr template to script type */
  1157.     amntState.currTemplate = SCRIPTTYPE;
  1158.  }
  1159.  AmiUnlock();
  1160.  
  1161. }
  1162.  
  1163. /*********************************************************************
  1164. * AmiNewTemp
  1165. *
  1166. *    Opens user template selection panel
  1167. *********************************************************************/
  1168. void AmiNewTemp(void)
  1169. {
  1170. templateNode *temp;
  1171.  
  1172.  /* update type field */
  1173.  temp = (templateNode *)DataOrd2Node(&templates,amntState.currTemplate);
  1174.  GF_SetGadgetAttrs(gui,gadgetspecs[GID_SELTYPE].gs_Gadget,
  1175.     GTTX_Text,temp->tempname,
  1176.       TAG_DONE);            
  1177. }
  1178.  
  1179. /*************************************************
  1180. * AmiProcessRawkeys
  1181. *
  1182. *    Process the rawkeys into ansi
  1183. **************************************************/
  1184. void AmiProcessRawkeys(struct IntuiMessage *imsg)
  1185. {
  1186. static BOOL upevent = FALSE;
  1187. static BOOL renum = FALSE;
  1188. static long upval;
  1189. static BOOL shift = FALSE, ctrl = FALSE;
  1190.  
  1191.  
  1192. if (moveActive)
  1193.     AmiMoveRestore();
  1194.  
  1195.  
  1196. /* check renumber scheme */
  1197. if (renum && upevent && imsg->Code > 0x0 && imsg->Code < 0xA){
  1198.     if (upval == (0x4f | 0x80)) {
  1199.         AmiCheckRenumber(0,imsg->Code);
  1200.     }
  1201.  
  1202.     else if (upval == (0x4e | 0x80)) {
  1203.         AmiCheckRenumber(1,imsg->Code);
  1204.     }
  1205.  
  1206.     renum = FALSE;
  1207.     return;
  1208. }
  1209.  
  1210. if (upevent && imsg->Code != upval)
  1211.     return;
  1212.  
  1213.  
  1214. upevent = FALSE;
  1215. renum = FALSE;
  1216.  
  1217. /* for now, use raw keys */
  1218. switch (imsg->Code) {
  1219.     case 0x40:    
  1220.         if (!alldisabled) {
  1221.             SelTempGUI();
  1222.             AmiNewTemp();
  1223.         }
  1224.         break;
  1225.  
  1226.     case 0xe1:
  1227.     case 0xe0:
  1228.         shift = FALSE;
  1229.         break;
  1230.  
  1231.     case 0x61:
  1232.     case 0x60:
  1233.         shift = TRUE;
  1234.         break;
  1235.  
  1236.     case 0xe3:
  1237.         ctrl = FALSE;
  1238.         break;
  1239.     
  1240.     case 0x63:
  1241.         ctrl = TRUE;
  1242.         break;
  1243.  
  1244.     case 0x4f:
  1245.         upevent = renum = TRUE;
  1246.         upval = imsg->Code | 0x80;
  1247.         break;
  1248.  
  1249.     case 0x4e:
  1250.         upevent = renum = TRUE;
  1251.         upval = imsg->Code | 0x80;
  1252.         break;
  1253.  
  1254.     case 0x4c:
  1255.  
  1256.         upevent = TRUE;
  1257.         upval = imsg->Code | 0x80;
  1258.         if (shift) 
  1259.             RegKeyScroll(SHIFTUP);
  1260.         else if (ctrl)
  1261.             RegKeyScroll(CTRLUP);
  1262.         else 
  1263.             RegKeyScroll(UP);
  1264.         break;
  1265.  
  1266.     case 0x4d:
  1267.         upevent = TRUE;
  1268.         upval = imsg->Code | 0x80;
  1269.  
  1270.         if (shift) 
  1271.             RegKeyScroll(SHIFTDOWN);
  1272.         else if (ctrl)
  1273.             RegKeyScroll(CTRLDOWN);
  1274.         else 
  1275.             RegKeyScroll(DOWN);
  1276.         break;
  1277.  
  1278.     case HELP_KEY:
  1279.         AmiBaseLink(guideLinks[MAIN_PANEL]);
  1280.         break;
  1281. }
  1282.  
  1283. #if 0
  1284. UBYTE buffer[9];
  1285. struct InputEvent ie;
  1286. APTR *eventptr;
  1287.  
  1288. ie.ie_Class = IECLASS_RAWKEY;
  1289. ie.ie_Code = imsg->Code;
  1290. ie.ie_Qualifier = imsg->Qualifier;
  1291. eventptr = imsg->IAddress;
  1292. ie.ie_EventAddress = *eventptr;
  1293.  
  1294. x=MapRawKey(&ie, buffer, 8, NULL); 
  1295. if (x == -1)
  1296.     return;
  1297. else if (x) {
  1298.     buffer[x]=0;
  1299.     printf("MAPS TO:[%s]:",buffer);
  1300.     for (y=0;y<x;y++)
  1301.         printf(" %x",buffer[y]);
  1302.     printf("\n");
  1303. }
  1304. #endif
  1305. }
  1306.  
  1307. /*******************************************************
  1308. * AmiDuplicateEntry()
  1309. *
  1310. *    Duplicate and edit current transaction
  1311. ********************************************************/
  1312. void AmiDuplicateEntry(void)
  1313. {
  1314.  filterNode *find, *filt;
  1315.  entryNode *entry, orig;
  1316.  BOOL del;
  1317.  
  1318.  find = (filterNode *)DataOrd2Node((struct List *)&filtered,selRow);
  1319.  if (find == NULL) return;
  1320.  memcpy(&orig,find->entry,sizeof(entryNode));
  1321.  
  1322.  /* raise panel */
  1323.  do {
  1324.     if (orig.type == CHECKTYPE)
  1325.         orig.check = amntState.currCheckNumber;
  1326.  
  1327.      entry = EntryGUI("Duplicated Transaction",FALSE,&orig, &del);
  1328.  
  1329.     if (entry != NULL) {
  1330.         DataAddEntry(entry,&entries, &filt);
  1331.                     
  1332.         /* update curr balance */
  1333.         if (!(entry->flags & VOIDED)) {
  1334.             DataUpdateBal(entry->type, &entry->amount, &amntState.currAmnt,currStr);
  1335.             AmiUpdateCurr(currStr);
  1336.         }
  1337.         
  1338.         if (filt != NULL) {
  1339.             RegAddEntry(filt);
  1340.             if ( !(entry->flags & VOIDED)) {
  1341.                 DataUpdateBal(entry->type, &entry->amount, &filtAmnt, filtStr);
  1342.                 AmiUpdateFilt(filtStr);
  1343.             }
  1344.             AmiDisableSel(TRUE);
  1345.         }
  1346.         
  1347.         memcpy(&currDate,&entry->date,sizeof(dateType));    
  1348.         memcpy(&orig.date,&entry->date,sizeof(dateType));
  1349.         currCentury = entry->date.year/100;
  1350.     }
  1351.         
  1352.  } while (entry != NULL && batchmode);
  1353. }
  1354.  
  1355. /*******************************************************
  1356. * AmiEditEntry()
  1357. *
  1358. *    Edits an entry by poping up entry panel
  1359. ********************************************************/
  1360. void AmiEditEntry(void)
  1361. {
  1362.  BOOL del;
  1363.  amountType amount;
  1364.  UBYTE type, flag;
  1365.  filterNode *find;
  1366.  entryNode *edit, *entry;
  1367.  
  1368.     find = (filterNode *)DataOrd2Node((struct List *)&filtered,selRow);
  1369.         edit = find->entry;
  1370.  
  1371.         /* lets remove its amount */
  1372.         amount = edit->amount;
  1373.         type = edit->type;
  1374.         flag = edit->flags;
  1375.  
  1376.         if ( !(flag & VOIDED) ) {
  1377.             if (edit->type != DEPOSITTYPE ) {
  1378.                 DataUpdateBal(DEPOSITTYPE,&edit->amount, &amntState.currAmnt,currStr);
  1379.                 DataUpdateBal(DEPOSITTYPE,&edit->amount, &filtAmnt, filtStr);
  1380.             }
  1381.             else {
  1382.                 DataUpdateBal(CHECKTYPE,&edit->amount,&amntState.currAmnt,currStr);
  1383.                 DataUpdateBal(CHECKTYPE,&edit->amount,&filtAmnt, filtStr);
  1384.             }
  1385.         }
  1386.         else amount = 0;
  1387.             
  1388.         /* raise panel */
  1389.         entry = EntryGUI("Edit Transaction",FALSE,edit, &del);
  1390.         if (entry != NULL ) {
  1391.             memcpy( ((char *)edit)+sizeof(struct MinNode),
  1392.                 ((char *)entry)+sizeof(struct MinNode),
  1393.                 sizeof(entryNode)-sizeof(struct MinNode));
  1394.  
  1395.             if (DataTestFilter(edit,&filterControl)) {
  1396.                 RegRedrawSel(find);
  1397.                 if ( !(edit->flags & VOIDED))
  1398.                     DataUpdateBal(type,&edit->amount, &filtAmnt, filtStr);
  1399.             }
  1400.         
  1401.             else {
  1402.                 DataRemoveFilter(find);
  1403.                 RegRemoveSel();
  1404.             }
  1405.  
  1406.             if ( !(edit->flags & VOIDED) )
  1407.                 DataUpdateBal(type,&edit->amount, &amntState.currAmnt, currStr);
  1408.  
  1409.             AmiUpdateCurr(currStr);
  1410.             AmiUpdateFilt(filtStr);
  1411.             
  1412.             memcpy(&currDate,&entry->date,sizeof(dateType));
  1413.             currCentury = entry->date.year/100;
  1414.         }
  1415.         else {
  1416.             if (del == TRUE) {
  1417.                 DataRemoveEntry(edit,find);
  1418.                 amiChangedItems = TRUE;
  1419.                 RegRemoveSel();
  1420.                 if ( !(flag & VOIDED) ) {
  1421.                     AmiUpdateCurr(currStr);
  1422.                     AmiUpdateFilt(filtStr);
  1423.                 }
  1424.             }
  1425.  
  1426.             else {
  1427.             /* oops, stick the old one back in! */
  1428.             if ( !(flag & VOIDED) )
  1429.                 DataUpdateBal(type,&amount, &amntState.currAmnt, currStr);
  1430.                 DataUpdateBal(type,&amount, &filtAmnt, filtStr);
  1431.             }
  1432.         }
  1433. }
  1434.  
  1435. /******************************************************
  1436. * AmiHandleMenu()
  1437. *
  1438. *    process menu selections
  1439. *******************************************************/
  1440. BOOL AmiHandleMenu(struct IntuiMessage *imsg)
  1441. {
  1442.  BOOL done = FALSE, donemenu = FALSE;
  1443.  UWORD menunum;
  1444.  UWORD row;
  1445.  UWORD title, item, sub;
  1446.  amountType amount;
  1447.  struct MenuItem *menu;
  1448.  char fname[FILESIZE+15];
  1449.  filterNode *filt;
  1450.  
  1451.   menunum = imsg->Code;
  1452.   while ( (menunum != MENUNULL) && (!donemenu) ) {
  1453.     menu  = ItemAddress(menuStrip,menunum);
  1454.       title = MENUNUM(menunum);
  1455.     item = ITEMNUM(menunum);
  1456.     sub = SUBNUM(menunum);
  1457.  
  1458.     if (title == FILETITLE) {
  1459.         AmiMoveRestore();
  1460.         switch (item) {
  1461.             case FILENEW:
  1462.                 if (AmiAsk(newstr)) {
  1463.                     
  1464.                     if (AcctGUI("New Account",TRUE) == TRUE) {
  1465.                         amntState.currTemplate = CHECKTYPE;
  1466.                         AmiNewTemp();
  1467.                         seldone = TRUE;
  1468.                         SelTempStrip();
  1469.  
  1470.                         AmiLock();
  1471.                         DataFreeAll();    
  1472.                         DataInit(); /* zeros out stuff! */
  1473.                         
  1474.  
  1475.                         AmiDisableSel(TRUE);
  1476.                         RegNewFilter();        
  1477.                         AmiArexxMenu();
  1478.  
  1479.                         memcpy(&usrAccount, &tempAcct, sizeof(accntState));
  1480.  
  1481.                         DataUpdateBal(DEPOSITTYPE,&usrAccount.beginAmount,
  1482.                             &amntState.currAmnt, currStr);
  1483.                         AmiUpdateCurr(currStr);
  1484.  
  1485.                         amntState.currCheckNumber = usrAccount.checknumber-1;
  1486.                         sprintf(currFile,"%s","untitled.AC");
  1487.                         sprintf(amiWindowTitle,"%s: %s",AC_WindowTitle,currFile);
  1488.                         SetWindowTitles(amiWindow,amiWindowTitle,(UBYTE *)-1);
  1489.                         AmiDisableAll(FALSE);
  1490.                         OffMenu(amiWindow,FULLMENUNUM(FILETITLE,FILESAVE,NOSUB));
  1491.                         OffMenu(amiWindow,FULLMENUNUM(FILETITLE,FILESAVEEXIT,NOSUB));
  1492.                         DataBuildBal(usrAccount.decimal,&amntState.currAmnt,currStr);
  1493.                         DataBuildBal(usrAccount.decimal,&amntState.stateAmnt,stateStr);
  1494.                         DataBuildBal(usrAccount.decimal,&filtAmnt,filtStr);
  1495.                         AmiUpdateCurr(currStr);
  1496.                         AmiUpdateState(stateStr);
  1497.                         AmiUpdateFilt(filtStr);
  1498.                         amiChangedItems = TRUE;
  1499.                         AmiUnlock();
  1500.                     }
  1501.                 }
  1502.                 break;
  1503.  
  1504.             case FILEOPEN:
  1505.                 AmiOpen(NULL,FALSE);
  1506.                 break;
  1507.             
  1508.             case FILESAVEEXIT:
  1509.                 if (AmiSave(NULL,FALSE))
  1510.                     done = TRUE;
  1511.                 break;
  1512.                 
  1513.             case FILESAVE:
  1514.                 AmiSave(NULL,FALSE);
  1515.                 break;
  1516.                 
  1517.             case FILESAVEAS:
  1518.                 AmiSave(NULL,TRUE);
  1519.                 break;
  1520.  
  1521.             case FILEPRINT:
  1522.                 PrintGUI();
  1523.                 break;
  1524.  
  1525.             case FILEIMPORT:
  1526.                 if (entryCount >= 30)
  1527.                     if (AmiCountVerify()) break;
  1528.  
  1529.                 switch (sub) {
  1530.                     case FILEIMPASCII:
  1531.                         
  1532.                         if (selRow == -1) {
  1533.                             if (!DataQuery(gui,"Items will be appended to\nthe bottom of the database.",
  1534.                                     "OK|Cancel")) {
  1535.                                 break;
  1536.                             }
  1537.                         }
  1538.                         else {
  1539.                             if (!DataQuery(gui,"Items will be appended under\nthe selected transaction.",
  1540.                                     "OK|Cancel")) {
  1541.                                 break;
  1542.                             }
  1543.                         }
  1544.  
  1545.                         AmiLock();
  1546.                         if (AmiGetFile(gui,impasciiASL,fname,FILESIZE)) {
  1547.                                 if (ImportAscii(fname) != TRUE)
  1548.                                     AmiAnnounce("Problem importing file.");
  1549.                         }
  1550.                         AmiUnlock();
  1551.  
  1552.                     break;
  1553.                 }
  1554.                 break;
  1555.  
  1556.             case FILEEXPORT:
  1557.                 switch (sub) {
  1558.                     case FILEEXPASCII:
  1559.                         AmiLock();
  1560.                         if (AmiGetFile(gui,expasciiASL,fname,FILESIZE)) {
  1561.                                 if (ExportAscii(fname) != TRUE)
  1562.                                     AmiAnnounce("Problem exporting file.");
  1563.                         }
  1564.                         AmiUnlock();
  1565.  
  1566.                         break;
  1567.                 }
  1568.                 break;
  1569.  
  1570.  
  1571.             case FILERECON:
  1572.                 ReconcileGUI();
  1573.                 break;
  1574.     
  1575.             case FILEABOUT:
  1576.                 switch (sub) {
  1577.                     case FILEABOUTAC:
  1578.                         AmiAbout();
  1579.                     break;
  1580.  
  1581.                     case FILEABOUTPART:
  1582.                         AmiAboutPart();
  1583.                     break;
  1584.                 }
  1585.                 break;
  1586.     
  1587.             case FILEREGISTER:
  1588.                 KeyGUI();
  1589.                 break;
  1590.  
  1591.             case FILEQUIT:
  1592.                 done = AmiAsk(quitstr);
  1593.                 break;
  1594.         }
  1595.     }
  1596.  
  1597.     else if (title == SEARCHTITLE) {
  1598.         AmiMoveRestore();
  1599.  
  1600.         switch (item) {
  1601.             case SEARCHSEARCH:
  1602.                 if (SearchGUI(&row)) {
  1603.                     row = DataSearchFilter(&filtered,&searchControl);
  1604.                     if (row == -1) {
  1605.                         /* announce to user of search failure */
  1606.                         AmiSearchFail();
  1607.                     }
  1608.                     else {
  1609.                         searchControl.lastrow = selRow = row;
  1610.                         RegMoveToSel(&filtered);
  1611.                         AmiDisableSel(FALSE);
  1612.                     }
  1613.                 }
  1614.                 break;
  1615.     
  1616.             case SEARCHAGAIN:
  1617.                 row = DataSearchFilter(&filtered,&searchControl);
  1618.                 if (row == -1) {
  1619.                     /* announce to user of search failure */
  1620.                     AmiSearchFail();    
  1621.                 }
  1622.                 else {
  1623.                     searchControl.lastrow = selRow = row;
  1624.                     RegMoveToSel(&filtered);
  1625.                 }
  1626.                 break;
  1627.  
  1628.             case SEARCHJUMP:
  1629.                 if (selRow != -1)
  1630.                     RegMoveToSel(&filtered);
  1631.                 break;
  1632.         }
  1633.     }
  1634.  
  1635.     else if (title == EDITTITLE) {
  1636.         switch (item) {
  1637.             case EDITDATA:
  1638.                 AmiMoveRestore();
  1639.                 switch (sub) {
  1640.                     case EDITDMEMO:
  1641.                         MemoGUI();
  1642.                         break;
  1643.  
  1644.                     case EDITDAMNT:
  1645.                         AmntGUI();
  1646.                         break;
  1647.  
  1648.                     case EDITDNAME:
  1649.                         NameGUI();
  1650.                         break;
  1651.                 }
  1652.                 break;
  1653.  
  1654.             case EDITQUICK:
  1655.                 AmiMoveRestore();
  1656.                 switch (sub) {
  1657.                     case EDITQCHECK:
  1658.                         amntState.currTemplate = CHECKTYPE;
  1659.                         AmiNewTemp();
  1660.                         AmiEnterData();
  1661.                         break;
  1662.  
  1663.                     case EDITQWITHDRAWAL:
  1664.                         amntState.currTemplate = WITHDRAWALTYPE;
  1665.                         AmiNewTemp();
  1666.                         AmiEnterData();
  1667.                         break;
  1668.  
  1669.                     case EDITQDEPOSIT:
  1670.                         amntState.currTemplate = DEPOSITTYPE;
  1671.                         /* update type field */
  1672.                         AmiNewTemp();
  1673.                         AmiEnterData();
  1674.                         break;
  1675.  
  1676.                     case EDITQTEMPLATE:
  1677.                         AmiEnterData();
  1678.                         break;
  1679.     
  1680.                     case EDITQSCRIPT:
  1681.                         amntState.currTemplate = SCRIPTTYPE;
  1682.                         AmiNewTemp();
  1683.                         AmiEnterData();
  1684.                         break;
  1685.                 }
  1686.                 break;
  1687.  
  1688.             case EDITBATCH:
  1689.                 AmiMoveRestore();
  1690.                 batchmode = !batchmode;
  1691.                 break;
  1692.  
  1693.             case EDITCLEAR:
  1694.                 AmiMoveRestore();
  1695.                 filt = (filterNode *)DataOrd2Node((struct List *)&filtered,selRow);
  1696.                 filt->entry->flags |= CLEARED;
  1697.  
  1698.                 amount = filt->entry->amount;
  1699.                 
  1700.                 if (DataTestFilter(filt->entry,&filterControl))
  1701.                     RegRedrawSel(filt);
  1702.                 else     {
  1703.                     if ( !(filt->entry->flags & VOIDED)) {
  1704.                         DataUpdateBal( 
  1705.                             (filt->entry->type==DEPOSITTYPE)?WITHDRAWALTYPE:DEPOSITTYPE,
  1706.                             &amount, &filtAmnt, filtStr);
  1707.                         AmiUpdateFilt(filtStr);
  1708.                     }
  1709.                     DataRemoveFilter(filt);
  1710.                     RegRemoveSel();
  1711.                 }
  1712.                 amiChangedItems = TRUE;
  1713.                 break;
  1714.     
  1715.             case EDITUNCLEAR:
  1716.                 AmiMoveRestore();
  1717.                 filt = (filterNode *)DataOrd2Node((struct List *)&filtered,selRow);
  1718.                 filt->entry->flags &= ~CLEARED;
  1719.  
  1720.                 amount = filt->entry->amount;
  1721.                 
  1722.                 if (DataTestFilter(filt->entry,&filterControl))
  1723.                     RegRedrawSel(filt);
  1724.                 else    {
  1725.                     if ( !(filt->entry->flags & VOIDED)) {
  1726.                         DataUpdateBal( 
  1727.                             (filt->entry->type==DEPOSITTYPE)?WITHDRAWALTYPE:DEPOSITTYPE,
  1728.                             &amount, &filtAmnt, filtStr);
  1729.                         AmiUpdateFilt(filtStr);
  1730.                     }
  1731.                     DataRemoveFilter(filt);
  1732.                     RegRemoveSel();
  1733.                 }
  1734.                 amiChangedItems = TRUE;
  1735.                 break;
  1736.  
  1737.             case EDITDUPLICATE:
  1738.                 AmiMoveRestore();
  1739.                 AmiDuplicateEntry();
  1740.                 break;
  1741.  
  1742.             case EDITMOVE:
  1743.                 if (moveActive) {
  1744.                     AmiMoveRestore();
  1745.                 }
  1746.                 else    {
  1747.                     ActivateWindow(amiWindow);
  1748.                     AmiMoveActive();
  1749.                 }
  1750.                 break;
  1751.  
  1752.             case EDITAPPLYSORT:
  1753.                 AmiApplySort();
  1754.                 break;
  1755.  
  1756.             case EDITUNFILT:
  1757.                 AmiMoveRestore();
  1758.                 AmiLock();
  1759.                 filt = (filterNode *)DataOrd2Node((struct List *)&filtered,selRow);
  1760.                 amount = filt->entry->amount;
  1761.                 if ( !(filt->entry->flags & VOIDED)) {
  1762.                     DataUpdateBal( 
  1763.                         (filt->entry->type==DEPOSITTYPE)?WITHDRAWALTYPE:DEPOSITTYPE,
  1764.                         &amount, &filtAmnt, filtStr);
  1765.                     AmiUpdateFilt(filtStr);
  1766.                 }
  1767.                 DataRemoveFilter(filt);
  1768.                 RegRemoveSel();
  1769.                 AmiUnlock();
  1770.                 break;
  1771.  
  1772.             case EDITRANGE:
  1773.                 AmiMoveRestore();
  1774.                 AmiRangeMark(sub);
  1775.                 break;
  1776.             
  1777.             case EDITACCT:
  1778.                 AmiMoveRestore();
  1779.                 if (AcctGUI("Account Information",FALSE) == TRUE) {
  1780.                     amount = 0;
  1781.                     DataUpdateBal(DEPOSITTYPE,&amount, 
  1782.                         &amntState.currAmnt,currStr);
  1783.                     AmiUpdateCurr(currStr);
  1784.                 }
  1785.                 break;
  1786.  
  1787.  
  1788.         }
  1789.     }
  1790.  
  1791.     else if (title == UTILITYTITLE) {
  1792.         AmiMoveRestore();
  1793.         switch (item) {
  1794.             case UTILITYREPORT:
  1795.                 ReportGUI();
  1796.                 break;
  1797.  
  1798.             case UTILITYSCRIPT:
  1799.                 ScriptGUI();
  1800.                 break;
  1801.  
  1802.             case UTILITYNET:
  1803.                 NetGUI();
  1804.                 break;
  1805.         }
  1806.     }
  1807.  
  1808.     else if (title == AREXXTITLE) {
  1809.         AmiMoveRestore();
  1810.         switch (item) {
  1811.             case AREXXASSIGN:
  1812.                 if (ArexxGUI())
  1813.                     AmiArexxMenu();
  1814.                 break;
  1815.     
  1816.             case AREXXM1:
  1817.                 AmiRunMacro(arexxMacros[0].macrofile);
  1818.                 break;
  1819.         
  1820.             case AREXXM2:
  1821.                 AmiRunMacro(arexxMacros[1].macrofile);        
  1822.                 break;
  1823.         
  1824.             case AREXXM3:
  1825.                 AmiRunMacro(arexxMacros[2].macrofile);        
  1826.                 break;
  1827.                     
  1828.             case AREXXM4:
  1829.                 AmiRunMacro(arexxMacros[3].macrofile);                        
  1830.                 break;
  1831.         
  1832.             case AREXXM5:
  1833.                 AmiRunMacro(arexxMacros[4].macrofile);                        
  1834.                 break;
  1835.  
  1836.             case AREXXM6:
  1837.                 AmiRunMacro(arexxMacros[5].macrofile);        
  1838.                 break;
  1839.  
  1840.             case AREXXM7:
  1841.                 AmiRunMacro(arexxMacros[6].macrofile);                
  1842.                 break;
  1843.  
  1844.             case AREXXM8:
  1845.                 AmiRunMacro(arexxMacros[7].macrofile);        
  1846.                 break;
  1847.         
  1848.             case AREXXM9:
  1849.                 AmiRunMacro(arexxMacros[8].macrofile);                
  1850.                 break;
  1851.         
  1852.             case AREXXM10:
  1853.                 AmiRunMacro(arexxMacros[9].macrofile);
  1854.                 break;
  1855.     
  1856.             case AREXXOTHER:
  1857.  
  1858.                 AmiLock();
  1859.                 if (AmiGetFile(gui,otherRexxASL,fname,FILESIZE)) {
  1860.                      AmiUnlock();
  1861.                     AmiRunMacro(fname);
  1862.                 }
  1863.                 else {
  1864.                     AmiUnlock();
  1865.                 }
  1866.  
  1867.                 break;
  1868.  
  1869. #if 0    
  1870.             case AREXXBEGINREC:
  1871.                 break;
  1872.     
  1873.             case AREXXENDREC:
  1874.                 break;
  1875. #endif
  1876.     
  1877.             case AREXXOPENCMD:
  1878.                 axOpenCmd();
  1879.                 break;
  1880.     
  1881.             case AREXXCLOSECMD:
  1882.                 axCloseCmd();
  1883.                 break;
  1884.         }
  1885.     }
  1886.  
  1887.     else if (title == PREFSTITLE) {
  1888.         AmiMoveRestore();
  1889.         switch (item) {
  1890.             case PREFSWINDOW:
  1891.                 switch (sub) {
  1892.                     case PREFSWINDOWMEMO:
  1893.                         RegSwapMemo();
  1894.                         break;
  1895.                 }
  1896.                 break;
  1897.  
  1898.             case PREFSDCLICK:
  1899.                 switch (sub) {
  1900.                     case PREFSDCLICKE:
  1901.                         dclicktype = 0;
  1902.                         break;
  1903.  
  1904.                     case PREFSDCLICKC:
  1905.                         dclicktype=1;
  1906.                         break;
  1907.     
  1908.                     case PREFSDCLICKU:
  1909.                         dclicktype=2;
  1910.                         break;
  1911.  
  1912.                 }
  1913.                 break;
  1914.  
  1915.             case PREFSDATE:
  1916.                 switch (sub) {
  1917.                     case PREFSDATE1:
  1918.                         dateFormat = DATE_MMDDYY;
  1919.                         RegResetOffsets(1);
  1920.                         RegRedrawFilter(0);
  1921.                         QDateNewFormat();
  1922.                         break;
  1923.                     case PREFSDATE2:
  1924.                         dateFormat = DATE_DDMMYY;
  1925.                         RegResetOffsets(1);
  1926.                         RegRedrawFilter(0);
  1927.                         QDateNewFormat();
  1928.                         break;
  1929.                     case PREFSDATE3:
  1930.                         dateFormat = DATE_DEC_12;
  1931.                         RegResetOffsets(1);
  1932.                         RegRedrawFilter(0);
  1933.                         QDateNewFormat();
  1934.                         break;
  1935.                     case PREFSDATE4:
  1936.                         dateFormat = DATE_12_DEC;
  1937.                         RegResetOffsets(1);
  1938.                         RegRedrawFilter(0);
  1939.                         QDateNewFormat();
  1940.                         break;
  1941.                 } 
  1942.                 break;
  1943.  
  1944.             case PREFSFORM:
  1945.                 FormGUI();
  1946.                 break;
  1947.         }
  1948.     }
  1949.  
  1950.     menunum = menu->NextSelect;
  1951.  }
  1952.  
  1953.  return (done);
  1954. }
  1955.  
  1956. /********************************************************************
  1957. * AmiApplySort()
  1958. *
  1959. *    Enforce current order of filter
  1960. *********************************************************************/
  1961. void AmiApplySort(void)
  1962. {
  1963.  filterNode *filt = NULL;
  1964.  entryNode *last = NULL;
  1965.  
  1966.  AmiLock();
  1967.  if (!DataQuery(gui,"This will affect all filtered entries.\nAre you sure?","OK|Cancel")) {
  1968.     AmiUnlock();
  1969.     return;
  1970.  }
  1971.  
  1972.  while ( (filt = (filterNode *)DataGetNext((struct List *)&filtered,(struct Node *)filt)) != NULL) {
  1973.  
  1974.     /* first entry will be our "top" */
  1975.     if (last != NULL) {
  1976.         Remove((struct Node *)filt->entry);
  1977.         Insert((struct List *)&entries,(struct Node *)filt->entry,(struct Node *)last);
  1978.     }
  1979.  
  1980.     last = filt->entry;
  1981.  }
  1982.  
  1983.  AmiUnlock();
  1984. }
  1985.  
  1986. /*********************************************************************
  1987. * AmiRangeMark()
  1988. *
  1989. *    Mark all filtered transactions
  1990. **********************************************************************/
  1991. void AmiRangeMark(long item)
  1992. {
  1993.  filterNode *filt = NULL;
  1994.  amountType amount;
  1995.  
  1996.  /* verify! */
  1997.  AmiLock();
  1998.  if (!DataQuery(gui,"This will affect all filtered entries.\nAre you sure?","OK|Cancel")) {
  1999.     AmiUnlock();
  2000.     return;
  2001.  }
  2002.  
  2003.  switch (item) {
  2004.      case EDITRANGECLR:
  2005.         while ( (filt = (filterNode *)DataGetNext((struct List *)&filtered,(struct Node *)filt)) != NULL) 
  2006.             filt->entry->flags |= CLEARED;
  2007.         break;
  2008.  
  2009.      case EDITRANGEUCL:
  2010.         while ( (filt = (filterNode *)DataGetNext((struct List *)&filtered,(struct Node *)filt)) != NULL) 
  2011.             filt->entry->flags &= ~CLEARED;
  2012.         break;
  2013.  
  2014.      case EDITRANGEDED:
  2015.         while ( (filt = (filterNode *)DataGetNext((struct List *)&filtered,(struct Node *)filt)) != NULL) 
  2016.             filt->entry->flags |= TAXDEDUCT;
  2017.         break;
  2018.  
  2019.      case EDITRANGEUND:
  2020.         while ( (filt = (filterNode *)DataGetNext((struct List *)&filtered,(struct Node *)filt)) != NULL) 
  2021.             filt->entry->flags &= ~TAXDEDUCT;
  2022.         break;
  2023.  
  2024.      case EDITRANGEPR:
  2025.         while ( (filt = (filterNode *)DataGetNext((struct List *)&filtered,(struct Node *)filt)) != NULL) {
  2026.             if (filt->entry->type != CHECKTYPE)
  2027.                 continue;
  2028.  
  2029.             filt->entry->flags |= PRINTED;
  2030.         }
  2031.         break;
  2032.  
  2033.      case EDITRANGEUPR:
  2034.         while ( (filt = (filterNode *)DataGetNext((struct List *)&filtered,(struct Node *)filt)) != NULL) {
  2035.             if (filt->entry->type != CHECKTYPE)
  2036.                 continue;
  2037.  
  2038.             filt->entry->flags &= ~PRINTED;
  2039.         }
  2040.         break;
  2041.  
  2042.      case EDITRANGEVD:
  2043.         while ( (filt = (filterNode *)DataGetNext((struct List *)&filtered,(struct Node *)filt)) != NULL) {
  2044.  
  2045.             if (filt->entry->type != CHECKTYPE)
  2046.                 continue;
  2047.  
  2048.             amount = filt->entry->amount;
  2049.             if ( !(filt->entry->flags & VOIDED)) {
  2050.                 DataUpdateBal( 
  2051.                     (filt->entry->type==DEPOSITTYPE)?WITHDRAWALTYPE:DEPOSITTYPE,
  2052.                     &amount, &amntState.currAmnt, currStr);
  2053.             }
  2054.                 filt->entry->flags |= VOIDED;
  2055.         }
  2056.         break;
  2057.  
  2058.      case EDITRANGEUVD:
  2059.         while ( (filt = (filterNode *)DataGetNext((struct List *)&filtered,(struct Node *)filt)) != NULL) {
  2060.             if (filt->entry->type != CHECKTYPE)
  2061.                 continue;
  2062.  
  2063.             amount = filt->entry->amount;
  2064.             if ((filt->entry->flags & VOIDED)) {
  2065.                 DataUpdateBal(
  2066.                     (filt->entry->type==DEPOSITTYPE)?DEPOSITTYPE:WITHDRAWALTYPE,
  2067.                     &amount, &amntState.currAmnt, currStr);
  2068.             }
  2069.             filt->entry->flags &= ~VOIDED;
  2070.         }
  2071.         break;
  2072.  
  2073.      case EDITRANGERM:
  2074.         while ( (filt = (filterNode *)DataGetNext((struct List *)&filtered,NULL)) != NULL) {
  2075.             amount = filt->entry->amount;
  2076.             if ( !(filt->entry->flags & VOIDED)) {
  2077.                 DataUpdateBal( 
  2078.                     (filt->entry->type==DEPOSITTYPE)?WITHDRAWALTYPE:DEPOSITTYPE,
  2079.                     &amount, &amntState.currAmnt, currStr);
  2080.             }
  2081.             DataRemoveEntry(filt->entry,filt);
  2082.         }
  2083.         break;
  2084.  }
  2085.  
  2086.  amiChangedItems = TRUE;
  2087.  DataUpdateFilters(&filtered); 
  2088.  if (autosort == TRUE && !IsListEmpty(&sortfields))
  2089.     DataSortFilter((filterNode *)filtered.mlh_Head,
  2090.                (filterNode *)filtered.mlh_TailPred,
  2091.                (sortNode *)sortfields.lh_Head);
  2092.  RegNewFilter();
  2093.  DataFilterBalance(&filtered);
  2094.  DataBuildBal(usrAccount.decimal, &filtAmnt,filtStr);
  2095.  AmiUpdateFilt(filtStr);
  2096.  AmiUpdateCurr(currStr);
  2097.  AmiUnlock();
  2098. }
  2099.  
  2100. /*********************************************************************
  2101. * AmiToggleClear()
  2102. *
  2103. *    Toggles the clear flag of transaction
  2104. **********************************************************************/
  2105. void AmiToggleClear(void)
  2106. {
  2107.  filterNode *find;
  2108.  
  2109.  find = (filterNode *)DataOrd2Node((struct List *)&filtered,selRow);
  2110.  find->entry->flags ^= CLEARED;
  2111.   
  2112.  if (DataTestFilter(find->entry,&filterControl)) 
  2113.     RegRedrawSel(find);
  2114.  
  2115.  else {
  2116.     if ( !(find->entry->flags & VOIDED))
  2117.         DataUpdateBal((find->entry->type==DEPOSITTYPE)?WITHDRAWALTYPE:DEPOSITTYPE,
  2118.                 &find->entry->amount, &filtAmnt, filtStr);
  2119.  
  2120.     DataRemoveFilter(find);
  2121.     RegRemoveSel();
  2122.     AmiUpdateFilt(filtStr);
  2123.  }
  2124. }
  2125.  
  2126. /**********************************************************************
  2127. * AmiSearchFail()
  2128. *
  2129. *    Prompt user with search failure
  2130. ***********************************************************************/
  2131. void AmiSearchFail(void)
  2132. {
  2133.  struct EasyStruct es;
  2134.  char *str = "No search matches found.";
  2135.  
  2136.  es.es_StructSize = sizeof(struct EasyStruct);
  2137.  es.es_Flags = 0;
  2138.  es.es_Title = "amiCheck NOTICE:";
  2139.  es.es_TextFormat = str;
  2140.  es.es_GadgetFormat = "OK";
  2141.  AmiLock();
  2142.  GF_EasyRequest(gui,amiWindow,&es,NULL); 
  2143.  AmiUnlock();
  2144. }
  2145.  
  2146. /**********************************************************************
  2147. * AmiAboutPart()
  2148. *
  2149. *    About information! third party support
  2150. ***********************************************************************/
  2151. void AmiAboutPart(void)
  2152. {
  2153.  struct EasyStruct es;
  2154.  char str[220];
  2155.  
  2156.  sprintf(str,"A big thankyou to the following\nquality third-party support:\nEasyRexx Â© 1994,1995 Ketil Hunn\nGuiFront Â© 1994 Michael Berg\n");
  2157.  es.es_StructSize = sizeof(struct EasyStruct);
  2158.  es.es_Flags = 0;
  2159.  es.es_Title = "About Third Parties:";
  2160.  es.es_TextFormat = str;
  2161.  es.es_GadgetFormat = "OK";
  2162.  AmiLock();
  2163.  GF_EasyRequest(gui,amiWindow,&es,NULL);
  2164.  AmiUnlock();
  2165.  
  2166. }
  2167.  
  2168. /**********************************************************************
  2169. * AmiAbout()
  2170. *
  2171. *    About information!
  2172. ***********************************************************************/
  2173. void AmiAbout(void)
  2174. {
  2175.  struct EasyStruct es;
  2176. #if 0
  2177. #ifdef EVALUATION
  2178.  char *SpecialString = "Shareware EVALUATION copy.";
  2179. #else
  2180.  char *SpecialString = "Registration ID found. Thank you!";
  2181. #endif
  2182. #endif
  2183.  char str[220];
  2184.  
  2185.  sprintf(str,"%s %s\nCopyright Â© 1995 Douglas M. Dyer\ndyer@alx.sticomet.com\n\nCheckbook software for the Amiga® computer\n\nPrinter Checks:\n1-800-336-4168  Acct#Q00305",
  2186.     AC_AppID,AC_Version);
  2187.  
  2188.  es.es_StructSize = sizeof(struct EasyStruct);
  2189.  es.es_Flags = 0;
  2190.  es.es_Title = "About amiCheck:";
  2191.  es.es_TextFormat = str;
  2192.  es.es_GadgetFormat = "OK";
  2193.  AmiLock();
  2194.  GF_EasyRequest(gui,amiWindow,&es,NULL);
  2195.  AmiUnlock();
  2196.  
  2197. }
  2198.  
  2199. /*********************************************************************
  2200. * AmiAnnounce()
  2201. *
  2202. *    Announce using a requester
  2203. **********************************************************************/
  2204. void AmiAnnounce(char *str)
  2205. {
  2206.  struct EasyStruct es;
  2207.  
  2208.  es.es_StructSize = sizeof(struct EasyStruct);
  2209.  es.es_Flags = 0;
  2210.  es.es_Title = "amiCheck NOTICE:";
  2211.  es.es_TextFormat = str;
  2212.  es.es_GadgetFormat = "OK";
  2213.  AmiLock();
  2214.  GF_EasyRequest(gui,amiWindow,&es,NULL);
  2215.  AmiUnlock();
  2216.  
  2217. }
  2218.  
  2219. /**********************************************************************
  2220. * AmiAsk()
  2221. *
  2222. *    ok/cancel requester
  2223. ***********************************************************************/
  2224. BOOL AmiAsk(char *str)
  2225. {
  2226.  struct EasyStruct es;
  2227.  BOOL val = TRUE;
  2228.  
  2229.  if ( amiChangedItems == TRUE) {
  2230.     es.es_StructSize = sizeof(struct EasyStruct);
  2231.     es.es_Flags = 0;
  2232.     es.es_Title = "amiCheck NOTICE:";
  2233.     es.es_TextFormat = str;
  2234.     es.es_GadgetFormat = "OK|Save First|Cancel";
  2235.     AmiLock();
  2236.     val = GF_EasyRequest(gui,amiWindow,&es,NULL);
  2237.     AmiUnlock();
  2238.  
  2239.     /* save first if asked! */
  2240.      if (val == 2) {
  2241.         if (AmiSave(NULL,FALSE))
  2242.             val--;
  2243.      }
  2244.  } 
  2245.  
  2246.  return (val);
  2247. }
  2248.  
  2249.  
  2250. /************************************************************
  2251. * AmiDisableSel()
  2252. *
  2253. *    Disables items that are not needed when no item
  2254. *    is selected.
  2255. *************************************************************/
  2256. void AmiDisableSel(BOOL dis)
  2257. {
  2258.  UWORD menunum1, menunum2, menunum3, menunum4, menunum5, menunum6;
  2259.  static BOOL disit = FALSE;
  2260.  
  2261.  if (dis == disit)
  2262.     return;
  2263.  
  2264.  disit = dis;
  2265.  
  2266.  /* disable menu items */
  2267.  menunum1 = FULLMENUNUM(EDITTITLE,EDITCLEAR,NOSUB);
  2268.  menunum2 = FULLMENUNUM(EDITTITLE,EDITUNCLEAR,NOSUB);
  2269.  menunum3 = FULLMENUNUM(EDITTITLE,EDITMOVE,NOSUB);
  2270.  menunum4 = FULLMENUNUM(SEARCHTITLE,SEARCHJUMP,NOSUB);
  2271.  menunum5 = FULLMENUNUM(EDITTITLE,EDITUNFILT,NOSUB);
  2272.  menunum6 = FULLMENUNUM(EDITTITLE,EDITDUPLICATE,NOSUB);
  2273.  if (dis) {
  2274.     OffMenu(amiWindow, menunum1);
  2275.     OffMenu(amiWindow, menunum2);
  2276.     OffMenu(amiWindow, menunum3);
  2277.     OffMenu(amiWindow, menunum4);
  2278.     OffMenu(amiWindow, menunum5);
  2279.     OffMenu(amiWindow, menunum6);
  2280.  }
  2281.  else {
  2282.     OnMenu(amiWindow, menunum1);
  2283.     OnMenu(amiWindow, menunum2);
  2284.     OnMenu(amiWindow, menunum3);
  2285.     OnMenu(amiWindow, menunum4);
  2286.     OnMenu(amiWindow, menunum5);
  2287.     OnMenu(amiWindow, menunum6);
  2288.  }
  2289.  
  2290.  /* disable edit button */
  2291.  GF_SetGadgetAttrs(gui,AC_MainSpecs[GID_EDIT]->gs_Gadget,
  2292.         GA_Disabled,dis,
  2293.         TAG_DONE);
  2294.  
  2295.  if (dis)
  2296.      AmiMoveRestore();
  2297. }
  2298.  
  2299. /************************************************************
  2300. * AmiDisableAll()
  2301. *
  2302. *    Disables all items - no account
  2303. *************************************************************/
  2304. void AmiDisableAll(BOOL dis)
  2305. {
  2306.  alldisabled = dis;
  2307.  
  2308.  /* turn off the other stuff if this is all off */
  2309.  if (dis)
  2310.     AmiDisableSel(TRUE);
  2311.  
  2312.  /* disable gadgets */
  2313.  if (dis == TRUE)
  2314.    GF_SetGadgetAttrs(gui,AC_MainSpecs[GID_TREND]->gs_Gadget,
  2315.         GA_Disabled,dis,
  2316.         TAG_DONE);
  2317.  
  2318.  GF_SetGadgetAttrs(gui,AC_MainSpecs[GID_GETSELTYPE]->gs_Gadget,
  2319.         GA_Disabled,dis,
  2320.         TAG_DONE);
  2321.  
  2322.  /*
  2323.  GF_SetGadgetAttrs(gui,AC_MainSpecs[GID_ENTERTYPE]->gs_Gadget,
  2324.         GA_Disabled,dis,
  2325.         TAG_DONE);
  2326.  */
  2327.  
  2328.  GF_SetGadgetAttrs(gui,AC_MainSpecs[GID_NEWTYPE]->gs_Gadget,
  2329.         GA_Disabled,dis,
  2330.         TAG_DONE);
  2331.  
  2332.  GF_SetGadgetAttrs(gui,AC_MainSpecs[GID_FILTER]->gs_Gadget,
  2333.         GA_Disabled,dis,
  2334.         TAG_DONE);
  2335.  
  2336.  GF_SetGadgetAttrs(gui,AC_MainSpecs[GID_STATS]->gs_Gadget,
  2337.         GA_Disabled,dis,
  2338.         TAG_DONE);
  2339.  
  2340.  GF_SetGadgetAttrs(gui,AC_MainSpecs[GID_BUDGET]->gs_Gadget,
  2341.         GA_Disabled,dis,
  2342.         TAG_DONE);
  2343.  
  2344.  GF_SetGadgetAttrs(gui,AC_MainSpecs[GID_ANALYSIS]->gs_Gadget,
  2345.         GA_Disabled,dis,
  2346.         TAG_DONE);
  2347.  
  2348.  GF_SetGadgetAttrs(gui,AC_MainSpecs[GID_SORT]->gs_Gadget,
  2349.         GA_Disabled,dis,
  2350.         TAG_DONE);
  2351.  
  2352.  
  2353.  /* disable menu items */
  2354.  if (dis) {
  2355.     OffMenu(amiWindow,FULLMENUNUM(FILETITLE,FILESAVEEXIT,NOSUB));
  2356.     OffMenu(amiWindow,FULLMENUNUM(FILETITLE,FILESAVE,NOSUB));
  2357.     OffMenu(amiWindow,FULLMENUNUM(FILETITLE,FILESAVEAS,NOSUB));
  2358.     OffMenu(amiWindow,FULLMENUNUM(EDITTITLE,EDITQUICK,NOSUB));
  2359.     OffMenu(amiWindow,FULLMENUNUM(EDITTITLE,EDITBATCH,NOSUB));
  2360.     OffMenu(amiWindow,FULLMENUNUM(EDITTITLE,EDITAPPLYSORT,NOSUB));
  2361.     OffMenu(amiWindow,FULLMENUNUM(SEARCHTITLE,SEARCHSEARCH,NOSUB));
  2362.      OffMenu(amiWindow,FULLMENUNUM(SEARCHTITLE,SEARCHAGAIN,NOSUB));
  2363.      OffMenu(amiWindow,FULLMENUNUM(EDITTITLE,EDITRANGE,NOSUB));
  2364.     OffMenu(amiWindow,FULLMENUNUM(EDITTITLE,EDITACCT,NOSUB));
  2365.     OffMenu(amiWindow,FULLMENUNUM(UTILITYTITLE,UTILITYREPORT,NOSUB));
  2366.     OffMenu(amiWindow,FULLMENUNUM(PREFSTITLE,PREFSFORM,NOSUB));
  2367.     OffMenu(amiWindow,FULLMENUNUM(EDITTITLE,EDITDATA,NOSUB));
  2368.     OffMenu(amiWindow,FULLMENUNUM(FILETITLE,FILEIMPORT,NOSUB));
  2369.     OffMenu(amiWindow,FULLMENUNUM(FILETITLE,FILEEXPORT,NOSUB));
  2370.     OffMenu(amiWindow,FULLMENUNUM(FILETITLE,FILEPRINT,NOSUB));
  2371.     OffMenu(amiWindow,FULLMENUNUM(FILETITLE,FILERECON,NOSUB));
  2372.     OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXASSIGN,NOSUB));
  2373.     OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM1,NOSUB));
  2374.     OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM2,NOSUB));    
  2375.     OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM3,NOSUB));
  2376.     OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM4,NOSUB));
  2377.     OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM5,NOSUB));
  2378.     OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM6,NOSUB));
  2379.     OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM7,NOSUB));
  2380.     OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM8,NOSUB));
  2381.     OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM9,NOSUB));
  2382.     OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM10,NOSUB));
  2383.  
  2384.     /* "never" turn these off */
  2385. #if 0
  2386.     OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXOTHER,NOSUB));
  2387.     OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXOPENCMD,NOSUB));
  2388.     OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXCLOSECMD,NOSUB));
  2389. #endif
  2390.  }
  2391.  else {
  2392.     OnMenu(amiWindow,FULLMENUNUM(FILETITLE,FILESAVE,NOSUB));
  2393.     OnMenu(amiWindow,FULLMENUNUM(FILETITLE,FILESAVEEXIT,NOSUB));
  2394.     OnMenu(amiWindow,FULLMENUNUM(FILETITLE,FILESAVEAS,NOSUB));
  2395.     OnMenu(amiWindow,FULLMENUNUM(EDITTITLE,EDITQUICK,NOSUB));
  2396.     OnMenu(amiWindow,FULLMENUNUM(EDITTITLE,EDITBATCH,NOSUB));
  2397.     OnMenu(amiWindow,FULLMENUNUM(EDITTITLE,EDITAPPLYSORT,NOSUB));
  2398.     OnMenu(amiWindow,FULLMENUNUM(SEARCHTITLE,SEARCHSEARCH,NOSUB));
  2399.      OnMenu(amiWindow,FULLMENUNUM(SEARCHTITLE,SEARCHAGAIN,NOSUB));
  2400.     OnMenu(amiWindow,FULLMENUNUM(EDITTITLE,EDITACCT,NOSUB));
  2401.     OnMenu(amiWindow,FULLMENUNUM(UTILITYTITLE,UTILITYREPORT,NOSUB));
  2402.     OnMenu(amiWindow,FULLMENUNUM(EDITTITLE,EDITRANGE,NOSUB));
  2403.     OnMenu(amiWindow,FULLMENUNUM(EDITTITLE,EDITDATA,NOSUB));
  2404.     OnMenu(amiWindow,FULLMENUNUM(FILETITLE,FILERECON,NOSUB));
  2405.     OnMenu(amiWindow,FULLMENUNUM(PREFSTITLE,PREFSFORM,NOSUB));
  2406.     OnMenu(amiWindow,FULLMENUNUM(FILETITLE,FILEPRINT,NOSUB));
  2407.     OnMenu(amiWindow,FULLMENUNUM(FILETITLE,FILEIMPORT,NOSUB));
  2408.     OnMenu(amiWindow,FULLMENUNUM(FILETITLE,FILEEXPORT,NOSUB));
  2409.     OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXASSIGN,NOSUB));
  2410.     OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM1,NOSUB));
  2411.     OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM2,NOSUB));    
  2412.     OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM3,NOSUB));
  2413.     OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM4,NOSUB));
  2414.     OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM5,NOSUB));
  2415.     OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM6,NOSUB));
  2416.     OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM7,NOSUB));
  2417.     OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM8,NOSUB));
  2418.     OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM9,NOSUB));
  2419.     OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM10,NOSUB));
  2420.     OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXOTHER,NOSUB));
  2421.     OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXOPENCMD,NOSUB));
  2422.     OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXCLOSECMD,NOSUB));
  2423.  }
  2424. }
  2425.  
  2426. /*********************************************************
  2427. * AmiHandleGadgetDown()
  2428. *
  2429. *    Handle those down buttons
  2430. **********************************************************/
  2431. void AmiHandleGadgetDown(struct IntuiMessage *imsg)
  2432. {
  2433.  struct Gadget *gad = (struct Gadget *)(imsg->IAddress);
  2434.  UWORD code = imsg->Code;
  2435.  filterNode *node;
  2436.  amountType amount;
  2437.  
  2438.  switch (gad->GadgetID) {
  2439.     case GID_REGFIELD:
  2440.         if (RegHitTest(imsg->Micros, imsg->Seconds, imsg->MouseX,imsg->MouseY)) {
  2441.             if (dclicktype == 1)
  2442.                 AmiToggleClear();
  2443.  
  2444.             else if (dclicktype == 2) {
  2445.                 node = (filterNode *)DataOrd2Node((struct List *)&filtered,selRow);
  2446.                 amount = node->entry->amount;
  2447.                 if ( !(node->entry->flags & VOIDED)) {
  2448.                     DataUpdateBal( 
  2449.                         (node->entry->type==DEPOSITTYPE)?WITHDRAWALTYPE:DEPOSITTYPE,
  2450.                         &amount, &filtAmnt, filtStr);
  2451.                     AmiUpdateFilt(filtStr);
  2452.                 }
  2453.                 DataRemoveFilter(node);
  2454.                 RegRemoveSel();
  2455.             }
  2456.                 
  2457.             else    AmiEditEntry();
  2458.         }
  2459.         break;
  2460.  
  2461.     case GID_REGVSCROL:
  2462.         RegMoveList(&filtered,code);
  2463.         RegRefresh(FALSE);
  2464.         break;
  2465.  
  2466.  }
  2467. }
  2468.  
  2469. /**********************************************************
  2470. * AmiAllocRequesters()
  2471. *
  2472. *    Alocates and sets up asl requestors for both loads and
  2473. *    one saveas
  2474. ***********************************************************/
  2475. BOOL AmiAllocRequesters(void)
  2476. {
  2477.  
  2478.  /* allocate the generic tag list */
  2479.  aslTagList = AllocateTagItems(5);
  2480.  if (aslTagList) {
  2481.     aslTagList[0].ti_Tag =     ASL_Window;
  2482.     aslTagList[0].ti_Data = (unsigned long)amiWindow;
  2483.     aslTagList[1].ti_Tag = ASL_Height;
  2484.     aslTagList[1].ti_Data = amiAslHeight;
  2485.     aslTagList[2].ti_Tag = ASL_OKText;
  2486.     aslTagList[2].ti_Data = (unsigned long)"OK";
  2487.     aslTagList[3].ti_Tag = ASL_CancelText;
  2488.     aslTagList[3].ti_Data = (unsigned long)"Cancel";
  2489.     aslTagList[4].ti_Tag = TAG_DONE;
  2490.  }
  2491.  else return (FALSE);
  2492.  
  2493.  scriptASL = (struct FileRequester *)AllocAslRequest(ASL_FileRequest,
  2494.         scriptloadtags);
  2495.  if (scriptASL == NULL)
  2496.     return (FALSE);
  2497.  
  2498.  scriptsaveASL = (struct FileRequester *)AllocAslRequest(ASL_FileRequest,
  2499.         scriptsavetags);
  2500.  if (scriptsaveASL == NULL)
  2501.     return (FALSE);
  2502.  
  2503.  otherRexxASL =  (struct FileRequester *)AllocAslRequest(ASL_FileRequest,
  2504.         rexxtags);
  2505.  if (otherRexxASL == NULL)
  2506.     return (FALSE);
  2507.  
  2508.  loadASL = (struct FileRequester *)AllocAslRequest(ASL_FileRequest,
  2509.         loadtags);
  2510.  if (loadASL == NULL)
  2511.     return (FALSE);
  2512.  
  2513.  saveASL = (struct FileRequester *)AllocAslRequest(ASL_FileRequest,
  2514.         savetags);
  2515.  if (saveASL == NULL)
  2516.     return (FALSE);
  2517.  
  2518.  impasciiASL = (struct FileRequester *)AllocAslRequest(ASL_FileRequest,
  2519.         impasciitags);
  2520.  if (impasciiASL == NULL)
  2521.     return (FALSE);
  2522.  
  2523.  expasciiASL = (struct FileRequester *)AllocAslRequest(ASL_FileRequest,
  2524.         expasciitags);
  2525.  if (expasciiASL == NULL)
  2526.     return (FALSE);
  2527.  
  2528.  netsaveASL = (struct FileRequester *)AllocAslRequest(ASL_FileRequest,
  2529.         netsavetags);
  2530.  if (netsaveASL == NULL)
  2531.     return (FALSE);
  2532.  
  2533.  netloadASL = (struct FileRequester *)AllocAslRequest(ASL_FileRequest,
  2534.         netloadtags);
  2535.  if (netloadASL == NULL)
  2536.     return (FALSE);
  2537.  
  2538.  reportASL = (struct FileRequester *)AllocAslRequest(ASL_FileRequest,
  2539.         reporttags);
  2540.  if (reportASL == NULL)
  2541.     return (FALSE);
  2542.  
  2543.  devASL = (struct FileRequester *)AllocAslRequest(ASL_FileRequest,
  2544.         devtags);
  2545.  if (devASL == NULL)
  2546.     return (FALSE);
  2547.  
  2548.  return (TRUE);
  2549. }
  2550.  
  2551. /****************************************************************
  2552. * AmiUpdateFilt()
  2553. *
  2554. *    Updates the Filter balance field
  2555. *****************************************************************/
  2556. void AmiUpdateFilt(char *str)
  2557. {
  2558.  strcpy(filtStr,str);
  2559.  GF_SetGadgetAttrs(gui,gadgetspecs[GID_RUNBAL].gs_Gadget,
  2560.     GTTX_Text,filtStr,
  2561.     TAG_DONE);
  2562. }
  2563.  
  2564. /****************************************************************
  2565. * AmiUpdateCurr()
  2566. *
  2567. *    Updates the curr balance field
  2568. *****************************************************************/
  2569. void AmiUpdateCurr(char *str)
  2570. {
  2571.  strcpy(currStr,str);
  2572.  GF_SetGadgetAttrs(gui,gadgetspecs[GID_CURRBAL].gs_Gadget,
  2573.     GTTX_Text,currStr,
  2574.     TAG_DONE);
  2575. }
  2576.  
  2577. /****************************************************************
  2578. * AmiUpdateState()
  2579. *
  2580. *    Updates the Statement balance field
  2581. *****************************************************************/
  2582. void AmiUpdateState(char *str)
  2583. {
  2584.  strcpy(stateStr,str);
  2585.  GF_SetGadgetAttrs(gui,gadgetspecs[GID_STATBAL].gs_Gadget,
  2586.     GTTX_Text,stateStr,
  2587.     TAG_DONE);
  2588. }
  2589.  
  2590. /*******************************************************************************
  2591. * AmiParseCmd()
  2592. *
  2593. *    Parse the input tooltypes and parameters
  2594. ********************************************************************************/
  2595. void AmiParseCmd(int argc, char **argv)
  2596. {
  2597.  char *ptr;
  2598.  ULONG rows;
  2599.  char dtype[80];
  2600.  
  2601.  strcpy(filePattern,DEFAULT_FILEPATTERN);
  2602.  strcpy(importPattern,DEFAULT_IMPORTPATTERN);
  2603.  strcpy(scriptPattern,DEFAULT_SCRIPTPATTERN);
  2604.  strcpy(netPattern,DEFAULT_NETPATTERN);
  2605.  
  2606. #if 0
  2607.  if (argc==0) {
  2608.     sprintf(iconPath,"AC_Icons/");
  2609.     sprintf(guidePath,"documents/amiCheck.guide");
  2610.     return;
  2611.  }
  2612.  else {
  2613.     ptr = PathPart(argv[0]);
  2614.     if (ptr != NULL) {
  2615.         if (*ptr == '/')
  2616.             *(ptr+1) = NULL;
  2617.         else *ptr = NULL;
  2618.  
  2619.         sprintf(iconPath,"%sAC_Icons/",argv[0]);
  2620.         sprintf(guidePath,"%sdocuments/amiCheck.guide",argv[0]);        
  2621.     }
  2622.     else {
  2623.         sprintf(iconPath,"AC_Icons/");
  2624.         sprintf(guidePath,"documents/amiCheck.guide");
  2625.     }
  2626.  }
  2627.  
  2628. #endif
  2629.  
  2630.  while (argc>1) {
  2631.     /* templaterows */
  2632.     if (strnicmp(argv[argc-1],"TEMPLATEROWS",strlen("TEMPLATEROWS") ) == 0) {
  2633.         ptr = strchr(argv[argc-1],'=');
  2634.         if (ptr != NULL) {
  2635.             sscanf(ptr+1,"%d",&rows);
  2636.             if (rows < 5) rows = 5;
  2637.             SP_SelTempSpecs[GID_SPTEMPLIST]->gs_MinHeight = rows;
  2638.         }
  2639.     }
  2640.  
  2641.     /* aslheight */
  2642.     else if (strnicmp(argv[argc-1],"ASLHEIGHT",strlen("ASLHEIGHT") ) == 0) {
  2643.         ptr = strchr(argv[argc-1],'=');
  2644.         if (ptr != NULL) {
  2645.             sscanf(ptr+1,"%u",&amiAslHeight);
  2646.         }
  2647.     }
  2648.  
  2649.     /* numcols */
  2650.     else if (strnicmp(argv[argc-1],"NUMCOLS",strlen("NUMCOLS") ) == 0) {
  2651.         ptr = strchr(argv[argc-1],'=');
  2652.         if (ptr != NULL) {
  2653.             sscanf(ptr+1,"%d",&rows);
  2654.             if (rows < 5) rows = 5;
  2655.             gadgetspecs[GID_REGFIELD].gs_MinWidth = rows;
  2656.         }
  2657.     }
  2658.  
  2659.     /* numrows */
  2660.     else if (strnicmp(argv[argc-1],"NUMROWS",strlen("NUMROWS") ) == 0) {
  2661.         ptr = strchr(argv[argc-1],'=');
  2662.         if (ptr != NULL) {
  2663.             sscanf(ptr+1,"%d",&rows);
  2664.             if (rows < 5) rows = 5;
  2665.             gadgetspecs[GID_REGFIELD].gs_MinHeight = rows;
  2666.         }
  2667.     }
  2668.  
  2669.     /* layout change warning */
  2670.     else if (strnicmp(argv[argc-1],"NOLAYOUTWARN",strlen("NOLAYOUTWARN") ) == 0) {
  2671.         layoutwarn = FALSE;    
  2672.     }
  2673.  
  2674.     /* autosort flag */
  2675.     else if (strnicmp(argv[argc-1],"AUTOSORT",strlen("AUTOSORT") ) == 0) {
  2676.         autosort = TRUE;    
  2677.     }
  2678.  
  2679.     /* show memo flag */
  2680.     else if (strnicmp(argv[argc-1],"SHOWMEMO",strlen("SHOWMEMO") ) == 0) {
  2681.         showMemo = TRUE;
  2682.     }
  2683.  
  2684.     /* DCLICK flag */
  2685.     else if (strnicmp(argv[argc-1],"DCLICK",strlen("DCLICK") ) == 0) {
  2686.         dclicktype = 0;
  2687.         ptr = strchr(argv[argc-1],'=');
  2688.         if (ptr != NULL) {
  2689.             sscanf(ptr+1,"%s",dtype);
  2690.             if (strnicmp(dtype,"CLEAR",strlen("CLEAR")) == 0)
  2691.                 dclicktype = 1;
  2692.             else if (strnicmp(dtype,"UNFILT",strlen("UNFILT")) == 0)
  2693.                 dclicktype = 2;
  2694.             else if (strnicmp(dtype,"EDIT",strlen("EDIT")) == 0)
  2695.                 dclicktype = 0;
  2696.         }
  2697.     }
  2698.  
  2699.     /* DATE flag */
  2700.     else if (strnicmp(argv[argc-1],"DATE",strlen("DATE") ) == 0) {
  2701.         dateFormat = DATE_MMDDYY;
  2702.         ptr = strchr(argv[argc-1],'=');
  2703.         if (ptr != NULL) {
  2704.             sscanf(ptr+1,"%s",dtype);
  2705.             if (strnicmp(dtype,"FORMAT1",strlen("FORMAT1")) == 0)
  2706.                 dateFormat = DATE_MMDDYY;
  2707.             else if (strnicmp(dtype,"FORMAT2",strlen("FORMAT2")) == 0)
  2708.                 dateFormat = DATE_DDMMYY;
  2709.             else if (strnicmp(dtype,"FORMAT3",strlen("FORMAT3")) == 0)
  2710.                 dateFormat = DATE_DEC_12;
  2711.             else if (strnicmp(dtype,"FORMAT4",strlen("FORMAT4")) == 0)
  2712.                 dateFormat = DATE_12_DEC;
  2713.         }
  2714.     }
  2715.  
  2716.     /* LOAD pattern */
  2717.     else  if (strnicmp(argv[argc-1],"LOADPATTERN",strlen("LOADPATTERN") ) == 0) {
  2718.         ptr = strchr(argv[argc-1],'=');
  2719.         if (ptr != NULL) {
  2720.             sscanf(ptr+1,"%s",dtype);
  2721.             if (strlen(dtype) < FILEPATTERN_SIZE) {
  2722.                 strcpy(filePattern,dtype);
  2723.             }
  2724.         }
  2725.     }
  2726.  
  2727.     /* IMPORT pattern */
  2728.     else  if (strnicmp(argv[argc-1],"IMPORTPATTERN",strlen("IMPORTPATTERN") ) == 0) {
  2729.         ptr = strchr(argv[argc-1],'=');
  2730.         if (ptr != NULL) {
  2731.             sscanf(ptr+1,"%s",dtype);
  2732.             if (strlen(dtype) < FILEPATTERN_SIZE) {
  2733.                 strcpy(importPattern,dtype);
  2734.             }
  2735.         }
  2736.     }
  2737.  
  2738.     /* SCRIPT pattern */
  2739.     else  if (strnicmp(argv[argc-1],"SCRIPTPATTERN",strlen("SCRIPTPATTERN") ) == 0) {
  2740.         ptr = strchr(argv[argc-1],'=');
  2741.         if (ptr != NULL) {
  2742.             sscanf(ptr+1,"%s",dtype);
  2743.             if (strlen(dtype) < FILEPATTERN_SIZE) {
  2744.                 strcpy(scriptPattern,dtype);
  2745.             }
  2746.         }
  2747.     }
  2748.  
  2749.     /* NET pattern */
  2750.     else  if (strnicmp(argv[argc-1],"NETPATTERN",strlen("NETPATTERN") ) == 0) {
  2751.         ptr = strchr(argv[argc-1],'=');
  2752.         if (ptr != NULL) {
  2753.             sscanf(ptr+1,"%s",dtype);
  2754.             if (strlen(dtype) < FILEPATTERN_SIZE) {
  2755.                 strcpy(netPattern,dtype);
  2756.             }
  2757.         }
  2758.     }
  2759.  
  2760.     /* is it a tooltype comment or file name? */
  2761.     else if ( (char)*argv[argc-1] != '(' && !bootfile) {
  2762.         /* assume it to be a file */
  2763.         strcpy(currFile, argv[argc-1]);
  2764.         bootfile = TRUE;
  2765.     }
  2766.     argc--;
  2767.  }
  2768. }
  2769.  
  2770. /********************************************************************************
  2771. * AmiOpenGUI()
  2772. *
  2773. *    open all guis in system
  2774. *
  2775. *********************************************************************************/
  2776. BOOL AmiOpenGUI(void)
  2777. {
  2778.  
  2779.  seltempGUI =  GF_CreateGUI(guiapp, SP_SelTempPanel,SP_SelTempSpecs,
  2780.                 GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
  2781.                 GUI_WindowTitle,        (ULONG)"Templates",
  2782.                 GUI_OpenGUI,            (ULONG)FALSE,
  2783.                 GUI_Backfill,           (ULONG)FALSE,
  2784.         GUI_ExtraIDCMP,        (ULONG)IDCMP_RAWKEY,
  2785.         GUI_NewMenu,        amiMenu,
  2786.         GUI_ScreenTitle,    AC_Title,
  2787.                 TAG_DONE);
  2788.  if (seltempGUI == NULL)
  2789.     return (FALSE);
  2790.  
  2791.  edittempGUI = GF_CreateGUI(guiapp, TP_EditTempPanel,TP_EditTempSpecs,
  2792.                 GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
  2793.                 GUI_WindowTitle,        (ULONG)"Edit Template List",
  2794.                 GUI_OpenGUI,            (ULONG)FALSE,
  2795.                 GUI_Backfill,           (ULONG)TRUE,
  2796.         GUI_ExtraIDCMP,        (ULONG)IDCMP_RAWKEY,
  2797.         GUI_ScreenTitle,    AC_Title,
  2798.                 TAG_DONE);
  2799.  if (edittempGUI == NULL)
  2800.     return (FALSE);
  2801.  
  2802.  newGUI = GF_CreateGUI(guiapp, NP_EnterPanel,NP_EnterSpecs,
  2803.                 GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
  2804.                 GUI_WindowTitle,        (ULONG)NULL,
  2805.                 GUI_OpenGUI,            (ULONG)FALSE,
  2806.                 GUI_Backfill,           (ULONG)TRUE,
  2807.         GUI_ExtraIDCMP,        (ULONG)(IDCMP_RAWKEY | IDCMP_ACTIVEWINDOW),
  2808.         GUI_ScreenTitle,    AC_Title,
  2809.                 TAG_DONE);
  2810.  if (newGUI == NULL)
  2811.     return (FALSE);
  2812.  
  2813.  filterGUI = GF_CreateGUI(guiapp, FP_FilterPanel,FP_FilterSpecs,
  2814.                 GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
  2815.                 GUI_WindowTitle,        (ULONG)"Edit Filter Settings",
  2816.                 GUI_OpenGUI,            (ULONG)FALSE,
  2817.         GUI_ExtraIDCMP,        (ULONG)(IDCMP_RAWKEY | IDCMP_ACTIVEWINDOW),
  2818.                 GUI_Backfill,           (ULONG)TRUE,
  2819.         GUI_ScreenTitle,    AC_Title,
  2820.                 TAG_DONE);
  2821.  if (filterGUI == NULL)
  2822.     return (FALSE);
  2823.  
  2824.  memcpy(&dummykey,ptrKey,sizeof(usrkey));
  2825.  
  2826.  sortGUI = GF_CreateGUI(guiapp, SRP_SortPanel,SRP_SortSpecs,
  2827.                 GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
  2828.                 GUI_WindowTitle,        (ULONG)"Register Sort",
  2829.                 GUI_OpenGUI,            (ULONG)FALSE,
  2830.                 GUI_Backfill,           (ULONG)TRUE,
  2831.         GUI_ExtraIDCMP,        (ULONG)IDCMP_RAWKEY,
  2832.         GUI_ScreenTitle,    AC_Title,
  2833.                 TAG_DONE);
  2834.  if (sortGUI == NULL)
  2835.     return (FALSE);
  2836.  
  2837.  entryGUI = GF_CreateGUI(guiapp, EP_EnterPanel,EP_EnterSpecs,
  2838.                 GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
  2839.                 GUI_WindowTitle,        (ULONG)NULL,
  2840.                 GUI_OpenGUI,            (ULONG)FALSE,
  2841.                 GUI_Backfill,           (ULONG)TRUE,
  2842.         GUI_ExtraIDCMP,        (ULONG)(IDCMP_RAWKEY | IDCMP_ACTIVEWINDOW),
  2843.         GUI_ScreenTitle,    AC_Title,
  2844.                 TAG_DONE);
  2845.  if (entryGUI == NULL)
  2846.     return (FALSE);
  2847.  
  2848.  recGUI = GF_CreateGUI(guiapp, RCP_RecPanel,RCP_RecSpecs,
  2849.                 GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
  2850.                 GUI_WindowTitle,        (ULONG)"Reconciliation",
  2851.                 GUI_OpenGUI,            (ULONG)FALSE,
  2852.                 GUI_Backfill,           (ULONG)TRUE,
  2853.         GUI_ExtraIDCMP,        (ULONG)(IDCMP_RAWKEY | IDCMP_ACTIVEWINDOW),
  2854.         GUI_ScreenTitle,    AC_Title,
  2855.                 TAG_DONE);
  2856.  if (recGUI == NULL)
  2857.     return (FALSE);
  2858.  
  2859.  acctGUI = GF_CreateGUI(guiapp, ACP_AcctPanel,ACP_AcctSpecs,
  2860.                 GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
  2861.                 GUI_WindowTitle,        (ULONG)NULL,
  2862.                 GUI_OpenGUI,            (ULONG)FALSE,
  2863.                 GUI_Backfill,           (ULONG)TRUE,
  2864.           GUI_ExtraIDCMP,        (ULONG)IDCMP_ACTIVEWINDOW,
  2865.         GUI_ScreenTitle,    AC_Title,
  2866.                 TAG_DONE);
  2867.  if (acctGUI == NULL)
  2868.     return (FALSE);
  2869.  
  2870.  searchGUI = GF_CreateGUI(guiapp, SEP_SearchPanel,SEP_SearchSpecs,
  2871.                 GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
  2872.                 GUI_WindowTitle,        (ULONG)"Register Search ",
  2873.                 GUI_OpenGUI,            (ULONG)FALSE,
  2874.                 GUI_Backfill,           (ULONG)TRUE,
  2875.         GUI_ExtraIDCMP,        (ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
  2876.         GUI_ScreenTitle,    AC_Title,
  2877.         TAG_DONE);
  2878.  if (searchGUI == NULL)
  2879.     return (FALSE);
  2880.  
  2881.  catGUI = GF_CreateGUI(guiapp, CP_CatPanel,CP_CatSpecs,
  2882.                 GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
  2883.                 GUI_WindowTitle,        (ULONG)"Edit Category List",
  2884.                 GUI_OpenGUI,            (ULONG)FALSE,
  2885.             GUI_Backfill,           (ULONG)TRUE,
  2886.         GUI_ExtraIDCMP,        (ULONG)(IDCMP_RAWKEY | IDCMP_ACTIVEWINDOW),
  2887.         GUI_ScreenTitle,    AC_Title,
  2888.                 TAG_DONE);
  2889.  if (catGUI == NULL)
  2890.     return (FALSE);
  2891.  
  2892.  statGUI = GF_CreateGUI(guiapp, STP_StatPanel,STP_StatSpecs,
  2893.                 GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
  2894.                 GUI_WindowTitle,        (ULONG)"Register Statistics ",
  2895.                 GUI_OpenGUI,            (ULONG)FALSE,
  2896.                 GUI_Backfill,           (ULONG)FALSE,
  2897.         GUI_ExtraIDCMP,        (ULONG)IDCMP_RAWKEY,
  2898.         GUI_ScreenTitle,    AC_Title,
  2899.                 TAG_DONE);
  2900.  if (statGUI == NULL)
  2901.     return (FALSE);
  2902.  
  2903.  repGUI = GF_CreateGUI(guiapp, REP_ReportPanel,REP_ReportSpecs,
  2904.                 GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
  2905.                 GUI_WindowTitle,        (ULONG)"Report Generator",
  2906.                 GUI_OpenGUI,            (ULONG)FALSE,
  2907.                 GUI_Backfill,           (ULONG)TRUE,
  2908.         GUI_ExtraIDCMP,        (ULONG)IDCMP_ACTIVEWINDOW,
  2909.         GUI_ScreenTitle,    AC_Title,
  2910.                  TAG_DONE);
  2911.  if (repGUI == NULL)
  2912.     return (FALSE);
  2913.  
  2914.  scriptGUI = GF_CreateGUI(guiapp, SCP_ScriptPanel,SCP_ScriptSpecs,
  2915.                 GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
  2916.                 GUI_WindowTitle,        (ULONG)"Script Editor ",
  2917.                 GUI_OpenGUI,            (ULONG)FALSE,
  2918.                 GUI_Backfill,           (ULONG)TRUE,
  2919.         GUI_ExtraIDCMP,        (ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
  2920.         GUI_ScreenTitle,    AC_Title,
  2921.                  TAG_DONE);
  2922.  if (scriptGUI == NULL)
  2923.     return (FALSE);
  2924.  
  2925.  groupGUI = GF_CreateGUI(guiapp, GRP_GroupPanel,GRP_GroupSpecs,
  2926.                 GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
  2927.                 GUI_WindowTitle,        (ULONG)"Group Editor ",
  2928.                 GUI_OpenGUI,            (ULONG)FALSE,
  2929.                 GUI_Backfill,           (ULONG)TRUE,
  2930.         GUI_ExtraIDCMP,        (ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
  2931.         GUI_ScreenTitle,    AC_Title,
  2932.                  TAG_DONE);
  2933.  if (groupGUI == NULL)
  2934.     return (FALSE);
  2935.  
  2936.  analGUI = GF_CreateGUI(guiapp, AN_MainPanel,AN_MainSpecs,
  2937.                 GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
  2938.                 GUI_WindowTitle,        (ULONG)"Graphical Analysis",
  2939.                 GUI_OpenGUI,            (ULONG)FALSE,
  2940.                 GUI_Backfill,           (ULONG)FALSE,
  2941.         GUI_ExtraIDCMP,        (ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
  2942.         GUI_ScreenTitle,    AC_Title,
  2943.                  TAG_DONE);
  2944.  if (analGUI == NULL)
  2945.     return (FALSE);
  2946.  
  2947.  qdateGUI = GF_CreateGUI(guiapp, QD_DatePanel,QD_DateSpecs,
  2948.                 GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
  2949.                 GUI_WindowTitle,        (ULONG)"Dates",
  2950.                 GUI_OpenGUI,            (ULONG)FALSE,
  2951.                 GUI_Backfill,           (ULONG)TRUE,
  2952.         GUI_ExtraIDCMP,        (ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
  2953.         GUI_ScreenTitle,    AC_Title,
  2954.                  TAG_DONE);
  2955.  if (qdateGUI == NULL)
  2956.     return (FALSE);
  2957.  
  2958.  qmemoGUI = GF_CreateGUI(guiapp, QM_MemoPanel,QM_MemoSpecs,
  2959.                 GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
  2960.                 GUI_WindowTitle,        (ULONG)"Memos",
  2961.                 GUI_OpenGUI,            (ULONG)FALSE,
  2962.                 GUI_Backfill,           (ULONG)FALSE,
  2963.         GUI_ExtraIDCMP,        (ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
  2964.         GUI_ScreenTitle,    AC_Title,
  2965.                  TAG_DONE);
  2966.  if (qmemoGUI == NULL)
  2967.     return (FALSE);
  2968.  
  2969.  memoGUI = GF_CreateGUI(guiapp, M_MemoPanel,M_MemoSpecs,
  2970.                 GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
  2971.                 GUI_WindowTitle,        (ULONG)"Quick-Memo Editor",
  2972.                 GUI_OpenGUI,            (ULONG)FALSE,
  2973.                 GUI_Backfill,           (ULONG)TRUE,
  2974.         GUI_ExtraIDCMP,        (ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
  2975.         GUI_ScreenTitle,    AC_Title,
  2976.                  TAG_DONE);
  2977.  if (memoGUI == NULL)
  2978.     return (FALSE);
  2979.  
  2980.  qnameGUI = GF_CreateGUI(guiapp, QN_NamePanel,QN_NameSpecs,
  2981.                 GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
  2982.                 GUI_WindowTitle,        (ULONG)"Payees",
  2983.                 GUI_OpenGUI,            (ULONG)FALSE,
  2984.                 GUI_Backfill,           (ULONG)FALSE,
  2985.         GUI_ExtraIDCMP,        (ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
  2986.         GUI_ScreenTitle,    AC_Title,
  2987.                  TAG_DONE);
  2988.  if (qnameGUI == NULL)
  2989.     return (FALSE);
  2990.  
  2991.  qamntGUI = GF_CreateGUI(guiapp, QA_AmntPanel,QA_AmntSpecs,
  2992.                 GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
  2993.                 GUI_WindowTitle,        (ULONG)"Amounts",
  2994.                 GUI_OpenGUI,            (ULONG)FALSE,
  2995.                 GUI_Backfill,           (ULONG)FALSE,
  2996.         GUI_ExtraIDCMP,        (ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
  2997.         GUI_ScreenTitle,    AC_Title,
  2998.                  TAG_DONE);
  2999.  if (qamntGUI == NULL)
  3000.     return (FALSE);
  3001.  
  3002.  nameGUI = GF_CreateGUI(guiapp, N_NamePanel,N_NameSpecs,
  3003.                 GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
  3004.                 GUI_WindowTitle,        (ULONG)"Quick-Payee Editor",
  3005.                 GUI_OpenGUI,            (ULONG)FALSE,
  3006.                 GUI_Backfill,           (ULONG)TRUE,
  3007.         GUI_ExtraIDCMP,        (ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
  3008.         GUI_ScreenTitle,    AC_Title,
  3009.                  TAG_DONE);
  3010.  if (nameGUI == NULL)
  3011.     return (FALSE);
  3012.  
  3013.  amntGUI = GF_CreateGUI(guiapp, A_AmntPanel,A_AmntSpecs,
  3014.                 GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
  3015.                 GUI_WindowTitle,        (ULONG)"Quick-Amount Editor",
  3016.                 GUI_OpenGUI,            (ULONG)FALSE,
  3017.                 GUI_Backfill,           (ULONG)TRUE,
  3018.         GUI_ExtraIDCMP,        (ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
  3019.         GUI_ScreenTitle,    AC_Title,
  3020.                  TAG_DONE);
  3021.  if (amntGUI == NULL)
  3022.     return (FALSE);
  3023.  
  3024.  formGUI = GF_CreateGUI(guiapp, FP_FormPanel,FP_FormSpecs,
  3025.                 GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
  3026.                 GUI_WindowTitle,        (ULONG)"Check Forms ",
  3027.                 GUI_OpenGUI,            (ULONG)FALSE,
  3028.                 GUI_Backfill,           (ULONG)TRUE,
  3029.         GUI_ExtraIDCMP,        (ULONG)IDCMP_ACTIVEWINDOW,
  3030.         GUI_ScreenTitle,    AC_Title,
  3031.                  TAG_DONE);
  3032.  if (formGUI == NULL)
  3033.     return (FALSE);
  3034.  
  3035.  netGUI = GF_CreateGUI(guiapp, NET_NetPanel,NET_NetSpecs,
  3036.                 GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
  3037.                 GUI_WindowTitle,        (ULONG)"Net Worth Analysis",
  3038.                 GUI_OpenGUI,            (ULONG)FALSE,
  3039.                 GUI_Backfill,           (ULONG)TRUE,
  3040.         GUI_ExtraIDCMP,        (ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
  3041.         GUI_ScreenTitle,    AC_Title,
  3042.                  TAG_DONE);
  3043.  if (netGUI == NULL)
  3044.     return (FALSE);
  3045.  
  3046.  printGUI = GF_CreateGUI(guiapp, PR_PrintPanel,PR_PrintSpecs,
  3047.                 GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
  3048.                 GUI_WindowTitle,        (ULONG)"Print Checks",
  3049.                 GUI_OpenGUI,            (ULONG)FALSE,
  3050.                 GUI_Backfill,           (ULONG)TRUE,
  3051.         GUI_ExtraIDCMP,        (ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
  3052.         GUI_ScreenTitle,    AC_Title,
  3053.                  TAG_DONE);
  3054.  if (printGUI == NULL)
  3055.     return (FALSE);
  3056.  
  3057.  arexxGUI = GF_CreateGUI(guiapp, AX_ArexxPanel,AX_ArexxSpecs,
  3058.                 GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
  3059.                 GUI_WindowTitle,        (ULONG)"Assign Macros",
  3060.                 GUI_OpenGUI,            (ULONG)FALSE,
  3061.                 GUI_Backfill,           (ULONG)TRUE,
  3062.         GUI_ExtraIDCMP,        (ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
  3063.         GUI_ScreenTitle,    AC_Title,
  3064.                  TAG_DONE);
  3065.  if (arexxGUI == NULL)
  3066.     return (FALSE);
  3067.  
  3068.  keyGUI = GF_CreateGUI(guiapp, KEY_KeyPanel,KEY_KeySpecs,
  3069.                 GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
  3070.                 GUI_WindowTitle,        (ULONG)"Keyfile Registration",
  3071.                 GUI_OpenGUI,            (ULONG)FALSE,
  3072.                 GUI_Backfill,           (ULONG)TRUE,
  3073.         GUI_ExtraIDCMP,        (ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
  3074.         GUI_ScreenTitle,    AC_Title,
  3075.                  TAG_DONE);
  3076.  if (keyGUI == NULL)
  3077.     return (FALSE);
  3078.  
  3079. #if 0
  3080.  budgetGUI = GF_CreateGUI(guiapp, BP_BudgetPanel,BP_BudgetSpecs,
  3081.                 GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
  3082.                 GUI_WindowTitle,        (ULONG)"Budget Distribution",
  3083.                 GUI_OpenGUI,            (ULONG)TRUE,
  3084.                 GUI_Backfill,           (ULONG)TRUE,
  3085.         GUI_ExtraIDCMP,        (ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
  3086.         GUI_ScreenTitle,    AC_Title,
  3087.                  TAG_DONE);
  3088.  if (budgetGUI == NULL)
  3089.     return (FALSE);
  3090. #endif
  3091.  
  3092.  return (TRUE);
  3093. }
  3094.  
  3095. /********************************************************************************
  3096. * AmiCloseGUI()
  3097. *
  3098. *    Destroys guis
  3099. *
  3100. *********************************************************************************/
  3101. void AmiCloseGUI(void)
  3102. {
  3103.  selWin = NULL;
  3104. if (seltempGUI) GF_DestroyGUI(seltempGUI);
  3105. if (edittempGUI) GF_DestroyGUI(edittempGUI);
  3106. if (newGUI) GF_DestroyGUI(newGUI);
  3107. if (filterGUI) GF_DestroyGUI(filterGUI);
  3108. if (sortGUI) GF_DestroyGUI(sortGUI);
  3109. if (entryGUI) GF_DestroyGUI(entryGUI);
  3110. if (recGUI) GF_DestroyGUI(recGUI);
  3111. if (acctGUI) GF_DestroyGUI(acctGUI);
  3112. if (searchGUI) GF_DestroyGUI(searchGUI);
  3113. if (catGUI) GF_DestroyGUI(catGUI);
  3114. if (statGUI) GF_DestroyGUI(statGUI);
  3115. if (repGUI) GF_DestroyGUI(repGUI);
  3116. if (scriptGUI) GF_DestroyGUI(scriptGUI);
  3117. if (groupGUI) GF_DestroyGUI(groupGUI);
  3118. if (analGUI) GF_DestroyGUI(analGUI);
  3119. if (formGUI) GF_DestroyGUI(formGUI);
  3120. if (netGUI) GF_DestroyGUI(netGUI);
  3121. if (qdateGUI) GF_DestroyGUI(qdateGUI);
  3122. if (qmemoGUI) GF_DestroyGUI(qmemoGUI);
  3123. if (memoGUI) GF_DestroyGUI(memoGUI);
  3124. if (nameGUI) GF_DestroyGUI(nameGUI);
  3125. if (amntGUI) GF_DestroyGUI(amntGUI);
  3126. if (qamntGUI) GF_DestroyGUI(qamntGUI);
  3127. if (qnameGUI) GF_DestroyGUI(qnameGUI);
  3128. if (printGUI) GF_DestroyGUI(printGUI);
  3129. if (arexxGUI) GF_DestroyGUI(arexxGUI);
  3130. if (keyGUI) GF_DestroyGUI(keyGUI);
  3131. #if 0
  3132. if (budgetGUI) GF_DestroyGUI(budgetGUI);
  3133. #endif
  3134. }
  3135.  
  3136. /********************************************************
  3137. * AmiMoveSwap()
  3138. *
  3139. *    Move the selected item!
  3140. *********************************************************/
  3141. void AmiMoveSwap(void)
  3142. {
  3143.  filterNode *ftemp;
  3144.  entryNode *etemp, *entemp;
  3145.  UWORD eord, enord;
  3146.  
  3147.  if (!moveActive || selRow == -1)
  3148.     return;
  3149.  
  3150.  ftemp = (filterNode *)DataOrd2Node((struct List *)&filtered,selRow);
  3151.  if (ftemp != moveNode) {
  3152.  
  3153.     /* move the template nodes first */
  3154.     Remove((struct Node *)moveNode);
  3155.     if (selRow > moveRow) 
  3156.         Insert( (struct List *)&filtered,(struct Node *)moveNode, (struct Node *)ftemp);
  3157.     else     Insert( (struct List *)&filtered,(struct Node *)moveNode, (struct Node *)ftemp->node.mln_Pred);
  3158.     
  3159.     /* swap the ACTUAL ENTRY NODE */
  3160.     etemp = moveNode->entry;
  3161.     entemp = ftemp->entry;
  3162.     eord = DataFindNode( (struct List *)&entries, (struct Node *)etemp);
  3163.      enord = DataFindNode( (struct List *)&entries, (struct Node *)entemp);
  3164.     Remove((struct Node *)etemp);    
  3165.  
  3166.     if (enord > eord)
  3167.         Insert( (struct List *)&entries,(struct Node *)etemp, (struct Node *)entemp);
  3168.     else    Insert( (struct List *)&entries,(struct Node *)etemp, (struct Node *)entemp->node.mln_Pred);
  3169.  
  3170.     /* display changes */
  3171.     RegMoveList(&filtered,regTopRow);
  3172.     RegRefresh(FALSE);
  3173. /*
  3174.     RegRedrawRow(moveNode);    
  3175.     RegRedrawSel(entemp);
  3176. */
  3177.  
  3178.     amiChangedItems = TRUE;
  3179.  }     
  3180.  
  3181.  AmiMoveRestore();
  3182. }
  3183.  
  3184. /********************************************************
  3185. * AmiMoveActive()
  3186. *
  3187. *    activates mouse ptr and move state
  3188. *********************************************************/
  3189. void AmiMoveActive(void)
  3190. {
  3191.  moveActive = TRUE;
  3192.  moveNode = (filterNode *)DataOrd2Node((struct List *)&filtered,selRow);
  3193.  moveRow = selRow;
  3194.  if (!OS39)
  3195.     SetPointer(amiWindow,movePointer37,7,14,0,-3);
  3196.  else 
  3197.     SetWindowPointer(amiWindow,
  3198.         WA_Pointer,moveObj,        
  3199.         TAG_DONE);
  3200. }
  3201.  
  3202.  
  3203. /********************************************************
  3204. * AmiMoveRestore()
  3205. *
  3206. *    restores mouse ptr and move state
  3207. *********************************************************/
  3208. void AmiMoveRestore(void)
  3209. {
  3210.  
  3211.  moveActive = FALSE;
  3212.  moveNode = NULL;
  3213.  if (!OS39)
  3214.     ClearPointer(amiWindow);
  3215.  else {
  3216.     /*printf("os39 specific\n");*/
  3217.     SetWindowPointer(amiWindow,
  3218.         WA_Pointer,NULL,        
  3219.         TAG_DONE);
  3220.  }
  3221. }
  3222.  
  3223. /********************************************************
  3224. * AmiUnlock()
  3225. *
  3226. *    Unlocks amicheck, supplies normal pointer
  3227. *********************************************************/
  3228. void AmiUnlock()
  3229. {
  3230.  
  3231.  GF_UnlockGUI(gui);
  3232.  if (selWin != NULL)
  3233.     GF_UnlockGUI(seltempGUI);
  3234.  
  3235.  if (!OS39)
  3236.     ClearPointer(amiWindow);
  3237.  else {
  3238.     /*printf("os39 specific\n");*/
  3239.     SetWindowPointer(amiWindow,
  3240.         WA_Pointer,NULL,
  3241.         WA_BusyPointer,FALSE,
  3242.         TAG_DONE);
  3243.  }
  3244. }
  3245.  
  3246. /********************************************************
  3247. * AmiLock()
  3248. *
  3249. *    locks amicheck, supplies wait pointer
  3250. *********************************************************/
  3251. void AmiLock()
  3252. {
  3253.  
  3254.  GF_LockGUI(gui);
  3255.  
  3256.  if (selWin != NULL)
  3257.     GF_LockGUI(seltempGUI);
  3258.  
  3259.  if (!OS39)
  3260.     SetPointer(amiWindow,busyPointer37,16,16,-5,0);
  3261.  else {
  3262.     /*printf("os39 specific\n");*/
  3263.     SetWindowPointer(amiWindow,
  3264.         WA_Pointer,NULL,
  3265.         WA_BusyPointer,TRUE,
  3266.         WA_PointerDelay,FALSE,
  3267.         TAG_DONE);
  3268.  }
  3269. }
  3270.  
  3271. /**********************************************************************
  3272. * AmiCheckRenumber()
  3273. *
  3274. * renumber a check quickly -+ 1-9
  3275. ***********************************************************************/
  3276. void AmiCheckRenumber(char op, long amnt)
  3277. {
  3278.  filterNode *filt;
  3279.  
  3280.  if (selRow == -1)
  3281.     return;
  3282.  
  3283.  filt = (filterNode *)DataOrd2Node((struct List *)&filtered,selRow);
  3284.  if (filt->entry->type != CHECKTYPE)
  3285.     return;
  3286.  
  3287.  switch (op) {
  3288.     case 0:    
  3289.         if (filt->entry->check >= amnt) {
  3290.             filt->entry->check -= amnt;
  3291.             RegRedrawSel(filt);        
  3292.             amiChangedItems = TRUE;
  3293.             amntState.currCheckNumber = filt->entry->check+1;
  3294.         }
  3295.         break;
  3296.     case 1:    ;
  3297.         if (filt->entry->check + amnt < filt->entry->check)
  3298.             break;
  3299.         filt->entry->check += amnt;
  3300.         RegRedrawSel(filt);
  3301.         amiChangedItems = TRUE;
  3302.         amntState.currCheckNumber = filt->entry->check+1; 
  3303.         break;
  3304.  }
  3305. }
  3306.  
  3307. /**********************************************************************************
  3308. * AmiSetupMemo()
  3309. *
  3310. *     Inits the show memo check in the menu to the tooltype
  3311. ***********************************************************************************/
  3312. void AmiSetupMemo(void)
  3313. {
  3314.  struct MenuItem *menu;
  3315.  
  3316.  menu = ItemAddress(menuStrip,FULLMENUNUM(PREFSTITLE,PREFSWINDOW,PREFSWINDOWMEMO));
  3317.  menu->Flags &= ~CHECKED;
  3318.  if (showMemo) menu->Flags |= CHECKED;
  3319.  ResetMenuStrip(amiWindow,menuStrip);
  3320. }
  3321.  
  3322.  
  3323. /**********************************************************************************
  3324. * AmiSetupDclick()
  3325. *
  3326. *     Inits the check in the dclick to the tooltype
  3327. ***********************************************************************************/
  3328. void AmiSetupDclick(void)
  3329. {
  3330.  struct MenuItem *menu;
  3331.  
  3332.  switch (dclicktype) {
  3333.     case 1:
  3334.          menu = ItemAddress(menuStrip,FULLMENUNUM(PREFSTITLE,PREFSDCLICK,PREFSDCLICKC));
  3335.          menu->Flags |= CHECKED;
  3336.          ResetMenuStrip(amiWindow,menuStrip);
  3337.         break;
  3338.  
  3339.     case 2:
  3340.          menu = ItemAddress(menuStrip,FULLMENUNUM(PREFSTITLE,PREFSDCLICK,PREFSDCLICKU));
  3341.          menu->Flags |= CHECKED;
  3342.          ResetMenuStrip(amiWindow,menuStrip);
  3343.         break;
  3344.  
  3345.     default:
  3346.          menu = ItemAddress(menuStrip,FULLMENUNUM(PREFSTITLE,PREFSDCLICK,PREFSDCLICKE));
  3347.          menu->Flags |= CHECKED;
  3348.          ResetMenuStrip(amiWindow,menuStrip);
  3349.         break;
  3350.  }
  3351. }
  3352.  
  3353. /**********************************************************************************
  3354. * AmiSetupDate()
  3355. *
  3356. *     Inits the check in the date to the tooltype
  3357. ***********************************************************************************/
  3358. void AmiSetupDate(void)
  3359. {
  3360.  struct MenuItem *menu;
  3361.  
  3362.  switch (dateFormat) {
  3363.     case DATE_DEC_12:
  3364.          menu = ItemAddress(menuStrip,FULLMENUNUM(PREFSTITLE,PREFSDATE,PREFSDATE2));
  3365.          menu->Flags |= CHECKED;
  3366.          ResetMenuStrip(amiWindow,menuStrip);
  3367.         break;
  3368.  
  3369.     case DATE_12_DEC:
  3370.          menu = ItemAddress(menuStrip,FULLMENUNUM(PREFSTITLE,PREFSDATE,PREFSDATE3));
  3371.          menu->Flags |= CHECKED;
  3372.          ResetMenuStrip(amiWindow,menuStrip);
  3373.         break;
  3374.  
  3375.     default:
  3376.          menu = ItemAddress(menuStrip,FULLMENUNUM(PREFSTITLE,PREFSDATE,PREFSDATE1));
  3377.          menu->Flags |= CHECKED;
  3378.          ResetMenuStrip(amiWindow,menuStrip);
  3379.         break;
  3380.  }
  3381. }
  3382.  
  3383. /**************************************************************************************
  3384. * AmiArexxMenu()
  3385. *
  3386. *    Sets up macro labels in menu
  3387. ***************************************************************************************/
  3388. void AmiArexxMenu(void)
  3389. {
  3390.  int x;
  3391.  struct MenuItem *menu;
  3392.  
  3393.  for (x=0;x<MAXMACROS;x++) {
  3394.      menu = ItemAddress(menuStrip, FULLMENUNUM(AREXXTITLE,AREXXM1+x,NOSUB));
  3395.     ResetMenuStrip(amiWindow,menuStrip);
  3396.  }
  3397.  
  3398. /*sprintf(arexxMacros[2].macroname,"now at %d\n",entryCount);*/
  3399. }
  3400.  
  3401. /**************************************************************************
  3402. * AmiSave()
  3403. *
  3404. *    Save the application
  3405. ****************************************************************************/
  3406. BOOL AmiSave(char *fname, BOOL saveas)
  3407. {
  3408. BOOL ret = TRUE;
  3409.  
  3410. AmiLock();
  3411.  
  3412. /* is this a new file? */
  3413. if (saveas) {
  3414.     if (fname != NULL) {
  3415.         strcpy(currFile, fname);
  3416.         stcgfn(currNode, currFile);
  3417.     }
  3418.     else {
  3419.         if (AmiGetFile(gui,saveASL,currFile,FILESIZE) == 0) {
  3420.             ret = FALSE;
  3421.             goto FINISHED;
  3422.         }
  3423.  
  3424.         strcpy(currNode, saveASL->fr_File);
  3425.     }
  3426. }
  3427.  
  3428.  
  3429. if (DataSaveFile(currFile, saveas) == FALSE) {
  3430.         AmiAnnounce("Encountered trouble trying to save file.");
  3431. }
  3432. else {
  3433.     if (saveas) {
  3434.         DataAttachIcon(iconPath,"AC_Account",currFile);
  3435.         sprintf(amiWindowTitle,"%s: %s",AC_WindowTitle,    currNode);
  3436.         SetWindowTitles(amiWindow,amiWindowTitle,(UBYTE *)-1);
  3437.         OnMenu(amiWindow,FULLMENUNUM(FILETITLE,FILESAVE,NOSUB));
  3438.         OnMenu(amiWindow,FULLMENUNUM(FILETITLE,FILESAVEEXIT,NOSUB));
  3439.     }
  3440.  
  3441.     amiChangedItems = FALSE;
  3442. }    
  3443.  
  3444. FINISHED:
  3445.  
  3446. AmiUnlock();
  3447. return ret;
  3448. }
  3449.  
  3450. /***************************************************************
  3451. * AmiOpen()
  3452. *
  3453. *    Open an application
  3454. ****************************************************************/
  3455. void AmiOpen(char *appfile, BOOL force)
  3456. {
  3457. char fname[FILESIZE];
  3458.  
  3459. if (force || AmiAsk(newstr)) {
  3460.  
  3461.     /* open, and change window title */
  3462.     AmiLock();
  3463.     if (appfile != NULL || AmiGetFile(gui,loadASL,fname,FILESIZE)) {
  3464.         AmiDisableSel(TRUE);
  3465.         OnMenu(amiWindow,FULLMENUNUM(FILETITLE,FILESAVE,NOSUB));
  3466.         OnMenu(amiWindow,FULLMENUNUM(FILETITLE,FILESAVEEXIT,NOSUB));
  3467.  
  3468.         AmiLock();
  3469.  
  3470.         /* file was selected, open it */
  3471.         if (appfile != NULL)
  3472.             strcpy(fname,appfile);
  3473.  
  3474.         seldone = TRUE;
  3475.         SelTempStrip();
  3476.                         
  3477.         amiChangedItems = FALSE;
  3478.         DataFreeAll();    
  3479.         DataInit();
  3480.                         
  3481.         RegNewFilter();        
  3482.         AmiResetBals();
  3483.  
  3484.         /* insert data */
  3485.         if (DataLoadFile(fname) != TRUE) {
  3486.             AmiAnnounce("Encountered trouble opening file\n");
  3487.         }
  3488.         else {
  3489.             /* partition out file name */
  3490.             if (appfile != NULL) {
  3491.                 stcgfn(currNode,appfile);
  3492.                 strcpy(currFile,appfile);
  3493.             }
  3494.             else    {
  3495.                 strcpy(currNode,loadASL->fr_File);
  3496.                 strcpy(currFile,fname);
  3497.             }
  3498.  
  3499.             sprintf(amiWindowTitle,"%s: %s",AC_WindowTitle,
  3500.                 currNode);
  3501.             SetWindowTitles(amiWindow,amiWindowTitle,(UBYTE *)-1);
  3502.  
  3503.             if (autosort == TRUE && !IsListEmpty(&sortfields))
  3504.                 DataSortFilter((filterNode *)filtered.mlh_Head,
  3505.                            (filterNode *)filtered.mlh_TailPred,
  3506.                            (sortNode *)sortfields.lh_Head);
  3507.  
  3508.             AmiArexxMenu();
  3509.  
  3510.             RegNewFilter();
  3511.             DataFilterBalance(&filtered);
  3512.             AmiNewTemp();
  3513.                             
  3514.             DataBuildBal(usrAccount.decimal,&amntState.currAmnt,currStr);
  3515.             DataBuildBal(usrAccount.decimal,&amntState.stateAmnt,stateStr);
  3516.             DataBuildBal(usrAccount.decimal,&filtAmnt,filtStr);
  3517.             AmiUpdateCurr(currStr);
  3518.             AmiUpdateState(stateStr);
  3519.             AmiUpdateFilt(filtStr);
  3520.                             
  3521.             /* enable items */
  3522.             AmiDisableAll(FALSE);
  3523.         }
  3524.         AmiUnlock();
  3525.     }
  3526.     AmiUnlock();
  3527. }
  3528.                 
  3529. }
  3530.  
  3531.  
  3532. /***************************************************
  3533. * AmiBaseHelp()
  3534. *
  3535. *    Initialize the amigaguide context
  3536. ***************************************************/
  3537. LONG AmiBaseHelp(void)
  3538. {
  3539.  LONG retval = 0L;
  3540.  
  3541.   /* Fill in the NewAmigaGuide structure */
  3542.   memset(&newAG,0,sizeof(struct NewAmigaGuide));
  3543.   newAG.nag_Name = guidePath; /*guidePath;*/
  3544.   newAG.nag_Screen = amiWindow->WScreen;
  3545.   newAG.nag_BaseName = "amiCheck";
  3546.  
  3547.   /* Open the AmigaGuide client */
  3548.   if ( !(agc = OpenAmigaGuideAsync(&newAG, 
  3549.             TAG_DONE))) {
  3550.  
  3551.     /* Get the reason for failure */
  3552.       retval = IoErr();
  3553.   }
  3554.  
  3555.   return (retval);
  3556. }
  3557.  
  3558.  
  3559. /***************************************************
  3560. * AmiBaseLink()
  3561. *
  3562. *    Jump to a particular context
  3563. ****************************************************/
  3564. void AmiBaseLink(char *link)
  3565. {
  3566.  
  3567.  if (!amigaguide || agc == NULL)
  3568.     return;
  3569.  
  3570.  SendAmigaGuideCmd(agc,
  3571.     link,
  3572.     NULL);
  3573. }
  3574.  
  3575. /****************************************************
  3576. * AmiHelpMsg()
  3577. *
  3578. *    Handle AmigaGuide messages
  3579. *****************************************************/
  3580. void AmiHelpMsg(void)
  3581. {
  3582.  struct AmigaGuideMsg *agm;
  3583.  
  3584.  while ( agm = GetAmigaGuideMsg(agc)) {
  3585.  
  3586. #if 0
  3587.     switch (agm->agm_Type) {
  3588.  
  3589.         case ToolCmdReplyID:
  3590.             if (agm->agm_Pri_Ret) {
  3591.                 printf("ERROR!\n");
  3592.                 printf("reason=%d,str=%s\n",agm->agm_Sec_Ret,agm->agm_Data);
  3593.             }
  3594.             break;
  3595.  
  3596.         case ToolStatusID:
  3597.             if (agm->agm_Pri_Ret) {
  3598.                 printf("Status: ERROR!\n");
  3599.                 printf("reason=%d,str=%s\n",agm->agm_Sec_Ret,agm->agm_Data);
  3600.             }
  3601.             break;
  3602.     }
  3603. #endif
  3604.     ReplyAmigaGuideMsg(agm);
  3605.  }
  3606.  
  3607. }
  3608.  
  3609. /**************************************************
  3610. * AmiHelpKey()
  3611. *
  3612. *    Open help link based on key
  3613. ***************************************************/
  3614. void AmiHelpKey(struct IntuiMessage *imsg, ULONG panel)
  3615. {
  3616.  
  3617.  if (imsg->Code == HELP_KEY && amigaguide){
  3618.     AmiBaseLink(guideLinks[panel]);
  3619.  }
  3620. }
  3621.  
  3622. /***********************************************************************
  3623. * AmiRunMacro()
  3624. *
  3625. *    Run a macro given a file name
  3626. ************************************************************************/
  3627. void AmiRunMacro(char *fname)
  3628. {
  3629. char copybuf[1024];
  3630. ULONG bytes=0;
  3631. FILE *new = NULL, *orig= NULL;
  3632.  
  3633.  
  3634. orig = fopen(fname,"r");
  3635. if (orig == NULL) {
  3636.     AmiAnnounce("Cannot read macro file.");
  3637.     return;
  3638. }
  3639.  
  3640. /* create temporary file in T: */
  3641. if ( (new= fopen(arexxTemp,"wc")) == NULL) {
  3642.     AmiAnnounce("Trouble preparing to run macro.");
  3643.     return;
  3644. }
  3645.  
  3646. /* copy stub "address amicheck" to it */
  3647. fprintf(new,"/* comment */\nADDRESS %s\n",axContext->portname);
  3648.  
  3649. /* insert rest of macro */
  3650. while ( (bytes = fread(copybuf,1,1024,orig)))
  3651.     fwrite(copybuf,1,bytes,new);
  3652.  
  3653. fclose(orig);
  3654. fclose(new);
  3655.  
  3656. /* execute macro */
  3657.  
  3658. /* execute macro */
  3659. /*
  3660. sprintf(copybuf,"run sys:rexxc/rx %s\n",arexxTemp);
  3661. system(copybuf);
  3662. */
  3663.  
  3664. sprintf(copybuf,"sys:rexxc/rx %s\n",arexxTemp);
  3665. SystemTags(copybuf,
  3666.     SYS_Asynch, TRUE,
  3667.     TAG_DONE);
  3668. #if 0
  3669. RunARexxMacro(
  3670.     axContext,
  3671.     ER_MacroFile, fname,
  3672.     TAG_DONE);
  3673. #endif
  3674. }
  3675.  
  3676. /*************************************************************************
  3677. * AmiGetFile()
  3678. *
  3679. *    Get a file from an ASL requester
  3680. **************************************************************************/
  3681. BOOL AmiGetFile(GUIFront *wgui, struct FileRequester *asl, char *filestore, int storesize) 
  3682. {
  3683.  BOOL retval = FALSE;
  3684.  
  3685.  if (asl == NULL || filestore == NULL)
  3686.     return FALSE;
  3687.  
  3688.  /* lock panel */
  3689.  AmiLock();
  3690.  GF_LockGUI(wgui);
  3691.  
  3692.  
  3693.  if (GF_AslRequest(asl,aslTagList)) {
  3694.  
  3695.     if (!DataGetFileName(filestore,storesize,asl->fr_Drawer,asl->fr_File))
  3696.         strncpy(filestore,asl->fr_File,storesize);
  3697.  
  3698.     retval = TRUE;
  3699.  }
  3700.  
  3701.  /* unlock panel */
  3702.  GF_UnlockGUI(wgui);
  3703.  AmiUnlock();
  3704.  
  3705.  return (retval);
  3706. }
  3707.  
  3708. /******************************************************
  3709. * AmiCountVerify()
  3710. *
  3711. *    Verify for the entry count
  3712. *******************************************************/
  3713. BOOL AmiCountVerify(void) 
  3714. {
  3715.  BOOL anno = !(dummykey.id == dummykey.verify);
  3716.  
  3717.  if (anno)
  3718.     AmiAnnounce(*demoptr);
  3719.  
  3720.  return anno;
  3721. }
  3722.  
  3723. /*******************************************************
  3724. * AmiResetBals()
  3725. *
  3726. *    Reset the balances to zero 
  3727. ********************************************************/
  3728. void AmiResetBals(void) 
  3729. {
  3730.  amountType zero = 0;
  3731.  char amnt[AMNTSIZE];
  3732.  
  3733.  DataInitBal(DEPOSITTYPE,&zero,&amntState.currAmnt);
  3734.  DataInitBal(DEPOSITTYPE,&zero,&amntState.stateAmnt);
  3735.  DataInitBal(DEPOSITTYPE,&zero,&filtAmnt);
  3736.  
  3737.  DataBuildBal(usrAccount.decimal,&amntState.currAmnt,amnt);
  3738.  AmiUpdateCurr(amnt);
  3739.  
  3740.  DataBuildBal(usrAccount.decimal,&amntState.stateAmnt,amnt);
  3741.  AmiUpdateState(amnt);
  3742.  
  3743.  DataBuildBal(usrAccount.decimal,&filtAmnt,amnt);
  3744.  AmiUpdateFilt(amnt);
  3745. }
  3746.