X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpage-file.c;h=bf09902bf9e68c19cf3894f3d37ff504334a6a98;hb=03a7b96a587a58bda342b4eb5ce5f935880ba2b7;hp=31b3f6e33f51bdb7517a3bf9d52634861ddd2982;hpb=b0b67aa7a5225aa92bc3c9ecd1a12822f89d2c45;p=pspp diff --git a/src/ui/gui/page-file.c b/src/ui/gui/page-file.c index 31b3f6e33f..bf09902bf9 100644 --- a/src/ui/gui/page-file.c +++ b/src/ui/gui/page-file.c @@ -20,7 +20,6 @@ #include #include -#include #include #include #include @@ -29,6 +28,10 @@ #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" @@ -46,11 +48,9 @@ #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" @@ -60,10 +60,12 @@ 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));