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 /* Formats a value according to VAR's print format and strips white space
51 appropriately for VAR's type. That is, if VAR is numeric, strips leading
52 white space (because numbers are right-justified within their fields), and
53 if VAR is string, strips trailing white space (because spaces pad out string
56 Returns an allocated string. The returned string must be freed when no
59 value_to_text (union value v, const struct variable *var)
61 return value_to_text__ (v, var_get_print_format (var),
62 var_get_encoding (var));
65 /* Formats a value with format FORMAT and strips white space appropriately for
66 FORMATs' type. That is, if FORMAT is numeric, strips leading white space
67 (because numbers are right-justified within their fields), and if FORMAT is
68 string, strips trailing white space (because spaces pad out string values on
71 Returns an allocated string. The returned string must be freed when no
74 value_to_text__ (union value v,
75 const struct fmt_spec *format, const char *encoding)
79 s = data_out (&v, encoding, format);
80 if (fmt_is_numeric (format->type))
88 /* Converts TEXT to a value.
90 VAL will be initialised and filled by this function.
91 It is the caller's responsibility to destroy VAL when no longer needed.
92 VAR must be the variable with which VAL is associated.
94 On success, VAL is returned, NULL otherwise.
97 text_to_value (const gchar *text,
98 const struct variable *var,
101 const struct fmt_spec *format = var_get_print_format (var);
102 int width = var_get_width (var);
104 if ( format->type != FMT_A)
106 if ( ! text ) return NULL;
109 const gchar *s = text;
117 if ( !*s) return NULL;
121 value_init (val, width);
122 free (data_in (ss_cstr (text), UTF8, format->type, val, width,
123 var_get_encoding (var)));
129 /* This function must be used whenever a filename generated by glib,
130 (eg, from gtk_file_chooser_get_filename) and passed to the C library,
131 (eg through a pspp syntax string).
134 convert_glib_filename_to_system_filename (const gchar *fname, GError **err)
139 const gchar *target_encoding;
140 gchar *utf8_name = NULL;
142 g_get_charset (&target_encoding);
144 output_name = g_convert (fname, -1, target_encoding,
145 "UTF-8", NULL, NULL, err);
147 output_name = xstrdup (fname);
155 #define _(msgid) gettext (msgid)
156 #define N_(msgid) msgid
164 dialog = gtk_message_dialog_new (NULL,
168 _("Sorry. The help system hasn't yet "
169 "been implemented."));
170 gtk_dialog_run (GTK_DIALOG (dialog));
171 gtk_widget_destroy (dialog);
175 connect_help (GtkBuilder *xml)
177 GSList *helps = gtk_builder_get_objects (xml);
180 for ( i = helps; i ; i = g_slist_next (i))
182 GObject *o = i->data;
183 if ( GTK_IS_WIDGET (o) )
185 const gchar *name = gtk_buildable_get_name (GTK_BUILDABLE (o));
189 strncpy (s, name, 11);
193 if ( 0 == strcmp ("help_button", s))
195 g_signal_connect (o, "clicked", give_help, 0);
200 g_slist_free (helps);
204 /* Create a deep copy of SRC */
206 clone_list_store (const GtkListStore *src)
208 GtkTreeIter src_iter;
211 const gint n_cols = gtk_tree_model_get_n_columns (GTK_TREE_MODEL (src));
212 GType *types = g_malloc (sizeof (*types) * n_cols);
217 for (i = 0 ; i < n_cols; ++i )
218 types[i] = gtk_tree_model_get_column_type (GTK_TREE_MODEL (src), i);
220 dest = gtk_list_store_newv (n_cols, types);
222 for (ok = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (src),
225 ok = gtk_tree_model_iter_next (GTK_TREE_MODEL (src), &src_iter))
227 GtkTreeIter dest_iter;
228 gtk_list_store_append (dest, &dest_iter);
230 for (i = 0 ; i < n_cols; ++i )
234 gtk_tree_model_get_value (GTK_TREE_MODEL (src), &src_iter, i, &val);
235 gtk_list_store_set_value (dest, &dest_iter, i, &val);
237 g_value_unset (&val);
251 on_delete (GtkWindow *window, GdkEvent *e, GtkWindow **addr)
259 paste_syntax_to_window (gchar *syntax)
261 static GtkWidget *the_syntax_pasteboard = NULL;
263 GtkTextBuffer *buffer = NULL;
265 if ( NULL == the_syntax_pasteboard)
267 the_syntax_pasteboard = psppire_syntax_window_new (NULL);
268 g_signal_connect (the_syntax_pasteboard, "delete-event", G_CALLBACK (on_delete),
269 &the_syntax_pasteboard);
272 buffer = GTK_TEXT_BUFFER (PSPPIRE_SYNTAX_WINDOW (the_syntax_pasteboard)->buffer);
274 gtk_text_buffer_begin_user_action (buffer);
275 gtk_text_buffer_insert_at_cursor (buffer, syntax, -1);
276 gtk_text_buffer_insert_at_cursor (buffer, "\n", 1);
277 gtk_text_buffer_end_user_action (buffer);
279 gtk_widget_show (the_syntax_pasteboard);
285 /* gtk_box_pack_start_defaults is deprecated.
286 Therefore we roll our own until a better solution is found */
288 psppire_box_pack_start_defaults (GtkBox *box, GtkWidget *widget)
290 gtk_box_pack_start (box, widget, TRUE, TRUE, 0);