]> saetta.ns0.it Git - reptool/libreptool/commitdiff
Continuing RptReport.
authorAndrea Zagli <azagli@libero.it>
Sun, 18 Mar 2007 16:58:41 +0000 (16:58 +0000)
committerAndrea Zagli <azagli@libero.it>
Sun, 18 Mar 2007 16:58:41 +0000 (16:58 +0000)
git-svn-id: svn+ssh://saetta.homelinux.org/svn/libreptool/trunk@5 3191ed1d-3fce-41bb-ab4a-0cebc0943b59

data/reptool.dtd
src/rptobject.c
src/rptobject.h
src/rptobjecttext.c
src/rptobjecttext.h
src/rptreport.c
tests/db_test.db [new file with mode: 0644]
tests/test_report_db.rpt [new file with mode: 0644]

index bba7fd02a7ba25e1a5ad5647e7554d57add3c25b..b1f192b896d588e1e0d95cd663a174b585514e8a 100644 (file)
 
 <!ELEMENT report-header (%objects;)>
 <!ATTLIST report-header
-  height   CDATA #REQUIRED
+  height           CDATA #REQUIRED
+  new-page-after   (y | n) #IMPLIED
 >
 
 <!ELEMENT report-footer (%objects;)>
 <!ATTLIST report-footer
-  height   CDATA #REQUIRED
-  align    (none | bottom) "none"
+  height            CDATA #REQUIRED
+  align             (none | bottom) #IMPLIED
+  new-page-before   (y | n) #IMPLIED
 >
 
 <!ELEMENT page-header (%objects;)>
 <!ATTLIST page-header
   height       CDATA #REQUIRED
-  first-page   (y | n) "y"
+  first-page   (y | n) #IMPLIED
 >
 
 <!ELEMENT page-footer (%objects;)>
 <!ATTLIST page-footer
   height       CDATA #REQUIRED
-  first-page   (y | n ) "y"
+  first-page   (y | n ) #IMPLIED
 >
 
 <!ELEMENT group (groupheader?, groupfooter?)>
 <!ELEMENT group-footer (%objects;)>
 <!ATTLIST group-footer
   height   CDATA #REQUIRED
-  new-page-after   (y | n) "n"
+  new-page-after   (y | n) #IMPLIED
 >
 
 <!ELEMENT body (%objects;)>
 <!ATTLIST body
   height           CDATA #REQUIRED
-  new-page-after   (y | n) "n"
+  new-page-after   (y | n) #IMPLIED
 >
index 2933ce204f40f14e59c8859e4ec7c972c44b3382..938e9f5e393be9f598612484832b48efb6d4803e 100644 (file)
@@ -113,13 +113,13 @@ rpt_object_init (RptObject *rpt_object)
  * Returns: the newly created #RptObject object.
  */
 RptObject
-*rpt_object_new (const gchar *name, RptPoint *position)
+*rpt_object_new (const gchar *name, RptPoint position)
 {
        RptObject *rpt_object = RPT_OBJECT (g_object_new (rpt_object_get_type (), NULL));;
 
        g_object_set (rpt_object,
                      "name", name,
-                     "poisition", position,
+                     "poisition", &position,
                      NULL);
 
        return rpt_object;
index 87f980db1fc713db3ee659876f14fbdacddb0af4..fd52e5649bca045e1502075c3d7055dffafbccb6 100644 (file)
@@ -55,7 +55,7 @@ struct _RptObjectClass
 GType rpt_object_get_type (void) G_GNUC_CONST;
 
 
-RptObject *rpt_object_new (const gchar *name, RptPoint *position);
+RptObject *rpt_object_new (const gchar *name, RptPoint position);
 
 void rpt_object_get_xml (RptObject *rptobj, xmlNode *xnode);
 
index 1c6de9c72745760e9fd7ce564f90576f752679cc..69d77a930bf696c5287d732bfaeefc9e18f6bbb0 100644 (file)
@@ -121,14 +121,21 @@ rpt_obj_text_init (RptObjText *rpt_obj_text)
  * Returns: the newly created #RptObject object.
  */
 RptObject
-*rpt_obj_text_new (const gchar *name, RptPoint *position)
+*rpt_obj_text_new (const gchar *name, RptPoint position)
 {
-       RptObject *rpt_obj_text = RPT_OBJECT (g_object_new (rpt_obj_text_get_type (), NULL));
+       RptObject *rpt_obj_text = NULL;
+
+       gchar *name_ = g_strstrip (g_strdup (name));
 
-       g_object_set (G_OBJECT (rpt_obj_text),
-                     "name", name,
-                     "position", position,
-                     NULL);
+       if (strcmp (name_, "") != 0)
+               {
+                       rpt_obj_text = RPT_OBJECT (g_object_new (rpt_obj_text_get_type (), NULL));
+
+                       g_object_set (G_OBJECT (rpt_obj_text),
+                             "name", name_,
+                             "position", &position,
+                             NULL);
+               }
 
        return rpt_obj_text;
 }
@@ -145,15 +152,15 @@ RptObject
        gchar *name;
        RptObject *rpt_obj_text = NULL;
 
-       name = (gchar *)xmlGetProp (xnode, "name");
+       name = g_strdup ((gchar *)xmlGetProp (xnode, "name"));
        if (name != NULL && strcmp (g_strstrip (name), "") != 0)
                {
-                       RptPoint *position;
+                       RptPoint position;
                        RptObjTextPrivate *priv;
 
-                       rpt_common_get_position (xnode, position);
+                       rpt_common_get_position (xnode, &position);
 
-                       rpt_obj_text = rpt_obj_text_new (name, position);
+                       rpt_obj_text = rpt_obj_text_new ((const gchar *)name, position);
 
                        if (rpt_obj_text != NULL)
                                {
index 723a9900ca1c4edd2a8c97f0d93f7be2bd11c56d..52d346cb2e342c206e27d459dcca1e8111e07435 100644 (file)
@@ -53,7 +53,7 @@ struct _RptObjTextClass
 GType rpt_obj_text_get_type (void) G_GNUC_CONST;
 
 
-RptObject *rpt_obj_text_new (const gchar *name, RptPoint *position);
+RptObject *rpt_obj_text_new (const gchar *name, RptPoint position);
 RptObject *rpt_obj_text_new_from_xml (xmlNode *xnode);
 
 void rpt_obj_text_get_xml (RptObject *rpt_objtext, xmlNode *xnode);
index b806ff385d06f022161b5aaf5290cd8281e426cb..d654ebc5b25f46f511234ac019e95babdf10c487 100644 (file)
@@ -59,13 +59,14 @@ static void rpt_report_get_property (GObject *object,
                                      GValue *value,
                                      GParamSpec *pspec);
 
-static void rpt_report_xml_parse_body (RptReport *rpt_report, xmlNodeSetPtr xnodeset);
+static void rpt_report_xml_parse_body (RptReport *rpt_report, xmlNode *xnode);
 static RptObject *rpt_report_get_object_from_name (GList *list, const gchar *name);
 
 static xmlNode *rpt_report_rptprint_new_page (RptReport *rptreport,
                                               xmlNode *xroot);
 static void rpt_report_rptprint_body (RptReport *rptreport,
-                                      xmlNode *xpage);
+                                      xmlNode *xpage,
+                                      gdouble *cur_y);
 static void rpt_report_rptprint_parse_source (RptReport *rptreport,
                                               RptObject *rptobj,
                                               xmlNode *xnode);
@@ -128,6 +129,10 @@ rpt_report_init (RptReport *rpt_report)
 {
        RptReportPrivate *priv = RPT_REPORT_GET_PRIVATE (rpt_report);
 
+       priv->gda_client = NULL;
+       priv->gda_conn = NULL;
+       priv->gda_datamodel = NULL;
+
        priv->page = (Page *)g_malloc0 (sizeof (Page));
        priv->page->size = (RptSize *)g_malloc0 (sizeof (RptSize));
        priv->page->size->width = 0.0;
@@ -244,6 +249,7 @@ RptReport
                                                                                        if (priv->gda_conn == NULL)
                                                                                                {
                                                                                                        /* TO DO */
+                                                                                                       g_warning ("Unable to establish the connection.");
                                                                                                }
                                                                                        else
                                                                                                {
@@ -273,7 +279,7 @@ RptReport
                                                                                        xnodeset = xpresult->nodesetval;
                                                                                        if (xnodeset->nodeNr == 1)
                                                                                                {
-                                                                                                       rpt_report_xml_parse_body (rpt_report, xnodeset);
+                                                                                                       rpt_report_xml_parse_body (rpt_report, xnodeset->nodeTab[0]);
                                                                                                }
                                                                                }
                                                                }
@@ -345,8 +351,9 @@ xmlDoc
 {
        xmlDoc *xdoc;
        xmlNode *xroot;
-       xmlNode *xnode;
+       xmlNode *xpage;
        gint pages;
+       gdouble cur_y = 0.0;
 
        RptReportPrivate *priv = RPT_REPORT_GET_PRIVATE (rptreport);
 
@@ -354,9 +361,31 @@ xmlDoc
        xroot = xmlNewNode (NULL, "reptool_report");
        xmlDocSetRootElement (xdoc, xroot);
 
-       pages++;
-       xnode = rpt_report_rptprint_new_page (rptreport, xroot);
-       rpt_report_rptprint_body (rptreport, xnode);
+       if (priv->gda_datamodel != NULL)
+               {
+                       gint row;
+                       gint rows;
+
+                       rows = gda_data_model_get_n_rows (priv->gda_datamodel);
+
+                       for (row = 0; row < rows; row++)
+                               {
+                                       if (row == 0 || cur_y > priv->page->size->height)
+                                               {
+                                                       cur_y = 0.0;
+                                                       pages++;
+                                                       xpage = rpt_report_rptprint_new_page (rptreport, xroot);
+                                               }
+
+                                       rpt_report_rptprint_body (rptreport, xpage, &cur_y);
+                               }
+               }
+       else
+               {
+                       pages++;
+                       xpage = rpt_report_rptprint_new_page (rptreport, xroot);
+                       rpt_report_rptprint_body (rptreport, xpage, &cur_y);
+               }
 
        return xdoc;
 }
@@ -392,22 +421,22 @@ rpt_report_get_property (GObject *object, guint property_id, GValue *value, GPar
 }
 
 static void
-rpt_report_xml_parse_body (RptReport *rpt_report, xmlNodeSetPtr xnodeset)
+rpt_report_xml_parse_body (RptReport *rpt_report, xmlNode *xnode)
 {
        RptObject *rptobj;
-       gchar *objname;
        gchar *prop;
-       xmlNode *cur = xnodeset->nodeTab[0];
+       gchar *objname;
+       xmlNode *cur;
 
        RptReportPrivate *priv = RPT_REPORT_GET_PRIVATE (rpt_report);
 
-       prop = xmlGetProp (cur, "height");
+       prop = (gchar *)xmlGetProp (xnode, "height");
        if (prop != NULL)
                {
-                       priv->body->height = strtod (prop, NULL);
+                       priv->body->height = strtod (g_strstrip (g_strdup (prop)), NULL);
                }
 
-       cur = cur->children;
+       cur = xnode->children;
        while (cur != NULL)
                {
                        if (strcmp (cur->name, "text") == 0)
@@ -415,7 +444,7 @@ rpt_report_xml_parse_body (RptReport *rpt_report, xmlNodeSetPtr xnodeset)
                                        rptobj = rpt_obj_text_new_from_xml (cur);
                                        if (rptobj != NULL)
                                                {
-                                                       g_object_get (rptobj, "name", objname, NULL);
+                                                       g_object_get (rptobj, "name", &objname, NULL);
 
                                                        if (rpt_report_get_object_from_name (priv->body->objects, objname) == NULL)
                                                                {
@@ -424,6 +453,7 @@ rpt_report_xml_parse_body (RptReport *rpt_report, xmlNodeSetPtr xnodeset)
                                                        else
                                                                {
                                                                        /* TO DO */
+                                                                       g_warning ("An object with name \"%s\" already exists.", objname);
                                                                }
                                                }
                                }
@@ -450,7 +480,7 @@ static RptObject
        list = g_list_first (list);
        while (list != NULL)
                {
-                       g_object_get ((RptObject *)list->data, "name", objname, NULL);
+                       g_object_get ((RptObject *)list->data, "name", &objname, NULL);
                        if (strcmp (name, objname) == 0)
                                {
                                        obj = (RptObject *)list->data;
@@ -479,11 +509,12 @@ static xmlNode
 }
 
 static void
-rpt_report_rptprint_body (RptReport *rptreport, xmlNode *xpage)
+rpt_report_rptprint_body (RptReport *rptreport, xmlNode *xpage, gdouble *cur_y)
 {
        GList *objects;
        xmlAttrPtr attr;
        xmlNode *xnode;
+       gchar *prop;
 
        RptObject *rptobj;
 
@@ -502,6 +533,13 @@ rpt_report_rptprint_body (RptReport *rptreport, xmlNode *xpage)
                                        xmlRemoveProp (attr);
                                }
 
+                       prop = (gchar *)xmlGetProp (xnode, "y");
+                       if (prop == NULL)
+                               {
+                                       prop = g_strdup ("0.0");
+                               }
+                       xmlSetProp (xnode, "y", g_strdup_printf ("%f", strtod (prop, NULL) + *cur_y));
+
                        if (IS_RPT_OBJ_TEXT (rptobj))
                                {
                                        rpt_report_rptprint_parse_source (rptreport, rptobj, xnode);
@@ -511,6 +549,7 @@ rpt_report_rptprint_body (RptReport *rptreport, xmlNode *xpage)
 
                        objects = g_list_next (objects);
                }
+       *cur_y += priv->body->height;
 }
 
 static void
diff --git a/tests/db_test.db b/tests/db_test.db
new file mode 100644 (file)
index 0000000..4c331e8
Binary files /dev/null and b/tests/db_test.db differ
diff --git a/tests/test_report_db.rpt b/tests/test_report_db.rpt
new file mode 100644 (file)
index 0000000..525acea
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0" ?>
+<reptool>
+       <page width="595" height="842" />
+
+       <database>
+               <provider>SQLite</provider>
+               <connection_string>URI=///home/andreaz/files/c/reptool/libreptool/tests/db_test.db</connection_string>
+               <sql>SELECT * FROM articles ORDER BY name</sql>
+       </database>
+
+       <report>
+               <body height="200"><text name="txt_id" x="50" y="50" width="100" height="50" source="[id]" /><text name="txt_name" x="200" y="50" width="100" height="50" source="[name]" /></body>
+       </report>
+</reptool>