[Gnucash-changes] r13863 - gnucash/trunk/src/register/ledger-core - More register fixes related to recent changes:

Chris Shoemaker chris at cvs.gnucash.org
Wed Apr 26 22:18:38 EDT 2006


Author: chris
Date: 2006-04-26 22:18:37 -0400 (Wed, 26 Apr 2006)
New Revision: 13863
Trac: http://svn.gnucash.org/trac/changeset/13863

Modified:
   gnucash/trunk/src/register/ledger-core/split-register-control.c
   gnucash/trunk/src/register/ledger-core/split-register-load.c
   gnucash/trunk/src/register/ledger-core/split-register.c
Log:
   More register fixes related to recent changes:
   For the autofill in basic-ledger mode, avoid an extra BeginCommit.

   For "remove all splits from the transaction" case, also avoid a potential
   extra BeginCommit.  Also, fix a bug where one split might have not been 
   removed if this operation was performed in a register other than the one
   where the transaction was created.

   Make sure that whenever we actually do commit the pending transaction, we
   clear the stored GUID *before* the commit, since it may be checked again
   from the register's refresh event handler.

   In other news, I haven't seen the orphan splits recently...


Modified: gnucash/trunk/src/register/ledger-core/split-register-control.c
===================================================================
--- gnucash/trunk/src/register/ledger-core/split-register-control.c	2006-04-27 01:33:17 UTC (rev 13862)
+++ gnucash/trunk/src/register/ledger-core/split-register-control.c	2006-04-27 02:18:37 UTC (rev 13863)
@@ -214,9 +214,6 @@
     return;
 
   info = gnc_split_register_get_info (reg);
-  pending_trans = xaccTransLookup (&info->pending_trans_guid,
-                                   gnc_get_current_book ());
-
   PINFO ("start callback %d %d \n",
          new_virt_loc.vcell_loc.virt_row,
          new_virt_loc.vcell_loc.virt_col);
@@ -271,6 +268,8 @@
 
   /* commit the contents of the cursor into the database */
   saved = gnc_split_register_save (reg, old_trans != new_trans);
+  pending_trans = xaccTransLookup (&info->pending_trans_guid,
+                                   gnc_get_current_book ());
   if ((old_class == CURSOR_CLASS_SPLIT) &&
       old_split &&
       (old_split != new_split) &&
@@ -305,11 +304,11 @@
     else
     {
       /* Trans was balanced. Let it go. */
+      info->pending_trans_guid = *guid_null ();
       if (xaccTransIsOpen (pending_trans))
         xaccTransCommitEdit (pending_trans);
       else g_assert_not_reached();
 
-      info->pending_trans_guid = *guid_null ();
       pending_trans = NULL;
       saved = TRUE;
     }
@@ -679,8 +678,19 @@
 
         gnc_suspend_gui_refresh ();
 
-        xaccTransBeginEdit (trans);
+        info->pending_trans_guid = *xaccTransGetGUID(trans);
+        if ((pending_trans != NULL) && (pending_trans != trans)) {
+            if (xaccTransIsOpen (pending_trans))
+                xaccTransCommitEdit (pending_trans);
+            else g_assert_not_reached();
+            g_assert(!xaccTransIsOpen(trans));
+            xaccTransBeginEdit(trans);
+        }
+        g_assert(xaccTransIsOpen(trans));
+        pending_trans = trans;
+
         gnc_copy_trans_onto_trans (auto_trans, trans, FALSE, FALSE);
+        blank_split = NULL;
 
         if (gnc_split_register_get_default_account (reg) != NULL)
         {
@@ -689,7 +699,6 @@
           int i = 0;
 
           default_account = gnc_split_register_get_default_account (reg);
-          blank_split = NULL;
 
           while ((s = xaccTransGetSplit(trans, i)) != NULL) {
             if (default_account == xaccSplitGetAccount(s))
@@ -700,27 +709,13 @@
             }
             i++;
           }
+        }
 
-          if (blank_split == NULL)
-          {
+        if (blank_split == NULL) {
             blank_split = xaccTransGetSplit(trans, 0);
             info->blank_split_guid = *xaccSplitGetGUID(blank_split);
-          }
         }
-        else
-        {
-          blank_split = xaccTransGetSplit(trans, 0);
-          info->blank_split_guid = *xaccSplitGetGUID(blank_split);
-        }
 
-        if ((pending_trans != NULL) && (pending_trans != trans)) {
-            if (xaccTransIsOpen (pending_trans))
-                xaccTransCommitEdit (pending_trans);
-            else g_assert_not_reached();
-        }
-        pending_trans = trans;
-        info->pending_trans_guid = *xaccTransGetGUID (pending_trans);
-
         info->blank_split_edited = TRUE;
 
         {

Modified: gnucash/trunk/src/register/ledger-core/split-register-load.c
===================================================================
--- gnucash/trunk/src/register/ledger-core/split-register-load.c	2006-04-27 01:33:17 UTC (rev 13862)
+++ gnucash/trunk/src/register/ledger-core/split-register-load.c	2006-04-27 02:18:37 UTC (rev 13863)
@@ -525,12 +525,12 @@
    * from the account. */
   if (!found_pending)
   {
+      info->pending_trans_guid = *guid_null ();
       if (xaccTransIsOpen (pending_trans))
           xaccTransCommitEdit (pending_trans);
       else if (pending_trans) 
           g_assert_not_reached();
 
-      info->pending_trans_guid = *guid_null ();
       pending_trans = NULL;
   }
 

Modified: gnucash/trunk/src/register/ledger-core/split-register.c
===================================================================
--- gnucash/trunk/src/register/ledger-core/split-register.c	2006-04-27 01:33:17 UTC (rev 13862)
+++ gnucash/trunk/src/register/ledger-core/split-register.c	2006-04-27 02:18:37 UTC (rev 13863)
@@ -1011,6 +1011,7 @@
 {
   SRInfo *info;
   Transaction *trans;
+  Transaction *pending;
   int i = 0;
   Split *s;
 
@@ -1018,22 +1019,27 @@
     return;
 
   gnc_suspend_gui_refresh ();
+  info = gnc_split_register_get_info(reg);
+  pending = xaccTransLookup(&info->pending_trans_guid, gnc_get_current_book());
 
-  trans = xaccSplitGetParent (split);
-  xaccTransBeginEdit (trans);
+  trans = xaccSplitGetParent(split);
+  if (!pending) {
+      g_assert(!xaccTransIsOpen(trans));
+      xaccTransBeginEdit(trans);
+      /* This is now the pending transaction */
+      info->pending_trans_guid = *xaccTransGetGUID(trans);
+  } else if (pending == trans) {
+      g_assert(xaccTransIsOpen(trans));
+  } else g_assert_not_reached();
+
   while ((s = xaccTransGetSplit(trans, i)) != NULL) {
       if (s != split) 
           xaccSplitDestroy(s);
-      i++;
+      else i++;
   }
 
-  /* This is now the pending transaction */
-  info = gnc_split_register_get_info (reg);
-  g_assert(xaccTransLookup(&info->pending_trans_guid, 
-                           gnc_get_current_book()) == NULL);
-  info->pending_trans_guid = *xaccTransGetGUID(trans);
-
   gnc_resume_gui_refresh ();
+  gnc_split_register_redraw(reg);
 }
 
 void
@@ -1340,7 +1346,9 @@
          info->blank_split_guid = *guid_null ();
          info->blank_split_edited = FALSE;
      }
-     
+
+     /* We have to clear the pending guid *before* commiting the
+        trans, because the event handler will find it otherwise. */
      if (trans == pending_trans) { 
          info->pending_trans_guid = *guid_null ();
      }
@@ -1349,6 +1357,7 @@
          PINFO("commiting trans (%p)", trans);
          xaccTransCommitEdit(trans);
      }
+
      return TRUE;
    }
 
@@ -1373,6 +1382,7 @@
        // FIXME: How could the pending transaction not be open?
        // FIXME: For that matter, how could an open pending
        // transaction ever not be the current trans?
+       info->pending_trans_guid = *xaccTransGetGUID(trans);
        if (xaccTransIsOpen (pending_trans)) {
            g_message("Impossible? commiting pending %p", pending_trans);
            xaccTransCommitEdit (pending_trans);
@@ -1387,7 +1397,6 @@
            xaccTransBeginEdit (trans);
        }
        pending_trans = trans;
-       info->pending_trans_guid = *xaccTransGetGUID(trans);
    }
 
    /* If we are committing the blank split, add it to the account now */
@@ -1465,12 +1474,12 @@
    if (do_commit)
    {
      g_assert(trans == blank_trans || trans == pending_trans); 
-     xaccTransCommitEdit (trans);
      if (pending_trans == trans)
      {
        pending_trans = NULL;
        info->pending_trans_guid = *guid_null ();
      }
+     xaccTransCommitEdit (trans);
    }
 
    gnc_table_clear_current_cursor_changes (reg->table);
@@ -2380,6 +2389,7 @@
    if (pending_trans != NULL)
    {
       g_assert_not_reached();
+      info->pending_trans_guid = *guid_null ();
       /* CAS: It's not clear to me that we'd really want to commit
          here, rather than rollback. But, maybe this is just dead
          code. */
@@ -2387,7 +2397,6 @@
           xaccTransCommitEdit (pending_trans);
       else g_assert_not_reached();
 
-      info->pending_trans_guid = *guid_null ();
       pending_trans = NULL;
    }
 



More information about the gnucash-changes mailing list