From 46f1fbcea97f777d12efed580a8f04da154106a3 Mon Sep 17 00:00:00 2001 From: Bartosz Kosiorek Date: Wed, 3 Jan 2018 23:27:16 +0100 Subject: tdf#114173 Preserve size of chart legend during xlsx export MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is a combination of 2 commits. tdf#114173 Preserve size of chart legend during xlsx export During export chart into .xlsx file, the information about size of legend was not saved. Example of proper size: another issue was hardcoded "layoutTarget" which was always "inner": also properties regarding default text style was not preserved: With this patch all these issues was resolved, and in case of layoutTarget "outer", the field is not availble at all, according to specification. Change-Id: I2c9b7a112bdd911542b5273e660222d7fefa2d88 Reviewed-on: https://gerrit.libreoffice.org/47358 Reviewed-by: Mike Kaganski Tested-by: Mike Kaganski (cherry picked from commit 84392651d2731cce91c3b2e144bed4ac07e4ddf1) crashtesting: multiple export failures since... commit 84392651d2731cce91c3b2e144bed4ac07e4ddf1 Date: Wed Jan 3 23:27:16 2018 +0100 tdf#114173 Preserve size of chart legend during xlsx export Change-Id: Iebc936a0f490d6b707dfee0343732753f56728e7 Reviewed-on: https://gerrit.libreoffice.org/48147 Reviewed-by: Caolán McNamara Tested-by: Caolán McNamara (cherry picked from commit fa68bed11c180ebb0d45fb7779d538098b2921ff) Reviewed-on: https://gerrit.libreoffice.org/48153 Tested-by: Jenkins Reviewed-by: Eike Rathke Reviewed-on: https://gerrit.libreoffice.org/48726 --- chart2/qa/extras/chart2export.cxx | 15 +++++++++ include/oox/export/chartexport.hxx | 5 +-- oox/source/export/chartexport.cxx | 66 +++++++++++++++++++++++++++----------- 3 files changed, 65 insertions(+), 21 deletions(-) diff --git a/chart2/qa/extras/chart2export.cxx b/chart2/qa/extras/chart2export.cxx index e6b500c32b26..d7f4a67b7651 100644 --- a/chart2/qa/extras/chart2export.cxx +++ b/chart2/qa/extras/chart2export.cxx @@ -1406,6 +1406,7 @@ void Chart2ExportTest::testTitleManualLayoutXLSX() load("/chart2/qa/extras/data/xlsx/", "title_manual_layout.xlsx"); xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); + assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:layout/c:manualLayout/c:layoutTarget", 0); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:layout/c:manualLayout/c:xMode", "val", "edge"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:title/c:layout/c:manualLayout/c:yMode", "val", "edge"); @@ -1427,6 +1428,7 @@ void Chart2ExportTest::testPlotAreaManualLayoutXLSX() xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); + assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:layout/c:manualLayout/c:layoutTarget", "val", "inner"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:layout/c:manualLayout/c:xMode", "val", "edge"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:layout/c:manualLayout/c:yMode", "val", "edge"); @@ -1455,6 +1457,7 @@ void Chart2ExportTest::testLegendManualLayoutXLSX() xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open XML"); CPPUNIT_ASSERT(pXmlDoc); + assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:layout/c:manualLayout/c:layoutTarget", 0); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:legend/c:layout/c:manualLayout/c:xMode", "val", "edge"); assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:legend/c:layout/c:manualLayout/c:yMode", "val", "edge"); @@ -1466,6 +1469,18 @@ void Chart2ExportTest::testLegendManualLayoutXLSX() double nY = aYVal.toDouble(); CPPUNIT_ASSERT(nY > 0 && nY < 1); CPPUNIT_ASSERT(nX != nY); + + OUString aWVal = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:legend/c:layout/c:manualLayout/c:w", "val"); + double nW = aWVal.toDouble(); + CPPUNIT_ASSERT(nW > 0 && nW < 1); + + OUString aHVal = getXPath(pXmlDoc, "/c:chartSpace/c:chart/c:legend/c:layout/c:manualLayout/c:h", "val"); + double nH = aHVal.toDouble(); + CPPUNIT_ASSERT(nH > 0 && nH < 1); + CPPUNIT_ASSERT(nH != nW); + + // Make sure that default text font size is preserved after export + assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:legend/c:txPr/a:p/a:pPr/a:defRPr", "sz", "900"); } void Chart2ExportTest::testAxisCharacterPropertiesXLSX() diff --git a/include/oox/export/chartexport.hxx b/include/oox/export/chartexport.hxx index f8c055c3be92..9055e99002f0 100644 --- a/include/oox/export/chartexport.hxx +++ b/include/oox/export/chartexport.hxx @@ -135,7 +135,8 @@ private: css::chart::XChartDocument >& rChartDoc ); void exportTitle( const css::uno::Reference< css::drawing::XShape >& xShape ); - void exportPlotArea( ); + void exportPlotArea( const css::uno::Reference< + css::chart::XChartDocument >& rChartDoc ); void exportPlotAreaShapeProps( const css::uno::Reference< css::beans::XPropertySet >& xPropSet ); void exportFill( const css::uno::Reference< css::beans::XPropertySet >& xPropSet ); void exportGradientFill( const css::uno::Reference< css::beans::XPropertySet >& xPropSet ); @@ -186,7 +187,7 @@ private: void exportErrorBar(const css::uno::Reference< css::beans::XPropertySet >& xErrorBarProps, bool bYError); - void exportManualLayout(const css::chart2::RelativePosition& rPos, const css::chart2::RelativeSize& rSize); + void exportManualLayout(const css::chart2::RelativePosition& rPos, const css::chart2::RelativeSize& rSize, const bool bIsExcludingDiagramPositioning); void exportAxes( ); void exportAxis(const AxisIdPair& rAxisIdPair); diff --git a/oox/source/export/chartexport.cxx b/oox/source/export/chartexport.cxx index 2ffb03fa7ba4..2592c74fd2e6 100644 --- a/oox/source/export/chartexport.cxx +++ b/oox/source/export/chartexport.cxx @@ -48,6 +48,7 @@ #include #include #include +#include #include #include @@ -893,7 +894,7 @@ void ChartExport::exportChart( const Reference< css::chart::XChartDocument >& xC } // plot area - exportPlotArea( ); + exportPlotArea( xChartDoc ); // legend if( bHasLegend ) exportLegend( xChartDoc ); @@ -996,7 +997,6 @@ void ChartExport::exportLegend( const Reference< css::chart::XChartDocument >& x uno::Any aRelativePos = xProp->getPropertyValue("RelativePosition"); if (aRelativePos.hasValue()) { - chart2::RelativePosition aPos = aRelativePos.get(); pFS->startElement(FSNS(XML_c, XML_layout), FSEND); pFS->startElement(FSNS(XML_c, XML_manualLayout), FSEND); @@ -1006,9 +1006,10 @@ void ChartExport::exportLegend( const Reference< css::chart::XChartDocument >& x pFS->singleElement(FSNS(XML_c, XML_yMode), XML_val, "edge", FSEND); + chart2::RelativePosition aPos = aRelativePos.get(); - double x = aPos.Primary; - double y = aPos.Secondary; + const double x = aPos.Primary; + const double y = aPos.Secondary; pFS->singleElement(FSNS(XML_c, XML_x), XML_val, IS(x), @@ -1016,6 +1017,24 @@ void ChartExport::exportLegend( const Reference< css::chart::XChartDocument >& x pFS->singleElement(FSNS(XML_c, XML_y), XML_val, IS(y), FSEND); + + uno::Any aRelativeSize = xProp->getPropertyValue("RelativeSize"); + if (aRelativeSize.hasValue()) + { + chart2::RelativeSize aSize = aRelativeSize.get(); + + const double w = aSize.Primary; + const double h = aSize.Secondary; + + pFS->singleElement(FSNS(XML_c, XML_w), + XML_val, IS(w), + FSEND); + + pFS->singleElement(FSNS(XML_c, XML_h), + XML_val, IS(h), + FSEND); + } + SAL_WARN_IF(aPos.Anchor != css::drawing::Alignment_TOP_LEFT, "oox", "unsupported anchor position"); pFS->endElement(FSNS(XML_c, XML_manualLayout)); @@ -1031,6 +1050,9 @@ void ChartExport::exportLegend( const Reference< css::chart::XChartDocument >& x // shape properties exportShapeProps( xProp ); + + // draw-chart:txPr text properties + exportTextProps( xProp ); } // legendEntry @@ -1155,7 +1177,7 @@ void ChartExport::exportTitle( const Reference< XShape >& xShape ) pFS->endElement( FSNS( XML_c, XML_title ) ); } -void ChartExport::exportPlotArea( ) +void ChartExport::exportPlotArea( const Reference< css::chart::XChartDocument >& xChartDoc ) { Reference< chart2::XCoordinateSystemContainer > xBCooSysCnt( mxNewDiagram, uno::UNO_QUERY ); if( ! xBCooSysCnt.is()) @@ -1176,7 +1198,8 @@ void ChartExport::exportPlotArea( ) chart2::RelativePosition aPos = aAny.get(); aAny = xWall->getPropertyValue("RelativeSize"); chart2::RelativeSize aSize = aAny.get(); - exportManualLayout(aPos, aSize); + uno::Reference< css::chart::XDiagramPositioning > xDiagramPositioning( xChartDoc->getDiagram(), uno::UNO_QUERY ); + exportManualLayout(aPos, aSize, xDiagramPositioning->isExcludingDiagramPositioning() ); } } @@ -1288,14 +1311,21 @@ void ChartExport::exportPlotArea( ) } -void ChartExport::exportManualLayout(const css::chart2::RelativePosition& rPos, const css::chart2::RelativeSize& rSize) +void ChartExport::exportManualLayout(const css::chart2::RelativePosition& rPos, + const css::chart2::RelativeSize& rSize, + const bool bIsExcludingDiagramPositioning) { FSHelperPtr pFS = GetFS(); pFS->startElement(FSNS(XML_c, XML_layout), FSEND); pFS->startElement(FSNS(XML_c, XML_manualLayout), FSEND); - pFS->singleElement(FSNS(XML_c, XML_layoutTarget), - XML_val, "inner", - FSEND); + + // By default layoutTarget is set to "outer" and we shouldn't save it in that case + if ( bIsExcludingDiagramPositioning ) + { + pFS->singleElement(FSNS(XML_c, XML_layoutTarget), + XML_val, "inner", + FSEND); + } pFS->singleElement(FSNS(XML_c, XML_xMode), XML_val, "edge", FSEND); @@ -1305,8 +1335,8 @@ void ChartExport::exportManualLayout(const css::chart2::RelativePosition& rPos, double x = rPos.Primary; double y = rPos.Secondary; - double w = rSize.Primary; - double h = rSize.Secondary; + const double w = rSize.Primary; + const double h = rSize.Secondary; switch (rPos.Anchor) { case drawing::Alignment_LEFT: @@ -2391,20 +2421,18 @@ void ChartExport::exportTextProps(const Reference& xPropSet) { FSHelperPtr pFS = GetFS(); pFS->startElement(FSNS(XML_c, XML_txPr), FSEND); - - pFS->startElement(FSNS(XML_a, XML_bodyPr), FSEND); - pFS->endElement(FSNS(XML_a, XML_bodyPr)); + pFS->singleElement( FSNS( XML_a, XML_bodyPr ), FSEND ); + pFS->singleElement( FSNS( XML_a, XML_lstStyle ), FSEND ); pFS->startElement(FSNS(XML_a, XML_p), FSEND); pFS->startElement(FSNS(XML_a, XML_pPr), FSEND); - bool bDummy = false; - sal_Int32 nDummy; - WriteRunProperties(xPropSet, false, XML_defRPr, true, bDummy, nDummy); + bool bOverrideCharHeight = false; + sal_Int32 nCharHeight; + WriteRunProperties(xPropSet, false, XML_defRPr, true, bOverrideCharHeight, nCharHeight); pFS->endElement(FSNS(XML_a, XML_pPr)); pFS->endElement(FSNS(XML_a, XML_p)); - pFS->endElement(FSNS(XML_c, XML_txPr)); } -- cgit v1.2.3