[gnumeric] xslx: roundtrip object names.



commit 8076f9819e7b2b87df4f1901fb7c10798026ad4b
Author: Morten Welinder <terra gnome org>
Date:   Sun May 3 23:07:06 2020 -0400

    xslx: roundtrip object names.

 NEWS                               |  1 +
 plugins/excel/ChangeLog            |  8 ++++++++
 plugins/excel/xlsx-read-drawing.c  | 21 ++++++++++++++++++-
 plugins/excel/xlsx-read.c          |  1 +
 plugins/excel/xlsx-write-drawing.c | 41 ++++++++++++++++----------------------
 5 files changed, 47 insertions(+), 25 deletions(-)
---
diff --git a/NEWS b/NEWS
index 55d27fc67..8c3549309 100644
--- a/NEWS
+++ b/NEWS
@@ -17,6 +17,7 @@ Morten:
        * Fix CELL crash.  [#479]
        * Handle export options for ssconvert --export-graphs.
        * Fix deps crash.  [#480]
+       * Fix chart name roundtrip through XLSX.  [#478]
 
 --------------------------------------------------------------------------
 Gnumeric 1.12.46
diff --git a/plugins/excel/ChangeLog b/plugins/excel/ChangeLog
index 57c9be9d7..86c4e21ab 100644
--- a/plugins/excel/ChangeLog
+++ b/plugins/excel/ChangeLog
@@ -1,3 +1,11 @@
+2020-05-03  Morten Welinder  <terra gnome org>
+
+       * xlsx-read-drawing.c (xlsx_drawing_twoCellAnchor_end): Set sheet
+       object name.
+
+       * xlsx-write-drawing.c (xlsx_write_drawing_objects): Write sheet
+       object name for all sheet objects.
+
 2019-11-06  Morten Welinder <terra gnome org>
 
        * Release 1.12.46
diff --git a/plugins/excel/xlsx-read-drawing.c b/plugins/excel/xlsx-read-drawing.c
index 902925598..f75114d26 100644
--- a/plugins/excel/xlsx-read-drawing.c
+++ b/plugins/excel/xlsx-read-drawing.c
@@ -3200,6 +3200,20 @@ xlsx_read_chart (GsfXMLIn *xin, xmlChar const **attrs)
        }
 }
 
+static void
+xlsx_cnvpr (GsfXMLIn *xin, xmlChar const **attrs)
+{
+       XLSXReadState *state = (XLSXReadState *)xin->user_state;
+
+       for (; attrs != NULL && attrs[0] && attrs[1] ; attrs += 2) {
+               if (!strcmp (attrs[0], "name")) {
+                       g_free (state->object_name);
+                       state->object_name = g_strdup (attrs[1]);
+               }
+       }
+}
+
+
 /**************************************************************************/
 #define CELL   0
 #define OFFSET 1
@@ -3280,12 +3294,17 @@ xlsx_drawing_twoCellAnchor_end (GsfXMLIn *xin, G_GNUC_UNUSED GsfXMLBlob *blob)
                        g_object_set (state->so, "style", state->cur_style, NULL);
 
                state->pending_objects = g_slist_prepend (state->pending_objects, state->so);
+
+               if (state->object_name)
+                       sheet_object_set_name (state->so, state->object_name);
        }
 
        if (state->cur_style) {
                g_object_unref (state->cur_style);
                state->cur_style = NULL;
        }
+       g_free (state->object_name);
+       state->object_name = NULL;
        state->so = NULL;
 }
 
@@ -3575,7 +3594,7 @@ GSF_XML_IN_NODE_FULL (START, DRAWING, XL_NS_SS_DRAW, "wsDr", GSF_XML_NO_CONTENT,
 
     GSF_XML_IN_NODE (TWO_CELL, GRAPHIC_FRAME, XL_NS_SS_DRAW, "graphicFrame", GSF_XML_NO_CONTENT, NULL, NULL),
       GSF_XML_IN_NODE (GRAPHIC_FRAME, GRAPHIC_PR, XL_NS_SS_DRAW, "nvGraphicFramePr", GSF_XML_NO_CONTENT, 
NULL, NULL),
-        GSF_XML_IN_NODE (GRAPHIC_PR, CNVPR, XL_NS_SS_DRAW, "cNvPr", GSF_XML_NO_CONTENT, NULL, NULL),
+        GSF_XML_IN_NODE (GRAPHIC_PR, CNVPR, XL_NS_SS_DRAW, "cNvPr", GSF_XML_NO_CONTENT, &xlsx_cnvpr, NULL),
         GSF_XML_IN_NODE (GRAPHIC_PR, GRAPHIC_PR_CHILD, XL_NS_SS_DRAW, "cNvGraphicFramePr", 
GSF_XML_NO_CONTENT, NULL, NULL),
           GSF_XML_IN_NODE (GRAPHIC_PR_CHILD, GRAPHIC_LOCKS, XL_NS_DRAW, "graphicFrameLocks", 
GSF_XML_NO_CONTENT, NULL, NULL),
       GSF_XML_IN_NODE (GRAPHIC_FRAME, GRAPHIC, XL_NS_DRAW, "graphic", GSF_XML_NO_CONTENT, NULL, NULL),
diff --git a/plugins/excel/xlsx-read.c b/plugins/excel/xlsx-read.c
index 48646c2bf..4a70b0ca5 100644
--- a/plugins/excel/xlsx-read.c
+++ b/plugins/excel/xlsx-read.c
@@ -198,6 +198,7 @@ typedef struct {
        GODrawingAnchorDir  so_direction;
        GnmSOAnchorMode so_anchor_mode;
        GnmExprTop const *link_texpr;
+       char *object_name;
 
        /* Legacy drawing state */
        double            grp_offset[4];
diff --git a/plugins/excel/xlsx-write-drawing.c b/plugins/excel/xlsx-write-drawing.c
index b28acb18d..a8d492e11 100644
--- a/plugins/excel/xlsx-write-drawing.c
+++ b/plugins/excel/xlsx-write-drawing.c
@@ -1432,6 +1432,20 @@ xlsx_write_object_anchor (GsfXMLOut *xml, GnmCellPos const *pos, char const *ele
        gsf_xml_out_end_element (xml);
 }
 
+static void
+xlsx_write_nvpr (GsfXMLOut *xml, SheetObject *so, int id)
+{
+       // "Non-Visual Properties"
+       char *tmp;
+
+       gsf_xml_out_start_element (xml, "xdr:cNvPr");
+       gsf_xml_out_add_int (xml, "id",  id);
+       g_object_get (so, "name", &tmp, NULL);
+       gsf_xml_out_add_cstr_unchecked (xml, "name", tmp ? tmp : "");
+       g_free (tmp);
+       gsf_xml_out_end_element (xml);
+}
+
 static char const *
 xlsx_write_drawing_objects (XLSXWriteState *state, GsfOutput *sheet_part,
                            GSList *objects, GHashTable *zorder)
@@ -1563,19 +1577,12 @@ xlsx_write_drawing_objects (XLSXWriteState *state, GsfOutput *sheet_part,
                }
 
                if (GNM_IS_SO_GRAPH (so)) {
-                       char *tmp;
-
                        gsf_xml_out_start_element (xml, "xdr:graphicFrame");
                        gsf_xml_out_add_cstr_unchecked (xml, "macro", "");
 
                        gsf_xml_out_start_element (xml, "xdr:nvGraphicFramePr");
 
-                       gsf_xml_out_start_element (xml, "xdr:cNvPr");
-                       gsf_xml_out_add_int (xml, "id",  chart_count + 1);
-                       tmp = g_strdup_printf ("Chart %d", chart_count++);
-                       gsf_xml_out_add_cstr_unchecked (xml, "name", tmp);
-                       g_free (tmp);
-                       gsf_xml_out_end_element (xml);
+                       xlsx_write_nvpr (xml, so, ++chart_count);
 
                        gsf_xml_out_simple_element (xml, "xdr:cNvGraphicFramePr", NULL);
                        gsf_xml_out_end_element (xml); /* </xdr:nvGraphicFramePr> */
@@ -1606,17 +1613,10 @@ xlsx_write_drawing_objects (XLSXWriteState *state, GsfOutput *sheet_part,
                        gsf_xml_out_end_element (xml); /* </a:graphic> */
                        gsf_xml_out_end_element (xml); /* </xdr:graphicFrame> */
                } else if (GNM_IS_SO_IMAGE (so)) {
-                       char *tmp;
-
                        gsf_xml_out_start_element (xml, "xdr:pic");
 
                        gsf_xml_out_start_element (xml, "xdr:nvPicPr");
-                       gsf_xml_out_start_element (xml, "xdr:cNvPr");
-                       gsf_xml_out_add_int (xml, "id",  pic_count + 1);
-                       tmp = g_strdup_printf ("Picture %d", pic_count++);
-                       gsf_xml_out_add_cstr_unchecked (xml, "name", tmp);
-                       g_free (tmp);
-                       gsf_xml_out_end_element (xml); /* </xdr:cNvPr> */
+                       xlsx_write_nvpr (xml, so, ++pic_count);
                        gsf_xml_out_start_element (xml, "xdr:cNvPicPr");
                        gsf_xml_out_end_element (xml); /* </xdr:cNvPicPr> */
                        gsf_xml_out_end_element (xml); /* </xdr:nvPicPr> */
@@ -1664,15 +1664,9 @@ xlsx_write_drawing_objects (XLSXWriteState *state, GsfOutput *sheet_part,
                        if (g_object_class_find_property (G_OBJECT_GET_CLASS (so), "style"))
                                g_object_get (so, "style", &style, NULL);
                        if (style) {
-                               char *name;
-
-                               g_object_get (so, "name", &name, NULL);
                                gsf_xml_out_start_element (xml, "xdr:sp");
                                gsf_xml_out_start_element (xml, "xdr:nvSpPr");
-                               gsf_xml_out_start_element (xml, "xdr:cNvPr");
-                               gsf_xml_out_add_uint (xml, "id", state->drawing_elem_id++);
-                               gsf_xml_out_add_cstr (xml, "name", name ? name : "");
-                               gsf_xml_out_end_element (xml); /* </xdr:cNvPr> */
+                               xlsx_write_nvpr (xml, so, state->drawing_elem_id++);
                                gsf_xml_out_start_element (xml, "xdr:cNvSpPr");
                                gsf_xml_out_end_element (xml); /* </xdr:cNvSpPr> */
                                gsf_xml_out_end_element (xml); /* </xdr:nvSpPr> */
@@ -1680,7 +1674,6 @@ xlsx_write_drawing_objects (XLSXWriteState *state, GsfOutput *sheet_part,
                                xlsx_write_go_style_full (xml, style, &sctx);
                                gsf_xml_out_end_element (xml); /* </xdr:sp> */
                                g_object_unref (style);
-                               g_free (name);
                        }
 
                        g_free (sctx.start_arrow);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]