1 /* PSPPIRE - a graphical user interface for PSPP.
2 Copyright (C) 2007 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/>. */
22 #include "dict-display.h"
24 #include "psppire-dict.h"
26 #include <data/variable.h>
28 #define _(msgid) gettext (msgid)
29 #define N_(msgid) msgid
32 /* A GtkTreeModelFilterVisibleFunc to filter lines in the treeview */
34 filter_variables (GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
36 var_predicate_func *predicate = data;
38 PsppireDict *dict = PSPPIRE_DICT (model);
40 GtkTreePath *path = gtk_tree_model_get_path (model, iter);
42 gint *idx = gtk_tree_path_get_indices (path);
44 var = psppire_dict_get_variable (dict, *idx);
46 gtk_tree_path_free (path);
48 return predicate (var);
51 /* A GtkTreeCellDataFunc which sets the icon appropriate to the type
54 var_icon_cell_data_func (GtkTreeViewColumn *col,
55 GtkCellRenderer *cell,
61 gtk_tree_model_get (model, iter, DICT_TVM_COL_VAR, &var, -1);
63 if ( var_is_alpha (var))
65 g_object_set (cell, "stock-id", "var-string", NULL);
69 const struct fmt_spec *fs = var_get_write_format (var);
70 int cat = fmt_get_category (fs->type);
71 switch ( var_get_measure (var))
74 g_object_set (cell, "stock-id", "var-nominal", NULL);
77 g_object_set (cell, "stock-id", "var-ordinal", NULL);
80 if ( ( FMT_CAT_DATE | FMT_CAT_TIME ) & cat )
81 g_object_set (cell, "stock-id", "var-date-scale", NULL);
83 g_object_set (cell, "stock-id", "var-scale", NULL);
86 g_assert_not_reached ();
93 get_base_model (GtkTreeModel *top_model, GtkTreeIter *top_iter,
94 GtkTreeModel **model, GtkTreeIter *iter
99 while (GTK_IS_TREE_MODEL_FILTER (*model))
101 GtkTreeIter parent_iter = *iter;
102 GtkTreeModelFilter *parent_model = GTK_TREE_MODEL_FILTER (*model);
104 *model = gtk_tree_model_filter_get_model (parent_model);
106 gtk_tree_model_filter_convert_iter_to_child_iter (parent_model,
111 g_assert (PSPPIRE_IS_DICT (*model));
114 /* A GtkTreeCellDataFunc which renders the name and/or label of the
117 var_description_cell_data_func (GtkTreeViewColumn *col,
118 GtkCellRenderer *cell,
119 GtkTreeModel *top_model,
120 GtkTreeIter *top_iter,
123 struct variable *var;
128 get_base_model (top_model, top_iter, &model, &iter);
130 g_assert (PSPPIRE_IS_DICT (model));
133 gtk_tree_model_get (model,
134 &iter, DICT_TVM_COL_VAR, &var, -1);
136 if ( var_has_label (var))
138 gchar *text = g_strdup_printf (
139 "<span stretch=\"condensed\">%s</span>"
140 " (<span weight=\"bold\">%s</span>)",
144 char *utf8 = pspp_locale_to_utf8 (text, -1, NULL);
147 g_object_set (cell, "markup", utf8, NULL);
152 g_object_set (cell, "text", var_get_name (var), NULL);
156 /* Sets up TREEVIEW to display the variables of DICT.
157 MODE is the selection mode for TREEVIEW.
158 PREDICATE determines which variables should be visible, or NULL if
159 all are to be visible.
162 attach_dictionary_to_treeview (GtkTreeView *treeview, PsppireDict *dict,
163 GtkSelectionMode mode,
164 var_predicate_func *predicate
167 GtkTreeViewColumn *col;
169 GtkTreeSelection *selection =
170 gtk_tree_view_get_selection (treeview);
172 GtkCellRenderer *renderer;
174 GtkTreeModel *model ;
178 model = gtk_tree_model_filter_new (GTK_TREE_MODEL (dict),
181 gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (model),
188 model = GTK_TREE_MODEL (dict);
191 gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), model);
194 col = gtk_tree_view_column_new ();
195 gtk_tree_view_column_set_title (col, _("Variable"));
197 renderer = gtk_cell_renderer_pixbuf_new ();
198 gtk_tree_view_column_pack_start (col, renderer, FALSE);
200 gtk_tree_view_column_set_cell_data_func (col, renderer,
201 var_icon_cell_data_func,
205 renderer = gtk_cell_renderer_text_new ();
206 gtk_tree_view_column_pack_start (col, renderer, TRUE);
207 gtk_tree_view_column_set_cell_data_func (col, renderer,
208 var_description_cell_data_func,
211 g_object_set (renderer, "ellipsize-set", TRUE, NULL);
212 g_object_set (renderer, "ellipsize", PANGO_ELLIPSIZE_MIDDLE, NULL);
214 gtk_tree_view_column_set_sizing (col, GTK_TREE_VIEW_COLUMN_FIXED);
216 /* FIXME: make this a value in terms of character widths */
217 gtk_tree_view_column_set_min_width (col, 150);
219 gtk_tree_view_append_column (treeview, col);
221 gtk_tree_selection_set_mode (selection, mode);
226 insert_source_row_into_entry (GtkTreeIter iter,
234 struct variable *var;
235 GtkTreeIter dict_iter;
238 g_return_if_fail (GTK_IS_ENTRY(dest));
240 get_base_model (model, &iter, &dict, &dict_iter);
242 path = gtk_tree_model_get_path (GTK_TREE_MODEL (dict), &dict_iter);
244 idx = gtk_tree_path_get_indices (path);
246 var = psppire_dict_get_variable (PSPPIRE_DICT (dict), *idx);
248 gtk_tree_path_free (path);
250 name = pspp_locale_to_utf8 (var_get_name (var), -1, NULL);
251 gtk_entry_set_text (GTK_ENTRY (dest), name);
258 insert_source_row_into_tree_view (GtkTreeIter iter,
264 GtkTreeIter dest_iter;
265 GtkTreeIter dict_iter;
267 GtkTreeModel *destmodel = gtk_tree_view_get_model ( GTK_TREE_VIEW (dest));
272 get_base_model (model, &iter, &dict, &dict_iter);
274 path = gtk_tree_model_get_path (dict, &dict_iter);
276 row = gtk_tree_path_get_indices (path);
278 gtk_list_store_append (GTK_LIST_STORE (destmodel), &dest_iter);
279 gtk_list_store_set (GTK_LIST_STORE (destmodel), &dest_iter, 0, *row, -1);
281 gtk_tree_path_free (path);
286 is_currently_in_entry (GtkTreeModel *model, GtkTreeIter *iter,
287 PsppireSelector *selector)
291 GtkTreeIter dict_iter;
293 struct variable *var;
297 const gchar *text = gtk_entry_get_text (GTK_ENTRY (selector->dest));
299 get_base_model (model, iter, &dict, &dict_iter);
301 path = gtk_tree_model_get_path (dict, &dict_iter);
303 indeces = gtk_tree_path_get_indices (path);
305 dict_index = indeces [0];
307 var = psppire_dict_get_variable (PSPPIRE_DICT (dict), dict_index);
309 gtk_tree_path_free (path);
311 name = pspp_locale_to_utf8 (var_get_name (var), -1, NULL);
312 result = ( 0 == strcmp (text, name));