From 907b7fc5d79024b78ff36e11c20cb2c9943f9d26 Mon Sep 17 00:00:00 2001 From: Dave Peticolas Date: Mon, 3 Sep 2001 11:06:29 +0000 Subject: [PATCH] Change integer cell types to string cell names. git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@5270 57a11ea4-9604-0410-9ed3-97b8803252fd --- .../ledger-core/split-register-control.c | 56 ++- .../ledger-core/split-register-model.c | 38 +- src/register/ledger-core/split-register-p.h | 3 +- src/register/ledger-core/split-register.c | 12 +- src/register/register-core/basiccell.c | 29 +- src/register/register-core/basiccell.h | 8 +- src/register/register-core/splitreg.c | 355 +++++++----------- src/register/register-core/splitreg.h | 62 ++- src/register/register-core/table-allgui.c | 73 ++-- src/register/register-core/table-allgui.h | 8 +- src/register/register-core/table-layout.c | 69 +++- src/register/register-core/table-layout.h | 15 +- src/register/register-core/table-model.c | 110 +++--- src/register/register-core/table-model.h | 28 +- src/register/register-gnome/gnucash-cursor.c | 4 +- src/register/register-gnome/gnucash-header.c | 2 +- src/register/register-gnome/gnucash-style.c | 111 ++++-- src/register/register-gnome/gnucash-style.h | 17 +- src/register/register-gnome/table-gnome.c | 52 +-- 19 files changed, 565 insertions(+), 487 deletions(-) diff --git a/src/register/ledger-core/split-register-control.c b/src/register/ledger-core/split-register-control.c index 527f3332a4..697b16b548 100644 --- a/src/register/ledger-core/split-register-control.c +++ b/src/register/ledger-core/split-register-control.c @@ -542,7 +542,7 @@ gnc_split_register_auto_completion (SplitRegister *reg, Transaction *blank_trans = xaccSplitGetParent (blank_split); VirtualLocation new_virt_loc; CursorClass cursor_class; - CellType cell_type; + const char *cell_name; Transaction *trans; gnc_numeric amount; BasicCell *cell; @@ -552,13 +552,13 @@ gnc_split_register_auto_completion (SplitRegister *reg, if (dir != GNC_TABLE_TRAVERSE_RIGHT) return FALSE; - split = xaccSRGetCurrentSplit(reg); - trans = xaccSRGetCurrentTrans(reg); + split = xaccSRGetCurrentSplit (reg); + trans = xaccSRGetCurrentTrans (reg); if (trans == NULL) return FALSE; cursor_class = xaccSplitRegisterGetCurrentCursorClass (reg); - cell_type = gnc_table_get_current_cell_type (reg->table); + cell_name = gnc_table_get_current_cell_name (reg->table); switch (cursor_class) { @@ -576,7 +576,7 @@ gnc_split_register_auto_completion (SplitRegister *reg, return FALSE; /* and leaving the description cell */ - if (cell_type != DESC_CELL) + if (!gnc_cell_name_equal (cell_name, DESC_CELL)) return FALSE; /* nothing but the date, num, and description should be changed */ @@ -681,9 +681,9 @@ gnc_split_register_auto_completion (SplitRegister *reg, /* now move to the non-empty amount column */ amount = xaccSplitGetAmount (blank_split); - cell_type = (gnc_numeric_negative_p (amount)) ? CRED_CELL : DEBT_CELL; + cell_name = (gnc_numeric_negative_p (amount)) ? CRED_CELL : DEBT_CELL; - if (gnc_table_get_current_cell_location (reg->table, cell_type, + if (gnc_table_get_current_cell_location (reg->table, cell_name, &new_virt_loc)) *p_new_virt_loc = new_virt_loc; } @@ -702,7 +702,7 @@ gnc_split_register_auto_completion (SplitRegister *reg, return FALSE; /* and leaving the memo cell */ - if (cell_type != MEMO_CELL) + if (!gnc_cell_name_equal (cell_name, MEMO_CELL)) return FALSE; /* nothing but the action, memo, and amounts should be changed */ @@ -797,9 +797,9 @@ gnc_split_register_auto_completion (SplitRegister *reg, /* now move to the non-empty amount column */ amount = xaccSplitGetAmount (auto_split); - cell_type = (gnc_numeric_negative_p (amount)) ? CRED_CELL : DEBT_CELL; + cell_name = (gnc_numeric_negative_p (amount)) ? CRED_CELL : DEBT_CELL; - if (gnc_table_get_current_cell_location (reg->table, cell_type, + if (gnc_table_get_current_cell_location (reg->table, cell_name, &new_virt_loc)) *p_new_virt_loc = new_virt_loc; } @@ -860,37 +860,33 @@ gnc_split_register_traverse (VirtualLocation *p_new_virt_loc, /* See if we are leaving an account field */ do { - CellType cell_type; + const char *cell_name; ComboCell *cell; Account *account; char *name; - cell_type = gnc_table_get_current_cell_type (reg->table); + cell_name = gnc_table_get_current_cell_name (reg->table); - if (!(cell_type == XFRM_CELL || - cell_type == MXFRM_CELL)) + if (!gnc_cell_name_equal (cell_name, XFRM_CELL) && + !gnc_cell_name_equal (cell_name, MXFRM_CELL)) break; cell = NULL; - switch (cell_type) + if (gnc_cell_name_equal (cell_name, XFRM_CELL)) { - case XFRM_CELL: - if (gnc_table_layout_get_cell_changed (reg->table->layout, - XFRM_CELL, FALSE)) - cell = (ComboCell *) gnc_table_layout_get_cell (reg->table->layout, - XFRM_CELL); - break; + if (gnc_table_layout_get_cell_changed (reg->table->layout, + XFRM_CELL, FALSE)) + cell = (ComboCell *) gnc_table_layout_get_cell (reg->table->layout, + XFRM_CELL); + } - case MXFRM_CELL: - if (gnc_table_layout_get_cell_changed (reg->table->layout, - MXFRM_CELL, FALSE)) - cell = (ComboCell *) gnc_table_layout_get_cell (reg->table->layout, - MXFRM_CELL); - break; - - default: - break; + if (gnc_cell_name_equal (cell_name, MXFRM_CELL)) + { + if (gnc_table_layout_get_cell_changed (reg->table->layout, + MXFRM_CELL, FALSE)) + cell = (ComboCell *) gnc_table_layout_get_cell (reg->table->layout, + MXFRM_CELL); } if (!cell) diff --git a/src/register/ledger-core/split-register-model.c b/src/register/ledger-core/split-register-model.c index 81eb2e750e..e11b243f23 100644 --- a/src/register/ledger-core/split-register-model.c +++ b/src/register/ledger-core/split-register-model.c @@ -371,9 +371,9 @@ gnc_split_register_get_shares_fg_color (VirtualLocation virt_loc, SplitRegister *reg = user_data; const guint32 black = 0x000000; const guint32 red = 0xff0000; + const char * cell_name; gboolean is_current; gnc_numeric shares; - CellType cell_type; Split *split; if (!use_red_for_negative) @@ -383,12 +383,12 @@ gnc_split_register_get_shares_fg_color (VirtualLocation virt_loc, if (!split) return black; - cell_type = gnc_table_get_cell_type (reg->table, virt_loc); + cell_name = gnc_table_get_cell_name (reg->table, virt_loc); is_current = virt_cell_loc_equal (reg->table->current_cursor_loc.vcell_loc, virt_loc.vcell_loc); - if (cell_type == TSHRS_CELL) + if (gnc_cell_name_equal (cell_name, TSHRS_CELL)) shares = get_trans_total_amount (reg, xaccSplitGetParent (split)); else if (is_current) shares = gnc_price_cell_get_value @@ -410,8 +410,8 @@ gnc_split_register_get_balance_fg_color (VirtualLocation virt_loc, SplitRegister *reg = user_data; const guint32 black = 0x000000; const guint32 red = 0xff0000; + const char * cell_name; gnc_numeric balance; - CellType cell_type; Split *split; if (!use_red_for_negative) @@ -421,9 +421,9 @@ gnc_split_register_get_balance_fg_color (VirtualLocation virt_loc, if (!split) return black; - cell_type = gnc_table_get_cell_type (reg->table, virt_loc); + cell_name = gnc_table_get_cell_name (reg->table, virt_loc); - if (cell_type == BALN_CELL) + if (gnc_cell_name_equal (cell_name, BALN_CELL)) balance = xaccSplitGetBalance (split); else balance = get_trans_total_balance (reg, xaccSplitGetParent (split)); @@ -737,7 +737,8 @@ gnc_split_register_get_balance_entry (VirtualLocation virt_loc, if (split == xaccSplitLookup (&info->blank_split_guid)) return NULL; - is_trans = gnc_table_get_cell_type (reg->table, virt_loc) == TBALN_CELL; + is_trans = gnc_cell_name_equal + (gnc_table_get_cell_name (reg->table, virt_loc), TBALN_CELL); if (is_trans) balance = get_trans_total_balance (reg, xaccSplitGetParent (split)); @@ -887,24 +888,26 @@ gnc_split_register_get_tdebcred_entry (VirtualLocation virt_loc, gpointer user_data) { SplitRegister *reg = user_data; + const char * cell_name; gnc_numeric total; - int cell_type; Split *split; split = sr_get_split (reg, virt_loc.vcell_loc); if (!split) return NULL; - cell_type = gnc_table_get_cell_type (reg->table, virt_loc); + cell_name = gnc_table_get_cell_name (reg->table, virt_loc); total = get_trans_total_amount (reg, xaccSplitGetParent (split)); if (gnc_numeric_zero_p (total)) return NULL; - if (gnc_numeric_negative_p (total) && (cell_type == TDEBT_CELL)) + if (gnc_numeric_negative_p (total) && + gnc_cell_name_equal (cell_name, TDEBT_CELL)) return NULL; - if (gnc_numeric_positive_p (total) && (cell_type == TCRED_CELL)) + if (gnc_numeric_positive_p (total) && + gnc_cell_name_equal (cell_name, TCRED_CELL)) return NULL; total = gnc_numeric_abs (total); @@ -922,7 +925,8 @@ gnc_split_register_get_debcred_entry (VirtualLocation virt_loc, gboolean is_debit; Split *split; - is_debit = gnc_table_get_cell_type (reg->table, virt_loc) == DEBT_CELL; + is_debit = gnc_cell_name_equal + (gnc_table_get_cell_name (reg->table, virt_loc), DEBT_CELL); split = sr_get_split (reg, virt_loc.vcell_loc); @@ -1173,7 +1177,7 @@ gnc_template_register_get_debcred_entry (VirtualLocation virt_loc, if (kvpf) { gnc_numeric amount; - int cell_type; + const char * cell_name; char *str; str = kvp_value_get_string (kvp_frame_get_slot (kvpf, @@ -1184,12 +1188,14 @@ gnc_template_register_get_debcred_entry (VirtualLocation virt_loc, if (gnc_numeric_zero_p (amount)) return ""; - cell_type = gnc_table_get_cell_type (reg->table, virt_loc); + cell_name = gnc_table_get_cell_name (reg->table, virt_loc); - if (gnc_numeric_negative_p (amount) && (cell_type == DEBT_CELL)) + if (gnc_numeric_negative_p (amount) && + gnc_cell_name_equal (cell_name, DEBT_CELL)) return ""; - if (gnc_numeric_positive_p (amount) && (cell_type == CRED_CELL)) + if (gnc_numeric_positive_p (amount) && + gnc_cell_name_equal (cell_name, CRED_CELL)) return ""; amount = gnc_numeric_abs (amount); diff --git a/src/register/ledger-core/split-register-p.h b/src/register/ledger-core/split-register-p.h index 41bf56da1b..532e6cc5a0 100644 --- a/src/register/ledger-core/split-register-p.h +++ b/src/register/ledger-core/split-register-p.h @@ -137,7 +137,8 @@ CellBlock * sr_get_active_cursor (SplitRegister *reg); void sr_set_last_num (SplitRegister *reg, const char *num); -Account * gnc_split_register_get_account (SplitRegister *reg, int cell_type); +Account * gnc_split_register_get_account (SplitRegister *reg, + const char *cell_name); gboolean gnc_split_register_recn_cell_confirm (char old_flag, gpointer data); diff --git a/src/register/ledger-core/split-register.c b/src/register/ledger-core/split-register.c index f8b117e979..86b0309696 100644 --- a/src/register/ledger-core/split-register.c +++ b/src/register/ledger-core/split-register.c @@ -480,7 +480,7 @@ xaccSRGetSplitAmountVirtLoc (SplitRegister *reg, Split *split, { VirtualLocation v_loc; CursorClass cursor_class; - CellType cell_type; + const char *cell_name; gnc_numeric value; if (!xaccSRGetSplitVirtLoc (reg, split, &v_loc.vcell_loc)) @@ -494,13 +494,13 @@ xaccSRGetSplitAmountVirtLoc (SplitRegister *reg, Split *split, { case CURSOR_CLASS_SPLIT: case CURSOR_CLASS_TRANS: - cell_type = (gnc_numeric_negative_p (value)) ? CRED_CELL : DEBT_CELL; + cell_name = (gnc_numeric_negative_p (value)) ? CRED_CELL : DEBT_CELL; break; default: return FALSE; } - if (!gnc_table_get_cell_location (reg->table, cell_type, + if (!gnc_table_get_cell_location (reg->table, cell_name, v_loc.vcell_loc, &v_loc)) return FALSE; @@ -1520,14 +1520,14 @@ xaccSRSaveRegEntry (SplitRegister *reg, gboolean do_commit) } Account * -gnc_split_register_get_account (SplitRegister *reg, int cell_type) +gnc_split_register_get_account (SplitRegister *reg, const char * cell_name) { const char *name; - if (!gnc_table_layout_get_cell_changed (reg->table->layout, cell_type, TRUE)) + if (!gnc_table_layout_get_cell_changed (reg->table->layout, cell_name, TRUE)) return NULL; - name = gnc_table_layout_get_cell_value (reg->table->layout, cell_type); + name = gnc_table_layout_get_cell_value (reg->table->layout, cell_name); return xaccGetAccountFromFullName (gncGetCurrentGroup (), name, gnc_get_account_separator ()); diff --git a/src/register/register-core/basiccell.c b/src/register/register-core/basiccell.c index 398ca6ec71..7db29c5260 100644 --- a/src/register/register-core/basiccell.c +++ b/src/register/register-core/basiccell.c @@ -33,6 +33,8 @@ * Copyright (c) 2000 Dave Peticolas */ +#include "config.h" + #include #include @@ -43,6 +45,13 @@ /* This static indicates the debugging module that this .o belongs to. */ static short module = MOD_REGISTER; +gboolean +gnc_cell_name_equal (const char * cell_name_1, + const char * cell_name_2) +{ + return (safe_strcmp (cell_name_1, cell_name_2) == 0); +} + BasicCell * gnc_basic_cell_new (void) { @@ -70,7 +79,8 @@ BasicCellHelpValue(BasicCell *cell) static void gnc_basic_cell_clear (BasicCell *cell) { - cell->cell_type = -1; + g_free (cell->cell_name); + cell->cell_name = NULL; cell->changed = FALSE; cell->conditionally_changed = FALSE; @@ -138,10 +148,23 @@ gnc_basic_cell_destroy (BasicCell *cell) } void -gnc_basic_cell_set_name (BasicCell *cell, int cell_type) +gnc_basic_cell_set_name (BasicCell *cell, const char *name) { if (!cell) return; - cell->cell_type = cell_type; + if (cell->cell_name == name) return; + + g_free (cell->cell_name); + cell->cell_name = g_strdup (name); +} + +gboolean +gnc_basic_cell_has_name (BasicCell *cell, const char *name) +{ + if (!cell) return FALSE; + if (!name) return FALSE; + if (!cell->cell_name) return FALSE; + + return (strcmp (name, cell->cell_name) == 0); } void diff --git a/src/register/register-core/basiccell.h b/src/register/register-core/basiccell.h index dfb28c4b6e..2bd807e524 100644 --- a/src/register/register-core/basiccell.h +++ b/src/register/register-core/basiccell.h @@ -191,7 +191,7 @@ typedef enum struct _BasicCell { - int cell_type; + char * cell_name; char * value; /* current value */ char * blank_help; /* help when value is blank */ @@ -232,11 +232,15 @@ struct _BasicCell }; +gboolean gnc_cell_name_equal (const char * cell_name_1, + const char * cell_name_2); + BasicCell * gnc_basic_cell_new (void); void gnc_basic_cell_init (BasicCell *bcell); void gnc_basic_cell_destroy (BasicCell *bcell); -void gnc_basic_cell_set_name (BasicCell *cell, int cell_type); +void gnc_basic_cell_set_name (BasicCell *cell, const char *name); +gboolean gnc_basic_cell_has_name (BasicCell *cell, const char *name); void gnc_basic_cell_set_sample_text (BasicCell *cell, const char *sample_text); diff --git a/src/register/register-core/splitreg.c b/src/register/register-core/splitreg.c index b8da59f7c3..87eac5271e 100644 --- a/src/register/register-core/splitreg.c +++ b/src/register/register-core/splitreg.c @@ -70,7 +70,7 @@ xaccInitSplitRegister (SplitRegister *reg, static void gnc_register_add_cell (SplitRegister *sr, - CellType cell_type, + const char *cell_name, const char *cell_type_name, const char *sample_text, CellAlignment alignment, @@ -84,7 +84,7 @@ gnc_register_add_cell (SplitRegister *sr, cell = gnc_register_make_cell (cell_type_name); - gnc_basic_cell_set_name (cell, cell_type); + gnc_basic_cell_set_name (cell, cell_name); gnc_basic_cell_set_sample_text (cell, sample_text); gnc_basic_cell_set_alignment (cell, alignment); gnc_basic_cell_set_expandable (cell, expandable); @@ -93,10 +93,8 @@ gnc_register_add_cell (SplitRegister *sr, gnc_table_layout_add_cell (sr->table->layout, cell); } -/* ============================================== */ /* configAction strings into the action cell */ /* hack alert -- this stuff really, really should be in a config file ... */ - static void configAction (SplitRegister *reg) { @@ -198,34 +196,6 @@ configAction (SplitRegister *reg) } } -/* ============================================== */ - -static void -set_cell (SplitRegister *reg, CellBlock *cursor, - CellType cell_type, short row, short col) -{ - CellBlock *header; - CellBlock *cursor_sl; - BasicCell *cell; - - header = gnc_table_layout_get_cursor (reg->table->layout, CURSOR_HEADER); - - cursor->start_col = MIN (cursor->start_col, col); - cursor->stop_col = MAX (cursor->stop_col, col); - - header->start_col = MIN (header->start_col, col); - header->stop_col = MAX (header->stop_col, col); - - cell = gnc_table_layout_get_cell (reg->table->layout, cell_type); - gnc_cellblock_set_cell (cursor, row, col, cell); - - cursor_sl = gnc_table_layout_get_cursor (reg->table->layout, - CURSOR_SINGLE_LEDGER); - - if (cursor == cursor_sl) - gnc_cellblock_set_cell (header, row, col, cell); -} - static void copy_cursor_row (SplitRegister *reg, CellBlock *to, CellBlock *from, int row) { @@ -236,15 +206,14 @@ copy_cursor_row (SplitRegister *reg, CellBlock *to, CellBlock *from, int row) BasicCell *cell; cell = gnc_cellblock_get_cell (from, row, col); - if (!cell || cell->cell_type < 0) + if (!cell || !cell->cell_name) continue; - set_cell (reg, to, cell->cell_type, row, col); + gnc_table_layout_set_cell (reg->table->layout, to, + cell->cell_name, row, col); } } -/* ============================================== */ - static void configLayout (SplitRegister *reg) { @@ -265,19 +234,22 @@ configLayout (SplitRegister *reg) curs = gnc_table_layout_get_cursor (reg->table->layout, CURSOR_SINGLE_LEDGER); - set_cell (reg, curs, DATE_CELL, 0, 0); - set_cell (reg, curs, NUM_CELL, 0, 1); - set_cell (reg, curs, DESC_CELL, 0, 2); - set_cell (reg, curs, MXFRM_CELL, 0, 3); - set_cell (reg, curs, RECN_CELL, 0, 4); - if ( reg->template ) { - set_cell( reg, curs, FDEBT_CELL, 0, 5); - set_cell( reg, curs, FCRED_CELL, 0, 6); - } else { - set_cell (reg, curs, DEBT_CELL, 0, 5); - set_cell (reg, curs, CRED_CELL, 0, 6); + gnc_table_layout_set_cell (reg->table->layout, curs, DATE_CELL, 0, 0); + gnc_table_layout_set_cell (reg->table->layout, curs, NUM_CELL, 0, 1); + gnc_table_layout_set_cell (reg->table->layout, curs, DESC_CELL, 0, 2); + gnc_table_layout_set_cell (reg->table->layout, curs, MXFRM_CELL, 0, 3); + gnc_table_layout_set_cell (reg->table->layout, curs, RECN_CELL, 0, 4); + if (reg->template) + { + gnc_table_layout_set_cell (reg->table->layout, curs, FDEBT_CELL, 0, 5); + gnc_table_layout_set_cell (reg->table->layout, curs, FCRED_CELL, 0, 6); } - set_cell (reg, curs, BALN_CELL, 0, 7); + else + { + gnc_table_layout_set_cell (reg->table->layout, curs, DEBT_CELL, 0, 5); + gnc_table_layout_set_cell (reg->table->layout, curs, CRED_CELL, 0, 6); + } + gnc_table_layout_set_cell (reg->table->layout, curs, BALN_CELL, 0, 7); curs_last = curs; curs = gnc_table_layout_get_cursor (reg->table->layout, @@ -285,18 +257,18 @@ configLayout (SplitRegister *reg) copy_cursor_row (reg, curs, curs_last, 0); - set_cell (reg, curs, ACTN_CELL, 1, 1); - set_cell (reg, curs, NOTES_CELL, 1, 2); + gnc_table_layout_set_cell (reg->table->layout, curs, ACTN_CELL, 1, 1); + gnc_table_layout_set_cell (reg->table->layout, curs, NOTES_CELL, 1, 2); curs = gnc_table_layout_get_cursor (reg->table->layout, CURSOR_SINGLE_JOURNAL); - set_cell (reg, curs, DATE_CELL, 0, 0); - set_cell (reg, curs, NUM_CELL, 0, 1); - set_cell (reg, curs, DESC_CELL, 0, 2); - set_cell (reg, curs, TDEBT_CELL, 0, 5); - set_cell (reg, curs, TCRED_CELL, 0, 6); - set_cell (reg, curs, TBALN_CELL, 0, 7); + gnc_table_layout_set_cell (reg->table->layout, curs, DATE_CELL, 0, 0); + gnc_table_layout_set_cell (reg->table->layout, curs, NUM_CELL, 0, 1); + gnc_table_layout_set_cell (reg->table->layout, curs, DESC_CELL, 0, 2); + gnc_table_layout_set_cell (reg->table->layout, curs, TDEBT_CELL, 0, 5); + gnc_table_layout_set_cell (reg->table->layout, curs, TCRED_CELL, 0, 6); + gnc_table_layout_set_cell (reg->table->layout, curs, TBALN_CELL, 0, 7); curs_last = curs; curs = gnc_table_layout_get_cursor (reg->table->layout, @@ -304,21 +276,24 @@ configLayout (SplitRegister *reg) copy_cursor_row (reg, curs, curs_last, 0); - set_cell (reg, curs, NOTES_CELL, 1, 2); + gnc_table_layout_set_cell (reg->table->layout, curs, NOTES_CELL, 1, 2); curs = gnc_table_layout_get_cursor (reg->table->layout, CURSOR_SPLIT); - set_cell (reg, curs, ACTN_CELL, 0, 1); - set_cell (reg, curs, MEMO_CELL, 0, 2); - set_cell (reg, curs, XFRM_CELL, 0, 3); - set_cell (reg, curs, RECN_CELL, 0, 4); - if ( reg->template ) { - set_cell( reg, curs, FDEBT_CELL, 0, 5); - set_cell( reg, curs, FCRED_CELL, 0, 6); - } else { - set_cell (reg, curs, DEBT_CELL, 0, 5); - set_cell (reg, curs, CRED_CELL, 0, 6); + gnc_table_layout_set_cell (reg->table->layout, curs, ACTN_CELL, 0, 1); + gnc_table_layout_set_cell (reg->table->layout, curs, MEMO_CELL, 0, 2); + gnc_table_layout_set_cell (reg->table->layout, curs, XFRM_CELL, 0, 3); + gnc_table_layout_set_cell (reg->table->layout, curs, RECN_CELL, 0, 4); + if (reg->template) + { + gnc_table_layout_set_cell (reg->table->layout, curs, FDEBT_CELL, 0, 5); + gnc_table_layout_set_cell (reg->table->layout, curs, FCRED_CELL, 0, 6); + } + else + { + gnc_table_layout_set_cell (reg->table->layout, curs, DEBT_CELL, 0, 5); + gnc_table_layout_set_cell (reg->table->layout, curs, CRED_CELL, 0, 6); } break; @@ -332,17 +307,20 @@ configLayout (SplitRegister *reg) curs = gnc_table_layout_get_cursor (reg->table->layout, CURSOR_SINGLE_LEDGER); - set_cell (reg, curs, DATE_CELL, 0, 0); - set_cell (reg, curs, NUM_CELL, 0, 1); - set_cell (reg, curs, DESC_CELL, 0, 2); - set_cell (reg, curs, MXFRM_CELL, 0, 3); - set_cell (reg, curs, RECN_CELL, 0, 4); - if ( reg->template ) { - set_cell (reg, curs, FDEBT_CELL, 0, 5); - set_cell (reg, curs, FCRED_CELL, 0, 6); - } else { - set_cell (reg, curs, DEBT_CELL, 0, 5); - set_cell (reg, curs, CRED_CELL, 0, 6); + gnc_table_layout_set_cell (reg->table->layout, curs, DATE_CELL, 0, 0); + gnc_table_layout_set_cell (reg->table->layout, curs, NUM_CELL, 0, 1); + gnc_table_layout_set_cell (reg->table->layout, curs, DESC_CELL, 0, 2); + gnc_table_layout_set_cell (reg->table->layout, curs, MXFRM_CELL, 0, 3); + gnc_table_layout_set_cell (reg->table->layout, curs, RECN_CELL, 0, 4); + if (reg->template) + { + gnc_table_layout_set_cell (reg->table->layout, curs, FDEBT_CELL, 0, 5); + gnc_table_layout_set_cell (reg->table->layout, curs, FCRED_CELL, 0, 6); + } + else + { + gnc_table_layout_set_cell (reg->table->layout, curs, DEBT_CELL, 0, 5); + gnc_table_layout_set_cell (reg->table->layout, curs, CRED_CELL, 0, 6); } curs_last = curs; @@ -351,17 +329,17 @@ configLayout (SplitRegister *reg) copy_cursor_row (reg, curs, curs_last, 0); - set_cell (reg, curs, ACTN_CELL, 1, 1); - set_cell (reg, curs, NOTES_CELL, 1, 2); + gnc_table_layout_set_cell (reg->table->layout, curs, ACTN_CELL, 1, 1); + gnc_table_layout_set_cell (reg->table->layout, curs, NOTES_CELL, 1, 2); curs = gnc_table_layout_get_cursor (reg->table->layout, CURSOR_SINGLE_JOURNAL); - set_cell (reg, curs, DATE_CELL, 0, 0); - set_cell (reg, curs, NUM_CELL, 0, 1); - set_cell (reg, curs, DESC_CELL, 0, 2); - set_cell (reg, curs, TDEBT_CELL, 0, 5); - set_cell (reg, curs, TCRED_CELL, 0, 6); + gnc_table_layout_set_cell (reg->table->layout, curs, DATE_CELL, 0, 0); + gnc_table_layout_set_cell (reg->table->layout, curs, NUM_CELL, 0, 1); + gnc_table_layout_set_cell (reg->table->layout, curs, DESC_CELL, 0, 2); + gnc_table_layout_set_cell (reg->table->layout, curs, TDEBT_CELL, 0, 5); + gnc_table_layout_set_cell (reg->table->layout, curs, TCRED_CELL, 0, 6); curs_last = curs; curs = gnc_table_layout_get_cursor (reg->table->layout, @@ -369,21 +347,24 @@ configLayout (SplitRegister *reg) copy_cursor_row (reg, curs, curs_last, 0); - set_cell (reg, curs, NOTES_CELL, 1, 2); + gnc_table_layout_set_cell (reg->table->layout, curs, NOTES_CELL, 1, 2); curs = gnc_table_layout_get_cursor (reg->table->layout, CURSOR_SPLIT); - set_cell (reg, curs, ACTN_CELL, 0, 1); - set_cell (reg, curs, MEMO_CELL, 0, 2); - set_cell (reg, curs, XFRM_CELL, 0, 3); - set_cell (reg, curs, RECN_CELL, 0, 4); - if ( reg->template ) { - set_cell (reg, curs, FDEBT_CELL, 0, 5); - set_cell (reg, curs, FCRED_CELL, 0, 6); - } else { - set_cell (reg, curs, DEBT_CELL, 0, 5); - set_cell (reg, curs, CRED_CELL, 0, 6); + gnc_table_layout_set_cell (reg->table->layout, curs, ACTN_CELL, 0, 1); + gnc_table_layout_set_cell (reg->table->layout, curs, MEMO_CELL, 0, 2); + gnc_table_layout_set_cell (reg->table->layout, curs, XFRM_CELL, 0, 3); + gnc_table_layout_set_cell (reg->table->layout, curs, RECN_CELL, 0, 4); + if (reg->template) + { + gnc_table_layout_set_cell (reg->table->layout, curs, FDEBT_CELL, 0, 5); + gnc_table_layout_set_cell (reg->table->layout, curs, FCRED_CELL, 0, 6); + } + else + { + gnc_table_layout_set_cell (reg->table->layout, curs, DEBT_CELL, 0, 5); + gnc_table_layout_set_cell (reg->table->layout, curs, CRED_CELL, 0, 6); } break; @@ -396,16 +377,16 @@ configLayout (SplitRegister *reg) curs = gnc_table_layout_get_cursor (reg->table->layout, CURSOR_SINGLE_LEDGER); - set_cell (reg, curs, DATE_CELL, 0, 0); - set_cell (reg, curs, NUM_CELL, 0, 1); - set_cell (reg, curs, DESC_CELL, 0, 2); - set_cell (reg, curs, MXFRM_CELL, 0, 3); - set_cell (reg, curs, RECN_CELL, 0, 4); - set_cell (reg, curs, SHRS_CELL, 0, 5); - set_cell (reg, curs, PRIC_CELL, 0, 6); - set_cell (reg, curs, DEBT_CELL, 0, 7); - set_cell (reg, curs, CRED_CELL, 0, 8); - set_cell (reg, curs, BALN_CELL, 0, 9); + gnc_table_layout_set_cell (reg->table->layout, curs, DATE_CELL, 0, 0); + gnc_table_layout_set_cell (reg->table->layout, curs, NUM_CELL, 0, 1); + gnc_table_layout_set_cell (reg->table->layout, curs, DESC_CELL, 0, 2); + gnc_table_layout_set_cell (reg->table->layout, curs, MXFRM_CELL, 0, 3); + gnc_table_layout_set_cell (reg->table->layout, curs, RECN_CELL, 0, 4); + gnc_table_layout_set_cell (reg->table->layout, curs, SHRS_CELL, 0, 5); + gnc_table_layout_set_cell (reg->table->layout, curs, PRIC_CELL, 0, 6); + gnc_table_layout_set_cell (reg->table->layout, curs, DEBT_CELL, 0, 7); + gnc_table_layout_set_cell (reg->table->layout, curs, CRED_CELL, 0, 8); + gnc_table_layout_set_cell (reg->table->layout, curs, BALN_CELL, 0, 9); curs_last = curs; curs = gnc_table_layout_get_cursor (reg->table->layout, @@ -413,19 +394,19 @@ configLayout (SplitRegister *reg) copy_cursor_row (reg, curs, curs_last, 0); - set_cell (reg, curs, ACTN_CELL, 1, 1); - set_cell (reg, curs, NOTES_CELL, 1, 2); + gnc_table_layout_set_cell (reg->table->layout, curs, ACTN_CELL, 1, 1); + gnc_table_layout_set_cell (reg->table->layout, curs, NOTES_CELL, 1, 2); curs = gnc_table_layout_get_cursor (reg->table->layout, CURSOR_SINGLE_JOURNAL); - set_cell (reg, curs, DATE_CELL, 0, 0); - set_cell (reg, curs, NUM_CELL, 0, 1); - set_cell (reg, curs, DESC_CELL, 0, 2); - set_cell (reg, curs, TSHRS_CELL, 0, 5); - set_cell (reg, curs, TDEBT_CELL, 0, 7); - set_cell (reg, curs, TCRED_CELL, 0, 8); - set_cell (reg, curs, TBALN_CELL, 0, 9); + gnc_table_layout_set_cell (reg->table->layout, curs, DATE_CELL, 0, 0); + gnc_table_layout_set_cell (reg->table->layout, curs, NUM_CELL, 0, 1); + gnc_table_layout_set_cell (reg->table->layout, curs, DESC_CELL, 0, 2); + gnc_table_layout_set_cell (reg->table->layout, curs, TSHRS_CELL, 0, 5); + gnc_table_layout_set_cell (reg->table->layout, curs, TDEBT_CELL, 0, 7); + gnc_table_layout_set_cell (reg->table->layout, curs, TCRED_CELL, 0, 8); + gnc_table_layout_set_cell (reg->table->layout, curs, TBALN_CELL, 0, 9); curs_last = curs; curs = gnc_table_layout_get_cursor (reg->table->layout, @@ -433,19 +414,19 @@ configLayout (SplitRegister *reg) copy_cursor_row (reg, curs, curs_last, 0); - set_cell (reg, curs, NOTES_CELL, 1, 2); + gnc_table_layout_set_cell (reg->table->layout, curs, NOTES_CELL, 1, 2); curs = gnc_table_layout_get_cursor (reg->table->layout, CURSOR_SPLIT); - set_cell (reg, curs, ACTN_CELL, 0, 1); - set_cell (reg, curs, MEMO_CELL, 0, 2); - set_cell (reg, curs, XFRM_CELL, 0, 3); - set_cell (reg, curs, RECN_CELL, 0, 4); - set_cell (reg, curs, SHRS_CELL, 0, 5); - set_cell (reg, curs, PRIC_CELL, 0, 6); - set_cell (reg, curs, DEBT_CELL, 0, 7); - set_cell (reg, curs, CRED_CELL, 0, 8); + gnc_table_layout_set_cell (reg->table->layout, curs, ACTN_CELL, 0, 1); + gnc_table_layout_set_cell (reg->table->layout, curs, MEMO_CELL, 0, 2); + gnc_table_layout_set_cell (reg->table->layout, curs, XFRM_CELL, 0, 3); + gnc_table_layout_set_cell (reg->table->layout, curs, RECN_CELL, 0, 4); + gnc_table_layout_set_cell (reg->table->layout, curs, SHRS_CELL, 0, 5); + gnc_table_layout_set_cell (reg->table->layout, curs, PRIC_CELL, 0, 6); + gnc_table_layout_set_cell (reg->table->layout, curs, DEBT_CELL, 0, 7); + gnc_table_layout_set_cell (reg->table->layout, curs, CRED_CELL, 0, 8); break; } @@ -456,15 +437,15 @@ configLayout (SplitRegister *reg) curs = gnc_table_layout_get_cursor (reg->table->layout, CURSOR_SINGLE_LEDGER); - set_cell (reg, curs, DATE_CELL, 0, 0); - set_cell (reg, curs, NUM_CELL, 0, 1); - set_cell (reg, curs, DESC_CELL, 0, 2); - set_cell (reg, curs, MXFRM_CELL, 0, 3); - set_cell (reg, curs, RECN_CELL, 0, 4); - set_cell (reg, curs, SHRS_CELL, 0, 5); - set_cell (reg, curs, PRIC_CELL, 0, 6); - set_cell (reg, curs, DEBT_CELL, 0, 7); - set_cell (reg, curs, CRED_CELL, 0, 8); + gnc_table_layout_set_cell (reg->table->layout, curs, DATE_CELL, 0, 0); + gnc_table_layout_set_cell (reg->table->layout, curs, NUM_CELL, 0, 1); + gnc_table_layout_set_cell (reg->table->layout, curs, DESC_CELL, 0, 2); + gnc_table_layout_set_cell (reg->table->layout, curs, MXFRM_CELL, 0, 3); + gnc_table_layout_set_cell (reg->table->layout, curs, RECN_CELL, 0, 4); + gnc_table_layout_set_cell (reg->table->layout, curs, SHRS_CELL, 0, 5); + gnc_table_layout_set_cell (reg->table->layout, curs, PRIC_CELL, 0, 6); + gnc_table_layout_set_cell (reg->table->layout, curs, DEBT_CELL, 0, 7); + gnc_table_layout_set_cell (reg->table->layout, curs, CRED_CELL, 0, 8); curs_last = curs; curs = gnc_table_layout_get_cursor (reg->table->layout, @@ -472,18 +453,18 @@ configLayout (SplitRegister *reg) copy_cursor_row (reg, curs, curs_last, 0); - set_cell (reg, curs, ACTN_CELL, 1, 1); - set_cell (reg, curs, NOTES_CELL, 1, 2); + gnc_table_layout_set_cell (reg->table->layout, curs, ACTN_CELL, 1, 1); + gnc_table_layout_set_cell (reg->table->layout, curs, NOTES_CELL, 1, 2); curs = gnc_table_layout_get_cursor (reg->table->layout, CURSOR_SINGLE_JOURNAL); - set_cell (reg, curs, DATE_CELL, 0, 0); - set_cell (reg, curs, NUM_CELL, 0, 1); - set_cell (reg, curs, DESC_CELL, 0, 2); - set_cell (reg, curs, TSHRS_CELL, 0, 5); - set_cell (reg, curs, TDEBT_CELL, 0, 7); - set_cell (reg, curs, TCRED_CELL, 0, 8); + gnc_table_layout_set_cell (reg->table->layout, curs, DATE_CELL, 0, 0); + gnc_table_layout_set_cell (reg->table->layout, curs, NUM_CELL, 0, 1); + gnc_table_layout_set_cell (reg->table->layout, curs, DESC_CELL, 0, 2); + gnc_table_layout_set_cell (reg->table->layout, curs, TSHRS_CELL, 0, 5); + gnc_table_layout_set_cell (reg->table->layout, curs, TDEBT_CELL, 0, 7); + gnc_table_layout_set_cell (reg->table->layout, curs, TCRED_CELL, 0, 8); curs_last = curs; curs = gnc_table_layout_get_cursor (reg->table->layout, @@ -491,22 +472,23 @@ configLayout (SplitRegister *reg) copy_cursor_row (reg, curs, curs_last, 0); - set_cell (reg, curs, NOTES_CELL, 1, 2); + gnc_table_layout_set_cell (reg->table->layout, curs, NOTES_CELL, 1, 2); curs = gnc_table_layout_get_cursor (reg->table->layout, CURSOR_SPLIT); - set_cell (reg, curs, ACTN_CELL, 0, 1); - set_cell (reg, curs, MEMO_CELL, 0, 2); - set_cell (reg, curs, XFRM_CELL, 0, 3); - set_cell (reg, curs, RECN_CELL, 0, 4); - set_cell (reg, curs, SHRS_CELL, 0, 5); - set_cell (reg, curs, PRIC_CELL, 0, 6); - set_cell (reg, curs, DEBT_CELL, 0, 7); - set_cell (reg, curs, CRED_CELL, 0, 8); + gnc_table_layout_set_cell (reg->table->layout, curs, ACTN_CELL, 0, 1); + gnc_table_layout_set_cell (reg->table->layout, curs, MEMO_CELL, 0, 2); + gnc_table_layout_set_cell (reg->table->layout, curs, XFRM_CELL, 0, 3); + gnc_table_layout_set_cell (reg->table->layout, curs, RECN_CELL, 0, 4); + gnc_table_layout_set_cell (reg->table->layout, curs, SHRS_CELL, 0, 5); + gnc_table_layout_set_cell (reg->table->layout, curs, PRIC_CELL, 0, 6); + gnc_table_layout_set_cell (reg->table->layout, curs, DEBT_CELL, 0, 7); + gnc_table_layout_set_cell (reg->table->layout, curs, CRED_CELL, 0, 8); break; } + /* --------------------------------------------------------- */ default: PERR ("unknown register type %d \n", reg->type); @@ -514,8 +496,6 @@ configLayout (SplitRegister *reg) } } -/* ============================================== */ - SplitRegister * gnc_register_new (SplitRegisterType type, SplitRegisterStyle style, @@ -546,8 +526,6 @@ gnc_register_new (SplitRegisterType type, return reg; } -/* ============================================== */ - static void mallocCursors (SplitRegister *reg) { @@ -595,6 +573,8 @@ mallocCursors (SplitRegister *reg) cursor = gnc_cellblock_new (1, num_cols, CURSOR_SINGLE_LEDGER); gnc_table_layout_add_cursor (reg->table->layout, cursor); + gnc_table_layout_set_primary_cursor (reg->table->layout, cursor); + cursor = gnc_cellblock_new (2, num_cols, CURSOR_DOUBLE_LEDGER); gnc_table_layout_add_cursor (reg->table->layout, cursor); @@ -609,8 +589,6 @@ mallocCursors (SplitRegister *reg) gnc_table_layout_add_cursor (reg->table->layout, cursor); } -/* ============================================== */ - static void xaccInitSplitRegister (SplitRegister *reg, SplitRegisterType type, @@ -945,8 +923,6 @@ xaccInitSplitRegister (SplitRegister *reg, } } -/* ============================================== */ - void xaccConfigSplitRegister (SplitRegister *reg, SplitRegisterType newtype, @@ -966,8 +942,6 @@ xaccConfigSplitRegister (SplitRegister *reg, gnc_table_realize_gui (reg->table); } -/* ============================================== */ - void xaccDestroySplitRegister (SplitRegister *reg) { @@ -997,8 +971,6 @@ xaccDestroySplitRegister (SplitRegister *reg) g_free (reg); } -/* ============================================== */ - static CursorClass sr_cellblock_cursor_class (SplitRegister *reg, CellBlock *cursor) { @@ -1008,8 +980,6 @@ sr_cellblock_cursor_class (SplitRegister *reg, CellBlock *cursor) return xaccCursorNameToClass (cursor->cursor_name); } -/* ============================================== */ - CursorClass xaccSplitRegisterGetCurrentCursorClass (SplitRegister *reg) { @@ -1025,8 +995,6 @@ xaccSplitRegisterGetCurrentCursorClass (SplitRegister *reg) return sr_cellblock_cursor_class (reg, table->current_cursor); } -/* ============================================== */ - CursorClass xaccSplitRegisterGetCursorClass (SplitRegister *reg, VirtualCellLocation vcell_loc) @@ -1048,8 +1016,6 @@ xaccSplitRegisterGetCursorClass (SplitRegister *reg, return sr_cellblock_cursor_class (reg, vcell->cellblock); } -/* ============================================== */ - CursorClass xaccCursorNameToClass (const char *cursor_name) { @@ -1067,56 +1033,3 @@ xaccCursorNameToClass (const char *cursor_name) return CURSOR_CLASS_NONE; } - -/* keep in sync with CellType enum */ -static const char *cell_names[] = -{ - "date", - "num", - "description", - "reconcile", - "balance", - "action", - "account", - "memo", - "credit", - "debit", - "price", - "shares", - "transfer", - "trans-credit", - "trans-debit", - "trans-shares", - "trans-balance", - "notes", - "credit formula", - "debit formula", -}; - -const char * -xaccSplitRegisterGetCellTypeName (CellType type) -{ - if (type < 0) - return NULL; - if (type >= CELL_TYPE_COUNT) - return NULL; - - return cell_names[type]; -} - -CellType -xaccSplitRegisterGetCellTypeFromName (const char *name) -{ - CellType type; - - if (name == NULL) - return NO_CELL; - - for (type = 0; type < CELL_TYPE_COUNT; type++) - if (safe_strcmp (name, cell_names[type]) == 0) - return type; - - return NO_CELL; -} - -/* ============ END OF FILE ===================== */ diff --git a/src/register/register-core/splitreg.h b/src/register/register-core/splitreg.h index f1817f3510..95d2f8f04e 100644 --- a/src/register/register-core/splitreg.h +++ b/src/register/register-core/splitreg.h @@ -41,8 +41,8 @@ * Copyright (c) 1998, 1999, 2000 Linas Vepstas */ -#ifndef XACC_SPLITREG_H -#define XACC_SPLITREG_H +#ifndef SPLITREG_H +#define SPLITREG_H #include "Account.h" /* FIXME No Engine headers!!! */ @@ -73,33 +73,29 @@ typedef enum NUM_REGISTER_TYPES } SplitRegisterType; -/* These values are used to identify the cells in the register. */ -/* Keep these in sync with the cell_names array in splitreg.c. */ -typedef enum -{ - NO_CELL = -1, - DATE_CELL = 0, - NUM_CELL, - DESC_CELL, - RECN_CELL, - BALN_CELL, - ACTN_CELL, - XFRM_CELL, - MEMO_CELL, - CRED_CELL, - DEBT_CELL, - PRIC_CELL, - SHRS_CELL, - MXFRM_CELL, /* MXFRM is the "mirrored" transfer-from account */ - TCRED_CELL, /* T* cells are transaction summary cells */ - TDEBT_CELL, - TSHRS_CELL, - TBALN_CELL, - NOTES_CELL, - FCRED_CELL, // formula credit, used by the template ledger - FDEBT_CELL, // formula debit, used by the template ledger - CELL_TYPE_COUNT, -} CellType; +/* Cell Names */ +#define DATE_CELL "date" +#define NUM_CELL "num" +#define DESC_CELL "description" +#define RECN_CELL "reconcile" +#define BALN_CELL "balance" +#define ACTN_CELL "action" +#define XFRM_CELL "account" +#define MEMO_CELL "memo" +#define DEBT_CELL "debit" +#define CRED_CELL "credit" +#define PRIC_CELL "price" +#define SHRS_CELL "shares" +#define MXFRM_CELL "transfer" + +/* T* cells are transaction summary cells */ +#define TDEBT_CELL "trans-debit" +#define TCRED_CELL "trans-credit" +#define TSHRS_CELL "trans-shares" +#define TBALN_CELL "trans-balance" +#define NOTES_CELL "notes" +#define FDEBT_CELL "debit formula" +#define FCRED_CELL "credit-formula" /* * enumerated display styles @@ -199,10 +195,4 @@ CursorClass xaccSplitRegisterGetCursorClass (SplitRegister *reg, CursorClass xaccCursorNameToClass (const char *cursor_name); -const char * xaccSplitRegisterGetCellTypeName (CellType type); -CellType xaccSplitRegisterGetCellTypeFromName (const char *name); - - -#endif /* XACC_SPLITREG_H */ - -/* ============ END OF FILE ===================== */ +#endif diff --git a/src/register/register-core/table-allgui.c b/src/register/register-core/table-allgui.c index c1769a858c..cbefad672f 100644 --- a/src/register/register-core/table-allgui.c +++ b/src/register/register-core/table-allgui.c @@ -164,24 +164,24 @@ gnc_table_restore_current_cursor (Table *table, table->current_cursor, buffer); } -int -gnc_table_get_current_cell_type (Table *table) +const char * +gnc_table_get_current_cell_name (Table *table) { if (table == NULL) - return -1; + return NULL; - return gnc_table_get_cell_type (table, table->current_cursor_loc); + return gnc_table_get_cell_name (table, table->current_cursor_loc); } gboolean gnc_table_get_current_cell_location (Table *table, - int cell_type, + const char *cell_name, VirtualLocation *virt_loc) { if (table == NULL) return FALSE; - return gnc_table_get_cell_location (table, cell_type, + return gnc_table_get_cell_location (table, cell_name, table->current_cursor_loc.vcell_loc, virt_loc); } @@ -229,12 +229,12 @@ gnc_table_get_entry_internal (Table *table, VirtualLocation virt_loc, gboolean *conditionally_changed) { TableGetEntryHandler entry_handler; + const char *cell_name; const char *entry; - int cell_type; - cell_type = gnc_table_get_cell_type (table, virt_loc); + cell_name = gnc_table_get_cell_name (table, virt_loc); - entry_handler = gnc_table_model_get_entry_handler (table->model, cell_type); + entry_handler = gnc_table_model_get_entry_handler (table->model, cell_name); if (!entry_handler) return ""; entry = entry_handler (virt_loc, FALSE, @@ -254,7 +254,7 @@ gnc_table_get_entry (Table *table, VirtualLocation virt_loc) BasicCell *cell; cell = gnc_table_get_cell (table, virt_loc); - if (!cell || cell->cell_type < 0) + if (!cell || !cell->cell_name) return ""; if (virt_cell_loc_equal (table->current_cursor_loc.vcell_loc, @@ -269,7 +269,7 @@ gnc_table_get_entry (Table *table, VirtualLocation virt_loc) } entry_handler = gnc_table_model_get_entry_handler (table->model, - cell->cell_type); + cell->cell_name); if (!entry_handler) return ""; entry = entry_handler (virt_loc, TRUE, NULL, @@ -284,15 +284,15 @@ CellIOFlags gnc_table_get_io_flags (Table *table, VirtualLocation virt_loc) { TableGetCellIOFlagsHandler io_flags_handler; - int cell_type; + const char *cell_name; if (!table || !table->model) return XACC_CELL_ALLOW_NONE; - cell_type = gnc_table_get_cell_type (table, virt_loc); + cell_name = gnc_table_get_cell_name (table, virt_loc); io_flags_handler = gnc_table_model_get_io_flags_handler (table->model, - cell_type); + cell_name); if (!io_flags_handler) return XACC_CELL_ALLOW_NONE; @@ -303,15 +303,15 @@ const char * gnc_table_get_label (Table *table, VirtualLocation virt_loc) { TableGetLabelHandler label_handler; + const char *cell_name; const char *label; - int cell_type; if (!table || !table->model) return ""; - cell_type = gnc_table_get_cell_type (table, virt_loc); + cell_name = gnc_table_get_cell_name (table, virt_loc); - label_handler = gnc_table_model_get_label_handler (table->model, cell_type); + label_handler = gnc_table_model_get_label_handler (table->model, cell_name); if (!label_handler) return ""; @@ -326,15 +326,15 @@ guint32 gnc_table_get_fg_color (Table *table, VirtualLocation virt_loc) { TableGetFGColorHandler fg_color_handler; - int cell_type; + const char *cell_name; if (!table || !table->model) return 0x0; /* black */ - cell_type = gnc_table_get_cell_type (table, virt_loc); + cell_name = gnc_table_get_cell_name (table, virt_loc); fg_color_handler = gnc_table_model_get_fg_color_handler (table->model, - cell_type); + cell_name); if (!fg_color_handler) return 0x0; @@ -346,7 +346,7 @@ gnc_table_get_bg_color (Table *table, VirtualLocation virt_loc, gboolean *hatching) { TableGetBGColorHandler bg_color_handler; - int cell_type; + const char *cell_name; if (hatching) *hatching = FALSE; @@ -354,10 +354,10 @@ gnc_table_get_bg_color (Table *table, VirtualLocation virt_loc, if (!table || !table->model) return 0xffffff; /* white */ - cell_type = gnc_table_get_cell_type (table, virt_loc); + cell_name = gnc_table_get_cell_name (table, virt_loc); bg_color_handler = gnc_table_model_get_bg_color_handler (table->model, - cell_type); + cell_name); if (!bg_color_handler) return 0x0; @@ -370,15 +370,15 @@ gnc_table_get_borders (Table *table, VirtualLocation virt_loc, PhysicalCellBorders *borders) { TableGetCellBorderHandler cell_border_handler; - int cell_type; + const char *cell_name; if (!table || !table->model) return; - cell_type = gnc_table_get_cell_type (table, virt_loc); + cell_name = gnc_table_get_cell_name (table, virt_loc); cell_border_handler = gnc_table_model_get_cell_border_handler (table->model, - cell_type); + cell_name); if (!cell_border_handler) return; @@ -444,21 +444,21 @@ gnc_table_get_cell (Table *table, VirtualLocation virt_loc) virt_loc.phys_col_offset); } -int -gnc_table_get_cell_type (Table *table, VirtualLocation virt_loc) +const char * +gnc_table_get_cell_name (Table *table, VirtualLocation virt_loc) { BasicCell *cell; cell = gnc_table_get_cell (table, virt_loc); if (cell == NULL) - return -1; + return NULL; - return cell->cell_type; + return cell->cell_name; } gboolean gnc_table_get_cell_location (Table *table, - int cell_type, + const char *cell_name, VirtualCellLocation vcell_loc, VirtualLocation *virt_loc) { @@ -479,15 +479,12 @@ gnc_table_get_cell_location (Table *table, for (cell_col = 0; cell_col < cellblock->num_cols; cell_col++) { BasicCell *cell; - int ctype; cell = gnc_cellblock_get_cell (cellblock, cell_row, cell_col); if (!cell) return FALSE; - ctype = cell->cell_type; - - if (ctype == cell_type) + if (gnc_basic_cell_has_name (cell, cell_name)) { if (virt_loc != NULL) { @@ -1082,15 +1079,15 @@ gboolean gnc_table_confirm_change (Table *table, VirtualLocation virt_loc) { TableConfirmHandler confirm_handler; - int cell_type; + const char *cell_name; if (!table || !table->model) return TRUE; - cell_type = gnc_table_get_cell_type (table, virt_loc); + cell_name = gnc_table_get_cell_name (table, virt_loc); confirm_handler = gnc_table_model_get_confirm_handler (table->model, - cell_type); + cell_name); if (!confirm_handler) return TRUE; diff --git a/src/register/register-core/table-allgui.h b/src/register/register-core/table-allgui.h index dbc0fcc097..4bc013d82b 100644 --- a/src/register/register-core/table-allgui.h +++ b/src/register/register-core/table-allgui.h @@ -159,10 +159,10 @@ void gnc_table_save_current_cursor (Table *table, CursorBuffer *buffer); void gnc_table_restore_current_cursor (Table *table, CursorBuffer *buffer); -int gnc_table_get_current_cell_type (Table *table); +const char * gnc_table_get_current_cell_name (Table *table); gboolean gnc_table_get_current_cell_location (Table *table, - int cell_type, + const char *cell_name, VirtualLocation *virt_loc); @@ -203,11 +203,11 @@ char * gnc_table_get_help (Table *table); BasicCell * gnc_table_get_cell (Table *table, VirtualLocation virt_loc); -int gnc_table_get_cell_type (Table *table, +const char * gnc_table_get_cell_name (Table *table, VirtualLocation virt_loc); gboolean gnc_table_get_cell_location (Table *table, - int cell_type, + const char * cell_name, VirtualCellLocation vcell_loc, VirtualLocation *virt_loc); diff --git a/src/register/register-core/table-layout.c b/src/register/register-core/table-layout.c index 65caacf781..6afb36d83a 100644 --- a/src/register/register-core/table-layout.c +++ b/src/register/register-core/table-layout.c @@ -36,12 +36,14 @@ struct table_layout_struct { GList *cells; /* The cells in the table */ GList *cursors; /* The cursors in the table */ + + CellBlock *primary_cursor; }; typedef struct _CellBuffer CellBuffer; struct _CellBuffer { - int cell_type; + char * cell_name; char * value; guint32 changed; guint32 conditionally_changed; @@ -105,7 +107,7 @@ gnc_table_layout_add_cell (TableLayout *layout, { BasicCell *list_cell = node->data; - if (list_cell->cell_type == cell->cell_type) + if (gnc_basic_cell_has_name (list_cell, cell->cell_name)) { if (list_cell == cell) return; @@ -122,7 +124,7 @@ gnc_table_layout_add_cell (TableLayout *layout, } BasicCell * -gnc_table_layout_get_cell (TableLayout *layout, int cell_type) +gnc_table_layout_get_cell (TableLayout *layout, const char *cell_name) { GList *node; @@ -132,7 +134,7 @@ gnc_table_layout_get_cell (TableLayout *layout, int cell_type) { BasicCell *list_cell = node->data; - if (list_cell->cell_type == cell_type) + if (gnc_basic_cell_has_name (list_cell, cell_name)) return list_cell; } @@ -140,13 +142,13 @@ gnc_table_layout_get_cell (TableLayout *layout, int cell_type) } const char * -gnc_table_layout_get_cell_value (TableLayout *layout, int cell_type) +gnc_table_layout_get_cell_value (TableLayout *layout, const char * cell_name) { BasicCell *cell; g_return_val_if_fail (layout != NULL, NULL); - cell = gnc_table_layout_get_cell (layout, cell_type); + cell = gnc_table_layout_get_cell (layout, cell_name); if (!cell) return NULL; return gnc_basic_cell_get_value (cell); @@ -154,14 +156,14 @@ gnc_table_layout_get_cell_value (TableLayout *layout, int cell_type) gboolean gnc_table_layout_get_cell_changed (TableLayout *layout, - int cell_type, + const char *cell_name, gboolean include_conditional) { BasicCell *cell; g_return_val_if_fail (layout != NULL, FALSE); - cell = gnc_table_layout_get_cell (layout, cell_type); + cell = gnc_table_layout_get_cell (layout, cell_name); if (!cell) return FALSE; if (!include_conditional) @@ -236,6 +238,50 @@ gnc_table_layout_get_cursors (TableLayout *layout) return layout->cursors; } +void +gnc_table_layout_set_primary_cursor (TableLayout *layout, + CellBlock *cursor) +{ + g_return_if_fail (layout != NULL); + layout->primary_cursor = cursor; +} + +void +gnc_table_layout_set_cell (TableLayout *layout, + CellBlock *cursor, + const char *cell_name, + int row, int col) +{ + CellBlock *header; + BasicCell *cell; + + g_return_if_fail (layout != NULL); + g_return_if_fail (layout->primary_cursor != NULL); + g_return_if_fail (cursor != NULL); + g_return_if_fail (cell_name != NULL); + g_return_if_fail (row >= 0); + g_return_if_fail (col >= 0); + g_return_if_fail (row < cursor->num_rows); + g_return_if_fail (col < cursor->num_cols); + + header = gnc_table_layout_get_cursor (layout, CURSOR_HEADER); + cell = gnc_table_layout_get_cell (layout, cell_name); + + g_return_if_fail (header != NULL); + g_return_if_fail (cell != NULL); + + cursor->start_col = MIN (cursor->start_col, col); + cursor->stop_col = MAX (cursor->stop_col, col); + + header->start_col = MIN (header->start_col, col); + header->stop_col = MAX (header->stop_col, col); + + gnc_cellblock_set_cell (cursor, row, col, cell); + + if (cursor == layout->primary_cursor) + gnc_cellblock_set_cell (header, row, col, cell); +} + CursorBuffer * gnc_cursor_buffer_new (void) { @@ -252,6 +298,9 @@ destroy_cell_buffer (CellBuffer *cb) if (cb == NULL) return; + g_free (cb->cell_name); + cb->cell_name = NULL; + g_free (cb->value); cb->value = NULL; @@ -296,6 +345,7 @@ save_cell (BasicCell *bcell) cb = g_new0 (CellBuffer, 1); + cb->cell_name = g_strdup (bcell->cell_name); cb->value = g_strdup (bcell->value); cb->changed = bcell->changed; cb->conditionally_changed = bcell->conditionally_changed; @@ -325,7 +375,6 @@ gnc_table_layout_save_cursor (TableLayout *layout, continue; cb = save_cell (list_cell); - cb->cell_type = list_cell->cell_type; buffer->cell_buffers = g_list_prepend (buffer->cell_buffers, cb); } @@ -377,7 +426,7 @@ gnc_table_layout_restore_cursor (TableLayout *layout, CellBuffer *cb = node->data; BasicCell *cell; - cell = gnc_table_layout_get_cell (layout, cb->cell_type); + cell = gnc_table_layout_get_cell (layout, cb->cell_name); restore_cell (cell, cb, cursor); } diff --git a/src/register/register-core/table-layout.h b/src/register/register-core/table-layout.h index 4fdf84118d..6db2e8c4ff 100644 --- a/src/register/register-core/table-layout.h +++ b/src/register/register-core/table-layout.h @@ -44,11 +44,12 @@ void gnc_table_layout_destroy (TableLayout *layout); void gnc_table_layout_add_cell (TableLayout *layout, BasicCell *cell); -BasicCell * gnc_table_layout_get_cell (TableLayout *layout, int cell_type); +BasicCell * gnc_table_layout_get_cell (TableLayout *layout, + const char *cell_name); const char * gnc_table_layout_get_cell_value (TableLayout *layout, - int cell_type); + const char *cell_name); gboolean gnc_table_layout_get_cell_changed (TableLayout *layout, - int cell_type, + const char *cell_name, gboolean include_conditional); GList * gnc_table_layout_get_cells (TableLayout *layout); @@ -61,6 +62,14 @@ CellBlock * gnc_table_layout_get_cursor (TableLayout *layout, GList * gnc_table_layout_get_cursors (TableLayout *layout); +void gnc_table_layout_set_primary_cursor (TableLayout *layout, + CellBlock *cursor); + +void gnc_table_layout_set_cell (TableLayout *layout, + CellBlock *cursor, + const char *cell_name, + int row, int col); + CursorBuffer * gnc_cursor_buffer_new (void); void gnc_cursor_buffer_destroy (CursorBuffer *buffer); diff --git a/src/register/register-core/table-model.c b/src/register/register-core/table-model.c index 3e53548c4a..54d3cb438b 100644 --- a/src/register/register-core/table-model.c +++ b/src/register/register-core/table-model.c @@ -29,11 +29,11 @@ #include "table-model.h" -#define DEFAULT_HANDLER (-1) +#define DEFAULT_HANDLER "" typedef struct { - int cell_type; + char *cell_name; gpointer handler; } HandlerNode; @@ -41,7 +41,7 @@ typedef struct static GHashTable * gnc_table_model_handler_hash_new (void) { - return g_hash_table_new (g_int_hash, g_int_equal); + return g_hash_table_new (g_str_hash, g_str_equal); } static void @@ -49,6 +49,9 @@ hash_destroy_helper (gpointer key, gpointer value, gpointer user_data) { HandlerNode *node = value; + g_free (node->cell_name); + node->cell_name = NULL; + g_free (node); } @@ -62,50 +65,57 @@ gnc_table_model_handler_hash_destroy (GHashTable *hash) } static void -gnc_table_model_handler_hash_remove (GHashTable *hash, int cell_type) +gnc_table_model_handler_hash_remove (GHashTable *hash, const char *cell_name) { HandlerNode *node; if (!hash) return; - node = g_hash_table_lookup (hash, &cell_type); + node = g_hash_table_lookup (hash, cell_name); if (!node) return; + g_free (node->cell_name); + node->cell_name = NULL; + g_free (node); } static void -gnc_table_model_handler_hash_insert (GHashTable *hash, int cell_type, +gnc_table_model_handler_hash_insert (GHashTable *hash, + const char *cell_name, gpointer handler) { HandlerNode *node; g_return_if_fail (hash != NULL); - g_return_if_fail ((cell_type >= 0) || (cell_type == DEFAULT_HANDLER)); + g_return_if_fail (cell_name != NULL); - gnc_table_model_handler_hash_remove (hash, cell_type); + gnc_table_model_handler_hash_remove (hash, cell_name); if (!handler) return; node = g_new0 (HandlerNode, 1); - node->cell_type = cell_type; + node->cell_name = g_strdup (cell_name); node->handler = handler; - g_hash_table_insert (hash, &node->cell_type, node); + g_hash_table_insert (hash, node->cell_name, node); } static gpointer -gnc_table_model_handler_hash_lookup (GHashTable *hash, int cell_type) +gnc_table_model_handler_hash_lookup (GHashTable *hash, const char *cell_name) { HandlerNode *node; if (!hash) return NULL; - node = g_hash_table_lookup (hash, &cell_type); - if (node) return node->handler; + if (cell_name) + { + node = g_hash_table_lookup (hash, cell_name); + if (node) return node->handler; + } - cell_type = DEFAULT_HANDLER; - node = g_hash_table_lookup (hash, &cell_type); + cell_name = DEFAULT_HANDLER; + node = g_hash_table_lookup (hash, cell_name); if (node) return node->handler; return NULL; @@ -163,13 +173,13 @@ gnc_table_model_destroy (TableModel *model) void gnc_table_model_set_entry_handler (TableModel *model, TableGetEntryHandler entry_handler, - int cell_type) + const char * cell_name) { g_return_if_fail (model != NULL); - g_return_if_fail (cell_type >= 0); + g_return_if_fail (cell_name != NULL); gnc_table_model_handler_hash_insert (model->entry_handlers, - cell_type, + cell_name, entry_handler); } @@ -185,24 +195,24 @@ gnc_table_model_set_default_entry_handler } TableGetEntryHandler -gnc_table_model_get_entry_handler (TableModel *model, int cell_type) +gnc_table_model_get_entry_handler (TableModel *model, const char * cell_name) { g_return_val_if_fail (model != NULL, NULL); return gnc_table_model_handler_hash_lookup (model->entry_handlers, - cell_type); + cell_name); } void gnc_table_model_set_label_handler (TableModel *model, TableGetLabelHandler label_handler, - int cell_type) + const char * cell_name) { g_return_if_fail (model != NULL); - g_return_if_fail (cell_type >= 0); + g_return_if_fail (cell_name != NULL); gnc_table_model_handler_hash_insert (model->label_handlers, - cell_type, + cell_name, label_handler); } @@ -218,25 +228,25 @@ gnc_table_model_set_default_label_handler } TableGetLabelHandler -gnc_table_model_get_label_handler (TableModel *model, int cell_type) +gnc_table_model_get_label_handler (TableModel *model, const char * cell_name) { g_return_val_if_fail (model != NULL, NULL); return gnc_table_model_handler_hash_lookup (model->label_handlers, - cell_type); + cell_name); } void gnc_table_model_set_io_flags_handler (TableModel *model, TableGetCellIOFlagsHandler io_flags_handler, - int cell_type) + const char * cell_name) { g_return_if_fail (model != NULL); - g_return_if_fail (cell_type >= 0); + g_return_if_fail (cell_name != NULL); gnc_table_model_handler_hash_insert (model->io_flags_handlers, - cell_type, + cell_name, io_flags_handler); } @@ -254,25 +264,25 @@ gnc_table_model_set_default_io_flags_handler TableGetCellIOFlagsHandler gnc_table_model_get_io_flags_handler (TableModel *model, - int cell_type) + const char * cell_name) { g_return_val_if_fail (model != NULL, NULL); return gnc_table_model_handler_hash_lookup (model->io_flags_handlers, - cell_type); + cell_name); } void gnc_table_model_set_fg_color_handler (TableModel *model, TableGetFGColorHandler fg_color_handler, - int cell_type) + const char * cell_name) { g_return_if_fail (model != NULL); - g_return_if_fail (cell_type >= 0); + g_return_if_fail (cell_name != NULL); gnc_table_model_handler_hash_insert (model->fg_color_handlers, - cell_type, + cell_name, fg_color_handler); } @@ -290,25 +300,25 @@ gnc_table_model_set_default_fg_color_handler TableGetFGColorHandler gnc_table_model_get_fg_color_handler (TableModel *model, - int cell_type) + const char * cell_name) { g_return_val_if_fail (model != NULL, NULL); return gnc_table_model_handler_hash_lookup (model->fg_color_handlers, - cell_type); + cell_name); } void gnc_table_model_set_bg_color_handler (TableModel *model, TableGetBGColorHandler bg_color_handler, - int cell_type) + const char * cell_name) { g_return_if_fail (model != NULL); - g_return_if_fail (cell_type >= 0); + g_return_if_fail (cell_name != NULL); gnc_table_model_handler_hash_insert (model->bg_color_handlers, - cell_type, + cell_name, bg_color_handler); } @@ -326,25 +336,25 @@ gnc_table_model_set_default_bg_color_handler TableGetBGColorHandler gnc_table_model_get_bg_color_handler (TableModel *model, - int cell_type) + const char * cell_name) { g_return_val_if_fail (model != NULL, NULL); return gnc_table_model_handler_hash_lookup (model->bg_color_handlers, - cell_type); + cell_name); } void gnc_table_model_set_cell_border_handler (TableModel *model, TableGetCellBorderHandler cell_border_handler, - int cell_type) + const char * cell_name) { g_return_if_fail (model != NULL); - g_return_if_fail (cell_type >= 0); + g_return_if_fail (cell_name != NULL); gnc_table_model_handler_hash_insert (model->cell_border_handlers, - cell_type, + cell_name, cell_border_handler); } @@ -362,25 +372,25 @@ gnc_table_model_set_default_cell_border_handler TableGetCellBorderHandler gnc_table_model_get_cell_border_handler (TableModel *model, - int cell_type) + const char * cell_name) { g_return_val_if_fail (model != NULL, NULL); return gnc_table_model_handler_hash_lookup (model->cell_border_handlers, - cell_type); + cell_name); } void gnc_table_model_set_confirm_handler (TableModel *model, TableConfirmHandler confirm_handler, - int cell_type) + const char * cell_name) { g_return_if_fail (model != NULL); - g_return_if_fail (cell_type >= 0); + g_return_if_fail (cell_name != NULL); gnc_table_model_handler_hash_insert (model->confirm_handlers, - cell_type, + cell_name, confirm_handler); } @@ -398,10 +408,10 @@ gnc_table_model_set_default_confirm_handler TableConfirmHandler gnc_table_model_get_confirm_handler (TableModel *model, - int cell_type) + const char * cell_name) { g_return_val_if_fail (model != NULL, NULL); return gnc_table_model_handler_hash_lookup (model->confirm_handlers, - cell_type); + cell_name); } diff --git a/src/register/register-core/table-model.h b/src/register/register-core/table-model.h index 2aa98df5fa..2083d6f693 100644 --- a/src/register/register-core/table-model.h +++ b/src/register/register-core/table-model.h @@ -118,78 +118,78 @@ void gnc_table_model_destroy (TableModel *model); void gnc_table_model_set_entry_handler (TableModel *model, TableGetEntryHandler entry_handler, - int cell_type); + const char * cell_name); void gnc_table_model_set_default_entry_handler (TableModel *model, TableGetEntryHandler entry_handler); TableGetEntryHandler gnc_table_model_get_entry_handler (TableModel *model, - int cell_type); + const char * cell_name); void gnc_table_model_set_label_handler (TableModel *model, TableGetLabelHandler label_handler, - int cell_type); + const char * cell_name); void gnc_table_model_set_default_label_handler (TableModel *model, TableGetLabelHandler label_handler); TableGetLabelHandler gnc_table_model_get_label_handler (TableModel *model, - int cell_type); + const char * cell_name); void gnc_table_model_set_io_flags_handler (TableModel *model, TableGetCellIOFlagsHandler io_flags_handler, - int cell_type); + const char * cell_name); void gnc_table_model_set_default_io_flags_handler (TableModel *model, TableGetCellIOFlagsHandler io_flags_handler); TableGetCellIOFlagsHandler gnc_table_model_get_io_flags_handler (TableModel *model, - int cell_type); + const char * cell_name); void gnc_table_model_set_fg_color_handler (TableModel *model, TableGetFGColorHandler io_flags_handler, - int cell_type); + const char * cell_name); void gnc_table_model_set_default_fg_color_handler (TableModel *model, TableGetFGColorHandler io_flags_handler); TableGetFGColorHandler gnc_table_model_get_fg_color_handler (TableModel *model, - int cell_type); + const char * cell_name); void gnc_table_model_set_bg_color_handler (TableModel *model, TableGetBGColorHandler io_flags_handler, - int cell_type); + const char * cell_name); void gnc_table_model_set_default_bg_color_handler (TableModel *model, TableGetBGColorHandler io_flags_handler); TableGetBGColorHandler gnc_table_model_get_bg_color_handler (TableModel *model, - int cell_type); + const char * cell_name); void gnc_table_model_set_cell_border_handler (TableModel *model, TableGetCellBorderHandler io_flags_handler, - int cell_type); + const char * cell_name); void gnc_table_model_set_default_cell_border_handler (TableModel *model, TableGetCellBorderHandler io_flags_handler); TableGetCellBorderHandler gnc_table_model_get_cell_border_handler (TableModel *model, - int cell_type); + const char * cell_name); void gnc_table_model_set_confirm_handler (TableModel *model, TableConfirmHandler io_flags_handler, - int cell_type); + const char * cell_name); void gnc_table_model_set_default_confirm_handler (TableModel *model, TableConfirmHandler io_flags_handler); TableConfirmHandler gnc_table_model_get_confirm_handler (TableModel *model, - int cell_type); + const char * cell_name); #endif diff --git a/src/register/register-gnome/gnucash-cursor.c b/src/register/register-gnome/gnucash-cursor.c index 4d3474a6e0..80f0979ae3 100644 --- a/src/register/register-gnome/gnucash-cursor.c +++ b/src/register/register-gnome/gnucash-cursor.c @@ -78,7 +78,7 @@ gnucash_cursor_get_pixel_coords (GnucashCursor *cursor, BasicCell *cell; cell = gnc_cellblock_get_cell (vcell->cellblock, 0, col); - if (cell && cell->cell_type >= 0) + if (cell && cell->cell_name) break; } @@ -95,7 +95,7 @@ gnucash_cursor_get_pixel_coords (GnucashCursor *cursor, BasicCell *cell; cell = gnc_cellblock_get_cell (vcell->cellblock, 0, col); - if (cell && cell->cell_type >= 0) + if (cell && cell->cell_name) break; } diff --git a/src/register/register-gnome/gnucash-header.c b/src/register/register-gnome/gnucash-header.c index f39192ea24..6ee974fdb9 100644 --- a/src/register/register-gnome/gnucash-header.c +++ b/src/register/register-gnome/gnucash-header.c @@ -145,7 +145,7 @@ gnucash_header_draw (GnomeCanvasItem *item, GdkDrawable *drawable, w = cd->pixel_width; cell = gnc_cellblock_get_cell (cb, i, j); - if (!cell || cell->cell_type < 0) + if (!cell || !cell->cell_name) { xpaint += w; continue; diff --git a/src/register/register-gnome/gnucash-style.c b/src/register/register-gnome/gnucash-style.c index 86619d0fad..4876c0df4e 100644 --- a/src/register/register-gnome/gnucash-style.c +++ b/src/register/register-gnome/gnucash-style.c @@ -859,21 +859,91 @@ gnucash_style_set_register_hint_font_name (const char *name) gdk_font_ref (gnucash_register_hint_font); } +typedef struct +{ + char *cell_name; + int width; +} WidthNode; + +GNCHeaderWidths +gnc_header_widths_new (void) +{ + return g_hash_table_new (g_str_hash, g_str_equal); +} + +static void +header_width_destroy_helper (gpointer key, gpointer value, gpointer user_data) +{ + WidthNode *wn = value; + + g_free (wn->cell_name); + wn->cell_name = NULL; + + g_free (wn); +} + void -gnucash_sheet_get_header_widths (GnucashSheet *sheet, int *header_widths) +gnc_header_widths_destroy (GNCHeaderWidths widths) +{ + if (!widths) return; + g_hash_table_foreach (widths, header_width_destroy_helper, NULL); + g_hash_table_destroy (widths); +} + +void +gnc_header_widths_set_width (GNCHeaderWidths widths, + const char *cell_name, + int width) +{ + WidthNode *wn; + + g_return_if_fail (widths != NULL); + g_return_if_fail (cell_name != NULL); + + wn = g_hash_table_lookup (widths, cell_name); + if (!wn) + { + wn = g_new0 (WidthNode, 1); + + wn->cell_name = g_strdup (cell_name); + + g_hash_table_insert (widths, wn->cell_name, wn); + } + + wn->width = width; +} + +int +gnc_header_widths_get_width (GNCHeaderWidths widths, + const char *cell_name) +{ + WidthNode *wn; + + g_return_val_if_fail (widths != NULL, 0); + + wn = g_hash_table_lookup (widths, cell_name); + if (!wn) + return 0; + + return wn->width; +} + +void +gnucash_sheet_get_header_widths (GnucashSheet *sheet, + GNCHeaderWidths widths) { SheetBlockStyle *style; CellBlock *header; int row, col; - g_return_if_fail(sheet != NULL); - g_return_if_fail(GNUCASH_IS_SHEET(sheet)); + g_return_if_fail (sheet != NULL); + g_return_if_fail (GNUCASH_IS_SHEET(sheet)); style = gnucash_sheet_get_style_from_cursor (sheet, CURSOR_HEADER); - g_return_if_fail(style != NULL); + g_return_if_fail (style != NULL); header = style->cursor; - g_return_if_fail(header != NULL); + g_return_if_fail (header != NULL); for (row = 0; row < style->nrows; row++) for (col = 0; col < style->ncols; col++) @@ -887,31 +957,31 @@ gnucash_sheet_get_header_widths (GnucashSheet *sheet, int *header_widths) continue; cell = gnc_cellblock_get_cell (header, row, col); - if (!cell) + if (!cell || !cell->cell_name) continue; - if (cell->cell_type < 0) - continue; - - header_widths[cell->cell_type] = cd->pixel_width; + gnc_header_widths_set_width (widths, + cell->cell_name, + cd->pixel_width); } } void -gnucash_sheet_set_header_widths (GnucashSheet *sheet, int *header_widths) +gnucash_sheet_set_header_widths (GnucashSheet *sheet, + GNCHeaderWidths widths) { SheetBlockStyle *style; CellBlock *header; int row, col; - g_return_if_fail(sheet != NULL); - g_return_if_fail(GNUCASH_IS_SHEET(sheet)); + g_return_if_fail (sheet != NULL); + g_return_if_fail (GNUCASH_IS_SHEET(sheet)); style = gnucash_sheet_get_style_from_cursor (sheet, CURSOR_HEADER); - g_return_if_fail(style != NULL); + g_return_if_fail (style != NULL); header = style->cursor; - g_return_if_fail(header != NULL); + g_return_if_fail (header != NULL); for (row = 0; row < style->nrows; row++) for (col = 0; col < style->ncols; col++) @@ -923,16 +993,11 @@ gnucash_sheet_set_header_widths (GnucashSheet *sheet, int *header_widths) row, col); cell = gnc_cellblock_get_cell (header, row, col); - if (!cell) + if (!cell || !cell->cell_name) continue; - if (cell->cell_type < 0) - continue; - - if (header_widths[cell->cell_type] < 0) - continue; - - cd->pixel_width = header_widths[cell->cell_type]; + cd->pixel_width = gnc_header_widths_get_width + (widths, cell->cell_name); } } diff --git a/src/register/register-gnome/gnucash-style.h b/src/register/register-gnome/gnucash-style.h index 091d7bb410..ffb24df51f 100644 --- a/src/register/register-gnome/gnucash-style.h +++ b/src/register/register-gnome/gnucash-style.h @@ -119,14 +119,25 @@ void gnucash_style_config_register_borders (gboolean use_vertical_lines, void gnucash_sheet_get_borders (GnucashSheet *sheet, VirtualLocation virt_loc, PhysicalCellBorders *borders); -void gnucash_sheet_get_header_widths (GnucashSheet *sheet, int *header_widths); -void gnucash_sheet_set_header_widths (GnucashSheet *sheet, int *header_widths); +typedef GHashTable *GNCHeaderWidths; + +GNCHeaderWidths gnc_header_widths_new (void); +void gnc_header_widths_destroy (GNCHeaderWidths widths); +void gnc_header_widths_set_width (GNCHeaderWidths widths, + const char *cell_name, + int width); +int gnc_header_widths_get_width (GNCHeaderWidths widths, + const char *cell_name); + +void gnucash_sheet_get_header_widths (GnucashSheet *sheet, + GNCHeaderWidths widths); +void gnucash_sheet_set_header_widths (GnucashSheet *sheet, + GNCHeaderWidths widths); extern GdkFont *gnucash_register_font; extern GdkFont *gnucash_register_hint_font; - #endif diff --git a/src/register/register-gnome/table-gnome.c b/src/register/register-gnome/table-gnome.c index ff2da4d5d5..8528c40323 100644 --- a/src/register/register-gnome/table-gnome.c +++ b/src/register/register-gnome/table-gnome.c @@ -56,9 +56,8 @@ void gnc_table_save_state (Table *table) { GnucashSheet *sheet; - int header_widths[CELL_TYPE_COUNT]; + GNCHeaderWidths widths; SCM alist; - int i; if (!table) return; @@ -68,34 +67,41 @@ gnc_table_save_state (Table *table) sheet = GNUCASH_SHEET (table->ui_data); - for (i = 0; i < CELL_TYPE_COUNT; i++) - header_widths[i] = -1; + widths = gnc_header_widths_new (); if (!GTK_OBJECT_DESTROYED(GTK_OBJECT(sheet))) - gnucash_sheet_get_header_widths (sheet, header_widths); + gnucash_sheet_get_header_widths (sheet, widths); alist = SCM_EOL; if (gnc_lookup_boolean_option("General", "Save Window Geometry", TRUE)) - for (i = 0; i < CELL_TYPE_COUNT; i++) + { + GList *node = gnc_table_layout_get_cells (table->layout); + + for (; node; node = node->next) { - const char *name; + BasicCell *cell = node->data; + int width; SCM assoc; - if (header_widths[i] <= 0) + width = gnc_header_widths_get_width (widths, + cell->cell_name); + if (width <= 0) continue; - if (i == DESC_CELL) + if (gnc_basic_cell_has_name (cell, DESC_CELL)) continue; - name = xaccSplitRegisterGetCellTypeName (i); - assoc = gh_cons (gh_str02scm(name), - gh_int2scm(header_widths[i])); + assoc = gh_cons (gh_str02scm(cell->cell_name), + gh_int2scm(width)); alist = gh_cons (assoc, alist); } + } if (!gh_null_p (alist)) gnc_set_option ("__gui", "reg_column_widths", alist); + + gnc_header_widths_destroy (widths); } static void @@ -135,12 +141,11 @@ table_destroy_cb (Table *table) void gnc_table_init_gui (gncUIWidget widget, void *data) { - int header_widths[CELL_TYPE_COUNT]; + GNCHeaderWidths widths; GnucashSheet *sheet; GnucashRegister *greg; Table *table; SCM alist; - int i; g_return_if_fail (widget != NULL); g_return_if_fail (GNUCASH_IS_REGISTER (widget)); @@ -158,8 +163,7 @@ gnc_table_init_gui (gncUIWidget widget, void *data) /* config the cell-block styles */ - for (i = 0; i < CELL_TYPE_COUNT; i++) - header_widths[i] = -1; + widths = gnc_header_widths_new (); if (gnc_lookup_boolean_option("General", "Save Window Geometry", TRUE)) alist = gnc_lookup_option ("__gui", "reg_column_widths", @@ -170,32 +174,32 @@ gnc_table_init_gui (gncUIWidget widget, void *data) while (gh_list_p (alist) && !gh_null_p (alist)) { char *name; - CellType ctype; SCM assoc; assoc = gh_car (alist); alist = gh_cdr (alist); name = gh_scm2newstr(gh_car (assoc), NULL); - ctype = xaccSplitRegisterGetCellTypeFromName (name); - if (name) - free(name); - - if (ctype == NO_CELL) + if (!name) continue; - header_widths[ctype] = gh_scm2int(gh_cdr (assoc)); + gnc_header_widths_set_width (widths, name, + gh_scm2int(gh_cdr (assoc))); + + free (name); } gnucash_sheet_create_styles (sheet); - gnucash_sheet_set_header_widths (sheet, header_widths); + gnucash_sheet_set_header_widths (sheet, widths); gnucash_sheet_compile_styles (sheet); gnucash_sheet_table_load (sheet, TRUE); gnucash_sheet_cursor_set_from_table (sheet, TRUE); gnucash_sheet_redraw_all (sheet); + + gnc_header_widths_destroy (widths); } void