1 /* PSPPIRE - a graphical user interface for PSPP.
2 Copyright (C) 2007, 2009, 2010 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/>. */
18 /* This file is a rubbish bin where stuff gets put when it doesn't seem to
23 #include <glib-object.h>
27 #include <data/format.h>
28 #include <data/data-in.h>
29 #include <data/data-out.h>
30 #include <data/dictionary.h>
31 #include <data/casereader-provider.h>
32 #include <libpspp/message.h>
33 #include "psppire-syntax-window.h"
34 #include <gtk/gtkbuilder.h>
35 #include <libpspp/i18n.h>
40 #include <data/settings.h>
42 #include "psppire-data-store.h"
48 /* Formats a value according to FORMAT
49 The returned string must be freed when no longer required */
51 value_to_text (union value v, const PsppireDict *dict, struct fmt_spec format)
55 s = data_out (&v, dict_get_encoding (dict->dict), &format);
62 /* Converts TEXT to a value.
64 VAL will be initialised and filled by this function.
65 It is the caller's responsibility to destroy VAL when no longer needed.
66 VAR and DICT must be the variable and dictionary with which VAL
69 On success, VAL is returned, NULL otherwise.
72 text_to_value (const gchar *text,
73 const PsppireDict *dict,
74 const struct variable *var,
77 const struct fmt_spec *format = var_get_print_format (var);
78 int width = var_get_width (var);
80 if ( format->type != FMT_A)
82 if ( ! text ) return NULL;
85 const gchar *s = text;
93 if ( !*s) return NULL;
97 value_init (val, width);
99 data_in (ss_cstr (text), UTF8, format->type, 0, 0, 0,
109 builder_new_real (const gchar *name)
111 GtkBuilder *builder = gtk_builder_new ();
114 if ( ! gtk_builder_add_from_file (builder, name, &err))
116 g_critical ("Couldnt open user interface file %s: %s", name, err->message);
117 g_clear_error (&err);
125 get_object_assert (GtkBuilder *builder, const gchar *name, GType type)
130 o = gtk_builder_get_object (builder, name);
133 g_critical ("Object \"%s\" could not be found\n", name);
134 else if ( ! g_type_is_a (G_OBJECT_TYPE (o), type))
136 g_critical ("Object \"%s\" was expected to have type %s, but in fact has type %s",
137 name, g_type_name (type), G_OBJECT_TYPE_NAME (o));
145 get_action_assert (GtkBuilder *builder, const gchar *name)
147 return GTK_ACTION (get_object_assert (builder, name, GTK_TYPE_ACTION));
151 get_widget_assert (GtkBuilder *builder, const gchar *name)
153 return GTK_WIDGET (get_object_assert (builder, name, GTK_TYPE_WIDGET));
156 /* This function must be used whenever a filename generated by glib,
157 (eg, from gtk_file_chooser_get_filename) and passed to the C library,
158 (eg through a pspp syntax string).
161 convert_glib_filename_to_system_filename (const gchar *fname, GError **err)
166 const gchar *target_encoding;
167 gchar *utf8_name = NULL;
169 g_get_charset (&target_encoding);
171 output_name = g_convert (fname, -1, target_encoding,
172 "UTF-8", NULL, NULL, err);
174 output_name = xstrdup (fname);
182 #define _(msgid) gettext (msgid)
183 #define N_(msgid) msgid
191 dialog = gtk_message_dialog_new (NULL,
195 _("Sorry. The help system hasn't yet "
196 "been implemented."));
197 gtk_dialog_run (GTK_DIALOG (dialog));
198 gtk_widget_destroy (dialog);
202 connect_help (GtkBuilder *xml)
204 GSList *helps = gtk_builder_get_objects (xml);
207 for ( i = helps; i ; i = g_slist_next (i))
209 GObject *o = i->data;
210 if ( GTK_IS_WIDGET (o) )
214 g_object_get (o, "name", &name, NULL);
217 strncpy (s, name, 11);
221 if ( 0 == strcmp ("help_button", s))
223 g_signal_connect (o, "clicked", give_help, 0);
228 g_slist_free (helps);
233 reference_manual (GtkMenuItem *menu, gpointer data)
236 gchar *cmd = g_strdup_printf ("yelp file://%s", relocate (DOCDIR "/pspp.xml"));
238 if ( ! g_spawn_command_line_async (cmd, &err) )
240 msg (ME, _("Cannot open reference manual: %s. The PSPP user manual is "
242 "http://www.gnu.org/software/pspp/documentation.html"),
247 g_clear_error (&err);
251 /* Create a deep copy of SRC */
253 clone_list_store (const GtkListStore *src)
255 GtkTreeIter src_iter;
258 const gint n_cols = gtk_tree_model_get_n_columns (GTK_TREE_MODEL (src));
259 GType *types = g_malloc (sizeof (*types) * n_cols);
264 for (i = 0 ; i < n_cols; ++i )
265 types[i] = gtk_tree_model_get_column_type (GTK_TREE_MODEL (src), i);
267 dest = gtk_list_store_newv (n_cols, types);
269 for (ok = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (src),
272 ok = gtk_tree_model_iter_next (GTK_TREE_MODEL (src), &src_iter))
274 GtkTreeIter dest_iter;
275 gtk_list_store_append (dest, &dest_iter);
277 for (i = 0 ; i < n_cols; ++i )
281 gtk_tree_model_get_value (GTK_TREE_MODEL (src), &src_iter, i, &val);
282 gtk_list_store_set_value (dest, &dest_iter, i, &val);
284 g_value_unset (&val);
296 paste_syntax_in_new_window (const gchar *syntax)
298 GtkWidget *se = psppire_syntax_window_new ();
300 gtk_text_buffer_insert_at_cursor (PSPPIRE_SYNTAX_WINDOW (se)->buffer, syntax, -1);
302 gtk_widget_show (se);
306 /* gtk_box_pack_start_defaults is deprecated.
307 Therefore we roll our own until a better solution is found */
309 psppire_box_pack_start_defaults (GtkBox *box, GtkWidget *widget)
311 gtk_box_pack_start (box, widget, TRUE, TRUE, 0);