X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Fui%2Fgui%2Fpsppire-var-view.c;h=009aad62d03eec6539a22ffaf9a9580452058e2c;hb=4994c34bb5a7d1da401b7b9552a91c9ccfd42566;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..009aad62d0 100644 --- a/src/ui/gui/psppire-var-view.c +++ b/src/ui/gui/psppire-var-view.c @@ -1,5 +1,5 @@ /* PSPPIRE - a graphical user interface for PSPP. - Copyright (C) 2009 Free Software Foundation + Copyright (C) 2009, 2010, 2011 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 @@ -16,10 +16,10 @@ #include -#include -#include +#include #include "psppire-var-view.h" #include "psppire-var-ptr.h" +#include "psppire-select-dest.h" #include @@ -32,6 +32,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 +82,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; @@ -101,7 +140,7 @@ display_cell_var_name (GtkTreeViewColumn *tree_column, g_value_unset (&value); - g_object_set (cell, "text", var_get_name (var), NULL); + g_object_set (cell, "text", var ? var_get_name (var) : "", NULL); } @@ -201,7 +240,6 @@ psppire_var_view_class_init (PsppireVarViewClass *class) g_object_class_install_property (object_class, PROP_N_COLS, n_cols_spec); - } @@ -236,6 +274,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 +314,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; } - - -