Merge remote branch 'origin/master' into import-gui
[pspp] / src / ui / gui / text-data-import-dialog.c
index 6d41b0f9c9800a15b9c79329008c50732f792136..a9cf86054e907f7675f19ae2c1b93cd28c883963 100644 (file)
 
 #include "ui/gui/text-data-import-dialog.h"
 
+#include "page-intro.h"
+#include "page-sheet-spec.h"
+#include "page-first-line.h"
+#include "page-separators.h"
+#include "page-formats.h"
+
 #include <errno.h>
 #include <fcntl.h>
 #include <gtk-contrib/psppire-sheet.h>
@@ -82,12 +88,37 @@ text_data_import_assistant (PsppireDataWindow *dw)
 
   ssp = ia->sheet_spec;
 
-  init_formats_page (ia);
+  if (ia->spreadsheet)
+    {
+      ia->sheet_spec = sheet_spec_page_create (ia);
+    }
+  else
+    {
+      ia->intro = intro_page_create (ia);
+      ia->separators = separators_page_create (ia);
+      ia->first_line = first_line_page_create (ia);
+
+      printf ("%s:%d %p\n", __FILE__, __LINE__, ia->intro);
+    }
+  ia->formats = formats_page_create (ia);
 
   gtk_widget_show_all (GTK_WIDGET (ia->asst.assistant));
 
   ia->asst.main_loop = g_main_loop_new (NULL, false);
-  g_main_loop_run (ia->asst.main_loop);
+
+  {  
+  /*
+    Instead of this block,
+    A simple     g_main_loop_run (ia->asst.main_loop);  should work here.  But it seems to crash.
+    I have no idea why.
+  */
+    GMainContext *ctx = g_main_loop_get_context (ia->asst.main_loop);
+    ia->asst.loop_done = false;
+    while (! ia->asst.loop_done)
+      {
+       g_main_context_iteration (ctx, TRUE);
+      }
+  }
   g_main_loop_unref (ia->asst.main_loop);
 
   switch (ia->asst.response)
@@ -102,8 +133,11 @@ text_data_import_assistant (PsppireDataWindow *dw)
       break;
     }
 
-  destroy_formats_page (ia);
-  destroy_separators_page (ia);
+  if (ssp) 
+    {
+      destroy_formats_page (ia);
+      destroy_separators_page (ia);
+    }
 
   destroy_assistant (ia);
   destroy_file (ia);
@@ -200,11 +234,8 @@ generate_syntax (const struct import_assistant *ia)
 {
   struct string s = DS_EMPTY_INITIALIZER;
 
-#if 0
-  if (ssp->spreadsheet == NULL)
+  if (ia->spreadsheet == NULL)
     {
-      size_t var_cnt;
-      size_t i;
       syntax_gen_pspp (&s,
                       "GET DATA"
                       "\n  /TYPE=TXT"
@@ -213,80 +244,24 @@ generate_syntax (const struct import_assistant *ia)
       if (ia->file.encoding && strcmp (ia->file.encoding, "Auto"))
        syntax_gen_pspp (&s, "  /ENCODING=%sq\n", ia->file.encoding);
 
+
       intro_append_syntax (ia->intro, &s);
 
+
       ds_put_cstr (&s,
                   "  /ARRANGEMENT=DELIMITED\n"
                   "  /DELCASE=LINE\n");
-      if (ia->first_line->skip_lines > 0)
-       ds_put_format (&s, "  /FIRSTCASE=%d\n", ia->first_line->skip_lines + 1);
-      ds_put_cstr (&s, "  /DELIMITERS=\"");
-      if (ds_find_byte (&ia->separators->separators, '\t') != SIZE_MAX)
-       ds_put_cstr (&s, "\\t");
-      if (ds_find_byte (&ia->separators->separators, '\\') != SIZE_MAX)
-       ds_put_cstr (&s, "\\\\");
-      for (i = 0; i < ds_length (&ia->separators->separators); i++)
-       {
-         char c = ds_at (&ia->separators->separators, i);
-         if (c == '"')
-           ds_put_cstr (&s, "\"\"");
-         else if (c != '\t' && c != '\\')
-           ds_put_byte (&s, c);
-       }
-      ds_put_cstr (&s, "\"\n");
-      if (!ds_is_empty (&ia->separators->quotes))
-       syntax_gen_pspp (&s, "  /QUALIFIER=%sq\n", ds_cstr (&ia->separators->quotes));
-      if (!ds_is_empty (&ia->separators->quotes) && ia->separators->escape)
-       ds_put_cstr (&s, "  /ESCAPE\n");
-      ds_put_cstr (&s, "  /VARIABLES=\n");
-
-      var_cnt = dict_get_var_cnt (ia->formats->dict);
-      for (i = 0; i < var_cnt; i++)
-       {
-         struct variable *var = dict_get_var (ia->formats->dict, i);
-         char format_string[FMT_STRING_LEN_MAX + 1];
-         fmt_to_string (var_get_print_format (var), format_string);
-         ds_put_format (&s, "    %s %s%s\n",
-                        var_get_name (var), format_string,
-                        i == var_cnt - 1 ? "." : "");
-       }
-
-      apply_dict (ia->formats->dict, &s);
+
+      first_line_append_syntax (ia, &s);
+      separators_append_syntax (ia, &s);
+      formats_append_syntax (ia, &s);
+      apply_dict (ia->dict, &s);
     }
   else
-
     {
-      const struct sheet_spec_page *ssp = ia->sheet_spec;
-
-      syntax_gen_pspp (&s,
-                      "GET DATA"
-                      "\n  /TYPE=%ss"
-                      "\n  /FILE=%sq"
-                      "\n  /SHEET=index %d"
-                      "\n  /READNAMES=%ss",
-                      (ssp->spreadsheet->type == SPREADSHEET_GNUMERIC) ? "GNM" : "ODS",
-                      ia->file.file_name,                       
-                      ssp->opts.sheet_index,
-                      ssp->sri.read_names ? "ON" : "OFF");
-
-
-      if ( ssp->opts.cell_range)
-       {
-         syntax_gen_pspp (&s,
-                          "\n  /CELLRANGE=RANGE %sq",
-                          ssp->opts.cell_range);
-       }
-      else
-       {
-         syntax_gen_pspp (&s,
-                          "\n  /CELLRANGE=FULL");
-       }
-
-
-      syntax_gen_pspp (&s, ".");
+      return sheet_spec_gen_syntax (ia);
     }
 
-#endif
   return ds_cstr (&s);
 }
 
@@ -377,16 +352,15 @@ parse_field (struct import_assistant *ia,
              size_t row, size_t column,
              char **outputp, char **tooltipp)
 {
-  struct substring field;
-  union value val;
-  struct variable *var;
   const struct fmt_spec *in;
   struct fmt_spec out;
   char *tooltip;
   bool ok;
 
-  field = ia->columns[column].contents[row];
-  var = dict_get_var (ia->formats->dict, column);
+  struct substring field = ia->columns[column].contents[row];
+  struct variable *var = dict_get_var (ia->dict, column);
+  union value val;
+
   value_init (&val, var_get_width (var));
   in = var_get_print_format (var);
   out = fmt_for_output_from_input (in);
@@ -396,7 +370,7 @@ parse_field (struct import_assistant *ia,
       char *error;
 
       error = data_in (field, "UTF-8", in->type, &val, var_get_width (var),
-                       dict_get_encoding (ia->formats->dict));
+                       dict_get_encoding (ia->dict));
       if (error != NULL)
         {
           tooltip = xasprintf (_("Cannot parse field content `%.*s' as "
@@ -414,7 +388,7 @@ parse_field (struct import_assistant *ia,
     }
   if (outputp != NULL)
     {
-      *outputp = data_out (&val, dict_get_encoding (ia->formats->dict),  &out);
+      *outputp = data_out (&val, dict_get_encoding (ia->dict),  &out);
     }
   value_destroy (&val, var_get_width (var));
 
@@ -623,7 +597,7 @@ make_data_column (struct import_assistant *ia, GtkTreeView *tree_view,
   if (input)
     column = &ia->columns[dict_idx];
   else
-    var = dict_get_var (ia->formats->dict, dict_idx);
+    var = dict_get_var (ia->dict, dict_idx);
 
   name = escape_underscores (input ? column->name : var_get_name (var));
   char_cnt = input ? column->width : var_get_print_format (var)->w;