New interface PsppireSelectDestWidget.
[pspp-builds.git] / src / ui / gui / psppire-var-view.c
index da1cc8c109020d9f1886aeeb39d1510227e96767..f7a017b3364698ba3f1e061c9fc10a66a3fbcc96 100644 (file)
@@ -20,6 +20,7 @@
 #include <gtk/gtkcellrenderertext.h>
 #include "psppire-var-view.h"
 #include "psppire-var-ptr.h"
+#include "psppire-select-dest.h"
 
 #include <data/variable.h>
 
@@ -32,6 +33,35 @@ static void psppire_var_view_base_init     (PsppireVarViewClass *class);
 static void psppire_var_view_class_init    (PsppireVarViewClass *class);
 static void psppire_var_view_init          (PsppireVarView      *var_view);
 
+/* Returns TRUE iff VV contains the item V.
+   V must be an initialised value containing a
+   PSPPIRE_VAR_PTR_TYPE.
+*/
+static gboolean
+var_view_contains_var (PsppireSelectDestWidget *sdm, const GValue *v)
+{
+  gboolean ok;
+  GtkTreeIter iter;
+  PsppireVarView *vv = PSPPIRE_VAR_VIEW (sdm);
+  g_return_val_if_fail (G_VALUE_HOLDS (v, PSPPIRE_VAR_PTR_TYPE), FALSE);
+
+  for (ok = psppire_var_view_get_iter_first (vv, &iter);
+       ok;
+       ok = psppire_var_view_get_iter_next (vv, &iter))
+    {
+      const struct variable *var = psppire_var_view_get_variable (vv, 0, &iter);
+      if (var == g_value_get_boxed (v))
+       return TRUE;
+    }
+
+  return FALSE;
+}
+
+static void
+model_init (PsppireSelectDestWidgetIface *iface)
+{
+  iface->contains_var = var_view_contains_var;
+}
 
 GType
 psppire_var_view_get_type (void)
@@ -53,9 +83,19 @@ psppire_var_view_get_type (void)
        (GInstanceInitFunc) psppire_var_view_init,
       };
 
+      static const GInterfaceInfo var_view_model_info = {
+       (GInterfaceInitFunc) model_init, /* Fill this in */
+       NULL,
+       NULL
+      };
+
       psppire_var_view_type =
        g_type_register_static (GTK_TYPE_TREE_VIEW, "PsppireVarView",
                                &psppire_var_view_info, 0);
+
+      g_type_add_interface_static (psppire_var_view_type,
+                                  PSPPIRE_TYPE_SELECT_DEST_WIDGET,
+                                  &var_view_model_info);
     }
 
   return psppire_var_view_type;
@@ -201,7 +241,6 @@ psppire_var_view_class_init (PsppireVarViewClass *class)
   g_object_class_install_property (object_class,
                                    PROP_N_COLS,
                                    n_cols_spec);
-
 }
 
 
@@ -236,6 +275,36 @@ psppire_var_view_new (void)
 }
 
 
+gboolean
+psppire_var_view_get_iter_first (PsppireVarView *vv, GtkTreeIter *iter)
+{
+  return gtk_tree_model_get_iter_first (GTK_TREE_MODEL (vv->list), iter);
+}
+
+gboolean
+psppire_var_view_get_iter_next (PsppireVarView *vv, GtkTreeIter *iter)
+{
+  return gtk_tree_model_iter_next (GTK_TREE_MODEL (vv->list), iter);
+}
+
+const struct variable *
+psppire_var_view_get_variable (PsppireVarView *vv, gint column, GtkTreeIter *iter)
+{
+  const struct variable *var = NULL;
+  GValue value = {0};
+  gtk_tree_model_get_value (GTK_TREE_MODEL (vv->list), iter, column, &value);
+
+  if ( G_VALUE_TYPE (&value) == PSPPIRE_VAR_PTR_TYPE)
+    var = g_value_get_boxed (&value);
+  else
+    g_critical ("Unsupported type \"%s\", in variable name treeview.",
+               G_VALUE_TYPE_NAME (&value));
+
+  g_value_unset (&value);
+
+  return var;
+}
+
 /*
   Append the names of selected variables to STRING.
   Returns the number of variables appended.
@@ -246,35 +315,18 @@ psppire_var_view_append_names (PsppireVarView *vv, gint column, GString *string)
   gint n_vars = 0;
   GtkTreeIter iter;
 
-  if ( gtk_tree_model_get_iter_first (GTK_TREE_MODEL (vv->list), &iter) )
+  if ( psppire_var_view_get_iter_first (vv, &iter) )
     {
       do
        {
-         GValue value = {0};
-         struct variable *var = NULL;
-         GtkTreePath *path = gtk_tree_model_get_path (GTK_TREE_MODEL (vv->list), &iter);
-
-         gtk_tree_model_get_value (GTK_TREE_MODEL (vv->list), &iter, column, &value);
-
-         if ( G_VALUE_TYPE (&value) == PSPPIRE_VAR_PTR_TYPE)
-           var = g_value_get_boxed (&value);
-         else
-           g_critical ("Unsupported type \"%s\", in variable name treeview.",
-                       G_VALUE_TYPE_NAME (&value));
-
-         g_value_unset (&value);
-
+         const struct variable *var = psppire_var_view_get_variable (vv, column, &iter);
          g_string_append (string, " ");
          g_string_append (string, var_get_name (var));
 
-         gtk_tree_path_free (path);
          n_vars++;
        }
-      while (gtk_tree_model_iter_next (GTK_TREE_MODEL (vv->list), &iter));
+      while (psppire_var_view_get_iter_next (vv, &iter));
     }
 
   return n_vars;
 }
-
-
-