New file: builder-wrapper.h and builder-wrapper.c
[pspp-builds.git] / src / ui / gui / helper.c
index 3be3981388e46c4a3a17c32b81061cd64ac180d4..30f7da1f04cc6209bb4dd2517e6fad8721f089c9 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPPIRE - a graphical user interface for PSPP.
-   Copyright (C) 2007, 2009, 2010  Free Software Foundation
+   Copyright (C) 2007, 2009, 2010, 2011, 2012  Free Software Foundation
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -31,7 +31,7 @@
 #include <data/casereader-provider.h>
 #include <libpspp/message.h>
 #include "psppire-syntax-window.h"
-#include <gtk/gtkbuilder.h>
+#include <gtk/gtk.h>
 #include <libpspp/i18n.h>
 
 #include <ctype.h>
 #include <data/settings.h>
 
 #include "psppire-data-store.h"
+#include "psppire.h"
 
 #include "gl/configmake.h"
 #include "xalloc.h"
 
 #include <gettext.h>
 
-/* Formats a value according to FORMAT
-   The returned string must be freed when no longer required */
+/* Formats a value according to VAR's print format and strips white space
+   appropriately for VAR's type.  That is, if VAR is numeric, strips leading
+   white space (because numbers are right-justified within their fields), and
+   if VAR is string, strips trailing white space (because spaces pad out string
+   values on the right).
+
+   Returns an allocated string.  The returned string must be freed when no
+   longer required. */
 gchar *
-value_to_text (union value v, const PsppireDict *dict, struct fmt_spec format)
+value_to_text (union value v, const struct variable *var)
 {
-  gchar *s = 0;
+  gchar *s;
 
-  s = data_out (&v, dict_get_encoding (dict->dict),  &format);
-  g_strchug (s);
+  s = data_out (&v, var_get_encoding (var), var_get_print_format (var));
+  if (var_is_numeric (var))
+    g_strchug (s);
+  else
+    g_strchomp (s);
 
   return s;
 }
@@ -64,14 +74,12 @@ value_to_text (union value v, const PsppireDict *dict, struct fmt_spec format)
 
    VAL will be initialised and filled by this function.
    It is the caller's responsibility to destroy VAL when no longer needed.
-   VAR and DICT must be the variable and dictionary with which VAL
-   is associated.
+   VAR must be the variable with which VAL is associated.
 
    On success, VAL is returned, NULL otherwise.
 */
 union value *
 text_to_value (const gchar *text,
-              const PsppireDict *dict,
               const struct variable *var,
               union value *val)
 {
@@ -96,64 +104,13 @@ text_to_value (const gchar *text,
     }
 
   value_init (val, width);
-  msg_disable ();
-  data_in (ss_cstr (text), UTF8, format->type, 0, 0, 0,
-               dict->dict,
-                val, width);
-  msg_enable ();
+  free (data_in (ss_cstr (text), UTF8, format->type, val, width,
+                 var_get_encoding (var)));
 
   return val;
 }
 
 
-GtkBuilder *
-builder_new_real (const gchar *name)
-{
-  GtkBuilder *builder = gtk_builder_new ();
-
-  GError *err = NULL;
-  if ( ! gtk_builder_add_from_file (builder, name,  &err))
-    {
-      g_critical ("Couldnt open user interface  file %s: %s", name, err->message);
-      g_clear_error (&err);
-    }
-
-  return builder;
-}
-
-
-GObject *
-get_object_assert (GtkBuilder *builder, const gchar *name, GType type)
-{
-  GObject *o = NULL;
-  g_assert (name);
-
-  o = gtk_builder_get_object (builder, name);
-
-  if ( !o )
-    g_critical ("Object \"%s\" could not be found\n", name);
-  else if ( ! g_type_is_a (G_OBJECT_TYPE (o), type))
-   {
-     g_critical ("Object \"%s\" was expected to have type %s, but in fact has type %s", 
-       name, g_type_name (type), G_OBJECT_TYPE_NAME (o));
-   }
-
-  return o;
-}
-
-
-GtkAction *
-get_action_assert (GtkBuilder *builder, const gchar *name)
-{
-  return GTK_ACTION (get_object_assert (builder, name, GTK_TYPE_ACTION));
-}
-
-GtkWidget *
-get_widget_assert (GtkBuilder *builder, const gchar *name)
-{
-  return GTK_WIDGET (get_object_assert (builder, name, GTK_TYPE_WIDGET));
-}
-
 /* This function must be used whenever a filename generated by glib,
    (eg, from gtk_file_chooser_get_filename) and passed to the C library,
    (eg through a pspp syntax string).
@@ -210,9 +167,8 @@ connect_help (GtkBuilder *xml)
       GObject *o = i->data;
       if ( GTK_IS_WIDGET (o) )
        {
-         gchar *name = NULL;
+         const gchar *name = gtk_buildable_get_name (GTK_BUILDABLE (o));
          gchar s[12] = {0};
-         g_object_get (o, "name", &name, NULL);
 
          if ( name)
            strncpy (s, name, 11);
@@ -230,25 +186,6 @@ connect_help (GtkBuilder *xml)
 }
 
 
-void
-reference_manual (GtkMenuItem *menu, gpointer data)
-{
-  GError *err = NULL;
-  gchar *cmd = g_strdup_printf ("yelp file://%s", relocate (DOCDIR "/pspp.xml"));
-
-  if ( ! g_spawn_command_line_async (cmd, &err) )
-    {
-      msg (ME, _("Cannot open reference manual: %s.  The PSPP user manual is "
-                 "also available at "
-                 "http://www.gnu.org/software/pspp/documentation.html"),
-           err->message);
-    }
-
-  g_free (cmd);
-  g_clear_error (&err);
-}
-
-
 /* Create a deep copy of SRC */
 GtkListStore *
 clone_list_store (const GtkListStore *src)
@@ -293,14 +230,40 @@ clone_list_store (const GtkListStore *src)
 }
 
 
-void
-paste_syntax_in_new_window (const gchar *syntax)
+
+
+static gboolean 
+on_delete (GtkWindow *window, GdkEvent *e, GtkWindow **addr)
+{
+  *addr = NULL;
+
+  return FALSE;
+}
+
+char *
+paste_syntax_to_window (gchar *syntax)
 {
-  GtkWidget *se = psppire_syntax_window_new ();
+  static GtkWidget *the_syntax_pasteboard = NULL;
+
+  GtkTextBuffer *buffer = NULL;
+
+  if ( NULL == the_syntax_pasteboard)
+    {
+      the_syntax_pasteboard = psppire_syntax_window_new (NULL);
+      g_signal_connect (the_syntax_pasteboard, "delete-event", G_CALLBACK (on_delete),
+                       &the_syntax_pasteboard);
+    }
+
+  buffer = GTK_TEXT_BUFFER (PSPPIRE_SYNTAX_WINDOW (the_syntax_pasteboard)->buffer);
+
+  gtk_text_buffer_begin_user_action (buffer);
+  gtk_text_buffer_insert_at_cursor (buffer, syntax, -1);
+  gtk_text_buffer_insert_at_cursor (buffer, "\n", 1);
+  gtk_text_buffer_end_user_action (buffer);
 
-  gtk_text_buffer_insert_at_cursor (PSPPIRE_SYNTAX_WINDOW (se)->buffer, syntax, -1);
+  gtk_widget_show (the_syntax_pasteboard);
 
-  gtk_widget_show (se);
+  return syntax;
 }