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"
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 and DICT must be the variable and dictionary with which VAL
71 On success, VAL is returned, NULL otherwise.
74 text_to_value (const gchar *text,
75 const PsppireDict *dict,
76 const struct variable *var,
79 const struct fmt_spec *format = var_get_print_format (var);
80 int width = var_get_width (var);
82 if ( format->type != FMT_A)
84 if ( ! text ) return NULL;
87 const gchar *s = text;
95 if ( !*s) return NULL;
99 value_init (val, width);
100 free (data_in (ss_cstr (text), UTF8, format->type, val, width,
101 dict_get_encoding (dict->dict)));
108 builder_new_real (const gchar *name)
110 GtkBuilder *builder = gtk_builder_new ();
113 if ( ! gtk_builder_add_from_file (builder, name, &err))
115 g_critical ("Couldnt open user interface file %s: %s", name, err->message);
116 g_clear_error (&err);
124 get_object_assert (GtkBuilder *builder, const gchar *name, GType type)
129 o = gtk_builder_get_object (builder, name);
132 g_critical ("Object `%s' could not be found\n", name);
133 else if ( ! g_type_is_a (G_OBJECT_TYPE (o), type))
135 g_critical ("Object `%s' was expected to have type %s, but in fact has type %s",
136 name, g_type_name (type), G_OBJECT_TYPE_NAME (o));
144 get_action_assert (GtkBuilder *builder, const gchar *name)
146 return GTK_ACTION (get_object_assert (builder, name, GTK_TYPE_ACTION));
150 get_widget_assert (GtkBuilder *builder, const gchar *name)
152 return GTK_WIDGET (get_object_assert (builder, name, GTK_TYPE_WIDGET));
155 /* This function must be used whenever a filename generated by glib,
156 (eg, from gtk_file_chooser_get_filename) and passed to the C library,
157 (eg through a pspp syntax string).
160 convert_glib_filename_to_system_filename (const gchar *fname, GError **err)
165 const gchar *target_encoding;
166 gchar *utf8_name = NULL;
168 g_get_charset (&target_encoding);
170 output_name = g_convert (fname, -1, target_encoding,
171 "UTF-8", NULL, NULL, err);
173 output_name = xstrdup (fname);
181 #define _(msgid) gettext (msgid)
182 #define N_(msgid) msgid
190 dialog = gtk_message_dialog_new (NULL,
194 _("Sorry. The help system hasn't yet "
195 "been implemented."));
196 gtk_dialog_run (GTK_DIALOG (dialog));
197 gtk_widget_destroy (dialog);
201 connect_help (GtkBuilder *xml)
203 GSList *helps = gtk_builder_get_objects (xml);
206 for ( i = helps; i ; i = g_slist_next (i))
208 GObject *o = i->data;
209 if ( GTK_IS_WIDGET (o) )
213 g_object_get (o, "name", &name, NULL);
216 strncpy (s, name, 11);
220 if ( 0 == strcmp ("help_button", s))
222 g_signal_connect (o, "clicked", give_help, 0);
227 g_slist_free (helps);
231 /* Create a deep copy of SRC */
233 clone_list_store (const GtkListStore *src)
235 GtkTreeIter src_iter;
238 const gint n_cols = gtk_tree_model_get_n_columns (GTK_TREE_MODEL (src));
239 GType *types = g_malloc (sizeof (*types) * n_cols);
244 for (i = 0 ; i < n_cols; ++i )
245 types[i] = gtk_tree_model_get_column_type (GTK_TREE_MODEL (src), i);
247 dest = gtk_list_store_newv (n_cols, types);
249 for (ok = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (src),
252 ok = gtk_tree_model_iter_next (GTK_TREE_MODEL (src), &src_iter))
254 GtkTreeIter dest_iter;
255 gtk_list_store_append (dest, &dest_iter);
257 for (i = 0 ; i < n_cols; ++i )
261 gtk_tree_model_get_value (GTK_TREE_MODEL (src), &src_iter, i, &val);
262 gtk_list_store_set_value (dest, &dest_iter, i, &val);
264 g_value_unset (&val);
278 on_delete (GtkWindow *window, GdkEvent *e, GtkWindow **addr)
286 paste_syntax_to_window (const gchar *syntax)
288 static GtkWidget *the_syntax_pasteboard = NULL;
290 GtkTextBuffer *buffer = NULL;
292 if ( NULL == the_syntax_pasteboard)
294 the_syntax_pasteboard = psppire_syntax_window_new ();
295 g_signal_connect (the_syntax_pasteboard, "delete-event", G_CALLBACK (on_delete),
296 &the_syntax_pasteboard);
299 buffer = GTK_TEXT_BUFFER (PSPPIRE_SYNTAX_WINDOW (the_syntax_pasteboard)->buffer);
301 gtk_text_buffer_begin_user_action (buffer);
302 gtk_text_buffer_insert_at_cursor (buffer, syntax, -1);
303 gtk_text_buffer_insert_at_cursor (buffer, "\n", 1);
304 gtk_text_buffer_end_user_action (buffer);
306 gtk_widget_show (the_syntax_pasteboard);
310 /* gtk_box_pack_start_defaults is deprecated.
311 Therefore we roll our own until a better solution is found */
313 psppire_box_pack_start_defaults (GtkBox *box, GtkWidget *widget)
315 gtk_box_pack_start (box, widget, TRUE, TRUE, 0);