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 FORMAT
51 The returned string must be freed when no longer required */
53 value_to_text (union value v, const PsppireDict *dict, struct fmt_spec format)
57 s = data_out (&v, dict_get_encoding (dict->dict), &format);
64 /* Converts TEXT to a value.
66 VAL will be initialised and filled by this function.
67 It is the caller's responsibility to destroy VAL when no longer needed.
68 VAR must be the variable with which VAL is associated.
70 On success, VAL is returned, NULL otherwise.
73 text_to_value (const gchar *text,
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);
98 free (data_in (ss_cstr (text), UTF8, format->type, val, width,
99 var_get_encoding (var)));
106 builder_new_real (const gchar *name)
108 GtkBuilder *builder = gtk_builder_new ();
111 if ( ! gtk_builder_add_from_file (builder, name, &err))
113 g_critical ("Couldnt open user interface file %s: %s", name, err->message);
114 g_clear_error (&err);
122 get_object_assert (GtkBuilder *builder, const gchar *name, GType type)
127 o = gtk_builder_get_object (builder, name);
130 g_critical ("Object `%s' could not be found\n", name);
131 else if ( ! g_type_is_a (G_OBJECT_TYPE (o), type))
133 g_critical ("Object `%s' was expected to have type %s, but in fact has type %s",
134 name, g_type_name (type), G_OBJECT_TYPE_NAME (o));
142 get_action_assert (GtkBuilder *builder, const gchar *name)
144 return GTK_ACTION (get_object_assert (builder, name, GTK_TYPE_ACTION));
148 get_widget_assert (GtkBuilder *builder, const gchar *name)
150 return GTK_WIDGET (get_object_assert (builder, name, GTK_TYPE_WIDGET));
153 /* This function must be used whenever a filename generated by glib,
154 (eg, from gtk_file_chooser_get_filename) and passed to the C library,
155 (eg through a pspp syntax string).
158 convert_glib_filename_to_system_filename (const gchar *fname, GError **err)
163 const gchar *target_encoding;
164 gchar *utf8_name = NULL;
166 g_get_charset (&target_encoding);
168 output_name = g_convert (fname, -1, target_encoding,
169 "UTF-8", NULL, NULL, err);
171 output_name = xstrdup (fname);
179 #define _(msgid) gettext (msgid)
180 #define N_(msgid) msgid
188 dialog = gtk_message_dialog_new (NULL,
192 _("Sorry. The help system hasn't yet "
193 "been implemented."));
194 gtk_dialog_run (GTK_DIALOG (dialog));
195 gtk_widget_destroy (dialog);
199 connect_help (GtkBuilder *xml)
201 GSList *helps = gtk_builder_get_objects (xml);
204 for ( i = helps; i ; i = g_slist_next (i))
206 GObject *o = i->data;
207 if ( GTK_IS_WIDGET (o) )
209 const gchar *name = gtk_buildable_get_name (GTK_BUILDABLE (o));
213 strncpy (s, name, 11);
217 if ( 0 == strcmp ("help_button", s))
219 g_signal_connect (o, "clicked", give_help, 0);
224 g_slist_free (helps);
228 /* Create a deep copy of SRC */
230 clone_list_store (const GtkListStore *src)
232 GtkTreeIter src_iter;
235 const gint n_cols = gtk_tree_model_get_n_columns (GTK_TREE_MODEL (src));
236 GType *types = g_malloc (sizeof (*types) * n_cols);
241 for (i = 0 ; i < n_cols; ++i )
242 types[i] = gtk_tree_model_get_column_type (GTK_TREE_MODEL (src), i);
244 dest = gtk_list_store_newv (n_cols, types);
246 for (ok = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (src),
249 ok = gtk_tree_model_iter_next (GTK_TREE_MODEL (src), &src_iter))
251 GtkTreeIter dest_iter;
252 gtk_list_store_append (dest, &dest_iter);
254 for (i = 0 ; i < n_cols; ++i )
258 gtk_tree_model_get_value (GTK_TREE_MODEL (src), &src_iter, i, &val);
259 gtk_list_store_set_value (dest, &dest_iter, i, &val);
261 g_value_unset (&val);
275 on_delete (GtkWindow *window, GdkEvent *e, GtkWindow **addr)
283 paste_syntax_to_window (gchar *syntax)
285 static GtkWidget *the_syntax_pasteboard = NULL;
287 GtkTextBuffer *buffer = NULL;
289 if ( NULL == the_syntax_pasteboard)
291 the_syntax_pasteboard = psppire_syntax_window_new (NULL);
292 g_signal_connect (the_syntax_pasteboard, "delete-event", G_CALLBACK (on_delete),
293 &the_syntax_pasteboard);
296 buffer = GTK_TEXT_BUFFER (PSPPIRE_SYNTAX_WINDOW (the_syntax_pasteboard)->buffer);
298 gtk_text_buffer_begin_user_action (buffer);
299 gtk_text_buffer_insert_at_cursor (buffer, syntax, -1);
300 gtk_text_buffer_insert_at_cursor (buffer, "\n", 1);
301 gtk_text_buffer_end_user_action (buffer);
303 gtk_widget_show (the_syntax_pasteboard);
309 /* gtk_box_pack_start_defaults is deprecated.
310 Therefore we roll our own until a better solution is found */
312 psppire_box_pack_start_defaults (GtkBox *box, GtkWidget *widget)
314 gtk_box_pack_start (box, widget, TRUE, TRUE, 0);