From ddf093b6f8428a45a14a24aaf17417d30777d9a3 Mon Sep 17 00:00:00 2001
From: John Darrington <john@darrington.wattle.id.au>
Date: Fri, 21 Sep 2007 01:53:58 +0000
Subject: [PATCH] Added a BACKEND_CHANGED signal on PsppireDict, and handled it
 accordingly. Closes bug #20821

---
 lib/gtksheet/ChangeLog         |  5 +++++
 lib/gtksheet/gtksheet.c        |  9 +++++++++
 src/ui/gui/ChangeLog           | 11 +++++++++++
 src/ui/gui/psppire-dict.c      | 35 ++++++++++++++++++++++++++--------
 src/ui/gui/psppire-var-store.c | 22 +++++++++++++++++++--
 5 files changed, 72 insertions(+), 10 deletions(-)

diff --git a/lib/gtksheet/ChangeLog b/lib/gtksheet/ChangeLog
index 011169e28d..c8afa6e516 100644
--- a/lib/gtksheet/ChangeLog
+++ b/lib/gtksheet/ChangeLog
@@ -1,3 +1,8 @@
+21 Septempber 2007 John Darrington <john@darrington.wattle.id.au>
+
+	* gtksheet.c (range_update_callback): Scroll to cell 0,0 if the
+	current position is outside the model's range.
+
 24 July 2007 John Darrington <john@darrington.wattle.id.au>
 
 	* gtksheet.c gtksheet.h: Removed the `clip' feature, which IMO 
diff --git a/lib/gtksheet/gtksheet.c b/lib/gtksheet/gtksheet.c
index 3830dac1e1..18922cf14d 100644
--- a/lib/gtksheet/gtksheet.c
+++ b/lib/gtksheet/gtksheet.c
@@ -1320,6 +1320,15 @@ range_update_callback (GSheetModel *m, gint row0, gint col0,
   range.rowi = rowi;
   range.coli = coli;
 
+  if ( MAX_VISIBLE_ROW (sheet) >
+       g_sheet_model_get_row_count (sheet->model)
+       ||
+       MAX_VISIBLE_COLUMN (sheet) >
+       g_sheet_model_get_column_count (sheet->model))
+    {
+      gtk_sheet_move_query (sheet, 0, 0);
+    }
+
   if ( ( row0 < 0 && col0 < 0 ) || ( rowi < 0 && coli < 0 ) )
     {
       gint i;
diff --git a/src/ui/gui/ChangeLog b/src/ui/gui/ChangeLog
index a58adacef9..31453f01c1 100644
--- a/src/ui/gui/ChangeLog
+++ b/src/ui/gui/ChangeLog
@@ -1,3 +1,14 @@
+2007-09-27  John Darrington <john@darrington.wattle.id.au>
+
+	Addressing bug #20821:
+	
+	* psppire-dict.c: Added a BACKEND_CHANGED signal to indicate when 
+	a PsppireDict's struct dictionary has been replaced.
+
+	* psppire-var-store.c: Added the appropriate method for 
+	get_column_count. Added a signal handler for dict:BACKEND_CHANGED, 
+	which calls the g_sheet_model_range_changed for the entire sheet.
+	
 2007-09-18  Ben Pfaff  <blp@gnu.org>
 
 	* helper.c (create_casereader_from_data_store): New function.
diff --git a/src/ui/gui/psppire-dict.c b/src/ui/gui/psppire-dict.c
index 8560c223f1..cf66ca13c2 100644
--- a/src/ui/gui/psppire-dict.c
+++ b/src/ui/gui/psppire-dict.c
@@ -42,14 +42,19 @@ static void dictionary_tree_model_init (GtkTreeModelIface *iface);
 /* --- variables --- */
 static GObjectClass     *parent_class = NULL;
 
-enum  {VARIABLE_CHANGED,
-       VARIABLE_RESIZED,
-       VARIABLE_INSERTED,
-       VARIABLE_DELETED,
-       WEIGHT_CHANGED,
-       FILTER_CHANGED,
-       SPLIT_CHANGED,
-       n_SIGNALS};
+enum  {
+  BACKEND_CHANGED,
+
+  VARIABLE_CHANGED,
+  VARIABLE_RESIZED,
+  VARIABLE_INSERTED,
+  VARIABLE_DELETED,
+
+  WEIGHT_CHANGED,
+  FILTER_CHANGED,
+  SPLIT_CHANGED,
+  n_SIGNALS
+};
 
 static guint signals [n_SIGNALS];
 
@@ -106,6 +111,17 @@ psppire_dict_class_init (PsppireDictClass *class)
 
   object_class->finalize = psppire_dict_finalize;
 
+  signals [BACKEND_CHANGED] =
+    g_signal_new ("backend-changed",
+		  G_TYPE_FROM_CLASS (class),
+		  G_SIGNAL_RUN_FIRST,
+		  0,
+		  NULL, NULL,
+		  g_cclosure_marshal_VOID__VOID,
+		  G_TYPE_NONE,
+		  0);
+
+
   signals [VARIABLE_CHANGED] =
     g_signal_new ("variable_changed",
 		  G_TYPE_FROM_CLASS (class),
@@ -289,6 +305,7 @@ void
 psppire_dict_replace_dictionary (PsppireDict *dict, struct dictionary *d)
 {
   struct variable *var =  dict_get_weight (d);
+
   dict->dict = d;
 
   weight_changed_callback (d, var ? var_get_dict_index (var) : -1, dict);
@@ -299,6 +316,8 @@ psppire_dict_replace_dictionary (PsppireDict *dict, struct dictionary *d)
   split_changed_callback (d, dict);
 
   dict_set_callbacks (dict->dict, &gui_callbacks, dict);
+
+  g_signal_emit (dict, signals [BACKEND_CHANGED], 0);
 }
 
 
diff --git a/src/ui/gui/psppire-var-store.c b/src/ui/gui/psppire-var-store.c
index c296bfe2c7..f9b2d081fb 100644
--- a/src/ui/gui/psppire-var-store.c
+++ b/src/ui/gui/psppire-var-store.c
@@ -61,6 +61,7 @@ static gboolean psppire_var_store_set_string (GSheetModel *model,
 					  const gchar *text, glong row, glong column);
 
 static glong psppire_var_store_get_row_count (const GSheetModel * model);
+static glong psppire_var_store_get_column_count (const GSheetModel * model);
 
 static gchar *text_for_column (const struct variable *pv, gint c, GError **err);
 
@@ -223,10 +224,12 @@ psppire_var_store_get_font_desc (const GSheetModel *model,
 
 
 
+
 static void
 psppire_var_store_sheet_model_init (GSheetModelIface *iface)
 {
   iface->get_row_count = psppire_var_store_get_row_count;
+  iface->get_column_count = psppire_var_store_get_column_count;
   iface->free_strings = TRUE;
   iface->get_string = psppire_var_store_get_string;
   iface->set_string = psppire_var_store_set_string;
@@ -288,7 +291,13 @@ var_insert_callback (GtkWidget *w, glong row, gpointer data)
   g_sheet_model_rows_inserted (model, row, 1);
 }
 
+static void
+refresh (PsppireDict  *d, gpointer data)
+{
+  PsppireVarStore *vs = data;
 
+  g_sheet_model_range_changed (G_SHEET_MODEL (vs), -1, -1, -1, -1);
+}
 
 /**
  * psppire_var_store_replace_set_dictionary:
@@ -311,9 +320,11 @@ psppire_var_store_set_dictionary (PsppireVarStore *var_store, PsppireDict *dict)
   g_signal_connect (dict, "variable-deleted", G_CALLBACK (var_delete_callback),
 		   var_store);
 
-  g_signal_connect (dict, "variable-inserted", G_CALLBACK (var_insert_callback),
-		   var_store);
+  g_signal_connect (dict, "variable-inserted",
+		    G_CALLBACK (var_insert_callback), var_store);
 
+  g_signal_connect (dict, "backend-changed", G_CALLBACK (refresh),
+		    var_store);
 
   /* The entire model has changed */
   g_sheet_model_range_changed (G_SHEET_MODEL (var_store), -1, -1, -1, -1);
@@ -664,6 +675,13 @@ psppire_var_store_get_row_count (const GSheetModel * model)
   return rows ;
 }
 
+static glong
+psppire_var_store_get_column_count (const GSheetModel * model)
+{
+  return n_COLS ;
+}
+
+
 /* Row related funcs */
 
 static glong
-- 
2.30.2