X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-var-store.c;h=64fbfa7dcd3589becf7badc828372b945d964a4e;hb=4f2f805c653f0dc901924944ea4c55309ff14d32;hp=4cdc295886009a7961b2832daf7f2d02ee12a338;hpb=b64685d06f8db1aff292ec409abe25f8a483d775;p=pspp diff --git a/src/ui/gui/psppire-var-store.c b/src/ui/gui/psppire-var-store.c index 4cdc295886..64fbfa7dcd 100644 --- a/src/ui/gui/psppire-var-store.c +++ b/src/ui/gui/psppire-var-store.c @@ -2,7 +2,6 @@ PSPPIRE --- A Graphical User Interface for PSPP Copyright (C) 2006 Free Software Foundation - Written by John Darrington 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 @@ -32,7 +31,6 @@ #include -#include "psppire-variable.h" #include "psppire-var-store.h" #include "var-sheet.h" #include "helper.h" @@ -46,13 +44,14 @@ #include +#define TRAILING_ROWS 40 static void psppire_var_store_init (PsppireVarStore *var_store); static void psppire_var_store_class_init (PsppireVarStoreClass *class); static void psppire_var_store_sheet_model_init (GSheetModelIface *iface); static void psppire_var_store_finalize (GObject *object); -static gchar *psppire_var_store_get_string(GSheetModel *sheet_model, gint row, gint column); +static gchar *psppire_var_store_get_string(const GSheetModel *sheet_model, gint row, gint column); static gboolean psppire_var_store_clear(GSheetModel *model, gint row, gint col); @@ -60,8 +59,13 @@ static gboolean psppire_var_store_clear(GSheetModel *model, gint row, gint col static gboolean psppire_var_store_set_string(GSheetModel *model, const gchar *text, gint row, gint column); +static gint psppire_var_store_get_row_count(const GSheetModel * model); + +static gchar *text_for_column(const struct variable *pv, gint c, GError **err); + + +static void psppire_var_store_sheet_row_init (GSheetRowIface *iface); -static gchar *text_for_column(const struct PsppireVariable *pv, gint c, GError **err); static GObjectClass *parent_class = NULL; @@ -93,12 +97,24 @@ psppire_var_store_get_type (void) NULL }; - var_store_type = g_type_register_static (G_TYPE_OBJECT, "PsppireVarStore", - &var_store_info, 0); + static const GInterfaceInfo sheet_row_info = + { + (GInterfaceInitFunc) psppire_var_store_sheet_row_init, + NULL, + NULL + }; + + var_store_type = g_type_register_static (G_TYPE_OBJECT, "PsppireVarStore", &var_store_info, 0); g_type_add_interface_static (var_store_type, G_TYPE_SHEET_MODEL, &sheet_model_info); + + g_type_add_interface_static (var_store_type, + G_TYPE_SHEET_ROW, + &sheet_row_info); + + } return var_store_type; @@ -133,15 +149,15 @@ psppire_var_store_item_editable(PsppireVarStore *var_store, gint row, gint colum { const struct fmt_spec *write_spec ; - struct PsppireVariable *pv = psppire_var_store_get_variable(var_store, row); + struct variable *pv = psppire_var_store_get_var (var_store, row); if ( !pv ) return TRUE; - if ( ALPHA == psppire_variable_get_type(pv) && column == COL_DECIMALS ) + if ( VAR_STRING == var_get_type (pv) && column == COL_DECIMALS ) return FALSE; - write_spec = psppire_variable_get_write_spec(pv); + write_spec =var_get_write_format (pv); switch ( write_spec->type ) { @@ -168,8 +184,15 @@ psppire_var_store_item_editable(PsppireVarStore *var_store, gint row, gint colum return TRUE; } + +struct variable * +psppire_var_store_get_var (PsppireVarStore *store, gint row) +{ + return psppire_dict_get_variable (store->dict, row); +} + static gboolean -psppire_var_store_is_editable(GSheetModel *model, gint row, gint column) +psppire_var_store_is_editable(const GSheetModel *model, gint row, gint column) { PsppireVarStore *store = PSPPIRE_VAR_STORE(model); return psppire_var_store_item_editable(store, row, column); @@ -177,7 +200,7 @@ psppire_var_store_is_editable(GSheetModel *model, gint row, gint column) static const GdkColor * -psppire_var_store_get_foreground(GSheetModel *model, gint row, gint column) +psppire_var_store_get_foreground(const GSheetModel *model, gint row, gint column) { PsppireVarStore *store = PSPPIRE_VAR_STORE(model); @@ -189,7 +212,7 @@ psppire_var_store_get_foreground(GSheetModel *model, gint row, gint column) const PangoFontDescription * -psppire_var_store_get_font_desc(GSheetModel *model, +psppire_var_store_get_font_desc(const GSheetModel *model, gint row, gint column) { PsppireVarStore *store = PSPPIRE_VAR_STORE(model); @@ -202,6 +225,7 @@ psppire_var_store_get_font_desc(GSheetModel *model, static void psppire_var_store_sheet_model_init (GSheetModelIface *iface) { + iface->get_row_count = psppire_var_store_get_row_count; iface->free_strings = TRUE; iface->get_string = psppire_var_store_get_string; iface->set_string = psppire_var_store_set_string; @@ -301,33 +325,21 @@ psppire_var_store_finalize (GObject *object) } static gchar * -psppire_var_store_get_string(GSheetModel *model, gint row, gint column) +psppire_var_store_get_string(const GSheetModel *model, gint row, gint column) { PsppireVarStore *store = PSPPIRE_VAR_STORE(model); - struct PsppireVariable *pv; + struct variable *pv; if ( row >= psppire_dict_get_var_cnt(store->dict)) return 0; pv = psppire_dict_get_variable (store->dict, row); - return text_for_column(pv, column, 0); + return text_for_column (pv, column, 0); } -struct PsppireVariable * -psppire_var_store_get_variable(PsppireVarStore *store, gint row) -{ - g_return_val_if_fail(store, NULL); - g_return_val_if_fail(store->dict, NULL); - - if ( row >= psppire_dict_get_var_cnt(store->dict)) - return 0; - - return psppire_dict_get_variable (store->dict, row); -} - /* Clears that part of the variable store, if possible, which corresponds to ROW, COL. Returns true if anything was updated, false otherwise. @@ -335,14 +347,14 @@ psppire_var_store_get_variable(PsppireVarStore *store, gint row) static gboolean psppire_var_store_clear(GSheetModel *model, gint row, gint col) { - struct PsppireVariable *pv ; + struct variable *pv ; PsppireVarStore *var_store = PSPPIRE_VAR_STORE(model); - if ( row >= psppire_dict_get_var_cnt(var_store->dict)) + if ( row >= psppire_dict_get_var_cnt (var_store->dict)) return FALSE; - pv = psppire_var_store_get_variable(var_store, row); + pv = psppire_var_store_get_var (var_store, row); if ( !pv ) return FALSE; @@ -350,7 +362,7 @@ psppire_var_store_clear(GSheetModel *model, gint row, gint col) switch (col) { case COL_LABEL: - psppire_variable_set_label(pv, 0); + var_set_label (pv, 0); return TRUE; break; } @@ -366,36 +378,73 @@ static gboolean psppire_var_store_set_string(GSheetModel *model, const gchar *text, gint row, gint col) { - struct PsppireVariable *pv ; + struct variable *pv ; PsppireVarStore *var_store = PSPPIRE_VAR_STORE(model); if ( row >= psppire_dict_get_var_cnt(var_store->dict)) return FALSE; - pv = psppire_var_store_get_variable(var_store, row); + pv = psppire_var_store_get_var (var_store, row); + if ( !pv ) return FALSE; switch (col) { case COL_NAME: - return psppire_variable_set_name(pv, text); + psppire_dict_rename_var (var_store->dict, pv, text); + return TRUE; break; case COL_COLUMNS: if ( ! text) return FALSE; - return psppire_variable_set_columns(pv, atoi(text)); + var_set_display_width (pv, atoi(text)); + return TRUE; break; case COL_WIDTH: - if ( ! text) return FALSE; - return psppire_variable_set_width(pv, atoi(text)); + { + int width = atoi (text); + if ( ! text) return FALSE; + if ( var_is_alpha (pv)) + var_set_width (pv, width); + else + { + struct fmt_spec fmt ; + fmt = *var_get_write_format (pv); + if ( width < fmt_min_output_width (fmt.type) + || + width > fmt_max_output_width (fmt.type)) + return FALSE; + + fmt.w = width; + fmt.d = MIN (fmt_max_output_decimals (fmt.type, width), fmt.d); + + var_set_both_formats (pv, &fmt); + } + + return TRUE; + } break; case COL_DECIMALS: - if ( ! text) return FALSE; - return psppire_variable_set_decimals(pv, atoi(text)); + { + int decimals; + struct fmt_spec fmt; + if ( ! text) return FALSE; + decimals = atoi (text); + fmt = *var_get_write_format (pv); + if ( decimals > + fmt_max_output_decimals (fmt.type, + fmt.w + )) + return FALSE; + + fmt.d = decimals; + var_set_both_formats (pv, &fmt); + return TRUE; + } break; case COL_LABEL: - psppire_variable_set_label(pv, text); + var_set_label(pv, text); return TRUE; break; case COL_TYPE: @@ -416,7 +465,7 @@ psppire_var_store_set_string(GSheetModel *model, static gchar * -text_for_column(const struct PsppireVariable *pv, gint c, GError **err) +text_for_column(const struct variable *pv, gint c, GError **err) { static gchar none[] = N_("None"); @@ -434,12 +483,12 @@ text_for_column(const struct PsppireVariable *pv, gint c, GError **err) enum {VT_NUMERIC, VT_COMMA, VT_DOT, VT_SCIENTIFIC, VT_DATE, VT_DOLLAR, VT_CUSTOM, VT_STRING}; - const struct fmt_spec *write_spec = psppire_variable_get_write_spec(pv); + const struct fmt_spec *write_spec = var_get_write_format (pv); switch (c) { case COL_NAME: - return pspp_locale_to_utf8(psppire_variable_get_name(pv), -1, err); + return pspp_locale_to_utf8 ( var_get_name (pv), -1, err); break; case COL_TYPE: { @@ -485,9 +534,12 @@ text_for_column(const struct PsppireVariable *pv, gint c, GError **err) case FMT_A: return g_locale_to_utf8(gettext(type_label[VT_STRING]), -1, 0, 0, err); break; - default: - g_warning("Unknown format: \"%s\"\n", - fmt_to_string(write_spec)); + default: + { + char str[FMT_STRING_LEN_MAX + 1]; + g_warning("Unknown format: \"%s\"\n", + fmt_to_string(write_spec, str)); + } break; } } @@ -496,7 +548,7 @@ text_for_column(const struct PsppireVariable *pv, gint c, GError **err) { gchar *s; GString *gstr = g_string_sized_new(10); - g_string_printf(gstr, "%d", write_spec->w); + g_string_printf(gstr, _("%d"), write_spec->w); s = g_locale_to_utf8(gstr->str, gstr->len, 0, 0, err); g_string_free(gstr, TRUE); return s; @@ -506,7 +558,7 @@ text_for_column(const struct PsppireVariable *pv, gint c, GError **err) { gchar *s; GString *gstr = g_string_sized_new(10); - g_string_printf(gstr, "%d", write_spec->d); + g_string_printf(gstr, _("%d"), write_spec->d); s = g_locale_to_utf8(gstr->str, gstr->len, 0, 0, err); g_string_free(gstr, TRUE); return s; @@ -516,20 +568,20 @@ text_for_column(const struct PsppireVariable *pv, gint c, GError **err) { gchar *s; GString *gstr = g_string_sized_new(10); - g_string_printf(gstr, "%d", psppire_variable_get_columns(pv)); + g_string_printf(gstr, _("%d"), var_get_display_width (pv)); s = g_locale_to_utf8(gstr->str, gstr->len, 0, 0, err); g_string_free(gstr, TRUE); return s; } break; case COL_LABEL: - return pspp_locale_to_utf8(psppire_variable_get_label(pv), -1, err); + return pspp_locale_to_utf8 (var_get_label (pv), -1, err); break; case COL_MISSING: { gchar *s; - const struct missing_values *miss = psppire_variable_get_missing(pv); + const struct missing_values *miss = var_get_missing_values (pv); if ( mv_is_empty(miss)) return g_locale_to_utf8(gettext(none), -1, 0, 0, err); else @@ -589,47 +641,48 @@ text_for_column(const struct PsppireVariable *pv, gint c, GError **err) break; case COL_VALUES: { - const struct val_labs *vls = psppire_variable_get_value_labels(pv); - if ( ! vls || 0 == val_labs_count(vls) ) - return g_locale_to_utf8(gettext(none), -1, 0, 0, err); + if ( ! var_has_value_labels (pv)) + return g_locale_to_utf8 (gettext (none), -1, 0, 0, err); else { gchar *ss; - GString *gstr = g_string_sized_new(10); + GString *gstr = g_string_sized_new (10); + const struct val_labs *vls = var_get_value_labels (pv); struct val_labs_iterator *ip = 0; struct val_lab *vl = val_labs_first_sorted (vls, &ip); - g_assert(vl); + g_assert (vl); { - gchar *const vstr = value_to_text(vl->value, *write_spec); + gchar *const vstr = value_to_text (vl->value, *write_spec); - g_string_printf(gstr, "{%s,\"%s\"}_", vstr, vl->label); - g_free(vstr); + g_string_printf (gstr, "{%s,\"%s\"}_", vstr, vl->label); + g_free (vstr); } - val_labs_done(&ip); - - ss = pspp_locale_to_utf8(gstr->str, gstr->len, err); - g_string_free(gstr, TRUE); + val_labs_done (&ip); + + ss = pspp_locale_to_utf8 (gstr->str, gstr->len, err); + g_string_free (gstr, TRUE); return ss; } } break; case COL_ALIGN: { - const gint align = psppire_variable_get_alignment(pv); + const gint align = var_get_alignment(pv); - g_assert(align < n_ALIGNMENTS); - return g_locale_to_utf8(gettext(alignments[align]),-1, -0, 0, err); + g_assert (align < n_ALIGNMENTS); + return g_locale_to_utf8(gettext(alignments[align]), -1, 0, 0, err); } break; case COL_MEASURE: { - const gint measure = psppire_variable_get_measure(pv); + const gint measure = var_get_measure (pv); - g_assert(measure < n_MEASURES); - return g_locale_to_utf8(gettext(measures[measure]), -1, -0, 0, err); + g_assert (measure < n_MEASURES); + return g_locale_to_utf8 (gettext (measures[measure]), + -1, 0, 0, err); } break; } @@ -658,5 +711,75 @@ psppire_var_store_set_font(PsppireVarStore *store, const PangoFontDescription *f } +static gint +psppire_var_store_get_row_count(const GSheetModel * model) +{ + gint rows = 0; + PsppireVarStore *vs = PSPPIRE_VAR_STORE(model); + + if (vs->dict) + rows = psppire_dict_get_var_cnt(vs->dict); + + return rows ; +} + +/* Row related funcs */ + +static gint +geometry_get_row_count(const GSheetRow *geom, gpointer data) +{ + gint rows = 0; + PsppireVarStore *vs = PSPPIRE_VAR_STORE(geom); + + if (vs->dict) + rows = psppire_dict_get_var_cnt(vs->dict); + + return rows + TRAILING_ROWS; +} + + +static gint +geometry_get_height(const GSheetRow *geom, gint row, gpointer data) +{ + return 25; +} +static gboolean +geometry_is_sensitive(const GSheetRow *geom, gint row, gpointer data) +{ + PsppireVarStore *vs = PSPPIRE_VAR_STORE(geom); + + if ( ! vs->dict) + return FALSE; + + return row < psppire_dict_get_var_cnt(vs->dict); +} + +static +gboolean always_true() +{ + return TRUE; +} + + +static gchar * +geometry_get_button_label(const GSheetRow *geom, gint unit, gpointer data) +{ + gchar *label = g_strdup_printf(_("%d"), unit); + + return label; +} + + +static void +psppire_var_store_sheet_row_init (GSheetRowIface *iface) +{ + iface->get_row_count = geometry_get_row_count; + iface->get_height = geometry_get_height; + iface->set_height = 0; + iface->get_visibility = always_true; + iface->get_sensitivity = geometry_is_sensitive; + + iface->get_button_label = geometry_get_button_label; +}