{
if ( r->target_sheet != NULL)
{
+ printf ("%s:%d\n", __FILE__, __LINE__);
xmlChar *value = xmlTextReaderValue (r->xtr);
if ( 0 == xmlStrcmp (value, r->target_sheet))
r->state = STATE_SHEET_FOUND;
}
else if (r->target_sheet_index == r->sheet_index)
{
+ printf ("%s:%d %d\n", __FILE__, __LINE__, r->sheet_index);
r->state = STATE_SHEET_FOUND;
}
}
#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"
on_prepare (GtkAssistant *assistant, GtkWidget *page,
struct import_assistant *ia)
{
+ int pn = gtk_assistant_get_current_page (assistant);
+
+ if (pn == 1 && ia->file.type != FTYPE_TEXT)
+ post_sheet_spec_page (ia);
if (gtk_assistant_get_page_type (assistant, page)
== GTK_ASSISTANT_PAGE_CONFIRM)
reset_separators_page (ia);
else if (page == ia->formats.page)
reset_formats_page (ia);
+ else if (page == ia->sheet_spec.page)
+ reset_sheet_spec_page (ia);
}
/* Causes the assistant to close, returning RESPONSE for
struct import_assistant;
-/* Choosing a file and reading it. */
-
+/* Choose a file */
static char *choose_file (GtkWindow *parent_window, gchar **encodingp);
+enum { MAX_PREVIEW_LINES = 1000 }; /* Max number of lines to read. */
+
+
+/*
+ Update IA according to the contents of DICT and CREADER.
+ CREADER will be destroyed by this function.
+*/
+void
+update_assistant (struct import_assistant *ia)
+{
+ struct sheet_spec_page *ssp = &ia->sheet_spec;
+
+ struct file *file = &ia->file;
+ struct separators_page *sepp = &ia->separators;
+ int col;
+ int rows = 0;
+ struct ccase *c;
+
+ sepp->column_cnt = dict_get_var_cnt (ssp->dict);
+ sepp->columns = xcalloc (sepp->column_cnt, sizeof (*sepp->columns));
+ for (col = 0; col < sepp->column_cnt ; ++col)
+ {
+ const struct variable *var = dict_get_var (ssp->dict, col);
+ sepp->columns[col].name = xstrdup (var_get_name (var));
+ sepp->columns[col].contents = NULL;
+ }
+
+ for (; (c = casereader_read (ssp->reader)) != NULL; case_unref (c))
+ {
+ rows++;
+ for (col = 0; col < sepp->column_cnt ; ++col)
+ {
+ char *ss;
+ const struct variable *var = dict_get_var (ssp->dict, col);
+
+ sepp->columns[col].contents = xrealloc (sepp->columns[col].contents,
+ sizeof (struct substring) * rows);
+
+ ss = data_out (case_data (c, var), dict_get_encoding (ssp->dict),
+ var_get_print_format (var));
+
+ sepp->columns[col].contents[rows - 1] = ss_cstr (ss);
+ }
+
+ if (rows > MAX_PREVIEW_LINES)
+ {
+ case_unref (c);
+ break;
+ }
+ }
+
+ file->line_cnt = rows;
+ casereader_destroy (ssp->reader);
+ ssp->reader = NULL;
+}
+
/* Obtains the file to import from the user and initializes IA's
file substructure. PARENT_WINDOW must be the window to use
bool
init_file (struct import_assistant *ia, GtkWindow *parent_window)
{
- enum { MAX_PREVIEW_LINES = 1000 }; /* Max number of lines to read. */
enum { MAX_LINE_LEN = 16384 }; /* Max length of an acceptable line. */
struct file *file = &ia->file;
- struct separators_page *sepp = &ia->separators;
struct casereader *creader = NULL;
struct dictionary *dict = NULL;
struct spreadsheet_read_info sri;
if (creader)
{
- int col;
- int rows = 0;
- struct ccase *c;
-
- sepp->column_cnt = dict_get_var_cnt (dict);
- sepp->columns = xcalloc (sepp->column_cnt, sizeof (*sepp->columns));
- for (col = 0; col < sepp->column_cnt ; ++col)
- {
- const struct variable *var = dict_get_var (dict, col);
- sepp->columns[col].name = xstrdup (var_get_name (var));
- sepp->columns[col].contents = NULL;
- }
-
- for (; (c = casereader_read (creader)) != NULL; case_unref (c))
- {
- rows++;
- for (col = 0; col < sepp->column_cnt ; ++col)
- {
- char *ss;
- const struct variable *var = dict_get_var (dict, col);
-
- sepp->columns[col].contents = xrealloc (sepp->columns[col].contents,
- sizeof (struct substring) * rows);
-
- ss = data_out (case_data (c, var), dict_get_encoding (dict),
- var_get_print_format (var));
-
- sepp->columns[col].contents[rows - 1] = ss_cstr (ss);
- }
-
- if (rows > MAX_PREVIEW_LINES)
- {
- case_unref (c);
- break;
- }
- }
+ struct sheet_spec_page *ssp = &ia->sheet_spec;
+ ssp->dict = dict;
+ ssp->reader = creader;
- file->line_cnt = rows;
- casereader_destroy (creader);
+ update_assistant (ia);
}
else
{
#include "data/data-out.h"
#include "data/format-guesser.h"
#include "data/value-labels.h"
+#include "data/gnumeric-reader.h"
+#include "data/ods-reader.h"
+#include "data/spreadsheet-reader.h"
#include "language/data-io/data-parser.h"
#include "language/lexer/lexer.h"
#include "libpspp/assertion.h"
void
reset_sheet_spec_page (struct import_assistant *ia)
{
+ printf ("%s\n", __FUNCTION__);
+}
+
+/* Called when the Forward button is clicked,
+ but before displaying the new page.
+*/
+void
+post_sheet_spec_page (struct import_assistant *ia)
+{
+ GtkBuilder *builder = ia->asst.builder;
+
+ struct file *file = &ia->file;
+ struct sheet_spec_page *ssp = &ia->sheet_spec;
+ struct casereader *creader;
+ struct dictionary *dict;
+
+ GtkWidget *sheet_entry = get_widget_assert (builder, "sheet-entry");
+
+ gint num = atoi (gtk_entry_get_text (sheet_entry));
+
+ printf ("%s sheet number %d\n", __FUNCTION__, num);
+
+ ssp->opts.sheet_name = NULL;
+ ssp->opts.cell_range = NULL;
+ ssp->opts.sheet_index = num;
+
+ ssp->sri.file_name = file->file_name;
+ ssp->sri.read_names = true;
+ ssp->sri.asw = -1;
+
+ switch (ia->file.type)
+ {
+ case FTYPE_ODS:
+ creader = ods_open_reader (&ssp->sri, &ssp->opts, &dict);
+ break;
+ case FTYPE_GNUMERIC:
+ creader = gnumeric_open_reader (&ssp->sri, &ssp->opts, &dict);
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+
+ ssp->dict = dict;
+ ssp->reader = creader;
+
+ update_assistant (ia);
}
}
break;
case FTYPE_GNUMERIC:
- {
- syntax_gen_pspp (&s,
- "GET DATA\n"
- " /TYPE=GNM\n"
- " /FILE=%sq\n",
- ia->file.file_name);
- }
- break;
-
case FTYPE_ODS:
{
+ const struct sheet_spec_page *ssp = &ia->sheet_spec;
+
syntax_gen_pspp (&s,
"GET DATA\n"
- " /TYPE=ODS\n"
- " /FILE=%sq\n",
- ia->file.file_name);
+ " /TYPE=%s\n"
+ " /FILE=%sq\n"
+ " /SHEET=index %d\n"
+ ".",
+ (ia->file.type == FTYPE_GNUMERIC) ? "GNM" : "ODS",
+ ia->file.file_name,
+ ssp->opts.sheet_index);
}
break;
-
-
+
default:
g_assert_not_reached ();
}
#include <glib-object.h>
#include "ui/gui/psppire-data-window.h"
+#include "data/spreadsheet-reader.h"
#include "libpspp/str.h"
struct sheet_spec_page
{
GtkWidget *page;
+ struct casereader *reader;
+ struct dictionary *dict;
+
+ struct spreadsheet_read_info sri;
+ struct spreadsheet_read_options opts;
};
gint column_idx);
+void update_assistant (struct import_assistant *ia);
+
+
bool init_file (struct import_assistant *ia, GtkWindow *parent_window);
void destroy_file (struct import_assistant *ia);
void init_sheet_spec_page (struct import_assistant *);
void reset_sheet_spec_page (struct import_assistant *);
+void post_sheet_spec_page (struct import_assistant *ia);
void init_first_line_page (struct import_assistant *ia);
void prepare_first_line_page (struct import_assistant *ia);
void reset_first_line_page (struct import_assistant *);
-void destroy_first_line_page (struct import_assistant *ia);
void init_separators_page (struct import_assistant *ia);
void prepare_separators_page (struct import_assistant *ia);
void reset_formats_page (struct import_assistant *);
void destroy_formats_page (struct import_assistant *ia);
-
void init_assistant (struct import_assistant *, GtkWindow *);
void destroy_assistant (struct import_assistant *);