diff --git a/src/register/ledger-core/split-register-control.c b/src/register/ledger-core/split-register-control.c index b5e2b2f3ef..a3328b92e6 100644 --- a/src/register/ledger-core/split-register-control.c +++ b/src/register/ledger-core/split-register-control.c @@ -843,6 +843,7 @@ gnc_split_register_traverse (VirtualLocation *p_new_virt_loc, gboolean changed; SRInfo *info; Split *split; + const char *cell_name; if (!reg) return FALSE; @@ -875,15 +876,16 @@ gnc_split_register_traverse (VirtualLocation *p_new_virt_loc, return FALSE; } + /* Get the current cell-name to check it.. */ + cell_name = gnc_table_get_current_cell_name (reg->table); + /* See if we are leaving an account field */ do { - const char *cell_name; ComboCell *cell; Account *account; char *name; - cell_name = gnc_table_get_current_cell_name (reg->table); if (!gnc_cell_name_equal (cell_name, XFRM_CELL) && !gnc_cell_name_equal (cell_name, MXFRM_CELL)) diff --git a/src/register/ledger-core/split-register-model-save.c b/src/register/ledger-core/split-register-model-save.c index bd7abef611..dd65da1a31 100644 --- a/src/register/ledger-core/split-register-model-save.c +++ b/src/register/ledger-core/split-register-model-save.c @@ -72,6 +72,26 @@ gnc_split_register_save_date_cell (BasicCell * cell, xaccTransSetDatePostedTS (sd->trans, &ts); } +static void +gnc_split_register_save_type_cell (BasicCell * cell, + gpointer save_data, + gpointer user_data) +{ + SRSaveData *sd = save_data; + const char *value; + kvp_frame *kvp; + kvp_value *k_val; + + g_return_if_fail (gnc_basic_cell_has_name (cell, TYPE_CELL)); + + value = gnc_basic_cell_get_value (cell); + + kvp = xaccTransGetSlots (sd->trans); + k_val = kvp_value_new_string (value); + kvp_frame_set_slot_path (kvp, k_val, SR_TRANS_TYPE, NULL); + kvp_value_delete (k_val); +} + static void gnc_split_register_save_due_date_cell (BasicCell * cell, gpointer save_data, @@ -537,6 +557,10 @@ gnc_split_register_model_add_save_handlers (TableModel *model) gnc_split_register_save_due_date_cell, DDUE_CELL); + gnc_table_model_set_save_handler (model, + gnc_split_register_save_type_cell, + TYPE_CELL); + gnc_table_model_set_save_handler (model, gnc_split_register_save_num_cell, NUM_CELL); diff --git a/src/register/ledger-core/split-register-model.c b/src/register/ledger-core/split-register-model.c index 7570ddde82..a66eec9c9a 100644 --- a/src/register/ledger-core/split-register-model.c +++ b/src/register/ledger-core/split-register-model.c @@ -625,6 +625,50 @@ gnc_split_register_get_border (VirtualLocation virt_loc, } } +static const char * +gnc_split_register_get_type_entry (VirtualLocation virt_loc, + gboolean translate, + gboolean *conditionally_changed, + gpointer user_data) +{ + SplitRegister *reg = user_data; + Transaction *trans; + kvp_frame *kvp; + kvp_value *val; + + trans = gnc_split_register_get_trans (reg, virt_loc.vcell_loc); + if (!trans) + return NULL; + + kvp = xaccTransGetSlots (trans); + val = kvp_frame_get_slot_path (kvp, SR_TRANS_TYPE, NULL); + if (!val) + { + static char s[2]; + + s[0] = 'I'; + s[1] = '\0'; + + return s; + } + else + return kvp_value_get_string (val); +} + +static char +gnc_split_register_get_type_value (SplitRegister *reg, + VirtualLocation virt_loc) +{ + RecnCell *cell; + + cell = (RecnCell *) + gnc_table_layout_get_cell (reg->table->layout, TYPE_CELL); + if (!cell) + return '\0'; + + return gnc_recn_cell_get_flag (cell); +} + static const char * gnc_split_register_get_due_date_entry (VirtualLocation virt_loc, gboolean translate, @@ -632,29 +676,44 @@ gnc_split_register_get_due_date_entry (VirtualLocation virt_loc, gpointer user_data) { SplitRegister *reg = user_data; + Transaction *trans; + Split *split; + Timespec ts; + gboolean is_current; char type; - type = gnc_recn_cell_get_flag - ((RecnCell *) gnc_table_layout_get_cell (reg->table->layout, TYPE_CELL)); + is_current = virt_cell_loc_equal (reg->table->current_cursor_loc.vcell_loc, + virt_loc.vcell_loc); + + if (is_current) { + type = gnc_split_register_get_type_value (reg, virt_loc); + } else { + const char *typestr = + gnc_split_register_get_type_entry (virt_loc, translate, + conditionally_changed, user_data); + if (typestr != NULL) + type = *typestr; + else + type = '\0'; + } /* Only print the due date for invoice transactions */ - if (type != 'I') + if (type != 'I') { + //PWARN ("returning NULL due_date entry"); return NULL; - - { - Transaction *trans; - Split *split; - Timespec ts; - - split = gnc_split_register_get_split (reg, virt_loc.vcell_loc); - trans = xaccSplitGetParent (split); - if (!trans) - return NULL; - - xaccTransGetDateDueTS (trans, &ts); - - return gnc_print_date (ts); } + + split = gnc_split_register_get_split (reg, virt_loc.vcell_loc); + trans = xaccSplitGetParent (split); + if (!trans) { + //PWARN ("No transaction in due_date entry"); + return NULL; + } + + xaccTransGetDateDueTS (trans, &ts); + //PWARN ("returning valid due_date entry"); + + return gnc_print_date (ts); } static const char * @@ -833,29 +892,6 @@ gnc_split_register_get_recn_entry (VirtualLocation virt_loc, } } -static const char * -gnc_split_register_get_type_entry (VirtualLocation virt_loc, - gboolean translate, - gboolean *conditionally_changed, - gpointer user_data) -{ - SplitRegister *reg = user_data; - Split *split; - - split = gnc_split_register_get_split (reg, virt_loc.vcell_loc); - if (!split) - return NULL; - - { - static char s[2]; - - s[0] = 'I'; - s[1] = '\0'; - - return s; - } -} - static const char * gnc_split_register_get_action_entry (VirtualLocation virt_loc, gboolean translate, @@ -1287,6 +1323,23 @@ gnc_split_register_get_recn_io_flags (VirtualLocation virt_loc, return XACC_CELL_ALLOW_ALL | XACC_CELL_ALLOW_EXACT_ONLY; } +static CellIOFlags +gnc_split_register_get_ddue_io_flags (VirtualLocation virt_loc, + gpointer user_data) +{ + SplitRegister *reg = user_data; + char type; + + type = gnc_split_register_get_type_value (reg, virt_loc); + + /* Only print the due date for invoice transactions */ + if (type != 'I') { + return XACC_CELL_ALLOW_NONE; + } + + return XACC_CELL_ALLOW_ALL; +} + static CellIOFlags gnc_split_register_get_debcred_io_flags (VirtualLocation virt_loc, gpointer user_data) @@ -1815,7 +1868,7 @@ gnc_split_register_model_new (void) */ gnc_table_model_set_io_flags_handler (model, - gnc_split_register_get_standard_io_flags, + gnc_split_register_get_ddue_io_flags, DDUE_CELL); gnc_table_model_set_io_flags_handler diff --git a/src/register/ledger-core/split-register-p.h b/src/register/ledger-core/split-register-p.h index 574c44f197..154528f3fb 100644 --- a/src/register/ledger-core/split-register-p.h +++ b/src/register/ledger-core/split-register-p.h @@ -30,6 +30,7 @@ #define SPLIT_TRANS_STR _("-- Split Transaction --") #define STOCK_SPLIT_STR _("-- Stock Split --") +#define SR_TRANS_TYPE "split-register-trans-type" struct sr_info {