1 /* PSPPIRE - a graphical user interface for PSPP.
2 Copyright (C) 2007, 2009, 2010, 2011 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"
35 #include <libpspp/i18n.h>
40 #include <data/settings.h>
42 #include "psppire-data-store.h"
45 #include "gl/configmake.h"
50 /* Formats a value according to VAR's print format.
51 The returned string must be freed when no longer required. */
53 value_to_text (union value v, const struct variable *var)
55 gchar *s = data_out (&v, var_get_encoding (var), var_get_print_format (var));
60 /* Converts TEXT to a value.
62 VAL will be initialised and filled by this function.
63 It is the caller's responsibility to destroy VAL when no longer needed.
64 VAR must be the variable with which VAL is associated.
66 On success, VAL is returned, NULL otherwise.
69 text_to_value (const gchar *text,
70 const struct variable *var,
73 const struct fmt_spec *format = var_get_print_format (var);
74 int width = var_get_width (var);
76 if ( format->type != FMT_A)
78 if ( ! text ) return NULL;
81 const gchar *s = text;
89 if ( !*s) return NULL;
93 value_init (val, width);
94 free (data_in (ss_cstr (text), UTF8, format->type, val, width,
95 var_get_encoding (var)));
102 builder_new_real (const gchar *name)
104 GtkBuilder *builder = gtk_builder_new ();
107 if ( ! gtk_builder_add_from_file (builder, name, &err))
109 g_critical ("Couldnt open user interface file %s: %s", name, err->message);
110 g_clear_error (&err);
118 get_object_assert (GtkBuilder *builder, const gchar *name, GType type)
123 o = gtk_builder_get_object (builder, name);
126 g_critical ("Object `%s' could not be found\n", name);
127 else if ( ! g_type_is_a (G_OBJECT_TYPE (o), type))
129 g_critical ("Object `%s' was expected to have type %s, but in fact has type %s",
130 name, g_type_name (type), G_OBJECT_TYPE_NAME (o));
138 get_action_assert (GtkBuilder *builder, const gchar *name)
140 return GTK_ACTION (get_object_assert (builder, name, GTK_TYPE_ACTION));
144 get_widget_assert (GtkBuilder *builder, const gchar *name)
146 return GTK_WIDGET (get_object_assert (builder, name, GTK_TYPE_WIDGET));
149 /* This function must be used whenever a filename generated by glib,
150 (eg, from gtk_file_chooser_get_filename) and passed to the C library,
151 (eg through a pspp syntax string).
154 convert_glib_filename_to_system_filename (const gchar *fname, GError **err)
159 const gchar *target_encoding;
160 gchar *utf8_name = NULL;
162 g_get_charset (&target_encoding);
164 output_name = g_convert (fname, -1, target_encoding,
165 "UTF-8", NULL, NULL, err);
167 output_name = xstrdup (fname);
175 #define _(msgid) gettext (msgid)
176 #define N_(msgid) msgid
184 dialog = gtk_message_dialog_new (NULL,
188 _("Sorry. The help system hasn't yet "
189 "been implemented."));
190 gtk_dialog_run (GTK_DIALOG (dialog));
191 gtk_widget_destroy (dialog);
195 connect_help (GtkBuilder *xml)
197 GSList *helps = gtk_builder_get_objects (xml);
200 for ( i = helps; i ; i = g_slist_next (i))
202 GObject *o = i->data;
203 if ( GTK_IS_WIDGET (o) )
205 const gchar *name = gtk_buildable_get_name (GTK_BUILDABLE (o));
209 strncpy (s, name, 11);
213 if ( 0 == strcmp ("help_button", s))
215 g_signal_connect (o, "clicked", give_help, 0);
220 g_slist_free (helps);
224 /* Create a deep copy of SRC */
226 clone_list_store (const GtkListStore *src)
228 GtkTreeIter src_iter;
231 const gint n_cols = gtk_tree_model_get_n_columns (GTK_TREE_MODEL (src));
232 GType *types = g_malloc (sizeof (*types) * n_cols);
237 for (i = 0 ; i < n_cols; ++i )
238 types[i] = gtk_tree_model_get_column_type (GTK_TREE_MODEL (src), i);
240 dest = gtk_list_store_newv (n_cols, types);
242 for (ok = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (src),
245 ok = gtk_tree_model_iter_next (GTK_TREE_MODEL (src), &src_iter))
247 GtkTreeIter dest_iter;
248 gtk_list_store_append (dest, &dest_iter);
250 for (i = 0 ; i < n_cols; ++i )
254 gtk_tree_model_get_value (GTK_TREE_MODEL (src), &src_iter, i, &val);
255 gtk_list_store_set_value (dest, &dest_iter, i, &val);
257 g_value_unset (&val);
271 on_delete (GtkWindow *window, GdkEvent *e, GtkWindow **addr)
279 paste_syntax_to_window (gchar *syntax)
281 static GtkWidget *the_syntax_pasteboard = NULL;
283 GtkTextBuffer *buffer = NULL;
285 if ( NULL == the_syntax_pasteboard)
287 the_syntax_pasteboard = psppire_syntax_window_new (NULL);
288 g_signal_connect (the_syntax_pasteboard, "delete-event", G_CALLBACK (on_delete),
289 &the_syntax_pasteboard);
292 buffer = GTK_TEXT_BUFFER (PSPPIRE_SYNTAX_WINDOW (the_syntax_pasteboard)->buffer);
294 gtk_text_buffer_begin_user_action (buffer);
295 gtk_text_buffer_insert_at_cursor (buffer, syntax, -1);
296 gtk_text_buffer_insert_at_cursor (buffer, "\n", 1);
297 gtk_text_buffer_end_user_action (buffer);
299 gtk_widget_show (the_syntax_pasteboard);
305 /* gtk_box_pack_start_defaults is deprecated.
306 Therefore we roll our own until a better solution is found */
308 psppire_box_pack_start_defaults (GtkBox *box, GtkWidget *widget)
310 gtk_box_pack_start (box, widget, TRUE, TRUE, 0);