X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Faggregate-dialog.c;h=c6f5ad838f925ab61b6d6d53a06b211f7980e13f;hb=89cbb0a7f4f31bc826621ffff9138fc4743f2b11;hp=a8d1d20e51ccde9faa5055100820c7b5be76f97d;hpb=494a7a7063d75ed67bc88482236a234af2022ac5;p=pspp diff --git a/src/ui/gui/aggregate-dialog.c b/src/ui/gui/aggregate-dialog.c index a8d1d20e51..c6f5ad838f 100644 --- a/src/ui/gui/aggregate-dialog.c +++ b/src/ui/gui/aggregate-dialog.c @@ -1,5 +1,5 @@ /* PSPPIRE - a graphical user interface for PSPP. - Copyright (C) 2010 Free Software Foundation + Copyright (C) 2010, 2011, 2012, 2013, 2014 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 @@ -17,8 +17,9 @@ #include #include "dialog-common.h" -#include +#include +#include #include #include @@ -36,6 +37,7 @@ #include "dict-display.h" #include "executor.h" +#include "builder-wrapper.h" #include "helper.h" #include @@ -85,21 +87,14 @@ struct aggregate GtkWidget *sorted_button; GtkWidget *needs_sort_button; + + GtkWidget *pane; }; static char * generate_syntax (const struct aggregate *rd); -/* Makes widget W's sensitivity follow the active state of TOGGLE */ -static void -sensitive_if_active (GtkToggleButton *toggle, GtkWidget *w) -{ - gboolean active = gtk_toggle_button_get_active (toggle); - - gtk_widget_set_sensitive (w, active); -} - static void update_arguments (struct aggregate *agg); @@ -120,9 +115,10 @@ refresh (struct aggregate *agg) gtk_entry_set_text (GTK_ENTRY (agg->summary_arg1_entry), ""); gtk_entry_set_text (GTK_ENTRY (agg->summary_arg2_entry), ""); gtk_entry_set_text (GTK_ENTRY (agg->summary_var_label_entry), ""); - gtk_entry_set_text (GTK_ENTRY (agg->summary_var_name_entry), ""); + gtk_entry_set_text (GTK_ENTRY (agg->summary_var_name_entry), "N_BREAK"); + gtk_editable_select_region (GTK_EDITABLE (agg->summary_var_name_entry), 0, -1); - gtk_combo_box_set_active (GTK_COMBO_BOX (agg->function_combo), -1); + gtk_combo_box_set_active (GTK_COMBO_BOX (agg->function_combo), N); gtk_list_store_clear (PSPPIRE_ACR (agg->summary_acr)->list_store); @@ -157,25 +153,30 @@ choose_filename (struct aggregate *fd) GtkFileFilter *filter; GtkWidget *dialog = gtk_file_chooser_dialog_new (_("Aggregate destination file"), - GTK_WINDOW (fd->de), - GTK_FILE_CHOOSER_ACTION_SAVE, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, - NULL); + GTK_WINDOW (fd->de), + GTK_FILE_CHOOSER_ACTION_SAVE, + _("Cancel"), GTK_RESPONSE_CANCEL, + _("Save"), GTK_RESPONSE_ACCEPT, + NULL); + + g_object_set (dialog, "local-only", FALSE, NULL); gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dialog), TRUE); filter = gtk_file_filter_new (); gtk_file_filter_set_name (filter, _("System Files (*.sav)")); - gtk_file_filter_add_pattern (filter, "*.sav"); - gtk_file_filter_add_pattern (filter, "*.SAV"); + gtk_file_filter_add_mime_type (filter, "application/x-spss-sav"); + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter); + + filter = gtk_file_filter_new (); + gtk_file_filter_set_name (filter, _("Compressed System Files (*.zsav)")); + gtk_file_filter_add_pattern (filter, "*.zsav"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter); filter = gtk_file_filter_new (); gtk_file_filter_set_name (filter, _("Portable Files (*.por) ")); - gtk_file_filter_add_pattern (filter, "*.por"); - gtk_file_filter_add_pattern (filter, "*.POR"); + gtk_file_filter_add_mime_type (filter, "application/x-spss-por"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter); @@ -211,7 +212,7 @@ populate_combo_model (GtkComboBox *cb) gtk_list_store_append (list, &iter); gtk_list_store_set (list, &iter, - COMBO_MODEL_COL_DESC, s, + COMBO_MODEL_COL_DESC, gettext (s), COMBO_MODEL_COL_SYNTAX, af->name, COMBO_MODEL_COL_SRC_VARS, af->src_vars, COMBO_MODEL_COL_ARITY, af->n_args, @@ -224,6 +225,7 @@ populate_combo_model (GtkComboBox *cb) gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (cb), renderer, "text", 0); gtk_combo_box_set_model (GTK_COMBO_BOX (cb), GTK_TREE_MODEL (list)); + g_object_unref (list); } @@ -432,19 +434,32 @@ on_acr_change (const struct aggregate *agg, GtkTreeView *tv) gtk_entry_set_text (GTK_ENTRY (agg->summary_var_label_entry), label); gtk_entry_set_text (GTK_ENTRY (agg->summary_sv_entry), srcvar); - text = g_strdup_printf ("%g", arg1); + text = c_xasprintf ("%.*g", DBL_DIG + 1, arg1); gtk_entry_set_text (GTK_ENTRY (agg->summary_arg1_entry), text); g_free (text); - text = g_strdup_printf ("%g", arg2); + text = c_xasprintf ("%.*g", DBL_DIG + 1, arg2); gtk_entry_set_text (GTK_ENTRY (agg->summary_arg2_entry), text); g_free (text); - gtk_combo_box_set_active (GTK_COMBO_BOX (agg->function_combo), f_idx); } +/* Set the pane to 50% of its maximum size */ +static void +set_initial_pos (GtkPaned *pane) +{ + int max_pos; + g_object_get (pane, + "max-position", &max_pos, + NULL); + + gtk_paned_set_position (pane, max_pos); +} + + + /* Pops up the Aggregate dialog box */ void aggregate_dialog (PsppireDataWindow *dw) @@ -452,8 +467,6 @@ aggregate_dialog (PsppireDataWindow *dw) struct aggregate fd; gint response; - PsppireVarStore *vs; - GtkWidget *dialog ; GtkWidget *source ; @@ -467,6 +480,8 @@ aggregate_dialog (PsppireDataWindow *dw) source = get_widget_assert (fd.xml, "dict-view"); break_selector = get_widget_assert (fd.xml, "break-selector"); + fd.pane = get_widget_assert (fd.xml, "hbox1"); + fd.break_variables = get_widget_assert (fd.xml, "psppire-var-view1"); fd.filename_radiobutton = get_widget_assert (fd.xml, "filename-radiobutton"); fd.filename_button = get_widget_assert (fd.xml, "filename-button"); @@ -509,13 +524,14 @@ aggregate_dialog (PsppireDataWindow *dw) G_TYPE_DOUBLE); psppire_acr_set_model (PSPPIRE_ACR (fd.summary_acr), list); + g_object_unref (list); psppire_acr_set_get_value_func (PSPPIRE_ACR (fd.summary_acr), get_summary_spec, &fd); column = gtk_tree_view_get_column (PSPPIRE_ACR (fd.summary_acr)->tv, 0); - l = gtk_tree_view_column_get_cell_renderers (column); + l = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column)); cell_renderer = l->data; @@ -535,6 +551,10 @@ aggregate_dialog (PsppireDataWindow *dw) g_signal_connect_swapped (fd.summary_arg1_entry, "changed", G_CALLBACK (update_acr), &fd); g_signal_connect_swapped (fd.summary_arg2_entry, "changed", G_CALLBACK (update_acr), &fd); + + g_signal_connect (fd.pane, "realize", G_CALLBACK (set_initial_pos), &fd); + + g_signal_connect_swapped (fd.function_combo, "changed", G_CALLBACK (update_arguments), &fd); @@ -542,11 +562,9 @@ aggregate_dialog (PsppireDataWindow *dw) g_signal_connect_swapped (dialog, "refresh", G_CALLBACK (refresh), &fd); - g_object_get (fd.de->data_editor, "var-store", &vs, NULL); - gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (fd.de)); - g_object_get (vs, "dictionary", &fd.dict, NULL); + g_object_get (fd.de->data_editor, "dictionary", &fd.dict, NULL); g_object_set (source, "model", fd.dict, NULL); @@ -557,7 +575,7 @@ aggregate_dialog (PsppireDataWindow *dw) dialog_state_valid, &fd); g_signal_connect (fd.filename_radiobutton, "toggled", - G_CALLBACK (sensitive_if_active), fd.filename_box ); + G_CALLBACK (set_sensitivity_from_toggle), fd.filename_box ); g_signal_connect_swapped (fd.filename_button, "clicked", G_CALLBACK (choose_filename), &fd); @@ -568,22 +586,10 @@ aggregate_dialog (PsppireDataWindow *dw) switch (response) { case GTK_RESPONSE_OK: - { - gchar *syntax = generate_syntax (&fd); - - struct getl_interface *sss = create_syntax_string_source (syntax); - execute_syntax (sss); - - g_free (syntax); - } + g_free (execute_syntax_string (dw, generate_syntax (&fd))); break; case PSPPIRE_RESPONSE_PASTE: - { - gchar *syntax = generate_syntax (&fd); - paste_syntax_to_window (syntax); - - g_free (syntax); - } + g_free (paste_syntax_to_window (generate_syntax (&fd))); break; default: break; @@ -623,8 +629,8 @@ static void append_summary_spec (const struct aggregate *agg, GtkTreeIter *iter, GString *string) { GtkTreeIter combo_iter; - const char *varname; - const char *funcname; + char *varname = NULL; + char *funcname = NULL; GtkTreeModel *acr_model = GTK_TREE_MODEL (PSPPIRE_ACR (agg->summary_acr)->list_store); GtkTreeModel *combo_model = gtk_combo_box_get_model (GTK_COMBO_BOX (agg->function_combo)); @@ -635,8 +641,8 @@ append_summary_spec (const struct aggregate *agg, GtkTreeIter *iter, GString *st double arg1, arg2; int arity; enum agr_src_vars has_src_vars; - const gchar *label ; - const gchar *srcvar ; + gchar *label = NULL; + gchar *srcvar = NULL; gtk_tree_model_get (acr_model, iter, SUMMARY_COL_VARNAME, &varname, @@ -671,18 +677,28 @@ append_summary_spec (const struct aggregate *agg, GtkTreeIter *iter, GString *st if ( has_src_vars != AGR_SV_NO) { - g_string_append (string, " ("); + struct string dss; + ds_init_cstr (&dss, " ("); - g_string_append (string, srcvar); + ds_put_cstr (&dss, srcvar); if ( arity > 0) - g_string_append_printf (string, ", %g", arg1); + ds_put_c_format (&dss, ", %.*g", DBL_DIG + 1, arg1); if ( arity > 1) - g_string_append_printf (string, ", %g", arg2); + ds_put_c_format (&dss, ", %.*g", DBL_DIG + 1, arg2); + + ds_put_cstr (&dss, ")"); - g_string_append (string, ")"); + g_string_append (string, ds_cstr (&dss)); + + ds_destroy (&dss); } + + free (label); + free (srcvar); + free (varname); + free (funcname); }