From c89301a9d3ca7359d7f2909f2df2533c3ae599d9 Mon Sep 17 00:00:00 2001 From: Andrea Zagli Date: Sat, 29 Aug 2009 18:31:03 +0200 Subject: [PATCH] Some bugfixes and adjustments. --- data/gtkform.dtd | 1 + docs/reference/libgtkform-decl-list.txt | 6 +- docs/reference/libgtkform-decl.txt | 14 +++- docs/reference/libgtkform-undeclared.txt | 2 + docs/reference/libgtkform-undocumented.txt | 8 +- docs/reference/libgtkform-unused.txt | 4 + docs/reference/tmpl/form.sgml | 20 ----- docs/reference/tmpl/libgtkform-unused.sgml | 18 ++++ src/field.c | 7 +- src/field.h | 2 +- src/fieldboolean.c | 6 +- src/fielddatetime.c | 21 +++-- src/fieldfloat.c | 10 ++- src/fieldinteger.c | 8 +- src/fieldtext.c | 10 ++- src/form.c | 96 +++++++++++++++++++--- src/form.h | 4 +- src/widget.c | 77 ++++++++++++++--- src/widget.h | 3 + test/from_xml.c | 2 +- test/main.c | 2 +- 21 files changed, 253 insertions(+), 68 deletions(-) diff --git a/data/gtkform.dtd b/data/gtkform.dtd index daff593..202f7c1 100644 --- a/data/gtkform.dtd +++ b/data/gtkform.dtd @@ -9,6 +9,7 @@ diff --git a/docs/reference/libgtkform-decl-list.txt b/docs/reference/libgtkform-decl-list.txt index 25538b6..7be037d 100644 --- a/docs/reference/libgtkform-decl-list.txt +++ b/docs/reference/libgtkform-decl-list.txt @@ -237,8 +237,10 @@ gtk_form_set_key gtk_form_add_field gtk_form_remove_field gtk_form_add_fields -gtk_form_get_field_from_name -gtk_form_get_widget_from_name +gtk_form_get_form_field_from_name +gtk_form_get_form_widget_from_name +gtk_form_get_widgets +gtk_form_get_objects_by_name gtk_form_clear gtk_form_check gtk_form_is_changed diff --git a/docs/reference/libgtkform-decl.txt b/docs/reference/libgtkform-decl.txt index 5714eac..49ca085 100644 --- a/docs/reference/libgtkform-decl.txt +++ b/docs/reference/libgtkform-decl.txt @@ -1027,16 +1027,26 @@ GtkForm *form, GtkFormField *field GtkForm *form, ... -gtk_form_get_field_from_name +gtk_form_get_form_field_from_name GtkFormField * GtkForm *form, const gchar *field_name -gtk_form_get_widget_from_name +gtk_form_get_form_widget_from_name GtkFormWidget * GtkForm *form, const gchar *widget_name +gtk_form_get_widgets +GtkWidget ** +GtkForm *form + + +gtk_form_get_objects_by_name +GObject ** +GtkForm *form, ... + + gtk_form_clear gboolean GtkForm *form diff --git a/docs/reference/libgtkform-undeclared.txt b/docs/reference/libgtkform-undeclared.txt index e69de29..a47720b 100644 --- a/docs/reference/libgtkform-undeclared.txt +++ b/docs/reference/libgtkform-undeclared.txt @@ -0,0 +1,2 @@ +gtk_form_get_field_from_name +gtk_form_get_widget_from_name diff --git a/docs/reference/libgtkform-undocumented.txt b/docs/reference/libgtkform-undocumented.txt index cafe887..a85e31d 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. -259 not documented. +261 not documented. GTK_FORM @@ -175,13 +175,15 @@ 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_form_field_from_name +gtk_form_get_form_widget_from_name gtk_form_get_gtkbuilder gtk_form_get_key +gtk_form_get_objects +gtk_form_get_objects_by_name 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 diff --git a/docs/reference/libgtkform-unused.txt b/docs/reference/libgtkform-unused.txt index 183596d..bac144f 100644 --- a/docs/reference/libgtkform-unused.txt +++ b/docs/reference/libgtkform-unused.txt @@ -21,9 +21,13 @@ 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_form_field_from_name +gtk_form_get_form_widget_from_name gtk_form_get_gtkbuilder gtk_form_get_key +gtk_form_get_objects_by_name gtk_form_get_table +gtk_form_get_widgets gtk_form_is_changed gtk_form_new_from_file gtk_form_new_from_xml diff --git a/docs/reference/tmpl/form.sgml b/docs/reference/tmpl/form.sgml index 0a5b80e..9871812 100644 --- a/docs/reference/tmpl/form.sgml +++ b/docs/reference/tmpl/form.sgml @@ -126,26 +126,6 @@ Form @Returns: - - - - - -@form: -@field_name: -@Returns: - - - - - - - -@form: -@widget_name: -@Returns: - - diff --git a/docs/reference/tmpl/libgtkform-unused.sgml b/docs/reference/tmpl/libgtkform-unused.sgml index 2923d25..6d3df27 100644 --- a/docs/reference/tmpl/libgtkform-unused.sgml +++ b/docs/reference/tmpl/libgtkform-unused.sgml @@ -908,3 +908,21 @@ @value: @Returns: + + + + + +@form: +@field_name: +@Returns: + + + + + + +@form: +@widget_name: +@Returns: + diff --git a/src/field.c b/src/field.c index 3b4925e..4ed31fb 100644 --- a/src/field.c +++ b/src/field.c @@ -142,13 +142,13 @@ const gchar } /** - * gtk_form_field_get_gtk_form_widget: + * gtk_form_field_get_form_widget: * @field: a #GtkFormField object. * * Return: the associated #GtkFormWidget. */ GtkFormWidget -*gtk_form_field_get_gtk_form_widget (GtkFormField *field) +*gtk_form_field_get_form_widget (GtkFormField *field) { GtkFormFieldPrivate *priv = GTK_FORM_FIELD_GET_PRIVATE (field); @@ -231,11 +231,12 @@ gtk_form_field_clear (GtkFormField *field) * gtk_form_field_is_empty: * @field: a #GtkFormField object. * + * Returns: TRUE if the field is empty. */ gboolean gtk_form_field_is_empty (GtkFormField *field) { - gboolean ret = FALSE; + gboolean ret = TRUE; if (IS_GTK_FORM_FIELD (field) && GTK_FORM_FIELD_GET_CLASS (field)->is_empty != NULL) { diff --git a/src/field.h b/src/field.h index ece738c..370a882 100644 --- a/src/field.h +++ b/src/field.h @@ -65,7 +65,7 @@ GtkFormField *gtk_form_field_new (void); GtkFormField *gtk_form_field_new_from_gtk_form_widget (GtkFormWidget *fwidget); const gchar *gtk_form_field_get_field_name (GtkFormField *field); -GtkFormWidget *gtk_form_field_get_gtk_form_widget (GtkFormField *field); +GtkFormWidget *gtk_form_field_get_form_widget (GtkFormField *field); const gchar *gtk_form_field_get_value_stringify (GtkFormField *field); const GValue *gtk_form_field_get_value (GtkFormField *field); diff --git a/src/fieldboolean.c b/src/fieldboolean.c index d93cf80..47777fb 100644 --- a/src/fieldboolean.c +++ b/src/fieldboolean.c @@ -202,7 +202,11 @@ gtk_form_field_boolean_clear (GtkFormField *field) gboolean gtk_form_field_boolean_is_empty (GtkFormField *field) { - gboolean ret = TRUE; + gboolean ret; + + g_return_val_if_fail (IS_GTK_FORM_FIELD_BOOLEAN (field), TRUE); + + ret = FALSE; return ret; } diff --git a/src/fielddatetime.c b/src/fielddatetime.c index 0be7c65..993b476 100644 --- a/src/fielddatetime.c +++ b/src/fielddatetime.c @@ -250,7 +250,11 @@ gtk_form_field_datetime_clear (GtkFormField *field) gboolean gtk_form_field_datetime_is_empty (GtkFormField *field) { - gboolean ret = TRUE; + gboolean ret; + + g_return_val_if_fail (IS_GTK_FORM_FIELD_DATETIME (field), TRUE); + + ret = FALSE; return ret; } @@ -273,12 +277,15 @@ gtk_form_field_datetime_is_changed (GtkFormField *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); + if (value != NULL) + { + 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; } diff --git a/src/fieldfloat.c b/src/fieldfloat.c index 36e4a43..654d6e0 100644 --- a/src/fieldfloat.c +++ b/src/fieldfloat.c @@ -195,12 +195,18 @@ gtk_form_field_float_clear (GtkFormField *field) gboolean gtk_form_field_float_is_empty (GtkFormField *field) { - gboolean ret = TRUE; + gboolean ret; const gchar *value; + g_return_val_if_fail (IS_GTK_FORM_FIELD_FLOAT (field), TRUE); + value = gtk_form_field_float_get_value_stringify (field); - if (strtod (value, NULL) == 0.0f) + if (g_strtod (value, NULL) == 0.0f) + { + ret = TRUE; + } + else { ret = FALSE; } diff --git a/src/fieldinteger.c b/src/fieldinteger.c index 3e896c2..a68e8be 100644 --- a/src/fieldinteger.c +++ b/src/fieldinteger.c @@ -186,12 +186,18 @@ gtk_form_field_integer_clear (GtkFormField *field) gboolean gtk_form_field_integer_is_empty (GtkFormField *field) { - gboolean ret = TRUE; + gboolean ret; const gchar *value; + g_return_val_if_fail (IS_GTK_FORM_FIELD_INTEGER (field), TRUE); + value = gtk_form_field_integer_get_value_stringify (field); if (strtol (value, NULL, 10) == 0) + { + ret = TRUE; + } + else { ret = FALSE; } diff --git a/src/fieldtext.c b/src/fieldtext.c index 23d467e..b765f64 100644 --- a/src/fieldtext.c +++ b/src/fieldtext.c @@ -186,12 +186,18 @@ gtk_form_field_text_clear (GtkFormField *field) gboolean gtk_form_field_text_is_empty (GtkFormField *field) { - gboolean ret = TRUE; + gboolean ret; const gchar *value; + g_return_val_if_fail (IS_GTK_FORM_FIELD_TEXT (field), TRUE); + value = gtk_form_field_text_get_value_stringify (field); - if (strcmp (value, "") == 0) + if (g_strcmp0 (value, "") == 0) + { + ret = TRUE; + } + else { ret = FALSE; } diff --git a/src/form.c b/src/form.c index a865d74..f2d2310 100644 --- a/src/form.c +++ b/src/form.c @@ -25,6 +25,8 @@ #include +#include + #include "form.h" #include "fieldboolean.h" @@ -144,6 +146,7 @@ GtkForm { gchar *type; gchar *name; + gchar *label; GtkFormWidget *widget; xmlNode *node_widget; @@ -240,6 +243,14 @@ GtkForm if (GTK_IS_BUILDER (priv->gtkbuilder)) { gtk_form_widget_set_from_gtkbuilder (widget, priv->gtkbuilder, name); + + label = xmlGetProp (cur, (const xmlChar *)"label"); + if (label != NULL && g_strcmp0 (g_strstrip (label), "") != 0) + { + GtkLabel *wlabel; + wlabel = GTK_LABEL (gtk_builder_get_object (priv->gtkbuilder, label)); + gtk_form_widget_set_label (widget, wlabel); + } } node_widget = cur->children; @@ -625,7 +636,7 @@ GtkFormWidget GSList *fields = priv->fields; while (fields != NULL) { - widget = gtk_form_field_get_gtk_form_widget ((GtkFormField *)fields->data); + widget = gtk_form_field_get_form_widget ((GtkFormField *)fields->data); if (strcmp (gtk_form_widget_get_widget_name (widget), widget_name) == 0) { @@ -671,7 +682,7 @@ GtkWidget l++; ret = g_realloc (ret, l * sizeof (GtkWidget *)); - form_widget = gtk_form_field_get_gtk_form_widget ((GtkFormField *)fields->data); + form_widget = gtk_form_field_get_form_widget ((GtkFormField *)fields->data); widget = gtk_form_widget_get_widget (form_widget); ret[l] = widget; @@ -706,7 +717,7 @@ GObject priv = GTK_FORM_GET_PRIVATE (form); - if (priv->gtkbuilder == NULL) return NULL; + g_return_val_if_fail (GTK_IS_BUILDER (priv->gtkbuilder), NULL); ret = NULL; l = 0; @@ -716,11 +727,22 @@ GObject while ((object_name = va_arg (vargs, gchar *)) != NULL) { object = gtk_builder_get_object (priv->gtkbuilder, object_name); - if (object != NULL) + if (G_IS_OBJECT (object)) { l++; - ret = g_realloc (ret, l * sizeof (GObject *)); - ret[l] = object; + if (l == 1) + { + ret = g_malloc (sizeof (GObject *)); + } + else + { + ret = g_realloc (ret, l * sizeof (GObject *)); + } + ret[l - 1] = object; + } + else + { + g_warning ("Object «%s» not found.", object_name); } } @@ -764,20 +786,34 @@ gtk_form_clear (GtkForm *form) /** * gtk_form_check: * @form: a #GtkForm object. + * @form_widget: a #GtkFormWidget. + * @show_error_dialog: + * @set_focus: * - * Returns: TRUE if all obligatory fields are full. + * Returns: TRUE if all obligatory fields are full and @widget is NULL. Otherwise + * if @widget isn't NULL, it is the first #GtkFormWidget empty. */ gboolean -gtk_form_check (GtkForm *form) +gtk_form_check (GtkForm *form, GtkFormWidget **form_widget, + gboolean show_error_dialog, GtkWidget *parent_window, + gboolean set_focus) { GtkFormPrivate *priv; GSList *fields; GtkFormField *field; + GtkFormWidget *fwidget; + GtkWidget *widget; gboolean ret = TRUE; gboolean obl = FALSE; g_return_val_if_fail (IS_GTK_FORM (form), FALSE); + g_return_val_if_fail (form_widget == NULL || *form_widget == NULL, FALSE); + + if (show_error_dialog) + { + g_return_val_if_fail (GTK_IS_WINDOW (parent_window), FALSE); + } priv = GTK_FORM_GET_PRIVATE (form); @@ -791,9 +827,47 @@ gtk_form_check (GtkForm *form) "obligatory", &obl, NULL); - if (obl && !gtk_form_field_is_empty (field)) + if (obl && gtk_form_field_is_empty (field)) { ret = FALSE; + + fwidget = gtk_form_field_get_form_widget (field); + widget = gtk_form_widget_get_widget (fwidget); + + if (form_widget != NULL) + { + *form_widget = fwidget; + } + + if (show_error_dialog) + { + GtkWidget *dialog; + GtkWidget *label; + const gchar *label_text; + + label = gtk_form_widget_get_label (fwidget); + if (GTK_IS_LABEL (label)) + { + label_text = gtk_label_get_text (GTK_LABEL (label)); + } + else + { + label_text = gtk_form_widget_get_widget_name (fwidget); + } + + dialog = gtk_message_dialog_new (GTK_WINDOW (parent_window), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_WARNING, + GTK_BUTTONS_OK, + "The field «%s» is obligatory.", label_text); + gtk_dialog_run (GTK_DIALOG (dialog)); + gtk_widget_destroy (dialog); + } + + if (set_focus) + { + gtk_widget_grab_focus (widget); + } break; } @@ -863,7 +937,7 @@ gtk_form_set_sensitive (GtkForm *form, gboolean sensitive) GSList *fields = priv->fields; while (fields != NULL) { - fwidget = gtk_form_field_get_gtk_form_widget ((GtkFormField *)fields->data); + fwidget = gtk_form_field_get_form_widget ((GtkFormField *)fields->data); widget = gtk_form_widget_get_widget (fwidget); gtk_widget_set_sensitive (widget, sensitive); @@ -889,7 +963,7 @@ gtk_form_set_editable (GtkForm *form, gboolean editable) GSList *fields = priv->fields; while (fields != NULL) { - fwidget = gtk_form_field_get_gtk_form_widget ((GtkFormField *)fields->data); + fwidget = gtk_form_field_get_form_widget ((GtkFormField *)fields->data); gtk_form_widget_set_editable (fwidget, editable); diff --git a/src/form.h b/src/form.h index 8fb0367..672225f 100644 --- a/src/form.h +++ b/src/form.h @@ -79,7 +79,9 @@ GObject **gtk_form_get_objects_by_name (GtkForm *form, ...); gboolean gtk_form_clear (GtkForm *form); -gboolean gtk_form_check (GtkForm *form); +gboolean gtk_form_check (GtkForm *form, GtkFormWidget **form_widget, + gboolean show_error_dialog, GtkWidget *parent_window, + gboolean set_focus); gboolean gtk_form_is_changed (GtkForm *form); diff --git a/src/widget.c b/src/widget.c index 908c866..9522816 100644 --- a/src/widget.c +++ b/src/widget.c @@ -46,6 +46,8 @@ struct _GtkFormWidgetPrivate { GtkWidget *widget; gchar *widget_name; + + GtkWidget *label; }; @@ -98,7 +100,7 @@ GtkFormWidget /** * gtk_form_widget_set_from_gtkbuilder: - * @fwidget: + * @fwidget: a #GtkFormWidget object. * @gtkbuilder: * @widget_name: * @@ -108,9 +110,16 @@ gtk_form_widget_set_from_gtkbuilder (GtkFormWidget *fwidget, GtkBuilder *gtkbuilder, const gchar *widget_name) { - gboolean ret = FALSE; + gboolean ret; + + GtkWidget *w; + + g_return_val_if_fail (IS_GTK_FORM_WIDGET (fwidget), FALSE); + g_return_val_if_fail (GTK_IS_BUILDER (gtkbuilder), FALSE); + + ret = FALSE; - GtkWidget *w = GTK_WIDGET (gtk_builder_get_object (gtkbuilder, widget_name)); + w = GTK_WIDGET (gtk_builder_get_object (gtkbuilder, widget_name)); if (w != NULL) { g_object_set (fwidget, @@ -120,40 +129,88 @@ gtk_form_widget_set_from_gtkbuilder (GtkFormWidget *fwidget, ret = TRUE; } + else + { + g_warning ("Widget «%s» not found.", widget_name); + } return ret; } /** * gtk_form_widget_get_widget: - * @fwidget: + * @fwidget: a #GtkFormWidget object. * */ GtkWidget *gtk_form_widget_get_widget (GtkFormWidget *fwidget) { - GtkFormWidgetPrivate *priv = GTK_FORM_WIDGET_GET_PRIVATE (fwidget); + GtkFormWidgetPrivate *priv; + + g_return_val_if_fail (IS_GTK_FORM_WIDGET (fwidget), NULL); + + priv = GTK_FORM_WIDGET_GET_PRIVATE (fwidget); return priv->widget; } /** * gtk_form_widget_get_widget_name: - * @fwidget: + * @fwidget: a #GtkFormWidget object. * * Returns: the #GtkFormWidget's name. */ const gchar *gtk_form_widget_get_widget_name (GtkFormWidget *fwidget) { - GtkFormWidgetPrivate *priv = GTK_FORM_WIDGET_GET_PRIVATE (fwidget); + GtkFormWidgetPrivate *priv; + + g_return_val_if_fail (IS_GTK_FORM_WIDGET (fwidget), NULL); + + priv = GTK_FORM_WIDGET_GET_PRIVATE (fwidget); return (const gchar *)g_strdup (priv->widget_name); } +/** + * gtk_form_widget_get_label: + * @fwidget: a #GtkFormWidget object. + * + */ +GtkWidget +*gtk_form_widget_get_label (GtkFormWidget *fwidget) +{ + GtkFormWidgetPrivate *priv; + + g_return_val_if_fail (IS_GTK_FORM_WIDGET (fwidget), NULL); + + priv = GTK_FORM_WIDGET_GET_PRIVATE (fwidget); + + return priv->label; +} + +/** + * gtk_form_widget_set_label: + * @fwidget: a #GtkFormWidget object. + * @label: a @GtkLabel object. + * + */ +void +gtk_form_widget_set_label (GtkFormWidget *fwidget, GtkLabel *label) +{ + GtkFormWidgetPrivate *priv; + + g_return_if_fail (IS_GTK_FORM_WIDGET (fwidget)); + g_return_if_fail (GTK_IS_LABEL (label)); + + priv = GTK_FORM_WIDGET_GET_PRIVATE (fwidget); + + priv->label = GTK_WIDGET (label); +} + /** * gtk_form_widget_get_value_stringify: - * @fwidget: + * @fwidget: a #GtkFormWidget object. * */ const gchar @@ -167,7 +224,7 @@ const gchar /** * gtk_form_widget_set_value_stringify: - * @fwidget: + * @fwidget: a #GtkFormWidget object. * @value: * */ @@ -182,7 +239,7 @@ gtk_form_widget_set_value_stringify (GtkFormWidget *fwidget, const gchar *value) /** * gtk_form_widget_set_editable: - * @fwidget: + * @fwidget: a #GtkFormWidget object. * @editable: * */ diff --git a/src/widget.h b/src/widget.h index 98f0eaa..29e0702 100644 --- a/src/widget.h +++ b/src/widget.h @@ -65,6 +65,9 @@ GtkWidget *gtk_form_widget_get_widget (GtkFormWidget *fwidget); const gchar *gtk_form_widget_get_widget_name (GtkFormWidget *fwidget); +GtkWidget *gtk_form_widget_get_label (GtkFormWidget *fwidget); +void gtk_form_widget_set_label (GtkFormWidget *fwidget, GtkLabel *label); + const gchar *gtk_form_widget_get_value_stringify (GtkFormWidget *fwidget); gboolean gtk_form_widget_set_value_stringify (GtkFormWidget *fwidget, const gchar *value); diff --git a/test/from_xml.c b/test/from_xml.c index 2a1ab1f..f2e3638 100644 --- a/test/from_xml.c +++ b/test/from_xml.c @@ -53,7 +53,7 @@ void on_btnCheck_clicked (GtkButton *button, gpointer user_data) { - if (!gtk_form_check (form)) + if (!gtk_form_check (form, NULL, FALSE, NULL, FALSE)) { GtkWidget *diag = gtk_message_dialog_new (GTK_WINDOW (w), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, diff --git a/test/main.c b/test/main.c index 09488f4..9c572aa 100644 --- a/test/main.c +++ b/test/main.c @@ -67,7 +67,7 @@ void on_btnCheck_clicked (GtkButton *button, gpointer user_data) { - if (!gtk_form_check (form)) + if (!gtk_form_check (form, NULL, FALSE, NULL, FALSE)) { GtkWidget *diag = gtk_message_dialog_new (GTK_WINDOW (w), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, -- 2.49.0