diff --git a/ChangeLog b/ChangeLog index 08ab8e487b..a1ef90c754 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2000-04-05 Dave Peticolas + + * src/register/table-allgui.c: more error checking + + * src/SplitLedger.c: more cleanup. Fix a bug in refreshing a register + in auto-mode where the current transaction has been deleted. + + * src/scm/report/balance-and-pnl.scm: put sub-accouts below their + parent accounts and indent their names. Align the columns better. + Print fully-qualified names. + 2000-04-04 Dave Peticolas * src/register/gnome/gnucash-style.c: update the styles diff --git a/src/SplitLedger.c b/src/SplitLedger.c index 2232d91163..2f77ee6968 100644 --- a/src/SplitLedger.c +++ b/src/SplitLedger.c @@ -175,6 +175,7 @@ static char account_separator = ':'; static SRReverseBalanceCallback reverse_balance = NULL; /* static prototypes */ +static void xaccSRLoadRegEntry (SplitRegister *reg, Split *split); static Transaction * xaccSRGetTrans (SplitRegister *reg, int phys_row, int phys_col); @@ -1681,7 +1682,7 @@ xaccSRSaveRegEntry (SplitRegister *reg, Transaction *new_trans) /* ======================================================== */ static void -xaccSRLoadTransEntry (SplitRegister *reg, Split *split, int do_commit) +xaccSRLoadRegEntry (SplitRegister *reg, Split *split) { SRInfo *info = xaccSRGetInfo(reg); int typo = reg->type & REG_TYPE_MASK; @@ -1691,7 +1692,7 @@ xaccSRLoadTransEntry (SplitRegister *reg, Split *split, int do_commit) /* don't even bother doing a load if there is no current cursor */ if (!(reg->table->current_cursor)) return; - ENTER ("SRLoadTransEntry(): s=%p commit=%d\n", split, do_commit); + ENTER ("SRLoadTransEntry(): s=%p\n", split); if (!split) { /* we interpret a NULL split as a blank split */ @@ -1740,7 +1741,7 @@ xaccSRLoadTransEntry (SplitRegister *reg, Split *split, int do_commit) account = xaccSplitGetAccount(split); if (account == NULL) account = info->default_source_account; - + if (reverse_balance(account)) baln = -baln; } @@ -1829,26 +1830,18 @@ xaccSRLoadTransEntry (SplitRegister *reg, Split *split, int do_commit) reg->table->current_cursor->user_data = (void *) split; /* copy cursor contents into the table */ - if (do_commit) { - xaccCommitCursor (reg->table); - } + xaccCommitCursor (reg->table); LEAVE("SRLoadTransEntry()\n"); } /* ======================================================== */ -void -xaccSRLoadRegEntry (SplitRegister *reg, Split *split) -{ - xaccSRLoadTransEntry (reg, split, GNC_T); -} - -/* ======================================================== */ - -static gncBoolean +static void xaccSRCountRows (SplitRegister *reg, Split **slist, - Transaction *find_trans, Split *find_split) + Transaction *find_trans, Split *find_split, + gncBoolean *ext_found_trans, + gncBoolean *ext_found_split) { SRInfo *info = xaccSRGetInfo(reg); CellBlock *lead_cursor; @@ -1857,6 +1850,7 @@ xaccSRCountRows (SplitRegister *reg, Split **slist, Table *table; gncBoolean found_split = GNC_F; + gncBoolean found_trans = GNC_F; gncBoolean multi_line; gncBoolean dynamic; @@ -1915,7 +1909,7 @@ xaccSRCountRows (SplitRegister *reg, Split **slist, /* do not count the blank split */ if (split != info->blank_split) { Transaction *trans; - int do_expand = 0; + gncBoolean do_expand; /* lets determine where to locate the cursor ... */ if (!found_split) { @@ -1924,12 +1918,14 @@ xaccSRCountRows (SplitRegister *reg, Split **slist, save_cursor_phys_row = num_phys_rows; save_cursor_virt_row = num_virt_rows; found_split = GNC_T; + found_trans = GNC_T; } /* Otherwise, check for a close match. This could happen * if we are collapsing from multi-line to single, e.g. */ else if (xaccSplitGetParent(split) == find_trans) { save_cursor_phys_row = num_phys_rows; save_cursor_virt_row = num_virt_rows; + found_trans = GNC_T; } } @@ -1970,14 +1966,14 @@ xaccSRCountRows (SplitRegister *reg, Split **slist, /* lets determine where to locate the cursor ... */ if (!found_split) { - /* Check to see if we find a perfect match. We have to - * check the transaction in case the split is NULL (blank). - */ + /* Check if we find a perfect match. We have to check + * the transaction in case the split is NULL (blank). */ if ((secondary == find_split) && (trans == find_trans)) { save_cursor_phys_row = num_phys_rows; save_cursor_virt_row = num_virt_rows; found_split = GNC_T; + found_trans = GNC_T; } } @@ -2009,6 +2005,13 @@ xaccSRCountRows (SplitRegister *reg, Split **slist, save_cursor_phys_row = num_phys_rows; save_cursor_virt_row = num_virt_rows; found_split = GNC_T; + found_trans = GNC_T; + } + else if (!found_split && + (xaccSplitGetParent(info->blank_split) == find_trans)) { + save_cursor_phys_row = num_phys_rows; + save_cursor_virt_row = num_virt_rows; + found_trans = GNC_T; } } @@ -2018,6 +2021,7 @@ xaccSRCountRows (SplitRegister *reg, Split **slist, save_cursor_phys_row = num_phys_rows + 1; save_cursor_virt_row = num_virt_rows + 1; found_split = GNC_T; + found_trans = GNC_T; } num_virt_rows += 2; num_phys_rows += reg->trans_cursor->numRows; @@ -2046,7 +2050,10 @@ xaccSRCountRows (SplitRegister *reg, Split **slist, reg->cursor_phys_row = save_cursor_phys_row; reg->cursor_virt_row = save_cursor_virt_row; - return found_split; + if (ext_found_split != NULL) + *ext_found_split = found_split; + if (ext_found_trans != NULL) + *ext_found_trans = found_trans; } /* ======================================================== */ @@ -2065,7 +2072,8 @@ xaccSRLoadRegister (SplitRegister *reg, Split **slist, Table *table; gncBoolean found_pending = GNC_F; - gncBoolean found_split; + gncBoolean found_split = GNC_F; + gncBoolean found_trans = GNC_F; gncBoolean multi_line; gncBoolean dynamic; @@ -2111,7 +2119,9 @@ xaccSRLoadRegister (SplitRegister *reg, Split **slist, save_phys_col = table->num_phys_cols - 1; /* count the number of rows, looking for the place we want to go. */ - found_split = xaccSRCountRows (reg, slist, find_trans, find_split); + xaccSRCountRows (reg, slist, + find_trans, find_split, + &found_trans, &found_split); /* If the current cursor has changed, and the 'current split' * is still among the living, we save the values for later @@ -2125,7 +2135,7 @@ xaccSRLoadRegister (SplitRegister *reg, Split **slist, else reg_buffer = NULL; - /* disable move callback -- we con't want the cascade of + /* disable move callback -- we don't want the cascade of * callbacks while we are fiddling with loading the register */ table->move_cursor = NULL; xaccMoveCursorGUI (table, -1, -1); @@ -2158,7 +2168,7 @@ xaccSRLoadRegister (SplitRegister *reg, Split **slist, /* do not load the blank split */ if (split != info->blank_split) { Transaction *trans; - int do_expand; + gncBoolean do_expand; PINFO ("xaccSRLoadRegister(): " "load trans %d at phys row %d \n", i, phys_row); @@ -2172,6 +2182,10 @@ xaccSRLoadRegister (SplitRegister *reg, Split **slist, trans = xaccSplitGetParent (split); do_expand = do_expand || (trans == find_trans); } + if (dynamic && !found_trans && (vrow == reg->cursor_virt_row)) { + reg->cursor_phys_row = phys_row; + do_expand = GNC_T; + } if (do_expand) { diff --git a/src/gnome/window-reconcile.c b/src/gnome/window-reconcile.c index beaa769b3a..e6c86f13ad 100644 --- a/src/gnome/window-reconcile.c +++ b/src/gnome/window-reconcile.c @@ -14,8 +14,11 @@ * 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. * + * along with this program; if not, contact: * + * * + * Free Software Foundation Voice: +1-617-542-5942 * + * 59 Temple Place - Suite 330 Fax: +1-617-542-2652 * + * Boston, MA 02111-1307, USA gnu@gnu.org * * * * Author: Rob Clark * * Internet: rclark@cs.hmc.edu * @@ -681,122 +684,124 @@ gnc_recn_create_menu_bar(RecnWindow *recnData, GtkWidget *statusbar) GtkWidget *menubar; GtkAccelGroup *accel_group; - GnomeUIInfo reconcile_menu[] = + static GnomeUIInfo reconcile_menu[] = { { GNOME_APP_UI_ITEM, - END_BALN_MENU_E_STR, TOOLTIP_ADJUST_END, - gnc_ui_reconcile_window_change_cb, recnData, NULL, + END_BALN_MENU_E_STR_N, TOOLTIP_ADJUST_END_N, + gnc_ui_reconcile_window_change_cb, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, 0, NULL }, GNOMEUIINFO_SEPARATOR, { GNOME_APP_UI_ITEM, - FINISH_MENU_STR, TOOLTIP_RECN_FINISH, - recnFinishCB, recnData, NULL, + FINISH_MENU_STR_N, TOOLTIP_RECN_FINISH_N, + recnFinishCB, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 'f', GDK_CONTROL_MASK, NULL }, { GNOME_APP_UI_ITEM, - CANCEL_MENU_STR, TOOLTIP_RECN_CANCEL, - recnCancelCB, recnData, NULL, + CANCEL_MENU_STR_N, TOOLTIP_RECN_CANCEL_N, + recnCancelCB, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, 0, NULL }, GNOMEUIINFO_END }; - GnomeUIInfo account_menu[] = + static GnomeUIInfo account_menu[] = { { GNOME_APP_UI_ITEM, - OPEN_ACC_MENU_STR, TOOLTIP_OPEN_ACC, - gnc_recn_open_cb, recnData, NULL, + OPEN_ACC_MENU_STR_N, TOOLTIP_OPEN_ACC_N, + gnc_recn_open_cb, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, 0, NULL }, { GNOME_APP_UI_ITEM, - EDIT_ACC_MENU_STR, TOOLTIP_EDIT_REG, - gnc_recn_edit_account_cb, recnData, NULL, + EDIT_ACC_MENU_STR_N, TOOLTIP_EDIT_REG_N, + gnc_recn_edit_account_cb, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, 0, NULL }, GNOMEUIINFO_SEPARATOR, { GNOME_APP_UI_ITEM, - TRANSFER_MENU_E_STR, TOOLTIP_TRANSFER, - gnc_recn_xfer_cb, recnData, NULL, + TRANSFER_MENU_E_STR_N, TOOLTIP_TRANSFER_N, + gnc_recn_xfer_cb, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, 0, NULL }, { GNOME_APP_UI_ITEM, - ADJ_BALN_MENU_E_STR, TOOLTIP_ADJUST, - gnc_recn_adjust_cb, recnData, NULL, + ADJ_BALN_MENU_E_STR_N, TOOLTIP_ADJUST_N, + gnc_recn_adjust_cb, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, 0, NULL }, GNOMEUIINFO_SEPARATOR, { GNOME_APP_UI_ITEM, - SCRUB_MENU_STR, TOOLTIP_SCRUB_ACCT, - gnc_recn_scrub_cb, recnData, NULL, + SCRUB_MENU_STR_N, TOOLTIP_SCRUB_ACCT_N, + gnc_recn_scrub_cb, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, 0, NULL }, GNOMEUIINFO_END }; - GnomeUIInfo transaction_menu[] = + static GnomeUIInfo transaction_menu[] = { { GNOME_APP_UI_ITEM, - NEW_MENU_STR, TOOLTIP_NEW_TRANS, - gnc_ui_reconcile_window_new_cb, recnData, NULL, + NEW_MENU_STR_N, TOOLTIP_NEW_TRANS_N, + gnc_ui_reconcile_window_new_cb, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 'n', GDK_CONTROL_MASK, NULL }, { GNOME_APP_UI_ITEM, - EDIT_MENU_STR, TOOLTIP_EDIT_TRANS, - gnc_ui_reconcile_window_edit_cb, recnData, NULL, + EDIT_MENU_STR_N, TOOLTIP_EDIT_TRANS_N, + gnc_ui_reconcile_window_edit_cb, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 'e', GDK_CONTROL_MASK, NULL }, { GNOME_APP_UI_ITEM, - DELETE_MENU_STR, TOOLTIP_DEL_TRANS, - gnc_ui_reconcile_window_delete_cb, recnData, NULL, + DELETE_MENU_STR_N, TOOLTIP_DEL_TRANS_N, + gnc_ui_reconcile_window_delete_cb, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 'd', GDK_CONTROL_MASK, NULL }, GNOMEUIINFO_END }; - GnomeUIInfo help_menu[] = + static GnomeUIInfo help_menu[] = { { GNOME_APP_UI_ITEM, - HELP_MENU_STR, TOOLTIP_HELP, - gnc_ui_reconcile_window_help_cb, recnData, NULL, + HELP_MENU_STR_N, TOOLTIP_HELP_N, + gnc_ui_reconcile_window_help_cb, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, 0, NULL }, GNOMEUIINFO_END }; - GnomeUIInfo reconcile_window_menu[] = + static GnomeUIInfo reconcile_window_menu[] = { - GNOMEUIINFO_SUBTREE(RECONCILE_MENU_STR, reconcile_menu), - GNOMEUIINFO_SUBTREE(ACCOUNT_MENU_STR, account_menu), - GNOMEUIINFO_SUBTREE(TRANSACTION_MENU_STR, transaction_menu), + GNOMEUIINFO_SUBTREE(RECONCILE_MENU_STR_N, reconcile_menu), + GNOMEUIINFO_SUBTREE(ACCOUNT_MENU_STR_N, account_menu), + GNOMEUIINFO_SUBTREE(TRANSACTION_MENU_STR_N, transaction_menu), GNOMEUIINFO_MENU_HELP_TREE(help_menu), GNOMEUIINFO_END }; + gnc_fill_menu_with_data(reconcile_window_menu, recnData); + menubar = gtk_menu_bar_new(); accel_group = gtk_accel_group_new(); diff --git a/src/register/table-allgui.c b/src/register/table-allgui.c index 44701ea689..657404552a 100644 --- a/src/register/table-allgui.c +++ b/src/register/table-allgui.c @@ -1,14 +1,3 @@ -/* - * FILE: - * table-allgui.c - * - * FUNCTION: - * Implements the gui-independent parts of the table infrastructure. - * - * HISTORY: - * Copyright (c) 1998,1999,2000 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 * @@ -25,6 +14,17 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * \********************************************************************/ +/* + * FILE: + * table-allgui.c + * + * FUNCTION: + * Implements the gui-independent parts of the table infrastructure. + * + * HISTORY: + * Copyright (c) 1998,1999,2000 Linas Vepstas + */ + #include #include #include @@ -461,7 +461,7 @@ doMoveCursor (Table *table, int new_phys_row, int new_phys_col, * passive again. */ makePassive (table); if (do_move_gui) - xaccRefreshCursorGUI(table, FALSE); + xaccRefreshCursorGUI(table, GNC_F); } /* check for out-of-bounds conditions (which may be deliberate) */ @@ -583,13 +583,17 @@ doMoveCursor (Table *table, int new_phys_row, int new_phys_col, void xaccMoveCursor (Table *table, int new_phys_row, int new_phys_col) { - doMoveCursor (table, new_phys_row, new_phys_col, 0); + if (!table) return; + + doMoveCursor (table, new_phys_row, new_phys_col, 0); } /* same as above, but be sure to deal with GUI elements as well */ void xaccMoveCursorGUI (Table *table, int new_phys_row, int new_phys_col) { - doMoveCursor (table, new_phys_row, new_phys_col, 1); + if (!table) return; + + doMoveCursor (table, new_phys_row, new_phys_col, 1); } /* ==================================================== */ @@ -602,6 +606,8 @@ void xaccCommitCursor (Table *table) int phys_row, phys_col; int phys_row_origin, phys_col_origin; + if (!table) return; + curs = table->current_cursor; if (!curs) return; @@ -661,6 +667,7 @@ xaccRefreshHeader (Table *table) int i,j; CellBlock *arr; + if (!table) return; if (!(table->entries)) return; /* copy header data into entries cache */ @@ -699,7 +706,7 @@ xaccVerifyCursorPosition (Table *table, int phys_row, int phys_col) gncBoolean do_commit = GNC_F; gncBoolean moved_cursor = GNC_F; - if (!table) return FALSE; + if (!table) return GNC_F; /* Someone may be trying to intentionally invalidate the cursor, * in which case the physical addresses could be out of bounds. @@ -759,6 +766,8 @@ xaccGetUserData (Table *table, int phys_row, int phys_col) { int virt_row, virt_col; + if (!table) return NULL; + /* check for out-of-bounds conditions */ if ((0 > phys_row) || (0 > phys_col) || (phys_row >= table->num_phys_rows) || @@ -813,6 +822,8 @@ wrapVerifyCursorPosition (Table *table, int row, int col) const int save_phys_col = table->current_cursor_phys_col; gncBoolean moved_cursor; + if (!table) return; + ENTER("wrapVerifyCursorPosition(): (%d %d) val=%s\n", row,col, table->entries[row][col]); @@ -835,10 +846,12 @@ wrapVerifyCursorPosition (Table *table, int row, int col) void xaccRefreshCursorGUI (Table * table, gncBoolean do_scroll) { - doRefreshCursorGUI (table, table->current_cursor, - table->current_cursor_phys_row, - table->current_cursor_phys_col, - do_scroll); + if (!table) return; + + doRefreshCursorGUI (table, table->current_cursor, + table->current_cursor_phys_row, + table->current_cursor_phys_col, + do_scroll); } /* ==================================================== */ @@ -852,6 +865,8 @@ gnc_register_cell_valid(Table *table, int row, int col, gncBoolean exact_cell) int virt_row, virt_col; CellBlock *arr, *header; + if (!table) return GNC_F; + /* can't edit outside of the physical space */ invalid = (0 > row) || (0 > col) ; invalid = invalid || (row >= table->num_phys_rows); @@ -860,7 +875,7 @@ gnc_register_cell_valid(Table *table, int row, int col, gncBoolean exact_cell) /* In case we're called after table has been destroyed. */ invalid = invalid || (table->handlers == NULL); - if(invalid) return GNC_F; + if (invalid) return GNC_F; /* header rows cannot be modified */ /* hack alert -- assumes that header is first cell */ diff --git a/src/scm/report/balance-and-pnl.scm b/src/scm/report/balance-and-pnl.scm index d49ce432ce..47f17f5d95 100644 --- a/src/scm/report/balance-and-pnl.scm +++ b/src/scm/report/balance-and-pnl.scm @@ -70,31 +70,38 @@ gnc:*pnl-report-options*) (define (render-level-2-account level-2-account l2-value) - (let ((account-name (gnc:account-get-name level-2-account)) + (let ((account-name (string-append "  " + (gnc:account-get-full-name + level-2-account))) (type-name (gnc:account-get-type-string (gnc:account-get-type level-2-account)))) - (html-table-row + (html-table-row-align (list - account-name type-name (gnc:amount->formatted-string l2-value #f))))) -; (list "left" "center" "right")))) + account-name type-name (gnc:amount->formatted-string l2-value #f)) + (list "left" "center" "right")))) (define (render-level-1-account account l1-value l2-value) - (let ((name (gnc:account-get-name account)) + (let ((name (gnc:account-get-full-name account)) (type (gnc:account-get-type-string (gnc:account-get-type account)))) - (html-table-row + (html-table-row-align (list name type - (gnc:amount->formatted-string l2-value #f) + (if l2-value + (gnc:amount->formatted-string l2-value #f) + " ") (gnc:amount->formatted-string l1-value #f) - " " " ")))) -; (list "left" "center" "right" "right" "right" "right")))) + " " " ") + (list "left" "center" "right" "right" "right" "right")))) (define (render-total l0-value) - (html-table-row + (html-table-row-align (list " " " " " " (html-strong (string-db 'lookup 'net)) " " - (gnc:amount->formatted-string l0-value #f)))) -; (list "left" "center" "right" "right" "right" "right"))) + (gnc:amount->formatted-string l0-value #f)) + (list "left" "center" "right" "right" "right" "right"))) + + (define blank-line + (html-table-row '())) (define (is-it-on-balance-sheet? type balance?) (eq? @@ -116,20 +123,22 @@ (if (is-it-on-balance-sheet? type balance-sheet?) ;; Ignore '() - (let - ((childrens-output (gnc:group-map-accounts - (lambda (x) - (handle-level-2-account x options)) - (gnc:account-get-children account))) + (let* ((children (gnc:account-get-children account)) + (num-children (gnc:group-get-num-accounts children)) - (account-balance (if balance-sheet? - (gnc:account-get-balance-at-date - account - to-value #f) - (gnc:account-get-balance-interval - account - from-value - to-value #f)))) + (childrens-output (gnc:group-map-accounts + (lambda (x) + (handle-level-2-account x options)) + children)) + + (account-balance (if balance-sheet? + (gnc:account-get-balance-at-date + account + to-value #f) + (gnc:account-get-balance-interval + account + from-value + to-value #f)))) (if (not balance-sheet?) (set! account-balance (- account-balance))) @@ -139,10 +148,17 @@ (let ((level-1-output (render-level-1-account account (l1-collector 'total #f) - (l2-collector 'total #f)))) + (if (> num-children 0) + (l2-collector 'total #f) + #f)))) (l1-collector 'reset #f) (l2-collector 'reset #f) - (list childrens-output level-1-output)))))) + (if (null? childrens-output) + level-1-output + (list blank-line + level-1-output + childrens-output + blank-line))))))) (define (handle-level-2-account account options) (let @@ -204,11 +220,14 @@ report-description "

" - "" + "
" "" - "" + "" + "" + "" + "" + "" output @@ -219,6 +238,7 @@ (string-db 'store 'net "Net") (string-db 'store 'type "Type") (string-db 'store 'account-name "Account Name") + (string-db 'store 'subaccounts "(subaccounts)") (string-db 'store 'balance "Balance") (string-db 'store 'bal-title "Balance Sheet") (string-db 'store 'bal-desc "This page shows your net worth.")
" report-name "
" (string-db 'lookup 'account-name) - "" (string-db 'lookup 'type) - " " (string-db 'lookup 'balance) + "
" (string-db 'lookup 'account-name) "" (string-db 'lookup 'type) "" (string-db 'lookup 'subaccounts) "" (string-db 'lookup 'balance) "