1 /* PSPPIRE - a graphical user interface for PSPP.
2 Copyright (C) 2007, 2009 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 "message-dialog.h"
28 #include <data/format.h>
29 #include <data/data-in.h>
30 #include <data/data-out.h>
31 #include <data/dictionary.h>
32 #include <data/casereader-provider.h>
33 #include <libpspp/message.h>
34 #include "psppire-syntax-window.h"
35 #include <gtk/gtkbuilder.h>
36 #include <libpspp/i18n.h>
41 #include <data/settings.h>
43 #include "psppire-data-store.h"
49 /* Formats a value according to FORMAT
50 The returned string must be freed when no longer required */
52 value_to_text (union value v, const PsppireDict *dict, struct fmt_spec format)
56 s = data_out (&v, dict_get_encoding (dict->dict), &format);
63 /* Converts TEXT to a value.
65 VAL will be initialised and filled by this function.
66 It is the caller's responsibility to destroy VAL when no longer needed.
67 VAR and DICT must be the variable and dictionary with which VAL
70 On success, VAL is returned, NULL otherwise.
73 text_to_value (const gchar *text,
74 const PsppireDict *dict,
75 const struct variable *var,
78 const struct fmt_spec *format = var_get_print_format (var);
79 int width = var_get_width (var);
81 if ( format->type != FMT_A)
83 if ( ! text ) return NULL;
86 const gchar *s = text;
94 if ( !*s) return NULL;
98 value_init (val, width);
100 data_in (ss_cstr (text), UTF8, format->type, 0, 0, 0,
110 builder_new_real (const gchar *name)
112 GtkBuilder *builder = gtk_builder_new ();
115 if ( ! gtk_builder_add_from_file (builder, name, &err))
117 g_critical ("Couldnt open user interface file %s: %s", name, err->message);
118 g_clear_error (&err);
126 get_object_assert (GtkBuilder *builder, const gchar *name, GType type)
131 o = gtk_builder_get_object (builder, name);
134 g_critical ("Object \"%s\" could not be found\n", name);
136 if ( ! g_type_is_a (G_OBJECT_TYPE (o), type))
138 g_critical ("Object \"%s\" was expected to have type %s, but in fact has type %s",
139 name, g_type_name (type), G_OBJECT_TYPE_NAME (o));
147 get_action_assert (GtkBuilder *builder, const gchar *name)
149 return GTK_ACTION (get_object_assert (builder, name, GTK_TYPE_ACTION));
153 get_widget_assert (GtkBuilder *builder, const gchar *name)
155 return GTK_WIDGET (get_object_assert (builder, name, GTK_TYPE_WIDGET));
158 /* This function must be used whenever a filename generated by glib,
159 (eg, from gtk_file_chooser_get_filename) and passed to the C library,
160 (eg through a pspp syntax string).
163 convert_glib_filename_to_system_filename (const gchar *fname, GError **err)
168 const gchar *target_encoding;
169 gchar *utf8_name = NULL;
171 g_get_charset (&target_encoding);
173 output_name = g_convert (fname, -1, target_encoding,
174 "UTF-8", NULL, NULL, err);
176 output_name = xstrdup (fname);
184 #define _(msgid) gettext (msgid)
185 #define N_(msgid) msgid
193 dialog = gtk_message_dialog_new (NULL,
197 _("Sorry. The help system hasn't yet "
198 "been implemented."));
199 gtk_dialog_run (GTK_DIALOG (dialog));
200 gtk_widget_destroy (dialog);
204 connect_help (GtkBuilder *xml)
206 GSList *helps = gtk_builder_get_objects (xml);
209 for ( i = helps; i ; i = g_slist_next (i))
211 GObject *o = i->data;
212 if ( GTK_IS_WIDGET (o) )
216 g_object_get (o, "name", &name, NULL);
219 strncpy (s, name, 11);
223 if ( 0 == strcmp ("help_button", s))
225 g_signal_connect (o, "clicked", give_help, 0);
230 g_slist_free (helps);
235 reference_manual (GtkMenuItem *menu, gpointer data)
238 gchar *cmd = g_strdup_printf ("yelp file://%s", relocate (DOCDIR "/pspp.xml"));
240 if ( ! g_spawn_command_line_async (cmd, &err) )
242 msg (ME, _("Cannot open reference manual: %s"), err->message);
246 g_clear_error (&err);
250 /* Create a deep copy of SRC */
252 clone_list_store (const GtkListStore *src)
254 GtkTreeIter src_iter;
257 const gint n_cols = gtk_tree_model_get_n_columns (GTK_TREE_MODEL (src));
258 GType *types = g_malloc (sizeof (*types) * n_cols);
263 for (i = 0 ; i < n_cols; ++i )
264 types[i] = gtk_tree_model_get_column_type (GTK_TREE_MODEL (src), i);
266 dest = gtk_list_store_newv (n_cols, types);
268 for (ok = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (src),
271 ok = gtk_tree_model_iter_next (GTK_TREE_MODEL (src), &src_iter))
273 GtkTreeIter dest_iter;
274 gtk_list_store_append (dest, &dest_iter);
276 for (i = 0 ; i < n_cols; ++i )
280 gtk_tree_model_get_value (GTK_TREE_MODEL (src), &src_iter, i, &val);
281 gtk_list_store_set_value (dest, &dest_iter, i, &val);
283 g_value_unset (&val);
295 paste_syntax_in_new_window (const gchar *syntax)
297 GtkWidget *se = psppire_syntax_window_new ();
299 gtk_text_buffer_insert_at_cursor (PSPPIRE_SYNTAX_WINDOW (se)->buffer, syntax, -1);
301 gtk_widget_show (se);