Whitespace changes only
[pspp] / src / ui / gui / page-file.c
index 31b3f6e33f51bdb7517a3bf9d52634861ddd2982..bf09902bf9e68c19cf3894f3d37ff504334a6a98 100644 (file)
@@ -20,7 +20,6 @@
 
 #include <errno.h>
 #include <fcntl.h>
-#include <gtk-contrib/psppire-sheet.h>
 #include <gtk/gtk.h>
 #include <limits.h>
 #include <stdlib.h>
 #include "data/data-in.h"
 #include "data/data-out.h"
 #include "data/format-guesser.h"
+#include "data/casereader.h"
+#include "data/gnumeric-reader.h"
+#include "data/ods-reader.h"
+#include "data/spreadsheet-reader.h"
 #include "data/value-labels.h"
 #include "language/data-io/data-parser.h"
 #include "language/lexer/lexer.h"
@@ -36,7 +39,6 @@
 #include "libpspp/i18n.h"
 #include "libpspp/line-reader.h"
 #include "libpspp/message.h"
-#include "ui/gui/checkbox-treeview.h"
 #include "ui/gui/dialog-common.h"
 #include "ui/gui/executor.h"
 #include "ui/gui/helper.h"
 #include "ui/gui/psppire-encoding-selector.h"
 #include "ui/gui/psppire-empty-list-store.h"
 #include "ui/gui/psppire-var-sheet.h"
-#include "ui/gui/psppire-var-store.h"
 #include "ui/gui/psppire-scanf.h"
 #include "ui/syntax-gen.h"
 
-#include "gl/error.h"
 #include "gl/intprops.h"
 #include "gl/xalloc.h"
 
 
 struct import_assistant;
 
-/* Choosing a file and reading it. */
-
+/* Choose a file */
 static char *choose_file (GtkWindow *parent_window, gchar **encodingp);
 
+
+
+
 /* Obtains the file to import from the user and initializes IA's
    file substructure.  PARENT_WINDOW must be the window to use
    as the file chooser window's parent.
@@ -73,76 +75,94 @@ static char *choose_file (GtkWindow *parent_window, gchar **encodingp);
 bool
 init_file (struct import_assistant *ia, GtkWindow *parent_window)
 {
-  struct file *file = &ia->file;
-  enum { MAX_PREVIEW_LINES = 1000 }; /* Max number of lines to read. */
   enum { MAX_LINE_LEN = 16384 }; /* Max length of an acceptable line. */
-  struct line_reader *reader;
-  struct string input;
+  struct file *file = &ia->file;
 
+  file->lines = NULL;
   file->file_name = choose_file (parent_window, &file->encoding);
   if (file->file_name == NULL)
     return false;
 
-  reader = line_reader_for_file (file->encoding, file->file_name, O_RDONLY);
-  if (reader == NULL)
-    {
-      msg (ME, _("Could not open `%s': %s"),
-           file->file_name, strerror (errno));
-      return false;
-    }
-
-  ds_init_empty (&input);
-  file->lines = xnmalloc (MAX_PREVIEW_LINES, sizeof *file->lines);
-  for (; file->line_cnt < MAX_PREVIEW_LINES; file->line_cnt++)
-    {
-      ds_clear (&input);
-      if (!line_reader_read (reader, &input, MAX_LINE_LEN + 1)
-          || ds_length (&input) > MAX_LINE_LEN)
-        {
-          if (line_reader_eof (reader))
-            break;
-          else if (line_reader_error (reader))
-            msg (ME, _("Error reading `%s': %s"),
-                 file->file_name, strerror (line_reader_error (reader)));
-          else
-            msg (ME, _("Failed to read `%s', because it contains a line "
-                       "over %d bytes long and therefore appears not to be "
-                       "a text file."),
-                 file->file_name, MAX_LINE_LEN);
-          line_reader_close (reader);
-          destroy_file (ia);
-          ds_destroy (&input);
-          return false;
-        }
-
-      ds_init_cstr (&file->lines[file->line_cnt],
-                    recode_string ("UTF-8", line_reader_get_encoding (reader),
-                                   ds_cstr (&input), ds_length (&input)));
-    }
-  ds_destroy (&input);
+  if (ia->spreadsheet == NULL)
+    ia->spreadsheet = gnumeric_probe (file->file_name, false);
 
-  if (file->line_cnt == 0)
-    {
-      msg (ME, _("`%s' is empty."), file->file_name);
-      line_reader_close (reader);
-      destroy_file (ia);
-      return false;
-    }
+  if (ia->spreadsheet == NULL)
+    ia->spreadsheet = ods_probe (file->file_name, false);
 
-  /* Estimate the number of lines in the file. */
-  if (file->line_cnt < MAX_PREVIEW_LINES)
-    file->total_lines = file->line_cnt;
-  else
+  if (ia->spreadsheet == NULL)
     {
-      struct stat s;
-      off_t position = line_reader_tell (reader);
-      if (fstat (line_reader_fileno (reader), &s) == 0 && position > 0)
-        file->total_lines = (double) file->line_cnt / position * s.st_size;
-      else
-        file->total_lines = 0;
-    }
-
-  line_reader_close (reader);
+    struct string input;
+    struct line_reader *reader = line_reader_for_file (file->encoding, file->file_name, O_RDONLY);
+    if (reader == NULL)
+      {
+       msg_error (errno, _("Could not open `%s'"),
+            file->file_name);
+       return false;
+      }
+
+    ds_init_empty (&input);
+    file->lines = xnmalloc (MAX_PREVIEW_LINES, sizeof *file->lines);
+    for (; file->line_cnt < MAX_PREVIEW_LINES; file->line_cnt++)
+      {
+       ds_clear (&input);
+       if (!line_reader_read (reader, &input, MAX_LINE_LEN + 1)
+           || ds_length (&input) > MAX_LINE_LEN)
+         {
+           if (line_reader_eof (reader))
+             break;
+           else if (line_reader_error (reader))
+             msg (ME, _("Error reading `%s': %s"),
+                  file->file_name, strerror (line_reader_error (reader)));
+           else
+             msg (ME, _("Failed to read `%s', because it contains a line "
+                        "over %d bytes long and therefore appears not to be "
+                        "a text file."),
+                  file->file_name, MAX_LINE_LEN);
+           line_reader_close (reader);
+           destroy_file (ia);
+           ds_destroy (&input);
+           return false;
+         }
+
+       ds_init_cstr (&file->lines[file->line_cnt],
+                     recode_string ("UTF-8", line_reader_get_encoding (reader),
+                                    ds_cstr (&input), ds_length (&input)));
+      }
+    ds_destroy (&input);
+
+    if (file->line_cnt == 0)
+      {
+       msg (ME, _("`%s' is empty."), file->file_name);
+       line_reader_close (reader);
+       destroy_file (ia);
+       return false;
+      }
+
+
+    /* Estimate the number of lines in the file. */
+    if (file->line_cnt < MAX_PREVIEW_LINES)
+      {
+       file->total_lines = file->line_cnt;
+       file->total_is_exact = true;
+      }
+    else
+      {
+       struct stat s;
+       off_t position = line_reader_tell (reader);
+       if (fstat (line_reader_fileno (reader), &s) == 0 && position > 0)
+         {
+           file->total_lines = (double) file->line_cnt / position * s.st_size;
+           file->total_is_exact = false;
+         }
+       else
+         {
+         file->total_lines = 0;
+         file->total_is_exact = true;
+         }
+      }
+
+    line_reader_close (reader);
+  }
 
   return true;
 }
@@ -154,9 +174,13 @@ destroy_file (struct import_assistant *ia)
   struct file *f = &ia->file;
   size_t i;
 
-  for (i = 0; i < f->line_cnt; i++)
-    ds_destroy (&f->lines[i]);
-  free (f->lines);
+  if (f->lines)
+    {
+      for (i = 0; i < f->line_cnt; i++)
+       ds_destroy (&f->lines[i]);
+      free (f->lines);
+    }
+
   g_free (f->file_name);
   g_free (f->encoding);
 }
@@ -178,14 +202,14 @@ choose_file (GtkWindow *parent_window, gchar **encodingp)
   GtkWidget *dialog = gtk_file_chooser_dialog_new (_("Import Delimited Text Data"),
                                         parent_window,
                                         GTK_FILE_CHOOSER_ACTION_OPEN,
-                                        GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-                                        GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
+                                       _("Cancel"), GTK_RESPONSE_CANCEL,
+                                       _("Open"), GTK_RESPONSE_ACCEPT,
                                         NULL);
 
   g_object_set (dialog, "local-only", FALSE, NULL);
 
   filter = gtk_file_filter_new ();
-  gtk_file_filter_set_name (filter, _("Text files"));
+  gtk_file_filter_set_name (filter, _("Text Files"));
   gtk_file_filter_add_mime_type (filter, "text/*");
   gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
 
@@ -212,6 +236,22 @@ choose_file (GtkWindow *parent_window, gchar **encodingp)
   gtk_file_filter_add_mime_type (filter, "text/tab-separated-values");
   gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
 
+  filter = gtk_file_filter_new ();
+  gtk_file_filter_set_name (filter, _("Gnumeric Spreadsheet Files"));
+  gtk_file_filter_add_mime_type (filter, "application/x-gnumeric");
+  gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
+
+  filter = gtk_file_filter_new ();
+  gtk_file_filter_set_name (filter, _("OpenDocument Spreadsheet Files"));
+  gtk_file_filter_add_mime_type (filter, "application/vnd.oasis.opendocument.spreadsheet");
+  gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
+
+  filter = gtk_file_filter_new ();
+  gtk_file_filter_set_name (filter, _("All Spreadsheet Files"));
+  gtk_file_filter_add_mime_type (filter, "application/x-gnumeric");
+  gtk_file_filter_add_mime_type (filter, "application/vnd.oasis.opendocument.spreadsheet");
+  gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
+
   gtk_file_chooser_set_extra_widget (
     GTK_FILE_CHOOSER (dialog), psppire_encoding_selector_new ("Auto", true));