X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-value-entry.c;h=f3d7f99a8e6b9db5948e743b155c8b42bb95a6c7;hb=37c21ba9301956091823dea7d84ff0400330bd4b;hp=322cb3a3b4eb13cfea28f9f05a0792b96ac7d47f;hpb=e79b9dda31cb2787df235503759a183540d9b413;p=pspp diff --git a/src/ui/gui/psppire-value-entry.c b/src/ui/gui/psppire-value-entry.c index 322cb3a3b4..f3d7f99a8e 100644 --- a/src/ui/gui/psppire-value-entry.c +++ b/src/ui/gui/psppire-value-entry.c @@ -28,7 +28,7 @@ static void psppire_value_entry_finalize (GObject *); G_DEFINE_TYPE (PsppireValueEntry, psppire_value_entry, - GTK_TYPE_COMBO_BOX_ENTRY); + GTK_TYPE_COMBO_BOX); enum { @@ -48,6 +48,12 @@ enum PROP_WIDTH }; +enum {EDIT_DONE, /* Emitted when the entry has changed and is ready to be fetched */ + n_SIGNALS}; + +static guint signals [n_SIGNALS]; + + static void psppire_value_entry_set_property (GObject *object, guint prop_id, @@ -72,7 +78,10 @@ psppire_value_entry_set_property (GObject *object, break; case PROP_FORMAT: - psppire_value_entry_set_format (obj, g_value_get_boxed (value)); + { + const struct fmt_spec *f = g_value_get_boxed (value); + psppire_value_entry_set_format (obj, *f); + } break; case PROP_ENCODING: @@ -129,15 +138,71 @@ psppire_value_entry_get_property (GObject *object, } } +static void +psppire_value_entry_text_changed (GtkEntryBuffer *buffer, + GParamSpec *pspec, + PsppireValueEntry *obj) +{ + obj->cur_value = NULL; +} + +static void +on_entry_activate (GtkWidget *w) +{ + g_signal_emit (w, signals [EDIT_DONE], 0); +} + +static void +on_realize (GtkWidget *w) +{ + GtkEntry *entry = GTK_ENTRY (gtk_bin_get_child (GTK_BIN (w))); + GtkEntryBuffer *buffer = gtk_entry_get_buffer (entry); + + gtk_combo_box_set_entry_text_column (GTK_COMBO_BOX (w), COL_LABEL); + + g_signal_connect (buffer, "notify::text", + G_CALLBACK (psppire_value_entry_text_changed), w); + + g_signal_connect_swapped (entry, "activate", + G_CALLBACK (on_entry_activate), w); + + gtk_widget_set_can_focus (GTK_WIDGET (entry), TRUE); + + GTK_WIDGET_CLASS (psppire_value_entry_parent_class)->realize (w); +} + + +/* + The "has-entry" property for the parent class (GTK_COMBO_BOX) is + a) Construct-only ; and b) defaults to FALSE. + We want it to default to TRUE. So we override it here. +*/ +static GObject* +my_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam *construct_properties) +{ + GObject *o = + G_OBJECT_CLASS (psppire_value_entry_parent_class)->constructor + (type, n_construct_properties, construct_properties); + + g_object_set (o, "has-entry", TRUE, NULL); + + return o; +} + static void psppire_value_entry_class_init (PsppireValueEntryClass *class) { - GObjectClass *gobject_class; - gobject_class = G_OBJECT_CLASS (class); + GObjectClass *gobject_class = G_OBJECT_CLASS (class); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class); + gobject_class->finalize = psppire_value_entry_finalize; gobject_class->set_property = psppire_value_entry_set_property; gobject_class->get_property = psppire_value_entry_get_property; + gobject_class->constructor = my_constructor; + widget_class->realize = on_realize; g_object_class_install_property ( gobject_class, PROP_SHOW_VALUE_LABEL, @@ -195,31 +260,26 @@ psppire_value_entry_class_init (PsppireValueEntryClass *class) 0, MAX_STRING, 0, G_PARAM_READABLE | G_PARAM_WRITABLE)); -} -static void -psppire_value_entry_text_changed (GtkEntryBuffer *buffer, - GParamSpec *pspec, - PsppireValueEntry *obj) -{ - obj->cur_value = NULL; + signals [EDIT_DONE] = + g_signal_new ("edit-done", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_FIRST, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, + 0); } static void psppire_value_entry_init (PsppireValueEntry *obj) { - GtkEntry *entry = GTK_ENTRY (gtk_bin_get_child (GTK_BIN (obj))); - GtkEntryBuffer *buffer = gtk_entry_get_buffer (entry); - obj->show_value_label = true; obj->val_labs = NULL; obj->format = F_8_0; obj->encoding = NULL; obj->cur_value = NULL; - gtk_combo_box_entry_set_text_column (GTK_COMBO_BOX_ENTRY (obj), COL_LABEL); - - g_signal_connect (buffer, "notify::text", - G_CALLBACK (psppire_value_entry_text_changed), obj); } static void @@ -280,6 +340,8 @@ psppire_value_entry_refresh_model (PsppireValueEntry *obj) } gtk_combo_box_set_model (GTK_COMBO_BOX (obj), model); + if (model != NULL) + g_object_unref (model); } void @@ -306,7 +368,7 @@ psppire_value_entry_set_variable (PsppireValueEntry *obj, if (var != NULL) { psppire_value_entry_set_value_labels (obj, var_get_value_labels (var)); - obj->format = *var_get_print_format (var); + obj->format = var_get_print_format (var); psppire_value_entry_set_encoding (obj, var_get_encoding (var)); } else @@ -327,7 +389,7 @@ psppire_value_entry_set_value_labels (PsppireValueEntry *obj, if (val_labs != NULL) { int width = val_labs_get_width (val_labs); - if (width != fmt_var_width (&obj->format)) + if (width != fmt_var_width (obj->format)) obj->format = fmt_default_for_width (width); } @@ -345,12 +407,12 @@ psppire_value_entry_get_value_labels (const PsppireValueEntry *obj) void psppire_value_entry_set_format (PsppireValueEntry *obj, - const struct fmt_spec *format) + struct fmt_spec format) { - if (!fmt_equal (format, &obj->format)) + if (!fmt_equal (format, obj->format)) { obj->cur_value = NULL; - obj->format = *format; + obj->format = format; if (obj->val_labs && val_labs_get_width (obj->val_labs) != fmt_var_width (format)) @@ -360,10 +422,10 @@ psppire_value_entry_set_format (PsppireValueEntry *obj, } } -const struct fmt_spec * +struct fmt_spec psppire_value_entry_get_format (const PsppireValueEntry *obj) { - return &obj->format; + return obj->format; } void @@ -385,17 +447,17 @@ psppire_value_entry_get_encoding (const PsppireValueEntry *obj) void psppire_value_entry_set_width (PsppireValueEntry *obj, int width) { - if (width != fmt_var_width (&obj->format)) + if (width != fmt_var_width (obj->format)) { struct fmt_spec format = fmt_default_for_width (width); - psppire_value_entry_set_format (obj, &format); + psppire_value_entry_set_format (obj, format); } } int psppire_value_entry_get_width (const PsppireValueEntry *obj) { - return fmt_var_width (&obj->format); + return fmt_var_width (obj->format); } void @@ -407,6 +469,10 @@ psppire_value_entry_set_value (PsppireValueEntry *obj, gchar *string; obj->cur_value = NULL; + + if (value == NULL) + return; + if (obj->show_value_label) { struct val_lab *vl = val_labs_lookup (obj->val_labs, value); @@ -418,7 +484,7 @@ psppire_value_entry_set_value (PsppireValueEntry *obj, } } - string = value_to_text__ (*value, &obj->format, obj->encoding); + string = value_to_text__ (*value, obj->format, obj->encoding); gtk_entry_set_text (entry, string); g_free (string); } @@ -431,7 +497,7 @@ psppire_value_entry_get_value (PsppireValueEntry *obj, GtkEntry *entry = GTK_ENTRY (gtk_bin_get_child (GTK_BIN (obj))); GtkTreeIter iter; - g_return_val_if_fail (fmt_var_width (&obj->format) == width, FALSE); + g_return_val_if_fail (fmt_var_width (obj->format) == width, FALSE); if (obj->cur_value) { @@ -454,7 +520,7 @@ psppire_value_entry_get_value (PsppireValueEntry *obj, new_text = gtk_entry_get_text (entry); return data_in_msg (ss_cstr (new_text), UTF8, - obj->format.type, + obj->format.type, settings_get_fmt_settings (), value, width, obj->encoding); } }