Register fixes.

git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@2339 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
Dave Peticolas 2000-05-16 10:31:30 +00:00
parent 0c1164bd90
commit 50c26be1b8
7 changed files with 341 additions and 97 deletions

View File

@ -1,5 +1,19 @@
2000-05-16 Dave Peticolas <peticola@cs.ucdavis.edu>
* src/SplitLedger.c (xaccSRCountRows): fix a bug when a two or
more splits from the same transaction are in the same account. Fix
other bugs including not accessing deleted splits/transactions.
Improve the refresh strategy. Could this code get any more
complicated? Yes...
2000-05-15 Dave Peticolas <peticola@cs.ucdavis.edu> 2000-05-15 Dave Peticolas <peticola@cs.ucdavis.edu>
* src/register/splitreg.c (xaccSplitRegisterGetCursorTypeRowCol):
new function, get cursor type by virt row/col.
* src/scm/report/transaction-report.scm: debits on left, credits
on right.
* src/engine/guid/md5.c (md5_process_bytes): fix 32-bit alignment * src/engine/guid/md5.c (md5_process_bytes): fix 32-bit alignment
bug. bug.

View File

@ -132,6 +132,9 @@ struct _SRInfo
/* A split used to remember where to put the cursor */ /* A split used to remember where to put the cursor */
Split *cursor_hint_split; Split *cursor_hint_split;
/* A split used to remember where to put the cursor */
Split *cursor_hint_trans_split;
/* A column used to remember which column to put the cursor */ /* A column used to remember which column to put the cursor */
int cursor_hint_phys_col; int cursor_hint_phys_col;
@ -189,11 +192,14 @@ static SCM copied_item = SCM_UNDEFINED;
static GUID copied_leader_guid; static GUID copied_leader_guid;
/* static prototypes */ /* static prototypes */
static Split * xaccSRGetTransSplit (SplitRegister *reg,
int phys_row, int phys_col);
static void xaccSRLoadRegEntry (SplitRegister *reg, Split *split); static void xaccSRLoadRegEntry (SplitRegister *reg, Split *split);
static gncBoolean xaccSRSaveRegEntryToSCM (SplitRegister *reg, static gncBoolean xaccSRSaveRegEntryToSCM (SplitRegister *reg,
SCM trans_scm, SCM split_scm); SCM trans_scm, SCM split_scm);
static Transaction * xaccSRGetTrans (SplitRegister *reg, static Transaction * xaccSRGetTrans (SplitRegister *reg,
int phys_row, int phys_col); int phys_row, int phys_col);
static Split * xaccSRGetCurrentTransSplit (SplitRegister *reg);
/* The routines below create, access, and destroy the SRInfo structure /* The routines below create, access, and destroy the SRInfo structure
@ -388,11 +394,12 @@ LedgerMoveCursor (Table *table,
{ {
int new_phys_row = *p_new_phys_row; int new_phys_row = *p_new_phys_row;
int new_phys_col = *p_new_phys_col; int new_phys_col = *p_new_phys_col;
SplitRegister *reg = (SplitRegister *) client_data; SplitRegister *reg = client_data;
SRInfo *info = xaccSRGetInfo(reg); SRInfo *info = xaccSRGetInfo(reg);
Transaction *pending_trans; Transaction *pending_trans;
Transaction *new_trans; Transaction *new_trans;
Transaction *trans; Transaction *trans;
Split *trans_split;
Split *new_split; Split *new_split;
gncBoolean saved; gncBoolean saved;
Locator *locator; Locator *locator;
@ -402,8 +409,7 @@ LedgerMoveCursor (Table *table,
int phys_col_offset; int phys_col_offset;
int style; int style;
PINFO ("start callback %d %d \n", PINFO ("start callback %d %d \n", new_phys_row, new_phys_col);
new_phys_row, new_phys_col);
/* The transaction we are coming from */ /* The transaction we are coming from */
trans = xaccSRGetCurrentTrans(reg); trans = xaccSRGetCurrentTrans(reg);
@ -415,6 +421,9 @@ LedgerMoveCursor (Table *table,
/* The transaction where we are moving to */ /* The transaction where we are moving to */
new_trans = xaccSRGetTrans(reg, new_phys_row, new_phys_col); new_trans = xaccSRGetTrans(reg, new_phys_row, new_phys_col);
/* The split at the transaction line we are moving to */
trans_split = xaccSRGetTransSplit(reg, new_phys_row, new_phys_col);
/* The split we are moving to */ /* The split we are moving to */
new_split = xaccGetUserData(reg->table, new_phys_row, new_phys_col); new_split = xaccGetUserData(reg->table, new_phys_row, new_phys_col);
@ -453,7 +462,7 @@ LedgerMoveCursor (Table *table,
/* if the split we were going to is still in the register, /* if the split we were going to is still in the register,
* then it may have moved. Find out where it is now. */ * then it may have moved. Find out where it is now. */
if (xaccSRGetTransSplitRowCol (reg, new_trans, new_split, if (xaccSRGetTransSplitRowCol (reg, new_trans, trans_split, new_split,
&virt_row, &virt_col)) { &virt_row, &virt_col)) {
RevLocator *rev_locator; RevLocator *rev_locator;
@ -512,6 +521,9 @@ LedgerMoveCursor (Table *table,
new_trans = xaccSRGetTrans(reg, new_phys_row, new_phys_col); new_trans = xaccSRGetTrans(reg, new_phys_row, new_phys_col);
info->cursor_hint_trans = new_trans; info->cursor_hint_trans = new_trans;
trans_split = xaccSRGetTransSplit(reg, new_phys_row, new_phys_col);
info->cursor_hint_trans_split = trans_split;
new_split = xaccGetUserData (reg->table, new_phys_row, new_phys_col); new_split = xaccGetUserData (reg->table, new_phys_row, new_phys_col);
info->cursor_hint_split = new_split; info->cursor_hint_split = new_split;
@ -523,9 +535,21 @@ LedgerMoveCursor (Table *table,
*p_new_phys_row = table->current_cursor_phys_row; *p_new_phys_row = table->current_cursor_phys_row;
*p_new_phys_col = table->current_cursor_phys_col; *p_new_phys_col = table->current_cursor_phys_col;
info->cursor_hint_trans = xaccSRGetCurrentTrans (reg);
info->cursor_hint_split = xaccSRGetCurrentSplit (reg);
info->cursor_hint_trans_split = xaccSRGetCurrentTransSplit (reg);
info->cursor_hint_phys_col = -1;
PINFO ("after dynamic %d %d stored val %d\n", PINFO ("after dynamic %d %d stored val %d\n",
*p_new_phys_row, *p_new_phys_col, reg->cursor_phys_row); *p_new_phys_row, *p_new_phys_col, reg->cursor_phys_row);
} }
else
{
info->cursor_hint_trans = new_trans;
info->cursor_hint_split = new_split;
info->cursor_hint_trans_split = trans_split;
info->cursor_hint_phys_col = -1;
}
} }
/* ======================================================== */ /* ======================================================== */
@ -691,6 +715,89 @@ xaccSRGetTrans (SplitRegister *reg, int phys_row, int phys_col)
/* ======================================================== */ /* ======================================================== */
static Split *
xaccSRGetTransSplit (SplitRegister *reg, int phys_row, int phys_col)
{
CursorType cursor_type;
int virt_row, virt_col;
if (reg == NULL)
return NULL;
if ((phys_row < 0) || (phys_col < 0) ||
(phys_row >= reg->table->num_phys_rows) ||
(phys_col >= reg->table->num_phys_cols))
return NULL;
virt_row = reg->table->locators[phys_row][phys_col]->virt_row;
virt_col = reg->table->locators[phys_row][phys_col]->virt_col;
while (1)
{
cursor_type = xaccSplitRegisterGetCursorTypeRowCol (reg,
virt_row, virt_col);
if (cursor_type == CURSOR_TRANS)
return reg->table->user_data[virt_row][virt_col];
virt_row --;
if ((0 > virt_row) || (0 > virt_col)) {
PERR ("bad row \n");
return NULL;
}
}
}
/* ======================================================== */
static Split *
xaccSRGetCurrentTransSplit (SplitRegister *reg)
{
Split *split;
CursorType cursor_type;
int phys_row, phys_col;
int virt_row, virt_col;
if (reg == NULL)
return NULL;
split = xaccSRGetCurrentSplit (reg);
cursor_type = xaccSplitRegisterGetCursorType (reg);
if (cursor_type == CURSOR_TRANS)
return split;
/* Split is not associated with a transaction cursor. Assume it is a
* split of a multi-line transaction. Go back until we find one that
* is on a transaction cursor. */
phys_row = reg->table->current_cursor_phys_row;
phys_col = reg->table->current_cursor_phys_col;
if ((phys_row < 0) || (phys_col < 0) ||
(phys_row >= reg->table->num_phys_rows) ||
(phys_col >= reg->table->num_phys_cols))
return NULL;
virt_row = reg->table->locators[phys_row][phys_col]->virt_row;
virt_col = reg->table->locators[phys_row][phys_col]->virt_col;
while (1)
{
virt_row --;
if ((0 > virt_row) || (0 > virt_col)) {
PERR ("bad row \n");
return NULL;
}
cursor_type = xaccSplitRegisterGetCursorTypeRowCol (reg,
virt_row, virt_col);
if (cursor_type == CURSOR_TRANS)
return reg->table->user_data[virt_row][virt_col];
}
}
/* ======================================================== */
Transaction * Transaction *
xaccSRGetCurrentTrans (SplitRegister *reg) xaccSRGetCurrentTrans (SplitRegister *reg)
{ {
@ -787,24 +894,45 @@ xaccSRGetSplitRowCol (SplitRegister *reg, Split *split,
/* ======================================================== */ /* ======================================================== */
gncBoolean gncBoolean
xaccSRGetTransSplitRowCol (SplitRegister *reg, xaccSRGetTransSplitRowCol (SplitRegister *reg, Transaction *trans,
Transaction *trans, Split *split, Split *trans_split, Split *split,
int *virt_row, int *virt_col) int *virt_row, int *virt_col)
{ {
Table *table = reg->table; Table *table = reg->table;
gncBoolean found = GNC_F; gncBoolean found_trans = GNC_F;
gncBoolean found_trans_split = GNC_F;
gncBoolean found_something = GNC_F;
CursorType cursor_type;
int v_row, v_col; int v_row, v_col;
Transaction *t;
Split *s; Split *s;
for (v_row = 1; v_row < table->num_virt_rows; v_row++) for (v_row = 1; v_row < table->num_virt_rows; v_row++)
for (v_col = 0; v_col < table->num_virt_cols; v_col++) for (v_col = 0; v_col < table->num_virt_cols; v_col++)
{ {
s = (Split *) table->user_data[v_row][v_col]; s = table->user_data[v_row][v_col];
t = xaccSplitGetParent(s);
if (xaccSplitGetParent(s) == trans) cursor_type = xaccSplitRegisterGetCursorTypeRowCol(reg, v_row, v_col);
found = GNC_T;
if (found && (s == split)) if (t == trans)
found_trans = GNC_T;
if ((cursor_type == CURSOR_TRANS) && (s == trans_split))
found_trans_split = GNC_T;
if (found_trans && (s == split))
{
if (virt_row != NULL)
*virt_row = v_row;
if (virt_col != NULL)
*virt_col = v_col;
found_something = GNC_T;
}
if (found_trans_split && (s == split))
{ {
if (virt_row != NULL) if (virt_row != NULL)
*virt_row = v_row; *virt_row = v_row;
@ -815,7 +943,7 @@ xaccSRGetTransSplitRowCol (SplitRegister *reg,
} }
} }
return GNC_F; return found_something;
} }
/* ======================================================== */ /* ======================================================== */
@ -828,10 +956,12 @@ xaccSRDuplicateCurrent (SplitRegister *reg)
unsigned int changed; unsigned int changed;
Transaction *trans; Transaction *trans;
Split *return_split; Split *return_split;
Split *trans_split;
Split *split; Split *split;
split = xaccSRGetCurrentSplit(reg); split = xaccSRGetCurrentSplit(reg);
trans = xaccSRGetCurrentTrans(reg); trans = xaccSRGetCurrentTrans(reg);
trans_split = xaccSRGetCurrentTransSplit(reg);
/* This shouldn't happen, but be paranoid. */ /* This shouldn't happen, but be paranoid. */
if (trans == NULL) if (trans == NULL)
@ -895,15 +1025,19 @@ xaccSRDuplicateCurrent (SplitRegister *reg)
gnc_copy_split_onto_split(split, new_split); gnc_copy_split_onto_split(split, new_split);
return_split = new_split; return_split = new_split;
info->cursor_hint_split = new_split;
} }
else else
{ {
Transaction *new_trans; Transaction *new_trans;
int split_index; int split_index;
int trans_split_index;
/* We are on a transaction row. Copy the whole transaction. */ /* We are on a transaction row. Copy the whole transaction. */
split_index = gnc_trans_split_index(trans, split); split_index = gnc_trans_split_index(trans, split);
trans_split_index = gnc_trans_split_index(trans, trans_split);
/* we should *always* find the split, but be paranoid */ /* we should *always* find the split, but be paranoid */
if (split_index < 0) if (split_index < 0)
@ -922,6 +1056,11 @@ xaccSRDuplicateCurrent (SplitRegister *reg)
split_index = 0; split_index = 0;
return_split = xaccTransGetSplit(new_trans, split_index); return_split = xaccTransGetSplit(new_trans, split_index);
trans_split = xaccTransGetSplit(new_trans, trans_split_index);
info->cursor_hint_trans = new_trans;
info->cursor_hint_split = return_split;
info->cursor_hint_trans_split = trans_split;
} }
/* Refresh the GUI. */ /* Refresh the GUI. */
@ -1070,6 +1209,7 @@ xaccSRPasteCurrent (SplitRegister *reg)
GList *accounts = NULL; GList *accounts = NULL;
CursorType cursor_type; CursorType cursor_type;
Transaction *trans; Transaction *trans;
Split *trans_split;
Split *split; Split *split;
if (copied_type == CURSOR_NONE) if (copied_type == CURSOR_NONE)
@ -1078,6 +1218,8 @@ xaccSRPasteCurrent (SplitRegister *reg)
split = xaccSRGetCurrentSplit(reg); split = xaccSRGetCurrentSplit(reg);
trans = xaccSRGetCurrentTrans(reg); trans = xaccSRGetCurrentTrans(reg);
trans_split = xaccSRGetCurrentTransSplit(reg);
/* This shouldn't happen, but be paranoid. */ /* This shouldn't happen, but be paranoid. */
if (trans == NULL) if (trans == NULL)
return; return;
@ -1111,6 +1253,7 @@ xaccSRPasteCurrent (SplitRegister *reg)
} }
else { else {
const GUID *new_guid; const GUID *new_guid;
int trans_split_index;
int split_index; int split_index;
int num_splits; int num_splits;
@ -1124,6 +1267,7 @@ xaccSRPasteCurrent (SplitRegister *reg)
info->blank_split = NULL; info->blank_split = NULL;
split_index = gnc_trans_split_index(trans, split); split_index = gnc_trans_split_index(trans, split);
trans_split_index = gnc_trans_split_index(trans, trans_split);
if ((info->default_source_account != NULL) && if ((info->default_source_account != NULL) &&
(xaccGUIDType(&copied_leader_guid) != GNC_ID_NULL)) (xaccGUIDType(&copied_leader_guid) != GNC_ID_NULL))
@ -1142,6 +1286,8 @@ xaccSRPasteCurrent (SplitRegister *reg)
info->cursor_hint_trans = trans; info->cursor_hint_trans = trans;
info->cursor_hint_split = xaccTransGetSplit(trans, split_index); info->cursor_hint_split = xaccTransGetSplit(trans, split_index);
info->cursor_hint_trans_split = xaccTransGetSplit(trans,
trans_split_index);
} }
accounts = gnc_trans_prepend_account_list(trans, accounts); accounts = gnc_trans_prepend_account_list(trans, accounts);
@ -2223,19 +2369,26 @@ xaccSRLoadRegEntry (SplitRegister *reg, Split *split)
/* ======================================================== */ /* ======================================================== */
static void static void
xaccSRCountRows (SplitRegister *reg, Split **slist, xaccSRCountRows (SplitRegister *reg,
Transaction *find_trans, Split *find_split, Split **slist,
gncBoolean *ext_found_trans, Transaction *find_trans,
gncBoolean *ext_found_split) Split *find_split,
Split *find_trans_split,
gncBoolean *ext_found_trans,
gncBoolean *ext_found_split,
gncBoolean *ext_found_trans_split)
{ {
SRInfo *info = xaccSRGetInfo(reg); SRInfo *info = xaccSRGetInfo(reg);
CellBlock *lead_cursor; CellBlock *lead_cursor;
Split *split = NULL; Transaction *trans;
Split *split;
Locator *locator; Locator *locator;
Table *table; Table *table;
gncBoolean found_split = GNC_F; gncBoolean found_split = GNC_F;
gncBoolean found_trans = GNC_F; gncBoolean found_trans = GNC_F;
gncBoolean found_trans_split = GNC_F;
gncBoolean on_trans_split;
gncBoolean multi_line; gncBoolean multi_line;
gncBoolean dynamic; gncBoolean dynamic;
@ -2274,7 +2427,7 @@ xaccSRCountRows (SplitRegister *reg, Split **slist,
/* num_phys_rows is the number of rows in all the cursors. /* num_phys_rows is the number of rows in all the cursors.
* num_virt_rows is the number of cursors (including the header). * num_virt_rows is the number of cursors (including the header).
* Count the number of rows needed. * Count the number of rows needed.
* the phys row count will be equal to * the phys row count will be equal to: (sort of)
* +1 for the header * +1 for the header
* +n that is, one (transaction) row for each split passed in, * +n that is, one (transaction) row for each split passed in,
* +n one blank edit row for each transaction * +n one blank edit row for each transaction
@ -2284,30 +2437,64 @@ xaccSRCountRows (SplitRegister *reg, Split **slist,
num_phys_rows = reg->header->numRows; num_phys_rows = reg->header->numRows;
num_virt_rows = 1; num_virt_rows = 1;
/* Look for the transaction split */
i=0; i=0;
if (slist) { if (slist)
split = slist[0]; split = slist[0];
} else { else
split = NULL; split = NULL;
}
while (split) { while (split) {
if (split == find_trans_split)
{
found_trans_split = GNC_T;
break;
}
i++;
split = slist[i];
}
split = info->blank_split;
if ((split != NULL) && (split == find_trans_split))
found_trans_split = GNC_T;
/* now count the rows */
i=0;
if (slist)
split = slist[0];
else
split = NULL;
while (split) {
gncBoolean did_expand = GNC_F;
/* do not count the blank split */ /* do not count the blank split */
if (split != info->blank_split) { if (split != info->blank_split) {
Transaction *trans;
gncBoolean do_expand; gncBoolean do_expand;
trans = xaccSplitGetParent(split);
/* lets determine where to locate the cursor ... */ /* lets determine where to locate the cursor ... */
on_trans_split = (find_trans_split == split);
if (!found_split) { if (!found_split) {
/* Check to see if we find a perfect match */ /* Check to see if we find a perfect match */
if (split == find_split) { if (split == find_split) {
save_cursor_phys_row = num_phys_rows; save_cursor_phys_row = num_phys_rows;
save_cursor_virt_row = num_virt_rows; save_cursor_virt_row = num_virt_rows;
found_split = GNC_T; if (on_trans_split || !found_trans_split)
found_split = GNC_T;
found_trans = GNC_T; found_trans = GNC_T;
} }
/* Otherwise, check for a close match. This could happen /* Otherwise, check for a close match. This could happen
* if we are collapsing from multi-line to single, e.g. */ * if, e.g., we are collapsing from multi-line to single. */
else if (xaccSplitGetParent(split) == find_trans) { else if (on_trans_split) {
save_cursor_phys_row = num_phys_rows;
save_cursor_virt_row = num_virt_rows;
if (trans == find_trans)
found_trans = GNC_T;
}
else if (!found_trans && (trans == find_trans)) {
save_cursor_phys_row = num_phys_rows; save_cursor_phys_row = num_phys_rows;
save_cursor_virt_row = num_virt_rows; save_cursor_virt_row = num_virt_rows;
found_trans = GNC_T; found_trans = GNC_T;
@ -2317,12 +2504,14 @@ xaccSRCountRows (SplitRegister *reg, Split **slist,
/* if multi-line, then show all splits. If dynamic then /* if multi-line, then show all splits. If dynamic then
* show all splits only if this is the hot split. */ * show all splits only if this is the hot split. */
do_expand = multi_line; do_expand = multi_line;
do_expand = do_expand || do_expand = do_expand || (dynamic && (split == find_trans_split));
(dynamic && xaccIsPeerSplit(split, find_split)); if (dynamic && !found_trans_split)
if (dynamic && (NULL == find_split)) {
trans = xaccSplitGetParent (split);
do_expand = do_expand || (trans == find_trans); do_expand = do_expand || (trans == find_trans);
} do_expand = do_expand && !did_expand;
/* make sure we only expand once on dynamic */
if (dynamic && do_expand)
did_expand = GNC_T;
if (do_expand) if (do_expand)
{ {
@ -2338,8 +2527,8 @@ xaccSRCountRows (SplitRegister *reg, Split **slist,
* j = xaccTransCountSplits (trans); * j = xaccTransCountSplits (trans);
* num_virt_rows += j; * num_virt_rows += j;
* num_phys_rows += j * reg->split_cursor->numRows; * num_phys_rows += j * reg->split_cursor->numRows;
* except that we also have to find teh saved cursor row, * except that we also have to find the saved cursor row,
* Thus, we need a real looop over the splits. * Thus, we need a real loop over the splits.
* The do..while will automaticaly put a blank (null) * The do..while will automaticaly put a blank (null)
* split at the end * split at the end
*/ */
@ -2357,7 +2546,8 @@ xaccSRCountRows (SplitRegister *reg, Split **slist,
(trans == find_trans)) { (trans == find_trans)) {
save_cursor_phys_row = num_phys_rows; save_cursor_phys_row = num_phys_rows;
save_cursor_virt_row = num_virt_rows; save_cursor_virt_row = num_virt_rows;
found_split = GNC_T; if (on_trans_split || !found_trans_split)
found_split = GNC_T;
found_trans = GNC_T; found_trans = GNC_T;
} }
} }
@ -2384,16 +2574,23 @@ xaccSRCountRows (SplitRegister *reg, Split **slist,
/* ---------------------------------------------------------- */ /* ---------------------------------------------------------- */
/* the "blank split", if it exists, is at the end */ /* the "blank split", if it exists, is at the end */
if (info->blank_split != NULL) { split = info->blank_split;
trans = xaccSplitGetParent(split);
on_trans_split = (find_trans_split == split);
if (on_trans_split)
found_trans_split = GNC_T;
if (split != NULL) {
/* lets determine where to locate the cursor ... */ /* lets determine where to locate the cursor ... */
if (!found_split && info->blank_split == find_split) { if (!found_split && (split == find_split)) {
save_cursor_phys_row = num_phys_rows; save_cursor_phys_row = num_phys_rows;
save_cursor_virt_row = num_virt_rows; save_cursor_virt_row = num_virt_rows;
found_split = GNC_T; if (on_trans_split || !found_trans_split)
found_split = GNC_T;
found_trans = GNC_T; found_trans = GNC_T;
} }
else if (!found_split && else if (!found_split && (trans == find_trans)) {
(xaccSplitGetParent(info->blank_split) == find_trans)) {
save_cursor_phys_row = num_phys_rows; save_cursor_phys_row = num_phys_rows;
save_cursor_virt_row = num_virt_rows; save_cursor_virt_row = num_virt_rows;
found_trans = GNC_T; found_trans = GNC_T;
@ -2401,11 +2598,11 @@ xaccSRCountRows (SplitRegister *reg, Split **slist,
} }
if (multi_line) { if (multi_line) {
if (!found_split && (find_split == NULL) && if (!found_split && (find_split == NULL) && (trans == find_trans)) {
(xaccSplitGetParent(info->blank_split) == find_trans)) {
save_cursor_phys_row = num_phys_rows + 1; save_cursor_phys_row = num_phys_rows + 1;
save_cursor_virt_row = num_virt_rows + 1; save_cursor_virt_row = num_virt_rows + 1;
found_split = GNC_T; if (on_trans_split || !found_trans_split)
found_split = GNC_T;
found_trans = GNC_T; found_trans = GNC_T;
} }
num_virt_rows += 2; num_virt_rows += 2;
@ -2435,10 +2632,12 @@ xaccSRCountRows (SplitRegister *reg, Split **slist,
reg->cursor_phys_row = save_cursor_phys_row; reg->cursor_phys_row = save_cursor_phys_row;
reg->cursor_virt_row = save_cursor_virt_row; reg->cursor_virt_row = save_cursor_virt_row;
if (ext_found_split != NULL)
*ext_found_split = found_split;
if (ext_found_trans != NULL) if (ext_found_trans != NULL)
*ext_found_trans = found_trans; *ext_found_trans = found_trans;
if (ext_found_split != NULL)
*ext_found_split = found_split;
if (ext_found_trans_split != NULL)
*ext_found_trans_split = found_trans_split;
} }
/* ======================================================== */ /* ======================================================== */
@ -2452,6 +2651,7 @@ xaccSRLoadRegister (SplitRegister *reg, Split **slist,
CellBlock *lead_cursor; CellBlock *lead_cursor;
Transaction *find_trans; Transaction *find_trans;
Split *last_split = NULL; Split *last_split = NULL;
Split *find_trans_split;
Split *find_split; Split *find_split;
Split *split; Split *split;
Table *table; Table *table;
@ -2459,6 +2659,7 @@ xaccSRLoadRegister (SplitRegister *reg, Split **slist,
gncBoolean found_pending = GNC_F; gncBoolean found_pending = GNC_F;
gncBoolean found_split = GNC_F; gncBoolean found_split = GNC_F;
gncBoolean found_trans = GNC_F; gncBoolean found_trans = GNC_F;
gncBoolean found_trans_split = GNC_F;
gncBoolean multi_line; gncBoolean multi_line;
gncBoolean dynamic; gncBoolean dynamic;
@ -2486,19 +2687,14 @@ xaccSRLoadRegister (SplitRegister *reg, Split **slist,
} }
/* figure out where we are going to. */ /* figure out where we are going to. */
if (info->cursor_hint_trans != NULL) { find_trans = info->cursor_hint_trans;
find_trans = info->cursor_hint_trans; find_split = info->cursor_hint_split;
find_split = info->cursor_hint_split; find_trans_split = info->cursor_hint_trans_split;
}
else {
find_trans = xaccSRGetCurrentTrans (reg);
find_split = xaccSRGetCurrentSplit (reg);
}
if (info->cursor_hint_phys_col >= 0) if (info->cursor_hint_phys_col < 0)
save_phys_col = info->cursor_hint_phys_col;
else
save_phys_col = table->current_cursor_phys_col; save_phys_col = table->current_cursor_phys_col;
else
save_phys_col = info->cursor_hint_phys_col;
/* paranoia */ /* paranoia */
if (save_phys_col < 0) if (save_phys_col < 0)
@ -2508,8 +2704,8 @@ xaccSRLoadRegister (SplitRegister *reg, Split **slist,
/* count the number of rows, looking for the place we want to go. */ /* count the number of rows, looking for the place we want to go. */
xaccSRCountRows (reg, slist, xaccSRCountRows (reg, slist,
find_trans, find_split, find_trans, find_split, find_trans_split,
&found_trans, &found_split); &found_trans, &found_split, &found_trans_split);
/* If the current cursor has changed, and the 'current split' /* If the current cursor has changed, and the 'current split'
* is still among the living, we save the values for later * is still among the living, we save the values for later
@ -2542,12 +2738,14 @@ xaccSRLoadRegister (SplitRegister *reg, Split **slist,
i=0; i=0;
vrow = 1; /* header is vrow zero */ vrow = 1; /* header is vrow zero */
phys_row = reg->header->numRows; phys_row = reg->header->numRows;
if (slist) {
split = slist[0]; if (slist)
} else { split = slist[0];
split = NULL; else
} split = NULL;
while (split) { while (split) {
gncBoolean did_expand = GNC_F;
if (info->pending_trans == xaccSplitGetParent (split)) if (info->pending_trans == xaccSplitGetParent (split))
found_pending = GNC_T; found_pending = GNC_T;
@ -2559,20 +2757,27 @@ xaccSRLoadRegister (SplitRegister *reg, Split **slist,
PINFO ("load trans %d at phys row %d \n", i, phys_row); PINFO ("load trans %d at phys row %d \n", i, phys_row);
trans = xaccSplitGetParent (split);
/* if multi-line, then show all splits. If dynamic then /* if multi-line, then show all splits. If dynamic then
* show all splits only if this is the hot split. */ * show all splits only if this is the hot split. */
do_expand = multi_line; do_expand = multi_line;
do_expand = do_expand || do_expand = do_expand || (dynamic && (split == find_trans_split));
(dynamic && xaccIsPeerSplit(split, find_split)); if (dynamic && !found_trans_split)
if (dynamic && (NULL == find_split)) {
trans = xaccSplitGetParent (split);
do_expand = do_expand || (trans == find_trans); do_expand = do_expand || (trans == find_trans);
}
if (dynamic && !found_trans && (vrow == reg->cursor_virt_row)) { if (dynamic && !found_trans && !found_trans_split &&
(vrow == reg->cursor_virt_row)) {
reg->cursor_phys_row = phys_row; reg->cursor_phys_row = phys_row;
do_expand = GNC_T; do_expand = GNC_T;
} }
/* make sure we only expand once on dynamic */
do_expand = do_expand && !did_expand;
if (dynamic && do_expand)
did_expand = GNC_T;
if (do_expand) if (do_expand)
{ {
Split * secondary; Split * secondary;
@ -2587,7 +2792,6 @@ xaccSRLoadRegister (SplitRegister *reg, Split **slist,
/* loop over all of the splits in the transaction. The /* loop over all of the splits in the transaction. The
* do..while will automatically put a blank (null) split * do..while will automatically put a blank (null) split
* at the end. */ * at the end. */
trans = xaccSplitGetParent (split);
j = 0; j = 0;
do { do {
secondary = xaccTransGetSplit (trans, j); secondary = xaccTransGetSplit (trans, j);
@ -2701,10 +2905,10 @@ xaccSRLoadRegister (SplitRegister *reg, Split **slist,
if (!found_pending) if (!found_pending)
info->pending_trans = NULL; info->pending_trans = NULL;
/* clear out the hint transaction, split, and col. We want /* Set up the hint transaction, split, transaction split, and column. */
* to know if it has been set from the move callback, etc. */ info->cursor_hint_trans = xaccSRGetCurrentTrans (reg);
info->cursor_hint_trans = NULL; info->cursor_hint_split = xaccSRGetCurrentSplit (reg);
info->cursor_hint_split = NULL; info->cursor_hint_trans_split = xaccSRGetCurrentTransSplit (reg);
info->cursor_hint_phys_col = -1; info->cursor_hint_phys_col = -1;
xaccRefreshTableGUI (table); xaccRefreshTableGUI (table);
@ -2717,7 +2921,7 @@ xaccSRLoadRegister (SplitRegister *reg, Split **slist,
table->move_cursor = LedgerMoveCursor; table->move_cursor = LedgerMoveCursor;
table->traverse = LedgerTraverse; table->traverse = LedgerTraverse;
table->set_help = LedgerSetHelp; table->set_help = LedgerSetHelp;
table->client_data = (void *) reg; table->client_data = reg;
} }
/* ======================================================== */ /* ======================================================== */

View File

@ -141,8 +141,8 @@ Split * xaccSRGetBlankSplit (SplitRegister *reg);
gncBoolean xaccSRGetSplitRowCol (SplitRegister *reg, Split *split, gncBoolean xaccSRGetSplitRowCol (SplitRegister *reg, Split *split,
int *virt_row, int *virt_col); int *virt_row, int *virt_col);
gncBoolean xaccSRGetTransSplitRowCol (SplitRegister *reg, gncBoolean xaccSRGetTransSplitRowCol (SplitRegister *reg, Transaction *trans,
Transaction *trans, Split *split, Split *trans_split, Split *split,
int *virt_row, int *virt_col); int *virt_row, int *virt_col);
Split * xaccSRDuplicateCurrent (SplitRegister *reg); Split * xaccSRDuplicateCurrent (SplitRegister *reg);

View File

@ -2343,14 +2343,8 @@ deleteCB(GtkWidget *widget, gpointer data)
static void duplicateCB(GtkWidget *w, gpointer data) static void duplicateCB(GtkWidget *w, gpointer data)
{ {
RegWindow *regData = (RegWindow *) data; RegWindow *regData = (RegWindow *) data;
Split *new_split;
new_split = xaccSRDuplicateCurrent(regData->ledger->ledger); xaccSRDuplicateCurrent(regData->ledger->ledger);
if (new_split == NULL)
return;
gnc_register_jump_to_split(regData, new_split);
} }

View File

@ -1352,19 +1352,9 @@ xaccSplitRegisterClearChangeFlag (SplitRegister *reg)
/* ============================================== */ /* ============================================== */
CursorType static CursorType
xaccSplitRegisterGetCursorType (SplitRegister *reg) sr_cellblock_cursor_type(SplitRegister *reg, CellBlock *cursor)
{ {
Table *table;
CellBlock *cursor;
assert(reg);
table = reg->table;
if (table == NULL)
return CURSOR_NONE;
cursor = table->current_cursor;
if (cursor == NULL) if (cursor == NULL)
return CURSOR_NONE; return CURSOR_NONE;
@ -1381,6 +1371,45 @@ xaccSplitRegisterGetCursorType (SplitRegister *reg)
/* ============================================== */ /* ============================================== */
CursorType
xaccSplitRegisterGetCursorType (SplitRegister *reg)
{
Table *table;
if (reg == NULL)
return CURSOR_NONE;
table = reg->table;
if (table == NULL)
return CURSOR_NONE;
return sr_cellblock_cursor_type(reg, table->current_cursor);
}
/* ============================================== */
CursorType
xaccSplitRegisterGetCursorTypeRowCol (SplitRegister *reg,
int virt_row, int virt_col)
{
Table *table;
if (reg == NULL)
return CURSOR_NONE;
table = reg->table;
if (table == NULL)
return CURSOR_NONE;
if ((virt_row < 0) || (virt_row >= table->num_virt_rows) ||
(virt_col < 0) || (virt_col >= table->num_virt_cols))
return CURSOR_NONE;
return sr_cellblock_cursor_type(reg, table->handlers[virt_row][virt_col]);
}
/* ============================================== */
SplitRegisterBuffer * SplitRegisterBuffer *
xaccMallocSplitRegisterBuffer () xaccMallocSplitRegisterBuffer ()
{ {

View File

@ -233,6 +233,9 @@ void xaccSplitRegisterClearChangeFlag (SplitRegister *reg);
/* Returns the type of the current cursor */ /* Returns the type of the current cursor */
CursorType xaccSplitRegisterGetCursorType (SplitRegister *reg); CursorType xaccSplitRegisterGetCursorType (SplitRegister *reg);
CursorType xaccSplitRegisterGetCursorTypeRowCol (SplitRegister *reg,
int virt_row,
int virt_col);
/* Functions for working with split register buffers */ /* Functions for working with split register buffers */
SplitRegisterBuffer * xaccMallocSplitRegisterBuffer (); SplitRegisterBuffer * xaccMallocSplitRegisterBuffer ();

View File

@ -423,7 +423,7 @@
(define (gnc:titles) (define (gnc:titles)
(map (lambda (key) (string-append "<TH>" (string-db 'lookup key) "</TH>")) (map (lambda (key) (string-append "<TH>" (string-db 'lookup key) "</TH>"))
(list 'date 'num 'desc 'memo 'category 'credit 'debit 'balance))) (list 'date 'num 'desc 'memo 'category 'debit 'credit 'balance)))
(define (gnc:trep-renderer options) (define (gnc:trep-renderer options)
(gnc:tr-report-initialize-inflow-and-outflow!) (gnc:tr-report-initialize-inflow-and-outflow!)