From e32fb33706a8ad33db78f8caae8f84ec2d9508cd Mon Sep 17 00:00:00 2001 From: Andrea Zagli Date: Mon, 3 Aug 2009 17:41:49 +0200 Subject: [PATCH] Added test from xml binded to a database. Fixed many bugs. --- .gitignore | 1 + ChangeLog | 32 +++- config.h.in | 3 + libgtkform.pc.in | 2 +- src/fieldboolean.c | 22 ++- src/fielddatetime.c | 8 +- src/fieldtext.c | 10 +- src/widgetcheck.c | 22 ++- test/Makefile.am | 3 +- test/database.db | Bin 0 -> 2048 bytes test/from_xml_with_db.c | 225 ++++++++++++++++++++++ test/test_db.gui | 413 ++++++++++++++++++++++++++++++++++++++++ test/test_db.xml | 47 +++++ 13 files changed, 772 insertions(+), 16 deletions(-) create mode 100644 test/database.db create mode 100644 test/from_xml_with_db.c create mode 100644 test/test_db.gui create mode 100644 test/test_db.xml diff --git a/.gitignore b/.gitignore index cdb61ce..ecd4e08 100644 --- a/.gitignore +++ b/.gitignore @@ -40,6 +40,7 @@ src/libgtkform.la test/.libs/ test/test test/from_xml +test/from_xml_with_db *.bak *.stamp *.tar.gz diff --git a/ChangeLog b/ChangeLog index 477e5a8..9819050 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,36 @@ +commit 6fa9f1b3d2febf69b2cde145fca1b6af6db28e98 +Author: Andrea Zagli +Date: 2009-08-01 + + Replaced strptime with a custom function, because strptime is not + implemented on windows. + +M docs/reference/libgtkform-decl-list.txt +M docs/reference/libgtkform-decl.txt +M docs/reference/libgtkform-undocumented.txt +M docs/reference/libgtkform-unused.txt +M src/fielddatetime.c +M src/fielddatetime.h +M src/form.c +M test/test.xml + +commit 5b5ed2d9881acc46488341de18e24848e514d5d0 +Author: Andrea Zagli +Date: 2009-08-01 + + Changed autogen.sh to work on windows. + +M .gitignore +M ChangeLog +M autogen.sh +M docs/reference/libgtkform-decl-list.txt +M docs/reference/libgtkform-decl.txt +M docs/reference/libgtkform-undocumented.txt +M docs/reference/libgtkform-unused.txt + commit 9ba72dc3a4d7c9677c29ad64d078b48ffa6f6b6e Author: Andrea Zagli -Date: 2009-07-30 +Date: 2009-07-30 Finished to implement definition load from xml file. diff --git a/config.h.in b/config.h.in index 6816f30..4388cd2 100644 --- a/config.h.in +++ b/config.h.in @@ -68,6 +68,9 @@ /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME +/* Define to the home page for this package. */ +#undef PACKAGE_URL + /* Define to the version of this package. */ #undef PACKAGE_VERSION diff --git a/libgtkform.pc.in b/libgtkform.pc.in index bfbedc4..86fc551 100644 --- a/libgtkform.pc.in +++ b/libgtkform.pc.in @@ -4,7 +4,7 @@ libdir=@libdir@ includedir=@includedir@ Name: @PACKAGE_NAME@ -Description: Class for easly manage Gtk+ forms binded to db. +Description: Class for easly manage Gtk+ forms binded to db (or not). Version: @PACKAGE_VERSION@ Requires: gtk+-2.0, libxml-2.0, libgdaex Libs: -L${libdir} -lgtkform diff --git a/src/fieldboolean.c b/src/fieldboolean.c index 96874f0..fb00e9e 100644 --- a/src/fieldboolean.c +++ b/src/fieldboolean.c @@ -164,7 +164,7 @@ const gchar bool_value = gtk_form_field_boolean_str_to_boolean (value); - ret = g_strconcat ("'", (bool_value ? "t" : "f"), "'", NULL); + ret = g_strconcat ("'", (bool_value ? "1" : "0"), "'", NULL); } return ret; @@ -213,15 +213,23 @@ gboolean gtk_form_field_boolean_set_from_datamodel (GtkFormField *field, GdaDataModel *dm, gint row) { gboolean ret = FALSE; - const gchar *field_name = gtk_form_field_get_field_name (field); + const gchar *field_name; + gchar *value; - if (dm != NULL) - { - 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); + + field_name = gtk_form_field_get_field_name (field); - value = g_strdup_printf ("%d", gdaex_data_model_get_field_value_boolean_at (dm, row, field_name)); - ret = gtk_form_field_boolean_set_value_stringify (field, value); + if (gdaex_data_model_get_field_value_boolean_at (dm, row, field_name)) + { + value = g_strdup_printf ("TRUE"); + } + else + { + value = g_strdup_printf ("FALSE"); } + ret = gtk_form_field_boolean_set_value_stringify (field, value); return ret; } diff --git a/src/fielddatetime.c b/src/fielddatetime.c index e9a1da4..1a7be41 100644 --- a/src/fielddatetime.c +++ b/src/fielddatetime.c @@ -223,13 +223,17 @@ gtk_form_field_datetime_clear (GtkFormField *field) { char *buf; - buf = malloc (100); + buf = malloc (30); - if (strftime (buf, 100, format, priv->default_value) != '\0') + if (strftime (buf, 30, format, priv->default_value) != '\0') { ret = gtk_form_field_datetime_set_value_stringify (field, buf); } } + else + { + ret = gtk_form_field_datetime_set_value_stringify (field, ""); + } return ret; } diff --git a/src/fieldtext.c b/src/fieldtext.c index 0510976..263e458 100644 --- a/src/fieldtext.c +++ b/src/fieldtext.c @@ -210,8 +210,14 @@ gtk_form_field_text_set_from_datamodel (GtkFormField *field, GdaDataModel *dm, g if (dm != NULL) { - ret = gtk_form_field_text_set_value_stringify (field, - gdaex_data_model_get_field_value_stringify_at (dm, row, field_name)); + 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); } return ret; diff --git a/src/widgetcheck.c b/src/widgetcheck.c index 0df26c7..3875b9d 100644 --- a/src/widgetcheck.c +++ b/src/widgetcheck.c @@ -91,9 +91,23 @@ GtkFormWidget const gchar *gtk_form_widget_check_get_value_stringify (GtkFormWidget *fwidget) { - GtkWidget *w = gtk_form_widget_get_widget (fwidget); + GtkWidget *w; + gchar *ret; + + g_return_val_if_fail (IS_GTK_FORM_WIDGET_CHECK (fwidget), ""); + + w = gtk_form_widget_get_widget (fwidget); - return g_strdup_printf ("%d", gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w))); + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w))) + { + ret = g_strdup ("TRUE"); + } + else + { + ret = g_strdup ("FALSE"); + } + + return ret; } /** @@ -109,6 +123,8 @@ gtk_form_widget_check_set_value_stringify (GtkFormWidget *fwidget, const gchar * GtkWidget *w; gboolean active = FALSE; + g_return_val_if_fail (IS_GTK_FORM_WIDGET_CHECK (fwidget), FALSE); + g_object_get (G_OBJECT (fwidget), "widget", &w, NULL); @@ -133,6 +149,8 @@ gtk_form_widget_check_set_editable (GtkFormWidget *fwidget, gboolean editable) { GtkWidget *w; + g_return_if_fail (IS_GTK_FORM_WIDGET_CHECK (fwidget)); + g_object_get (G_OBJECT (fwidget), "widget", &w, NULL); diff --git a/test/Makefile.am b/test/Makefile.am index 4537996..65a35b6 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -6,7 +6,8 @@ AM_CPPFLAGS = $(GTKFORM_CFLAGS) \ -DGUIDIR="\"@abs_builddir@\"" noinst_PROGRAMS = test \ - from_xml + from_xml \ + from_xml_with_db test_SOURCES = main.c diff --git a/test/database.db b/test/database.db new file mode 100644 index 0000000000000000000000000000000000000000..1d3b906331c3a2fa77bc42c00e68d6fe4bba6d21 GIT binary patch literal 2048 zcmeHH%}&EG3{L38&m>M9IL;i9R;jDXc0s^_ZbUG#ALuH?PAFT$h-i~4EkixRJMc*G zT%<)CJ@5cbnq|j7vGrMw;?Zr7rwksYif9TgR6!V{a{z?Uo|ZCU?c}ncvb~7?sdsf0 z8xGREru76?dIE2KytQAe;dh?WNyw%zNh%|zlBKcH@rdga@ZENgz%mSV9zb{ClS|@R zAZWzk&hkUaR(LzESV}E7g;{J_br%kl|BVD zgA0vrL1#D^`JSs0Ay!=1XAjRTgB!2gcfB!OlX2dWY36^^Fc>yIj4y+&^wX@HUr*pa zOh6oBY + * + * 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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include + +#include + +#include + +#include "form.h" +#include "field.h" +#include "fieldboolean.h" +#include "fielddatetime.h" +#include "fieldinteger.h" +#include "fieldfloat.h" +#include "fieldtext.h" +#include "widget.h" +#include "widgetcheck.h" +#include "widgetcombobox.h" +#include "widgetentry.h" +#include "widgetlabel.h" +#include "widgetspin.h" +#include "widgettextview.h" + +GdaEx *gdaex; + +GtkForm *form; + +GtkWidget *w; +GtkWidget *lbl_id; +GtkWidget *txtv_sql; +GtkWidget *btn_new; +GtkWidget *btn_edit; +GtkWidget *btn_delete; +GtkWidget *cb_customers; +GtkWidget *btn_open; + +GtkListStore *lstore_customers; + +GtkTextBuffer *buf; + +gint current_id; + +void fill_cb_customers (void); + +void +on_btn_new_clicked (GtkButton *button, + gpointer user_data) +{ + gtk_form_clear (form); + current_id = 0; +} + +void +on_btn_save_clicked (GtkButton *button, + gpointer user_data) +{ + gchar *sql; + + if (current_id == 0) + { + /* must find new id */ + GdaDataModel *dm; + gint new_id = 0; + + sql = "SELECT MAX(id) FROM customers"; + dm = gdaex_query (gdaex, sql); + + if (dm != NULL) + { + new_id = gdaex_data_model_get_value_integer_at (dm, 0, 0); + } + new_id++; + + gtk_label_set_text (GTK_LABEL (lbl_id), g_strdup_printf ("%d", new_id)); + + sql = gtk_form_get_sql (form, GTK_FORM_SQL_INSERT); + } + else + { + sql = gtk_form_get_sql (form, GTK_FORM_SQL_UPDATE); + } + + gtk_text_buffer_set_text (buf, sql, strlen (sql)); + + gdaex_execute (gdaex, sql); + + fill_cb_customers (); + on_btn_new_clicked (NULL, NULL); +} + +void +on_btn_delete_clicked (GtkButton *button, + gpointer user_data) +{ + gchar *sql = gtk_form_get_sql (form, GTK_FORM_SQL_DELETE); + + gtk_text_buffer_set_text (buf, sql, strlen (sql)); + + gdaex_execute (gdaex, sql); + + fill_cb_customers (); + on_btn_new_clicked (NULL, NULL); +} + +void +on_btn_open_clicked (GtkButton *button, + gpointer user_data) +{ + GtkTreeIter iter; + gint id; + GdaDataModel *dm; + + if (!gtk_combo_box_get_active_iter (GTK_COMBO_BOX (cb_customers), &iter)) + { + return; + } + + gtk_tree_model_get (GTK_TREE_MODEL (lstore_customers), &iter, + 0, &id, + -1); + + gtk_label_set_text (GTK_LABEL (lbl_id), g_strdup_printf ("%d", id)); + + gchar *sql = gtk_form_get_sql (form, GTK_FORM_SQL_SELECT); + + gtk_text_buffer_set_text (buf, sql, strlen (sql)); + + dm = gdaex_query (gdaex, sql); + if (dm == NULL) + { + on_btn_new_clicked (NULL, NULL); + return; + } + + gtk_form_fill_from_datamodel (form, dm, 0); + current_id = id; +} + +void +fill_cb_customers (void) +{ + gchar *sql = "SELECT * FROM customers"; + GtkTreeIter iter; + GdaDataModel *dm; + gint rows; + gint row; + + gtk_list_store_clear (lstore_customers); + + dm = gdaex_query (gdaex, sql); + if (dm == NULL) + { + return; + } + + rows = gda_data_model_get_n_rows (dm); + for (row = 0; row < rows; row++) + { + gtk_list_store_append (lstore_customers, &iter); + gtk_list_store_set (lstore_customers, &iter, + 0, gdaex_data_model_get_field_value_integer_at (dm, row, "id"), + 1, gdaex_data_model_get_field_value_stringify_at (dm, row, "name"), + -1); + } +} + +int +main (int argc, char **argv) +{ + GtkBuilder *gtkbuilder; + + gtk_init (&argc, &argv); + + gdaex = gdaex_new_from_string ("SQLite://DB_DIR=test;DB_NAME=database.db"); + if (gdaex == NULL) + { + return 0; + } + + form = gtk_form_new_from_file (GUIDIR "/test_db.xml", NULL); + if (form == NULL) return 0; + + gtkbuilder = gtk_form_get_gtkbuilder (form); + + w = GTK_WIDGET (gtk_builder_get_object (gtkbuilder, "wMain")); + + lbl_id = GTK_WIDGET (gtk_builder_get_object (gtkbuilder, "lbl_id")); + btn_new = GTK_WIDGET (gtk_builder_get_object (gtkbuilder, "btn_new")); + btn_edit = GTK_WIDGET (gtk_builder_get_object (gtkbuilder, "btn_edit")); + btn_delete = GTK_WIDGET (gtk_builder_get_object (gtkbuilder, "btn_delete")); + cb_customers = GTK_WIDGET (gtk_builder_get_object (gtkbuilder, "cb_customers")); + btn_open = GTK_WIDGET (gtk_builder_get_object (gtkbuilder, "btn_open")); + + lstore_customers = GTK_LIST_STORE (gtk_builder_get_object (gtkbuilder, "lstore_customers")); + + fill_cb_customers (); + on_btn_new_clicked (NULL, NULL); + + txtv_sql = GTK_WIDGET (gtk_builder_get_object (gtkbuilder, "txtv_sql")); + buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (txtv_sql)); + + gtk_builder_connect_signals (gtkbuilder, NULL); + + gtk_widget_show_all (w); + + gtk_main (); + + return 0; +} diff --git a/test/test_db.gui b/test/test_db.gui new file mode 100644 index 0000000..216dc37 --- /dev/null +++ b/test/test_db.gui @@ -0,0 +1,413 @@ + + + + + + True + test libform + 600 + 440 + + + + True + 3 + + + True + 3 + 7 + 2 + 3 + 3 + + + True + 0 + ID + + + GTK_FILL + + + + + + True + 0 + Name + + + 1 + 2 + GTK_FILL + + + + + + True + 0 + + + 1 + 2 + GTK_FILL + + + + + + True + True + 200 + + + 1 + 2 + 1 + 2 + + + + + + True + 0 + Age + + + 2 + 3 + GTK_FILL + + + + + + True + True + adjustment2 + 1 + + + 1 + 2 + 2 + 3 + + + + + + True + 0 + Nation + + + 3 + 4 + GTK_FILL + + + + + + True + 0 + Married + + + 4 + 5 + GTK_FILL + + + + + + True + True + False + True + True + + + 1 + 2 + 4 + 5 + GTK_FILL + + + + + + True + 0 + Description + + + 5 + 6 + GTK_FILL + + + + + + True + True + + + True + True + + + + + 1 + 2 + 5 + 6 + GTK_FILL + GTK_FILL + + + + + True + 0 + Birthday + + + 6 + 7 + GTK_FILL + + + + + + True + lstore_nation + + + + 1 + + + + + 1 + 2 + 3 + 4 + GTK_FILL + GTK_FILL + + + + + True + True + 10 + + + + 1 + 2 + 6 + 7 + + + + + False + 0 + + + + + + + + True + spread + + + gtk-new + True + True + True + False + True + True + + + + False + False + 0 + + + + + gtk-save + True + True + True + False + True + True + + + + False + False + 1 + + + + + gtk-delete + True + True + True + False + True + True + + + + False + False + 2 + + + + + True + lstore_customers + + + + 1 + + + + + False + False + 3 + + + + + gtk-open + True + True + True + True + + + + False + False + 4 + + + + + False + False + 2 + + + + + True + 2 + + + True + 0 + SQL + + + GTK_FILL + + + + + + True + True + in + + + True + True + False + word + + + + + 1 + 2 + + + + + 3 + + + + + + + 1 + 100 + 1 + 10 + + + + + + + + + + + + + + + + + + + 1 + China + + + 2 + Germany + + + 3 + India + + + 4 + Italy + + + 6 + USA + + + + diff --git a/test/test_db.xml b/test/test_db.xml new file mode 100644 index 0000000..c62baa9 --- /dev/null +++ b/test/test_db.xml @@ -0,0 +1,47 @@ + + + test/test_db.gui + + customers
+ + + + t + + + + + + TRUE + + + + + + + + + + 0 + + 3 + + + + + + + + + + + It is... + + + + + + + + +
-- 2.49.0