X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-data-store.c;h=1441afa56a1cee57b645aa2c233d3c37ea77525b;hb=aa6f8e301fab021ba2fea720a162e506612ba29f;hp=fbeb737cf3821113daa51af173222b33ef7f9293;hpb=b2b2b0a29f80de89d96bcceea90f117930ab47b9;p=pspp diff --git a/src/ui/gui/psppire-data-store.c b/src/ui/gui/psppire-data-store.c index fbeb737cf3..1441afa56a 100644 --- a/src/ui/gui/psppire-data-store.c +++ b/src/ui/gui/psppire-data-store.c @@ -1,5 +1,5 @@ /* PSPPIRE - a graphical user interface for PSPP. - Copyright (C) 2006, 2008, 2009, 2010, 2011, 2012 Free Software Foundation + Copyright (C) 2006, 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation 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 @@ -76,6 +76,90 @@ enum static guint signals [n_SIGNALS]; +static gint +__tree_model_iter_n_children (GtkTreeModel *tree_model, + GtkTreeIter *iter) +{ + PsppireDataStore *store = PSPPIRE_DATA_STORE (tree_model); + + gint n = datasheet_get_n_rows (store->datasheet); + + return n; +} + + +static gint +__tree_model_get_n_columns (GtkTreeModel *tree_model) +{ + PsppireDataStore *store = PSPPIRE_DATA_STORE (tree_model); + + return psppire_dict_get_value_cnt (store->dict); +} + + +static gboolean +__iter_nth_child (GtkTreeModel *tree_model, + GtkTreeIter *iter, + GtkTreeIter *parent, + gint n) +{ + PsppireDataStore *store = PSPPIRE_DATA_STORE (tree_model); + + g_assert (parent == NULL); + + g_return_val_if_fail (store, FALSE); + g_return_val_if_fail (store->datasheet, FALSE); + + if (n >= datasheet_get_n_rows (store->datasheet)) + { + iter->stamp = -1; + iter->user_data = NULL; + return FALSE; + } + + iter->user_data = n; + return TRUE; +} + + + +static void +__get_value (GtkTreeModel *tree_model, + GtkTreeIter *iter, + gint column, + GValue *value) +{ + PsppireDataStore *store = PSPPIRE_DATA_STORE (tree_model); + + g_value_init (value, G_TYPE_DOUBLE); + + gint row = GPOINTER_TO_INT (iter->user_data); + + struct ccase *cc = datasheet_get_row (store->datasheet, row); + + g_value_set_double (value, case_data_idx (cc, column)->f); + case_unref (cc); +} + + +static void +__tree_model_init (GtkTreeModelIface *iface) +{ + iface->get_flags = NULL; + iface->get_n_columns = __tree_model_get_n_columns ; + iface->get_column_type = NULL; + iface->get_iter = NULL; + iface->iter_next = NULL; + iface->get_path = NULL; + iface->get_value = __get_value; + + iface->iter_children = NULL; + iface->iter_has_child = NULL; + iface->iter_n_children = __tree_model_iter_n_children; + iface->iter_nth_child = __iter_nth_child; + iface->iter_parent = NULL; +} + GType psppire_data_store_get_type (void) @@ -97,9 +181,18 @@ psppire_data_store_get_type (void) (GInstanceInitFunc) psppire_data_store_init, }; + static const GInterfaceInfo tree_model_info = { + (GInterfaceInitFunc) __tree_model_init, + NULL, + NULL + }; + data_store_type = g_type_register_static (G_TYPE_OBJECT, "PsppireDataStore", &data_store_info, 0); + + g_type_add_interface_static (data_store_type, GTK_TYPE_TREE_MODEL, + &tree_model_info); } return data_store_type; @@ -205,6 +298,7 @@ delete_variable_callback (GObject *obj, const struct variable *var UNUSED, { PsppireDataStore *store = PSPPIRE_DATA_STORE (data); + g_return_if_fail (store->datasheet); datasheet_delete_columns (store->datasheet, case_index, 1); datasheet_insert_column (store->datasheet, NULL, -1, case_index); @@ -225,7 +319,10 @@ resize_datum (const union value *old, union value *new, const void *aux_) const char *enc = dict_get_encoding (aux->dict); const struct fmt_spec *newfmt = var_get_print_format (aux->new_variable); char *s = data_out (old, enc, var_get_print_format (aux->old_variable)); - free (data_in (ss_cstr (s), enc, newfmt->type, new, new_width, enc)); + enum fmt_type type = (fmt_usable_for_input (newfmt->type) + ? newfmt->type + : FMT_DOLLAR); + free (data_in (ss_cstr (s), enc, type, new, new_width, enc)); free (s); } @@ -294,6 +391,9 @@ psppire_data_store_set_reader (PsppireDataStore *ds, ds->datasheet = datasheet_create (reader); + g_signal_emit_by_name (ds, "notify", 0, 0); + g_print ("Datasheet row count %d\n", datasheet_get_n_rows (ds->datasheet)); + if ( ds->dict ) for (i = 0 ; i < n_dict_signals; ++i ) { @@ -389,6 +489,7 @@ psppire_data_store_dispose (GObject *object) if (ds->dispose_has_run) return; + psppire_data_store_set_dictionary (ds, NULL); /* must chain up */ (* parent_class->dispose) (object); @@ -431,6 +532,7 @@ psppire_data_store_get_string (PsppireDataStore *store, int width; g_return_val_if_fail (store != NULL, NULL); + g_return_val_if_fail (store->datasheet != NULL, NULL); g_return_val_if_fail (var != NULL, NULL); if (row < 0 || row >= datasheet_get_n_rows (store->datasheet))