data-in: Eliminate "implied_decimals" parameter from data_in().
[pspp] / src / ui / gui / helper.c
index ff750b25f7aa6ffe3b6a99e55a2d014791bcf5d8..70e3c27394e7dbf913c3de93939d0bb8e12da1d4 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPPIRE - a graphical user interface for PSPP.
-   Copyright (C) 2007, 2009  Free Software Foundation
+   Copyright (C) 2007, 2009, 2010  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
@@ -24,7 +24,6 @@
 
 #include <glib.h>
 #include "helper.h"
-#include "message-dialog.h"
 #include <data/format.h>
 #include <data/data-in.h>
 #include <data/data-out.h>
@@ -41,7 +40,9 @@
 #include <data/settings.h>
 
 #include "psppire-data-store.h"
+#include "psppire.h"
 
+#include "gl/configmake.h"
 #include "xalloc.h"
 
 #include <gettext.h>
@@ -60,17 +61,27 @@ value_to_text (union value v, const PsppireDict *dict, struct fmt_spec format)
 }
 
 
+/* Converts TEXT to a value.
 
-gboolean
-text_to_value (const gchar *text, union value *v,
+   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.
+
+   On success, VAL is returned, NULL otherwise.
+*/
+union value *
+text_to_value (const gchar *text,
               const PsppireDict *dict,
-             struct fmt_spec format)
+              const struct variable *var,
+              union value *val)
 {
-  bool ok;
+  const struct fmt_spec *format = var_get_print_format (var);
+  int width = var_get_width (var);
 
-  if ( format.type != FMT_A)
+  if ( format->type != FMT_A)
     {
-      if ( ! text ) return FALSE;
+      if ( ! text ) return NULL;
 
       {
        const gchar *s = text;
@@ -81,17 +92,16 @@ text_to_value (const gchar *text, union value *v,
            s++;
          }
 
-       if ( !*s) return FALSE;
+       if ( !*s) return NULL;
       }
     }
 
+  value_init (val, width);
   msg_disable ();
-  ok = data_in (ss_cstr (text), UTF8, format.type, 0, 0, 0,
-               dict->dict,
-                v, fmt_var_width (&format));
+  data_in (ss_cstr (text), UTF8, format->type, 0, 0, dict->dict, val, width);
   msg_enable ();
 
-  return ok;
+  return val;
 }
 
 
@@ -120,11 +130,10 @@ get_object_assert (GtkBuilder *builder, const gchar *name, GType type)
   o = gtk_builder_get_object (builder, name);
 
   if ( !o )
-    g_critical ("Object \"%s\" could not be found\n", name);
-
-  if ( ! g_type_is_a (G_OBJECT_TYPE (o), type))
+    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", 
+     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));
    }
 
@@ -220,22 +229,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"), err->message);
-    }
-
-  g_free (cmd);
-  g_clear_error (&err);
-}
-
-
 /* Create a deep copy of SRC */
 GtkListStore *
 clone_list_store (const GtkListStore *src)
@@ -280,12 +273,45 @@ clone_list_store (const GtkListStore *src)
 }
 
 
+
+
+static gboolean 
+on_delete (GtkWindow *window, GdkEvent *e, GtkWindow **addr)
+{
+  *addr = NULL;
+
+  return FALSE;
+}
+
 void
-paste_syntax_in_new_window (const gchar *syntax)
+paste_syntax_to_window (const 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 ();
+      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_insert_at_cursor (PSPPIRE_SYNTAX_WINDOW (se)->buffer, syntax, -1);
+  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_widget_show (the_syntax_pasteboard);
+}
 
-  gtk_widget_show (se);
+
+/* gtk_box_pack_start_defaults is deprecated.
+   Therefore we roll our own until a better solution is found */
+void
+psppire_box_pack_start_defaults (GtkBox *box, GtkWidget *widget)
+{
+  gtk_box_pack_start (box, widget, TRUE, TRUE, 0);
 }