gnucash maint: Multiple changes pushed

Geert Janssens gjanssens at code.gnucash.org
Thu Aug 30 06:25:22 EDT 2018


Updated	 via  https://github.com/Gnucash/gnucash/commit/c977c235 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/a639dd92 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/e2801fd9 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/4a3c6f8f (commit)
	 via  https://github.com/Gnucash/gnucash/commit/6ba47846 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/a650693d (commit)
	 via  https://github.com/Gnucash/gnucash/commit/9423e091 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/c6001d85 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/ed05b895 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/13c5b539 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/72a29a83 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/8a0ee0e3 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/e281b50b (commit)
	 via  https://github.com/Gnucash/gnucash/commit/97a566ae (commit)
	 via  https://github.com/Gnucash/gnucash/commit/6eac7e1e (commit)
	 via  https://github.com/Gnucash/gnucash/commit/632c7c72 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/d74ec9aa (commit)
	 via  https://github.com/Gnucash/gnucash/commit/3f9a8977 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/b50c8a57 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/b4db066d (commit)
	 via  https://github.com/Gnucash/gnucash/commit/c3724431 (commit)
	from  https://github.com/Gnucash/gnucash/commit/28691b46 (commit)



commit c977c2350a83035fadff61053507104aa9309f26
Merge: 28691b4 a639dd9
Author: Geert Janssens <geert at kobaltwit.be>
Date:   Thu Aug 30 12:18:15 2018 +0200

    Merge branch 'sort-filter' of https://github.com/Bob-IT/gnucash into maint


commit a639dd92363438eebbb99a675ca931df91c14696
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Tue Aug 28 18:47:15 2018 +0100

    Reduce the number of times the register loads
    
    When a register is created an initial query is run and then the filter
    and sort item/reverse order is added and after each item the ledger is
    refreshed. By adding a parameter to the three main functions to toggle
    the refreshing, with a value of false at register creation, and moving
    the gnc_ledger_display_refresh command this can be reduced to 2 from 5.
    
    In the sort/filter dialogue the refresh parameter is TRUE allowing the
    changes to be seen immediately.

diff --git a/gnucash/gnome/gnc-plugin-page-register.c b/gnucash/gnome/gnc-plugin-page-register.c
index cd6d8ca..8ec8752 100644
--- a/gnucash/gnome/gnc-plugin-page-register.c
+++ b/gnucash/gnome/gnc-plugin-page-register.c
@@ -139,8 +139,8 @@ static gchar *gnc_plugin_page_register_get_filter (GncPluginPage *plugin_page);
 void gnc_plugin_page_register_set_filter (GncPluginPage *plugin_page, const gchar *filter);
 static void gnc_plugin_page_register_set_filter_tooltip (GncPluginPageRegister *page);
 
-static void gnc_ppr_update_status_query (GncPluginPageRegister *page);
-static void gnc_ppr_update_date_query (GncPluginPageRegister *page);
+static void gnc_ppr_update_status_query (GncPluginPageRegister *page, gboolean refresh);
+static void gnc_ppr_update_date_query (GncPluginPageRegister *page, gboolean refresh);
 
 /* Command callbacks */
 static void gnc_plugin_page_register_cmd_print_check (GtkAction *action, GncPluginPageRegister *plugin_page);
@@ -1155,7 +1155,6 @@ gnc_plugin_page_register_create_widget (GncPluginPage *plugin_page)
     reg = gnc_ledger_display_get_split_register(priv->ledger);
     gnc_split_register_config(reg, reg->type, reg->style,
                               reg->use_double_line);
-    gnc_ledger_display_refresh(priv->ledger);
 
     gnc_plugin_page_register_ui_initial_state (page);
     gnc_plugin_page_register_ui_update (NULL, page);
@@ -1178,7 +1177,7 @@ gnc_plugin_page_register_create_widget (GncPluginPage *plugin_page)
         g_free(order);
 
         priv->sd.reverse_order = gnc_plugin_page_register_get_sort_reversed(plugin_page);
-        gnc_split_reg_set_sort_reversed(priv->gsr, priv->sd.reverse_order);
+        gnc_split_reg_set_sort_reversed(priv->gsr, priv->sd.reverse_order, FALSE);
         if (priv->sd.reverse_order)
             priv->sd.save_order = TRUE;
 
@@ -1261,8 +1260,11 @@ gnc_plugin_page_register_create_widget (GncPluginPage *plugin_page)
     }
 
     /* Update Query with Filter Status and Dates */
-    gnc_ppr_update_status_query (page);
-    gnc_ppr_update_date_query(page);
+    gnc_ppr_update_status_query (page, FALSE);
+    gnc_ppr_update_date_query(page, FALSE);
+
+    /* Now do the refresh */
+    gnc_ledger_display_refresh(priv->ledger);
 
     // Set filter tooltip for summary bar
     gnc_plugin_page_register_set_filter_tooltip (page);
@@ -2248,7 +2250,7 @@ gnc_plugin_page_register_sort_response_cb (GtkDialog *dialog,
     if (response != GTK_RESPONSE_OK)
     {
         /* Restore the original sort order */
-        gnc_split_reg_set_sort_reversed(priv->gsr, priv->sd.original_reverse_order);
+        gnc_split_reg_set_sort_reversed(priv->gsr, priv->sd.original_reverse_order, TRUE);
         priv->sd.reverse_order = priv->sd.original_reverse_order;
         gnc_split_reg_set_sort_type(priv->gsr, priv->sd.original_sort_type);
         priv->sd.save_order = priv->sd.original_save_order;
@@ -2363,7 +2365,7 @@ gnc_plugin_page_register_sort_order_reverse_cb (GtkToggleButton *button,
     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
 
     priv->sd.reverse_order = gtk_toggle_button_get_active(button);
-    gnc_split_reg_set_sort_reversed(priv->gsr, priv->sd.reverse_order);
+    gnc_split_reg_set_sort_reversed(priv->gsr, priv->sd.reverse_order, TRUE);
     LEAVE(" ");
 }
 
@@ -2384,7 +2386,7 @@ gnc_plugin_page_register_sort_order_reverse_cb (GtkToggleButton *button,
  *  associated with this filter dialog.
  */
 static void
-gnc_ppr_update_status_query (GncPluginPageRegister *page)
+gnc_ppr_update_status_query (GncPluginPageRegister *page, gboolean refresh)
 {
     GncPluginPageRegisterPrivate *priv;
     GSList *param_list;
@@ -2414,7 +2416,8 @@ gnc_ppr_update_status_query (GncPluginPageRegister *page)
     // Set filter tooltip for summary bar
     gnc_plugin_page_register_set_filter_tooltip (page);
 
-    gnc_ledger_display_refresh (priv->ledger);
+    if (refresh)
+        gnc_ledger_display_refresh (priv->ledger);
     LEAVE(" ");
 }
 
@@ -2432,7 +2435,7 @@ gnc_ppr_update_status_query (GncPluginPageRegister *page)
  *  associated with this filter dialog.
  */
 static void
-gnc_ppr_update_date_query (GncPluginPageRegister *page)
+gnc_ppr_update_date_query (GncPluginPageRegister *page, gboolean refresh)
 {
     GncPluginPageRegisterPrivate *priv;
     GSList *param_list;
@@ -2485,7 +2488,8 @@ gnc_ppr_update_date_query (GncPluginPageRegister *page)
     // Set filter tooltip for summary bar
     gnc_plugin_page_register_set_filter_tooltip (page);
 
-    gnc_ledger_display_refresh (priv->ledger);
+    if (refresh)
+        gnc_ledger_display_refresh (priv->ledger);
     LEAVE(" ");
 }
 
@@ -2566,7 +2570,7 @@ gnc_plugin_page_register_filter_status_one_cb (GtkToggleButton *button,
         priv->fd.cleared_match |= value;
     else
         priv->fd.cleared_match &= ~value;
-    gnc_ppr_update_status_query(page);
+    gnc_ppr_update_status_query(page, TRUE);
     LEAVE(" ");
 }
 
@@ -2605,7 +2609,7 @@ gnc_plugin_page_register_filter_status_all_cb (GtkButton *button,
     /* Set the requested status */
     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
     priv->fd.cleared_match = CLEARED_ALL;
-    gnc_ppr_update_status_query(page);
+    gnc_ppr_update_status_query(page, TRUE);
     LEAVE(" ");
 }
 
@@ -2713,7 +2717,7 @@ gnc_plugin_page_register_filter_select_range_cb (GtkRadioButton *button,
         priv->fd.start_time = 0;
         priv->fd.end_time = 0;
     }
-    gnc_ppr_update_date_query(page);
+    gnc_ppr_update_date_query(page, TRUE);
     LEAVE(" ");
 }
 
@@ -2741,7 +2745,7 @@ gnc_plugin_page_register_filter_days_changed_cb (GtkSpinButton *button,
     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
 
     priv->fd.days = gtk_spin_button_get_value(GTK_SPIN_BUTTON(button));
-    gnc_ppr_update_date_query(page);
+    gnc_ppr_update_date_query(page, TRUE);
     LEAVE(" ");
 }
 
@@ -2764,7 +2768,7 @@ gnc_plugin_page_register_filter_gde_changed_cb (GtkWidget *unused,
 
     ENTER("(widget %s(%p), page %p)", gtk_buildable_get_name(GTK_BUILDABLE(unused)), unused, page);
     get_filter_times(page);
-    gnc_ppr_update_date_query(page);
+    gnc_ppr_update_date_query(page, TRUE);
     LEAVE(" ");
 }
 
@@ -2811,7 +2815,7 @@ gnc_plugin_page_register_filter_start_cb (GtkWidget *radio,
     active = ( g_strcmp0(name, g_strdup("start_date_choose")) == 0 ? 1 : 0 );
     gtk_widget_set_sensitive(priv->fd.start_date, active);
     get_filter_times(page);
-    gnc_ppr_update_date_query(page);
+    gnc_ppr_update_date_query(page, TRUE);
     LEAVE(" ");
 }
 
@@ -2858,7 +2862,7 @@ gnc_plugin_page_register_filter_end_cb (GtkWidget *radio,
     active = ( g_strcmp0(name, g_strdup("end_date_choose")) == 0 ? 1 : 0 );
     gtk_widget_set_sensitive(priv->fd.end_date, active);
     get_filter_times(page);
-    gnc_ppr_update_date_query(page);
+    gnc_ppr_update_date_query(page, TRUE);
     LEAVE(" ");
 }
 
@@ -2922,12 +2926,12 @@ gnc_plugin_page_register_filter_response_cb (GtkDialog *dialog,
     {
         /* Remove the old status match */
         priv->fd.cleared_match = priv->fd.original_cleared_match;
-        gnc_ppr_update_status_query(page);
+        gnc_ppr_update_status_query(page, FALSE);
         priv->fd.start_time = priv->fd.original_start_time;
         priv->fd.end_time = priv->fd.original_end_time;
         priv->fd.days = priv->fd.original_days;
         priv->fd.save_filter = priv->fd.original_save_filter;
-        gnc_ppr_update_date_query(page);
+        gnc_ppr_update_date_query(page, TRUE);
     }
     else
     {
diff --git a/gnucash/gnome/gnc-split-reg.c b/gnucash/gnome/gnc-split-reg.c
index f5ddfb5..a82c603 100644
--- a/gnucash/gnome/gnc-split-reg.c
+++ b/gnucash/gnome/gnc-split-reg.c
@@ -1961,7 +1961,7 @@ gnc_split_reg_sort_notes_cb(GtkWidget *w, gpointer data)
 
 
 void
-gnc_split_reg_set_sort_reversed(GNCSplitReg *gsr, gboolean rev)
+gnc_split_reg_set_sort_reversed(GNCSplitReg *gsr, gboolean rev, gboolean refresh)
 {
     /* Note: sort_reversed is the boolean opposite of sort_increasing
      *       so when rev == true, we're sorting decreasing
@@ -1971,7 +1971,8 @@ gnc_split_reg_set_sort_reversed(GNCSplitReg *gsr, gboolean rev)
     Query *query = gnc_ledger_display_get_query( gsr->ledger );
     qof_query_set_sort_increasing (query, !rev, !rev, !rev);
     gsr->sort_rev = rev;
-    gnc_ledger_display_refresh( gsr->ledger );
+    if (refresh)
+        gnc_ledger_display_refresh( gsr->ledger );
 }
 
 static void
diff --git a/gnucash/gnome/gnc-split-reg.h b/gnucash/gnome/gnc-split-reg.h
index 16ecae1..09ffc73 100644
--- a/gnucash/gnome/gnc-split-reg.h
+++ b/gnucash/gnome/gnc-split-reg.h
@@ -206,7 +206,7 @@ void gnc_split_reg_set_sort_type_force( GNCSplitReg *gsr, SortType t, gboolean f
 /**
  * Set/get sort order of register
  **/
-void gnc_split_reg_set_sort_reversed(GNCSplitReg *gsr, gboolean rev);
+void gnc_split_reg_set_sort_reversed(GNCSplitReg *gsr, gboolean rev, gboolean refresh);
 
 
 /**

commit e2801fd937451a32a3af712aee1bffac25823558
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Sun Aug 19 22:02:47 2018 +0100

    Change the default filter for General Ledger
    
    The General Ledger default for the number of days shown is 30 but for
    the Register it is 0, meaning show all. So change the default filter
    based on ledger type and use this when determining if the setting should
     be saved or removed.

diff --git a/gnucash/gnome/gnc-plugin-page-register.c b/gnucash/gnome/gnc-plugin-page-register.c
index bc7cda6..cd6d8ca 100644
--- a/gnucash/gnome/gnc-plugin-page-register.c
+++ b/gnucash/gnome/gnc-plugin-page-register.c
@@ -90,6 +90,7 @@
 static QofLogModule log_module = GNC_MOD_GUI;
 
 #define DEFAULT_LINES_AMOUNT         50
+#define DEFAULT_FILTER_NUM_DAYS_GL  "30"
 
 static void gnc_plugin_page_register_class_init (GncPluginPageRegisterClass *klass);
 static void gnc_plugin_page_register_init (GncPluginPageRegister *plugin_page);
@@ -1091,6 +1092,15 @@ gnc_plugin_page_register_ui_initial_state (GncPluginPageRegister *page)
 
 /* Virtual Functions */
 
+static const gchar *
+get_filter_default_num_of_days (GNCLedgerDisplayType ledger_type)
+{
+    if (ledger_type == LD_GL)
+        return DEFAULT_FILTER_NUM_DAYS_GL;
+    else
+        return "0";
+}
+
 static GtkWidget *
 gnc_plugin_page_register_create_widget (GncPluginPage *plugin_page)
 {
@@ -1204,7 +1214,11 @@ gnc_plugin_page_register_create_widget (GncPluginPage *plugin_page)
             filter_changed = filter_changed + 1;
         }
 
-        if (filter[3] && (g_strcmp0 (filter[3], "0") != 0 ))
+        // set the default for the number of days
+        priv->fd.days = (gint)g_ascii_strtoll (
+                                    get_filter_default_num_of_days (ledger_type), NULL, 10);
+
+        if (filter[3] && (g_strcmp0 (filter[3], get_filter_default_num_of_days (ledger_type)) != 0 ))
         {
             PINFO("Loaded Filter Days is %s", filter[3]);
 
@@ -1225,13 +1239,8 @@ gnc_plugin_page_register_create_widget (GncPluginPage *plugin_page)
 
         if (reg->type == GENERAL_JOURNAL)
         {
-            if ((priv->fd.days == 0) && (priv->fd.start_time == 0) && (priv->fd.end_time == 0))
-                priv->fd.days = 30; // default number of days for gl
-            else
-            {
-                start_time = priv->fd.start_time;
-                end_time = priv->fd.end_time;
-            }
+            start_time = priv->fd.start_time;
+            end_time = priv->fd.end_time;
         }
         else // search ledger and the like
         {
@@ -1824,7 +1833,9 @@ gnc_plugin_page_register_get_filter (GncPluginPage *plugin_page)
         if ((ledger_type == LD_SINGLE) || (ledger_type == LD_SUBACCOUNT))
             filter = xaccAccountGetFilter (leader);
     }
-    return filter ? g_strdup(filter) : g_strdup_printf("%s,%s,%s,%s", DEFAULT_FILTER, "0", "0", "0");
+
+    return filter ? g_strdup(filter) : g_strdup_printf("%s,%s,%s,%s", DEFAULT_FILTER,
+                                       "0", "0", get_filter_default_num_of_days (ledger_type));
 }
 
 static void
@@ -1860,13 +1871,16 @@ gnc_plugin_page_register_set_filter (GncPluginPage *plugin_page, const gchar *fi
     GNCLedgerDisplayType ledger_type;
     GNCLedgerDisplay *ld;
     Account *leader;
-    gchar *default_filter = g_strdup_printf("%s,%s,%s,%s", DEFAULT_FILTER, "0", "0", "0");
+    gchar *default_filter;
 
     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
     ld = priv->ledger;
     ledger_type = gnc_ledger_display_type (ld);
     leader = gnc_ledger_display_leader (ld);
 
+    default_filter = g_strdup_printf("%s,%s,%s,%s", DEFAULT_FILTER,
+                                      "0", "0", get_filter_default_num_of_days (ledger_type));
+
     // save to gcm file for LD_GL or when feature is set
     if (ledger_type == LD_GL ||
         gnc_features_check_used (gnc_get_current_book (), GNC_FEATURE_REG_SORT_FILTER))

commit 4a3c6f8f8594e1ec12208dfbb6b26d0f415c0a45
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Fri Aug 17 11:11:38 2018 +0100

    Change saving to .gcm and Kvp for GNC_FEATURE_REG_SORT_FILTER
    
    For the LD_GL save the filter and sort settings to the .gcm always.
    For the rest, keep saving the filter and sort settings to kvp only
    when the GNC_FEATURE_REG_SORT_FILTER is not set, if set then save
    only to the .gcm file. This will be set on first use in version
    4.0 where a conversion will be run to only use the .gcm meta file.

diff --git a/gnucash/gnome/gnc-plugin-page-register.c b/gnucash/gnome/gnc-plugin-page-register.c
index 24a3953..bc7cda6 100644
--- a/gnucash/gnome/gnc-plugin-page-register.c
+++ b/gnucash/gnome/gnc-plugin-page-register.c
@@ -62,6 +62,7 @@
 #include "gnc-date-edit.h"
 #include "gnc-engine.h"
 #include "gnc-event.h"
+#include "gnc-features.h"
 #include "gnc-gnome-utils.h"
 #include "gnc-gobject-utils.h"
 #include "gnc-gui-query.h"
@@ -1771,27 +1772,15 @@ gnc_plugin_page_register_get_tab_color (GncPluginPage *plugin_page)
     return g_strdup(color ? color : "Not Set");
 }
 
-static gchar *
-gnc_plugin_page_register_get_filter (GncPluginPage *plugin_page)
+static const gchar *
+gnc_plugin_page_register_get_filter_gcm (Account *leader)
 {
-    GncPluginPageRegisterPrivate *priv;
-    GNCLedgerDisplayType ledger_type;
-    GNCLedgerDisplay *ld;
-    Account *leader;
-    const char* filter = NULL;
-
     GKeyFile *state_file = gnc_state_get_current();
     gchar *state_section;
     gchar *filter_text;
     gchar acct_guid[GUID_ENCODING_LENGTH + 1];
     GError *error = NULL;
-
-    g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page), _("unknown"));
-
-    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
-    ld = priv->ledger;
-    ledger_type = gnc_ledger_display_type (ld);
-    leader = gnc_ledger_display_leader (ld);
+    const char* filter = NULL;
 
     // get the filter from the .gcm file
     guid_to_string_buff (xaccAccountGetGUID (leader), acct_guid);
@@ -1799,44 +1788,52 @@ gnc_plugin_page_register_get_filter (GncPluginPage *plugin_page)
     filter_text = g_key_file_get_string (state_file, state_section, KEY_PAGE_FILTER, &error);
 
     if (error)
-    {
-        if ((ledger_type == LD_SINGLE) || (ledger_type == LD_SUBACCOUNT))
-            filter = xaccAccountGetFilter (leader);
         g_clear_error (&error);
-    }
     else
     {
         filter_text = g_strdelimit (filter_text, ";", ',');
         filter = g_strdup (filter_text);
         g_free (filter_text);
     }
-    return filter ? g_strdup(filter) : g_strdup_printf("%s,%s,%s,%s", DEFAULT_FILTER, "0", "0", "0");
+    g_free (state_section);
+    return filter;
 }
 
-void
-gnc_plugin_page_register_set_filter (GncPluginPage *plugin_page, const gchar *filter )
+static gchar *
+gnc_plugin_page_register_get_filter (GncPluginPage *plugin_page)
 {
     GncPluginPageRegisterPrivate *priv;
+    GNCLedgerDisplayType ledger_type;
     GNCLedgerDisplay *ld;
     Account *leader;
-    gchar *default_filter = g_strdup_printf("%s,%s,%s,%s", DEFAULT_FILTER, "0", "0", "0");
+    const char* filter = NULL;
 
-    GKeyFile *state_file = gnc_state_get_current();
-    gchar *state_section;
-    gchar *filter_text;
-    gchar acct_guid[GUID_ENCODING_LENGTH + 1];
+    g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page), _("unknown"));
 
     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
     ld = priv->ledger;
+    ledger_type = gnc_ledger_display_type (ld);
     leader = gnc_ledger_display_leader (ld);
 
-    if (leader != NULL)
+    // load from gcm file for LD_GL or when feature is set
+    if (ledger_type == LD_GL ||
+        gnc_features_check_used (gnc_get_current_book (), GNC_FEATURE_REG_SORT_FILTER))
+        filter = gnc_plugin_page_register_get_filter_gcm (leader);
+    else // load from kvp
     {
-        if (!filter || (g_strcmp0 (filter, default_filter) == 0))
-            xaccAccountSetFilter (leader, NULL);
-        else
-            xaccAccountSetFilter (leader, filter);
+        if ((ledger_type == LD_SINGLE) || (ledger_type == LD_SUBACCOUNT))
+            filter = xaccAccountGetFilter (leader);
     }
+    return filter ? g_strdup(filter) : g_strdup_printf("%s,%s,%s,%s", DEFAULT_FILTER, "0", "0", "0");
+}
+
+static void
+gnc_plugin_page_register_set_filter_gcm (Account *leader, const gchar *filter, gchar *default_filter)
+{
+    GKeyFile *state_file = gnc_state_get_current();
+    gchar *state_section;
+    gchar *filter_text;
+    gchar acct_guid[GUID_ENCODING_LENGTH + 1];
 
     // save the filter to the .gcm file also
     guid_to_string_buff (xaccAccountGetGUID (leader), acct_guid);
@@ -1853,31 +1850,50 @@ gnc_plugin_page_register_set_filter (GncPluginPage *plugin_page, const gchar *fi
         g_key_file_set_string (state_file, state_section, KEY_PAGE_FILTER, filter_text);
         g_free (filter_text);
     }
-    g_free (default_filter);
-    return;
+    g_free (state_section);
 }
 
-static gchar *
-gnc_plugin_page_register_get_sort_order (GncPluginPage *plugin_page)
+void
+gnc_plugin_page_register_set_filter (GncPluginPage *plugin_page, const gchar *filter )
 {
     GncPluginPageRegisterPrivate *priv;
     GNCLedgerDisplayType ledger_type;
     GNCLedgerDisplay *ld;
     Account *leader;
-    const char* sort_order = NULL;
+    gchar *default_filter = g_strdup_printf("%s,%s,%s,%s", DEFAULT_FILTER, "0", "0", "0");
+
+    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
+    ld = priv->ledger;
+    ledger_type = gnc_ledger_display_type (ld);
+    leader = gnc_ledger_display_leader (ld);
+
+    // save to gcm file for LD_GL or when feature is set
+    if (ledger_type == LD_GL ||
+        gnc_features_check_used (gnc_get_current_book (), GNC_FEATURE_REG_SORT_FILTER))
+        gnc_plugin_page_register_set_filter_gcm (leader, filter, default_filter);
+    else // save to kvp
+    {
+        if (leader != NULL)
+        {
+            if (!filter || (g_strcmp0 (filter, default_filter) == 0))
+                xaccAccountSetFilter (leader, NULL);
+            else
+                xaccAccountSetFilter (leader, filter);
+        }
+    }
+    g_free (default_filter);
+    return;
+}
 
+static const gchar *
+gnc_plugin_page_register_get_sort_order_gcm (Account *leader)
+{
     GKeyFile *state_file = gnc_state_get_current();
     gchar *state_section;
     gchar *sort_text;
     gchar acct_guid[GUID_ENCODING_LENGTH + 1];
     GError *error = NULL;
-
-    g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page), _("unknown"));
-
-    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
-    ld = priv->ledger;
-    ledger_type = gnc_ledger_display_type (ld);
-    leader = gnc_ledger_display_leader (ld);
+    const char* sort_order = NULL;
 
     // get the sort_order from the .gcm file
     guid_to_string_buff (xaccAccountGetGUID (leader), acct_guid);
@@ -1885,41 +1901,50 @@ gnc_plugin_page_register_get_sort_order (GncPluginPage *plugin_page)
     sort_text = g_key_file_get_string (state_file, state_section, KEY_PAGE_SORT, &error);
 
     if (error)
-    {
-        if ((ledger_type == LD_SINGLE) || (ledger_type == LD_SUBACCOUNT))
-            sort_order = xaccAccountGetSortOrder (leader);
         g_clear_error (&error);
-    }
     else
     {
         sort_order = g_strdup (sort_text);
         g_free (sort_text);
     }
-    return g_strdup(sort_order ? sort_order : DEFAULT_SORT_ORDER);
+    g_free (state_section);
+    return sort_order;
 }
 
-void
-gnc_plugin_page_register_set_sort_order (GncPluginPage *plugin_page, const gchar *sort_order )
+static gchar *
+gnc_plugin_page_register_get_sort_order (GncPluginPage *plugin_page)
 {
     GncPluginPageRegisterPrivate *priv;
+    GNCLedgerDisplayType ledger_type;
     GNCLedgerDisplay *ld;
     Account *leader;
+    const char* sort_order = NULL;
 
-    GKeyFile *state_file = gnc_state_get_current();
-    gchar *state_section;
-    gchar acct_guid[GUID_ENCODING_LENGTH + 1];
+    g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page), _("unknown"));
 
     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
     ld = priv->ledger;
+    ledger_type = gnc_ledger_display_type (ld);
     leader = gnc_ledger_display_leader (ld);
 
-    if (leader != NULL)
+    // load from gcm file for LD_GL or when feature is set
+    if (ledger_type == LD_GL ||
+        gnc_features_check_used (gnc_get_current_book (), GNC_FEATURE_REG_SORT_FILTER))
+        sort_order = gnc_plugin_page_register_get_sort_order_gcm (leader);
+    else // load from kvp
     {
-        if (!sort_order || (g_strcmp0 (sort_order, DEFAULT_SORT_ORDER) == 0))
-            xaccAccountSetSortOrder (leader, NULL);
-        else
-            xaccAccountSetSortOrder (leader, sort_order);
+        if ((ledger_type == LD_SINGLE) || (ledger_type == LD_SUBACCOUNT))
+            sort_order = xaccAccountGetSortOrder (leader);
     }
+    return g_strdup(sort_order ? sort_order : DEFAULT_SORT_ORDER);
+}
+
+static void
+gnc_plugin_page_register_set_sort_order_gcm (Account *leader, const gchar *sort_order )
+{
+    GKeyFile *state_file = gnc_state_get_current();
+    gchar *state_section;
+    gchar acct_guid[GUID_ENCODING_LENGTH + 1];
 
     // save sort_order to the .gcm file also
     guid_to_string_buff (xaccAccountGetGUID (leader), acct_guid);
@@ -1932,61 +1957,93 @@ gnc_plugin_page_register_set_sort_order (GncPluginPage *plugin_page, const gchar
     else
         g_key_file_set_string (state_file, state_section, KEY_PAGE_SORT, sort_order);
 
-    return;
+    g_free (state_section);
 }
-
-static gboolean
-gnc_plugin_page_register_get_sort_reversed (GncPluginPage *plugin_page)
+void
+gnc_plugin_page_register_set_sort_order (GncPluginPage *plugin_page, const gchar *sort_order )
 {
     GncPluginPageRegisterPrivate *priv;
     GNCLedgerDisplayType ledger_type;
     GNCLedgerDisplay *ld;
     Account *leader;
-    gboolean sort_reversed = FALSE;
-
-    GKeyFile *state_file = gnc_state_get_current();
-    gchar *state_section;
-    gchar acct_guid[GUID_ENCODING_LENGTH + 1];
-    GError *error = NULL;
-
-    g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page), FALSE);
 
     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
     ld = priv->ledger;
     ledger_type = gnc_ledger_display_type (ld);
     leader = gnc_ledger_display_leader (ld);
 
+    // save to gcm file for LD_GL or when feature is set
+    if (ledger_type == LD_GL ||
+        gnc_features_check_used (gnc_get_current_book (), GNC_FEATURE_REG_SORT_FILTER))
+        gnc_plugin_page_register_set_sort_order_gcm (leader, sort_order);
+    else // save to kvp
+    {
+        if (leader != NULL)
+        {
+            if (!sort_order || (g_strcmp0 (sort_order, DEFAULT_SORT_ORDER) == 0))
+                xaccAccountSetSortOrder (leader, NULL);
+            else
+                xaccAccountSetSortOrder (leader, sort_order);
+        }
+    }
+    return;
+}
+
+static gboolean
+gnc_plugin_page_register_get_sort_reversed_gcm (Account *leader)
+{
+    GKeyFile *state_file = gnc_state_get_current();
+    gchar *state_section;
+    gchar acct_guid[GUID_ENCODING_LENGTH + 1];
+    GError *error = NULL;
+    gboolean sort_reversed = FALSE;
+
     // get the sort_reversed from the .gcm file
     guid_to_string_buff (xaccAccountGetGUID (leader), acct_guid);
     state_section = g_strconcat (STATE_SECTION_REG_PREFIX, " ", acct_guid, NULL);
     sort_reversed = g_key_file_get_boolean (state_file, state_section, KEY_PAGE_SORT_REV, &error);
 
     if (error)
-    {
-        if ((ledger_type == LD_SINGLE) || (ledger_type == LD_SUBACCOUNT))
-            sort_reversed = xaccAccountGetSortReversed (leader);
         g_clear_error (&error);
-    }
+
+    g_free (state_section);
     return sort_reversed;
 }
 
-void
-gnc_plugin_page_register_set_sort_reversed (GncPluginPage *plugin_page, gboolean reverse_order)
+static gboolean
+gnc_plugin_page_register_get_sort_reversed (GncPluginPage *plugin_page)
 {
     GncPluginPageRegisterPrivate *priv;
+    GNCLedgerDisplayType ledger_type;
     GNCLedgerDisplay *ld;
     Account *leader;
+    gboolean sort_reversed = FALSE;
 
-    GKeyFile *state_file = gnc_state_get_current();
-    gchar *state_section;
-    gchar acct_guid[GUID_ENCODING_LENGTH + 1];
+    g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page), FALSE);
 
     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
     ld = priv->ledger;
+    ledger_type = gnc_ledger_display_type (ld);
     leader = gnc_ledger_display_leader (ld);
 
-    if (leader != NULL)
-        xaccAccountSetSortReversed (leader, reverse_order);
+    // load from gcm file for LD_GL or when feature is set
+    if (ledger_type == LD_GL ||
+        gnc_features_check_used (gnc_get_current_book (), GNC_FEATURE_REG_SORT_FILTER))
+        sort_reversed = gnc_plugin_page_register_get_sort_reversed_gcm (leader);
+    else // load from kvp
+    {
+        if ((ledger_type == LD_SINGLE) || (ledger_type == LD_SUBACCOUNT))
+            sort_reversed = xaccAccountGetSortReversed (leader);
+    }
+    return sort_reversed;
+}
+
+static void
+gnc_plugin_page_register_set_sort_reversed_gcm (Account *leader, gboolean reverse_order)
+{
+    GKeyFile *state_file = gnc_state_get_current();
+    gchar *state_section;
+    gchar acct_guid[GUID_ENCODING_LENGTH + 1];
 
     // save reverse_order to the .gcm file also
     guid_to_string_buff (xaccAccountGetGUID (leader), acct_guid);
@@ -1999,6 +2056,31 @@ gnc_plugin_page_register_set_sort_reversed (GncPluginPage *plugin_page, gboolean
     else
         g_key_file_set_boolean (state_file, state_section, KEY_PAGE_SORT_REV, reverse_order);
 
+    g_free (state_section);
+}
+
+void
+gnc_plugin_page_register_set_sort_reversed (GncPluginPage *plugin_page, gboolean reverse_order)
+{
+    GncPluginPageRegisterPrivate *priv;
+    GNCLedgerDisplayType ledger_type;
+    GNCLedgerDisplay *ld;
+    Account *leader;
+
+    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
+    ld = priv->ledger;
+    ledger_type = gnc_ledger_display_type (ld);
+    leader = gnc_ledger_display_leader (ld);
+
+    // save to gcm file for LD_GL or when feature is set
+    if (ledger_type == LD_GL ||
+        gnc_features_check_used (gnc_get_current_book (), GNC_FEATURE_REG_SORT_FILTER))
+        gnc_plugin_page_register_set_sort_reversed_gcm (leader, reverse_order);
+    else // save to kvp
+    {
+        if (leader != NULL)
+            xaccAccountSetSortReversed (leader, reverse_order);
+    }
     return;
 }
 

commit 6ba47846c05805deaa1b79867b69f798523d5573
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Sun Aug 5 22:39:18 2018 +0100

    Improve the generation of the filter text

diff --git a/gnucash/gnome/gnc-plugin-page-register.c b/gnucash/gnome/gnc-plugin-page-register.c
index 9abfba1..24a3953 100644
--- a/gnucash/gnome/gnc-plugin-page-register.c
+++ b/gnucash/gnome/gnc-plugin-page-register.c
@@ -2892,23 +2892,32 @@ gnc_plugin_page_register_filter_response_cb (GtkDialog *dialog,
     LEAVE(" ");
 }
 
-static gchar*
-gpp_get_cleared_match_filter_text (gchar *text_in, gboolean *first, const gchar *text)
+static void
+gpp_update_match_filter_text (cleared_match_t match, const guint mask,
+                              const gchar *filter_name, gchar **show, gchar **hide)
 {
-    gchar *result;
-    gchar *temp = g_strdup (text_in);
-    g_free (text_in);
-
-    if (*first)
+    if ((match & mask) == mask)
     {
-        result = g_strconcat (temp, text, NULL);
-        *first = FALSE;
+        if (*show == NULL)
+            *show = g_strdup (filter_name);
+        else
+        {
+            gchar *temp = g_strdup (*show);
+            g_free (*show);
+            *show = g_strconcat (temp, ", ", filter_name, NULL);
+        }
     }
     else
-        result = g_strconcat (temp, ", ", text, NULL);
-    g_free (temp);
-
-    return result;
+    {
+        if (*hide == NULL)
+            *hide = g_strdup (filter_name);
+        else
+        {
+            gchar *temp = g_strdup (*hide);
+            g_free (*hide);
+            *hide = g_strconcat (temp, ", ", filter_name, NULL);
+        }
+    }
 }
 
 static void
@@ -2951,44 +2960,22 @@ gnc_plugin_page_register_set_filter_tooltip (GncPluginPageRegister *page)
     // filtered match items
     if (priv->fd.cleared_match != 31)
     {
-        gchar *show = g_strdup ("");
-        gchar *hide = g_strdup ("");
+        gchar *show = NULL;
+        gchar *hide = NULL;
 
-        gboolean first_show = TRUE, first_hide = TRUE;
+        gpp_update_match_filter_text (priv->fd.cleared_match, 0x01, _("Unreconciled"), &show, &hide);
+        gpp_update_match_filter_text (priv->fd.cleared_match, 0x02, _("Cleared"), &show, &hide);
+        gpp_update_match_filter_text (priv->fd.cleared_match, 0x04, _("Reconciled"), &show, &hide);
+        gpp_update_match_filter_text (priv->fd.cleared_match, 0x08, _("Frozen"), &show, &hide);
+        gpp_update_match_filter_text (priv->fd.cleared_match, 0x10, _("Voided"), &show, &hide);
 
-        if ((priv->fd.cleared_match & 0x01) == 0x01)
-            show = gpp_get_cleared_match_filter_text (show, &first_show, _("Unreconciled"));
-        else
-            hide = gpp_get_cleared_match_filter_text (hide, &first_hide, _("Unreconciled"));
-
-        if ((priv->fd.cleared_match & 0x02) == 0x02)
-            show = gpp_get_cleared_match_filter_text (show, &first_show, _("Cleared"));
-        else
-            hide = gpp_get_cleared_match_filter_text (hide, &first_hide, _("Cleared"));
-
-        if ((priv->fd.cleared_match & 0x04) == 0x04)
-            show = gpp_get_cleared_match_filter_text (show, &first_show, _("Reconciled"));
-        else
-            hide = gpp_get_cleared_match_filter_text (hide, &first_hide, _("Reconciled"));
-
-        if ((priv->fd.cleared_match & 0x08) == 0x08)
-            show = gpp_get_cleared_match_filter_text (show, &first_show, _("Frozen"));
-        else
-            hide = gpp_get_cleared_match_filter_text (hide, &first_hide, _("Frozen"));
-
-        if ((priv->fd.cleared_match & 0x10) == 0x10)
-            show = gpp_get_cleared_match_filter_text (show, &first_show, _("Voided"));
-        else
-            hide = gpp_get_cleared_match_filter_text (hide, &first_hide, _("Voided"));
-
-        if (g_strcmp0 (show, "") == 0)
+        if (show == NULL)
             text_cleared = g_strconcat (_("Hide:"), " ", hide, NULL);
         else
             text_cleared = g_strconcat (_("Show:"), " ", show, "\n", _("Hide:"), " ", hide, NULL);
 
         g_free (show);
         g_free (hide);
-
     }
     // create the tooltip based on created text variables
     if ((text_start != NULL) || (text_end != NULL) || (text_cleared != NULL))

commit a650693d07269d82515bc132a334dac9aa96d43c
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Tue Jun 19 17:06:43 2018 +0100

    New feature for register sort/filter settings move.

diff --git a/libgnucash/engine/gnc-features.c b/libgnucash/engine/gnc-features.c
index e56491e..453ecfc 100644
--- a/libgnucash/engine/gnc-features.c
+++ b/libgnucash/engine/gnc-features.c
@@ -48,6 +48,7 @@ static gncFeature known_features[] =
     { GNC_FEATURE_GUID_BAYESIAN, "Use account GUID as key for Bayesian data (requires at least GnuCash 2.6.12)" },
     { GNC_FEATURE_GUID_FLAT_BAYESIAN, "Use account GUID as key for bayesian data and store KVP flat (requires at least Gnucash 2.6.19)" },
     { GNC_FEATURE_SQLITE3_ISO_DATES, "Use ISO formatted date-time strings in SQLite3 databases (requires at least GnuCash 2.6.20)"},
+    { GNC_FEATURE_REG_SORT_FILTER, "Store the register sort and filter settings in .gcm metadata file (requires at least GnuCash 3.3)"},
     { NULL },
 };
 
diff --git a/libgnucash/engine/gnc-features.h b/libgnucash/engine/gnc-features.h
index 0386077..a53be43 100644
--- a/libgnucash/engine/gnc-features.h
+++ b/libgnucash/engine/gnc-features.h
@@ -52,6 +52,7 @@ extern "C" {
 #define GNC_FEATURE_GUID_BAYESIAN "Account GUID based Bayesian data"
 #define GNC_FEATURE_GUID_FLAT_BAYESIAN "Account GUID based bayesian with flat KVP"
 #define GNC_FEATURE_SQLITE3_ISO_DATES "ISO-8601 formatted date strings in SQLite3 databases."
+#define GNC_FEATURE_REG_SORT_FILTER "Register sort and filter settings stored in .gcm file"
 
 /** @} */
 

commit 9423e0913ba4d2878174cb4049c7d3e70e249321
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Tue Jun 19 17:05:55 2018 +0100

    Remove white space and re-indent gnc-features.c

diff --git a/libgnucash/engine/gnc-features.c b/libgnucash/engine/gnc-features.c
index ca4cb9b..e56491e 100644
--- a/libgnucash/engine/gnc-features.c
+++ b/libgnucash/engine/gnc-features.c
@@ -72,7 +72,7 @@ static void gnc_features_init ()
 }
 
 static void gnc_features_test_one(gpointer pkey, gpointer value,
-				  gpointer data)
+                  gpointer data)
 {
     const gchar *key = (const gchar*)pkey;
     const gchar *feature_desc = (const gchar*)value;
@@ -89,7 +89,7 @@ static void gnc_features_test_one(gpointer pkey, gpointer value,
     g_assert(feature_desc);
 
     *unknown_features = g_list_prepend(*unknown_features,
-				       (gpointer)feature_desc);
+                       (gpointer)feature_desc);
 }
 
 /* Check if the session requires features unknown to this version of GnuCash.
@@ -108,25 +108,25 @@ gchar *gnc_features_test_unknown (QofBook *book)
 
     /* Iterate over the members of this frame for unknown features */
     g_hash_table_foreach (features_used, &gnc_features_test_one,
-			  &features_list);
+              &features_list);
     if (features_list)
     {
-	GList *i;
-	char* msg = g_strdup(_("This Dataset contains features not supported "
-			       "by this version of GnuCash. You must use a "
-			       "newer version of GnuCash in order to support "
-			       "the following features:"
-                             ));
-
-	for (i = features_list; i; i = i->next)
-	{
-	    char *tmp = g_strconcat(msg, "\n* ", i->data, NULL);
-	    g_free (msg);
-	    msg = tmp;
-	}
-
-	g_list_free(features_list);
-	return msg;
+        GList *i;
+        char* msg = g_strdup(_("This Dataset contains features not supported "
+                       "by this version of GnuCash. You must use a "
+                       "newer version of GnuCash in order to support "
+                       "the following features:"
+                                 ));
+
+        for (i = features_list; i; i = i->next)
+        {
+            char *tmp = g_strconcat(msg, "\n* ", i->data, NULL);
+            g_free (msg);
+            msg = tmp;
+        }
+
+        g_list_free(features_list);
+        return msg;
     }
     g_hash_table_unref (features_used);
     return NULL;
@@ -159,7 +159,7 @@ struct CheckFeature
 };
 
 static void gnc_features_check_feature_cb (gpointer pkey, gpointer value,
-				  gpointer data)
+                  gpointer data)
 {
     const gchar *key = (const gchar*)pkey;
     struct CheckFeature * check_data = data;

commit c6001d855aceae1e1cea4777ba5b8d9036b99ff0
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Tue Jun 19 15:44:15 2018 +0100

    Allow loading the sort and filter settings for the GL
    
    By default the GL loads the last 30 days but this can be changed and
    saved depending on requirements.

diff --git a/gnucash/gnome/gnc-plugin-page-register.c b/gnucash/gnome/gnc-plugin-page-register.c
index 80e0ff5..9abfba1 100644
--- a/gnucash/gnome/gnc-plugin-page-register.c
+++ b/gnucash/gnome/gnc-plugin-page-register.c
@@ -1151,7 +1151,6 @@ gnc_plugin_page_register_create_widget (GncPluginPage *plugin_page)
 
     ledger_type = gnc_ledger_display_type (priv->ledger);
 
-    if (ledger_type == LD_SINGLE || ledger_type == LD_SUBACCOUNT)
     {
         /* Set the sort order for the split register and status of save order button */
         priv->sd.save_order = FALSE;
@@ -1218,15 +1217,32 @@ gnc_plugin_page_register_create_widget (GncPluginPage *plugin_page)
         priv->fd.original_save_filter = priv->fd.save_filter;
         g_strfreev(filter);
     }
-    else // LD_GL
+
+    if (ledger_type == LD_GL)
     {
         time64 start_time = 0, end_time = 0;
 
-        if ((priv->fd.days == 0) && (reg->type == GENERAL_JOURNAL))
+        if (reg->type == GENERAL_JOURNAL)
         {
-            priv->fd.days = 30; // default number of days for gl
-            priv->fd.original_days = priv->fd.days;
+            if ((priv->fd.days == 0) && (priv->fd.start_time == 0) && (priv->fd.end_time == 0))
+                priv->fd.days = 30; // default number of days for gl
+            else
+            {
+                start_time = priv->fd.start_time;
+                end_time = priv->fd.end_time;
+            }
         }
+        else // search ledger and the like
+        {
+            priv->fd.days = 0;
+            priv->fd.cleared_match = (gint)g_ascii_strtoll (DEFAULT_FILTER, NULL, 16);
+            gnc_split_reg_set_sort_type (priv->gsr, SortTypefromString (DEFAULT_SORT_ORDER));
+            priv->sd.reverse_order = FALSE;
+            priv->fd.save_filter = FALSE;
+            priv->sd.save_order = FALSE;
+        }
+
+        priv->fd.original_days = priv->fd.days;
 
         priv->fd.original_start_time = start_time;
         priv->fd.start_time = start_time;

commit ed05b89518af94526542b7daf1b70b7262d376a0
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Tue Jun 19 15:40:43 2018 +0100

    Load the sort and filter settings to the .gcm file.
    
    Load the sort and filter settings first from the .gcm file and if none
    are found try the account kvp entries. This is part of a transition to
    saving and loading these settings only in the .gcm file.

diff --git a/gnucash/gnome/gnc-plugin-page-register.c b/gnucash/gnome/gnc-plugin-page-register.c
index 0c83d58..80e0ff5 100644
--- a/gnucash/gnome/gnc-plugin-page-register.c
+++ b/gnucash/gnome/gnc-plugin-page-register.c
@@ -1762,7 +1762,13 @@ gnc_plugin_page_register_get_filter (GncPluginPage *plugin_page)
     GNCLedgerDisplayType ledger_type;
     GNCLedgerDisplay *ld;
     Account *leader;
-    const char* filter;
+    const char* filter = NULL;
+
+    GKeyFile *state_file = gnc_state_get_current();
+    gchar *state_section;
+    gchar *filter_text;
+    gchar acct_guid[GUID_ENCODING_LENGTH + 1];
+    GError *error = NULL;
 
     g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page), _("unknown"));
 
@@ -1770,11 +1776,24 @@ gnc_plugin_page_register_get_filter (GncPluginPage *plugin_page)
     ld = priv->ledger;
     ledger_type = gnc_ledger_display_type (ld);
     leader = gnc_ledger_display_leader (ld);
-    filter = NULL;
 
-    if ((ledger_type == LD_SINGLE) || (ledger_type == LD_SUBACCOUNT))
-        filter = xaccAccountGetFilter (leader);
+    // get the filter from the .gcm file
+    guid_to_string_buff (xaccAccountGetGUID (leader), acct_guid);
+    state_section = g_strconcat (STATE_SECTION_REG_PREFIX, " ", acct_guid, NULL);
+    filter_text = g_key_file_get_string (state_file, state_section, KEY_PAGE_FILTER, &error);
 
+    if (error)
+    {
+        if ((ledger_type == LD_SINGLE) || (ledger_type == LD_SUBACCOUNT))
+            filter = xaccAccountGetFilter (leader);
+        g_clear_error (&error);
+    }
+    else
+    {
+        filter_text = g_strdelimit (filter_text, ";", ',');
+        filter = g_strdup (filter_text);
+        g_free (filter_text);
+    }
     return filter ? g_strdup(filter) : g_strdup_printf("%s,%s,%s,%s", DEFAULT_FILTER, "0", "0", "0");
 }
 
@@ -1829,7 +1848,13 @@ gnc_plugin_page_register_get_sort_order (GncPluginPage *plugin_page)
     GNCLedgerDisplayType ledger_type;
     GNCLedgerDisplay *ld;
     Account *leader;
-    const char* sort_order;
+    const char* sort_order = NULL;
+
+    GKeyFile *state_file = gnc_state_get_current();
+    gchar *state_section;
+    gchar *sort_text;
+    gchar acct_guid[GUID_ENCODING_LENGTH + 1];
+    GError *error = NULL;
 
     g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page), _("unknown"));
 
@@ -1837,11 +1862,23 @@ gnc_plugin_page_register_get_sort_order (GncPluginPage *plugin_page)
     ld = priv->ledger;
     ledger_type = gnc_ledger_display_type (ld);
     leader = gnc_ledger_display_leader (ld);
-    sort_order = NULL;
 
-    if ((ledger_type == LD_SINGLE) || (ledger_type == LD_SUBACCOUNT))
-        sort_order = xaccAccountGetSortOrder (leader);
+    // get the sort_order from the .gcm file
+    guid_to_string_buff (xaccAccountGetGUID (leader), acct_guid);
+    state_section = g_strconcat (STATE_SECTION_REG_PREFIX, " ", acct_guid, NULL);
+    sort_text = g_key_file_get_string (state_file, state_section, KEY_PAGE_SORT, &error);
 
+    if (error)
+    {
+        if ((ledger_type == LD_SINGLE) || (ledger_type == LD_SUBACCOUNT))
+            sort_order = xaccAccountGetSortOrder (leader);
+        g_clear_error (&error);
+    }
+    else
+    {
+        sort_order = g_strdup (sort_text);
+        g_free (sort_text);
+    }
     return g_strdup(sort_order ? sort_order : DEFAULT_SORT_ORDER);
 }
 
@@ -1891,6 +1928,11 @@ gnc_plugin_page_register_get_sort_reversed (GncPluginPage *plugin_page)
     Account *leader;
     gboolean sort_reversed = FALSE;
 
+    GKeyFile *state_file = gnc_state_get_current();
+    gchar *state_section;
+    gchar acct_guid[GUID_ENCODING_LENGTH + 1];
+    GError *error = NULL;
+
     g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page), FALSE);
 
     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
@@ -1898,9 +1940,17 @@ gnc_plugin_page_register_get_sort_reversed (GncPluginPage *plugin_page)
     ledger_type = gnc_ledger_display_type (ld);
     leader = gnc_ledger_display_leader (ld);
 
-    if ((ledger_type == LD_SINGLE) || (ledger_type == LD_SUBACCOUNT))
-        sort_reversed = xaccAccountGetSortReversed (leader);
+    // get the sort_reversed from the .gcm file
+    guid_to_string_buff (xaccAccountGetGUID (leader), acct_guid);
+    state_section = g_strconcat (STATE_SECTION_REG_PREFIX, " ", acct_guid, NULL);
+    sort_reversed = g_key_file_get_boolean (state_file, state_section, KEY_PAGE_SORT_REV, &error);
 
+    if (error)
+    {
+        if ((ledger_type == LD_SINGLE) || (ledger_type == LD_SUBACCOUNT))
+            sort_reversed = xaccAccountGetSortReversed (leader);
+        g_clear_error (&error);
+    }
     return sort_reversed;
 }
 

commit 13c5b53931a55b634d001f24675fecbe88a5d4fc
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Tue Jun 19 15:35:25 2018 +0100

    Save the sort and filter settings to the .gcm file
    
    Save the sort and filter settings to the .gcm file as well as the
    account kvp. If default entries are saved then the corresponding entry
    in the .gcm file will be removed. This is part of a transition to saving
     these settings only in the .gcm file.

diff --git a/gnucash/gnome/gnc-plugin-page-register.c b/gnucash/gnome/gnc-plugin-page-register.c
index 536d762..0c83d58 100644
--- a/gnucash/gnome/gnc-plugin-page-register.c
+++ b/gnucash/gnome/gnc-plugin-page-register.c
@@ -67,6 +67,7 @@
 #include "gnc-gui-query.h"
 #include "gnc-icons.h"
 #include "gnc-split-reg.h"
+#include "gnc-state.h"
 #include "gnc-prefs.h"
 #include "gnc-ui-util.h"
 #include "gnc-window.h"
@@ -1365,6 +1366,10 @@ static const gchar *style_names[] =
 #define KEY_REGISTER_STYLE      "RegisterStyle"
 #define KEY_DOUBLE_LINE         "DoubleLineMode"
 
+#define KEY_PAGE_SORT           "register_order"
+#define KEY_PAGE_SORT_REV       "register_reversed"
+#define KEY_PAGE_FILTER         "register_filter"
+
 #define LABEL_ACCOUNT       "Account"
 #define LABEL_SUBACCOUNT    "SubAccount"
 #define LABEL_GL            "GL"
@@ -1779,7 +1784,12 @@ gnc_plugin_page_register_set_filter (GncPluginPage *plugin_page, const gchar *fi
     GncPluginPageRegisterPrivate *priv;
     GNCLedgerDisplay *ld;
     Account *leader;
-    gchar *default_filter;
+    gchar *default_filter = g_strdup_printf("%s,%s,%s,%s", DEFAULT_FILTER, "0", "0", "0");
+
+    GKeyFile *state_file = gnc_state_get_current();
+    gchar *state_section;
+    gchar *filter_text;
+    gchar acct_guid[GUID_ENCODING_LENGTH + 1];
 
     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
     ld = priv->ledger;
@@ -1787,16 +1797,28 @@ gnc_plugin_page_register_set_filter (GncPluginPage *plugin_page, const gchar *fi
 
     if (leader != NULL)
     {
-        default_filter = g_strdup_printf("%s,%s,%s,%s", DEFAULT_FILTER, "0", "0", "0");
-
         if (!filter || (g_strcmp0 (filter, default_filter) == 0))
             xaccAccountSetFilter (leader, NULL);
         else
             xaccAccountSetFilter (leader, filter);
-
-        g_free (default_filter);
     }
 
+    // save the filter to the .gcm file also
+    guid_to_string_buff (xaccAccountGetGUID (leader), acct_guid);
+    state_section = g_strconcat (STATE_SECTION_REG_PREFIX, " ", acct_guid, NULL);
+    if (!filter || (g_strcmp0 (filter, default_filter) == 0))
+    {
+        if (g_key_file_has_key (state_file, state_section, KEY_PAGE_FILTER, NULL))
+            g_key_file_remove_key (state_file, state_section, KEY_PAGE_FILTER, NULL);
+    }
+    else
+    {
+        filter_text = g_strdup (filter);
+        filter_text = g_strdelimit (filter_text, ",", ';'); // make it conform to .gcm file list
+        g_key_file_set_string (state_file, state_section, KEY_PAGE_FILTER, filter_text);
+        g_free (filter_text);
+    }
+    g_free (default_filter);
     return;
 }
 
@@ -1830,6 +1852,10 @@ gnc_plugin_page_register_set_sort_order (GncPluginPage *plugin_page, const gchar
     GNCLedgerDisplay *ld;
     Account *leader;
 
+    GKeyFile *state_file = gnc_state_get_current();
+    gchar *state_section;
+    gchar acct_guid[GUID_ENCODING_LENGTH + 1];
+
     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
     ld = priv->ledger;
     leader = gnc_ledger_display_leader (ld);
@@ -1842,6 +1868,17 @@ gnc_plugin_page_register_set_sort_order (GncPluginPage *plugin_page, const gchar
             xaccAccountSetSortOrder (leader, sort_order);
     }
 
+    // save sort_order to the .gcm file also
+    guid_to_string_buff (xaccAccountGetGUID (leader), acct_guid);
+    state_section = g_strconcat (STATE_SECTION_REG_PREFIX, " ", acct_guid, NULL);
+    if (!sort_order || (g_strcmp0 (sort_order, DEFAULT_SORT_ORDER) == 0))
+    {
+        if (g_key_file_has_key (state_file, state_section, KEY_PAGE_SORT, NULL))
+            g_key_file_remove_key (state_file, state_section, KEY_PAGE_SORT, NULL);
+    }
+    else
+        g_key_file_set_string (state_file, state_section, KEY_PAGE_SORT, sort_order);
+
     return;
 }
 
@@ -1874,6 +1911,10 @@ gnc_plugin_page_register_set_sort_reversed (GncPluginPage *plugin_page, gboolean
     GNCLedgerDisplay *ld;
     Account *leader;
 
+    GKeyFile *state_file = gnc_state_get_current();
+    gchar *state_section;
+    gchar acct_guid[GUID_ENCODING_LENGTH + 1];
+
     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
     ld = priv->ledger;
     leader = gnc_ledger_display_leader (ld);
@@ -1881,6 +1922,17 @@ gnc_plugin_page_register_set_sort_reversed (GncPluginPage *plugin_page, gboolean
     if (leader != NULL)
         xaccAccountSetSortReversed (leader, reverse_order);
 
+    // save reverse_order to the .gcm file also
+    guid_to_string_buff (xaccAccountGetGUID (leader), acct_guid);
+    state_section = g_strconcat (STATE_SECTION_REG_PREFIX, " ", acct_guid, NULL);
+    if (!reverse_order)
+    {
+        if (g_key_file_has_key (state_file, state_section, KEY_PAGE_SORT_REV, NULL))
+            g_key_file_remove_key (state_file, state_section, KEY_PAGE_SORT_REV, NULL);
+    }
+    else
+        g_key_file_set_boolean (state_file, state_section, KEY_PAGE_SORT_REV, reverse_order);
+
     return;
 }
 
diff --git a/gnucash/gnome/gnc-split-reg.c b/gnucash/gnome/gnc-split-reg.c
index da5ba2c..f5ddfb5 100644
--- a/gnucash/gnome/gnc-split-reg.c
+++ b/gnucash/gnome/gnc-split-reg.c
@@ -60,8 +60,6 @@
 // static QofLogModule log_module = GNC_MOD_SX;
 static QofLogModule log_module = GNC_MOD_GUI;
 
-#define STATE_SECTION_REG_PREFIX "Register"
-
 /***** PROTOTYPES ***************************************************/
 void gnc_split_reg_raise( GNCSplitReg *gsr );
 
diff --git a/gnucash/gnome/gnc-split-reg.h b/gnucash/gnome/gnc-split-reg.h
index 6dd048e..16ecae1 100644
--- a/gnucash/gnome/gnc-split-reg.h
+++ b/gnucash/gnome/gnc-split-reg.h
@@ -36,6 +36,8 @@
 #define GNC_SPLIT_REG_CLASS(klass) G_TYPE_CHECK_CLASS_CAST( klass, gnc_split_reg_get_type(), GNCSplitRegClass )
 #define IS_GNC_SPLIT_REG(obj)      G_TYPE_CHECK_INSTANCE_TYPE( obj, gnc_split_reg_get_type() )
 
+#define STATE_SECTION_REG_PREFIX "Register"
+
 typedef struct _GNCSplitReg GNCSplitReg;
 typedef struct _GNCSplitRegClass GNCSplitRegClass;
 

commit 72a29a83af4915920a7a2f486346696b2e7fb4e8
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Tue Jun 19 15:24:07 2018 +0100

    Fix the save option on sort/filter dialog
    
    When unticking the save option on the sort and filter dialog the actual
    save items are not cleared so check for this and clear the saved items.

diff --git a/gnucash/gnome/gnc-plugin-page-register.c b/gnucash/gnome/gnc-plugin-page-register.c
index 676bccb..536d762 100644
--- a/gnucash/gnome/gnc-plugin-page-register.c
+++ b/gnucash/gnome/gnc-plugin-page-register.c
@@ -2041,6 +2041,12 @@ gnc_plugin_page_register_sort_response_cb (GtkDialog *dialog,
     }
     else
     {
+        // clear the sort when unticking the save option
+        if ((priv->sd.save_order == FALSE) && (priv->sd.original_save_order == TRUE))
+        {
+            gnc_plugin_page_register_set_sort_order (plugin_page, DEFAULT_SORT_ORDER);
+            gnc_plugin_page_register_set_sort_reversed (plugin_page, FALSE);
+        }
         priv->sd.original_save_order = priv->sd.save_order;
 
         if (priv->sd.save_order)
@@ -2711,6 +2717,10 @@ gnc_plugin_page_register_filter_response_cb (GtkDialog *dialog,
     }
     else
     {
+        // clear the filter when unticking the save option
+        if ((priv->fd.save_filter == FALSE) && (priv->fd.original_save_filter == TRUE))
+            gnc_plugin_page_register_set_filter (plugin_page, NULL);
+
         priv->fd.original_save_filter = priv->fd.save_filter;
 
         if (priv->fd.save_filter)

commit 8a0ee0e38f1e569e8ae8d5e1f3b409356e6aca23
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Tue Jun 19 10:33:01 2018 +0100

    Hide the filter/sort save button when appropiate

diff --git a/gnucash/gnome/gnc-plugin-page-register.c b/gnucash/gnome/gnc-plugin-page-register.c
index 40969ff..676bccb 100644
--- a/gnucash/gnome/gnc-plugin-page-register.c
+++ b/gnucash/gnome/gnc-plugin-page-register.c
@@ -3446,6 +3446,33 @@ gnc_plugin_page_register_cmd_reverse_transaction (GtkAction *action,
     LEAVE(" ");
 }
 
+static gboolean
+gnc_plugin_page_register_show_fs_save (GncPluginPageRegister *page)
+{
+    GncPluginPageRegisterPrivate *priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
+    GNCLedgerDisplayType ledger_type = gnc_ledger_display_type (priv->ledger);
+    SplitRegister *reg = gnc_ledger_display_get_split_register (priv->ledger);
+
+    if (ledger_type == LD_SINGLE || ledger_type == LD_SUBACCOUNT)
+        return TRUE;
+    else
+    {
+        switch (reg->type)
+        {
+        case GENERAL_JOURNAL:
+            return TRUE;
+            break;
+
+        case INCOME_LEDGER:
+        case PORTFOLIO_LEDGER:
+        case SEARCH_LEDGER:
+        default:
+            return FALSE;
+            break;
+        }
+    }
+}
+
 static void
 gnc_plugin_page_register_cmd_view_sort_by (GtkAction *action,
         GncPluginPageRegister *page)
@@ -3495,6 +3522,10 @@ gnc_plugin_page_register_cmd_view_sort_by (GtkAction *action,
     if (priv->sd.save_order == TRUE)
         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
 
+    // hide the save button if appropiate
+    gtk_widget_set_visible (GTK_WIDGET(button),
+        gnc_plugin_page_register_show_fs_save (page));
+
     /* Set the button for the current reverse_order order */
     button = GTK_WIDGET(gtk_builder_get_object (builder, "sort_reverse"));
     if(priv->sd.reverse_order == TRUE)
@@ -3576,6 +3607,10 @@ gnc_plugin_page_register_cmd_view_filter_by (GtkAction *action,
     if (priv->fd.save_filter == TRUE)
         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
 
+    // hide the save button if appropiate
+    gtk_widget_set_visible (GTK_WIDGET(button),
+        gnc_plugin_page_register_show_fs_save (page));
+
     /* Set up number of days */
     priv->fd.num_days = GTK_WIDGET(gtk_builder_get_object (builder, "filter_show_num_days"));
     button = GTK_WIDGET(gtk_builder_get_object (builder, "filter_show_days"));
@@ -3694,7 +3729,7 @@ gnc_plugin_page_register_cmd_view_filter_by (GtkAction *action,
     gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, page);
 
     /* Show it */
-    gtk_widget_show_all(dialog);
+    gtk_widget_show(dialog);
     g_object_unref(G_OBJECT(builder));
     LEAVE(" ");
 }

commit e281b50b2963dfe2243bff1a1383ec9f14310bc4
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Tue Jun 19 08:13:58 2018 +0100

    Add new filter option to register
    
    Add new option to the register filter so that it will display the last
    number of days based on current day. This is stored as an extra element
    on the end of account filter setting.

diff --git a/gnucash/gnome/gnc-plugin-page-register.c b/gnucash/gnome/gnc-plugin-page-register.c
index 85d3ebd..40969ff 100644
--- a/gnucash/gnome/gnc-plugin-page-register.c
+++ b/gnucash/gnome/gnc-plugin-page-register.c
@@ -128,6 +128,7 @@ void gnc_plugin_page_register_filter_response_cb(GtkDialog *dialog, gint respons
 void gnc_plugin_page_register_filter_status_all_cb(GtkButton *button, GncPluginPageRegister *plugin_page);
 void gnc_plugin_page_register_filter_status_one_cb(GtkToggleButton *button, GncPluginPageRegister *page);
 void gnc_plugin_page_register_filter_save_cb(GtkToggleButton *button, GncPluginPageRegister *page);
+void gnc_plugin_page_register_filter_days_changed_cb (GtkSpinButton *button, GncPluginPageRegister *page);
 
 static time64 gnc_plugin_page_register_filter_dmy2time (char *date_string);
 static gchar *gnc_plugin_page_register_filter_time2dmy (time64 raw_time);
@@ -567,12 +568,15 @@ typedef struct GncPluginPageRegisterPrivate
         GtkWidget *end_date_choose;
         GtkWidget *end_date_today;
         GtkWidget *end_date;
+        GtkWidget *num_days;
         cleared_match_t original_cleared_match;
         cleared_match_t cleared_match;
         time64 original_start_time;
         time64 original_end_time;
         time64 start_time;
         time64 end_time;
+        gint days;
+        gint original_days;
         gboolean original_save_filter;
         gboolean save_filter;
     } fd;
@@ -798,6 +802,7 @@ gnc_plugin_page_register_init (GncPluginPageRegister *plugin_page)
     priv->lines_default     = DEFAULT_LINES_AMOUNT;
     priv->read_only         = FALSE;
     priv->fd.cleared_match  = CLEARED_ALL;
+    priv->fd.days           = 0;
 }
 
 static void
@@ -1198,28 +1203,40 @@ gnc_plugin_page_register_create_widget (GncPluginPage *plugin_page)
             filter_changed = filter_changed + 1;
         }
 
+        if (filter[3] && (g_strcmp0 (filter[3], "0") != 0 ))
+        {
+            PINFO("Loaded Filter Days is %s", filter[3]);
+
+            priv->fd.days = (gint)g_ascii_strtoll(filter[3], NULL, 10);
+            filter_changed = filter_changed + 1;
+        }
+
         if (filter_changed != 0)
             priv->fd.save_filter = TRUE;
 
         priv->fd.original_save_filter = priv->fd.save_filter;
         g_strfreev(filter);
-
-        /* Update Query with Filter Status and Dates */
-        gnc_ppr_update_status_query (page);
-        gnc_ppr_update_date_query(page);
     }
     else // LD_GL
     {
-        time64 start_time, end_time;
-        Query *query = gnc_ledger_display_get_query (priv->ledger);
+        time64 start_time = 0, end_time = 0;
+
+        if ((priv->fd.days == 0) && (reg->type == GENERAL_JOURNAL))
+        {
+            priv->fd.days = 30; // default number of days for gl
+            priv->fd.original_days = priv->fd.days;
+        }
 
-        xaccQueryGetDateMatchTT(query, &start_time, &end_time);
         priv->fd.original_start_time = start_time;
         priv->fd.start_time = start_time;
         priv->fd.original_end_time = end_time;
         priv->fd.end_time = end_time;
     }
 
+    /* Update Query with Filter Status and Dates */
+    gnc_ppr_update_status_query (page);
+    gnc_ppr_update_date_query(page);
+
     // Set filter tooltip for summary bar
     gnc_plugin_page_register_set_filter_tooltip (page);
 
@@ -1753,7 +1770,7 @@ gnc_plugin_page_register_get_filter (GncPluginPage *plugin_page)
     if ((ledger_type == LD_SINGLE) || (ledger_type == LD_SUBACCOUNT))
         filter = xaccAccountGetFilter (leader);
 
-    return filter ? g_strdup(filter) : g_strdup_printf("%s,%s,%s", DEFAULT_FILTER, "0", "0");
+    return filter ? g_strdup(filter) : g_strdup_printf("%s,%s,%s,%s", DEFAULT_FILTER, "0", "0", "0");
 }
 
 void
@@ -1770,7 +1787,7 @@ gnc_plugin_page_register_set_filter (GncPluginPage *plugin_page, const gchar *fi
 
     if (leader != NULL)
     {
-        default_filter = g_strdup_printf("%s,%s,%s", DEFAULT_FILTER, "0", "0");
+        default_filter = g_strdup_printf("%s,%s,%s,%s", DEFAULT_FILTER, "0", "0", "0");
 
         if (!filter || (g_strcmp0 (filter, default_filter) == 0))
             xaccAccountSetFilter (leader, NULL);
@@ -2233,6 +2250,18 @@ gnc_ppr_update_date_query (GncPluginPageRegister *page)
                                 QOF_QUERY_AND);
     }
 
+    if (priv->fd.days > 0)
+    {
+        time64 start;
+        struct tm tm;
+
+        gnc_tm_get_today_start(&tm);
+
+        tm.tm_mday = tm.tm_mday - priv->fd.days;
+        start = gnc_mktime (&tm);
+        xaccQueryAddDateMatchTT (query, TRUE, start, FALSE, 0, QOF_QUERY_AND);
+    }
+
     // Set filter tooltip for summary bar
     gnc_plugin_page_register_set_filter_tooltip (page);
 
@@ -2417,15 +2446,11 @@ get_filter_times(GncPluginPageRegister *page)
 }
 
 
-/** This function is called when the "select range" radio button
- *  changes state.  Since there are only two choices in this radio
- *  group, this one signal can be used to handle all cases.  This
- *  function is responsible for setting the sensitivity of the table
- *  of widgets underneath the "select range" choice, and updating the
- *  time limitation on the register query.  This is handled by a
- *  helper function when the radio button is selected (as potentially
- *  all the widgets in the table need to be inspected), and is trivial
- *  for the other case.
+/** This function is called when the radio buttons changes state. This
+ *  function is responsible for setting the sensitivity of the widgets
+ *  controlled by each radio button choice and updating the time
+ *  limitation on the register query. This is handled by a helper
+ *  function as potentialy all widgets will need to be examined.
  *
  *  @param button A pointer to the "select range" radio button.
  *
@@ -2438,20 +2463,33 @@ gnc_plugin_page_register_filter_select_range_cb (GtkRadioButton *button,
 {
     GncPluginPageRegisterPrivate *priv;
     gboolean active;
+    const gchar *name;
 
     g_return_if_fail(GTK_IS_RADIO_BUTTON(button));
     g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(page));
 
     ENTER("(button %p, page %p)", button, page);
     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
+    name = gtk_buildable_get_name(GTK_BUILDABLE(button));
     active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button));
-    gtk_widget_set_sensitive(priv->fd.table, active);
-    if (active)
+
+    if (active && g_strcmp0(name, "filter_show_range") == 0)
     {
+        gtk_widget_set_sensitive(priv->fd.table, active);
+        gtk_widget_set_sensitive(priv->fd.num_days, !active);
         get_filter_times(page);
     }
+    else if (active && g_strcmp0(name, "filter_show_days") == 0)
+    {
+        gtk_widget_set_sensitive(priv->fd.table, !active);
+        gtk_widget_set_sensitive(priv->fd.num_days, active);
+        gtk_spin_button_set_value(GTK_SPIN_BUTTON(priv->fd.num_days), priv->fd.days);
+    }
     else
     {
+        gtk_widget_set_sensitive(priv->fd.table, FALSE);
+        gtk_widget_set_sensitive(priv->fd.num_days, FALSE);
+        priv->fd.days = 0;
         priv->fd.start_time = 0;
         priv->fd.end_time = 0;
     }
@@ -2460,6 +2498,34 @@ gnc_plugin_page_register_filter_select_range_cb (GtkRadioButton *button,
 }
 
 
+/** This function is called when the "number of days" spin button is
+ *  changed which is then saved and updates the time limitation on
+ *  the register query. This is handled by a helper function as
+ *  potentialy all widgets will need to be examined.
+ *
+ *  @param button A pointer to the "number of days" spin button.
+ *
+ *  @param page A pointer to the GncPluginPageRegister that is
+ *  associated with this filter dialog.
+ */
+void
+gnc_plugin_page_register_filter_days_changed_cb (GtkSpinButton *button,
+        GncPluginPageRegister *page)
+{
+    GncPluginPageRegisterPrivate *priv;
+
+    g_return_if_fail(GTK_IS_SPIN_BUTTON(button));
+    g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(page));
+
+    ENTER("(button %p, page %p)", button, page);
+    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
+
+    priv->fd.days = gtk_spin_button_get_value(GTK_SPIN_BUTTON(button));
+    gnc_ppr_update_date_query(page);
+    LEAVE(" ");
+}
+
+
 /** This function is called when one of the start date entry widgets
  *  is updated.  It simply calls common routines to determine the
  *  start/end times and update the register query.
@@ -2639,6 +2705,7 @@ gnc_plugin_page_register_filter_response_cb (GtkDialog *dialog,
         gnc_ppr_update_status_query(page);
         priv->fd.start_time = priv->fd.original_start_time;
         priv->fd.end_time = priv->fd.original_end_time;
+        priv->fd.days = priv->fd.original_days;
         priv->fd.save_filter = priv->fd.original_save_filter;
         gnc_ppr_update_date_query(page);
     }
@@ -2676,6 +2743,16 @@ gnc_plugin_page_register_filter_response_cb (GtkDialog *dialog,
                 filter = g_strconcat (tmp, ",0", NULL);
 
             g_free (tmp);
+            tmp = g_strdup (filter);
+            g_free (filter);
+
+            // number of days
+            if (priv->fd.days > 0)
+                filter = g_strdup_printf ("%s,%d", tmp, priv->fd.days);
+            else
+                filter = g_strconcat (tmp, ",0", NULL);
+
+            g_free (tmp);
 
             PINFO("The filter to save is %s", filter);
             gnc_plugin_page_register_set_filter (plugin_page, filter);
@@ -2730,6 +2807,11 @@ gnc_plugin_page_register_set_filter_tooltip (GncPluginPageRegister *page)
         text_start = g_strdup_printf ("%s %s", _("Start Date:"), sdate);
         g_free (sdate);
     }
+
+    // filtered number of days
+    if (priv->fd.days > 0)
+        text_start = g_strdup_printf ("%s %d", _("Show previous number of days:"), priv->fd.days);
+
     // filtered end time
     if (priv->fd.end_time != 0)
     {
@@ -2737,6 +2819,7 @@ gnc_plugin_page_register_set_filter_tooltip (GncPluginPageRegister *page)
         text_end = g_strdup_printf ("%s %s", _("End Date:"), edate);
         g_free (edate);
     }
+
     // filtered match items
     if (priv->fd.cleared_match != 31)
     {
@@ -3466,6 +3549,7 @@ gnc_plugin_page_register_cmd_view_filter_by (GtkAction *action,
 
     /* Create the dialog */
     builder = gtk_builder_new();
+    gnc_builder_add_from_file (builder, "gnc-plugin-page-register.glade", "days_adjustment");
     gnc_builder_add_from_file (builder, "gnc-plugin-page-register.glade", "filter_by_dialog");
     dialog = GTK_WIDGET(gtk_builder_get_object (builder, "filter_by_dialog"));
     priv->fd.dialog = dialog;
@@ -3492,16 +3576,40 @@ gnc_plugin_page_register_cmd_view_filter_by (GtkAction *action,
     if (priv->fd.save_filter == TRUE)
         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
 
+    /* Set up number of days */
+    priv->fd.num_days = GTK_WIDGET(gtk_builder_get_object (builder, "filter_show_num_days"));
+    button = GTK_WIDGET(gtk_builder_get_object (builder, "filter_show_days"));
 
-    /* Set the date info */
-    button = GTK_WIDGET(gtk_builder_get_object (builder, "filter_show_range"));
     query = gnc_ledger_display_get_query (priv->ledger);
-    xaccQueryGetDateMatchTT(query, &start_time, &end_time);
+
+    if (priv->fd.days > 0) // using number of days
+    {
+        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
+        gtk_widget_set_sensitive(GTK_WIDGET(priv->fd.num_days), TRUE);
+        gtk_spin_button_set_value(GTK_SPIN_BUTTON(priv->fd.num_days), priv->fd.days);
+        priv->fd.original_days = priv->fd.days;
+
+        /* Set the start_time and end_time to 0 */
+        start_time = 0;
+        end_time = 0;
+    }
+    else
+    {
+        gtk_widget_set_sensitive(GTK_WIDGET(priv->fd.num_days), FALSE);
+        priv->fd.original_days = 0;
+        priv->fd.days = 0;
+
+        /* Get the start and end times */
+        xaccQueryGetDateMatchTT(query, &start_time, &end_time);
+    }
+
+    /* Set the date info */
     priv->fd.original_start_time = start_time;
     priv->fd.start_time = start_time;
     priv->fd.original_end_time = end_time;
     priv->fd.end_time = end_time;
 
+    button = GTK_WIDGET(gtk_builder_get_object (builder, "filter_show_range"));
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), start_time || end_time);
     table = GTK_WIDGET(gtk_builder_get_object (builder, "select_range_table"));
     priv->fd.table = table;
diff --git a/gnucash/gtkbuilder/gnc-plugin-page-register.glade b/gnucash/gtkbuilder/gnc-plugin-page-register.glade
index 20bf4e0..ba509bd 100644
--- a/gnucash/gtkbuilder/gnc-plugin-page-register.glade
+++ b/gnucash/gtkbuilder/gnc-plugin-page-register.glade
@@ -1,7 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.20.0 -->
+<!-- Generated with glade 3.20.4 -->
 <interface>
   <requires lib="gtk+" version="3.10"/>
+  <object class="GtkAdjustment" id="days_adjustment">
+    <property name="upper">1100</property>
+    <property name="step_increment">1</property>
+    <property name="page_increment">10</property>
+  </object>
   <object class="GtkDialog" id="filter_by_dialog">
     <property name="can_focus">False</property>
     <property name="border_width">6</property>
@@ -87,19 +92,53 @@
                   </packing>
                 </child>
                 <child>
-                  <object class="GtkLabel" id="label847680">
+                  <object class="GtkBox">
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
+                    <child>
+                      <object class="GtkRadioButton" id="filter_show_days">
+                        <property name="label" translatable="yes">Show _number of days</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="use_underline">True</property>
+                        <property name="active">True</property>
+                        <property name="draw_indicator">True</property>
+                        <property name="group">filter_show_all</property>
+                        <signal name="toggled" handler="gnc_plugin_page_register_filter_select_range_cb" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">True</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkSpinButton" id="filter_show_num_days">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="tooltip_text" translatable="yes">Valid range is 0 to 1100 days
+If 0, all previous days included</property>
+                        <property name="adjustment">days_adjustment</property>
+                        <property name="numeric">True</property>
+                        <signal name="value-changed" handler="gnc_plugin_page_register_filter_days_changed_cb" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">True</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
                   </object>
                   <packing>
                     <property name="expand">False</property>
-                    <property name="fill">False</property>
+                    <property name="fill">True</property>
                     <property name="position">1</property>
                   </packing>
                 </child>
                 <child>
                   <object class="GtkRadioButton" id="filter_show_range">
-                    <property name="label" translatable="yes">Select Range:</property>
+                    <property name="label" translatable="yes">Select _Range:</property>
                     <property name="visible">True</property>
                     <property name="can_focus">True</property>
                     <property name="receives_default">False</property>
@@ -123,6 +162,7 @@
                     <child>
                       <object class="GtkLabel" id="label847682">
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                         <property name="label" translatable="yes" comments="Filter By Dialog, Date Tab, Start section">Start:</property>
                       </object>
                       <packing>
@@ -209,6 +249,7 @@
                     <child>
                       <object class="GtkLabel" id="label847684">
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                         <property name="label" translatable="yes" comments="Filter By Dialog, Date Tab, End section">End:</property>
                       </object>
                       <packing>
@@ -510,6 +551,9 @@
       <action-widget response="-6">cancelbutton4</action-widget>
       <action-widget response="-5">okbutton4</action-widget>
     </action-widgets>
+    <child>
+      <placeholder/>
+    </child>
   </object>
   <object class="GtkAdjustment" id="num_adjustment">
     <property name="upper">1000000000</property>
@@ -864,6 +908,9 @@
       <action-widget response="-6">cancelbutton2</action-widget>
       <action-widget response="-5">okbutton2</action-widget>
     </action-widgets>
+    <child>
+      <placeholder/>
+    </child>
   </object>
   <object class="GtkAdjustment" id="tnum_adjustment">
     <property name="upper">1000000000</property>
@@ -1053,6 +1100,9 @@
       <action-widget response="-6">button76</action-widget>
       <action-widget response="-5">button77</action-widget>
     </action-widgets>
+    <child>
+      <placeholder/>
+    </child>
   </object>
   <object class="GtkDialog" id="void_transaction_dialog">
     <property name="can_focus">False</property>
@@ -1158,5 +1208,8 @@
       <action-widget response="-6">cancelbutton1</action-widget>
       <action-widget response="-5">okbutton1</action-widget>
     </action-widgets>
+    <child>
+      <placeholder/>
+    </child>
   </object>
 </interface>

commit 97a566ae280f664b4172375a331cd7859f78395c
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Tue Jun 19 06:13:35 2018 +0100

    Creating filter was leaking while being put together

diff --git a/gnucash/gnome/gnc-plugin-page-register.c b/gnucash/gnome/gnc-plugin-page-register.c
index b779651..85d3ebd 100644
--- a/gnucash/gnome/gnc-plugin-page-register.c
+++ b/gnucash/gnome/gnc-plugin-page-register.c
@@ -2648,29 +2648,36 @@ gnc_plugin_page_register_filter_response_cb (GtkDialog *dialog,
 
         if (priv->fd.save_filter)
         {
-            gchar* filter;
-            filter = g_strdup_printf("0x%04x", priv->fd.cleared_match);
+            gchar* filter = g_strdup_printf("0x%04x", priv->fd.cleared_match); // cleared match
+            gchar *tmp = g_strdup (filter);
 
+            // start time
             if ( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->fd.start_date_choose)) && priv->fd.start_time != 0 )
             {
                 gchar *timeval = gnc_plugin_page_register_filter_time2dmy(priv->fd.start_time);
-                filter = g_strconcat ( filter, ",", timeval, NULL);
+                filter = g_strconcat (tmp, ",", timeval, NULL);
                 g_free (timeval);
             }
             else
-                filter = g_strconcat ( filter, ",0", NULL);
+                filter = g_strconcat (tmp, ",0", NULL);
 
+            g_free (tmp);
+            tmp = g_strdup (filter);
+            g_free (filter);
+
+            // end time
             if ( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->fd.end_date_choose)) && priv->fd.end_time != 0 )
             {
                 gchar *timeval = gnc_plugin_page_register_filter_time2dmy(priv->fd.end_time);
-                filter = g_strconcat ( filter, ",", timeval, NULL);
+                filter = g_strconcat (tmp, ",", timeval, NULL);
                 g_free (timeval);
             }
             else
-                filter = g_strconcat ( filter, ",0", NULL);
+                filter = g_strconcat (tmp, ",0", NULL);
 
-            PINFO("The filter to save is %s", filter);
+            g_free (tmp);
 
+            PINFO("The filter to save is %s", filter);
             gnc_plugin_page_register_set_filter (plugin_page, filter);
             g_free (filter);
         }

commit 6eac7e1ed0b5cfc8e42fb1afd846e387f6aec680
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Tue Jun 19 05:26:11 2018 +0100

    There is no reason why you can not just have an end date
    
    Change the logic so the date checks are not nested.

diff --git a/gnucash/gnome/gnc-plugin-page-register.c b/gnucash/gnome/gnc-plugin-page-register.c
index fc1f903..b779651 100644
--- a/gnucash/gnome/gnc-plugin-page-register.c
+++ b/gnucash/gnome/gnc-plugin-page-register.c
@@ -1187,15 +1187,15 @@ gnc_plugin_page_register_create_widget (GncPluginPage *plugin_page)
             priv->fd.start_time = gnc_plugin_page_register_filter_dmy2time (filter[1] );
             priv->fd.start_time = gnc_time64_get_day_start(priv->fd.start_time);
             filter_changed = filter_changed + 1;
+        }
 
-            if (filter[2] && (g_strcmp0 (filter[2], "0") != 0 ))
-            {
-                PINFO("Loaded Filter End Date is %s", filter[2]);
+        if (filter[2] && (g_strcmp0 (filter[2], "0") != 0 ))
+        {
+            PINFO("Loaded Filter End Date is %s", filter[2]);
 
-                priv->fd.end_time = gnc_plugin_page_register_filter_dmy2time (filter[2] );
-                priv->fd.end_time = gnc_time64_get_day_end(priv->fd.end_time);
-                filter_changed = filter_changed + 1;
-            }
+            priv->fd.end_time = gnc_plugin_page_register_filter_dmy2time (filter[2] );
+            priv->fd.end_time = gnc_time64_get_day_end(priv->fd.end_time);
+            filter_changed = filter_changed + 1;
         }
 
         if (filter_changed != 0)

commit 632c7c724ea4f4137d265e4e034fbec85920aecc
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Mon Jun 18 18:07:46 2018 +0100

    Update the filter when General Journal created.

diff --git a/gnucash/gnome/gnc-plugin-page-register.c b/gnucash/gnome/gnc-plugin-page-register.c
index 04c5ab4..fc1f903 100644
--- a/gnucash/gnome/gnc-plugin-page-register.c
+++ b/gnucash/gnome/gnc-plugin-page-register.c
@@ -1208,6 +1208,17 @@ gnc_plugin_page_register_create_widget (GncPluginPage *plugin_page)
         gnc_ppr_update_status_query (page);
         gnc_ppr_update_date_query(page);
     }
+    else // LD_GL
+    {
+        time64 start_time, end_time;
+        Query *query = gnc_ledger_display_get_query (priv->ledger);
+
+        xaccQueryGetDateMatchTT(query, &start_time, &end_time);
+        priv->fd.original_start_time = start_time;
+        priv->fd.start_time = start_time;
+        priv->fd.original_end_time = end_time;
+        priv->fd.end_time = end_time;
+    }
 
     // Set filter tooltip for summary bar
     gnc_plugin_page_register_set_filter_tooltip (page);

commit d74ec9aa6cc794d34a6d7082a8948463d896034c
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Mon Jun 18 18:06:13 2018 +0100

    Only show update the summary bar left labels when present

diff --git a/gnucash/gnome/gnc-split-reg.c b/gnucash/gnome/gnc-split-reg.c
index ad8a6d4..da5ba2c 100644
--- a/gnucash/gnome/gnc-split-reg.c
+++ b/gnucash/gnome/gnc-split-reg.c
@@ -540,21 +540,24 @@ gsr_redraw_all_cb (GnucashRegister *g_reg, gpointer data)
     print_info = gnc_account_print_info( leader, TRUE );
     reverse = gnc_reverse_balance( leader );
 
-    gsr_update_summary_label( gsr->balance_label,
-                              xaccAccountGetPresentBalance,
-                              leader, print_info, commodity, reverse, euro );
-    gsr_update_summary_label( gsr->cleared_label,
-                              xaccAccountGetClearedBalance,
-                              leader, print_info, commodity, reverse, euro );
-    gsr_update_summary_label( gsr->reconciled_label,
-                              xaccAccountGetReconciledBalance,
-                              leader, print_info, commodity, reverse, euro );
-    gsr_update_summary_label( gsr->future_label,
-                              xaccAccountGetBalance,
-                              leader, print_info, commodity, reverse, euro );
-    gsr_update_summary_label( gsr->projectedminimum_label,
-                              xaccAccountGetProjectedMinimumBalance,
-                              leader, print_info, commodity, reverse, euro );
+    if (gsr->balance_label != NULL) // only test the first as they are a group
+    {
+        gsr_update_summary_label( gsr->balance_label,
+                                  xaccAccountGetPresentBalance,
+                                  leader, print_info, commodity, reverse, euro );
+        gsr_update_summary_label( gsr->cleared_label,
+                                  xaccAccountGetClearedBalance,
+                                  leader, print_info, commodity, reverse, euro );
+        gsr_update_summary_label( gsr->reconciled_label,
+                                  xaccAccountGetReconciledBalance,
+                                  leader, print_info, commodity, reverse, euro );
+        gsr_update_summary_label( gsr->future_label,
+                                  xaccAccountGetBalance,
+                                  leader, print_info, commodity, reverse, euro );
+        gsr_update_summary_label( gsr->projectedminimum_label,
+                                  xaccAccountGetProjectedMinimumBalance,
+                                  leader, print_info, commodity, reverse, euro );
+    }
 
     // Sort label
     if (gsr->sort_label != NULL)

commit 3f9a8977c176eb43131e34de9f83505fb20eb727
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Mon Jun 18 18:05:30 2018 +0100

    Add the summary bar to the GL and subaccount registers
    
    Add the summary bar to the General Journal and sub account register but
    only show sort and filter labels.

diff --git a/gnucash/gnome/gnc-split-reg.c b/gnucash/gnome/gnc-split-reg.c
index 6e20748..ad8a6d4 100644
--- a/gnucash/gnome/gnc-split-reg.c
+++ b/gnucash/gnome/gnc-split-reg.c
@@ -2139,7 +2139,9 @@ gsr_summarybar_set_arrow_draw (GNCSplitReg *gsr)
 GtkWidget *
 gsr_create_summary_bar( GNCSplitReg *gsr )
 {
-    GtkWidget *summarybar;
+    GtkWidget *summarybar = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4);
+    gtk_box_set_homogeneous (GTK_BOX (summarybar), FALSE);
+    gtk_widget_set_name (summarybar, "gnc-id-summarybar");
 
     gsr->cleared_label    = NULL;
     gsr->balance_label    = NULL;
@@ -2152,28 +2154,21 @@ gsr_create_summary_bar( GNCSplitReg *gsr )
     gsr->shares_label     = NULL;
     gsr->value_label      = NULL;
 
-    if ( gnc_ledger_display_type(gsr->ledger) >= LD_SUBACCOUNT )
-    {
-        gsr->summarybar = NULL;
-        return NULL;
-    }
-
-    summarybar = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4);
-    gtk_box_set_homogeneous (GTK_BOX (summarybar), FALSE);
-    gtk_widget_set_name (summarybar, "gnc-id-summarybar");
-
-    if (!xaccAccountIsPriced(gnc_ledger_display_leader(gsr->ledger)))
+    if (gnc_ledger_display_type(gsr->ledger) == LD_SINGLE)
     {
-        gsr->balance_label    = add_summary_label (summarybar, TRUE, _("Present:"), NULL);
-        gsr->future_label     = add_summary_label (summarybar, TRUE, _("Future:"), NULL);
-        gsr->cleared_label    = add_summary_label (summarybar, TRUE, _("Cleared:"), NULL);
-        gsr->reconciled_label = add_summary_label (summarybar, TRUE, _("Reconciled:"), NULL);
-        gsr->projectedminimum_label  = add_summary_label (summarybar, TRUE, _("Projected Minimum:"), NULL);
-    }
-    else
-    {
-        gsr->shares_label     = add_summary_label (summarybar, TRUE, _("Shares:"), NULL);
-        gsr->value_label      = add_summary_label (summarybar, TRUE, _("Current Value:"), NULL);
+        if (!xaccAccountIsPriced(gnc_ledger_display_leader(gsr->ledger)))
+        {
+            gsr->balance_label    = add_summary_label (summarybar, TRUE, _("Present:"), NULL);
+            gsr->future_label     = add_summary_label (summarybar, TRUE, _("Future:"), NULL);
+            gsr->cleared_label    = add_summary_label (summarybar, TRUE, _("Cleared:"), NULL);
+            gsr->reconciled_label = add_summary_label (summarybar, TRUE, _("Reconciled:"), NULL);
+            gsr->projectedminimum_label  = add_summary_label (summarybar, TRUE, _("Projected Minimum:"), NULL);
+        }
+        else
+        {
+            gsr->shares_label     = add_summary_label (summarybar, TRUE, _("Shares:"), NULL);
+            gsr->value_label      = add_summary_label (summarybar, TRUE, _("Current Value:"), NULL);
+        }
     }
 
     gsr->filter_label = add_summary_label (summarybar, FALSE, "", NULL);

commit b50c8a57fa539bd50e61739511e28f60e8a09dfc
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Mon Jun 18 17:37:32 2018 +0100

    Show whether there is a filter on the right of the summary bar
    
    On the right of the summary bar indicate whether there is a filter and
    if there is display a tooltip with the settings. Also the filter label
    can be altered by the css class "gnc-class-highlight".

diff --git a/gnucash/gnome/gnc-plugin-page-register.c b/gnucash/gnome/gnc-plugin-page-register.c
index d3e7283..04c5ab4 100644
--- a/gnucash/gnome/gnc-plugin-page-register.c
+++ b/gnucash/gnome/gnc-plugin-page-register.c
@@ -133,6 +133,7 @@ static time64 gnc_plugin_page_register_filter_dmy2time (char *date_string);
 static gchar *gnc_plugin_page_register_filter_time2dmy (time64 raw_time);
 static gchar *gnc_plugin_page_register_get_filter (GncPluginPage *plugin_page);
 void gnc_plugin_page_register_set_filter (GncPluginPage *plugin_page, const gchar *filter);
+static void gnc_plugin_page_register_set_filter_tooltip (GncPluginPageRegister *page);
 
 static void gnc_ppr_update_status_query (GncPluginPageRegister *page);
 static void gnc_ppr_update_date_query (GncPluginPageRegister *page);
@@ -1208,6 +1209,9 @@ gnc_plugin_page_register_create_widget (GncPluginPage *plugin_page)
         gnc_ppr_update_date_query(page);
     }
 
+    // Set filter tooltip for summary bar
+    gnc_plugin_page_register_set_filter_tooltip (page);
+
     plugin_page->summarybar = gsr_create_summary_bar(priv->gsr);
     if (plugin_page->summarybar)
     {
@@ -2159,6 +2163,9 @@ gnc_ppr_update_status_query (GncPluginPageRegister *page)
     if (priv->fd.cleared_match != CLEARED_ALL)
         xaccQueryAddClearedMatch(query, priv->fd.cleared_match, QOF_QUERY_AND);
 
+    // Set filter tooltip for summary bar
+    gnc_plugin_page_register_set_filter_tooltip (page);
+
     gnc_ledger_display_refresh (priv->ledger);
     LEAVE(" ");
 }
@@ -2215,6 +2222,9 @@ gnc_ppr_update_date_query (GncPluginPageRegister *page)
                                 QOF_QUERY_AND);
     }
 
+    // Set filter tooltip for summary bar
+    gnc_plugin_page_register_set_filter_tooltip (page);
+
     gnc_ledger_display_refresh (priv->ledger);
     LEAVE(" ");
 }
@@ -2659,6 +2669,148 @@ gnc_plugin_page_register_filter_response_cb (GtkDialog *dialog,
     LEAVE(" ");
 }
 
+static gchar*
+gpp_get_cleared_match_filter_text (gchar *text_in, gboolean *first, const gchar *text)
+{
+    gchar *result;
+    gchar *temp = g_strdup (text_in);
+    g_free (text_in);
+
+    if (*first)
+    {
+        result = g_strconcat (temp, text, NULL);
+        *first = FALSE;
+    }
+    else
+        result = g_strconcat (temp, ", ", text, NULL);
+    g_free (temp);
+
+    return result;
+}
+
+static void
+gnc_plugin_page_register_set_filter_tooltip (GncPluginPageRegister *page)
+{
+    GncPluginPageRegisterPrivate *priv;
+    GncPluginPage *plugin_page;
+    gchar *text = NULL;
+    gchar *text_header = g_strdup_printf ("%s", _("Filter By:"));
+    gchar *text_start = NULL;
+    gchar *text_end = NULL;
+    gchar *text_cleared = NULL;
+
+    g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(page));
+
+    ENTER(" ");
+    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
+    plugin_page = GNC_PLUGIN_PAGE(page);
+
+    // filtered start time
+    if (priv->fd.start_time != 0)
+    {
+        gchar *sdate = qof_print_date (priv->fd.start_time);
+        text_start = g_strdup_printf ("%s %s", _("Start Date:"), sdate);
+        g_free (sdate);
+    }
+    // filtered end time
+    if (priv->fd.end_time != 0)
+    {
+        gchar *edate = qof_print_date (priv->fd.end_time);
+        text_end = g_strdup_printf ("%s %s", _("End Date:"), edate);
+        g_free (edate);
+    }
+    // filtered match items
+    if (priv->fd.cleared_match != 31)
+    {
+        gchar *show = g_strdup ("");
+        gchar *hide = g_strdup ("");
+
+        gboolean first_show = TRUE, first_hide = TRUE;
+
+        if ((priv->fd.cleared_match & 0x01) == 0x01)
+            show = gpp_get_cleared_match_filter_text (show, &first_show, _("Unreconciled"));
+        else
+            hide = gpp_get_cleared_match_filter_text (hide, &first_hide, _("Unreconciled"));
+
+        if ((priv->fd.cleared_match & 0x02) == 0x02)
+            show = gpp_get_cleared_match_filter_text (show, &first_show, _("Cleared"));
+        else
+            hide = gpp_get_cleared_match_filter_text (hide, &first_hide, _("Cleared"));
+
+        if ((priv->fd.cleared_match & 0x04) == 0x04)
+            show = gpp_get_cleared_match_filter_text (show, &first_show, _("Reconciled"));
+        else
+            hide = gpp_get_cleared_match_filter_text (hide, &first_hide, _("Reconciled"));
+
+        if ((priv->fd.cleared_match & 0x08) == 0x08)
+            show = gpp_get_cleared_match_filter_text (show, &first_show, _("Frozen"));
+        else
+            hide = gpp_get_cleared_match_filter_text (hide, &first_hide, _("Frozen"));
+
+        if ((priv->fd.cleared_match & 0x10) == 0x10)
+            show = gpp_get_cleared_match_filter_text (show, &first_show, _("Voided"));
+        else
+            hide = gpp_get_cleared_match_filter_text (hide, &first_hide, _("Voided"));
+
+        if (g_strcmp0 (show, "") == 0)
+            text_cleared = g_strconcat (_("Hide:"), " ", hide, NULL);
+        else
+            text_cleared = g_strconcat (_("Show:"), " ", show, "\n", _("Hide:"), " ", hide, NULL);
+
+        g_free (show);
+        g_free (hide);
+
+    }
+    // create the tooltip based on created text variables
+    if ((text_start != NULL) || (text_end != NULL) || (text_cleared != NULL))
+    {
+        if (text_start != NULL)
+            text = g_strconcat (text_header, "\n", text_start, NULL);
+
+        if (text_end != NULL)
+        {
+            if (text == NULL)
+                text = g_strconcat (text_header, "\n", text_end, NULL);
+            else
+            {
+                gchar *temp = g_strdup (text);
+                g_free (text);
+                text = g_strconcat (temp, "\n", text_end, NULL);
+                g_free (temp);
+            }
+        }
+
+        if (text_cleared != NULL)
+        {
+            if (text == NULL)
+                text = g_strconcat (text_header, "\n", text_cleared, NULL);
+            else
+            {
+                gchar *temp = g_strdup (text);
+                g_free (text);
+                text = g_strconcat (temp, "\n", text_cleared, NULL);
+                g_free (temp);
+            }
+        }
+    }
+    // free the existing text if present
+    if (priv->gsr->filter_text != NULL)
+        g_free (priv->gsr->filter_text);
+
+    // set the tooltip text variable in the gsr
+    priv->gsr->filter_text = g_strdup (text);
+
+    if (text_start)
+        g_free (text_start);
+    if (text_end)
+        g_free (text_end);
+    if (text_cleared)
+        g_free (text_cleared);
+    g_free (text_header);
+    g_free (text);
+
+    LEAVE(" ");
+}
 
 /************************************************************/
 /*                  Report Helper Functions                 */
diff --git a/gnucash/gnome/gnc-split-reg.c b/gnucash/gnome/gnc-split-reg.c
index 4f87827..6e20748 100644
--- a/gnucash/gnome/gnc-split-reg.c
+++ b/gnucash/gnome/gnc-split-reg.c
@@ -351,6 +351,7 @@ gnc_split_reg_init( GNCSplitReg *gsr )
     gsr->sort_type = BY_STANDARD;
     gsr->sort_rev = FALSE;
     gsr->sort_arrow_handler_id = 0;
+    gsr->filter_text = NULL;
     gsr->width = -1;
     gsr->height = -1;
     gsr->numRows = 10;
@@ -447,6 +448,10 @@ gsr_setup_status_widgets( GNCSplitReg *gsr )
 void
 gnc_split_reg_destroy_cb(GtkWidget *widget, gpointer data)
 {
+    GNCSplitReg *gsr = data;
+
+    if (gsr->filter_text)
+        g_free (gsr->filter_text);
 }
 
 /**
@@ -615,6 +620,26 @@ gsr_redraw_all_cb (GnucashRegister *g_reg, gpointer data)
         gtk_label_set_text (GTK_LABEL(gsr->sort_label), text);
     }
 
+    // Filter label
+    if (gsr->filter_label != NULL)
+    {
+        gchar *old_tt_text = gtk_widget_get_tooltip_text (GTK_WIDGET(gsr->filter_label));
+
+        // check for a change in text
+        if (g_strcmp0 (old_tt_text, gsr->filter_text) != 0)
+        {
+            if (gsr->filter_text != NULL)
+                gtk_label_set_text (GTK_LABEL(gsr->filter_label), _("Filtered"));
+            else
+                gtk_label_set_text (GTK_LABEL(gsr->filter_label), "");
+
+            gtk_widget_set_tooltip_text (GTK_WIDGET(gsr->filter_label), gsr->filter_text);
+
+            if (old_tt_text)
+                g_free (old_tt_text);
+        }
+    }
+
     if (gsr->shares_label == NULL && gsr->value_label == NULL)
         return;
     amount = xaccAccountGetBalance( leader );
@@ -2092,7 +2117,7 @@ add_summary_label (GtkWidget *summarybar, gboolean pack_start, const char *label
     label = gtk_label_new( "" );
     gnc_label_set_alignment(label, 1.0, 0.5 );
     gtk_box_pack_start( GTK_BOX(hbox), label, FALSE, FALSE, 0 );
-    
+
     if (extra != NULL)
         gtk_box_pack_start( GTK_BOX(hbox), extra, FALSE, FALSE, 0 );
 
@@ -2123,6 +2148,7 @@ gsr_create_summary_bar( GNCSplitReg *gsr )
     gsr->projectedminimum_label  = NULL;
     gsr->sort_label       = NULL;
     gsr->sort_arrow       = NULL;
+    gsr->filter_label     = NULL;
     gsr->shares_label     = NULL;
     gsr->value_label      = NULL;
 
@@ -2150,8 +2176,11 @@ gsr_create_summary_bar( GNCSplitReg *gsr )
         gsr->value_label      = add_summary_label (summarybar, TRUE, _("Current Value:"), NULL);
     }
 
+    gsr->filter_label = add_summary_label (summarybar, FALSE, "", NULL);
     gsr->sort_arrow = gtk_image_new_from_icon_name ("image-missing", GTK_ICON_SIZE_SMALL_TOOLBAR);
     gsr->sort_label = add_summary_label (summarybar, FALSE, _("Sort By: "), gsr->sort_arrow);
+
+    gnc_widget_set_style_context (GTK_WIDGET(gsr->filter_label), "gnc-class-highlight");
     gnc_widget_set_style_context (GTK_WIDGET(gsr->sort_arrow), "gnc-class-highlight");
 
     gsr->summarybar = summarybar;
diff --git a/gnucash/gnome/gnc-split-reg.h b/gnucash/gnome/gnc-split-reg.h
index a8e2d26..6dd048e 100644
--- a/gnucash/gnome/gnc-split-reg.h
+++ b/gnucash/gnome/gnc-split-reg.h
@@ -76,6 +76,7 @@ struct _GNCSplitReg
     GtkWidget *value_label;
     GtkWidget *sort_label;
     GtkWidget *sort_arrow;
+    GtkWidget *filter_label;
 
     /** The current ledger display. **/
     GNCLedgerDisplay *ledger;
@@ -87,6 +88,7 @@ struct _GNCSplitReg
     guint    sort_type;
     gboolean sort_rev;
     gulong   sort_arrow_handler_id;
+    gchar   *filter_text;
 
     gboolean read_only;
 };

commit b4db066d84f3ec665928bf6e7c984e1d8dba1505
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Mon Jun 18 13:11:37 2018 +0100

    Add the sort order to the right of the summary bar
    
    Add the sort order to the right of the summary bar with a tooltip that
    shows whether ascending or descending and an arrow. When arrow can
    also be emphasized with css by using the class "gnc-class-highlight".

diff --git a/gnucash/gnome/gnc-split-reg.c b/gnucash/gnome/gnc-split-reg.c
index b7829e6..4f87827 100644
--- a/gnucash/gnome/gnc-split-reg.c
+++ b/gnucash/gnome/gnc-split-reg.c
@@ -66,7 +66,9 @@ static QofLogModule log_module = GNC_MOD_GUI;
 void gnc_split_reg_raise( GNCSplitReg *gsr );
 
 static GtkWidget* add_summary_label( GtkWidget *summarybar, gboolean pack_start,
-                                     const char *label_str );
+                                     const char *label_str, GtkWidget *extra );
+
+static void gsr_summarybar_set_arrow_draw (GNCSplitReg *gsr);
 
 static void gnc_split_reg_determine_read_only( GNCSplitReg *gsr );
 
@@ -347,6 +349,8 @@ gnc_split_reg_init( GNCSplitReg *gsr )
     gtk_orientable_set_orientation (GTK_ORIENTABLE(gsr), GTK_ORIENTATION_VERTICAL);
 
     gsr->sort_type = BY_STANDARD;
+    gsr->sort_rev = FALSE;
+    gsr->sort_arrow_handler_id = 0;
     gsr->width = -1;
     gsr->height = -1;
     gsr->numRows = 10;
@@ -546,6 +550,71 @@ gsr_redraw_all_cb (GnucashRegister *g_reg, gpointer data)
     gsr_update_summary_label( gsr->projectedminimum_label,
                               xaccAccountGetProjectedMinimumBalance,
                               leader, print_info, commodity, reverse, euro );
+
+    // Sort label
+    if (gsr->sort_label != NULL)
+    {
+        gchar *old_tt_text = gtk_widget_get_tooltip_text (GTK_WIDGET(gsr->sort_label));
+        gchar *new_tt_text;
+        gchar *text = NULL;
+
+        switch (gsr->sort_type)
+        {
+        case (0):
+            text =  _("None");
+            break;
+        case (1):
+            text = _("Standard Order");
+            break;
+        case (2):
+            text = _("Date");
+            break;
+        case (3):
+            text = _("Date of Entry");
+            break;
+        case (4):
+            text = _("Statement Date");
+            break;
+        case (5):
+            text = _("Number");
+            break;
+        case (6):
+            text = _("Amount");
+            break;
+        case (7):
+            text = _("Memo");
+            break;
+        case (8):
+            text = _("Description");
+            break;
+        case (9):
+            text = _("Action");
+            break;
+        case (10):
+            text = _("Notes");
+            break;
+        }
+
+        if (gsr->sort_rev)
+            gtk_widget_set_tooltip_text (GTK_WIDGET(gsr->sort_label), _("Descending"));
+        else
+            gtk_widget_set_tooltip_text (GTK_WIDGET(gsr->sort_label), _("Ascending"));
+
+        new_tt_text = gtk_widget_get_tooltip_text (GTK_WIDGET(gsr->sort_label));
+
+        // does the arrow need changing
+        if (g_strcmp0 (old_tt_text, new_tt_text) != 0)
+            gsr_summarybar_set_arrow_draw (gsr);
+
+        if (old_tt_text)
+            g_free (old_tt_text);
+
+        if (new_tt_text)
+            g_free (new_tt_text);
+
+        gtk_label_set_text (GTK_LABEL(gsr->sort_label), text);
+    }
+
     if (gsr->shares_label == NULL && gsr->value_label == NULL)
         return;
     amount = xaccAccountGetBalance( leader );
@@ -1868,14 +1937,15 @@ gnc_split_reg_sort_notes_cb(GtkWidget *w, gpointer data)
 void
 gnc_split_reg_set_sort_reversed(GNCSplitReg *gsr, gboolean rev)
 {
-  /* Note: sort_reversed is the boolean opposite of sort_increasing
-   *       so when rev == true, we're sorting decreasing
-   *       In other words, qof_query_set_sort_increasing should
-   *       always use the inverse of rev.
-   */
-  Query *query = gnc_ledger_display_get_query( gsr->ledger );
-  qof_query_set_sort_increasing (query, !rev, !rev, !rev);
-  gnc_ledger_display_refresh( gsr->ledger );
+    /* Note: sort_reversed is the boolean opposite of sort_increasing
+     *       so when rev == true, we're sorting decreasing
+     *       In other words, qof_query_set_sort_increasing should
+     *       always use the inverse of rev.
+     */
+    Query *query = gnc_ledger_display_get_query( gsr->ledger );
+    qof_query_set_sort_increasing (query, !rev, !rev, !rev);
+    gsr->sort_rev = rev;
+    gnc_ledger_display_refresh( gsr->ledger );
 }
 
 static void
@@ -2003,7 +2073,7 @@ gnc_split_reg_size_allocate (GtkWidget *widget,
 
 static
 GtkWidget*
-add_summary_label (GtkWidget *summarybar, gboolean pack_start, const char *label_str)
+add_summary_label (GtkWidget *summarybar, gboolean pack_start, const char *label_str, GtkWidget *extra)
 {
     GtkWidget *hbox;
     GtkWidget *label;
@@ -2022,10 +2092,25 @@ add_summary_label (GtkWidget *summarybar, gboolean pack_start, const char *label
     label = gtk_label_new( "" );
     gnc_label_set_alignment(label, 1.0, 0.5 );
     gtk_box_pack_start( GTK_BOX(hbox), label, FALSE, FALSE, 0 );
+    
+    if (extra != NULL)
+        gtk_box_pack_start( GTK_BOX(hbox), extra, FALSE, FALSE, 0 );
 
     return label;
 }
 
+static void
+gsr_summarybar_set_arrow_draw (GNCSplitReg *gsr)
+{
+    if (gsr->sort_arrow_handler_id > 0)
+       g_signal_handler_disconnect (G_OBJECT(gsr->sort_arrow), gsr->sort_arrow_handler_id);
+
+    gsr->sort_arrow_handler_id = g_signal_connect (G_OBJECT (gsr->sort_arrow), "draw",
+                                                   G_CALLBACK (gnc_draw_arrow_cb), GINT_TO_POINTER(gsr->sort_rev));
+
+    gtk_widget_queue_draw (gsr->sort_arrow);
+}
+
 GtkWidget *
 gsr_create_summary_bar( GNCSplitReg *gsr )
 {
@@ -2036,6 +2121,8 @@ gsr_create_summary_bar( GNCSplitReg *gsr )
     gsr->reconciled_label = NULL;
     gsr->future_label     = NULL;
     gsr->projectedminimum_label  = NULL;
+    gsr->sort_label       = NULL;
+    gsr->sort_arrow       = NULL;
     gsr->shares_label     = NULL;
     gsr->value_label      = NULL;
 
@@ -2047,21 +2134,26 @@ gsr_create_summary_bar( GNCSplitReg *gsr )
 
     summarybar = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4);
     gtk_box_set_homogeneous (GTK_BOX (summarybar), FALSE);
+    gtk_widget_set_name (summarybar, "gnc-id-summarybar");
 
     if (!xaccAccountIsPriced(gnc_ledger_display_leader(gsr->ledger)))
     {
-        gsr->balance_label    = add_summary_label (summarybar, TRUE, _("Present:"));
-        gsr->future_label     = add_summary_label (summarybar, TRUE, _("Future:"));
-        gsr->cleared_label    = add_summary_label (summarybar, TRUE, _("Cleared:"));
-        gsr->reconciled_label = add_summary_label (summarybar, TRUE, _("Reconciled:"));
-        gsr->projectedminimum_label  = add_summary_label (summarybar, TRUE, _("Projected Minimum:"));
+        gsr->balance_label    = add_summary_label (summarybar, TRUE, _("Present:"), NULL);
+        gsr->future_label     = add_summary_label (summarybar, TRUE, _("Future:"), NULL);
+        gsr->cleared_label    = add_summary_label (summarybar, TRUE, _("Cleared:"), NULL);
+        gsr->reconciled_label = add_summary_label (summarybar, TRUE, _("Reconciled:"), NULL);
+        gsr->projectedminimum_label  = add_summary_label (summarybar, TRUE, _("Projected Minimum:"), NULL);
     }
     else
     {
-        gsr->shares_label     = add_summary_label (summarybar, TRUE, _("Shares:"));
-        gsr->value_label      = add_summary_label (summarybar, TRUE, _("Current Value:"));
+        gsr->shares_label     = add_summary_label (summarybar, TRUE, _("Shares:"), NULL);
+        gsr->value_label      = add_summary_label (summarybar, TRUE, _("Current Value:"), NULL);
     }
 
+    gsr->sort_arrow = gtk_image_new_from_icon_name ("image-missing", GTK_ICON_SIZE_SMALL_TOOLBAR);
+    gsr->sort_label = add_summary_label (summarybar, FALSE, _("Sort By: "), gsr->sort_arrow);
+    gnc_widget_set_style_context (GTK_WIDGET(gsr->sort_arrow), "gnc-class-highlight");
+
     gsr->summarybar = summarybar;
 
     /* Force the first update */
diff --git a/gnucash/gnome/gnc-split-reg.h b/gnucash/gnome/gnc-split-reg.h
index 018836f..a8e2d26 100644
--- a/gnucash/gnome/gnc-split-reg.h
+++ b/gnucash/gnome/gnc-split-reg.h
@@ -74,6 +74,8 @@ struct _GNCSplitReg
     GtkWidget *projectedminimum_label;
     GtkWidget *shares_label;
     GtkWidget *value_label;
+    GtkWidget *sort_label;
+    GtkWidget *sort_arrow;
 
     /** The current ledger display. **/
     GNCLedgerDisplay *ledger;
@@ -82,7 +84,9 @@ struct _GNCSplitReg
 
     gint numRows;
 
-    guint sort_type;
+    guint    sort_type;
+    gboolean sort_rev;
+    gulong   sort_arrow_handler_id;
 
     gboolean read_only;
 };
@@ -197,7 +201,7 @@ void gnc_split_reg_set_sort_type_force( GNCSplitReg *gsr, SortType t, gboolean f
 
 /**
  * Set/get sort order of register
- **/ 
+ **/
 void gnc_split_reg_set_sort_reversed(GNCSplitReg *gsr, gboolean rev);
 
 

commit c3724431e9fd3cd840bc6910e4c0df99bdf08abe
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Sun Jun 17 20:39:35 2018 +0100

    Add a parameter to add_summary_label to specify packing order
    
    Add boolean pack_start to add_summary_label to indicate whether the
    labels should be packed at the start or end of the summary bar.

diff --git a/gnucash/gnome/gnc-split-reg.c b/gnucash/gnome/gnc-split-reg.c
index aba9fdc..b7829e6 100644
--- a/gnucash/gnome/gnc-split-reg.c
+++ b/gnucash/gnome/gnc-split-reg.c
@@ -65,7 +65,7 @@ static QofLogModule log_module = GNC_MOD_GUI;
 /***** PROTOTYPES ***************************************************/
 void gnc_split_reg_raise( GNCSplitReg *gsr );
 
-static GtkWidget* add_summary_label( GtkWidget *summarybar,
+static GtkWidget* add_summary_label( GtkWidget *summarybar, gboolean pack_start,
                                      const char *label_str );
 
 static void gnc_split_reg_determine_read_only( GNCSplitReg *gsr );
@@ -2003,14 +2003,17 @@ gnc_split_reg_size_allocate (GtkWidget *widget,
 
 static
 GtkWidget*
-add_summary_label (GtkWidget *summarybar, const char *label_str)
+add_summary_label (GtkWidget *summarybar, gboolean pack_start, const char *label_str)
 {
     GtkWidget *hbox;
     GtkWidget *label;
 
     hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2);
     gtk_box_set_homogeneous (GTK_BOX (hbox), FALSE);
-    gtk_box_pack_start( GTK_BOX(summarybar), hbox, FALSE, FALSE, 5 );
+    if (pack_start)
+        gtk_box_pack_start( GTK_BOX(summarybar), hbox, FALSE, FALSE, 5 );
+    else
+        gtk_box_pack_end( GTK_BOX(summarybar), hbox, FALSE, FALSE, 5 );
 
     label = gtk_label_new( label_str );
     gnc_label_set_alignment(label, 1.0, 0.5 );
@@ -2047,16 +2050,16 @@ gsr_create_summary_bar( GNCSplitReg *gsr )
 
     if (!xaccAccountIsPriced(gnc_ledger_display_leader(gsr->ledger)))
     {
-        gsr->balance_label    = add_summary_label (summarybar, _("Present:"));
-        gsr->future_label     = add_summary_label (summarybar, _("Future:"));
-        gsr->cleared_label    = add_summary_label (summarybar, _("Cleared:"));
-        gsr->reconciled_label = add_summary_label (summarybar, _("Reconciled:"));
-        gsr->projectedminimum_label  = add_summary_label (summarybar, _("Projected Minimum:"));
+        gsr->balance_label    = add_summary_label (summarybar, TRUE, _("Present:"));
+        gsr->future_label     = add_summary_label (summarybar, TRUE, _("Future:"));
+        gsr->cleared_label    = add_summary_label (summarybar, TRUE, _("Cleared:"));
+        gsr->reconciled_label = add_summary_label (summarybar, TRUE, _("Reconciled:"));
+        gsr->projectedminimum_label  = add_summary_label (summarybar, TRUE, _("Projected Minimum:"));
     }
     else
     {
-        gsr->shares_label     = add_summary_label (summarybar, _("Shares:"));
-        gsr->value_label      = add_summary_label (summarybar, _("Current Value:"));
+        gsr->shares_label     = add_summary_label (summarybar, TRUE, _("Shares:"));
+        gsr->value_label      = add_summary_label (summarybar, TRUE, _("Current Value:"));
     }
 
     gsr->summarybar = summarybar;



Summary of changes:
 gnucash/gnome/gnc-plugin-page-register.c          | 692 +++++++++++++++++++---
 gnucash/gnome/gnc-split-reg.c                     | 219 +++++--
 gnucash/gnome/gnc-split-reg.h                     |  14 +-
 gnucash/gtkbuilder/gnc-plugin-page-register.glade |  61 +-
 libgnucash/engine/gnc-features.c                  |  41 +-
 libgnucash/engine/gnc-features.h                  |   1 +
 6 files changed, 870 insertions(+), 158 deletions(-)



More information about the gnucash-changes mailing list