mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
Use per-cell save handlers.
git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@6082 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
parent
53436822d2
commit
68006009cd
@ -39,6 +39,9 @@ struct sr_save_data
|
||||
{
|
||||
Transaction *trans;
|
||||
Split *split;
|
||||
|
||||
gboolean handled_dc; /* We have already handled the debit/credit cells. */
|
||||
gboolean do_scrub; /* Scrub other split at the end. */
|
||||
};
|
||||
|
||||
/* This static indicates the debugging module that this .o belongs to. */
|
||||
@ -93,379 +96,432 @@ gnc_split_register_save_due_date_cell (BasicCell * cell,
|
||||
xaccTransSetDateDueTS (sd->trans, &ts);
|
||||
}
|
||||
|
||||
static void
|
||||
gnc_split_register_save_num_cell (BasicCell * cell,
|
||||
gpointer save_data,
|
||||
gpointer user_data)
|
||||
{
|
||||
SRSaveData *sd = save_data;
|
||||
SplitRegister *reg = user_data;
|
||||
const char *value;
|
||||
|
||||
g_return_if_fail (gnc_basic_cell_has_name (cell, NUM_CELL));
|
||||
|
||||
value = gnc_basic_cell_get_value (cell);
|
||||
|
||||
DEBUG ("NUM: %s\n", value ? value : "(null)");
|
||||
|
||||
xaccTransSetNum (sd->trans, value);
|
||||
|
||||
if (gnc_num_cell_set_last_num ((NumCell *) cell, value))
|
||||
{
|
||||
SRInfo *info = gnc_split_register_get_info (reg);
|
||||
Split *blank_split = xaccSplitLookup (&info->blank_split_guid,
|
||||
gnc_get_current_book ());
|
||||
Transaction *blank_trans = xaccSplitGetParent (blank_split);
|
||||
|
||||
if (sd->trans != blank_trans)
|
||||
gnc_split_register_set_last_num (reg, gnc_basic_cell_get_value (cell));
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gnc_split_register_save_desc_cell (BasicCell * cell,
|
||||
gpointer save_data,
|
||||
gpointer user_data)
|
||||
{
|
||||
SRSaveData *sd = save_data;
|
||||
SplitRegister *reg = user_data;
|
||||
const char *value;
|
||||
|
||||
g_return_if_fail (gnc_basic_cell_has_name (cell, DESC_CELL));
|
||||
|
||||
value = gnc_basic_cell_get_value (cell);
|
||||
|
||||
DEBUG ("DESC: %s", value ? value : "(null)");
|
||||
|
||||
xaccTransSetDescription (sd->trans, value);
|
||||
}
|
||||
|
||||
static void
|
||||
gnc_split_register_save_notes_cell (BasicCell * cell,
|
||||
gpointer save_data,
|
||||
gpointer user_data)
|
||||
{
|
||||
SRSaveData *sd = save_data;
|
||||
SplitRegister *reg = user_data;
|
||||
const char *value;
|
||||
|
||||
g_return_if_fail (gnc_basic_cell_has_name (cell, NOTES_CELL));
|
||||
|
||||
value = gnc_basic_cell_get_value (cell);
|
||||
|
||||
DEBUG ("NOTES: %s", value ? value : "(null)");
|
||||
|
||||
xaccTransSetNotes (sd->trans, value);
|
||||
}
|
||||
|
||||
static void
|
||||
gnc_split_register_save_recn_cell (BasicCell * bcell,
|
||||
gpointer save_data,
|
||||
gpointer user_data)
|
||||
{
|
||||
SRSaveData *sd = save_data;
|
||||
SplitRegister *reg = user_data;
|
||||
RecnCell *cell = (RecnCell *) cell;
|
||||
|
||||
g_return_if_fail (gnc_basic_cell_has_name (bcell, RECN_CELL));
|
||||
|
||||
DEBUG ("RECN: %c", gnc_recn_cell_get_flag (cell));
|
||||
|
||||
xaccSplitSetReconcile (sd->split, gnc_recn_cell_get_flag (cell));
|
||||
}
|
||||
|
||||
static void
|
||||
gnc_split_register_save_actn_cell (BasicCell * cell,
|
||||
gpointer save_data,
|
||||
gpointer user_data)
|
||||
{
|
||||
SRSaveData *sd = save_data;
|
||||
SplitRegister *reg = user_data;
|
||||
const char *value;
|
||||
|
||||
g_return_if_fail (gnc_basic_cell_has_name (cell, ACTN_CELL));
|
||||
|
||||
value = gnc_basic_cell_get_value (cell);
|
||||
|
||||
DEBUG ("ACTN: %s", value ? value : "(null)");
|
||||
|
||||
xaccSplitSetAction (sd->split, value);
|
||||
}
|
||||
|
||||
static void
|
||||
gnc_split_register_save_memo_cell (BasicCell * cell,
|
||||
gpointer save_data,
|
||||
gpointer user_data)
|
||||
{
|
||||
SRSaveData *sd = save_data;
|
||||
SplitRegister *reg = user_data;
|
||||
const char *value;
|
||||
|
||||
g_return_if_fail (gnc_basic_cell_has_name (cell, MEMO_CELL));
|
||||
|
||||
value = gnc_basic_cell_get_value (cell);
|
||||
|
||||
DEBUG ("MEMO: %s", value ? value : "(null)");
|
||||
|
||||
xaccSplitSetMemo (sd->split, value);
|
||||
}
|
||||
|
||||
/* OK, the handling of transfers gets complicated because it depends
|
||||
* on what was displayed to the user. For a multi-line display, we
|
||||
* just reparent the indicated split. For a two-line display, we want
|
||||
* to reparent the "other" split, but only if there is one. XFRM is
|
||||
* the straight split, MXFRM is the mirrored split. */
|
||||
static void
|
||||
gnc_split_register_save_xfrm_cell (BasicCell * cell,
|
||||
gpointer save_data,
|
||||
gpointer user_data)
|
||||
{
|
||||
SRSaveData *sd = save_data;
|
||||
SplitRegister *reg = user_data;
|
||||
Account *old_acc;
|
||||
Account *new_acc;
|
||||
|
||||
g_return_if_fail (gnc_basic_cell_has_name (cell, XFRM_CELL));
|
||||
|
||||
old_acc = xaccSplitGetAccount (sd->split);
|
||||
|
||||
new_acc = gnc_split_register_get_account (reg, XFRM_CELL);
|
||||
|
||||
if ((new_acc != NULL) && (old_acc != new_acc))
|
||||
xaccAccountInsertSplit (new_acc, sd->split);
|
||||
}
|
||||
|
||||
static void
|
||||
gnc_split_register_save_mxfrm_cell (BasicCell * cell,
|
||||
gpointer save_data,
|
||||
gpointer user_data)
|
||||
{
|
||||
SRSaveData *sd = save_data;
|
||||
SplitRegister *reg = user_data;
|
||||
Split * other_split;
|
||||
|
||||
g_return_if_fail (gnc_basic_cell_has_name (cell, MXFRM_CELL));
|
||||
|
||||
other_split = xaccSplitGetOtherSplit (sd->split);
|
||||
|
||||
/* other_split may be null for two very different reasons:
|
||||
* (1) the parent transaction has three or more splits in it,
|
||||
* and so the "other" split is ambiguous, and thus null.
|
||||
* (2) the parent transaction has only this one split as a child.
|
||||
* and "other" is null because there is no other.
|
||||
*
|
||||
* In the case (2), we want to create the other split, so that
|
||||
* the user's request to transfer actually works out. */
|
||||
|
||||
if (!other_split)
|
||||
{
|
||||
other_split = xaccTransGetSplit (sd->trans, 1);
|
||||
|
||||
if (!other_split)
|
||||
{
|
||||
other_split = xaccMallocSplit (gnc_get_current_book ());
|
||||
xaccTransAppendSplit (sd->trans, other_split);
|
||||
}
|
||||
}
|
||||
|
||||
if (other_split)
|
||||
{
|
||||
Account *old_acc;
|
||||
Account *new_acc;
|
||||
|
||||
/* Do some reparenting. Insertion into new account
|
||||
* will automatically delete from the old account. */
|
||||
old_acc = xaccSplitGetAccount (other_split);
|
||||
new_acc = gnc_split_register_get_account (reg, MXFRM_CELL);
|
||||
|
||||
if ((new_acc != NULL) && (old_acc != new_acc))
|
||||
xaccAccountInsertSplit (new_acc, other_split);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gnc_split_register_save_shares_cell (BasicCell * bcell,
|
||||
gpointer save_data,
|
||||
gpointer user_data)
|
||||
{
|
||||
SRSaveData *sd = save_data;
|
||||
SplitRegister *reg = user_data;
|
||||
PriceCell *cell = (PriceCell *) cell;
|
||||
gnc_numeric amount;
|
||||
|
||||
g_return_if_fail (gnc_basic_cell_has_name (bcell, SHRS_CELL));
|
||||
|
||||
amount = gnc_price_cell_get_value (cell);
|
||||
|
||||
DEBUG ("SHRS");
|
||||
|
||||
xaccSplitSetAmount (sd->split, amount);
|
||||
|
||||
sd->do_scrub = TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
gnc_split_register_save_price_cell (BasicCell * bcell,
|
||||
gpointer save_data,
|
||||
gpointer user_data)
|
||||
{
|
||||
SRSaveData *sd = save_data;
|
||||
SplitRegister *reg = user_data;
|
||||
PriceCell *cell = (PriceCell *) cell;
|
||||
gnc_numeric price;
|
||||
|
||||
g_return_if_fail (gnc_basic_cell_has_name (bcell, PRIC_CELL));
|
||||
|
||||
price = gnc_price_cell_get_value (cell);
|
||||
|
||||
DEBUG ("PRIC");
|
||||
|
||||
xaccSplitSetSharePrice (sd->split, price);
|
||||
|
||||
sd->do_scrub = TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
gnc_split_register_save_debcred_cell (BasicCell * bcell,
|
||||
gpointer save_data,
|
||||
gpointer user_data)
|
||||
{
|
||||
SRSaveData *sd = save_data;
|
||||
SplitRegister *reg = user_data;
|
||||
PriceCell *cell;
|
||||
gnc_numeric new_amount;
|
||||
gnc_numeric credit;
|
||||
gnc_numeric debit;
|
||||
|
||||
g_return_if_fail (gnc_basic_cell_has_name (bcell, DEBT_CELL) ||
|
||||
gnc_basic_cell_has_name (bcell, CRED_CELL));
|
||||
|
||||
if (sd->handled_dc)
|
||||
return;
|
||||
|
||||
cell = (PriceCell *) gnc_table_layout_get_cell (reg->table->layout,
|
||||
CRED_CELL);
|
||||
credit = gnc_price_cell_get_value (cell);
|
||||
|
||||
cell = (PriceCell *) gnc_table_layout_get_cell (reg->table->layout,
|
||||
DEBT_CELL);
|
||||
debit = gnc_price_cell_get_value (cell);
|
||||
|
||||
new_amount = gnc_numeric_sub_fixed (debit, credit);
|
||||
|
||||
xaccSplitSetValue (sd->split, new_amount);
|
||||
|
||||
sd->handled_dc = TRUE;
|
||||
sd->do_scrub = TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
gnc_split_register_save_cells (gpointer save_data,
|
||||
gpointer user_data)
|
||||
{
|
||||
SRSaveData *sd = save_data;
|
||||
SplitRegister *reg = user_data;
|
||||
SRInfo *info = gnc_split_register_get_info (reg);
|
||||
Transaction *trans;
|
||||
Split *other_split = NULL;
|
||||
Split *split;
|
||||
Split *other_split;
|
||||
|
||||
g_return_if_fail (sd != NULL);
|
||||
|
||||
trans = sd->trans;
|
||||
split = sd->split;
|
||||
if (!sd->do_scrub)
|
||||
return;
|
||||
|
||||
if (gnc_table_layout_get_cell_changed (reg->table->layout, NUM_CELL, TRUE))
|
||||
other_split = xaccSplitGetOtherSplit (sd->split);
|
||||
|
||||
xaccSplitScrub (sd->split);
|
||||
|
||||
if (other_split)
|
||||
{
|
||||
BasicCell *cell;
|
||||
const char *value;
|
||||
gnc_numeric value = xaccSplitGetValue (sd->split);
|
||||
|
||||
value = gnc_table_layout_get_cell_value (reg->table->layout, NUM_CELL);
|
||||
value = gnc_numeric_neg (value);
|
||||
|
||||
DEBUG ("NUM: %s\n", value ? value : "(null)");
|
||||
xaccSplitSetValue (other_split, value);
|
||||
|
||||
xaccTransSetNum (trans, value);
|
||||
|
||||
cell = gnc_table_layout_get_cell (reg->table->layout, NUM_CELL);
|
||||
|
||||
if (gnc_num_cell_set_last_num ((NumCell *) cell, value))
|
||||
{
|
||||
SRInfo *info = gnc_split_register_get_info (reg);
|
||||
Split *blank_split = xaccSplitLookup(&info->blank_split_guid,
|
||||
gnc_get_current_book ());
|
||||
Transaction *blank_trans = xaccSplitGetParent (blank_split);
|
||||
|
||||
if (trans != blank_trans)
|
||||
gnc_split_register_set_last_num (reg, gnc_basic_cell_get_value (cell));
|
||||
}
|
||||
}
|
||||
|
||||
if (gnc_table_layout_get_cell_changed (reg->table->layout, DESC_CELL, TRUE))
|
||||
{
|
||||
const char *value;
|
||||
|
||||
value = gnc_table_layout_get_cell_value (reg->table->layout, DESC_CELL);
|
||||
|
||||
DEBUG ("DESC: %s", value ? value : "(null)");
|
||||
|
||||
xaccTransSetDescription (trans, value);
|
||||
}
|
||||
|
||||
if (gnc_table_layout_get_cell_changed (reg->table->layout, NOTES_CELL, TRUE))
|
||||
{
|
||||
const char *value;
|
||||
|
||||
value = gnc_table_layout_get_cell_value (reg->table->layout, NOTES_CELL);
|
||||
|
||||
DEBUG ("NOTES: %s", value ? value : "(null)");
|
||||
|
||||
xaccTransSetNotes (trans, value);
|
||||
}
|
||||
|
||||
if (gnc_table_layout_get_cell_changed (reg->table->layout, RECN_CELL, TRUE))
|
||||
{
|
||||
RecnCell *cell;
|
||||
|
||||
cell = (RecnCell *) gnc_table_layout_get_cell (reg->table->layout,
|
||||
RECN_CELL);
|
||||
|
||||
DEBUG ("RECN: %c", gnc_recn_cell_get_flag (cell));
|
||||
|
||||
xaccSplitSetReconcile (split, gnc_recn_cell_get_flag (cell));
|
||||
}
|
||||
|
||||
if (gnc_table_layout_get_cell_changed (reg->table->layout, ACTN_CELL, TRUE))
|
||||
{
|
||||
const char *value;
|
||||
|
||||
value = gnc_table_layout_get_cell_value (reg->table->layout, ACTN_CELL);
|
||||
|
||||
DEBUG ("ACTN: %s", value ? value : "(null)");
|
||||
|
||||
xaccSplitSetAction (split, value);
|
||||
}
|
||||
|
||||
if (gnc_table_layout_get_cell_changed (reg->table->layout, MEMO_CELL, TRUE))
|
||||
{
|
||||
const char *value;
|
||||
|
||||
value = gnc_table_layout_get_cell_value (reg->table->layout, MEMO_CELL);
|
||||
|
||||
DEBUG ("MEMO: %s", value ? value : "(null)");
|
||||
|
||||
xaccSplitSetMemo (split, value);
|
||||
}
|
||||
|
||||
/* -------------------------------------------------------------- */
|
||||
/* OK, the handling of transfers gets complicated because it depends
|
||||
* on what was displayed to the user. For a multi-line display, we
|
||||
* just reparent the indicated split, its it, and that's that. For
|
||||
* a two-line display, we want to reparent the "other" split, but
|
||||
* only if there is one. XFRM is the straight split, MXFRM is the
|
||||
* mirrored split. */
|
||||
|
||||
if (gnc_table_layout_get_cell_changed (reg->table->layout, XFRM_CELL, TRUE))
|
||||
{
|
||||
Account *old_acc;
|
||||
Account *new_acc;
|
||||
|
||||
old_acc = xaccSplitGetAccount (split);
|
||||
|
||||
new_acc = gnc_split_register_get_account (reg, XFRM_CELL);
|
||||
|
||||
if ((new_acc != NULL) && (old_acc != new_acc))
|
||||
xaccAccountInsertSplit (new_acc, split);
|
||||
}
|
||||
|
||||
if (reg->style == REG_STYLE_LEDGER && !info->trans_expanded)
|
||||
other_split = xaccSplitGetOtherSplit (split);
|
||||
|
||||
if (gnc_table_layout_get_cell_changed (reg->table->layout, MXFRM_CELL, TRUE))
|
||||
{
|
||||
other_split = xaccSplitGetOtherSplit (split);
|
||||
|
||||
/* other_split may be null for two very different reasons:
|
||||
* (1) the parent transaction has three or more splits in it,
|
||||
* and so the "other" split is ambiguous, and thus null.
|
||||
* (2) the parent transaction has only this one split as a child.
|
||||
* and "other" is null because there is no other.
|
||||
*
|
||||
* In the case (2), we want to create the other split, so that
|
||||
* the user's request to transfer actually works out.
|
||||
*/
|
||||
|
||||
if (!other_split)
|
||||
{
|
||||
other_split = xaccTransGetSplit (trans, 1);
|
||||
if (!other_split)
|
||||
{
|
||||
other_split = xaccMallocSplit (gnc_get_current_book ());
|
||||
xaccTransAppendSplit (trans, other_split);
|
||||
}
|
||||
}
|
||||
|
||||
if (other_split)
|
||||
{
|
||||
Account *old_acc, *new_acc;
|
||||
|
||||
/* do some reparenting. Insertion into new account will automatically
|
||||
* delete from the old account */
|
||||
old_acc = xaccSplitGetAccount (other_split);
|
||||
new_acc = gnc_split_register_get_account (reg, MXFRM_CELL);
|
||||
|
||||
if ((new_acc != NULL) && (old_acc != new_acc))
|
||||
xaccAccountInsertSplit (new_acc, other_split);
|
||||
}
|
||||
}
|
||||
|
||||
if (gnc_table_layout_get_cell_changed (reg->table->layout, SHRS_CELL, TRUE))
|
||||
{
|
||||
PriceCell *cell;
|
||||
gnc_numeric amount;
|
||||
|
||||
cell = (PriceCell *) gnc_table_layout_get_cell (reg->table->layout,
|
||||
SHRS_CELL);
|
||||
amount = gnc_price_cell_get_value (cell);
|
||||
|
||||
DEBUG ("SHRS");
|
||||
|
||||
xaccSplitSetAmount (split, amount);
|
||||
}
|
||||
|
||||
if (gnc_table_layout_get_cell_changed (reg->table->layout, PRIC_CELL, TRUE))
|
||||
{
|
||||
PriceCell *cell;
|
||||
gnc_numeric price;
|
||||
|
||||
cell = (PriceCell *) gnc_table_layout_get_cell (reg->table->layout,
|
||||
PRIC_CELL);
|
||||
price = gnc_price_cell_get_value (cell);
|
||||
|
||||
DEBUG ("PRIC");
|
||||
|
||||
xaccSplitSetSharePrice (split, price);
|
||||
}
|
||||
|
||||
if (gnc_table_layout_get_cell_changed (reg->table->layout,
|
||||
DEBT_CELL, TRUE) ||
|
||||
gnc_table_layout_get_cell_changed (reg->table->layout,
|
||||
CRED_CELL, TRUE))
|
||||
{
|
||||
PriceCell *cell;
|
||||
gnc_numeric new_amount;
|
||||
gnc_numeric credit;
|
||||
gnc_numeric debit;
|
||||
|
||||
cell = (PriceCell *) gnc_table_layout_get_cell (reg->table->layout,
|
||||
CRED_CELL);
|
||||
credit = gnc_price_cell_get_value (cell);
|
||||
|
||||
cell = (PriceCell *) gnc_table_layout_get_cell (reg->table->layout,
|
||||
DEBT_CELL);
|
||||
debit = gnc_price_cell_get_value (cell);
|
||||
|
||||
new_amount = gnc_numeric_sub_fixed (debit, credit);
|
||||
|
||||
xaccSplitSetValue (split, new_amount);
|
||||
}
|
||||
|
||||
if (gnc_table_layout_get_cell_changed (reg->table->layout,
|
||||
DEBT_CELL, TRUE) ||
|
||||
gnc_table_layout_get_cell_changed (reg->table->layout,
|
||||
CRED_CELL, TRUE) ||
|
||||
gnc_table_layout_get_cell_changed (reg->table->layout,
|
||||
PRIC_CELL, TRUE) ||
|
||||
gnc_table_layout_get_cell_changed (reg->table->layout,
|
||||
SHRS_CELL, TRUE))
|
||||
{
|
||||
xaccSplitScrub (split);
|
||||
|
||||
if (other_split)
|
||||
{
|
||||
gnc_numeric value = xaccSplitGetValue (split);
|
||||
|
||||
value = gnc_numeric_neg (value);
|
||||
|
||||
xaccSplitSetValue (other_split, value);
|
||||
|
||||
xaccSplitScrub (other_split);
|
||||
}
|
||||
xaccSplitScrub (other_split);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gnc_split_register_save_template_cells (gpointer save_data,
|
||||
gpointer user_data)
|
||||
gnc_template_register_save_unexpected_cell (BasicCell * cell,
|
||||
gpointer save_data,
|
||||
gpointer user_data)
|
||||
{
|
||||
SRSaveData *sd = save_data;
|
||||
PERR ("unexpected changed fields in a template register");
|
||||
}
|
||||
|
||||
static void
|
||||
gnc_template_register_save_xfrm_cell (BasicCell * cell,
|
||||
gpointer save_data,
|
||||
gpointer user_data)
|
||||
{
|
||||
SRSaveData *sd = save_data;
|
||||
SplitRegister *reg = user_data;
|
||||
SRInfo *info = gnc_split_register_get_info (reg);
|
||||
Transaction *trans;
|
||||
Split *split;
|
||||
Split *other_split = NULL;
|
||||
kvp_frame *kvpf;
|
||||
AccountGroup *template_ag;
|
||||
Account *template_acc;
|
||||
kvp_value *tag_val;
|
||||
BasicCell *cell;
|
||||
SRInfo *info = gnc_split_register_get_info (reg);
|
||||
Account *template_acc;
|
||||
const GUID *acctGUID;
|
||||
kvp_frame *kvpf;
|
||||
Account *acct;
|
||||
|
||||
DEBUG (" ");
|
||||
g_return_if_fail (gnc_basic_cell_has_name (cell, XFRM_CELL));
|
||||
|
||||
g_return_if_fail (sd != NULL);
|
||||
kvpf = xaccSplitGetSlots (sd->split);
|
||||
|
||||
trans = sd->trans;
|
||||
split = sd->split;
|
||||
/* save the account GUID into the kvp_data. */
|
||||
acct = gnc_split_register_get_account (reg, XFRM_CELL);
|
||||
if (!acct)
|
||||
{
|
||||
PERR ("unknown account");
|
||||
return;
|
||||
}
|
||||
|
||||
acctGUID = xaccAccountGetGUID (acct);
|
||||
|
||||
kvp_frame_set_slot_path (kvpf, kvp_value_new_guid(acctGUID),
|
||||
GNC_SX_ID, GNC_SX_ACCOUNT, NULL);
|
||||
|
||||
kvpf = xaccSplitGetSlots (sd->split);
|
||||
|
||||
template_acc = xaccAccountLookup (&info->template_account,
|
||||
gnc_get_current_book ());
|
||||
|
||||
if (gnc_table_layout_get_cell_changed (reg->table->layout,
|
||||
DATE_CELL, TRUE) ||
|
||||
gnc_table_layout_get_cell_changed (reg->table->layout,
|
||||
DDUE_CELL, TRUE) ||
|
||||
gnc_table_layout_get_cell_changed (reg->table->layout,
|
||||
NUM_CELL, TRUE) ||
|
||||
gnc_table_layout_get_cell_changed (reg->table->layout,
|
||||
RECN_CELL, TRUE))
|
||||
{
|
||||
PERR( "unexpected changed fields in a template register\n" );
|
||||
}
|
||||
/* set the actual account to the fake account for these templates */
|
||||
xaccAccountInsertSplit (template_acc, sd->split);
|
||||
}
|
||||
|
||||
/* We'll be using the Split's KVP frame a lot */
|
||||
kvpf = xaccSplitGetSlots (split);
|
||||
static void
|
||||
gnc_template_register_save_mxfrm_cell (BasicCell * cell,
|
||||
gpointer save_data,
|
||||
gpointer user_data)
|
||||
{
|
||||
}
|
||||
|
||||
if (gnc_table_layout_get_cell_changed (reg->table->layout, XFRM_CELL, TRUE))
|
||||
{
|
||||
Account *acct;
|
||||
const GUID *acctGUID;
|
||||
static void
|
||||
gnc_template_register_save_debcred_cell (BasicCell * cell,
|
||||
gpointer save_data,
|
||||
gpointer user_data)
|
||||
{
|
||||
SRSaveData *sd = save_data;
|
||||
SplitRegister *reg = user_data;
|
||||
kvp_frame *kvpf;
|
||||
const char *value;
|
||||
gnc_numeric new_amount;
|
||||
gnc_numeric credit;
|
||||
gnc_numeric debit;
|
||||
|
||||
/* save the account GUID into the kvp_data. */
|
||||
acct = gnc_split_register_get_account (reg, XFRM_CELL);
|
||||
if (!acct)
|
||||
{
|
||||
PERR ("unknown account");
|
||||
return;
|
||||
}
|
||||
g_return_if_fail (gnc_basic_cell_has_name (cell, FDEBT_CELL) ||
|
||||
gnc_basic_cell_has_name (cell, FCRED_CELL));
|
||||
|
||||
acctGUID = xaccAccountGetGUID (acct);
|
||||
if (sd->handled_dc)
|
||||
return;
|
||||
|
||||
kvp_frame_set_slot_path (kvpf, kvp_value_new_guid(acctGUID),
|
||||
GNC_SX_ID, GNC_SX_ACCOUNT, NULL);
|
||||
kvpf = xaccSplitGetSlots (sd->split);
|
||||
|
||||
kvpf = xaccSplitGetSlots (split);
|
||||
DEBUG ("kvp_frame before: %s\n", kvp_frame_to_string (kvpf));
|
||||
|
||||
cell = gnc_table_layout_get_cell (reg->table->layout, XFRM_CELL);
|
||||
gnc_basic_cell_set_changed (cell, FALSE);
|
||||
/* amountStr = gnc_numeric_to_string (new_amount); */
|
||||
|
||||
/* set the actual account to the fake account for these templates */
|
||||
xaccAccountInsertSplit (template_acc, split);
|
||||
}
|
||||
value = gnc_table_layout_get_cell_value (reg->table->layout, FCRED_CELL);
|
||||
kvp_frame_set_slot_path (kvpf, kvp_value_new_string (value),
|
||||
GNC_SX_ID,
|
||||
GNC_SX_CREDIT_FORMULA,
|
||||
NULL);
|
||||
|
||||
if ( gnc_table_layout_get_cell_changed (reg->table->layout,
|
||||
MXFRM_CELL, TRUE) )
|
||||
{
|
||||
DEBUG( "Template: Got MXFRM changed\n" );
|
||||
value = gnc_table_layout_get_cell_value (reg->table->layout, FDEBT_CELL);
|
||||
|
||||
cell = gnc_table_layout_get_cell (reg->table->layout, MXFRM_CELL);
|
||||
gnc_basic_cell_set_changed (cell, FALSE);
|
||||
}
|
||||
kvp_frame_set_slot_path (kvpf,
|
||||
kvp_value_new_string (value),
|
||||
GNC_SX_ID,
|
||||
GNC_SX_DEBIT_FORMULA,
|
||||
NULL);
|
||||
|
||||
if (gnc_table_layout_get_cell_changed (reg->table->layout,
|
||||
FCRED_CELL, TRUE) ||
|
||||
gnc_table_layout_get_cell_changed (reg->table->layout,
|
||||
FDEBT_CELL, TRUE))
|
||||
{
|
||||
const char *value;
|
||||
char *amountStr = "x + y/42";
|
||||
gnc_numeric new_amount;
|
||||
gnc_numeric credit;
|
||||
gnc_numeric debit;
|
||||
DEBUG ("kvp_frame after: %s\n", kvp_frame_to_string (kvpf));
|
||||
|
||||
DEBUG ("kvp_frame before: %s\n", kvp_frame_to_string (kvpf));
|
||||
/* set the amount to an innocuous value */
|
||||
xaccSplitSetValue (sd->split, gnc_numeric_create (0, 1));
|
||||
|
||||
/* amountStr = gnc_numeric_to_string( new_amount ); */
|
||||
sd->handled_dc = TRUE;
|
||||
}
|
||||
|
||||
value = gnc_table_layout_get_cell_value (reg->table->layout, FCRED_CELL);
|
||||
kvp_frame_set_slot_path( kvpf,kvp_value_new_string( value ),
|
||||
GNC_SX_ID,
|
||||
GNC_SX_CREDIT_FORMULA,
|
||||
NULL);
|
||||
static void
|
||||
gnc_template_register_save_shares_cell (BasicCell * cell,
|
||||
gpointer save_data,
|
||||
gpointer user_data)
|
||||
{
|
||||
SRSaveData *sd = save_data;
|
||||
SplitRegister *reg = user_data;
|
||||
kvp_frame *kvpf;
|
||||
char *sharesStr = "(x + y)/42";
|
||||
|
||||
value = gnc_table_layout_get_cell_value (reg->table->layout, FDEBT_CELL);
|
||||
g_return_if_fail (gnc_basic_cell_has_name (cell, SHRS_CELL));
|
||||
|
||||
kvp_frame_set_slot_path( kvpf,
|
||||
kvp_value_new_string( value ),
|
||||
GNC_SX_ID,
|
||||
GNC_SX_DEBIT_FORMULA,
|
||||
NULL);
|
||||
kvpf = xaccSplitGetSlots (sd->split);
|
||||
|
||||
DEBUG( "kvp_frame after: %s\n", kvp_frame_to_string( kvpf ) );
|
||||
/* FIXME: shares cells are numeric by definition. */
|
||||
DEBUG ("kvp_frame before: %s\n", kvp_frame_to_string (kvpf));
|
||||
|
||||
/* set the amount to an innocuous value */
|
||||
xaccSplitSetValue (split, gnc_numeric_create(0, 1) );
|
||||
}
|
||||
/* sharesStr = gnc_numeric_to_string( sharesStr ); */
|
||||
kvp_frame_set_slot_path (kvpf,
|
||||
kvp_value_new_string (sharesStr),
|
||||
GNC_SX_ID,
|
||||
GNC_SX_SHARES,
|
||||
NULL);
|
||||
|
||||
if (gnc_table_layout_get_cell_changed (reg->table->layout,
|
||||
SHRS_CELL, TRUE))
|
||||
{
|
||||
char *sharesStr = "(x + y)/42";
|
||||
DEBUG ("kvp_frame after: %s\n", kvp_frame_to_string (kvpf));
|
||||
|
||||
/* FIXME: shares cells are numeric by definition. */
|
||||
DEBUG ("kvp_frame before: %s\n", kvp_frame_to_string (kvpf));
|
||||
|
||||
/* sharesStr = gnc_numeric_to_string( sharesStr ); */
|
||||
kvp_frame_set_slot_path( kvpf,
|
||||
kvp_value_new_string( sharesStr ),
|
||||
GNC_SX_ID,
|
||||
GNC_SX_SHARES,
|
||||
NULL);
|
||||
|
||||
DEBUG( "kvp_frame after: %s\n", kvp_frame_to_string( kvpf ) );
|
||||
|
||||
/* set the shares to an innocuous value */
|
||||
xaccSplitSetSharePriceAndAmount (split,
|
||||
gnc_numeric_create(0, 1),
|
||||
gnc_numeric_create(0, 1));
|
||||
|
||||
cell = gnc_table_layout_get_cell (reg->table->layout, SHRS_CELL);
|
||||
gnc_basic_cell_set_changed (cell, FALSE);
|
||||
}
|
||||
|
||||
gnc_split_register_save_cells (save_data, user_data);
|
||||
/* set the shares to an innocuous value */
|
||||
xaccSplitSetSharePriceAndAmount (sd->split,
|
||||
gnc_numeric_create (0, 1),
|
||||
gnc_numeric_create (0, 1));
|
||||
}
|
||||
|
||||
void
|
||||
@ -481,6 +537,54 @@ 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_num_cell,
|
||||
NUM_CELL);
|
||||
|
||||
gnc_table_model_set_save_handler (model,
|
||||
gnc_split_register_save_desc_cell,
|
||||
DESC_CELL);
|
||||
|
||||
gnc_table_model_set_save_handler (model,
|
||||
gnc_split_register_save_notes_cell,
|
||||
NOTES_CELL);
|
||||
|
||||
gnc_table_model_set_save_handler (model,
|
||||
gnc_split_register_save_recn_cell,
|
||||
RECN_CELL);
|
||||
|
||||
gnc_table_model_set_save_handler (model,
|
||||
gnc_split_register_save_actn_cell,
|
||||
ACTN_CELL);
|
||||
|
||||
gnc_table_model_set_save_handler (model,
|
||||
gnc_split_register_save_memo_cell,
|
||||
MEMO_CELL);
|
||||
|
||||
gnc_table_model_set_save_handler (model,
|
||||
gnc_split_register_save_xfrm_cell,
|
||||
XFRM_CELL);
|
||||
|
||||
gnc_table_model_set_save_handler (model,
|
||||
gnc_split_register_save_mxfrm_cell,
|
||||
MXFRM_CELL);
|
||||
|
||||
gnc_table_model_set_save_handler (model,
|
||||
gnc_split_register_save_shares_cell,
|
||||
SHRS_CELL);
|
||||
|
||||
gnc_table_model_set_save_handler (model,
|
||||
gnc_split_register_save_price_cell,
|
||||
PRIC_CELL);
|
||||
|
||||
gnc_table_model_set_save_handler (model,
|
||||
gnc_split_register_save_debcred_cell,
|
||||
DEBT_CELL);
|
||||
|
||||
gnc_table_model_set_save_handler (model,
|
||||
gnc_split_register_save_debcred_cell,
|
||||
CRED_CELL);
|
||||
|
||||
gnc_table_model_set_post_save_handler (model, gnc_split_register_save_cells);
|
||||
}
|
||||
|
||||
@ -489,8 +593,43 @@ gnc_template_register_model_add_save_handlers (TableModel *model)
|
||||
{
|
||||
g_return_if_fail (model != NULL);
|
||||
|
||||
gnc_table_model_set_post_save_handler
|
||||
(model, gnc_split_register_save_template_cells);
|
||||
gnc_split_register_model_add_save_handlers (model);
|
||||
|
||||
gnc_table_model_set_save_handler (model,
|
||||
gnc_template_register_save_unexpected_cell,
|
||||
DATE_CELL);
|
||||
|
||||
gnc_table_model_set_save_handler (model,
|
||||
gnc_template_register_save_unexpected_cell,
|
||||
DDUE_CELL);
|
||||
|
||||
gnc_table_model_set_save_handler (model,
|
||||
gnc_template_register_save_unexpected_cell,
|
||||
NUM_CELL);
|
||||
|
||||
gnc_table_model_set_save_handler (model,
|
||||
gnc_template_register_save_unexpected_cell,
|
||||
DESC_CELL);
|
||||
|
||||
gnc_table_model_set_save_handler (model,
|
||||
gnc_template_register_save_xfrm_cell,
|
||||
XFRM_CELL);
|
||||
|
||||
gnc_table_model_set_save_handler (model,
|
||||
gnc_template_register_save_mxfrm_cell,
|
||||
MXFRM_CELL);
|
||||
|
||||
gnc_table_model_set_save_handler (model,
|
||||
gnc_template_register_save_debcred_cell,
|
||||
FDEBT_CELL);
|
||||
|
||||
gnc_table_model_set_save_handler (model,
|
||||
gnc_template_register_save_debcred_cell,
|
||||
FCRED_CELL);
|
||||
|
||||
gnc_table_model_set_save_handler (model,
|
||||
gnc_template_register_save_shares_cell,
|
||||
SHRS_CELL);
|
||||
}
|
||||
|
||||
SRSaveData *
|
||||
@ -505,6 +644,8 @@ gnc_split_register_save_data_new (Transaction *trans, Split *split)
|
||||
|
||||
sd->trans = trans;
|
||||
sd->split = split;
|
||||
sd->handled_dc = FALSE;
|
||||
sd->do_scrub = FALSE;
|
||||
|
||||
return sd;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user