From: Andrea Zagli Date: Sun, 13 Sep 2020 15:01:39 +0000 (+0200) Subject: Added fuctions new_from_xml and new_from_file. X-Git-Url: https://saetta.ns0.it/gitweb?a=commitdiff_plain;h=3b297cb1a1678ed5b3c85b1315d1c87c2a6941c0;p=libgdaexgrid Added fuctions new_from_xml and new_from_file. --- diff --git a/.gitignore b/.gitignore index de7188b..afcfcc0 100644 --- a/.gitignore +++ b/.gitignore @@ -59,6 +59,7 @@ Rules-quot *.exe *.csv tests/grid +tests/grid_from_xml tests/grid_tree test-driver *.gir diff --git a/src/grid.c b/src/grid.c index 3e20c7d..8925e17 100644 --- a/src/grid.c +++ b/src/grid.c @@ -1,7 +1,7 @@ /* * grid.c * - * Copyright (C) 2010-2019 Andrea Zagli + * Copyright (C) 2010-2020 Andrea Zagli * * This file is part of libgdaexgrid. * @@ -38,6 +38,8 @@ #include #endif +#include + #include "grid.h" static void gdaex_grid_class_init (GdaExGridClass *klass); @@ -193,6 +195,149 @@ GdaExGrid return gdaex_grid; } +GdaExGrid +*gdaex_grid_new_from_xml (xmlDoc *xdoc) +{ + GdaExGrid *grid; + + GdaExGridColumn *col; + + gchar *title; + gchar *field_name; + GType type; + gboolean visible; + gboolean resizable; + gboolean sortable; + gboolean reorderable; + gint decimals; + + xmlNode *cur; + xmlNode *xcol; + + grid = gdaex_grid_new (); + + cur = xmlDocGetRootElement (xdoc); + + if (cur != NULL) + { + if (xmlStrEqual (cur->name, (const xmlChar *)"gdaexgrid")) + { + cur = cur->children; + while (cur) + { + if (xmlStrEqual (cur->name, (const xmlChar *)"title")) + { + gdaex_grid_set_title (grid, (gchar *)xmlNodeGetContent (cur)); + } + else if (xmlStrEqual (cur->name, (const xmlChar *)"columns")) + { + xcol = cur->children; + while (xcol) + { + if (xmlStrEqual (xcol->name, (const xmlChar *)"column")) + { + title = (gchar *)xmlGetProp (xcol, (const xmlChar *)"title"); + field_name = (gchar *)xmlGetProp (xcol, (const xmlChar *)"field_name"); + + type = gda_g_type_from_string ((gchar *)xmlGetProp (xcol, (const xmlChar *)"type")); + + if (xmlGetProp (xcol, (const xmlChar *)"visible") == NULL) + { + visible = TRUE; + } + else + { + visible = zak_utils_string_to_boolean ((gchar *)xmlGetProp (xcol, (const xmlChar *)"visible")); + } + + if (xmlGetProp (xcol, (const xmlChar *)"resizable") == NULL) + { + resizable = TRUE; + } + else + { + resizable = zak_utils_string_to_boolean ((gchar *)xmlGetProp (xcol, (const xmlChar *)"resizable")); + } + + if (xmlGetProp (xcol, (const xmlChar *)"sortable") == NULL) + { + sortable = TRUE; + } + else + { + sortable = zak_utils_string_to_boolean ((gchar *)xmlGetProp (xcol, (const xmlChar *)"sortable")); + } + + if (xmlGetProp (xcol, (const xmlChar *)"reorderable") == NULL) + { + reorderable = TRUE; + } + else + { + reorderable = zak_utils_string_to_boolean ((gchar *)xmlGetProp (xcol, (const xmlChar *)"reorderable")); + } + + if (xmlGetProp (xcol, (const xmlChar *)"decimals") == NULL) + { + if (type == G_TYPE_FLOAT || type == G_TYPE_DOUBLE) + { + decimals = 2; + } + else + { + decimals = 0; + } + } + else + { + decimals = strtol ((gchar *)xmlGetProp (xcol, (const xmlChar *)"decimals"), NULL, 10); + } + + col = gdaex_grid_column_new (title, + field_name, + type, + visible, + resizable, + sortable, + reorderable, + decimals); + gdaex_grid_add_column (grid, col); + + if (xmlGetProp (xcol, (const xmlChar *)"viewable") != NULL) + { + gdaex_grid_column_set_viewable (col, zak_utils_string_to_boolean ((gchar *)xmlGetProp (xcol, (const xmlChar *)"reorderable"))); + } + } + + xcol = xcol->next; + } + } + + cur = cur->next; + } + } + else + { + g_warning ("Not a GdaExGrid xml definition."); + } + } + + return grid; +} + +GdaExGrid +*gdaex_grid_new_from_file (const gchar *filename) +{ + GdaExGrid *grid; + xmlDoc *xdoc; + + xdoc = xmlParseFile (filename); + + grid = gdaex_grid_new_from_xml (xdoc); + + return grid; +} + /** * gdaex_grid_set_app_textdomain: * @grid: a #GdaExGrid object. diff --git a/src/grid.h b/src/grid.h index 3037775..1040621 100644 --- a/src/grid.h +++ b/src/grid.h @@ -1,7 +1,7 @@ /* * grid.h * - * Copyright (C) 2010-2019 Andrea Zagli + * Copyright (C) 2010-2020 Andrea Zagli * * This file is part of libgdaexgrid. * @@ -60,6 +60,8 @@ GType gdaex_grid_get_type (void) G_GNUC_CONST; GdaExGrid *gdaex_grid_new (void); +GdaExGrid *gdaex_grid_new_from_xml (xmlDoc *xdoc); +GdaExGrid *gdaex_grid_new_from_file (const gchar *filename); void gdaex_grid_set_app_textdomain (GdaExGrid *grid, const gchar *textdomain); diff --git a/tests/Makefile.am b/tests/Makefile.am index 6fe973c..d028fb8 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -15,6 +15,7 @@ endif noinst_PROGRAMS = \ grid \ + grid_from_xml \ grid_tree LDADD = $(top_builddir)/src/libgdaexgrid.la diff --git a/tests/grid.xml b/tests/grid.xml new file mode 100644 index 0000000..36f9643 --- /dev/null +++ b/tests/grid.xml @@ -0,0 +1,15 @@ + + + The grid title + + + + + + + + + + + + diff --git a/tests/grid_from_xml.c b/tests/grid_from_xml.c new file mode 100644 index 0000000..a17329b --- /dev/null +++ b/tests/grid_from_xml.c @@ -0,0 +1,141 @@ +/* + * Copyright (C) 2011-2019 Andrea Zagli + * + * 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 "grid.h" +#include "gridcolumn.h" + +GdaExGridColumn *gcol_birthday; +GdaExGridColumn *gcol_viewable; + +static void +missing_func (GtkTreeStore *tstore, GtkTreeIter *iter, gpointer user_data) +{ + gtk_tree_store_set (tstore, iter, + 7, "missing", + -1); +} + +static void +on_btn_birthday_clicked (GtkButton *button, + gpointer user_data) +{ + gdaex_grid_column_set_visible (gcol_birthday, !gdaex_grid_column_get_visible (gcol_birthday)); +} + +static void +on_btn_viewable_clicked (GtkButton *button, + gpointer user_data) +{ + gdaex_grid_column_set_viewable (gcol_viewable, !gdaex_grid_column_get_viewable (gcol_viewable)); +} + +int +main (int argc, char **argv) +{ + GdaEx *gdaex; + + GtkWidget *w; + GtkWidget *vbox; + GtkWidget *scrolledw; + GtkWidget *hbtnbox; + GtkWidget *btn; + + GdaExGrid *grid; + GtkWidget *wgrid; + + gtk_init (&argc, &argv); + + gdaex = gdaex_new_from_string (g_strdup_printf ("SQLite://DB_DIR=%s;DB_NAME=grid.db", TESTSDIR)); + if (gdaex == NULL) + { + g_error ("Unable to connect to the db."); + } + + w = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_default_size (GTK_WINDOW (w), 550, 350); + g_signal_connect (w, "delete-event", + G_CALLBACK (gtk_false), NULL); + g_signal_connect (w, "destroy", + G_CALLBACK (gtk_main_quit), NULL); + + vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); + gtk_container_add (GTK_CONTAINER (w), vbox); + + scrolledw = gtk_scrolled_window_new (NULL, NULL); + gtk_box_pack_start (GTK_BOX (vbox), scrolledw, TRUE, TRUE, 0); + + grid = gdaex_grid_new_from_file (argv[1]); + + /* grid = gdaex_grid_new (); */ + /* gdaex_grid_set_title (grid, "The grid title"); */ + + /* gcol = gdaex_grid_column_new ("ID", "id", G_TYPE_INT, TRUE, FALSE, FALSE, FALSE, -1); */ + /* gdaex_grid_add_column (grid, gcol); */ + + /* gcol = gdaex_grid_column_new ("Name", "name", G_TYPE_STRING, TRUE, TRUE, TRUE, TRUE, -1); */ + /* gdaex_grid_add_column (grid, gcol); */ + + /* gcol = gdaex_grid_column_new_defaults ("Surname", "surname", G_TYPE_STRING); */ + /* gdaex_grid_add_column (grid, gcol); */ + + /* gcol = gdaex_grid_column_new_defaults ("Age", "age", G_TYPE_INT); */ + /* gdaex_grid_add_column (grid, gcol); */ + + /* gcol = gdaex_grid_column_new_defaults ("Missing", "missing", G_TYPE_STRING); */ + /* gdaex_grid_add_column (grid, gcol); */ + + /* gcol_birthday = gdaex_grid_column_new ("Birthday", "birthday", G_TYPE_DATE, FALSE, TRUE, TRUE, TRUE, -1); */ + /* gdaex_grid_add_column (grid, gcol_birthday); */ + + /* gcol = gdaex_grid_column_new_defaults ("Incoming", "incoming", G_TYPE_DOUBLE); */ + /* gdaex_grid_add_column (grid, gcol); */ + + /* gcol = gdaex_grid_column_new ("Married", "married", G_TYPE_BOOLEAN, TRUE, TRUE, TRUE, TRUE, -1); */ + /* gdaex_grid_add_column (grid, gcol); */ + + /* gcol_viewable = gdaex_grid_column_new ("Viewable", "viewable", G_TYPE_BOOLEAN, TRUE, TRUE, TRUE, TRUE, -1); */ + /* gdaex_grid_add_column (grid, gcol_viewable); */ + + wgrid = gdaex_grid_get_widget (grid); + gtk_container_add (GTK_CONTAINER (scrolledw), wgrid); + + gdaex_grid_fill_from_sql_with_missing_func (grid, gdaex, "SELECT name, surname, id, birthday, married, incoming, age FROM clients", missing_func, NULL, NULL); + + hbtnbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL); + gtk_box_pack_start (GTK_BOX (vbox), hbtnbox, FALSE, FALSE, 0); + + /* btn = gtk_button_new_with_label ("Hide/Show Birthday"); */ + /* gtk_box_pack_start (GTK_BOX (hbtnbox), btn, TRUE, TRUE, 0); */ + + /* g_signal_connect (G_OBJECT (btn), "clicked", */ + /* G_CALLBACK (on_btn_birthday_clicked), NULL); */ + + /* btn = gtk_button_new_with_label ("Set/Unset Viewable"); */ + /* gtk_box_pack_start (GTK_BOX (hbtnbox), btn, TRUE, TRUE, 0); */ + + /* g_signal_connect (G_OBJECT (btn), "clicked", */ + /* G_CALLBACK (on_btn_viewable_clicked), NULL); */ + + gtk_widget_show_all (w); + + gtk_main (); + + return 0; +}