2 PSPPIRE --- A Graphical User Interface for PSPP
3 Copyright (C) 2007 Free Software Foundation
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
25 #include "dict-display.h"
27 #include "psppire-dict.h"
29 #include <data/variable.h>
31 #define _(msgid) gettext (msgid)
32 #define N_(msgid) msgid
35 /* A GtkTreeModelFilterVisibleFunc to filter lines in the treeview */
37 filter_variables (GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
39 var_predicate_func *predicate = data;
41 PsppireDict *dict = PSPPIRE_DICT (model);
43 GtkTreePath *path = gtk_tree_model_get_path (model, iter);
45 gint *idx = gtk_tree_path_get_indices (path);
47 var = psppire_dict_get_variable (dict, *idx);
49 gtk_tree_path_free (path);
51 return predicate (var);
54 /* A GtkTreeCellDataFunc which sets the icon appropriate to the type
57 var_icon_cell_data_func (GtkTreeViewColumn *col,
58 GtkCellRenderer *cell,
64 gtk_tree_model_get (model, iter, DICT_TVM_COL_VAR, &var, -1);
66 if ( var_is_alpha (var))
68 g_object_set (cell, "stock-id", "var-string", NULL);
72 const struct fmt_spec *fs = var_get_write_format (var);
73 int cat = fmt_get_category (fs->type);
74 switch ( var_get_measure (var))
77 g_object_set (cell, "stock-id", "var-nominal", NULL);
80 g_object_set (cell, "stock-id", "var-ordinal", NULL);
83 if ( ( FMT_CAT_DATE | FMT_CAT_TIME ) & cat )
84 g_object_set (cell, "stock-id", "var-date-scale", NULL);
86 g_object_set (cell, "stock-id", "var-scale", NULL);
89 g_assert_not_reached ();
96 get_base_model (GtkTreeModel *top_model, GtkTreeIter *top_iter,
97 GtkTreeModel **model, GtkTreeIter *iter
102 while (GTK_IS_TREE_MODEL_FILTER (*model))
104 GtkTreeIter parent_iter = *iter;
105 GtkTreeModelFilter *parent_model = GTK_TREE_MODEL_FILTER (*model);
107 *model = gtk_tree_model_filter_get_model (parent_model);
109 gtk_tree_model_filter_convert_iter_to_child_iter (parent_model,
114 g_assert (PSPPIRE_IS_DICT (*model));
117 /* A GtkTreeCellDataFunc which renders the name and/or label of the
120 var_description_cell_data_func (GtkTreeViewColumn *col,
121 GtkCellRenderer *cell,
122 GtkTreeModel *top_model,
123 GtkTreeIter *top_iter,
126 struct variable *var;
131 get_base_model (top_model, top_iter, &model, &iter);
133 g_assert (PSPPIRE_IS_DICT (model));
136 gtk_tree_model_get (model,
137 &iter, DICT_TVM_COL_VAR, &var, -1);
139 if ( var_has_label (var))
141 gchar *text = g_strdup_printf (
142 "<span stretch=\"condensed\">%s</span>"
143 " (<span weight=\"bold\">%s</span>)",
147 char *utf8 = pspp_locale_to_utf8 (text, -1, NULL);
150 g_object_set (cell, "markup", utf8, NULL);
155 g_object_set (cell, "text", var_get_name (var), NULL);
159 /* Sets up TREEVIEW to display the variables of DICT.
160 MODE is the selection mode for TREEVIEW.
161 PREDICATE determines which variables should be visible, or NULL if
162 all are to be visible.
165 attach_dictionary_to_treeview (GtkTreeView *treeview, PsppireDict *dict,
166 GtkSelectionMode mode,
167 var_predicate_func *predicate
170 GtkTreeViewColumn *col;
172 GtkTreeSelection *selection =
173 gtk_tree_view_get_selection (treeview);
175 GtkCellRenderer *renderer;
177 GtkTreeModel *model ;
181 model = gtk_tree_model_filter_new (GTK_TREE_MODEL (dict),
184 gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (model),
191 model = GTK_TREE_MODEL (dict);
194 gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), model);
197 col = gtk_tree_view_column_new ();
198 gtk_tree_view_column_set_title (col, _("Variable"));
200 renderer = gtk_cell_renderer_pixbuf_new ();
201 gtk_tree_view_column_pack_start (col, renderer, FALSE);
203 gtk_tree_view_column_set_cell_data_func (col, renderer,
204 var_icon_cell_data_func,
208 renderer = gtk_cell_renderer_text_new ();
209 gtk_tree_view_column_pack_start (col, renderer, TRUE);
210 gtk_tree_view_column_set_cell_data_func (col, renderer,
211 var_description_cell_data_func,
214 g_object_set (renderer, "ellipsize-set", TRUE, NULL);
215 g_object_set (renderer, "ellipsize", PANGO_ELLIPSIZE_MIDDLE, NULL);
217 gtk_tree_view_column_set_sizing (col, GTK_TREE_VIEW_COLUMN_FIXED);
219 /* FIXME: make this a value in terms of character widths */
220 gtk_tree_view_column_set_min_width (col, 150);
222 gtk_tree_view_append_column (treeview, col);
224 gtk_tree_selection_set_mode (selection, mode);
229 insert_source_row_into_entry (GtkTreeIter iter,
237 struct variable *var;
238 GtkTreeIter dict_iter;
241 g_return_if_fail (GTK_IS_ENTRY(dest));
243 get_base_model (model, &iter, &dict, &dict_iter);
245 path = gtk_tree_model_get_path (GTK_TREE_MODEL (dict), &dict_iter);
247 idx = gtk_tree_path_get_indices (path);
249 var = psppire_dict_get_variable (PSPPIRE_DICT (dict), *idx);
251 gtk_tree_path_free (path);
253 name = pspp_locale_to_utf8 (var_get_name (var), -1, NULL);
254 gtk_entry_set_text (GTK_ENTRY (dest), name);
261 insert_source_row_into_tree_view (GtkTreeIter iter,
267 GtkTreeIter dest_iter;
268 GtkTreeIter dict_iter;
270 GtkTreeModel *destmodel = gtk_tree_view_get_model ( GTK_TREE_VIEW (dest));
275 get_base_model (model, &iter, &dict, &dict_iter);
277 path = gtk_tree_model_get_path (dict, &dict_iter);
279 row = gtk_tree_path_get_indices (path);
281 gtk_list_store_append (GTK_LIST_STORE (destmodel), &dest_iter);
282 gtk_list_store_set (GTK_LIST_STORE (destmodel), &dest_iter, 0, *row, -1);
284 gtk_tree_path_free (path);
289 is_currently_in_entry (GtkTreeModel *model, GtkTreeIter *iter,
290 PsppireSelector *selector)
294 GtkTreeIter dict_iter;
296 struct variable *var;
300 const gchar *text = gtk_entry_get_text (GTK_ENTRY (selector->dest));
302 get_base_model (model, iter, &dict, &dict_iter);
304 path = gtk_tree_model_get_path (dict, &dict_iter);
306 indeces = gtk_tree_path_get_indices (path);
308 dict_index = indeces [0];
310 var = psppire_dict_get_variable (PSPPIRE_DICT (dict), dict_index);
312 gtk_tree_path_free (path);
314 name = pspp_locale_to_utf8 (var_get_name (var), -1, NULL);
315 result = ( 0 == strcmp (text, name));