gnucash maint: Multiple changes pushed

Robert Fewell bobit at code.gnucash.org
Fri Jun 28 05:50:19 EDT 2019


Updated	 via  https://github.com/Gnucash/gnucash/commit/d5c3b4af (commit)
	 via  https://github.com/Gnucash/gnucash/commit/cf3e9239 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/a7f3f521 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/4cf92baa (commit)
	 via  https://github.com/Gnucash/gnucash/commit/8c6832bc (commit)
	 via  https://github.com/Gnucash/gnucash/commit/5cb1d0eb (commit)
	from  https://github.com/Gnucash/gnucash/commit/58069668 (commit)



commit d5c3b4af0cb82d9d7693092faa2a2d89a1e89d18
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Fri Jun 7 13:38:56 2019 +0100

    Make the blank split read only
    
    If the transactions are read only or voided and selected for editing a
    blank split is added that allows you to change the transaction so in
    these cases make the blank split read only.

diff --git a/gnucash/register/ledger-core/split-register-model.c b/gnucash/register/ledger-core/split-register-model.c
index f05dcd118..1e45fbc03 100644
--- a/gnucash/register/ledger-core/split-register-model.c
+++ b/gnucash/register/ledger-core/split-register-model.c
@@ -1954,7 +1954,19 @@ gnc_split_register_cursor_is_readonly (VirtualLocation virt_loc,
     char type;
 
     split = gnc_split_register_get_split (reg, virt_loc.vcell_loc);
-    if (!split) return FALSE;
+
+    if (!split) // this could be the blank split
+    {
+        txn = gnc_split_register_get_current_trans (reg);
+
+        if (txn) // get the current trans and see if read_only required
+        {
+            if (xaccTransGetReadOnly (txn)
+                    || xaccTransIsReadonlyByPostedDate (txn))
+                return (TRUE);
+        }
+        return FALSE;
+    }
 
     txn = xaccSplitGetParent (split);
     if (!txn) return FALSE;

commit cf3e9239e26fa471ea02616fd20a543741f34fe9
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Fri Jun 7 13:38:25 2019 +0100

    Allow cancelling of a split paste
    
    Currently when you paste a split you can not cancel the changes as they
    are already committed. By opening the transaction for editing before
    the split paste the cancel option is now available.

diff --git a/gnucash/register/ledger-core/split-register.c b/gnucash/register/ledger-core/split-register.c
index 646dd9b81..852c85cb7 100644
--- a/gnucash/register/ledger-core/split-register.c
+++ b/gnucash/register/ledger-core/split-register.c
@@ -953,6 +953,10 @@ gnc_split_register_paste_current (SplitRegister *reg)
             }
         }
 
+        /* Open the transaction for editing. */
+        if (gnc_split_register_begin_edit_or_warn (info, trans))
+        {
+            LEAVE("can't begin editing");
             return;
         }
 

commit a7f3f5213fc08dd4d73af4da062d26fd8c78454f
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Fri Jun 7 13:37:50 2019 +0100

    Add a dialogue about pasting on an anchoring split
    
    Present a dialogue advising that you can not paste a split on top of
    the anchoring split.

diff --git a/gnucash/register/ledger-core/split-register.c b/gnucash/register/ledger-core/split-register.c
index f1cd66390..646dd9b81 100644
--- a/gnucash/register/ledger-core/split-register.c
+++ b/gnucash/register/ledger-core/split-register.c
@@ -921,6 +921,11 @@ gnc_split_register_paste_current (SplitRegister *reg)
     {
         const char *message = _("You are about to overwrite an existing split. "
                                 "Are you sure you want to do that?");
+        const char *anchor_message = _("This is the split anchoring this transaction "
+                                       "to the register. You may not overwrite it from "
+                                       "this register window. You may overwrite it if "
+                                       "you navigate to a register that shows another "
+                                       "side of this same transaction.");
 
         if (copied_class == CURSOR_CLASS_TRANS)
         {
@@ -929,12 +934,25 @@ gnc_split_register_paste_current (SplitRegister *reg)
             return;
         }
 
-        /* Ask before overwriting an existing split. */
-        if (split != NULL &&
-                !gnc_verify_dialog (GTK_WINDOW (gnc_split_register_get_parent (reg)),
-                                    FALSE, "%s", message))
+        if (split != NULL)
         {
-            LEAVE("user cancelled");
+            /* the General Journal does not have any anchoring splits */
+            if ((reg->type != GENERAL_JOURNAL) &&
+                split == gnc_split_register_get_current_trans_split (reg, NULL))
+            {
+                gnc_warning_dialog (GTK_WINDOW (gnc_split_register_get_parent (reg)),
+                                    "%s", anchor_message);
+                LEAVE("anchore split");
+                return;
+            }
+            else if (!gnc_verify_dialog (GTK_WINDOW (gnc_split_register_get_parent (reg)),
+                                         FALSE, "%s", message))
+            {
+                LEAVE("user cancelled");
+                return;
+            }
+        }
+
             return;
         }
 
@@ -1040,7 +1058,7 @@ gnc_split_register_is_blank_split (SplitRegister *reg, Split *split)
 {
     SRInfo *info = gnc_split_register_get_info (reg);
     Split *current_blank_split = xaccSplitLookup (&info->blank_split_guid, gnc_get_current_book ());
-    
+
     if (split == current_blank_split)
         return TRUE;
 

commit 4cf92baaa7aea478918c986171953a377396b68c
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Fri Jun 7 13:37:07 2019 +0100

    Bug 797249 - Cutting home account causes transaction to disappear
    
    Add some test for when cutting splits from transactions that prevent
    the cutting of the anchor split and warn when the split is a reconciled
    one or when cutting the transaction that it contains reconciled splits.

diff --git a/gnucash/gnome/gnc-plugin-page-register.c b/gnucash/gnome/gnc-plugin-page-register.c
index 6950f3945..f199a7dab 100644
--- a/gnucash/gnome/gnc-plugin-page-register.c
+++ b/gnucash/gnome/gnc-plugin-page-register.c
@@ -3582,17 +3582,16 @@ gnc_plugin_page_register_cmd_find_transactions (GtkAction *action,
 
 static void
 gnc_plugin_page_register_cmd_cut_transaction (GtkAction *action,
-        GncPluginPageRegister *page)
+        GncPluginPageRegister *plugin_page)
 {
     GncPluginPageRegisterPrivate *priv;
-    SplitRegister *reg;
 
-    g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(page));
+    ENTER("(action %p, plugin_page %p)", action, plugin_page);
 
-    ENTER("(action %p, page %p)", action, page);
-    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
-    reg = gnc_ledger_display_get_split_register(priv->ledger);
-    gnc_split_register_cut_current(reg);
+    g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page));
+
+    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
+    gsr_default_cut_txn_handler (priv->gsr, NULL);
     LEAVE(" ");
 }
 
diff --git a/gnucash/gnome/gnc-split-reg.c b/gnucash/gnome/gnc-split-reg.c
index 1c0f3dfac..628da74d5 100644
--- a/gnucash/gnome/gnc-split-reg.c
+++ b/gnucash/gnome/gnc-split-reg.c
@@ -71,6 +71,7 @@ static GtkWidget* add_summary_label( GtkWidget *summarybar, gboolean pack_start,
 static void gsr_summarybar_set_arrow_draw (GNCSplitReg *gsr);
 
 static void gnc_split_reg_determine_read_only( GNCSplitReg *gsr );
+static gboolean is_trans_readonly_and_warn (GtkWindow *parent, Transaction *trans);
 
 static GNCPlaceholderType gnc_split_reg_get_placeholder( GNCSplitReg *gsr );
 static GtkWidget *gnc_split_reg_get_parent( GNCLedgerDisplay *ledger );
@@ -790,10 +791,165 @@ gnc_split_reg_paste_cb (GtkWidget *w, gpointer data)
 }
 
 void
-gsr_default_cut_txn_handler( GNCSplitReg *gsr, gpointer data )
+gsr_default_cut_txn_handler (GNCSplitReg *gsr, gpointer data)
 {
-    gnc_split_register_cut_current
-    (gnc_ledger_display_get_split_register( gsr->ledger ));
+    CursorClass cursor_class;
+    SplitRegister *reg;
+    Transaction *trans;
+    Split *split;
+    GtkWidget *dialog;
+    gint response;
+    const gchar *warning;
+
+    reg = gnc_ledger_display_get_split_register (gsr->ledger);
+
+    /* get the current split based on cursor position */
+    split = gnc_split_register_get_current_split (reg);
+    if (split == NULL)
+    {
+        gnc_split_register_cancel_cursor_split_changes (reg);
+        return;
+    }
+
+    trans = xaccSplitGetParent (split);
+    cursor_class = gnc_split_register_get_current_cursor_class (reg);
+
+    /* test for blank_split reference pointing to split */
+    if (gnc_split_register_is_blank_split (reg, split))
+        gnc_split_register_change_blank_split_ref (reg, split);
+
+    /* Cutting the blank split just cancels */
+    {
+        Split *blank_split = gnc_split_register_get_blank_split (reg);
+
+        if (split == blank_split)
+        {
+            gnc_split_register_cancel_cursor_trans_changes (reg);
+            return;
+        }
+    }
+
+    if (cursor_class == CURSOR_CLASS_NONE)
+        return;
+
+    /* this is probably not required but leave as a double check */
+    if (is_trans_readonly_and_warn (GTK_WINDOW(gsr->window), trans))
+        return;
+
+    /* On a split cursor, just delete the one split. */
+    if (cursor_class == CURSOR_CLASS_SPLIT)
+    {
+        const char *format = _("Cut the split '%s' from the transaction '%s'?");
+        const char *recn_warn = _("You would be removing a reconciled split! "
+                                  "This is not a good idea as it will cause your "
+                                  "reconciled balance to be off.");
+        const char *anchor_error = _("You cannot cut this split.");
+        const char *anchor_split = _("This is the split anchoring this transaction "
+                                     "to the register. You may not remove it from "
+                                     "this register window. You may remove the "
+                                     "entire transaction from this window, or you "
+                                     "may navigate to a register that shows "
+                                     "another side of this same transaction and "
+                                     "remove the split from that register.");
+        char *buf = NULL;
+        const char *memo;
+        const char *desc;
+        char recn;
+
+        if (reg->type != GENERAL_JOURNAL) // no anchoring split
+        {
+            if (split == gnc_split_register_get_current_trans_split (reg, NULL))
+            {
+                dialog = gtk_message_dialog_new (GTK_WINDOW(gsr->window),
+                                                 GTK_DIALOG_MODAL
+                                                 | GTK_DIALOG_DESTROY_WITH_PARENT,
+                                                 GTK_MESSAGE_ERROR,
+                                                 GTK_BUTTONS_OK,
+                                                 "%s", anchor_error);
+                gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG(dialog),
+                         "%s", anchor_split);
+                gtk_dialog_run (GTK_DIALOG(dialog));
+                gtk_widget_destroy (dialog);
+                return;
+            }
+        }
+        memo = xaccSplitGetMemo (split);
+        memo = (memo && *memo) ? memo : _("(no memo)");
+
+        desc = xaccTransGetDescription (trans);
+        desc = (desc && *desc) ? desc : _("(no description)");
+
+        /* ask for user confirmation before performing permanent damage */
+        buf = g_strdup_printf (format, memo, desc);
+        dialog = gtk_message_dialog_new (GTK_WINDOW(gsr->window),
+                                         GTK_DIALOG_MODAL
+                                         | GTK_DIALOG_DESTROY_WITH_PARENT,
+                                         GTK_MESSAGE_QUESTION,
+                                         GTK_BUTTONS_NONE,
+                                         "%s", buf);
+        g_free (buf);
+        recn = xaccSplitGetReconcile (split);
+        if (recn == YREC || recn == FREC)
+        {
+            gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG(dialog),
+                    "%s", recn_warn);
+            warning = GNC_PREF_WARN_REG_SPLIT_DEL_RECD;
+        }
+        else
+        {
+            warning = GNC_PREF_WARN_REG_SPLIT_DEL;
+        }
+
+        gtk_dialog_add_button (GTK_DIALOG(dialog),
+                               _("_Cancel"), GTK_RESPONSE_CANCEL);
+        gnc_gtk_dialog_add_button (dialog, _("_Cut Split"),
+                                   "edit-delete", GTK_RESPONSE_ACCEPT);
+        response = gnc_dialog_run (GTK_DIALOG(dialog), warning);
+        gtk_widget_destroy (dialog);
+        if (response != GTK_RESPONSE_ACCEPT)
+            return;
+
+        gnc_split_register_cut_current (reg);
+        return;
+    }
+
+    /* On a transaction cursor with 2 or fewer splits in single or double
+     * mode, we just delete the whole transaction, kerblooie */
+    {
+        const char *title = _("Cut the current transaction?");
+        const char *recn_warn = _("You would be removing a transaction "
+                                  "with reconciled splits! "
+                                  "This is not a good idea as it will cause your "
+                                  "reconciled balance to be off.");
+
+        dialog = gtk_message_dialog_new (GTK_WINDOW(gsr->window),
+                                         GTK_DIALOG_MODAL
+                                         | GTK_DIALOG_DESTROY_WITH_PARENT,
+                                         GTK_MESSAGE_WARNING,
+                                         GTK_BUTTONS_NONE,
+                                         "%s", title);
+        if (xaccTransHasReconciledSplits (trans))
+        {
+            gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG(dialog),
+                     "%s", recn_warn);
+            warning = GNC_PREF_WARN_REG_TRANS_DEL_RECD;
+        }
+        else
+        {
+            warning = GNC_PREF_WARN_REG_TRANS_DEL;
+        }
+        gtk_dialog_add_button (GTK_DIALOG(dialog),
+                               _("_Cancel"), GTK_RESPONSE_CANCEL);
+        gnc_gtk_dialog_add_button (dialog, _("_Cut Transaction"),
+                                  "edit-delete", GTK_RESPONSE_ACCEPT);
+        response =  gnc_dialog_run (GTK_DIALOG(dialog), warning);
+        gtk_widget_destroy (dialog);
+        if (response != GTK_RESPONSE_ACCEPT)
+            return;
+
+        gnc_split_register_cut_current (reg);
+        return;
+    }
 }
 
 /**
diff --git a/gnucash/gnome/gnc-split-reg.h b/gnucash/gnome/gnc-split-reg.h
index af22ef4fb..d54372c8e 100644
--- a/gnucash/gnome/gnc-split-reg.h
+++ b/gnucash/gnome/gnc-split-reg.h
@@ -263,6 +263,7 @@ void gsr_default_associate_handler (GNCSplitReg *gsr, gboolean uri_is_file);
 void gsr_default_execassociated_handler( GNCSplitReg *gsr, gpointer data );
 void gnc_split_reg_enter( GNCSplitReg *gsr, gboolean next_transaction );
 void gsr_default_delete_handler( GNCSplitReg *gsr, gpointer data );
+void gsr_default_cut_txn_handler( GNCSplitReg *gsr, gpointer data );
 void gsr_default_reinit_handler( GNCSplitReg *gsr, gpointer data );
 void gsr_default_expand_handler( GNCSplitReg *gsr, gpointer data );
 void gsr_default_schedule_handler( GNCSplitReg *gsr, gpointer data );

commit 8c6832bcb95af313869b7d99a3066c2317719439
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Fri Jun 7 13:36:24 2019 +0100

    Allow deleting all splits in the General Journal
    
    In the General Journal there is no anchor split so allow all splits to
    be deleted.

diff --git a/gnucash/gnome/gnc-split-reg.c b/gnucash/gnome/gnc-split-reg.c
index 3d9f14cb8..1c0f3dfac 100644
--- a/gnucash/gnome/gnc-split-reg.c
+++ b/gnucash/gnome/gnc-split-reg.c
@@ -1448,19 +1448,22 @@ gsr_default_delete_handler( GNCSplitReg *gsr, gpointer data )
         const char *desc;
         char recn;
 
-        if (split == gnc_split_register_get_current_trans_split (reg, NULL))
+        if (reg->type != GENERAL_JOURNAL) // no anchoring split
         {
-            dialog = gtk_message_dialog_new(GTK_WINDOW(gsr->window),
-                                            GTK_DIALOG_MODAL
-                                            | GTK_DIALOG_DESTROY_WITH_PARENT,
-                                            GTK_MESSAGE_ERROR,
-                                            GTK_BUTTONS_OK,
-                                            "%s", anchor_error);
-            gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),
-                    "%s", anchor_split);
-            gtk_dialog_run(GTK_DIALOG(dialog));
-            gtk_widget_destroy (dialog);
-            return;
+            if (split == gnc_split_register_get_current_trans_split (reg, NULL))
+            {
+                dialog = gtk_message_dialog_new(GTK_WINDOW(gsr->window),
+                                                GTK_DIALOG_MODAL
+                                                | GTK_DIALOG_DESTROY_WITH_PARENT,
+                                                GTK_MESSAGE_ERROR,
+                                                GTK_BUTTONS_OK,
+                                                "%s", anchor_error);
+                gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),
+                        "%s", anchor_split);
+                gtk_dialog_run(GTK_DIALOG(dialog));
+                gtk_widget_destroy (dialog);
+                return;
+            }
         }
 
         memo = xaccSplitGetMemo (split);

commit 5cb1d0ebb95226b14e38937a7b33b87797e69583
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Tue Jun 4 16:31:15 2019 +0100

    Disable menu options that should not be possible when
     transactions are marked read only

diff --git a/gnucash/gnome/gnc-plugin-page-register.c b/gnucash/gnome/gnc-plugin-page-register.c
index e7d18cde4..6950f3945 100644
--- a/gnucash/gnome/gnc-plugin-page-register.c
+++ b/gnucash/gnome/gnc-plugin-page-register.c
@@ -929,13 +929,15 @@ gnc_plugin_page_register_ui_update (gpointer various, GncPluginPageRegister *pag
     GncPluginPageRegisterPrivate *priv;
     SplitRegister *reg;
     GtkAction *action;
-    gboolean expanded, voided;
+    gboolean expanded, voided, read_only = FALSE;
     Transaction *trans;
+    CursorClass cursor_class;
     const char *uri;
 
     /* Set 'Split Transaction' */
     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
     reg = gnc_ledger_display_get_split_register(priv->ledger);
+    cursor_class = gnc_split_register_get_current_cursor_class (reg);
     expanded = gnc_split_register_current_trans_expanded(reg);
     action = gnc_plugin_page_get_action (GNC_PLUGIN_PAGE(page),
                                          "SplitTransactionAction");
@@ -946,13 +948,51 @@ gnc_plugin_page_register_ui_update (gpointer various, GncPluginPageRegister *pag
     g_signal_handlers_unblock_by_func
     (action, gnc_plugin_page_register_cmd_expand_transaction, page);
 
-    /* Set 'Void' and 'Unvoid' */
-    trans = gnc_split_register_get_current_trans(reg);
+    /* Set available actions based on read only */
+    trans = gnc_split_register_get_current_trans (reg);
+
+    if (trans)
+        read_only = xaccTransIsReadonlyByPostedDate (trans);
     voided = xaccTransHasSplitsInState(trans, VREC);
+
+    action = gnc_plugin_page_get_action (GNC_PLUGIN_PAGE(page),
+                                         "CutTransactionAction");
+    gtk_action_set_sensitive (GTK_ACTION(action), !read_only & !voided);
+
+    action = gnc_plugin_page_get_action (GNC_PLUGIN_PAGE(page),
+                                         "PasteTransactionAction");
+    gtk_action_set_sensitive (GTK_ACTION(action), !read_only & !voided);
+
+    action = gnc_plugin_page_get_action (GNC_PLUGIN_PAGE(page),
+                                         "DeleteTransactionAction");
+    gtk_action_set_sensitive (GTK_ACTION(action), !read_only & !voided);
+
+    action = gnc_plugin_page_get_action (GNC_PLUGIN_PAGE(page),
+                                         "DuplicateTransactionAction");
+    gtk_action_set_sensitive (GTK_ACTION(action), TRUE);
+
+    if (cursor_class == CURSOR_CLASS_SPLIT)
+    {
+        action = gnc_plugin_page_get_action (GNC_PLUGIN_PAGE(page),
+                                             "DuplicateTransactionAction");
+        gtk_action_set_sensitive (GTK_ACTION(action), !read_only & !voided);
+    }
+
+    action = gnc_plugin_page_get_action (GNC_PLUGIN_PAGE(page),
+                                         "RemoveTransactionSplitsAction");
+    gtk_action_set_sensitive (GTK_ACTION(action), !read_only & !voided);
+
+    /* Set 'Void' and 'Unvoid' */
+    if (read_only)
+        voided = TRUE;
+
     action = gnc_plugin_page_get_action (GNC_PLUGIN_PAGE(page),
                                          "VoidTransactionAction");
     gtk_action_set_sensitive (GTK_ACTION(action), !voided);
 
+    if (read_only)
+        voided = FALSE;
+
     action = gnc_plugin_page_get_action (GNC_PLUGIN_PAGE(page),
                                          "UnvoidTransactionAction");
     gtk_action_set_sensitive (GTK_ACTION(action), voided);
@@ -981,7 +1021,6 @@ gnc_plugin_page_register_ui_update (gpointer various, GncPluginPageRegister *pag
     {
         const char **iter, **label_iter, **tooltip_iter;
         gboolean curr_label_trans = FALSE;
-        CursorClass cursor_class = gnc_split_register_get_current_cursor_class (reg);
         iter = tran_vs_split_actions;
         action = gnc_plugin_page_get_action (GNC_PLUGIN_PAGE(page), *iter);
         label_iter = tran_action_labels;



Summary of changes:
 gnucash/gnome/gnc-plugin-page-register.c           |  60 +++++--
 gnucash/gnome/gnc-split-reg.c                      | 189 +++++++++++++++++++--
 gnucash/gnome/gnc-split-reg.h                      |   1 +
 .../register/ledger-core/split-register-model.c    |  14 +-
 gnucash/register/ledger-core/split-register.c      |  34 +++-
 5 files changed, 265 insertions(+), 33 deletions(-)



More information about the gnucash-changes mailing list