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,
235 struct variable *var;
236 GtkTreeIter dict_iter;
239 g_return_if_fail (GTK_IS_ENTRY(dest));
241 get_base_model (model, &iter, &dict, &dict_iter);
243 path = gtk_tree_model_get_path (GTK_TREE_MODEL (dict), &dict_iter);
245 idx = gtk_tree_path_get_indices (path);
247 var = psppire_dict_get_variable (PSPPIRE_DICT (dict), *idx);
249 gtk_tree_path_free (path);
251 name = pspp_locale_to_utf8 (var_get_name (var), -1, NULL);
252 gtk_entry_set_text (GTK_ENTRY (dest), name);
259 insert_source_row_into_tree_view (GtkTreeIter iter,
266 GtkTreeIter dest_iter;
267 GtkTreeIter dict_iter;
269 GtkTreeModel *destmodel = gtk_tree_view_get_model ( GTK_TREE_VIEW (dest));
274 get_base_model (model, &iter, &dict, &dict_iter);
276 path = gtk_tree_model_get_path (dict, &dict_iter);
278 row = gtk_tree_path_get_indices (path);
280 gtk_list_store_append (GTK_LIST_STORE (destmodel), &dest_iter);
281 gtk_list_store_set (GTK_LIST_STORE (destmodel), &dest_iter, 0, *row, -1);
283 gtk_tree_path_free (path);
288 is_currently_in_entry (GtkTreeModel *model, GtkTreeIter *iter,
289 PsppireSelector *selector)
293 GtkTreeIter dict_iter;
295 struct variable *var;
299 const gchar *text = gtk_entry_get_text (GTK_ENTRY (selector->dest));
301 get_base_model (model, iter, &dict, &dict_iter);
303 path = gtk_tree_model_get_path (dict, &dict_iter);
305 indeces = gtk_tree_path_get_indices (path);
307 dict_index = indeces [0];
309 var = psppire_dict_get_variable (PSPPIRE_DICT (dict), dict_index);
311 gtk_tree_path_free (path);
313 name = pspp_locale_to_utf8 (var_get_name (var), -1, NULL);
314 result = ( 0 == strcmp (text, name));