psppire-dictview: New function psppire_dict_view_get_selected_variables().
[pspp] / src / ui / gui / psppire-dictview.c
index b75cf3dd9c178e9fad0cd46045861c7ac2fe5e37..83f679e40d444c873ae4e2c9c4f96a41a8fb22aa 100644 (file)
@@ -338,74 +338,53 @@ var_icon_cell_data_func (GtkTreeViewColumn *col,
                       gpointer data)
 {
   struct variable *var;
+
   gtk_tree_model_get (model, iter, DICT_TVM_COL_VAR, &var, -1);
 
   g_object_set (cell, "stock_id",
-                psppire_dict_view_get_var_measurement_stock_id (var), NULL);
+                get_var_measurement_stock_id (var_get_print_format (var)->type,
+                                              var_get_measure (var)),
+                NULL);
 }
 
 const char *
-psppire_dict_view_get_var_measurement_stock_id (const struct variable *var)
+get_var_measurement_stock_id (enum fmt_type type, enum measure measure)
 {
-  if ( var_is_alpha (var))
+  switch (fmt_get_category (type))
     {
-      switch ( var_get_measure (var))
+    case FMT_CAT_STRING:
+      switch (measure)
        {
-       case MEASURE_NOMINAL:
-         return ("variable-string-nominal");
-         break;
-       case MEASURE_ORDINAL:
-         return ("variable-string-ordinal");
-         break;
-       case MEASURE_SCALE:
-         return ("variable-string-scale");
-         break;
-
-       default:
-         g_return_val_if_reached ("");
+       case MEASURE_NOMINAL: return "variable-string-nominal";
+       case MEASURE_ORDINAL: return "variable-string-ordinal";
+       case MEASURE_SCALE:   return "variable-string-scale";
+        case n_MEASURES: break;
        }
-    }
-  else
-    {
-      const struct fmt_spec *fs = var_get_print_format (var);
-      int cat = fmt_get_category (fs->type);
+      break;
 
-      if ( ( FMT_CAT_DATE | FMT_CAT_TIME ) & cat )
-       {
-         switch ( var_get_measure (var))
-           {
-           case MEASURE_NOMINAL:
-             return ("variable-date-nominal");
-             break;
-           case MEASURE_ORDINAL:
-             return ("variable-date-ordinal");
-             break;
-           case MEASURE_SCALE:
-             return ("variable-date-scale");
-               break;
-           default:
-             g_assert_not_reached ();
-           };
-       }
-      else
-       {
-         switch ( var_get_measure (var))
-           {
-           case MEASURE_NOMINAL:
-             return ("variable-nominal");
-             break;
-           case MEASURE_ORDINAL:
-             return ("variable-ordinal");
-             break;
-           case MEASURE_SCALE:
-             return ("variable-scale");
-             break;
-           default:
-             g_assert_not_reached ();
-           };
+    case FMT_CAT_DATE:
+    case FMT_CAT_TIME:
+      switch (measure)
+        {
+        case MEASURE_NOMINAL: return "variable-date-nominal";
+        case MEASURE_ORDINAL: return "variable-date-ordinal";
+        case MEASURE_SCALE:   return "variable-date-scale";
+        case n_MEASURES: break;
+        }
+      break;
+
+    default:
+      switch (measure)
+        {
+        case MEASURE_NOMINAL: return "variable-nominal";
+        case MEASURE_ORDINAL: return "variable-ordinal";
+        case MEASURE_SCALE:   return "variable-scale";
+        case n_MEASURES: break;
        }
+      break;
     }
-  return NULL;
+
+  g_return_val_if_reached ("");
 }
 
 
@@ -567,26 +546,18 @@ psppire_dict_view_new (void)
   return GTK_WIDGET (g_object_new (psppire_dict_view_get_type (), NULL));
 }
 
-
-
-struct variable *
-psppire_dict_view_get_selected_variable (PsppireDictView *treeview)
+static struct variable *
+psppire_dict_view_iter_to_var (PsppireDictView *dict_view,
+                               GtkTreeIter *top_iter)
 {
-  struct variable *var;
-  GtkTreeModel *top_model;
-  GtkTreeIter top_iter;
+  GtkTreeView *treeview = GTK_TREE_VIEW (dict_view);
+  GtkTreeModel *top_model = gtk_tree_view_get_model (treeview);
 
+  struct variable *var;
   GtkTreeModel *model;
   GtkTreeIter iter;
 
-  GtkTreeSelection *selection =
-    gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
-
-  if (! gtk_tree_selection_get_selected (selection,
-                                        &top_model, &top_iter))
-    return NULL;
-
-  dv_get_base_model (top_model, &top_iter, &model, &iter);
+  dv_get_base_model (top_model, top_iter, &model, &iter);
 
   g_assert (PSPPIRE_IS_DICT (model));
 
@@ -596,4 +567,56 @@ psppire_dict_view_get_selected_variable (PsppireDictView *treeview)
   return var;
 }
 
+struct get_vars_aux
+  {
+    PsppireDictView *dict_view;
+    struct variable **vars;
+    size_t idx;
+  };
+
+static void
+get_vars_cb (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter,
+             gpointer data)
+{
+  struct get_vars_aux *aux = data;
+  struct variable *var = psppire_dict_view_iter_to_var (aux->dict_view, iter);
+
+  g_return_if_fail (var != NULL);
+  aux->vars[aux->idx++] = var;
+}
+
+void
+psppire_dict_view_get_selected_variables (PsppireDictView *dict_view,
+                                          struct variable ***vars,
+                                          size_t *n_varsp)
+{
+  GtkTreeView *tree_view = GTK_TREE_VIEW (dict_view);
+  GtkTreeSelection *selection = gtk_tree_view_get_selection (tree_view);
+  gint n_vars = gtk_tree_selection_count_selected_rows (selection);
+  struct get_vars_aux aux;
+
+  *vars = g_malloc_n (n_vars, sizeof **vars);
+
+  aux.dict_view = dict_view;
+  aux.vars = *vars;
+  aux.idx = 0;
+  gtk_tree_selection_selected_foreach (selection, get_vars_cb, &aux);
+
+  *n_varsp = aux.idx;
+  g_return_if_fail (aux.idx >= n_vars);
+}
+
+struct variable *
+psppire_dict_view_get_selected_variable (PsppireDictView *dict_view)
+{
+  GtkTreeView *tree_view = GTK_TREE_VIEW (dict_view);
+  GtkTreeSelection *selection = gtk_tree_view_get_selection (tree_view);
+  GtkTreeIter iter;
+
+  if (gtk_tree_selection_get_selected (selection, NULL, &iter))
+    return psppire_dict_view_iter_to_var (dict_view, &iter);
+  else
+    return NULL;
+}
+