1 /* PSPPIRE - a graphical user interface for PSPP.
2 Copyright (C) 2007, 2009, 2010, 2011, 2012, 2013 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"
44 #include "gl/configmake.h"
49 /* Returns a copy of IN with each underscore doubled. The caller should free
50 the returned string (with free()) when it is no longer needed. */
52 escape_underscores (const char *in)
54 char *out = xmalloc (2 * strlen (in) + 1);
58 for (; *in != '\0'; in++)
69 /* Formats a value according to VAR's print format and strips white space
70 appropriately for VAR's type. That is, if VAR is numeric, strips leading
71 white space (because numbers are right-justified within their fields), and
72 if VAR is string, strips trailing white space (because spaces pad out string
75 Returns an allocated string. The returned string must be freed when no
78 value_to_text (union value v, const struct variable *var)
80 return value_to_text__ (v, var_get_print_format (var),
81 var_get_encoding (var));
84 /* Formats a value with format FORMAT and strips white space appropriately for
85 FORMATs' type. That is, if FORMAT is numeric, strips leading white space
86 (because numbers are right-justified within their fields), and if FORMAT is
87 string, strips trailing white space (because spaces pad out string values on
90 Returns an allocated string. The returned string must be freed when no
93 value_to_text__ (union value v,
94 const struct fmt_spec *format, const char *encoding)
98 s = data_out_stretchy (&v, encoding, format, NULL);
99 if (fmt_is_numeric (format->type))
107 /* Converts TEXT to a value.
109 VAL will be initialised and filled by this function.
110 It is the caller's responsibility to destroy VAL when no longer needed.
111 VAR must be the variable with which VAL is associated.
113 On success, VAL is returned, NULL otherwise.
116 text_to_value (const gchar *text,
117 const struct variable *var,
120 return text_to_value__ (text, var_get_print_format (var),
121 var_get_encoding (var), val);
124 /* Converts TEXT, which contains a value in the given FORMAT encoding in
125 ENCODING, into a value.
127 VAL will be initialised and filled by this function.
128 It is the caller's responsibility to destroy VAL when no longer needed.
130 On success, VAL is returned, NULL otherwise.
133 text_to_value__ (const gchar *text,
134 const struct fmt_spec *format,
135 const gchar *encoding,
138 int width = fmt_var_width (format);
140 if ( format->type != FMT_A)
142 if ( ! text ) return NULL;
145 const gchar *s = text;
153 if ( !*s) return NULL;
157 value_init (val, width);
158 char *err = data_in (ss_cstr (text), UTF8, format->type, val, width, encoding);
162 value_destroy (val, width);
171 /* This function must be used whenever a filename generated by glib,
172 (eg, from gtk_file_chooser_get_filename) and passed to the C library,
173 (eg through a pspp syntax string).
176 convert_glib_filename_to_system_filename (const gchar *fname, GError **err)
181 const gchar *target_encoding;
182 gchar *utf8_name = NULL;
184 g_get_charset (&target_encoding);
186 output_name = g_convert (fname, -1, target_encoding,
187 "UTF-8", NULL, NULL, err);
189 output_name = xstrdup (fname);
197 #define _(msgid) gettext (msgid)
198 #define N_(msgid) msgid
206 dialog = gtk_message_dialog_new (NULL,
210 _("Sorry. The help system hasn't yet "
211 "been implemented."));
212 gtk_dialog_run (GTK_DIALOG (dialog));
213 gtk_widget_destroy (dialog);
217 connect_help (GtkBuilder *xml)
219 GSList *helps = gtk_builder_get_objects (xml);
222 for ( i = helps; i ; i = g_slist_next (i))
224 GObject *o = i->data;
225 if ( GTK_IS_WIDGET (o) )
227 const gchar *name = gtk_buildable_get_name (GTK_BUILDABLE (o));
231 strncpy (s, name, 11);
235 if ( 0 == strcmp ("help_button", s))
237 g_signal_connect (o, "clicked", give_help, 0);
242 g_slist_free (helps);
246 /* Create a deep copy of SRC */
248 clone_list_store (const GtkListStore *src)
250 GtkTreeIter src_iter;
253 const gint n_cols = gtk_tree_model_get_n_columns (GTK_TREE_MODEL (src));
254 GType *types = g_malloc (sizeof (*types) * n_cols);
259 for (i = 0 ; i < n_cols; ++i )
260 types[i] = gtk_tree_model_get_column_type (GTK_TREE_MODEL (src), i);
262 dest = gtk_list_store_newv (n_cols, types);
264 for (ok = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (src),
267 ok = gtk_tree_model_iter_next (GTK_TREE_MODEL (src), &src_iter))
269 GtkTreeIter dest_iter;
270 gtk_list_store_append (dest, &dest_iter);
272 for (i = 0 ; i < n_cols; ++i )
276 gtk_tree_model_get_value (GTK_TREE_MODEL (src), &src_iter, i, &val);
277 gtk_list_store_set_value (dest, &dest_iter, i, &val);
279 g_value_unset (&val);
293 on_delete (GtkWindow *window, GdkEvent *e, GtkWindow **addr)
301 paste_syntax_to_window (gchar *syntax)
303 static GtkWidget *the_syntax_pasteboard = NULL;
305 GtkTextBuffer *buffer = NULL;
307 if ( NULL == the_syntax_pasteboard)
309 the_syntax_pasteboard = psppire_syntax_window_new (NULL);
310 g_signal_connect (the_syntax_pasteboard, "delete-event", G_CALLBACK (on_delete),
311 &the_syntax_pasteboard);
314 buffer = GTK_TEXT_BUFFER (PSPPIRE_SYNTAX_WINDOW (the_syntax_pasteboard)->buffer);
316 gtk_text_buffer_begin_user_action (buffer);
317 gtk_text_buffer_insert_at_cursor (buffer, syntax, -1);
318 gtk_text_buffer_insert_at_cursor (buffer, "\n", 1);
319 gtk_text_buffer_end_user_action (buffer);
321 gtk_widget_show (the_syntax_pasteboard);
327 /* gtk_box_pack_start_defaults is deprecated.
328 Therefore we roll our own until a better solution is found */
330 psppire_box_pack_start_defaults (GtkBox *box, GtkWidget *widget)
332 gtk_box_pack_start (box, widget, TRUE, TRUE, 0);