X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-val-chooser.c;h=72ffac51119d88ae3f1943152bf0cfb36b940b45;hb=53241f59ac766997bf67870639f70afb82396640;hp=368eea32c8b0b3ccf7ba992198845c06437491af;hpb=4233ff9b1569035a8b748b3695cb865e6412e5b2;p=pspp diff --git a/src/ui/gui/psppire-val-chooser.c b/src/ui/gui/psppire-val-chooser.c index 368eea32c8..72ffac5111 100644 --- a/src/ui/gui/psppire-val-chooser.c +++ b/src/ui/gui/psppire-val-chooser.c @@ -1,5 +1,5 @@ /* PSPPIRE - a graphical user interface for PSPP. - Copyright (C) 2011 Free Software Foundation + Copyright (C) 2011, 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 @@ -16,7 +16,9 @@ #include +#include #include +#include "dialog-common.h" #include "psppire-val-chooser.h" #include "libpspp/str.h" @@ -28,43 +30,12 @@ #define _(msgid) gettext (msgid) #define N_(msgid) msgid -static void psppire_val_chooser_base_finalize (PsppireValChooserClass *, gpointer); -static void psppire_val_chooser_base_init (PsppireValChooserClass *class); static void psppire_val_chooser_class_init (PsppireValChooserClass *class); static void psppire_val_chooser_init (PsppireValChooser *vc); static void psppire_val_chooser_realize (GtkWidget *w); - - -GType -psppire_val_chooser_get_type (void) -{ - static GType psppire_val_chooser_type = 0; - - if (!psppire_val_chooser_type) - { - static const GTypeInfo psppire_val_chooser_info = - { - sizeof (PsppireValChooserClass), - (GBaseInitFunc) psppire_val_chooser_base_init, - (GBaseFinalizeFunc) psppire_val_chooser_base_finalize, - (GClassInitFunc)psppire_val_chooser_class_init, - (GClassFinalizeFunc) NULL, - NULL, - sizeof (PsppireValChooser), - 0, - (GInstanceInitFunc) psppire_val_chooser_init, - }; - - psppire_val_chooser_type = - g_type_register_static (GTK_TYPE_FRAME, "PsppireValChooser", - &psppire_val_chooser_info, 0); - } - - return psppire_val_chooser_type; -} - +G_DEFINE_TYPE (PsppireValChooser, psppire_val_chooser, GTK_TYPE_FRAME) static void psppire_val_chooser_finalize (GObject *object) @@ -77,9 +48,21 @@ enum { PROP_0, PROP_IS_STRING, + PROP_SHOW_ELSE }; +enum + { + VC_VALUE, + VC_SYSMIS, + VC_MISSING, + VC_RANGE, + VC_LOW_UP, + VC_HIGH_DOWN, + VC_ELSE + }; + static void psppire_val_chooser_set_property (GObject *object, guint prop_id, @@ -90,14 +73,20 @@ psppire_val_chooser_set_property (GObject *object, switch (prop_id) { + case PROP_SHOW_ELSE: + { + gboolean x = g_value_get_boolean (value); + gtk_widget_set_visible (GTK_WIDGET (vr->rw[VC_ELSE].rb), x); + gtk_widget_set_visible (GTK_WIDGET (vr->rw[VC_ELSE].label), x); + } + break; case PROP_IS_STRING: vr->input_var_is_string = g_value_get_boolean (value); - - gtk_widget_set_sensitive (GTK_WIDGET (vr->rw[1].rb), !vr->input_var_is_string); - gtk_widget_set_sensitive (GTK_WIDGET (vr->rw[2].rb), !vr->input_var_is_string); - gtk_widget_set_sensitive (GTK_WIDGET (vr->rw[3].rb), !vr->input_var_is_string); - gtk_widget_set_sensitive (GTK_WIDGET (vr->rw[4].rb), !vr->input_var_is_string); - gtk_widget_set_sensitive (GTK_WIDGET (vr->rw[5].rb), !vr->input_var_is_string); + gtk_widget_set_sensitive (GTK_WIDGET (vr->rw[VC_SYSMIS].rb), !vr->input_var_is_string); + gtk_widget_set_sensitive (GTK_WIDGET (vr->rw[VC_MISSING].rb), !vr->input_var_is_string); + gtk_widget_set_sensitive (GTK_WIDGET (vr->rw[VC_RANGE].rb), !vr->input_var_is_string); + gtk_widget_set_sensitive (GTK_WIDGET (vr->rw[VC_LOW_UP].rb), !vr->input_var_is_string); + gtk_widget_set_sensitive (GTK_WIDGET (vr->rw[VC_HIGH_DOWN].rb), !vr->input_var_is_string); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -116,8 +105,16 @@ psppire_val_chooser_get_property (GObject *object, switch (prop_id) { + case PROP_SHOW_ELSE: + { + gboolean x = + gtk_widget_get_visible (GTK_WIDGET (vr->rw[VC_ELSE].rb)); + g_value_set_boolean (value, x); + } + break; case PROP_IS_STRING: g_value_set_boolean (value, vr->input_var_is_string); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -131,6 +128,8 @@ static void psppire_val_chooser_class_init (PsppireValChooserClass *class) { GObjectClass *object_class = G_OBJECT_CLASS (class); + + object_class->finalize = psppire_val_chooser_finalize; GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class); GParamSpec *is_string_spec = @@ -140,6 +139,14 @@ psppire_val_chooser_class_init (PsppireValChooserClass *class) FALSE, G_PARAM_READWRITE); + GParamSpec *show_else_spec = + g_param_spec_boolean ("show-else", + "Show Else", + "Should the \"All other values\" item be visible", + TRUE, + G_PARAM_READWRITE); + + parent_class = g_type_class_peek_parent (class); object_class->set_property = psppire_val_chooser_set_property; @@ -150,24 +157,10 @@ psppire_val_chooser_class_init (PsppireValChooserClass *class) g_object_class_install_property (object_class, PROP_IS_STRING, is_string_spec); -} - - -static void -psppire_val_chooser_base_init (PsppireValChooserClass *class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (class); - - object_class->finalize = psppire_val_chooser_finalize; -} - - - -static void -psppire_val_chooser_base_finalize (PsppireValChooserClass *class, - gpointer class_data) -{ + g_object_class_install_property (object_class, + PROP_SHOW_ELSE, + show_else_spec); } @@ -198,7 +191,7 @@ static void simple_set (PsppireValChooser *vr, struct old_value *ov, const struc { const gchar *text = gtk_entry_get_text (rw->e1); - if ( vr->input_var_is_string) + if (vr->input_var_is_string) { ov->type = OV_STRING; ov->v.s = g_strdup (text); @@ -213,7 +206,7 @@ static void simple_set (PsppireValChooser *vr, struct old_value *ov, const struc static void lo_up_set (PsppireValChooser *vr, struct old_value *ov, const struct range_widgets *rw) { const gchar *text = gtk_entry_get_text (rw->e1); - + ov->type = OV_LOW_UP; ov->v.range[1] = g_strtod (text, 0); } @@ -222,7 +215,7 @@ static void lo_up_set (PsppireValChooser *vr, struct old_value *ov, const struct static void hi_down_set (PsppireValChooser *vr, struct old_value *ov, const struct range_widgets *rw) { const gchar *text = gtk_entry_get_text (rw->e1); - + ov->type = OV_HIGH_DOWN; ov->v.range[0] = g_strtod (text, 0); } @@ -250,14 +243,14 @@ static void range_set (PsppireValChooser *vr, struct old_value *ov, const struct ov->type = OV_RANGE; ov->v.range[0] = g_strtod (text, 0); - + text = gtk_entry_get_text (rw->e2); ov->v.range[1] = g_strtod (text, 0); } static GtkWidget * range_entry (struct layout *l, struct range_widgets *rw) { - GtkWidget *vbox = gtk_vbox_new (3, FALSE); + GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3); GtkWidget *entrylo = gtk_entry_new (); GtkWidget *label = gtk_label_new (_("through")); GtkWidget *entryhi = gtk_entry_new (); @@ -265,7 +258,11 @@ static GtkWidget * range_entry (struct layout *l, struct range_widgets *rw) rw->e1 = GTK_ENTRY (entrylo); rw->e2 = GTK_ENTRY (entryhi); - gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); + g_object_set (G_OBJECT (label), + "valign", GTK_ALIGN_CENTER, + "halign", GTK_ALIGN_START, + NULL); + g_signal_connect (vbox, "notify::sensitive", G_CALLBACK (focus_follows_sensitivity), entrylo); @@ -286,57 +283,60 @@ static GtkWidget * simple_entry (struct layout *l, struct range_widgets *rw) } -static struct layout range_opt[n_VAL_CHOOSER_BUTTONS]= +static struct layout range_opt[n_VAL_CHOOSER_BUTTONS]= { - {N_("Value:"), simple_entry, simple_set }, - {N_("System Missing"), NULL, sysmis_set }, - {N_("System or User Missing"), NULL, missing_set}, - {N_("Range:"), range_entry, range_set }, - {N_("Range, LOWEST thru value"), simple_entry, lo_up_set }, - {N_("Range, value thru HIGHEST"), simple_entry, hi_down_set}, - {N_("All other values"), NULL, else_set } + {N_("_Value:"), simple_entry, simple_set }, + {N_("_System Missing"), NULL, sysmis_set }, + {N_("System _or User Missing"), NULL, missing_set}, + {N_("_Range:"), range_entry, range_set }, + {N_("Range, _LOWEST thru value"), simple_entry, lo_up_set }, + {N_("Range, value thru _HIGHEST"), simple_entry, hi_down_set}, + {N_("_All other values"), NULL, else_set } }; -static void -set_sensitivity_from_toggle (GtkToggleButton *togglebutton, GtkWidget *w) -{ - gboolean active = gtk_toggle_button_get_active (togglebutton); - - gtk_widget_set_sensitive (w, active); -} - static void psppire_val_chooser_init (PsppireValChooser *vr) { gint i; - GtkWidget *aln = gtk_alignment_new (0.5, 0.5, 1.0, 1.0); - GtkWidget *table = gtk_table_new (11, 2, FALSE); + GtkWidget *grid = gtk_grid_new (); GSList *group = NULL; gint row = 0; - gtk_alignment_set_padding (GTK_ALIGNMENT (aln), 0, 0, 5, 5); + g_object_set (G_OBJECT (grid), + "margin-start", 5, + "margin-end", 5, + NULL); vr->input_var_is_string = FALSE; for (i = 0; i < n_VAL_CHOOSER_BUTTONS; ++i) { struct layout *l = &range_opt[i]; - GtkWidget *label = gtk_label_new (gettext (l->label)); + vr->rw[i].label = GTK_LABEL (gtk_label_new (gettext (l->label))); + gtk_label_set_use_underline (vr->rw[i].label, TRUE); vr->rw[i].rb = GTK_TOGGLE_BUTTON (gtk_radio_button_new (group)); + gtk_label_set_mnemonic_widget (vr->rw[i].label, GTK_WIDGET (vr->rw[i].rb)); - gtk_widget_set_sensitive (label, FALSE); - g_signal_connect (vr->rw[i].rb, "toggled", G_CALLBACK (set_sensitivity_from_toggle), label); - - gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); + g_object_set (G_OBJECT (vr->rw[i].label), + "valign", GTK_ALIGN_CENTER, + "halign", GTK_ALIGN_START, + NULL); group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (vr->rw[i].rb)); - gtk_table_attach_defaults (GTK_TABLE (table), GTK_WIDGET (vr->rw[i].rb), 0, 1, - row, row + 1); + /* Attach the buttons */ + gtk_grid_attach (GTK_GRID (grid), GTK_WIDGET (vr->rw[i].rb), + 0, row, 1, 1); + + gtk_widget_set_hexpand (GTK_WIDGET (vr->rw[i].rb), FALSE); + + /* Attach the labels */ + gtk_grid_attach (GTK_GRID (grid), GTK_WIDGET (vr->rw[i].label), + 1, row, 1, 1); + + gtk_widget_set_hexpand (GTK_WIDGET (vr->rw[i].label), TRUE); - gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 2, - row, row + 1); ++row; if (l->fill) @@ -345,8 +345,10 @@ psppire_val_chooser_init (PsppireValChooser *vr) gtk_widget_set_sensitive (fill, FALSE); - gtk_table_attach_defaults (GTK_TABLE (table), fill, 1, 2, - row, row + 1); + gtk_grid_attach (GTK_GRID (grid), fill, 1, row, 1, 1); + + gtk_widget_set_hexpand (fill, TRUE); + ++row; g_signal_connect (vr->rw[i].rb, "toggled", G_CALLBACK (set_sensitivity_from_toggle), fill); @@ -355,21 +357,11 @@ psppire_val_chooser_init (PsppireValChooser *vr) gtk_frame_set_shadow_type (GTK_FRAME (vr), GTK_SHADOW_ETCHED_IN); - gtk_container_add (GTK_CONTAINER (aln), table); - gtk_container_add (GTK_CONTAINER (vr), aln); + gtk_container_add (GTK_CONTAINER (vr), grid); - gtk_widget_show_all (aln); + gtk_widget_show_all (grid); } - -GtkWidget* -psppire_val_chooser_new (void) -{ - return GTK_WIDGET (g_object_new (psppire_val_chooser_get_type (), NULL)); -} - - - static void psppire_val_chooser_realize (GtkWidget *w) { @@ -394,7 +386,7 @@ old_value_copy (struct old_value *ov) { struct old_value *copy = g_memdup (ov, sizeof (*copy)); - if ( ov->type == OV_STRING ) + if (ov->type == OV_STRING) copy->v.s = g_strdup (ov->v.s); return copy; @@ -418,7 +410,7 @@ old_value_to_string (const GValue *src, GValue *dest) { case OV_NUMERIC: { - gchar *text = g_strdup_printf ("%g", ov->v.v); + gchar *text = g_strdup_printf ("%.*g", DBL_DIG + 1, ov->v.v); g_value_set_string (dest, text); g_free (text); } @@ -442,10 +434,10 @@ old_value_to_string (const GValue *src, GValue *dest) g_unichar_to_utf8 (0x2013, en_dash); - text = g_strdup_printf ("%g %s %g", - ov->v.range[0], - en_dash, - ov->v.range[1]); + text = g_strdup_printf ("%.*g %s %.*g", + DBL_DIG + 1, ov->v.range[0], + en_dash, + DBL_DIG + 1, ov->v.range[1]); g_value_set_string (dest, text); g_free (text); } @@ -457,9 +449,9 @@ old_value_to_string (const GValue *src, GValue *dest) g_unichar_to_utf8 (0x2013, en_dash); - text = g_strdup_printf ("LOWEST %s %g", + text = g_strdup_printf ("LOWEST %s %.*g", en_dash, - ov->v.range[1]); + DBL_DIG + 1, ov->v.range[1]); g_value_set_string (dest, text); g_free (text); @@ -472,8 +464,8 @@ old_value_to_string (const GValue *src, GValue *dest) g_unichar_to_utf8 (0x2013, en_dash); - text = g_strdup_printf ("%g %s HIGHEST", - ov->v.range[0], + text = g_strdup_printf ("%.*g %s HIGHEST", + DBL_DIG + 1, ov->v.range[0], en_dash); g_value_set_string (dest, text); @@ -492,7 +484,7 @@ old_value_get_type (void) { static GType t = 0; - if (t == 0 ) + if (t == 0) { t = g_boxed_type_register_static ("psppire-recode-old-values", (GBoxedCopyFunc) old_value_copy, @@ -509,46 +501,46 @@ old_value_get_type (void) /* Generate a syntax fragment for NV and append it to STR */ void -old_value_append_syntax (GString *str, const struct old_value *ov) +old_value_append_syntax (struct string *str, const struct old_value *ov) { switch (ov->type) { case OV_NUMERIC: - g_string_append_printf (str, "%g", ov->v.v); + ds_put_c_format (str, "%.*g", DBL_DIG + 1, ov->v.v); break; case OV_STRING: { struct string ds = DS_EMPTY_INITIALIZER; syntax_gen_string (&ds, ss_cstr (ov->v.s)); - g_string_append (str, ds_cstr (&ds)); + ds_put_cstr (str, ds_cstr (&ds)); ds_destroy (&ds); } break; case OV_MISSING: - g_string_append (str, "MISSING"); + ds_put_cstr (str, "MISSING"); break; case OV_SYSMIS: - g_string_append (str, "SYSMIS"); + ds_put_cstr (str, "SYSMIS"); break; case OV_ELSE: - g_string_append (str, "ELSE"); + ds_put_cstr (str, "ELSE"); break; case OV_RANGE: - g_string_append_printf (str, "%g THRU %g", - ov->v.range[0], - ov->v.range[1]); + ds_put_c_format (str, "%.*g THRU %.*g", + DBL_DIG + 1, ov->v.range[0], + DBL_DIG + 1, ov->v.range[1]); break; case OV_LOW_UP: - g_string_append_printf (str, "LOWEST THRU %g", - ov->v.range[1]); + ds_put_c_format (str, "LOWEST THRU %.*g", + DBL_DIG + 1, ov->v.range[1]); break; case OV_HIGH_DOWN: - g_string_append_printf (str, "%g THRU HIGHEST", - ov->v.range[0]); + ds_put_c_format (str, "%.*g THRU HIGHEST", + DBL_DIG + 1, ov->v.range[0]); break; default: g_warning ("Invalid type in old recode value"); - g_string_append (str, "???"); + ds_put_cstr (str, "???"); break; }; } @@ -563,13 +555,12 @@ psppire_val_chooser_get_status (PsppireValChooser *vr, struct old_value *ov) for (i = 0; i < n_VAL_CHOOSER_BUTTONS; ++i) { - if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (vr->rw[i].rb))) + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (vr->rw[i].rb))) { + range_opt[i].set (vr, ov, &vr->rw[i]); break; } } - - range_opt[i].set (vr, ov, &vr->rw[i]); } /* This might need to be changed to something less naive. @@ -578,7 +569,7 @@ psppire_val_chooser_get_status (PsppireValChooser *vr, struct old_value *ov) static gchar * num_to_string (gdouble x) { - return g_strdup_printf ("%g", x); + return g_strdup_printf ("%.*g", DBL_DIG + 1, x); } @@ -587,7 +578,7 @@ void psppire_val_chooser_set_status (PsppireValChooser *vr, const struct old_value *ov) { gint i; - if ( !ov ) + if (!ov) return; for (i = 0; i < n_VAL_CHOOSER_BUTTONS; ++i) @@ -605,37 +596,37 @@ psppire_val_chooser_set_status (PsppireValChooser *vr, const struct old_value *o gtk_toggle_button_set_active (vr->rw[0].rb, TRUE); gtk_entry_set_text (vr->rw[0].e1, ov->v.s); break; - + case OV_NUMERIC: { gchar *str; gtk_toggle_button_set_active (vr->rw[0].rb, TRUE); - + str = num_to_string (ov->v.v); - + gtk_entry_set_text (vr->rw[0].e1, str); g_free (str); } break; case OV_SYSMIS: - gtk_toggle_button_set_active (vr->rw[1].rb, TRUE); + gtk_toggle_button_set_active (vr->rw[VC_SYSMIS].rb, TRUE); break; case OV_MISSING: - gtk_toggle_button_set_active (vr->rw[2].rb, TRUE); + gtk_toggle_button_set_active (vr->rw[VC_MISSING].rb, TRUE); break; case OV_RANGE: { gchar *str = num_to_string (ov->v.range[0]); - gtk_toggle_button_set_active (vr->rw[3].rb, TRUE); - gtk_entry_set_text (vr->rw[3].e1, str); + gtk_toggle_button_set_active (vr->rw[VC_RANGE].rb, TRUE); + gtk_entry_set_text (vr->rw[VC_RANGE].e1, str); g_free (str); str = num_to_string (ov->v.range[1]); - gtk_entry_set_text (vr->rw[3].e2, str); + gtk_entry_set_text (vr->rw[VC_RANGE].e2, str); g_free (str); } break; @@ -644,9 +635,9 @@ psppire_val_chooser_set_status (PsppireValChooser *vr, const struct old_value *o { gchar *str = num_to_string (ov->v.range[1]); - gtk_toggle_button_set_active (vr->rw[4].rb, TRUE); + gtk_toggle_button_set_active (vr->rw[VC_LOW_UP].rb, TRUE); - gtk_entry_set_text (vr->rw[4].e1, str); + gtk_entry_set_text (vr->rw[VC_LOW_UP].e1, str); g_free (str); } @@ -657,16 +648,16 @@ psppire_val_chooser_set_status (PsppireValChooser *vr, const struct old_value *o { gchar *str = num_to_string (ov->v.range[0]); - gtk_toggle_button_set_active (vr->rw[5].rb, TRUE); + gtk_toggle_button_set_active (vr->rw[VC_HIGH_DOWN].rb, TRUE); - gtk_entry_set_text (vr->rw[5].e1, str); + gtk_entry_set_text (vr->rw[VC_HIGH_DOWN].e1, str); g_free (str); } break; case OV_ELSE: - gtk_toggle_button_set_active (vr->rw[6].rb, TRUE); + gtk_toggle_button_set_active (vr->rw[VC_ELSE].rb, TRUE); break; default: