diff --git a/src/business/business-ledger/gncEntryLedgerModel.c b/src/business/business-ledger/gncEntryLedgerModel.c index 8b2122a99a..09381eafc4 100644 --- a/src/business/business-ledger/gncEntryLedgerModel.c +++ b/src/business/business-ledger/gncEntryLedgerModel.c @@ -589,7 +589,7 @@ static void gnc_entry_ledger_model_new_handlers (TableModel *model) model->cell_data_copy = ; */ - model->save_handler = gnc_entry_ledger_save_cells; + gnc_table_model_set_post_save_handler (model, gnc_entry_ledger_save_cells); } /** Public Interface ***********************************************/ diff --git a/src/register/ledger-core/split-register-layout.c b/src/register/ledger-core/split-register-layout.c index 22be0d96d0..b44b8fffe6 100644 --- a/src/register/ledger-core/split-register-layout.c +++ b/src/register/ledger-core/split-register-layout.c @@ -588,7 +588,6 @@ gnc_split_register_layout_add_cells (SplitRegister *reg, CELL_ALIGN_LEFT, FALSE, FALSE); - } TableLayout * @@ -604,4 +603,3 @@ gnc_split_register_layout_new (SplitRegister *reg) return layout; } - diff --git a/src/register/ledger-core/split-register-model-save.c b/src/register/ledger-core/split-register-model-save.c index 17efd41340..1773c5d0bd 100644 --- a/src/register/ledger-core/split-register-model-save.c +++ b/src/register/ledger-core/split-register-model-save.c @@ -444,14 +444,15 @@ void gnc_split_register_model_add_save_handlers (TableModel *model) { g_return_if_fail (model != NULL); - model->save_handler = gnc_split_register_save_cells; + gnc_table_model_set_post_save_handler (model, gnc_split_register_save_cells); } void gnc_template_register_model_add_save_handlers (TableModel *model) { g_return_if_fail (model != NULL); - model->save_handler = gnc_split_register_save_template_cells; + gnc_table_model_set_post_save_handler + (model, gnc_split_register_save_template_cells); } SRSaveData * diff --git a/src/register/register-core/table-allgui.c b/src/register/register-core/table-allgui.c index 571457ae8f..83f7c7193e 100644 --- a/src/register/register-core/table-allgui.c +++ b/src/register/register-core/table-allgui.c @@ -526,12 +526,39 @@ gnc_table_get_cell_location (Table *table, void gnc_table_save_cells (Table *table, gpointer save_data) { - if (!table || !table->model->save_handler) + TableSaveHandler save_handler; + GList * cells; + GList * node; + + if (!table) return; gnc_table_leave_update (table, table->current_cursor_loc); - table->model->save_handler (save_data, table->model->handler_user_data); + save_handler = gnc_table_model_get_pre_save_handler (table->model); + if (save_handler) + save_handler (save_data, table->model->handler_user_data); + + cells = gnc_table_layout_get_cells (table->layout); + for (node = cells; node; node = node->next) + { + BasicCell * cell = node->data; + + if (!cell) continue; + + if (!gnc_table_layout_get_cell_changed (table->layout, + cell->cell_name, TRUE)) + continue; + + save_handler = gnc_table_model_get_save_handler (table->model, + cell->cell_name); + if (save_handler) + save_handler (save_data, table->model->handler_user_data); + } + + save_handler = gnc_table_model_get_post_save_handler (table->model); + if (save_handler) + save_handler (save_data, table->model->handler_user_data); } void diff --git a/src/register/register-core/table-model.c b/src/register/register-core/table-model.c index 535425e3a0..9afe8f6bd7 100644 --- a/src/register/register-core/table-model.c +++ b/src/register/register-core/table-model.c @@ -410,7 +410,7 @@ gnc_table_model_set_default_cell_border_handler TableGetCellBorderHandler gnc_table_model_get_cell_border_handler (TableModel *model, - const char * cell_name) + const char * cell_name) { g_return_val_if_fail (model != NULL, NULL); @@ -453,3 +453,65 @@ gnc_table_model_get_confirm_handler (TableModel *model, return gnc_table_model_handler_hash_lookup (model->confirm_handlers, cell_name); } + +void +gnc_table_model_set_save_handler + (TableModel *model, + TableSaveHandler save_handler, + const char * cell_name) +{ + g_return_if_fail (model != NULL); + g_return_if_fail (cell_name != NULL); + + gnc_table_model_handler_hash_insert (model->save_handlers, + cell_name, + save_handler); +} + +void +gnc_table_model_set_pre_save_handler + (TableModel *model, + TableSaveHandler save_handler) +{ + g_return_if_fail (model != NULL); + + model->pre_save_handler = save_handler; +} + +void +gnc_table_model_set_post_save_handler + (TableModel *model, + TableSaveHandler save_handler) +{ + g_return_if_fail (model != NULL); + + model->post_save_handler = save_handler; +} + +TableSaveHandler +gnc_table_model_get_save_handler + (TableModel *model, + const char * cell_name) +{ + g_return_val_if_fail (model != NULL, NULL); + + return gnc_table_model_handler_hash_lookup (model->save_handlers, cell_name); +} + +TableSaveHandler +gnc_table_model_get_pre_save_handler + (TableModel *model) +{ + g_return_val_if_fail (model != NULL, NULL); + + return model->pre_save_handler; +} + +TableSaveHandler +gnc_table_model_get_post_save_handler + (TableModel *model) +{ + g_return_val_if_fail (model != NULL, NULL); + + return model->post_save_handler; +} diff --git a/src/register/register-core/table-model.h b/src/register/register-core/table-model.h index 82bfd10731..9334a3b5e4 100644 --- a/src/register/register-core/table-model.h +++ b/src/register/register-core/table-model.h @@ -102,7 +102,9 @@ typedef struct GHashTable *cell_border_handlers; GHashTable *confirm_handlers; - TableSaveHandler save_handler; + GHashTable *save_handlers; + TableSaveHandler pre_save_handler; + TableSaveHandler post_save_handler; gpointer handler_user_data; @@ -207,4 +209,22 @@ TableConfirmHandler gnc_table_model_get_confirm_handler (TableModel *model, const char * cell_name); +void gnc_table_model_set_save_handler + (TableModel *model, + TableSaveHandler save_handler, + const char * cell_name); +void gnc_table_model_set_pre_save_handler + (TableModel *model, + TableSaveHandler save_handler); +void gnc_table_model_set_post_save_handler + (TableModel *model, + TableSaveHandler save_handler); +TableSaveHandler gnc_table_model_get_save_handler + (TableModel *model, + const char * cell_name); +TableSaveHandler gnc_table_model_get_pre_save_handler + (TableModel *model); +TableSaveHandler gnc_table_model_get_post_save_handler + (TableModel *model); + #endif