From: John Darrington Date: Sat, 26 Jan 2013 17:35:05 +0000 (+0100) Subject: Basically working model X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c3b2f2e8406224a796f9f0f87048d9400c509265;p=pspp Basically working model --- diff --git a/src/data/gnumeric-reader.c b/src/data/gnumeric-reader.c index e6e917cf49..b4809c89ef 100644 --- a/src/data/gnumeric-reader.c +++ b/src/data/gnumeric-reader.c @@ -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: diff --git a/src/data/gnumeric-reader.h b/src/data/gnumeric-reader.h index b21ddfd558..c021d3899c 100644 --- a/src/data/gnumeric-reader.h +++ b/src/data/gnumeric-reader.h @@ -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); diff --git a/src/ui/gui/psppire-spreadsheet-model.c b/src/ui/gui/psppire-spreadsheet-model.c index 20a8a66e7e..2cd70be6fc 100644 --- a/src/ui/gui/psppire-spreadsheet-model.c +++ b/src/ui/gui/psppire-spreadsheet-model.c @@ -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 ; } diff --git a/src/ui/gui/sheet-test.c b/src/ui/gui/sheet-test.c index ab6a8c879f..d16cdda2b2 100644 --- a/src/ui/gui/sheet-test.c +++ b/src/ui/gui/sheet-test.c @@ -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);