From da08e8b9ea6bfa772b4daec4a944279267852515 Mon Sep 17 00:00:00 2001 From: John Darrington Date: Wed, 16 Dec 2015 08:32:56 +0100 Subject: [PATCH] Autorecode Dialog: Convert from add hoc to PsppireDialogAction --- src/ui/gui/automake.mk | 4 +- src/ui/gui/autorecode-dialog.h | 24 -- src/ui/gui/data-editor.ui | 3 +- src/ui/gui/psppire-data-window.c | 2 - ...g.c => psppire-dialog-action-autorecode.c} | 342 +++++++++--------- src/ui/gui/psppire-dialog-action-autorecode.h | 88 +++++ src/ui/gui/widgets.c | 2 + 7 files changed, 262 insertions(+), 203 deletions(-) delete mode 100644 src/ui/gui/autorecode-dialog.h rename src/ui/gui/{autorecode-dialog.c => psppire-dialog-action-autorecode.c} (63%) create mode 100644 src/ui/gui/psppire-dialog-action-autorecode.h diff --git a/src/ui/gui/automake.mk b/src/ui/gui/automake.mk index f19bff0d42..0200348656 100644 --- a/src/ui/gui/automake.mk +++ b/src/ui/gui/automake.mk @@ -147,8 +147,6 @@ src_ui_gui_psppire_SOURCES = \ src/ui/gui/psppire-scanf.c \ src/ui/gui/psppire-scanf.h \ src/ui/gui/psppire-acr.c \ - src/ui/gui/autorecode-dialog.c \ - src/ui/gui/autorecode-dialog.h \ src/ui/gui/builder-wrapper.c \ src/ui/gui/builder-wrapper.h \ src/ui/gui/comments-dialog.c \ @@ -193,6 +191,8 @@ src_ui_gui_psppire_SOURCES = \ src/ui/gui/psppire-dialog-action.h \ src/ui/gui/psppire-dialog-action-aggregate.c \ src/ui/gui/psppire-dialog-action-aggregate.h \ + src/ui/gui/psppire-dialog-action-autorecode.c \ + src/ui/gui/psppire-dialog-action-autorecode.h \ src/ui/gui/psppire-dialog-action-1sks.c \ src/ui/gui/psppire-dialog-action-1sks.h \ src/ui/gui/psppire-dialog-action-barchart.c \ diff --git a/src/ui/gui/autorecode-dialog.h b/src/ui/gui/autorecode-dialog.h deleted file mode 100644 index 7127b00f85..0000000000 --- a/src/ui/gui/autorecode-dialog.h +++ /dev/null @@ -1,24 +0,0 @@ -/* PSPPIRE - a graphical user interface for PSPP. - Copyright (C) 2011 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 - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . */ - -#ifndef AUTORECODE_H -#define AUTORECODE_H 1 - -#include "psppire-data-window.h" - -void autorecode_dialog (PsppireDataWindow *de); - -#endif diff --git a/src/ui/gui/data-editor.ui b/src/ui/gui/data-editor.ui index dbb4d1772c..5437ff5571 100644 --- a/src/ui/gui/data-editor.ui +++ b/src/ui/gui/data-editor.ui @@ -251,8 +251,9 @@ - + transform_autorecode + uimanager1 Auto_matic Recode... transform-automatic-recode diff --git a/src/ui/gui/psppire-data-window.c b/src/ui/gui/psppire-data-window.c index 3dabaef8b2..73f8bbe8ba 100644 --- a/src/ui/gui/psppire-data-window.c +++ b/src/ui/gui/psppire-data-window.c @@ -24,7 +24,6 @@ #include "language/lexer/lexer.h" #include "libpspp/message.h" #include "libpspp/str.h" -#include "ui/gui/autorecode-dialog.h" #include "ui/gui/builder-wrapper.h" #include "ui/gui/comments-dialog.h" #include "ui/gui/entry-dialog.h" @@ -1010,7 +1009,6 @@ psppire_data_window_finish_init (PsppireDataWindow *de, g_signal_connect_swapped (get_action_assert (de->builder, "view_value-labels"), "toggled", G_CALLBACK (toggle_value_labels), de); connect_action (de, "data_select-cases", G_CALLBACK (select_cases_dialog)); - connect_action (de, "transform_autorecode", G_CALLBACK (autorecode_dialog)); connect_action (de, "data_split-file", G_CALLBACK (split_file_dialog)); connect_action (de, "data_weight-cases", G_CALLBACK (weight_cases_dialog)); connect_action (de, "utilities_comments", G_CALLBACK (comments_dialog)); diff --git a/src/ui/gui/autorecode-dialog.c b/src/ui/gui/psppire-dialog-action-autorecode.c similarity index 63% rename from src/ui/gui/autorecode-dialog.c rename to src/ui/gui/psppire-dialog-action-autorecode.c index 7b027d9bad..24cbe54210 100644 --- a/src/ui/gui/autorecode-dialog.c +++ b/src/ui/gui/psppire-dialog-action-autorecode.c @@ -1,5 +1,5 @@ /* PSPPIRE - a graphical user interface for PSPP. - Copyright (C) 2011, 2012 Free Software Foundation + Copyright (C) 2015 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 @@ -14,48 +14,73 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ + #include -#include "dialog-common.h" -#include "autorecode-dialog.h" -#include "psppire-selector.h" -#include "psppire-dictview.h" -#include "psppire-var-ptr.h" -#include "psppire-dialog.h" +#include "psppire-dialog-action-autorecode.h" -#include "psppire-data-window.h" #include "psppire-var-view.h" - -#include "executor.h" +#include +#include "psppire-dialog.h" #include "builder-wrapper.h" -#include "helper.h" - -#include #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) msgid -/* Name-Label pair */ -struct nlp + +static void psppire_dialog_action_autorecode_init (PsppireDialogActionAutorecode *act); +static void psppire_dialog_action_autorecode_class_init (PsppireDialogActionAutorecodeClass *class); + + +G_DEFINE_TYPE (PsppireDialogActionAutorecode, psppire_dialog_action_autorecode, PSPPIRE_TYPE_DIALOG_ACTION); + + +static gboolean +dialog_state_valid (gpointer pda) { - char *name; - char *label; -}; + PsppireDialogActionAutorecode *rd = PSPPIRE_DIALOG_ACTION_AUTORECODE (pda); + + GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (rd->var_view)); + const gint n_vars = gtk_tree_model_iter_n_children (model, NULL); -struct autorecode + if (n_vars == 0) + return FALSE; + + if (g_hash_table_size (rd->varmap) != n_vars) + return FALSE; + + return TRUE; +} + +static void +refresh (PsppireDialogAction *pda) { - PsppireDict *dict; - GtkWidget *change_button; - GtkWidget *new_name_entry; - GtkWidget *var_view; + PsppireDialogActionAutorecode *rd = PSPPIRE_DIALOG_ACTION_AUTORECODE (pda); - /* A hash table of struct nlp's indexed by variable */ - GHashTable *varmap; + GtkTreeModel *target_list = gtk_tree_view_get_model (GTK_TREE_VIEW (rd->var_view)); + + gtk_entry_set_text (GTK_ENTRY (rd->new_name_entry), ""); + gtk_widget_set_sensitive (rd->new_name_entry, FALSE); + gtk_widget_set_sensitive (rd->change_button, FALSE); + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (rd->ascending), TRUE); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (rd->group), FALSE); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (rd->blank), FALSE); + + if (rd->varmap ) + g_hash_table_remove_all (rd->varmap); - GtkWidget *ascending; - GtkWidget *group; - GtkWidget *blank; + gtk_list_store_clear (GTK_LIST_STORE (target_list)); + + +} + +/* Name-Label pair */ +struct nlp +{ + char *name; + char *label; }; static struct nlp * @@ -85,10 +110,60 @@ nlp_destroy (gpointer data) g_free (nlp); } + +static char * +generate_syntax (PsppireDialogAction *act) +{ + PsppireDialogActionAutorecode *rd = PSPPIRE_DIALOG_ACTION_AUTORECODE (act); + + GHashTableIter iter; + gpointer key, value; + gchar *text; + + GString *string = g_string_new ("AUTORECODE"); + + g_string_append (string, "\n\tVARIABLES ="); + + g_hash_table_iter_init (&iter, rd->varmap); + while (g_hash_table_iter_next (&iter, &key, &value)) + { + struct variable *var = key; + g_string_append (string, " "); + g_string_append (string, var_get_name (var)); + } + + g_string_append (string, " INTO"); + + g_hash_table_iter_init (&iter, rd->varmap); + while (g_hash_table_iter_next (&iter, &key, &value)) + { + struct nlp *nlp = value; + g_string_append (string, " "); + g_string_append (string, nlp->name); + } + + if ( ! gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (rd->ascending))) + g_string_append (string, "\n\t/DESCENDING"); + + if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (rd->group))) + g_string_append (string, "\n\t/GROUP"); + + if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (rd->blank))) + g_string_append (string, "\n\t/BLANK"); + + g_string_append (string, ".\n"); + + text = string->str; + + g_string_free (string, FALSE); + + return text; +} + static void on_change_clicked (GObject *obj, gpointer data) { - struct autorecode *rd = data; + PsppireDialogActionAutorecode *rd = PSPPIRE_DIALOG_ACTION_AUTORECODE (data); struct variable *var = NULL; struct nlp *nlp; GtkTreeModel *model = psppire_var_view_get_current_model (PSPPIRE_VAR_VIEW (rd->var_view)); @@ -122,45 +197,8 @@ on_change_clicked (GObject *obj, gpointer data) } -static char * generate_syntax (const struct autorecode *rd); - - -static void -refresh (PsppireDialog *dialog, struct autorecode *rd) -{ - GtkTreeModel *target_list = gtk_tree_view_get_model (GTK_TREE_VIEW (rd->var_view)); - - gtk_entry_set_text (GTK_ENTRY (rd->new_name_entry), ""); - gtk_widget_set_sensitive (rd->new_name_entry, FALSE); - gtk_widget_set_sensitive (rd->change_button, FALSE); - - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (rd->ascending), TRUE); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (rd->group), FALSE); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (rd->blank), FALSE); - - if (rd->varmap ) - g_hash_table_remove_all (rd->varmap); - - gtk_list_store_clear (GTK_LIST_STORE (target_list)); -} - - -static gboolean -dialog_state_valid (gpointer data) -{ - struct autorecode *rd = data; - - GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (rd->var_view)); - - if (g_hash_table_size (rd->varmap) != gtk_tree_model_iter_n_children (model, NULL) ) - return FALSE; - - return TRUE; -} - - static void -on_entry_change (struct autorecode *rd) +on_entry_change (PsppireDialogActionAutorecode *rd) { gboolean valid = TRUE; const char *text = gtk_entry_get_text (GTK_ENTRY (rd->new_name_entry)); @@ -190,15 +228,17 @@ on_entry_change (struct autorecode *rd) gtk_widget_set_sensitive (rd->change_button, valid); } + /* Callback which gets called when a new row is selected in the variable treeview. It sets the name and label entry widgets to reflect the currently selected row. - */ +*/ static void on_selection_change (GtkTreeSelection *selection, gpointer data) { - struct autorecode *rd = data; + PsppireDialogActionAutorecode *rd = PSPPIRE_DIALOG_ACTION_AUTORECODE (data); + GtkTreeModel *model = psppire_var_view_get_current_model (PSPPIRE_VAR_VIEW (rd->var_view)); GList *rows = gtk_tree_selection_get_selected_rows (selection, &model); @@ -238,6 +278,8 @@ on_selection_change (GtkTreeSelection *selection, gpointer data) g_list_free (rows); } + + static void render_new_var_name (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, @@ -246,8 +288,11 @@ render_new_var_name (GtkTreeViewColumn *tree_column, gpointer data) { struct nlp *nlp = NULL; - struct autorecode *rd = data; + PsppireDialogActionAutorecode *rd = PSPPIRE_DIALOG_ACTION_AUTORECODE (data); + + + struct variable *var = NULL; gtk_tree_model_get (tree_model, iter, @@ -263,142 +308,91 @@ render_new_var_name (GtkTreeViewColumn *tree_column, } - -/* Pops up the Autorecode dialog box */ -void -autorecode_dialog (PsppireDataWindow *de) +static void +psppire_dialog_action_autorecode_activate (GtkAction *a) { - struct autorecode rd; - gint response; - - GtkBuilder *xml = builder_new ("autorecode.ui"); - - GtkWidget *dialog = get_widget_assert (xml, "autorecode-dialog"); - GtkWidget *source = get_widget_assert (xml, "dict-view"); - - rd.var_view = get_widget_assert (xml, "var-view"); - - rd.new_name_entry = get_widget_assert (xml, "entry1"); - rd.change_button = get_widget_assert (xml, "button1"); - rd.ascending = get_widget_assert (xml, "radiobutton1"); - rd.group = get_widget_assert (xml, "checkbutton1"); - rd.blank = get_widget_assert (xml, "checkbutton2"); + PsppireDialogActionAutorecode *act = PSPPIRE_DIALOG_ACTION_AUTORECODE (a); + PsppireDialogAction *pda = PSPPIRE_DIALOG_ACTION (a); + GHashTable *thing = psppire_dialog_action_get_hash_table (pda); + GtkBuilder *xml = g_hash_table_lookup (thing, a); + if (!xml) { - GtkTreeSelection *sel; - - GtkCellRenderer *renderer = gtk_cell_renderer_text_new (); + xml = builder_new ("autorecode.ui"); + g_hash_table_insert (thing, a, xml); - GtkTreeViewColumn *col = gtk_tree_view_column_new_with_attributes (_("New"), - renderer, - "text", NULL, - NULL); + pda->dialog = get_widget_assert (xml, "autorecode-dialog"); + pda->source = get_widget_assert (xml, "dict-view"); - gtk_tree_view_column_set_cell_data_func (col, renderer, - render_new_var_name, - &rd, NULL); - gtk_tree_view_append_column (GTK_TREE_VIEW (rd.var_view), col); - col = gtk_tree_view_get_column (GTK_TREE_VIEW (rd.var_view), 0); + act->var_view = get_widget_assert (xml, "var-view"); - g_object_set (col, "title", _("Old"), NULL); + act->new_name_entry = get_widget_assert (xml, "entry1"); + act->change_button = get_widget_assert (xml, "button1"); + act->ascending = get_widget_assert (xml, "radiobutton1"); + act->group = get_widget_assert (xml, "checkbutton1"); + act->blank = get_widget_assert (xml, "checkbutton2"); - g_object_set (rd.var_view, "headers-visible", TRUE, NULL); + { + GtkTreeSelection *sel; - rd.varmap = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, nlp_destroy); + GtkCellRenderer *renderer = gtk_cell_renderer_text_new (); + GtkTreeViewColumn *col = gtk_tree_view_column_new_with_attributes (_("New"), + renderer, + "text", NULL, + NULL); - sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (rd.var_view)); + gtk_tree_view_column_set_cell_data_func (col, renderer, + render_new_var_name, + act, NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW (act->var_view), col); - g_signal_connect (sel, "changed", - G_CALLBACK (on_selection_change), &rd); - g_signal_connect (rd.change_button, "clicked", - G_CALLBACK (on_change_clicked), &rd); + col = gtk_tree_view_get_column (GTK_TREE_VIEW (act->var_view), 0); - g_signal_connect_swapped (rd.new_name_entry, "changed", - G_CALLBACK (on_entry_change), &rd); + g_object_set (col, "title", _("Old"), NULL); - } + g_object_set (act->var_view, "headers-visible", TRUE, NULL); + act->varmap = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, nlp_destroy); - gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de)); - g_object_get (de->data_editor, "dictionary", &rd.dict, NULL); - g_object_set (source, "model", rd.dict, NULL); + sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (act->var_view)); - g_signal_connect (dialog, "refresh", G_CALLBACK (refresh), &rd); + g_signal_connect (sel, "changed", + G_CALLBACK (on_selection_change), act); - psppire_dialog_set_valid_predicate (PSPPIRE_DIALOG (dialog), - dialog_state_valid, &rd); + g_signal_connect (act->change_button, "clicked", + G_CALLBACK (on_change_clicked), act); - response = psppire_dialog_run (PSPPIRE_DIALOG (dialog)); + g_signal_connect_swapped (act->new_name_entry, "changed", + G_CALLBACK (on_entry_change), act); + } - switch (response) - { - case GTK_RESPONSE_OK: - g_free (execute_syntax_string (de, generate_syntax (&rd))); - break; - case PSPPIRE_RESPONSE_PASTE: - g_free (paste_syntax_to_window (generate_syntax (&rd))); - break; - default: - break; } + + psppire_dialog_action_set_refresh (pda, refresh); + psppire_dialog_action_set_valid_predicate (pda, dialog_state_valid); - g_object_unref (xml); + if (PSPPIRE_DIALOG_ACTION_CLASS (psppire_dialog_action_autorecode_parent_class)->activate) + PSPPIRE_DIALOG_ACTION_CLASS (psppire_dialog_action_autorecode_parent_class)->activate (pda); } - - - -static char * -generate_syntax (const struct autorecode *rd) +static void +psppire_dialog_action_autorecode_class_init (PsppireDialogActionAutorecodeClass *class) { - GHashTableIter iter; - gpointer key, value; - gchar *text; - GString *string = g_string_new ("AUTORECODE"); - - g_string_append (string, "\n\tVARIABLES ="); - - g_hash_table_iter_init (&iter, rd->varmap); - while (g_hash_table_iter_next (&iter, &key, &value)) - { - struct variable *var = key; - g_string_append (string, " "); - g_string_append (string, var_get_name (var)); - } - - g_string_append (string, " INTO"); - - g_hash_table_iter_init (&iter, rd->varmap); - while (g_hash_table_iter_next (&iter, &key, &value)) - { - struct nlp *nlp = value; - g_string_append (string, " "); - g_string_append (string, nlp->name); - } - - if ( ! gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (rd->ascending))) - g_string_append (string, "\n\t/DESCENDING"); - - if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (rd->group))) - g_string_append (string, "\n\t/GROUP"); - - if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (rd->blank))) - g_string_append (string, "\n\t/BLANK"); - - g_string_append (string, ".\n"); - - text = string->str; + psppire_dialog_action_set_activation (class, psppire_dialog_action_autorecode_activate); + PSPPIRE_DIALOG_ACTION_CLASS (class)->generate_syntax = generate_syntax; +} - g_string_free (string, FALSE); - return text; +static void +psppire_dialog_action_autorecode_init (PsppireDialogActionAutorecode *act) +{ } diff --git a/src/ui/gui/psppire-dialog-action-autorecode.h b/src/ui/gui/psppire-dialog-action-autorecode.h new file mode 100644 index 0000000000..d07ffc5a95 --- /dev/null +++ b/src/ui/gui/psppire-dialog-action-autorecode.h @@ -0,0 +1,88 @@ +/* PSPPIRE - a graphical user interface for PSPP. + Copyright (C) 2015 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 + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + + +#include +#include + +#include "psppire-dialog-action.h" + +#ifndef __PSPPIRE_DIALOG_ACTION_AUTORECODE_H__ +#define __PSPPIRE_DIALOG_ACTION_AUTORECODE_H__ + +G_BEGIN_DECLS + + +#define PSPPIRE_TYPE_DIALOG_ACTION_AUTORECODE (psppire_dialog_action_autorecode_get_type ()) + +#define PSPPIRE_DIALOG_ACTION_AUTORECODE(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ + PSPPIRE_TYPE_DIALOG_ACTION_AUTORECODE, PsppireDialogActionAutorecode)) + +#define PSPPIRE_DIALOG_ACTION_AUTORECODE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), \ + PSPPIRE_TYPE_DIALOG_ACTION_AUTORECODE, \ + PsppireDialogActionAutorecodeClass)) + + +#define PSPPIRE_IS_DIALOG_ACTION_AUTORECODE(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), PSPPIRE_TYPE_DIALOG_ACTION_AUTORECODE)) + +#define PSPPIRE_IS_DIALOG_ACTION_AUTORECODE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), PSPPIRE_TYPE_DIALOG_ACTION_AUTORECODE)) + + +#define PSPPIRE_DIALOG_ACTION_AUTORECODE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), \ + PSPPIRE_TYPE_DIALOG_ACTION_AUTORECODE, \ + PsppireDialogActionAutorecodeClass)) + +typedef struct _PsppireDialogActionAutorecode PsppireDialogActionAutorecode; +typedef struct _PsppireDialogActionAutorecodeClass PsppireDialogActionAutorecodeClass; + + +struct _PsppireDialogActionAutorecode +{ + PsppireDialogAction parent; + + /*< private >*/ + gboolean dispose_has_run ; + + + PsppireDict *dict; + GtkWidget *change_button; + GtkWidget *new_name_entry; + GtkWidget *var_view; + + /* A hash table of struct nlp's indexed by variable */ + GHashTable *varmap; + + GtkWidget *ascending; + GtkWidget *group; + GtkWidget *blank; +}; + + +struct _PsppireDialogActionAutorecodeClass +{ + PsppireDialogActionClass parent_class; +}; + + +GType psppire_dialog_action_autorecode_get_type (void) ; + +G_END_DECLS + +#endif /* __PSPPIRE_DIALOG_ACTION_AUTORECODE_H__ */ diff --git a/src/ui/gui/widgets.c b/src/ui/gui/widgets.c index 485f28be7a..1e1a8e9027 100644 --- a/src/ui/gui/widgets.c +++ b/src/ui/gui/widgets.c @@ -17,6 +17,7 @@ #include "psppire-checkbox-treeview.h" #include "psppire-dialog-action-aggregate.h" +#include "psppire-dialog-action-autorecode.h" #include "psppire-dialog-action-barchart.h" #include "psppire-dialog-action-binomial.h" #include "psppire-dialog-action-chisquare.h" @@ -73,6 +74,7 @@ preregister_widgets (void) psppire_checkbox_treeview_get_type (); psppire_dialog_action_1sks_get_type (); + psppire_dialog_action_autorecode_get_type (); psppire_dialog_action_aggregate_get_type (); psppire_dialog_action_binomial_get_type (); psppire_dialog_action_barchart_get_type (); -- 2.30.2