From 769c66a79f73982bc616896de20cde12de48d9f7 Mon Sep 17 00:00:00 2001 From: Andrea Zagli Date: Mon, 13 Apr 2020 16:41:31 +0200 Subject: [PATCH] Added ZakFormValidatorCompareNumber. --- src/Makefile.am | 2 + src/formvalidatorcomparenumber.c | 364 +++++++++++++++++++++++++++++++ src/formvalidatorcomparenumber.h | 52 +++++ 3 files changed, 418 insertions(+) create mode 100644 src/formvalidatorcomparenumber.c create mode 100644 src/formvalidatorcomparenumber.h diff --git a/src/Makefile.am b/src/Makefile.am index 8eed3d2..7f121d8 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -32,6 +32,7 @@ libzakform_la_SOURCES = \ formvalidator.c \ formvalidatorcompare.c \ formvalidatorcomparedate.c \ + formvalidatorcomparenumber.c \ formvalidatorcomposite.c libzakform_la_LDFLAGS = -no-undefined @@ -55,6 +56,7 @@ gir_include = \ formvalidator.h \ formvalidatorcompare.h \ formvalidatorcomparedate.h \ + formvalidatorcomparenumber.h \ formvalidatorcomposite.h libzakform_include_HEADERS = \ diff --git a/src/formvalidatorcomparenumber.c b/src/formvalidatorcomparenumber.c new file mode 100644 index 0000000..f4dd7eb --- /dev/null +++ b/src/formvalidatorcomparenumber.c @@ -0,0 +1,364 @@ +/* + * Copyright (C) 2020 Andrea Zagli + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include + +#include + +#include "commons.h" +#include "form.h" +#include "formvalidator.h" +#include "formvalidatorcomparenumber.h" + +static void zak_form_validator_compare_number_class_init (ZakFormValidatorCompareNumberClass *class); +static void zak_form_validator_compare_number_init (ZakFormValidatorCompareNumber *validator); + +static void zak_form_validator_compare_number_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec); +static void zak_form_validator_compare_number_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec); + +static void zak_form_validator_compare_number_dispose (GObject *gobject); +static void zak_form_validator_compare_number_finalize (GObject *gobject); + +static gboolean zak_form_validator_compare_number_xml_parsing (ZakFormValidator *validator, xmlNode *xnode, gpointer form); +static gboolean zak_form_validator_compare_number_validate (ZakFormValidator *validator_notempty); + +struct _ZakFormValidatorCompareNumber +{ + ZakFormValidator parent_instance; + + /* Other members, including private data. */ +}; + +#define ZAK_FORM_VALIDATOR_COMPARE_NUMBER_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), ZAK_FORM_TYPE_VALIDATOR_COMPARE_NUMBER, ZakFormValidatorCompareNumberPrivate)) + +typedef struct _ZakFormValidatorCompareNumberPrivate ZakFormValidatorCompareNumberPrivate; +struct _ZakFormValidatorCompareNumberPrivate + { + guint type; + + ZakFormElement *v1; + ZakFormElement *v2; + }; + +G_DEFINE_TYPE (ZakFormValidatorCompareNumber, zak_form_validator_compare_number, ZAK_FORM_TYPE_VALIDATOR) + +static void +zak_form_validator_compare_number_class_init (ZakFormValidatorCompareNumberClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + ZakFormValidatorClass *parent_class = ZAK_FORM_VALIDATOR_CLASS (class); + + object_class->set_property = zak_form_validator_compare_number_set_property; + object_class->get_property = zak_form_validator_compare_number_get_property; + object_class->dispose = zak_form_validator_compare_number_dispose; + object_class->finalize = zak_form_validator_compare_number_finalize; + + parent_class->xml_parsing = zak_form_validator_compare_number_xml_parsing; + parent_class->validate = zak_form_validator_compare_number_validate; + + g_type_class_add_private (object_class, sizeof (ZakFormValidatorCompareNumberPrivate)); +} + +static void +zak_form_validator_compare_number_init (ZakFormValidatorCompareNumber *validator) +{ + ZakFormValidatorCompareNumberPrivate *priv = ZAK_FORM_VALIDATOR_COMPARE_NUMBER_GET_PRIVATE (validator); + + priv->v1 = NULL; + priv->v2 = NULL; +} + +/** + * zak_form_validator_compare_number_new: + * + * Returns: the newly created #ZakFormValidatorCompareNumber object. + */ +ZakFormValidatorCompareNumber +*zak_form_validator_compare_number_new () +{ + ZakFormValidatorCompareNumber *zak_form_validator_compare_number; + + zak_form_validator_compare_number = ZAK_FORM_VALIDATOR_COMPARE_NUMBER (g_object_new (zak_form_validator_compare_number_get_type (), NULL)); + + return zak_form_validator_compare_number; +} + +/** + * zak_form_validator_compare_number_xml_parsing: + * @validator: + * @xnode: + * @form: + * + */ +static gboolean +zak_form_validator_compare_number_xml_parsing (ZakFormValidator *validator, xmlNode *xnode, gpointer form) +{ + gchar *prop; + + ZakFormValidatorCompareNumberPrivate *priv = ZAK_FORM_VALIDATOR_COMPARE_NUMBER_GET_PRIVATE (validator); + + prop = (gchar *)xmlGetProp (xnode, (const xmlChar *)"type_comp"); + zak_form_validator_compare_number_set_compare_type ((ZakFormValidatorCompareNumber *)validator, prop); + g_free (prop); + + prop = (gchar *)xmlGetProp (xnode, (const xmlChar *)"element1"); + zak_form_validator_compare_number_set_element1 ((ZakFormValidatorCompareNumber *)validator, (ZakFormForm *)form, prop); + g_free (prop); + + prop = (gchar *)xmlGetProp (xnode, (const xmlChar *)"element2"); + zak_form_validator_compare_number_set_element2 ((ZakFormValidatorCompareNumber *)validator, (ZakFormForm *)form, prop); + g_free (prop); + + return TRUE; +} + +/** + * zak_form_validator_compare_number_set_compare_type: + * @validator: + * @type: + * + * Sets the validator compare type. + */ +void +zak_form_validator_compare_number_set_compare_type (ZakFormValidatorCompareNumber *validator, const gchar *type) +{ + ZakFormValidatorCompareNumberPrivate *priv = ZAK_FORM_VALIDATOR_COMPARE_NUMBER_GET_PRIVATE (validator); + + priv->type = zak_form_get_compare_type_from_string (type); +} + +/** + * zak_form_validator_compare_number_get_compare_type: + * @validator: + * + * Returns: the validator compare type. + */ +const gchar +*zak_form_validator_compare_number_get_compare_type (ZakFormValidatorCompareNumber *validator) +{ + ZakFormValidatorCompareNumberPrivate *priv = ZAK_FORM_VALIDATOR_COMPARE_NUMBER_GET_PRIVATE (validator); + + zak_form_get_compare_type_stringify (priv->type); +} + +/** + * zak_form_validator_compare_number_set_element1: + * @validator: + * @element1: + * + * Sets the validator element1. + */ +void +zak_form_validator_compare_number_set_element1 (ZakFormValidatorCompareNumber *validator, ZakFormForm *form, const gchar *element1) +{ + ZakFormValidatorCompareNumberPrivate *priv = ZAK_FORM_VALIDATOR_COMPARE_NUMBER_GET_PRIVATE (validator); + + priv->v1 = zak_form_form_get_element_by_id (form, element1); + if (!ZAK_FORM_IS_ELEMENT (priv->v1)) + { + g_warning ("Validator compare: element «%s» isn't a ZakFormElement.", element1); + } +} + +/** + * zak_form_validator_compare_number_get_element1: + * @validator: + * + * Returns: the validator element1 name. + */ +const gchar +*zak_form_validator_compare_number_get_element1 (ZakFormValidatorCompareNumber *validator) +{ + ZakFormValidatorCompareNumberPrivate *priv = ZAK_FORM_VALIDATOR_COMPARE_NUMBER_GET_PRIVATE (validator); + + if (ZAK_FORM_IS_ELEMENT (priv->v2)) + { + return zak_form_element_get_name (priv->v2); + } + else + { + return ""; + } +} + +/** + * zak_form_validator_compare_number_set_element2: + * @validator: + * @element2: + * + * Sets the validator element2. + */ +void +zak_form_validator_compare_number_set_element2 (ZakFormValidatorCompareNumber *validator, ZakFormForm *form, const gchar *element2) +{ + ZakFormValidatorCompareNumberPrivate *priv = ZAK_FORM_VALIDATOR_COMPARE_NUMBER_GET_PRIVATE (validator); + + priv->v2 = zak_form_form_get_element_by_id (form, element2); + if (!ZAK_FORM_IS_ELEMENT (priv->v2)) + { + g_warning ("Validator compare: element «%s» isn't a ZakFormElement.", element2); + } +} + +/** + * zak_form_validator_compare_number_get_element2: + * @validator: + * + * Returns: the validator element2 name. + */ +const gchar +*zak_form_validator_compare_number_get_element2 (ZakFormValidatorCompareNumber *validator) +{ + ZakFormValidatorCompareNumberPrivate *priv = ZAK_FORM_VALIDATOR_COMPARE_NUMBER_GET_PRIVATE (validator); + + if (ZAK_FORM_IS_ELEMENT (priv->v2)) + { + return zak_form_element_get_name (priv->v2); + } + else + { + return ""; + } +} + +/* PRIVATE */ +static void +zak_form_validator_compare_number_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + ZakFormValidatorCompareNumber *validator = (ZakFormValidatorCompareNumber *)object; + ZakFormValidatorCompareNumberPrivate *priv = ZAK_FORM_VALIDATOR_COMPARE_NUMBER_GET_PRIVATE (validator); + + switch (property_id) + { + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +zak_form_validator_compare_number_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + ZakFormValidatorCompareNumber *validator = (ZakFormValidatorCompareNumber *)object; + ZakFormValidatorCompareNumberPrivate *priv = ZAK_FORM_VALIDATOR_COMPARE_NUMBER_GET_PRIVATE (validator); + + switch (property_id) + { + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +zak_form_validator_compare_number_dispose (GObject *gobject) +{ + ZakFormValidatorCompareNumber *validator = (ZakFormValidatorCompareNumber *)gobject; + ZakFormValidatorCompareNumberPrivate *priv = ZAK_FORM_VALIDATOR_COMPARE_NUMBER_GET_PRIVATE (validator); + + + + GObjectClass *parent_class = g_type_class_peek_parent (G_OBJECT_GET_CLASS (gobject)); + parent_class->dispose (gobject); +} + +static void +zak_form_validator_compare_number_finalize (GObject *gobject) +{ + ZakFormValidatorCompareNumber *validator = (ZakFormValidatorCompareNumber *)gobject; + ZakFormValidatorCompareNumberPrivate *priv = ZAK_FORM_VALIDATOR_COMPARE_NUMBER_GET_PRIVATE (validator); + + + + GObjectClass *parent_class = g_type_class_peek_parent (G_OBJECT_GET_CLASS (gobject)); + parent_class->finalize (gobject); +} + +static gboolean +zak_form_validator_compare_number_validate (ZakFormValidator *validator) +{ + gboolean ret; + + gdouble value1; + gdouble value2; + + gint comp; + gchar *msg; + + ZakFormValidatorCompareNumberPrivate *priv = ZAK_FORM_VALIDATOR_COMPARE_NUMBER_GET_PRIVATE (validator); + + ret = FALSE; + + if (!ZAK_FORM_IS_ELEMENT (priv->v1) + || !ZAK_FORM_IS_ELEMENT (priv->v2)) + { + ret = TRUE; + } + else + { + value1 = g_strtod (zak_form_element_get_value (priv->v1), NULL); + value2 = g_strtod (zak_form_element_get_value (priv->v2), NULL); + + if (value1 < value2) + { + ret = (priv->type == ZAK_FORM_COMPARE_TYPE_LESSER + || priv->type == ZAK_FORM_COMPARE_TYPE_LESSER_EQUAL + || priv->type == ZAK_FORM_COMPARE_TYPE_NOT_EQUAL); + } + else if (value1 == value2) + { + ret = (priv->type == ZAK_FORM_COMPARE_TYPE_LESSER_EQUAL + || priv->type == ZAK_FORM_COMPARE_TYPE_EQUAL + || priv->type == ZAK_FORM_COMPARE_TYPE_GREATER_EQUAL); + } + else if (value1 > value2) + { + ret = (priv->type == ZAK_FORM_COMPARE_TYPE_GREATER + || priv->type == ZAK_FORM_COMPARE_TYPE_GREATER_EQUAL + || priv->type == ZAK_FORM_COMPARE_TYPE_NOT_EQUAL); + } + + if (!ret) + { + msg = g_strdup_printf (_("«%s» must be %s «%s»"), + zak_form_element_get_long_name (priv->v1), + zak_form_get_compare_type_stringify (priv->type), + zak_form_element_get_long_name (priv->v2)); + zak_form_validator_set_message (validator, msg); + g_free (msg); + } + } + + return ret; +} diff --git a/src/formvalidatorcomparenumber.h b/src/formvalidatorcomparenumber.h new file mode 100644 index 0000000..441954d --- /dev/null +++ b/src/formvalidatorcomparenumber.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2020 Andrea Zagli + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __ZAK_FORM_VALIDATOR_COMPARE_NUMBER_H__ +#define __ZAK_FORM_VALIDATOR_COMPARE_NUMBER_H__ + + +#include + +#include + +#include "form.h" +#include "formvalidator.h" + + +G_BEGIN_DECLS + + +#define ZAK_FORM_TYPE_VALIDATOR_COMPARE_NUMBER zak_form_validator_compare_number_get_type () +G_DECLARE_FINAL_TYPE (ZakFormValidatorCompareNumber, zak_form_validator_compare_number, ZAK_FORM, VALIDATOR_COMPARE_NUMBER, ZakFormValidator) + +ZakFormValidatorCompareNumber *zak_form_validator_compare_number_new (void); + +void zak_form_validator_compare_number_set_compare_type (ZakFormValidatorCompareNumber *validator, const gchar *type); +const gchar *zak_form_validator_compare_number_get_compare_type (ZakFormValidatorCompareNumber *validator); + +void zak_form_validator_compare_number_set_element1 (ZakFormValidatorCompareNumber *validator, ZakFormForm *form, const gchar *element1); +const gchar *zak_form_validator_compare_number_get_element1 (ZakFormValidatorCompareNumber *validator); + +void zak_form_validator_compare_number_set_element2 (ZakFormValidatorCompareNumber *validator, ZakFormForm *form, const gchar *element2); +const gchar *zak_form_validator_compare_number_get_element2 (ZakFormValidatorCompareNumber *validator); + + +G_END_DECLS + + +#endif /* __ZAK_FORM_VALIDATOR_COMPARE_NUMBER_H__ */ -- 2.49.0