Merge remote-tracking branch 'origin/master' into sheet
authorJohn Darrington <john@darrington.wattle.id.au>
Thu, 31 Aug 2017 06:41:38 +0000 (08:41 +0200)
committerJohn Darrington <john@darrington.wattle.id.au>
Thu, 31 Aug 2017 06:41:38 +0000 (08:41 +0200)
1  2 
NEWS
configure.ac
src/ui/gui/psppire-dict.c

diff --combined NEWS
index 6c2be625e8346783c1c4c3ee0c39a9361033fc09,1c24e0c359ee48db3e2ec877b496b8f5098b5b3c..de670d554e415557f108e985fbb5069692094309
--- 1/NEWS
--- 2/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.
  
- Changes from 0.10.2 to 0.10.4
++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 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 6e7984bf988889a7ad6f495cc5009d37df95ec54,f1d344ded297603d697481f8411e1db580fb7a1d..77b7d799727fa7a851bd216e918efd3eb02751ea
@@@ -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])
index 59b57b490c200df5a535a20c89b9ad85226db3e1,239f3ce2f3b08eb8ee47653b05884a0b4e2919c7..924ff7c5564e70530ae0323bd679cc69c760700d
@@@ -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
  #include "ui/gui/psppire-marshal.h"
  #include "ui/gui/psppire-var-ptr.h"
  
 +#include <ssw-datum.h>
 +
 +#include <gobject/genums.h>
 +
  #include <gettext.h>
  #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);
  
    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,
  
    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;