X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-data-store.c;h=732398511907686a8aa900dbe29e329bc1d6aea7;hb=da5dd1a396f05dbf068fe131d844316a6d6016f3;hp=047cca78113fddef9a70e1f53becabfc0cacb9fb;hpb=ff5e81803b409939e921211f1ffd46cb24df33e9;p=pspp diff --git a/src/ui/gui/psppire-data-store.c b/src/ui/gui/psppire-data-store.c index 047cca7811..7323985119 100644 --- a/src/ui/gui/psppire-data-store.c +++ b/src/ui/gui/psppire-data-store.c @@ -205,14 +205,48 @@ 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); } +struct resize_datum_aux + { + const struct dictionary *dict; + const struct variable *new_variable; + const struct variable *old_variable; + }; + +static void +resize_datum (const union value *old, union value *new, const void *aux_) +{ + const struct resize_datum_aux *aux = aux_; + int new_width = var_get_width (aux->new_variable); + 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)); + free (s); +} + static void -variable_changed_callback (GObject *obj, gint var_num, gpointer data) +variable_changed_callback (GObject *obj, gint var_num, guint what, const struct variable *oldvar, + gpointer data) { + PsppireDataStore *store = PSPPIRE_DATA_STORE (data); + struct variable *variable = psppire_dict_get_variable (store->dict, var_num); + + if (what & VAR_TRAIT_WIDTH) + { + int posn = var_get_case_index (variable); + struct resize_datum_aux aux; + aux.old_variable = oldvar; + aux.new_variable = variable; + aux.dict = store->dict->dict; + datasheet_resize_column (store->datasheet, posn, var_get_width (variable), + resize_datum, &aux); + } } static void @@ -231,55 +265,6 @@ insert_variable_callback (GObject *obj, gint var_num, gpointer data) psppire_data_store_insert_value (store, var_get_width (variable), posn); } -struct resize_datum_aux - { - int old_width; - int new_width; - }; - - -void -resize_datum (const union value *old, union value *new, void *aux_) -{ - struct resize_datum_aux *aux = aux_; - - if (aux->new_width == 0) - { - /* FIXME: try to parse string as number. */ - new->f = SYSMIS; - } - else if (aux->old_width == 0) - { - /* FIXME: format number as string. */ - value_set_missing (new, aux->new_width); - } - else - value_copy_rpad (new, aux->new_width, old, aux->old_width, ' '); -} - -static void -dict_size_change_callback (GObject *obj, - gint var_num, gint old_width, gpointer data) -{ - PsppireDataStore *store = PSPPIRE_DATA_STORE (data); - struct variable *variable; - int posn; - - variable = psppire_dict_get_variable (store->dict, var_num); - posn = var_get_case_index (variable); - - if (old_width != var_get_width (variable)) - { - struct resize_datum_aux aux; - aux.old_width = old_width; - aux.new_width = var_get_width (variable); - datasheet_resize_column (store->datasheet, posn, aux.new_width, - resize_datum, &aux); - } -} - - - /** * psppire_data_store_new: * @dict: The dictionary for this data_store. @@ -364,11 +349,6 @@ psppire_data_store_set_dictionary (PsppireDataStore *data_store, PsppireDict *di g_signal_connect (dict, "variable-changed", G_CALLBACK (variable_changed_callback), data_store); - - data_store->dict_handler_id [SIZE_CHANGED] = - g_signal_connect (dict, "dict-size-changed", - G_CALLBACK (dict_size_change_callback), - data_store); } @@ -452,6 +432,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))