Adapt to new sheet
[pspp] / src / ui / gui / psppire-data-store.c
index fbeb737cf3821113daa51af173222b33ef7f9293..1441afa56a1cee57b645aa2c233d3c37ea77525b 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPPIRE - a graphical user interface for PSPP.
-   Copyright (C) 2006, 2008, 2009, 2010, 2011, 2012  Free Software Foundation
+   Copyright (C) 2006, 2008, 2009, 2010, 2011, 2012, 2013  Free Software Foundation
 
    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
@@ -76,6 +76,90 @@ enum
 
 static guint signals [n_SIGNALS];
 
+static gint
+__tree_model_iter_n_children (GtkTreeModel *tree_model,
+                            GtkTreeIter *iter)
+{
+  PsppireDataStore *store  = PSPPIRE_DATA_STORE (tree_model);
+
+  gint n =  datasheet_get_n_rows (store->datasheet);
+
+  return n;
+}
+
+
+static gint
+__tree_model_get_n_columns (GtkTreeModel *tree_model)
+{
+  PsppireDataStore *store  = PSPPIRE_DATA_STORE (tree_model);
+
+  return psppire_dict_get_value_cnt (store->dict);
+}
+
+
+static gboolean
+__iter_nth_child (GtkTreeModel *tree_model,
+                 GtkTreeIter *iter,
+                 GtkTreeIter *parent,
+                 gint n)
+{
+  PsppireDataStore *store  = PSPPIRE_DATA_STORE (tree_model);
+  
+  g_assert (parent == NULL);
+
+  g_return_val_if_fail (store, FALSE);
+  g_return_val_if_fail (store->datasheet, FALSE);
+
+  if (n >= datasheet_get_n_rows (store->datasheet))
+    {
+      iter->stamp = -1;
+      iter->user_data = NULL;
+      return FALSE;
+    }
+  
+  iter->user_data = n;
+  return TRUE;
+}
+
+
+
+static void
+__get_value (GtkTreeModel *tree_model,
+            GtkTreeIter *iter,
+            gint column,
+            GValue *value)
+{
+  PsppireDataStore *store  = PSPPIRE_DATA_STORE (tree_model);
+
+  g_value_init (value, G_TYPE_DOUBLE);
+
+  gint row = GPOINTER_TO_INT (iter->user_data);
+
+  struct ccase *cc = datasheet_get_row (store->datasheet, row);
+  
+  g_value_set_double (value, case_data_idx (cc, column)->f);
+  case_unref (cc);
+}
+
+
+static void
+__tree_model_init (GtkTreeModelIface *iface)
+{
+  iface->get_flags       = NULL; 
+  iface->get_n_columns   = __tree_model_get_n_columns ;
+  iface->get_column_type = NULL; 
+  iface->get_iter        = NULL; 
+  iface->iter_next       = NULL; 
+  iface->get_path        = NULL; 
+  iface->get_value       = __get_value;
+
+  iface->iter_children   = NULL; 
+  iface->iter_has_child  = NULL; 
+  iface->iter_n_children = __tree_model_iter_n_children;
+  iface->iter_nth_child  = __iter_nth_child;
+  iface->iter_parent     = NULL; 
+}
+
 
 GType
 psppire_data_store_get_type (void)
@@ -97,9 +181,18 @@ psppire_data_store_get_type (void)
         (GInstanceInitFunc) psppire_data_store_init,
       };
 
+      static const GInterfaceInfo tree_model_info = {
+       (GInterfaceInitFunc) __tree_model_init,
+       NULL,
+       NULL
+      };
+
       data_store_type = g_type_register_static (G_TYPE_OBJECT,
                                                "PsppireDataStore",
                                                &data_store_info, 0);
+
+      g_type_add_interface_static (data_store_type, GTK_TYPE_TREE_MODEL,
+                                  &tree_model_info);
     }
 
   return data_store_type;
@@ -205,6 +298,7 @@ delete_variable_callback (GObject *obj, const struct variable *var UNUSED,
 {
   PsppireDataStore *store  = PSPPIRE_DATA_STORE (data);
 
+  g_return_if_fail (store->datasheet);
 
   datasheet_delete_columns (store->datasheet, case_index, 1);
   datasheet_insert_column (store->datasheet, NULL, -1, case_index);
@@ -225,7 +319,10 @@ resize_datum (const union value *old, union value *new, const void *aux_)
   const char *enc = dict_get_encoding (aux->dict);
   const struct fmt_spec *newfmt = var_get_print_format (aux->new_variable);
   char *s = data_out (old, enc, var_get_print_format (aux->old_variable));
-  free (data_in (ss_cstr (s), enc, newfmt->type, new, new_width, enc));
+  enum fmt_type type = (fmt_usable_for_input (newfmt->type)
+                        ? newfmt->type
+                        : FMT_DOLLAR);
+  free (data_in (ss_cstr (s), enc, type, new, new_width, enc));
   free (s);
 }
 
@@ -294,6 +391,9 @@ psppire_data_store_set_reader (PsppireDataStore *ds,
 
   ds->datasheet = datasheet_create (reader);
 
+  g_signal_emit_by_name (ds, "notify", 0, 0);
+  g_print ("Datasheet row count %d\n", datasheet_get_n_rows (ds->datasheet));
+
   if ( ds->dict )
     for (i = 0 ; i < n_dict_signals; ++i )
       {
@@ -389,6 +489,7 @@ psppire_data_store_dispose (GObject *object)
   if (ds->dispose_has_run)
     return;
 
+  psppire_data_store_set_dictionary (ds, NULL);
 
   /* must chain up */
   (* parent_class->dispose) (object);
@@ -431,6 +532,7 @@ psppire_data_store_get_string (PsppireDataStore *store,
   int width;
 
   g_return_val_if_fail (store != NULL, NULL);
+  g_return_val_if_fail (store->datasheet != NULL, NULL);
   g_return_val_if_fail (var != NULL, NULL);
 
   if (row < 0 || row >= datasheet_get_n_rows (store->datasheet))