Basically working model
authorJohn Darrington <john@darrington.wattle.id.au>
Sat, 26 Jan 2013 17:35:05 +0000 (18:35 +0100)
committerJohn Darrington <john@darrington.wattle.id.au>
Sat, 16 Feb 2013 14:03:41 +0000 (15:03 +0100)
src/data/gnumeric-reader.c
src/data/gnumeric-reader.h
src/ui/gui/psppire-spreadsheet-model.c
src/ui/gui/sheet-test.c

index e6e917cf493c9ac8325d89fb575a71c0a3e06f7a..b4809c89ef4b890e86bb76036a50f1dead10ad22 100644 (file)
@@ -100,7 +100,8 @@ struct gnumeric_reader
   int min_col;
   int node_type;
   int sheet_index;
-
+  
+  xmlChar **sheet_names;
 
   const xmlChar *target_sheet;
   int target_sheet_index;
@@ -116,12 +117,23 @@ struct gnumeric_reader
   bool used_first_case;
 };
 
+
+char *
+gnumeric_get_sheet_name (struct spreadsheet *s, int n)
+{
+  struct gnumeric_reader *gr = (struct gnumeric_reader *) s;
+  assert (n < s->sheets);
+
+  return gr->sheet_names[n];
+}
+
 static void process_node (struct gnumeric_reader *r);
 
 
 static void
 gnm_file_casereader_destroy (struct casereader *reader UNUSED, void *r_)
 {
+  int i;
   struct gnumeric_reader *r = r_;
   if ( r == NULL)
        return ;
@@ -134,6 +146,13 @@ gnm_file_casereader_destroy (struct casereader *reader UNUSED, void *r_)
 
   caseproto_unref (r->proto);
 
+  for (i = 0; i < r->spreadsheet.sheets; ++i)
+    {
+      xmlFree (r->sheet_names[i]);
+    }
+    
+  free (r->sheet_names);
+
   free (r);
 }
 
@@ -163,12 +182,17 @@ process_node (struct gnumeric_reader *r)
          XML_READER_TYPE_ELEMENT  == r->node_type)
        {
          r->spreadsheet.sheets++;
+         r->sheet_names = xrealloc (r->sheet_names, r->spreadsheet.sheets * sizeof *r->sheet_names);
        }
       else if (0 == xmlStrcasecmp (name, _xml("gnm:SheetNameIndex")) &&
          XML_READER_TYPE_END_ELEMENT  == r->node_type)
        {
          r->state = STATE_INIT;
        }
+      else if (XML_READER_TYPE_TEXT == r->node_type)
+       {
+         r->sheet_names [r->spreadsheet.sheets - 1] = xmlTextReaderValue (r->xtr);
+       }
       break;
 
     case STATE_INIT:
index b21ddfd558b001d4fdd0dee43fc4712f6d5255dc..c021d3899c3330ef26a376e8de6f2e63e0488000 100644 (file)
@@ -24,9 +24,11 @@ struct dictionary;
 struct spreadsheet_read_info;
 struct spreadsheet_read_options;
 
-
 struct spreadsheet *gnumeric_probe (const char *filename);
 
+char * gnumeric_get_sheet_name (struct spreadsheet *s, int n);
+
+
 struct casereader * gnumeric_make_reader (struct spreadsheet *spreadsheet,
                                          const struct spreadsheet_read_info *gri, 
                                          struct spreadsheet_read_options *opts);
index 20a8a66e7eb304333144eaee54f4d7d40ecdd8af..2cd70be6fc0e6065763f9fba0e72cc9831b3149d 100644 (file)
@@ -22,6 +22,8 @@
 
 #include "data/spreadsheet-reader.h"
 
+#include "data/gnumeric-reader.h"
+
 static void psppire_spreadsheet_model_init           (PsppireSpreadsheetModel *spreadsheetModel);
 static void psppire_spreadsheet_model_class_init     (PsppireSpreadsheetModelClass *class);
 
@@ -66,7 +68,6 @@ psppire_spreadsheet_model_get_type (void)
 
       g_type_add_interface_static (object_type, GTK_TYPE_TREE_MODEL,
                                   &tree_model_info);
-
     }
 
   return object_type;
@@ -166,14 +167,12 @@ static const gint N_COLS = 2;
 static gint 
 tree_model_n_columns (GtkTreeModel *model)
 {
-  g_print ("%s\n", __FUNCTION__);
   return N_COLS;
 }
 
 static GtkTreeModelFlags
 tree_model_get_flags (GtkTreeModel *model)
 {
-  g_print ("%s\n", __FUNCTION__);
   g_return_val_if_fail (PSPPIRE_IS_SPREADSHEET_MODEL (model), (GtkTreeModelFlags) 0);
 
   return GTK_TREE_MODEL_LIST_ONLY;
@@ -182,7 +181,6 @@ tree_model_get_flags (GtkTreeModel *model)
 static GType
 tree_model_column_type (GtkTreeModel *model, gint index)
 {
-  g_print ("%s %d\n", __FUNCTION__, index);
   g_return_val_if_fail (PSPPIRE_IS_SPREADSHEET_MODEL (model), (GType) 0);
   g_return_val_if_fail (index < N_COLS, (GType) 0);
  
@@ -193,22 +191,22 @@ tree_model_column_type (GtkTreeModel *model, gint index)
 static gboolean
 tree_model_get_iter (GtkTreeModel *model, GtkTreeIter *iter, GtkTreePath *path)
 {
-  gint *indices, depth;
-
   PsppireSpreadsheetModel *spreadsheetModel = PSPPIRE_SPREADSHEET_MODEL (model);
+  gint *indices, depth;
+  gint n;
 
   g_return_val_if_fail (path, FALSE);
 
-  indices = gtk_tree_path_get_indices (path);
-
   depth = gtk_tree_path_get_depth (path);
 
   g_return_val_if_fail (depth == 1, FALSE);
 
-  g_print ("%s %d\n", __FUNCTION__, *indices);
+  indices = gtk_tree_path_get_indices (path);
+
+  n = indices [0];
 
   iter->stamp = spreadsheetModel->stamp;
-  iter->user_data = *indices; // kludge
+  iter->user_data = (gpointer) n;
 
   return TRUE;
 }
@@ -219,11 +217,16 @@ tree_model_iter_next (GtkTreeModel *model, GtkTreeIter *iter)
   PsppireSpreadsheetModel *spreadsheetModel = PSPPIRE_SPREADSHEET_MODEL (model);
   g_return_val_if_fail (iter->stamp == spreadsheetModel->stamp, FALSE);
 
-  g_print ("%s %d\n", __FUNCTION__, iter->user_data);
-
-  if ( iter->user_data >= spreadsheetModel->spreadsheet->sheets - 1)
+  if ( iter == NULL)
     return FALSE;
 
+  if ( (gint) iter->user_data >= spreadsheetModel->spreadsheet->sheets - 1)
+    {
+      iter->user_data = NULL;
+      iter->stamp = 0;
+      return FALSE;
+    }
+
   iter->user_data++;
 
   return TRUE;
@@ -237,16 +240,25 @@ tree_model_get_value (GtkTreeModel *model, GtkTreeIter *iter,
   PsppireSpreadsheetModel *spreadsheetModel = PSPPIRE_SPREADSHEET_MODEL (model);
   g_return_if_fail (column < N_COLS);
   g_return_if_fail (iter->stamp == spreadsheetModel->stamp);
-  g_print ("%s col %d\n", __FUNCTION__, column);
 
   g_value_init (value, G_TYPE_STRING);
-  if ( column > 0)
-    g_value_set_string (value, "foo");
-  else
-    g_value_set_string (value, "bar");
+  switch (column)
+    {
+    case 0:
+      {
+       char *x = gnumeric_get_sheet_name (spreadsheetModel->spreadsheet, (gint) iter->user_data);
+       g_value_set_string (value, x);
+      }
+      break;
+    case 1:
+      g_value_set_string (value, "bar");
+      break;
+    default:
+      g_critical ("Bad column");
+      break;
+  }
 }
 
-
 static gboolean
 tree_model_nth_child (GtkTreeModel *model, GtkTreeIter *iter,
                      GtkTreeIter *parent, gint n)
@@ -260,10 +272,47 @@ tree_model_nth_child (GtkTreeModel *model, GtkTreeIter *iter,
     return FALSE;
 
   iter->stamp = spreadsheetModel->stamp;
+  iter->user_data = (gpointer) n;
 
   return TRUE;
 }
 
+static gint
+tree_model_n_children (GtkTreeModel *model,
+                      GtkTreeIter  *iter)
+{
+  PsppireSpreadsheetModel *spreadsheetModel = PSPPIRE_SPREADSHEET_MODEL (model);
+
+  if ( iter == NULL )
+      return spreadsheetModel->spreadsheet->sheets;
+
+  return 0;
+}
+
+static gboolean
+tree_model_iter_has_child  (GtkTreeModel *tree_model,
+                           GtkTreeIter  *iter)
+{
+  return FALSE;
+}
+
+static GtkTreePath *
+tree_model_get_path (GtkTreeModel *model, GtkTreeIter *iter)
+{
+  PsppireSpreadsheetModel *spreadsheetModel = PSPPIRE_SPREADSHEET_MODEL (model);
+  GtkTreePath *path;
+  gint index = (gint) iter->user_data;
+
+  g_return_val_if_fail (iter->stamp == spreadsheetModel->stamp, NULL);
+
+  path = gtk_tree_path_new ();
+
+  gtk_tree_path_append_index (path, index);
+
+  return path;
+}
+
+
 
 static void
 spreadsheet_tree_model_init (GtkTreeModelIface *iface)
@@ -273,17 +322,13 @@ spreadsheet_tree_model_init (GtkTreeModelIface *iface)
   iface->get_column_type = tree_model_column_type;
   iface->get_iter = tree_model_get_iter;
   iface->iter_next = tree_model_iter_next;
-
   iface->get_value = tree_model_get_value;
 
-#if 0
+  iface->iter_children = NULL;
+  iface->iter_parent = NULL;
+
   iface->get_path = tree_model_get_path;
-  iface->iter_children = tree_model_iter_children ;
   iface->iter_has_child = tree_model_iter_has_child ;
   iface->iter_n_children = tree_model_n_children ;
-
-  iface->iter_parent = tree_model_iter_parent ;
-#endif
-
   iface->iter_nth_child = tree_model_nth_child ;
 }
index ab6a8c879f64397233dbb82fd2510bfa83a2dcea..d16cdda2b2ee8386280f88c24cc013ea14846550 100644 (file)
@@ -33,14 +33,18 @@ int
 main (int argc, char *argv[] )
 {
   GtkWidget *window;
+  GtkWidget *hbox;
+  GtkWidget *vbox;
   GtkWidget *treeview;
+  GtkWidget *combo_box;
   GtkTreeModel *tm;
+  struct spreadsheet *sp = NULL;
   gtk_init (&argc, &argv);
     
   if ( argc < 2)
     g_error ("Usage: prog file\n");
 
-  struct spreadsheet *sp = gnumeric_probe (argv[1]);
+  sp = gnumeric_probe (argv[1]);
   
   if (sp == NULL)
     {
@@ -48,12 +52,30 @@ main (int argc, char *argv[] )
       return 0;
     }
 
+
+
   tm = psppire_spreadsheet_model_new (sp);
   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+  hbox = gtk_hbox_new (FALSE, 5);
+  vbox = gtk_vbox_new (FALSE, 5);
     
   gtk_container_set_border_width (GTK_CONTAINER (window), 10);
-
   
+  //  tm = GTK_TREE_MODEL (make_store ());
+  combo_box = gtk_combo_box_new_with_model (tm);
+
+  {
+    GtkCellRenderer *renderer = gtk_cell_renderer_text_new ();
+    gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo_box), renderer, TRUE);
+    gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo_box), renderer,
+                                   "text", 0,
+                                   NULL);
+  }
+
+
+
+  gtk_combo_box_set_active (combo_box, 0);
+
   treeview = gtk_tree_view_new_with_model (tm);
 
   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
@@ -69,7 +91,13 @@ main (int argc, char *argv[] )
                                               "text", 1,
                                               NULL);
 
-  gtk_container_add (GTK_CONTAINER (window), treeview);
+
+  gtk_box_pack_start (GTK_BOX (hbox), treeview, TRUE, TRUE, 5);
+
+  gtk_box_pack_start (GTK_BOX (vbox), combo_box, FALSE, FALSE, 5);
+  gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 5);
+
+  gtk_container_add (GTK_CONTAINER (window), hbox);
 
   gtk_widget_show_all (window);