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>
27 #include <data/format.h>
29 #define _(msgid) gettext (msgid)
30 #define N_(msgid) msgid
33 /* A GtkTreeModelFilterVisibleFunc to filter lines in the treeview */
35 filter_variables (GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
37 var_predicate_func *predicate = data;
39 PsppireDict *dict = PSPPIRE_DICT (model);
41 GtkTreePath *path = gtk_tree_model_get_path (model, iter);
43 gint *idx = gtk_tree_path_get_indices (path);
45 var = psppire_dict_get_variable (dict, *idx);
47 gtk_tree_path_free (path);
49 return predicate (var);
52 /* A GtkTreeCellDataFunc which sets the icon appropriate to the type
55 var_icon_cell_data_func (GtkTreeViewColumn *col,
56 GtkCellRenderer *cell,
62 gtk_tree_model_get (model, iter, DICT_TVM_COL_VAR, &var, -1);
64 if ( var_is_alpha (var))
66 g_object_set (cell, "stock-id", "var-string", NULL);
70 const struct fmt_spec *fs = var_get_write_format (var);
71 int cat = fmt_get_category (fs->type);
72 switch ( var_get_measure (var))
75 g_object_set (cell, "stock-id", "var-nominal", NULL);
78 g_object_set (cell, "stock-id", "var-ordinal", NULL);
81 if ( ( FMT_CAT_DATE | FMT_CAT_TIME ) & cat )
82 g_object_set (cell, "stock-id", "var-date-scale", NULL);
84 g_object_set (cell, "stock-id", "var-scale", NULL);
87 g_assert_not_reached ();
94 get_base_model (GtkTreeModel *top_model, GtkTreeIter *top_iter,
95 GtkTreeModel **model, GtkTreeIter *iter
100 while (GTK_IS_TREE_MODEL_FILTER (*model))
102 GtkTreeIter parent_iter = *iter;
103 GtkTreeModelFilter *parent_model = GTK_TREE_MODEL_FILTER (*model);
105 *model = gtk_tree_model_filter_get_model (parent_model);
107 gtk_tree_model_filter_convert_iter_to_child_iter (parent_model,
112 g_assert (PSPPIRE_IS_DICT (*model));
115 /* A GtkTreeCellDataFunc which renders the name and/or label of the
118 var_description_cell_data_func (GtkTreeViewColumn *col,
119 GtkCellRenderer *cell,
120 GtkTreeModel *top_model,
121 GtkTreeIter *top_iter,
124 struct variable *var;
129 get_base_model (top_model, top_iter, &model, &iter);
131 g_assert (PSPPIRE_IS_DICT (model));
134 gtk_tree_model_get (model,
135 &iter, DICT_TVM_COL_VAR, &var, -1);
137 if ( var_has_label (var))
139 gchar *text = g_strdup_printf (
140 "<span stretch=\"condensed\">%s</span>",
141 var_get_label (var));
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);
157 /* Sets the tooltip to be the name of the variable under the cursor */
159 set_tooltip_for_variable (GtkTreeView *treeview,
162 gboolean keyboard_mode,
170 GtkTreeModel *tree_model;
171 struct variable *var = NULL;
174 gtk_tree_view_convert_widget_to_bin_window_coords (treeview,
177 if (!gtk_tree_view_get_path_at_pos (treeview, bx, by,
178 &path, NULL, NULL, NULL))
181 tree_model = gtk_tree_view_get_model (treeview);
184 gtk_tree_view_set_tooltip_row (treeview, tooltip, path);
186 ok = gtk_tree_model_get_iter (tree_model, &iter, path);
188 gtk_tree_path_free (path);
193 gtk_tree_model_get (tree_model, &iter, DICT_TVM_COL_VAR, &var, -1);
195 if ( ! var_has_label (var))
198 gtk_tooltip_set_text (tooltip, var_get_name (var));
203 /* Sets up TREEVIEW to display the variables of DICT.
204 MODE is the selection mode for TREEVIEW.
205 PREDICATE determines which variables should be visible, or NULL if
206 all are to be visible.
209 attach_dictionary_to_treeview (GtkTreeView *treeview, PsppireDict *dict,
210 GtkSelectionMode mode,
211 var_predicate_func *predicate
214 GtkTreeViewColumn *col;
216 GtkTreeSelection *selection =
217 gtk_tree_view_get_selection (treeview);
219 GtkCellRenderer *renderer;
221 GtkTreeModel *model ;
225 model = gtk_tree_model_filter_new (GTK_TREE_MODEL (dict),
228 gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (model),
235 model = GTK_TREE_MODEL (dict);
238 gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), model);
241 col = gtk_tree_view_column_new ();
242 gtk_tree_view_column_set_title (col, _("Variable"));
244 renderer = gtk_cell_renderer_pixbuf_new ();
245 gtk_tree_view_column_pack_start (col, renderer, FALSE);
247 gtk_tree_view_column_set_cell_data_func (col, renderer,
248 var_icon_cell_data_func,
252 renderer = gtk_cell_renderer_text_new ();
253 gtk_tree_view_column_pack_start (col, renderer, TRUE);
254 gtk_tree_view_column_set_cell_data_func (col, renderer,
255 var_description_cell_data_func,
258 g_object_set (renderer, "ellipsize-set", TRUE, NULL);
259 g_object_set (renderer, "ellipsize", PANGO_ELLIPSIZE_MIDDLE, NULL);
261 gtk_tree_view_column_set_sizing (col, GTK_TREE_VIEW_COLUMN_FIXED);
263 /* FIXME: make this a value in terms of character widths */
264 gtk_tree_view_column_set_min_width (col, 150);
266 gtk_tree_view_append_column (treeview, col);
268 gtk_tree_selection_set_mode (selection, mode);
270 g_object_set (treeview, "has-tooltip", TRUE, NULL);
272 g_signal_connect (treeview, "query-tooltip", G_CALLBACK (set_tooltip_for_variable), NULL);
277 insert_source_row_into_entry (GtkTreeIter iter,
286 struct variable *var;
287 GtkTreeIter dict_iter;
290 g_return_if_fail (GTK_IS_ENTRY(dest));
292 get_base_model (model, &iter, &dict, &dict_iter);
294 path = gtk_tree_model_get_path (GTK_TREE_MODEL (dict), &dict_iter);
296 idx = gtk_tree_path_get_indices (path);
298 var = psppire_dict_get_variable (PSPPIRE_DICT (dict), *idx);
300 gtk_tree_path_free (path);
302 name = pspp_locale_to_utf8 (var_get_name (var), -1, NULL);
303 gtk_entry_set_text (GTK_ENTRY (dest), name);
310 insert_source_row_into_tree_view (GtkTreeIter iter,
317 GtkTreeIter dest_iter;
318 GtkTreeIter dict_iter;
320 GtkTreeModel *destmodel = gtk_tree_view_get_model ( GTK_TREE_VIEW (dest));
325 get_base_model (model, &iter, &dict, &dict_iter);
327 path = gtk_tree_model_get_path (dict, &dict_iter);
329 row = gtk_tree_path_get_indices (path);
331 gtk_list_store_append (GTK_LIST_STORE (destmodel), &dest_iter);
332 gtk_list_store_set (GTK_LIST_STORE (destmodel), &dest_iter, 0, *row, -1);
334 gtk_tree_path_free (path);
339 is_currently_in_entry (GtkTreeModel *model, GtkTreeIter *iter,
340 PsppireSelector *selector)
344 GtkTreeIter dict_iter;
346 struct variable *var;
350 const gchar *text = gtk_entry_get_text (GTK_ENTRY (selector->dest));
352 get_base_model (model, iter, &dict, &dict_iter);
354 path = gtk_tree_model_get_path (dict, &dict_iter);
356 indeces = gtk_tree_path_get_indices (path);
358 dict_index = indeces [0];
360 var = psppire_dict_get_variable (PSPPIRE_DICT (dict), dict_index);
362 gtk_tree_path_free (path);
364 name = pspp_locale_to_utf8 (var_get_name (var), -1, NULL);
365 result = ( 0 == strcmp (text, name));