]> saetta.ns0.it Git - reptool/libreptool/commitdiff
Added property fill-with to text object (closes #172).
authorAndrea Zagli <azagli@libero.it>
Tue, 1 Nov 2011 09:38:38 +0000 (10:38 +0100)
committerAndrea Zagli <azagli@libero.it>
Tue, 1 Nov 2011 09:38:38 +0000 (10:38 +0100)
data/reptool.dtd
data/reptool_report.dtd
src/rptobjecttext.c
src/rptprint.c

index b421db8ae003e810fa5b982f908436232dd940cc..7e916a4de3457d731468574c49491516bd32c513 100644 (file)
@@ -74,6 +74,7 @@
   padding-left       CDATA #IMPLIED
   ellipsize          (none | start | middle | end)
   letter-spacing     CDATA #IMPLIED
+  fill-with          CDATA #IMPLIED
 >
 
 <!ELEMENT line EMPTY>
index 481a7e0ecf4203ad8415a13af2b4688f3d792e10..32568988a781cbc747ea9222be2e29f544a87723 100644 (file)
@@ -68,6 +68,7 @@
   padding-left       CDATA #IMPLIED
   ellipsize          (none | start | middle | end)
   letter-spacing     CDATA #IMPLIED
+  fill-with          CDATA #IMPLIED
 >
 
 <!ELEMENT line EMPTY>
index 62922158cc20903a8bd612b38b5862184ec06a46..a56e53cbec5587c1761bcad1c29f3862abdda8aa 100644 (file)
@@ -34,7 +34,8 @@ enum
        PROP_PADDING_BOTTOM,
        PROP_PADDING_LEFT,
        PROP_ELLIPSIZE,
-       PROP_LETTER_SPACING
+       PROP_LETTER_SPACING,
+       PROP_FILL_WITH
 };
 
 static void rpt_obj_text_class_init (RptObjTextClass *klass);
@@ -68,6 +69,7 @@ struct _RptObjTextPrivate
                gdouble padding_left;
                eRptEllipsize ellipsize;
                guint letter_spacing;
+               gchar *fill_with;
        };
 
 G_DEFINE_TYPE (RptObjText, rpt_obj_text, TYPE_RPT_OBJECT)
@@ -126,37 +128,43 @@ rpt_obj_text_class_init (RptObjTextClass *klass)
                                                              "Padding Top",
                                                              "Padding Top",
                                                              0, G_MAXDOUBLE, 0,
-                                                             G_PARAM_READWRITE));
+                                                             G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
        g_object_class_install_property (object_class, PROP_PADDING_RIGHT,
                                         g_param_spec_double ("padding-right",
                                                              "Padding Right",
                                                              "Padding Right",
                                                              0, G_MAXDOUBLE, 0,
-                                                             G_PARAM_READWRITE));
+                                                             G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
        g_object_class_install_property (object_class, PROP_PADDING_BOTTOM,
                                         g_param_spec_double ("padding-bottom",
                                                              "Padding Bottom",
                                                              "Padding Bottom",
                                                              0, G_MAXDOUBLE, 0,
-                                                             G_PARAM_READWRITE));
+                                                             G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
        g_object_class_install_property (object_class, PROP_PADDING_LEFT,
                                         g_param_spec_double ("padding-left",
                                                              "Padding Left",
                                                              "Padding Left",
                                                              0, G_MAXDOUBLE, 0,
-                                                             G_PARAM_READWRITE));
+                                                             G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
        g_object_class_install_property (object_class, PROP_ELLIPSIZE,
                                         g_param_spec_uint ("ellipsize",
                                                            "Ellipsize",
                                                            "Ellipsize",
                                                            RPT_ELLIPSIZE_NONE, RPT_ELLIPSIZE_END, RPT_ELLIPSIZE_NONE,
-                                                           G_PARAM_READWRITE));
+                                                           G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
        g_object_class_install_property (object_class, PROP_LETTER_SPACING,
                                         g_param_spec_uint ("letter-spacing",
                                                            "Letter spacing",
                                                            "Amount of extra space to add between graphemes of the text.",
                                                            0, G_MAXUINT, 0,
-                                                           G_PARAM_READWRITE));
+                                                           G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+       g_object_class_install_property (object_class, PROP_FILL_WITH,
+                                        g_param_spec_string ("fill-with",
+                                                             "Fill with",
+                                                             "Fill the box with the specified string.",
+                                                             "",
+                                                             G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
 }
 
 static void
@@ -184,10 +192,6 @@ rpt_obj_text_init (RptObjText *rpt_obj_text)
        priv->font = font;
        priv->align = NULL;
        priv->background_color = NULL;
-
-       priv->ellipsize = RPT_ELLIPSIZE_NONE;
-
-       priv->letter_spacing = 0;
 }
 
 /**
@@ -307,6 +311,12 @@ RptObject
                                                        g_object_set (rpt_obj_text, "letter-spacing", strtol (prop, NULL, 10), NULL);
                                                        xmlFree (prop);
                                                }
+                                       prop = (gchar *)xmlGetProp (xnode, "fill-with");
+                                       if (prop != NULL)
+                                               {
+                                                       g_object_set (rpt_obj_text, "fill-with", prop, NULL);
+                                                       xmlFree (prop);
+                                               }
                                }
                }
 
@@ -363,6 +373,11 @@ rpt_obj_text_get_xml (RptObject *rpt_objtext, xmlNode *xnode)
                {
                        xmlSetProp (xnode, "letter-spacing", g_strdup_printf ("%d", priv->letter_spacing));
                }
+       if (priv->fill_with != NULL
+           && g_strcmp0 (priv->fill_with, "") != 0)
+               {
+                       xmlSetProp (xnode, "fill-with", priv->fill_with);
+               }
 }
 
 static void
@@ -425,6 +440,10 @@ rpt_obj_text_set_property (GObject *object, guint property_id, const GValue *val
                                priv->letter_spacing = g_value_get_uint (value);
                                break;
 
+                       case PROP_FILL_WITH:
+                               priv->fill_with = g_strstrip (g_strdup (g_value_get_string (value)));
+                               break;
+
                        default:
                                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
                                break;
@@ -491,6 +510,10 @@ rpt_obj_text_get_property (GObject *object, guint property_id, GValue *value, GP
                                g_value_set_uint (value, priv->letter_spacing);
                                break;
 
+                       case PROP_FILL_WITH:
+                               g_value_set_string (value, priv->fill_with);
+                               break;
+
                        default:
                                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
                                break;
index 2f1e7d59df7b9ce6e59047f815373cfa5c103ce2..cb926e724246a571ee860e0466c276a6cfcaa5e1 100644 (file)
@@ -789,7 +789,7 @@ rpt_print_text_xml (RptPrint *rpt_print, xmlNode *xnode)
        PangoAttribute *pattr;
        PangoAttrList *lpattr = NULL;
 
-       gchar *text = (gchar *)xmlNodeGetContent (xnode);
+       GString *text;
        gchar *prop;
 
        gdouble padding_top = 0.0;
@@ -797,6 +797,8 @@ rpt_print_text_xml (RptPrint *rpt_print, xmlNode *xnode)
        gdouble padding_bottom = 0.0;
        gdouble padding_left = 0.0;
 
+       gdouble layout_width;
+
        position = rpt_common_get_position (xnode);
        size = rpt_common_get_size (xnode);
        rotation = rpt_common_get_rotation (xnode);
@@ -810,6 +812,8 @@ rpt_print_text_xml (RptPrint *rpt_print, xmlNode *xnode)
                        return;
                }
 
+       text = g_string_new ((gchar *)xmlNodeGetContent (xnode));
+
        /* padding */
        prop = xmlGetProp (xnode, (const xmlChar *)"padding-top");
        if (prop != NULL)
@@ -836,6 +840,8 @@ rpt_print_text_xml (RptPrint *rpt_print, xmlNode *xnode)
                        xmlFree (prop);
                }
 
+       layout_width = rpt_common_value_to_points (priv->unit, size->width) - padding_left - padding_right;
+
        /* creating pango layout */
        /*if (priv->output_type == RPTP_OUTPUT_GTK)
                {
@@ -847,7 +853,7 @@ rpt_print_text_xml (RptPrint *rpt_print, xmlNode *xnode)
                /*}*/
        if (size != NULL)
                {
-                       pango_layout_set_width (playout, (rpt_common_value_to_points (priv->unit, size->width) - padding_left - padding_right) * PANGO_SCALE);
+                       pango_layout_set_width (playout, layout_width * PANGO_SCALE);
                }
 
        /* creating pango font description */
@@ -881,7 +887,7 @@ rpt_print_text_xml (RptPrint *rpt_print, xmlNode *xnode)
 
                        pattr = pango_attr_underline_new (font->underline);
                        pattr->start_index = 0;
-                       pattr->end_index = strlen (text) + 1;
+                       pattr->end_index = text->len + 1;
 
                        if (lpattr == NULL)
                                {
@@ -895,7 +901,7 @@ rpt_print_text_xml (RptPrint *rpt_print, xmlNode *xnode)
                
                        pattr = pango_attr_strikethrough_new (TRUE);
                        pattr->start_index = 0;
-                       pattr->end_index = strlen (text) + 1;
+                       pattr->end_index = text->len + 1;
 
                        if (lpattr == NULL)
                                {
@@ -918,7 +924,7 @@ rpt_print_text_xml (RptPrint *rpt_print, xmlNode *xnode)
 
                                        pattr = pango_attr_letter_spacing_new (spacing * PANGO_SCALE);
                                        pattr->start_index = 0;
-                                       pattr->end_index = strlen (text) + 1;
+                                       pattr->end_index = text->len + 1;
 
                                        if (lpattr == NULL)
                                                {
@@ -1046,7 +1052,36 @@ rpt_print_text_xml (RptPrint *rpt_print, xmlNode *xnode)
        cairo_move_to (priv->cr, rpt_common_value_to_points (priv->unit, position->x) + padding_left,
                       rpt_common_value_to_points (priv->unit, position->y) + padding_top);
 
-       pango_layout_set_text (playout, text, -1);
+       pango_layout_set_text (playout, text->str, -1);
+
+       /* fill-with */
+       prop = xmlGetProp (xnode, (const xmlChar *)"fill-with");
+       if (prop != NULL
+           && g_strcmp0 (g_strstrip (prop), "") != 0)
+               {
+                       gint lines;
+
+                       GString *text_tmp;
+
+                       lines = pango_layout_get_line_count (playout);
+
+                       text_tmp = g_string_new (text->str);
+
+                       g_string_append (text_tmp, prop);
+                       pango_layout_set_text (playout, text_tmp->str, -1);
+                       while (lines == pango_layout_get_line_count (playout))
+                               {
+                                       g_string_append (text, prop);
+
+                                       g_string_append (text_tmp, prop);
+                                       pango_layout_set_text (playout, text_tmp->str, -1);
+                               }
+
+                       g_string_free (text_tmp, TRUE);
+               }
+
+       pango_layout_set_text (playout, text->str, -1);
+
        pango_cairo_show_layout (priv->cr, playout);
 
        if (position != NULL && size != NULL)
@@ -1060,6 +1095,7 @@ rpt_print_text_xml (RptPrint *rpt_print, xmlNode *xnode)
        g_free (align);
        g_free (border);
        g_free (font);
+       g_string_free (text, TRUE);
 }
 
 static void