From 2ff12ccada159d8227af8779983f0ce55051fcf7 Mon Sep 17 00:00:00 2001 From: Dave Peticolas Date: Thu, 14 Dec 2000 01:41:38 +0000 Subject: [PATCH] Blank shares & price header on non-stock split lines. git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@3306 57a11ea4-9604-0410-9ed3-97b8803252fd --- src/MultiLedger.c | 1 + src/SplitLedger.c | 214 ++++++++++++++++++++++++++++++++++-- src/SplitLedger.h | 2 + src/register/splitreg.c | 108 +++--------------- src/register/splitreg.h | 16 +-- src/register/table-allgui.c | 18 +-- src/register/table-allgui.h | 14 ++- 7 files changed, 245 insertions(+), 128 deletions(-) diff --git a/src/MultiLedger.c b/src/MultiLedger.c index 1fa10768ce..7c4ac5d628 100644 --- a/src/MultiLedger.c +++ b/src/MultiLedger.c @@ -432,6 +432,7 @@ xaccLedgerDisplayGeneral (Account *lead_account, GList *accounts, * but will not do the gui init */ ld->reg = xaccMallocSplitRegister (type, style, FALSE, xaccSRGetEntryHandler, + xaccSRGetLabelHandler, xaccSRGetIOFlagsHandler, xaccSRGetFGColorHandler, xaccSRGetBGColorHandler, diff --git a/src/SplitLedger.c b/src/SplitLedger.c index 0e22d7d53a..7b106687e2 100644 --- a/src/SplitLedger.c +++ b/src/SplitLedger.c @@ -3290,7 +3290,6 @@ use_security_cells (SplitRegister *reg, VirtualLocation virt_loc) GNCAccountType account_type; CursorClass cursor_class; Account *account; - guint32 changed; Split *split; split = sr_get_split (reg, virt_loc.vcell_loc); @@ -3302,20 +3301,23 @@ use_security_cells (SplitRegister *reg, VirtualLocation virt_loc) if (cursor_class != CURSOR_CLASS_SPLIT) return TRUE; - changed = xaccSplitRegisterGetChangeFlag (reg); - if (MOD_XFRM & changed) + account = NULL; + + if (virt_cell_loc_equal (virt_loc.vcell_loc, + reg->table->current_cursor_loc.vcell_loc)) { - account = xaccGetAccountFromFullName (gncGetCurrentGroup (), - reg->xfrmCell->cell.value, - account_separator); - if (!account) - account = xaccSplitGetAccount (split); + guint32 changed = xaccSplitRegisterGetChangeFlag (reg); + if (MOD_XFRM & changed) + account = xaccGetAccountFromFullName (gncGetCurrentGroup (), + reg->xfrmCell->cell.value, + account_separator); } - else + + if (!account) account = xaccSplitGetAccount (split); if (!account) - return XACC_CELL_ALLOW_ALL; + return TRUE; account_type = xaccAccountGetType (account); @@ -3600,6 +3602,196 @@ xaccSRGetEntryHandler (VirtualLocation virt_loc, } } +static GNCAccountType +sr_type_to_account_type(SplitRegisterType sr_type) +{ + switch (sr_type) + { + case BANK_REGISTER: + return BANK; + case CASH_REGISTER: + return CASH; + case ASSET_REGISTER: + return ASSET; + case CREDIT_REGISTER: + return CREDIT; + case LIABILITY_REGISTER: + return LIABILITY; + case INCOME_LEDGER: + case INCOME_REGISTER: + return INCOME; + case EXPENSE_REGISTER: + return EXPENSE; + case STOCK_REGISTER: + case PORTFOLIO_LEDGER: + return STOCK; + case CURRENCY_REGISTER: + return CURRENCY; + case GENERAL_LEDGER: + return NO_TYPE; + case EQUITY_REGISTER: + return EQUITY; + case SEARCH_LEDGER: + return NO_TYPE; + default: + return NO_TYPE; + } +} + +static char * +sr_get_debit_string (SplitRegister *reg) +{ + return gnc_get_debit_string (sr_type_to_account_type (reg->type)); +} + +static char * +sr_get_credit_string (SplitRegister *reg) +{ + return gnc_get_credit_string (sr_type_to_account_type (reg->type)); +} + +const char * +xaccSRGetLabelHandler (VirtualLocation virt_loc, gpointer user_data) +{ + SplitRegister *reg = user_data; + CellType cell_type; + + cell_type = xaccSplitRegisterGetCellType (reg, virt_loc); + + switch (cell_type) + { + case DATE_CELL: + return _("Date"); + + case NUM_CELL: + return _("Num"); + + case DESC_CELL: + return _("Description"); + + case RECN_CELL: + return _("Reconciled:R"+11); + + case SHRBALN_CELL: + return _("Share Balance"); + + case BALN_CELL: + return _("Balance"); + + case ACTN_CELL: + return _("Action"); + + case XFRM_CELL: + return _("Account"); + + case MEMO_CELL: + return _("Memo"); + + case CRED_CELL: + if (reg->credit_str) + return reg->credit_str; + + reg->credit_str = sr_get_credit_string (reg); + + if (reg->credit_str) + return reg->credit_str; + + reg->credit_str = g_strdup (_("Credit")); + + return reg->credit_str; + + case DEBT_CELL: + if (reg->debit_str) + return reg->debit_str; + + reg->debit_str = sr_get_debit_string (reg); + + if (reg->debit_str) + return reg->debit_str; + + reg->debit_str = g_strdup (_("Debit")); + + return reg->debit_str; + + case PRIC_CELL: + if (!use_security_cells (reg, virt_loc)) + return ""; + + return _("Price"); + + case SHRS_CELL: + if (!use_security_cells (reg, virt_loc)) + return ""; + + return _("Shares"); + + case MXFRM_CELL: + return _("Transfer"); + + case TCRED_CELL: + if (reg->tcredit_str) + return reg->tcredit_str; + + { + char *string = sr_get_credit_string (reg); + if (string) + { + reg->tcredit_str = g_strdup_printf (_("Tot %s"), string); + g_free (string); + } + } + + if (reg->tcredit_str) + return reg->tcredit_str; + + reg->tcredit_str = g_strdup (_("Tot Credit")); + + return reg->tcredit_str; + + case TDEBT_CELL: + if (reg->tdebit_str) + return reg->tdebit_str; + + { + char *string = sr_get_debit_string (reg); + if (string) + { + reg->tdebit_str = g_strdup_printf (_("Tot %s"), string); + g_free (string); + } + } + + if (reg->tdebit_str) + return reg->tdebit_str; + + reg->tdebit_str = g_strdup (_("Tot Debit")); + + return reg->tdebit_str; + + case TSHRS_CELL: + return _("Tot Shares"); + + case TSHRBALN_CELL: + return _("Share Balance"); + + case TBALN_CELL: + return _("Balance"); + + case NOTES_CELL: + return _("Notes"); + + case NO_CELL: + return ""; + + default: + break; + } + + PERR ("bad cell type: %d", cell_type); + + return ""; +} + CellIOFlags xaccSRGetIOFlagsHandler (VirtualLocation virt_loc, gpointer user_data) { @@ -3630,7 +3822,7 @@ xaccSRGetIOFlagsHandler (VirtualLocation virt_loc, gpointer user_data) if (use_security_cells (reg, virt_loc)) return XACC_CELL_ALLOW_ALL; - return XACC_CELL_ALLOW_NONE; + return XACC_CELL_ALLOW_SHADOW; default: return XACC_CELL_ALLOW_NONE; diff --git a/src/SplitLedger.h b/src/SplitLedger.h index 437114d667..a36017dc13 100644 --- a/src/SplitLedger.h +++ b/src/SplitLedger.h @@ -208,6 +208,8 @@ gboolean xaccSRCurrentTransExpanded (SplitRegister *reg); const char * xaccSRGetEntryHandler (VirtualLocation virt_loc, gboolean *changed, gpointer user_data); +const char * xaccSRGetLabelHandler (VirtualLocation virt_loc, + gpointer user_data); CellIOFlags xaccSRGetIOFlagsHandler (VirtualLocation virt_loc, gpointer user_data); guint32 xaccSRGetFGColorHandler (VirtualLocation virt_loc, diff --git a/src/register/splitreg.c b/src/register/splitreg.c index 5c467bf977..89f1a66770 100644 --- a/src/register/splitreg.c +++ b/src/register/splitreg.c @@ -54,9 +54,6 @@ /* This static indicates the debugging module that this .o belongs to. */ static short module = MOD_REGISTER; -static SRStringGetter debit_getter = NULL; -static SRStringGetter credit_getter = NULL; - typedef struct _CellBuffer CellBuffer; struct _CellBuffer { @@ -139,6 +136,7 @@ xaccInitSplitRegister (SplitRegister *reg, SplitRegisterStyle style, gboolean use_double_line, TableGetEntryHandler entry_handler, + TableGetLabelHandler label_handler, TableGetCellIOFlags io_flag_handler, TableGetFGColorHandler fg_color_handler, TableGetBGColorHandler bg_color_handler, @@ -148,92 +146,6 @@ xaccInitSplitRegister (SplitRegister *reg, VirtCellDataCopy copy); -/* ============================================== */ - -#define LABEL(NAME,label) \ -{ \ - BasicCell *hcell; \ - hcell = reg->header_cells[NAME##_CELL]; \ - xaccSetBasicCellValue (hcell, label); \ -} - -/* ============================================== */ - -void -xaccSplitRegisterSetDebitStringGetter(SRStringGetter getter) -{ - debit_getter = getter; -} - -void -xaccSplitRegisterSetCreditStringGetter(SRStringGetter getter) -{ - credit_getter = getter; -} - -/* ============================================== */ -/* configLabels merely puts strings into the label cells - * it does *not* copy them to the header cursor */ - -static void -configLabels (SplitRegister *reg) -{ - LABEL (DATE, _("Date")); - LABEL (NUM, _("Num")); - LABEL (DESC, _("Description")); - LABEL (RECN, _("Reconciled:R"+11)); - LABEL (SHRBALN, _("Share Balance")); - LABEL (BALN, _("Balance")); - LABEL (ACTN, _("Action")); - LABEL (XFRM, _("Account")); - LABEL (MEMO, _("Memo")); - LABEL (CRED, _("Credit")); - LABEL (DEBT, _("Debit")); - LABEL (PRIC, _("Price")); - LABEL (SHRS, _("Shares")); - LABEL (MXFRM, _("Transfer")); - LABEL (TCRED, _("Tot Debit")); - LABEL (TDEBT, _("Tot Credit")); - LABEL (TSHRS, _("Tot Shares")); - LABEL (TSHRBALN, _("Share Balance")); - LABEL (TBALN, _("Balance")); - LABEL (NOTES, _("Notes")); - - if (debit_getter != NULL) - { - char *string = debit_getter (reg->type); - if (string != NULL) - { - char *tstring; - - LABEL (DEBT, string); - - tstring = g_strdup_printf (_("Tot %s"), string); - LABEL (TDEBT, tstring); - - g_free (tstring); - free (string); - } - } - - if (credit_getter != NULL) - { - char *string = credit_getter (reg->type); - if (string != NULL) - { - char *tstring; - - LABEL (CRED, string); - - tstring = g_strdup_printf (_("Tot %s"), string); - LABEL (TCRED, tstring); - - g_free (tstring); - free (string); - } - } -} - /* ============================================== */ /* configAction strings into the action cell */ /* hack alert -- this stuff really, really should be in a config file ... */ @@ -630,6 +542,7 @@ xaccMallocSplitRegister (SplitRegisterType type, SplitRegisterStyle style, gboolean use_double_line, TableGetEntryHandler entry_handler, + TableGetLabelHandler label_handler, TableGetCellIOFlags io_flag_handler, TableGetFGColorHandler fg_color_handler, TableGetBGColorHandler bg_color_handler, @@ -650,6 +563,7 @@ xaccMallocSplitRegister (SplitRegisterType type, style, use_double_line, entry_handler, + label_handler, io_flag_handler, fg_color_handler, bg_color_handler, @@ -732,6 +646,7 @@ xaccInitSplitRegister (SplitRegister *reg, SplitRegisterStyle style, gboolean use_double_line, TableGetEntryHandler entry_handler, + TableGetLabelHandler label_handler, TableGetCellIOFlags io_flag_handler, TableGetFGColorHandler fg_color_handler, TableGetBGColorHandler bg_color_handler, @@ -791,10 +706,6 @@ xaccInitSplitRegister (SplitRegister *reg, /* --------------------------- */ - /* configLabels merely puts strings into the label cells. It does - * *not* copy them to the header cursor */ - configLabels (reg); - /* config the layout of the cells in the cursors */ configLayout (reg); @@ -888,6 +799,7 @@ xaccInitSplitRegister (SplitRegister *reg, configAction (reg); table = gnc_table_new (entry_handler, + label_handler, io_flag_handler, fg_color_handler, bg_color_handler, @@ -1034,6 +946,16 @@ xaccDestroySplitRegister (SplitRegister *reg) reg->header_cells[i] = NULL; } + g_free (reg->debit_str); + g_free (reg->tdebit_str); + g_free (reg->credit_str); + g_free (reg->tcredit_str); + + reg->debit_str = NULL; + reg->tdebit_str = NULL; + reg->credit_str = NULL; + reg->tcredit_str = NULL; + /* free the memory itself */ g_free (reg); } diff --git a/src/register/splitreg.h b/src/register/splitreg.h index fd46f64642..512285d0d3 100644 --- a/src/register/splitreg.h +++ b/src/register/splitreg.h @@ -186,7 +186,7 @@ struct _SplitRegister DateCell * dateCell; NumCell * numCell; QuickFillCell * descCell; - RecnCell * recnCell; /* main transaction line reconcile */ + RecnCell * recnCell; PriceCell * shrbalnCell; PriceCell * balanceCell; ComboCell * actionCell; @@ -215,24 +215,26 @@ struct _SplitRegister /* user_data allows users of this object to hang * private data onto it */ - void *user_data; + gpointer user_data; /* The destroy callback gives user's a chance * to free up any associated user_hook data */ SplitRegisterDestroyCB destroy; + + /* configured strings for debit/credit headers */ + char *debit_str; + char *credit_str; + char *tdebit_str; + char *tcredit_str; }; -typedef char* (*SRStringGetter) (SplitRegisterType); - -void xaccSplitRegisterSetDebitStringGetter(SRStringGetter getter); -void xaccSplitRegisterSetCreditStringGetter(SRStringGetter getter); - SplitRegister * xaccMallocSplitRegister (SplitRegisterType type, SplitRegisterStyle style, gboolean use_double_line, TableGetEntryHandler entry_handler, + TableGetLabelHandler label_handler, TableGetCellIOFlags io_flag_handler, TableGetFGColorHandler fg_color_handler, TableGetBGColorHandler bg_color_handler, diff --git a/src/register/table-allgui.c b/src/register/table-allgui.c index 067603c18c..80f9254487 100644 --- a/src/register/table-allgui.c +++ b/src/register/table-allgui.c @@ -62,6 +62,7 @@ static void gnc_table_resize (Table * table, int virt_rows, int virt_cols); Table * gnc_table_new (TableGetEntryHandler entry_handler, + TableGetLabelHandler label_handler, TableGetCellIOFlags io_flag_handler, TableGetFGColorHandler fg_color_handler, TableGetBGColorHandler bg_color_handler, @@ -78,6 +79,7 @@ gnc_table_new (TableGetEntryHandler entry_handler, table = g_new0(Table, 1); table->entry_handler = entry_handler; + table->label_handler = label_handler; table->io_flag_handler = io_flag_handler; table->fg_color_handler = fg_color_handler; table->bg_color_handler = bg_color_handler; @@ -238,20 +240,10 @@ gnc_table_get_io_flags (Table *table, VirtualLocation virt_loc) const char * gnc_table_get_label (Table *table, VirtualLocation virt_loc) { - VirtualCell *vcell; - CellBlockCell *cb_cell; - - vcell = gnc_table_get_virtual_cell (table, virt_loc.vcell_loc); - if (vcell == NULL) + if (!table->label_handler) return ""; - cb_cell = gnc_cellblock_get_cell (vcell->cellblock, - virt_loc.phys_row_offset, - virt_loc.phys_col_offset); - if (cb_cell == NULL) - return NULL; - - return cb_cell->label; + return table->label_handler (virt_loc, table->handler_user_data); } /* ==================================================== */ @@ -618,7 +610,7 @@ gnc_table_move_cursor_internal (Table *table, /* OK, now copy the string value from the table at large * into the cell handler. */ io_flags = gnc_table_get_io_flags (table, virt_loc); - if (io_flags & XACC_CELL_ALLOW_INPUT) + if (io_flags & XACC_CELL_ALLOW_SHADOW) { const char *entry; gboolean conditionally_changed = FALSE; diff --git a/src/register/table-allgui.h b/src/register/table-allgui.h index a1b242015a..d2dc9d422f 100644 --- a/src/register/table-allgui.h +++ b/src/register/table-allgui.h @@ -102,8 +102,9 @@ typedef enum { XACC_CELL_ALLOW_NONE = 0, XACC_CELL_ALLOW_INPUT = 1 << 0, - XACC_CELL_ALLOW_ALL = XACC_CELL_ALLOW_INPUT, - XACC_CELL_ALLOW_EXACT_ONLY = 1 << 1 + XACC_CELL_ALLOW_SHADOW = 1 << 1, + XACC_CELL_ALLOW_ALL = XACC_CELL_ALLOW_INPUT | XACC_CELL_ALLOW_SHADOW, + XACC_CELL_ALLOW_EXACT_ONLY = 1 << 2 } CellIOFlags; @@ -166,6 +167,9 @@ typedef const char * (*TableGetEntryHandler) (VirtualLocation virt_loc, gboolean *conditionally_changed, gpointer user_data); +typedef const char * (*TableGetLabelHandler) (VirtualLocation virt_loc, + gpointer user_data); + typedef CellIOFlags (*TableGetCellIOFlags) (VirtualLocation virt_loc, gpointer user_data); @@ -226,6 +230,7 @@ struct _Table void * ui_data; TableGetEntryHandler entry_handler; + TableGetLabelHandler label_handler; TableGetCellIOFlags io_flag_handler; TableGetFGColorHandler fg_color_handler; TableGetBGColorHandler bg_color_handler; @@ -243,6 +248,7 @@ struct _Table /* Functions to create and destroy Tables. */ Table * gnc_table_new (TableGetEntryHandler entry_handler, + TableGetLabelHandler label_handler, TableGetCellIOFlags io_flag_handler, TableGetFGColorHandler fg_color_handler, TableGetBGColorHandler bg_color_handler, @@ -281,10 +287,10 @@ VirtualCell * gnc_table_get_virtual_cell (Table *table, const char * gnc_table_get_entry (Table *table, VirtualLocation virt_loc); -CellIOFlags gnc_table_get_io_flags (Table *table, VirtualLocation virt_loc); - const char * gnc_table_get_label (Table *table, VirtualLocation virt_loc); +CellIOFlags gnc_table_get_io_flags (Table *table, VirtualLocation virt_loc); + guint32 gnc_table_get_fg_color (Table *table, VirtualLocation virt_loc); guint32 gnc_table_get_bg_color (Table *table, VirtualLocation virt_loc,