X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-var-view.c;h=73bd9d8de225cf33fbe86e5768486e6f9d1edfb9;hb=173d1687aea88e0e5e1b1d8615ed68ebefb15d08;hp=da1cc8c109020d9f1886aeeb39d1510227e96767;hpb=fd0c595927a23ea0373551a1eed4570388ea0fc5;p=pspp diff --git a/src/ui/gui/psppire-var-view.c b/src/ui/gui/psppire-var-view.c index da1cc8c109..73bd9d8de2 100644 --- a/src/ui/gui/psppire-var-view.c +++ b/src/ui/gui/psppire-var-view.c @@ -20,6 +20,7 @@ #include #include "psppire-var-view.h" #include "psppire-var-ptr.h" +#include "psppire-select-dest.h" #include @@ -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; } - - -