categoricals: Improve comments.
[pspp] / src / ui / gui / psppire-import-assistant.c
index 422cf16a0aca3367b1dd85ce7926f8f4de2a2880..8270938373f6ae9e5be4954d5921b87f9d35075d 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPPIRE - a graphical user interface for PSPP.
-   Copyright (C) 2015, 2016, 2017  Free Software Foundation
+   Copyright (C) 2015, 2016, 2017, 2018  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
@@ -127,6 +127,8 @@ psppire_import_assistant_finalize (GObject *object)
 
   ds_destroy (&ia->quotes);
 
+  dict_unref (ia->dict);
+
   g_object_unref (ia->builder);
 
   ia->response = -1;
@@ -1249,75 +1251,106 @@ my_advance (struct casereader *reader, void *aux, casenumber cnt)
   g_print ("%s:%d\n", __FILE__, __LINE__);
 }
 
-/* Called just before the formats page of the assistant is
-   displayed. */
-static void
-prepare_formats_page (PsppireImportAssistant *ia)
+static struct casereader *
+textfile_create_reader (PsppireImportAssistant *ia)
 {
-  PsppireDict *dict = psppire_dict_new_from_dict (ia->dict);
-  g_object_set (ia->var_sheet, "data-model", dict, NULL);
+  int n_vars = dict_get_var_cnt (ia->dict);
 
-  my_casereader_class.read = my_read;
-  my_casereader_class.destroy = my_destroy;
-  my_casereader_class.advance = my_advance;
+  int i;
 
-  {
-    int i;
+  struct fmt_guesser **fg = xcalloc (sizeof *fg, n_vars);
+  for (i = 0 ; i < n_vars; ++i)
+    {
+      fg[i] = fmt_guesser_create ();
+    }
 
-    struct fmt_guesser **fg = xcalloc (sizeof *fg, dict_get_var_cnt (ia->dict));
-    for (i = 0 ; i < dict_get_var_cnt (ia->dict); ++i)
-      {
-       fg[i] = fmt_guesser_create ();
-      }
+  gint n_rows = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (ia->delimiters_model), NULL);
 
-    gint n_rows = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (ia->delimiters_model), NULL);
+  GtkTreeIter iter;
+  gboolean ok;
+  for (ok = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (ia->delimiters_model), &iter);
+       ok;
+       ok = gtk_tree_model_iter_next (GTK_TREE_MODEL (ia->delimiters_model), &iter))
+    {
+      for (i = 0 ; i < n_vars; ++i)
+       {
+         gchar *s = NULL;
+         gtk_tree_model_get (GTK_TREE_MODEL (ia->delimiters_model), &iter, i+1, &s, -1);
+         if (s)
+           fmt_guesser_add (fg[i], ss_cstr (s));
+         free (s);
+       }
+    }
+
+  struct caseproto *proto = caseproto_create ();
+  for (i = 0 ; i < n_vars; ++i)
+    {
+      struct fmt_spec fs;
+      fmt_guesser_guess (fg[i], &fs);
+
+      fmt_fix (&fs, FMT_FOR_INPUT);
 
-    GtkTreeIter iter;
-    gboolean ok;
-    for (ok = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (ia->delimiters_model), &iter);
-        ok;
-        ok = gtk_tree_model_iter_next (GTK_TREE_MODEL (ia->delimiters_model), &iter))
-      {
-       for (i = 0 ; i < dict_get_var_cnt (ia->dict); ++i)
-         {
-           gchar *s = NULL;
-           gtk_tree_model_get (GTK_TREE_MODEL (ia->delimiters_model), &iter, i+1, &s, -1);
-           if (s)
-             fmt_guesser_add (fg[i], ss_cstr (s));
-           free (s);
-         }
-      }
+      struct variable *var = dict_get_var (ia->dict, i);
 
-    struct caseproto *proto = caseproto_create ();
-    for (i = 0 ; i < dict_get_var_cnt (ia->dict); ++i)
-      {
-       struct fmt_spec fs;
-       fmt_guesser_guess (fg[i], &fs);
+      int width = fmt_var_width (&fs);
 
-       fmt_fix (&fs, FMT_FOR_INPUT);
+      var_set_width_and_formats (var, width,
+                                &fs, &fs);
 
-       struct variable *var = dict_get_var (ia->dict, i);
+      proto = caseproto_add_width (proto, width);
+      fmt_guesser_destroy (fg[i]);
+    }
 
-       int width = fmt_var_width (&fs);
+  free (fg);
 
-       var_set_width_and_formats (var, width,
-                                  &fs, &fs);
+  struct casereader *cr = casereader_create_random (proto, n_rows, &my_casereader_class,  ia);
+  caseproto_unref (proto);
+  return cr;
+}
 
-       proto = caseproto_add_width (proto, width);
-       fmt_guesser_destroy (fg[i]);
-      }
 
-    free (fg);
+/* Called just before the formats page of the assistant is
+   displayed. */
+static void
+prepare_formats_page (PsppireImportAssistant *ia)
+{
+  my_casereader_class.read = my_read;
+  my_casereader_class.destroy = my_destroy;
+  my_casereader_class.advance = my_advance;
 
-    struct casereader *reader =
-      casereader_create_random (proto, n_rows, &my_casereader_class,  ia);
+  if (ia->spreadsheet)
+    {
+      GtkBuilder *builder = ia->builder;
+      GtkWidget *range_entry = get_widget_assert (builder, "cell-range-entry");
+      GtkWidget *rnc = get_widget_assert (builder, "readnames-checkbox");
+      GtkWidget *combo_box = get_widget_assert (builder, "sheet-entry");
+
+      struct spreadsheet_read_options opts;
+      opts.sheet_name = NULL;
+      opts.sheet_index = gtk_combo_box_get_active (GTK_COMBO_BOX (combo_box)) + 1;
+      opts.read_names = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (rnc));
+      opts.cell_range = g_strdup (gtk_entry_get_text (GTK_ENTRY (range_entry)));
+      opts.asw = 8;
+
+      struct casereader *reader = spreadsheet_make_reader (ia->spreadsheet, &opts);
+
+      PsppireDict *dict = psppire_dict_new_from_dict (ia->spreadsheet->dict);
+      PsppireDataStore *store = psppire_data_store_new (dict);
+      psppire_data_store_set_reader (store, reader);
+      g_object_set (ia->data_sheet, "data-model", store, NULL);
+      g_object_set (ia->var_sheet, "data-model", dict, NULL);
+    }
+  else
+    {
+      struct casereader *reader = textfile_create_reader (ia);
 
-    PsppireDataStore *store = psppire_data_store_new (dict);
-    psppire_data_store_set_reader (store, reader);
+      PsppireDict *dict = psppire_dict_new_from_dict (ia->dict);
+      PsppireDataStore *store = psppire_data_store_new (dict);
+      psppire_data_store_set_reader (store, reader);
 
-    g_object_set (ia->data_sheet, "data-model", store, NULL);
-    caseproto_unref (proto);
-  }
+      g_object_set (ia->data_sheet, "data-model", store, NULL);
+      g_object_set (ia->var_sheet, "data-model", dict, NULL);
+    }
 
   gint pmax;
   g_object_get (get_widget_assert (ia->builder, "vpaned1"),
@@ -1354,6 +1387,7 @@ formats_page_create (PsppireImportAssistant *ia)
   if (ia->data_sheet == NULL)
     {
       ia->data_sheet = psppire_data_sheet_new ();
+      g_object_set (ia->data_sheet, "editable", FALSE, NULL);
 
       gtk_container_add (GTK_CONTAINER (data_scroller), ia->data_sheet);
 
@@ -1522,8 +1556,8 @@ apply_dict (const struct dictionary *dict, struct string *s)
 
 
 
-static char *
-sheet_spec_gen_syntax (PsppireImportAssistant *ia)
+static void
+sheet_spec_gen_syntax (PsppireImportAssistant *ia, struct string *s)
 {
   GtkBuilder *builder = ia->builder;
   GtkWidget *range_entry = get_widget_assert (builder, "cell-range-entry");
@@ -1533,11 +1567,13 @@ sheet_spec_gen_syntax (PsppireImportAssistant *ia)
   int sheet_index = 1 + gtk_combo_box_get_active (GTK_COMBO_BOX (sheet_entry));
   gboolean read_names = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (rnc));
 
-  struct string s = DS_EMPTY_INITIALIZER;
 
   char *filename;
-  g_object_get (ia->text_file, "file-name", &filename, NULL);
-  syntax_gen_pspp (&s,
+  if (ia->spreadsheet)
+    filename = ia->spreadsheet->file_name;
+  else
+    g_object_get (ia->text_file, "file-name", &filename, NULL);
+  syntax_gen_pspp (s,
                   "GET DATA"
                   "\n  /TYPE=%ss"
                   "\n  /FILE=%sq"
@@ -1550,20 +1586,17 @@ sheet_spec_gen_syntax (PsppireImportAssistant *ia)
 
   if (range && 0 != strcmp ("", range))
     {
-      syntax_gen_pspp (&s,
+      syntax_gen_pspp (s,
                       "\n  /CELLRANGE=RANGE %sq", range);
     }
   else
     {
-      syntax_gen_pspp (&s,
+      syntax_gen_pspp (s,
                       "\n  /CELLRANGE=FULL");
     }
 
 
-  syntax_gen_pspp (&s, ".");
-
-
-  return ds_cstr (&s);
+  syntax_gen_pspp (s, ".\n");
 }
 
 
@@ -1605,7 +1638,7 @@ psppire_import_assistant_generate_syntax (PsppireImportAssistant *ia)
     }
   else
     {
-      return sheet_spec_gen_syntax (ia);
+      sheet_spec_gen_syntax (ia, &s);
     }
 
   return ds_cstr (&s);
@@ -1618,4 +1651,3 @@ psppire_import_assistant_run (PsppireImportAssistant *asst)
   g_main_loop_run (asst->main_loop);
   return asst->response;
 }
-