From: John Darrington Date: Wed, 16 Dec 2015 07:32:56 +0000 (+0100) Subject: Autorecode Dialog: Convert from add hoc to PsppireDialogAction X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?p=pspp;a=commitdiff_plain;h=da08e8b9ea6bfa772b4daec4a944279267852515 Autorecode Dialog: Convert from add hoc to PsppireDialogAction --- 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.c b/src/ui/gui/autorecode-dialog.c deleted file mode 100644 index 7b027d9bad..0000000000 --- a/src/ui/gui/autorecode-dialog.c +++ /dev/null @@ -1,404 +0,0 @@ -/* PSPPIRE - a graphical user interface for PSPP. - Copyright (C) 2011, 2012 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 "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-data-window.h" -#include "psppire-var-view.h" - -#include "executor.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 -{ - char *name; - char *label; -}; - -struct autorecode -{ - 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; -}; - -static struct nlp * -nlp_create (const char *name, const char *label) -{ - struct nlp *nlp = xmalloc (sizeof *nlp); - - nlp->name = g_strdup (name); - - nlp->label = NULL; - - if ( label != NULL && 0 != strcmp ("", label)) - nlp->label = g_strdup (label); - - return nlp; -} - -static void -nlp_destroy (gpointer data) -{ - struct nlp *nlp = data ; - if ( ! nlp ) - return; - - g_free (nlp->name); - g_free (nlp->label); - g_free (nlp); -} - -static void -on_change_clicked (GObject *obj, gpointer data) -{ - struct autorecode *rd = data; - struct variable *var = NULL; - struct nlp *nlp; - GtkTreeModel *model = psppire_var_view_get_current_model (PSPPIRE_VAR_VIEW (rd->var_view)); - GtkTreeIter iter; - GtkTreeSelection *selection = - gtk_tree_view_get_selection (GTK_TREE_VIEW (rd->var_view)); - - GList *rows = gtk_tree_selection_get_selected_rows (selection, &model); - - const gchar *dest_var_name = - gtk_entry_get_text (GTK_ENTRY (rd->new_name_entry)); - - if ( NULL == rows || rows->next != NULL) - goto finish; - - gtk_tree_model_get_iter (model, &iter, rows->data); - - gtk_tree_model_get (model, &iter, 0, &var, -1); - - g_hash_table_remove (rd->varmap, var); - - nlp = nlp_create (dest_var_name, NULL); - - g_hash_table_insert (rd->varmap, var, nlp); - - gtk_tree_model_row_changed (model, rows->data, &iter); - - finish: - g_list_foreach (rows, (GFunc) gtk_tree_path_free, NULL); - g_list_free (rows); -} - - -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) -{ - gboolean valid = TRUE; - const char *text = gtk_entry_get_text (GTK_ENTRY (rd->new_name_entry)); - - if ( 0 == strcmp ("", text)) - valid = FALSE; - else if (psppire_dict_lookup_var (rd->dict, text)) - valid = FALSE; - else - { - GHashTableIter iter; - gpointer key, value; - - g_hash_table_iter_init (&iter, rd->varmap); - while (g_hash_table_iter_next (&iter, &key, &value)) - { - struct nlp *nlp = value; - - if ( 0 == strcmp (nlp->name, text)) - { - valid = FALSE; - break; - } - } - } - - 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; - GtkTreeModel *model = psppire_var_view_get_current_model (PSPPIRE_VAR_VIEW (rd->var_view)); - - GList *rows = gtk_tree_selection_get_selected_rows (selection, &model); - - if ( rows && !rows->next) - { - /* Exactly one row is selected */ - struct nlp *nlp; - struct variable *var; - gboolean ok; - GtkTreeIter iter; - - gtk_widget_set_sensitive (rd->new_name_entry, TRUE); - gtk_widget_set_sensitive (rd->change_button, TRUE); - - - ok = gtk_tree_model_get_iter (model, &iter, (GtkTreePath*) rows->data); - g_return_if_fail (ok); - - gtk_tree_model_get (model, &iter, 0, &var, -1); - - nlp = g_hash_table_lookup (rd->varmap, var); - - if (nlp) - gtk_entry_set_text (GTK_ENTRY (rd->new_name_entry), nlp->name ? nlp->name : ""); - else - gtk_entry_set_text (GTK_ENTRY (rd->new_name_entry), ""); - } - else - { - 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); - } - - g_list_foreach (rows, (GFunc) gtk_tree_path_free, NULL); - g_list_free (rows); -} - -static void -render_new_var_name (GtkTreeViewColumn *tree_column, - GtkCellRenderer *cell, - GtkTreeModel *tree_model, - GtkTreeIter *iter, - gpointer data) -{ - struct nlp *nlp = NULL; - struct autorecode *rd = data; - - struct variable *var = NULL; - - gtk_tree_model_get (tree_model, iter, - 0, &var, - -1); - - nlp = g_hash_table_lookup (rd->varmap, var); - - if ( nlp ) - g_object_set (cell, "text", nlp->name, NULL); - else - g_object_set (cell, "text", "", NULL); -} - - - -/* Pops up the Autorecode dialog box */ -void -autorecode_dialog (PsppireDataWindow *de) -{ - 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"); - - { - GtkTreeSelection *sel; - - GtkCellRenderer *renderer = gtk_cell_renderer_text_new (); - - GtkTreeViewColumn *col = gtk_tree_view_column_new_with_attributes (_("New"), - renderer, - "text", NULL, - NULL); - - 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); - - g_object_set (col, "title", _("Old"), NULL); - - g_object_set (rd.var_view, "headers-visible", TRUE, NULL); - - rd.varmap = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, nlp_destroy); - - - sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (rd.var_view)); - - - g_signal_connect (sel, "changed", - G_CALLBACK (on_selection_change), &rd); - - g_signal_connect (rd.change_button, "clicked", - G_CALLBACK (on_change_clicked), &rd); - - g_signal_connect_swapped (rd.new_name_entry, "changed", - G_CALLBACK (on_entry_change), &rd); - - } - - - 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); - - - g_signal_connect (dialog, "refresh", G_CALLBACK (refresh), &rd); - - psppire_dialog_set_valid_predicate (PSPPIRE_DIALOG (dialog), - dialog_state_valid, &rd); - - response = psppire_dialog_run (PSPPIRE_DIALOG (dialog)); - - - 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; - } - - g_object_unref (xml); -} - - - - -static char * -generate_syntax (const struct autorecode *rd) -{ - 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; -} 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/psppire-dialog-action-autorecode.c b/src/ui/gui/psppire-dialog-action-autorecode.c new file mode 100644 index 0000000000..24cbe54210 --- /dev/null +++ b/src/ui/gui/psppire-dialog-action-autorecode.c @@ -0,0 +1,398 @@ +/* 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 "psppire-dialog-action-autorecode.h" + +#include "psppire-var-view.h" +#include +#include "psppire-dialog.h" +#include "builder-wrapper.h" + +#include "gettext.h" +#define _(msgid) gettext (msgid) +#define N_(msgid) msgid + + +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) +{ + 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); + + if (n_vars == 0) + return FALSE; + + if (g_hash_table_size (rd->varmap) != n_vars) + return FALSE; + + return TRUE; +} + +static void +refresh (PsppireDialogAction *pda) +{ + PsppireDialogActionAutorecode *rd = PSPPIRE_DIALOG_ACTION_AUTORECODE (pda); + + 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)); + + +} + +/* Name-Label pair */ +struct nlp +{ + char *name; + char *label; +}; + +static struct nlp * +nlp_create (const char *name, const char *label) +{ + struct nlp *nlp = xmalloc (sizeof *nlp); + + nlp->name = g_strdup (name); + + nlp->label = NULL; + + if ( label != NULL && 0 != strcmp ("", label)) + nlp->label = g_strdup (label); + + return nlp; +} + +static void +nlp_destroy (gpointer data) +{ + struct nlp *nlp = data ; + if ( ! nlp ) + return; + + g_free (nlp->name); + g_free (nlp->label); + 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) +{ + 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)); + GtkTreeIter iter; + GtkTreeSelection *selection = + gtk_tree_view_get_selection (GTK_TREE_VIEW (rd->var_view)); + + GList *rows = gtk_tree_selection_get_selected_rows (selection, &model); + + const gchar *dest_var_name = + gtk_entry_get_text (GTK_ENTRY (rd->new_name_entry)); + + if ( NULL == rows || rows->next != NULL) + goto finish; + + gtk_tree_model_get_iter (model, &iter, rows->data); + + gtk_tree_model_get (model, &iter, 0, &var, -1); + + g_hash_table_remove (rd->varmap, var); + + nlp = nlp_create (dest_var_name, NULL); + + g_hash_table_insert (rd->varmap, var, nlp); + + gtk_tree_model_row_changed (model, rows->data, &iter); + + finish: + g_list_foreach (rows, (GFunc) gtk_tree_path_free, NULL); + g_list_free (rows); +} + + +static void +on_entry_change (PsppireDialogActionAutorecode *rd) +{ + gboolean valid = TRUE; + const char *text = gtk_entry_get_text (GTK_ENTRY (rd->new_name_entry)); + + if ( 0 == strcmp ("", text)) + valid = FALSE; + else if (psppire_dict_lookup_var (rd->dict, text)) + valid = FALSE; + else + { + GHashTableIter iter; + gpointer key, value; + + g_hash_table_iter_init (&iter, rd->varmap); + while (g_hash_table_iter_next (&iter, &key, &value)) + { + struct nlp *nlp = value; + + if ( 0 == strcmp (nlp->name, text)) + { + valid = FALSE; + break; + } + } + } + + 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) +{ + 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); + + if ( rows && !rows->next) + { + /* Exactly one row is selected */ + struct nlp *nlp; + struct variable *var; + gboolean ok; + GtkTreeIter iter; + + gtk_widget_set_sensitive (rd->new_name_entry, TRUE); + gtk_widget_set_sensitive (rd->change_button, TRUE); + + + ok = gtk_tree_model_get_iter (model, &iter, (GtkTreePath*) rows->data); + g_return_if_fail (ok); + + gtk_tree_model_get (model, &iter, 0, &var, -1); + + nlp = g_hash_table_lookup (rd->varmap, var); + + if (nlp) + gtk_entry_set_text (GTK_ENTRY (rd->new_name_entry), nlp->name ? nlp->name : ""); + else + gtk_entry_set_text (GTK_ENTRY (rd->new_name_entry), ""); + } + else + { + 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); + } + + g_list_foreach (rows, (GFunc) gtk_tree_path_free, NULL); + g_list_free (rows); +} + + + +static void +render_new_var_name (GtkTreeViewColumn *tree_column, + GtkCellRenderer *cell, + GtkTreeModel *tree_model, + GtkTreeIter *iter, + gpointer data) +{ + struct nlp *nlp = NULL; + + PsppireDialogActionAutorecode *rd = PSPPIRE_DIALOG_ACTION_AUTORECODE (data); + + + + struct variable *var = NULL; + + gtk_tree_model_get (tree_model, iter, + 0, &var, + -1); + + nlp = g_hash_table_lookup (rd->varmap, var); + + if ( nlp ) + g_object_set (cell, "text", nlp->name, NULL); + else + g_object_set (cell, "text", "", NULL); +} + + +static void +psppire_dialog_action_autorecode_activate (GtkAction *a) +{ + 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) + { + xml = builder_new ("autorecode.ui"); + g_hash_table_insert (thing, a, xml); + + pda->dialog = get_widget_assert (xml, "autorecode-dialog"); + pda->source = get_widget_assert (xml, "dict-view"); + + + + + act->var_view = get_widget_assert (xml, "var-view"); + + 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"); + + { + GtkTreeSelection *sel; + + GtkCellRenderer *renderer = gtk_cell_renderer_text_new (); + + GtkTreeViewColumn *col = gtk_tree_view_column_new_with_attributes (_("New"), + renderer, + "text", NULL, + NULL); + + 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); + + + col = gtk_tree_view_get_column (GTK_TREE_VIEW (act->var_view), 0); + + 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); + + + sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (act->var_view)); + + + g_signal_connect (sel, "changed", + G_CALLBACK (on_selection_change), act); + + g_signal_connect (act->change_button, "clicked", + G_CALLBACK (on_change_clicked), act); + + g_signal_connect_swapped (act->new_name_entry, "changed", + G_CALLBACK (on_entry_change), act); + + } + + } + + psppire_dialog_action_set_refresh (pda, refresh); + psppire_dialog_action_set_valid_predicate (pda, dialog_state_valid); + + 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 void +psppire_dialog_action_autorecode_class_init (PsppireDialogActionAutorecodeClass *class) +{ + psppire_dialog_action_set_activation (class, psppire_dialog_action_autorecode_activate); + PSPPIRE_DIALOG_ACTION_CLASS (class)->generate_syntax = generate_syntax; +} + + +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 ();