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