From b90c232d57830c1bd4e925b54cbffa1c6504de2d Mon Sep 17 00:00:00 2001 From: Andrea Zagli Date: Mon, 24 Aug 2009 15:46:13 +0200 Subject: [PATCH] Added GtkForm::is_changed. Changed libgtkform.pc.in to return include path without libgtkform (so now in source files need to use ). --- docs/reference/libgtkform-decl-list.txt | 7 ++ docs/reference/libgtkform-decl.txt | 36 ++++++++ docs/reference/libgtkform-undocumented.txt | 11 ++- docs/reference/libgtkform-unused.txt | 7 ++ libgtkform.pc.in | 4 +- src/field.c | 99 +++++++++++++++++----- src/field.h | 3 + src/fieldboolean.c | 35 +++++++- src/fieldboolean.h | 2 + src/fielddatetime.c | 52 ++++++++++-- src/fielddatetime.h | 2 + src/fieldfloat.c | 62 +++++++++++--- src/fieldfloat.h | 2 + src/fieldinteger.c | 61 ++++++++++--- src/fieldinteger.h | 2 + src/fieldtext.c | 67 +++++++++++---- src/fieldtext.h | 2 + src/form.c | 44 +++++++++- src/form.h | 3 +- 19 files changed, 424 insertions(+), 77 deletions(-) diff --git a/docs/reference/libgtkform-decl-list.txt b/docs/reference/libgtkform-decl-list.txt index 5247330..25538b6 100644 --- a/docs/reference/libgtkform-decl-list.txt +++ b/docs/reference/libgtkform-decl-list.txt @@ -49,6 +49,7 @@ gtk_form_field_boolean_get_value gtk_form_field_boolean_get_value_sql gtk_form_field_boolean_clear gtk_form_field_boolean_is_empty +gtk_form_filed_boolean_is_changed gtk_form_field_boolean_set_from_datamodel gtk_form_field_boolean_str_to_boolean @@ -90,6 +91,7 @@ gtk_form_field_text_get_value gtk_form_field_text_get_value_sql gtk_form_field_text_clear gtk_form_field_text_is_empty +gtk_form_field_text_is_changed gtk_form_field_text_set_from_datamodel @@ -110,6 +112,7 @@ gtk_form_field_datetime_get_value gtk_form_field_datetime_get_value_sql gtk_form_field_datetime_clear gtk_form_field_datetime_is_empty +gtk_form_field_datetime_is_changed gtk_form_field_datetime_set_from_datamodel gtk_form_field_datetime_get_tm_from_str @@ -147,6 +150,7 @@ gtk_form_field_float_get_value gtk_form_field_float_get_value_sql gtk_form_field_float_clear gtk_form_field_float_is_empty +gtk_form_field_float_is_changed gtk_form_field_float_set_from_datamodel @@ -207,6 +211,7 @@ gtk_form_field_get_value gtk_form_field_get_value_sql gtk_form_field_clear gtk_form_field_is_empty +gtk_form_field_is_changed gtk_form_field_set_from_datamodel @@ -236,6 +241,7 @@ gtk_form_get_field_from_name gtk_form_get_widget_from_name gtk_form_clear gtk_form_check +gtk_form_is_changed gtk_form_set_sensitive gtk_form_set_editable GtkFormSqlType @@ -294,6 +300,7 @@ gtk_form_field_integer_get_value gtk_form_field_integer_get_value_sql gtk_form_field_integer_clear gtk_form_field_integer_is_empty +gtk_form_field_integer_is_changed gtk_form_field_integer_set_from_datamodel diff --git a/docs/reference/libgtkform-decl.txt b/docs/reference/libgtkform-decl.txt index 61fc341..5714eac 100644 --- a/docs/reference/libgtkform-decl.txt +++ b/docs/reference/libgtkform-decl.txt @@ -216,6 +216,11 @@ GtkFormField *field GtkFormField *field +gtk_form_filed_boolean_is_changed +gboolean +GtkFormField *field + + gtk_form_field_boolean_set_from_datamodel gboolean GtkFormField *field, GdaDataModel *dm, gint row @@ -395,6 +400,11 @@ GtkFormField *field GtkFormField *field +gtk_form_field_text_is_changed +gboolean +GtkFormField *field + + gtk_form_field_text_set_from_datamodel gboolean GtkFormField *field, GdaDataModel *dm, gint row @@ -479,6 +489,11 @@ GtkFormField *field GtkFormField *field +gtk_form_field_datetime_is_changed +gboolean +GtkFormField *field + + gtk_form_field_datetime_set_from_datamodel gboolean GtkFormField *field, GdaDataModel *dm, gint row @@ -632,6 +647,11 @@ GtkFormField *field GtkFormField *field +gtk_form_field_float_is_changed +gboolean +GtkFormField *field + + gtk_form_field_float_set_from_datamodel gboolean GtkFormField *field, GdaDataModel *dm, gint row @@ -838,6 +858,7 @@ struct _GtkFormFieldClass gboolean (*clear) (GtkFormField *field); gboolean (*is_empty) (GtkFormField *field); + gboolean (*is_changed) (GtkFormField *field); gboolean (*set_from_datamodel) (GtkFormField *field, GdaDataModel *dm, gint row); }; @@ -892,6 +913,11 @@ GtkFormField *field GtkFormField *field +gtk_form_field_is_changed +gboolean +GtkFormField *field + + gtk_form_field_set_from_datamodel gboolean GtkFormField *field, GdaDataModel *dm, gint row @@ -1021,6 +1047,11 @@ GtkForm *form GtkForm *form +gtk_form_is_changed +gboolean +GtkForm *form + + gtk_form_set_sensitive void GtkForm *form, gboolean sensitive @@ -1268,6 +1299,11 @@ GtkFormField *field GtkFormField *field +gtk_form_field_integer_is_changed +gboolean +GtkFormField *field + + gtk_form_field_integer_set_from_datamodel gboolean GtkFormField *field, GdaDataModel *dm, gint row diff --git a/docs/reference/libgtkform-undocumented.txt b/docs/reference/libgtkform-undocumented.txt index c6d0933..cafe887 100644 --- a/docs/reference/libgtkform-undocumented.txt +++ b/docs/reference/libgtkform-undocumented.txt @@ -1,7 +1,7 @@ 6% symbol docs coverage. 17 symbols documented. 2 symbols incomplete. -252 not documented. +259 not documented. GTK_FORM @@ -130,6 +130,7 @@ gtk_form_field_datetime_get_type gtk_form_field_datetime_get_value gtk_form_field_datetime_get_value_sql gtk_form_field_datetime_get_value_stringify +gtk_form_field_datetime_is_changed gtk_form_field_datetime_is_empty gtk_form_field_datetime_new gtk_form_field_datetime_set_from_datamodel @@ -138,11 +139,12 @@ gtk_form_field_float_get_type gtk_form_field_float_get_value gtk_form_field_float_get_value_sql gtk_form_field_float_get_value_stringify +gtk_form_field_float_is_changed gtk_form_field_float_is_empty gtk_form_field_float_new gtk_form_field_float_set_from_datamodel gtk_form_field_get_field_name -gtk_form_field_get_gtk_form_widget (field, field, Returns) +gtk_form_field_get_gtk_form_widget (Returns) gtk_form_field_get_str_format gtk_form_field_get_type gtk_form_field_get_value @@ -153,9 +155,11 @@ gtk_form_field_integer_get_type gtk_form_field_integer_get_value gtk_form_field_integer_get_value_sql gtk_form_field_integer_get_value_stringify +gtk_form_field_integer_is_changed gtk_form_field_integer_is_empty gtk_form_field_integer_new gtk_form_field_integer_set_from_datamodel +gtk_form_field_is_changed gtk_form_field_is_empty gtk_form_field_new gtk_form_field_new_from_gtk_form_widget @@ -165,9 +169,11 @@ gtk_form_field_text_get_type gtk_form_field_text_get_value gtk_form_field_text_get_value_sql gtk_form_field_text_get_value_stringify +gtk_form_field_text_is_changed gtk_form_field_text_is_empty gtk_form_field_text_new gtk_form_field_text_set_from_datamodel +gtk_form_filed_boolean_is_changed gtk_form_fill_from_datamodel gtk_form_get_field_from_name gtk_form_get_gtkbuilder @@ -176,6 +182,7 @@ gtk_form_get_sql gtk_form_get_table gtk_form_get_type gtk_form_get_widget_from_name +gtk_form_is_changed gtk_form_key_add_field gtk_form_key_add_fields gtk_form_key_check diff --git a/docs/reference/libgtkform-unused.txt b/docs/reference/libgtkform-unused.txt index d79e4ad..183596d 100644 --- a/docs/reference/libgtkform-unused.txt +++ b/docs/reference/libgtkform-unused.txt @@ -15,9 +15,16 @@ GtkFormWidgetSpinClass GtkFormWidgetTextviewClass gtk_form_field_boolean_str_to_boolean gtk_form_field_datetime_get_tm_from_str +gtk_form_field_datetime_is_changed +gtk_form_field_float_is_changed +gtk_form_field_integer_is_changed +gtk_form_field_is_changed +gtk_form_field_text_is_changed +gtk_form_filed_boolean_is_changed gtk_form_get_gtkbuilder gtk_form_get_key gtk_form_get_table +gtk_form_is_changed gtk_form_new_from_file gtk_form_new_from_xml gtk_form_set_key diff --git a/libgtkform.pc.in b/libgtkform.pc.in index 86fc551..4e513fa 100644 --- a/libgtkform.pc.in +++ b/libgtkform.pc.in @@ -4,8 +4,8 @@ libdir=@libdir@ includedir=@includedir@ Name: @PACKAGE_NAME@ -Description: Class for easly manage Gtk+ forms binded to db (or not). +Description: Class to more easly manage Gtk+ forms binded to db (or not). Version: @PACKAGE_VERSION@ Requires: gtk+-2.0, libxml-2.0, libgdaex Libs: -L${libdir} -lgtkform -Cflags: -I${includedir}/libgtkform +Cflags: -I${includedir} diff --git a/src/field.c b/src/field.c index 10cf34c..3b4925e 100644 --- a/src/field.c +++ b/src/field.c @@ -87,7 +87,7 @@ gtk_form_field_class_init (GtkFormFieldClass *klass) g_param_spec_object ("form-widget", "GtkFormWidget", "The GtkFormWidget", - TYPE_GTK_FORM_WIDGET, + TYPE_GTK_FORM_WIDGET, G_PARAM_READWRITE)); g_type_class_add_private (object_class, sizeof (GtkFormFieldPrivate)); @@ -111,7 +111,7 @@ GtkFormField /** * gtk_form_field_new_from_gtk_form_widget: - * @fwidget: + * @fwidget: a #GtkFormWidget object. * * Returns: the newly created #GtkFormField. */ @@ -129,7 +129,7 @@ GtkFormField /** * gtk_form_field_get_field_name: - * @field: + * @field: a #GtkFormField object. * * Returns: the field's name. */ @@ -143,7 +143,7 @@ const gchar /** * gtk_form_field_get_gtk_form_widget: - * @field: + * @field: a #GtkFormField object. * * Return: the associated #GtkFormWidget. */ @@ -157,75 +157,136 @@ GtkFormWidget /** * gtk_form_field_get_value_stringify: - * @field: + * @field: a #GtkFormField object. * */ const gchar *gtk_form_field_get_value_stringify (GtkFormField *field) { - GTK_FORM_FIELD_GET_CLASS (field)->get_value_stringify (field); + const gchar *ret; + + if (IS_GTK_FORM_FIELD (field) && GTK_FORM_FIELD_GET_CLASS (field)->get_value_stringify != NULL) + { + ret = GTK_FORM_FIELD_GET_CLASS (field)->get_value_stringify (field); + } + + return ret; } /** * gtk_form_field_get_value: - * @field: + * @field: a #GtkFormField object. * */ const GValue *gtk_form_field_get_value (GtkFormField *field) { - GTK_FORM_FIELD_GET_CLASS (field)->get_value (field); + const GValue *ret; + + if (IS_GTK_FORM_FIELD (field) && GTK_FORM_FIELD_GET_CLASS (field)->get_value != NULL) + { + ret = GTK_FORM_FIELD_GET_CLASS (field)->get_value (field); + } + + return ret; } /** * gtk_form_field_get_value_sql: - * @field: + * @field: a #GtkFormField object. * */ const gchar *gtk_form_field_get_value_sql (GtkFormField *field) { - GTK_FORM_FIELD_GET_CLASS (field)->get_value_sql (field); + const gchar *ret; + + if (IS_GTK_FORM_FIELD (field) && GTK_FORM_FIELD_GET_CLASS (field)->get_value_sql != NULL) + { + ret = GTK_FORM_FIELD_GET_CLASS (field)->get_value_sql (field); + } + + return ret; } /** * gtk_form_field_clear: - * @field: + * @field: a #GtkFormField object. * */ gboolean gtk_form_field_clear (GtkFormField *field) { - GTK_FORM_FIELD_GET_CLASS (field)->clear (field); + gboolean ret; + + if (IS_GTK_FORM_FIELD (field) && GTK_FORM_FIELD_GET_CLASS (field)->clear != NULL) + { + ret = GTK_FORM_FIELD_GET_CLASS (field)->clear (field); + } + + return ret; } /** * gtk_form_field_is_empty: - * @field: + * @field: a #GtkFormField object. * */ gboolean gtk_form_field_is_empty (GtkFormField *field) { - GTK_FORM_FIELD_GET_CLASS (field)->is_empty (field); + gboolean ret = FALSE; + + if (IS_GTK_FORM_FIELD (field) && GTK_FORM_FIELD_GET_CLASS (field)->is_empty != NULL) + { + ret = GTK_FORM_FIELD_GET_CLASS (field)->is_empty (field); + } + + return ret; +} + +/** + * gtk_form_field_is_changed: + * @field: a #GtkFormField object. + * + * Returns: TRUE if the values in the form are changed since last calling to + * gtk_form_field_clear() or gtk_form_field_set_from_datamodel(). + */ +gboolean +gtk_form_field_is_changed (GtkFormField *field) +{ + gboolean ret = FALSE; + + if (IS_GTK_FORM_FIELD (field) && GTK_FORM_FIELD_GET_CLASS (field)->is_changed != NULL) + { + ret = GTK_FORM_FIELD_GET_CLASS (field)->is_changed (field); + } + + return ret; } /** * gtk_form_field_set_from_datamodel: - * @field: - * @dm: - * @row: + * @field: a #GtkFormField object. + * @dm: a #GdaDataModel object. + * @row: the row number to return. * */ gboolean gtk_form_field_set_from_datamodel (GtkFormField *field, GdaDataModel *dm, gint row) { + gboolean ret = FALSE; + GtkFormFieldPrivate *priv = GTK_FORM_FIELD_GET_PRIVATE (field); - if (priv->field != NULL && strcmp (priv->field, "") != 0) + g_return_val_if_fail (GDA_IS_DATA_MODEL (dm), FALSE); + + if (IS_GTK_FORM_FIELD (field) && GTK_FORM_FIELD_GET_CLASS (field)->set_from_datamodel != NULL) { - GTK_FORM_FIELD_GET_CLASS (field)->set_from_datamodel (field, dm, row); + ret = GTK_FORM_FIELD_GET_CLASS (field)->set_from_datamodel (field, dm, row); } + + return ret; } /* PRIVATE */ diff --git a/src/field.h b/src/field.h index d4c7027..ece738c 100644 --- a/src/field.h +++ b/src/field.h @@ -55,6 +55,7 @@ struct _GtkFormFieldClass gboolean (*clear) (GtkFormField *field); gboolean (*is_empty) (GtkFormField *field); + gboolean (*is_changed) (GtkFormField *field); gboolean (*set_from_datamodel) (GtkFormField *field, GdaDataModel *dm, gint row); }; @@ -74,6 +75,8 @@ gboolean gtk_form_field_clear (GtkFormField *field); gboolean gtk_form_field_is_empty (GtkFormField *field); +gboolean gtk_form_field_is_changed (GtkFormField *field); + gboolean gtk_form_field_set_from_datamodel (GtkFormField *field, GdaDataModel *dm, gint row); diff --git a/src/fieldboolean.c b/src/fieldboolean.c index fb00e9e..d93cf80 100644 --- a/src/fieldboolean.c +++ b/src/fieldboolean.c @@ -47,6 +47,7 @@ typedef struct _GtkFormFieldBooleanPrivate GtkFormFieldBooleanPrivate; struct _GtkFormFieldBooleanPrivate { gboolean default_value; + gboolean original_value; }; @@ -66,6 +67,7 @@ gtk_form_field_boolean_class_init (GtkFormFieldBooleanClass *klass) field_class->get_value_sql = gtk_form_field_boolean_get_value_sql; field_class->clear = gtk_form_field_boolean_clear; field_class->is_empty = gtk_form_field_boolean_is_empty; + field_class->is_changed = gtk_form_filed_boolean_is_changed; field_class->set_from_datamodel = gtk_form_field_boolean_set_from_datamodel; g_object_class_install_property (object_class, PROP_DEFAULT, @@ -129,10 +131,11 @@ const GValue *gtk_form_field_boolean_get_value (GtkFormField *field) { GValue *ret = NULL; + const gchar *value; g_return_val_if_fail (IS_GTK_FORM_FIELD_BOOLEAN (field), NULL); - const gchar *value = gtk_form_field_boolean_get_value_stringify (field); + value = gtk_form_field_boolean_get_value_stringify (field); if (value != NULL) { @@ -186,6 +189,8 @@ gtk_form_field_boolean_clear (GtkFormField *field) ret = gtk_form_field_boolean_set_value_stringify (field, g_strdup_printf ("%d", priv->default_value)); + priv->original_value = priv->default_value; + return ret; } @@ -202,6 +207,29 @@ gtk_form_field_boolean_is_empty (GtkFormField *field) return ret; } +/** + * gtk_form_filed_boolean_is_changed: + * @field: a #GtkFormField object. + * + */ +gboolean +gtk_form_filed_boolean_is_changed (GtkFormField *field) +{ + gboolean ret = FALSE; + GtkFormFieldBooleanPrivate *priv; + const gchar *value; + + g_return_val_if_fail (IS_GTK_FORM_FIELD_BOOLEAN (field), FALSE); + + priv = GTK_FORM_FIELD_BOOLEAN_GET_PRIVATE (GTK_FORM_FIELD_BOOLEAN (field)); + + value = gtk_form_field_boolean_get_value_stringify (field); + + ret = (priv->original_value != gtk_form_field_boolean_str_to_boolean (value)); + + return ret; +} + /** * gtk_form_field_boolean_set_from_datamodel: * @field: a #GtkFormField object. @@ -213,12 +241,15 @@ gboolean gtk_form_field_boolean_set_from_datamodel (GtkFormField *field, GdaDataModel *dm, gint row) { gboolean ret = FALSE; + GtkFormFieldBooleanPrivate *priv; const gchar *field_name; gchar *value; g_return_val_if_fail (IS_GTK_FORM_FIELD_BOOLEAN (field), FALSE); g_return_val_if_fail (GDA_IS_DATA_MODEL (dm), FALSE); + priv = GTK_FORM_FIELD_BOOLEAN_GET_PRIVATE (GTK_FORM_FIELD_BOOLEAN (field)); + field_name = gtk_form_field_get_field_name (field); if (gdaex_data_model_get_field_value_boolean_at (dm, row, field_name)) @@ -231,6 +262,8 @@ gtk_form_field_boolean_set_from_datamodel (GtkFormField *field, GdaDataModel *dm } ret = gtk_form_field_boolean_set_value_stringify (field, value); + priv->original_value = gtk_form_field_boolean_str_to_boolean (value); + return ret; } diff --git a/src/fieldboolean.h b/src/fieldboolean.h index a3dfe58..89349db 100644 --- a/src/fieldboolean.h +++ b/src/fieldboolean.h @@ -60,6 +60,8 @@ gboolean gtk_form_field_boolean_clear (GtkFormField *field); gboolean gtk_form_field_boolean_is_empty (GtkFormField *field); +gboolean gtk_form_filed_boolean_is_changed (GtkFormField *field); + gboolean gtk_form_field_boolean_set_from_datamodel (GtkFormField *field, GdaDataModel *dm, gint row); gboolean gtk_form_field_boolean_str_to_boolean (const gchar *value); diff --git a/src/fielddatetime.c b/src/fielddatetime.c index 1a7be41..0be7c65 100644 --- a/src/fielddatetime.c +++ b/src/fielddatetime.c @@ -52,6 +52,7 @@ typedef struct _GtkFormFieldDateTimePrivate GtkFormFieldDateTimePrivate; struct _GtkFormFieldDateTimePrivate { struct tm *default_value; + struct tm *original_value; gint type; }; @@ -72,6 +73,7 @@ gtk_form_field_datetime_class_init (GtkFormFieldDateTimeClass *klass) field_class->get_value_sql = gtk_form_field_datetime_get_value_sql; field_class->clear = gtk_form_field_datetime_clear; field_class->is_empty = gtk_form_field_datetime_is_empty; + field_class->is_changed = gtk_form_field_datetime_is_changed; field_class->set_from_datamodel = gtk_form_field_datetime_set_from_datamodel; g_object_class_install_property (object_class, PROP_DEFAULT, @@ -235,6 +237,8 @@ gtk_form_field_datetime_clear (GtkFormField *field) ret = gtk_form_field_datetime_set_value_stringify (field, ""); } + priv->original_value = g_memdup (priv->default_value, sizeof (struct tm)); + return ret; } @@ -251,10 +255,38 @@ gtk_form_field_datetime_is_empty (GtkFormField *field) return ret; } +/** + * gtk_form_field_datetime_is_changed: + * @field: + * + */ +gboolean +gtk_form_field_datetime_is_changed (GtkFormField *field) +{ + gboolean ret = FALSE; + GtkFormFieldDateTimePrivate *priv; + struct tm *value; + + g_return_val_if_fail (IS_GTK_FORM_FIELD_DATETIME (field), FALSE); + + priv = GTK_FORM_FIELD_DATETIME_GET_PRIVATE (GTK_FORM_FIELD_DATETIME (field)); + + value = gtk_form_field_datetime_get_tm_from_str (gtk_form_field_datetime_get_value_stringify (field)); + + ret = (value->tm_year != priv->original_value->tm_year + || value->tm_mon != priv->original_value->tm_mon + || value->tm_mday != priv->original_value->tm_mday + || value->tm_hour != priv->original_value->tm_hour + || value->tm_min != priv->original_value->tm_min + || value->tm_sec != priv->original_value->tm_sec); + + return ret; +} + /** * gtk_form_field_datetime_set_from_datamodel: * @field: a #GtkFormField object. - * @dm: + * @dm: a #GdaDataModel object. * @row: * */ @@ -262,16 +294,22 @@ gboolean gtk_form_field_datetime_set_from_datamodel (GtkFormField *field, GdaDataModel *dm, gint row) { gboolean ret = FALSE; + GtkFormFieldDateTimePrivate *priv; + const gchar *field_name; + const gchar *value; g_return_val_if_fail (IS_GTK_FORM_FIELD_DATETIME (field), FALSE); + g_return_val_if_fail (GDA_IS_DATA_MODEL (dm), FALSE); - const gchar *field_name = gtk_form_field_get_field_name (field); + priv = GTK_FORM_FIELD_DATETIME_GET_PRIVATE (GTK_FORM_FIELD_DATETIME (field)); - if (dm != NULL) - { - ret = gtk_form_field_datetime_set_value_stringify (field, - gdaex_data_model_get_field_value_stringify_at (dm, row, field_name)); - } + field_name = gtk_form_field_get_field_name (field); + + value = gdaex_data_model_get_field_value_stringify_at (dm, row, field_name); + + ret = gtk_form_field_datetime_set_value_stringify (field, value); + + priv->original_value = gtk_form_field_datetime_get_tm_from_str (value); return ret; } diff --git a/src/fielddatetime.h b/src/fielddatetime.h index c39d956..d28d867 100644 --- a/src/fielddatetime.h +++ b/src/fielddatetime.h @@ -67,6 +67,8 @@ gboolean gtk_form_field_datetime_clear (GtkFormField *field); gboolean gtk_form_field_datetime_is_empty (GtkFormField *field); +gboolean gtk_form_field_datetime_is_changed (GtkFormField *field); + gboolean gtk_form_field_datetime_set_from_datamodel (GtkFormField *field, GdaDataModel *dm, gint row); struct tm *gtk_form_field_datetime_get_tm_from_str (const gchar *str); diff --git a/src/fieldfloat.c b/src/fieldfloat.c index 449bba0..36e4a43 100644 --- a/src/fieldfloat.c +++ b/src/fieldfloat.c @@ -47,6 +47,7 @@ typedef struct _GtkFormFieldFloatPrivate GtkFormFieldFloatPrivate; struct _GtkFormFieldFloatPrivate { gfloat default_value; + gfloat original_value; }; @@ -66,6 +67,7 @@ gtk_form_field_float_class_init (GtkFormFieldFloatClass *klass) field_class->get_value_sql = gtk_form_field_float_get_value_sql; field_class->clear = gtk_form_field_float_clear; field_class->is_empty = gtk_form_field_float_is_empty; + field_class->is_changed = gtk_form_field_float_is_changed; field_class->set_from_datamodel = gtk_form_field_float_set_from_datamodel; g_object_class_install_property (object_class, PROP_DEFAULT, @@ -96,7 +98,7 @@ GtkFormField /** * gtk_form_field_float_get_value_stringify: - * @field: + * @field: a #GtkFormField object. * */ const gchar @@ -120,7 +122,7 @@ const gchar /** * gtk_form_field_float_get_value: - * @field: + * @field: a #GtkFormField object. * */ const GValue @@ -142,7 +144,7 @@ const GValue /** * gtk_form_field_float_get_value_sql: - * @field: + * @field: a #GtkFormField object. * */ const gchar @@ -168,7 +170,7 @@ const gchar /** * gtk_form_field_float_clear: - * @field: + * @field: a #GtkFormField object. * */ gboolean @@ -180,12 +182,14 @@ gtk_form_field_float_clear (GtkFormField *field) ret = gtk_form_field_float_set_value_stringify (field, g_strdup_printf ("%f", priv->default_value)); + priv->original_value = priv->default_value; + return ret; } /** * gtk_form_field_float_is_empty: - * @field: + * @field: a #GtkFormField object. * */ gboolean @@ -204,10 +208,33 @@ gtk_form_field_float_is_empty (GtkFormField *field) return ret; } +/** + * gtk_form_field_float_is_changed: + * @field: a #GtkFormField object. + * + */ +gboolean +gtk_form_field_float_is_changed (GtkFormField *field) +{ + gboolean ret = FALSE; + GtkFormFieldFloatPrivate *priv; + gfloat value; + + g_return_val_if_fail (IS_GTK_FORM_FIELD_FLOAT (field), FALSE); + + priv = GTK_FORM_FIELD_FLOAT_GET_PRIVATE (GTK_FORM_FIELD_FLOAT (field)); + + value = g_strtod (gtk_form_field_float_get_value_stringify (field), NULL); + + ret = (priv->original_value != value); + + return ret; +} + /** * gtk_form_field_float_set_from_datamodel: - * @field: - * @dm: + * @field: a #GtkFormField object. + * @dm: a #GdaDataModel object. * @row: * */ @@ -215,13 +242,22 @@ gboolean gtk_form_field_float_set_from_datamodel (GtkFormField *field, GdaDataModel *dm, gint row) { gboolean ret = FALSE; - const gchar *field_name = gtk_form_field_get_field_name (field); + GtkFormFieldFloatPrivate *priv; + const gchar *value; + const gchar *field_name; - if (dm != NULL) - { - ret = gtk_form_field_float_set_value_stringify (field, - gdaex_data_model_get_field_value_stringify_at (dm, row, field_name)); - } + g_return_val_if_fail (IS_GTK_FORM_FIELD_FLOAT (field), FALSE); + g_return_val_if_fail (GDA_IS_DATA_MODEL (dm), FALSE); + + priv = GTK_FORM_FIELD_FLOAT_GET_PRIVATE (GTK_FORM_FIELD_FLOAT (field)); + + field_name = gtk_form_field_get_field_name (field); + + value = gdaex_data_model_get_field_value_stringify_at (dm, row, field_name); + + ret = gtk_form_field_float_set_value_stringify (field, value); + + priv->original_value = g_strtod (value, NULL); return ret; } diff --git a/src/fieldfloat.h b/src/fieldfloat.h index efb1e1c..5f3ae5f 100644 --- a/src/fieldfloat.h +++ b/src/fieldfloat.h @@ -60,6 +60,8 @@ gboolean gtk_form_field_float_clear (GtkFormField *field); gboolean gtk_form_field_float_is_empty (GtkFormField *field); +gboolean gtk_form_field_float_is_changed (GtkFormField *field); + gboolean gtk_form_field_float_set_from_datamodel (GtkFormField *field, GdaDataModel *dm, gint row); diff --git a/src/fieldinteger.c b/src/fieldinteger.c index bb4ca7d..3e896c2 100644 --- a/src/fieldinteger.c +++ b/src/fieldinteger.c @@ -45,6 +45,7 @@ typedef struct _GtkFormFieldIntegerPrivate GtkFormFieldIntegerPrivate; struct _GtkFormFieldIntegerPrivate { gint default_value; + gint original_value; }; @@ -64,6 +65,7 @@ gtk_form_field_integer_class_init (GtkFormFieldIntegerClass *klass) field_class->get_value_sql = gtk_form_field_integer_get_value_sql; field_class->clear = gtk_form_field_integer_clear; field_class->is_empty = gtk_form_field_integer_is_empty; + field_class->is_changed = gtk_form_field_integer_is_changed; field_class->set_from_datamodel = gtk_form_field_integer_set_from_datamodel; g_object_class_install_property (object_class, PROP_DEFAULT, @@ -94,7 +96,7 @@ GtkFormField /** * gtk_form_field_integer_get_value_stringify: - * @field: + * @field: a #GtkFormField object. * */ const gchar @@ -118,7 +120,7 @@ const gchar /** * gtk_form_field_integer_get_value: - * @field: + * @field: a #GtkFormField object. * */ const GValue @@ -140,7 +142,7 @@ const GValue /** * gtk_form_field_integer_get_value_sql: - * @field: + * @field: a #GtkFormField object. * */ const gchar @@ -159,7 +161,7 @@ const gchar /** * gtk_form_field_integer_clear: - * @field: + * @field: a #GtkFormField object. * */ gboolean @@ -171,12 +173,14 @@ gtk_form_field_integer_clear (GtkFormField *field) ret = gtk_form_field_integer_set_value_stringify (field, g_strdup_printf ("%d", priv->default_value)); + priv->original_value = priv->default_value; + return ret; } /** * gtk_form_field_integer_is_empty: - * @field: + * @field: a #GtkFormField object. * */ gboolean @@ -195,10 +199,33 @@ gtk_form_field_integer_is_empty (GtkFormField *field) return ret; } +/** + * gtk_form_field_integer_is_changed: + * @field: a #GtkFormField object. + * + */ +gboolean +gtk_form_field_integer_is_changed (GtkFormField *field) +{ + gboolean ret = FALSE; + GtkFormFieldIntegerPrivate *priv; + gint value; + + g_return_val_if_fail (IS_GTK_FORM_FIELD_INTEGER (field), FALSE); + + priv = GTK_FORM_FIELD_INTEGER_GET_PRIVATE (GTK_FORM_FIELD_INTEGER (field)); + + value = strtol (gtk_form_field_integer_get_value_stringify (field), NULL, 10); + + ret = (priv->original_value != value); + + return ret; +} + /** * gtk_form_field_integer_set_from_datamodel: - * @field: - * @dm: + * @field: a #GtkFormField object. + * @dm: a #GdaDataModel object. * @row: * */ @@ -206,13 +233,21 @@ gboolean gtk_form_field_integer_set_from_datamodel (GtkFormField *field, GdaDataModel *dm, gint row) { gboolean ret = FALSE; - const gchar *field_name = gtk_form_field_get_field_name (field); + GtkFormFieldIntegerPrivate *priv; + const gchar *value; + const gchar *field_name; - if (dm != NULL) - { - ret = gtk_form_field_integer_set_value_stringify (field, - gdaex_data_model_get_field_value_stringify_at (dm, row, field_name)); - } + g_return_val_if_fail (GDA_IS_DATA_MODEL (dm), FALSE); + + priv = GTK_FORM_FIELD_INTEGER_GET_PRIVATE (GTK_FORM_FIELD_INTEGER (field)); + + field_name = gtk_form_field_get_field_name (field); + + value = gdaex_data_model_get_field_value_stringify_at (dm, row, field_name); + + ret = gtk_form_field_integer_set_value_stringify (field, value); + + priv->original_value = strtol (value, NULL, 10); return ret; } diff --git a/src/fieldinteger.h b/src/fieldinteger.h index 68ce8e0..63a43ba 100644 --- a/src/fieldinteger.h +++ b/src/fieldinteger.h @@ -60,6 +60,8 @@ gboolean gtk_form_field_integer_clear (GtkFormField *field); gboolean gtk_form_field_integer_is_empty (GtkFormField *field); +gboolean gtk_form_field_integer_is_changed (GtkFormField *field); + gboolean gtk_form_field_integer_set_from_datamodel (GtkFormField *field, GdaDataModel *dm, gint row); diff --git a/src/fieldtext.c b/src/fieldtext.c index 263e458..23d467e 100644 --- a/src/fieldtext.c +++ b/src/fieldtext.c @@ -45,6 +45,7 @@ typedef struct _GtkFormFieldTextPrivate GtkFormFieldTextPrivate; struct _GtkFormFieldTextPrivate { gchar *default_value; + gchar *original_value; }; @@ -64,6 +65,7 @@ gtk_form_field_text_class_init (GtkFormFieldTextClass *klass) field_class->get_value_sql = gtk_form_field_text_get_value_sql; field_class->clear = gtk_form_field_text_clear; field_class->is_empty = gtk_form_field_text_is_empty; + field_class->is_changed = gtk_form_field_text_is_changed; field_class->set_from_datamodel = gtk_form_field_text_set_from_datamodel; g_object_class_install_property (object_class, PROP_DEFAULT, @@ -94,7 +96,7 @@ GtkFormField /** * gtk_form_field_text_get_value_stringify: - * @field: + * @field: a #GtkFormField object. * */ const gchar @@ -118,7 +120,7 @@ const gchar /** * gtk_form_field_text_get_value: - * @field: + * @field: a #GtkFormField object. * */ const GValue @@ -140,7 +142,7 @@ const GValue /** * gtk_form_field_text_get_value_sql: - * @field: + * @field: a #GtkFormField object. * */ const gchar @@ -159,7 +161,7 @@ const gchar /** * gtk_form_field_text_clear: - * @field: + * @field: a #GtkFormField object. * */ gboolean @@ -171,12 +173,14 @@ gtk_form_field_text_clear (GtkFormField *field) ret = gtk_form_field_text_set_value_stringify (field, priv->default_value); + priv->original_value = g_strdup (priv->default_value); + return ret; } /** * gtk_form_field_text_is_empty: - * @field: + * @field: a #GtkFormField object. * */ gboolean @@ -195,10 +199,33 @@ gtk_form_field_text_is_empty (GtkFormField *field) return ret; } +/** + * gtk_form_field_text_is_changed: + * @field: a #GtkFormField object. + * + */ +gboolean +gtk_form_field_text_is_changed (GtkFormField *field) +{ + gboolean ret = FALSE; + GtkFormFieldTextPrivate *priv; + const gchar *value; + + g_return_val_if_fail (IS_GTK_FORM_FIELD_TEXT (field), FALSE); + + priv = GTK_FORM_FIELD_TEXT_GET_PRIVATE (GTK_FORM_FIELD_TEXT (field)); + + value = gtk_form_field_text_get_value_stringify (field); + + ret = (g_strcmp0 (priv->original_value, value) != 0); + + return ret; +} + /** * gtk_form_field_text_set_from_datamodel: - * @field: - * @dm: + * @field: a #GtkFormField object. + * @dm: a #GdaDataModel object. * @row: * */ @@ -206,19 +233,25 @@ gboolean gtk_form_field_text_set_from_datamodel (GtkFormField *field, GdaDataModel *dm, gint row) { gboolean ret = FALSE; - const gchar *field_name = gtk_form_field_get_field_name (field); + GtkFormFieldTextPrivate *priv; + gchar *strret; + const gchar *field_name; + + g_return_val_if_fail (IS_GTK_FORM_FIELD_TEXT (field), FALSE); + g_return_val_if_fail (GDA_IS_DATA_MODEL (dm), FALSE); + + priv = GTK_FORM_FIELD_TEXT_GET_PRIVATE (GTK_FORM_FIELD_TEXT (field)); - if (dm != NULL) + field_name = gtk_form_field_get_field_name (field); + + strret = gdaex_data_model_get_field_value_stringify_at (dm, row, field_name); + if (strret == NULL) { - gchar *strret; - - strret = gdaex_data_model_get_field_value_stringify_at (dm, row, field_name); - if (strret == NULL) - { - strret = g_strdup (""); - } - ret = gtk_form_field_text_set_value_stringify (field, strret); + strret = g_strdup (""); } + ret = gtk_form_field_text_set_value_stringify (field, strret); + + priv->original_value = g_strdup (strret); return ret; } diff --git a/src/fieldtext.h b/src/fieldtext.h index 4ec5b44..a317889 100644 --- a/src/fieldtext.h +++ b/src/fieldtext.h @@ -60,6 +60,8 @@ gboolean gtk_form_field_text_clear (GtkFormField *field); gboolean gtk_form_field_text_is_empty (GtkFormField *field); +gboolean gtk_form_field_text_is_changed (GtkFormField *field); + gboolean gtk_form_field_text_set_from_datamodel (GtkFormField *field, GdaDataModel *dm, gint row); diff --git a/src/form.c b/src/form.c index db5034f..583c55a 100644 --- a/src/form.c +++ b/src/form.c @@ -678,15 +678,18 @@ gtk_form_clear (GtkForm *form) gboolean gtk_form_check (GtkForm *form) { + GtkFormPrivate *priv; + GSList *fields; GtkFormField *field; + gboolean ret = TRUE; gboolean obl = FALSE; g_return_val_if_fail (IS_GTK_FORM (form), FALSE); - GtkFormPrivate *priv = GTK_FORM_GET_PRIVATE (form); + priv = GTK_FORM_GET_PRIVATE (form); - GSList *fields = priv->fields; + fields = priv->fields; while (fields != NULL) { @@ -713,6 +716,43 @@ gtk_form_check (GtkForm *form) return ret; } +/** + * gtk_form_is_changed: + * @form: + * + * Returns: TRUE if the values in the form are changed since last calling to + * gtk_form_clear() or gtk_form_fill_from_datamodel(). + */ +gboolean +gtk_form_is_changed (GtkForm *form) +{ + GtkFormPrivate *priv; + GSList *fields; + GtkFormField *field; + + gboolean ret; + + g_return_val_if_fail (IS_GTK_FORM (form), FALSE); + + ret = FALSE; + + priv = GTK_FORM_GET_PRIVATE (form); + + fields = priv->fields; + + while (fields != NULL) + { + field = (GtkFormField *)fields->data; + + ret = gtk_form_field_is_changed (field); + if (ret) break; + + fields = g_slist_next (fields); + } + + return ret; +} + /** * gtk_form_set_sensitive: * @form: a #GtkForm object. diff --git a/src/form.h b/src/form.h index 8c7c142..9bc1a8e 100644 --- a/src/form.h +++ b/src/form.h @@ -22,7 +22,6 @@ #include #include - #include "field.h" #include "widget.h" #include "key.h" @@ -79,6 +78,8 @@ gboolean gtk_form_clear (GtkForm *form); gboolean gtk_form_check (GtkForm *form); +gboolean gtk_form_is_changed (GtkForm *form); + void gtk_form_set_sensitive (GtkForm *form, gboolean sensitive); void gtk_form_set_editable (GtkForm *form, gboolean editable); -- 2.49.0