Merge remote-tracking branch 'origin/master' into sheet
authorJohn Darrington <john@darrington.wattle.id.au>
Fri, 12 Aug 2016 16:40:23 +0000 (18:40 +0200)
committerJohn Darrington <john@darrington.wattle.id.au>
Fri, 12 Aug 2016 16:40:23 +0000 (18:40 +0200)
1  2 
src/ui/gui/psppire-dict.c

index 53ba83aa1d62aaa1909a5aea246197c9a424cb2e,0ee608cadef083eacb9f770aecfb37ff9d32af72..0a0c3ae0b4f1884b32803e905fd4781207607833
@@@ -1,5 -1,5 +1,5 @@@
  /* 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  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 "ui/gui/efficient-sheet/jmd-datum.h"
 +
 +#include <gobject/genums.h>
 +
  #include <gettext.h>
  #define _(msgid) gettext (msgid)
  #define N_(msgid) msgid
  
 +
 +
 +GType align_enum_type;
 +GType measure_enum_type;
 +GType role_enum_type;
 +
 +
  enum  {
 -  BACKEND_CHANGED,
 +  ITEMS_CHANGED,
  
    VARIABLE_CHANGED,
    VARIABLE_INSERTED,
@@@ -70,53 -59,6 +70,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 JMD_TYPE_DATUM;
 +}
 +
 +static gpointer
 +gi (GListModel *list, guint id)
 +{
 +  JmdDatum *gd = JMD_DATUM (g_object_new (JMD_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
 +jmd_init_iface (GListModelInterface *iface)
 +{
 +  iface->get_n_items = gni;
 +  iface->get_item = gi;
 +  iface->get_item_type = git;
 +}
 +
 +
  /* --- variables --- */
  static GObjectClass     *parent_class = NULL;
  
@@@ -152,21 -94,12 +152,21 @@@ psppire_dict_get_type (void
        NULL
        };
  
 +      static const GInterfaceInfo list_model_info = {
 +      (GInterfaceInitFunc) jmd_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,19 -114,16 +181,19 @@@ psppire_dict_class_init (PsppireDictCla
    parent_class = g_type_class_peek_parent (class);
  
    object_class->dispose = psppire_dict_dispose;
 -
 -  signals [BACKEND_CHANGED] =
 -    g_signal_new ("backend-changed",
 +  
 +  signals [ITEMS_CHANGED] =
 +    g_signal_new ("changed",
                  G_TYPE_FROM_CLASS (class),
                  G_SIGNAL_RUN_FIRST,
                  0,
                  NULL, NULL,
 -                g_cclosure_marshal_VOID__VOID,
 +                psppire_marshal_VOID__UINT_UINT_UINT,
                  G_TYPE_NONE,
 -                0);
 +                3,
 +                G_TYPE_UINT,
 +                G_TYPE_UINT,
 +                G_TYPE_UINT);
  
  
    signals [VARIABLE_CHANGED] =
@@@ -291,10 -221,7 +291,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 (dict, signals [ITEMS_CHANGED], 0, idx, 1, 1);
 +    }
  }
  
  static void
@@@ -303,14 -230,12 +303,14 @@@ delcb (struct dictionary *d, const stru
  {
    g_signal_emit (pd, signals [VARIABLE_DELETED], 0,
                   var, dict_idx, case_idx);
 +  g_signal_emit (pd, signals [ITEMS_CHANGED], 0, 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 (pd, signals [ITEMS_CHANGED], 0, idx, 1, 1);
  }
  
  static void
@@@ -359,7 -284,7 +359,7 @@@ psppire_dict_new_from_dict (struct dict
  {
    PsppireDict *new_dict = g_object_new (PSPPIRE_TYPE_DICT, NULL);
    new_dict->dict = d;
 -
 +  
    dict_set_callbacks (new_dict->dict, &gui_callbacks, new_dict);
  
    return new_dict;
@@@ -371,9 -296,6 +371,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 (dict, signals [ITEMS_CHANGED], 0, 0, old_n, new_n);
  }
  
  
@@@ -449,8 -371,7 +449,8 @@@ psppire_dict_insert_variable (PsppireDi
    d->disable_insert_signal = FALSE;
  
    g_signal_emit (d, signals[VARIABLE_INSERTED], 0, idx);
 -
 +  g_signal_emit (d, signals [ITEMS_CHANGED], 0, idx, 0, 1);
 +  
    return var;
  }
  
@@@ -696,34 -617,24 +696,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
@@@ -769,11 -680,11 +769,11 @@@ tree_model_iter_next (GtkTreeModel *mod
    struct variable *var;
    gint idx;
  
-   g_return_val_if_fail (iter->stamp == dict->stamp, FALSE);
    if ( iter == NULL || iter->user_data == NULL)
      return FALSE;
  
+   g_return_val_if_fail (iter->stamp == dict->stamp, FALSE);
    var = iter->user_data;
  
    idx = var_get_dict_index (var);
@@@ -811,7 -722,6 +811,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;
      }
  }
@@@ -885,7 -766,7 +885,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;