From d66f044a61fc4b0dd8b5965ef27ed5048c884841 Mon Sep 17 00:00:00 2001 From: Dave Peticolas Date: Tue, 3 Oct 2000 08:03:47 +0000 Subject: [PATCH] Implement foreground color handler. Remove cruft. git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@3010 57a11ea4-9604-0410-9ed3-97b8803252fd --- src/MultiLedger.c | 1 + src/SplitLedger.c | 71 +++++++++++++++++++++++++++++++++++-- src/SplitLedger.h | 2 ++ src/register/splitreg.c | 25 +++++++------ src/register/splitreg.h | 13 ++----- src/register/table-allgui.c | 31 ++++++++-------- src/register/table-allgui.h | 6 ++++ 7 files changed, 111 insertions(+), 38 deletions(-) diff --git a/src/MultiLedger.c b/src/MultiLedger.c index f2d633bfcd..1ab04c91a4 100644 --- a/src/MultiLedger.c +++ b/src/MultiLedger.c @@ -410,6 +410,7 @@ xaccLedgerDisplayGeneral (Account *lead_account, GList *accounts, * but will not do the gui init */ regData->ledger = xaccMallocSplitRegister (type, style, xaccSRGetEntryHandler, + xaccSRGetFGColorHandler, xaccGUIDMalloc, xaccGUIDFree, xaccGUIDCopy); diff --git a/src/SplitLedger.c b/src/SplitLedger.c index 18d976872c..a711814721 100644 --- a/src/SplitLedger.c +++ b/src/SplitLedger.c @@ -2956,6 +2956,75 @@ xaccSRGetEntryHandler (gpointer vcell_data, short _cell_type, } } +guint32 +xaccSRGetFGColorHandler (gpointer vcell_data, short _cell_type, + gpointer user_data) +{ + GUID *guid = vcell_data; + CellType cell_type = _cell_type; + SplitRegister *reg = user_data; + const guint32 black = 0x000000; + const guint32 red = 0xff0000; + Split *split; + + split = xaccSplitLookup (guid); + if (split == NULL) + return black; + + switch (cell_type) + { + case SHRBALN_CELL: + { + double balance; + + balance = xaccSplitGetShareBalance (split); + if (DEQ (balance, 0.0)) + balance = 0.0; + + if (balance < 0.0) + return red; + + return black; + } + break; + + case BALN_CELL: + { + double balance; + + /* If the reverse_balance callback is present use that. + * Otherwise, reverse income and expense by default. */ + balance = xaccSplitGetBalance (split); + if (reverse_balance != NULL) + { + Account *account; + + account = xaccSplitGetAccount(split); + + if (reverse_balance(account)) + balance = -balance; + } + else if ((INCOME_REGISTER == reg->type) || + (EXPENSE_REGISTER == reg->type)) + balance = -balance; + + if (DEQ (balance, 0.0)) + balance = 0.0; + + if (balance < 0.0) + return red; + + return black; + } + break; + + default: + break; + } + + return black; +} + /* ======================================================== */ static void @@ -3357,8 +3426,6 @@ xaccSRLoadRegister (SplitRegister *reg, Split **slist, vcell_loc.virt_col = 0; gnc_table_set_cursor (table, reg->header, vcell_loc); - PINFO ("load register of %d phys rows ----------- \n", reg->num_phys_rows); - /* populate the table */ i = 0; vcell_loc.virt_row = 1; /* header is vrow zero */ diff --git a/src/SplitLedger.h b/src/SplitLedger.h index aa385914b1..54203c075f 100644 --- a/src/SplitLedger.h +++ b/src/SplitLedger.h @@ -179,5 +179,7 @@ void xaccSRShowPresentDivider (SplitRegister *reg, gboolean show_present); /* Private function, for MultiLedger.c only */ const char * xaccSRGetEntryHandler (gpointer vcell_data, short _cell_type, gpointer user_data); +guint32 xaccSRGetFGColorHandler (gpointer vcell_data, short _cell_type, + gpointer user_data); #endif /* __XACC_SPLIT_LEDGER_H__ */ diff --git a/src/register/splitreg.c b/src/register/splitreg.c index 0a2aafb316..71c8f69834 100644 --- a/src/register/splitreg.c +++ b/src/register/splitreg.c @@ -123,6 +123,7 @@ xaccInitSplitRegister (SplitRegister *reg, SplitRegisterType type, SplitRegisterStyle style, TableGetEntryHandler entry_handler, + TableGetFGColorHandler fg_color_handler, VirtCellDataAllocator allocator, VirtCellDataDeallocator deallocator, VirtCellDataCopy copy); @@ -130,11 +131,11 @@ xaccInitSplitRegister (SplitRegister *reg, /* ============================================== */ -#define LABEL(NAME,label) \ -{ \ - BasicCell *hcell; \ - hcell = reg->header_label_cells[NAME##_CELL]; \ - xaccSetBasicCellValue (hcell, label); \ +#define LABEL(NAME,label) \ +{ \ + BasicCell *hcell; \ + hcell = reg->header_label_cells[NAME##_CELL]; \ + xaccSetBasicCellValue (hcell, label); \ } /* ============================================== */ @@ -590,6 +591,7 @@ SplitRegister * xaccMallocSplitRegister (SplitRegisterType type, SplitRegisterStyle style, TableGetEntryHandler entry_handler, + TableGetFGColorHandler fg_color_handler, VirtCellDataAllocator allocator, VirtCellDataDeallocator deallocator, VirtCellDataCopy copy) @@ -598,7 +600,8 @@ xaccMallocSplitRegister (SplitRegisterType type, reg = g_new(SplitRegister, 1); - xaccInitSplitRegister (reg, type, style, entry_handler, + xaccInitSplitRegister (reg, type, style, + entry_handler, fg_color_handler, allocator, deallocator, copy); return reg; @@ -723,8 +726,7 @@ mallocCursors (SplitRegister *reg) return; } - reg->num_header_rows = 1; - reg->header = gnc_cellblock_new (reg->num_header_rows, num_cols); + reg->header = gnc_cellblock_new (1, num_cols); /* cursors used in the single & double line displays */ reg->single_cursor = gnc_cellblock_new (1, num_cols); @@ -752,6 +754,7 @@ xaccInitSplitRegister (SplitRegister *reg, SplitRegisterType type, SplitRegisterStyle style, TableGetEntryHandler entry_handler, + TableGetFGColorHandler fg_color_handler, VirtCellDataAllocator allocator, VirtCellDataDeallocator deallocator, VirtCellDataCopy copy) @@ -902,7 +905,9 @@ xaccInitSplitRegister (SplitRegister *reg, reg->cursor_virt_row = 1; reg->num_virt_rows = 2; /* one header, one single_cursor */ - table = gnc_table_new (entry_handler, reg, allocator, deallocator, copy); + table = gnc_table_new (entry_handler, fg_color_handler, reg, + allocator, deallocator, copy); + gnc_table_set_size (table, reg->num_virt_rows, 1); /* Set up header */ @@ -912,7 +917,7 @@ xaccInitSplitRegister (SplitRegister *reg, gnc_table_set_cursor (table, header, vcell_loc); } - /* Set up first and only cursor */ + /* Set up first and only initial row */ { VirtualLocation vloc; diff --git a/src/register/splitreg.h b/src/register/splitreg.h index 361b435260..7d01a67ba9 100644 --- a/src/register/splitreg.h +++ b/src/register/splitreg.h @@ -145,10 +145,6 @@ typedef enum CURSOR_NONE } CursorClass; -/* The value of NUM_CELLS should be larger than the number of - * cells defined in the structure below! - */ -#define NUM_CELLS 25 typedef struct _SplitRegisterBuffer SplitRegisterBuffer; typedef struct _SplitRegister SplitRegister; @@ -184,21 +180,15 @@ struct _SplitRegister { PriceCell * priceCell; PriceCell * sharesCell; - /* The type of the register, must be one of the enumerated types - * named *_REGISTER, *_LEDGER, above */ SplitRegisterType type; - SplitRegisterStyle style; /* some private data; outsiders should not access this */ - int num_header_rows; - - int num_phys_rows; int num_virt_rows; int cursor_virt_row; - BasicCell *header_label_cells[NUM_CELLS]; + BasicCell *header_label_cells[CELL_TYPE_COUNT]; /* user_data allows users of this object to hang * private data onto it */ @@ -242,6 +232,7 @@ SplitRegister * xaccMallocSplitRegister (SplitRegisterType type, SplitRegisterStyle style, TableGetEntryHandler entry_handler, + TableGetFGColorHandler fg_color_handler, VirtCellDataAllocator allocator, VirtCellDataDeallocator deallocator, VirtCellDataCopy copy); diff --git a/src/register/table-allgui.c b/src/register/table-allgui.c index 23762fe007..0672e627d3 100644 --- a/src/register/table-allgui.c +++ b/src/register/table-allgui.c @@ -72,6 +72,7 @@ static void gnc_table_resize (Table * table, int virt_rows, int virt_cols); Table * gnc_table_new (TableGetEntryHandler entry_handler, + TableGetFGColorHandler fg_color_handler, gpointer entry_handler_data, VirtCellDataAllocator allocator, VirtCellDataDeallocator deallocator, @@ -88,6 +89,7 @@ gnc_table_new (TableGetEntryHandler entry_handler, table = g_new0(Table, 1); table->entry_handler = entry_handler; + table->fg_color_handler = fg_color_handler; table->entry_handler_data = entry_handler_data; table->vcell_data_allocator = allocator; table->vcell_data_deallocator = deallocator; @@ -244,32 +246,31 @@ gnc_table_get_fg_color_virtual (Table *table, VirtualLocation virt_loc) VirtualCell *vcell; CellBlockCell *cb_cell; BasicCell *cell; - guint32 fg_color; + guint32 fg_color = 0x0; /* black */ - fg_color = 0x000000; /* black */ + vcell = gnc_table_get_virtual_cell (table, virt_loc.vcell_loc); + if (vcell == NULL) + return fg_color; + + cb_cell = gnc_cellblock_get_cell (vcell->cellblock, + virt_loc.phys_row_offset, + virt_loc.phys_col_offset); + if (cb_cell == NULL) + return fg_color; if (virt_cell_loc_equal (table->current_cursor_loc.vcell_loc, virt_loc.vcell_loc)) { - vcell = gnc_table_get_virtual_cell (table, virt_loc.vcell_loc); - if (vcell == NULL) - return fg_color; - - cb_cell = gnc_cellblock_get_cell (vcell->cellblock, - virt_loc.phys_row_offset, - virt_loc.phys_col_offset); - if (cb_cell == NULL) - return fg_color; - cell = cb_cell->cell; if (cell == NULL) return fg_color; - if (cell->use_fg_color) - fg_color = cell->fg_color; + if (cell->use_fg_color && (XACC_CELL_ALLOW_SHADOW & cell->input_output)) + return cell->fg_color; } - return fg_color; + return table->fg_color_handler (vcell->vcell_data, cb_cell->cell_type, + table->entry_handler_data); } /* ==================================================== */ diff --git a/src/register/table-allgui.h b/src/register/table-allgui.h index 7ef296af73..2cad573b2b 100644 --- a/src/register/table-allgui.h +++ b/src/register/table-allgui.h @@ -132,6 +132,10 @@ typedef const char * (*TableGetEntryHandler) (gpointer vcell_data, short cell_type, gpointer user_data); +typedef guint32 (*TableGetFGColorHandler) (gpointer vcell_data, + short cell_type, + gpointer user_data); + typedef gpointer (*VirtCellDataAllocator) (void); typedef void (*VirtCellDataDeallocator) (gpointer user_data); typedef void (*VirtCellDataCopy) (gpointer to, gconstpointer from); @@ -178,6 +182,7 @@ struct _Table void * ui_data; TableGetEntryHandler entry_handler; + TableGetFGColorHandler fg_color_handler; gpointer entry_handler_data; TableDestroyFunc destroy; @@ -190,6 +195,7 @@ struct _Table /* Functions to create and destroy Tables. */ Table * gnc_table_new (TableGetEntryHandler entry_handler, + TableGetFGColorHandler fg_color_handler, gpointer entry_handler_data, VirtCellDataAllocator allocator, VirtCellDataDeallocator deallocator,