major updates to support sub-accounts

git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@100 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
Linas Vepstas
1997-11-22 03:41:59 +00:00
parent a9d8972674
commit 580b1f4710
21 changed files with 3099 additions and 780 deletions

177
Docs/xacc-accwin.html Normal file
View File

@@ -0,0 +1,177 @@
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<title>New Account Window</title>
</head>
<body>
<h1>New Account Window</h1>
<ul>
<li>Bank, Cash, Portfolio, Mutal Fund and Asset accounts are considered to be "assets"
<li>Credit Card and Liability accounts are considered to be "liabilities"
</ul>
A "typical" chart of accounts is shown below. It is a combination of
some typical business and personal accounts.
<ul>
<li>Assets
<ul>
<li>Cash On Hand
<ul>
<li>Checking account
<li>Money Market Account
<li>Certificate of Deposit
</ul>
<li>Fixed Assets
<ul>
<li>Furniture
<li>Computers
<li>Jewelry, Collectibles
<li>Tools, Machinery
</ul>
<li>Investments
<ul>
<li>Stocks
<li>Bonds
<li>Mutual Funds
<li>Real Estate
</ul>
</ul>
<li>Liabilities
<ul>
<li>Taxes
<ul>
<li>Federal Income Tax
<li>Social Security
<li>Medicare
<li>FUTA
<li>State Income Tax
</ul>
<li>Accounts Payable
<ul>
<li>Mastercard
<li>Visa
<li>American Express
<li>Diner's Club
</ul>
<li>Loans
<ul>
<li>Debentures
<li>School Loan
<li>Uncle Harry's Tide-me-over
</ul>
</ul>
<li>Equity
<ul>
<li>Retained Earnings
<li>Current Year Earnings
<li>Historical Adjustments
</ul>
<li>Income
<ul>
<li>Interest Income
<ul>
<li>Bank Account Interest
<li>Certificate of Deposit
<li>Bond Intrest
</ul>
<li>Dividends
<ul>
<li>Stock
<li>Mutual Fund
</ul>
<li>Consulting
<ul>
<li>ABC Design
<li>PQR Infomatics
</ul>
<li>Salary
<ul>
<li>My Day Job
</ul>
<li>Commissions
<ul>
<li>Royalties
</ul>
</ul>
<li>Expenses
<ul>
<li>Rent and UItilties
<ul>
<li>Rent
<li>Rent Late Fees
<li>Electricity
<li>Gas
<li>Phone
<li>Internet
<li>Cable TV
</ul>
<li>Office Expenses
<ul>
<li>Accounting
<li>Legal
<li>Software
<li>Postage
<li>Bank Charges
<li>Credit Card Charges
<li>Toner, Paper, Paper Clips
</ul>
<li>Auto Expenses
<ul>
<li>Gas
<li>Insurance
<li>Repair
<li>Rental
</ul>
<li>Taxes
<ul>
<li>Social Security
<li>Unemployment
<li>IRS penalties
</ul>
<li>Wages & Salaries
<ul>
<li>Consulting
<li>Wages
<li>Health Insurance
</ul>
<li>Travel
<ul>
<li>Air
<li>Hotel
<li>Meals
<li>Auto
</ul>
<li>Marketing
<ul>
<li>Advertising
<li>Trade Shows
<li>Give Aways
</ul>
</ul>
</ul>
<hr>
<h2>Reports</h2>
There are two types of reports: a "Balance Sheet" and
a "Profit and Loss Statement".
<p>
A Balance Sheet shows Assets, Liabilities and Equity. The sum of
all assets should equal the sum of Liabilites and Equity.
<p>
A Profit and Loss Statement shows Income and Expenses. The
sum of all Income minus all expenses is the Profit or Loss.
<p>
The change in Equity from day to day (year to year) should
equal that day's (year's) profit or loss.
<p>
<h2>Double Entry</h2>
"Double Entry" referes to a method of accounting wherby every
transaction appears in two and exactly two accounts. Double-entry
helps eliminate accounting errors. The above overview of
accounts and reports should now make it clear how to do double entry:
In general, every entry into an asset or liability account should
have a matching entry in an income or expense account.
</body>
</html>

15
README
View File

@@ -39,9 +39,16 @@ sorry, no "make install" yet.
Status:
-------
As of version 0.9k:
As of version 0.9n:
Bugs:
-- Cash distributions & cash dividends on stock not handled properly
-- Cash distributions & cash dividends on stock are confusing
without sub-accounts. They should appear as transfers from
an income account to the brokerage account, and should be
visible in a gneral ledger that shows both the brokerage
account, and the stock. However, sub-accounts are not
yet implemented fully, and the general-ledger regsiter
window is not implemented. Getting close, though.
-- tabbing between fields for mutual funds does not work correctly.
-- should add "number of shares" to transfer popup when transferring
from bank account to portfolio.
@@ -49,6 +56,10 @@ Bugs:
and then closed. Beats the heck out of me.
---------------
Started implementation of sub-accounts.
This is needed for general ledger capabilites.
---------------
Bare-bones Mutual Fund and Stock Portfolio handling
is implemented.

View File

@@ -2,6 +2,7 @@
* AccWindow.c -- window for creating new accounts for xacc *
* (X-Accountant) *
* Copyright (C) 1997 Robin D. Clark *
* Copyright (C) 1997 Linas Vepstas *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
@@ -23,6 +24,8 @@
* Huntington Beach, CA 92648-4632 *
\********************************************************************/
#include <string.h>
#include <Xm/Xm.h>
#include <Xm/DialogS.h>
#include <Xm/Form.h>
@@ -32,33 +35,31 @@
#include <Xm/ToggleB.h>
#include <Xm/PushB.h>
#include <Xm/Text.h>
#include <string.h>
#include "Account.h"
#include "AccountMenu.h"
#include "Data.h"
#include "main.h"
#include "util.h"
/* NOTE: notes has to be at the beginning of the struct! Order is
* important */
* important -- hack alert -- why is order important ?? */
typedef struct _accwindow {
String notes; /* The text from the "Notes" window */
/* The account type buttons: */
Widget dialog;
Widget bank;
Widget cash;
Widget asset;
Widget credit;
Widget liability;
Widget portfolio;
Widget mutual;
Widget type_widgets[NUM_ACCOUNT_TYPES];
/* The text fields: */
Widget name; /* The account name text field */
Widget desc; /* Account description text field */
AccountMenu *accMenu;
} AccWindow;
/* NOTE: notes has to be at the beginning of the struct! Order is
* important */
* important -- hack alert -- why is order important ?? */
typedef struct _editaccwindow {
String notes; /* The text from the "Notes" window */
/* The text fields: */
@@ -69,15 +70,15 @@ typedef struct _editaccwindow {
} EditAccWindow;
/** GLOBALS *********************************************************/
extern Data *data;
extern Widget toplevel;
/** PROTOTYPES ******************************************************/
void closeAccWindow( Widget mw, XtPointer cd, XtPointer cb );
void closeEditAccWindow( Widget mw, XtPointer cd, XtPointer cb );
void notesCB( Widget mw, XtPointer cd, XtPointer cb );
void createCB( Widget mw, XtPointer cd, XtPointer cb );
void editCB( Widget mw, XtPointer cd, XtPointer cb );
void closeAccWindow ( Widget mw, XtPointer cd, XtPointer cb );
void closeEditAccWindow ( Widget mw, XtPointer cd, XtPointer cb );
static void notesCB ( Widget mw, XtPointer cd, XtPointer cb );
static void createCB ( Widget mw, XtPointer cd, XtPointer cb );
static void editCB ( Widget mw, XtPointer cd, XtPointer cb );
static void selectAccountCB ( Widget mw, XtPointer cd, XtPointer cb );
/********************************************************************\
* accWindow *
@@ -90,9 +91,11 @@ void editCB( Widget mw, XtPointer cd, XtPointer cb );
void
accWindow( Widget parent )
{
int i;
Widget dialog, form, frame, rc, widget,
label, buttonform;
label, buttonform, group_menu, topwid;
AccWindow *accData;
AccountGroup *grp = topgroup; /* hack alert -- should be passed as argument */
setBusyCursor( parent );
@@ -107,9 +110,9 @@ accWindow( Widget parent )
XmNwidth, 350,
XmNminWidth, 350,
XmNmaxWidth, 350,
XmNheight, 300,
XmNminHeight, 300,
XmNmaxHeight, 300,
XmNheight, 340,
XmNminHeight, 340,
XmNmaxHeight, 340,
XmNresizable, FALSE,
XmNallowShellResize, FALSE,
/* XmNtransient, FALSE, /* allow window to be repositioned */
@@ -162,61 +165,24 @@ accWindow( Widget parent )
NULL );
/* Create the buttons */
accData->bank =
XtVaCreateManagedWidget( "Bank",
for (i=0; i<NUM_ACCOUNT_TYPES; i++) {
accData->type_widgets[i] =
XtVaCreateManagedWidget( account_type_name[i],
xmToggleButtonWidgetClass, rc,
XmNindicatorType, XmONE_OF_MANY,
XmNset, True,
XmNset, False,
NULL);
accData->cash =
XtVaCreateManagedWidget( "Cash",
xmToggleButtonWidgetClass, rc,
XmNindicatorType, XmONE_OF_MANY,
NULL);
accData->asset =
XtVaCreateManagedWidget( "Asset",
xmToggleButtonWidgetClass, rc,
XmNindicatorType, XmONE_OF_MANY,
NULL);
accData->credit =
XtVaCreateManagedWidget( "Credit Card",
xmToggleButtonWidgetClass, rc,
XmNindicatorType, XmONE_OF_MANY,
NULL);
accData->liability =
XtVaCreateManagedWidget( "Liability",
xmToggleButtonWidgetClass, rc,
XmNindicatorType, XmONE_OF_MANY,
NULL);
accData->portfolio =
XtVaCreateManagedWidget( "Portfolio",
xmToggleButtonWidgetClass, rc,
XmNindicatorType, XmONE_OF_MANY,
NULL);
/* Portfolio account not supported yet, so grey it out: */
/* hack alert
XtSetSensitive( accData->portfolio, False );
*/
accData->mutual =
XtVaCreateManagedWidget( "Mutual Fund",
xmToggleButtonWidgetClass, rc,
XmNindicatorType, XmONE_OF_MANY,
NULL);
/* Mutual Fund account not supported yet, so grey it out: */
/* hack alert
XtSetSensitive( accData->mutual, False );
*/
}
XtVaSetValues (accData->type_widgets[BANK],
XmNset, True,
NULL);
/******************************************************************\
* Text fields.... *
\******************************************************************/
label =
XtVaCreateManagedWidget( "Account Name:",
xmLabelGadgetClass, form,
@@ -261,15 +227,43 @@ accWindow( Widget parent )
XmNleftPosition, 35, /* 35% */
NULL );
topwid = accData->desc;
label =
XtVaCreateManagedWidget( "Parent Account:",
xmLabelGadgetClass, form,
XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget, topwid,
XmNtopOffset, 10,
XmNrightAttachment, XmATTACH_POSITION,
XmNrightPosition, 35, /* 35% */
NULL );
/* put up a pulldown menu to let user choose an account */
accData->accMenu = xaccBuildAccountMenu (grp, form, "Pick One");
group_menu = xaccGetAccountMenuWidget (accData->accMenu);
xaccAccountMenuAddCallback (accData->accMenu, selectAccountCB, (XtPointer) accData);
XtVaSetValues( group_menu,
XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget, accData->desc,
XmNtopOffset, 10,
XmNleftAttachment, XmATTACH_POSITION,
XmNleftPosition, 35, /* 35% */
NULL );
XtManageChild (group_menu);
/******************************************************************\
* The buttons at the bottom... *
\******************************************************************/
topwid = group_menu;
buttonform = XtVaCreateWidget( "form",
xmFormWidgetClass, form,
XmNfractionBase, 5,
XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget, accData->desc,
XmNtopWidget, topwid,
XmNtopOffset, 10,
XmNbottomAttachment, XmATTACH_FORM,
XmNbottomOffset, 10,
@@ -322,10 +316,10 @@ accWindow( Widget parent )
XtAddCallback( widget, XmNactivateCallback,
createCB, (XtPointer)accData );
/* We need to do something to clean up memory too! */
/* this is done at endo fo dialog.
XtAddCallback( widget, XmNactivateCallback,
destroyShellCB, (XtPointer)dialog );
*/
/* this is done at end of dialog.
* XtAddCallback( widget, XmNactivateCallback,
* destroyShellCB, (XtPointer)dialog );
*/
XtManageChild(buttonform);
@@ -353,6 +347,7 @@ closeAccWindow( Widget mw, XtPointer cd, XtPointer cb )
{
AccWindow *accData = (AccWindow *)cd;
xaccFreeAccountMenu (accData->accMenu);
_free(accData);
DEBUG("close AccWindow");
}
@@ -548,6 +543,9 @@ void
closeEditAccWindow( Widget mw, XtPointer cd, XtPointer cb )
{
EditAccWindow *editAccData = (EditAccWindow *)cd;
printf ("close edit acc window %x %s \n", editAccData,
editAccData->notes);
_free(editAccData);
DEBUG("close EditAccWindow");
@@ -562,12 +560,15 @@ closeEditAccWindow( Widget mw, XtPointer cd, XtPointer cb )
* Return: none *
* Global: toplevel - the toplevel widget *
\********************************************************************/
void
static void
notesCB( Widget mw, XtPointer cd, XtPointer cb )
{
AccWindow *accData = (AccWindow *)cd;
/* hack alert -- isn't this a memory leak ????? */
printf ("orig notes are %x %s \n", accData, accData->notes);
accData->notes = textBox( toplevel, "Notes", accData->notes, True );
printf ("new notes are %s \n", accData->notes);
}
/********************************************************************\
@@ -582,42 +583,18 @@ notesCB( Widget mw, XtPointer cd, XtPointer cb )
* Global: data - the data from the datafile *
* toplevel - the toplevel widget *
\********************************************************************/
void
static void
createCB( Widget mw, XtPointer cd, XtPointer cb )
{
int i,num;
int i, num, acc_id;
Transaction *trans;
Account *acc;
Account *acc, *parent_acc;
AccWindow *accData = (AccWindow *)cd;
Boolean set = False;
String name = XmTextGetString(accData->name);
String desc = XmTextGetString(accData->desc);
#ifdef SHOULDNT_BE_BROKEN_ANYMORE
{
/* since portfolio & mutual not fully implemented, provide warning */
int warn = 0;
XtVaGetValues( accData->portfolio, XmNset, &set, NULL );
if(set) warn = 1;
XtVaGetValues( accData->mutual, XmNset, &set, NULL );
if(set) warn = 1;
if (warn) {
int do_it_anyway;
do_it_anyway = verifyBox (toplevel,
"Warning: Portfolio and Mutual Fund \n\
Account types are not fully implemented. \n\
You can play with the interface here, \n\
but doing so may damage your data. \n\
You have been warned! \n\
Do you want to continue anyway?\n");
if (!do_it_anyway) return;
}
}
#endif /* SHOULDNT_BE_BROKEN_ANYMORE */
/* The account has to have a name! */
if( strcmp( name, "" ) == 0 ) {
errorBox (toplevel, "The account must be given a name! \n");
@@ -631,34 +608,10 @@ Do you want to continue anyway?\n");
acc->notes = accData->notes;
/* figure out account type */
XtVaGetValues( accData->bank, XmNset, &set, NULL );
if(set)
acc->type = BANK;
XtVaGetValues( accData->cash, XmNset, &set, NULL );
if(set)
acc->type = CASH;
XtVaGetValues( accData->asset, XmNset, &set, NULL );
if(set)
acc->type = ASSET;
XtVaGetValues( accData->credit, XmNset, &set, NULL );
if(set)
acc->type = CREDIT;
XtVaGetValues( accData->liability, XmNset, &set, NULL );
if(set)
acc->type = LIABILITY;
XtVaGetValues( accData->portfolio, XmNset, &set, NULL );
if(set)
acc->type = PORTFOLIO;
XtVaGetValues( accData->mutual, XmNset, &set, NULL );
if(set)
acc->type = MUTUAL;
for (i=0; i<NUM_ACCOUNT_TYPES; i++) {
XtVaGetValues( accData->type_widgets[i], XmNset, &set, NULL );
if(set) acc->type = i;
}
/* Add an opening balance transaction (as the first transaction) */
trans = mallocTransaction();
@@ -671,11 +624,19 @@ Do you want to continue anyway?\n");
/* add the new transaction to the account */
insertTransaction( acc, trans );
/* once the account is set up, add it to data */
insertAccount( data, acc );
/* once the account is set up, add it to account group
* If the user indicated a parent acccount, make it a
* sub account of that */
parent_acc = xaccGetAccountMenuSelection (accData->accMenu);
if (parent_acc) {
xaccInsertSubAccount (parent_acc, acc);
} else {
insertAccount( topgroup, acc );
}
/* make sure the accountlist is updated to reflect the new account */
refreshMainWindow();
/* open up the account window for the user */
regWindow( toplevel, acc );
@@ -684,7 +645,7 @@ Do you want to continue anyway?\n");
}
/********************************************************************\
* editCB -- records the edits made by in the editAccWindow *
* editCB -- records the edits made in the editAccWindow *
* *
* Args: mw - the widget that called us *
* cd - editAccData - the struct of data associated with *
@@ -693,7 +654,7 @@ Do you want to continue anyway?\n");
* Return: none *
* Global: data - the data from the datafile *
\********************************************************************/
void
static void
editCB( Widget mw, XtPointer cd, XtPointer cb )
{
EditAccWindow *editAccData = (EditAccWindow *)cd;
@@ -708,7 +669,180 @@ editCB( Widget mw, XtPointer cd, XtPointer cb )
}
XtFree(editAccData->account->description);
editAccData->account->description = name;
editAccData->account->description = desc;
refreshMainWindow();
}
/********************************************************************\
* selectAccountCB -- checks the use account selection *
*
* Basically, sub-account *must* be of the same category as thier
* parent accounts, otherwise chaos will errupt. The five basic
* categories are asset, liability, income,. expense, and equity.
*
* Currently, there are four subcategories for asset accounts:
* banks, cash, stocks, bonds, mutual funds.
*
* *
\********************************************************************/
static void
selectAccountCB( Widget mw, XtPointer cd, XtPointer cb )
{
int i, but;
Boolean set;
AccWindow *menu = (AccWindow *) cd;
Account *acc = (Account *) cb;
/* unset any pressed radio buttons in preparation for
* setting insensitive of some of them.
*/
/* figure out which radio button might be set */
for (i=0; i<NUM_ACCOUNT_TYPES; i++) {
XtVaGetValues( menu->type_widgets[i], XmNset, &set, NULL );
if(set) but = i;
}
if (acc) {
switch (acc->type) {
case BANK:
case CASH:
case ASSET:
case PORTFOLIO:
case MUTUAL:
XtSetSensitive (menu->type_widgets[BANK], True);
XtSetSensitive (menu->type_widgets[CASH], True);
XtSetSensitive (menu->type_widgets[ASSET], True);
XtSetSensitive (menu->type_widgets[PORTFOLIO], True);
XtSetSensitive (menu->type_widgets[MUTUAL], True);
XtSetSensitive (menu->type_widgets[LIABILITY], False);
XtSetSensitive (menu->type_widgets[CREDIT], False);
XtSetSensitive (menu->type_widgets[INCOME], False);
XtSetSensitive (menu->type_widgets[EXPENSE], False);
XtSetSensitive (menu->type_widgets[EQUITY], False);
/* unset unavailable buttons */
XtVaSetValues (menu->type_widgets[LIABILITY], XmNset, False, NULL);
XtVaSetValues (menu->type_widgets[CREDIT], XmNset, False, NULL);
XtVaSetValues (menu->type_widgets[INCOME], XmNset, False, NULL);
XtVaSetValues (menu->type_widgets[EXPENSE], XmNset, False, NULL);
XtVaSetValues (menu->type_widgets[EQUITY], XmNset, False, NULL);
/* set a default, if an inapporpriate button is pushed */
if ((BANK != but) && (CASH != but) &&
(ASSET != but) && (PORTFOLIO != but) &&
(MUTUAL != but) ) {
XtVaSetValues (menu->type_widgets[acc->type], XmNset, True, NULL);
}
break;
case LIABILITY:
case CREDIT:
XtSetSensitive (menu->type_widgets[BANK], False);
XtSetSensitive (menu->type_widgets[CASH], False);
XtSetSensitive (menu->type_widgets[ASSET], False);
XtSetSensitive (menu->type_widgets[PORTFOLIO], False);
XtSetSensitive (menu->type_widgets[MUTUAL], False);
XtSetSensitive (menu->type_widgets[LIABILITY], True);
XtSetSensitive (menu->type_widgets[CREDIT], True);
XtSetSensitive (menu->type_widgets[INCOME], False);
XtSetSensitive (menu->type_widgets[EXPENSE], False);
XtSetSensitive (menu->type_widgets[EQUITY], False);
/* unset unavailable buttons */
XtVaSetValues (menu->type_widgets[BANK], XmNset, False, NULL);
XtVaSetValues (menu->type_widgets[CASH], XmNset, False, NULL);
XtVaSetValues (menu->type_widgets[ASSET], XmNset, False, NULL);
XtVaSetValues (menu->type_widgets[PORTFOLIO], XmNset, False, NULL);
XtVaSetValues (menu->type_widgets[MUTUAL], XmNset, False, NULL);
XtVaSetValues (menu->type_widgets[INCOME], XmNset, False, NULL);
XtVaSetValues (menu->type_widgets[EXPENSE], XmNset, False, NULL);
XtVaSetValues (menu->type_widgets[EQUITY], XmNset, False, NULL);
/* set a default, if an inapporpriate button is pushed */
if ((LIABILITY != but) && (CREDIT != but)) {
XtVaSetValues (menu->type_widgets[acc->type], XmNset, True, NULL);
}
break;
case INCOME:
XtSetSensitive (menu->type_widgets[BANK], False);
XtSetSensitive (menu->type_widgets[CASH], False);
XtSetSensitive (menu->type_widgets[ASSET], False);
XtSetSensitive (menu->type_widgets[PORTFOLIO], False);
XtSetSensitive (menu->type_widgets[MUTUAL], False);
XtSetSensitive (menu->type_widgets[LIABILITY], False);
XtSetSensitive (menu->type_widgets[CREDIT], False);
XtSetSensitive (menu->type_widgets[INCOME], True);
XtSetSensitive (menu->type_widgets[EXPENSE], False);
XtSetSensitive (menu->type_widgets[EQUITY], False);
/* unset unavailable buttons */
for (i=0; i<NUM_ACCOUNT_TYPES; i++) {
XtVaSetValues (menu->type_widgets[i], XmNset, False, NULL);
}
/* set a default, if an inapporpriate button is pushed */
XtVaSetValues (menu->type_widgets[acc->type], XmNset, True, NULL);
break;
case EXPENSE:
XtSetSensitive (menu->type_widgets[BANK], False);
XtSetSensitive (menu->type_widgets[CASH], False);
XtSetSensitive (menu->type_widgets[ASSET], False);
XtSetSensitive (menu->type_widgets[PORTFOLIO], False);
XtSetSensitive (menu->type_widgets[MUTUAL], False);
XtSetSensitive (menu->type_widgets[LIABILITY], False);
XtSetSensitive (menu->type_widgets[CREDIT], False);
XtSetSensitive (menu->type_widgets[INCOME], False);
XtSetSensitive (menu->type_widgets[EXPENSE], True);
XtSetSensitive (menu->type_widgets[EQUITY], False);
/* unset unavailable buttons */
for (i=0; i<NUM_ACCOUNT_TYPES; i++) {
XtVaSetValues (menu->type_widgets[i], XmNset, False, NULL);
}
/* set a default, if an inapporpriate button is pushed */
XtVaSetValues (menu->type_widgets[acc->type], XmNset, True, NULL);
break;
case EQUITY:
XtSetSensitive (menu->type_widgets[BANK], False);
XtSetSensitive (menu->type_widgets[CASH], False);
XtSetSensitive (menu->type_widgets[ASSET], False);
XtSetSensitive (menu->type_widgets[PORTFOLIO], False);
XtSetSensitive (menu->type_widgets[MUTUAL], False);
XtSetSensitive (menu->type_widgets[LIABILITY], False);
XtSetSensitive (menu->type_widgets[CREDIT], False);
XtSetSensitive (menu->type_widgets[INCOME], False);
XtSetSensitive (menu->type_widgets[EXPENSE], False);
XtSetSensitive (menu->type_widgets[EQUITY], True);
/* unset unavailable buttons */
for (i=0; i<NUM_ACCOUNT_TYPES; i++) {
XtVaSetValues (menu->type_widgets[i], XmNset, False, NULL);
}
/* set a default, if an inapporpriate button is pushed */
XtVaSetValues (menu->type_widgets[acc->type], XmNset, True, NULL);
break;
}
} else {
XtSetSensitive (menu->type_widgets[BANK], True);
XtSetSensitive (menu->type_widgets[CASH], True);
XtSetSensitive (menu->type_widgets[ASSET], True);
XtSetSensitive (menu->type_widgets[CREDIT], True);
XtSetSensitive (menu->type_widgets[LIABILITY], True);
XtSetSensitive (menu->type_widgets[PORTFOLIO], True);
XtSetSensitive (menu->type_widgets[MUTUAL], True);
XtSetSensitive (menu->type_widgets[INCOME], True);
XtSetSensitive (menu->type_widgets[EXPENSE], True);
XtSetSensitive (menu->type_widgets[EQUITY], True);
}
}
/********************** END OF FILE *********************************\
\********************************************************************/

View File

@@ -29,7 +29,6 @@
#include "main.h"
#include "util.h"
extern Data *data;
int next_free_unique_account_id = 0;
/********************************************************************\
@@ -49,27 +48,32 @@ mallocAccount( void )
acc->id = next_free_unique_account_id;
next_free_unique_account_id ++;
acc->data = NULL;
acc->balance = 0.0;
acc->parent = NULL;
acc->children = NULL;
acc->balance = 0.0;
acc->cleared_balance = 0.0;
acc->flags = 0;
acc->type = 0;
acc->type = -1;
acc->accountName = NULL;
acc->description = NULL;
acc->notes = NULL;
acc->regData = NULL;
acc->recnData = NULL;
acc->adjBData = NULL;
acc->qfRoot = mallocQuickFill();
acc->numTrans = 0;
acc->transaction = NULL; /* Initially there are no transactions
* in this account's transaction
* array */
/* private data */
acc->arrowb = NULL;
acc->expand = 0;
acc->regData = NULL;
acc->recnData = NULL;
acc->adjBData = NULL;
acc->qfRoot = mallocQuickFill();
return acc;
}
@@ -77,36 +81,74 @@ mallocAccount( void )
\********************************************************************/
void
freeAccount( Account *acc )
{
if( acc != NULL )
{
int i;
XtFree(acc->accountName);
XtFree(acc->description);
XtFree(acc->notes);
freeQuickFill(acc->qfRoot);
for( i=0; i<acc->numTrans; i++ ) {
Transaction *trans = acc->transaction[i];
struct _account * _acc = (struct _account *) acc;
{
int i;
/* free the transaction only if its not
* a part of a double entry */
if (_acc == trans->credit) trans->credit = NULL;
if (_acc == trans->debit) trans->debit = NULL;
if ( (NULL == trans->debit) && (NULL == trans->credit) ) {
freeTransaction( trans );
}
}
if (NULL == acc) return;
/* free the array of pointers */
_free( acc->transaction );
_free(acc);
/* recursively free children */
freeAccountGroup (acc->children);
XtFree(acc->accountName);
XtFree(acc->description);
XtFree(acc->notes);
freeQuickFill(acc->qfRoot);
for( i=0; i<acc->numTrans; i++ ) {
Transaction *trans = acc->transaction[i];
struct _account * _acc = (struct _account *) acc;
/* free the transaction only if its not
* a part of a double entry */
if (_acc == trans->credit) trans->credit = NULL;
if (_acc == trans->debit) trans->debit = NULL;
if ( (NULL == trans->debit) && (NULL == trans->credit) ) {
freeTransaction( trans );
}
}
/* free the array of pointers */
_free( acc->transaction );
/* zero out values, just in case stray
* pointers are pointing here. */
acc->parent = NULL;
acc->children = NULL;
acc->balance = 0.0;
acc->cleared_balance = 0.0;
acc->flags = 0;
acc->type = -1;
acc->accountName = NULL;
acc->description = NULL;
acc->notes = NULL;
acc->numTrans = 0;
acc->transaction = NULL;
/* hack alert -- shouldn't we destroy this widget ??? */
acc->arrowb = NULL;
acc->expand = 0;
acc->regData = NULL;
acc->recnData = NULL;
acc->adjBData = NULL;
_free(acc);
}
/********************************************************************\
\********************************************************************/
int
xaccGetAccountID (Account *acc)
{
if (!acc) return -1;
return acc->id;
}
/********************************************************************\
\********************************************************************/
@@ -137,48 +179,54 @@ getNumOfTransaction( Account *acc, Transaction *trans )
\********************************************************************/
Transaction *
removeTransaction( Account *acc, int num )
{
{
Transaction *trans = NULL;
Transaction **oldTrans;
int i,j;
if( acc != NULL )
{
int i,j;
Transaction **oldTrans = acc->transaction;
if (NULL == acc) return;
/* check for valid number */
if( (0 > num) || (num >= acc->numTrans) ) return NULL;
oldTrans = acc->transaction;
/* Set this flag, so we know we need to save the data file: */
if( data != NULL )
data->saved = False;
/* check for valid number */
if( (0 > num) || (num >= acc->numTrans) ) return NULL;
/* Set this flag, so we know we need to save the data file: */
if( NULL != acc->parent ) acc->parent->saved = False;
acc->numTrans--;
acc->numTrans--;
if (0 < acc->numTrans) {
acc->transaction = (Transaction **)_malloc((acc->numTrans)*
sizeof(Transaction *));
trans = oldTrans[acc->numTrans];/* In case we are deleting last in
* old array */
for( i=0,j=0; i<acc->numTrans; i++,j++ )
{
if( j != num )
for( i=0,j=0; i<acc->numTrans; i++,j++ ) {
if( j != num ) {
acc->transaction[i] = oldTrans[j];
else
{
} else {
trans = oldTrans[j];
i--;
}
}
_free (oldTrans);
/* if this is a double-entry transaction, be sure to
* unmark it. */
if (((Account *)trans->credit) == acc) trans->credit = NULL;
if (((Account *)trans->debit) == acc) trans->debit = NULL;
}
} else {
if (0 != num) {
PERR ("removeTransaction(): num should be zero !");
}
trans = oldTrans[0];
acc->transaction = NULL;
}
_free (oldTrans);
/* if this is a double-entry transaction, be sure to
* unmark it. */
if (((Account *)trans->credit) == acc) trans->credit = NULL;
if (((Account *)trans->debit) == acc) trans->debit = NULL;
return trans;
}
}
/********************************************************************\
\********************************************************************/
@@ -236,47 +284,51 @@ insertTransaction( Account *acc, Transaction *trans )
}
/* mark the data file as needing to be saved: */
if( data != NULL )
data->saved = False;
if( acc->parent != NULL ) acc->parent->saved = False;
acc->numTrans++;
oldTrans = acc->transaction;
acc->transaction = (Transaction **)_malloc((acc->numTrans)*
sizeof(Transaction *));
/* dt is the date of the transaction we are inserting, and dj
* is the date of the "cursor" transaction... we want to insert
* the new transaction before the first transaction of the same
* or later date. The !inserted bit is a bit of a kludge to
* make sure we only insert the new transaction once! */
dt = &(trans->date);
for( i=0,j=0; i<acc->numTrans; i++,j++ )
{
/* if we didn't do this, and we needed to insert into the
* last spot in the array, we would walk off the end of the
* old array, which is no good! */
if( j>=(acc->numTrans-1) )
if (oldTrans) {
/* dt is the date of the transaction we are inserting, and dj
* is the date of the "cursor" transaction... we want to insert
* the new transaction before the first transaction of the same
* or later date. The !inserted bit is a bit of a kludge to
* make sure we only insert the new transaction once! */
dt = &(trans->date);
for( i=0,j=0; i<acc->numTrans; i++,j++ )
{
position = i;
acc->transaction[i] = trans;
break;
}
else
{
dj = &(oldTrans[j]->date);
if( (datecmp(dj,dt) > 0) & !inserted )
/* if we didn't do this, and we needed to insert into the
* last spot in the array, we would walk off the end of the
* old array, which is no good! */
if( j>=(acc->numTrans-1) )
{
position = i;
acc->transaction[i] = trans;
j--;
inserted = True;
break;
}
else
acc->transaction[i] = oldTrans[j];
{
dj = &(oldTrans[j]->date);
if( (datecmp(dj,dt) > 0) & !inserted )
{
position = i;
acc->transaction[i] = trans;
j--;
inserted = True;
}
else
acc->transaction[i] = oldTrans[j];
}
}
}
_free(oldTrans);
_free(oldTrans);
} else {
acc->transaction[0] = trans;
position = 0;
}
if( position != -1 )
qfInsertTransaction( acc->qfRoot, trans );

304
src/AccountMenu.c Normal file
View File

@@ -0,0 +1,304 @@
/********************************************************************\
* AccountMenu.c -- the account menu for xacc (X-Accountant) *
* (general utility) *
* Copyright (C) 1997 Robin D. Clark *
* Copyright (C) 1997 Linas Vepstas *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation; either version 2 of *
* the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License*
* along with this program; if not, write to the Free Software *
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *
* *
* Author: Rob Clark *
* Internet: rclark@cs.hmc.edu *
* Address: 609 8th Street *
* Huntington Beach, CA 92648-4632 *
\********************************************************************/
#include <Xm/Xm.h>
#include <Xm/RowColumn.h>
#include "Account.h"
#include "BuildMenu.h"
#include "Data.h"
#include "util.h"
typedef struct _accMenuEntry
{
Account *option;
char * label;
struct _accountMenu *am;
} AccMenuEntry;
typedef struct _accountMenu
{
Widget menu_widget;
Widget pulldown_widget;
Account *choice;
int numMenuEntries;
AccMenuEntry **menuEntry;
/* user callbacks */
XtCallbackProc callback;
XtPointer client_data;
} AccountMenu;
/********************************************************************\
\********************************************************************/
void
xaccFreeAccountMenu (AccountMenu * menu) {
int i;
for( i=0; i<menu->numMenuEntries; i++ ) {
if (menu->menuEntry[i]) _free (menu->menuEntry[i]);
menu->menuEntry[i] = NULL;
}
_free (menu->menuEntry);
menu->menuEntry = NULL;
menu->numMenuEntries = 0;
_free (menu);
}
/********************************************************************\
\********************************************************************/
Widget
xaccGetAccountMenuWidget (AccountMenu *menu) {
return (menu->menu_widget);
}
Account *
xaccGetAccountMenuSelection (AccountMenu *menu) {
return (menu->choice);
}
/********************************************************************\
* menuCB -- keeps track of the menu choice *
* *
* Args: mw - the widget that called us *
* cd - menuEntry - has the menu option and a pointer to *
* where the selection will be stored *
* cb - *
* Return: none *
\********************************************************************/
static
void
xaccAccountMenuCB( Widget mw, XtPointer cd, XtPointer cb )
{
XmString labelStr;
AccMenuEntry *menuEntry = (AccMenuEntry *)cd;
AccountMenu *menu;
menu = (AccountMenu *) (menuEntry->am);
menu->choice = menuEntry->option;
labelStr = XmStringCreateSimple (menuEntry->label);
XtVaSetValues (menu->pulldown_widget,
XmNlabelString, labelStr,
NULL );
XmStringFree (labelStr);
if (menu->callback) {
(*(menu->callback)) (menu->menu_widget, menu->client_data, (XtPointer) menu->choice);
}
}
/********************************************************************\
* build menus recuresively *
\********************************************************************/
MenuItem *
xaccBuildAccountSubMenu (AccountGroup *grp,
AccountMenu *accData,
int *offset,
int pad)
{
MenuItem *menuList;
int i;
int nacc;
char * tmp;
if (NULL == grp) return NULL;
nacc = grp->numAcc;
menuList = (MenuItem *) _malloc((2*nacc+pad+1)*sizeof(MenuItem));
for( i=0; i<pad; i++ )
{
accData->menuEntry[*offset] = (AccMenuEntry *) _malloc (sizeof (AccMenuEntry));
accData->menuEntry[*offset]->option = NULL;
accData->menuEntry[*offset]->label = "(none)";
accData->menuEntry[*offset]->am = (struct _accountMenu *) accData;
tmp = (char *) _malloc (strlen ("(none)")+1);
strcpy (tmp, "(none)");
menuList[i].label = tmp;
menuList[i].wclass = &xmPushButtonWidgetClass;
menuList[i].mnemonic = 0;
menuList[i].accelerator = NULL;
menuList[i].accel_text = NULL;
menuList[i].callback = xaccAccountMenuCB;
menuList[i].callback_data = accData->menuEntry[*offset];
(*offset) ++;
menuList[i].subitems = (MenuItem *)NULL;
}
for( i=0; i<nacc; i++ )
{
Account *acc = getAccount( grp, i );
accData->menuEntry[*offset] = (AccMenuEntry *) _malloc (sizeof (AccMenuEntry));
accData->menuEntry[*offset]->option = acc;
accData->menuEntry[*offset]->label = acc->accountName;
accData->menuEntry[*offset]->am = (struct _accountMenu *) accData;
tmp = (char *) _malloc (strlen (acc->accountName) + 1);
strcpy (tmp, acc->accountName);
menuList[i+pad].label = tmp;
menuList[i+pad].wclass = &xmPushButtonWidgetClass;
menuList[i+pad].mnemonic = 0;
menuList[i+pad].accelerator = NULL;
menuList[i+pad].accel_text = NULL;
menuList[i+pad].callback = xaccAccountMenuCB;
menuList[i+pad].callback_data = accData->menuEntry[*offset];
menuList[i+pad].subitems = (MenuItem *) NULL;
(*offset) ++;
if (acc->children) {
pad ++;
accData->menuEntry[*offset] = (AccMenuEntry *) _malloc (sizeof (AccMenuEntry));
accData->menuEntry[*offset]->option = acc;
accData->menuEntry[*offset]->label = acc->accountName;
accData->menuEntry[*offset]->am = (struct _accountMenu *) accData;
/* submenu lists in the menu will be distintively bracketed for easy visual id */
tmp = (char *) _malloc (strlen (acc->accountName) + 3);
strcpy (tmp, "[");
strcat (tmp, acc->accountName);
strcat (tmp, "]");
menuList[i+pad].label = tmp;
menuList[i+pad].wclass = &xmPushButtonWidgetClass;
menuList[i+pad].mnemonic = 0;
menuList[i+pad].accelerator = NULL;
menuList[i+pad].accel_text = NULL;
menuList[i+pad].callback = xaccAccountMenuCB;
menuList[i+pad].callback_data = accData->menuEntry[*offset];
(*offset) ++;
menuList[i+pad].subitems = xaccBuildAccountSubMenu (acc->children, accData, offset, 0);
}
}
menuList[i+pad].label= NULL;
return (menuList);
}
/********************************************************************\
* free menus recuresively *
\********************************************************************/
void
xaccFreeAccountSubMenu (MenuItem *menuList)
{
int i;
if (NULL == menuList) return;
i = 0;
while (NULL != menuList[i].label) {
_free (menuList[i].label);
menuList[i].label = NULL;
xaccFreeAccountSubMenu (menuList[i].subitems);
i++;
}
_free (menuList);
}
/********************************************************************\
\********************************************************************/
void
xaccAccountMenuAddCallback (AccountMenu *menu,
XtCallbackProc cb,
XtPointer cd )
{
menu -> callback = cb;
menu -> client_data = cd;
}
/********************************************************************\
\********************************************************************/
AccountMenu *
xaccBuildAccountMenu (AccountGroup *grp, Widget parent, char * label)
{
Widget bar_widget;
MenuItem *menuList;
AccountMenu *accData;
XmString labelStr;
int i;
int offset = 0;
int nacc;
int pad = 1;
if (NULL == grp) return NULL;
nacc = xaccGetNumAccounts (grp);
nacc *= 2; /* quick hack to make room for doubled account labels. */
accData = (AccountMenu *) _malloc (sizeof (AccountMenu));
accData -> choice = NULL;
accData -> callback = NULL;
accData -> client_data = NULL;
accData->menuEntry = (AccMenuEntry **)_malloc((nacc+pad)*sizeof(AccMenuEntry *));
accData->numMenuEntries = nacc+pad;
for (i=0; i<accData->numMenuEntries; i++) {
accData->menuEntry[i] = NULL;
}
/* top-level widget will be a menu widget; this is the only thing
* that will accept cascading menus as a parent */
bar_widget = XmCreateMenuBar( parent, "accmenubar", NULL, 0);
accData->menu_widget = bar_widget;
XtVaSetValues (bar_widget,
XmNorientation, XmVERTICAL,
/* XmNshadowThickness, 0, */
NULL );
XtManageChild (bar_widget);
offset = 0;
menuList = xaccBuildAccountSubMenu (grp, accData, &offset, pad);
accData->pulldown_widget =
BuildMenu( bar_widget, XmMENU_PULLDOWN, label, 'F', False, 0, menuList );
XtVaSetValues (accData->pulldown_widget,
XmNshadowThickness, 0,
NULL );
xaccFreeAccountSubMenu (menuList);
return (accData);
}
/* ********************** END OF FILE *************************/

View File

@@ -29,15 +29,15 @@
#include <Xm/PanedW.h>
#include <Xm/PushB.h>
#include <Xm/LabelGP.h>
#include "main.h"
#include "util.h"
#include "date.h"
#include "Data.h"
#include "MainWindow.h"
#include "Account.h"
#include "Data.h"
#include "date.h"
#include "main.h"
#include "MainWindow.h"
#include "util.h"
/** GLOBALS *********************************************************/
extern Data *data;
/** STRUCTS *********************************************************/
typedef struct _AdjBWindow
@@ -274,8 +274,8 @@ adjBOkCB( Widget mw, XtPointer cd, XtPointer cb )
double themount=0.0,dcurrAmount=0.0;
int i;
data->saved = False;
acc = adjBData->acc;
acc->parent->saved = False;
/* allocate mem for the new transaction */
trans = (Transaction *)_malloc(sizeof(Transaction));

View File

@@ -11,7 +11,7 @@
/* Modified by Rob Clark on Nov 26, 1995
* Changes made: reorginization of code, and addition choice of initial
* option menu selection
* - moved the creation of cascade buttion for
* - moved the creation of cascade button for
* option and pulldown menu till after the
* items in the menu are created... this way
* I can specify a widget (item in menu) to
@@ -106,11 +106,13 @@ Widget BuildMenu( Widget parent, int menu_type, char *menu_title,
*/
if( items[i].subitems )
{
if( menu_type == XmMENU_OPTION )
{
XtWarning("You can't have submenus from option menu items.");
continue;
} else {
if( menu_type == XmMENU_OPTION )
{
XtWarning("You can't have submenus from option menu items.");
continue;
} else
{
widget = BuildMenu( menu, XmMENU_PULLDOWN, items[i].label,
items[i].mnemonic, tear_off, 0,
items[i].subitems);
@@ -187,7 +189,7 @@ Widget BuildMenu( Widget parent, int menu_type, char *menu_title,
{
str = XmStringCreateLocalized (menu_title);
cascade = XtVaCreateManagedWidget( menu_title,
xmCascadeButtonGadgetClass, parent,
xmCascadeButtonGadgetClass, parent,
XmNsubMenuId, menu,
XmNlabelString, str,
XmNmnemonic, menu_mnemonic,

View File

@@ -23,60 +23,111 @@
* Huntington Beach, CA 92648-4632 *
\********************************************************************/
#include "Data.h"
#include "Account.h"
#include "Data.h"
#include "util.h"
/********************************************************************\
* Because I can't use C++ for this project, doesn't mean that I *
* can't pretend too! These functions perform actions on the *
* Data data structure, in order to encapsulate the knowledge *
* of the internals of the Data in one file. *
* AccountGroup data structure, in order to encapsulate the *
* knowledge of the internals of the AccountGroup in one file. *
\********************************************************************/
AccountGroup *topgroup = 0x0;
/********************************************************************\
\********************************************************************/
Data *
mallocData( void )
void
xaccInitializeAccountGroup (AccountGroup *grp)
{
Data *data = (Data *)_malloc(sizeof(Data));
grp->saved = True;
grp->new = False;
data->saved = True;
data->new = False;
grp->parent = NULL;
grp->numAcc = 0;
grp->account = NULL;
data->numAcc = 0;
data->account = NULL;
grp->balance = 0.0;
}
/********************************************************************\
\********************************************************************/
AccountGroup *
mallocAccountGroup( void )
{
AccountGroup *grp = (AccountGroup *)_malloc(sizeof(AccountGroup));
return data;
xaccInitializeAccountGroup (grp);
return grp;
}
/********************************************************************\
\********************************************************************/
void
freeData( Data *data )
{
if( data != NULL )
{
int i;
for( i=0; i<data->numAcc; i++ )
freeAccount( data->account[i] );
_free( data->account );
_free(data);
}
freeAccountGroup( AccountGroup *grp )
{
int i;
if (NULL == grp) return;
if (grp == topgroup) topgroup = NULL; /* safety device */
for( i=0; i<grp->numAcc; i++ ) {
freeAccount( grp->account[i] );
}
_free( grp->account );
/* null everything out, just in case somebody
* tries to traverse freed memory */
xaccInitializeAccountGroup (grp);
_free(grp);
}
/********************************************************************\
\********************************************************************/
void
xaccAccountGroupMarkSaved (AccountGroup *grp)
{
int i;
if (!grp) return;
grp->saved = True;
for (i=0; i<grp->numAcc; i++) {
xaccAccountGroupMarkSaved (grp->account[i]->children);
}
}
/********************************************************************\
\********************************************************************/
int
xaccAccountGroupNotSaved (AccountGroup *grp)
{
int not_saved;
int i;
if (!grp) return;
if (False == grp->saved) return 1;
for (i=0; i<grp->numAcc; i++) {
not_saved = xaccAccountGroupNotSaved (grp->account[i]->children);
if (not_saved) return 1;
}
return 0;
}
/********************************************************************\
\********************************************************************/
Account *
getAccount( Data *data, int num )
getAccount( AccountGroup *grp, int num )
{
if( data != NULL )
if( grp != NULL )
{
if( (0 <= num) && (num < data->numAcc) )
return data->account[num];
if( (0 <= num) && (num < grp->numAcc) )
return grp->account[num];
else
return NULL;
}
@@ -84,6 +135,81 @@ getAccount( Data *data, int num )
return NULL;
}
/********************************************************************\
* Get the number of accounts, including subaccounts *
\********************************************************************/
int
xaccGetNumAccounts ( AccountGroup *root )
{
Account *acc;
int num_acc = 0;
int i;
if (NULL == root) return 0;
num_acc = root->numAcc;
for (i=0; i<root->numAcc; i++) {
num_acc += xaccGetNumAccounts (root->account[i]->children);
}
return num_acc;
}
/********************************************************************\
* Fetch an account, given only it's ID number *
\********************************************************************/
Account *
xaccGetAccountFromID ( AccountGroup *root, int acc_id )
{
Account *acc;
int i;
if (NULL == root) return NULL;
if (0 > acc_id) return NULL;
/* first, look for accounts hanging off the root */
for (i=0; i<root->numAcc; i++) {
acc = root->account[i];
if (acc_id == acc->id) return acc;
}
/* if we are still here, then we haven't found the account yet.
* Recursively search the subgroups next */
for (i=0; i<root->numAcc; i++) {
acc = xaccGetAccountFromID (root->account[i]->children, acc_id);
if (acc) return acc;
}
return NULL;
}
/********************************************************************\
* Fetch the root of the tree *
\********************************************************************/
AccountGroup *
xaccGetAccountRoot (Account * acc)
{
Account *parent_acc;
AccountGroup * grp;
AccountGroup * root;
/* find the root of the account group structure */
grp = (AccountGroup *) acc->parent;
while (grp) {
root = grp;
parent_acc = grp -> parent;
grp = NULL;
if (parent_acc) {
grp = (AccountGroup *) parent_acc->parent;
}
}
return root;
}
/********************************************************************\
* Fetch an account, given only it's ID number *
\********************************************************************/
@@ -91,18 +217,46 @@ getAccount( Data *data, int num )
Account *
xaccGetPeerAccountFromID ( Account *acc, int acc_id )
{
Data * data;
AccountGroup * root;
Account *peer_acc;
int i;
if (NULL == acc) return NULL;
if (-1 >= acc_id) return NULL;
data = (Data *) acc->data;
/* first, find the root of the account group structure */
root = xaccGetAccountRoot (acc);
for (i=0; i<data->numAcc; i++) {
peer_acc = data->account[i];
if (acc_id == peer_acc->id) return peer_acc;
/* now search all acounts hanging off the root */
peer_acc = xaccGetAccountFromID (root, acc_id);
return peer_acc;
}
/********************************************************************\
* Fetch an account, given it's name *
\********************************************************************/
Account *
xaccGetAccountFromName ( AccountGroup *root, char * name )
{
Account *acc;
int i;
if (NULL == root) return NULL;
if (NULL == name) return NULL;
/* first, look for accounts hanging off the root */
for (i=0; i<root->numAcc; i++) {
acc = root->account[i];
if (!strcmp(acc->accountName, name)) return acc;
}
/* if we are still here, then we haven't found the account yet.
* Recursively search the subgroups next */
for (i=0; i<root->numAcc; i++) {
acc = xaccGetAccountFromName (root->account[i]->children, name);
if (acc) return acc;
}
return NULL;
@@ -115,50 +269,49 @@ xaccGetPeerAccountFromID ( Account *acc, int acc_id )
Account *
xaccGetPeerAccountFromName ( Account *acc, char * name )
{
Data * data;
AccountGroup * root;
Account *peer_acc;
int i;
if (NULL == acc) return NULL;
if (NULL == name) return NULL;
data = (Data *) acc->data;
/* first, find the root of the account group structure */
root = xaccGetAccountRoot (acc);
for (i=0; i<data->numAcc; i++) {
peer_acc = data->account[i];
if (!strcmp(peer_acc->accountName, name)) return peer_acc;
}
/* now search all acounts hanging off the root */
peer_acc = xaccGetAccountFromName (root, name);
return NULL;
return peer_acc;
}
/********************************************************************\
\********************************************************************/
Account *
removeAccount( Data *data, int num )
removeAccount( AccountGroup *grp, int num )
{
Account *acc = NULL;
if( data != NULL )
if( NULL != grp )
{
int i,j;
Account **oldAcc = data->account;
Account **oldAcc = grp->account;
data->saved = False;
grp->saved = False;
data->numAcc--;
data->account = (Account **)_malloc((data->numAcc)*sizeof(Account *));
grp->numAcc--;
grp->account = (Account **)_malloc((grp->numAcc)*sizeof(Account *));
acc = oldAcc[data->numAcc]; /* In case we are deleting last in
acc = oldAcc[grp->numAcc]; /* In case we are deleting last in
* old array */
for( i=0,j=0; i<data->numAcc; i++,j++ )
for( i=0,j=0; i<grp->numAcc; i++,j++ )
{
if( j != num )
data->account[i] = oldAcc[j];
grp->account[i] = oldAcc[j];
else
{
acc = oldAcc[j];
j--;
i--;
}
}
@@ -167,36 +320,178 @@ removeAccount( Data *data, int num )
return acc;
}
/********************************************************************\
\********************************************************************/
void
xaccRemoveGroup (AccountGroup *grp)
{
Account *acc;
if (NULL == grp) return;
acc = grp->parent;
/* if this group has no parent, it must be the topgroup */
if (NULL == acc) return;
acc->children = NULL;
/* make sure that the parent of the group is marked
* as having been modified. */
grp = acc -> parent;
if (!grp) return;
grp->saved = False;
}
/********************************************************************\
\********************************************************************/
void
xaccRemoveAccount (Account *acc)
{
int i,j;
AccountGroup *grp;
Account **oldAcc;
if (NULL == acc) return;
grp = acc->parent;
acc->parent = NULL;
/* this routine might be called on accounts which
* are not yet parented. */
if (NULL == grp) return;
oldAcc = grp->account;
grp->saved = False;
grp->numAcc--;
if (0 < grp->numAcc) {
grp->account = (Account **)_malloc((grp->numAcc)*sizeof(Account *));
for( i=0,j=0; i<grp->numAcc; i++,j++ ) {
if( acc != oldAcc[j] ) {
grp->account[i] = oldAcc[j];
} else {
i--;
}
}
} else {
grp->account = NULL;
/* if this was the last account in a group, delete
* the group as well (unless its a root group) */
if (grp->parent) {
xaccRemoveGroup (grp);
freeAccountGroup (grp);
}
}
_free(oldAcc);
}
/********************************************************************\
\********************************************************************/
int
insertAccount( Data *data, Account *acc )
xaccInsertSubAccount( Account *adult, Account *child )
{
int retval;
if (NULL == adult) return -1;
if (NULL == child) return -1;
/* if a container for the children doesn't yet exist, add it */
if (NULL == adult->children) {
adult->children = mallocAccountGroup();
}
/* set back-pointer to parent */
adult->children->parent = adult;
retval = insertAccount (adult->children, child);
return retval;
}
/********************************************************************\
\********************************************************************/
int
insertAccount( AccountGroup *grp, Account *acc )
{
int i=-1;
Account **oldAcc;
if (NULL == data) return -1;
if (NULL == grp) return -1;
if (NULL == acc) return -1;
/* set back-pointer to the accounts parent */
acc->data = (struct _data *) data;
acc->parent = (struct _account_group *) grp;
oldAcc = data->account;
oldAcc = grp->account;
data->saved = False;
grp->saved = False;
data->numAcc++;
data->account = (Account **)_malloc((data->numAcc)*sizeof(Account *));
for( i=0; i<(data->numAcc-1); i++ )
data->account[i] = oldAcc[i];
data->account[i] = acc;
_free(oldAcc);
grp->numAcc++;
grp->account = (Account **)_malloc((grp->numAcc)*sizeof(Account *));
if (1 < grp->numAcc) {
for( i=0; i<(grp->numAcc-1); i++ ) {
grp->account[i] = oldAcc[i];
}
_free(oldAcc);
} else {
i = 0;
}
grp->account[i] = acc;
return i;
}
/********************************************************************\
\********************************************************************/
void
xaccRecomputeGroupBalance (AccountGroup *grp)
{
int i;
Account *acc;
if (!grp) return;
grp->balance = 0.0;
for (i=0; i<grp->numAcc; i++) {
acc = grp->account[i];
/* first, get subtotals recursively */
if (acc->children) {
xaccRecomputeGroupBalance (acc->children);
grp->balance += acc->children->balance;
}
/* then add up accounts in this group */
xaccRecomputeBalance (acc);
grp->balance += acc->balance;
}
}
/********************************************************************\
\********************************************************************/
AccountGroup *
xaccGetRootGroupOfAcct (Account *acc)
{
AccountGroup *grp;
if (!acc) return NULL;
/* recursively walk up the tree of parents */
grp = acc->parent;
acc = grp->parent;
while (acc) {
grp = acc->parent;
acc = grp->parent;
}
return grp;
}
/****************** END OF FILE *************************************/

View File

@@ -35,17 +35,22 @@
* *
* Version 3 of the file format supports actions (Buy, Sell, etc.) *
* *
* Version 4 of the file format adds account groups *
* *
* *
* the format of the data in the file: *
* file ::== token numAccounts (Account)^numAccounts *
* Account ::== num flags type accountName description notes *
* numTran (Transaction)^numTrans *
* file ::== token Group *
* Group ::== numAccounts (Account)^numAccounts *
* Account ::== accID flags type accountName description *
* notes numTran (Transaction)^numTrans *
* numGroups (Group)^numGroups *
* Transaction ::== num date description memo catagory reconciled *
* amount share_price *
* credit_account debit_account *
* token ::== int [the version of file format == VERSION] *
* numTrans ::== int *
* numAccounts ::== int *
* accID ::== int *
* flags ::== char *
* type ::== char *
* accountName ::== String *
@@ -71,31 +76,42 @@
* year ::== int *
\********************************************************************/
#include <Xm/Xm.h>
#include <fcntl.h>
#include "main.h"
#include "util.h"
#include <Xm/Xm.h>
#include "Account.h"
#include "Data.h"
#include "main.h"
#include "util.h"
#define PERMS 0666
#define WFLAGS (O_WRONLY | O_CREAT | O_TRUNC)
#define RFLAGS O_RDONLY
#define VERSION 3
#define VERSION 4
/** GLOBALS *********************************************************/
extern Widget toplevel;
/** PROTOTYPES ******************************************************/
int readAccount( int fd, Account *, int token );
Transaction *readTransaction( int fd, Account *, int token );
char *readString( int fd, int token );
Date *readDate( int fd, int token );
static AccountGroup *holder; /* temporary holder for
* unclassified accounts */
static AccountGroup *maingrp; /* temporary holder for file
* being read */
int writeAccount( int fd, Account *account );
int writeTransaction( int fd, Account *, Transaction *trans );
int writeString( int fd, char *str );
int writeDate( int fd, Date *date );
/** PROTOTYPES ******************************************************/
static Account *locateAccount (int acc_id);
static Account *springAccount (int acc_id);
static AccountGroup *readGroup( int fd, Account *, int token );
static Account *readAccount( int fd, AccountGroup *, int token );
static Transaction *readTransaction( int fd, Account *, int token );
static char *readString( int fd, int token );
static Date *readDate( int fd, int token );
static int writeGroup( int fd, AccountGroup *grp );
static int writeAccount( int fd, Account *account );
static int writeTransaction( int fd, Transaction *trans );
static int writeString( int fd, char *str );
static int writeDate( int fd, Date *date );
/*******************************************************/
/* some endian stuff */
@@ -158,7 +174,7 @@ double xaccFlipDouble (double val)
* Args: datafile - the file to load the data from *
* Return: the struct with the program data in it *
\********************************************************************/
Data *
AccountGroup *
readData( char *datafile )
{
int fd;
@@ -166,13 +182,15 @@ readData( char *datafile )
int err=0;
int token=0;
int i;
Data *data = mallocData();
int num_unclaimed;
AccountGroup *grp = 0x0;
maingrp = 0x0;
fd = open( datafile, RFLAGS, 0 );
if( fd == -1 )
{
ERROR();
freeData(data);
return NULL;
}
@@ -182,66 +200,109 @@ readData( char *datafile )
{
ERROR();
close(fd);
freeData(data);
return NULL;
}
XACC_FLIP_INT (token);
/* If this is an old file, ask the user if the file
* should be updated */
if( VERSION > token )
{
char msg[BUFSIZE];
sprintf( (char *)&msg, FILE_TOO_OLD_MSG );
if( !verifyBox( toplevel, msg ) )
if( VERSION > token ) {
if( !verifyBox( toplevel, FILE_TOO_OLD_MSG ) ) {
close(fd);
return NULL;
}
}
/* If this is a newer file than we know how to deal
* with, warn the user */
if( VERSION < token )
{
char msg[BUFSIZE];
sprintf( (char *)&msg, FILE_TOO_NEW_MSG );
if( !verifyBox( toplevel, msg ) )
if( VERSION < token ) {
if( !verifyBox( toplevel, FILE_TOO_NEW_MSG ) ) {
close(fd);
return NULL;
}
}
holder = mallocAccountGroup();
grp = readGroup (fd, NULL, token);
/* the number of unclaimed accounts should be zero if the
* read succeeded. But just in case of a very unlikely
* error, try to continue anyway. */
num_unclaimed = xaccGetNumAccounts (holder);
if (num_unclaimed) {
if ( !verifyBox( toplevel, FILE_BAD_READ_MSG ) ) {
freeAccountGroup (holder);
freeAccountGroup (grp);
grp = NULL;
} else {
/* create a lost account, put the missing accounts there */
Account *acc = mallocAccount();
acc -> accountName = XtNewString ("Lost Accounts");
acc -> children = (struct _account_group *) holder;
insertAccount (grp, acc);
}
} else {
freeAccountGroup (holder);
holder = NULL;
}
maingrp = NULL;
close(fd);
return grp;
}
/********************************************************************\
* readGroup *
* reads in a group of accounts *
* *
* Args: *
* Return: the struct with the program data in it *
\********************************************************************/
static AccountGroup *
readGroup (int fd, Account *aparent, int token)
{
int numAcc;
int err=0;
int i;
AccountGroup *grp = mallocAccountGroup();
ENTER ("readGroup");
if (NULL == aparent) {
maingrp = grp;
}
/* read numAccs */
err = read( fd, &numAcc, sizeof(int) );
if( err == -1 )
{
close(fd);
freeData(data);
freeAccountGroup (grp);
return NULL;
}
XACC_FLIP_INT (numAcc);
/* malloc the accounts, in preparation for reading.
* Mmalloc all of them; they will be needed for up front
* for inserting the double-entry transactions */
for( i=0; i<numAcc; i++ )
{
Account *acc = mallocAccount();
insertAccount( data, acc );
}
INFO_2 ("readGroup(): expecting %d accounts \n", numAcc);
/* read in the accounts */
for( i=0; i<numAcc; i++ )
{
Account *acc = getAccount (data, i);
err = readAccount( fd, acc, token );
if( -1 == err )
{
close(fd);
printf(" numAcc = %d, i = %d\n",numAcc,i);
return data;
Account * acc = readAccount( fd, grp, token );
if( NULL == acc ) {
printf("Error: readGroup(): Short group read: \n");
printf("expected %d, got %d accounts\n",numAcc,i);
break;
}
}
close(fd);
return data;
/* if reading an account subgroup, place the subgroup
* into the parent account */
grp->parent = aparent;
if (aparent) {
aparent->children = grp;
}
return grp;
}
/********************************************************************\
* readAccount *
@@ -252,77 +313,48 @@ readData( char *datafile )
* token - the datafile version *
* Return: error value, 0 if OK, else -1 *
\********************************************************************/
int
readAccount( int fd, Account *acc, int token )
static Account *
readAccount( int fd, AccountGroup *grp, int token )
{
int err=0;
int i;
int numTrans, nacc;
int numTrans, accID;
Account *acc;
ENTER ("readAccount");
/* version 1 does not store the account number */
if (1 < token) {
err = read( fd, &nacc, sizeof(int) );
if( err != sizeof(int) )
{
freeAccount(acc);
return -1;
}
XACC_FLIP_INT (nacc);
/* normalize the account numbers -- positive-definite.
* That is, the unique id must never decrease,
* nor must it overalp any existing account id */
acc->id = nacc;
if (next_free_unique_account_id <= nacc) {
next_free_unique_account_id = nacc+1;
}
err = read( fd, &accID, sizeof(int) );
if( err != sizeof(int) ) { return NULL; }
XACC_FLIP_INT (accID);
acc = locateAccount (accID);
} else {
acc = mallocAccount();
insertAccount (holder, acc);
}
err = read( fd, &(acc->flags), sizeof(char) );
if( err != sizeof(char) )
{
freeAccount(acc);
return -1;
}
if( err != sizeof(char) ) { return NULL; }
err = read( fd, &(acc->type), sizeof(char) );
if( err != sizeof(char) )
{
freeAccount(acc);
return -1;
}
if( err != sizeof(char) ) { return NULL; }
acc->accountName = readString( fd, token );
if( acc->accountName == NULL )
{
freeAccount(acc);
return -1;
}
if( acc->accountName == NULL ) { return NULL; }
INFO_2 ("readAccount(): reading acct %s \n", acc->accountName);
acc->description = readString( fd, token );
if( acc->description == NULL )
{
freeAccount(acc);
return -1;
}
if( acc->description == NULL ) { return NULL; }
acc->notes = readString( fd, token );
if( acc->notes == NULL )
{
freeAccount(acc);
return -1;
}
if( acc->notes == NULL ) { return NULL; }
err = read( fd, &numTrans, sizeof(int) );
if( err != sizeof(int) )
{
freeAccount(acc);
return -1;
}
if( err != sizeof(int) ) { return NULL; }
XACC_FLIP_INT (numTrans);
INFO_2 ("Info: readAccount(): expecting %d transactions \n", numTrans);
/* read the transactions */
for( i=0; i<numTrans; i++ )
{
@@ -330,15 +362,103 @@ readAccount( int fd, Account *acc, int token )
trans = readTransaction( fd, acc, token );
if( trans == NULL )
{
printf("Error: readAccount: Premature termination: \n");
printf (" numTrans = %d i = %d\n",numTrans,i);
return 0;
PERR ("readAccount(): Short Transaction Read: \n");
printf (" expected %d got %d transactions \n",numTrans,i);
break;
}
}
return 0;
springAccount (acc->id);
insertAccount (grp, acc);
/* version 4 is the first file version that introduces
* sub-accounts */
if (4 <= token) {
int numGrps;
err = read( fd, &numGrps, sizeof(int) );
if( err != sizeof(int) ) {
return NULL;
}
XACC_FLIP_INT (numGrps);
if (numGrps) {
readGroup (fd, acc, token);
}
}
return acc;
}
/********************************************************************\
* locateAccount
*
* With the double-entry system, the file may reference accounts
* that have not yet been read or properly parented. Thus, we need
* a way of dealing with this, and this routine performs this
* work. Basically, accounts are requested by thier id. If an
* account with the indicated ID does not exist, it is created
* and placed in a temporary holding cell. Accounts in the
* holding cell can be located, (so that transactions can be
* added to them) and sprung (so that they can be properly
* parented into a group).
\********************************************************************/
static Account *
locateAccount (int acc_id)
{
Account * acc;
/* negative account ids denote no account */
if (0 > acc_id) return NULL;
/* first, see if we've already created the account */
acc = xaccGetAccountFromID (maingrp, acc_id);
if (acc) return acc;
/* next, see if its an unclaimed account */
acc = xaccGetAccountFromID (holder, acc_id);
if (acc) return acc;
/* if neither, then it does not yet exist. Create it.
* Put it in the drunk tank. */
acc = mallocAccount ();
acc->id = acc_id;
insertAccount (holder, acc);
/* normalize the account numbers -- positive-definite.
* That is, the unique id must never decrease,
* nor must it overalp any existing account id */
if (next_free_unique_account_id <= acc_id) {
next_free_unique_account_id = acc_id+1;
}
return acc;
}
static Account *
springAccount (int acc_id)
{
Account * acc;
/* first, see if we're confused about the account */
acc = xaccGetAccountFromID (maingrp, acc_id);
if (acc) {
printf ("Internal Error: springAccount(): \n");
printf ("account already parented \n");
return NULL;
}
/* next, see if we've got it */
acc = xaccGetAccountFromID (holder, acc_id);
if (acc) {
xaccRemoveAccount (acc);
return acc;
}
/* if we got to here, its an error */
printf ("Internal Error: springAccount(): \n");
printf ("Couldn't find account \n");
return NULL;
}
/********************************************************************\
* readTransaction *
* reads in the data for a transaction from the datafile *
@@ -347,7 +467,8 @@ readAccount( int fd, Account *acc, int token )
* token - the datafile version *
* Return: the transaction structure *
\********************************************************************/
Transaction *
static Transaction *
readTransaction( int fd, Account *acc, int token )
{
int err=0;
@@ -360,17 +481,16 @@ readTransaction( int fd, Account *acc, int token )
trans->num = readString( fd, token );
if( trans->num == NULL )
{
DEBUG ("Error: Premature end of Transaction at num");
_free(trans);
PERR ("Premature end of Transaction at num");
freeTransaction(trans);
return NULL;
}
date = readDate( fd, token );
if( date == NULL )
{
DEBUG ("Error: Premature end of Transaction at date");
XtFree(trans->num);
_free(trans);
PERR ("Premature end of Transaction at date");
freeTransaction(trans);
return NULL;
}
trans->date = *date;
@@ -379,32 +499,26 @@ readTransaction( int fd, Account *acc, int token )
trans->description = readString( fd, token );
if( trans->description == NULL )
{
DEBUG ("Error: Premature end of Transaction at description");
XtFree(trans->num);
_free(trans);
PERR ("Premature end of Transaction at description");
freeTransaction(trans);
return NULL;
}
trans->memo = readString( fd, token );
if( trans->memo == NULL )
{
DEBUG ("Error: Premature end of Transaction at memo");
XtFree(trans->description);
XtFree(trans->num);
_free(trans);
PERR ("Premature end of Transaction at memo");
freeTransaction(trans);
return NULL;
}
/* actin first introduced in version 3 of the file format */
/* action first introduced in version 3 of the file format */
if (3 <= token) {
trans->action = readString( fd, token );
if( trans->action == NULL )
{
DEBUG ("Error: Premature end of Transaction at memo");
XtFree(trans->description);
XtFree(trans->num);
XtFree(trans->memo);
_free(trans);
PERR ("Premature end of Transaction at memo");
freeTransaction(trans);
return NULL;
}
}
@@ -412,12 +526,8 @@ readTransaction( int fd, Account *acc, int token )
err = read( fd, &(trans->catagory), sizeof(int) );
if( err != sizeof(int) )
{
DEBUG ("Error: Premature end of Transaction at catagory");
XtFree(trans->description);
XtFree(trans->num);
XtFree(trans->memo);
XtFree(trans->action);
_free(trans);
PERR ("Premature end of Transaction at catagory");
freeTransaction(trans);
return NULL;
}
XACC_FLIP_INT (trans->catagory);
@@ -425,11 +535,8 @@ readTransaction( int fd, Account *acc, int token )
err = read( fd, &(trans->reconciled), sizeof(char) );
if( err != sizeof(char) )
{
DEBUG ("Error: Premature end of Transaction at reconciled");
XtFree(trans->memo);
XtFree(trans->description);
XtFree(trans->num);
_free(trans);
PERR ("Premature end of Transaction at reconciled");
freeTransaction(trans);
return NULL;
}
@@ -457,11 +564,8 @@ readTransaction( int fd, Account *acc, int token )
err = read( fd, &amount, sizeof(int) );
if( err != sizeof(int) )
{
DEBUG ("Error: Premature end of Transaction at V1 amount");
XtFree(trans->memo);
XtFree(trans->description);
XtFree(trans->num);
_free(trans);
PERR ("Premature end of Transaction at V1 amount");
freeTransaction(trans);
return NULL;
}
XACC_FLIP_INT (amount);
@@ -473,11 +577,8 @@ readTransaction( int fd, Account *acc, int token )
err = read( fd, &damount, sizeof(double) );
if( err != sizeof(double) )
{
DEBUG ("Error: Premature end of Transaction at amount");
XtFree(trans->memo);
XtFree(trans->description);
XtFree(trans->num);
_free(trans);
PERR ("Premature end of Transaction at amount");
freeTransaction(trans);
return NULL;
}
XACC_FLIP_DOUBLE (damount);
@@ -487,17 +588,14 @@ readTransaction( int fd, Account *acc, int token )
err = read( fd, &damount, sizeof(double) );
if( err != sizeof(double) )
{
DEBUG ("Error: Premature end of Transaction at share_price");
XtFree(trans->memo);
XtFree(trans->description);
XtFree(trans->num);
_free(trans);
PERR ("Premature end of Transaction at share_price");
freeTransaction(trans);
return NULL;
}
XACC_FLIP_DOUBLE (damount);
trans->share_price = damount;
}
DEBUGCMD(printf ("Info: readTransaction(): amount %f \n", trans->damount));
INFO_2 ("readTransaction(): amount %f \n", trans->damount);
/* Read the account numbers for double-entry */
/* These are first used in Version 2 of the file format */
@@ -507,15 +605,13 @@ readTransaction( int fd, Account *acc, int token )
err = read( fd, &acc_id, sizeof(int) );
if( err != sizeof(int) )
{
DEBUG ("Error: Premature end of Transaction at credit");
XtFree(trans->memo);
XtFree(trans->description);
XtFree(trans->num);
PERR ("Premature end of Transaction at credit");
freeTransaction(trans);
return NULL;
}
XACC_FLIP_INT (acc_id);
DEBUGCMD (printf ("Info: readTransaction(): credit %d\n", acc_id));
peer_acc = xaccGetPeerAccountFromID (acc, acc_id);
INFO_2 ("readTransaction(): credit %d\n", acc_id);
peer_acc = locateAccount (acc_id);
trans -> credit = (struct _account *) peer_acc;
/* insert the transaction into both the debit and
@@ -526,15 +622,13 @@ readTransaction( int fd, Account *acc, int token )
err = read( fd, &acc_id, sizeof(int) );
if( err != sizeof(int) )
{
DEBUG ("Error: Premature end of Transaction at debit");
XtFree(trans->memo);
XtFree(trans->description);
XtFree(trans->num);
PERR ("Premature end of Transaction at debit");
freeTransaction(trans);
return NULL;
}
XACC_FLIP_INT (acc_id);
DEBUGCMD (printf ("Info: readTransaction(): debit %d\n", acc_id));
peer_acc = xaccGetPeerAccountFromID (acc, acc_id);
INFO_2 ("readTransaction(): debit %d\n", acc_id);
peer_acc = locateAccount (acc_id);
trans -> debit = (struct _account *) peer_acc;
/* insert the transaction into both the debit and
@@ -547,7 +641,7 @@ readTransaction( int fd, Account *acc, int token )
}
return trans;
}
}
/********************************************************************\
* readString *
@@ -557,7 +651,7 @@ readTransaction( int fd, Account *acc, int token )
* token - the datafile version *
* Return: the string *
\********************************************************************/
char *
static char *
readString( int fd, int token )
{
int err=0;
@@ -589,7 +683,7 @@ readString( int fd, int token )
* token - the datafile version *
* Return: the Date struct *
\********************************************************************/
Date *
static Date *
readDate( int fd, int token )
{
int err=0;
@@ -626,6 +720,43 @@ readDate( int fd, int token )
********************** SAVE DATA ***********************************
\********************************************************************/
static void
xaccResetWriteFlags (AccountGroup *grp)
{
int i, numAcc;
if (!grp) return;
/* Zero out the write flag on all of the
* transactions. The write_flag is used to determine
* if a given transaction has already been written
* out to the file. This flag is necessary, since
* double-entry transactions appear in two accounts,
* while they should be written only once to the file.
* The write_flag is used ONLY by the routines in this
* module.
*/
numAcc = grp ->numAcc;
for( i=0; i<numAcc; i++ ) {
int n=0;
Account *acc;
Transaction * trans;
acc = getAccount (grp,i) ;
/* recursively do sub-accounts */
xaccResetWriteFlags (acc->children);
/* zip over all accounts */
trans = getTransaction (acc, 0);
n++;
while (trans) {
trans->write_flag = 0;
trans = getTransaction (acc, n);
n++;
}
}
}
/********************************************************************\
* writeData *
* flattens the program data and saves it in a file *
@@ -634,31 +765,24 @@ readDate( int fd, int token )
* Return: -1 on failure *
\********************************************************************/
int
writeData( char *datafile, Data *data )
writeData( char *datafile, AccountGroup *grp )
{
int i,numAcc;
int err = 0;
int token = VERSION; /* The file format version */
int fd;
if (NULL == data) return -1;
if (NULL == grp) return -1;
/* first, zero out the write flag on all of the
* transactions */
numAcc = data ->numAcc;
for( i=0; i<numAcc; i++ ) {
int n=0;
Account *acc;
Transaction * trans;
acc = getAccount (data,i) ;
trans = getTransaction (acc, n);
n++;
while (trans) {
trans->write_flag = 0;
trans = getTransaction (acc, n);
n++;
}
}
* transactions. The write_flag is used to determine
* if a given transaction has already been written
* out to the file. This flag is necessary, since
* double-entry transactions appear in two accounts,
* while they should be written only once to the file.
* The write_flag is used ONLY by the routines in this
* module.
*/
xaccResetWriteFlags (grp);
/* now, open the file and start writing */
fd = open( datafile, WFLAGS, PERMS );
@@ -677,20 +801,44 @@ writeData( char *datafile, Data *data )
return -1;
}
numAcc = data->numAcc;
err = writeGroup (fd, grp);
close(fd);
return err;
}
/********************************************************************\
* writeGroup *
* writes out a group of accounts to a file *
* *
* Args: fd -- file descriptor *
* grp -- account group *
* *
* Return: -1 on failure *
\********************************************************************/
static int
writeGroup (int fd, AccountGroup *grp )
{
int i,numAcc;
int err = 0;
ENTER ("writeGroup");
if (NULL == grp) return 0;
numAcc = grp->numAcc;
XACC_FLIP_INT (numAcc);
err = write( fd, &numAcc, sizeof(int) );
if( err != sizeof(int) )
return -1;
for( i=0; i<data->numAcc; i++ )
for( i=0; i<grp->numAcc; i++ )
{
err = writeAccount( fd, getAccount(data,i) );
err = writeAccount( fd, getAccount(grp,i) );
if( err == -1 )
return err;
}
close(fd);
return err;
}
@@ -702,16 +850,18 @@ writeData( char *datafile, Data *data )
* acc - the account data to save *
* Return: -1 on failure *
\********************************************************************/
int
static int
writeAccount( int fd, Account *acc )
{
Transaction *trans;
int err=0;
int i,numTrans, ntrans;
int i, numUnwrittenTrans, ntrans;
int acc_id;
int numChildren = 0;
INFO_2 ("writeAccount(): writing acct %s \n", acc->accountName);
acc_id = acc->id;
DEBUGCMD (printf ("Info: writeAccount: writing acct id %d %x \n", acc_id, acc));
XACC_FLIP_INT (acc_id);
err = write( fd, &acc_id, sizeof(int) );
if( err != sizeof(int) )
@@ -741,25 +891,41 @@ writeAccount( int fd, Account *acc )
* number of transactions in this account, because some
* of the double entry transactions will already have been
* written. */
numTrans = 0;
i = 0;
trans = getTransaction (acc, i);
while (trans) {
i++;
if (0 == trans->write_flag) numTrans ++;
trans = getTransaction (acc, i);
numUnwrittenTrans = 0;
for( i=0; i<acc->numTrans; i++ ) {
trans = getTransaction(acc,i);
if (0 == trans->write_flag) numUnwrittenTrans ++;
}
ntrans = numTrans;
ntrans = numUnwrittenTrans;
XACC_FLIP_INT (ntrans);
err = write( fd, &ntrans, sizeof(int) );
if( err != sizeof(int) )
return -1;
for( i=0; i<numTrans; i++ ) {
err = writeTransaction( fd, acc, getTransaction(acc,i) );
INFO_2 ("writeAccount(): will write %d trans\n", numUnwrittenTrans);
for( i=0; i<acc->numTrans; i++ ) {
trans = getTransaction(acc,i);
if (0 == trans->write_flag) {
err = writeTransaction( fd, trans );
}
if( err == -1 ) return err;
}
if (acc->children) {
numChildren = 1;
} else {
numChildren = 0;
}
XACC_FLIP_INT (numChildren);
err = write( fd, &numChildren, sizeof(int) );
if( err != sizeof(int) )
return -1;
if (acc->children) {
err = writeGroup (fd, acc->children);
}
return err;
}
@@ -773,8 +939,8 @@ writeAccount( int fd, Account *acc )
* trans - the transaction data to save *
* Return: -1 on failure *
\********************************************************************/
int
writeTransaction( int fd, Account * acc, Transaction *trans )
static int
writeTransaction( int fd, Transaction *trans )
{
int err=0;
int tmp, acc_id;
@@ -782,8 +948,10 @@ writeTransaction( int fd, Account * acc, Transaction *trans )
Account *xfer_acc;
ENTER ("writeTransaction");
/* if we've already written this transaction, don't write it again */
/* that is, prevent double-entry transactions from being written twice */
/* If we've already written this transaction, don't write
* it again. That is, prevent double-entry transactions
* from being written twice
*/
if (trans->write_flag) return 4;
trans->write_flag = 1;
@@ -818,7 +986,7 @@ writeTransaction( int fd, Account * acc, Transaction *trans )
return -1;
damount = trans->damount;
DEBUGCMD (printf ("Info: writeTransaction: amount=%f \n", damount));
INFO_2 ("writeTransaction: amount=%f \n", damount);
XACC_FLIP_DOUBLE (damount);
err = write( fd, &damount, sizeof(double) );
if( err != sizeof(double) )
@@ -834,7 +1002,7 @@ writeTransaction( int fd, Account * acc, Transaction *trans )
xfer_acc = (Account *) (trans->credit);
acc_id = -1;
if (xfer_acc) acc_id = xfer_acc -> id;
DEBUGCMD (printf ("Info: writeTransaction: credit %d \n", acc_id));
INFO_2 ("writeTransaction: credit %d \n", acc_id);
XACC_FLIP_INT (acc_id);
err = write( fd, &acc_id, sizeof(int) );
if( err != sizeof(int) )
@@ -843,7 +1011,7 @@ writeTransaction( int fd, Account * acc, Transaction *trans )
xfer_acc = (Account *) (trans->debit);
acc_id = -1;
if (xfer_acc) acc_id = xfer_acc -> id;
DEBUGCMD (printf ("Info: writeTransaction: debit %d \n", acc_id));
INFO_2 (" writeTransaction: debit %d \n", acc_id);
XACC_FLIP_INT (acc_id);
err = write( fd, &acc_id, sizeof(int) );
if( err != sizeof(int) )
@@ -860,7 +1028,7 @@ writeTransaction( int fd, Account * acc, Transaction *trans )
* str - the String to save *
* Return: -1 on failure *
\********************************************************************/
int
static int
writeString( int fd, char *str )
{
int err=0;
@@ -895,7 +1063,7 @@ writeString( int fd, char *str )
* date - the Date to save *
* Return: -1 on failure *
\********************************************************************/
int
static int
writeDate( int fd, Date *date )
{
int err=0;

View File

@@ -22,8 +22,6 @@
* Huntington Beach, CA 92648-4632 *
\********************************************************************/
#define USEDEBUG
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

View File

@@ -24,41 +24,52 @@
\********************************************************************/
#include <Xm/Xm.h>
#include <Xm/PanedW.h>
#include <Xm/ArrowB.h>
#include <Xm/Form.h>
#include <Xm/MainW.h>
#include <Xm/Label.h>
#include <Xm/LabelGP.h>
#include <Xm/List.h>
#include <Xm/MainW.h>
#include <Xm/PanedW.h>
#include <Xm/RowColumn.h>
#include <Xm/Text.h>
#include <Xbae/Matrix.h>
#include "main.h"
#include "util.h"
#include "Data.h"
#include "Account.h"
#include "FileIO.h"
#include "FileBox.h"
#include "BuildMenu.h"
#include "Data.h"
#include "FileBox.h"
#include "FileIO.h"
#include "HelpWindow.h"
#include "main.h"
#include "MainWindow.h"
#include "RegWindow.h"
#include "util.h"
#include "XferWindow.h"
#include "HelpWindow.h"
/** PROTOTYPES ******************************************************/
void closeMainWindow( Widget mw, XtPointer cd, XtPointer cb );
void listCB( Widget mw, XtPointer cd, XtPointer cb );
void fileMenubarCB( Widget mw, XtPointer cd, XtPointer cb );
void accountMenubarCB( Widget mw, XtPointer cd, XtPointer cb );
void helpMenubarCB( Widget mw, XtPointer cd, XtPointer cb );
static void xaccMainWindowRedisplayBalance (void);
static void closeMainWindow ( Widget mw, XtPointer cd, XtPointer cb );
static void listCB ( Widget mw, XtPointer cd, XtPointer cb );
static void expandListCB ( Widget mw, XtPointer cd, XtPointer cb );
static void ArrowEventCallback (Widget w, XtPointer pClientData,
XEvent *event, Boolean *ContDispatch);
/** GLOBALS *********************************************************/
extern Data *data;
extern char *datafile;
extern Widget toplevel;
int row; /* The selected row of accountlist */
Widget accountlist;
char *type[] = { "Bank","Cash","Asset","Credit Card",
"Liability","Portfolio","Mutual Fund" };
static Account *selected_acc = NULL; /* The selected account */
static Widget accountlist;
static Widget baln_widget;
/* the english-language names here should match
* the enumerated types in Account.h */
char *account_type_name[] =
{ "Bank","Cash","Asset","Credit Card",
"Liability","Stock","Mutual Fund",
"Income", "Expense", "Equity" };
/* Pixel values are used to color the balance field text
* when computing the balance */
#ifndef USE_NO_COLOR
@@ -68,6 +79,133 @@ Pixel posPixel, negPixel;
Boolean havePixels = False;
#endif
#define XACC_MAIN_NUM_COLS 4
#define XACC_MAIN_ACC_ARRW 0
#define XACC_MAIN_ACC_NAME 1
#define XACC_MAIN_ACC_TYPE 2
#define XACC_MAIN_ACC_BALN 3
/********************************************************************\
* xaccMainWindowAddAcct *
* *
* Args: none *
* Return: none *
\********************************************************************/
void
xaccMainWindowAddAcct (Widget acctrix, AccountGroup *grp, int depth )
{
int i, j, currow;
char buf[BUFSIZE];
/* Add all the top-level accounts to the list */
for( i=0; i<grp->numAcc; i++ )
{
String cols[XACC_MAIN_NUM_COLS];
Transaction *trans=NULL;
Account *acc = getAccount( grp, i );
double dbalance;
/* fill in the arrow and the account type fileds */
cols[XACC_MAIN_ACC_ARRW] = XtNewString("");
cols[XACC_MAIN_ACC_TYPE] = account_type_name[acc->type];
/* fill in the account name field, indenting for sub-accounts */
buf[0] = 0x0;
for (j=0; j<depth; j++) {
strcat (buf, " ");
}
strcat (buf, acc->accountName);
cols[XACC_MAIN_ACC_NAME] = XtNewString(buf);
/* fill in the balance column */
dbalance = acc->balance;
/* if the account has children, add in thier balance */
if (acc->children) {
dbalance += acc->children->balance;
}
/* the meaning of "balance" for income and expense
* accounts is reversed, since a deposit of a paycheck in a
* bank account will appear as a debit of the corresponding
* amount in the income account */
if ((EXPENSE == acc->type) ||
(INCOME == acc->type) ) {
dbalance = -dbalance;
}
if( 0.0 > dbalance )
sprintf( buf,"-$%.2f\0", DABS(dbalance) );
else
sprintf( buf,"$%.2f\0", DABS(dbalance) );
cols[XACC_MAIN_ACC_BALN] = XtNewString(buf);
XtVaGetValues (acctrix, XmNrows, &currow, NULL);
XbaeMatrixAddRows( acctrix, currow, cols, NULL, NULL, 1 );
#ifndef USE_NO_COLOR
/* Set the color of the text, depending on whether the
* balance is negative or positive */
if( 0.0 > dbalance )
XbaeMatrixSetCellColor( acctrix, currow, XACC_MAIN_ACC_BALN, negPixel );
else
XbaeMatrixSetCellColor( acctrix, currow, XACC_MAIN_ACC_BALN, posPixel );
#endif
/* associate a pointer to the actual account with the row */
XbaeMatrixSetRowUserData ( acctrix, currow, (XtPointer *) acc);
/* If the account has sub-accounts, then add an arrow button
* next to the account name. Clicking on the arrow button will
* expand the display to list the sub-accounts. The arrow button
* will be a cell-wdiget, and will be stored with the account
* structure */
if (acc->children) {
/* if the arrow button doesn't exist, add it */
if (NULL == acc->arrowb) {
acc->arrowb = XtVaCreateManagedWidget ("accarrow",
xmArrowButtonWidgetClass, acctrix,
XmNshadowThickness, 0,
XmNarrowDirection, XmARROW_DOWN,
NULL);
}
XbaeMatrixSetCellWidget (acctrix, currow, XACC_MAIN_ACC_ARRW, acc->arrowb);
XtManageChild (acc->arrowb);
XtAddCallback (acc->arrowb, XmNactivateCallback,
expandListCB, (XtPointer *) acc);
#define __XACC_DO_ARROW_CALLBACK
#ifdef __XACC_DO_ARROW_CALLBACK
/* add a button press event handler just in case the
* XmNactivate callback is broken. See notes for the
* ArrowEventCallback for details. -- Linas */
acc->PreviousArrowReason = 0;
XtAddEventHandler(acc->arrowb,
ButtonPressMask | ButtonReleaseMask,
False, (XtEventHandler) ArrowEventCallback,
(XtPointer) acc);
#endif /* __XACC_DO_ARROW_CALLBACK */
/* recursively display children accounts */
if (acc->expand) {
xaccMainWindowAddAcct (acctrix, acc->children, depth+1);
}
} else {
/* if there are no children, make sure that there is no
* arrow too. This situation can occur if a sub-account
* has been deleted.
*/
if (acc->arrowb) {
XbaeMatrixSetCellWidget (acctrix, currow, XACC_MAIN_ACC_ARRW, NULL);
XtUnmanageChild (acc->arrowb);
XtDestroyWidget (acc->arrowb);
acc->arrowb = NULL;
}
}
}
}
/********************************************************************\
* refreshMainWindow *
* *
@@ -79,45 +217,118 @@ Boolean havePixels = False;
void
refreshMainWindow( void )
{
int i,nrows;
char buf[BUFSIZE];
int nrows;
AccountGroup *grp = topgroup; /* hack -- should pass as argument ... */
XtVaGetValues( accountlist, XmNrows, &nrows, NULL );
XbaeMatrixDeleteRows( accountlist, 0, nrows );
/* Add all the accounts to the list */
for( i=0; i<data->numAcc; i++ )
{
String rows[3];
Transaction *trans=NULL;
Account *acc = getAccount( data, i );
double dbalance;
xaccRecomputeBalance (acc);
dbalance = acc->balance;
if( 0.0 > dbalance )
sprintf( buf,"-$%.2f\0", DABS(dbalance) );
else
sprintf( buf,"$%.2f\0", DABS(dbalance) );
rows[0] = acc->accountName;
rows[1] = type[acc->type];
rows[2] = XtNewString(buf);
XtVaGetValues( accountlist, XmNrows, &nrows, NULL );
XbaeMatrixAddRows( accountlist, nrows, rows, NULL, NULL, 1 );
#ifndef USE_NO_COLOR
/* Set the color of the text, depending on whether the
* balance is negative or positive */
if( 0.0 > dbalance )
XbaeMatrixSetCellColor( accountlist, nrows, 2, negPixel );
else
XbaeMatrixSetCellColor( accountlist, nrows, 2, posPixel );
#endif
xaccRecomputeGroupBalance (grp);
xaccMainWindowAddAcct (accountlist, grp, 0);
xaccMainWindowRedisplayBalance ();
}
/********************************************************************\
\********************************************************************/
/* --------------------------------------------------------------------
* This callback is provided in order to have a separate means of detecting
* the arrow button activation. It seems that some (all?) versions of Motif
* have trouble correctly computing the XmCR_ACTIVATE reason for the arrow
* button. In particular, this occurs when the ArrowButton widget has been
* reparented. (XbaeMatrix will reparent a widget so that it will
* be properly clipped, e.g. when it is inside of a scrolling window.
* The clipping is vitally important to get the widget properly drawn).
*
* In a way, one might argue that it is not surpirsing that a reparented
* window (XReparentWindow) will confuse the widget: after all, the widget
* coordinets with respect to the parent widget differ from the window
* coordinates compared to the parent window. However, this argument
* seems flawed: Motif seems to be able to correctly compute and deliver
* the XmCR_ARM reason when a button is pressed. Why can't it get the
* the XmCR_ACTIVATE reason when the very same button is relased?
* Also, the very same versions of Motif have no problem recognizing
* that a button press and release has occured in the window, and have
* no problem calling this callback. So, somehow, the activate computation
* seems broken.
*
* Thus, this callback provides an alternate way of getting the arrow
* button to work properly. -- Linas Vepstas October 1997
*/
static void
ArrowEventCallback(Widget w, XtPointer pClientData,
XEvent *event, Boolean *ContDispatch)
{
Account *acc = (Account *) pClientData;
XButtonEvent *bev = (XButtonEvent *) event;
XmArrowButtonCallbackStruct many;
/* if its not the left mouse button, return */
if (1 != bev->button) return;
/* emulate the arm and activate callbacks */
switch ( event->type ) {
case ButtonPress:
many.reason = XmCR_ARM;
many.event = event;
many.click_count = 1;
expandListCB (w, pClientData, (XtPointer) &many);
break;
case ButtonRelease:
many.reason = XmCR_ACTIVATE;
many.event = event;
many.click_count = 1;
expandListCB (w, pClientData, (XtPointer) &many);
break;
}
} /* ArrowEventCallback */
/********************************************************************\
\********************************************************************/
static void
expandListCB( Widget mw, XtPointer pClientData, XtPointer cb)
{
XmAnyCallbackStruct *info = (XmAnyCallbackStruct *) cb;
Account *acc = (Account *)pClientData;
/* a "fix" to avoid double invocation */
switch ( info->reason ) {
case XmCR_ACTIVATE:
/* avoid double invocation */
if (XmCR_ACTIVATE == acc->PreviousArrowReason) return;
acc -> PreviousArrowReason = XmCR_ACTIVATE;
break;
default:
case XmCR_ARM:
/* avoid double invocation */
if (XmCR_ARM == acc->PreviousArrowReason) return;
acc -> PreviousArrowReason = XmCR_ARM;
return;
}
/* change arrow direction, mark account as needing expansion */
if (acc->expand) {
acc->expand = 0;
XtVaSetValues (mw,
XmNarrowDirection, XmARROW_DOWN,
NULL);
} else {
acc->expand = 1;
XtVaSetValues (mw,
XmNarrowDirection, XmARROW_UP,
NULL);
}
/* finally, redraw the main window */
refreshMainWindow ();
}
/********************************************************************\
* mainWindow -- the main window... (normally) the first window *
* that pops up. Has list of accounts that the user can open. *
@@ -129,10 +340,11 @@ refreshMainWindow( void )
* Global: data - the data from the datafile *
* accountlist - the widget that has the list of accounts *
\********************************************************************/
void
mainWindow( Widget parent )
{
Widget mainwindow,menubar,actionform,controlform,pane,widget;
Widget mainwindow,menubar,actionform,buttonform,pane,button,widget;
int position;
/******************************************************************\
@@ -183,6 +395,8 @@ mainWindow( Widget parent )
helpMenubarCB, (XtPointer)HMB_ABOUT, (MenuItem *)NULL },
{ "Help...", &xmPushButtonWidgetClass, 'H', NULL, NULL,
helpMenubarCB, (XtPointer)HMB_MAIN, (MenuItem *)NULL },
{ "Accounts...", &xmPushButtonWidgetClass, 'H', NULL, NULL,
helpMenubarCB, (XtPointer)HMB_ACC, (MenuItem *)NULL },
{ "", &xmSeparatorWidgetClass, 0, NULL, NULL,
NULL, NULL, (MenuItem *)NULL },
{ "License...", &xmPushButtonWidgetClass, 'L', NULL, NULL,
@@ -193,10 +407,8 @@ mainWindow( Widget parent )
mainwindow = XtVaCreateManagedWidget( "mainwindow",
xmMainWindowWidgetClass, parent,
XmNdeleteResponse, XmDESTROY,
/*linas hack */
XmNwidth, 650,
XmNheight, 300,
XmNwidth, 450,
XmNheight, 240,
NULL );
/* Umm... this doesn't seem to be getting called */
@@ -271,19 +483,22 @@ mainWindow( Widget parent )
* use the matrix instead of a list to get the accounts
* up in columns */
{
String labels[3] = {"Account Name","Type","Balance"};
short colWidths[] = {16,10,8};
unsigned char alignments[3] = {XmALIGNMENT_BEGINNING,
String labels[XACC_MAIN_NUM_COLS] = {"", "Account Name","Type","Balance"};
short colWidths[] = {2,20,10,12};
unsigned char alignments[XACC_MAIN_NUM_COLS] = {
XmALIGNMENT_CENTER,
XmALIGNMENT_BEGINNING,
XmALIGNMENT_CENTER,
XmALIGNMENT_END};
accountlist
= XtVaCreateWidget( "list",
xbaeMatrixWidgetClass, actionform,
XmNvisibleRows, 7,
XmNcolumns, 3,
XmNvisibleRows, 8,
XmNcolumns, XACC_MAIN_NUM_COLS,
XmNcolumnWidths, colWidths,
XmNcolumnAlignments, alignments,
XmNcolumnLabelAlignments, alignments,
XmNcolumnLabels, labels,
XmNtraversalOn, False,
XmNfill, True,
@@ -307,9 +522,6 @@ mainWindow( Widget parent )
accountMenubarCB, (XtPointer)AMB_OPEN );
}
refreshMainWindow();
XtManageChild(accountlist);
/******************************************************************\
* The button area -- has buttons to create a new account, or *
* delete an account, or whatever other button I think up *
@@ -320,22 +532,22 @@ mainWindow( Widget parent )
/* create form that will contain most everything in this window...
* The fractionbase divides the form into segments, so we have
* better control over where to put the buttons */
controlform = XtVaCreateWidget( "form",
buttonform = XtVaCreateWidget( "form",
xmFormWidgetClass, pane,
XmNfractionBase, 5,
XmNfractionBase, 22,
NULL );
position = 0; /* puts the buttons in the right place */
/* The "Open" button */
widget = XtVaCreateManagedWidget( "Open",
xmPushButtonWidgetClass, controlform,
xmPushButtonWidgetClass, buttonform,
XmNtopAttachment, XmATTACH_FORM,
XmNbottomAttachment, XmATTACH_FORM,
XmNleftAttachment, XmATTACH_POSITION,
XmNleftPosition, position,
XmNrightAttachment, XmATTACH_POSITION,
XmNrightPosition, position+1,
XmNrightPosition, position+3,
XmNshowAsDefault, True,
NULL );
@@ -343,15 +555,15 @@ mainWindow( Widget parent )
accountMenubarCB, (XtPointer)AMB_OPEN );
/* The "New" button, to create a new account */
position ++;
position += 3;
widget = XtVaCreateManagedWidget( "New",
xmPushButtonWidgetClass, controlform,
xmPushButtonWidgetClass, buttonform,
XmNtopAttachment, XmATTACH_FORM,
XmNbottomAttachment, XmATTACH_FORM,
XmNleftAttachment, XmATTACH_POSITION,
XmNleftPosition, position,
XmNrightAttachment, XmATTACH_POSITION,
XmNrightPosition, position+1,
XmNrightPosition, position+3,
XmNshowAsDefault, True,
NULL );
@@ -359,15 +571,15 @@ mainWindow( Widget parent )
accountMenubarCB, (XtPointer)AMB_NEW );
/* The "Edit" button */
position ++;
position += 3;
widget = XtVaCreateManagedWidget( "Edit",
xmPushButtonWidgetClass, controlform,
xmPushButtonWidgetClass, buttonform,
XmNtopAttachment, XmATTACH_FORM,
XmNbottomAttachment, XmATTACH_FORM,
XmNleftAttachment, XmATTACH_POSITION,
XmNleftPosition, position,
XmNrightAttachment, XmATTACH_POSITION,
XmNrightPosition, position+1,
XmNrightPosition, position+3,
XmNshowAsDefault, True,
NULL );
@@ -375,42 +587,81 @@ mainWindow( Widget parent )
accountMenubarCB, (XtPointer)AMB_EDIT );
/* The "Delete" button */
position ++;
position += 3;
widget = XtVaCreateManagedWidget( "Delete",
xmPushButtonWidgetClass, controlform,
xmPushButtonWidgetClass, buttonform,
XmNtopAttachment, XmATTACH_FORM,
XmNbottomAttachment, XmATTACH_FORM,
XmNleftAttachment, XmATTACH_POSITION,
XmNleftPosition, position,
XmNrightAttachment, XmATTACH_POSITION,
XmNrightPosition, position+1,
XmNrightPosition, position+3,
XmNshowAsDefault, True,
NULL );
XtAddCallback( widget, XmNactivateCallback,
accountMenubarCB, (XtPointer)AMB_DEL );
button = widget;
/* ---------------------------------------------------------------- */
/* The Asset and Profit field labels: */
position +=5;
widget = XtVaCreateManagedWidget( "Assets:",
xmLabelGadgetClass, buttonform,
XmNtopAttachment, XmATTACH_FORM,
XmNleftAttachment, XmATTACH_POSITION,
XmNleftPosition, position,
XmNrightAttachment, XmATTACH_POSITION,
XmNrightPosition, position+3,
NULL );
widget = XtVaCreateManagedWidget( "Profits:",
xmLabelGadgetClass, buttonform,
XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget, widget,
XmNbottomAttachment, XmATTACH_FORM,
XmNleftAttachment, XmATTACH_POSITION,
XmNleftPosition, position,
XmNrightAttachment, XmATTACH_POSITION,
XmNrightPosition, position+3,
NULL );
/* and the balance fields: */
position += 3;
widget = XtVaCreateManagedWidget( "text",
xmTextWidgetClass, buttonform,
XmNeditable, False,
XmNeditMode, XmMULTI_LINE_EDIT,
XmNcursorPositionVisible, False,
XmNmarginHeight, 0,
XmNmarginWidth, 1,
XmNtopAttachment, XmATTACH_FORM,
XmNbottomAttachment, XmATTACH_FORM,
XmNleftAttachment, XmATTACH_POSITION,
XmNleftPosition, position,
XmNrightAttachment, XmATTACH_POSITION,
XmNrightPosition, position+5,
NULL );
baln_widget = widget;
/* ---------------------------------------------------------------- */
refreshMainWindow();
XtManageChild(accountlist);
/* Fix button area of the pane to its current size, and not let
* it resize. */
XtManageChild( controlform );
XtManageChild( buttonform );
{
Dimension h;
XtVaGetValues( widget, XmNheight, &h, NULL );
XtVaSetValues( controlform, XmNpaneMaximum, h, XmNpaneMinimum, h, NULL );
XtVaGetValues( button, XmNheight, &h, NULL );
XtVaSetValues( buttonform, XmNpaneMaximum, h, XmNpaneMinimum, h, NULL );
}
/* Fix action area of the pane to its current size, and not let
* it resize. */
XtManageChild( actionform );
{
Dimension h;
XtVaGetValues( accountlist, XmNheight, &h, NULL );
XtVaSetValues( actionform, XmNpaneMaximum, h, XmNpaneMinimum, h, NULL );
}
/******************************************************************/
XtManageChild(pane);
XtManageChild( pane );
}
/********************************************************************\
@@ -427,11 +678,67 @@ void
closeMainWindow( Widget mw, XtPointer cd, XtPointer cb )
{
#ifdef __XACC_DO_ARROW_CALLBACK
/* this remove core-dumps motif, Don't know why --linas */
/* XtRemoveEventHandler(mw->arrowb,
* ButtonPressMask | ButtonReleaseMask,
* True, (XtEventHandler) ArrowEventCallback,
* (XtPointer) mw);
*/
#endif /* __XACC_DO_ARROW_CALLBACK */
DEBUG("closed MainWindow");
DEBUGCMD(printf(" coresize = %d\n",_coresize()));
exit(0);
}
/********************************************************************\
* compute profits and asssets
\********************************************************************/
static void
xaccMainWindowRedisplayBalance (void)
{
int i;
double assets = 0.0;
double profits = 0.0;
char buf[BUFSIZE];
AccountGroup *grp = topgroup;
Account *acc;
for (i=0; i<grp->numAcc; i++) {
acc = grp->account[i];
switch (acc->type) {
case BANK:
case CASH:
case ASSET:
case PORTFOLIO:
case MUTUAL:
case CREDIT:
case LIABILITY:
assets += acc->balance;
if (acc->children) {
assets += acc->children->balance;
}
break;
case INCOME:
case EXPENSE:
profits -= acc->balance; /* flip the sign !! */
if (acc->children) {
profits -= acc->children->balance; /* flip the sign !! */
}
break;
case EQUITY:
default:
break;
}
}
sprintf( buf, "$ %.2f\n$ %.2f", assets, profits);
XmTextSetString( baln_widget, buf );
}
/********************************************************************\
* listCB -- makes the matrix widget behave like a list widget *
* *
@@ -441,7 +748,7 @@ closeMainWindow( Widget mw, XtPointer cd, XtPointer cb )
* Return: none *
* Global: accountlist - the widget that has the list of accounts *
\********************************************************************/
void
static void
listCB( Widget mw, XtPointer cd, XtPointer cb )
{
XbaeMatrixEnterCellCallbackStruct *cbs =
@@ -451,9 +758,10 @@ listCB( Widget mw, XtPointer cd, XtPointer cb )
cbs->doit = False;
cbs->map = False;
row = cbs->row;
selected_acc = (Account *) XbaeMatrixGetRowUserData (accountlist, cbs->row);
XbaeMatrixDeselectAll(accountlist);
XbaeMatrixSelectRow( accountlist, row );
XbaeMatrixSelectRow( accountlist, cbs->row );
}
@@ -471,6 +779,7 @@ listCB( Widget mw, XtPointer cd, XtPointer cb )
void
fileMenubarCB( Widget mw, XtPointer cd, XtPointer cb )
{
AccountGroup *grp = topgroup;
int button = (int)cd;
/*
@@ -485,54 +794,59 @@ fileMenubarCB( Widget mw, XtPointer cd, XtPointer cb )
switch( button )
{
case FMB_NEW:
DEBUG("FMB_NEW");
if( (!(data->saved)) && (datafile != NULL) )
DEBUG("FMB_NEW\n");
if( xaccAccountGroupNotSaved (grp) )
{
char *msg = SAVE_MSG;
if( verifyBox(toplevel,msg) )
if( verifyBox (toplevel, FMB_SAVE_MSG) )
fileMenubarCB( mw, (XtPointer)FMB_SAVE, cb );
}
datafile = NULL;
freeData(data);
data = mallocData();
data->new = True; /* so we have to do a "SaveAs" when
freeAccountGroup (grp);
grp = mallocAccountGroup();
grp->new = True; /* so we have to do a "SaveAs" when
* the file is first saved */
topgroup = grp;
break;
case FMB_OPEN: {
char * newfile;
DEBUG("FMB_OPEN");
if( (!(data->saved)) && (datafile != NULL) )
{
char *msg = SAVE_MSG;
if( verifyBox(toplevel,msg) )
DEBUG("FMB_OPEN\n");
if( xaccAccountGroupNotSaved (grp) ) {
if( verifyBox(toplevel, FMB_SAVE_MSG) ) {
fileMenubarCB( mw, (XtPointer)FMB_SAVE, cb );
}
}
newfile = fileBox(toplevel,OPEN);
if (newfile) {
datafile = newfile;
freeData(data);
freeAccountGroup (grp);
/* load the accounts from the users datafile */
data = readData(datafile);
grp = readData (datafile);
if( data == NULL ) {
if( NULL == grp ) {
/* the file could not be found */
data = mallocData();
grp = mallocAccountGroup();
}
topgroup = grp;
}
break;
}
case FMB_SAVE:
DEBUG("FMB_SAVE");
/* ??? Somehow make sure all in-progress edits get committed! */
writeData( datafile, data );
data->saved = True;
DEBUG("FMB_SAVE\n");
/* hack alert -- Somehow make sure all in-progress edits get committed! */
if (NULL == datafile) {
fileMenubarCB( mw, (XtPointer)FMB_SAVEAS, cb );
break;
}
writeData( datafile, grp );
xaccAccountGroupMarkSaved (grp);
break;
case FMB_SAVEAS: {
char * newfile;
DEBUG("FMB_SAVEAS");
DEBUG("FMB_SAVEAS\n");
newfile = fileBox(toplevel,OPEN);
if ( newfile ) {
@@ -542,39 +856,39 @@ fileMenubarCB( Widget mw, XtPointer cd, XtPointer cb )
break;
}
case FMB_QUIT:
DEBUG("FMB_QUIT");
DEBUG("FMB_QUIT\n");
{
Account *acc;
int i=0;
while( (acc=getAccount(data,i++)) != NULL )
while( (acc=getAccount (grp,i++)) != NULL )
{
if( acc->regData != NULL )
{
/* ??? */
/* ??? -- hack alert -- should free */
acc->regData = NULL;
}
if( acc->recnData != NULL )
{
/* ??? */
/* ??? -- hack alert -- should free */
acc->recnData = NULL;
}
}
if( (!(data->saved)) && (datafile != NULL) )
if( !(grp->saved) )
{
char *msg = SAVE_MSG;
if( verifyBox(toplevel,msg) )
if( verifyBox(toplevel, FMB_SAVE_MSG) )
fileMenubarCB( mw, (XtPointer)FMB_SAVE, cb );
}
freeData(data);
freeAccountGroup (grp);
topgroup = NULL;
XtUnmapWidget(toplevel); /* make it disappear quickly */
XtDestroyWidget(toplevel);
return; /* to avoid the refreshMainWindow */
}
break;
default:
DEBUG("We shouldn't be here!");
PERR("fileMenubarCB(): We shouldn't be here!");
}
refreshMainWindow();
}
@@ -586,9 +900,9 @@ fileMenubarCB( Widget mw, XtPointer cd, XtPointer cb )
* cd - const that lets us know which choice was selected *
* cb - *
* Return: none *
* Global: data - the data from the datafile *
* row - the selected row number *
* toplevel - the toplevel widget *
* Global: data - the data from the datafile *
* selected_acc - the selected account *
* toplevel - the toplevel widget *
\********************************************************************/
void
accountMenubarCB( Widget mw, XtPointer cd, XtPointer cb )
@@ -596,6 +910,7 @@ accountMenubarCB( Widget mw, XtPointer cd, XtPointer cb )
int button = (int)cd;
int *posList;
int numPos;
AccountGroup *grp = topgroup;
/*
* which of the file menubar options was chosen
@@ -609,18 +924,15 @@ accountMenubarCB( Widget mw, XtPointer cd, XtPointer cb )
switch( button )
{
case AMB_NEW:
DEBUG("AMB_NEW");
DEBUG("AMB_NEW\n");
accWindow(toplevel);
break;
case AMB_OPEN:
DEBUG("AMB_OPEN");
DEBUG("AMB_OPEN\n");
{
Account *acc = getAccount(data,row);
Account *acc = selected_acc;
if( NULL == acc ) {
int make_new = verifyBox (toplevel,
"Do you want to create a new account?\n\
If not, then please select an account\n\
account to open in the main window.\n");
int make_new = verifyBox (toplevel, ACC_NEW_MSG);
if (make_new) {
accWindow(toplevel);
}
@@ -633,48 +945,49 @@ account to open in the main window.\n");
}
break;
case AMB_EDIT:
DEBUG("AMB_EDIT");
DEBUG("AMB_EDIT\n");
{
Account *acc = getAccount(data,row);
Account *acc = selected_acc;
if( NULL == acc ) {
errorBox (toplevel,
"To edit an account, you must first \n\
choose an account to delete.\n");
errorBox (toplevel, ACC_EDIT_MSG);
} else {
editAccWindow( toplevel, getAccount(data,row) );
editAccWindow( toplevel, acc );
}
}
break;
case AMB_DEL:
DEBUG("AMB_DEL");
DEBUG("AMB_DEL\n");
{
Account *acc = getAccount(data,row);
Account *acc = selected_acc;
if( NULL == acc ) {
errorBox (toplevel,
"To delete an account, you must first \n\
choose an account to delete.\n");
errorBox (toplevel, ACC_DEL_MSG);
} else {
char *msg = "Are you sure you want to delete this account?";
char msg[1000];
sprintf (msg,
"Are you sure you want to delete the %s account?",
acc->accountName);
if( verifyBox(toplevel,msg) ) {
freeAccount( removeAccount(data,row) );
xaccRemoveAccount (selected_acc);
freeAccount (selected_acc);
selected_acc = NULL;
refreshMainWindow();
}
}
}
break;
case AMB_TRNS:
DEBUG("AMB_TRNS");
DEBUG("AMB_TRNS\n");
xferWindow(toplevel);
break;
case AMB_RPRT:
DEBUG("AMB_RPRT");
DEBUG("AMB_RPRT\n");
simpleReportWindow(toplevel);
break;
case AMB_CAT:
DEBUG("AMB_CAT");
DEBUG("AMB_CAT\n");
break;
default:
DEBUG("We shouldn't be here!");
PERR ("AccountMenuBarCB(): We shouldn't be here!\n");
}
}
@@ -709,6 +1022,10 @@ helpMenubarCB( Widget mw, XtPointer cd, XtPointer cb )
DEBUG("HMB_ABOUT");
helpWindow( toplevel, "About", HH_ABOUT );
break;
case HMB_ACC:
DEBUG("HMB_ACC");
helpWindow( toplevel, "Help", HH_ACC );
break;
case HMB_REGWIN:
/* When the user selects "Help" in the RegWindow */
DEBUG("HMB_REGWIN");
@@ -738,3 +1055,5 @@ helpMenubarCB( Widget mw, XtPointer cd, XtPointer cb )
DEBUG("We shouldn't be here!");
}
}
/********************* END OF FILE **********************************/

View File

@@ -26,7 +26,8 @@
######################################################################
# DO NOT EDIT THE STUFF BELOW THIS LINE! #
OBJS = Account.o AccWindow.o Action.o AdjBWindow.o BuildMenu.o Data.o date.o \
OBJS = Account.o AccountMenu.o AccWindow.o Action.o AdjBWindow.o \
BuildMenu.o Data.o date.o \
FileBox.o FileIO.o HelpWindow.o main.o MainWindow.o PopBox.o \
QIFIO.o QuickFill.o RecnWindow.o RegWindow.o Reports.o \
Transaction.o util.o XferBox.o XferWindow.o
@@ -56,3 +57,774 @@ really_clean:
makedepend -- --
# DO NOT DELETE THIS LINE -- make depend depends on it.
Account.o: ../include/Account.h ../include/QuickFill.h
Account.o: ../include/Transaction.h /usr/include/Xm/Xm.h
Account.o: /usr/include/X11/Intrinsic.h /usr/include/X11/X11/Xlib.h
Account.o: /usr/include/sys/types.h /usr/include/linux/types.h
Account.o: /usr/include/linux/posix_types.h /usr/include/asm/posix_types.h
Account.o: /usr/include/asm/types.h /usr/include/sys/bitypes.h
Account.o: /usr/include/X11/X11/X11/X.h /usr/include/X11/X11/X11/Xfuncproto.h
Account.o: /usr/include/X11/X11/X11/Xosdefs.h
Account.o: /usr/lib/gcc-lib/i486-linux/2.7.2/include/stddef.h
Account.o: /usr/include/X11/X11/Xutil.h /usr/include/X11/X11/Xresource.h
Account.o: /usr/include/string.h /usr/include/features.h
Account.o: /usr/include/sys/cdefs.h /usr/include/X11/X11/Core.h
Account.o: /usr/include/X11/X11/Composite.h /usr/include/X11/X11/Constraint.h
Account.o: /usr/include/X11/X11/Object.h /usr/include/X11/X11/RectObj.h
Account.o: /usr/include/X11/Shell.h /usr/include/X11/X11/SM/SMlib.h
Account.o: /usr/include/X11/SM/SM.h /usr/include/X11/ICE/ICElib.h
Account.o: /usr/include/X11/ICE/ICE.h /usr/include/X11/Xatom.h
Account.o: /usr/include/Xm/XmStrDefs.h /usr/include/X11/StringDefs.h
Account.o: /usr/include/Xm/VirtKeys.h /usr/include/Xm/Transfer.h
Account.o: /usr/include/Xm/DragDrop.h /usr/include/Xm/DragC.h
Account.o: /usr/include/Xm/Display.h /usr/include/Xm/DropSMgr.h
Account.o: /usr/include/Xm/DragIcon.h /usr/include/Xm/DropTrans.h
Account.o: /usr/include/Xm/DragOverS.h /usr/include/Xm/Primitive.h
Account.o: /usr/include/Xm/Manager.h /usr/include/Xm/Gadget.h
Account.o: /usr/include/Xm/TxtPropCv.h /usr/include/Xm/VendorS.h
Account.o: /usr/include/Xm/XmIm.h ../include/date.h ../include/Data.h
Account.o: ../include/main.h ../include/util.h /usr/include/stdio.h
Account.o: /usr/include/libio.h /usr/include/_G_config.h /usr/include/errno.h
Account.o: /usr/include/linux/errno.h /usr/include/asm/errno.h
AccWindow.o: /usr/include/Xm/Xm.h /usr/include/X11/Intrinsic.h
AccWindow.o: /usr/include/X11/X11/Xlib.h /usr/include/sys/types.h
AccWindow.o: /usr/include/linux/types.h /usr/include/linux/posix_types.h
AccWindow.o: /usr/include/asm/posix_types.h /usr/include/asm/types.h
AccWindow.o: /usr/include/sys/bitypes.h /usr/include/X11/X11/X11/X.h
AccWindow.o: /usr/include/X11/X11/X11/Xfuncproto.h
AccWindow.o: /usr/include/X11/X11/X11/Xosdefs.h
AccWindow.o: /usr/lib/gcc-lib/i486-linux/2.7.2/include/stddef.h
AccWindow.o: /usr/include/X11/X11/Xutil.h /usr/include/X11/X11/Xresource.h
AccWindow.o: /usr/include/string.h /usr/include/features.h
AccWindow.o: /usr/include/sys/cdefs.h /usr/include/X11/X11/Core.h
AccWindow.o: /usr/include/X11/X11/Composite.h
AccWindow.o: /usr/include/X11/X11/Constraint.h /usr/include/X11/X11/Object.h
AccWindow.o: /usr/include/X11/X11/RectObj.h /usr/include/X11/Shell.h
AccWindow.o: /usr/include/X11/X11/SM/SMlib.h /usr/include/X11/SM/SM.h
AccWindow.o: /usr/include/X11/ICE/ICElib.h /usr/include/X11/ICE/ICE.h
AccWindow.o: /usr/include/X11/Xatom.h /usr/include/Xm/XmStrDefs.h
AccWindow.o: /usr/include/X11/StringDefs.h /usr/include/Xm/VirtKeys.h
AccWindow.o: /usr/include/Xm/Transfer.h /usr/include/Xm/DragDrop.h
AccWindow.o: /usr/include/Xm/DragC.h /usr/include/Xm/Display.h
AccWindow.o: /usr/include/Xm/DropSMgr.h /usr/include/Xm/DragIcon.h
AccWindow.o: /usr/include/Xm/DropTrans.h /usr/include/Xm/DragOverS.h
AccWindow.o: /usr/include/Xm/Primitive.h /usr/include/Xm/Manager.h
AccWindow.o: /usr/include/Xm/Gadget.h /usr/include/Xm/TxtPropCv.h
AccWindow.o: /usr/include/Xm/VendorS.h /usr/include/Xm/XmIm.h
AccWindow.o: /usr/include/Xm/DialogS.h /usr/include/Xm/Form.h
AccWindow.o: /usr/include/Xm/BulletinB.h /usr/include/Xm/Frame.h
AccWindow.o: /usr/include/Xm/RowColumn.h /usr/include/Xm/LabelGP.h
AccWindow.o: /usr/include/Xm/LabelG.h /usr/include/Xm/GadgetP.h
AccWindow.o: /usr/include/Xm/XmP.h /usr/include/X11/IntrinsicP.h
AccWindow.o: /usr/include/X11/X11/CoreP.h /usr/include/X11/X11/CompositeP.h
AccWindow.o: /usr/include/X11/X11/ConstrainP.h /usr/include/X11/X11/ObjectP.h
AccWindow.o: /usr/include/X11/X11/RectObjP.h /usr/include/Xm/ColorP.h
AccWindow.o: /usr/include/Xm/AccColorT.h /usr/include/Xm/BaseClassP.h
AccWindow.o: /usr/include/Xm/ExtObjectP.h /usr/include/Xm/ToggleB.h
AccWindow.o: /usr/include/Xm/PushB.h /usr/include/Xm/Text.h
AccWindow.o: /usr/include/stdio.h /usr/include/libio.h
AccWindow.o: /usr/include/_G_config.h ../include/Account.h
AccWindow.o: ../include/QuickFill.h ../include/Transaction.h
AccWindow.o: ../include/date.h ../include/Data.h ../include/main.h
AccWindow.o: ../include/util.h /usr/include/errno.h
AccWindow.o: /usr/include/linux/errno.h /usr/include/asm/errno.h
Action.o: /usr/include/Xm/Xm.h /usr/include/X11/Intrinsic.h
Action.o: /usr/include/X11/X11/Xlib.h /usr/include/sys/types.h
Action.o: /usr/include/linux/types.h /usr/include/linux/posix_types.h
Action.o: /usr/include/asm/posix_types.h /usr/include/asm/types.h
Action.o: /usr/include/sys/bitypes.h /usr/include/X11/X11/X11/X.h
Action.o: /usr/include/X11/X11/X11/Xfuncproto.h
Action.o: /usr/include/X11/X11/X11/Xosdefs.h
Action.o: /usr/lib/gcc-lib/i486-linux/2.7.2/include/stddef.h
Action.o: /usr/include/X11/X11/Xutil.h /usr/include/X11/X11/Xresource.h
Action.o: /usr/include/string.h /usr/include/features.h
Action.o: /usr/include/sys/cdefs.h /usr/include/X11/X11/Core.h
Action.o: /usr/include/X11/X11/Composite.h /usr/include/X11/X11/Constraint.h
Action.o: /usr/include/X11/X11/Object.h /usr/include/X11/X11/RectObj.h
Action.o: /usr/include/X11/Shell.h /usr/include/X11/X11/SM/SMlib.h
Action.o: /usr/include/X11/SM/SM.h /usr/include/X11/ICE/ICElib.h
Action.o: /usr/include/X11/ICE/ICE.h /usr/include/X11/Xatom.h
Action.o: /usr/include/Xm/XmStrDefs.h /usr/include/X11/StringDefs.h
Action.o: /usr/include/Xm/VirtKeys.h /usr/include/Xm/Transfer.h
Action.o: /usr/include/Xm/DragDrop.h /usr/include/Xm/DragC.h
Action.o: /usr/include/Xm/Display.h /usr/include/Xm/DropSMgr.h
Action.o: /usr/include/Xm/DragIcon.h /usr/include/Xm/DropTrans.h
Action.o: /usr/include/Xm/DragOverS.h /usr/include/Xm/Primitive.h
Action.o: /usr/include/Xm/Manager.h /usr/include/Xm/Gadget.h
Action.o: /usr/include/Xm/TxtPropCv.h /usr/include/Xm/VendorS.h
Action.o: /usr/include/Xm/XmIm.h ../include/Action.h ../include/PopBox.h
Action.o: ../include/Data.h ../include/Account.h ../include/QuickFill.h
Action.o: ../include/Transaction.h ../include/date.h ../include/util.h
Action.o: /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h
Action.o: /usr/include/errno.h /usr/include/linux/errno.h
Action.o: /usr/include/asm/errno.h
AdjBWindow.o: /usr/include/Xm/Xm.h /usr/include/X11/Intrinsic.h
AdjBWindow.o: /usr/include/X11/X11/Xlib.h /usr/include/sys/types.h
AdjBWindow.o: /usr/include/linux/types.h /usr/include/linux/posix_types.h
AdjBWindow.o: /usr/include/asm/posix_types.h /usr/include/asm/types.h
AdjBWindow.o: /usr/include/sys/bitypes.h /usr/include/X11/X11/X11/X.h
AdjBWindow.o: /usr/include/X11/X11/X11/Xfuncproto.h
AdjBWindow.o: /usr/include/X11/X11/X11/Xosdefs.h
AdjBWindow.o: /usr/lib/gcc-lib/i486-linux/2.7.2/include/stddef.h
AdjBWindow.o: /usr/include/X11/X11/Xutil.h /usr/include/X11/X11/Xresource.h
AdjBWindow.o: /usr/include/string.h /usr/include/features.h
AdjBWindow.o: /usr/include/sys/cdefs.h /usr/include/X11/X11/Core.h
AdjBWindow.o: /usr/include/X11/X11/Composite.h
AdjBWindow.o: /usr/include/X11/X11/Constraint.h /usr/include/X11/X11/Object.h
AdjBWindow.o: /usr/include/X11/X11/RectObj.h /usr/include/X11/Shell.h
AdjBWindow.o: /usr/include/X11/X11/SM/SMlib.h /usr/include/X11/SM/SM.h
AdjBWindow.o: /usr/include/X11/ICE/ICElib.h /usr/include/X11/ICE/ICE.h
AdjBWindow.o: /usr/include/X11/Xatom.h /usr/include/Xm/XmStrDefs.h
AdjBWindow.o: /usr/include/X11/StringDefs.h /usr/include/Xm/VirtKeys.h
AdjBWindow.o: /usr/include/Xm/Transfer.h /usr/include/Xm/DragDrop.h
AdjBWindow.o: /usr/include/Xm/DragC.h /usr/include/Xm/Display.h
AdjBWindow.o: /usr/include/Xm/DropSMgr.h /usr/include/Xm/DragIcon.h
AdjBWindow.o: /usr/include/Xm/DropTrans.h /usr/include/Xm/DragOverS.h
AdjBWindow.o: /usr/include/Xm/Primitive.h /usr/include/Xm/Manager.h
AdjBWindow.o: /usr/include/Xm/Gadget.h /usr/include/Xm/TxtPropCv.h
AdjBWindow.o: /usr/include/Xm/VendorS.h /usr/include/Xm/XmIm.h
AdjBWindow.o: /usr/include/Xm/Form.h /usr/include/Xm/BulletinB.h
AdjBWindow.o: /usr/include/Xm/Text.h /usr/include/stdio.h
AdjBWindow.o: /usr/include/libio.h /usr/include/_G_config.h
AdjBWindow.o: /usr/include/Xm/DialogS.h /usr/include/Xm/PanedW.h
AdjBWindow.o: /usr/include/Xm/PushB.h /usr/include/Xm/LabelGP.h
AdjBWindow.o: /usr/include/Xm/LabelG.h /usr/include/Xm/GadgetP.h
AdjBWindow.o: /usr/include/Xm/XmP.h /usr/include/X11/IntrinsicP.h
AdjBWindow.o: /usr/include/X11/X11/CoreP.h /usr/include/X11/X11/CompositeP.h
AdjBWindow.o: /usr/include/X11/X11/ConstrainP.h
AdjBWindow.o: /usr/include/X11/X11/ObjectP.h /usr/include/X11/X11/RectObjP.h
AdjBWindow.o: /usr/include/Xm/ColorP.h /usr/include/Xm/AccColorT.h
AdjBWindow.o: /usr/include/Xm/BaseClassP.h /usr/include/Xm/ExtObjectP.h
AdjBWindow.o: ../include/main.h ../include/date.h ../include/Transaction.h
AdjBWindow.o: ../include/util.h /usr/include/errno.h
AdjBWindow.o: /usr/include/linux/errno.h /usr/include/asm/errno.h
AdjBWindow.o: ../include/Data.h ../include/Account.h ../include/QuickFill.h
AdjBWindow.o: ../include/MainWindow.h
BuildMenu.o: /usr/include/Xm/Xm.h /usr/include/X11/Intrinsic.h
BuildMenu.o: /usr/include/X11/X11/Xlib.h /usr/include/sys/types.h
BuildMenu.o: /usr/include/linux/types.h /usr/include/linux/posix_types.h
BuildMenu.o: /usr/include/asm/posix_types.h /usr/include/asm/types.h
BuildMenu.o: /usr/include/sys/bitypes.h /usr/include/X11/X11/X11/X.h
BuildMenu.o: /usr/include/X11/X11/X11/Xfuncproto.h
BuildMenu.o: /usr/include/X11/X11/X11/Xosdefs.h
BuildMenu.o: /usr/lib/gcc-lib/i486-linux/2.7.2/include/stddef.h
BuildMenu.o: /usr/include/X11/X11/Xutil.h /usr/include/X11/X11/Xresource.h
BuildMenu.o: /usr/include/string.h /usr/include/features.h
BuildMenu.o: /usr/include/sys/cdefs.h /usr/include/X11/X11/Core.h
BuildMenu.o: /usr/include/X11/X11/Composite.h
BuildMenu.o: /usr/include/X11/X11/Constraint.h /usr/include/X11/X11/Object.h
BuildMenu.o: /usr/include/X11/X11/RectObj.h /usr/include/X11/Shell.h
BuildMenu.o: /usr/include/X11/X11/SM/SMlib.h /usr/include/X11/SM/SM.h
BuildMenu.o: /usr/include/X11/ICE/ICElib.h /usr/include/X11/ICE/ICE.h
BuildMenu.o: /usr/include/X11/Xatom.h /usr/include/Xm/XmStrDefs.h
BuildMenu.o: /usr/include/X11/StringDefs.h /usr/include/Xm/VirtKeys.h
BuildMenu.o: /usr/include/Xm/Transfer.h /usr/include/Xm/DragDrop.h
BuildMenu.o: /usr/include/Xm/DragC.h /usr/include/Xm/Display.h
BuildMenu.o: /usr/include/Xm/DropSMgr.h /usr/include/Xm/DragIcon.h
BuildMenu.o: /usr/include/Xm/DropTrans.h /usr/include/Xm/DragOverS.h
BuildMenu.o: /usr/include/Xm/Primitive.h /usr/include/Xm/Manager.h
BuildMenu.o: /usr/include/Xm/Gadget.h /usr/include/Xm/TxtPropCv.h
BuildMenu.o: /usr/include/Xm/VendorS.h /usr/include/Xm/XmIm.h
BuildMenu.o: /usr/include/X11/cursorfont.h /usr/include/Xm/DrawingA.h
BuildMenu.o: /usr/include/Xm/Form.h /usr/include/Xm/BulletinB.h
BuildMenu.o: /usr/include/Xm/RowColumn.h /usr/include/Xm/MainW.h
BuildMenu.o: /usr/include/Xm/FileSB.h /usr/include/Xm/MessageB.h
BuildMenu.o: /usr/include/Xm/DialogS.h /usr/include/Xm/PanedW.h
BuildMenu.o: /usr/include/Xm/ScrolledW.h /usr/include/Xm/DrawnB.h
BuildMenu.o: /usr/include/Xm/ToggleB.h /usr/include/Xm/ToggleBG.h
BuildMenu.o: /usr/include/Xm/PushB.h /usr/include/Xm/PushBG.h
BuildMenu.o: /usr/include/Xm/CascadeBG.h /usr/include/Xm/Label.h
BuildMenu.o: /usr/include/Xm/LabelG.h /usr/include/Xm/Scale.h
BuildMenu.o: /usr/include/Xm/Text.h /usr/include/stdio.h /usr/include/libio.h
BuildMenu.o: /usr/include/_G_config.h /usr/include/Xm/TextF.h
BuildMenu.o: /usr/include/Xm/SeparatoG.h ../include/BuildMenu.h
BuildMenu.o: /usr/include/Xm/Separator.h
Data.o: ../include/Account.h ../include/QuickFill.h ../include/Transaction.h
Data.o: /usr/include/Xm/Xm.h /usr/include/X11/Intrinsic.h
Data.o: /usr/include/X11/X11/Xlib.h /usr/include/sys/types.h
Data.o: /usr/include/linux/types.h /usr/include/linux/posix_types.h
Data.o: /usr/include/asm/posix_types.h /usr/include/asm/types.h
Data.o: /usr/include/sys/bitypes.h /usr/include/X11/X11/X11/X.h
Data.o: /usr/include/X11/X11/X11/Xfuncproto.h
Data.o: /usr/include/X11/X11/X11/Xosdefs.h
Data.o: /usr/lib/gcc-lib/i486-linux/2.7.2/include/stddef.h
Data.o: /usr/include/X11/X11/Xutil.h /usr/include/X11/X11/Xresource.h
Data.o: /usr/include/string.h /usr/include/features.h
Data.o: /usr/include/sys/cdefs.h /usr/include/X11/X11/Core.h
Data.o: /usr/include/X11/X11/Composite.h /usr/include/X11/X11/Constraint.h
Data.o: /usr/include/X11/X11/Object.h /usr/include/X11/X11/RectObj.h
Data.o: /usr/include/X11/Shell.h /usr/include/X11/X11/SM/SMlib.h
Data.o: /usr/include/X11/SM/SM.h /usr/include/X11/ICE/ICElib.h
Data.o: /usr/include/X11/ICE/ICE.h /usr/include/X11/Xatom.h
Data.o: /usr/include/Xm/XmStrDefs.h /usr/include/X11/StringDefs.h
Data.o: /usr/include/Xm/VirtKeys.h /usr/include/Xm/Transfer.h
Data.o: /usr/include/Xm/DragDrop.h /usr/include/Xm/DragC.h
Data.o: /usr/include/Xm/Display.h /usr/include/Xm/DropSMgr.h
Data.o: /usr/include/Xm/DragIcon.h /usr/include/Xm/DropTrans.h
Data.o: /usr/include/Xm/DragOverS.h /usr/include/Xm/Primitive.h
Data.o: /usr/include/Xm/Manager.h /usr/include/Xm/Gadget.h
Data.o: /usr/include/Xm/TxtPropCv.h /usr/include/Xm/VendorS.h
Data.o: /usr/include/Xm/XmIm.h ../include/date.h ../include/Data.h
Data.o: ../include/util.h /usr/include/stdio.h /usr/include/libio.h
Data.o: /usr/include/_G_config.h /usr/include/errno.h
Data.o: /usr/include/linux/errno.h /usr/include/asm/errno.h
date.o: /usr/include/time.h /usr/include/features.h /usr/include/sys/cdefs.h
date.o: /usr/include/sys/time.h /usr/include/linux/types.h
date.o: /usr/include/linux/posix_types.h /usr/include/asm/posix_types.h
date.o: /usr/include/asm/types.h /usr/include/linux/time.h
date.o: /usr/include/sys/types.h /usr/include/sys/bitypes.h ../include/date.h
date.o: ../include/util.h /usr/include/Xm/Xm.h /usr/include/X11/Intrinsic.h
date.o: /usr/include/X11/X11/Xlib.h /usr/include/X11/X11/X11/X.h
date.o: /usr/include/X11/X11/X11/Xfuncproto.h
date.o: /usr/include/X11/X11/X11/Xosdefs.h
date.o: /usr/lib/gcc-lib/i486-linux/2.7.2/include/stddef.h
date.o: /usr/include/X11/X11/Xutil.h /usr/include/X11/X11/Xresource.h
date.o: /usr/include/string.h /usr/include/X11/X11/Core.h
date.o: /usr/include/X11/X11/Composite.h /usr/include/X11/X11/Constraint.h
date.o: /usr/include/X11/X11/Object.h /usr/include/X11/X11/RectObj.h
date.o: /usr/include/X11/Shell.h /usr/include/X11/X11/SM/SMlib.h
date.o: /usr/include/X11/SM/SM.h /usr/include/X11/ICE/ICElib.h
date.o: /usr/include/X11/ICE/ICE.h /usr/include/X11/Xatom.h
date.o: /usr/include/Xm/XmStrDefs.h /usr/include/X11/StringDefs.h
date.o: /usr/include/Xm/VirtKeys.h /usr/include/Xm/Transfer.h
date.o: /usr/include/Xm/DragDrop.h /usr/include/Xm/DragC.h
date.o: /usr/include/Xm/Display.h /usr/include/Xm/DropSMgr.h
date.o: /usr/include/Xm/DragIcon.h /usr/include/Xm/DropTrans.h
date.o: /usr/include/Xm/DragOverS.h /usr/include/Xm/Primitive.h
date.o: /usr/include/Xm/Manager.h /usr/include/Xm/Gadget.h
date.o: /usr/include/Xm/TxtPropCv.h /usr/include/Xm/VendorS.h
date.o: /usr/include/Xm/XmIm.h /usr/include/stdio.h /usr/include/libio.h
date.o: /usr/include/_G_config.h /usr/include/errno.h
date.o: /usr/include/linux/errno.h /usr/include/asm/errno.h
FileBox.o: /usr/include/Xm/Xm.h /usr/include/X11/Intrinsic.h
FileBox.o: /usr/include/X11/X11/Xlib.h /usr/include/sys/types.h
FileBox.o: /usr/include/linux/types.h /usr/include/linux/posix_types.h
FileBox.o: /usr/include/asm/posix_types.h /usr/include/asm/types.h
FileBox.o: /usr/include/sys/bitypes.h /usr/include/X11/X11/X11/X.h
FileBox.o: /usr/include/X11/X11/X11/Xfuncproto.h
FileBox.o: /usr/include/X11/X11/X11/Xosdefs.h
FileBox.o: /usr/lib/gcc-lib/i486-linux/2.7.2/include/stddef.h
FileBox.o: /usr/include/X11/X11/Xutil.h /usr/include/X11/X11/Xresource.h
FileBox.o: /usr/include/string.h /usr/include/features.h
FileBox.o: /usr/include/sys/cdefs.h /usr/include/X11/X11/Core.h
FileBox.o: /usr/include/X11/X11/Composite.h /usr/include/X11/X11/Constraint.h
FileBox.o: /usr/include/X11/X11/Object.h /usr/include/X11/X11/RectObj.h
FileBox.o: /usr/include/X11/Shell.h /usr/include/X11/X11/SM/SMlib.h
FileBox.o: /usr/include/X11/SM/SM.h /usr/include/X11/ICE/ICElib.h
FileBox.o: /usr/include/X11/ICE/ICE.h /usr/include/X11/Xatom.h
FileBox.o: /usr/include/Xm/XmStrDefs.h /usr/include/X11/StringDefs.h
FileBox.o: /usr/include/Xm/VirtKeys.h /usr/include/Xm/Transfer.h
FileBox.o: /usr/include/Xm/DragDrop.h /usr/include/Xm/DragC.h
FileBox.o: /usr/include/Xm/Display.h /usr/include/Xm/DropSMgr.h
FileBox.o: /usr/include/Xm/DragIcon.h /usr/include/Xm/DropTrans.h
FileBox.o: /usr/include/Xm/DragOverS.h /usr/include/Xm/Primitive.h
FileBox.o: /usr/include/Xm/Manager.h /usr/include/Xm/Gadget.h
FileBox.o: /usr/include/Xm/TxtPropCv.h /usr/include/Xm/VendorS.h
FileBox.o: /usr/include/Xm/XmIm.h /usr/include/Xm/FileSB.h
FileBox.o: ../include/FileBox.h ../include/util.h /usr/include/stdio.h
FileBox.o: /usr/include/libio.h /usr/include/_G_config.h /usr/include/errno.h
FileBox.o: /usr/include/linux/errno.h /usr/include/asm/errno.h
FileIO.o: /usr/include/Xm/Xm.h /usr/include/X11/Intrinsic.h
FileIO.o: /usr/include/X11/X11/Xlib.h /usr/include/sys/types.h
FileIO.o: /usr/include/linux/types.h /usr/include/linux/posix_types.h
FileIO.o: /usr/include/asm/posix_types.h /usr/include/asm/types.h
FileIO.o: /usr/include/sys/bitypes.h /usr/include/X11/X11/X11/X.h
FileIO.o: /usr/include/X11/X11/X11/Xfuncproto.h
FileIO.o: /usr/include/X11/X11/X11/Xosdefs.h
FileIO.o: /usr/lib/gcc-lib/i486-linux/2.7.2/include/stddef.h
FileIO.o: /usr/include/X11/X11/Xutil.h /usr/include/X11/X11/Xresource.h
FileIO.o: /usr/include/string.h /usr/include/features.h
FileIO.o: /usr/include/sys/cdefs.h /usr/include/X11/X11/Core.h
FileIO.o: /usr/include/X11/X11/Composite.h /usr/include/X11/X11/Constraint.h
FileIO.o: /usr/include/X11/X11/Object.h /usr/include/X11/X11/RectObj.h
FileIO.o: /usr/include/X11/Shell.h /usr/include/X11/X11/SM/SMlib.h
FileIO.o: /usr/include/X11/SM/SM.h /usr/include/X11/ICE/ICElib.h
FileIO.o: /usr/include/X11/ICE/ICE.h /usr/include/X11/Xatom.h
FileIO.o: /usr/include/Xm/XmStrDefs.h /usr/include/X11/StringDefs.h
FileIO.o: /usr/include/Xm/VirtKeys.h /usr/include/Xm/Transfer.h
FileIO.o: /usr/include/Xm/DragDrop.h /usr/include/Xm/DragC.h
FileIO.o: /usr/include/Xm/Display.h /usr/include/Xm/DropSMgr.h
FileIO.o: /usr/include/Xm/DragIcon.h /usr/include/Xm/DropTrans.h
FileIO.o: /usr/include/Xm/DragOverS.h /usr/include/Xm/Primitive.h
FileIO.o: /usr/include/Xm/Manager.h /usr/include/Xm/Gadget.h
FileIO.o: /usr/include/Xm/TxtPropCv.h /usr/include/Xm/VendorS.h
FileIO.o: /usr/include/Xm/XmIm.h /usr/include/fcntl.h
FileIO.o: /usr/include/gnu/types.h /usr/include/linux/fcntl.h
FileIO.o: /usr/include/asm/fcntl.h ../include/main.h ../include/date.h
FileIO.o: ../include/Transaction.h ../include/util.h /usr/include/stdio.h
FileIO.o: /usr/include/libio.h /usr/include/_G_config.h /usr/include/errno.h
FileIO.o: /usr/include/linux/errno.h /usr/include/asm/errno.h
FileIO.o: ../include/Account.h ../include/QuickFill.h ../include/Data.h
HelpWindow.o: /usr/include/sys/types.h /usr/include/linux/types.h
HelpWindow.o: /usr/include/linux/posix_types.h /usr/include/asm/posix_types.h
HelpWindow.o: /usr/include/asm/types.h /usr/include/sys/bitypes.h
HelpWindow.o: /usr/include/sys/stat.h /usr/include/features.h
HelpWindow.o: /usr/include/sys/cdefs.h /usr/include/linux/stat.h
HelpWindow.o: /usr/include/fcntl.h /usr/include/gnu/types.h
HelpWindow.o: /usr/include/linux/fcntl.h /usr/include/asm/fcntl.h
HelpWindow.o: /usr/include/unistd.h /usr/include/posix_opt.h
HelpWindow.o: /usr/lib/gcc-lib/i486-linux/2.7.2/include/stddef.h
HelpWindow.o: /usr/include/confname.h /usr/include/Xm/Xm.h
HelpWindow.o: /usr/include/X11/Intrinsic.h /usr/include/X11/X11/Xlib.h
HelpWindow.o: /usr/include/X11/X11/X11/X.h
HelpWindow.o: /usr/include/X11/X11/X11/Xfuncproto.h
HelpWindow.o: /usr/include/X11/X11/X11/Xosdefs.h /usr/include/X11/X11/Xutil.h
HelpWindow.o: /usr/include/X11/X11/Xresource.h /usr/include/string.h
HelpWindow.o: /usr/include/X11/X11/Core.h /usr/include/X11/X11/Composite.h
HelpWindow.o: /usr/include/X11/X11/Constraint.h /usr/include/X11/X11/Object.h
HelpWindow.o: /usr/include/X11/X11/RectObj.h /usr/include/X11/Shell.h
HelpWindow.o: /usr/include/X11/X11/SM/SMlib.h /usr/include/X11/SM/SM.h
HelpWindow.o: /usr/include/X11/ICE/ICElib.h /usr/include/X11/ICE/ICE.h
HelpWindow.o: /usr/include/X11/Xatom.h /usr/include/Xm/XmStrDefs.h
HelpWindow.o: /usr/include/X11/StringDefs.h /usr/include/Xm/VirtKeys.h
HelpWindow.o: /usr/include/Xm/Transfer.h /usr/include/Xm/DragDrop.h
HelpWindow.o: /usr/include/Xm/DragC.h /usr/include/Xm/Display.h
HelpWindow.o: /usr/include/Xm/DropSMgr.h /usr/include/Xm/DragIcon.h
HelpWindow.o: /usr/include/Xm/DropTrans.h /usr/include/Xm/DragOverS.h
HelpWindow.o: /usr/include/Xm/Primitive.h /usr/include/Xm/Manager.h
HelpWindow.o: /usr/include/Xm/Gadget.h /usr/include/Xm/TxtPropCv.h
HelpWindow.o: /usr/include/Xm/VendorS.h /usr/include/Xm/XmIm.h
HelpWindow.o: /usr/include/Xm/DialogS.h /usr/include/Xm/PanedW.h
HelpWindow.o: /usr/include/Xm/Frame.h /usr/include/Xm/Form.h
HelpWindow.o: /usr/include/Xm/BulletinB.h /usr/include/Xm/PushB.h
HelpWindow.o: /usr/include/X11/xpm.h ../include/main.h ../include/date.h
HelpWindow.o: ../include/Transaction.h ../include/util.h /usr/include/stdio.h
HelpWindow.o: /usr/include/libio.h /usr/include/_G_config.h
HelpWindow.o: /usr/include/errno.h /usr/include/linux/errno.h
HelpWindow.o: /usr/include/asm/errno.h ../libhtmlw/HTML.h
main.o: /usr/include/Xm/Xm.h /usr/include/X11/Intrinsic.h
main.o: /usr/include/X11/X11/Xlib.h /usr/include/sys/types.h
main.o: /usr/include/linux/types.h /usr/include/linux/posix_types.h
main.o: /usr/include/asm/posix_types.h /usr/include/asm/types.h
main.o: /usr/include/sys/bitypes.h /usr/include/X11/X11/X11/X.h
main.o: /usr/include/X11/X11/X11/Xfuncproto.h
main.o: /usr/include/X11/X11/X11/Xosdefs.h
main.o: /usr/lib/gcc-lib/i486-linux/2.7.2/include/stddef.h
main.o: /usr/include/X11/X11/Xutil.h /usr/include/X11/X11/Xresource.h
main.o: /usr/include/string.h /usr/include/features.h
main.o: /usr/include/sys/cdefs.h /usr/include/X11/X11/Core.h
main.o: /usr/include/X11/X11/Composite.h /usr/include/X11/X11/Constraint.h
main.o: /usr/include/X11/X11/Object.h /usr/include/X11/X11/RectObj.h
main.o: /usr/include/X11/Shell.h /usr/include/X11/X11/SM/SMlib.h
main.o: /usr/include/X11/SM/SM.h /usr/include/X11/ICE/ICElib.h
main.o: /usr/include/X11/ICE/ICE.h /usr/include/X11/Xatom.h
main.o: /usr/include/Xm/XmStrDefs.h /usr/include/X11/StringDefs.h
main.o: /usr/include/Xm/VirtKeys.h /usr/include/Xm/Transfer.h
main.o: /usr/include/Xm/DragDrop.h /usr/include/Xm/DragC.h
main.o: /usr/include/Xm/Display.h /usr/include/Xm/DropSMgr.h
main.o: /usr/include/Xm/DragIcon.h /usr/include/Xm/DropTrans.h
main.o: /usr/include/Xm/DragOverS.h /usr/include/Xm/Primitive.h
main.o: /usr/include/Xm/Manager.h /usr/include/Xm/Gadget.h
main.o: /usr/include/Xm/TxtPropCv.h /usr/include/Xm/VendorS.h
main.o: /usr/include/Xm/XmIm.h ../include/BuildMenu.h /usr/include/Xm/PushB.h
main.o: /usr/include/Xm/Separator.h ../include/RegWindow.h
main.o: ../include/Account.h ../include/QuickFill.h ../include/Transaction.h
main.o: ../include/date.h ../include/FileIO.h ../include/Data.h
main.o: ../include/FileBox.h ../include/util.h /usr/include/stdio.h
main.o: /usr/include/libio.h /usr/include/_G_config.h /usr/include/errno.h
main.o: /usr/include/linux/errno.h /usr/include/asm/errno.h ../include/main.h
MainWindow.o: /usr/include/Xm/Xm.h /usr/include/X11/Intrinsic.h
MainWindow.o: /usr/include/X11/X11/Xlib.h /usr/include/sys/types.h
MainWindow.o: /usr/include/linux/types.h /usr/include/linux/posix_types.h
MainWindow.o: /usr/include/asm/posix_types.h /usr/include/asm/types.h
MainWindow.o: /usr/include/sys/bitypes.h /usr/include/X11/X11/X11/X.h
MainWindow.o: /usr/include/X11/X11/X11/Xfuncproto.h
MainWindow.o: /usr/include/X11/X11/X11/Xosdefs.h
MainWindow.o: /usr/lib/gcc-lib/i486-linux/2.7.2/include/stddef.h
MainWindow.o: /usr/include/X11/X11/Xutil.h /usr/include/X11/X11/Xresource.h
MainWindow.o: /usr/include/string.h /usr/include/features.h
MainWindow.o: /usr/include/sys/cdefs.h /usr/include/X11/X11/Core.h
MainWindow.o: /usr/include/X11/X11/Composite.h
MainWindow.o: /usr/include/X11/X11/Constraint.h /usr/include/X11/X11/Object.h
MainWindow.o: /usr/include/X11/X11/RectObj.h /usr/include/X11/Shell.h
MainWindow.o: /usr/include/X11/X11/SM/SMlib.h /usr/include/X11/SM/SM.h
MainWindow.o: /usr/include/X11/ICE/ICElib.h /usr/include/X11/ICE/ICE.h
MainWindow.o: /usr/include/X11/Xatom.h /usr/include/Xm/XmStrDefs.h
MainWindow.o: /usr/include/X11/StringDefs.h /usr/include/Xm/VirtKeys.h
MainWindow.o: /usr/include/Xm/Transfer.h /usr/include/Xm/DragDrop.h
MainWindow.o: /usr/include/Xm/DragC.h /usr/include/Xm/Display.h
MainWindow.o: /usr/include/Xm/DropSMgr.h /usr/include/Xm/DragIcon.h
MainWindow.o: /usr/include/Xm/DropTrans.h /usr/include/Xm/DragOverS.h
MainWindow.o: /usr/include/Xm/Primitive.h /usr/include/Xm/Manager.h
MainWindow.o: /usr/include/Xm/Gadget.h /usr/include/Xm/TxtPropCv.h
MainWindow.o: /usr/include/Xm/VendorS.h /usr/include/Xm/XmIm.h
MainWindow.o: /usr/include/Xm/PanedW.h /usr/include/Xm/Form.h
MainWindow.o: /usr/include/Xm/BulletinB.h /usr/include/Xm/MainW.h
MainWindow.o: /usr/include/Xm/Label.h /usr/include/Xm/LabelGP.h
MainWindow.o: /usr/include/Xm/LabelG.h /usr/include/Xm/GadgetP.h
MainWindow.o: /usr/include/Xm/XmP.h /usr/include/X11/IntrinsicP.h
MainWindow.o: /usr/include/X11/X11/CoreP.h /usr/include/X11/X11/CompositeP.h
MainWindow.o: /usr/include/X11/X11/ConstrainP.h
MainWindow.o: /usr/include/X11/X11/ObjectP.h /usr/include/X11/X11/RectObjP.h
MainWindow.o: /usr/include/Xm/ColorP.h /usr/include/Xm/AccColorT.h
MainWindow.o: /usr/include/Xm/BaseClassP.h /usr/include/Xm/ExtObjectP.h
MainWindow.o: /usr/include/Xm/List.h /usr/include/Xm/RowColumn.h
MainWindow.o: ../Xbae-4.6.2-linas/Xbae/Matrix.h
MainWindow.o: ../Xbae-4.6.2-linas/Xbae/Xbae/patchlevel.h ../include/main.h
MainWindow.o: ../include/date.h ../include/Transaction.h ../include/util.h
MainWindow.o: /usr/include/stdio.h /usr/include/libio.h
MainWindow.o: /usr/include/_G_config.h /usr/include/errno.h
MainWindow.o: /usr/include/linux/errno.h /usr/include/asm/errno.h
MainWindow.o: ../include/Data.h ../include/Account.h ../include/QuickFill.h
MainWindow.o: ../include/FileIO.h ../include/FileBox.h ../include/BuildMenu.h
MainWindow.o: /usr/include/Xm/PushB.h /usr/include/Xm/Separator.h
MainWindow.o: ../include/MainWindow.h ../include/RegWindow.h
MainWindow.o: ../include/XferWindow.h ../include/HelpWindow.h
PopBox.o: /usr/include/Xm/Xm.h /usr/include/X11/Intrinsic.h
PopBox.o: /usr/include/X11/X11/Xlib.h /usr/include/sys/types.h
PopBox.o: /usr/include/linux/types.h /usr/include/linux/posix_types.h
PopBox.o: /usr/include/asm/posix_types.h /usr/include/asm/types.h
PopBox.o: /usr/include/sys/bitypes.h /usr/include/X11/X11/X11/X.h
PopBox.o: /usr/include/X11/X11/X11/Xfuncproto.h
PopBox.o: /usr/include/X11/X11/X11/Xosdefs.h
PopBox.o: /usr/lib/gcc-lib/i486-linux/2.7.2/include/stddef.h
PopBox.o: /usr/include/X11/X11/Xutil.h /usr/include/X11/X11/Xresource.h
PopBox.o: /usr/include/string.h /usr/include/features.h
PopBox.o: /usr/include/sys/cdefs.h /usr/include/X11/X11/Core.h
PopBox.o: /usr/include/X11/X11/Composite.h /usr/include/X11/X11/Constraint.h
PopBox.o: /usr/include/X11/X11/Object.h /usr/include/X11/X11/RectObj.h
PopBox.o: /usr/include/X11/Shell.h /usr/include/X11/X11/SM/SMlib.h
PopBox.o: /usr/include/X11/SM/SM.h /usr/include/X11/ICE/ICElib.h
PopBox.o: /usr/include/X11/ICE/ICE.h /usr/include/X11/Xatom.h
PopBox.o: /usr/include/Xm/XmStrDefs.h /usr/include/X11/StringDefs.h
PopBox.o: /usr/include/Xm/VirtKeys.h /usr/include/Xm/Transfer.h
PopBox.o: /usr/include/Xm/DragDrop.h /usr/include/Xm/DragC.h
PopBox.o: /usr/include/Xm/Display.h /usr/include/Xm/DropSMgr.h
PopBox.o: /usr/include/Xm/DragIcon.h /usr/include/Xm/DropTrans.h
PopBox.o: /usr/include/Xm/DragOverS.h /usr/include/Xm/Primitive.h
PopBox.o: /usr/include/Xm/Manager.h /usr/include/Xm/Gadget.h
PopBox.o: /usr/include/Xm/TxtPropCv.h /usr/include/Xm/VendorS.h
PopBox.o: /usr/include/Xm/XmIm.h ../ComboBox-1.33/ComboBox.h
PopBox.o: ../Xbae-4.6.2-linas/Xbae/Matrix.h
PopBox.o: ../Xbae-4.6.2-linas/Xbae/Xbae/patchlevel.h ../include/util.h
PopBox.o: /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h
PopBox.o: /usr/include/errno.h /usr/include/linux/errno.h
PopBox.o: /usr/include/asm/errno.h
QIFIO.o: /usr/include/Xm/Xm.h /usr/include/X11/Intrinsic.h
QIFIO.o: /usr/include/X11/X11/Xlib.h /usr/include/sys/types.h
QIFIO.o: /usr/include/linux/types.h /usr/include/linux/posix_types.h
QIFIO.o: /usr/include/asm/posix_types.h /usr/include/asm/types.h
QIFIO.o: /usr/include/sys/bitypes.h /usr/include/X11/X11/X11/X.h
QIFIO.o: /usr/include/X11/X11/X11/Xfuncproto.h
QIFIO.o: /usr/include/X11/X11/X11/Xosdefs.h
QIFIO.o: /usr/lib/gcc-lib/i486-linux/2.7.2/include/stddef.h
QIFIO.o: /usr/include/X11/X11/Xutil.h /usr/include/X11/X11/Xresource.h
QIFIO.o: /usr/include/string.h /usr/include/features.h
QIFIO.o: /usr/include/sys/cdefs.h /usr/include/X11/X11/Core.h
QIFIO.o: /usr/include/X11/X11/Composite.h /usr/include/X11/X11/Constraint.h
QIFIO.o: /usr/include/X11/X11/Object.h /usr/include/X11/X11/RectObj.h
QIFIO.o: /usr/include/X11/Shell.h /usr/include/X11/X11/SM/SMlib.h
QIFIO.o: /usr/include/X11/SM/SM.h /usr/include/X11/ICE/ICElib.h
QIFIO.o: /usr/include/X11/ICE/ICE.h /usr/include/X11/Xatom.h
QIFIO.o: /usr/include/Xm/XmStrDefs.h /usr/include/X11/StringDefs.h
QIFIO.o: /usr/include/Xm/VirtKeys.h /usr/include/Xm/Transfer.h
QIFIO.o: /usr/include/Xm/DragDrop.h /usr/include/Xm/DragC.h
QIFIO.o: /usr/include/Xm/Display.h /usr/include/Xm/DropSMgr.h
QIFIO.o: /usr/include/Xm/DragIcon.h /usr/include/Xm/DropTrans.h
QIFIO.o: /usr/include/Xm/DragOverS.h /usr/include/Xm/Primitive.h
QIFIO.o: /usr/include/Xm/Manager.h /usr/include/Xm/Gadget.h
QIFIO.o: /usr/include/Xm/TxtPropCv.h /usr/include/Xm/VendorS.h
QIFIO.o: /usr/include/Xm/XmIm.h /usr/include/fcntl.h /usr/include/gnu/types.h
QIFIO.o: /usr/include/linux/fcntl.h /usr/include/asm/fcntl.h
QIFIO.o: ../include/main.h ../include/date.h ../include/Transaction.h
QIFIO.o: ../include/util.h /usr/include/stdio.h /usr/include/libio.h
QIFIO.o: /usr/include/_G_config.h /usr/include/errno.h
QIFIO.o: /usr/include/linux/errno.h /usr/include/asm/errno.h
QIFIO.o: ../include/Account.h ../include/QuickFill.h ../include/Data.h
QuickFill.o: /usr/include/string.h /usr/include/features.h
QuickFill.o: /usr/include/sys/cdefs.h
QuickFill.o: /usr/lib/gcc-lib/i486-linux/2.7.2/include/stddef.h
QuickFill.o: ../include/util.h /usr/include/Xm/Xm.h
QuickFill.o: /usr/include/X11/Intrinsic.h /usr/include/X11/X11/Xlib.h
QuickFill.o: /usr/include/sys/types.h /usr/include/linux/types.h
QuickFill.o: /usr/include/linux/posix_types.h /usr/include/asm/posix_types.h
QuickFill.o: /usr/include/asm/types.h /usr/include/sys/bitypes.h
QuickFill.o: /usr/include/X11/X11/X11/X.h
QuickFill.o: /usr/include/X11/X11/X11/Xfuncproto.h
QuickFill.o: /usr/include/X11/X11/X11/Xosdefs.h /usr/include/X11/X11/Xutil.h
QuickFill.o: /usr/include/X11/X11/Xresource.h /usr/include/X11/X11/Core.h
QuickFill.o: /usr/include/X11/X11/Composite.h
QuickFill.o: /usr/include/X11/X11/Constraint.h /usr/include/X11/X11/Object.h
QuickFill.o: /usr/include/X11/X11/RectObj.h /usr/include/X11/Shell.h
QuickFill.o: /usr/include/X11/X11/SM/SMlib.h /usr/include/X11/SM/SM.h
QuickFill.o: /usr/include/X11/ICE/ICElib.h /usr/include/X11/ICE/ICE.h
QuickFill.o: /usr/include/X11/Xatom.h /usr/include/Xm/XmStrDefs.h
QuickFill.o: /usr/include/X11/StringDefs.h /usr/include/Xm/VirtKeys.h
QuickFill.o: /usr/include/Xm/Transfer.h /usr/include/Xm/DragDrop.h
QuickFill.o: /usr/include/Xm/DragC.h /usr/include/Xm/Display.h
QuickFill.o: /usr/include/Xm/DropSMgr.h /usr/include/Xm/DragIcon.h
QuickFill.o: /usr/include/Xm/DropTrans.h /usr/include/Xm/DragOverS.h
QuickFill.o: /usr/include/Xm/Primitive.h /usr/include/Xm/Manager.h
QuickFill.o: /usr/include/Xm/Gadget.h /usr/include/Xm/TxtPropCv.h
QuickFill.o: /usr/include/Xm/VendorS.h /usr/include/Xm/XmIm.h
QuickFill.o: /usr/include/stdio.h /usr/include/libio.h
QuickFill.o: /usr/include/_G_config.h /usr/include/errno.h
QuickFill.o: /usr/include/linux/errno.h /usr/include/asm/errno.h
QuickFill.o: ../include/main.h ../include/date.h ../include/Transaction.h
QuickFill.o: ../include/Account.h ../include/QuickFill.h
RecnWindow.o: /usr/include/Xm/Xm.h /usr/include/X11/Intrinsic.h
RecnWindow.o: /usr/include/X11/X11/Xlib.h /usr/include/sys/types.h
RecnWindow.o: /usr/include/linux/types.h /usr/include/linux/posix_types.h
RecnWindow.o: /usr/include/asm/posix_types.h /usr/include/asm/types.h
RecnWindow.o: /usr/include/sys/bitypes.h /usr/include/X11/X11/X11/X.h
RecnWindow.o: /usr/include/X11/X11/X11/Xfuncproto.h
RecnWindow.o: /usr/include/X11/X11/X11/Xosdefs.h
RecnWindow.o: /usr/lib/gcc-lib/i486-linux/2.7.2/include/stddef.h
RecnWindow.o: /usr/include/X11/X11/Xutil.h /usr/include/X11/X11/Xresource.h
RecnWindow.o: /usr/include/string.h /usr/include/features.h
RecnWindow.o: /usr/include/sys/cdefs.h /usr/include/X11/X11/Core.h
RecnWindow.o: /usr/include/X11/X11/Composite.h
RecnWindow.o: /usr/include/X11/X11/Constraint.h /usr/include/X11/X11/Object.h
RecnWindow.o: /usr/include/X11/X11/RectObj.h /usr/include/X11/Shell.h
RecnWindow.o: /usr/include/X11/X11/SM/SMlib.h /usr/include/X11/SM/SM.h
RecnWindow.o: /usr/include/X11/ICE/ICElib.h /usr/include/X11/ICE/ICE.h
RecnWindow.o: /usr/include/X11/Xatom.h /usr/include/Xm/XmStrDefs.h
RecnWindow.o: /usr/include/X11/StringDefs.h /usr/include/Xm/VirtKeys.h
RecnWindow.o: /usr/include/Xm/Transfer.h /usr/include/Xm/DragDrop.h
RecnWindow.o: /usr/include/Xm/DragC.h /usr/include/Xm/Display.h
RecnWindow.o: /usr/include/Xm/DropSMgr.h /usr/include/Xm/DragIcon.h
RecnWindow.o: /usr/include/Xm/DropTrans.h /usr/include/Xm/DragOverS.h
RecnWindow.o: /usr/include/Xm/Primitive.h /usr/include/Xm/Manager.h
RecnWindow.o: /usr/include/Xm/Gadget.h /usr/include/Xm/TxtPropCv.h
RecnWindow.o: /usr/include/Xm/VendorS.h /usr/include/Xm/XmIm.h
RecnWindow.o: /usr/include/Xm/RowColumn.h /usr/include/Xm/Form.h
RecnWindow.o: /usr/include/Xm/BulletinB.h /usr/include/Xm/Text.h
RecnWindow.o: /usr/include/stdio.h /usr/include/libio.h
RecnWindow.o: /usr/include/_G_config.h /usr/include/Xm/DialogS.h
RecnWindow.o: /usr/include/Xm/PanedW.h /usr/include/Xm/Frame.h
RecnWindow.o: /usr/include/Xm/PushB.h /usr/include/Xm/LabelGP.h
RecnWindow.o: /usr/include/Xm/LabelG.h /usr/include/Xm/GadgetP.h
RecnWindow.o: /usr/include/Xm/XmP.h /usr/include/X11/IntrinsicP.h
RecnWindow.o: /usr/include/X11/X11/CoreP.h /usr/include/X11/X11/CompositeP.h
RecnWindow.o: /usr/include/X11/X11/ConstrainP.h
RecnWindow.o: /usr/include/X11/X11/ObjectP.h /usr/include/X11/X11/RectObjP.h
RecnWindow.o: /usr/include/Xm/ColorP.h /usr/include/Xm/AccColorT.h
RecnWindow.o: /usr/include/Xm/BaseClassP.h /usr/include/Xm/ExtObjectP.h
RecnWindow.o: ../Xbae-4.6.2-linas/Xbae/Matrix.h
RecnWindow.o: ../Xbae-4.6.2-linas/Xbae/Xbae/patchlevel.h ../include/Data.h
RecnWindow.o: ../include/Account.h ../include/QuickFill.h
RecnWindow.o: ../include/Transaction.h ../include/date.h
RecnWindow.o: ../include/RegWindow.h ../include/MainWindow.h
RecnWindow.o: ../include/main.h ../include/util.h /usr/include/errno.h
RecnWindow.o: /usr/include/linux/errno.h /usr/include/asm/errno.h
RegWindow.o: /usr/include/Xm/Xm.h /usr/include/X11/Intrinsic.h
RegWindow.o: /usr/include/X11/X11/Xlib.h /usr/include/sys/types.h
RegWindow.o: /usr/include/linux/types.h /usr/include/linux/posix_types.h
RegWindow.o: /usr/include/asm/posix_types.h /usr/include/asm/types.h
RegWindow.o: /usr/include/sys/bitypes.h /usr/include/X11/X11/X11/X.h
RegWindow.o: /usr/include/X11/X11/X11/Xfuncproto.h
RegWindow.o: /usr/include/X11/X11/X11/Xosdefs.h
RegWindow.o: /usr/lib/gcc-lib/i486-linux/2.7.2/include/stddef.h
RegWindow.o: /usr/include/X11/X11/Xutil.h /usr/include/X11/X11/Xresource.h
RegWindow.o: /usr/include/string.h /usr/include/features.h
RegWindow.o: /usr/include/sys/cdefs.h /usr/include/X11/X11/Core.h
RegWindow.o: /usr/include/X11/X11/Composite.h
RegWindow.o: /usr/include/X11/X11/Constraint.h /usr/include/X11/X11/Object.h
RegWindow.o: /usr/include/X11/X11/RectObj.h /usr/include/X11/Shell.h
RegWindow.o: /usr/include/X11/X11/SM/SMlib.h /usr/include/X11/SM/SM.h
RegWindow.o: /usr/include/X11/ICE/ICElib.h /usr/include/X11/ICE/ICE.h
RegWindow.o: /usr/include/X11/Xatom.h /usr/include/Xm/XmStrDefs.h
RegWindow.o: /usr/include/X11/StringDefs.h /usr/include/Xm/VirtKeys.h
RegWindow.o: /usr/include/Xm/Transfer.h /usr/include/Xm/DragDrop.h
RegWindow.o: /usr/include/Xm/DragC.h /usr/include/Xm/Display.h
RegWindow.o: /usr/include/Xm/DropSMgr.h /usr/include/Xm/DragIcon.h
RegWindow.o: /usr/include/Xm/DropTrans.h /usr/include/Xm/DragOverS.h
RegWindow.o: /usr/include/Xm/Primitive.h /usr/include/Xm/Manager.h
RegWindow.o: /usr/include/Xm/Gadget.h /usr/include/Xm/TxtPropCv.h
RegWindow.o: /usr/include/Xm/VendorS.h /usr/include/Xm/XmIm.h
RegWindow.o: /usr/include/Xm/DialogS.h /usr/include/Xm/Form.h
RegWindow.o: /usr/include/Xm/BulletinB.h /usr/include/Xm/Frame.h
RegWindow.o: /usr/include/Xm/LabelGP.h /usr/include/Xm/LabelG.h
RegWindow.o: /usr/include/Xm/GadgetP.h /usr/include/Xm/XmP.h
RegWindow.o: /usr/include/X11/IntrinsicP.h /usr/include/X11/X11/CoreP.h
RegWindow.o: /usr/include/X11/X11/CompositeP.h
RegWindow.o: /usr/include/X11/X11/ConstrainP.h /usr/include/X11/X11/ObjectP.h
RegWindow.o: /usr/include/X11/X11/RectObjP.h /usr/include/Xm/ColorP.h
RegWindow.o: /usr/include/Xm/AccColorT.h /usr/include/Xm/BaseClassP.h
RegWindow.o: /usr/include/Xm/ExtObjectP.h /usr/include/Xm/PanedW.h
RegWindow.o: /usr/include/Xm/PushB.h /usr/include/Xm/RowColumn.h
RegWindow.o: /usr/include/Xm/Text.h /usr/include/stdio.h /usr/include/libio.h
RegWindow.o: /usr/include/_G_config.h ../Xbae-4.6.2-linas/Xbae/Matrix.h
RegWindow.o: ../Xbae-4.6.2-linas/Xbae/Xbae/patchlevel.h ../include/Account.h
RegWindow.o: ../include/QuickFill.h ../include/Transaction.h
RegWindow.o: ../include/date.h ../include/Action.h ../include/AdjBWindow.h
RegWindow.o: ../include/BuildMenu.h /usr/include/Xm/Separator.h
RegWindow.o: ../include/Data.h ../include/main.h ../include/MainWindow.h
RegWindow.o: ../include/PopBox.h ../include/RecnWindow.h ../include/util.h
RegWindow.o: /usr/include/errno.h /usr/include/linux/errno.h
RegWindow.o: /usr/include/asm/errno.h
Reports.o: /usr/include/Xm/Xm.h /usr/include/X11/Intrinsic.h
Reports.o: /usr/include/X11/X11/Xlib.h /usr/include/sys/types.h
Reports.o: /usr/include/linux/types.h /usr/include/linux/posix_types.h
Reports.o: /usr/include/asm/posix_types.h /usr/include/asm/types.h
Reports.o: /usr/include/sys/bitypes.h /usr/include/X11/X11/X11/X.h
Reports.o: /usr/include/X11/X11/X11/Xfuncproto.h
Reports.o: /usr/include/X11/X11/X11/Xosdefs.h
Reports.o: /usr/lib/gcc-lib/i486-linux/2.7.2/include/stddef.h
Reports.o: /usr/include/X11/X11/Xutil.h /usr/include/X11/X11/Xresource.h
Reports.o: /usr/include/string.h /usr/include/features.h
Reports.o: /usr/include/sys/cdefs.h /usr/include/X11/X11/Core.h
Reports.o: /usr/include/X11/X11/Composite.h /usr/include/X11/X11/Constraint.h
Reports.o: /usr/include/X11/X11/Object.h /usr/include/X11/X11/RectObj.h
Reports.o: /usr/include/X11/Shell.h /usr/include/X11/X11/SM/SMlib.h
Reports.o: /usr/include/X11/SM/SM.h /usr/include/X11/ICE/ICElib.h
Reports.o: /usr/include/X11/ICE/ICE.h /usr/include/X11/Xatom.h
Reports.o: /usr/include/Xm/XmStrDefs.h /usr/include/X11/StringDefs.h
Reports.o: /usr/include/Xm/VirtKeys.h /usr/include/Xm/Transfer.h
Reports.o: /usr/include/Xm/DragDrop.h /usr/include/Xm/DragC.h
Reports.o: /usr/include/Xm/Display.h /usr/include/Xm/DropSMgr.h
Reports.o: /usr/include/Xm/DragIcon.h /usr/include/Xm/DropTrans.h
Reports.o: /usr/include/Xm/DragOverS.h /usr/include/Xm/Primitive.h
Reports.o: /usr/include/Xm/Manager.h /usr/include/Xm/Gadget.h
Reports.o: /usr/include/Xm/TxtPropCv.h /usr/include/Xm/VendorS.h
Reports.o: /usr/include/Xm/XmIm.h /usr/include/Xm/Form.h
Reports.o: /usr/include/Xm/BulletinB.h /usr/include/Xm/Text.h
Reports.o: /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h
Reports.o: /usr/include/Xm/DialogS.h /usr/include/Xm/PanedW.h
Reports.o: /usr/include/Xm/Frame.h /usr/include/Xm/PushB.h
Reports.o: /usr/include/Xm/LabelGP.h /usr/include/Xm/LabelG.h
Reports.o: /usr/include/Xm/GadgetP.h /usr/include/Xm/XmP.h
Reports.o: /usr/include/X11/IntrinsicP.h /usr/include/X11/X11/CoreP.h
Reports.o: /usr/include/X11/X11/CompositeP.h
Reports.o: /usr/include/X11/X11/ConstrainP.h /usr/include/X11/X11/ObjectP.h
Reports.o: /usr/include/X11/X11/RectObjP.h /usr/include/Xm/ColorP.h
Reports.o: /usr/include/Xm/AccColorT.h /usr/include/Xm/BaseClassP.h
Reports.o: /usr/include/Xm/ExtObjectP.h ../include/Reports.h
Reports.o: ../include/util.h /usr/include/errno.h /usr/include/linux/errno.h
Reports.o: /usr/include/asm/errno.h
Transaction.o: ../include/Transaction.h /usr/include/Xm/Xm.h
Transaction.o: /usr/include/X11/Intrinsic.h /usr/include/X11/X11/Xlib.h
Transaction.o: /usr/include/sys/types.h /usr/include/linux/types.h
Transaction.o: /usr/include/linux/posix_types.h
Transaction.o: /usr/include/asm/posix_types.h /usr/include/asm/types.h
Transaction.o: /usr/include/sys/bitypes.h /usr/include/X11/X11/X11/X.h
Transaction.o: /usr/include/X11/X11/X11/Xfuncproto.h
Transaction.o: /usr/include/X11/X11/X11/Xosdefs.h
Transaction.o: /usr/lib/gcc-lib/i486-linux/2.7.2/include/stddef.h
Transaction.o: /usr/include/X11/X11/Xutil.h /usr/include/X11/X11/Xresource.h
Transaction.o: /usr/include/string.h /usr/include/features.h
Transaction.o: /usr/include/sys/cdefs.h /usr/include/X11/X11/Core.h
Transaction.o: /usr/include/X11/X11/Composite.h
Transaction.o: /usr/include/X11/X11/Constraint.h
Transaction.o: /usr/include/X11/X11/Object.h /usr/include/X11/X11/RectObj.h
Transaction.o: /usr/include/X11/Shell.h /usr/include/X11/X11/SM/SMlib.h
Transaction.o: /usr/include/X11/SM/SM.h /usr/include/X11/ICE/ICElib.h
Transaction.o: /usr/include/X11/ICE/ICE.h /usr/include/X11/Xatom.h
Transaction.o: /usr/include/Xm/XmStrDefs.h /usr/include/X11/StringDefs.h
Transaction.o: /usr/include/Xm/VirtKeys.h /usr/include/Xm/Transfer.h
Transaction.o: /usr/include/Xm/DragDrop.h /usr/include/Xm/DragC.h
Transaction.o: /usr/include/Xm/Display.h /usr/include/Xm/DropSMgr.h
Transaction.o: /usr/include/Xm/DragIcon.h /usr/include/Xm/DropTrans.h
Transaction.o: /usr/include/Xm/DragOverS.h /usr/include/Xm/Primitive.h
Transaction.o: /usr/include/Xm/Manager.h /usr/include/Xm/Gadget.h
Transaction.o: /usr/include/Xm/TxtPropCv.h /usr/include/Xm/VendorS.h
Transaction.o: /usr/include/Xm/XmIm.h ../include/date.h ../include/util.h
Transaction.o: /usr/include/stdio.h /usr/include/libio.h
Transaction.o: /usr/include/_G_config.h /usr/include/errno.h
Transaction.o: /usr/include/linux/errno.h /usr/include/asm/errno.h
util.o: /usr/include/X11/X11/X11/X.h /usr/include/X11/X11/Xlib.h
util.o: /usr/include/sys/types.h /usr/include/linux/types.h
util.o: /usr/include/linux/posix_types.h /usr/include/asm/posix_types.h
util.o: /usr/include/asm/types.h /usr/include/sys/bitypes.h
util.o: /usr/include/X11/X11/X11/Xfuncproto.h
util.o: /usr/include/X11/X11/X11/Xosdefs.h
util.o: /usr/lib/gcc-lib/i486-linux/2.7.2/include/stddef.h
util.o: /usr/include/X11/cursorfont.h /usr/include/Xm/Xm.h
util.o: /usr/include/X11/Intrinsic.h /usr/include/X11/X11/Xutil.h
util.o: /usr/include/X11/X11/Xresource.h /usr/include/string.h
util.o: /usr/include/features.h /usr/include/sys/cdefs.h
util.o: /usr/include/X11/X11/Core.h /usr/include/X11/X11/Composite.h
util.o: /usr/include/X11/X11/Constraint.h /usr/include/X11/X11/Object.h
util.o: /usr/include/X11/X11/RectObj.h /usr/include/X11/Shell.h
util.o: /usr/include/X11/X11/SM/SMlib.h /usr/include/X11/SM/SM.h
util.o: /usr/include/X11/ICE/ICElib.h /usr/include/X11/ICE/ICE.h
util.o: /usr/include/X11/Xatom.h /usr/include/Xm/XmStrDefs.h
util.o: /usr/include/X11/StringDefs.h /usr/include/Xm/VirtKeys.h
util.o: /usr/include/Xm/Transfer.h /usr/include/Xm/DragDrop.h
util.o: /usr/include/Xm/DragC.h /usr/include/Xm/Display.h
util.o: /usr/include/Xm/DropSMgr.h /usr/include/Xm/DragIcon.h
util.o: /usr/include/Xm/DropTrans.h /usr/include/Xm/DragOverS.h
util.o: /usr/include/Xm/Primitive.h /usr/include/Xm/Manager.h
util.o: /usr/include/Xm/Gadget.h /usr/include/Xm/TxtPropCv.h
util.o: /usr/include/Xm/VendorS.h /usr/include/Xm/XmIm.h
util.o: /usr/include/Xm/Text.h /usr/include/stdio.h /usr/include/libio.h
util.o: /usr/include/_G_config.h /usr/include/Xm/PanedW.h
util.o: /usr/include/Xm/Form.h /usr/include/Xm/BulletinB.h
util.o: /usr/include/Xm/PushB.h /usr/include/Xm/DialogS.h
util.o: /usr/include/Xm/RowColumn.h /usr/include/Xm/MessageB.h
util.o: ../Xbae-4.6.2-linas/Xbae/Matrix.h
util.o: ../Xbae-4.6.2-linas/Xbae/Xbae/patchlevel.h ../include/util.h
util.o: /usr/include/errno.h /usr/include/linux/errno.h
util.o: /usr/include/asm/errno.h
XferBox.o: /usr/include/Xm/Xm.h /usr/include/X11/Intrinsic.h
XferBox.o: /usr/include/X11/X11/Xlib.h /usr/include/sys/types.h
XferBox.o: /usr/include/linux/types.h /usr/include/linux/posix_types.h
XferBox.o: /usr/include/asm/posix_types.h /usr/include/asm/types.h
XferBox.o: /usr/include/sys/bitypes.h /usr/include/X11/X11/X11/X.h
XferBox.o: /usr/include/X11/X11/X11/Xfuncproto.h
XferBox.o: /usr/include/X11/X11/X11/Xosdefs.h
XferBox.o: /usr/lib/gcc-lib/i486-linux/2.7.2/include/stddef.h
XferBox.o: /usr/include/X11/X11/Xutil.h /usr/include/X11/X11/Xresource.h
XferBox.o: /usr/include/string.h /usr/include/features.h
XferBox.o: /usr/include/sys/cdefs.h /usr/include/X11/X11/Core.h
XferBox.o: /usr/include/X11/X11/Composite.h /usr/include/X11/X11/Constraint.h
XferBox.o: /usr/include/X11/X11/Object.h /usr/include/X11/X11/RectObj.h
XferBox.o: /usr/include/X11/Shell.h /usr/include/X11/X11/SM/SMlib.h
XferBox.o: /usr/include/X11/SM/SM.h /usr/include/X11/ICE/ICElib.h
XferBox.o: /usr/include/X11/ICE/ICE.h /usr/include/X11/Xatom.h
XferBox.o: /usr/include/Xm/XmStrDefs.h /usr/include/X11/StringDefs.h
XferBox.o: /usr/include/Xm/VirtKeys.h /usr/include/Xm/Transfer.h
XferBox.o: /usr/include/Xm/DragDrop.h /usr/include/Xm/DragC.h
XferBox.o: /usr/include/Xm/Display.h /usr/include/Xm/DropSMgr.h
XferBox.o: /usr/include/Xm/DragIcon.h /usr/include/Xm/DropTrans.h
XferBox.o: /usr/include/Xm/DragOverS.h /usr/include/Xm/Primitive.h
XferBox.o: /usr/include/Xm/Manager.h /usr/include/Xm/Gadget.h
XferBox.o: /usr/include/Xm/TxtPropCv.h /usr/include/Xm/VendorS.h
XferBox.o: /usr/include/Xm/XmIm.h ../include/Data.h ../include/Account.h
XferBox.o: ../include/QuickFill.h ../include/Transaction.h ../include/date.h
XferBox.o: ../include/PopBox.h ../include/util.h /usr/include/stdio.h
XferBox.o: /usr/include/libio.h /usr/include/_G_config.h /usr/include/errno.h
XferBox.o: /usr/include/linux/errno.h /usr/include/asm/errno.h
XferWindow.o: /usr/include/Xm/Xm.h /usr/include/X11/Intrinsic.h
XferWindow.o: /usr/include/X11/X11/Xlib.h /usr/include/sys/types.h
XferWindow.o: /usr/include/linux/types.h /usr/include/linux/posix_types.h
XferWindow.o: /usr/include/asm/posix_types.h /usr/include/asm/types.h
XferWindow.o: /usr/include/sys/bitypes.h /usr/include/X11/X11/X11/X.h
XferWindow.o: /usr/include/X11/X11/X11/Xfuncproto.h
XferWindow.o: /usr/include/X11/X11/X11/Xosdefs.h
XferWindow.o: /usr/lib/gcc-lib/i486-linux/2.7.2/include/stddef.h
XferWindow.o: /usr/include/X11/X11/Xutil.h /usr/include/X11/X11/Xresource.h
XferWindow.o: /usr/include/string.h /usr/include/features.h
XferWindow.o: /usr/include/sys/cdefs.h /usr/include/X11/X11/Core.h
XferWindow.o: /usr/include/X11/X11/Composite.h
XferWindow.o: /usr/include/X11/X11/Constraint.h /usr/include/X11/X11/Object.h
XferWindow.o: /usr/include/X11/X11/RectObj.h /usr/include/X11/Shell.h
XferWindow.o: /usr/include/X11/X11/SM/SMlib.h /usr/include/X11/SM/SM.h
XferWindow.o: /usr/include/X11/ICE/ICElib.h /usr/include/X11/ICE/ICE.h
XferWindow.o: /usr/include/X11/Xatom.h /usr/include/Xm/XmStrDefs.h
XferWindow.o: /usr/include/X11/StringDefs.h /usr/include/Xm/VirtKeys.h
XferWindow.o: /usr/include/Xm/Transfer.h /usr/include/Xm/DragDrop.h
XferWindow.o: /usr/include/Xm/DragC.h /usr/include/Xm/Display.h
XferWindow.o: /usr/include/Xm/DropSMgr.h /usr/include/Xm/DragIcon.h
XferWindow.o: /usr/include/Xm/DropTrans.h /usr/include/Xm/DragOverS.h
XferWindow.o: /usr/include/Xm/Primitive.h /usr/include/Xm/Manager.h
XferWindow.o: /usr/include/Xm/Gadget.h /usr/include/Xm/TxtPropCv.h
XferWindow.o: /usr/include/Xm/VendorS.h /usr/include/Xm/XmIm.h
XferWindow.o: /usr/include/Xm/DialogS.h /usr/include/Xm/Form.h
XferWindow.o: /usr/include/Xm/BulletinB.h /usr/include/Xm/LabelGP.h
XferWindow.o: /usr/include/Xm/LabelG.h /usr/include/Xm/GadgetP.h
XferWindow.o: /usr/include/Xm/XmP.h /usr/include/X11/IntrinsicP.h
XferWindow.o: /usr/include/X11/X11/CoreP.h /usr/include/X11/X11/CompositeP.h
XferWindow.o: /usr/include/X11/X11/ConstrainP.h
XferWindow.o: /usr/include/X11/X11/ObjectP.h /usr/include/X11/X11/RectObjP.h
XferWindow.o: /usr/include/Xm/ColorP.h /usr/include/Xm/AccColorT.h
XferWindow.o: /usr/include/Xm/BaseClassP.h /usr/include/Xm/ExtObjectP.h
XferWindow.o: /usr/include/Xm/PushB.h /usr/include/Xm/Text.h
XferWindow.o: /usr/include/stdio.h /usr/include/libio.h
XferWindow.o: /usr/include/_G_config.h ../include/Account.h
XferWindow.o: ../include/QuickFill.h ../include/Transaction.h
XferWindow.o: ../include/date.h ../include/BuildMenu.h
XferWindow.o: /usr/include/Xm/Separator.h ../include/Data.h ../include/main.h
XferWindow.o: ../include/util.h /usr/include/errno.h
XferWindow.o: /usr/include/linux/errno.h /usr/include/asm/errno.h

View File

@@ -33,12 +33,13 @@
* *
\********************************************************************/
#include <Xm/Xm.h>
#include <fcntl.h>
#include "main.h"
#include "util.h"
#include <Xm/Xm.h>
#include "Account.h"
#include "Data.h"
#include "main.h"
#include "util.h"
#define PERMS 0666
#define WFLAGS (O_WRONLY | O_CREAT | O_TRUNC)
@@ -356,19 +357,19 @@ char * xaccReadQIFTransaction (int fd, Transaction *trans)
* Args: datafile - the file to load the data from *
* Return: the struct with the program data in it *
\********************************************************************/
Data *
AccountGroup *
xaccReadQIFData( char *datafile )
{
int fd;
int skip = 0;
char * qifline;
Data *data = mallocData();
AccountGroup *grp = mallocAccountGroup();
fd = open( datafile, RFLAGS, 0 );
if( fd == -1 )
{
ERROR();
freeData(data);
freeAccountGroup(grp);
return NULL;
}
@@ -378,7 +379,7 @@ xaccReadQIFData( char *datafile )
{
ERROR();
close(fd);
freeData(data);
freeAccountGroup(grp);
return NULL;
}
@@ -428,7 +429,7 @@ xaccReadQIFData( char *datafile )
freeAccount(acc);
continue;
}
insertAccount( data, acc );
insertAccount( grp, acc );
/* spin until start of transaction records */
/* in theory, in a perfect file, the transaction data follows immediately */
@@ -467,7 +468,7 @@ xaccReadQIFData( char *datafile )
}
close(fd);
return data;
return grp;
}
/* ========================== END OF FILE ======================= */

View File

@@ -23,18 +23,18 @@
\********************************************************************/
#include <Xm/Xm.h>
#include <Xm/RowColumn.h>
#include <Xm/Form.h>
#include <Xm/Text.h>
#include <Xm/DialogS.h>
#include <Xm/PanedW.h>
#include <Xm/Form.h>
#include <Xm/Frame.h>
#include <Xm/PushB.h>
#include <Xm/LabelGP.h>
#include <Xm/PanedW.h>
#include <Xm/PushB.h>
#include <Xm/RowColumn.h>
#include <Xm/Text.h>
#include <Xbae/Matrix.h>
#include "Data.h"
#include "Account.h"
#include "Data.h"
#include "RegWindow.h"
#include "MainWindow.h"
#include "main.h"
@@ -61,7 +61,6 @@ void recnOkCB( Widget mw, XtPointer cd, XtPointer cb );
void recnCB( Widget mw, XtPointer cd, XtPointer cb );
/** GLOBALS *********************************************************/
extern Data *data;
extern XtAppContext app;
/********************************************************************/
@@ -761,6 +760,7 @@ recnOkCB( Widget mw, XtPointer cd, XtPointer cb )
int nrows,i;
Transaction *trans;
RecnWindow *recnData = (RecnWindow *)cd;
AccountGroup *grp = topgroup; /* hack alert -- should pass as arg .. */
/* Update the debit transactions: */
XtVaGetValues( recnData->debit, XmNrows, &nrows, NULL );
@@ -772,7 +772,7 @@ recnOkCB( Widget mw, XtPointer cd, XtPointer cb )
trans = (Transaction *)XbaeMatrixGetRowUserData( recnData->debit, i );
trans->reconciled = YREC;
/* mark the datafile as needing to be saved: */
data->saved = False;
grp->saved = False;
}
}
@@ -786,7 +786,7 @@ recnOkCB( Widget mw, XtPointer cd, XtPointer cb )
trans = (Transaction *)XbaeMatrixGetRowUserData( recnData->credit, i );
trans->reconciled = YREC;
/* mark the datafile as needing to be saved: */
data->saved = False;
grp->saved = False;
}
}

View File

@@ -84,7 +84,6 @@ void dateCellFormat( Widget mw, XbaeMatrixModifyVerifyCallbackStruct *mvcbs, int
/** GLOBALS *********************************************************/
extern Widget toplevel;
extern Data *data;
/* The XrmQuarks are used by regCB to figure out the kind of traversal
* that is going on */
@@ -264,6 +263,9 @@ regRefresh( RegWindow *regData )
case ASSET:
case CREDIT:
case LIABILITY:
case INCOME:
case EXPENSE:
case EQUITY:
themount = xaccGetAmount (acc, trans);
if( 0.0 > themount )
{
@@ -295,7 +297,7 @@ regRefresh( RegWindow *regData )
}
break;
default:
fprintf( stderr, "Ineternal Error: Account type: %d is unknown!\n", acc->type);
fprintf( stderr, "Internal Error: Account type: %d is unknown!\n", acc->type);
}
newData[row+1][PAY_CELL_C] = XtNewString("");
@@ -313,6 +315,9 @@ regRefresh( RegWindow *regData )
case ASSET:
case CREDIT:
case LIABILITY:
case INCOME:
case EXPENSE:
case EQUITY:
break;
case PORTFOLIO:
case MUTUAL:
@@ -331,7 +336,7 @@ regRefresh( RegWindow *regData )
break;
default:
fprintf( stderr, "Ineternal Error: Account type: %d is unknown!\n", acc->type);
fprintf( stderr, "Internal Error: Account type: %d is unknown!\n", acc->type);
}
}
@@ -409,6 +414,16 @@ regRecalculateBalance( RegWindow *regData )
dclearedBalance = xaccGetClearedBalance (acc, trans);
share_balance = xaccGetShareBalance (acc, trans);
/* for income and expense acounts, we have to reverse
* the meaning of balance, since, in a cual entry
* system, income will show up as a credit to a
* bank account, and a debit to the income account.
* Thus, positive and negative are interchanged */
if( (EXPENSE == acc->type) ||
(INCOME == acc->type) ) {
dbalance = - dbalance;
}
if( reg != NULL )
{
#ifdef USE_NO_COLOR
@@ -563,14 +578,14 @@ regSaveTransaction( RegWindow *regData, int position )
if (MOD_NONE == regData->changed) return;
/* Be sure to prompt the user to save to disk after changes are made! */
acc->data->saved = False;
acc->parent->saved = False;
trans = getTransaction( acc, position );
if( trans == NULL )
{
/* This must be a new transaction */
DEBUG("New Transaction");
DEBUG("New Transaction\n");
trans = mallocTransaction();
trans->credit = (struct _account *) acc;
@@ -585,7 +600,7 @@ regSaveTransaction( RegWindow *regData, int position )
}
if( regData->changed & MOD_NUM )
{
DEBUG("MOD_NUM");
DEBUG("MOD_NUM\n");
/* ...the transaction number (String)... */
XtFree( trans->num );
trans->num = XtNewString( XbaeMatrixGetCell(regData->reg,row,NUM_CELL_C) );
@@ -596,7 +611,7 @@ regSaveTransaction( RegWindow *regData, int position )
/* ... the transfer ... */
char * name;
Account *xfer_acct = xaccGetOtherAccount (acc, trans);
DEBUG("MOD_XFER");
DEBUG("MOD_XFER\n");
if (xfer_acct) {
/* remove the transaction from wherever it used to be */
@@ -621,7 +636,7 @@ regSaveTransaction( RegWindow *regData, int position )
if( regData->changed & MOD_DESC )
{
DEBUG("MOD_DESC");
DEBUG("MOD_DESC\n");
/* ... the description... */
XtFree( trans->description );
trans->description =
@@ -632,7 +647,7 @@ regSaveTransaction( RegWindow *regData, int position )
{
String tmp;
String memo = NULL;
DEBUG("MOD_MEMO");
DEBUG("MOD_MEMO\n");
/* ... the memo ... */
XtFree( trans->memo );
tmp = XbaeMatrixGetCell(regData->reg,row+MEMO_CELL_R,MEMO_CELL_C);
@@ -644,7 +659,7 @@ regSaveTransaction( RegWindow *regData, int position )
((MUTUAL == acc->type) || (PORTFOLIO==acc->type)) )
{
String actn = NULL;
DEBUG("MOD_ACTN");
DEBUG("MOD_ACTN\n");
/* ... the action ... */
XtFree( trans->action );
actn = XbaeMatrixGetCell(regData->reg,row,ACTN_CELL_C);
@@ -653,7 +668,7 @@ regSaveTransaction( RegWindow *regData, int position )
if( regData->changed & MOD_RECN )
{
DEBUG("MOD_RECN");
DEBUG("MOD_RECN\n");
/* ...the reconciled flag (char)... */
trans->reconciled = (XbaeMatrixGetCell(regData->reg,row,RECN_CELL_C))[0];
}
@@ -664,7 +679,7 @@ regSaveTransaction( RegWindow *regData, int position )
float val=0.0; /* must be float for sscanf to work */
double themount = 0.0;
DEBUG("MOD_AMNT");
DEBUG("MOD_AMNT\n");
/* ...and the amounts */
amount = XbaeMatrixGetCell(regData->reg,row,DEP_CELL_C);
sscanf( amount, "%f", &val );
@@ -700,7 +715,7 @@ regSaveTransaction( RegWindow *regData, int position )
String price;
float val=0.0; /* must be float for sscanf to work */
DEBUG("MOD_PRIC");
DEBUG("MOD_PRIC\n");
/* ...the price flag ... */
price = XbaeMatrixGetCell(regData->reg,row,PRIC_CELL_C);
@@ -715,7 +730,7 @@ regSaveTransaction( RegWindow *regData, int position )
{
Boolean outOfOrder = False;
DEBUG("MOD_DATE");
DEBUG("MOD_DATE\n");
/* read in the date stuff... */
sscanf( XbaeMatrixGetCell(regData->reg,row+DATE_CELL_R,DATE_CELL_C),"%d/%d",
&(trans->date.month),
@@ -804,6 +819,7 @@ regSaveTransaction( RegWindow *regData, int position )
RegWindow *
regWindow( Widget parent, Account *acc )
{
AccountGroup *grp;
Transaction *trans;
RegWindow *regData;
Widget menubar, pane, buttonform, frame, reg, widget;
@@ -954,6 +970,9 @@ regWindow( Widget parent, Account *acc )
case ASSET:
case CREDIT:
case LIABILITY:
case INCOME:
case EXPENSE:
case EQUITY:
acc->columnLocation [DATE_COL_ID] = 0;
acc->columnLocation [NUM_COL_ID] = 1;
acc->columnLocation [DESC_COL_ID] = 2;
@@ -979,7 +998,7 @@ regWindow( Widget parent, Account *acc )
acc -> numCols = 10;
break;
default:
fprintf( stderr, "Ineternal Error: Account type: %d is unknown!\n", acc->type);
fprintf( stderr, "Internal Error: Account type: %d is unknown!\n", acc->type);
}
/* ----------------------------------- */
@@ -1000,6 +1019,9 @@ regWindow( Widget parent, Account *acc )
case ASSET:
case CREDIT:
case LIABILITY:
case INCOME:
case EXPENSE:
case EQUITY:
break;
case PORTFOLIO:
case MUTUAL:
@@ -1027,6 +1049,9 @@ regWindow( Widget parent, Account *acc )
case ASSET:
case CREDIT:
case LIABILITY:
case INCOME:
case EXPENSE:
case EQUITY:
break;
case PORTFOLIO:
@@ -1056,6 +1081,9 @@ regWindow( Widget parent, Account *acc )
case ASSET:
case CREDIT:
case LIABILITY:
case INCOME:
case EXPENSE:
case EQUITY:
break;
case PORTFOLIO:
case MUTUAL:
@@ -1087,6 +1115,18 @@ regWindow( Widget parent, Account *acc )
acc -> rows[0][PAY_CELL_C] = "Increase";
acc -> rows[0][DEP_CELL_C] = "Decrease";
break;
case INCOME:
acc -> rows[0][PAY_CELL_C] = "Income";
acc -> rows[0][DEP_CELL_C] = "Charge";
break;
case EXPENSE:
acc -> rows[0][PAY_CELL_C] = "Rebate";
acc -> rows[0][DEP_CELL_C] = "Expense";
break;
case EQUITY:
acc -> rows[0][PAY_CELL_C] = "Surplus";
acc -> rows[0][DEP_CELL_C] = "Deficit";
break;
case PORTFOLIO:
case MUTUAL:
acc -> rows[0][PAY_CELL_C] = "Sold";
@@ -1126,16 +1166,18 @@ regWindow( Widget parent, Account *acc )
XtAddCallback( reg, XmNmodifyVerifyCallback, regCB, (XtPointer)regData );
XtAddCallback( reg, XmNtraverseCellCallback, regCB, (XtPointer)regData );
XtManageChild(reg);
XtManageChild(frame);
XtManageChild (reg);
XtManageChild (frame);
XtManageChild (pane);
/* create action box for the first time */
regData->actbox = actionBox (reg);
/* create the xfer account box for the first time */
regData->xferbox = xferBox (reg, data);
/* but first, find the topmost group */
grp = xaccGetRootGroupOfAcct (acc);
regData->xferbox = xferBox (reg, grp);
/******************************************************************\
* The button area... also contains balance fields *
@@ -1198,7 +1240,7 @@ regWindow( Widget parent, Account *acc )
position+=2;
/* Fix button area of the pane to its current size, and not let
/* Fix button area of the buttonform to its current size, and not let
* it resize. */
{
Dimension h;
@@ -1289,7 +1331,7 @@ closeRegWindow( Widget mw, XtPointer cd, XtPointer cb )
_free(regData);
acc->regData = NULL;
DEBUG("closed RegWindow");
DEBUG("closed RegWindow\n");
}
/********************************************************************\
@@ -1362,7 +1404,7 @@ deleteCB( Widget mw, XtPointer cd, XtPointer cb )
trans = getTransaction (acc, regData->lastTrans );
if( NULL != trans)
{
char *msg = "Are you sure you want\nto delete this transaction?";
char *msg = TRANS_DEL_MSG;
if( verifyBox( toplevel, msg ) )
{
@@ -1430,13 +1472,13 @@ regCB( Widget mw, XtPointer cd, XtPointer cb )
switch( cbs->reason )
{
case XbaeEnterCellReason: {
DEBUG("XbaeEnterCellReason");
DEBUG("XbaeEnterCellReason\n");
DEBUGCMD(printf(" row = %d\n col = %d\n",row,col));
/* figure out if we are editing a different transaction... if we
* are, then we need to save the transaction we left */
if( regData->lastTrans != (row-1)/2 )
{
DEBUG("Save Transaction");
DEBUG("Save Transaction\n");
DEBUGCMD(printf(" lastTrans = %d\n currTrans = %d\n",
regData->lastTrans, (row+1)/2 ));
@@ -1502,7 +1544,7 @@ regCB( Widget mw, XtPointer cd, XtPointer cb )
}
case XbaeModifyVerifyReason:
DEBUG("XbaeModifyVerifyReason");
DEBUG("XbaeModifyVerifyReason\n");
{
XbaeMatrixModifyVerifyCallbackStruct *mvcbs =
(XbaeMatrixModifyVerifyCallbackStruct *)cb;
@@ -1543,7 +1585,7 @@ regCB( Widget mw, XtPointer cd, XtPointer cb )
{
int i;
regData->insert = mvcbs->verify->currInsert;
DEBUG("resyncing quickfill!");
DEBUG("resyncing quickfill!\n");
DEBUGCMD(printf(" insert = %d\n currInsert = %d\n",
regData->insert,
mvcbs->verify->currInsert ));
@@ -1679,7 +1721,7 @@ regCB( Widget mw, XtPointer cd, XtPointer cb )
break;
case XbaeTraverseCellReason:
DEBUG("XbaeTraverseCellReason");
DEBUG("XbaeTraverseCellReason\n");
/* This ensure that whenever the user hits TAB, they go to the
* next valid cell. Also, if regData->qf and regData->qf->trans
* aren't NULL, then fill the field we are entering with the
@@ -1763,7 +1805,7 @@ regCB( Widget mw, XtPointer cd, XtPointer cb )
}
break;
default:
DEBUG("We shouldn't get here!");
PERR("regDB(): We shouldn't get here!");
}
}
@@ -1833,42 +1875,42 @@ dateCellFormat( Widget mw, XbaeMatrixModifyVerifyCallbackStruct *mvcbs, int do_y
case '+':
case '=': /* '+' without the shift! */
/* next day */
DEBUG("next day");
DEBUG("next day\n");
adjustDay( &date, 1 );
mvcbs->verify->doit = False;
changed = True;
break;
case '-':
/* prev day */
DEBUG("prev day");
DEBUG("prev day\n");
adjustDay( &date, -1 );
mvcbs->verify->doit = False;
changed = True;
break;
case 't':
/* today */
DEBUG("today");
DEBUG("today\n");
todaysDate( &date );
mvcbs->verify->doit = False;
changed = True;
break;
case 'm':
/* beginning of month */
DEBUG("beginning of month");
DEBUG("beginning of month\n");
date.day = 1;
mvcbs->verify->doit = False;
changed = True;
break;
case 'h':
/* end of month */
DEBUG("end of month");
DEBUG("end of month\n");
date.day = daysInMonth( date.month );
mvcbs->verify->doit = False;
changed = True;
break;
case 'y':
/* beginning of year */
DEBUG("beginning of year");
DEBUG("beginning of year\n");
date.day = 1;
date.month = 1;
mvcbs->verify->doit = False;
@@ -1876,7 +1918,7 @@ dateCellFormat( Widget mw, XbaeMatrixModifyVerifyCallbackStruct *mvcbs, int do_y
break;
case 'r':
/* end of year */
DEBUG("end of year");
DEBUG("end of year\n");
date.day = 31;
date.month = 12;
mvcbs->verify->doit = False;
@@ -1884,14 +1926,14 @@ dateCellFormat( Widget mw, XbaeMatrixModifyVerifyCallbackStruct *mvcbs, int do_y
break;
case ']':
/* next month */
DEBUG("next month");
DEBUG("next month\n");
adjustMonth( &date, +1 );
mvcbs->verify->doit = False;
changed = True;
break;
case '[':
/* prev month */
DEBUG("prev month");
DEBUG("prev month\n");
adjustMonth( &date, -1 );
mvcbs->verify->doit = False;
changed = True;

View File

@@ -83,17 +83,40 @@ mallocTransaction( void )
void
freeTransaction( Transaction *trans )
{
if( trans != NULL ) {
if (!trans) return;
XtFree(trans->num);
XtFree(trans->description);
XtFree(trans->memo);
XtFree(trans->action);
/* free a transaction only if it is not claimed
* by any accounts. */
if (trans->debit) return;
if (trans->credit) return;
initTransaction (trans); /* just in case someone looks up freed memory ... */
_free(trans);
}
}
XtFree(trans->num);
XtFree(trans->description);
XtFree(trans->memo);
XtFree(trans->action);
/* just in case someone looks up freed memory ... */
trans->num = 0x0;
trans->description = 0x0;
trans->memo = 0x0;
trans->action = 0x0;
trans->catagory = 0;
trans->reconciled = NREC;
trans->damount = 0.0;
trans->share_price = 1.0;
trans->credit_balance = 0.0;
trans->credit_cleared_balance = 0.0;
trans->debit_balance = 0.0;
trans->debit_cleared_balance = 0.0;
trans->date.year = 1900;
trans->date.month = 1;
trans->date.day = 1;
trans->write_flag = 0;
_free(trans);
}
/************************ END OF ************************************\
\************************* FILE *************************************/

View File

@@ -32,23 +32,35 @@
* Return: PopBox - the xfer GUI structure *
\********************************************************************/
PopBox *
xferBox (Widget parent, Data *dayta)
static void
XferBoxTraverse (PopBox *popGUI, AccountGroup *grp)
{
PopBox *popGUI;
Account * acc;
int n;
popGUI = popBox (parent);
if (!grp) return;
/* build the xfer menu out of account names */
/* traverse sub-accounts ecursively */
n = 0;
acc = getAccount (dayta, n);
acc = getAccount (grp, n);
while (acc) {
AddPopBoxMenuItem (popGUI, acc->accountName);
XferBoxTraverse (popGUI, acc->children);
n++;
acc = getAccount (dayta, n);
acc = getAccount (grp, n);
}
}
PopBox *
xferBox (Widget parent, AccountGroup *grp)
{
PopBox *popGUI;
Account * acc;
popGUI = popBox (parent);
XferBoxTraverse (popGUI, grp);
return popGUI;
}

View File

@@ -27,18 +27,17 @@
#include <Xm/Xm.h>
#include <Xm/DialogS.h>
#include <Xm/Form.h>
#include <Xm/LabelGP.h>
#include <Xm/LabelG.h>
#include <Xm/PushB.h>
#include <Xm/Text.h>
#include <string.h>
#include "BuildMenu.h"
#include "Account.h"
#include "BuildMenu.h"
#include "Data.h"
#include "main.h"
#include "util.h"
extern Widget toplevel;
typedef struct _menuData
{
@@ -60,7 +59,7 @@ typedef struct _xferwindow
} XferWindow;
/** GLOBALS *********************************************************/
extern Data *data;
extern Widget toplevel;
/** PROTOTYPES ******************************************************/
void closeXferWindow( Widget mw, XtPointer cd, XtPointer cb );
@@ -73,7 +72,7 @@ void xferCB( Widget mw, XtPointer cd, XtPointer cb );
* *
* Args: parent - the parent of the window to be created *
* Return: none *
* Global: data - the accounts, and stuff... *
* Global: topgroup - the accounts, and stuff... *
\********************************************************************/
void
xferWindow( Widget parent )
@@ -85,11 +84,10 @@ xferWindow( Widget parent )
XferWindow *xferData;
int position,i;
int initial = 0;
AccountGroup *grp = topgroup; /* hack alert -- should be pased as arg */
if (1 >= (data->numAcc)) {
errorBox (toplevel,
"There must be at least two accounts\n\
created before you can transfer funds.\n");
if (1 >= (grp->numAcc)) {
errorBox (toplevel, XFER_NSF_MSG);
return;
}
@@ -225,7 +223,7 @@ created before you can transfer funds.\n");
* The popup menus that let the user choose the account to *
* transfer to and the account to transfer from *
\******************************************************************/
accountMenu = (MenuItem *)_malloc((data->numAcc+1)*sizeof(MenuItem));
accountMenu = (MenuItem *)_malloc((grp->numAcc+1)*sizeof(MenuItem));
/* We have to keep track of the menuData stuff so we can free this
* memory when the transfer window is closed... the even slots in
@@ -233,15 +231,15 @@ created before you can transfer funds.\n");
* used by the "To" menu. (The even/odd way was a simple way to
* still use i as a index to the array... it makes sense to me,
* at least) */
xferData->menuData = (MenuData **)_malloc(2*data->numAcc*sizeof(MenuData *));
xferData->numMenuData = 2 * data->numAcc;
xferData->menuData = (MenuData **)_malloc(2*grp->numAcc*sizeof(MenuData *));
xferData->numMenuData = 2 * grp->numAcc;
for( i=0; i<xferData->numMenuData; i++ )
xferData->menuData[i] = NULL;
for( i=0; i<data->numAcc; i++ )
for( i=0; i<grp->numAcc; i++ )
{
Account *acc = getAccount( data, i );
Account *acc = getAccount( grp, i );
/* This account menu uses the even menuData slots (ie (2*i) ) */
xferData->menuData[2*i] = (MenuData *)_malloc(sizeof(MenuData));
@@ -272,9 +270,9 @@ created before you can transfer funds.\n");
XtManageChild(widget);
for( i=0; i<data->numAcc; i++ )
for( i=0; i<grp->numAcc; i++ )
{
Account *acc = getAccount( data, i );
Account *acc = getAccount( grp, i );
/* This account menu uses the odd menuData slots (ie (2*i)+1 ) */
xferData->menuData[2*i+1] = (MenuData *)_malloc(sizeof(MenuData));
@@ -395,7 +393,7 @@ closeXferWindow( Widget mw, XtPointer cd, XtPointer cb )
_free(xferData);
DEBUG("close XferWindow");
DEBUG("close XferWindow\n");
}
/********************************************************************\
@@ -423,7 +421,7 @@ menuCB( Widget mw, XtPointer cd, XtPointer cb )
* the XfewWindow *
* cb - *
* Return: none *
* Global: data - the data from the datafile *
* Global: topgroup - the topgroup of accounts *
\********************************************************************/
void
xferCB( Widget mw, XtPointer cd, XtPointer cb )
@@ -433,14 +431,15 @@ xferCB( Widget mw, XtPointer cd, XtPointer cb )
Account *acc;
String str;
float val=0.0;
AccountGroup *grp = topgroup; /* hack alert -- should pass as arg */
/* silently reject transfers into-out-of the same account */
if (xferData->from == xferData->to) {
errorBox (toplevel, "The \"From\" and \"To\" accounts\n must be different!\n");
errorBox (toplevel, XFER_DIFF_MSG);
return;
}
data->saved = False;
grp->saved = False;
/* a double-entry transfer -- just one record, two accounts */
trans = mallocTransaction();
@@ -461,11 +460,11 @@ xferCB( Widget mw, XtPointer cd, XtPointer cb )
trans->reconciled = NREC;
/* make note of which accounts this was transfered from & to */
trans->debit = (struct _account *) getAccount(data,xferData->from);
trans->credit = (struct _account *) getAccount(data,xferData->to);
trans->debit = (struct _account *) getAccount(grp,xferData->from);
trans->credit = (struct _account *) getAccount(grp,xferData->to);
/* insert transaction into from acount */
acc = getAccount(data,xferData->from);
acc = getAccount(grp,xferData->from);
insertTransaction( acc, trans );
/* Refresh the "from" account register window */
@@ -474,7 +473,7 @@ xferCB( Widget mw, XtPointer cd, XtPointer cb )
recnRefresh(acc->recnData);
/* insert transaction into to acount */
acc = getAccount(data,xferData->to);
acc = getAccount(grp,xferData->to);
insertTransaction( acc, trans );
/* Refresh the "to" account register window */

View File

@@ -23,24 +23,25 @@
\********************************************************************/
#include <Xm/Xm.h>
#include "BuildMenu.h"
#include "RegWindow.h"
#include "FileIO.h"
#include "Data.h"
#include "FileBox.h"
#include "util.h"
#include "FileIO.h"
#include "main.h"
#include "RegWindow.h"
#include "util.h"
/** PROTOTYPES ******************************************************/
/** GLOBALS *********************************************************/
Data *data = NULL;
char *datafile;
Widget toplevel;
Boolean realized=False; /* Has the toplevel been realized? */
char *datafile = NULL;
Widget toplevel = 0;
Boolean realized = False; /* Has the toplevel been realized? */
XtAppContext app;
/* The names of the different types of accounts. For resource
* specification */
* specification. Must match the enums in Account.h */
String accRes[] ={
"bank",
"cash",
@@ -48,7 +49,10 @@ String accRes[] ={
"credit",
"liability",
"portfolio",
"mutual"
"mutual",
"income",
"expense",
"equity"
};
/** FALLBACK RESOURCES **********************************************/
@@ -64,14 +68,18 @@ String fbRes[] = {
/* MenuBar stuff: */
"*menubar*marginHeight: 1",
"*menubar*marginWidth: 1",
/* Register window account type specific stuff: */
"*regbank.oddRowBackground: #ffffaa",
"*regbank.oddRowBackground: #aaccff",
"*regcash.oddRowBackground: #ccffcc",
"*regasset.oddRowBackground: #ccffcc",
"*regcredit.oddRowBackground: #ccccff",
"*regasset.oddRowBackground: #aaffcc",
"*regcredit.oddRowBackground: #ffffaa",
"*regliability.oddRowBackground: #ffcccc",
"*regportfolio.oddRowBackground: grey",
"*regmutual.oddRowBackground: grey",
"*regportfolio.oddRowBackground: #ccffff",
"*regmutual.oddRowBackground: #ccffff",
"*regincome.oddRowBackground: #aaccff",
"*regexpense.oddRowBackground: #ffcccc",
"*regequity.oddRowBackground: #ffffaa",
"*regportfolio.evenRowBackground:grey",
"*regmutual.evenRowBackground: grey",
/* Other register window account stuff: */
@@ -107,7 +115,7 @@ String fbRes[] = {
* Args: argc, the number of command line arguments, and argv, *
* the array of command line args *
* Return: *
* Global: data - the data from the datafile *
* Global: topgroup - the data from the datafile *
* datafile - the name of the user's datafile *
* toplevel - the toplevel widget, for creating new windows *
* app - the XtAppContext *
@@ -123,7 +131,6 @@ main( int argc, char *argv[] )
printf(" coresize = %d\n",_coresize());
DEBUG("Done initializing memory");
#endif
data = NULL;
toplevel = XtVaAppInitialize( &app, "Xacc", NULL, 0,
&argc, argv, fbRes,
@@ -137,13 +144,13 @@ main( int argc, char *argv[] )
datafile = fileBox( toplevel, OPEN );
if( datafile != NULL )
data = readData(datafile); /* load the accounts data from datafile*/
/* data = xaccReadQIFData(datafile); /* load the accounts data from datafile*/
topgroup = readData(datafile); /* load the accounts data from datafile*/
/* topgroup = xaccReadQIFData(datafile); /* load the accounts data from datafile*/
if( data == NULL )
if( NULL == topgroup )
{
data = mallocData(); /* the file could not be found */
data->new = True;
topgroup = mallocAccountGroup(); /* the file could not be found */
topgroup->new = True;
}
/* Make main window */

View File

@@ -39,6 +39,8 @@
#include "util.h"
/** GLOBALS *********************************************************/
int loglevel = 1;
extern XtAppContext app;
extern int realized;
@@ -57,8 +59,9 @@ dfree( void *ptr )
void*
dmalloc( size_t size )
{
char *ptr = (char *)malloc(size);
int i;
char *ptr;
ptr = (char *)malloc(size);
for( i=0; i<size; i++ )
ptr[i] = '.';

View File

@@ -1,6 +1,6 @@
Begin3
Title: xacc -- simple single-user accounting program
Version: 0.9h-stable
Version: 0.9m
Entered-date: 1NOV97
Description: xacc is a program to keep track of your finances. It
offers a simple check-book register style interface.
@@ -31,7 +31,7 @@ Maintained-by: linas@linas.org (Linas Vepstas)
Primary-site: http://www3.hmc.edu/~rclark/xacc/
Alternate-site: http://linas.org/linux/xacc
Alternate-site: sunsite.unc.edu /pub/Linux/apps/financial/accounting/
497kB xacc-0.9h-stable.tar.gz
521kB xacc-0.9m.tar.gz
Platforms: Linux/Unix/X Windows/Lesstif/Motif/Sparc/Intel
Copying-policy: GPL
End