r23112 - gnucash/trunk/src - Register rewrite Update, change to using original query. This update changes the model to drop the filter and sort models to use the qof query to do these parts. This is in response to the slowness of large transaction lists with the intention to load only a subset of them. This is the start and this update should result in the same out put as using the filter and sort model. Author: Robert Fewell

John Ralls jralls at code.gnucash.org
Fri Aug 2 13:55:27 EDT 2013


Author: jralls
Date: 2013-08-02 13:55:26 -0400 (Fri, 02 Aug 2013)
New Revision: 23112
Trac: http://svn.gnucash.org/trac/changeset/23112

Modified:
   gnucash/trunk/src/gnome-utils/gnc-tree-control-split-reg.c
   gnucash/trunk/src/gnome-utils/gnc-tree-control-split-reg.h
   gnucash/trunk/src/gnome-utils/gnc-tree-model-split-reg.c
   gnucash/trunk/src/gnome-utils/gnc-tree-model-split-reg.h
   gnucash/trunk/src/gnome-utils/gnc-tree-util-split-reg.c
   gnucash/trunk/src/gnome-utils/gnc-tree-view-split-reg.c
   gnucash/trunk/src/gnome-utils/gnc-tree-view-split-reg.h
   gnucash/trunk/src/gnome/gnc-plugin-page-register2.c
   gnucash/trunk/src/gnome/gnc-split-reg2.c
   gnucash/trunk/src/gnome/gnc-split-reg2.h
   gnucash/trunk/src/register/ledger-core/gnc-ledger-display2.c
   gnucash/trunk/src/register/ledger-core/gnc-ledger-display2.h
Log:
Register rewrite Update, change to using original query. This update changes the model to drop the filter and sort models to use the qof query to do these parts. This is in response to the slowness of large transaction lists with the intention to load only a subset of them. This is the start and this update should result in the same out put as using the filter and sort model. Author: Robert Fewell

Modified: gnucash/trunk/src/gnome/gnc-plugin-page-register2.c
===================================================================
--- gnucash/trunk/src/gnome/gnc-plugin-page-register2.c	2013-08-02 17:55:10 UTC (rev 23111)
+++ gnucash/trunk/src/gnome/gnc-plugin-page-register2.c	2013-08-02 17:55:26 UTC (rev 23112)
@@ -128,8 +128,8 @@
 static gchar *gnc_plugin_page_register2_get_filter (GncPluginPage *plugin_page);
 void gnc_plugin_page_register2_set_filter (GncPluginPage *plugin_page, const gchar *filter);
 
-static void gnc_ppr_update_status_filter (GncPluginPageRegister2 *page, gboolean refresh_page);
-static void gnc_ppr_update_date_filter (GncPluginPageRegister2 *page, gboolean refresh_page);
+static void gnc_ppr_update_status_query (GncPluginPageRegister2 *page, gboolean refresh_page); 
+static void gnc_ppr_update_date_query (GncPluginPageRegister2 *page, gboolean refresh_page); 
 
 /* Command callbacks */
 static void gnc_plugin_page_register2_cmd_print_check (GtkAction *action, GncPluginPageRegister2 *plugin_page);
@@ -620,26 +620,26 @@
     }
 
     register_page = g_object_new (GNC_TYPE_PLUGIN_PAGE_REGISTER2, NULL);
-    priv = GNC_PLUGIN_PAGE_REGISTER2_GET_PRIVATE(register_page);
+    priv = GNC_PLUGIN_PAGE_REGISTER2_GET_PRIVATE (register_page);
     priv->ledger = ledger;
     priv->key = *guid_null();
 
     plugin_page = GNC_PLUGIN_PAGE (register_page);
     label = gnc_plugin_page_register2_get_tab_name (plugin_page);
     gnc_plugin_page_set_page_name (plugin_page, label);
-    g_free(label);
+    g_free (label);
 
-    label_color = gnc_plugin_page_register2_get_tab_color(plugin_page);
-    gnc_plugin_page_set_page_color(plugin_page, label_color);
-    g_free(label_color);
+    label_color = gnc_plugin_page_register2_get_tab_color (plugin_page);
+    gnc_plugin_page_set_page_color (plugin_page, label_color);
+    g_free (label_color);
 
-    label = gnc_plugin_page_register2_get_long_name(plugin_page);
-    gnc_plugin_page_set_page_long_name(plugin_page, label);
-    g_free(label);
+    label = gnc_plugin_page_register2_get_long_name (plugin_page);
+    gnc_plugin_page_set_page_long_name (plugin_page, label);
+    g_free (label);
 
     q = gnc_ledger_display2_get_query (ledger);
     book_list = qof_query_get_books (q);
-    for (item = book_list; item; item = g_list_next(item))
+    for (item = book_list; item; item = g_list_next (item))
         gnc_plugin_page_add_book (plugin_page, (QofBook *)item->data);
     // Do not free the list. It is owned by the query.
 
@@ -1007,20 +1007,20 @@
     GncTreeModelSplitReg *model;
     GNCLedgerDisplay2Type ledger_type;
     int i;
-    gboolean is_readwrite = !qof_book_is_readonly(gnc_get_current_book());
+    gboolean is_readwrite = !qof_book_is_readonly (gnc_get_current_book());
 
-    priv = GNC_PLUGIN_PAGE_REGISTER2_GET_PRIVATE(page);
+    priv = GNC_PLUGIN_PAGE_REGISTER2_GET_PRIVATE (page);
     account = gnc_plugin_page_register2_get_account (page);
-    action_group = gnc_plugin_page_get_action_group(GNC_PLUGIN_PAGE(page));
+    action_group = gnc_plugin_page_get_action_group (GNC_PLUGIN_PAGE (page));
     gnc_plugin_update_actions(action_group, actions_requiring_account,
                               "sensitive", is_readwrite && account != NULL);
 
     /* Set "style" radio button */
-    ledger_type = gnc_ledger_display2_type(priv->ledger);
-    gnc_plugin_update_actions(action_group, view_style_actions,
+    ledger_type = gnc_ledger_display2_type (priv->ledger);
+    gnc_plugin_update_actions (action_group, view_style_actions,
                               "sensitive", ledger_type == LD2_SINGLE);
 
-    model = gnc_ledger_display2_get_split_model_register(priv->ledger);
+    model = gnc_ledger_display2_get_split_model_register (priv->ledger);
     for (i = n_radio_entries_2 - 1; i > 0; i--)
     {
         DEBUG(" index %d: comparing %x to %x", i, radio_entries_2[i].value,
@@ -1033,26 +1033,24 @@
     }
 
     /* Either a match was found, or fell out with i = 0 */
-    action = gtk_action_group_get_action(action_group, radio_entries_2[i].name);
-    g_signal_handlers_block_by_func(action, gnc_plugin_page_register2_cmd_style_changed, page);
-    gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), TRUE);
-    g_signal_handlers_unblock_by_func(action, gnc_plugin_page_register2_cmd_style_changed, page);
+    action = gtk_action_group_get_action (action_group, radio_entries_2[i].name);
+    g_signal_handlers_block_by_func (action, gnc_plugin_page_register2_cmd_style_changed, page);
+    gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), TRUE);
+    g_signal_handlers_unblock_by_func (action, gnc_plugin_page_register2_cmd_style_changed, page);
 
     view = gnc_split_reg2_get_register (priv->gsr);
 
     /* Set "double line" toggle button */
-    action = gtk_action_group_get_action (action_group,
-                                          "ViewStyleDoubleLineAction");
-    g_signal_handlers_block_by_func(action, gnc_plugin_page_register2_cmd_style_double_line, page);
-    gtk_toggle_action_set_active (GTK_TOGGLE_ACTION(action), model->use_double_line);
-    g_signal_handlers_unblock_by_func(action, gnc_plugin_page_register2_cmd_style_double_line, page);
+    action = gtk_action_group_get_action (action_group, "ViewStyleDoubleLineAction");
+    g_signal_handlers_block_by_func (action, gnc_plugin_page_register2_cmd_style_double_line, page);
+    gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), model->use_double_line);
+    g_signal_handlers_unblock_by_func (action, gnc_plugin_page_register2_cmd_style_double_line, page);
 
-    /* Set "extar dates" toggle button */
-    action = gtk_action_group_get_action (action_group,
-                                          "ViewStyleExtraDatesAction");
-    g_signal_handlers_block_by_func(action, gnc_plugin_page_register2_cmd_style_extra_dates, page);
-    gtk_toggle_action_set_active (GTK_TOGGLE_ACTION(action), view->show_extra_dates);
-    g_signal_handlers_unblock_by_func(action, gnc_plugin_page_register2_cmd_style_extra_dates, page);
+    /* Set "extra dates" toggle button */
+    action = gtk_action_group_get_action (action_group, "ViewStyleExtraDatesAction");
+    g_signal_handlers_block_by_func (action, gnc_plugin_page_register2_cmd_style_extra_dates, page);
+    gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), view->show_extra_dates);
+    g_signal_handlers_unblock_by_func (action, gnc_plugin_page_register2_cmd_style_extra_dates, page);
 }
 
 
@@ -1121,7 +1119,6 @@
 
     ledger_type = gnc_ledger_display2_type (priv->ledger);
 
-
     if (ledger_type == LD2_SINGLE || ledger_type == LD2_SUBACCOUNT || ledger_type == LD2_GL)
     {
         /* Set the filter for the split register and status of save filter button */
@@ -1160,11 +1157,14 @@
         priv->fd.original_save_filter = priv->fd.save_filter;
         g_strfreev (filter);
 
-        /* Update the filter with Status and Dates */
-        gnc_ppr_update_status_filter (page, FALSE);
-        gnc_ppr_update_date_filter (page, FALSE);
+        /* Update Query with Filter Status and Dates */
+        gnc_ppr_update_status_query (page, FALSE);
+        gnc_ppr_update_date_query (page, FALSE);
     }
 
+//FIXME may change, can we load filter at same time of sort so we do one querry on load
+    gnc_ledger_display2_refresh (priv->ledger);
+
     /* This sets the default selection on load, not required for templates */
     if (!gnc_tree_model_split_reg_get_template (model))
        gnc_tree_view_split_reg_default_selection (view);
@@ -1395,10 +1395,10 @@
 }
 
 /** Read and restore the edit menu settings on the specified register
- *  page.  This function will restore the register style (ledger, auto
+ *  page. This function will restore the register style (ledger, auto
  *  ledger, journal) and whether or not the register is in double line
- *  mode.  It should eventually restore the "filter by" and "sort by
- *  settings.
+ *  mode. It should eventually restore the "filter by" and "sort by"
+ *  mode.
  *
  *  @param page The register being restored.
  *
@@ -1456,7 +1456,6 @@
     DEBUG("Setting extra_dates_mode: %d", show_extra_dates);
     action = gnc_plugin_page_get_action (page, "ViewStyleExtraDatesAction");
     gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), show_extra_dates);
-
     LEAVE(" ");
 }
 
@@ -1761,7 +1760,7 @@
 
     g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER2 (plugin_page), _("unknown"));
 
-    priv = GNC_PLUGIN_PAGE_REGISTER2_GET_PRIVATE(plugin_page);
+    priv = GNC_PLUGIN_PAGE_REGISTER2_GET_PRIVATE (plugin_page);
     ld = priv->ledger;
     ledger_type = gnc_ledger_display2_type (ld);
     leader = gnc_ledger_display2_leader (ld);
@@ -1774,7 +1773,7 @@
     case LD2_SUBACCOUNT:
     {
         gchar *account_full_name = gnc_account_get_full_name (leader);
-        gchar *return_string = g_strdup_printf("%s+", account_full_name);
+        gchar *return_string = g_strdup_printf ("%s+", account_full_name);
         g_free ((gpointer *) account_full_name);
         return return_string;
     }
@@ -1787,7 +1786,7 @@
 }
 
 static void
-gnc_plugin_page_register2_summarybar_position_changed(GConfEntry *entry,
+gnc_plugin_page_register2_summarybar_position_changed (GConfEntry *entry,
         gpointer user_data)
 {
     GncPluginPage *plugin_page;
@@ -1798,9 +1797,9 @@
 
     g_return_if_fail(user_data != NULL);
 
-    plugin_page = GNC_PLUGIN_PAGE(user_data);
+    plugin_page = GNC_PLUGIN_PAGE (user_data);
     page = GNC_PLUGIN_PAGE_REGISTER2 (user_data);
-    priv = GNC_PLUGIN_PAGE_REGISTER2_GET_PRIVATE(page);
+    priv = GNC_PLUGIN_PAGE_REGISTER2_GET_PRIVATE (page);
 
     conf_string = gnc_gconf_get_string (GCONF_GENERAL,
                                         KEY_SUMMARYBAR_POSITION, NULL);
@@ -1811,7 +1810,7 @@
         g_free (conf_string);
     }
 
-    gtk_box_reorder_child(GTK_BOX(priv->widget),
+    gtk_box_reorder_child (GTK_BOX (priv->widget),
                           plugin_page->summarybar,
                           (position == GTK_POS_TOP ? 0 : -1) );
 }
@@ -1824,85 +1823,135 @@
 /************************************************************/
 
 /** This function updates the "cleared match" term of the register
- *  filter.
+ *  query.  It unconditionally removes any old "cleared match" query
+ *  term, then adds back a new query term if needed.  There seems to
+ *  be a bug in the current g2 register code such that when the number
+ *  of entries in the register doesn't fill up the window, the blank
+ *  space at the end of the window isn't correctly redrawn.  This
+ *  function works around that problem, but a root cause analysis
+ *  should probably be done.
  *
  *  @param page A pointer to the GncPluginPageRegister2 that is
  *  associated with this filter dialog.
  */
 static void
-gnc_ppr_update_status_filter (GncPluginPageRegister2 *page, gboolean refresh_page)
+gnc_ppr_update_status_query (GncPluginPageRegister2 *page, gboolean refresh_page)
 {
     GncPluginPageRegister2Private *priv;
-    GncTreeModelSplitReg *model;
+    GSList *param_list;
+    Query *query;
 
-    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER2 (page));
+    ENTER(" ");
+    priv = GNC_PLUGIN_PAGE_REGISTER2_GET_PRIVATE (page);
+    query = gnc_ledger_display2_get_query (priv->ledger );
+    if (!query)
+    {
+        LEAVE("no query found");
+        return;
+    }
 
-    priv = GNC_PLUGIN_PAGE_REGISTER2_GET_PRIVATE(page);
-    model = gnc_ledger_display2_get_split_model_register (priv->ledger);
+    /* Remove the old status match */
+    param_list = qof_query_build_param_list (SPLIT_RECONCILE, NULL);
+    if (param_list)
+    {
+        qof_query_purge_terms (query, param_list);
+        g_slist_free(param_list);
+    }
 
-    model->filter_cleared_match = priv->fd.cleared_match;
+    /* Install the new status match */
+    if (priv->fd.cleared_match != CLEARED_ALL)
+        xaccQueryAddClearedMatch(query, priv->fd.cleared_match, QOF_QUERY_AND);
 
     if (refresh_page)
-        gnc_ledger_display2_refilter (priv->ledger);
-
+        gnc_ledger_display2_refresh (priv->ledger);
     LEAVE(" ");
 }
 
 /** This function updates the "date posted" term of the register
- *  filter.
+ *  query.  It unconditionally removes any old "date posted" query
+ *  term, then adds back a new query term if needed.  There seems to
+ *  be a bug in the current g2 register code such that when the number
+ *  of entries in the register doesn't fill up the window, the blank
+ *  space at the end of the window isn't correctly redrawn.  This
+ *  function works around that problem, but a root cause analysis
+ *  should probably be done.
  *
  *  @param page A pointer to the GncPluginPageRegister2 that is
  *  associated with this filter dialog.
  */
 static void
-gnc_ppr_update_date_filter (GncPluginPageRegister2 *page, gboolean refresh_page)
+gnc_ppr_update_date_query (GncPluginPageRegister2 *page, gboolean refresh_page)
 {
     GncPluginPageRegister2Private *priv;
-    GncTreeModelSplitReg *model;
+    GSList *param_list;
+    Query *query;
 
-    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER2 (page));
+    ENTER(" ");
+    priv = GNC_PLUGIN_PAGE_REGISTER2_GET_PRIVATE (page);
+    if (!priv->ledger)
+    {
+        LEAVE("no ledger");
+        return;
+    }
 
-    priv = GNC_PLUGIN_PAGE_REGISTER2_GET_PRIVATE(page);
-    model = gnc_ledger_display2_get_split_model_register (priv->ledger);
+    query = gnc_ledger_display2_get_query (priv->ledger);
+    if (!query)
+    {
+        LEAVE("no query");
+        return;
+    }
 
-    model->filter_start_time = priv->fd.start_time;
-    model->filter_end_time = priv->fd.end_time;
+    /* Delete any existing old date spec. */
+    param_list = qof_query_build_param_list (SPLIT_TRANS, TRANS_DATE_POSTED, NULL);
+    if (param_list)
+    {
+        qof_query_purge_terms (query, param_list);
+        g_slist_free(param_list);
+    }
 
+    if (priv->fd.start_time || priv->fd.end_time)
+    {
+        /* Build a new spec */
+        xaccQueryAddDateMatchTT (query,
+                                priv->fd.start_time != 0, priv->fd.start_time,
+                                priv->fd.end_time != 0,   priv->fd.end_time,
+                                QOF_QUERY_AND);
+    }
+
     if (refresh_page)
-        gnc_ledger_display2_refilter (priv->ledger);
-
+        gnc_ledger_display2_refresh (priv->ledger);
     LEAVE(" ");
 }
 
 /* This function converts a time64 value date to a string */
 static gchar *
-gnc_plugin_page_register2_filter_time2dmy ( time64 raw_time)
+gnc_plugin_page_register2_filter_time2dmy (time64 raw_time)
 {
     struct tm * timeinfo;
     gchar date_string[11];
     gint i;
 
-    timeinfo = gnc_localtime ( &raw_time );
-    i = strftime (date_string, 11, "%d-%m-%Y", timeinfo );
+    timeinfo = gnc_localtime (&raw_time);
+    i = strftime (date_string, 11, "%d-%m-%Y", timeinfo);
     PINFO("Date string is %s", date_string);
 
     gnc_tm_free (timeinfo);
-    return g_strdup(date_string);
+    return g_strdup (date_string);
 }
 
 /* This function converts a string date to a time64 value */
 static time64
-gnc_plugin_page_register2_filter_dmy2time ( char *date_string)
+gnc_plugin_page_register2_filter_dmy2time (char *date_string)
 {
     struct tm when;
 
     PINFO("Date string is %s", date_string);
     memset (&when, 0, sizeof (when));
-    sscanf(date_string, "%d-%d-%d", &when.tm_mday,
-	   &when.tm_mon, &when.tm_year );
+    sscanf (date_string, "%d-%d-%d", &when.tm_mday,
+	   &when.tm_mon, &when.tm_year);
 
     when.tm_year -= 1900;
-    when.tm_mon -=  1 ;
+    when.tm_mon -=  1;
 
     return gnc_mktime (&when);
 }
@@ -1925,17 +1974,17 @@
     const gchar *name;
     gint i, value;
 
-    g_return_if_fail(GTK_IS_CHECK_BUTTON(button));
-    g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER2(page));
+    g_return_if_fail (GTK_IS_CHECK_BUTTON (button));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER2 (page));
 
-    name = gtk_buildable_get_name(GTK_BUILDABLE(button));
+    name = gtk_buildable_get_name (GTK_BUILDABLE (button));
     ENTER("toggle button %s (%p), plugin_page %p", name, button, page);
 
     /* Determine what status bit to change */
     value = CLEARED_NONE;
     for (i = 0; status_actions[i].action_name; i++)
     {
-        if (g_strcmp0(name, status_actions[i].action_name) == 0)
+        if (g_strcmp0 (name, status_actions[i].action_name) == 0)
         {
             value = status_actions[i].value;
             break;
@@ -1943,18 +1992,18 @@
     }
 
     /* Compute the new match status */
-    priv = GNC_PLUGIN_PAGE_REGISTER2_GET_PRIVATE(page);
-    if (gtk_toggle_button_get_active(button))
+    priv = GNC_PLUGIN_PAGE_REGISTER2_GET_PRIVATE (page);
+    if (gtk_toggle_button_get_active (button))
         priv->fd.cleared_match |= value;
     else
         priv->fd.cleared_match &= ~value;
-    gnc_ppr_update_status_filter(page, TRUE);
+    gnc_ppr_update_status_query (page, TRUE);
     LEAVE(" ");
 }
 
 /** This function is called whenever the "select all" status button is
- *  clicked.  It updates all of the checkbox widgets, then updates the
- *  filter on the register.
+ *  clicked. It updates all of the checkbox widgets, then updates the
+ *  query on the register.
  *
  *  @param button The button that was clicked.
  *
@@ -1969,8 +2018,8 @@
     GtkWidget *widget;
     gint i;
 
-    g_return_if_fail(GTK_IS_BUTTON(button));
-    g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER2(page));
+    g_return_if_fail (GTK_IS_BUTTON (button));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER2 (page));
 
     ENTER("(button %p, page %p)", button, page);
 
@@ -1978,31 +2027,31 @@
     for (i = 0; status_actions[i].action_name; i++)
     {
         widget = status_actions[i].widget;
-        g_signal_handlers_block_by_func(widget, gnc_plugin_page_register2_filter_status_one_cb, page);
-        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(widget), TRUE);
-        g_signal_handlers_unblock_by_func(widget, gnc_plugin_page_register2_filter_status_one_cb, page);
+        g_signal_handlers_block_by_func (widget, gnc_plugin_page_register2_filter_status_one_cb, page);
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);
+        g_signal_handlers_unblock_by_func (widget, gnc_plugin_page_register2_filter_status_one_cb, page);
     }
 
     /* Set the requested status */
-    priv = GNC_PLUGIN_PAGE_REGISTER2_GET_PRIVATE(page);
+    priv = GNC_PLUGIN_PAGE_REGISTER2_GET_PRIVATE (page);
     priv->fd.cleared_match = CLEARED_ALL;
-    gnc_ppr_update_status_filter(page, TRUE);
+    gnc_ppr_update_status_query (page, TRUE);
     LEAVE(" ");
 }
 
 /** This function computes the starting and ending times for the
  *  filter by examining the dialog widgets to see which ones are
  *  selected, and will pull times out of the data entry boxes if
- *  necessary.  This function must exist to handle the case where the
+ *  necessary. This function must exist to handle the case where the
  *  "show all" button was Selected, and the user clicks on the "select
- *  range" button.  Since it exists, it make sense for the rest of the
+ *  range" button. Since it exists, it make sense for the rest of the
  *  callbacks to take advantage of it.
  *
  *  @param page A pointer to the GncPluginPageRegister2 that is
  *  associated with this filter dialog.
  */
 static void
-get_filter_times(GncPluginPageRegister2 *page)
+get_filter_times (GncPluginPageRegister2 *page)
 {
     GncPluginPageRegister2Private *priv;
     GtkWidget *button, *today, *gde;
@@ -2051,7 +2100,7 @@
  *  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 filter. This is handled by a
+ *  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.
@@ -2068,23 +2117,23 @@
     GncPluginPageRegister2Private *priv;
     gboolean active;
 
-    g_return_if_fail(GTK_IS_RADIO_BUTTON(button));
-    g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER2(page));
+    g_return_if_fail (GTK_IS_RADIO_BUTTON (button));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER2 (page));
 
     ENTER("(button %p, page %p)", button, page);
-    priv = GNC_PLUGIN_PAGE_REGISTER2_GET_PRIVATE(page);
-    active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button));
-    gtk_widget_set_sensitive(priv->fd.table, active);
+    priv = GNC_PLUGIN_PAGE_REGISTER2_GET_PRIVATE (page);
+    active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button));
+    gtk_widget_set_sensitive (priv->fd.table, active);
     if (active)
     {
-        get_filter_times(page);
+        get_filter_times (page);
     }
     else
     {
         priv->fd.start_time = 0;
         priv->fd.end_time = 0;
     }
-    gnc_ppr_update_date_filter(page, TRUE);
+    gnc_ppr_update_date_query (page, TRUE);
     LEAVE(" ");
 }
 
@@ -2102,18 +2151,18 @@
 gnc_plugin_page_register2_filter_gde_changed_cb (GtkWidget *unused,
         GncPluginPageRegister2 *page)
 {
-    g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER2(page));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER2 (page));
 
-    ENTER("(widget %s(%p), page %p)", gtk_buildable_get_name(GTK_BUILDABLE(unused)), unused, page);
-    get_filter_times(page);
-    gnc_ppr_update_date_filter(page, TRUE);
+    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, TRUE);
     LEAVE(" ");
 }
 
 /** This function is called when one of the start date radio buttons
  *  is selected. It updates the sensitivity of the date entry widget,
  *  then calls a common routine to determine the start/end times and
- *  update the register filter.
+ *  update the register query.
  *
  *  *Note: This function is actually called twice for each new radio
  *  button selection. The first time call is to uncheck the old
@@ -2137,29 +2186,29 @@
     const gchar *name;
     gboolean active;
 
-    g_return_if_fail(GTK_IS_RADIO_BUTTON(radio));
-    g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER2(page));
+    g_return_if_fail (GTK_IS_RADIO_BUTTON (radio));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER2 (page));
 
-    ENTER("(radio %s(%p), page %p)", gtk_buildable_get_name(GTK_BUILDABLE(radio)), radio, page);
-    priv = GNC_PLUGIN_PAGE_REGISTER2_GET_PRIVATE(page);
-    if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radio)))
+    ENTER("(radio %s(%p), page %p)", gtk_buildable_get_name (GTK_BUILDABLE (radio)), radio, page);
+    priv = GNC_PLUGIN_PAGE_REGISTER2_GET_PRIVATE (page);
+    if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (radio)))
     {
         LEAVE("1st callback of pair. Defer to 2nd callback.");
         return;
     }
 
-    name = gtk_buildable_get_name(GTK_BUILDABLE(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_filter(page, TRUE);
+    name = gtk_buildable_get_name (GTK_BUILDABLE (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, TRUE);
     LEAVE(" ");
 }
 
 /** This function is called when one of the end date radio buttons is
  *  selected. It updates the sensitivity of the date entry widget,
  *  then calls a common routine to determine the start/end times and
- *  update the register filter.
+ *  update the register query.
  *
  *  *Note: This function is actually called twice for each new radio
  *  button selection. The first time call is to uncheck the old
@@ -2183,22 +2232,22 @@
     const gchar *name;
     gboolean active;
 
-    g_return_if_fail(GTK_IS_RADIO_BUTTON(radio));
-    g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER2(page));
+    g_return_if_fail (GTK_IS_RADIO_BUTTON (radio));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER2 (page));
 
-    ENTER("(radio %s(%p), page %p)", gtk_buildable_get_name(GTK_BUILDABLE(radio)), radio, page);
-    priv = GNC_PLUGIN_PAGE_REGISTER2_GET_PRIVATE(page);
-    if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radio)))
+    ENTER("(radio %s(%p), page %p)", gtk_buildable_get_name (GTK_BUILDABLE (radio)), radio, page);
+    priv = GNC_PLUGIN_PAGE_REGISTER2_GET_PRIVATE (page);
+    if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (radio)))
     {
         LEAVE("1st callback of pair. Defer to 2nd callback.");
         return;
     }
 
-    name = gtk_buildable_get_name(GTK_BUILDABLE(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_filter(page, TRUE);
+    name = gtk_buildable_get_name (GTK_BUILDABLE (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, TRUE);
     LEAVE(" ");
 }
 
@@ -2216,14 +2265,14 @@
 {
     GncPluginPageRegister2Private *priv;
 
-    g_return_if_fail(GTK_IS_CHECK_BUTTON(button));
-    g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER2(page));
+    g_return_if_fail (GTK_IS_CHECK_BUTTON (button));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER2 (page));
 
     ENTER("Save toggle button (%p), plugin_page %p", button, page);
 
     /* Compute the new save filter status */
-    priv = GNC_PLUGIN_PAGE_REGISTER2_GET_PRIVATE(page);
-    if (gtk_toggle_button_get_active(button))
+    priv = GNC_PLUGIN_PAGE_REGISTER2_GET_PRIVATE (page);
+    if (gtk_toggle_button_get_active (button))
         priv->fd.save_filter = TRUE;
     else
         priv->fd.save_filter = FALSE;
@@ -2232,7 +2281,7 @@
 
 /** This function is called when the "Filter By..." dialog is closed.
  *  If the dialog was closed by any method other than clicking the OK
- *  button, the original sorting order will be restored.
+ *  button, the original filter will be restored.
  *
  *  @param dialog A pointer to the dialog box.
  *
@@ -2249,22 +2298,22 @@
     GncPluginPageRegister2Private *priv;
     GncPluginPage *plugin_page;
 
-    g_return_if_fail(GTK_IS_DIALOG(dialog));
-    g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER2(page));
+    g_return_if_fail (GTK_IS_DIALOG (dialog));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER2 (page));
 
     ENTER(" ");
-    priv = GNC_PLUGIN_PAGE_REGISTER2_GET_PRIVATE(page);
-    plugin_page = GNC_PLUGIN_PAGE(page);
+    priv = GNC_PLUGIN_PAGE_REGISTER2_GET_PRIVATE (page);
+    plugin_page = GNC_PLUGIN_PAGE (page);
 
     if (response != GTK_RESPONSE_OK)
     {
         /* Remove the old status match */
         priv->fd.cleared_match = priv->fd.original_cleared_match;
-        gnc_ppr_update_status_filter(page, FALSE);
+        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.save_filter = priv->fd.original_save_filter;
-        gnc_ppr_update_date_filter(page, FALSE);
+        gnc_ppr_update_date_query (page, FALSE);
         gnc_ledger_display2_refresh (priv->ledger);
     }
     else
@@ -2274,7 +2323,7 @@
         if (priv->fd.save_filter)
         {
             gchar* filter;
-            filter = g_strdup_printf("0x%04x", priv->fd.cleared_match);
+            filter = g_strdup_printf ("0x%04x", priv->fd.cleared_match);
 
             if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->fd.start_date_choose)) && priv->fd.start_time != 0 )
             {
@@ -2301,7 +2350,7 @@
         }
     }
     priv->fd.dialog = NULL;
-    gtk_widget_destroy(GTK_WIDGET(dialog));
+    gtk_widget_destroy (GTK_WIDGET (dialog));
     LEAVE(" ");
 }
 
@@ -2898,13 +2947,13 @@
     gchar *title;
     int i;
 
-    g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER2(page));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER2 (page));
     ENTER("(action %p, page %p)", action, page);
 
-    priv = GNC_PLUGIN_PAGE_REGISTER2_GET_PRIVATE(page);
+    priv = GNC_PLUGIN_PAGE_REGISTER2_GET_PRIVATE (page);
     if (priv->fd.dialog)
     {
-        gtk_window_present(GTK_WINDOW(priv->fd.dialog));
+        gtk_window_present (GTK_WINDOW (priv->fd.dialog));
         LEAVE("existing dialog");
         return;
     }
@@ -2912,62 +2961,60 @@
     /* Create the dialog */
     builder = gtk_builder_new();
     gnc_builder_add_from_file (builder, "gnc-plugin-page-register2.glade", "Filter By");
-    dialog = GTK_WIDGET(gtk_builder_get_object (builder, "Filter By"));
+    dialog = GTK_WIDGET (gtk_builder_get_object (builder, "Filter By"));
     priv->fd.dialog = dialog;
-    gtk_window_set_transient_for(GTK_WINDOW(dialog),
-                                 gnc_window_get_gtk_window(GNC_WINDOW(GNC_PLUGIN_PAGE(page)->window)));
+    gtk_window_set_transient_for (GTK_WINDOW (dialog),
+                                 gnc_window_get_gtk_window (GNC_WINDOW (GNC_PLUGIN_PAGE (page)->window)));
 
     /* Translators: The %s is the name of the plugin page */
-    title = g_strdup_printf(_("Filter %s by..."),
-                            gnc_plugin_page_get_page_name(GNC_PLUGIN_PAGE(page)));
-    gtk_window_set_title(GTK_WINDOW(dialog), title);
+    title = g_strdup_printf (_("Filter %s by..."),
+                            gnc_plugin_page_get_page_name (GNC_PLUGIN_PAGE (page)));
+    gtk_window_set_title (GTK_WINDOW (dialog), title);
     g_free(title);
 
     /* Set the check buttons for the current status */
     for (i = 0; status_actions[i].action_name; i++)
     {
-        toggle = GTK_WIDGET(gtk_builder_get_object (builder, status_actions[i].action_name));
+        toggle = GTK_WIDGET (gtk_builder_get_object (builder, status_actions[i].action_name));
         value = priv->fd.cleared_match & status_actions[i].value;
         status_actions[i].widget = toggle;
-        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), value);
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), value);
     }
     priv->fd.original_cleared_match = priv->fd.cleared_match;
 
-    button = GTK_WIDGET(gtk_builder_get_object (builder, "filter_save"));
+    button = GTK_WIDGET (gtk_builder_get_object (builder, "filter_save"));
     if (priv->fd.save_filter == TRUE)
-        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
 
     // General Ledgers can not save filters so disable button.
     ledger_type = gnc_ledger_display2_type (priv->ledger);
     if (ledger_type == LD2_GL)
-       gtk_widget_set_sensitive(GTK_WIDGET(button), FALSE);
+       gtk_widget_set_sensitive (GTK_WIDGET (button), FALSE);
 
     /* Set the date info */
-    button = GTK_WIDGET(gtk_builder_get_object (builder, "filter_show_range"));
+    button = GTK_WIDGET (gtk_builder_get_object (builder, "filter_show_range"));
     query = gnc_ledger_display2_get_query (priv->ledger);
-    // Lets update the query but do not free the resulting list as it belongs to query.
-    split_list = qof_query_run (query);
+    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;
 
-    priv->fd.original_start_time = priv->fd.start_time;
-    start_time = priv->fd.start_time;
-    priv->fd.original_end_time = priv->fd.end_time;
-    end_time = priv->fd.end_time;
-
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), start_time || end_time);
-    table = GTK_WIDGET(gtk_builder_get_object (builder, "select_range_table"));
+    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;
-    gtk_widget_set_sensitive(GTK_WIDGET(table), start_time || end_time);
+    gtk_widget_set_sensitive (GTK_WIDGET (table), start_time || end_time);
 
-    priv->fd.start_date_choose = GTK_WIDGET(gtk_builder_get_object (builder, "start_date_choose"));
-    priv->fd.start_date_today = GTK_WIDGET(gtk_builder_get_object (builder, "start_date_today"));
-    priv->fd.end_date_choose = GTK_WIDGET(gtk_builder_get_object (builder, "end_date_choose"));
-    priv->fd.end_date_today = GTK_WIDGET(gtk_builder_get_object (builder, "end_date_today"));
+    priv->fd.start_date_choose = GTK_WIDGET (gtk_builder_get_object (builder, "start_date_choose"));
+    priv->fd.start_date_today = GTK_WIDGET (gtk_builder_get_object (builder, "start_date_today"));
+    priv->fd.end_date_choose = GTK_WIDGET (gtk_builder_get_object (builder, "end_date_choose"));
+    priv->fd.end_date_today = GTK_WIDGET (gtk_builder_get_object (builder, "end_date_today"));
 
     {
         /* Start date info */
         if (start_time == 0)
         {
-            button = GTK_WIDGET(gtk_builder_get_object (builder, "start_date_earliest"));
+            button = GTK_WIDGET (gtk_builder_get_object (builder, "start_date_earliest"));
             time_val = xaccQueryGetEarliestDateFound (query);
             sensitive = FALSE;
         }
@@ -3002,7 +3049,7 @@
         /* End date info */
         if (end_time == 0)
         {
-            button = GTK_WIDGET(gtk_builder_get_object (builder, "end_date_latest"));
+            button = GTK_WIDGET (gtk_builder_get_object (builder, "end_date_latest"));
             time_val = xaccQueryGetLatestDateFound (query);
             sensitive = FALSE;
         }
@@ -3021,7 +3068,7 @@
                 sensitive = TRUE;
             }
         }
-        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
         priv->fd.end_date = gnc_date_edit_new (gnc_time (NULL), FALSE, FALSE);
         hbox = GTK_WIDGET (gtk_builder_get_object (builder, "end_date_hbox"));
         gtk_box_pack_start (GTK_BOX (hbox), priv->fd.end_date, TRUE, TRUE, 0);
@@ -3037,8 +3084,8 @@
     gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, page);
 
     /* Show it */
-    gtk_widget_show_all(dialog);
-    g_object_unref(G_OBJECT(builder));
+    gtk_widget_show_all (dialog);
+    g_object_unref (G_OBJECT (builder));
     LEAVE(" ");
 }
 
@@ -3122,17 +3169,14 @@
 
     view = gnc_ledger_display2_get_split_view_register (priv->ledger);
 
-    use_double_line =  gtk_toggle_action_get_active (action);
+    use_double_line = gtk_toggle_action_get_active (action);
     if (use_double_line != model->use_double_line)
     {
         gnc_tree_model_split_reg_config (model, model->type, model->style, use_double_line);
 
         // This will re-display the view.
         gnc_tree_view_split_reg_set_format (view);
-
-        // This will update the row colors in anything but ledgers
-//        if (model->style != REG2_STYLE_LEDGER)
-            gnc_tree_view_split_reg_change_vis_rows (view);
+        gnc_ledger_display2_refresh (priv->ledger);
     }
     LEAVE(" ");
 }
@@ -3160,9 +3204,7 @@
     if (show_extra_dates != view->show_extra_dates)
     {
         view->show_extra_dates = show_extra_dates;
-
-        gnc_tree_view_split_reg_change_vis_rows (view);
-
+        gnc_ledger_display2_refresh (priv->ledger);
     }
     LEAVE(" ");
 }
@@ -3423,6 +3465,7 @@
     GtkWidget *window;
     GNCLedgerDisplay2 *ld;
     GncTreeViewSplitReg *view, *new_view;
+    GncTreeModelSplitReg *new_model;
     Account *account;
     Account *leader;
     Split *split;
@@ -3511,6 +3554,13 @@
 
     ld = gnc_plugin_page_register2_get_ledger (new_page);
     new_view = gnc_ledger_display2_get_split_view_register (ld);
+    new_model = gnc_ledger_display2_get_split_model_register (ld);
+
+    new_model->current_trans = xaccSplitGetParent (split);
+
+    if (!gnc_tree_model_split_reg_trans_is_in_view (new_model, xaccSplitGetParent (split)))
+        g_signal_emit_by_name (new_model, "refresh_trans");
+
     gnc_tree_control_split_reg_jump_to (new_view, NULL, split, FALSE);
     LEAVE(" ");
 }

Modified: gnucash/trunk/src/gnome/gnc-split-reg2.c
===================================================================
--- gnucash/trunk/src/gnome/gnc-split-reg2.c	2013-08-02 17:55:10 UTC (rev 23111)
+++ gnucash/trunk/src/gnome/gnc-split-reg2.c	2013-08-02 17:55:26 UTC (rev 23112)
@@ -81,6 +81,9 @@
 
 static void gsr2_emit_simple_signal (GNCSplitReg2 *gsr, const char *sigName);
 static void gsr2_emit_help_changed (GncTreeViewSplitReg *view, gpointer user_data);
+static void gsr2_scroll_value_changed_cb (GtkAdjustment *adj, gpointer user_data);
+static gboolean gsr2_scroll_button_event_cb (GtkWidget *widget, GdkEventButton *event, gpointer user_data);
+static void gsr2_scroll_sync_cb (GncTreeModelSplitReg *model, gpointer user_data);
 
 void gnc_split_reg2_style_ledger_cb (GtkWidget *w, gpointer data);
 void gnc_split_reg2_style_auto_ledger_cb (GtkWidget *w, gpointer data);
@@ -93,7 +96,9 @@
 static void gnc_split_reg2_init (GNCSplitReg2 *gsr);
 static void gnc_split_reg2_init2 (GNCSplitReg2 *gsr);
 
+static void gnc_split_reg2_sort_changed_cb (GtkTreeSortable *sortable, gpointer user_data);
 
+
 GType
 gnc_split_reg2_get_type (void)
 {
@@ -196,11 +201,11 @@
 
     gnc_split_reg2_determine_account_pr (gsr);
 
-    gsr2_setup_status_widgets( gsr );
+    gsr2_setup_status_widgets (gsr);
     /* ordering is important here... setup_status before create_table */
 
-    gsr2_create_table( gsr );
-    gsr2_setup_table( gsr );
+    gsr2_create_table (gsr);
+    gsr2_setup_table (gsr);
 
 }
 
@@ -226,9 +231,12 @@
     GtkWidget *register_widget;
     GncTreeViewSplitReg *view;
     GncTreeModelSplitReg *model;
+    GtkTreeModel *s_model;
     GtkWidget *scrolled_window;
     GtkTreeViewColumn *col;
     GNCLedgerDisplay2Type ledger_type;
+    GtkWidget *hbox;
+    gdouble num_of_trans;
 
     gchar *gconf_key;
     const GncGUID * guid;
@@ -266,13 +274,29 @@
     if (ledger_type == LD2_GL && model->type == GENERAL_LEDGER2)
         gconf_key = g_strconcat (GCONF_SECTION,"/", "00000000000000000000000000000001", NULL);
 
+    // Create a hbox for treeview and scrollbar.
+    hbox = gtk_hbox_new (FALSE, 0);
+    gtk_widget_show (hbox);
+
     scrolled_window = gtk_scrolled_window_new (NULL, NULL);
     gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
                                    GTK_POLICY_AUTOMATIC,
                                    GTK_POLICY_AUTOMATIC);
+
     gtk_widget_show (scrolled_window);
-    gtk_box_pack_start (GTK_BOX (gsr), scrolled_window, TRUE, TRUE, 0);
 
+    gtk_box_pack_start (GTK_BOX (gsr), hbox, TRUE, TRUE, 0);
+
+    num_of_trans = model->number_of_trans_in_full_tlist - 1;
+
+    gsr->scroll_adj = GTK_ADJUSTMENT (gtk_adjustment_new (model->position_of_trans_in_full_tlist, 0.0, num_of_trans + 10, 1.0, 10.0, 10.0));
+
+    gsr->scroll_bar = gtk_vscrollbar_new (GTK_ADJUSTMENT (gsr->scroll_adj));
+    gtk_widget_show (gsr->scroll_bar);
+
+    gtk_box_pack_start (GTK_BOX (hbox), gsr->scroll_bar, FALSE, FALSE, 2);
+    gtk_box_pack_start (GTK_BOX (hbox), scrolled_window, TRUE, TRUE, 0);
+
     gnc_ledger_display2_set_split_view_register (gsr->ledger, view);
 
     /* Restore the sort depth from gconf */
@@ -285,6 +309,9 @@
     else
         view->sort_direction = 1;
 
+    /* Restore the sort column from gconf */
+    view->sort_col = model->sort_col;
+
     g_object_set (G_OBJECT (view), "gconf-section", gconf_key, 
                  "show-column-menu", FALSE, NULL);
 
@@ -321,12 +348,32 @@
 
     /* This triggers the update of the summary bar */
     g_signal_connect_after (model, "refresh_status_bar",
-                      G_CALLBACK(gsr2_redraw_all_cb), gsr); //this works
+                      G_CALLBACK (gsr2_redraw_all_cb), gsr); //this works
 
+    // This will keep scrollbar in sync.
+    g_signal_connect (model, "scroll_sync",
+                      G_CALLBACK (gsr2_scroll_sync_cb), gsr);
+
     /* This triggers the update of the help text */
     g_signal_connect (view, "help_signal",
                       G_CALLBACK (gsr2_emit_help_changed), gsr); // this works
 
+    gsr2_scroll_value_changed_cb (GTK_ADJUSTMENT (gsr->scroll_adj), gsr);
+
+    /* This triggers the tooltip to change when scrolling */
+    g_signal_connect (gsr->scroll_adj, "value-changed",
+                      G_CALLBACK (gsr2_scroll_value_changed_cb), gsr); // this works
+
+    /* This triggers the model update when mouse button released */
+    g_signal_connect (gsr->scroll_bar, "button-release-event",
+                      G_CALLBACK (gsr2_scroll_button_event_cb), gsr);
+
+    s_model = gtk_tree_view_get_model (GTK_TREE_VIEW (view));
+
+    // Connect a call back to update the sort settings.
+    g_signal_connect (GTK_TREE_SORTABLE (s_model), "sort-column-changed",
+          G_CALLBACK (gnc_split_reg2_sort_changed_cb), gsr);
+
     LEAVE(" ");
 }
 
@@ -753,6 +800,56 @@
     return trans;
 }
 
+
+/* Sort changed callback */
+static void
+gnc_split_reg2_sort_changed_cb (GtkTreeSortable *sortable, gpointer user_data)
+{
+    Query *query;
+    GNCSplitReg2 *gsr = user_data;
+    GncTreeViewSplitReg *view;
+    GncTreeModelSplitReg *model; 
+    GtkSortType   type;
+    gint          sortcol;
+    gint          sort_depth;
+    const gchar  *gconf_section;
+
+    gtk_tree_sortable_get_sort_column_id (sortable, &sortcol, &type);
+    ENTER("sortcol is %d", sortcol);
+
+    view = gnc_ledger_display2_get_split_view_register (gsr->ledger);
+    model = gnc_ledger_display2_get_split_model_register (gsr->ledger);
+
+    query = gnc_ledger_display2_get_query (gsr->ledger);
+
+    sort_depth = gnc_tree_view_reg_get_selected_row_depth (view);
+    if (sort_depth != 0)
+        view->sort_depth = sort_depth;
+
+    view->sort_col = sortcol;
+    model->sort_col = sortcol;
+
+    if (type == GTK_SORT_DESCENDING)
+    {
+        view->sort_direction = -1;
+        model->sort_direction = -1;
+    }
+    else
+    {
+        view->sort_direction = 1;
+        model->sort_direction = 1;
+    }
+
+    /* Save the sort depth to gconf */
+    gconf_section = gnc_tree_view_get_gconf_section (GNC_TREE_VIEW (view));
+    gnc_gconf_set_int (gconf_section, "sort_depth", view->sort_depth, NULL);
+    gnc_gconf_set_int (gconf_section, "sort_col", view->sort_col, NULL);
+
+    LEAVE("v_sort_col %d, v_sort_direction is %d  v_sort_depth is %d", view->sort_col, view->sort_direction, view->sort_depth);
+
+    if (sortcol != -1)
+        gnc_ledger_display2_refresh (gsr->ledger);
+}
 /* ############################## End Handlers ############################ */
 
 void
@@ -1074,16 +1171,72 @@
     return gsr->window;
 }
 
-static
-void
-gsr2_emit_help_changed (GncTreeViewSplitReg *view, gpointer user_data) //this works
+static void
+gsr2_emit_help_changed (GncTreeViewSplitReg *view, gpointer user_data)
 {
     gsr2_emit_simple_signal ((GNCSplitReg2*)user_data, "help-changed" );
 }
 
+/* Callback to keep vertical scroll bar in sync */
+static void
+gsr2_scroll_sync_cb (GncTreeModelSplitReg *model, gpointer user_data)
+{
+    GNCSplitReg2 *gsr = user_data;
+    gint trans_position;
+
+    trans_position = model->position_of_trans_in_full_tlist;
+
+    gtk_adjustment_set_value (gsr->scroll_adj, trans_position);
+
+    gtk_adjustment_set_upper (gsr->scroll_adj, model->number_of_trans_in_full_tlist + 9);
+}
+
+static void
+gsr2_scroll_value_changed_cb (GtkAdjustment *adj, gpointer user_data)
+{
+    GNCSplitReg2 *gsr = user_data;
+    GncTreeModelSplitReg *model;
+    gchar *text;
+    gint  trans_position;
+
+    model = gnc_ledger_display2_get_split_model_register (gsr->ledger);
+
+    trans_position = gtk_adjustment_get_value (adj);
+
+    text = gnc_tree_model_split_reg_get_tooltip (model, trans_position);
+
+    g_object_set (gtk_widget_get_settings (gsr->scroll_bar), "gtk-tooltip-timeout", 2, NULL);
+
+    gtk_widget_set_tooltip_text (gsr->scroll_bar, text);
+
+    g_free (text);
+}
+
 static
+gboolean
+gsr2_scroll_button_event_cb (GtkWidget *widget, GdkEventButton *event, gpointer user_data)
+{
+    GNCSplitReg2 *gsr = user_data;
+    GncTreeModelSplitReg *model;
+    gint trans_position;
+
+    model = gnc_ledger_display2_get_split_model_register (gsr->ledger);
+
+    trans_position = gtk_adjustment_get_value (gsr->scroll_adj);
+
+    gnc_tree_model_split_reg_set_current_trans_by_position (model, trans_position);
+
+//FIXME should we store what it was...
+    g_object_set (gtk_widget_get_settings (gsr->scroll_bar), "gtk-tooltip-timeout", 500, NULL);
+
+    g_signal_emit_by_name (model, "refresh_trans");
+
+    return FALSE;
+}
+
+static
 void
-gsr2_emit_simple_signal (GNCSplitReg2 *gsr, const char *sigName) //this works
+gsr2_emit_simple_signal (GNCSplitReg2 *gsr, const char *sigName)
 {
     g_signal_emit_by_name( gsr, sigName, NULL );
 }

Modified: gnucash/trunk/src/gnome/gnc-split-reg2.h
===================================================================
--- gnucash/trunk/src/gnome/gnc-split-reg2.h	2013-08-02 17:55:10 UTC (rev 23111)
+++ gnucash/trunk/src/gnome/gnc-split-reg2.h	2013-08-02 17:55:26 UTC (rev 23112)
@@ -48,6 +48,8 @@
 
     /* The containing window. */
     GtkWidget *window;
+    GtkWidget *scroll_bar;
+    GtkAdjustment *scroll_adj;
 
     GtkWidget *toolbar;
     GtkWidget *summarybar;

Modified: gnucash/trunk/src/gnome-utils/gnc-tree-control-split-reg.c
===================================================================
--- gnucash/trunk/src/gnome-utils/gnc-tree-control-split-reg.c	2013-08-02 17:55:10 UTC (rev 23111)
+++ gnucash/trunk/src/gnome-utils/gnc-tree-control-split-reg.c	2013-08-02 17:55:26 UTC (rev 23112)
@@ -576,27 +576,38 @@
 }
 
 
-/* Jump to the Blank transaction, i.e. last in list */
-void
+/* Jump to the Blank transaction */
+gboolean
 gnc_tree_control_split_reg_jump_to_blank (GncTreeViewSplitReg *view)
 {
     GncTreeModelSplitReg *model;
     GtkTreePath *mpath, *spath;
+    Transaction *btrans;
 
     model = gnc_tree_view_split_reg_get_model_from_view (view);
 
-    mpath = gnc_tree_model_split_reg_get_path_to_split_and_trans (model, NULL, NULL);
+    btrans = gnc_tree_model_split_get_blank_trans (model);
 
-    spath = gnc_tree_view_split_reg_get_sort_path_from_model_path (view, mpath);
+    model->current_trans = btrans;
 
-    /* Set cursor to new spath */
-    gtk_tree_view_set_cursor (GTK_TREE_VIEW (view), spath, NULL, FALSE);
+    if (!gnc_tree_model_split_reg_trans_is_in_view (model, btrans))
+        g_signal_emit_by_name (model, "refresh_trans");
+    else
+    {
+        mpath = gnc_tree_model_split_reg_get_path_to_split_and_trans (model, NULL, btrans);
 
-    gtk_tree_path_free (spath);
-    gtk_tree_path_free (mpath);
+        spath = gnc_tree_view_split_reg_get_sort_path_from_model_path (view, mpath);
 
-    /* scroll when view idle */
-    g_idle_add ((GSourceFunc)gnc_tree_view_split_reg_scroll_to_cell, view );
+        /* Set cursor to new spath */
+        gtk_tree_view_set_cursor (GTK_TREE_VIEW (view), spath, NULL, FALSE);
+
+        gtk_tree_path_free (spath);
+        gtk_tree_path_free (mpath);
+
+        /* scroll when view idle */
+        g_idle_add ((GSourceFunc)gnc_tree_view_split_reg_scroll_to_cell, view );
+    }
+    return FALSE;
 }
 
 
@@ -655,6 +666,9 @@
     else
         gtk_tree_view_set_cursor (GTK_TREE_VIEW (view), spath, NULL, FALSE);
 
+    /* Scroll to cell, mid view */
+    gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (view), spath, NULL, TRUE, 0.5, 0.0);
+
     gtk_tree_path_free (spath);
     gtk_tree_path_free (mpath);
 }
@@ -2162,550 +2176,3 @@
     }
 }
 
-/*****************************************************************************
- *                             Sort Functions                                *
- *****************************************************************************/
-
-/* Sort changed callback */
-void
-gnc_tree_control_split_reg_sort_changed_cb (GtkTreeSortable *sortable, gpointer user_data)
-{
-    GncTreeViewSplitReg *view = GNC_TREE_VIEW_SPLIT_REG (user_data);
-    GtkSortType   type;
-    gint          sortcol;
-    gint          sort_depth;
-    const gchar  *gconf_section;
-
-    gtk_tree_sortable_get_sort_column_id (sortable, &sortcol, &type);
-    ENTER("sortcol is %d", sortcol);
-
-    sort_depth = gnc_tree_view_reg_get_selected_row_depth (view);
-    if (sort_depth != 0)
-        view->sort_depth = sort_depth;
-
-    view->sort_col = sortcol;
-
-    if (type == GTK_SORT_DESCENDING)
-        view->sort_direction = -1;
-    else
-        view->sort_direction = 1;
-
-    /* Save the sort depth to gconf */
-    gconf_section = gnc_tree_view_get_gconf_section (GNC_TREE_VIEW (view));
-    gnc_gconf_set_int (gconf_section, "sort_depth", view->sort_depth, NULL);
-
-    /* scroll when view idle */
-    g_idle_add ((GSourceFunc) gnc_tree_view_split_reg_scroll_to_cell, view);
-
-    /* Update the plugin page gui when idle */
-    g_idle_add ((GSourceFunc) gnc_tree_view_split_reg_call_uiupdate_cb, view);
-
-    LEAVE("sort_col %d, sort_direction is %d  sort_depth is %d", view->sort_col, view->sort_direction, view->sort_depth );
-}
-
-
-static GtkTreeModel *
-gtc_sr_sort_cb_filter_iters (GtkTreeModel *f_model,
-                       GtkTreeIter *f_iter_a,
-                       GtkTreeIter *f_iter_b,
-                       GtkTreeIter *iter_a,
-                       GtkTreeIter *iter_b)
-{
-    GtkTreeModel *model;
-
-    model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (f_model));
-    gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (f_model), iter_a, f_iter_a);
-    gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (f_model), iter_b, f_iter_b);
-    return model;
-}
-
-
-/* Sort function for Date column */
-gint
-gnc_tree_control_split_reg_sort_by_date (GtkTreeModel *fm, GtkTreeIter *fa, GtkTreeIter *fb,
-                  gpointer user_data)
-{
-    GncTreeModelSplitReg *model;
-    GncTreeViewSplitReg *view = GNC_TREE_VIEW_SPLIT_REG (user_data);
-    GtkTreeIter *ma = gtk_tree_iter_copy (fa);
-    GtkTreeIter *mb = gtk_tree_iter_copy (fb);
-    GList *tnodea, *tnodeb;
-    Account *anchor;
-    int depth;
-    time64 i, j;
-    int retval;
-
-    model = GNC_TREE_MODEL_SPLIT_REG (gtc_sr_sort_cb_filter_iters (fm, fa, fb, ma, mb));
-
-    if (gnc_tree_model_split_reg_is_blank_trans (model, ma))
-    {
-        gtk_tree_iter_free (ma);
-        gtk_tree_iter_free (mb);
-        return 1;
-    }
-
-    if (gnc_tree_model_split_reg_is_blank_trans (model, mb))
-    {
-        gtk_tree_iter_free (ma);
-        gtk_tree_iter_free (mb);
-        return -1;
-    }
-
-    tnodea = ma->user_data2;
-    tnodeb = mb->user_data2;
-
-    depth = view->sort_depth;
-
-    gtk_tree_iter_free (ma);
-    gtk_tree_iter_free (mb);
-
-    switch (depth) {
-        case 1: // Date Posted
-        retval = xaccTransOrder (tnodea->data, tnodeb->data);
-        if (retval)
-           return retval;
-        break;
-
-        case 2: // Date Entered
-        i = xaccTransGetDateEntered (tnodea->data);
-        j = xaccTransGetDateEntered (tnodeb->data);
-
-        if ((gint)(i - j) == 0)
-        {
-            i = xaccTransGetDate (tnodeb->data);
-            j = xaccTransGetDate (tnodea->data);
-        }
-
-        return (gint)(i - j);
-        break;
-
-        case 3: // Date Reconciled
-        anchor = gnc_tree_model_split_reg_get_anchor (model);
-
-        if (anchor != NULL)
-        {
-            i = xaccSplitGetDateReconciled (xaccTransFindSplitByAccount (tnodea->data, anchor))
-               ? xaccSplitGetDateReconciled (xaccTransFindSplitByAccount (tnodea->data, anchor)) : 0;
-            j = xaccSplitGetDateReconciled (xaccTransFindSplitByAccount (tnodeb->data, anchor))
-               ? xaccSplitGetDateReconciled (xaccTransFindSplitByAccount (tnodeb->data, anchor)) : 0;
-
-            if ((gint)(i - j) == 0)
-            {
-                i = xaccTransGetDate (tnodeb->data);
-                j = xaccTransGetDate (tnodea->data);
-            }
-            return (gint)(i - j);
-        }
-        else
-            return 0;
-        break;
-    }
-    return 0;
-}
-
-
-/* Sort function for Number / Action column */
-gint
-gnc_tree_control_split_reg_sort_by_numact (GtkTreeModel *fm, GtkTreeIter *fa, GtkTreeIter *fb,
-                  gpointer user_data)
-{
-    GncTreeModelSplitReg *model;
-    GncTreeViewSplitReg *view = GNC_TREE_VIEW_SPLIT_REG (user_data);
-    GtkTreeIter *ma = gtk_tree_iter_copy (fa);
-    GtkTreeIter *mb = gtk_tree_iter_copy (fb);
-    GList *tnodea, *tnodeb;
-    Account *anchor;
-    int depth;
-    time64 i, j;
-    int na, nb, retval;
-    const char *ca, *cb;
-
-    model = GNC_TREE_MODEL_SPLIT_REG (gtc_sr_sort_cb_filter_iters (fm, fa, fb, ma, mb));
-
-    if (gnc_tree_model_split_reg_is_blank_trans (model, ma))
-    {
-        gtk_tree_iter_free (ma);
-        gtk_tree_iter_free (mb);
-        return 1;
-    }
-
-    if (gnc_tree_model_split_reg_is_blank_trans (model, mb))
-    {
-        gtk_tree_iter_free (ma);
-        gtk_tree_iter_free (mb);
-        return -1;
-    }
-
-    tnodea = ma->user_data2;
-    tnodeb = mb->user_data2;
-
-    depth = view->sort_depth;
-
-    gtk_tree_iter_free (ma);
-    gtk_tree_iter_free (mb);
-
-//FIXME this may be needed for this one (!qof_book_use_split_action_for_num_field (gnc_get_current_book()))
-
-    switch (depth) {
-        case 1: // Number
-
-        na = atoi (xaccTransGetNum (tnodea->data));
-        nb = atoi (xaccTransGetNum (tnodeb->data));
-
-        if (na < nb) return -1;
-        if (na > nb) return +1;
-
-        break;
-        case 2: // Action
-
-        anchor = gnc_tree_model_split_reg_get_anchor (model);
-
-        if (anchor != NULL)
-        {
-            ca = xaccSplitGetAction (xaccTransFindSplitByAccount (tnodea->data, anchor))
-               ? xaccSplitGetAction (xaccTransFindSplitByAccount (tnodea->data, anchor)) : "";
-            cb = xaccSplitGetAction (xaccTransFindSplitByAccount (tnodeb->data, anchor))
-               ? xaccSplitGetAction (xaccTransFindSplitByAccount (tnodeb->data, anchor)) : "";
-        }
-        else
-            ca = cb = "Text";
-
-        retval = g_utf8_collate (ca, cb);
-        if (retval)
-           return retval;
-        break;
-    }
-    return 0;
-}
-
-
-/* Sort function for 'Description / Notes / Memo' column */
-gint
-gnc_tree_control_split_reg_sort_by_dnm (GtkTreeModel *fm, GtkTreeIter *fa, GtkTreeIter *fb,
-                  gpointer user_data)
-{
-    GncTreeModelSplitReg *model;
-    GncTreeViewSplitReg *view = GNC_TREE_VIEW_SPLIT_REG (user_data);
-    GtkTreeIter *ma = gtk_tree_iter_copy (fa);
-    GtkTreeIter *mb = gtk_tree_iter_copy (fb);
-    GList *tnodea, *tnodeb;
-    Account *anchor;
-    const char *ca, *cb;
-    int depth;
-    int retval;
-
-    model = GNC_TREE_MODEL_SPLIT_REG (gtc_sr_sort_cb_filter_iters (fm, fa, fb, ma, mb));
-
-    if (gnc_tree_model_split_reg_is_blank_trans (model, ma))
-    {
-        gtk_tree_iter_free (ma);
-        gtk_tree_iter_free (mb);
-        return 1;
-    }
-
-    if (gnc_tree_model_split_reg_is_blank_trans (model, mb))
-    {
-        gtk_tree_iter_free (ma);
-        gtk_tree_iter_free (mb);
-        return -1;
-    }
-
-    tnodea = ma->user_data2;
-    tnodeb = mb->user_data2;
-
-    depth = view->sort_depth;
-
-    gtk_tree_iter_free (ma);
-    gtk_tree_iter_free (mb);
-
-    switch (depth) {
-        case 1: // Description
-        ca = xaccTransGetDescription (tnodea->data) ? xaccTransGetDescription (tnodea->data) : "";
-        cb = xaccTransGetDescription (tnodeb->data) ? xaccTransGetDescription (tnodeb->data) : "";
-
-        retval = g_utf8_collate (ca, cb);
-        if (retval)
-           return retval;
-
-        break;
-        case 2: // Notes
-        ca = xaccTransGetNotes (tnodea->data) ? xaccTransGetNotes (tnodea->data) : "";
-        cb = xaccTransGetNotes (tnodeb->data) ? xaccTransGetNotes (tnodeb->data) : "";
-
-        retval = g_utf8_collate (ca, cb);
-        if (retval)
-           return retval;
-
-        break;
-        case 3: // Memo
-        anchor = gnc_tree_model_split_reg_get_anchor (model);
-
-        if (anchor != NULL)
-        {
-            ca = xaccSplitGetMemo (xaccTransFindSplitByAccount (tnodea->data, anchor))
-               ? xaccSplitGetMemo (xaccTransFindSplitByAccount (tnodea->data, anchor)) : "";
-            cb = xaccSplitGetMemo (xaccTransFindSplitByAccount (tnodeb->data, anchor))
-               ? xaccSplitGetMemo (xaccTransFindSplitByAccount (tnodeb->data, anchor)) : "";
-        }
-        else
-            ca = cb = "Text";
-
-        retval = g_utf8_collate (ca, cb);
-        if (retval)
-           return retval;
-
-        break;
-    }
-    return 0;
-}
-
-
-/* Sort function for Reconcile column */
-gint
-gnc_tree_control_split_reg_sort_by_recn (GtkTreeModel *fm, GtkTreeIter *fa, GtkTreeIter *fb,
-                  gpointer user_data)
-{
-    GncTreeModelSplitReg *model;
-    GncTreeViewSplitReg *view = GNC_TREE_VIEW_SPLIT_REG (user_data);
-    GtkTreeIter *ma = gtk_tree_iter_copy (fa);
-    GtkTreeIter *mb = gtk_tree_iter_copy (fb);
-    GList *tnodea, *tnodeb;
-    Account *anchor;
-    int depth;
-    int na = 0, nb = 0, retval;
-
-    model = GNC_TREE_MODEL_SPLIT_REG (gtc_sr_sort_cb_filter_iters (fm, fa, fb, ma, mb));
-
-    if (gnc_tree_model_split_reg_is_blank_trans (model, ma))
-    {
-        gtk_tree_iter_free (ma);
-        gtk_tree_iter_free (mb);
-        return 1;
-    }
-
-    if (gnc_tree_model_split_reg_is_blank_trans (model, mb))
-    {
-        gtk_tree_iter_free (ma);
-        gtk_tree_iter_free (mb);
-        return -1;
-    }
-
-    tnodea = ma->user_data2;
-    tnodeb = mb->user_data2;
-
-    depth = view->sort_depth;
-
-    gtk_tree_iter_free (ma);
-    gtk_tree_iter_free (mb);
-
-    anchor = gnc_tree_model_split_reg_get_anchor (model);
-
-    if (anchor != NULL)
-    {
-        Split *splita, *splitb;
-
-        splita = xaccTransFindSplitByAccount (tnodea->data, anchor);
-        splitb = xaccTransFindSplitByAccount (tnodeb->data, anchor);
-
-        switch (xaccSplitGetReconcile (splita))
-        {
-        case YREC:
-            na = 4;
-            break;
-        case FREC:
-            na = 3;
-            break;
-        case VREC:
-            na = 2;
-            break;
-        case NREC:
-            na = 1;
-            break;
-        case CREC:
-            na = 0;
-            break;
-
-        default:
-            break;
-        }
-
-        switch (xaccSplitGetReconcile (splitb))
-        {
-        case YREC:
-            nb = 4;
-            break;
-        case FREC:
-            nb = 3;
-            break;
-        case VREC:
-            nb = 2;
-            break;
-        case NREC:
-            nb = 1;
-            break;
-        case CREC:
-            nb = 0;
-            break;
-
-        default:
-            break;
-        }
-
-        if (na < nb) return -1;
-        if (na > nb) return +1;
-
-        retval = xaccTransOrder (tnodea->data, tnodeb->data);
-        if (retval)
-           return retval;
-    }
-    return 0;
-}
-
-
-/* Sort function for transfer column */
-gint
-gnc_tree_control_split_reg_sort_by_account (GtkTreeModel *fm, GtkTreeIter *fa, GtkTreeIter *fb,
-                  gpointer user_data)
-{
-    GncTreeModelSplitReg *model;
-    GncTreeViewSplitReg *view = GNC_TREE_VIEW_SPLIT_REG (user_data);
-    GtkTreeIter *ma = gtk_tree_iter_copy (fa);
-    GtkTreeIter *mb = gtk_tree_iter_copy (fb);
-    GList *tnodea, *tnodeb;
-    Account *anchor, *accounta, *accountb;
-    Split *splita, *splitb;
-    const char *ca, *cb;
-    int depth;
-    int retval;
-
-    model = GNC_TREE_MODEL_SPLIT_REG (gtc_sr_sort_cb_filter_iters (fm, fa, fb, ma, mb));
-
-    if (gnc_tree_model_split_reg_is_blank_trans (model, ma))
-    {
-        gtk_tree_iter_free (ma);
-        gtk_tree_iter_free (mb);
-        return 1;
-    }
-
-    if (gnc_tree_model_split_reg_is_blank_trans (model, mb))
-    {
-        gtk_tree_iter_free (ma);
-        gtk_tree_iter_free (mb);
-        return -1;
-    }
-
-    tnodea = ma->user_data2;
-    tnodeb = mb->user_data2;
-
-    depth = view->sort_depth;
-
-    gtk_tree_iter_free (ma);
-    gtk_tree_iter_free (mb);
-
-    anchor = gnc_tree_model_split_reg_get_anchor (model);
-
-    switch (depth) {
-        case 1: // Account Transfer
-        if (xaccTransCountSplits (tnodea->data) > 2) return 1;
-        if (xaccTransCountSplits (tnodeb->data) > 2) return -1;
-
-        if (anchor != NULL) // Registers and sub accounts.
-        {
-            // Get the split parent who has anchor as a parent, think of sub accounts.
-            accounta = gtc_sr_get_account_for_trans_ancestor (tnodea->data, anchor);
-            accountb = gtc_sr_get_account_for_trans_ancestor (tnodeb->data, anchor);
-
-            // Get the other split parent account.
-            splita = xaccSplitGetOtherSplit (xaccTransFindSplitByAccount(tnodea->data, accounta));
-            splitb = xaccSplitGetOtherSplit (xaccTransFindSplitByAccount(tnodeb->data, accountb));
-        }
-        else // General Ledger
-        {
-            // Get the first split in the transaction.
-            splita = xaccTransGetSplit (tnodea->data, 0);
-            splitb = xaccTransGetSplit (tnodeb->data, 0);
-        }
-
-        // Sort on split accounts.
-        retval = xaccAccountOrder (xaccSplitGetAccount (splita), xaccSplitGetAccount (splitb));
-        if (retval)
-            return retval;
-        break;
-
-        case 2: // Void Reason
-            ca = xaccTransGetVoidReason (tnodea->data) ? xaccTransGetVoidReason (tnodea->data) : "";
-            cb = xaccTransGetVoidReason (tnodeb->data) ? xaccTransGetVoidReason (tnodeb->data) : "";
-
-            retval = g_utf8_collate (ca, cb);
-            if (retval)
-               return retval;
-        break;
-    }
-    return 0;
-}
-
-
-/* Sort function for debit / credit column */
-gint
-gnc_tree_control_split_reg_sort_by_value (GtkTreeModel *fm, GtkTreeIter *fa, GtkTreeIter *fb,
-                  gpointer user_data)
-{
-    GncTreeModelSplitReg *model;
-    GncTreeViewSplitReg *view = GNC_TREE_VIEW_SPLIT_REG (user_data);
-    GtkTreeIter *ma = gtk_tree_iter_copy (fa);
-    GtkTreeIter *mb = gtk_tree_iter_copy (fb);
-    GList *tnodea, *tnodeb;
-    Account *anchor, *accounta, *accountb;
-    int depth;
-    int na = 0, nb = 0, retval;
-    gnc_numeric numa, numb;
-
-    model = GNC_TREE_MODEL_SPLIT_REG (gtc_sr_sort_cb_filter_iters (fm, fa, fb, ma, mb));
-
-    if (gnc_tree_model_split_reg_is_blank_trans (model, ma))
-    {
-        gtk_tree_iter_free (ma);
-        gtk_tree_iter_free (mb);
-        return 1;
-    }
-
-    if (gnc_tree_model_split_reg_is_blank_trans (model, mb))
-    {
-        gtk_tree_iter_free (ma);
-        gtk_tree_iter_free (mb);
-        return -1;
-    }
-
-    tnodea = ma->user_data2;
-    tnodeb = mb->user_data2;
-
-    depth = view->sort_depth;
-
-    gtk_tree_iter_free (ma);
-    gtk_tree_iter_free (mb);
-
-    anchor = gnc_tree_model_split_reg_get_anchor (model);
-
-    if (anchor != NULL) // Registers and sub accounts.
-    {
-        // Get the split parent who has anchor as a parent, think of sub accounts.
-        accounta = gtc_sr_get_account_for_trans_ancestor (tnodea->data, anchor);
-        accountb = gtc_sr_get_account_for_trans_ancestor (tnodeb->data, anchor);
-    }
-    else // General ledger
-    {
-        // Get the account of the first split.
-        accounta = xaccSplitGetAccount (xaccTransGetSplit (tnodea->data, 0));
-        accountb = xaccSplitGetAccount (xaccTransGetSplit (tnodeb->data, 0));
-    }
-
-    // Get the value based on accounts.
-    numa = xaccTransGetAccountValue (tnodea->data, accounta);
-    numb = xaccTransGetAccountValue (tnodeb->data, accountb);
-
-    retval = gnc_numeric_compare (numa, numb);
-    if (retval)
-        return retval;
-
-    return 0;
-}

Modified: gnucash/trunk/src/gnome-utils/gnc-tree-control-split-reg.h
===================================================================
--- gnucash/trunk/src/gnome-utils/gnc-tree-control-split-reg.h	2013-08-02 17:55:10 UTC (rev 23111)
+++ gnucash/trunk/src/gnome-utils/gnc-tree-control-split-reg.h	2013-08-02 17:55:26 UTC (rev 23112)
@@ -48,7 +48,7 @@
 
 void gnc_tree_control_split_reg_unvoid_current_trans (GncTreeViewSplitReg *view);
 
-void gnc_tree_control_split_reg_jump_to_blank (GncTreeViewSplitReg *view);
+gboolean gnc_tree_control_split_reg_jump_to_blank (GncTreeViewSplitReg *view);
 
 void gnc_tree_control_split_reg_jump_to (GncTreeViewSplitReg *view, Transaction *trans, Split *split, gboolean amount);
 
@@ -121,35 +121,6 @@
 
 /*****************************************************************************/
 
-/* Sort changed callback */
-void gnc_tree_control_split_reg_sort_changed_cb (GtkTreeSortable *sortable, gpointer user_data);
-
-/* Sort by date */
-gint gnc_tree_control_split_reg_sort_by_date (GtkTreeModel *fm, GtkTreeIter *fa, GtkTreeIter *fb,
-                       gpointer user_data);
-
-/* Sort by Description / Notes / Memo */
-gint gnc_tree_control_split_reg_sort_by_dnm (GtkTreeModel *fm, GtkTreeIter *fa, GtkTreeIter *fb,
-                       gpointer user_data);
-
-/* Sort function for Number / Action column */
-gint gnc_tree_control_split_reg_sort_by_numact (GtkTreeModel *fm, GtkTreeIter *fa, GtkTreeIter *fb,
-                  gpointer user_data);
-
-/* Sort function for Reconcile column */
-gint gnc_tree_control_split_reg_sort_by_recn (GtkTreeModel *fm, GtkTreeIter *fa, GtkTreeIter *fb,
-                  gpointer user_data);
-
-/* Sort function for transfer column */
-gint gnc_tree_control_split_reg_sort_by_account (GtkTreeModel *fm, GtkTreeIter *fa, GtkTreeIter *fb,
-                  gpointer user_data);
-
-/* Sort function for debit / credit column */
-gint gnc_tree_control_split_reg_sort_by_value (GtkTreeModel *fm, GtkTreeIter *fa, GtkTreeIter *fb,
-                  gpointer user_data);
-
-/*****************************************************************************/
-
 G_END_DECLS
 
 #endif /* __GNC_TREE_CONTROL_SPLIT_REG_H */

Modified: gnucash/trunk/src/gnome-utils/gnc-tree-model-split-reg.c
===================================================================
--- gnucash/trunk/src/gnome-utils/gnc-tree-model-split-reg.c	2013-08-02 17:55:10 UTC (rev 23111)
+++ gnucash/trunk/src/gnome-utils/gnc-tree-model-split-reg.c	2013-08-02 17:55:26 UTC (rev 23112)
@@ -46,16 +46,20 @@
 
 #define TREE_MODEL_SPLIT_REG_CM_CLASS "tree-model-split-reg"
 
+#define GCONF_SECTION "window/pages/register2"
+
 /* Signal codes */
 enum
 {
     REFRESH_TRANS,
     REFRESH_STATUS_BAR,
+    REFRESH_VIEW,
+    SCROLL_SYNC,
     SELECTION_MOVE_DELETE,
-    SELECTION_MOVE_FILTER,
     LAST_SIGNAL
 };
 
+
 /** Static Globals *******************************************************/
 static QofLogModule log_module = GNC_MOD_LEDGER;
 
@@ -86,6 +90,10 @@
 static gboolean	gnc_tree_model_split_reg_iter_parent (GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *child);
 static void gtm_sr_increment_stamp (GncTreeModelSplitReg *model);
 
+
+static void gtm_sr_insert_trans (GncTreeModelSplitReg *model, Transaction *trans, gboolean before);
+static void gtm_sr_delete_trans (GncTreeModelSplitReg *model, Transaction *trans);
+
 /** Component Manager Callback ******************************************/
 static void gnc_tree_model_split_reg_event_handler (QofInstance *entity, QofEventId event_type, GncTreeModelSplitReg *model, GncEventData *ed);
 
@@ -95,7 +103,9 @@
     QofBook *book;                   // GNC Book
     Account *anchor;                 // Account of register
 
-    GList *tlist;                    // List of unique transactions derived from the query slist in same order
+    GList *full_tlist;               // List of unique transactions derived from the query slist in same order
+    GList *tlist;                    // List of unique transactions derived from the full_tlist to display in same order
+    gint   tlist_start;              // The position of the first transaction in tlist in the full_tlist
 
     Transaction *btrans;             // The Blank transaction
 
@@ -127,7 +137,6 @@
 #define SPLITROW "#EDE7D3"
 #define YELLOWROW "#FFEF98"
 
-
 #define TROW1 0x1 // Transaction row 1 depth 1
 #define TROW2 0x2 // Transaction row 2 depth 2
 #define SPLIT 0x4 // Split row         depth 3
@@ -294,6 +303,24 @@
                      g_cclosure_marshal_VOID__VOID,
                      G_TYPE_NONE, 0);
 
+    gnc_tree_model_split_reg_signals[REFRESH_VIEW] =
+        g_signal_new("refresh_view",
+                     G_TYPE_FROM_CLASS (o_class),
+                     G_SIGNAL_RUN_LAST,
+                     G_STRUCT_OFFSET (GncTreeModelSplitRegClass, refresh_view),
+                     NULL, NULL,
+                     g_cclosure_marshal_VOID__VOID,
+                     G_TYPE_NONE, 0);
+
+    gnc_tree_model_split_reg_signals[SCROLL_SYNC] =
+        g_signal_new("scroll_sync",
+                     G_TYPE_FROM_CLASS (o_class),
+                     G_SIGNAL_RUN_LAST,
+                     G_STRUCT_OFFSET (GncTreeModelSplitRegClass, scroll_sync),
+                     NULL, NULL,
+                     g_cclosure_marshal_VOID__VOID,
+                     G_TYPE_NONE, 0);
+
     gnc_tree_model_split_reg_signals[SELECTION_MOVE_DELETE] =
         g_signal_new("selection_move_delete",
                      G_TYPE_FROM_CLASS (o_class),
@@ -305,21 +332,11 @@
                      1,
                      G_TYPE_POINTER);
 
-    gnc_tree_model_split_reg_signals[SELECTION_MOVE_FILTER] =
-        g_signal_new("selection_move_filter",
-                     G_TYPE_FROM_CLASS (o_class),
-                     G_SIGNAL_RUN_FIRST,
-                     G_STRUCT_OFFSET (GncTreeModelSplitRegClass, selection_move_filter),
-                     NULL, NULL,
-                     g_cclosure_marshal_VOID__POINTER,
-                     G_TYPE_NONE,
-                     1,
-                     G_TYPE_POINTER);
-
     klass->refresh_trans = NULL;
     klass->refresh_status_bar = NULL;
+    klass->refresh_view = NULL;
+    klass->scroll_sync = NULL;
     klass->selection_move_delete = NULL;
-    klass->selection_move_filter = NULL;
 }
 
 
@@ -408,9 +425,15 @@
     }
 
     priv->book = NULL;
+
+    /* Free the tlist */
     g_list_free (priv->tlist);
     priv->tlist = NULL;
 
+    /* Free the full_tlist */
+    g_list_free (priv->full_tlist);
+    priv->full_tlist = NULL;
+
     /* Free the blank split */
     priv->bsplit = NULL;
     priv->bsplit_node = NULL;
@@ -453,6 +476,13 @@
     model->use_double_line = use_double_line;
     model->is_template = is_template;
 
+    model->sort_col = 1;
+    model->sort_depth = 1;
+    model->sort_direction = 1;
+
+    model->current_trans = NULL;
+    model->current_row = -1;
+
     /* Setup the blank transaction */
     priv->btrans = xaccMallocTransaction (priv->book);
 
@@ -522,11 +552,72 @@
     g_list_free (rr_list);
 }
 
+static void
+gtm_sr_reg_load (GncTreeModelSplitReg *model, GncTreeModelSplitRegUpdate model_update, gint num_of_rows)
+{
+    GncTreeModelSplitRegPrivate *priv;
+    GList *node;
+    gint rows = 0;
+
+    priv = model->priv;
+
+    if (model_update == VIEW_HOME)
+    {
+        priv->tlist_start = 0;
+
+        for (node = g_list_nth (priv->full_tlist, priv->tlist_start); node; node = node->next)
+        {
+            Transaction *trans = node->data;
+
+            priv->tlist = g_list_append (priv->tlist, trans);
+            rows++;
+
+            if (rows == num_of_rows)
+                break;
+        } 
+    }
+    
+    if (model_update == VIEW_END)
+    {
+        priv->tlist_start = g_list_length (priv->full_tlist) - num_of_rows;
+
+        for (node = g_list_nth (priv->full_tlist, priv->tlist_start); node; node = node->next)
+        {
+            Transaction *trans = node->data;
+
+            priv->tlist = g_list_append (priv->tlist, trans);
+            rows++;
+
+            if (rows == num_of_rows)
+                break;
+        } 
+    }
+
+    if (model_update == VIEW_GOTO)
+    {
+        priv->tlist_start = num_of_rows - NUM_OF_TRANS*1.5;
+
+        for (node = g_list_nth (priv->full_tlist, priv->tlist_start); node; node = node->next)
+        {
+            Transaction *trans = node->data;
+
+            priv->tlist = g_list_append (priv->tlist, trans);
+            rows++;
+
+            if (rows == (NUM_OF_TRANS*3))
+                break;
+        } 
+    }
+}
+
+
 /* Load the model with unique transactions based on a GList of splits */
 void
 gnc_tree_model_split_reg_load (GncTreeModelSplitReg *model, GList *slist, Account *default_account)
 {
     GncTreeModelSplitRegPrivate *priv;
+    GList *node;
+    gint rows = 0;
 
     ENTER("#### Load ModelSplitReg = %p and slist length is %d ####", model, g_list_length (slist));
 
@@ -534,19 +625,57 @@
 
     /* Clear the treeview */
     gtm_sr_remove_all_rows (model);
+    priv->full_tlist = NULL;
     priv->tlist = NULL;
 
-    /* Get a list of Unique Transactions from an slist */
-    priv->tlist = xaccSplitListGetUniqueTransactions (slist);
+    if (model->current_trans == NULL)
+        model->current_trans = priv->btrans;
 
-    /* Add the blank transaction to the tlist */
-    priv->tlist = g_list_append (priv->tlist, priv->btrans);
+    if (model->sort_direction == 1) // ascending
+    {
+        /* Get a list of Unique Transactions from an slist */
+        priv->full_tlist = xaccSplitListGetUniqueTransactions (slist);
 
-    PINFO("#### Register for Account '%s' has %d transactions and %d splits ####",
-          default_account ? xaccAccountGetName (default_account) : "NULL", g_list_length (priv->tlist), g_list_length (slist));
+        /* Add the blank transaction to the full_tlist */
+        priv->full_tlist = g_list_append (priv->full_tlist, priv->btrans);
+    }
+    else
+    {
+        /* Get a list of Unique Transactions from an slist */
+        priv->full_tlist = xaccSplitListGetUniqueTransactions (slist);
 
+        /* Add the blank transaction to the full_tlist */
+        priv->full_tlist = g_list_append (priv->full_tlist, priv->btrans);
+
+        /* Reverse the full_tlist */
+        priv->full_tlist = g_list_reverse (priv->full_tlist);
+    }
+
+    // Update the scrollbar
+    gnc_tree_model_split_reg_sync_scrollbar (model);
+
+    model->number_of_trans_in_full_tlist = g_list_length (priv->full_tlist);
+
+    if (g_list_length (priv->full_tlist) < NUM_OF_TRANS*3)
+    {
+        // Copy the full_tlist to tlist
+        priv->tlist = g_list_copy (priv->full_tlist);
+    }
+    else
+    {
+        if (model->position_of_trans_in_full_tlist < (NUM_OF_TRANS*3))
+            gtm_sr_reg_load (model, VIEW_HOME, NUM_OF_TRANS*3);
+        else if (model->position_of_trans_in_full_tlist > g_list_length (priv->full_tlist) - (NUM_OF_TRANS*3))
+            gtm_sr_reg_load (model, VIEW_END, NUM_OF_TRANS*3);
+        else
+            gtm_sr_reg_load (model, VIEW_GOTO, model->position_of_trans_in_full_tlist);
+    }
+
+    PINFO("#### Register for Account '%s' has %d transactions and %d splits and tlist is %d ####",
+          default_account ? xaccAccountGetName (default_account) : "NULL", g_list_length (priv->full_tlist), g_list_length (slist), g_list_length (priv->tlist));
+
     /* Update the completion model liststores */
-    gnc_tree_model_split_reg_update_completion (model);
+    g_idle_add ((GSourceFunc) gnc_tree_model_split_reg_update_completion, model);
 
     priv->anchor = default_account;
     priv->bsplit_parent_node = NULL;
@@ -555,6 +684,220 @@
 }
 
 
+void
+gnc_tree_model_split_reg_move (GncTreeModelSplitReg *model, GncTreeModelSplitRegUpdate model_update)
+{
+    GncTreeModelSplitRegPrivate *priv;
+    GList *inode, *dnode;
+    gint rows = 0;
+    gint icount = 0;
+    gint dcount = 0;
+
+    priv = model->priv;
+
+    // if list is not long enougth, return
+    if (g_list_length (priv->full_tlist) < NUM_OF_TRANS*3)
+        return;
+
+    if ((model_update == VIEW_UP) && (model->current_row < NUM_OF_TRANS) && (priv->tlist_start > 0))
+    {
+        gint dblock_end = 0;
+        gint iblock_start = priv->tlist_start - NUM_OF_TRANS;
+        gint iblock_end = priv->tlist_start - 1;
+        gint dblock_start = priv->tlist_start + NUM_OF_TRANS*2;
+
+        if (iblock_start < 0)
+            iblock_start = 0;
+
+        icount = iblock_end - iblock_start + 1;
+
+        dcount = icount;
+        dblock_end = dblock_start + dcount - 1;
+
+        priv->tlist_start = iblock_start;
+
+        // Insert at the front end
+        for (inode = g_list_nth (priv->full_tlist, iblock_end); inode; inode = inode->prev)
+        {
+            Transaction *trans = inode->data;
+
+            gtm_sr_insert_trans (model, trans, TRUE);
+
+            rows++;
+
+            if (rows == icount)
+                break;
+        }
+        rows = 0;
+        // Delete at the back end
+        for (dnode = g_list_nth (priv->full_tlist, dblock_end); dnode; dnode = dnode->prev)
+        {
+            Transaction *trans = dnode->data;
+
+            gtm_sr_delete_trans (model, trans);
+
+            rows++;
+
+            if (rows == dcount)
+                break;
+        }
+        g_signal_emit_by_name (model, "refresh_view");
+    }
+
+    if ((model_update == VIEW_DOWN) && (model->current_row > NUM_OF_TRANS*2) && (priv->tlist_start < (g_list_length (priv->full_tlist) - NUM_OF_TRANS*3 )))
+    {
+        gint dblock_end = 0;
+        gint iblock_start = priv->tlist_start + NUM_OF_TRANS*3;
+        gint iblock_end = iblock_start + NUM_OF_TRANS - 1;
+        gint dblock_start = priv->tlist_start;
+
+        if (iblock_start < 0)
+            iblock_start = 0;
+
+        if (iblock_end > g_list_length (priv->full_tlist))
+            iblock_end = g_list_length (priv->full_tlist) - 1;
+
+        icount = iblock_end - iblock_start + 1;
+
+        dcount = icount;
+        dblock_end = dblock_start + dcount;
+
+        priv->tlist_start = dblock_end;
+
+        // Insert at the back end
+        for (inode = g_list_nth (priv->full_tlist, iblock_start); inode; inode = inode->next)
+        {
+            Transaction *trans = inode->data;
+
+            gtm_sr_insert_trans (model, trans, FALSE);
+
+            rows++;
+
+            if (rows == icount)
+                break;
+        }
+        rows = 0;
+        // Delete at the front end
+        for (dnode = g_list_nth (priv->full_tlist, dblock_start); dnode; dnode = dnode->next)
+        {
+            Transaction *trans = dnode->data;
+
+            gtm_sr_delete_trans (model, trans);
+
+            rows++;
+
+            if (rows == dcount)
+                break;
+        }
+        g_signal_emit_by_name (model, "refresh_view");
+    }
+}
+
+
+/* Return the first transaction, opposite to blank transaction in the full list. */
+Transaction *
+gnc_tree_model_split_reg_get_first_trans (GncTreeModelSplitReg *model)
+{
+    GncTreeModelSplitRegPrivate *priv;
+    GList *node;
+    Transaction *trans;
+
+    priv = model->priv;
+
+    node = g_list_first (priv->full_tlist);
+
+    trans = node->data;
+
+    if (trans == priv->btrans)
+    {
+        node = g_list_last (priv->full_tlist);
+        trans = node->data;
+    }
+    return trans;
+}
+
+
+/* Return TRUE if transaction is in the view list. */
+gboolean
+gnc_tree_model_split_reg_trans_is_in_view (GncTreeModelSplitReg *model, Transaction *trans)
+{
+    GncTreeModelSplitRegPrivate *priv;
+
+    priv = model->priv;
+
+    if (g_list_index (priv->tlist, trans) == -1)
+        return FALSE;
+    else
+        return TRUE;
+}
+
+
+/* Return the tooltip for transaction at position in full_tlist. */
+gchar * 
+gnc_tree_model_split_reg_get_tooltip (GncTreeModelSplitReg *model, gint position)
+{
+    GncTreeModelSplitRegPrivate *priv;
+    Transaction *trans;
+    const gchar *date_text;
+    const gchar *desc_text;
+    Timespec ts = {0,0};
+    GList *node;
+
+    priv = model->priv;
+
+    node = g_list_nth (priv->full_tlist, position);
+    if (node == NULL)
+       return g_strconcat ("Error", NULL);
+    else
+    {
+        trans = node->data;
+        if (trans == NULL)
+           return g_strconcat ("Error", NULL);
+        else if (trans == priv->btrans)
+           return g_strconcat ("Blank Transaction", NULL);
+        else
+        {
+            xaccTransGetDatePostedTS (trans, &ts);
+            date_text = gnc_print_date (ts);
+            desc_text = xaccTransGetDescription (trans);
+            model->current_trans = trans;
+            return g_strconcat (date_text, "\n", desc_text, NULL);
+        }
+    }
+}
+
+
+/* Set the current transaction to that at position in full_tlist */
+void
+gnc_tree_model_split_reg_set_current_trans_by_position (GncTreeModelSplitReg *model, gint position)
+{
+    GncTreeModelSplitRegPrivate *priv;
+    GList *node;
+
+    priv = model->priv;
+
+    node = g_list_nth (priv->full_tlist, position);
+    if (node == NULL)
+        node = g_list_last (priv->full_tlist);
+
+    model->current_trans = node->data;
+}
+
+
+/* Sync the vertical scrollbar to position in full_tlist. */
+void
+gnc_tree_model_split_reg_sync_scrollbar (GncTreeModelSplitReg *model)
+{
+    GncTreeModelSplitRegPrivate *priv;
+
+    priv = model->priv;
+
+    model->position_of_trans_in_full_tlist = g_list_index (priv->full_tlist, model->current_trans);
+
+    g_signal_emit_by_name (model, "scroll_sync");
+}
+
+
 /* Set the template account for this register. */
 void
 gnc_tree_model_split_reg_set_template_account (GncTreeModelSplitReg *model, Account *template_account)
@@ -651,6 +994,156 @@
     return model->priv->display_subacc;
 }
 
+
+void
+gnc_tree_model_split_reg_default_query (GncTreeModelSplitReg *model, Account *default_account, Query *query)
+{
+    gchar *gconf_key;
+    const GncGUID * guid;
+    const gchar *gconf_section;
+    const gchar *sort_string;
+    gint  depth, col;
+    
+    guid = xaccAccountGetGUID (default_account);
+
+    /* Used for saving different register column widths under seperate keys */
+    if (model->priv->display_subacc == TRUE)
+        gconf_key = g_strconcat (GCONF_SECTION,"/", (gchar*)guid_to_string (guid), "_sub", NULL);
+    else
+        gconf_key = g_strconcat (GCONF_SECTION,"/", (gchar*)guid_to_string (guid), NULL);
+ 
+    // We need to give the General Ledger a Key other than all zeros which the search register gets.
+    if (model->priv->display_gl == TRUE && model->type == GENERAL_LEDGER2)
+        gconf_key = g_strconcat (GCONF_SECTION,"/", "00000000000000000000000000000001", NULL);
+
+    /* Restore the sort column from gconf */
+    col = gnc_gconf_get_int (gconf_key, "sort_col", NULL);
+    if (col == 0)    
+        model->sort_col = 1;
+    else
+        model->sort_col = col;
+
+    /* Restore the sort depth from gconf */
+    depth = gnc_gconf_get_int (gconf_key, "sort_depth", NULL);
+    if (depth == 0)
+        model->sort_depth = 1;
+    else
+        model->sort_depth = depth;
+
+    /* Restore the sort order from gconf */
+    sort_string = gnc_gconf_get_string (gconf_key, "sort_order", NULL);
+    if (g_strcmp0 ("descending", sort_string) == 0)
+        model->sort_direction = -1;
+    else
+        model->sort_direction = 1;
+
+    gnc_tree_model_split_reg_update_query (model, query);
+}
+
+
+void
+gnc_tree_model_split_reg_update_query (GncTreeModelSplitReg *model, Query *query)
+{
+    GSList *p1 = NULL, *p2 = NULL, *p3 = NULL, *standard;
+
+    time64 start;
+    struct tm tm;
+
+    standard = g_slist_prepend (NULL, QUERY_DEFAULT_SORT);
+
+    PINFO("## gnc_tree_model_split_reg_update_query - query is %p ##", query);
+
+    switch (model->sort_col)
+    {
+        case GNC_TREE_MODEL_SPLIT_REG_COL_DATE:
+            if (model->sort_depth == 1)
+            {
+                p1 = g_slist_prepend (p1, TRANS_DATE_POSTED);
+                p1 = g_slist_prepend (p1, SPLIT_TRANS);
+                p2 = standard;
+            }
+            else if (model->sort_depth == 2)
+            {
+                p1 = g_slist_prepend (p1, TRANS_DATE_ENTERED);
+                p1 = g_slist_prepend (p1, SPLIT_TRANS);
+                p2 = standard;
+            }
+            else if (model->sort_depth == 3)
+            {
+                p1 = g_slist_prepend (p1, SPLIT_RECONCILE);
+                p1 = g_slist_prepend (p2, SPLIT_DATE_RECONCILED);
+                p2 = standard;
+            }
+            break;
+
+        case GNC_TREE_MODEL_SPLIT_REG_COL_DESCNOTES:
+            if (model->sort_depth == 1)
+            {
+                p1 = g_slist_prepend (p1, TRANS_DESCRIPTION);
+                p1 = g_slist_prepend (p1, SPLIT_TRANS);
+                p2 = standard;
+            }
+            else if (model->sort_depth == 2)
+            {
+                p1 = g_slist_prepend (p1, TRANS_NOTES);
+                p1 = g_slist_prepend (p1, SPLIT_TRANS);
+                p2 = standard;
+            }
+            else if (model->sort_depth == 3)
+            {
+                p1 = g_slist_prepend (p1, SPLIT_MEMO);
+                p2 = standard;
+            }
+            break;
+
+        case GNC_TREE_MODEL_SPLIT_REG_COL_NUMACT:
+            if (model->sort_depth == 1)
+            {
+                p1 = g_slist_prepend (p1, TRANS_NUM);
+                p1 = g_slist_prepend (p1, SPLIT_TRANS);
+                p2 = standard;
+            }
+            else if ((model->sort_depth == 2) || (model->sort_depth == 3))
+            {
+                p1 = g_slist_prepend (p1, SPLIT_ACTION);
+                p2 = standard;
+            }
+            break;
+
+        case GNC_TREE_MODEL_SPLIT_REG_COL_RECN:
+            {
+                p1 = g_slist_prepend (p1, SPLIT_RECONCILE);
+                p1 = g_slist_prepend (p2, SPLIT_DATE_RECONCILED);
+                p2 = standard;
+            }
+            break;
+
+        case GNC_TREE_MODEL_SPLIT_REG_COL_DEBIT:
+        case GNC_TREE_MODEL_SPLIT_REG_COL_CREDIT:
+            {
+                p1 = g_slist_prepend (p1, SPLIT_VALUE);
+                p2 = standard;
+            }
+            break;
+
+        default:
+            p1 = standard;
+            break;
+    }
+
+    //FIXME Not sure why I need to do this, refresh / sort change segfaults on gl
+    if (model->priv->display_gl == TRUE && model->type == GENERAL_LEDGER2)
+    {
+        gnc_tm_get_today_start(&tm);
+        tm.tm_mon--; /* Default the register to the last month's worth of transactions. */
+        start = gnc_mktime (&tm);
+        xaccQueryAddDateMatchTT (query, TRUE, start, FALSE, 0, QOF_QUERY_AND);
+    }
+
+    qof_query_set_sort_order (query, p1, p2, p3);
+
+}
+
 /************************************************************/
 /*        Gnc Tree Model Debugging Utility Function         */
 /************************************************************/
@@ -768,7 +1261,6 @@
         return G_TYPE_STRING;
 
     case GNC_TREE_MODEL_SPLIT_REG_COL_RO:
-    case GNC_TREE_MODEL_SPLIT_REG_COL_FILTER_VIS:
     case GNC_TREE_MODEL_SPLIT_REG_COL_NUM_VIS:
     case GNC_TREE_MODEL_SPLIT_REG_COL_ACT_VIS:
         return G_TYPE_BOOLEAN;
@@ -970,31 +1462,7 @@
 }
 
 
-/* Return the split account for which ancestor is it's parent */
-static Account *
-gtm_sr_trans_get_account_for_splits_ancestor (const Transaction *trans, const Account *ancestor)
-{
-    GList *node;
-
-    for (node = xaccTransGetSplitList (trans); node; node = node->next)
-    {
-        Split *split = node->data;
-        Account *split_acc = xaccSplitGetAccount (split);
-
-        if (!xaccTransStillHasSplit (trans, split))
-            continue;
-
-        if (ancestor == split_acc)
-            return split_acc;
-
-        if (ancestor && xaccAccountHasAncestor (split_acc, ancestor))
-            return split_acc;
-    }
-    return NULL;
-}
-
-
-/* Decide which render should be shown in the NUM/ACT column */
+/* Decide which renderer should be shown in the NUM/ACT column */
 static gboolean
 gnc_tree_model_split_reg_get_numact_vis (GncTreeModelSplitReg *model, gboolean trow1, gboolean trow2)
 {
@@ -1014,91 +1482,6 @@
 }
 
 
-/* Return FALSE if this row should not be shown */
-static gboolean
-gnc_tree_model_split_reg_get_filter_vis (GncTreeModelSplitReg *model, Transaction *trans, gboolean trow1)
-{
-    gboolean return_value = FALSE;
-    char chars[6];
-    int i = 0;
-    time64 date_posted;
-    Account *account;
-
-    if (trans == model->priv->btrans) // Blank trans is always visable.
-       return TRUE;
-
-    // Get the posted date
-    date_posted = xaccTransGetDate (trans);
-
-    // Test for posted date earlier than start date.
-    if ((date_posted < model->filter_start_time) && trow1 == TRUE)
-    {
-        g_signal_emit_by_name (model, "selection_move_filter", trans);
-        return FALSE;
-    }
-
-    // Test for posted date later than end date.
-    if ((model->filter_end_time > 0) && (date_posted > model->filter_end_time) && trow1 == TRUE)
-    {
-        g_signal_emit_by_name (model, "selection_move_filter", trans);
-        return FALSE;
-    }
-
-    // Test for default status flag.
-    if (model->filter_cleared_match == CLEARED_ALL)
-        return TRUE;
-
-     // Test for the status field.
-    if (model->filter_cleared_match & CLEARED_CLEARED)
-        chars[i++] = CREC;
-    if (model->filter_cleared_match & CLEARED_RECONCILED)
-        chars[i++] = YREC;
-    if (model->filter_cleared_match & CLEARED_FROZEN)
-        chars[i++] = FREC;
-    if (model->filter_cleared_match & CLEARED_NO)
-        chars[i++] = NREC;
-    if (model->filter_cleared_match & CLEARED_VOIDED)
-        chars[i++] = VREC;
-    chars[i] = '\0';
-
-    // Test for sub account register, if so, check split accounts against ancestor
-    if (model->priv->display_subacc)
-        account = gtm_sr_trans_get_account_for_splits_ancestor (trans, model->priv->anchor);
-    else
-        account = model->priv->anchor;
-
-    if (account != NULL) // Normal Register and Subaccounts
-    {
-        // Loop through splits checking state.
-        for (i = 0; i < 5; i++)
-        {
-            if (xaccTransHasSplitsInStateByAccount (trans, chars[i], account))
-            {
-                return_value = TRUE;
-                break;
-            }
-        }
-    }
-    else // General Register
-    {
-        // Loop through splits checking state.
-        for (i = 0; i < 5; i++)
-        {
-            if (xaccTransHasSplitsInState (trans, chars[i]))
-            {
-                return_value = TRUE;
-                break;
-            }
-        }
-    }
-
-    if (return_value == FALSE && trow1 == TRUE)
-        g_signal_emit_by_name (model, "selection_move_filter", trans);
-
-    return return_value;
-}
-
-
 /* Return TRUE if this row should be marked read only */
 gboolean
 gnc_tree_model_split_reg_get_read_only (GncTreeModelSplitReg *model, Transaction *trans)
@@ -1239,10 +1622,6 @@
             g_value_set_boolean (value, gnc_tree_model_split_reg_get_read_only (model, tnode->data));
         break;
 
-    case GNC_TREE_MODEL_SPLIT_REG_COL_FILTER_VIS:
-            g_value_set_boolean (value, gnc_tree_model_split_reg_get_filter_vis (model, tnode->data, IS_TROW1(iter)));
-        break;
-
     case GNC_TREE_MODEL_SPLIT_REG_COL_NUM_VIS:
             g_value_set_boolean (value, gnc_tree_model_split_reg_get_numact_vis (model, IS_TROW1(iter), IS_TROW2(iter)));
         break;
@@ -1274,11 +1653,6 @@
 
     ENTER("model %p, iter %s", tree_model, iter_to_string (iter));
 
-    if (IS_BLANK (iter)) {
-        LEAVE("Blanks never have a next");
-        goto fail;
-    }
-
     if (IS_TROW2 (iter)) {
         LEAVE("Transaction row 2 never has a next");
         goto fail;
@@ -1327,6 +1701,11 @@
         flags = SPLIT;
         tnode = iter->user_data2;
 
+        if (IS_BLANK (iter)) {
+            LEAVE("Blank split never has a next");
+            goto fail;
+        }
+
         slist = xaccTransGetSplitList (tnode->data);
         snode = iter->user_data3;
 
@@ -1788,7 +2167,7 @@
 
 
 /* Return the tree path of trans and split
-   if trans and split NULL, return last in list */
+   if trans and split NULL, return blank trans in list */
 GtkTreePath *
 gnc_tree_model_split_reg_get_path_to_split_and_trans (GncTreeModelSplitReg *model, Split *split, Transaction *trans)
 {
@@ -1805,7 +2184,13 @@
     if (trans == NULL && split == NULL)
     {
         gchar *path_string;
-        gtk_tree_path_append_index (path, number);
+
+        /* Level 1 */
+        tpos = g_list_index (model->priv->tlist, model->priv->btrans);
+        if (tpos == -1)
+            tpos = number;
+        gtk_tree_path_append_index (path, tpos);
+
         path_string = gtk_tree_path_to_string (path);
         LEAVE("path is %s", path_string);
         g_free (path_string);
@@ -1923,6 +2308,26 @@
     return model->priv->btrans;
 }
 
+
+/* Dummy Sort function */
+gint
+gnc_tree_model_split_reg_sort_iter_compare_func (GtkTreeModel *tm,
+                          GtkTreeIter  *a,
+                          GtkTreeIter  *b,
+                          gpointer      user_data)
+{
+    GncTreeModelSplitReg *model = GNC_TREE_MODEL_SPLIT_REG (tm);
+
+    /* This is really a dummy sort function, it leaves the list as is. */
+
+    if (model->sort_direction == 1) // Ascending
+        return gtk_tree_path_compare (gnc_tree_model_split_reg_get_path (tm, a),
+                                      gnc_tree_model_split_reg_get_path (tm, b));
+    else
+        return gtk_tree_path_compare (gnc_tree_model_split_reg_get_path (tm, b),
+                                      gnc_tree_model_split_reg_get_path (tm, a));
+}
+
 /*##########################################################################*/
 
 /* Update the parent when row changes made */
@@ -2065,14 +2470,17 @@
 
 /* Insert transaction into model */
 static void
-gtm_sr_insert_trans (GncTreeModelSplitReg *model, Transaction *trans)
+gtm_sr_insert_trans (GncTreeModelSplitReg *model, Transaction *trans, gboolean before)
 {
     GtkTreeIter iter;
     GtkTreePath *path;
     GList *tnode = NULL, *snode = NULL;
 
     ENTER("insert transaction %p into model %p", trans, model);
-    model->priv->tlist = g_list_prepend (model->priv->tlist, trans);
+    if (before == TRUE)
+        model->priv->tlist = g_list_prepend (model->priv->tlist, trans);
+    else
+        model->priv->tlist = g_list_append (model->priv->tlist, trans);
     tnode = g_list_find (model->priv->tlist, trans);
 
     iter = gtm_sr_make_iter (model, TROW1, tnode, NULL);
@@ -2375,6 +2783,7 @@
     return model->priv->account_list;
 }
 
+//FIXME Is this the best way to check for duplicates ??
 
 /* Return TRUE if string already exists in the list */
 static gboolean
@@ -2436,9 +2845,9 @@
     
         /* Add to the Description list */
         string = xaccTransGetDescription (tnode->data);
-        if(g_strcmp0 (string, ""))
+        if (g_strcmp0 (string, ""))
         {
-            if(gtm_sr_check_for_duplicates (priv->description_list, string) == FALSE)
+            if (gtm_sr_check_for_duplicates (priv->description_list, string) == FALSE)
             {
                 gtk_list_store_append (priv->description_list, &d_iter);
                 gtk_list_store_set (priv->description_list, &d_iter, 0, string, 1, tnode->data, -1);
@@ -2447,9 +2856,9 @@
 
         /* Add to the Notes list */
         string = xaccTransGetNotes (tnode->data);
-        if(g_strcmp0 (string, ""))
+        if (g_strcmp0 (string, ""))
         {
-            if(gtm_sr_check_for_duplicates (priv->notes_list, string) == FALSE)
+            if (gtm_sr_check_for_duplicates (priv->notes_list, string) == FALSE)
             {
                 gtk_list_store_append (priv->notes_list, &n_iter);
                 gtk_list_store_set (priv->notes_list, &n_iter, 0, string, -1);
@@ -2479,9 +2888,9 @@
     }
 
     g_list_free (tlist_cpy);
-    DEBUG("desc list is %d long", gtk_tree_model_iter_n_children (GTK_TREE_MODEL (priv->description_list), NULL));
-    DEBUG("notes list is %d long", gtk_tree_model_iter_n_children (GTK_TREE_MODEL (priv->notes_list), NULL));
-    DEBUG("memo list is %d long", gtk_tree_model_iter_n_children (GTK_TREE_MODEL (priv->memo_list), NULL));
+    PINFO("desc list is %d long", gtk_tree_model_iter_n_children (GTK_TREE_MODEL (priv->description_list), NULL));
+    PINFO("notes list is %d long", gtk_tree_model_iter_n_children (GTK_TREE_MODEL (priv->notes_list), NULL));
+    PINFO("memo list is %d long", gtk_tree_model_iter_n_children (GTK_TREE_MODEL (priv->memo_list), NULL));
     LEAVE(" ");
 }
 
@@ -2906,6 +3315,7 @@
                 DEBUG("destroy trans %p (%s)", trans, name);
                 g_signal_emit_by_name (model, "selection_move_delete", trans);
                 gtm_sr_delete_trans (model, trans);
+                g_signal_emit_by_name (model, "refresh_trans", trans);
             }
             break;
         default:
@@ -2929,14 +3339,14 @@
                 if (!g_strcmp0 (gnc_commodity_get_namespace (split_com), "template") == 0)
                 {
                     DEBUG("Insert trans %p for gl (%s)", trans, name);
-                    gtm_sr_insert_trans (model, trans);
+                    gtm_sr_insert_trans (model, trans, TRUE);
                     g_signal_emit_by_name (model, "refresh_trans", trans);
                 }
             }
             else if (!g_list_find (priv->tlist, trans) && ((xaccAccountHasAncestor (acc, priv->anchor) && priv->display_subacc) || acc == priv->anchor ))
             {
                 DEBUG("Insert trans %p (%s)", trans, name);
-                gtm_sr_insert_trans (model, trans);
+                gtm_sr_insert_trans (model, trans, TRUE);
                 g_signal_emit_by_name (model, "refresh_trans", trans);
             }
             break;

Modified: gnucash/trunk/src/gnome-utils/gnc-tree-model-split-reg.h
===================================================================
--- gnucash/trunk/src/gnome-utils/gnc-tree-model-split-reg.h	2013-08-02 17:55:10 UTC (rev 23111)
+++ gnucash/trunk/src/gnome-utils/gnc-tree-model-split-reg.h	2013-08-02 17:55:26 UTC (rev 23112)
@@ -45,6 +45,10 @@
 #define GNC_TREE_MODEL_SPLIT_REG_NAME            "GncTreeModelSplitReg"
 
 
+/* Define the number of transaction to load */
+#define NUM_OF_TRANS 30
+
+
 /** @brief Register types
  *
  * "registers" are single-account display windows.
@@ -100,13 +104,26 @@
 
     /* internal hidden columns */
     GNC_TREE_MODEL_SPLIT_REG_COL_RO,           //9
-    GNC_TREE_MODEL_SPLIT_REG_COL_FILTER_VIS,   //10
-    GNC_TREE_MODEL_SPLIT_REG_COL_NUM_VIS,      //11
-    GNC_TREE_MODEL_SPLIT_REG_COL_ACT_VIS,      //12
+    GNC_TREE_MODEL_SPLIT_REG_COL_NUM_VIS,      //10
+    GNC_TREE_MODEL_SPLIT_REG_COL_ACT_VIS,      //11
 
-    GNC_TREE_MODEL_SPLIT_REG_NUM_COLUMNS       //13
+    GNC_TREE_MODEL_SPLIT_REG_NUM_COLUMNS       //12
 } GncTreeModelSplitRegColumn;
 
+
+
+typedef enum
+{
+    VIEW_HOME,    //0
+    VIEW_UP,      //1
+    VIEW_PGUP,    //2
+    VIEW_GOTO,    //3
+    VIEW_PGDOWN,  //4
+    VIEW_DOWN,    //5
+    VIEW_END,     //6
+} GncTreeModelSplitRegUpdate;
+
+
 /* typedefs & structures */
 typedef struct GncTreeModelSplitRegPrivate GncTreeModelSplitRegPrivate;
 
@@ -123,6 +140,10 @@
 
     gboolean                     is_template;           /**< Are we using a template */
 
+    gint                         sort_depth;            /**< This is the row the sort direction is based on. */
+    gint                         sort_col;              /**< This is the column the sort direction is based on. */
+    gint                         sort_direction;        /**< This is the direction of sort, 1 for ascending or -1 rest */
+
     gboolean                     use_accounting_labels; /**< whether to use accounting Labels */
     gboolean                     separator_changed;     /**< whether the separator has changed */ 
     gboolean                     alt_colors_by_txn;     /**< whether to use alternative colors by transaction */ 
@@ -130,9 +151,10 @@
 
     gboolean                     read_only;             /**< register is read only */
 
-    cleared_match_t              filter_cleared_match;  // Status for Filter.
-    time64                       filter_start_time;     // Start time for Filter.
-    time64                       filter_end_time;       // End time for Filter.
+    Transaction                 *current_trans;         /**< Current transaction */
+    gint                         current_row;           /**< Current row in treeview */
+    gint                         number_of_trans_in_full_tlist;     /**< The total number of transactions in full_tlist */
+    gint                         position_of_trans_in_full_tlist;   /**< The position of current transaction in full_tlist */
 
 }GncTreeModelSplitReg;
 
@@ -146,6 +168,12 @@
        the transaction */
     void (*refresh_trans) (GncTreeModelSplitReg *model, gpointer item);
 
+    /* This signal is emitted to refresh the model */
+    void (*refresh_view) (GncTreeModelSplitReg *model, gpointer user_data);
+
+    /* This signal is emitted to keep scrollbar in sync */
+    void (*scroll_sync) (GncTreeModelSplitReg *model, gpointer user_data);
+
     /* This signal is emitted to refresh the status bar */
     void (*refresh_status_bar) (GncTreeModelSplitReg *model, gpointer user_data);
 
@@ -153,10 +181,6 @@
        the transaction */
     void (*selection_move_delete) (GncTreeModelSplitReg *model, gpointer item);
 
-    /* This signal is emitted before a refilter, the pointer has
-       the transaction */
-    void (*selection_move_filter) (GncTreeModelSplitReg *model, gpointer item);
-
 } GncTreeModelSplitRegClass;
 
 
@@ -193,6 +217,12 @@
 void gnc_tree_model_split_reg_set_data (GncTreeModelSplitReg *model, gpointer user_data,
                                   SRGetParentCallback2 get_parent);
 
+/** Sets the default query for the register. */
+void gnc_tree_model_split_reg_default_query (GncTreeModelSplitReg *model, Account *default_account, Query *query);
+
+/** Update the query for the register. */
+void gnc_tree_model_split_reg_update_query (GncTreeModelSplitReg *model, Query *query);
+
 /** Returns the parent Window of the register. */
 GtkWidget * gnc_tree_model_split_reg_get_parent (GncTreeModelSplitReg *model);
 
@@ -209,6 +239,18 @@
 /** Set display general ledger and show sub accounts. */
 void gnc_tree_model_split_reg_set_display (GncTreeModelSplitReg *model, gboolean subacc, gboolean gl);
 
+/** Change transactions in the tlist based on view movement. */
+void gnc_tree_model_split_reg_move (GncTreeModelSplitReg *model, GncTreeModelSplitRegUpdate model_update);
+
+/* Sync the vertical scrollbar to position in full_tlist. */
+void gnc_tree_model_split_reg_sync_scrollbar (GncTreeModelSplitReg *model);
+
+/** Return the first transaction, opposite to blank transaction in the full list. */
+Transaction * gnc_tree_model_split_reg_get_first_trans (GncTreeModelSplitReg *model);
+
+/** Return TRUE if transaction is in the view list. */
+gboolean gnc_tree_model_split_reg_trans_is_in_view (GncTreeModelSplitReg *model, Transaction *trans);
+
 /* These are to do with autocompletion */
 GtkListStore * gnc_tree_model_split_reg_get_description_list (GncTreeModelSplitReg *model);
 
@@ -258,6 +300,12 @@
 gchar * gnc_tree_model_split_reg_get_row_color (GncTreeModelSplitReg *model, gboolean is_trow1,
          gboolean is_trow2, gboolean is_split, gint num);
 
+/* Return the tooltip for transaction at position in full_tlist. */
+gchar * gnc_tree_model_split_reg_get_tooltip (GncTreeModelSplitReg *model, gint position);
+
+/* Set the current transaction to that at position in full_tlist */
+void gnc_tree_model_split_reg_set_current_trans_by_position (GncTreeModelSplitReg *model, gint position);
+
 /* Return TRUE if this transaction is read only for the view */
 gboolean
 gnc_tree_model_split_reg_get_read_only (GncTreeModelSplitReg *model, Transaction *trans);
@@ -276,6 +324,9 @@
 /* Return the split for which ancestor is it's parent */
 Split * gnc_tree_model_split_reg_trans_get_split_equal_to_ancestor (const Transaction *trans, const Account *ancestor);
 
+/* Dummy Sort function */
+gint gnc_tree_model_split_reg_sort_iter_compare_func (GtkTreeModel *tm, GtkTreeIter *a, GtkTreeIter *b, gpointer user_data);
+
 /*****************************************************************************/
 
 G_END_DECLS

Modified: gnucash/trunk/src/gnome-utils/gnc-tree-util-split-reg.c
===================================================================
--- gnucash/trunk/src/gnome-utils/gnc-tree-util-split-reg.c	2013-08-02 17:55:10 UTC (rev 23111)
+++ gnucash/trunk/src/gnome-utils/gnc-tree-util-split-reg.c	2013-08-02 17:55:26 UTC (rev 23112)
@@ -1021,8 +1021,6 @@
 
 /*###########################################################################*/
 
-
-
 /* Takes the input with column and sets the price / amount / value so they are consistent */
 void
 gnc_tree_util_set_number_for_input (GncTreeViewSplitReg *view, Transaction *trans, Split *split, gnc_numeric input, gint viewcol)

Modified: gnucash/trunk/src/gnome-utils/gnc-tree-view-split-reg.c
===================================================================
--- gnucash/trunk/src/gnome-utils/gnc-tree-view-split-reg.c	2013-08-02 17:55:10 UTC (rev 23111)
+++ gnucash/trunk/src/gnome-utils/gnc-tree-view-split-reg.c	2013-08-02 17:55:26 UTC (rev 23112)
@@ -117,8 +117,6 @@
 
 static void gtv_sr_selection_move_delete_cb (GncTreeModelSplitReg *model, gpointer item, gpointer user_data);
 
-static void gtv_sr_selection_move_filter_cb (GncTreeModelSplitReg *model, gpointer item, gpointer user_data);
-
 static gboolean gtv_sr_key_press_cb (GtkWidget *widget, GdkEventKey *event, gpointer user_data);
 
 static gboolean gtv_sr_ed_key_press_cb (GtkWidget *widget, GdkEventKey *event, gpointer user_data);
@@ -129,7 +127,7 @@
 
 static void gtv_sr_motion_cb (GtkTreeSelection *sel, gpointer user_data);
 
-static void gtv_sr_refresh_trans_cb (GncTreeModelSplitReg *model, gpointer item, gpointer user_data);
+static void gtv_sr_refresh_view_cb (GncTreeModelSplitReg *model, gpointer user_data);
 
 static gboolean gtv_sr_transaction_changed_confirm (GncTreeViewSplitReg *view, Transaction *new_trans);
 
@@ -155,7 +153,7 @@
      "Date", "date", "00/00/0000",
      GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS, 1,
      gtv_sr_edited_cb, gtv_sr_editable_start_editing_cb,
-     gnc_tree_control_split_reg_sort_by_date},
+     gnc_tree_model_split_reg_sort_iter_compare_func},
 
     {COL_DUEDATE, -1,
      "Due Date", "duedate", "00/00/0000",
@@ -166,25 +164,24 @@
      "Num / Act / Act", "numact", "0000",
      GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS, 0,
      gtv_sr_edited_cb, gtv_sr_editable_start_editing_cb,
-     gnc_tree_control_split_reg_sort_by_numact},
+     gnc_tree_model_split_reg_sort_iter_compare_func},
 
     {COL_DESCNOTES, GNC_TREE_MODEL_SPLIT_REG_COL_DESCNOTES,
      "Description / Notes / Memo", "descnotes", "xxxxxxxxxxxxxxxxxxx",
      GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS, 1,
      gtv_sr_edited_cb, gtv_sr_editable_start_editing_cb,
-     gnc_tree_control_split_reg_sort_by_dnm},
+     gnc_tree_model_split_reg_sort_iter_compare_func},
 
-    {COL_TRANSFERVOID, GNC_TREE_MODEL_SPLIT_REG_COL_TRANSFERVOID,
+    {COL_TRANSFERVOID, -1,
      "Transfer / Void", "transfervoid", "xxxxxxxxxxxxxxxxxxx",
      GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS, 1,
-     gtv_sr_edited_cb, gtv_sr_editable_start_editing_cb,
-     gnc_tree_control_split_reg_sort_by_account},
+     gtv_sr_edited_cb, gtv_sr_editable_start_editing_cb, NULL},
 
     {COL_RECN, GNC_TREE_MODEL_SPLIT_REG_COL_RECN,
      "R", "recn", "xx",
      GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS, 0,
      gtv_sr_edited_cb, gtv_sr_editable_start_editing_cb,
-     gnc_tree_control_split_reg_sort_by_recn},
+     gnc_tree_model_split_reg_sort_iter_compare_func},
 
     {COL_TYPE, -1,
      "Type", "type", "xx",
@@ -220,13 +217,13 @@
      "Debit", "debit", "00000",
      GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS, 1,
      gtv_sr_edited_cb, gtv_sr_editable_start_editing_cb,
-     gnc_tree_control_split_reg_sort_by_value},
+     gnc_tree_model_split_reg_sort_iter_compare_func},
 
     {COL_CREDIT, GNC_TREE_MODEL_SPLIT_REG_COL_CREDIT,
      "Credit", "credit", "00000",
      GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS, 1,
      gtv_sr_edited_cb, gtv_sr_editable_start_editing_cb,
-     gnc_tree_control_split_reg_sort_by_value},
+     gnc_tree_model_split_reg_sort_iter_compare_func},
 
     {COL_BALANCE, -1,
      "Balance", "balance", "00000",
@@ -279,8 +276,8 @@
     gint                 key_length;                   // The number of characters before auto complete starts.
     gint                 single_button_press;          // Capture single button press.
 
-    gchar               *transfer_string;              // This is the account transfer string.
-    gboolean             stop_cell_move;               // This stops the cursor moving to another cell.
+    gchar               *transfer_string;              // The transfer account string.
+    gboolean             stop_cell_move;               // Stops the cursor moving to a different cell.
 
 };
 
@@ -371,46 +368,39 @@
 gnc_tree_view_split_reg_get_model_from_view (GncTreeViewSplitReg *view)
 {
     GtkTreeModelSort *s_model = GTK_TREE_MODEL_SORT (gtk_tree_view_get_model (GTK_TREE_VIEW (view)));
-    GtkTreeModelFilter *f_model = GTK_TREE_MODEL_FILTER (gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (s_model)));
-
-    return GNC_TREE_MODEL_SPLIT_REG (gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (f_model)));
+    return GNC_TREE_MODEL_SPLIT_REG (gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (s_model)));
 }
 
 /* Get the model iter from the view path string */
 static gboolean
 gtv_sr_get_model_iter_from_view_string (GncTreeViewSplitReg *view,
-                                const gchar *path_string, GtkTreeIter *iter)
+                                const gchar *path_string, GtkTreeIter *m_iter)
 {
-    GtkTreeModel *f_model, *s_model;
-    GtkTreeIter f_iter, s_iter;
+    GtkTreeModel *s_model;
+    GtkTreeIter s_iter;
 
     s_model = gtk_tree_view_get_model (GTK_TREE_VIEW (view));
-    f_model = gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (s_model));
 
     if (!gtk_tree_model_get_iter_from_string (s_model, &s_iter, path_string))
     {
-        iter = NULL;
+        m_iter = NULL;
         return FALSE;
     }
-
-    gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT (s_model), &f_iter, &s_iter);
-    gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (f_model), iter, &f_iter);
+    gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT (s_model), m_iter, &s_iter);
     return TRUE;
 }
 
 /* Get the model iter from the selection */
 static gboolean
 gtv_sr_get_model_iter_from_selection (GncTreeViewSplitReg *view,
-                              GtkTreeSelection *sel, GtkTreeIter *iter)
+                              GtkTreeSelection *sel, GtkTreeIter *m_iter)
 {
-    GtkTreeModel *f_model, *s_model;
-    GtkTreeIter f_iter, s_iter;
+    GtkTreeModel *s_model;
+    GtkTreeIter s_iter;
 
     if (gtk_tree_selection_get_selected (sel, &s_model, &s_iter))
     {
-        f_model = gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (s_model));
-        gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT (s_model), &f_iter, &s_iter);
-        gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (f_model), iter, &f_iter);
+        gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT (s_model), m_iter, &s_iter);
         return TRUE;
     }
     return FALSE;
@@ -418,159 +408,44 @@
 
 /* Get sort model path from the model path
  *
- * \return A newly allocated GtkTreePath, or NULL */
+ * Return A newly allocated GtkTreePath, or NULL */
 GtkTreePath *
 gnc_tree_view_split_reg_get_sort_path_from_model_path (GncTreeViewSplitReg *view, GtkTreePath *mpath)
 {
-    GtkTreeModel *f_model, *s_model;
-    GtkTreePath *fpath, *spath;
+    GtkTreeModel *s_model;
+    GtkTreePath *spath;
 
+    g_return_val_if_fail (mpath, NULL);
     s_model = gtk_tree_view_get_model (GTK_TREE_VIEW (view));
-    f_model = gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (s_model));
-
-    fpath = gtk_tree_model_filter_convert_child_path_to_path (GTK_TREE_MODEL_FILTER (f_model), mpath);
-    g_return_val_if_fail(fpath, NULL);
-
-    spath = gtk_tree_model_sort_convert_child_path_to_path (GTK_TREE_MODEL_SORT (s_model), fpath);
-
-    gtk_tree_path_free (fpath);
-
+    spath = gtk_tree_model_sort_convert_child_path_to_path (GTK_TREE_MODEL_SORT (s_model), mpath);
+    if (!spath)
+    {
+        /* No parent path available */
+        return NULL;
+    }
     return spath;
 }
 
 /* Get model path from the sort model path
  *
- * \return A newly allocated GtkTreePath, or NULL. */
+ * Return A newly allocated GtkTreePath, or NULL. */
 GtkTreePath *
 gnc_tree_view_split_reg_get_model_path_from_sort_path (GncTreeViewSplitReg *view, GtkTreePath *spath)
 {
-    GtkTreeModel *f_model, *s_model;
-    GtkTreePath *fpath, *mpath;
-    g_return_val_if_fail(spath, NULL);
+    GtkTreeModel *s_model;
+    GtkTreePath *mpath;
 
+    g_return_val_if_fail (spath, NULL);
     s_model = gtk_tree_view_get_model (GTK_TREE_VIEW (view));
-    f_model = gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (s_model));
-
-    fpath = gtk_tree_model_sort_convert_path_to_child_path (GTK_TREE_MODEL_SORT (s_model), spath);
-    if (!fpath)
+    mpath = gtk_tree_model_sort_convert_path_to_child_path (GTK_TREE_MODEL_SORT (s_model), spath);
+    if (!mpath)
     {
         /* No child path available */
         return NULL;
     }
-
-    mpath = gtk_tree_model_filter_convert_path_to_child_path (GTK_TREE_MODEL_FILTER (f_model), fpath);
-
-    gtk_tree_path_free (fpath);
-
     return mpath;
 }
 
-/* Forces the entire split register tree to be re-evaluated for visibility. */
-void
-gnc_tree_view_split_reg_refilter (GncTreeViewSplitReg *view)
-{
-    GtkTreeModel *f_model, *s_model;
-
-    g_return_if_fail (GNC_IS_TREE_VIEW_SPLIT_REG (view));
-
-    s_model = gtk_tree_view_get_model (GTK_TREE_VIEW (view));
-    f_model = gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (s_model));
-    gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (f_model));
-}
-
-/* Change all visable view entries */
-void
-gnc_tree_view_split_reg_change_vis_rows (GncTreeViewSplitReg *view)
-{
-    GncTreeModelSplitReg *model;
-    GtkTreePath *start_path, *end_path;
-    GtkTreeIter iter;
-    gboolean valid = TRUE;
-    gint depth;
-    GtkTreeRowReference  *rowref;
-    GList *rr_list = NULL;    /* list of GtkTreeRowReferences */
-    GList *node;
-
-    ENTER("");
-
-    model = gnc_tree_view_split_reg_get_model_from_view (view);
-
-    if (gtk_tree_view_get_visible_range (GTK_TREE_VIEW (view), &start_path, &end_path))
-    {
-        gchar *estring, *sstring;
-        sstring = gtk_tree_path_to_string (start_path);
-        estring = gtk_tree_path_to_string (end_path);
-        PINFO("start_path is - %s, end_path is %s", sstring, estring);
-        g_free (estring);
-        g_free (sstring);
-
-        // Step through the visable rows and send update signal
-        while (valid)
-        {
-            GtkTreePath *mpath;
-            depth = gtk_tree_path_get_depth (start_path);
-
-            mpath = gnc_tree_view_split_reg_get_model_path_from_sort_path (view, start_path);
-
-            if ((mpath) && gtk_tree_model_get_iter (GTK_TREE_MODEL (model), &iter, mpath))
-            {
-                rowref = gtk_tree_row_reference_new (GTK_TREE_MODEL(model), mpath);
-                rr_list = g_list_append (rr_list, rowref);
-
-                gtk_tree_path_free (mpath);
-            }
-
-            if (gtk_tree_view_row_expanded (GTK_TREE_VIEW (view), start_path) && depth == 1)
-            {
-                gtk_tree_path_down (start_path);
-            }
-            else
-            {
-                if (gtk_tree_view_row_expanded (GTK_TREE_VIEW (view), start_path) && depth == 2)
-                {
-                    gtk_tree_path_down (start_path);
-                } 
-                else
-                {
-                    gtk_tree_path_next (start_path);
-                    if (!gnc_tree_view_path_is_valid (GNC_TREE_VIEW (view), start_path) && depth > 2)
-                    {
-                        gtk_tree_path_prev (start_path);
-                        gtk_tree_path_up (start_path);
-                        gtk_tree_path_next (start_path);
-                    }
-                    if (!gnc_tree_view_path_is_valid (GNC_TREE_VIEW (view), start_path) && depth > 1)
-                    {
-                        gtk_tree_path_prev (start_path);
-                        gtk_tree_path_up (start_path);
-                        gtk_tree_path_next (start_path);
-                    }
-                }
-            }
-            if (gtk_tree_path_compare (start_path, end_path) == 1)
-                valid = FALSE;
-        }
-        gtk_tree_path_free (start_path);
-        gtk_tree_path_free (end_path);
-
-
-        PINFO("Visable List length is %d", g_list_length (rr_list));
-
-        // Go througth references and emit update signal.
-        for ( node = rr_list;  node != NULL;  node = node->next )
-        {
-            GtkTreePath *path;
-            path = gtk_tree_row_reference_get_path ((GtkTreeRowReference*)node->data);
-            gtk_tree_model_row_changed (GTK_TREE_MODEL (model), path, &iter);
-            gtk_tree_path_free (path);
-        }
-        g_list_foreach (rr_list, (GFunc) gtk_tree_row_reference_free, NULL);
-        g_list_free (rr_list);
-    }
-    LEAVE("");
-}
-
-
 /*****************************************************************************/
 
 static void
@@ -685,8 +560,6 @@
 {
     GncTreeModelSplitReg *model;
 
-//g_print("gnc_tree_view_split_reg_refresh_from_gconf\n");
-
     model = gnc_tree_view_split_reg_get_model_from_view (view);
 
     model->use_theme_colors = gnc_gconf_get_bool(GCONF_GENERAL_REGISTER,
@@ -712,8 +585,6 @@
     if (view == NULL)
         return;
 
-//g_print("gnc_tree_view_split_reg_gconf_changed\n");
-
     if (g_str_has_suffix (entry->key, "draw_horizontal_lines") || g_str_has_suffix (entry->key, "draw_vertical_lines"))
     {
         view->priv->use_horizontal_lines = gnc_gconf_get_bool (GCONF_GENERAL_REGISTER,
@@ -921,7 +792,7 @@
 
         /* Add the full title for status column to the object for menu creation */
         if (col_list[i] == COL_STATUS)
-            g_object_set_data_full(G_OBJECT(col), REAL_TITLE, g_strdup(_("Status Bar")), g_free);
+            g_object_set_data_full (G_OBJECT(col), REAL_TITLE, g_strdup (_("Status Bar")), g_free);
 
         /* This sets the background of the treeview control columns */
         gnc_tree_view_set_control_column_background (GNC_TREE_VIEW (view), 0, gtv_sr_control_cdf0);
@@ -937,6 +808,10 @@
         // Connect editing-canceled signal so that edit-cancelled can be set appropriately
         g_signal_connect (G_OBJECT (cr0), "editing-canceled", G_CALLBACK (gtv_sr_editing_canceled_cb), view);
 
+        gtk_tree_view_column_set_sizing (col, GTK_TREE_VIEW_COLUMN_FIXED);
+
+//        gtk_tree_view_column_set_min_width (col, -1);
+
         // Set Columns to be resizable default.
         g_object_set (G_OBJECT (col), "resizable", TRUE, NULL);
 
@@ -965,7 +840,7 @@
     g_signal_connect (G_OBJECT (model), "selection_move_delete", G_CALLBACK (gtv_sr_selection_move_delete_cb), view);
 
     // This will refresh the view.
-    g_signal_connect (G_OBJECT (model), "refresh_trans", G_CALLBACK (gtv_sr_refresh_trans_cb), view);
+    g_signal_connect (G_OBJECT (model), "refresh_view", G_CALLBACK (gtv_sr_refresh_view_cb), view);
 
     // This is for key navigation, tabbing...
     g_signal_connect (G_OBJECT (view), "key-press-event", G_CALLBACK (gtv_sr_key_press_cb), NULL);
@@ -1003,52 +878,15 @@
     {
         if (model->style == REG2_STYLE_JOURNAL)
         {
-/* FIXME We need all this with a filter model, not sure if this is a mistake
-   in the model or a timing issue or a bug but with gtk_tree_view_expand_all
-   it crashes if the blank split is not on the blank transaction. */
-            GtkTreePath *path;
-            gint *indices;
-            gint index = 0;
+            gtk_tree_view_expand_all (GTK_TREE_VIEW (view));
 
-            path = gtk_tree_path_new_first ();
-            indices = gtk_tree_path_get_indices (mpath);
-
-            while (index < total_num)
-            {
-                if (view->sort_direction == 1)
-                {
-                    if (index != total_num -1)
-                        gtk_tree_view_expand_row (GTK_TREE_VIEW (view), path, TRUE); // all rows a part from last
-                    else if (indices[0] != total_num -1)
-                        gtk_tree_view_expand_to_path (GTK_TREE_VIEW (view), path); // selection not on blank trans
-                    else
-                        gtk_tree_view_expand_row (GTK_TREE_VIEW (view), path, TRUE); // selection on blank trans
-                }
-                else
-                {
-                    if (index > 0)
-                        gtk_tree_view_expand_row (GTK_TREE_VIEW (view), path, TRUE); // all rows apart from first
-                    else if (indices[0] != total_num -1)
-                        gtk_tree_view_expand_to_path (GTK_TREE_VIEW (view), path); // selection not on blank trans
-                    else
-                        gtk_tree_view_expand_row (GTK_TREE_VIEW (view), path, TRUE); // selection on blank trans
-                }
-
-                gtk_tree_path_next (path); //Next Transaction
-
-                index = index + 1;
-            }
-            gtk_tree_path_free (path);
-
-//FIXME this worked without the filter model -   gtk_tree_view_expand_all (GTK_TREE_VIEW (view));
-
             priv->expanded = TRUE;
 
             gtk_tree_path_free (mpath);
             gtk_tree_path_free (spath);
 
             /* This updates the plugin page gui */
-            gnc_tree_view_split_reg_call_uiupdate_cb(view);
+            gnc_tree_view_split_reg_call_uiupdate_cb (view);
 
             LEAVE("#### Journal format ####");
             return (FALSE);
@@ -1096,13 +934,13 @@
     gtk_tree_path_free (spath);
 
     /* This updates the plugin page gui */
-    gnc_tree_view_split_reg_call_uiupdate_cb(view);
+    gnc_tree_view_split_reg_call_uiupdate_cb (view);
 
     return (FALSE);
 }
 
 
-/* Set up the view for this transaction */
+/* Set up the view for this transaction, used in transaction discard and cancel */
 static gboolean
 gnc_tree_view_split_reg_format_trans (GncTreeViewSplitReg *view, Transaction *trans)
 {
@@ -1149,7 +987,7 @@
     gtk_tree_path_free (spath);
 
     /* This updates the plugin page gui */
-    gnc_tree_view_split_reg_call_uiupdate_cb(view);
+    gnc_tree_view_split_reg_call_uiupdate_cb (view);
 
     return (FALSE);
 }
@@ -1157,15 +995,11 @@
 
 /* Callback to update the view after transactions are added or deleted */
 static void
-gtv_sr_refresh_trans_cb (GncTreeModelSplitReg *model, gpointer item, gpointer user_data)
+gtv_sr_refresh_view_cb (GncTreeModelSplitReg *model, gpointer user_data)
 {
     GncTreeViewSplitReg *view = user_data;
-    Transaction *trans = item;
 
-    gnc_tree_view_split_reg_format_trans (view, trans);
-
-    /* scroll window to show selection when view is idle */
-    g_idle_add ((GSourceFunc) gnc_tree_view_split_reg_scroll_to_cell, view );
+    gnc_tree_view_split_reg_set_format (view);
 }
 
 
@@ -1173,7 +1007,7 @@
 GncTreeViewSplitReg*
 gnc_tree_view_split_reg_new_with_model (GncTreeModelSplitReg *model)
 {
-    GtkTreeModel        *s_model, *f_model;
+    GtkTreeModel        *s_model;
     GncTreeViewSplitReg *view;
     GtkTreeSelection    *selection;
 
@@ -1182,6 +1016,9 @@
 
     view->priv->anchor = gnc_tree_model_split_reg_get_anchor (model);
     view->priv->reg_comm = xaccAccountGetCommodity (view->priv->anchor);
+    view->priv->reg_currency = gnc_account_or_default_currency (view->priv->anchor, NULL);
+    g_assert (view->priv->reg_currency);
+    g_assert (gnc_commodity_is_currency (view->priv->reg_currency));
     view->help_text = g_strdup ("Help Text");
 
     // This sets up solid lines for the grid line.
@@ -1201,7 +1038,7 @@
         gtk_tree_view_set_grid_lines (GTK_TREE_VIEW (view), GTK_TREE_VIEW_GRID_LINES_NONE);
 
     // Set the view to fixed height mode...
-    gtk_tree_view_set_fixed_height_mode (GTK_TREE_VIEW (view), TRUE);
+//    gtk_tree_view_set_fixed_height_mode (GTK_TREE_VIEW (view), TRUE);
 
     /* Expanders off */
     gtk_tree_view_set_show_expanders (GTK_TREE_VIEW (view), FALSE);
@@ -1211,12 +1048,8 @@
 
     gtk_tree_selection_unselect_all (selection);
 
-    // Setup the filter model
-    f_model = gtk_tree_model_filter_new (GTK_TREE_MODEL (model), NULL);
-
     // Setup the sort model
-    s_model = gtk_tree_model_sort_new_with_model (f_model);
-    g_object_unref (G_OBJECT (f_model));
+    s_model = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (model));
 
     PINFO("#### After Models are Setup ####");
 
@@ -1226,10 +1059,6 @@
     /* Set up the columns */
     gnc_tree_view_split_reg_set_cols (view, model, gnc_tree_view_split_reg_get_colummn_list (model));
 
-    // Connect a call back to update the sort settings.
-    g_signal_connect (GTK_TREE_SORTABLE (s_model), "sort-column-changed",
-          G_CALLBACK (gnc_tree_control_split_reg_sort_changed_cb), view);
-
     PINFO("#### Before View connected to Model ####");
 
     // Connect model to tree view
@@ -1238,12 +1067,6 @@
 
     PINFO("#### After View connected to Model ####");
 
-    // Filtering function.
-    gtk_tree_model_filter_set_visible_column (GTK_TREE_MODEL_FILTER (f_model),
-                                              GNC_TREE_MODEL_SPLIT_REG_COL_FILTER_VIS);
-
-    PINFO("#### After set Filter Function ####");
-
     // Default the sorting to date.
     gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (s_model),
                                           GNC_TREE_MODEL_SPLIT_REG_COL_DATE,
@@ -1251,9 +1074,6 @@
 
     PINFO("#### After Set Default Sort Column ####");
 
-    // This is used to move the selected item when we refilter.
-    g_signal_connect (G_OBJECT (model), "selection_move_filter", G_CALLBACK (gtv_sr_selection_move_filter_cb), view);
-
     return view;
 }
 
@@ -1281,19 +1101,28 @@
 
     model = gnc_tree_view_split_reg_get_model_from_view (view);
 
+    /* Do we have a current transaction set on the model, use it */
+    if (model->current_trans != NULL)
+        view->priv->current_trans = model->current_trans;
+
     /* Set the default start position to end of list */
     if (view->priv->current_trans == NULL)
     {
-        /* both values NULL will return last in list */
-        mpath = gnc_tree_model_split_reg_get_path_to_split_and_trans (model, NULL, NULL);
-        view->priv->current_trans = gnc_tree_control_split_reg_get_blank_trans (view);
+        Transaction *btrans;
+
+        btrans = gnc_tree_control_split_reg_get_blank_trans (view);
+        mpath = gnc_tree_model_split_reg_get_path_to_split_and_trans (model, NULL, btrans);
+        view->priv->current_trans = btrans;
     }
     else
         mpath = gnc_tree_model_split_reg_get_path_to_split_and_trans (model, view->priv->current_split, view->priv->current_trans);
 
     indices = gtk_tree_path_get_indices (mpath);
 
-    new_mpath = gtk_tree_path_new_from_indices (indices[0], -1);
+    if (view->priv->current_depth == 2)
+        new_mpath = gtk_tree_path_new_from_indices (indices[0], indices[1], -1);
+    else
+        new_mpath = gtk_tree_path_new_from_indices (indices[0], -1);
 
     spath = gnc_tree_view_split_reg_get_sort_path_from_model_path (view, new_mpath);
 
@@ -1308,8 +1137,6 @@
         g_free (tstring);
     }
 
-    view->priv->current_depth = gtk_tree_path_get_depth (spath);
-
     if (view->priv->current_ref != NULL)
     {
         gtk_tree_row_reference_free (view->priv->current_ref);
@@ -1317,24 +1144,12 @@
     }
     view->priv->current_ref = gtk_tree_row_reference_new (GTK_TREE_MODEL (model), new_mpath);
 
-    /* Set cursor to new spath */
-    gtk_tree_view_set_cursor (GTK_TREE_VIEW (view), spath, NULL, FALSE);
-
-    gtk_tree_path_free (mpath);
-    gtk_tree_path_free (spath);
-    gtk_tree_path_free (new_mpath);
-
-    PINFO("#### Default Selection - Before Refilter ####");
-
-    /* Refilter the tree view register */
-//FIXME    if ((model->filter_start_time > 0) || (model->filter_end_time > 0) || (model->filter_cleared_match != CLEARED_ALL))
-    gnc_tree_view_split_reg_refilter (view);
-
-    PINFO("#### Default Selection - After Refilter ####");
-
     /* Update the titles */
     gtv_sr_titles (view, view->priv->current_depth);
 
+    /* Make sure blank split is on current transaction */
+    gnc_tree_model_split_reg_set_blank_split_parent (model, view->priv->current_trans, FALSE);
+
     PINFO("#### Default Selection - After Titles ####");
 
     /* Set the view format */
@@ -1342,9 +1157,16 @@
 
     PINFO("#### Default Selection - After View Format ####");
 
-    /* scroll window to show selection when view is idle */
-    g_idle_add ((GSourceFunc) gnc_tree_view_split_reg_scroll_to_cell, view );
+    /* scroll window to show selection */
+    gnc_tree_view_split_reg_scroll_to_cell (view);
 
+    /* Set cursor to new spath */
+    gtk_tree_view_set_cursor (GTK_TREE_VIEW (view), spath, NULL, FALSE);
+
+    gtk_tree_path_free (mpath);
+    gtk_tree_path_free (spath);
+    gtk_tree_path_free (new_mpath);
+
     LEAVE("#### Leave Default Selection ####");
 }
 
@@ -1519,9 +1341,8 @@
 {
     GncTreeViewSplitReg *view = GNC_TREE_VIEW_SPLIT_REG (user_data);
     GncTreeModelSplitReg *model;
-    GtkTreeIter m_iter, f_iter;
-    GtkTreeModel *f_model;
-    GtkTreePath *mpath, *spath;
+    GtkTreeIter m_iter;
+    GtkTreePath *mpath;
     Transaction *trans;
     Split *split;
     gboolean is_split, is_blank, is_trow1, is_trow2;
@@ -1533,11 +1354,8 @@
 
     model = gnc_tree_view_split_reg_get_model_from_view (view);
 
-    f_model = gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (s_model));
+    gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT (s_model), &m_iter, s_iter);
 
-    gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT (s_model), &f_iter, s_iter);
-    gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (f_model), &m_iter, &f_iter);
-
     g_return_if_fail (gnc_tree_model_split_reg_get_split_and_trans (
                          GNC_TREE_MODEL_SPLIT_REG (model), &m_iter,
                           &is_trow1, &is_trow2, &is_split, &is_blank,
@@ -1545,13 +1363,10 @@
 
     mpath = gtk_tree_model_get_path (GTK_TREE_MODEL (model), &m_iter);
 
-//    spath = gnc_tree_view_split_reg_get_sort_path_from_model_path (view, mpath);
-
     indices = gtk_tree_path_get_indices (mpath);
 
     row_color = gnc_tree_model_split_reg_get_row_color (model, is_trow1, is_trow2, is_split, indices[0]);
 
-//    gtk_tree_path_free (spath);
     gtk_tree_path_free (mpath);
 
     /* Set the background color / this works for sorting and deleting transactions */
@@ -1569,8 +1384,7 @@
 {
     GncTreeViewSplitReg *view = GNC_TREE_VIEW_SPLIT_REG (user_data);
     GncTreeModelSplitReg *model;
-    GtkTreeIter m_iter, f_iter;
-    GtkTreeModel *f_model;
+    GtkTreeIter m_iter;
     GtkTreePath *spath;
     ViewCol viewcol;
     Transaction *trans;
@@ -1594,11 +1408,8 @@
 
     model = gnc_tree_view_split_reg_get_model_from_view (view);
 
-    f_model = gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (s_model));
+    gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT (s_model), &m_iter, s_iter);
 
-    gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT (s_model), &f_iter, s_iter);
-    gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (f_model), &m_iter, &f_iter);
-
     viewcol = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (cell), "view_column"));
 
     g_return_if_fail (gnc_tree_model_split_reg_get_split_and_trans (
@@ -1678,7 +1489,7 @@
                 ts.tv_sec = gnc_time (NULL);
                 //xaccTransSetDatePostedSecs (trans, ts.tv_sec);
             }//if
-            s = gnc_print_date(ts);
+            s = gnc_print_date (ts);
             editable = TRUE;
         }
         else if (is_trow2 && show_extra_dates) {
@@ -1695,7 +1506,7 @@
                 ts.tv_sec = gnc_time (NULL);
                 //xaccTransSetDateEnteredSecs (trans, ts.tv_sec);
             }//if
-            s = gnc_print_date(ts);
+            s = gnc_print_date (ts);
             editable = FALSE;
         }
         else if (is_split && show_extra_dates) {
@@ -1712,7 +1523,7 @@
                     ts.tv_sec = gnc_time (NULL);
                     //xaccSplitSetDateReconciledTS (split, ts.tv_sec);
                 }//if
-                s = gnc_print_date(ts);
+                s = gnc_print_date (ts);
             }
             else
                 s = "";
@@ -2389,9 +2200,8 @@
 {
     GncTreeViewSplitReg *view = GNC_TREE_VIEW_SPLIT_REG (user_data);
     GncTreeModelSplitReg *model;
-    GtkTreeIter m_iter, f_iter;
-    GtkTreeModel *f_model;
-    GtkTreePath *mpath, *spath;
+    GtkTreeIter m_iter;
+    GtkTreePath *spath;
     ViewCol viewcol;
     Transaction *trans;
     Split *split;
@@ -2411,11 +2221,8 @@
 
     model = gnc_tree_view_split_reg_get_model_from_view (view);
 
-    f_model = gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (s_model));
+    gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT (s_model), &m_iter, s_iter);
 
-    gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT (s_model), &f_iter, s_iter);
-    gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (f_model), &m_iter, &f_iter);
-
     viewcol = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (cell), "view_column"));
 
     g_return_if_fail (gnc_tree_model_split_reg_get_split_and_trans (
@@ -2423,10 +2230,8 @@
                           &is_trow1, &is_trow2, &is_split, &is_blank,
                           &split, &trans));
 
-    mpath = gtk_tree_model_get_path (GTK_TREE_MODEL (model), &m_iter);
+    spath = gtk_tree_model_get_path (GTK_TREE_MODEL (s_model), s_iter);
 
-    spath = gnc_tree_view_split_reg_get_sort_path_from_model_path (view, mpath);
-
     depth = gtk_tree_path_get_depth (spath);
 
     indices = gtk_tree_path_get_indices (spath);
@@ -2444,7 +2249,6 @@
         expanded = TRUE; // splits are always expanded
 
     gtk_tree_path_free (spath);
-    gtk_tree_path_free (mpath);
 
     /* Set the background color / this works for sorting and deleting of transactions */
     g_object_set (cell, "cell-background", row_color, (gchar*)NULL);
@@ -2663,7 +2467,6 @@
 
             g_object_set_data (G_OBJECT (view), "data-edited", GINT_TO_POINTER (FALSE));
             xaccTransRollbackEdit (view->priv->dirty_trans);
-
             split = gnc_tree_model_split_get_blank_split (model);
             xaccSplitReinit (split); // Clear the blank split
             view->change_allowed = FALSE;
@@ -2973,7 +2776,7 @@
 
     is_template = gnc_tree_model_split_reg_get_template (model);
 
-    for ( column = columns, i = 1; column; column = g_list_next (column), i++)
+    for (column = columns, i = 1; column; column = g_list_next (column), i++)
     {
         GtkTreeViewColumn *tvc;
         ViewCol viewcol;
@@ -3666,23 +3469,6 @@
 }
 
 
-/* Call back for when a change to a filter requires the selection to get out of the way */
-static void
-gtv_sr_selection_move_filter_cb (GncTreeModelSplitReg *model, gpointer item, gpointer user_data)
-{
-    GncTreeViewSplitReg *view = user_data;
-    Transaction *trans = item;
-
-    DEBUG("gtv_sr_selection_move_filter_cb view %p model %p trans %p", view, model, trans);
-
-    DEBUG("gtv_sr_selection_move_filter_cb current_trans %p trans %p", view->priv->current_trans, trans);
-
-    /* if same, lets get out of the way, so move */
-    if (trans == view->priv->current_trans)
-        gnc_tree_control_split_reg_jump_to_blank (view);
-}
-
-
 /* Call back for when a change to a Transaction requires the selection to get out of the way */
 static void
 gtv_sr_selection_move_delete_cb (GncTreeModelSplitReg *model, gpointer item, gpointer user_data)
@@ -3755,6 +3541,26 @@
     return FALSE;
 }
 
+
+/* Test to see if we need to do a move */
+static void
+gtv_split_reg_test_for_move (GncTreeModelSplitReg *model, GtkTreePath *spath)
+{
+    gint num_of_trans, trans_pos;
+    gint *indices;
+
+    indices = gtk_tree_path_get_indices (spath);
+    num_of_trans = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (model), NULL);
+
+    trans_pos = indices[0];
+
+    if (trans_pos < num_of_trans*1/3)
+        gnc_tree_model_split_reg_move (model, VIEW_UP);
+
+    if (trans_pos > num_of_trans*2/3)
+        gnc_tree_model_split_reg_move (model, VIEW_DOWN);
+}
+
 /*###########################################################################*/
 
 /* This is the callback for the mouse click */
@@ -3854,7 +3660,7 @@
 
                 /* Test for change of transaction */
                 if (view->priv->current_trans != trans)
-                    /* Reset allow changes for reconciled transctions */
+                    /* Reset allow changes for reconciled transactions */
                     view->change_allowed = FALSE;
 
                 // Reconcile tests
@@ -3877,6 +3683,9 @@
                 else
                     gtk_tree_view_set_cursor (GTK_TREE_VIEW (view), spath, col, FALSE);
 
+                /* Test to see if we need to do a move */
+                gtv_split_reg_test_for_move (model, spath);
+
                 gtk_tree_path_free (spath);
                 gtk_tree_path_free (mpath);
                 return TRUE;
@@ -4026,13 +3835,14 @@
     GncTreeModelSplitReg *model;
     GtkTreeViewColumn *col;
     GtkTreePath *spath, *start_spath;
+    GtkTreePath *start_path, *end_path;
     gboolean editing = FALSE;
     gboolean step_off = FALSE;
     gboolean trans_changed = FALSE;
     gint *start_indices;
     gint *next_indices;
     gboolean keyup = FALSE;
-    Transaction *btrans, *ctrans;
+    Transaction *btrans, *ctrans, *hetrans;
     gboolean goto_blank = FALSE;
     gboolean next_trans = TRUE;
     gint depth;
@@ -4061,6 +3871,119 @@
         return TRUE; //FIXME I may use these to expand / collapse to splits later...
         break;
 
+    case GDK_KEY_Up:
+    case GDK_KEY_Down:
+
+        model = gnc_tree_view_split_reg_get_model_from_view (view);
+
+        if (event->keyval == GDK_KEY_Up)
+        {
+            gnc_tree_model_split_reg_move (model, VIEW_UP);
+        }
+        else
+            gnc_tree_model_split_reg_move (model, VIEW_DOWN);
+
+        return FALSE;
+        break;
+
+    case GDK_KEY_Page_Up:
+    case GDK_KEY_Page_Down:
+
+        model = gnc_tree_view_split_reg_get_model_from_view (view);
+
+        if (gtk_tree_view_get_visible_range (GTK_TREE_VIEW (view), &start_path, &end_path))
+        {
+            if (event->keyval == GDK_KEY_Page_Up)
+            {
+                GtkTreePath *new_start_path;
+                gint *start_indices, *end_indices;
+                gint new_start;
+                gint num_of_trans;
+
+                start_indices = gtk_tree_path_get_indices (start_path);
+                end_indices = gtk_tree_path_get_indices (end_path);
+                num_of_trans = end_indices[0] - start_indices[0];
+
+                new_start = start_indices[0] - num_of_trans + 2;
+
+                if (new_start < 0)
+                    new_start = 0;
+
+                new_start_path = gtk_tree_path_new_from_indices (new_start, -1);
+
+                /* Scroll to cell, top of view */
+                gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (view), new_start_path, NULL, TRUE, 0.0, 0.0);
+
+                /* Set cursor to new top row */
+                gtk_tree_view_set_cursor (GTK_TREE_VIEW (view), new_start_path, col, FALSE);
+
+                gtk_tree_path_free (new_start_path);
+
+                gnc_tree_model_split_reg_move (model, VIEW_UP);
+            }
+            else
+            {
+                GtkTreePath *new_end_path;
+                gint *start_indices, *end_indices;
+                gint new_end;
+                gint num_of_trans, total_num;
+
+                start_indices = gtk_tree_path_get_indices (start_path);
+                end_indices = gtk_tree_path_get_indices (end_path);
+                num_of_trans = end_indices[0] - start_indices[0];
+
+                total_num = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (model), NULL);
+
+                new_end = end_indices[0] + num_of_trans - 1;
+
+                if (new_end > (total_num - 1))
+                    new_end = total_num -1;
+
+                new_end_path = gtk_tree_path_new_from_indices (new_end, -1);
+
+                /* Scroll to cell, bottom of view */
+                if (model->use_double_line == TRUE)
+                {
+                    gtk_tree_path_down (new_end_path);
+                    gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (view), new_end_path, NULL, TRUE, 1.0, 0.0);
+                    gtk_tree_path_up (new_end_path);
+                }
+                else
+                    gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (view), new_end_path, NULL, TRUE, 1.0, 0.0);
+
+                /* Set cursor to new bottom row */
+                gtk_tree_view_set_cursor (GTK_TREE_VIEW (view), new_end_path, col, FALSE);
+
+                gtk_tree_path_free (new_end_path);
+
+                gnc_tree_model_split_reg_move (model, VIEW_DOWN);
+            }
+            gtk_tree_path_free (start_path);
+            gtk_tree_path_free (end_path);
+        }
+        return TRUE;
+        break;
+
+    case GDK_KEY_Home:
+    case GDK_KEY_End:
+
+        model = gnc_tree_view_split_reg_get_model_from_view (view);
+
+        if (event->keyval == GDK_KEY_Home)
+            hetrans = gnc_tree_model_split_reg_get_first_trans (model);
+        else
+            hetrans = gnc_tree_model_split_get_blank_trans (model);
+
+        model->current_trans = hetrans;
+
+        if (!gnc_tree_model_split_reg_trans_is_in_view (model, hetrans))
+            g_signal_emit_by_name (model, "refresh_trans");
+        else
+            gnc_tree_control_split_reg_jump_to (view, hetrans, NULL, FALSE);
+
+        return TRUE;
+        break;
+
     case GDK_KEY_Return:
     case GDK_KEY_space:
 
@@ -4099,7 +4022,7 @@
         {
             /* Now move. */
             if (goto_blank)
-                gnc_tree_control_split_reg_jump_to_blank (view);
+                g_idle_add ((GSourceFunc)gnc_tree_control_split_reg_jump_to_blank, view);
             else if (next_trans)
                 gnc_tree_control_split_reg_goto_rel_trans_row (view, 1);
         }
@@ -4212,7 +4135,7 @@
 {
     GncTreeViewSplitReg *view = GNC_TREE_VIEW_SPLIT_REG (user_data);
     GncTreeModelSplitReg *model;
-    GtkTreeModel *f_model, *s_model;
+    GtkTreeModel *s_model;
     GtkTreePath *mpath, *spath;
     Split *split = NULL;
     Transaction *trans = NULL;
@@ -4220,13 +4143,13 @@
     gboolean is_trow1, is_trow2, is_split, is_blank;
     RowDepth depth = 0;
     GtkTreeIter m_iter;
+    gint *indices;
 
     model = gnc_tree_view_split_reg_get_model_from_view (view);
 
     ENTER("View is %p and Model is %p", view, model);
 
     s_model = gtk_tree_view_get_model (GTK_TREE_VIEW (view));
-    f_model = gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (s_model));
 
     DEBUG("Current trans %p, Split %p, Depth %d and Dirty Trans %p", view->priv->current_trans, view->priv->current_split,
                                                                      view->priv->current_depth, view->priv->dirty_trans);
@@ -4279,6 +4202,12 @@
         DEBUG("Current trans %p, split %p, depth %d and old_trans %p", view->priv->current_trans, view->priv->current_split,
                                                                      view->priv->current_depth, old_trans);
 
+        /* Save trans and current row to model */
+        model->current_trans = trans;
+        indices = gtk_tree_path_get_indices (spath);
+        model->current_row = indices[0];
+        gnc_tree_model_split_reg_sync_scrollbar (model);
+
         /* Test for change of transaction and old transaction equals a dirty transaction */
         if ((trans != old_trans) && (old_trans == view->priv->dirty_trans))
         {
@@ -4339,11 +4268,11 @@
         gnc_tree_model_split_reg_set_blank_split_parent (model, NULL, FALSE);
 
         /* Set the default selection start position */
-//FIXME        gnc_tree_view_split_reg_default_selection (view);
+        gnc_tree_view_split_reg_default_selection (view);
     }
 
     /* This updates the plugin page gui */
-    gnc_tree_view_split_reg_call_uiupdate_cb(view);
+    gnc_tree_view_split_reg_call_uiupdate_cb (view);
 
     LEAVE(" ");
 }
@@ -5558,6 +5487,13 @@
         /* Set cursor to new column, open for editing */
         gtk_tree_view_set_cursor (GTK_TREE_VIEW (view), spath, col, TRUE);
 
+        if (event->keyval == GDK_KEY_Up)
+        {
+            gnc_tree_model_split_reg_move (model, VIEW_UP);
+        }
+        else
+            gnc_tree_model_split_reg_move (model, VIEW_DOWN);
+
         return TRUE;
         break;
 
@@ -5615,7 +5551,7 @@
         {
             /* Now move. */
             if (goto_blank)
-                gnc_tree_control_split_reg_jump_to_blank (view);
+                g_idle_add ((GSourceFunc)gnc_tree_control_split_reg_jump_to_blank, view);
             else if (next_trans)
                 gnc_tree_control_split_reg_goto_rel_trans_row (view, 1);
         }
@@ -5637,7 +5573,7 @@
 {
     GncTreeViewSplitReg  *view = GNC_TREE_VIEW_SPLIT_REG (user_data);
     GncTreeModelSplitReg *model;
-    GtkTreeModel         *f_model, *s_model;
+    GtkTreeModel         *s_model;
     GtkTreePath          *spath, *mpath, *fpath;
     GtkEntry             *entry = NULL;
     ViewCol               viewcol;
@@ -5651,12 +5587,11 @@
 
     GtkEntryCompletion *completion = gtk_entry_completion_new();
 
-    ENTER("gtv_sr_editable_start_editing_cb Path string is '%s'\n", path_string);
+    ENTER("gtv_sr_editable_start_editing_cb Path string is '%s'", path_string);
 
     model = gnc_tree_view_split_reg_get_model_from_view (view);
 
     s_model = gtk_tree_view_get_model (GTK_TREE_VIEW (view));
-    f_model = gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (s_model));
 
     /* Description / Notes / Memo / Accounts Completion Lists */
     description_list = gnc_tree_model_split_reg_get_description_list (model);
@@ -5999,13 +5934,14 @@
         if (model->use_double_line)
         {
             gtk_tree_path_down (spath); // move to the second row of transaction
-            gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (view), spath, NULL, TRUE, 0.5, 0.0); //1.0
+            gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (view), spath, NULL, TRUE, 1.0, 0.0); //1.0
         }
         else
         {
-            gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (view), spath, NULL, TRUE, 0.5, 0.0); //1.0
+            gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (view), spath, NULL, TRUE, 1.0, 0.0); //1.0
         }
     }
+
     gtk_tree_path_free (mpath);
     gtk_tree_path_free (spath);
 

Modified: gnucash/trunk/src/gnome-utils/gnc-tree-view-split-reg.h
===================================================================
--- gnucash/trunk/src/gnome-utils/gnc-tree-view-split-reg.h	2013-08-02 17:55:10 UTC (rev 23111)
+++ gnucash/trunk/src/gnome-utils/gnc-tree-view-split-reg.h	2013-08-02 17:55:26 UTC (rev 23112)
@@ -160,17 +160,15 @@
 /* Get model path from the sort model path */
 GtkTreePath * gnc_tree_view_split_reg_get_model_path_from_sort_path (GncTreeViewSplitReg *view, GtkTreePath *spath);
 
+/* Get model from the view */
 GncTreeModelSplitReg * gnc_tree_view_split_reg_get_model_from_view (GncTreeViewSplitReg *view);
 
+/* Scroll the view to the current transaction */
 gboolean gnc_tree_view_split_reg_scroll_to_cell (GncTreeViewSplitReg *view);
 
+/* Scroll the view to the blank split */
 gboolean gnc_tree_view_split_reg_scroll_to_bsplit (GncTreeViewSplitReg *view);
 
-void gnc_tree_view_split_reg_refilter (GncTreeViewSplitReg *view);
-
-/* Change all visable view entries */
-void gnc_tree_view_split_reg_change_vis_rows (GncTreeViewSplitReg *view);
-
 /*************************************************************************************/
 
 void gnc_tree_view_split_reg_delete_current_split (GncTreeViewSplitReg *view);

Modified: gnucash/trunk/src/register/ledger-core/gnc-ledger-display2.c
===================================================================
--- gnucash/trunk/src/register/ledger-core/gnc-ledger-display2.c	2013-08-02 17:55:10 UTC (rev 23111)
+++ gnucash/trunk/src/register/ledger-core/gnc-ledger-display2.c	2013-08-02 17:55:26 UTC (rev 23112)
@@ -59,9 +59,6 @@
 
     GNCLedgerDisplay2Type ld_type;
 
-    /* Needs to be removed at some point */
-    SplitRegister *reg;
-
     GncTreeModelSplitReg *model; //FIXME Might get rid of this and use function to find.
     GncTreeViewSplitReg *view;
 
@@ -96,7 +93,6 @@
 
 static void gnc_ledger_display2_refresh_cb (GncTreeModelSplitReg *model, gpointer item, gpointer user_data);
 
-
 /** Implementations *************************************************/
 
 Account *
@@ -147,17 +143,6 @@
     ld->get_parent = get_parent;
 }
 
-/*FIXME */
-SplitRegister *
-gnc_ledger_display2_get_split_register (GNCLedgerDisplay2 *ld)
-{
-    if (!ld)
-        return NULL;
-
-    return ld->reg;
-}
-
-
 GncTreeModelSplitReg *
 gnc_ledger_display2_get_split_model_register (GNCLedgerDisplay2 *ld)
 {
@@ -616,11 +601,11 @@
     splits = qof_query_run (ld->query);
 
 //FIXME Not Needed ?    gnc_ledger_display2_set_watches (ld, splits);
-    //gconf changes come this way, we only want a full refresh for SEARCH-LEDGER2
-    if (ld->model->type == SEARCH_LEDGER2)
-        gnc_ledger_display2_refresh_internal (ld, splits);
-    else
-        gnc_tree_view_split_reg_change_vis_rows (ld->view);
+//    gnc_ledger_display2_set_watches (ld, splits);
+
+    //gconf changes come this way
+    gnc_ledger_display2_refresh_internal (ld, splits);
+
     LEAVE(" ");
 }
 
@@ -829,13 +814,20 @@
 
     gnc_tree_model_split_reg_set_data (ld->model, ld, gnc_ledger_display2_parent);
 
-    // This sets up a call back for the search_ledger2 to reload after changes
+//FIXME We should get the load filter and sort here so we run query once on load....
+
+    gnc_tree_model_split_reg_set_display (ld->model, ((ld_type == LD2_SUBACCOUNT)?TRUE:FALSE), ((ld_type == LD2_GL)?TRUE:FALSE));
+
+    gnc_tree_model_split_reg_default_query (ld->model, lead_account, ld->query);
+
+    // This sets up a call back to reload after changes
     g_signal_connect (G_OBJECT (ld->model), "refresh_trans",
                       G_CALLBACK (gnc_ledger_display2_refresh_cb), ld );
 
     splits = qof_query_run (ld->query);
 
 //FIXME Not Needed ?    gnc_ledger_display2_set_watches (ld, splits);
+//    gnc_ledger_display2_set_watches (ld, splits);
 
     gnc_ledger_display2_refresh_internal (ld, splits);
 
@@ -900,7 +892,7 @@
 static void
 gnc_ledger_display2_refresh_internal (GNCLedgerDisplay2 *ld, GList *splits)
 {
-    GtkTreeModel *s_model, *f_model, *model;
+    GtkTreeModel *s_model, *model;
 
     if (!ld || ld->loading)
         return;
@@ -917,11 +909,9 @@
         ld->loading = TRUE;
 
 	s_model = gtk_tree_view_get_model (GTK_TREE_VIEW (ld->view)); // this is the sort model
-        f_model = gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (s_model)); // this is the filter model
-        model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (f_model)); // our model
+        model = gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (s_model)); // this is the model
 
         g_object_ref (s_model);
-        g_object_ref (f_model);
         g_object_ref (model);
 
         gnc_tree_view_split_reg_block_selection (ld->view, TRUE); // This blocks the tree selection
@@ -930,13 +920,12 @@
         gtk_tree_view_set_model (GTK_TREE_VIEW (ld->view), GTK_TREE_MODEL (s_model)); // Re-attach sort model to view
         gnc_tree_view_split_reg_block_selection (ld->view, FALSE); // This unblocks the tree selection
 
+        g_object_unref (model);
+        g_object_unref (s_model);
+
         /* Set the default selection start position */
         gnc_tree_view_split_reg_default_selection (ld->view);
 
-        g_object_unref (model);
-        g_object_unref (f_model);
-        g_object_unref (s_model);
-
         ld->loading = FALSE;
     }
 }
@@ -953,6 +942,26 @@
 }
 
 void
+gnc_ledger_display2_refresh_sched (GNCLedgerDisplay2 *ld, GList *splits)
+{
+    ENTER("ld=%p", ld);
+
+    if (!ld)
+    {
+        LEAVE("no display");
+        return;
+    }
+
+    if (ld->loading)
+    {
+        LEAVE("already loading");
+        return;
+    }
+    gnc_ledger_display2_refresh_internal (ld, splits);
+    LEAVE(" ");
+}
+
+void
 gnc_ledger_display2_refresh (GNCLedgerDisplay2 *ld)
 {
     ENTER("ld=%p", ld);
@@ -969,6 +978,8 @@
         return;
     }
 
+    // Update the query before refresh
+    gnc_tree_model_split_reg_update_query (ld->model, ld->query);
     gnc_ledger_display2_refresh_internal (ld, qof_query_run (ld->query));
     LEAVE(" ");
 }
@@ -1022,15 +1033,14 @@
     ld->refresh_ok = ok;
 }
 
-/* This is used for the search_ledger2 reload after any changes made */
+/* This is used to reload after any changes made */
 static void
 gnc_ledger_display2_refresh_cb (GncTreeModelSplitReg *model, gpointer item, gpointer user_data)
 {
     GNCLedgerDisplay2 *ld = user_data;
 
-    if (model->type == SEARCH_LEDGER2)
-        /* Refresh the view when idle */
-        g_idle_add ((GSourceFunc)gnc_ledger_display2_refresh, ld);
+    /* Refresh the view when idle */
+    g_idle_add ((GSourceFunc)gnc_ledger_display2_refresh, ld);
 }
 
 void

Modified: gnucash/trunk/src/register/ledger-core/gnc-ledger-display2.h
===================================================================
--- gnucash/trunk/src/register/ledger-core/gnc-ledger-display2.h	2013-08-02 17:55:10 UTC (rev 23111)
+++ gnucash/trunk/src/register/ledger-core/gnc-ledger-display2.h	2013-08-02 17:55:26 UTC (rev 23112)
@@ -86,12 +86,8 @@
 GtkWidget *gnc_ledger_display2_get_parent( GNCLedgerDisplay2 *ld );
 
 /* return the split register associated with a ledger display */
-SplitRegister * gnc_ledger_display2_get_split_register (GNCLedgerDisplay2 *ld);
-
-/* return the split register associated with a ledger display */
 GncTreeModelSplitReg * gnc_ledger_display2_get_split_model_register (GNCLedgerDisplay2 *ld);
 
-
 /* opens up a register window to display a single account */
 GNCLedgerDisplay2 * gnc_ledger_display2_simple (Account *account);
 
@@ -132,6 +128,9 @@
 void gnc_ledger_display2_refresh (GNCLedgerDisplay2 * ledger_display);
 void gnc_ledger_display2_refresh_by_split_register (GncTreeModelSplitReg *model);
 
+/* This is used to load the register for the schedule */
+void gnc_ledger_display2_refresh_sched (GNCLedgerDisplay2 *ld, GList *splits);
+
 /* Refilter the register */
 void gnc_ledger_display2_refilter (GNCLedgerDisplay2 *ld);
 



More information about the gnucash-changes mailing list