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 /* Formats a value according to VAR's print format and strips white space
50 appropriately for VAR's type. That is, if VAR is numeric, strips leading
51 white space (because numbers are right-justified within their fields), and
52 if VAR is string, strips trailing white space (because spaces pad out string
55 Returns an allocated string. The returned string must be freed when no
58 value_to_text (union value v, const struct variable *var)
60 return value_to_text__ (v, var_get_print_format (var),
61 var_get_encoding (var));
64 /* Formats a value with format FORMAT and strips white space appropriately for
65 FORMATs' type. That is, if FORMAT is numeric, strips leading white space
66 (because numbers are right-justified within their fields), and if FORMAT is
67 string, strips trailing white space (because spaces pad out string values on
70 Returns an allocated string. The returned string must be freed when no
73 value_to_text__ (union value v,
74 const struct fmt_spec *format, const char *encoding)
78 s = data_out_stretchy (&v, encoding, format, settings_get_fmt_settings (),
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 return text_to_value__ (text, var_get_print_format (var),
102 var_get_encoding (var), val);
105 /* Converts TEXT, which contains a value in the given FORMAT encoding in
106 ENCODING, into a value.
108 VAL will be initialised and filled by this function.
109 It is the caller's responsibility to destroy VAL when no longer needed.
111 On success, VAL is returned, NULL otherwise.
114 text_to_value__ (const gchar *text,
115 const struct fmt_spec *format,
116 const gchar *encoding,
119 int width = fmt_var_width (format);
121 if (format->type != FMT_A)
123 if (! text) return NULL;
126 const gchar *s = text;
134 if (!*s) return NULL;
138 value_init (val, width);
139 char *err = data_in (ss_cstr (text), UTF8, format->type,
140 settings_get_fmt_settings (), val, width, encoding);
144 value_destroy (val, width);
153 #define _(msgid) gettext (msgid)
154 #define N_(msgid) msgid
156 /* Create a deep copy of SRC */
158 clone_list_store (const GtkListStore *src)
160 GtkTreeIter src_iter;
163 const gint n_cols = gtk_tree_model_get_n_columns (GTK_TREE_MODEL (src));
164 GType *types = g_malloc (sizeof (*types) * n_cols);
168 for (i = 0 ; i < n_cols; ++i)
169 types[i] = gtk_tree_model_get_column_type (GTK_TREE_MODEL (src), i);
171 dest = gtk_list_store_newv (n_cols, types);
173 for (ok = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (src),
176 ok = gtk_tree_model_iter_next (GTK_TREE_MODEL (src), &src_iter))
178 GtkTreeIter dest_iter;
179 gtk_list_store_append (dest, &dest_iter);
181 for (i = 0 ; i < n_cols; ++i)
185 gtk_tree_model_get_value (GTK_TREE_MODEL (src), &src_iter, i, &val);
186 gtk_list_store_set_value (dest, &dest_iter, i, &val);
188 g_value_unset (&val);
201 on_delete (GtkWindow *window, GdkEvent *e, GtkWindow **addr)
209 paste_syntax_to_window (gchar *syntax)
211 static GtkWidget *the_syntax_pasteboard = NULL;
213 GtkTextBuffer *buffer = NULL;
215 if (NULL == the_syntax_pasteboard)
217 the_syntax_pasteboard = psppire_syntax_window_new (NULL);
218 g_signal_connect (the_syntax_pasteboard, "delete-event", G_CALLBACK (on_delete),
219 &the_syntax_pasteboard);
222 buffer = GTK_TEXT_BUFFER (PSPPIRE_SYNTAX_WINDOW (the_syntax_pasteboard)->buffer);
224 gtk_text_buffer_begin_user_action (buffer);
225 gtk_text_buffer_insert_at_cursor (buffer, syntax, -1);
226 gtk_text_buffer_insert_at_cursor (buffer, "\n", 1);
227 gtk_text_buffer_end_user_action (buffer);
229 gtk_widget_show (the_syntax_pasteboard);
235 /* Return the width of an upper case M (in pixels) when rendered onto
236 WIDGET with its current style. */
238 width_of_m (GtkWidget *widget)
240 PangoContext *context = gtk_widget_create_pango_context (widget);
241 PangoLayout *layout = pango_layout_new (context);
244 pango_layout_set_text (layout, "M", 1);
245 pango_layout_get_extents (layout, NULL, &rect);
247 g_object_unref (G_OBJECT (layout));
248 g_object_unref (G_OBJECT (context));
250 return rect.width / (gdouble) PANGO_SCALE;