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 "psppire-conf.h"
23 #include "dict-display.h"
25 #include "psppire-dict.h"
27 #include <data/variable.h>
28 #include <data/format.h>
30 #define _(msgid) gettext (msgid)
31 #define N_(msgid) msgid
34 /* A GtkTreeModelFilterVisibleFunc to filter lines in the treeview */
36 filter_variables (GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
38 var_predicate_func *predicate = data;
40 PsppireDict *dict = PSPPIRE_DICT (model);
42 GtkTreePath *path = gtk_tree_model_get_path (model, iter);
44 gint *idx = gtk_tree_path_get_indices (path);
46 var = psppire_dict_get_variable (dict, *idx);
48 gtk_tree_path_free (path);
50 return predicate (var);
53 /* A GtkTreeCellDataFunc which sets the icon appropriate to the type
56 var_icon_cell_data_func (GtkTreeViewColumn *col,
57 GtkCellRenderer *cell,
63 gtk_tree_model_get (model, iter, DICT_TVM_COL_VAR, &var, -1);
65 if ( var_is_alpha (var))
67 g_object_set (cell, "stock-id", "var-string", NULL);
71 const struct fmt_spec *fs = var_get_write_format (var);
72 int cat = fmt_get_category (fs->type);
73 switch ( var_get_measure (var))
76 g_object_set (cell, "stock-id", "var-nominal", NULL);
79 g_object_set (cell, "stock-id", "var-ordinal", NULL);
82 if ( ( FMT_CAT_DATE | FMT_CAT_TIME ) & cat )
83 g_object_set (cell, "stock-id", "var-date-scale", NULL);
85 g_object_set (cell, "stock-id", "var-scale", NULL);
88 g_assert_not_reached ();
95 get_base_model (GtkTreeModel *top_model, GtkTreeIter *top_iter,
96 GtkTreeModel **model, GtkTreeIter *iter
101 while (GTK_IS_TREE_MODEL_FILTER (*model))
103 GtkTreeIter parent_iter = *iter;
104 GtkTreeModelFilter *parent_model = GTK_TREE_MODEL_FILTER (*model);
106 *model = gtk_tree_model_filter_get_model (parent_model);
108 gtk_tree_model_filter_convert_iter_to_child_iter (parent_model,
113 g_assert (PSPPIRE_IS_DICT (*model));
116 /* A GtkTreeCellDataFunc which renders the name and/or label of the
119 var_description_cell_data_func (GtkTreeViewColumn *col,
120 GtkCellRenderer *cell,
121 GtkTreeModel *top_model,
122 GtkTreeIter *top_iter,
125 struct variable *var;
128 gboolean prefer_labels = FALSE;
130 PsppireConf *conf = psppire_conf_new ();
132 psppire_conf_get_boolean (conf, "dialog-boxes", "prefer-labels",
135 get_base_model (top_model, top_iter, &model, &iter);
137 g_assert (PSPPIRE_IS_DICT (model));
140 gtk_tree_model_get (model,
141 &iter, DICT_TVM_COL_VAR, &var, -1);
143 if ( var_has_label (var) && prefer_labels)
145 gchar *text = g_strdup_printf (
146 "<span stretch=\"condensed\">%s</span>",
147 var_get_label (var));
149 char *utf8 = pspp_locale_to_utf8 (text, -1, NULL);
152 g_object_set (cell, "markup", utf8, NULL);
157 char *name = pspp_locale_to_utf8 (var_get_name (var), -1, NULL);
158 g_object_set (cell, "text", name, NULL);
164 /* Sets the tooltip to be the name of the variable under the cursor */
166 set_tooltip_for_variable (GtkTreeView *treeview,
169 gboolean keyboard_mode,
177 GtkTreeModel *tree_model;
178 struct variable *var = NULL;
182 gtk_tree_view_convert_widget_to_bin_window_coords (treeview,
185 if (!gtk_tree_view_get_path_at_pos (treeview, bx, by,
186 &path, NULL, NULL, NULL))
189 tree_model = gtk_tree_view_get_model (treeview);
192 gtk_tree_view_set_tooltip_row (treeview, tooltip, path);
194 ok = gtk_tree_model_get_iter (tree_model, &iter, path);
196 gtk_tree_path_free (path);
201 gtk_tree_model_get (tree_model, &iter, DICT_TVM_COL_VAR, &var, -1);
203 if ( ! var_has_label (var))
208 gboolean prefer_labels = FALSE;
210 PsppireConf *conf = psppire_conf_new ();
212 psppire_conf_get_boolean (conf, "dialog-boxes", "prefer-labels",
216 tip = pspp_locale_to_utf8 (var_get_name (var), -1, NULL);
218 tip = pspp_locale_to_utf8 (var_get_label (var), -1, NULL);
220 gtk_tooltip_set_text (tooltip, tip);
228 /* Sets up TREEVIEW to display the variables of DICT.
229 MODE is the selection mode for TREEVIEW.
230 PREDICATE determines which variables should be visible, or NULL if
231 all are to be visible.
234 attach_dictionary_to_treeview (GtkTreeView *treeview, PsppireDict *dict,
235 GtkSelectionMode mode,
236 var_predicate_func *predicate
239 GtkTreeViewColumn *col;
241 GtkTreeSelection *selection =
242 gtk_tree_view_get_selection (treeview);
244 GtkCellRenderer *renderer;
246 GtkTreeModel *model ;
250 model = gtk_tree_model_filter_new (GTK_TREE_MODEL (dict),
253 gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (model),
260 model = GTK_TREE_MODEL (dict);
263 gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), model);
266 col = gtk_tree_view_column_new ();
267 gtk_tree_view_column_set_title (col, _("Variable"));
269 renderer = gtk_cell_renderer_pixbuf_new ();
270 gtk_tree_view_column_pack_start (col, renderer, FALSE);
272 gtk_tree_view_column_set_cell_data_func (col, renderer,
273 var_icon_cell_data_func,
277 renderer = gtk_cell_renderer_text_new ();
278 gtk_tree_view_column_pack_start (col, renderer, TRUE);
279 gtk_tree_view_column_set_cell_data_func (col, renderer,
280 var_description_cell_data_func,
283 g_object_set (renderer, "ellipsize-set", TRUE, NULL);
284 g_object_set (renderer, "ellipsize", PANGO_ELLIPSIZE_MIDDLE, NULL);
286 gtk_tree_view_column_set_sizing (col, GTK_TREE_VIEW_COLUMN_FIXED);
288 /* FIXME: make this a value in terms of character widths */
289 gtk_tree_view_column_set_min_width (col, 150);
291 gtk_tree_view_append_column (treeview, col);
293 gtk_tree_selection_set_mode (selection, mode);
295 g_object_set (treeview, "has-tooltip", TRUE, NULL);
297 g_signal_connect (treeview, "query-tooltip", G_CALLBACK (set_tooltip_for_variable), NULL);
302 insert_source_row_into_entry (GtkTreeIter iter,
311 struct variable *var;
312 GtkTreeIter dict_iter;
315 g_return_if_fail (GTK_IS_ENTRY(dest));
317 get_base_model (model, &iter, &dict, &dict_iter);
319 path = gtk_tree_model_get_path (GTK_TREE_MODEL (dict), &dict_iter);
321 idx = gtk_tree_path_get_indices (path);
323 var = psppire_dict_get_variable (PSPPIRE_DICT (dict), *idx);
325 gtk_tree_path_free (path);
327 name = pspp_locale_to_utf8 (var_get_name (var), -1, NULL);
328 gtk_entry_set_text (GTK_ENTRY (dest), name);
335 insert_source_row_into_tree_view (GtkTreeIter iter,
342 GtkTreeIter dest_iter;
343 GtkTreeIter dict_iter;
345 GtkTreeModel *destmodel = gtk_tree_view_get_model ( GTK_TREE_VIEW (dest));
350 get_base_model (model, &iter, &dict, &dict_iter);
352 path = gtk_tree_model_get_path (dict, &dict_iter);
354 row = gtk_tree_path_get_indices (path);
356 gtk_list_store_append (GTK_LIST_STORE (destmodel), &dest_iter);
357 gtk_list_store_set (GTK_LIST_STORE (destmodel), &dest_iter, 0, *row, -1);
359 gtk_tree_path_free (path);
364 is_currently_in_entry (GtkTreeModel *model, GtkTreeIter *iter,
365 PsppireSelector *selector)
369 GtkTreeIter dict_iter;
371 struct variable *var;
375 const gchar *text = gtk_entry_get_text (GTK_ENTRY (selector->dest));
377 get_base_model (model, iter, &dict, &dict_iter);
379 path = gtk_tree_model_get_path (dict, &dict_iter);
381 indeces = gtk_tree_path_get_indices (path);
383 dict_index = indeces [0];
385 var = psppire_dict_get_variable (PSPPIRE_DICT (dict), dict_index);
387 gtk_tree_path_free (path);
389 name = pspp_locale_to_utf8 (var_get_name (var), -1, NULL);
390 result = ( 0 == strcmp (text, name));