diff options
author | Bartosz Kosiorek <gang65@poczta.onet.pl> | 2018-01-03 23:27:16 +0100 |
---|---|---|
committer | Mike Kaganski <mike.kaganski@collabora.com> | 2018-01-09 13:36:42 +0100 |
commit | 84392651d2731cce91c3b2e144bed4ac07e4ddf1 (patch) | |
tree | 9c5fc708db070bbafc208268bb65afde5d3ddace | |
parent | 847d20b3466a6358396c923e9b4754cbdd53863a (diff) |
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:
<c:w val="0.41459448854442293"/>
<c:h val="0.23161616722845749"/>
another issue was hardcoded "layoutTarget" which
was always "inner":
<c:layoutTarget val="inner"/>
also properties regarding default text style was not preserved:
<c:txPr>
<a:bodyPr/>
<a:lstStyle/>
<a:p>
<a:pPr>
<a:defRPr sz="900" b="0" i="0" u="none" strike="noStrike" kern="1200" baseline="0">
<a:solidFill>
<a:schemeClr val="tx1">
<a:lumMod val="65000"/>
<a:lumOff val="35000"/>
</a:schemeClr>
</a:solidFill>
</a:defRPr>
</a:pPr>
<a:endParaRPr lang="pl-PL"/>
</a:p>
</c:txPr>
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 <mike.kaganski@collabora.com>
Tested-by: Mike Kaganski <mike.kaganski@collabora.com>
-rw-r--r-- | chart2/qa/extras/chart2export.cxx | 15 | ||||
-rw-r--r-- | include/oox/export/chartexport.hxx | 5 | ||||
-rw-r--r-- | oox/source/export/chartexport.cxx | 60 |
3 files changed, 59 insertions, 21 deletions
diff --git a/chart2/qa/extras/chart2export.cxx b/chart2/qa/extras/chart2export.cxx index b68f969cb90b..6764935a91cc 100644 --- a/chart2/qa/extras/chart2export.cxx +++ b/chart2/qa/extras/chart2export.cxx @@ -1407,6 +1407,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"); @@ -1428,6 +1429,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"); @@ -1456,6 +1458,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"); @@ -1467,6 +1470,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 6d336f9a863b..0c59b1b5a713 100644 --- a/include/oox/export/chartexport.hxx +++ b/include/oox/export/chartexport.hxx @@ -134,7 +134,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 ); @@ -188,7 +189,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 23a6b1a95d3a..ee86421567a7 100644 --- a/oox/source/export/chartexport.cxx +++ b/oox/source/export/chartexport.cxx @@ -48,6 +48,7 @@ #include <com/sun/star/chart/DataLabelPlacement.hpp> #include <com/sun/star/chart/ErrorBarStyle.hpp> #include <com/sun/star/chart/MissingValueTreatment.hpp> +#include <com/sun/star/chart/XDiagramPositioning.hpp> #include <com/sun/star/chart2/RelativePosition.hpp> #include <com/sun/star/chart2/RelativeSize.hpp> @@ -748,7 +749,7 @@ void ChartExport::exportChart( const Reference< css::chart::XChartDocument >& xC } // plot area - exportPlotArea( ); + exportPlotArea( xChartDoc ); // legend if( bHasLegend ) exportLegend( xChartDoc ); @@ -851,7 +852,6 @@ void ChartExport::exportLegend( const Reference< css::chart::XChartDocument >& x uno::Any aRelativePos = xProp->getPropertyValue("RelativePosition"); if (aRelativePos.hasValue()) { - chart2::RelativePosition aPos = aRelativePos.get<chart2::RelativePosition>(); pFS->startElement(FSNS(XML_c, XML_layout), FSEND); pFS->startElement(FSNS(XML_c, XML_manualLayout), FSEND); @@ -861,9 +861,14 @@ 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<chart2::RelativePosition>(); + uno::Any aRelativeSize = xProp->getPropertyValue("RelativeSize"); + chart2::RelativeSize aSize = aRelativeSize.get<chart2::RelativeSize>(); - double x = aPos.Primary; - double y = aPos.Secondary; + const double x = aPos.Primary; + const double y = aPos.Secondary; + const double w = aSize.Primary; + const double h = aSize.Secondary; pFS->singleElement(FSNS(XML_c, XML_x), XML_val, IS(x), @@ -871,6 +876,14 @@ void ChartExport::exportLegend( const Reference< css::chart::XChartDocument >& x pFS->singleElement(FSNS(XML_c, XML_y), XML_val, IS(y), FSEND); + + 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)); @@ -886,6 +899,9 @@ void ChartExport::exportLegend( const Reference< css::chart::XChartDocument >& x // shape properties exportShapeProps( xProp ); + + // draw-chart:txPr text properties + exportTextProps( xProp ); } // legendEntry @@ -1010,7 +1026,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()) @@ -1031,7 +1047,8 @@ void ChartExport::exportPlotArea( ) chart2::RelativePosition aPos = aAny.get<chart2::RelativePosition>(); aAny = xWall->getPropertyValue("RelativeSize"); chart2::RelativeSize aSize = aAny.get<chart2::RelativeSize>(); - exportManualLayout(aPos, aSize); + uno::Reference< css::chart::XDiagramPositioning > xDiagramPositioning( xChartDoc->getDiagram(), uno::UNO_QUERY ); + exportManualLayout(aPos, aSize, xDiagramPositioning->isExcludingDiagramPositioning() ); } } @@ -1143,14 +1160,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); @@ -1160,8 +1184,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: @@ -2278,20 +2302,18 @@ void ChartExport::exportTextProps(const Reference<XPropertySet>& 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)); } |