From: John Darrington Date: Tue, 29 Jan 2013 18:26:23 +0000 (+0100) Subject: Added a proper function to convert spreadsheet column refs X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1d05dd7fce36ca16a644705b0b05fd144f52463e;p=pspp Added a proper function to convert spreadsheet column refs --- diff --git a/src/data/spreadsheet-reader.c b/src/data/spreadsheet-reader.c index 9bf694ec27..e34fcb38fa 100644 --- a/src/data/spreadsheet-reader.c +++ b/src/data/spreadsheet-reader.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 2007, 2009, 2010, 2011 Free Software Foundation, Inc. + Copyright (C) 2007, 2009, 2010, 2011, 2013 Free Software Foundation, Inc. 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 @@ -38,6 +38,19 @@ spreadsheet_close (struct spreadsheet *spreadsheet) { } +#define RADIX 26 + +static void +reverse (char *s, int len) +{ + int i; + for (i = 0; i < len / 2; ++i) + { + char tmp = s[len - i - 1]; + s[len - i -1] = s[i]; + s[i] = tmp; + } +} /* Convert a string, which is an integer encoded in base26 @@ -48,37 +61,80 @@ spreadsheet_close (struct spreadsheet *spreadsheet) ABC = 2 + 2*26 + 1*26^2 .... */ int -pseudo_base26 (const char *str) +ps26_to_int (const char *str) { int i; int multiplier = 1; int result = 0; int len = strlen (str); - for ( i = len - 1 ; i >= 0; --i) + for (i = len - 1 ; i >= 0; --i) { int mantissa = (str[i] - 'A'); - if ( mantissa < 0 || mantissa > 25 ) - return -1; + assert (mantissa >= 0); + assert (mantissa < RADIX); - if ( i != len - 1) + if (i != len - 1) mantissa++; result += mantissa * multiplier; - - multiplier *= 26; + multiplier *= RADIX; } return result; } +char * +int_to_ps26 (int i) +{ + char *ret = NULL; + + int lower = 0; + long long int base = RADIX; + int exp = 1; + + assert (i >= 0); + + while (i > lower + base - 1) + { + lower += base; + base *= RADIX; + assert (base > 0); + exp++; + } + + i -= lower; + i += base; + + ret = malloc (exp); + + exp = 0; + do + { + ret[exp++] = (i % RADIX) + 'A'; + i /= RADIX; + } + while (i > 1); + + ret[exp]='\0'; + + reverse (ret, exp); + return ret; +} + char * create_cell_ref (int col0, int row0, int coli, int rowi) { - return c_xasprintf ("%c%d:%c%ld", - col0 + 'A', row0 + 1, - coli + 'A', rowi + 1); + char *cs0 = int_to_ps26 (col0); + char *csi = int_to_ps26 (coli); + char *s = c_xasprintf ("%s%d:%s%ld", + cs0, row0 + 1, + csi, rowi + 1); + free (cs0); + free (csi); + + return s; } @@ -104,9 +160,9 @@ convert_cell_ref (const char *ref, return false; str_uppercase (startcol); - *col0 = pseudo_base26 (startcol); + *col0 = ps26_to_int (startcol); str_uppercase (stopcol); - *coli = pseudo_base26 (stopcol); + *coli = ps26_to_int (stopcol); *row0 = startrow - 1; *rowi = stoprow - 1 ; diff --git a/src/data/spreadsheet-reader.h b/src/data/spreadsheet-reader.h index ead9185558..9f84fa1abe 100644 --- a/src/data/spreadsheet-reader.h +++ b/src/data/spreadsheet-reader.h @@ -40,7 +40,8 @@ struct spreadsheet_read_info int asw ; /* The width of string variables in the created dictionary */ }; -int pseudo_base26 (const char *str); +int ps26_to_int (const char *str); +char * int_to_ps26 (int); bool convert_cell_ref (const char *ref, int *col0, int *row0, diff --git a/src/ui/gui/page-assistant.c b/src/ui/gui/page-assistant.c index 59ece176f5..7c54f40f80 100644 --- a/src/ui/gui/page-assistant.c +++ b/src/ui/gui/page-assistant.c @@ -78,11 +78,6 @@ init_assistant (GtkWindow *parent_window) a->builder = builder_new ("text-data-import.ui"); a->assistant = GTK_ASSISTANT (gtk_assistant_new ()); - ia->sheet_spec = sheet_spec_page_create (ia); - ia->intro = intro_page_create (ia); - ia->separators = separators_page_create (ia); - - a->prop_renderer = gtk_cell_renderer_text_new (); g_object_ref_sink (a->prop_renderer); a->fixed_renderer = gtk_cell_renderer_text_new (); @@ -91,10 +86,6 @@ init_assistant (GtkWindow *parent_window) "family", "Monospace", (void *) NULL); - ia->first_line = first_line_page_create (ia); - - ia->formats = formats_page_create (ia); - g_signal_connect (a->assistant, "prepare", G_CALLBACK (on_prepare), ia); g_signal_connect (a->assistant, "cancel", G_CALLBACK (on_cancel), ia); g_signal_connect (a->assistant, "close", G_CALLBACK (on_close), ia); @@ -109,6 +100,7 @@ init_assistant (GtkWindow *parent_window) gtk_window_set_transient_for (GTK_WINDOW (a->assistant), parent_window); gtk_window_set_icon_name (GTK_WINDOW (a->assistant), "pspp"); + return ia; } @@ -166,10 +158,17 @@ on_prepare (GtkAssistant *assistant, GtkWidget *page, int pn = gtk_assistant_get_current_page (assistant); g_print ("%s:%d Page %d %p\n", __FILE__, __LINE__, pn, page); - if (pn == 0) - prepare_sheet_spec_page (ia); + if ( ia->spreadsheet) + { + if (pn == 0) + prepare_sheet_spec_page (ia); + else if (pn == 1) + { + post_sheet_spec_page (ia); + prepare_formats_page (ia); + } + } -#if 0 if (gtk_assistant_get_page_type (assistant, page) == GTK_ASSISTANT_PAGE_CONFIRM) gtk_widget_grab_focus (assistant->apply); @@ -177,16 +176,15 @@ on_prepare (GtkAssistant *assistant, GtkWidget *page, gtk_widget_grab_focus (assistant->forward); + +#if 0 /* Prepare .... */ if (page == ia->separators->page) prepare_separators_page (ia); else if (page == ia->formats->page) prepare_formats_page (ia); - else if (page == ia->sheet_spec->page && ssp->spreadsheet) - { - prepare_sheet_spec_page (ia); - } - + + gtk_widget_show (ia->asst.reset_button); if (page == ia->formats->page) gtk_widget_show (ia->asst.paste_button); diff --git a/src/ui/gui/page-file.c b/src/ui/gui/page-file.c index b6100f3693..fdf6d6c912 100644 --- a/src/ui/gui/page-file.c +++ b/src/ui/gui/page-file.c @@ -100,12 +100,12 @@ init_file (struct import_assistant *ia, GtkWindow *parent_window) if (ia->spreadsheet == NULL) ia->spreadsheet = gnumeric_probe (file->file_name); - printf ("%s:%d %p\n", __FILE__, __LINE__, ia->spreadsheet); - if (ia->spreadsheet == NULL) ia->spreadsheet = ods_probe (file->file_name); - if (! ia->spreadsheet) + printf ("%s:%d %p\n", __FILE__, __LINE__, ia->spreadsheet); + + if (ia->spreadsheet == NULL) { struct string input; struct line_reader *reader = line_reader_for_file (file->encoding, file->file_name, O_RDONLY); diff --git a/src/ui/gui/page-formats.c b/src/ui/gui/page-formats.c index 56339017c4..b80699887f 100644 --- a/src/ui/gui/page-formats.c +++ b/src/ui/gui/page-formats.c @@ -82,10 +82,9 @@ formats_page_create (struct import_assistant *ia) GtkBuilder *builder = ia->asst.builder; struct formats_page *p = xzalloc (sizeof *p); -#if 0 p->page = add_page_to_assistant (ia, get_widget_assert (builder, "Formats"), - GTK_ASSISTANT_PAGE_CONFIRM); -#endif + GTK_ASSISTANT_PAGE_CONFIRM); + p->data_tree_view = GTK_TREE_VIEW (get_widget_assert (builder, "data")); p->modified_vars = NULL; p->modified_var_cnt = 0; @@ -130,10 +129,8 @@ prepare_formats_page (struct import_assistant *ia) fg = fmt_guesser_create (); for (column_idx = 0; column_idx < ia->column_cnt; column_idx++) { - struct variable *modified_var; - - modified_var = (column_idx < p->modified_var_cnt - ? p->modified_vars[column_idx] : NULL); + struct variable *modified_var = + (column_idx < p->modified_var_cnt ? p->modified_vars[column_idx] : NULL); if (modified_var == NULL) { struct column *column = &ia->columns[column_idx]; diff --git a/src/ui/gui/page-sheet-spec.c b/src/ui/gui/page-sheet-spec.c index 5a760bd53d..501dc1b86b 100644 --- a/src/ui/gui/page-sheet-spec.c +++ b/src/ui/gui/page-sheet-spec.c @@ -111,6 +111,9 @@ sheet_spec_page_create (struct import_assistant *ia) g_signal_connect (combo_box, "changed", G_CALLBACK (on_sheet_combo_changed), ia); + add_page_to_assistant (ia, get_widget_assert (builder, "Sheet"), + GTK_ASSISTANT_PAGE_INTRO); + return p; } @@ -158,17 +161,19 @@ post_sheet_spec_page (struct import_assistant *ia) const gchar *range = gtk_entry_get_text (GTK_ENTRY (range_entry)); - gint num = 0; - if ( num < 1 ) - num = 1; + gint num = 1; ssp->opts.sheet_name = NULL; ssp->opts.cell_range = NULL; ssp->opts.sheet_index = num; + printf ("%s:%d Range is %s\n", __FILE__, __LINE__, range); + printf ("%s:%d Sheet Number is %d\n", __FILE__, __LINE__, num); + if ( convert_cell_ref (range, &col_start, &row_start, &col_stop, &row_stop)) { ssp->opts.cell_range = range; + printf ("%s:%d Range is valid\n", __FILE__, __LINE__); } ssp->sri.read_names = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (readnames_checkbox)); @@ -178,14 +183,17 @@ post_sheet_spec_page (struct import_assistant *ia) { case SPREADSHEET_ODS: { + printf ("%s:%d\n", __FILE__, __LINE__); creader = ods_make_reader (ia->spreadsheet, &ssp->sri, &ssp->opts); dict = ia->spreadsheet->dict; } break; case SPREADSHEET_GNUMERIC: { + printf ("%s:%d\n",__FILE__, __LINE__); creader = gnumeric_make_reader (ia->spreadsheet, &ssp->sri, &ssp->opts); dict = ia->spreadsheet->dict; + printf ("%s:%d Reader %p Dict %p\n",__FILE__, __LINE__, creader, dict); } break; default: @@ -224,11 +232,13 @@ update_assistant (struct import_assistant *ia) struct sheet_spec_page *ssp = ia->sheet_spec; int rows = 0; + printf ("%s:%d\n"); if (ssp->dict) { struct ccase *c; int col; + printf ("%s:%d\n"); ia->column_cnt = dict_get_var_cnt (ssp->dict); ia->columns = xcalloc (ia->column_cnt, sizeof (*ia->columns)); for (col = 0; col < ia->column_cnt ; ++col) diff --git a/src/ui/gui/text-data-import-dialog.c b/src/ui/gui/text-data-import-dialog.c index ed7f8f4a4f..22425b96ab 100644 --- a/src/ui/gui/text-data-import-dialog.c +++ b/src/ui/gui/text-data-import-dialog.c @@ -83,12 +83,17 @@ text_data_import_assistant (PsppireDataWindow *dw) ssp = ia->sheet_spec; - add_page_to_assistant (ia, get_widget_assert (builder, "Sheet"), - GTK_ASSISTANT_PAGE_INTRO); - - add_page_to_assistant (ia, get_widget_assert (builder, "Formats"), - GTK_ASSISTANT_PAGE_CONFIRM); - + 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); + } + ia->formats = formats_page_create (ia); gtk_widget_show_all (GTK_WIDGET (ia->asst.assistant)); @@ -108,8 +113,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);