1 /* PSPPIRE - a graphical user interface for PSPP.
2 Copyright (C) 2007, 2009, 2010, 2011, 2012 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 /* Returns a copy of IN with each underscore doubled. The caller should free
51 the returned string (with free()) when it is no longer needed. */
53 escape_underscores (const char *in)
55 char *out = xmalloc (2 * strlen (in) + 1);
59 for (; *in != '\0'; in++)
70 /* Formats a value according to VAR's print format and strips white space
71 appropriately for VAR's type. That is, if VAR is numeric, strips leading
72 white space (because numbers are right-justified within their fields), and
73 if VAR is string, strips trailing white space (because spaces pad out string
76 Returns an allocated string. The returned string must be freed when no
79 value_to_text (union value v, const struct variable *var)
81 return value_to_text__ (v, var_get_print_format (var),
82 var_get_encoding (var));
85 /* Formats a value with format FORMAT and strips white space appropriately for
86 FORMATs' type. That is, if FORMAT is numeric, strips leading white space
87 (because numbers are right-justified within their fields), and if FORMAT is
88 string, strips trailing white space (because spaces pad out string values on
91 Returns an allocated string. The returned string must be freed when no
94 value_to_text__ (union value v,
95 const struct fmt_spec *format, const char *encoding)
99 s = data_out (&v, encoding, format);
100 if (fmt_is_numeric (format->type))
108 /* Converts TEXT to a value.
110 VAL will be initialised and filled by this function.
111 It is the caller's responsibility to destroy VAL when no longer needed.
112 VAR must be the variable with which VAL is associated.
114 On success, VAL is returned, NULL otherwise.
117 text_to_value (const gchar *text,
118 const struct variable *var,
121 return text_to_value__ (text, var_get_print_format (var),
122 var_get_encoding (var), val);
125 /* Converts TEXT, which contains a value in the given FORMAT encoding in
126 ENCODING, into a value.
128 VAL will be initialised and filled by this function.
129 It is the caller's responsibility to destroy VAL when no longer needed.
131 On success, VAL is returned, NULL otherwise.
134 text_to_value__ (const gchar *text,
135 const struct fmt_spec *format,
136 const gchar *encoding,
139 int width = fmt_var_width (format);
141 if ( format->type != FMT_A)
143 if ( ! text ) return NULL;
146 const gchar *s = text;
154 if ( !*s) return NULL;
158 value_init (val, width);
159 free (data_in (ss_cstr (text), UTF8, format->type, val, width, encoding));
165 /* This function must be used whenever a filename generated by glib,
166 (eg, from gtk_file_chooser_get_filename) and passed to the C library,
167 (eg through a pspp syntax string).
170 convert_glib_filename_to_system_filename (const gchar *fname, GError **err)
175 const gchar *target_encoding;
176 gchar *utf8_name = NULL;
178 g_get_charset (&target_encoding);
180 output_name = g_convert (fname, -1, target_encoding,
181 "UTF-8", NULL, NULL, err);
183 output_name = xstrdup (fname);
191 #define _(msgid) gettext (msgid)
192 #define N_(msgid) msgid
200 dialog = gtk_message_dialog_new (NULL,
204 _("Sorry. The help system hasn't yet "
205 "been implemented."));
206 gtk_dialog_run (GTK_DIALOG (dialog));
207 gtk_widget_destroy (dialog);
211 connect_help (GtkBuilder *xml)
213 GSList *helps = gtk_builder_get_objects (xml);
216 for ( i = helps; i ; i = g_slist_next (i))
218 GObject *o = i->data;
219 if ( GTK_IS_WIDGET (o) )
221 const gchar *name = gtk_buildable_get_name (GTK_BUILDABLE (o));
225 strncpy (s, name, 11);
229 if ( 0 == strcmp ("help_button", s))
231 g_signal_connect (o, "clicked", give_help, 0);
236 g_slist_free (helps);
240 /* Create a deep copy of SRC */
242 clone_list_store (const GtkListStore *src)
244 GtkTreeIter src_iter;
247 const gint n_cols = gtk_tree_model_get_n_columns (GTK_TREE_MODEL (src));
248 GType *types = g_malloc (sizeof (*types) * n_cols);
253 for (i = 0 ; i < n_cols; ++i )
254 types[i] = gtk_tree_model_get_column_type (GTK_TREE_MODEL (src), i);
256 dest = gtk_list_store_newv (n_cols, types);
258 for (ok = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (src),
261 ok = gtk_tree_model_iter_next (GTK_TREE_MODEL (src), &src_iter))
263 GtkTreeIter dest_iter;
264 gtk_list_store_append (dest, &dest_iter);
266 for (i = 0 ; i < n_cols; ++i )
270 gtk_tree_model_get_value (GTK_TREE_MODEL (src), &src_iter, i, &val);
271 gtk_list_store_set_value (dest, &dest_iter, i, &val);
273 g_value_unset (&val);
287 on_delete (GtkWindow *window, GdkEvent *e, GtkWindow **addr)
295 paste_syntax_to_window (gchar *syntax)
297 static GtkWidget *the_syntax_pasteboard = NULL;
299 GtkTextBuffer *buffer = NULL;
301 if ( NULL == the_syntax_pasteboard)
303 the_syntax_pasteboard = psppire_syntax_window_new (NULL);
304 g_signal_connect (the_syntax_pasteboard, "delete-event", G_CALLBACK (on_delete),
305 &the_syntax_pasteboard);
308 buffer = GTK_TEXT_BUFFER (PSPPIRE_SYNTAX_WINDOW (the_syntax_pasteboard)->buffer);
310 gtk_text_buffer_begin_user_action (buffer);
311 gtk_text_buffer_insert_at_cursor (buffer, syntax, -1);
312 gtk_text_buffer_insert_at_cursor (buffer, "\n", 1);
313 gtk_text_buffer_end_user_action (buffer);
315 gtk_widget_show (the_syntax_pasteboard);
321 /* gtk_box_pack_start_defaults is deprecated.
322 Therefore we roll our own until a better solution is found */
324 psppire_box_pack_start_defaults (GtkBox *box, GtkWidget *widget)
326 gtk_box_pack_start (box, widget, TRUE, TRUE, 0);