1 /* PSPPIRE - a graphical user interface for PSPP.
2 Copyright (C) 2009, 2010, 2011 Free Software Foundation
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <http://www.gnu.org/licenses/>. */
20 #include "psppire-var-view.h"
21 #include "psppire-var-ptr.h"
22 #include "psppire-select-dest.h"
24 #include <libpspp/cast.h>
25 #include <libpspp/str.h>
26 #include <data/variable.h>
29 #define _(msgid) gettext (msgid)
30 #define N_(msgid) msgid
32 static void psppire_var_view_base_finalize (PsppireVarViewClass *, gpointer);
33 static void psppire_var_view_base_init (PsppireVarViewClass *class);
34 static void psppire_var_view_class_init (PsppireVarViewClass *class);
35 static void psppire_var_view_init (PsppireVarView *var_view);
37 /* Returns TRUE iff VV contains the item V.
38 V must be an initialised value containing a
42 var_view_contains_var (PsppireSelectDestWidget *sdm, const GValue *v)
46 PsppireVarView *vv = PSPPIRE_VAR_VIEW (sdm);
47 g_return_val_if_fail (G_VALUE_HOLDS (v, PSPPIRE_VAR_PTR_TYPE), FALSE);
49 for (ok = psppire_var_view_get_iter_first (vv, &iter);
51 ok = psppire_var_view_get_iter_next (vv, &iter))
53 const struct variable *var = psppire_var_view_get_variable (vv, 0, &iter);
54 if (var == g_value_get_boxed (v))
62 model_init (PsppireSelectDestWidgetIface *iface)
64 iface->contains_var = var_view_contains_var;
68 psppire_var_view_get_type (void)
70 static GType psppire_var_view_type = 0;
72 if (!psppire_var_view_type)
74 static const GTypeInfo psppire_var_view_info =
76 sizeof (PsppireVarViewClass),
77 (GBaseInitFunc) (void (*)(void)) psppire_var_view_base_init,
78 (GBaseFinalizeFunc) (void (*)(void)) psppire_var_view_base_finalize,
79 (GClassInitFunc) (void (*)(void)) psppire_var_view_class_init,
80 (GClassFinalizeFunc) NULL,
82 sizeof (PsppireVarView),
84 (GInstanceInitFunc) (void (*)(void)) psppire_var_view_init,
85 NULL /* value_table */
88 static const GInterfaceInfo var_view_model_info = {
89 (GInterfaceInitFunc) (void (*)(void)) model_init, /* Fill this in */
94 psppire_var_view_type =
95 g_type_register_static (GTK_TYPE_TREE_VIEW, "PsppireVarView",
96 &psppire_var_view_info, 0);
98 g_type_add_interface_static (psppire_var_view_type,
99 PSPPIRE_TYPE_SELECT_DEST_WIDGET,
100 &var_view_model_info);
103 return psppire_var_view_type;
107 psppire_var_view_clear (PsppireVarView *vv)
109 GtkListStore *l = gtk_list_store_newv (vv->n_cols, vv->cols);
111 gtk_tree_view_set_model (GTK_TREE_VIEW (vv), GTK_TREE_MODEL (l));
116 psppire_var_view_finalize (GObject *object)
118 PsppireVarView *var_view = PSPPIRE_VAR_VIEW (object);
119 g_free (var_view->nums);
120 g_free (var_view->cols);
132 /* A (*GtkTreeCellDataFunc) function.
133 This function expects TREEMODEL to hold PSPPIRE_VAR_PTR_TYPE.
134 It renders the name of the variable into CELL.
137 display_cell_var_name (GtkTreeViewColumn *tree_column,
138 GtkCellRenderer *cell,
139 GtkTreeModel *treemodel,
143 struct variable *var;
147 GtkTreePath *path = gtk_tree_model_get_path (treemodel, iter);
149 gtk_tree_model_get_value (treemodel, iter, *col, &value);
151 gtk_tree_path_free (path);
153 var = g_value_get_boxed (&value);
155 g_value_unset (&value);
157 g_object_set (cell, "text", var ? var_get_name (var) : "", NULL);
162 psppire_var_view_get_property (GObject *object,
167 PsppireVarView *var_view = PSPPIRE_VAR_VIEW (object);
172 g_value_set_int (value, var_view->n_cols);
175 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
181 set_renderers (PsppireVarView *var_view)
184 var_view->nums = g_malloc (sizeof *var_view->nums * var_view->n_cols);
186 for (c = 0 ; c < var_view->n_cols; ++c)
188 GtkCellRenderer *renderer = gtk_cell_renderer_text_new ();
189 GtkTreeViewColumn *col = gtk_tree_view_column_new ();
191 gchar *label = g_strdup_printf (_("Var%d"), c + 1);
193 gtk_tree_view_column_set_min_width (col, 100);
194 gtk_tree_view_column_set_sizing (col, GTK_TREE_VIEW_COLUMN_FIXED);
195 gtk_tree_view_column_set_resizable (col, TRUE);
196 gtk_tree_view_column_set_title (col, label);
200 var_view->nums[c] = c;
202 gtk_tree_view_column_pack_start (col, renderer, TRUE);
203 gtk_tree_view_column_set_cell_data_func (col, renderer,
204 display_cell_var_name,
205 &var_view->nums[c], 0);
207 gtk_tree_view_append_column (GTK_TREE_VIEW (var_view), col);
213 psppire_var_view_get_current_model (PsppireVarView *vv)
215 return gtk_tree_view_get_model (GTK_TREE_VIEW (vv));
219 psppire_var_view_set_property (GObject *object,
224 PsppireVarView *var_view = PSPPIRE_VAR_VIEW (object);
231 var_view->n_cols = g_value_get_int (value);
233 var_view->cols = g_realloc (var_view->cols, sizeof (GType) * var_view->n_cols);
235 for (c = 0 ; c < var_view->n_cols; ++c)
236 var_view->cols[c] = PSPPIRE_VAR_PTR_TYPE;
238 set_renderers (var_view);
240 psppire_var_view_clear (var_view);
244 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
250 psppire_var_view_class_init (PsppireVarViewClass *class)
252 GObjectClass *object_class = G_OBJECT_CLASS (class);
254 GParamSpec *n_cols_spec =
255 g_param_spec_int ("n-cols",
257 "The Number of Columns in the Variable View",
260 G_PARAM_CONSTRUCT_ONLY | G_PARAM_READABLE | G_PARAM_WRITABLE);
263 object_class->set_property = psppire_var_view_set_property;
264 object_class->get_property = psppire_var_view_get_property;
266 g_object_class_install_property (object_class,
273 psppire_var_view_base_init (PsppireVarViewClass *class)
276 GObjectClass *object_class = G_OBJECT_CLASS (class);
278 object_class->finalize = psppire_var_view_finalize;
284 psppire_var_view_base_finalize (PsppireVarViewClass *class,
292 psppire_var_view_init (PsppireVarView *vv)
294 GtkTreeSelection* selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (vv));
297 gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE);
302 psppire_var_view_new (void)
304 return GTK_WIDGET (g_object_new (psppire_var_view_get_type (), NULL));
309 psppire_var_view_get_iter_first (PsppireVarView *vv, GtkTreeIter *iter)
312 GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (vv));
313 return gtk_tree_model_get_iter_first (model, iter ? iter : &dummy);
317 psppire_var_view_get_iter_next (PsppireVarView *vv, GtkTreeIter *iter)
319 GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (vv));
320 return gtk_tree_model_iter_next (model, iter);
323 const struct variable *
324 psppire_var_view_get_var_from_model (GtkTreeModel *model, gint column, GtkTreeIter *iter)
326 const struct variable *var = NULL;
328 gtk_tree_model_get_value (model, iter, column, &value);
330 if (G_VALUE_TYPE (&value) == PSPPIRE_VAR_PTR_TYPE)
331 var = g_value_get_boxed (&value);
333 g_critical ("Unsupported type `%s', in variable name treeview.",
334 G_VALUE_TYPE_NAME (&value));
336 g_value_unset (&value);
341 const struct variable *
342 psppire_var_view_get_variable (PsppireVarView *vv, gint column, GtkTreeIter *iter)
344 GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (vv));
345 return psppire_var_view_get_var_from_model (model, column, iter);
351 Append the names of selected variables to STRING.
352 Returns the number of variables appended.
355 psppire_var_view_append_names (PsppireVarView *vv, gint column, GString *string)
360 if (psppire_var_view_get_iter_first (vv, &iter))
364 const struct variable *var = psppire_var_view_get_variable (vv, column, &iter);
365 g_string_append (string, " ");
366 g_string_append (string, var_get_name (var));
370 while (psppire_var_view_get_iter_next (vv, &iter));
376 /* Return a linked list of struct variables which are
378 The caller is responsible for freeing the returned list.
379 The variables however are owned by their dictionary
380 and should not be freed.
383 psppire_var_view_list_names (PsppireVarView *vv, gint column)
388 if (psppire_var_view_get_iter_first (vv, &iter))
392 const struct variable *var = psppire_var_view_get_variable (vv, column, &iter);
393 list = g_slist_prepend (list, CONST_CAST (struct variable *, var));
395 while (psppire_var_view_get_iter_next (vv, &iter));
403 Append the names of selected variables to STR
404 Returns the number of variables appended.
407 psppire_var_view_append_names_str (PsppireVarView *vv, gint column, struct string *str)
412 if (psppire_var_view_get_iter_first (vv, &iter))
416 const struct variable *var = psppire_var_view_get_variable (vv, column, &iter);
417 ds_put_cstr (str, " ");
418 ds_put_cstr (str, var_get_name (var));
422 while (psppire_var_view_get_iter_next (vv, &iter));