X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fdescriptives-dialog.c;h=a1e65ea7d7971a9fbb4643dac59ccfabad308628;hb=66153a44d861ccddf6a176ec5a94ffb959232ad6;hp=5ed92d9de90c985d5ee10d760cbad366dd6ee874;hpb=8b0cdf4988c831dd83209819fe32adee59ad1c72;p=pspp-builds.git diff --git a/src/ui/gui/descriptives-dialog.c b/src/ui/gui/descriptives-dialog.c index 5ed92d9d..a1e65ea7 100644 --- a/src/ui/gui/descriptives-dialog.c +++ b/src/ui/gui/descriptives-dialog.c @@ -16,38 +16,25 @@ #include +#include "checkbox-treeview.h" #include "descriptives-dialog.h" #include -#include #include #include -#include +#include #include #include #include #include #include -#include +#include "executor.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) msgid -enum - { - COLUMN_LABEL, - COLUMN_SELECTED, - N_STAT_COLUMNS - }; - -struct descriptive_stat - { - const char *name; - const char *label; - }; - #define DESCRIPTIVE_STATS \ DS (MEAN, N_("Mean")) \ DS (STDDEV, N_("Standard deviation")) \ @@ -77,7 +64,8 @@ enum B_DS_DEFAULT = B_DS_MEAN | B_DS_STDDEV | B_DS_MINIMUM | B_DS_MAXIMUM }; -static const struct descriptive_stat stats[] = + +static const struct checkbox_entry_item stats[] = { #define DS(NAME, LABEL) {#NAME, LABEL}, DESCRIPTIVE_STATS @@ -107,7 +95,8 @@ refresh (PsppireDialog *dialog, struct descriptives_dialog *scd) for (i = 0, ok = gtk_tree_model_get_iter_first (scd->stats, &iter); ok; i++, ok = gtk_tree_model_iter_next (scd->stats, &iter)) - gtk_list_store_set (GTK_LIST_STORE (scd->stats), &iter, COLUMN_SELECTED, + gtk_list_store_set (GTK_LIST_STORE (scd->stats), &iter, + CHECKBOX_COLUMN_SELECTED, (B_DS_DEFAULT & (1u << i)) ? true : false, -1); gtk_toggle_button_set_active (scd->exclude_missing_listwise, false); @@ -128,7 +117,7 @@ generate_syntax (const struct descriptives_dialog *scd) string = g_string_new ("DESCRIPTIVES"); g_string_append (string, "\n /VARIABLES="); - append_variable_names (string, scd->dict, GTK_TREE_VIEW (scd->stat_vars)); + append_variable_names (string, scd->dict, GTK_TREE_VIEW (scd->stat_vars), 0); listwise = gtk_toggle_button_get_active (scd->exclude_missing_listwise); include = gtk_toggle_button_get_active (scd->include_user_missing); @@ -150,7 +139,8 @@ generate_syntax (const struct descriptives_dialog *scd) i++, ok = gtk_tree_model_iter_next (scd->stats, &iter)) { gboolean toggled; - gtk_tree_model_get (scd->stats, &iter, COLUMN_SELECTED, &toggled, -1); + gtk_tree_model_get (scd->stats, &iter, + CHECKBOX_COLUMN_SELECTED, &toggled, -1); if (toggled) selected |= 1u << i; } @@ -193,98 +183,18 @@ generate_syntax (const struct descriptives_dialog *scd) return text; } -/* A GtkTreeCellDataFunc which renders a checkbox that determines - whether to calculate the statistic. */ -static void -stat_calculate_cell_data_func (GtkTreeViewColumn *col, - GtkCellRenderer *cell, - GtkTreeModel *model, - GtkTreeIter *iter, - gpointer data) -{ - gboolean selected; - - gtk_tree_model_get (model, iter, COLUMN_SELECTED, &selected, -1); - g_object_set (cell, "active", selected, NULL); -} - -/* Callback for checkbox cells in the statistics tree view. - Toggles the checkbox. */ -static void -toggle (GtkCellRendererToggle *cell_renderer, gchar *path_str, gpointer data) -{ - GtkTreeModel *model = (GtkTreeModel *)data; - GtkTreeIter iter; - GtkTreePath *path = gtk_tree_path_new_from_string (path_str); - gboolean selected; - - gtk_tree_model_get_iter (model, &iter, path); - gtk_tree_model_get (model, &iter, COLUMN_SELECTED, &selected, -1); - gtk_list_store_set (GTK_LIST_STORE (model), &iter, COLUMN_SELECTED, - !selected, -1); - gtk_tree_path_free (path); -} - -/* A GtkTreeCellDataFunc which renders the label of the statistic. */ -static void -stat_label_cell_data_func (GtkTreeViewColumn *col, - GtkCellRenderer *cell, - GtkTreeModel *model, - GtkTreeIter *iter, - gpointer statistic) -{ - gchar *label = NULL; - gtk_tree_model_get (model, iter, COLUMN_LABEL, &label, -1); - g_object_set (cell, "text", gettext (label), NULL); - g_free (label); -} -static void -put_statistics_in_treeview (GtkTreeView *treeview) +/* Dialog is valid iff at least one variable has been selected */ +static gboolean +dialog_state_valid (gpointer data) { - GtkTreeViewColumn *col; - GtkCellRenderer *renderer; - GtkListStore *list; - size_t i; + struct descriptives_dialog *dd = data; - list = gtk_list_store_new (N_STAT_COLUMNS, G_TYPE_STRING, G_TYPE_BOOLEAN); - gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), GTK_TREE_MODEL (list)); + GtkTreeModel *vars = gtk_tree_view_get_model (dd->stat_vars); - for (i = 0; i < sizeof stats / sizeof *stats; i++) - { - GtkTreeIter iter; - gtk_list_store_append (list, &iter); - gtk_list_store_set (list, &iter, - COLUMN_LABEL, stats[i].label, - COLUMN_SELECTED, (B_DS_DEFAULT & (1u << i)) != 0, - -1); - } + GtkTreeIter notused; - /* Calculate column. */ - col = gtk_tree_view_column_new (); - renderer = gtk_cell_renderer_toggle_new (); - g_signal_connect (GTK_CELL_RENDERER_TOGGLE (renderer), - "toggled", G_CALLBACK (toggle), GTK_TREE_MODEL (list)); - gtk_tree_view_column_pack_start (col, renderer, TRUE); - gtk_tree_view_column_set_cell_data_func (col, renderer, - stat_calculate_cell_data_func, - NULL, NULL); - gtk_tree_view_append_column (treeview, col); - - /* Statistic column. */ - col = gtk_tree_view_column_new (); - gtk_tree_view_column_set_title (col, _("Statistic")); - renderer = gtk_cell_renderer_text_new (); - gtk_tree_view_column_pack_start (col, renderer, TRUE); - gtk_tree_view_column_set_cell_data_func (col, renderer, - stat_label_cell_data_func, - NULL, NULL); - g_object_set (renderer, "ellipsize-set", TRUE, NULL); - g_object_set (renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL); - gtk_tree_view_column_set_min_width (col, 150); - gtk_tree_view_column_set_sizing (col, GTK_TREE_VIEW_COLUMN_AUTOSIZE); - gtk_tree_view_column_set_resizable (col, true); - gtk_tree_view_append_column (treeview, col); + return gtk_tree_model_get_iter_first (vars, ¬used); } /* Pops up the Descriptives dialog box */ @@ -292,11 +202,11 @@ void descriptives_dialog (GObject *o, gpointer data) { gint response; - struct data_editor *de = data; + PsppireDataWindow *de = PSPPIRE_DATA_WINDOW (data); struct descriptives_dialog scd; - GladeXML *xml = XML_NEW ("descriptives-dialog.glade"); + GtkBuilder *xml = builder_new ("descriptives-dialog.ui"); GtkWidget *dialog = get_widget_assert (xml, "descriptives-dialog"); @@ -305,32 +215,38 @@ descriptives_dialog (GObject *o, gpointer data) GtkWidget *selector = get_widget_assert (xml, "stat-var-selector"); GtkWidget *dest = get_widget_assert (xml, "stat-variables"); - GtkWidget *stats = get_widget_assert (xml, "statistics"); + GtkWidget *stats_treeview = get_widget_assert (xml, "statistics"); + + PsppireVarStore *vs = NULL; + PsppireDict *dict; - GtkSheet *var_sheet = - GTK_SHEET (get_widget_assert (de->xml, "variable_sheet")); + g_object_get (de->data_editor, "var-store", &vs, NULL); + g_object_get (vs, "dictionary", &dict, NULL); - PsppireVarStore *vs = PSPPIRE_VAR_STORE (gtk_sheet_get_model (var_sheet)); + gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de)); - gtk_window_set_transient_for (GTK_WINDOW (dialog), de->parent.window); - attach_dictionary_to_treeview (GTK_TREE_VIEW (source), - vs->dict, - GTK_SELECTION_MULTIPLE, var_is_numeric); + g_object_set (source, "dictionary", dict, + "predicate", var_is_numeric, NULL); - set_dest_model (GTK_TREE_VIEW (dest), vs->dict); + set_dest_model (GTK_TREE_VIEW (dest), dict); psppire_selector_set_subjects (PSPPIRE_SELECTOR (selector), source, dest, insert_source_row_into_tree_view, + NULL, NULL); - put_statistics_in_treeview (GTK_TREE_VIEW (stats)); + put_checkbox_items_in_treeview (GTK_TREE_VIEW (stats_treeview), + B_DS_DEFAULT, + N_DESCRIPTIVE_STATS, stats); scd.stat_vars = GTK_TREE_VIEW (dest); - scd.stats = gtk_tree_view_get_model (GTK_TREE_VIEW (stats)); - scd.dict = vs->dict; + scd.stats = gtk_tree_view_get_model (GTK_TREE_VIEW (stats_treeview)); + + g_object_get (vs, "dictionary", &scd.dict, NULL); + scd.include_user_missing = GTK_TOGGLE_BUTTON (get_widget_assert (xml, "include_user_missing")); scd.exclude_missing_listwise = @@ -340,6 +256,9 @@ descriptives_dialog (GObject *o, gpointer data) g_signal_connect (dialog, "refresh", G_CALLBACK (refresh), &scd); + psppire_dialog_set_valid_predicate (PSPPIRE_DIALOG (dialog), + dialog_state_valid, &scd); + response = psppire_dialog_run (PSPPIRE_DIALOG (dialog)); @@ -348,6 +267,7 @@ descriptives_dialog (GObject *o, gpointer data) case GTK_RESPONSE_OK: { gchar *syntax = generate_syntax (&scd); + struct getl_interface *sss = create_syntax_string_source (syntax); execute_syntax (sss); @@ -357,12 +277,7 @@ descriptives_dialog (GObject *o, gpointer data) case PSPPIRE_RESPONSE_PASTE: { gchar *syntax = generate_syntax (&scd); - - struct syntax_editor *se = - (struct syntax_editor *) window_create (WINDOW_SYNTAX, NULL); - - gtk_text_buffer_insert_at_cursor (se->buffer, syntax, -1); - + paste_syntax_in_new_window (syntax); g_free (syntax); } break;