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/str.h>
25 #include <data/variable.h>
28 #define _(msgid) gettext (msgid)
29 #define N_(msgid) msgid
31 static void psppire_var_view_base_finalize (PsppireVarViewClass *, gpointer);
32 static void psppire_var_view_base_init (PsppireVarViewClass *class);
33 static void psppire_var_view_class_init (PsppireVarViewClass *class);
34 static void psppire_var_view_init (PsppireVarView *var_view);
36 /* Returns TRUE iff VV contains the item V.
37 V must be an initialised value containing a
41 var_view_contains_var (PsppireSelectDestWidget *sdm, const GValue *v)
45 PsppireVarView *vv = PSPPIRE_VAR_VIEW (sdm);
46 g_return_val_if_fail (G_VALUE_HOLDS (v, PSPPIRE_VAR_PTR_TYPE), FALSE);
48 for (ok = psppire_var_view_get_iter_first (vv, &iter);
50 ok = psppire_var_view_get_iter_next (vv, &iter))
52 const struct variable *var = psppire_var_view_get_variable (vv, 0, &iter);
53 if (var == g_value_get_boxed (v))
61 model_init (PsppireSelectDestWidgetIface *iface)
63 iface->contains_var = var_view_contains_var;
67 psppire_var_view_get_type (void)
69 static GType psppire_var_view_type = 0;
71 if (!psppire_var_view_type)
73 static const GTypeInfo psppire_var_view_info =
75 sizeof (PsppireVarViewClass),
76 (GBaseInitFunc) psppire_var_view_base_init,
77 (GBaseFinalizeFunc) psppire_var_view_base_finalize,
78 (GClassInitFunc)psppire_var_view_class_init,
79 (GClassFinalizeFunc) NULL,
81 sizeof (PsppireVarView),
83 (GInstanceInitFunc) psppire_var_view_init,
86 static const GInterfaceInfo var_view_model_info = {
87 (GInterfaceInitFunc) model_init, /* Fill this in */
92 psppire_var_view_type =
93 g_type_register_static (GTK_TYPE_TREE_VIEW, "PsppireVarView",
94 &psppire_var_view_info, 0);
96 g_type_add_interface_static (psppire_var_view_type,
97 PSPPIRE_TYPE_SELECT_DEST_WIDGET,
98 &var_view_model_info);
101 return psppire_var_view_type;
105 psppire_var_view_clear (PsppireVarView *vv)
107 GtkListStore *l = gtk_list_store_newv (vv->n_cols, vv->cols);
109 gtk_tree_view_set_model (GTK_TREE_VIEW (vv), GTK_TREE_MODEL (l));
114 psppire_var_view_finalize (GObject *object)
116 PsppireVarView *var_view = PSPPIRE_VAR_VIEW (object);
117 g_free (var_view->nums);
118 g_free (var_view->cols);
130 /* A (*GtkTreeCellDataFunc) function.
131 This function expects TREEMODEL to hold PSPPIRE_VAR_PTR_TYPE.
132 It renders the name of the variable into CELL.
135 display_cell_var_name (GtkTreeViewColumn *tree_column,
136 GtkCellRenderer *cell,
137 GtkTreeModel *treemodel,
141 struct variable *var;
145 GtkTreePath *path = gtk_tree_model_get_path (treemodel, iter);
147 gtk_tree_model_get_value (treemodel, iter, *col, &value);
149 gtk_tree_path_free (path);
151 var = g_value_get_boxed (&value);
153 g_value_unset (&value);
155 g_object_set (cell, "text", var ? var_get_name (var) : "", NULL);
160 psppire_var_view_get_property (GObject *object,
165 PsppireVarView *var_view = PSPPIRE_VAR_VIEW (object);
170 g_value_set_int (value, var_view->n_cols);
173 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
179 set_renderers (PsppireVarView *var_view)
182 var_view->nums = g_malloc (sizeof *var_view->nums * var_view->n_cols);
184 for (c = 0 ; c < var_view->n_cols; ++c)
186 GtkCellRenderer *renderer = gtk_cell_renderer_text_new ();
187 GtkTreeViewColumn *col = gtk_tree_view_column_new ();
189 gchar *label = g_strdup_printf (_("Var%d"), c + 1);
191 gtk_tree_view_column_set_min_width (col, 100);
192 gtk_tree_view_column_set_sizing (col, GTK_TREE_VIEW_COLUMN_FIXED);
193 gtk_tree_view_column_set_resizable (col, TRUE);
194 gtk_tree_view_column_set_title (col, label);
198 var_view->nums[c] = c;
200 gtk_tree_view_column_pack_start (col, renderer, TRUE);
201 gtk_tree_view_column_set_cell_data_func (col, renderer,
202 display_cell_var_name,
203 &var_view->nums[c], 0);
205 gtk_tree_view_append_column (GTK_TREE_VIEW (var_view), col);
211 psppire_var_view_get_current_model (PsppireVarView *vv)
213 return gtk_tree_view_get_model (GTK_TREE_VIEW (vv));
217 psppire_var_view_set_property (GObject *object,
222 PsppireVarView *var_view = PSPPIRE_VAR_VIEW (object);
229 var_view->n_cols = g_value_get_int (value);
231 var_view->cols = xrealloc (var_view->cols, sizeof (GType) * var_view->n_cols);
233 for (c = 0 ; c < var_view->n_cols; ++c)
234 var_view->cols[c] = PSPPIRE_VAR_PTR_TYPE;
236 set_renderers (var_view);
238 psppire_var_view_clear (var_view);
242 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
248 psppire_var_view_class_init (PsppireVarViewClass *class)
250 GObjectClass *object_class = G_OBJECT_CLASS (class);
252 GParamSpec *n_cols_spec =
253 g_param_spec_int ("n-cols",
255 "The Number of Columns in the Variable View",
258 G_PARAM_CONSTRUCT_ONLY | G_PARAM_READABLE | G_PARAM_WRITABLE);
261 object_class->set_property = psppire_var_view_set_property;
262 object_class->get_property = psppire_var_view_get_property;
264 g_object_class_install_property (object_class,
271 psppire_var_view_base_init (PsppireVarViewClass *class)
274 GObjectClass *object_class = G_OBJECT_CLASS (class);
276 object_class->finalize = psppire_var_view_finalize;
282 psppire_var_view_base_finalize (PsppireVarViewClass *class,
290 psppire_var_view_init (PsppireVarView *vv)
292 GtkTreeSelection* selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (vv));
295 gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE);
300 psppire_var_view_new (void)
302 return GTK_WIDGET (g_object_new (psppire_var_view_get_type (), NULL));
307 psppire_var_view_get_iter_first (PsppireVarView *vv, GtkTreeIter *iter)
310 GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (vv));
311 return gtk_tree_model_get_iter_first (model, iter ? iter : &dummy);
315 psppire_var_view_get_iter_next (PsppireVarView *vv, GtkTreeIter *iter)
317 GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (vv));
318 return gtk_tree_model_iter_next (model, iter);
321 const struct variable *
322 psppire_var_view_get_var_from_model (GtkTreeModel *model, gint column, GtkTreeIter *iter)
324 const struct variable *var = NULL;
326 gtk_tree_model_get_value (model, iter, column, &value);
328 if ( G_VALUE_TYPE (&value) == PSPPIRE_VAR_PTR_TYPE)
329 var = g_value_get_boxed (&value);
331 g_critical ("Unsupported type `%s', in variable name treeview.",
332 G_VALUE_TYPE_NAME (&value));
334 g_value_unset (&value);
339 const struct variable *
340 psppire_var_view_get_variable (PsppireVarView *vv, gint column, GtkTreeIter *iter)
342 GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (vv));
343 return psppire_var_view_get_var_from_model (model, column, iter);
349 Append the names of selected variables to STRING.
350 Returns the number of variables appended.
353 psppire_var_view_append_names (PsppireVarView *vv, gint column, GString *string)
358 if ( psppire_var_view_get_iter_first (vv, &iter) )
362 const struct variable *var = psppire_var_view_get_variable (vv, column, &iter);
363 g_string_append (string, " ");
364 g_string_append (string, var_get_name (var));
368 while (psppire_var_view_get_iter_next (vv, &iter));
374 /* Return a linked list of struct variables which are
376 The caller is responsible for freeing the returned list.
377 The variables however are owned by their dictionary
378 and should not be freed.
381 psppire_var_view_list_names (PsppireVarView *vv, gint column)
386 if ( psppire_var_view_get_iter_first (vv, &iter) )
390 const struct variable *var = psppire_var_view_get_variable (vv, column, &iter);
391 list = g_slist_prepend (list, var);
393 while (psppire_var_view_get_iter_next (vv, &iter));
401 Append the names of selected variables to STR
402 Returns the number of variables appended.
405 psppire_var_view_append_names_str (PsppireVarView *vv, gint column, struct string *str)
410 if ( psppire_var_view_get_iter_first (vv, &iter) )
414 const struct variable *var = psppire_var_view_get_variable (vv, column, &iter);
415 ds_put_cstr (str, " ");
416 ds_put_cstr (str, var_get_name (var));
420 while (psppire_var_view_get_iter_next (vv, &iter));