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)
63 s = data_out (&v, var_get_encoding (var), var_get_print_format (var));
64 if (var_is_numeric (var))
73 /* Converts TEXT to a value.
75 VAL will be initialised and filled by this function.
76 It is the caller's responsibility to destroy VAL when no longer needed.
77 VAR must be the variable with which VAL is associated.
79 On success, VAL is returned, NULL otherwise.
82 text_to_value (const gchar *text,
83 const struct variable *var,
86 const struct fmt_spec *format = var_get_print_format (var);
87 int width = var_get_width (var);
89 if ( format->type != FMT_A)
91 if ( ! text ) return NULL;
94 const gchar *s = text;
102 if ( !*s) return NULL;
106 value_init (val, width);
107 free (data_in (ss_cstr (text), UTF8, format->type, val, width,
108 var_get_encoding (var)));
114 /* This function must be used whenever a filename generated by glib,
115 (eg, from gtk_file_chooser_get_filename) and passed to the C library,
116 (eg through a pspp syntax string).
119 convert_glib_filename_to_system_filename (const gchar *fname, GError **err)
124 const gchar *target_encoding;
125 gchar *utf8_name = NULL;
127 g_get_charset (&target_encoding);
129 output_name = g_convert (fname, -1, target_encoding,
130 "UTF-8", NULL, NULL, err);
132 output_name = xstrdup (fname);
140 #define _(msgid) gettext (msgid)
141 #define N_(msgid) msgid
149 dialog = gtk_message_dialog_new (NULL,
153 _("Sorry. The help system hasn't yet "
154 "been implemented."));
155 gtk_dialog_run (GTK_DIALOG (dialog));
156 gtk_widget_destroy (dialog);
160 connect_help (GtkBuilder *xml)
162 GSList *helps = gtk_builder_get_objects (xml);
165 for ( i = helps; i ; i = g_slist_next (i))
167 GObject *o = i->data;
168 if ( GTK_IS_WIDGET (o) )
170 const gchar *name = gtk_buildable_get_name (GTK_BUILDABLE (o));
174 strncpy (s, name, 11);
178 if ( 0 == strcmp ("help_button", s))
180 g_signal_connect (o, "clicked", give_help, 0);
185 g_slist_free (helps);
189 /* Create a deep copy of SRC */
191 clone_list_store (const GtkListStore *src)
193 GtkTreeIter src_iter;
196 const gint n_cols = gtk_tree_model_get_n_columns (GTK_TREE_MODEL (src));
197 GType *types = g_malloc (sizeof (*types) * n_cols);
202 for (i = 0 ; i < n_cols; ++i )
203 types[i] = gtk_tree_model_get_column_type (GTK_TREE_MODEL (src), i);
205 dest = gtk_list_store_newv (n_cols, types);
207 for (ok = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (src),
210 ok = gtk_tree_model_iter_next (GTK_TREE_MODEL (src), &src_iter))
212 GtkTreeIter dest_iter;
213 gtk_list_store_append (dest, &dest_iter);
215 for (i = 0 ; i < n_cols; ++i )
219 gtk_tree_model_get_value (GTK_TREE_MODEL (src), &src_iter, i, &val);
220 gtk_list_store_set_value (dest, &dest_iter, i, &val);
222 g_value_unset (&val);
236 on_delete (GtkWindow *window, GdkEvent *e, GtkWindow **addr)
244 paste_syntax_to_window (gchar *syntax)
246 static GtkWidget *the_syntax_pasteboard = NULL;
248 GtkTextBuffer *buffer = NULL;
250 if ( NULL == the_syntax_pasteboard)
252 the_syntax_pasteboard = psppire_syntax_window_new (NULL);
253 g_signal_connect (the_syntax_pasteboard, "delete-event", G_CALLBACK (on_delete),
254 &the_syntax_pasteboard);
257 buffer = GTK_TEXT_BUFFER (PSPPIRE_SYNTAX_WINDOW (the_syntax_pasteboard)->buffer);
259 gtk_text_buffer_begin_user_action (buffer);
260 gtk_text_buffer_insert_at_cursor (buffer, syntax, -1);
261 gtk_text_buffer_insert_at_cursor (buffer, "\n", 1);
262 gtk_text_buffer_end_user_action (buffer);
264 gtk_widget_show (the_syntax_pasteboard);
270 /* gtk_box_pack_start_defaults is deprecated.
271 Therefore we roll our own until a better solution is found */
273 psppire_box_pack_start_defaults (GtkBox *box, GtkWidget *widget)
275 gtk_box_pack_start (box, widget, TRUE, TRUE, 0);