psppire-dictview: New function psppire_dict_view_get_selected_variables().
authorBen Pfaff <blp@cs.stanford.edu>
Mon, 23 Sep 2013 05:34:15 +0000 (22:34 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Mon, 23 Sep 2013 05:36:23 +0000 (22:36 -0700)
src/ui/gui/psppire-dictview.c
src/ui/gui/psppire-dictview.h

index 1820d41179d51a45a38a5a9eb2eb53b3067bec64..83f679e40d444c873ae4e2c9c4f96a41a8fb22aa 100644 (file)
@@ -546,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));
 
@@ -575,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;
+}
+
 
index bf41778ea9bd9a9153ff18e10c03e6117fe80520..96a13297e00c3cec4a7f5f0cbf1f1dad959f43d4 100644 (file)
@@ -61,6 +61,9 @@ struct _PsppireDictViewClass
 };
 
 GType      psppire_dict_view_get_type        (void);
+void psppire_dict_view_get_selected_variables (PsppireDictView *,
+                                               struct variable ***vars,
+                                               size_t *n_varsp);
 struct variable * psppire_dict_view_get_selected_variable (PsppireDictView *);
 
 const char *get_var_measurement_stock_id (enum fmt_type, enum measure);