Added a proper function to convert spreadsheet column refs
authorJohn Darrington <john@darrington.wattle.id.au>
Tue, 29 Jan 2013 18:26:23 +0000 (19:26 +0100)
committerJohn Darrington <john@darrington.wattle.id.au>
Sat, 16 Feb 2013 14:04:01 +0000 (15:04 +0100)
src/data/spreadsheet-reader.c
src/data/spreadsheet-reader.h
src/ui/gui/page-assistant.c
src/ui/gui/page-file.c
src/ui/gui/page-formats.c
src/ui/gui/page-sheet-spec.c
src/ui/gui/text-data-import-dialog.c

index 9bf694ec27d6b379a784e645ac87f30b85f22464..e34fcb38faa8045e216ffc99bc0c2e179b437f8f 100644 (file)
@@ -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 ;
 
index ead9185558a9c75d4aba3f2ff6aef01bbf1d20bb..9f84fa1abeb9eab212e9f6c7af13585c8191095a 100644 (file)
@@ -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,
index 59ece176f5cd5b3b702e5245bc83c4c367a4120c..7c54f40f803e0a43ccc211de2b802f093636a179 100644 (file)
@@ -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);
index b6100f369328ce56a287da2cd31922d08845c749..fdf6d6c912b61def31369cfe6f87b849ef4eb194 100644 (file)
@@ -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);
index 56339017c4752a33fc1b8278b601d9e417af50cd..b80699887f573c361e79518ec5cfa5e29f4f3e3f 100644 (file)
@@ -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];
index 5a760bd53d1822c24e1a661498feea20323d405e..501dc1b86b8e8629bad9a71ad884bf7810abdb2b 100644 (file)
@@ -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)
index ed7f8f4a4f44dd35c132e17d1d98cd01de10efa4..22425b96ab58c52c45c8defebee9baa38016d838 100644 (file)
@@ -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);