home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 6
/
AACD06.ISO
/
AACD
/
Utilities
/
amiCheck
/
Source
/
amiCheck.c
< prev
next >
Wrap
C/C++ Source or Header
|
1998-12-26
|
93KB
|
3,663 lines
/************** AMICHECK main driver ****************/
/* Include everything */
#define INTUI_V36_NAMES_ONLY
#include <dos.h> /* let us use the WBarg stuff */
#include <stdio.h>
#include <proto/dos.h>
#include <proto/exec.h>
#include <intuition/gadgetclass.h>
#include <clib/intuition_protos.h>
#include <clib/graphics_protos.h>
#include <devices/inputevent.h>
#include <clib/keymap_protos.h>
#include <string.h>
#include <clib/asl_protos.h>
#include <libraries/asl.h>
#include <fcntl.h>
#include <clib/icon_protos.h>
#include <intuition/pointerclass.h>
#include <intuition/classusr.h>
#include <clib/utility_protos.h>
#include <libraries/guifront.h>
#include <dos/dostags.h>
#include "amiCheck.h"
#include "mainPanel.h"
#include "regGadget.h"
#include "libraries.h"
#include "enterPanel.h"
#include "seltempPanel.h"
#include "dataBase.h"
#include "edittempPanel.h"
#include "filterPanel.h"
#include "sortPanel.h"
#include "acctPanel.h"
#include "reconcilePanel.h"
#include "searchPanel.h"
#include "categoryPanel.h"
#include "statsPanel.h"
#include "newtempPanel.h"
#include "reportPanel.h"
#include "scriptPanel.h"
#include "analysisPanel.h"
#include "formPanel.h"
#include "netPanel.h"
#include "qdatePanel.h"
#include "qmemoPanel.h"
#include "memoPanel.h"
#include "namePanel.h"
#include "amntPanel.h"
#include "qnamePanel.h"
#include "qamntPanel.h"
#include "impexp.h"
#include "printPanel.h"
#include "groupPanel.h"
#include "arexx.h"
#include "budgetPanel.h"
AMIGAGUIDECONTEXT agc = NULL;
struct NewAmigaGuide newAG = {NULL};
static const char *VersionString = "\0$VER:" ACVERSION " " __AMIGADATE__;
STRPTR AC_AppID = "amiCheck";
STRPTR AC_Version = ACVERSION,
AC_LongDesc = "Checkbook Software",
AC_Author = "Douglas M. Dyer",
AC_Date = __AMIGADATE__;
STRPTR AC_WindowTitle = "amiCheck";
STRPTR AC_Title = "amiCheck " ACVERSION " " __AMIGADATE__;
#define DEFAULT_FILEPATTERN "#?.AC"
#define DEFAULT_IMPORTPATTERN "#?.txt"
#define DEFAULT_SCRIPTPATTERN "#?.ACscript"
#define DEFAULT_NETPATTERN "#?.ACnet"
/* Library bases */
struct Library *GUIFrontBase;
/* Imported from the main panel module */
extern STRPTR AC_Version,
AC_LongDesc,
AC_Author,
AC_Date;
extern STRPTR AC_WindowTitle;
extern STRPTR AC_AppID;
extern AC_InitialOrientation;
/* globals */
char currStr[AMNTSIZE+1];
char stateStr[AMNTSIZE+1];
char filtStr[AMNTSIZE+1];
char filePattern[FILEPATTERN_SIZE];
char importPattern[FILEPATTERN_SIZE];
char scriptPattern[FILEPATTERN_SIZE];
char netPattern[FILEPATTERN_SIZE];
/* global help links */
__far char *guideLinks[] = {
"LINK MAIN_PANEL",
"LINK SELTEMP_PANEL",
"LINK NEWTEMP_PANEL",
"LINK EDITTEMP_PANEL",
"LINK FILTER_PANEL",
"LINK SORT_PANEL",
"LINK ANALYSIS_PANEL",
"LINK FORMS_PANEL",
"LINK ENTRY_PANEL",
"LINK RECONCILE_PANEL",
"LINK ACCOUNT_PANEL",
"LINK SEARCH_PANEL",
"LINK CAT_PANEL",
"LINK STATS_PANEL",
"LINK REPORT_PANEL",
"LINK SCRIPT_PANEL",
"LINK QUICKMEMO_PANEL",
"LINK QUICKDATE_PANEL",
"LINK QUICKNAME_PANEL",
"LINK QUICKAMNT_PANEL",
"LINK MEMO_PANEL",
"LINK AMNT_PANEL",
"LINK NAME_PANEL",
"LINK NET_PANEL",
"LINK PRINT_PANEL",
"LINK GROUP_PANEL",
"LINK AREXX_PANEL",
};
UBYTE dclicktype = 0;
BOOL amigaguide = FALSE;
BOOL bootfile = FALSE;
BOOL layoutwarn = TRUE;
BOOL batchmode = FALSE;
GUIFrontApp *guiapp;
GUIFront *gui;
ExtErrorData exterr;
struct InputEvent ie;
struct Menu *menuStrip = NULL;
extern BOOL skipped;
char currFile[FILESIZE] = "";
char currNode[FILESIZE];
char *iconPath = "PROGDIR:AC_Icons/";
char *guidePath = "PROGDIR:documents/amiCheck.guide";
char arexxTemp[FILESIZE];
BOOL autosort = FALSE;
BOOL alldisabled=FALSE;
BOOL seldone = FALSE;
BOOL simpleRefresh = FALSE;
ULONG amiAslHeight = 200L;
char amiWindowTitle[100];
char *quitstr = "Are you sure you want to quit amiCheck?\nAll changes to the current account will be lost.";
char *newstr = "Are you sure you want to start a new account?\nAll changes to the current account will be lost.";
char *openstr = "Are you sure you want to open an account?\nAll changes to the current account will be lost.";
BOOL FALLBACK = FALSE;
struct NewMenu amiMenu[] =
{
{NM_TITLE, "File", 0,0,0,0,},
{NM_ITEM, "New...", "N",0,0,0,},
{NM_ITEM, NM_BARLABEL, 0,0,0,0,},
{NM_ITEM, "Open...", "O", 0,0,0,},
{NM_ITEM, "Save", "S", 0,0,0,},
{NM_ITEM, "Save and Exit", "X", 0,0,0,},
{NM_ITEM, "Save As...", "A",0,0,0,},
{NM_ITEM, NM_BARLABEL, 0,0,0,0,},
{NM_ITEM, "Import", 0,0,0,0,},
{NM_SUB, "Ascii Format...", 0,0,0,0,},
{NM_ITEM, "Export", 0,0,0,0,},
{NM_SUB, "Ascii Format...", 0,0,0,0,},
{NM_ITEM, NM_BARLABEL, 0,0,0,0,},
{NM_ITEM, "Reconcile...", ";",0,0,0,},
{NM_ITEM, NM_BARLABEL, 0,0,0,0,},
{NM_ITEM, "Print Checks...", "P",0,0,0,},
{NM_ITEM, NM_BARLABEL, 0,0,0,0,},
{NM_ITEM, "About", 0,0,0,0,},
{NM_SUB, "Third Parties...", 0,0,0,0,},
{NM_SUB, "amiCheck...", 0,0,0,0,},
{NM_ITEM, NM_BARLABEL, 0,0,0,0,},
{NM_ITEM, "Quit", "Q",0,0,0,},
{NM_TITLE, "Search", 0,0,0,0,},
{NM_ITEM, "Search...", "[",0,0,0,},
{NM_ITEM, "Search Again", "]",0,0,0,},
{NM_ITEM, NM_BARLABEL, 0,0,0,0,},
{NM_ITEM, "Jump to Selected", "J",NM_ITEMDISABLED,0,0,},
{NM_TITLE, "Edit", 0,0,0,0,},
{NM_ITEM, "Quick Transaction", 0,0,0,0,},
{NM_SUB, "Check...", "C",0,0,0,},
{NM_SUB, "Withdrawal...", "W",0,0,0,},
{NM_SUB, "Deposit...", "D",0,0,0,},
{NM_SUB, "Script...", "P",0,0,0,},
{NM_SUB, "Use Template...", "U",0,0,0,},
{NM_ITEM, "Duplicate Entry...","E",0,0,0,},
{NM_ITEM, "Batch Mode", "B", CHECKIT | MENUTOGGLE,0,0,},
{NM_ITEM, NM_BARLABEL, 0,0,0,0,},
{NM_ITEM, "Clear", "/",NM_ITEMDISABLED,0,0,},
{NM_ITEM, "Unclear", "\\",NM_ITEMDISABLED,0,0,},
{NM_ITEM, NM_BARLABEL, 0,0,0,0,},
{NM_ITEM, "Apply Order...", 0,0,0,0,},
{NM_ITEM, "Move Entry", 0,NM_ITEMDISABLED,0,0,},
{NM_ITEM, "Unfilter Item", "L",NM_ITEMDISABLED,0,0,},
{NM_ITEM, "Range Actions", 0,NM_ITEMDISABLED,0,0,},
{NM_SUB, "Clear All...", 0,0,0,0,},
{NM_SUB, "Unclear All...", 0,0,0,0,},
{NM_SUB, NM_BARLABEL, 0,0,0,0,},
{NM_SUB, "Mark All Deducible...", 0,0,0,0,},
{NM_SUB, "Mark All Non-Deductible...", 0,0,0,0,},
{NM_SUB, "Mark All Printed...",0,0,0,0,},
{NM_SUB, "Mark All Unprinted...", 0,0,0,0,},
{NM_SUB, NM_BARLABEL, 0,0,0,0,},
{NM_SUB, "Void All...", 0,0,0,0,},
{NM_SUB, "Unvoid All...", 0,0,0,0,},
{NM_SUB, NM_BARLABEL, 0,0,0,0,},
{NM_SUB, "Remove All...", 0,0,0,0,},
{NM_ITEM, NM_BARLABEL, 0,0,0,0,},
{NM_ITEM, "Account Info...", "I",0,0,0,},
{NM_ITEM, "Quick Data", 0,0,0,0,},
{NM_SUB, "Memo Editor...", 0,0,0,0,},
{NM_SUB, "Payee Editor...", 0,0,0,0,},
{NM_SUB, "Amounts Editor...", 0,0,0,0,},
{NM_TITLE, "Utility", 0,0,0,0,},
{NM_ITEM, "Report Generator...", "R",0,0,0,},
{NM_ITEM, NM_BARLABEL, 0,0,0,0,},
{NM_ITEM, "Script Editor...", 0,0,0,0,},
{NM_ITEM, NM_BARLABEL, 0,0,0,0,},
{NM_ITEM, "Net Worth...", "T",0,0,0,},
{NM_TITLE, "ARexx", 0,NM_ITEMDISABLED,0,0,},
{NM_ITEM, "Assign Macros...", "M",0,0,0,},
{NM_ITEM, NM_BARLABEL, 0,0,0,0,},
{NM_ITEM, arexxMacros[0].macroname, "1",0,0,0,},
{NM_ITEM, arexxMacros[1].macroname, "2",0,0,0,},
{NM_ITEM, arexxMacros[2].macroname, "3",0,0,0,},
{NM_ITEM, arexxMacros[3].macroname, "4",0,0,0,},
{NM_ITEM, arexxMacros[4].macroname, "5",0,0,0,},
{NM_ITEM, arexxMacros[5].macroname, "6",0,0,0,},
{NM_ITEM, arexxMacros[6].macroname, "7",0,0,0,},
{NM_ITEM, arexxMacros[7].macroname, "8",0,0,0,},
{NM_ITEM, arexxMacros[8].macroname, "9",0,0,0,},
{NM_ITEM, arexxMacros[9].macroname, "0",0,0,0,},
{NM_ITEM, "Other...", 0,0,0,0,},
#if 0
{NM_ITEM, NM_BARLABEL, 0,0,0,0,},
{NM_ITEM, "Start Recording", 0,NM_ITEMDISABLED,0,0,},
{NM_ITEM, "Stop Recording...", 0,NM_ITEMDISABLED,0,0,},
#endif
{NM_ITEM, NM_BARLABEL, 0,NM_ITEMDISABLED,0,0,},
{NM_ITEM, "Open CommandShell", 0,0,0,0,},
{NM_ITEM, "Close CommandShell",0,0,0,0,},
{NM_TITLE, "Preferences", 0,0,0,0,},
{NM_ITEM, "Window", 0,0,0,0,},
{NM_SUB, "Show Memos", "=",CHECKIT | MENUTOGGLE,0,0,},
{NM_ITEM, "Double Click", 0,0,0,0,},
{NM_SUB, "Edit Transaction", 0,CHECKIT | MENUTOGGLE, ~1,0,},
{NM_SUB, "Toggle Clear", 0,CHECKIT | MENUTOGGLE, ~2,0,},
{NM_SUB, "Unfilter", 0,CHECKIT | MENUTOGGLE, ~4,0,},
{NM_ITEM, "Date Format", 0,0,0,0,},
{NM_SUB, "12/31/99", 0,CHECKIT | MENUTOGGLE, ~1,0,},
{NM_SUB, "31/12/99", 0,CHECKIT | MENUTOGGLE, ~2,0,},
{NM_SUB, "DEC-31-99", 0,CHECKIT | MENUTOGGLE, ~4,0,},
{NM_SUB, "31-DEC-99", 0,CHECKIT | MENUTOGGLE, ~8,0,},
{NM_ITEM, NM_BARLABEL, 0,0,0,0,},
{NM_ITEM, "Check Forms...", "F",0,0,0,},
{NM_END, NULL, 0,0,0,0,},
};
/* "flexible" menu arrangement aid */
#define FILETITLE 0
#define SEARCHTITLE 1
#define EDITTITLE 2
#define UTILITYTITLE 3
#define AREXXTITLE 4
#define PREFSTITLE 5
#define FILENEW 0
#define FILEOPEN 2
#define FILESAVE 3
#define FILESAVEEXIT 4
#define FILESAVEAS 5
#define FILEIMPORT 7
#define FILEEXPORT 8
#define FILERECON 10
#define FILEPRINT 12
#define FILEABOUT 14
#define FILEABOUTAC 1
#define FILEABOUTPART 0
#define FILEQUIT 17
#define FILEIMPASCII 0
#define FILEEXPASCII 0
#define SEARCHSEARCH 0
#define SEARCHAGAIN 1
#define SEARCHJUMP 3
#define EDITQUICK 0
#define EDITQCHECK 0
#define EDITQWITHDRAWAL 1
#define EDITQDEPOSIT 2
#define EDITQSCRIPT 3
#define EDITQTEMPLATE 4
#define EDITDUPLICATE 1
#define EDITBATCH 2
#define EDITCLEAR 4
#define EDITUNCLEAR 5
#define EDITAPPLYSORT 7
#define EDITMOVE 8
#define EDITUNFILT 9
#define EDITRANGE 10
#define EDITRANGECLR 0
#define EDITRANGEUCL 1
#define EDITRANGEDED 3
#define EDITRANGEUND 4
#define EDITRANGEPR 5
#define EDITRANGEUPR 6
#define EDITRANGEVD 8
#define EDITRANGEUVD 9
#define EDITRANGERM 11
#define EDITACCT 12
#define EDITDATA 13
#define EDITDMEMO 0
#define EDITDNAME 1
#define EDITDAMNT 2
#define UTILITYREPORT 0
#define UTILITYSCRIPT 2
#define UTILITYNET 4
#define AREXXASSIGN 0
#define AREXXM1 2
#define AREXXM2 3
#define AREXXM3 4
#define AREXXM4 5
#define AREXXM5 6
#define AREXXM6 7
#define AREXXM7 8
#define AREXXM8 9
#define AREXXM9 10
#define AREXXM10 11
#define AREXXOTHER 12
#if 0
#define AREXXBEGINREC 14
#define AREXXENDREC 15
#endif
#define AREXXOPENCMD 14
#define AREXXCLOSECMD 15
#define PREFSWINDOW 0
#define PREFSWINDOWMEMO 0
#define PREFSDCLICK 1
#define PREFSDCLICKE 0
#define PREFSDCLICKC 1
#define PREFSDCLICKU 2
#define PREFSDATE 2
#define PREFSDATE1 0
#define PREFSDATE2 1
#define PREFSDATE3 2
#define PREFSDATE4 3
#define PREFSFORM 4
UWORD __chip busyPointer37[] =
{
0x0000,0x0000,
0x0400,0x07c0,
0x0000,0x07c0,
0x0100,0x0380,
0x0000,0x07e0,
0x07c0,0x1ff8,
0x1ff0,0x3fec,
0x3ff8,0x7fde,
0x3ff8,0x7fbe,
0x7ffc,0xff7f,
0x7efc,0xffff,
0x7ffc,0xffff,
0x3ff8,0x7ffe,
0x3ff8,0x7ffe,
0x1ff0,0x3ffc,
0x07c0,0x1ff8,
0x0000,0x07e0,
0x0000,0x0000,
};
UWORD __chip movePointer37[] =
{
0x0000,0x0000,
0x0180,0x0180,
0x0f80,0x0e00,
0xfffc,0xf07c,
0x7ffc,0x8000,
0x0f80,0xf07c,
0x0180,0x0e00,
0x0000,0x0180,
0x0000,0x0000,
};
UWORD __chip movePointer39[2][7] = {
{
0x0180,
0x0f80,
0xfffc,
0x7ffc,
0x0f80,
0x0180,
0x0000,
},
{
0x0180,
0x0e00,
0xf07c,
0x8000,
0xf07c,
0x0e00,
0x0180,
},
};
struct BitMap ptrBM;
APTR moveObj;
BOOL OS39 = TRUE, moveActive = FALSE;
filterNode *moveNode;
WORD moveRow = -1;
BOOL amidone;
struct TagItem *aslTagList;
struct TagItem scriptloadtags[] =
{
ASL_Hail, (ULONG)"Select Script File:",
ASL_File, (ULONG)"",
ASL_Dir, (ULONG)"PROGDIR:macros",
ASL_Pattern, (ULONG)scriptPattern, /*"#?.ACscript",*/
ASL_FuncFlags, FILF_PATGAD,
TAG_DONE,
};
struct TagItem scriptsavetags[] =
{
ASL_Hail, (ULONG)"Save Script As:",
ASL_File, (ULONG)"untitled.ACscript",
ASL_Pattern,(ULONG)"~(#?.info)",
ASL_FuncFlags, FILF_SAVE,
ASL_Dir, (ULONG)"PROGDIR:macros",
TAG_DONE,
};
struct TagItem rexxtags[] =
{
ASL_Hail, (ULONG)"Select ARexx Macro:",
ASL_File, (ULONG)"",
ASL_FuncFlags, FILF_PATGAD,
ASL_Dir, (ULONG)"PROGDIR:macros",
TAG_DONE,
};
struct TagItem loadtags[] =
{
ASL_Hail, (ULONG)"Open Account:",
ASL_File, (ULONG)"",
ASL_Pattern,(ULONG)filePattern, /*"#?.AC",*/
ASL_FuncFlags, FILF_PATGAD,
ASL_Dir, (ULONG)"PROGDIR:",
TAG_DONE,
};
struct TagItem savetags[] =
{
ASL_Hail, (ULONG)"Save Account As:",
ASL_File, (ULONG)"untitled.AC",
ASL_Pattern,(ULONG)"~(#?.info)",
ASL_Dir, (ULONG)"PROGDIR:",
ASL_FuncFlags, FILF_SAVE,
TAG_DONE,
};
struct TagItem impasciitags[] =
{
ASL_Hail, (ULONG)"Import ASCII:",
ASL_File, (ULONG)"",
ASL_Pattern,(ULONG)importPattern, /*"#?.txt",*/
ASL_FuncFlags, FILF_PATGAD,
ASL_Dir, (ULONG)"PROGDIR:",
TAG_DONE,
};
struct TagItem expasciitags[] =
{
ASL_Hail, (ULONG)"Export Filter as ASCII:",
ASL_File, (ULONG)"untitled.txt",
ASL_Pattern,(ULONG)"~(#?.info)",
ASL_Dir, (ULONG)"PROGDIR:",
ASL_FuncFlags, FILF_SAVE,
TAG_DONE,
};
struct TagItem devtags[] =
{
ASL_Hail, (ULONG)"Select Output Device:",
/*ASL_File, (ULONG)"",*/
ASL_Pattern,(ULONG)"~(#?.info)",
/*ASL_Dir, (ULONG)"PROGDIR:",*/
ASL_FuncFlags, FILF_SAVE,
TAG_DONE,
};
struct TagItem reporttags[] = {
ASL_Hail, (ULONG)"Save Report To:",
ASL_File, (ULONG)"untitled.ACreport",
ASL_Pattern,(ULONG)"#?.ACreport",
ASL_Dir, (ULONG)"PROGDIR:",
ASL_FuncFlags, FILF_SAVE,
TAG_DONE,
};
struct TagItem netloadtags[] =
{
ASL_Hail, (ULONG)"Select Summary File:",
ASL_File, (ULONG)"",
ASL_Pattern, (ULONG)netPattern, /*"#?.ACnet",*/
ASL_Dir, (ULONG)"PROGDIR:",
ASL_FuncFlags, FILF_PATGAD,
TAG_DONE,
};
struct TagItem netsavetags[] =
{
ASL_Hail, (ULONG)"Save Summary As:",
ASL_File, (ULONG)"untitled.ACnet",
ASL_Pattern,(ULONG)"#?.ACnet",
ASL_Dir, (ULONG)"PROGDIR:",
ASL_FuncFlags, FILF_SAVE,
TAG_DONE,
};
struct Window *amiWindow;
struct FileRequester *impasciiASL = NULL, *expasciiASL = NULL;
struct FileRequester *scriptASL = NULL, *devASL = NULL, *reportASL = NULL;
struct FileRequester *loadASL = NULL, *scriptsaveASL = NULL;
struct FileRequester *saveASL = NULL, *netloadASL = NULL, *netsaveASL = NULL;
struct FileRequester *otherRexxASL = NULL;
/* prototypes */
BOOL AmiInit(void);
void AmiShutdown(void);
void AmiSetupMemo(void);
void AmiHandleGadget(struct IntuiMessage *);
void AmiHandleScript(void);
void AmiEditEntry(void);
void AmiProcessRawkeys(struct IntuiMessage *);
void AmiRangeMark(long);
BOOL AmiHandleMenu(struct IntuiMessage *);
BOOL AmiAsk(char *);
void AmiAbout(void);
void AmiAboutPart(void);
void AmiHandleGadgetDown(struct IntuiMessage *);
void AmiSearchFail(void);
BOOL AmiAllocRequesters(void);
void AmiResetBals(void);
void AmiDisableAll(BOOL);
void AmiParseCmd(int, char **);
BOOL AmiOpenGUI(void);
void AmiCloseGUI(void);
void AmiMoveRestore(void);
void AmiMoveActive(void);
void AmiCheckRenumber(char,long);
void AmiLocalMsg(struct IntuiMessage *);
void AmiSetupDclick(void);
void AmiSetupDate(void);
void AmiDuplicateEntry(void);
void AmiToggleClear(void);
void AmiArexxMenu(void);
void AmiApplySort(void);
LONG AmiBaseHelp(void);
void AmiBaseLink(char *);
void AmiHelpMsg(void);
void AmiRunMacro(char *fname);
/* Code */
/*********************************************************************************/
main(int argc, char **argv)
{
ULONG signal, sigmask;
seltempGUI = edittempGUI = newGUI = filterGUI = sortGUI = analGUI = formGUI = NULL;
entryGUI = recGUI = acctGUI = searchGUI = catGUI = statGUI = repGUI = scriptGUI = NULL;
qdateGUI = qmemoGUI = qamntGUI = qnameGUI = memoGUI = amntGUI = nameGUI = netGUI = NULL;
printGUI = groupGUI = arexxGUI = NULL;
/* support either command or tooltypes or wbench */
if (argc == 0) {
argc = _WBArgc;
argv = _WBArgv;
}
AmiParseCmd(argc,argv);
sprintf(amiWindowTitle,AC_WindowTitle);
/* Attempt to open library */
if (GUIFrontBase = OpenLibrary(GUIFRONTNAME, GUIFRONTVERSION))
{
/* Create our application anchor structure */
if (guiapp = GF_CreateGUIApp(AC_AppID,
GFA_Version, AC_Version,
GFA_LongDesc, AC_LongDesc,
GFA_Author, AC_Author,
GFA_Date, AC_Date,
TAG_DONE))
{
/* Create a gui for our application */
TRYLABEL:
if (gui = GF_CreateGUI(guiapp, AC_MainPanel,AC_MainSpecs,
GUI_InitialOrientation, AC_InitialOrientation,
GUI_ExtendedError, &exterr,
GUI_WindowTitle, amiWindowTitle,
GUI_OpenGUI, TRUE,
GUI_ExtraIDCMP, IDCMP_RAWKEY|IDCMP_ACTIVEWINDOW|IDCMP_REFRESHWINDOW,
GUI_NewMenu, amiMenu,
GUI_ScreenTitle, AC_Title,
TAG_DONE))
{
amidone = FALSE;
DataListInit();
/* initialize application interface */
if (!amidone && AmiInit() != TRUE) amidone = TRUE;
if (AmigaGuideBase != NULL) {
amigaguide = TRUE;
AmiBaseHelp();
}
AmiLock();
/* open panels */
if (!amidone && AmiOpenGUI() != TRUE) amidone = TRUE;
if (!amidone && DataInit() != TRUE) amidone = TRUE;
if (!amidone && AnalysisSetup() != TRUE) amidone = TRUE;
if (!amidone) GF_GetGUIAttr(gui,GUI_MenuStrip, &menuStrip, TAG_DONE);
if (menuStrip == NULL) amidone = TRUE;
if (!amidone && EasyRexxBase != NULL) {
if (axOpen() == FALSE) amidone = TRUE;
sigmask = ER_SIGNAL(axContext);
OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,NOITEM,NOSUB));
sprintf(arexxTemp,"T:%s",axContext->portname);
}
else {
sigmask = 0;
axContext = NULL;
OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,NOITEM,NOSUB));
}
/* GF_SetAliasKey(gui,0x40,GID_GETSELTYPE);*/
AmiArexxMenu();
if (!amidone && bootfile)
AmiOpen(currFile,TRUE);
/* set up showMenu check */
if (!amidone) AmiSetupMemo();
if (!amidone) AmiSetupDclick();
if (!amidone) AmiSetupDate();
AmiUnlock();
if (amidone) {
AmiAnnounce("Failed to initialize application:\nTry a smaller font?\nTry more overscan?\nTry a proportional font (ie:helvetica)?");
}
else if (FALLBACK && layoutwarn)
AmiAnnounce("Font did not fit properly:\nCompromised window layout.\n(cosmetic warning only)");
/* Process input events */
while (!amidone || (axContext && ER_SAFETOQUIT(axContext)==FALSE))
{
struct IntuiMessage *imsg;
/* Wait for an event to occur */
signal = GF_Wait(guiapp,ER_SIGNAL(axContext) | AmigaGuideSignal(agc));
/* AREXX message? */
ER_SETSIGNALS(axContext,signal);
if (signal & ER_SIGNAL(axContext)) {
amidone = axHandle(axContext);
continue;
}
/* Amigaguide message? */
else if (signal & AmigaGuideSignal(agc)) {
AmiHelpMsg();
continue;
}
/* We only bother to listen for CLOSEWINDOW events.
* Of course, in a real application, you would be
* examining the Class field for IDCMP_GADGETUP
* messages and act accordingly.
*/
while (imsg = GF_GetIMsg(guiapp))
{
if (imsg->IDCMPWindow->UserData == seltempGUI) {
if (selWin != NULL)
seldone = SelTempMsg(imsg);
}
else if (imsg->IDCMPWindow->UserData == gui) {
AmiLocalMsg(imsg);
}
GF_ReplyIMsg(imsg);
}
if (seldone == TRUE) {
GF_SetGUIAttr(seltempGUI, GUI_OpenGUI, FALSE, TAG_DONE);
selWin = NULL;
seldone = FALSE;
}
}
/* We're done with the GUI, so free it. GF_DestroyGUIApp
* actually does this for us, but it still looks nicer if
* we do it manually (I think :-)
*/
AmiLock();
if (amigaguide && agc) CloseAmigaGuide(agc);
DataFreeAll();
AmiShutdown();
AmiUnlock();
if (EasyRexxBase != NULL) {
axClose();
remove(arexxTemp);
}
GF_DestroyGUI(gui);
LibClose();
}
else {
Printf("Unable to create GUI (Error data: %ld.%ld)\n", exterr.ee_ErrorCode, exterr.ee_ErrorData);
/* attempt to fall back */
if (AC_MainPanel[21] == GUILF_EqualShare) {
AC_MainPanel[21] = GUILF_PropShare;
FALLBACK = TRUE;
goto TRYLABEL;
}
}
/* Destroy application anchor structure */
GF_DestroyGUIApp(guiapp);
}
else
PutStr("Unable to open guifront.library\n");
CloseLibrary(GUIFrontBase);
}
else
PutStr("Requires guifront.library V37+\n");
}
/**********************************************************
* AmiLocalMsg()
*
* Handles messages from afar
***********************************************************/
void AmiLocalMsg(struct IntuiMessage *imsg)
{
switch (imsg->Class) {
case IDCMP_RAWKEY:
AmiProcessRawkeys(imsg);
break;
case IDCMP_MENUPICK:
amidone = AmiHandleMenu(imsg);
break;
case IDCMP_GADGETDOWN:
AmiHandleGadgetDown(imsg);
break;
case IDCMP_MOUSEMOVE:
RegMoveList(&filtered,imsg->Code);
RegRefresh(FALSE);
break;
case IDCMP_CLOSEWINDOW:
amidone = AmiAsk(quitstr);
break;
case IDCMP_GADGETUP:
AmiHandleGadget(imsg);
break;
case IDCMP_REFRESHWINDOW:
RegRefresh(TRUE);
break;
default:
RegRefresh(TRUE);
break;
}
}
/**********************************************************
* AmiInit()
*
* Initialize basic variables and images
***********************************************************/
BOOL AmiInit(void)
{
char buffer[50];
PrefsHandle *ph;
OS39 = TRUE;
if (LibOpen(39L) != TRUE) {
if (LibOpen(37L) != TRUE)
return (FALSE);
OS39 = FALSE;
}
GF_GetGUIAttr(gui,GUI_Window,&amiWindow,TAG_DONE);
if (RegInit() != TRUE) return (FALSE);
if (AmiAllocRequesters() != TRUE) return (FALSE);
GF_LockPrefsList();
for (ph = GF_FirstPrefsNode(); ph != NULL; ph = GF_NextPrefsNode(ph)) {
GF_CopyAppID(ph,buffer);
if (strcmpi(buffer,AC_AppID) == 0)
break;
}
if (ph == NULL)
buffer[0]=0;
GF_GetPrefsAttr (buffer,
PRF_SimpleRefresh, &simpleRefresh,
TAG_DONE);
GF_UnlockPrefsList();
if (simpleRefresh)
simpleRefresh = TRUE;
/* otherwise, */
AmiDisableAll(TRUE);
if (OS39) {
InitBitMap(&ptrBM,2,16,7);
ptrBM.Planes[0] = (char *)movePointer39[0];
ptrBM.Planes[1] = (char *)movePointer39[1];
moveObj = NewObject(NULL,POINTERCLASS,
POINTERA_XOffset,0,
POINTERA_YOffset,-3,
POINTERA_XResolution, POINTERXRESN_HIRES,
POINTERA_YResolution, POINTERYRESN_HIGHASPECT,
POINTERA_BitMap, &ptrBM,
TAG_DONE);
}
return (TRUE);
}
/**********************************************************
* AmiShutdown()
*
* Quitting the application
**********************************************************/
void AmiShutdown(void)
{
if (OS39) {
/*printf("os39 specifics\n");*/
DisposeObject(moveObj);
}
AmiCloseGUI();
if (scriptASL) FreeAslRequest(scriptASL);
if (loadASL) FreeAslRequest(loadASL);
if (saveASL) FreeAslRequest(saveASL);
if (impasciiASL) FreeAslRequest(impasciiASL);
if (expasciiASL) FreeAslRequest(expasciiASL);
if (otherRexxASL) FreeAslRequest(otherRexxASL);
if (aslTagList) FreeTagItems(aslTagList);
RegFreeAll();
AnalysisFree();
}
/*********************************************************
* AmiHandleGadget()
*
* Handle gadget activity of this panel
**********************************************************/
void AmiHandleGadget( struct IntuiMessage *imsg)
{
struct Gadget *gad = (struct Gadget *)(imsg->IAddress);
/*UWORD code = imsg->Code; */
if (moveActive)
AmiMoveRestore();
switch (gad->GadgetID) {
case GID_ANALYSIS:
if (AnalysisGUI())
AmiDisableSel(FALSE);
break;
case GID_SORT:
if (SortGUI() == TRUE) {
AmiLock();
/*DataRebuildFilters();*/
if (!IsListEmpty(&sortfields))
DataSortFilter((filterNode *)filtered.mlh_Head,
(filterNode *)filtered.mlh_TailPred,
(sortNode *)sortfields.lh_Head);
else DataRebuildFilters();
RegNewFilter();
AmiUnlock();
}
break;
case GID_GETSELTYPE:
SelTempGUI();
AmiNewTemp();
break;
case GID_STATS:
StatGUI();
break;
case GID_BUDGET:
CatGUI();
break;
case GID_NEWTYPE:
EditTempGUI();
/* update type field */
AmiNewTemp();
break;
case GID_FILTER:
if (FilterGUI() == TRUE) {
AmiLock();
memcpy(&filterControl, &currFilter, sizeof(filterSetting));
DataRebuildFilters();
if (autosort == TRUE && !IsListEmpty(&sortfields))
DataSortFilter((filterNode *)filtered.mlh_Head,
(filterNode *)filtered.mlh_TailPred,
(sortNode *)sortfields.lh_Head);
RegNewFilter();
DataFilterBalance(&filtered);
DataBuildBal(usrAccount.decimal,&filtAmnt,filtStr);
AmiUpdateFilt(filtStr);
AmiUnlock();
}
break;
case GID_EDIT:
AmiEditEntry();
break;
#if 0
case GID_RECONCILE:
ReconcileGUI();
break;
#endif
}
}
/******************************************************************
* AmiEnterData()
*
* Called by seltemp
*******************************************************************/
void AmiEnterData(void)
{
entryNode *entry;
filterNode *filt;
BOOL del;
if (amntState.currTemplate == SCRIPTTYPE)
AmiHandleScript();
else do {
entry = EntryGUI("Enter New Transaction",FALSE, NULL, &del);
if (entry != NULL) {
DataAddEntry(entry,&entries, &filt);
/* update curr balance */
if (!(entry->flags & VOIDED)) {
DataUpdateBal(entry->type, &entry->amount,
&amntState.currAmnt,currStr);
AmiUpdateCurr(currStr);
}
if (filt != NULL) {
RegAddEntry(filt);
if ( !(entry->flags & VOIDED)) {
DataUpdateBal(entry->type, &entry->amount,
&filtAmnt,filtStr);
AmiUpdateFilt(filtStr);
}
AmiDisableSel(TRUE);
}
memcpy(&currDate,&entry->date,sizeof(dateType));
currCentury = entry->date.year/100;
}
} while (entry != NULL && batchmode);
return;
}
/*******************************************************************
* AmiHandleScript()
*
* scripting engine
********************************************************************/
void AmiHandleScript(void)
{
char fname[FILESIZE], line[FILESIZE];
FILE *scr;
BOOL del = FALSE;
entryNode *entry;
filterNode *filt;
/* open requester */
AmiLock();
if (AmiGetFile(gui,scriptASL,fname,FILESIZE)) {
if ( !(scr = fopen(fname,"r")) ) {
AmiAnnounce("Could not open script file.");
return;
}
/*while (fscanf(scr,"%s",line) != EOF) */
while (fgets(line,FILESIZE-1,scr) != NULL) {
/* remove \n */
if (strlen(line)>0)
line[strlen(line)-1]=0;
amntState.currTemplate = DataNode2Ord(&templates,line);
entry = EntryGUI("Enter New Transaction", TRUE, NULL, &del);
if (entry != NULL && !skipped) {
DataAddEntry(entry,&entries, &filt);
/* update curr balance */
if (!(entry->flags & VOIDED)) {
DataUpdateBal(entry->type, &entry->amount,
&amntState.currAmnt, currStr);
AmiUpdateCurr(currStr);
}
if (filt != NULL) {
if ( !(entry->flags & VOIDED)) {
DataUpdateBal(entry->type, &entry->amount,
&filtAmnt, filtStr);
AmiUpdateFilt(filtStr);
}
RegAddEntry(filt);
}
memcpy(&currDate,&entry->date,sizeof(dateType));
currCentury = entry->date.year/100;
}
/* if enter data was canceled (not skipped), quit script */
if (entry == NULL && !skipped)
break;
}
/* close file */
fclose(scr);
/* return curr template to script type */
amntState.currTemplate = SCRIPTTYPE;
}
AmiUnlock();
}
/*********************************************************************
* AmiNewTemp
*
* Opens user template selection panel
*********************************************************************/
void AmiNewTemp(void)
{
templateNode *temp;
/* update type field */
temp = (templateNode *)DataOrd2Node(&templates,amntState.currTemplate);
GF_SetGadgetAttrs(gui,gadgetspecs[GID_SELTYPE].gs_Gadget,
GTTX_Text,temp->tempname,
TAG_DONE);
}
/*************************************************
* AmiProcessRawkeys
*
* Process the rawkeys into ansi
**************************************************/
void AmiProcessRawkeys(struct IntuiMessage *imsg)
{
static BOOL upevent = FALSE;
static BOOL renum = FALSE;
static long upval;
static BOOL shift = FALSE, ctrl = FALSE;
if (moveActive)
AmiMoveRestore();
/* check renumber scheme */
if (renum && upevent && imsg->Code > 0x0 && imsg->Code < 0xA){
if (upval == (0x4f | 0x80)) {
AmiCheckRenumber(0,imsg->Code);
}
else if (upval == (0x4e | 0x80)) {
AmiCheckRenumber(1,imsg->Code);
}
renum = FALSE;
return;
}
if (upevent && imsg->Code != upval)
return;
upevent = FALSE;
renum = FALSE;
/* for now, use raw keys */
switch (imsg->Code) {
case 0x40:
if (!alldisabled) {
SelTempGUI();
AmiNewTemp();
}
break;
case 0xe1:
case 0xe0:
shift = FALSE;
break;
case 0x61:
case 0x60:
shift = TRUE;
break;
case 0xe3:
ctrl = FALSE;
break;
case 0x63:
ctrl = TRUE;
break;
case 0x4f:
upevent = renum = TRUE;
upval = imsg->Code | 0x80;
break;
case 0x4e:
upevent = renum = TRUE;
upval = imsg->Code | 0x80;
break;
case 0x4c:
upevent = TRUE;
upval = imsg->Code | 0x80;
if (shift)
RegKeyScroll(SHIFTUP);
else if (ctrl)
RegKeyScroll(CTRLUP);
else
RegKeyScroll(UP);
break;
case 0x4d:
upevent = TRUE;
upval = imsg->Code | 0x80;
if (shift)
RegKeyScroll(SHIFTDOWN);
else if (ctrl)
RegKeyScroll(CTRLDOWN);
else
RegKeyScroll(DOWN);
break;
case HELP_KEY:
AmiBaseLink(guideLinks[MAIN_PANEL]);
break;
}
#if 0
UBYTE buffer[9];
struct InputEvent ie;
APTR *eventptr;
ie.ie_Class = IECLASS_RAWKEY;
ie.ie_Code = imsg->Code;
ie.ie_Qualifier = imsg->Qualifier;
eventptr = imsg->IAddress;
ie.ie_EventAddress = *eventptr;
x=MapRawKey(&ie, buffer, 8, NULL);
if (x == -1)
return;
else if (x) {
buffer[x]=0;
printf("MAPS TO:[%s]:",buffer);
for (y=0;y<x;y++)
printf(" %x",buffer[y]);
printf("\n");
}
#endif
}
/*******************************************************
* AmiDuplicateEntry()
*
* Duplicate and edit current transaction
********************************************************/
void AmiDuplicateEntry(void)
{
filterNode *find, *filt;
entryNode *entry, orig;
BOOL del;
find = (filterNode *)DataOrd2Node((struct List *)&filtered,selRow);
if (find == NULL) return;
memcpy(&orig,find->entry,sizeof(entryNode));
/* raise panel */
do {
if (orig.type == CHECKTYPE)
orig.check = amntState.currCheckNumber;
entry = EntryGUI("Duplicated Transaction",FALSE,&orig, &del);
if (entry != NULL) {
DataAddEntry(entry,&entries, &filt);
/* update curr balance */
if (!(entry->flags & VOIDED)) {
DataUpdateBal(entry->type, &entry->amount, &amntState.currAmnt,currStr);
AmiUpdateCurr(currStr);
}
if (filt != NULL) {
RegAddEntry(filt);
if ( !(entry->flags & VOIDED)) {
DataUpdateBal(entry->type, &entry->amount, &filtAmnt, filtStr);
AmiUpdateFilt(filtStr);
}
AmiDisableSel(TRUE);
}
memcpy(&currDate,&entry->date,sizeof(dateType));
memcpy(&orig.date,&entry->date,sizeof(dateType));
currCentury = entry->date.year/100;
}
} while (entry != NULL && batchmode);
}
/*******************************************************
* AmiEditEntry()
*
* Edits an entry by poping up entry panel
********************************************************/
void AmiEditEntry(void)
{
BOOL del;
amountType amount;
UBYTE type, flag;
filterNode *find;
entryNode *edit, *entry;
find = (filterNode *)DataOrd2Node((struct List *)&filtered,selRow);
edit = find->entry;
/* lets remove its amount */
amount = edit->amount;
type = edit->type;
flag = edit->flags;
if ( !(flag & VOIDED) ) {
if (edit->type != DEPOSITTYPE ) {
DataUpdateBal(DEPOSITTYPE,&edit->amount, &amntState.currAmnt,currStr);
DataUpdateBal(DEPOSITTYPE,&edit->amount, &filtAmnt, filtStr);
}
else {
DataUpdateBal(CHECKTYPE,&edit->amount,&amntState.currAmnt,currStr);
DataUpdateBal(CHECKTYPE,&edit->amount,&filtAmnt, filtStr);
}
}
else amount = 0;
/* raise panel */
entry = EntryGUI("Edit Transaction",FALSE,edit, &del);
if (entry != NULL ) {
memcpy( ((char *)edit)+sizeof(struct MinNode),
((char *)entry)+sizeof(struct MinNode),
sizeof(entryNode)-sizeof(struct MinNode));
if (DataTestFilter(edit,&filterControl)) {
RegRedrawSel(find);
if ( !(edit->flags & VOIDED))
DataUpdateBal(type,&edit->amount, &filtAmnt, filtStr);
}
else {
DataRemoveFilter(find);
RegRemoveSel();
}
if ( !(edit->flags & VOIDED) )
DataUpdateBal(type,&edit->amount, &amntState.currAmnt, currStr);
AmiUpdateCurr(currStr);
AmiUpdateFilt(filtStr);
memcpy(&currDate,&entry->date,sizeof(dateType));
currCentury = entry->date.year/100;
}
else {
if (del == TRUE) {
DataRemoveEntry(edit,find);
amiChangedItems = TRUE;
RegRemoveSel();
if ( !(flag & VOIDED) ) {
AmiUpdateCurr(currStr);
AmiUpdateFilt(filtStr);
}
}
else {
/* oops, stick the old one back in! */
if ( !(flag & VOIDED) )
DataUpdateBal(type,&amount, &amntState.currAmnt, currStr);
DataUpdateBal(type,&amount, &filtAmnt, filtStr);
}
}
}
/******************************************************
* AmiHandleMenu()
*
* process menu selections
*******************************************************/
BOOL AmiHandleMenu(struct IntuiMessage *imsg)
{
BOOL done = FALSE, donemenu = FALSE;
UWORD menunum;
UWORD row;
UWORD title, item, sub;
amountType amount;
struct MenuItem *menu;
char fname[FILESIZE+15];
filterNode *filt;
menunum = imsg->Code;
while ( (menunum != MENUNULL) && (!donemenu) ) {
menu = ItemAddress(menuStrip,menunum);
title = MENUNUM(menunum);
item = ITEMNUM(menunum);
sub = SUBNUM(menunum);
if (title == FILETITLE) {
AmiMoveRestore();
switch (item) {
case FILENEW:
if (AmiAsk(newstr)) {
if (AcctGUI("New Account",TRUE) == TRUE) {
amntState.currTemplate = CHECKTYPE;
AmiNewTemp();
seldone = TRUE;
SelTempStrip();
AmiLock();
DataFreeAll();
DataInit(); /* zeros out stuff! */
AmiDisableSel(TRUE);
RegNewFilter();
AmiArexxMenu();
memcpy(&usrAccount, &tempAcct, sizeof(accntState));
DataUpdateBal(DEPOSITTYPE,&usrAccount.beginAmount,
&amntState.currAmnt, currStr);
AmiUpdateCurr(currStr);
amntState.currCheckNumber = usrAccount.checknumber-1;
sprintf(currFile,"%s","untitled.AC");
sprintf(amiWindowTitle,"%s: %s",AC_WindowTitle,currFile);
SetWindowTitles(amiWindow,amiWindowTitle,(UBYTE *)-1);
AmiDisableAll(FALSE);
OffMenu(amiWindow,FULLMENUNUM(FILETITLE,FILESAVE,NOSUB));
OffMenu(amiWindow,FULLMENUNUM(FILETITLE,FILESAVEEXIT,NOSUB));
DataBuildBal(usrAccount.decimal,&amntState.currAmnt,currStr);
DataBuildBal(usrAccount.decimal,&amntState.stateAmnt,stateStr);
DataBuildBal(usrAccount.decimal,&filtAmnt,filtStr);
AmiUpdateCurr(currStr);
AmiUpdateState(stateStr);
AmiUpdateFilt(filtStr);
amiChangedItems = TRUE;
AmiUnlock();
}
}
break;
case FILEOPEN:
AmiOpen(NULL,FALSE);
break;
case FILESAVEEXIT:
if (AmiSave(NULL,FALSE))
done = TRUE;
break;
case FILESAVE:
AmiSave(NULL,FALSE);
break;
case FILESAVEAS:
AmiSave(NULL,TRUE);
break;
case FILEPRINT:
PrintGUI();
break;
case FILEIMPORT:
switch (sub) {
case FILEIMPASCII:
if (selRow == -1) {
if (!DataQuery(gui,"Items will be appended to\nthe bottom of the database.",
"OK|Cancel")) {
break;
}
}
else {
if (!DataQuery(gui,"Items will be appended under\nthe selected transaction.",
"OK|Cancel")) {
break;
}
}
AmiLock();
if (AmiGetFile(gui,impasciiASL,fname,FILESIZE)) {
if (ImportAscii(fname) != TRUE)
AmiAnnounce("Problem importing file.");
}
AmiUnlock();
break;
}
break;
case FILEEXPORT:
switch (sub) {
case FILEEXPASCII:
AmiLock();
if (AmiGetFile(gui,expasciiASL,fname,FILESIZE)) {
if (ExportAscii(fname) != TRUE)
AmiAnnounce("Problem exporting file.");
}
AmiUnlock();
break;
}
break;
case FILERECON:
ReconcileGUI();
break;
case FILEABOUT:
switch (sub) {
case FILEABOUTAC:
AmiAbout();
break;
case FILEABOUTPART:
AmiAboutPart();
break;
}
break;
case FILEQUIT:
done = AmiAsk(quitstr);
break;
}
}
else if (title == SEARCHTITLE) {
AmiMoveRestore();
switch (item) {
case SEARCHSEARCH:
if (SearchGUI(&row)) {
row = DataSearchFilter(&filtered,&searchControl);
if (row == -1) {
/* announce to user of search failure */
AmiSearchFail();
}
else {
searchControl.lastrow = selRow = row;
RegMoveToSel(&filtered);
AmiDisableSel(FALSE);
}
}
break;
case SEARCHAGAIN:
row = DataSearchFilter(&filtered,&searchControl);
if (row == -1) {
/* announce to user of search failure */
AmiSearchFail();
}
else {
searchControl.lastrow = selRow = row;
RegMoveToSel(&filtered);
}
break;
case SEARCHJUMP:
if (selRow != -1)
RegMoveToSel(&filtered);
break;
}
}
else if (title == EDITTITLE) {
switch (item) {
case EDITDATA:
AmiMoveRestore();
switch (sub) {
case EDITDMEMO:
MemoGUI();
break;
case EDITDAMNT:
AmntGUI();
break;
case EDITDNAME:
NameGUI();
break;
}
break;
case EDITQUICK:
AmiMoveRestore();
switch (sub) {
case EDITQCHECK:
amntState.currTemplate = CHECKTYPE;
AmiNewTemp();
AmiEnterData();
break;
case EDITQWITHDRAWAL:
amntState.currTemplate = WITHDRAWALTYPE;
AmiNewTemp();
AmiEnterData();
break;
case EDITQDEPOSIT:
amntState.currTemplate = DEPOSITTYPE;
/* update type field */
AmiNewTemp();
AmiEnterData();
break;
case EDITQTEMPLATE:
AmiEnterData();
break;
case EDITQSCRIPT:
amntState.currTemplate = SCRIPTTYPE;
AmiNewTemp();
AmiEnterData();
break;
}
break;
case EDITBATCH:
AmiMoveRestore();
batchmode = !batchmode;
break;
case EDITCLEAR:
AmiMoveRestore();
filt = (filterNode *)DataOrd2Node((struct List *)&filtered,selRow);
filt->entry->flags |= CLEARED;
amount = filt->entry->amount;
if (DataTestFilter(filt->entry,&filterControl))
RegRedrawSel(filt);
else {
if ( !(filt->entry->flags & VOIDED)) {
DataUpdateBal(
(filt->entry->type==DEPOSITTYPE)?WITHDRAWALTYPE:DEPOSITTYPE,
&amount, &filtAmnt, filtStr);
AmiUpdateFilt(filtStr);
}
DataRemoveFilter(filt);
RegRemoveSel();
}
amiChangedItems = TRUE;
break;
case EDITUNCLEAR:
AmiMoveRestore();
filt = (filterNode *)DataOrd2Node((struct List *)&filtered,selRow);
filt->entry->flags &= ~CLEARED;
amount = filt->entry->amount;
if (DataTestFilter(filt->entry,&filterControl))
RegRedrawSel(filt);
else {
if ( !(filt->entry->flags & VOIDED)) {
DataUpdateBal(
(filt->entry->type==DEPOSITTYPE)?WITHDRAWALTYPE:DEPOSITTYPE,
&amount, &filtAmnt, filtStr);
AmiUpdateFilt(filtStr);
}
DataRemoveFilter(filt);
RegRemoveSel();
}
amiChangedItems = TRUE;
break;
case EDITDUPLICATE:
AmiMoveRestore();
AmiDuplicateEntry();
break;
case EDITMOVE:
if (moveActive) {
AmiMoveRestore();
}
else {
ActivateWindow(amiWindow);
AmiMoveActive();
}
break;
case EDITAPPLYSORT:
AmiApplySort();
break;
case EDITUNFILT:
AmiMoveRestore();
AmiLock();
filt = (filterNode *)DataOrd2Node((struct List *)&filtered,selRow);
amount = filt->entry->amount;
if ( !(filt->entry->flags & VOIDED)) {
DataUpdateBal(
(filt->entry->type==DEPOSITTYPE)?WITHDRAWALTYPE:DEPOSITTYPE,
&amount, &filtAmnt, filtStr);
AmiUpdateFilt(filtStr);
}
DataRemoveFilter(filt);
RegRemoveSel();
AmiUnlock();
break;
case EDITRANGE:
AmiMoveRestore();
AmiRangeMark(sub);
break;
case EDITACCT:
AmiMoveRestore();
if (AcctGUI("Account Information",FALSE) == TRUE) {
amount = 0;
DataUpdateBal(DEPOSITTYPE,&amount,
&amntState.currAmnt,currStr);
AmiUpdateCurr(currStr);
}
break;
}
}
else if (title == UTILITYTITLE) {
AmiMoveRestore();
switch (item) {
case UTILITYREPORT:
ReportGUI();
break;
case UTILITYSCRIPT:
ScriptGUI();
break;
case UTILITYNET:
NetGUI();
break;
}
}
else if (title == AREXXTITLE) {
AmiMoveRestore();
switch (item) {
case AREXXASSIGN:
if (ArexxGUI())
AmiArexxMenu();
break;
case AREXXM1:
AmiRunMacro(arexxMacros[0].macrofile);
break;
case AREXXM2:
AmiRunMacro(arexxMacros[1].macrofile);
break;
case AREXXM3:
AmiRunMacro(arexxMacros[2].macrofile);
break;
case AREXXM4:
AmiRunMacro(arexxMacros[3].macrofile);
break;
case AREXXM5:
AmiRunMacro(arexxMacros[4].macrofile);
break;
case AREXXM6:
AmiRunMacro(arexxMacros[5].macrofile);
break;
case AREXXM7:
AmiRunMacro(arexxMacros[6].macrofile);
break;
case AREXXM8:
AmiRunMacro(arexxMacros[7].macrofile);
break;
case AREXXM9:
AmiRunMacro(arexxMacros[8].macrofile);
break;
case AREXXM10:
AmiRunMacro(arexxMacros[9].macrofile);
break;
case AREXXOTHER:
AmiLock();
if (AmiGetFile(gui,otherRexxASL,fname,FILESIZE)) {
AmiUnlock();
AmiRunMacro(fname);
}
else {
AmiUnlock();
}
break;
#if 0
case AREXXBEGINREC:
break;
case AREXXENDREC:
break;
#endif
case AREXXOPENCMD:
axOpenCmd();
break;
case AREXXCLOSECMD:
axCloseCmd();
break;
}
}
else if (title == PREFSTITLE) {
AmiMoveRestore();
switch (item) {
case PREFSWINDOW:
switch (sub) {
case PREFSWINDOWMEMO:
RegSwapMemo();
break;
}
break;
case PREFSDCLICK:
switch (sub) {
case PREFSDCLICKE:
dclicktype = 0;
break;
case PREFSDCLICKC:
dclicktype=1;
break;
case PREFSDCLICKU:
dclicktype=2;
break;
}
break;
case PREFSDATE:
switch (sub) {
case PREFSDATE1:
dateFormat = DATE_MMDDYY;
RegResetOffsets(1);
RegRedrawFilter(0);
QDateNewFormat();
break;
case PREFSDATE2:
dateFormat = DATE_DDMMYY;
RegResetOffsets(1);
RegRedrawFilter(0);
QDateNewFormat();
break;
case PREFSDATE3:
dateFormat = DATE_DEC_12;
RegResetOffsets(1);
RegRedrawFilter(0);
QDateNewFormat();
break;
case PREFSDATE4:
dateFormat = DATE_12_DEC;
RegResetOffsets(1);
RegRedrawFilter(0);
QDateNewFormat();
break;
}
break;
case PREFSFORM:
FormGUI();
break;
}
}
menunum = menu->NextSelect;
}
return (done);
}
/********************************************************************
* AmiApplySort()
*
* Enforce current order of filter
*********************************************************************/
void AmiApplySort(void)
{
filterNode *filt = NULL;
entryNode *last = NULL;
AmiLock();
if (!DataQuery(gui,"This will affect all filtered entries.\nAre you sure?","OK|Cancel")) {
AmiUnlock();
return;
}
while ( (filt = (filterNode *)DataGetNext((struct List *)&filtered,(struct Node *)filt)) != NULL) {
/* first entry will be our "top" */
if (last != NULL) {
Remove((struct Node *)filt->entry);
Insert((struct List *)&entries,(struct Node *)filt->entry,(struct Node *)last);
}
last = filt->entry;
}
AmiUnlock();
}
/*********************************************************************
* AmiRangeMark()
*
* Mark all filtered transactions
**********************************************************************/
void AmiRangeMark(long item)
{
filterNode *filt = NULL;
amountType amount;
/* verify! */
AmiLock();
if (!DataQuery(gui,"This will affect all filtered entries.\nAre you sure?","OK|Cancel")) {
AmiUnlock();
return;
}
switch (item) {
case EDITRANGECLR:
while ( (filt = (filterNode *)DataGetNext((struct List *)&filtered,(struct Node *)filt)) != NULL)
filt->entry->flags |= CLEARED;
break;
case EDITRANGEUCL:
while ( (filt = (filterNode *)DataGetNext((struct List *)&filtered,(struct Node *)filt)) != NULL)
filt->entry->flags &= ~CLEARED;
break;
case EDITRANGEDED:
while ( (filt = (filterNode *)DataGetNext((struct List *)&filtered,(struct Node *)filt)) != NULL)
filt->entry->flags |= TAXDEDUCT;
break;
case EDITRANGEUND:
while ( (filt = (filterNode *)DataGetNext((struct List *)&filtered,(struct Node *)filt)) != NULL)
filt->entry->flags &= ~TAXDEDUCT;
break;
case EDITRANGEPR:
while ( (filt = (filterNode *)DataGetNext((struct List *)&filtered,(struct Node *)filt)) != NULL) {
if (filt->entry->type != CHECKTYPE)
continue;
filt->entry->flags |= PRINTED;
}
break;
case EDITRANGEUPR:
while ( (filt = (filterNode *)DataGetNext((struct List *)&filtered,(struct Node *)filt)) != NULL) {
if (filt->entry->type != CHECKTYPE)
continue;
filt->entry->flags &= ~PRINTED;
}
break;
case EDITRANGEVD:
while ( (filt = (filterNode *)DataGetNext((struct List *)&filtered,(struct Node *)filt)) != NULL) {
if (filt->entry->type != CHECKTYPE)
continue;
amount = filt->entry->amount;
if ( !(filt->entry->flags & VOIDED)) {
DataUpdateBal(
(filt->entry->type==DEPOSITTYPE)?WITHDRAWALTYPE:DEPOSITTYPE,
&amount, &amntState.currAmnt, currStr);
}
filt->entry->flags |= VOIDED;
}
break;
case EDITRANGEUVD:
while ( (filt = (filterNode *)DataGetNext((struct List *)&filtered,(struct Node *)filt)) != NULL) {
if (filt->entry->type != CHECKTYPE)
continue;
amount = filt->entry->amount;
if ((filt->entry->flags & VOIDED)) {
DataUpdateBal(
(filt->entry->type==DEPOSITTYPE)?DEPOSITTYPE:WITHDRAWALTYPE,
&amount, &amntState.currAmnt, currStr);
}
filt->entry->flags &= ~VOIDED;
}
break;
case EDITRANGERM:
while ( (filt = (filterNode *)DataGetNext((struct List *)&filtered,NULL)) != NULL) {
amount = filt->entry->amount;
if ( !(filt->entry->flags & VOIDED)) {
DataUpdateBal(
(filt->entry->type==DEPOSITTYPE)?WITHDRAWALTYPE:DEPOSITTYPE,
&amount, &amntState.currAmnt, currStr);
}
DataRemoveEntry(filt->entry,filt);
}
break;
}
amiChangedItems = TRUE;
DataUpdateFilters(&filtered);
if (autosort == TRUE && !IsListEmpty(&sortfields))
DataSortFilter((filterNode *)filtered.mlh_Head,
(filterNode *)filtered.mlh_TailPred,
(sortNode *)sortfields.lh_Head);
RegNewFilter();
DataFilterBalance(&filtered);
DataBuildBal(usrAccount.decimal, &filtAmnt,filtStr);
AmiUpdateFilt(filtStr);
AmiUpdateCurr(currStr);
AmiUnlock();
}
/*********************************************************************
* AmiToggleClear()
*
* Toggles the clear flag of transaction
**********************************************************************/
void AmiToggleClear(void)
{
filterNode *find;
find = (filterNode *)DataOrd2Node((struct List *)&filtered,selRow);
find->entry->flags ^= CLEARED;
if (DataTestFilter(find->entry,&filterControl))
RegRedrawSel(find);
else {
if ( !(find->entry->flags & VOIDED))
DataUpdateBal((find->entry->type==DEPOSITTYPE)?WITHDRAWALTYPE:DEPOSITTYPE,
&find->entry->amount, &filtAmnt, filtStr);
DataRemoveFilter(find);
RegRemoveSel();
AmiUpdateFilt(filtStr);
}
}
/**********************************************************************
* AmiSearchFail()
*
* Prompt user with search failure
***********************************************************************/
void AmiSearchFail(void)
{
struct EasyStruct es;
char *str = "No search matches found.";
es.es_StructSize = sizeof(struct EasyStruct);
es.es_Flags = 0;
es.es_Title = "amiCheck NOTICE:";
es.es_TextFormat = str;
es.es_GadgetFormat = "OK";
AmiLock();
GF_EasyRequest(gui,amiWindow,&es,NULL);
AmiUnlock();
}
/**********************************************************************
* AmiAboutPart()
*
* About information! third party support
***********************************************************************/
void AmiAboutPart(void)
{
struct EasyStruct es;
char str[220];
sprintf(str,"A big thankyou to the following\nquality third-party support:\nEasyRexx © 1994,1995 Ketil Hunn\nGuiFront © 1994 Michael Berg\n");
es.es_StructSize = sizeof(struct EasyStruct);
es.es_Flags = 0;
es.es_Title = "About Third Parties:";
es.es_TextFormat = str;
es.es_GadgetFormat = "OK";
AmiLock();
GF_EasyRequest(gui,amiWindow,&es,NULL);
AmiUnlock();
}
/**********************************************************************
* AmiAbout()
*
* About information!
***********************************************************************/
void AmiAbout(void)
{
struct EasyStruct es;
char str[220];
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",
AC_AppID,AC_Version);
es.es_StructSize = sizeof(struct EasyStruct);
es.es_Flags = 0;
es.es_Title = "About amiCheck:";
es.es_TextFormat = str;
es.es_GadgetFormat = "OK";
AmiLock();
GF_EasyRequest(gui,amiWindow,&es,NULL);
AmiUnlock();
}
/*********************************************************************
* AmiAnnounce()
*
* Announce using a requester
**********************************************************************/
void AmiAnnounce(char *str)
{
struct EasyStruct es;
es.es_StructSize = sizeof(struct EasyStruct);
es.es_Flags = 0;
es.es_Title = "amiCheck NOTICE:";
es.es_TextFormat = str;
es.es_GadgetFormat = "OK";
AmiLock();
GF_EasyRequest(gui,amiWindow,&es,NULL);
AmiUnlock();
}
/**********************************************************************
* AmiAsk()
*
* ok/cancel requester
***********************************************************************/
BOOL AmiAsk(char *str)
{
struct EasyStruct es;
BOOL val = TRUE;
if ( amiChangedItems == TRUE) {
es.es_StructSize = sizeof(struct EasyStruct);
es.es_Flags = 0;
es.es_Title = "amiCheck NOTICE:";
es.es_TextFormat = str;
es.es_GadgetFormat = "OK|Save First|Cancel";
AmiLock();
val = GF_EasyRequest(gui,amiWindow,&es,NULL);
AmiUnlock();
/* save first if asked! */
if (val == 2) {
if (AmiSave(NULL,FALSE))
val--;
}
}
return (val);
}
/************************************************************
* AmiDisableSel()
*
* Disables items that are not needed when no item
* is selected.
*************************************************************/
void AmiDisableSel(BOOL dis)
{
UWORD menunum1, menunum2, menunum3, menunum4, menunum5, menunum6;
static BOOL disit = FALSE;
if (dis == disit)
return;
disit = dis;
/* disable menu items */
menunum1 = FULLMENUNUM(EDITTITLE,EDITCLEAR,NOSUB);
menunum2 = FULLMENUNUM(EDITTITLE,EDITUNCLEAR,NOSUB);
menunum3 = FULLMENUNUM(EDITTITLE,EDITMOVE,NOSUB);
menunum4 = FULLMENUNUM(SEARCHTITLE,SEARCHJUMP,NOSUB);
menunum5 = FULLMENUNUM(EDITTITLE,EDITUNFILT,NOSUB);
menunum6 = FULLMENUNUM(EDITTITLE,EDITDUPLICATE,NOSUB);
if (dis) {
OffMenu(amiWindow, menunum1);
OffMenu(amiWindow, menunum2);
OffMenu(amiWindow, menunum3);
OffMenu(amiWindow, menunum4);
OffMenu(amiWindow, menunum5);
OffMenu(amiWindow, menunum6);
}
else {
OnMenu(amiWindow, menunum1);
OnMenu(amiWindow, menunum2);
OnMenu(amiWindow, menunum3);
OnMenu(amiWindow, menunum4);
OnMenu(amiWindow, menunum5);
OnMenu(amiWindow, menunum6);
}
/* disable edit button */
GF_SetGadgetAttrs(gui,AC_MainSpecs[GID_EDIT]->gs_Gadget,
GA_Disabled,dis,
TAG_DONE);
if (dis)
AmiMoveRestore();
}
/************************************************************
* AmiDisableAll()
*
* Disables all items - no account
*************************************************************/
void AmiDisableAll(BOOL dis)
{
alldisabled = dis;
/* turn off the other stuff if this is all off */
if (dis)
AmiDisableSel(TRUE);
/* disable gadgets */
if (dis == TRUE)
GF_SetGadgetAttrs(gui,AC_MainSpecs[GID_TREND]->gs_Gadget,
GA_Disabled,dis,
TAG_DONE);
GF_SetGadgetAttrs(gui,AC_MainSpecs[GID_GETSELTYPE]->gs_Gadget,
GA_Disabled,dis,
TAG_DONE);
/*
GF_SetGadgetAttrs(gui,AC_MainSpecs[GID_ENTERTYPE]->gs_Gadget,
GA_Disabled,dis,
TAG_DONE);
*/
GF_SetGadgetAttrs(gui,AC_MainSpecs[GID_NEWTYPE]->gs_Gadget,
GA_Disabled,dis,
TAG_DONE);
GF_SetGadgetAttrs(gui,AC_MainSpecs[GID_FILTER]->gs_Gadget,
GA_Disabled,dis,
TAG_DONE);
GF_SetGadgetAttrs(gui,AC_MainSpecs[GID_STATS]->gs_Gadget,
GA_Disabled,dis,
TAG_DONE);
GF_SetGadgetAttrs(gui,AC_MainSpecs[GID_BUDGET]->gs_Gadget,
GA_Disabled,dis,
TAG_DONE);
GF_SetGadgetAttrs(gui,AC_MainSpecs[GID_ANALYSIS]->gs_Gadget,
GA_Disabled,dis,
TAG_DONE);
GF_SetGadgetAttrs(gui,AC_MainSpecs[GID_SORT]->gs_Gadget,
GA_Disabled,dis,
TAG_DONE);
/* disable menu items */
if (dis) {
OffMenu(amiWindow,FULLMENUNUM(FILETITLE,FILESAVEEXIT,NOSUB));
OffMenu(amiWindow,FULLMENUNUM(FILETITLE,FILESAVE,NOSUB));
OffMenu(amiWindow,FULLMENUNUM(FILETITLE,FILESAVEAS,NOSUB));
OffMenu(amiWindow,FULLMENUNUM(EDITTITLE,EDITQUICK,NOSUB));
OffMenu(amiWindow,FULLMENUNUM(EDITTITLE,EDITBATCH,NOSUB));
OffMenu(amiWindow,FULLMENUNUM(EDITTITLE,EDITAPPLYSORT,NOSUB));
OffMenu(amiWindow,FULLMENUNUM(SEARCHTITLE,SEARCHSEARCH,NOSUB));
OffMenu(amiWindow,FULLMENUNUM(SEARCHTITLE,SEARCHAGAIN,NOSUB));
OffMenu(amiWindow,FULLMENUNUM(EDITTITLE,EDITRANGE,NOSUB));
OffMenu(amiWindow,FULLMENUNUM(EDITTITLE,EDITACCT,NOSUB));
OffMenu(amiWindow,FULLMENUNUM(UTILITYTITLE,UTILITYREPORT,NOSUB));
OffMenu(amiWindow,FULLMENUNUM(PREFSTITLE,PREFSFORM,NOSUB));
OffMenu(amiWindow,FULLMENUNUM(EDITTITLE,EDITDATA,NOSUB));
OffMenu(amiWindow,FULLMENUNUM(FILETITLE,FILEIMPORT,NOSUB));
OffMenu(amiWindow,FULLMENUNUM(FILETITLE,FILEEXPORT,NOSUB));
OffMenu(amiWindow,FULLMENUNUM(FILETITLE,FILEPRINT,NOSUB));
OffMenu(amiWindow,FULLMENUNUM(FILETITLE,FILERECON,NOSUB));
OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXASSIGN,NOSUB));
OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM1,NOSUB));
OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM2,NOSUB));
OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM3,NOSUB));
OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM4,NOSUB));
OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM5,NOSUB));
OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM6,NOSUB));
OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM7,NOSUB));
OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM8,NOSUB));
OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM9,NOSUB));
OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM10,NOSUB));
/* "never" turn these off */
#if 0
OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXOTHER,NOSUB));
OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXOPENCMD,NOSUB));
OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXCLOSECMD,NOSUB));
#endif
}
else {
OnMenu(amiWindow,FULLMENUNUM(FILETITLE,FILESAVE,NOSUB));
OnMenu(amiWindow,FULLMENUNUM(FILETITLE,FILESAVEEXIT,NOSUB));
OnMenu(amiWindow,FULLMENUNUM(FILETITLE,FILESAVEAS,NOSUB));
OnMenu(amiWindow,FULLMENUNUM(EDITTITLE,EDITQUICK,NOSUB));
OnMenu(amiWindow,FULLMENUNUM(EDITTITLE,EDITBATCH,NOSUB));
OnMenu(amiWindow,FULLMENUNUM(EDITTITLE,EDITAPPLYSORT,NOSUB));
OnMenu(amiWindow,FULLMENUNUM(SEARCHTITLE,SEARCHSEARCH,NOSUB));
OnMenu(amiWindow,FULLMENUNUM(SEARCHTITLE,SEARCHAGAIN,NOSUB));
OnMenu(amiWindow,FULLMENUNUM(EDITTITLE,EDITACCT,NOSUB));
OnMenu(amiWindow,FULLMENUNUM(UTILITYTITLE,UTILITYREPORT,NOSUB));
OnMenu(amiWindow,FULLMENUNUM(EDITTITLE,EDITRANGE,NOSUB));
OnMenu(amiWindow,FULLMENUNUM(EDITTITLE,EDITDATA,NOSUB));
OnMenu(amiWindow,FULLMENUNUM(FILETITLE,FILERECON,NOSUB));
OnMenu(amiWindow,FULLMENUNUM(PREFSTITLE,PREFSFORM,NOSUB));
OnMenu(amiWindow,FULLMENUNUM(FILETITLE,FILEPRINT,NOSUB));
OnMenu(amiWindow,FULLMENUNUM(FILETITLE,FILEIMPORT,NOSUB));
OnMenu(amiWindow,FULLMENUNUM(FILETITLE,FILEEXPORT,NOSUB));
OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXASSIGN,NOSUB));
OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM1,NOSUB));
OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM2,NOSUB));
OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM3,NOSUB));
OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM4,NOSUB));
OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM5,NOSUB));
OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM6,NOSUB));
OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM7,NOSUB));
OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM8,NOSUB));
OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM9,NOSUB));
OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM10,NOSUB));
OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXOTHER,NOSUB));
OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXOPENCMD,NOSUB));
OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXCLOSECMD,NOSUB));
}
}
/*********************************************************
* AmiHandleGadgetDown()
*
* Handle those down buttons
**********************************************************/
void AmiHandleGadgetDown(struct IntuiMessage *imsg)
{
struct Gadget *gad = (struct Gadget *)(imsg->IAddress);
UWORD code = imsg->Code;
filterNode *node;
amountType amount;
switch (gad->GadgetID) {
case GID_REGFIELD:
if (RegHitTest(imsg->Micros, imsg->Seconds, imsg->MouseX,imsg->MouseY)) {
if (dclicktype == 1)
AmiToggleClear();
else if (dclicktype == 2) {
node = (filterNode *)DataOrd2Node((struct List *)&filtered,selRow);
amount = node->entry->amount;
if ( !(node->entry->flags & VOIDED)) {
DataUpdateBal(
(node->entry->type==DEPOSITTYPE)?WITHDRAWALTYPE:DEPOSITTYPE,
&amount, &filtAmnt, filtStr);
AmiUpdateFilt(filtStr);
}
DataRemoveFilter(node);
RegRemoveSel();
}
else AmiEditEntry();
}
break;
case GID_REGVSCROL:
RegMoveList(&filtered,code);
RegRefresh(FALSE);
break;
}
}
/**********************************************************
* AmiAllocRequesters()
*
* Alocates and sets up asl requestors for both loads and
* one saveas
***********************************************************/
BOOL AmiAllocRequesters(void)
{
/* allocate the generic tag list */
aslTagList = AllocateTagItems(5);
if (aslTagList) {
aslTagList[0].ti_Tag = ASL_Window;
aslTagList[0].ti_Data = (unsigned long)amiWindow;
aslTagList[1].ti_Tag = ASL_Height;
aslTagList[1].ti_Data = amiAslHeight;
aslTagList[2].ti_Tag = ASL_OKText;
aslTagList[2].ti_Data = (unsigned long)"OK";
aslTagList[3].ti_Tag = ASL_CancelText;
aslTagList[3].ti_Data = (unsigned long)"Cancel";
aslTagList[4].ti_Tag = TAG_DONE;
}
else return (FALSE);
scriptASL = (struct FileRequester *)AllocAslRequest(ASL_FileRequest,
scriptloadtags);
if (scriptASL == NULL)
return (FALSE);
scriptsaveASL = (struct FileRequester *)AllocAslRequest(ASL_FileRequest,
scriptsavetags);
if (scriptsaveASL == NULL)
return (FALSE);
otherRexxASL = (struct FileRequester *)AllocAslRequest(ASL_FileRequest,
rexxtags);
if (otherRexxASL == NULL)
return (FALSE);
loadASL = (struct FileRequester *)AllocAslRequest(ASL_FileRequest,
loadtags);
if (loadASL == NULL)
return (FALSE);
saveASL = (struct FileRequester *)AllocAslRequest(ASL_FileRequest,
savetags);
if (saveASL == NULL)
return (FALSE);
impasciiASL = (struct FileRequester *)AllocAslRequest(ASL_FileRequest,
impasciitags);
if (impasciiASL == NULL)
return (FALSE);
expasciiASL = (struct FileRequester *)AllocAslRequest(ASL_FileRequest,
expasciitags);
if (expasciiASL == NULL)
return (FALSE);
netsaveASL = (struct FileRequester *)AllocAslRequest(ASL_FileRequest,
netsavetags);
if (netsaveASL == NULL)
return (FALSE);
netloadASL = (struct FileRequester *)AllocAslRequest(ASL_FileRequest,
netloadtags);
if (netloadASL == NULL)
return (FALSE);
reportASL = (struct FileRequester *)AllocAslRequest(ASL_FileRequest,
reporttags);
if (reportASL == NULL)
return (FALSE);
devASL = (struct FileRequester *)AllocAslRequest(ASL_FileRequest,
devtags);
if (devASL == NULL)
return (FALSE);
return (TRUE);
}
/****************************************************************
* AmiUpdateFilt()
*
* Updates the Filter balance field
*****************************************************************/
void AmiUpdateFilt(char *str)
{
strcpy(filtStr,str);
GF_SetGadgetAttrs(gui,gadgetspecs[GID_RUNBAL].gs_Gadget,
GTTX_Text,filtStr,
TAG_DONE);
}
/****************************************************************
* AmiUpdateCurr()
*
* Updates the curr balance field
*****************************************************************/
void AmiUpdateCurr(char *str)
{
strcpy(currStr,str);
GF_SetGadgetAttrs(gui,gadgetspecs[GID_CURRBAL].gs_Gadget,
GTTX_Text,currStr,
TAG_DONE);
}
/****************************************************************
* AmiUpdateState()
*
* Updates the Statement balance field
*****************************************************************/
void AmiUpdateState(char *str)
{
strcpy(stateStr,str);
GF_SetGadgetAttrs(gui,gadgetspecs[GID_STATBAL].gs_Gadget,
GTTX_Text,stateStr,
TAG_DONE);
}
/*******************************************************************************
* AmiParseCmd()
*
* Parse the input tooltypes and parameters
********************************************************************************/
void AmiParseCmd(int argc, char **argv)
{
char *ptr;
ULONG rows;
char dtype[80];
strcpy(filePattern,DEFAULT_FILEPATTERN);
strcpy(importPattern,DEFAULT_IMPORTPATTERN);
strcpy(scriptPattern,DEFAULT_SCRIPTPATTERN);
strcpy(netPattern,DEFAULT_NETPATTERN);
#if 0
if (argc==0) {
sprintf(iconPath,"AC_Icons/");
sprintf(guidePath,"documents/amiCheck.guide");
return;
}
else {
ptr = PathPart(argv[0]);
if (ptr != NULL) {
if (*ptr == '/')
*(ptr+1) = NULL;
else *ptr = NULL;
sprintf(iconPath,"%sAC_Icons/",argv[0]);
sprintf(guidePath,"%sdocuments/amiCheck.guide",argv[0]);
}
else {
sprintf(iconPath,"AC_Icons/");
sprintf(guidePath,"documents/amiCheck.guide");
}
}
#endif
while (argc>1) {
/* templaterows */
if (strnicmp(argv[argc-1],"TEMPLATEROWS",strlen("TEMPLATEROWS") ) == 0) {
ptr = strchr(argv[argc-1],'=');
if (ptr != NULL) {
sscanf(ptr+1,"%d",&rows);
if (rows < 5) rows = 5;
SP_SelTempSpecs[GID_SPTEMPLIST]->gs_MinHeight = rows;
}
}
/* aslheight */
else if (strnicmp(argv[argc-1],"ASLHEIGHT",strlen("ASLHEIGHT") ) == 0) {
ptr = strchr(argv[argc-1],'=');
if (ptr != NULL) {
sscanf(ptr+1,"%u",&amiAslHeight);
}
}
/* numcols */
else if (strnicmp(argv[argc-1],"NUMCOLS",strlen("NUMCOLS") ) == 0) {
ptr = strchr(argv[argc-1],'=');
if (ptr != NULL) {
sscanf(ptr+1,"%d",&rows);
if (rows < 5) rows = 5;
gadgetspecs[GID_REGFIELD].gs_MinWidth = rows;
}
}
/* numrows */
else if (strnicmp(argv[argc-1],"NUMROWS",strlen("NUMROWS") ) == 0) {
ptr = strchr(argv[argc-1],'=');
if (ptr != NULL) {
sscanf(ptr+1,"%d",&rows);
if (rows < 5) rows = 5;
gadgetspecs[GID_REGFIELD].gs_MinHeight = rows;
}
}
/* layout change warning */
else if (strnicmp(argv[argc-1],"NOLAYOUTWARN",strlen("NOLAYOUTWARN") ) == 0) {
layoutwarn = FALSE;
}
/* autosort flag */
else if (strnicmp(argv[argc-1],"AUTOSORT",strlen("AUTOSORT") ) == 0) {
autosort = TRUE;
}
/* show memo flag */
else if (strnicmp(argv[argc-1],"SHOWMEMO",strlen("SHOWMEMO") ) == 0) {
showMemo = TRUE;
}
/* DCLICK flag */
else if (strnicmp(argv[argc-1],"DCLICK",strlen("DCLICK") ) == 0) {
dclicktype = 0;
ptr = strchr(argv[argc-1],'=');
if (ptr != NULL) {
sscanf(ptr+1,"%s",dtype);
if (strnicmp(dtype,"CLEAR",strlen("CLEAR")) == 0)
dclicktype = 1;
else if (strnicmp(dtype,"UNFILT",strlen("UNFILT")) == 0)
dclicktype = 2;
else if (strnicmp(dtype,"EDIT",strlen("EDIT")) == 0)
dclicktype = 0;
}
}
/* DATE flag */
else if (strnicmp(argv[argc-1],"DATE",strlen("DATE") ) == 0) {
dateFormat = DATE_MMDDYY;
ptr = strchr(argv[argc-1],'=');
if (ptr != NULL) {
sscanf(ptr+1,"%s",dtype);
if (strnicmp(dtype,"FORMAT1",strlen("FORMAT1")) == 0)
dateFormat = DATE_MMDDYY;
else if (strnicmp(dtype,"FORMAT2",strlen("FORMAT2")) == 0)
dateFormat = DATE_DDMMYY;
else if (strnicmp(dtype,"FORMAT3",strlen("FORMAT3")) == 0)
dateFormat = DATE_DEC_12;
else if (strnicmp(dtype,"FORMAT4",strlen("FORMAT4")) == 0)
dateFormat = DATE_12_DEC;
}
}
/* LOAD pattern */
else if (strnicmp(argv[argc-1],"LOADPATTERN",strlen("LOADPATTERN") ) == 0) {
ptr = strchr(argv[argc-1],'=');
if (ptr != NULL) {
sscanf(ptr+1,"%s",dtype);
if (strlen(dtype) < FILEPATTERN_SIZE) {
strcpy(filePattern,dtype);
}
}
}
/* IMPORT pattern */
else if (strnicmp(argv[argc-1],"IMPORTPATTERN",strlen("IMPORTPATTERN") ) == 0) {
ptr = strchr(argv[argc-1],'=');
if (ptr != NULL) {
sscanf(ptr+1,"%s",dtype);
if (strlen(dtype) < FILEPATTERN_SIZE) {
strcpy(importPattern,dtype);
}
}
}
/* SCRIPT pattern */
else if (strnicmp(argv[argc-1],"SCRIPTPATTERN",strlen("SCRIPTPATTERN") ) == 0) {
ptr = strchr(argv[argc-1],'=');
if (ptr != NULL) {
sscanf(ptr+1,"%s",dtype);
if (strlen(dtype) < FILEPATTERN_SIZE) {
strcpy(scriptPattern,dtype);
}
}
}
/* NET pattern */
else if (strnicmp(argv[argc-1],"NETPATTERN",strlen("NETPATTERN") ) == 0) {
ptr = strchr(argv[argc-1],'=');
if (ptr != NULL) {
sscanf(ptr+1,"%s",dtype);
if (strlen(dtype) < FILEPATTERN_SIZE) {
strcpy(netPattern,dtype);
}
}
}
/* is it a tooltype comment or file name? */
else if ( (char)*argv[argc-1] != '(' && !bootfile) {
/* assume it to be a file */
strcpy(currFile, argv[argc-1]);
bootfile = TRUE;
}
argc--;
}
}
/********************************************************************************
* AmiOpenGUI()
*
* open all guis in system
*
*********************************************************************************/
BOOL AmiOpenGUI(void)
{
seltempGUI = GF_CreateGUI(guiapp, SP_SelTempPanel,SP_SelTempSpecs,
GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
GUI_WindowTitle, (ULONG)"Templates",
GUI_OpenGUI, (ULONG)FALSE,
GUI_Backfill, (ULONG)FALSE,
GUI_ExtraIDCMP, (ULONG)IDCMP_RAWKEY,
GUI_NewMenu, amiMenu,
GUI_ScreenTitle, AC_Title,
TAG_DONE);
if (seltempGUI == NULL)
return (FALSE);
edittempGUI = GF_CreateGUI(guiapp, TP_EditTempPanel,TP_EditTempSpecs,
GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
GUI_WindowTitle, (ULONG)"Edit Template List",
GUI_OpenGUI, (ULONG)FALSE,
GUI_Backfill, (ULONG)TRUE,
GUI_ExtraIDCMP, (ULONG)IDCMP_RAWKEY,
GUI_ScreenTitle, AC_Title,
TAG_DONE);
if (edittempGUI == NULL)
return (FALSE);
newGUI = GF_CreateGUI(guiapp, NP_EnterPanel,NP_EnterSpecs,
GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
GUI_WindowTitle, (ULONG)NULL,
GUI_OpenGUI, (ULONG)FALSE,
GUI_Backfill, (ULONG)TRUE,
GUI_ExtraIDCMP, (ULONG)(IDCMP_RAWKEY | IDCMP_ACTIVEWINDOW),
GUI_ScreenTitle, AC_Title,
TAG_DONE);
if (newGUI == NULL)
return (FALSE);
filterGUI = GF_CreateGUI(guiapp, FP_FilterPanel,FP_FilterSpecs,
GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
GUI_WindowTitle, (ULONG)"Edit Filter Settings",
GUI_OpenGUI, (ULONG)FALSE,
GUI_ExtraIDCMP, (ULONG)(IDCMP_RAWKEY | IDCMP_ACTIVEWINDOW),
GUI_Backfill, (ULONG)TRUE,
GUI_ScreenTitle, AC_Title,
TAG_DONE);
if (filterGUI == NULL)
return (FALSE);
sortGUI = GF_CreateGUI(guiapp, SRP_SortPanel,SRP_SortSpecs,
GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
GUI_WindowTitle, (ULONG)"Register Sort",
GUI_OpenGUI, (ULONG)FALSE,
GUI_Backfill, (ULONG)TRUE,
GUI_ExtraIDCMP, (ULONG)IDCMP_RAWKEY,
GUI_ScreenTitle, AC_Title,
TAG_DONE);
if (sortGUI == NULL)
return (FALSE);
entryGUI = GF_CreateGUI(guiapp, EP_EnterPanel,EP_EnterSpecs,
GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
GUI_WindowTitle, (ULONG)NULL,
GUI_OpenGUI, (ULONG)FALSE,
GUI_Backfill, (ULONG)TRUE,
GUI_ExtraIDCMP, (ULONG)(IDCMP_RAWKEY | IDCMP_ACTIVEWINDOW),
GUI_ScreenTitle, AC_Title,
TAG_DONE);
if (entryGUI == NULL)
return (FALSE);
recGUI = GF_CreateGUI(guiapp, RCP_RecPanel,RCP_RecSpecs,
GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
GUI_WindowTitle, (ULONG)"Reconciliation",
GUI_OpenGUI, (ULONG)FALSE,
GUI_Backfill, (ULONG)TRUE,
GUI_ExtraIDCMP, (ULONG)(IDCMP_RAWKEY | IDCMP_ACTIVEWINDOW),
GUI_ScreenTitle, AC_Title,
TAG_DONE);
if (recGUI == NULL)
return (FALSE);
acctGUI = GF_CreateGUI(guiapp, ACP_AcctPanel,ACP_AcctSpecs,
GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
GUI_WindowTitle, (ULONG)NULL,
GUI_OpenGUI, (ULONG)FALSE,
GUI_Backfill, (ULONG)TRUE,
GUI_ExtraIDCMP, (ULONG)IDCMP_ACTIVEWINDOW,
GUI_ScreenTitle, AC_Title,
TAG_DONE);
if (acctGUI == NULL)
return (FALSE);
searchGUI = GF_CreateGUI(guiapp, SEP_SearchPanel,SEP_SearchSpecs,
GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
GUI_WindowTitle, (ULONG)"Register Search ",
GUI_OpenGUI, (ULONG)FALSE,
GUI_Backfill, (ULONG)TRUE,
GUI_ExtraIDCMP, (ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
GUI_ScreenTitle, AC_Title,
TAG_DONE);
if (searchGUI == NULL)
return (FALSE);
catGUI = GF_CreateGUI(guiapp, CP_CatPanel,CP_CatSpecs,
GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
GUI_WindowTitle, (ULONG)"Edit Category List",
GUI_OpenGUI, (ULONG)FALSE,
GUI_Backfill, (ULONG)TRUE,
GUI_ExtraIDCMP, (ULONG)(IDCMP_RAWKEY | IDCMP_ACTIVEWINDOW),
GUI_ScreenTitle, AC_Title,
TAG_DONE);
if (catGUI == NULL)
return (FALSE);
statGUI = GF_CreateGUI(guiapp, STP_StatPanel,STP_StatSpecs,
GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
GUI_WindowTitle, (ULONG)"Register Statistics ",
GUI_OpenGUI, (ULONG)FALSE,
GUI_Backfill, (ULONG)FALSE,
GUI_ExtraIDCMP, (ULONG)IDCMP_RAWKEY,
GUI_ScreenTitle, AC_Title,
TAG_DONE);
if (statGUI == NULL)
return (FALSE);
repGUI = GF_CreateGUI(guiapp, REP_ReportPanel,REP_ReportSpecs,
GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
GUI_WindowTitle, (ULONG)"Report Generator",
GUI_OpenGUI, (ULONG)FALSE,
GUI_Backfill, (ULONG)TRUE,
GUI_ExtraIDCMP, (ULONG)IDCMP_ACTIVEWINDOW,
GUI_ScreenTitle, AC_Title,
TAG_DONE);
if (repGUI == NULL)
return (FALSE);
scriptGUI = GF_CreateGUI(guiapp, SCP_ScriptPanel,SCP_ScriptSpecs,
GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
GUI_WindowTitle, (ULONG)"Script Editor ",
GUI_OpenGUI, (ULONG)FALSE,
GUI_Backfill, (ULONG)TRUE,
GUI_ExtraIDCMP, (ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
GUI_ScreenTitle, AC_Title,
TAG_DONE);
if (scriptGUI == NULL)
return (FALSE);
groupGUI = GF_CreateGUI(guiapp, GRP_GroupPanel,GRP_GroupSpecs,
GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
GUI_WindowTitle, (ULONG)"Group Editor ",
GUI_OpenGUI, (ULONG)FALSE,
GUI_Backfill, (ULONG)TRUE,
GUI_ExtraIDCMP, (ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
GUI_ScreenTitle, AC_Title,
TAG_DONE);
if (groupGUI == NULL)
return (FALSE);
analGUI = GF_CreateGUI(guiapp, AN_MainPanel,AN_MainSpecs,
GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
GUI_WindowTitle, (ULONG)"Graphical Analysis",
GUI_OpenGUI, (ULONG)FALSE,
GUI_Backfill, (ULONG)FALSE,
GUI_ExtraIDCMP, (ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
GUI_ScreenTitle, AC_Title,
TAG_DONE);
if (analGUI == NULL)
return (FALSE);
qdateGUI = GF_CreateGUI(guiapp, QD_DatePanel,QD_DateSpecs,
GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
GUI_WindowTitle, (ULONG)"Dates",
GUI_OpenGUI, (ULONG)FALSE,
GUI_Backfill, (ULONG)TRUE,
GUI_ExtraIDCMP, (ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
GUI_ScreenTitle, AC_Title,
TAG_DONE);
if (qdateGUI == NULL)
return (FALSE);
qmemoGUI = GF_CreateGUI(guiapp, QM_MemoPanel,QM_MemoSpecs,
GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
GUI_WindowTitle, (ULONG)"Memos",
GUI_OpenGUI, (ULONG)FALSE,
GUI_Backfill, (ULONG)FALSE,
GUI_ExtraIDCMP, (ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
GUI_ScreenTitle, AC_Title,
TAG_DONE);
if (qmemoGUI == NULL)
return (FALSE);
memoGUI = GF_CreateGUI(guiapp, M_MemoPanel,M_MemoSpecs,
GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
GUI_WindowTitle, (ULONG)"Quick-Memo Editor",
GUI_OpenGUI, (ULONG)FALSE,
GUI_Backfill, (ULONG)TRUE,
GUI_ExtraIDCMP, (ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
GUI_ScreenTitle, AC_Title,
TAG_DONE);
if (memoGUI == NULL)
return (FALSE);
qnameGUI = GF_CreateGUI(guiapp, QN_NamePanel,QN_NameSpecs,
GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
GUI_WindowTitle, (ULONG)"Payees",
GUI_OpenGUI, (ULONG)FALSE,
GUI_Backfill, (ULONG)FALSE,
GUI_ExtraIDCMP, (ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
GUI_ScreenTitle, AC_Title,
TAG_DONE);
if (qnameGUI == NULL)
return (FALSE);
qamntGUI = GF_CreateGUI(guiapp, QA_AmntPanel,QA_AmntSpecs,
GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
GUI_WindowTitle, (ULONG)"Amounts",
GUI_OpenGUI, (ULONG)FALSE,
GUI_Backfill, (ULONG)FALSE,
GUI_ExtraIDCMP, (ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
GUI_ScreenTitle, AC_Title,
TAG_DONE);
if (qamntGUI == NULL)
return (FALSE);
nameGUI = GF_CreateGUI(guiapp, N_NamePanel,N_NameSpecs,
GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
GUI_WindowTitle, (ULONG)"Quick-Payee Editor",
GUI_OpenGUI, (ULONG)FALSE,
GUI_Backfill, (ULONG)TRUE,
GUI_ExtraIDCMP, (ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
GUI_ScreenTitle, AC_Title,
TAG_DONE);
if (nameGUI == NULL)
return (FALSE);
amntGUI = GF_CreateGUI(guiapp, A_AmntPanel,A_AmntSpecs,
GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
GUI_WindowTitle, (ULONG)"Quick-Amount Editor",
GUI_OpenGUI, (ULONG)FALSE,
GUI_Backfill, (ULONG)TRUE,
GUI_ExtraIDCMP, (ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
GUI_ScreenTitle, AC_Title,
TAG_DONE);
if (amntGUI == NULL)
return (FALSE);
formGUI = GF_CreateGUI(guiapp, FP_FormPanel,FP_FormSpecs,
GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
GUI_WindowTitle, (ULONG)"Check Forms ",
GUI_OpenGUI, (ULONG)FALSE,
GUI_Backfill, (ULONG)TRUE,
GUI_ExtraIDCMP, (ULONG)IDCMP_ACTIVEWINDOW,
GUI_ScreenTitle, AC_Title,
TAG_DONE);
if (formGUI == NULL)
return (FALSE);
netGUI = GF_CreateGUI(guiapp, NET_NetPanel,NET_NetSpecs,
GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
GUI_WindowTitle, (ULONG)"Net Worth Analysis",
GUI_OpenGUI, (ULONG)FALSE,
GUI_Backfill, (ULONG)TRUE,
GUI_ExtraIDCMP, (ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
GUI_ScreenTitle, AC_Title,
TAG_DONE);
if (netGUI == NULL)
return (FALSE);
printGUI = GF_CreateGUI(guiapp, PR_PrintPanel,PR_PrintSpecs,
GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
GUI_WindowTitle, (ULONG)"Print Checks",
GUI_OpenGUI, (ULONG)FALSE,
GUI_Backfill, (ULONG)TRUE,
GUI_ExtraIDCMP, (ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
GUI_ScreenTitle, AC_Title,
TAG_DONE);
if (printGUI == NULL)
return (FALSE);
arexxGUI = GF_CreateGUI(guiapp, AX_ArexxPanel,AX_ArexxSpecs,
GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
GUI_WindowTitle, (ULONG)"Assign Macros",
GUI_OpenGUI, (ULONG)FALSE,
GUI_Backfill, (ULONG)TRUE,
GUI_ExtraIDCMP, (ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
GUI_ScreenTitle, AC_Title,
TAG_DONE);
if (arexxGUI == NULL)
return (FALSE);
#if 0
budgetGUI = GF_CreateGUI(guiapp, BP_BudgetPanel,BP_BudgetSpecs,
GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
GUI_WindowTitle, (ULONG)"Budget Distribution",
GUI_OpenGUI, (ULONG)TRUE,
GUI_Backfill, (ULONG)TRUE,
GUI_ExtraIDCMP, (ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
GUI_ScreenTitle, AC_Title,
TAG_DONE);
if (budgetGUI == NULL)
return (FALSE);
#endif
return (TRUE);
}
/********************************************************************************
* AmiCloseGUI()
*
* Destroys guis
*
*********************************************************************************/
void AmiCloseGUI(void)
{
selWin = NULL;
if (seltempGUI) GF_DestroyGUI(seltempGUI);
if (edittempGUI) GF_DestroyGUI(edittempGUI);
if (newGUI) GF_DestroyGUI(newGUI);
if (filterGUI) GF_DestroyGUI(filterGUI);
if (sortGUI) GF_DestroyGUI(sortGUI);
if (entryGUI) GF_DestroyGUI(entryGUI);
if (recGUI) GF_DestroyGUI(recGUI);
if (acctGUI) GF_DestroyGUI(acctGUI);
if (searchGUI) GF_DestroyGUI(searchGUI);
if (catGUI) GF_DestroyGUI(catGUI);
if (statGUI) GF_DestroyGUI(statGUI);
if (repGUI) GF_DestroyGUI(repGUI);
if (scriptGUI) GF_DestroyGUI(scriptGUI);
if (groupGUI) GF_DestroyGUI(groupGUI);
if (analGUI) GF_DestroyGUI(analGUI);
if (formGUI) GF_DestroyGUI(formGUI);
if (netGUI) GF_DestroyGUI(netGUI);
if (qdateGUI) GF_DestroyGUI(qdateGUI);
if (qmemoGUI) GF_DestroyGUI(qmemoGUI);
if (memoGUI) GF_DestroyGUI(memoGUI);
if (nameGUI) GF_DestroyGUI(nameGUI);
if (amntGUI) GF_DestroyGUI(amntGUI);
if (qamntGUI) GF_DestroyGUI(qamntGUI);
if (qnameGUI) GF_DestroyGUI(qnameGUI);
if (printGUI) GF_DestroyGUI(printGUI);
if (arexxGUI) GF_DestroyGUI(arexxGUI);
#if 0
if (budgetGUI) GF_DestroyGUI(budgetGUI);
#endif
}
/********************************************************
* AmiMoveSwap()
*
* Move the selected item!
*********************************************************/
void AmiMoveSwap(void)
{
filterNode *ftemp;
entryNode *etemp, *entemp;
UWORD eord, enord;
if (!moveActive || selRow == -1)
return;
ftemp = (filterNode *)DataOrd2Node((struct List *)&filtered,selRow);
if (ftemp != moveNode) {
/* move the template nodes first */
Remove((struct Node *)moveNode);
if (selRow > moveRow)
Insert( (struct List *)&filtered,(struct Node *)moveNode, (struct Node *)ftemp);
else Insert( (struct List *)&filtered,(struct Node *)moveNode, (struct Node *)ftemp->node.mln_Pred);
/* swap the ACTUAL ENTRY NODE */
etemp = moveNode->entry;
entemp = ftemp->entry;
eord = DataFindNode( (struct List *)&entries, (struct Node *)etemp);
enord = DataFindNode( (struct List *)&entries, (struct Node *)entemp);
Remove((struct Node *)etemp);
if (enord > eord)
Insert( (struct List *)&entries,(struct Node *)etemp, (struct Node *)entemp);
else Insert( (struct List *)&entries,(struct Node *)etemp, (struct Node *)entemp->node.mln_Pred);
/* display changes */
RegMoveList(&filtered,regTopRow);
RegRefresh(FALSE);
/*
RegRedrawRow(moveNode);
RegRedrawSel(entemp);
*/
amiChangedItems = TRUE;
}
AmiMoveRestore();
}
/********************************************************
* AmiMoveActive()
*
* activates mouse ptr and move state
*********************************************************/
void AmiMoveActive(void)
{
moveActive = TRUE;
moveNode = (filterNode *)DataOrd2Node((struct List *)&filtered,selRow);
moveRow = selRow;
if (!OS39)
SetPointer(amiWindow,movePointer37,7,14,0,-3);
else
SetWindowPointer(amiWindow,
WA_Pointer,moveObj,
TAG_DONE);
}
/********************************************************
* AmiMoveRestore()
*
* restores mouse ptr and move state
*********************************************************/
void AmiMoveRestore(void)
{
moveActive = FALSE;
moveNode = NULL;
if (!OS39)
ClearPointer(amiWindow);
else {
/*printf("os39 specific\n");*/
SetWindowPointer(amiWindow,
WA_Pointer,NULL,
TAG_DONE);
}
}
/********************************************************
* AmiUnlock()
*
* Unlocks amicheck, supplies normal pointer
*********************************************************/
void AmiUnlock()
{
GF_UnlockGUI(gui);
if (selWin != NULL)
GF_UnlockGUI(seltempGUI);
if (!OS39)
ClearPointer(amiWindow);
else {
/*printf("os39 specific\n");*/
SetWindowPointer(amiWindow,
WA_Pointer,NULL,
WA_BusyPointer,FALSE,
TAG_DONE);
}
}
/********************************************************
* AmiLock()
*
* locks amicheck, supplies wait pointer
*********************************************************/
void AmiLock()
{
GF_LockGUI(gui);
if (selWin != NULL)
GF_LockGUI(seltempGUI);
if (!OS39)
SetPointer(amiWindow,busyPointer37,16,16,-5,0);
else {
/*printf("os39 specific\n");*/
SetWindowPointer(amiWindow,
WA_Pointer,NULL,
WA_BusyPointer,TRUE,
WA_PointerDelay,FALSE,
TAG_DONE);
}
}
/**********************************************************************
* AmiCheckRenumber()
*
* renumber a check quickly -+ 1-9
***********************************************************************/
void AmiCheckRenumber(char op, long amnt)
{
filterNode *filt;
if (selRow == -1)
return;
filt = (filterNode *)DataOrd2Node((struct List *)&filtered,selRow);
if (filt->entry->type != CHECKTYPE)
return;
switch (op) {
case 0:
if (filt->entry->check >= amnt) {
filt->entry->check -= amnt;
RegRedrawSel(filt);
amiChangedItems = TRUE;
amntState.currCheckNumber = filt->entry->check+1;
}
break;
case 1: ;
if (filt->entry->check + amnt < filt->entry->check)
break;
filt->entry->check += amnt;
RegRedrawSel(filt);
amiChangedItems = TRUE;
amntState.currCheckNumber = filt->entry->check+1;
break;
}
}
/**********************************************************************************
* AmiSetupMemo()
*
* Inits the show memo check in the menu to the tooltype
***********************************************************************************/
void AmiSetupMemo(void)
{
struct MenuItem *menu;
menu = ItemAddress(menuStrip,FULLMENUNUM(PREFSTITLE,PREFSWINDOW,PREFSWINDOWMEMO));
menu->Flags &= ~CHECKED;
if (showMemo) menu->Flags |= CHECKED;
ResetMenuStrip(amiWindow,menuStrip);
}
/**********************************************************************************
* AmiSetupDclick()
*
* Inits the check in the dclick to the tooltype
***********************************************************************************/
void AmiSetupDclick(void)
{
struct MenuItem *menu;
switch (dclicktype) {
case 1:
menu = ItemAddress(menuStrip,FULLMENUNUM(PREFSTITLE,PREFSDCLICK,PREFSDCLICKC));
menu->Flags |= CHECKED;
ResetMenuStrip(amiWindow,menuStrip);
break;
case 2:
menu = ItemAddress(menuStrip,FULLMENUNUM(PREFSTITLE,PREFSDCLICK,PREFSDCLICKU));
menu->Flags |= CHECKED;
ResetMenuStrip(amiWindow,menuStrip);
break;
default:
menu = ItemAddress(menuStrip,FULLMENUNUM(PREFSTITLE,PREFSDCLICK,PREFSDCLICKE));
menu->Flags |= CHECKED;
ResetMenuStrip(amiWindow,menuStrip);
break;
}
}
/**********************************************************************************
* AmiSetupDate()
*
* Inits the check in the date to the tooltype
***********************************************************************************/
void AmiSetupDate(void)
{
struct MenuItem *menu;
switch (dateFormat) {
case DATE_DEC_12:
menu = ItemAddress(menuStrip,FULLMENUNUM(PREFSTITLE,PREFSDATE,PREFSDATE2));
menu->Flags |= CHECKED;
ResetMenuStrip(amiWindow,menuStrip);
break;
case DATE_12_DEC:
menu = ItemAddress(menuStrip,FULLMENUNUM(PREFSTITLE,PREFSDATE,PREFSDATE3));
menu->Flags |= CHECKED;
ResetMenuStrip(amiWindow,menuStrip);
break;
default:
menu = ItemAddress(menuStrip,FULLMENUNUM(PREFSTITLE,PREFSDATE,PREFSDATE1));
menu->Flags |= CHECKED;
ResetMenuStrip(amiWindow,menuStrip);
break;
}
}
/**************************************************************************************
* AmiArexxMenu()
*
* Sets up macro labels in menu
***************************************************************************************/
void AmiArexxMenu(void)
{
int x;
struct MenuItem *menu;
for (x=0;x<MAXMACROS;x++) {
menu = ItemAddress(menuStrip, FULLMENUNUM(AREXXTITLE,AREXXM1+x,NOSUB));
ResetMenuStrip(amiWindow,menuStrip);
}
/*sprintf(arexxMacros[2].macroname,"now at %d\n",entryCount);*/
}
/**************************************************************************
* AmiSave()
*
* Save the application
****************************************************************************/
BOOL AmiSave(char *fname, BOOL saveas)
{
BOOL ret = TRUE;
AmiLock();
/* is this a new file? */
if (saveas) {
if (fname != NULL) {
strcpy(currFile, fname);
stcgfn(currNode, currFile);
}
else {
if (AmiGetFile(gui,saveASL,currFile,FILESIZE) == 0) {
ret = FALSE;
goto FINISHED;
}
strcpy(currNode, saveASL->fr_File);
}
}
if (DataSaveFile(currFile, saveas) == FALSE) {
AmiAnnounce("Encountered trouble trying to save file.");
}
else {
if (saveas) {
DataAttachIcon(iconPath,"AC_Account",currFile);
sprintf(amiWindowTitle,"%s: %s",AC_WindowTitle, currNode);
SetWindowTitles(amiWindow,amiWindowTitle,(UBYTE *)-1);
OnMenu(amiWindow,FULLMENUNUM(FILETITLE,FILESAVE,NOSUB));
OnMenu(amiWindow,FULLMENUNUM(FILETITLE,FILESAVEEXIT,NOSUB));
}
amiChangedItems = FALSE;
}
FINISHED:
AmiUnlock();
return ret;
}
/***************************************************************
* AmiOpen()
*
* Open an application
****************************************************************/
void AmiOpen(char *appfile, BOOL force)
{
char fname[FILESIZE];
if (force || AmiAsk(newstr)) {
/* open, and change window title */
AmiLock();
if (appfile != NULL || AmiGetFile(gui,loadASL,fname,FILESIZE)) {
AmiDisableSel(TRUE);
OnMenu(amiWindow,FULLMENUNUM(FILETITLE,FILESAVE,NOSUB));
OnMenu(amiWindow,FULLMENUNUM(FILETITLE,FILESAVEEXIT,NOSUB));
AmiLock();
/* file was selected, open it */
if (appfile != NULL)
strcpy(fname,appfile);
seldone = TRUE;
SelTempStrip();
amiChangedItems = FALSE;
DataFreeAll();
DataInit();
RegNewFilter();
AmiResetBals();
/* insert data */
if (DataLoadFile(fname) != TRUE) {
AmiAnnounce("Encountered trouble opening file\n");
}
else {
/* partition out file name */
if (appfile != NULL) {
stcgfn(currNode,appfile);
strcpy(currFile,appfile);
}
else {
strcpy(currNode,loadASL->fr_File);
strcpy(currFile,fname);
}
sprintf(amiWindowTitle,"%s: %s",AC_WindowTitle,
currNode);
SetWindowTitles(amiWindow,amiWindowTitle,(UBYTE *)-1);
if (autosort == TRUE && !IsListEmpty(&sortfields))
DataSortFilter((filterNode *)filtered.mlh_Head,
(filterNode *)filtered.mlh_TailPred,
(sortNode *)sortfields.lh_Head);
AmiArexxMenu();
RegNewFilter();
DataFilterBalance(&filtered);
AmiNewTemp();
DataBuildBal(usrAccount.decimal,&amntState.currAmnt,currStr);
DataBuildBal(usrAccount.decimal,&amntState.stateAmnt,stateStr);
DataBuildBal(usrAccount.decimal,&filtAmnt,filtStr);
AmiUpdateCurr(currStr);
AmiUpdateState(stateStr);
AmiUpdateFilt(filtStr);
/* enable items */
AmiDisableAll(FALSE);
}
AmiUnlock();
}
AmiUnlock();
}
}
/***************************************************
* AmiBaseHelp()
*
* Initialize the amigaguide context
***************************************************/
LONG AmiBaseHelp(void)
{
LONG retval = 0L;
/* Fill in the NewAmigaGuide structure */
memset(&newAG,0,sizeof(struct NewAmigaGuide));
newAG.nag_Name = guidePath; /*guidePath;*/
newAG.nag_Screen = amiWindow->WScreen;
newAG.nag_BaseName = "amiCheck";
/* Open the AmigaGuide client */
if ( !(agc = OpenAmigaGuideAsync(&newAG,
TAG_DONE))) {
/* Get the reason for failure */
retval = IoErr();
}
return (retval);
}
/***************************************************
* AmiBaseLink()
*
* Jump to a particular context
****************************************************/
void AmiBaseLink(char *link)
{
if (!amigaguide || agc == NULL)
return;
SendAmigaGuideCmd(agc,
link,
NULL);
}
/****************************************************
* AmiHelpMsg()
*
* Handle AmigaGuide messages
*****************************************************/
void AmiHelpMsg(void)
{
struct AmigaGuideMsg *agm;
while ( agm = GetAmigaGuideMsg(agc)) {
#if 0
switch (agm->agm_Type) {
case ToolCmdReplyID:
if (agm->agm_Pri_Ret) {
printf("ERROR!\n");
printf("reason=%d,str=%s\n",agm->agm_Sec_Ret,agm->agm_Data);
}
break;
case ToolStatusID:
if (agm->agm_Pri_Ret) {
printf("Status: ERROR!\n");
printf("reason=%d,str=%s\n",agm->agm_Sec_Ret,agm->agm_Data);
}
break;
}
#endif
ReplyAmigaGuideMsg(agm);
}
}
/**************************************************
* AmiHelpKey()
*
* Open help link based on key
***************************************************/
void AmiHelpKey(struct IntuiMessage *imsg, ULONG panel)
{
if (imsg->Code == HELP_KEY && amigaguide){
AmiBaseLink(guideLinks[panel]);
}
}
/***********************************************************************
* AmiRunMacro()
*
* Run a macro given a file name
************************************************************************/
void AmiRunMacro(char *fname)
{
char copybuf[1024];
ULONG bytes=0;
FILE *new = NULL, *orig= NULL;
orig = fopen(fname,"r");
if (orig == NULL) {
AmiAnnounce("Cannot read macro file.");
return;
}
/* create temporary file in T: */
if ( (new= fopen(arexxTemp,"wc")) == NULL) {
AmiAnnounce("Trouble preparing to run macro.");
return;
}
/* copy stub "address amicheck" to it */
fprintf(new,"/* comment */\nADDRESS %s\n",axContext->portname);
/* insert rest of macro */
while ( (bytes = fread(copybuf,1,1024,orig)))
fwrite(copybuf,1,bytes,new);
fclose(orig);
fclose(new);
/* execute macro */
/* execute macro */
/*
sprintf(copybuf,"run sys:rexxc/rx %s\n",arexxTemp);
system(copybuf);
*/
sprintf(copybuf,"sys:rexxc/rx %s\n",arexxTemp);
SystemTags(copybuf,
SYS_Asynch, TRUE,
TAG_DONE);
#if 0
RunARexxMacro(
axContext,
ER_MacroFile, fname,
TAG_DONE);
#endif
}
/*************************************************************************
* AmiGetFile()
*
* Get a file from an ASL requester
**************************************************************************/
BOOL AmiGetFile(GUIFront *wgui, struct FileRequester *asl, char *filestore, int storesize)
{
BOOL retval = FALSE;
if (asl == NULL || filestore == NULL)
return FALSE;
/* lock panel */
AmiLock();
GF_LockGUI(wgui);
if (GF_AslRequest(asl,aslTagList)) {
if (!DataGetFileName(filestore,storesize,asl->fr_Drawer,asl->fr_File))
strncpy(filestore,asl->fr_File,storesize);
retval = TRUE;
}
/* unlock panel */
GF_UnlockGUI(wgui);
AmiUnlock();
return (retval);
}
/*******************************************************
* AmiResetBals()
*
* Reset the balances to zero
********************************************************/
void AmiResetBals(void)
{
amountType zero = 0;
char amnt[AMNTSIZE];
DataInitBal(DEPOSITTYPE,&zero,&amntState.currAmnt);
DataInitBal(DEPOSITTYPE,&zero,&amntState.stateAmnt);
DataInitBal(DEPOSITTYPE,&zero,&filtAmnt);
DataBuildBal(usrAccount.decimal,&amntState.currAmnt,amnt);
AmiUpdateCurr(amnt);
DataBuildBal(usrAccount.decimal,&amntState.stateAmnt,amnt);
AmiUpdateState(amnt);
DataBuildBal(usrAccount.decimal,&filtAmnt,amnt);
AmiUpdateFilt(amnt);
}