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_class_init (PsppireVarViewClass *class);
33 static void psppire_var_view_init (PsppireVarView *var_view);
35 /* Returns TRUE iff VV contains the item V.
36 V must be an initialised value containing a
40 var_view_contains_var (PsppireSelectDestWidget *sdm, const GValue *v)
44 PsppireVarView *vv = PSPPIRE_VAR_VIEW (sdm);
45 g_return_val_if_fail (G_VALUE_HOLDS (v, PSPPIRE_VAR_PTR_TYPE), FALSE);
47 for (ok = psppire_var_view_get_iter_first (vv, &iter);
49 ok = psppire_var_view_get_iter_next (vv, &iter))
51 const struct variable *var = psppire_var_view_get_variable (vv, 0, &iter);
52 if (var == g_value_get_boxed (v))
60 model_init (PsppireSelectDestWidgetIface *iface)
62 iface->contains_var = var_view_contains_var;
65 G_DEFINE_TYPE_WITH_CODE (PsppireVarView, psppire_var_view, GTK_TYPE_TREE_VIEW,
66 G_IMPLEMENT_INTERFACE (PSPPIRE_TYPE_SELECT_DEST_WIDGET, model_init))
69 psppire_var_view_clear (PsppireVarView *vv)
71 GtkListStore *l = gtk_list_store_newv (vv->n_cols, vv->cols);
73 gtk_tree_view_set_model (GTK_TREE_VIEW (vv), GTK_TREE_MODEL (l));
78 psppire_var_view_finalize (GObject *object)
80 PsppireVarView *var_view = PSPPIRE_VAR_VIEW (object);
81 g_free (var_view->nums);
82 g_free (var_view->cols);
94 /* A (*GtkTreeCellDataFunc) function.
95 This function expects TREEMODEL to hold PSPPIRE_VAR_PTR_TYPE.
96 It renders the name of the variable into CELL.
99 display_cell_var_name (GtkTreeViewColumn *tree_column,
100 GtkCellRenderer *cell,
101 GtkTreeModel *treemodel,
105 struct variable *var;
109 GtkTreePath *path = gtk_tree_model_get_path (treemodel, iter);
111 gtk_tree_model_get_value (treemodel, iter, *col, &value);
113 gtk_tree_path_free (path);
115 var = g_value_get_boxed (&value);
117 g_value_unset (&value);
119 g_object_set (cell, "text", var ? var_get_name (var) : "", NULL);
124 psppire_var_view_get_property (GObject *object,
129 PsppireVarView *var_view = PSPPIRE_VAR_VIEW (object);
134 g_value_set_int (value, var_view->n_cols);
137 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
143 set_renderers (PsppireVarView *var_view)
146 var_view->nums = g_malloc (sizeof *var_view->nums * var_view->n_cols);
148 for (c = 0 ; c < var_view->n_cols; ++c)
150 GtkCellRenderer *renderer = gtk_cell_renderer_text_new ();
151 GtkTreeViewColumn *col = gtk_tree_view_column_new ();
153 gchar *label = g_strdup_printf (_("Var%d"), c + 1);
155 gtk_tree_view_column_set_min_width (col, 100);
156 gtk_tree_view_column_set_sizing (col, GTK_TREE_VIEW_COLUMN_FIXED);
157 gtk_tree_view_column_set_resizable (col, TRUE);
158 gtk_tree_view_column_set_title (col, label);
162 var_view->nums[c] = c;
164 gtk_tree_view_column_pack_start (col, renderer, TRUE);
165 gtk_tree_view_column_set_cell_data_func (col, renderer,
166 display_cell_var_name,
167 &var_view->nums[c], 0);
169 gtk_tree_view_append_column (GTK_TREE_VIEW (var_view), col);
175 psppire_var_view_get_current_model (PsppireVarView *vv)
177 return gtk_tree_view_get_model (GTK_TREE_VIEW (vv));
181 psppire_var_view_set_property (GObject *object,
186 PsppireVarView *var_view = PSPPIRE_VAR_VIEW (object);
193 var_view->n_cols = g_value_get_int (value);
195 var_view->cols = g_realloc (var_view->cols, sizeof (GType) * var_view->n_cols);
197 for (c = 0 ; c < var_view->n_cols; ++c)
198 var_view->cols[c] = PSPPIRE_VAR_PTR_TYPE;
200 set_renderers (var_view);
202 psppire_var_view_clear (var_view);
206 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
212 psppire_var_view_class_init (PsppireVarViewClass *class)
214 GObjectClass *object_class = G_OBJECT_CLASS (class);
216 object_class->finalize = psppire_var_view_finalize;
218 GParamSpec *n_cols_spec =
219 g_param_spec_int ("n-cols",
221 "The Number of Columns in the Variable View",
224 G_PARAM_CONSTRUCT_ONLY | G_PARAM_READABLE | G_PARAM_WRITABLE);
227 object_class->set_property = psppire_var_view_set_property;
228 object_class->get_property = psppire_var_view_get_property;
230 g_object_class_install_property (object_class,
236 psppire_var_view_init (PsppireVarView *vv)
238 GtkTreeSelection* selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (vv));
241 gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE);
246 psppire_var_view_new (void)
248 return GTK_WIDGET (g_object_new (psppire_var_view_get_type (), NULL));
253 psppire_var_view_get_iter_first (PsppireVarView *vv, GtkTreeIter *iter)
256 GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (vv));
257 return gtk_tree_model_get_iter_first (model, iter ? iter : &dummy);
261 psppire_var_view_get_iter_next (PsppireVarView *vv, GtkTreeIter *iter)
263 GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (vv));
264 return gtk_tree_model_iter_next (model, iter);
267 const struct variable *
268 psppire_var_view_get_var_from_model (GtkTreeModel *model, gint column, GtkTreeIter *iter)
270 const struct variable *var = NULL;
272 gtk_tree_model_get_value (model, iter, column, &value);
274 if (G_VALUE_TYPE (&value) == PSPPIRE_VAR_PTR_TYPE)
275 var = g_value_get_boxed (&value);
277 g_critical ("Unsupported type `%s', in variable name treeview.",
278 G_VALUE_TYPE_NAME (&value));
280 g_value_unset (&value);
285 const struct variable *
286 psppire_var_view_get_variable (PsppireVarView *vv, gint column, GtkTreeIter *iter)
288 GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (vv));
289 return psppire_var_view_get_var_from_model (model, column, iter);
295 Append the names of selected variables to STRING.
296 Returns the number of variables appended.
299 psppire_var_view_append_names (PsppireVarView *vv, gint column, GString *string)
304 if (psppire_var_view_get_iter_first (vv, &iter))
308 const struct variable *var = psppire_var_view_get_variable (vv, column, &iter);
309 g_string_append (string, " ");
310 g_string_append (string, var_get_name (var));
314 while (psppire_var_view_get_iter_next (vv, &iter));
320 /* Return a linked list of struct variables which are
322 The caller is responsible for freeing the returned list.
323 The variables however are owned by their dictionary
324 and should not be freed.
327 psppire_var_view_list_names (PsppireVarView *vv, gint column)
332 if (psppire_var_view_get_iter_first (vv, &iter))
336 const struct variable *var = psppire_var_view_get_variable (vv, column, &iter);
337 list = g_slist_prepend (list, CONST_CAST (struct variable *, var));
339 while (psppire_var_view_get_iter_next (vv, &iter));
347 Append the names of selected variables to STR
348 Returns the number of variables appended.
351 psppire_var_view_append_names_str (PsppireVarView *vv, gint column, struct string *str)
356 if (psppire_var_view_get_iter_first (vv, &iter))
360 const struct variable *var = psppire_var_view_get_variable (vv, column, &iter);
361 ds_put_cstr (str, " ");
362 ds_put_cstr (str, var_get_name (var));
366 while (psppire_var_view_get_iter_next (vv, &iter));