From 9f61ed44481edf8d9dcacc96de855f20a979bf91 Mon Sep 17 00:00:00 2001
From: John Darrington <john@darrington.wattle.id.au>
Date: Sun, 28 Apr 2019 17:24:36 +0200
Subject: [PATCH] GUI: Scroll to correct datasheet position after
 deleting/inserting variables.

	* src/ui/gui/psppire-data-sheet.h (psppire_data_sheet_delete_variables,
	  psppire_data_sheet_insert_new_variable_at_posn): New functions
	* src/ui/gui/psppire-data-sheet.c: insert_new_variable ->
	psppire_data_sheet_insert_new_variable_at_posn.
	* src/ui/gui/psppire-data-sheet.c: delete_variables ->
	psppire_data_sheet_delete_variables.
	* src/ui/gui/psppire-data-editor.c:
	(psppire_data_editor_data_delete_variables,
	psppire_data_editor_insert_new_variable_at_posn): Reimplement.
---
 src/ui/gui/psppire-data-editor.c | 17 +++-------------
 src/ui/gui/psppire-data-sheet.c  | 34 ++++++++++++++++++++++----------
 src/ui/gui/psppire-data-sheet.h  |  7 ++++++-
 3 files changed, 33 insertions(+), 25 deletions(-)

diff --git a/src/ui/gui/psppire-data-editor.c b/src/ui/gui/psppire-data-editor.c
index 6e7a036967..7ddb0bff9c 100644
--- a/src/ui/gui/psppire-data-editor.c
+++ b/src/ui/gui/psppire-data-editor.c
@@ -1,6 +1,6 @@
 /* PSPPIRE - a graphical user interface for PSPP.
    Copyright (C) 2008, 2009, 2010, 2011, 2012, 2016,
-   2017 Free Software Foundation, Inc.
+   2017, 2019 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -437,12 +437,7 @@ static void set_font_recursively (GtkWidget *w, gpointer data);
 void
 psppire_data_editor_data_delete_variables (PsppireDataEditor *de)
 {
-  SswRange *range = SSW_SHEET(de->data_sheet)->selection;
-
-  psppire_dict_delete_variables (de->dict, range->start_x,
-				 (range->end_x - range->start_x + 1));
-
-  gtk_widget_queue_draw (GTK_WIDGET (de->data_sheet));
+  psppire_data_sheet_delete_variables (PSPPIRE_DATA_SHEET (de->data_sheet));
 }
 
 void
@@ -469,13 +464,7 @@ psppire_data_editor_insert_new_case_at_posn  (PsppireDataEditor *de, gint posn)
 void
 psppire_data_editor_insert_new_variable_at_posn (PsppireDataEditor *de, gint posn)
 {
-  g_return_if_fail (posn >= 0);
-  const struct variable *v = psppire_dict_insert_variable (de->dict, posn, NULL);
-  g_return_if_fail (v);
-  psppire_data_store_insert_value (de->data_store, var_get_width(v),
-				   var_get_case_index (v));
-
-  gtk_widget_queue_draw (GTK_WIDGET (de));
+  psppire_data_sheet_insert_new_variable_at_posn (PSPPIRE_DATA_SHEET (de->data_sheet), posn);
 }
 
 static void
diff --git a/src/ui/gui/psppire-data-sheet.c b/src/ui/gui/psppire-data-sheet.c
index 4b7df0dc28..615ff98d79 100644
--- a/src/ui/gui/psppire-data-sheet.c
+++ b/src/ui/gui/psppire-data-sheet.c
@@ -1,5 +1,5 @@
 /* PSPPIRE - a graphical user interface for PSPP.
-   Copyright (C) 2017  John Darrington
+   Copyright (C) 2017, 2019  John Darrington
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -206,25 +206,37 @@ show_cases_column_popup (PsppireDataSheet *sheet, int column, guint button, guin
   gtk_menu_popup_at_pointer (GTK_MENU (sheet->data_sheet_cases_column_popup), NULL);
 }
 
-static void
-insert_new_variable (PsppireDataSheet *sheet)
+void
+psppire_data_sheet_insert_new_variable_at_posn (PsppireDataSheet *sheet, gint posn)
 {
   PsppireDataStore *data_store = NULL;
   g_object_get (sheet, "data-model", &data_store, NULL);
 
-  gint posn = GPOINTER_TO_INT (g_object_get_data
-				(G_OBJECT (sheet->data_sheet_cases_column_popup),
-				 "item"));
-
   const struct variable *v = psppire_dict_insert_variable (data_store->dict,
 							   posn, NULL);
 
   psppire_data_store_insert_value (data_store, var_get_width(v),
 				   var_get_case_index (v));
 
+  ssw_sheet_scroll_to (SSW_SHEET (sheet), posn, -1);
+
   gtk_widget_queue_draw (GTK_WIDGET (sheet));
 }
 
+static void
+insert_new_variable (PsppireDataSheet *sheet)
+{
+  PsppireDataStore *data_store = NULL;
+  g_object_get (sheet, "data-model", &data_store, NULL);
+
+  gint posn = GPOINTER_TO_INT (g_object_get_data
+				(G_OBJECT (sheet->data_sheet_cases_column_popup),
+				 "item"));
+
+  psppire_data_sheet_insert_new_variable_at_posn (sheet, posn);
+}
+
+
 static void
 set_menu_items_sensitivity (PsppireDataSheet *sheet, gpointer selection, gpointer p)
 {
@@ -251,8 +263,8 @@ set_menu_items_sensitivity (PsppireDataSheet *sheet, gpointer selection, gpointe
 			    whole_column_selected);
 }
 
-static void
-delete_variables (PsppireDataSheet *sheet)
+void
+psppire_data_sheet_delete_variables (PsppireDataSheet *sheet)
 {
   SswRange *range = SSW_SHEET(sheet)->selection;
 
@@ -262,6 +274,8 @@ delete_variables (PsppireDataSheet *sheet)
   psppire_dict_delete_variables (data_store->dict, range->start_x,
 				 (range->end_x - range->start_x + 1));
 
+  ssw_sheet_scroll_to (SSW_SHEET (sheet), range->start_x, -1);
+
   gtk_widget_queue_draw (GTK_WIDGET (sheet));
 }
 
@@ -284,7 +298,7 @@ create_data_column_header_popup_menu (PsppireDataSheet *sheet)
   sheet->data_clear_variables_menu_item =
     gtk_menu_item_new_with_mnemonic  (_("Cl_ear Variables"));
   g_signal_connect_swapped (sheet->data_clear_variables_menu_item, "activate",
-			    G_CALLBACK (delete_variables),
+			    G_CALLBACK (psppire_data_sheet_delete_variables),
 			    sheet);
   gtk_widget_set_sensitive (sheet->data_clear_variables_menu_item, FALSE);
   gtk_menu_shell_append (GTK_MENU_SHELL (menu), sheet->data_clear_variables_menu_item);
diff --git a/src/ui/gui/psppire-data-sheet.h b/src/ui/gui/psppire-data-sheet.h
index 49e7a1751c..0e5cc175c8 100644
--- a/src/ui/gui/psppire-data-sheet.h
+++ b/src/ui/gui/psppire-data-sheet.h
@@ -1,5 +1,5 @@
 /* PSPPIRE - a graphical user interface for PSPP.
-    Copyright (C) 2017  John Darrington
+    Copyright (C) 2017, 2019  John Darrington
 
     This program is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -47,4 +47,9 @@ G_DECLARE_FINAL_TYPE (PsppireDataSheet, psppire_data_sheet, PSPPIRE, DATA_SHEET,
 
 GtkWidget *psppire_data_sheet_new (void);
 
+void psppire_data_sheet_delete_variables (PsppireDataSheet *sheet);
+
+void psppire_data_sheet_insert_new_variable_at_posn (PsppireDataSheet *sheet, gint posn);
+
+
 #endif
-- 
2.30.2