[gnumeric] xslx: roundtrip object names.
- From: Morten Welinder <mortenw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnumeric] xslx: roundtrip object names.
- Date: Mon, 4 May 2020 03:07:40 +0000 (UTC)
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]