From: John Darrington Date: Thu, 31 Aug 2017 06:41:38 +0000 (+0200) Subject: Merge remote-tracking branch 'origin/master' into sheet X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8180c5dd1591446174c0753ee960921786113403;hp=-c;p=pspp Merge remote-tracking branch 'origin/master' into sheet --- 8180c5dd1591446174c0753ee960921786113403 diff --combined NEWS index 6c2be625e8,1c24e0c359..de670d554e --- a/NEWS +++ b/NEWS @@@ -4,10 -4,16 +4,20 @@@ See the end for copying conditions Please send PSPP bug reports to bug-gnu-pspp@gnu.org. ++Experimental 0.13.1: + ** The code implementing the sheet rendering has been removed. Instead we + use a third party library: spread-sheet-widget. + - Changes from 0.10.2 to 0.10.4 + Changes from 1.0.0 to 1.0.1: + + * Bug fixes, including fixes for CVE-2017-12958, CVE-2017-12959, + CVE-2017-12960, and CVE-2017-12961. + + Changes from 0.11.0 to 1.0.0: + + * Translation updates. + + Changes from 0.10.2 to 0.11.0: * The REGRESSION command now has a /ORIGIN subcommand to perform regression through the origin. @@@ -171,7 -177,7 +181,7 @@@ Changes from 0.8.4 to 0.8.5 * SYSFILE INFO can now read SPSS/PC+ system files and SPSS portable files. - * FREQUENCIES: A bug was fixed where an assertion failure occured + * FREQUENCIES: A bug was fixed where an assertion failure occurred when an empty dataset was presented. * The GRAPH command is now available. Initially it supports diff --combined configure.ac index 6e7984bf98,f1d344ded2..77b7d79972 --- a/configure.ac +++ b/configure.ac @@@ -18,7 -18,7 +18,7 @@@ dnl Process this file with autoconf to dnl Initialize. AC_PREREQ(2.63) - AC_INIT([GNU PSPP], [0.10.4], [bug-gnu-pspp@gnu.org], [pspp]) -AC_INIT([GNU PSPP], [1.0.1], [bug-gnu-pspp@gnu.org], [pspp]) ++AC_INIT([GNU PSPP], [0.13.1], [bug-gnu-pspp@gnu.org], [pspp]) AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_HEADERS([config.h]) AC_CONFIG_TESTDIR([tests]) @@@ -112,11 -112,8 +112,11 @@@ if test "$with_cairo" != no && test "$w PKG_CHECK_MODULES([GTKSOURCEVIEW], [gtksourceview-3.0 >= 3.4.2], [], [PSPP_REQUIRED_PREREQ([gtksourceview 3.0 version 3.4.2 or later (or use --without-gui)])]) - PKG_CHECK_MODULES([GLIB], [glib-2.0 >= 2.32], [], - [PSPP_REQUIRED_PREREQ([glib 2.0 version 2.32 or later (or use --without-gui)])]) + PKG_CHECK_MODULES([GLIB], [glib-2.0 >= 2.44], [], + [PSPP_REQUIRED_PREREQ([glib 2.0 version 2.44 or later (or use --without-gui)])]) + + PKG_CHECK_MODULES([SPREAD_SHEET_WIDGET], [spread-sheet-widget >= 0.0], [], + [PSPP_REQUIRED_PREREQ([spread-sheet-widget 0.0 (or use --without-gui)])]) AC_ARG_VAR([GLIB_GENMARSHAL]) AC_CHECK_PROGS([GLIB_GENMARSHAL], [glib-genmarshal]) diff --combined src/ui/gui/psppire-dict.c index 59b57b490c,239f3ce2f3..924ff7c556 --- a/src/ui/gui/psppire-dict.c +++ b/src/ui/gui/psppire-dict.c @@@ -1,6 -1,5 +1,6 @@@ /* PSPPIRE - a graphical user interface for PSPP. - Copyright (C) 2004, 2006, 2007, 2009, 2010, 2011, 2012 Free Software Foundation + Copyright (C) 2004, 2006, 2007, 2009, 2010, 2011, 2012, + 2016, 2017 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 @@@ -34,22 -33,13 +34,22 @@@ #include "ui/gui/psppire-marshal.h" #include "ui/gui/psppire-var-ptr.h" +#include + +#include + #include #define _(msgid) gettext (msgid) #define N_(msgid) msgid -enum { - BACKEND_CHANGED, + +GType align_enum_type; +GType measure_enum_type; +GType role_enum_type; + + +enum { VARIABLE_CHANGED, VARIABLE_INSERTED, VARIABLE_DELETED, @@@ -69,53 -59,6 +69,53 @@@ static void psppire_dict_dispose (GObje static void dictionary_tree_model_init (GtkTreeModelIface *iface); + +static guint +gni (GListModel *list) +{ + PsppireDict *dict = PSPPIRE_DICT (list); + + return psppire_dict_get_var_cnt (dict); +} + +static GType +git (GListModel *list) +{ + return SSW_TYPE_DATUM; +} + +static gpointer +gi (GListModel *list, guint id) +{ + SswDatum *gd = SSW_DATUM (g_object_new (SSW_TYPE_DATUM, NULL)); + + PsppireDict *dict = PSPPIRE_DICT (list); + + if (id >= psppire_dict_get_var_cnt (dict)) + { + gd->text = g_strdup (_("Var")); + } + else + { + const struct variable *v = psppire_dict_get_variable (dict, id); + + gd->text = g_strdup (var_get_name (v)); + gd->label = g_strdup (var_get_label (v)); + } + + return gd; +} + + +static void +ssw_init_iface (GListModelInterface *iface) +{ + iface->get_n_items = gni; + iface->get_item = gi; + iface->get_item_type = git; +} + + /* --- variables --- */ static GObjectClass *parent_class = NULL; @@@ -151,21 -94,12 +151,21 @@@ psppire_dict_get_type (void NULL }; + static const GInterfaceInfo list_model_info = { + (GInterfaceInitFunc) ssw_init_iface, + NULL, + NULL + }; + object_type = g_type_register_static (G_TYPE_OBJECT, "PsppireDict", &object_info, 0); g_type_add_interface_static (object_type, GTK_TYPE_TREE_MODEL, &tree_model_info); + + g_type_add_interface_static (object_type, G_TYPE_LIST_MODEL, + &list_model_info); } return object_type; @@@ -181,6 -115,17 +181,6 @@@ psppire_dict_class_init (PsppireDictCla object_class->dispose = psppire_dict_dispose; - signals [BACKEND_CHANGED] = - g_signal_new ("backend-changed", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_FIRST, - 0, - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, - 0); - - signals [VARIABLE_CHANGED] = g_signal_new ("variable-changed", G_TYPE_FROM_CLASS (class), @@@ -276,10 -221,7 +276,10 @@@ addcb (struct dictionary *d, int idx, v PsppireDict *dict = PSPPIRE_DICT (pd); if ( ! dict->disable_insert_signal) - g_signal_emit (dict, signals [VARIABLE_INSERTED], 0, idx); + { + g_signal_emit (dict, signals [VARIABLE_INSERTED], 0, idx); + g_signal_emit_by_name (dict, "items-changed", idx, 1, 1); + } } static void @@@ -288,14 -230,12 +288,14 @@@ delcb (struct dictionary *d, const stru { g_signal_emit (pd, signals [VARIABLE_DELETED], 0, var, dict_idx, case_idx); + g_signal_emit_by_name (pd, "items-changed", dict_idx, 1, 0); } static void mutcb (struct dictionary *d, int idx, unsigned int what, const struct variable *oldvar, void *pd) { g_signal_emit (pd, signals [VARIABLE_CHANGED], 0, idx, what, oldvar); + g_signal_emit_by_name (pd, "items-changed", idx, 1, 1); } static void @@@ -356,9 -296,6 +356,9 @@@ psppire_dict_replace_dictionary (Psppir { struct variable *var = dict_get_weight (d); + guint old_n = dict_get_var_cnt (dict->dict); + guint new_n = dict_get_var_cnt (d); + dict->dict = d; weight_changed_callback (d, var ? var_get_dict_index (var) : -1, dict); @@@ -370,7 -307,7 +370,7 @@@ dict_set_callbacks (dict->dict, &gui_callbacks, dict); - g_signal_emit (dict, signals [BACKEND_CHANGED], 0); + g_signal_emit_by_name (dict, "items-changed", 0, old_n, new_n); } @@@ -390,7 -327,7 +390,7 @@@ psppire_dict_generate_name (const Psppi - The string may not contain whitespace. - The first character may not be '$' - The first character may not be a digit - - The final charactor may not be '.' or '_' + - The final character may not be '.' or '_' */ len = snprintf (name, size, _("Var%04d"), d); if (len + 1 >= size) @@@ -434,7 -371,6 +434,7 @@@ psppire_dict_insert_variable (PsppireDi d->disable_insert_signal = FALSE; g_signal_emit (d, signals[VARIABLE_INSERTED], 0, idx); + g_signal_emit_by_name (d, "items-changed", idx, 0, 1); return var; } @@@ -563,7 -499,7 +563,7 @@@ psppire_dict_clear (PsppireDict *d } -/* Return true is NAME would be a valid name of a variable to add to the +/* Return true if NAME would be a valid name of a variable to add to the dictionary. False otherwise. If REPORT is true, then invalid names will be reported as such as errors */ @@@ -681,34 -617,24 +681,34 @@@ tree_model_column_type (GtkTreeModel *m { g_return_val_if_fail (PSPPIRE_IS_DICT (model), (GType) 0); + GType t = 0; + switch (index) { case DICT_TVM_COL_NAME: - return G_TYPE_STRING; + case DICT_TVM_COL_LABEL: + t = G_TYPE_STRING; + break; + case DICT_TVM_COL_DECIMAL: + case DICT_TVM_COL_WIDTH: + case DICT_TVM_COL_COLUMNS: + t = G_TYPE_INT; break; case DICT_TVM_COL_VAR: - return PSPPIRE_VAR_PTR_TYPE; + t = PSPPIRE_VAR_PTR_TYPE; break; - case DICT_TVM_COL_LABEL: - return G_TYPE_STRING; + case DICT_TVM_COL_ALIGNMENT: + t = align_enum_type; break; - default: - g_return_val_if_reached ((GType)0); + case DICT_TVM_COL_MEASURE: + t = measure_enum_type; + break; + case DICT_TVM_COL_ROLE: + t = role_enum_type; break; } - g_assert_not_reached (); - return ((GType)0); + return t; } static gboolean @@@ -796,7 -722,6 +796,7 @@@ tree_model_get_path (GtkTreeModel *mode return path; } +const struct fmt_spec *var_get_write_format (const struct variable *); static void tree_model_get_value (GtkTreeModel *model, GtkTreeIter *iter, @@@ -807,51 -732,22 +807,51 @@@ g_return_if_fail (iter->stamp == dict->stamp); - var = iter->user_data; + var = iter->user_data; + + const struct fmt_spec *fs = var_get_write_format (var); switch (column) { case DICT_TVM_COL_NAME: - { - g_value_init (value, G_TYPE_STRING); - g_value_set_string (value, var_get_name (var)); - } + g_value_init (value, G_TYPE_STRING); + g_value_set_string (value, var_get_name (var)); + break; + case DICT_TVM_COL_WIDTH: + g_value_init (value, G_TYPE_INT); + g_value_set_int (value, fs->w); + break; + case DICT_TVM_COL_DECIMAL: + g_value_init (value, G_TYPE_INT); + g_value_set_int (value, fs->d); + break; + case DICT_TVM_COL_LABEL: + g_value_init (value, G_TYPE_STRING); + g_value_set_string (value, var_get_label (var)); + break; + case DICT_TVM_COL_COLUMNS: + g_value_init (value, G_TYPE_INT); + g_value_set_int (value, var_get_display_width (var)); + break; + case DICT_TVM_COL_ALIGNMENT: + g_value_init (value, align_enum_type); + g_value_set_enum (value, var_get_alignment (var)); + break; + case DICT_TVM_COL_MEASURE: + g_value_init (value, measure_enum_type); + g_value_set_enum (value, var_get_measure (var)); + break; + case DICT_TVM_COL_ROLE: + g_value_init (value, role_enum_type); + g_value_set_enum (value, var_get_role (var)); break; case DICT_TVM_COL_VAR: g_value_init (value, PSPPIRE_VAR_PTR_TYPE); g_value_set_boxed (value, var); break; default: - g_return_if_reached (); + g_value_init (value, G_TYPE_STRING); + g_value_set_string (value, "????"); break; } } @@@ -870,7 -766,7 +870,7 @@@ tree_model_n_children (GtkTreeModel *mo { PsppireDict *dict = PSPPIRE_DICT (model); - if ( iter == NULL ) + if (iter == NULL) return psppire_dict_get_var_cnt (dict); return 0;