chart2/qa/extras/chart2export.cxx | 17 ++++++++ chart2/qa/extras/data/docx/bar-chart-labels.docx |binary oox/source/export/chartexport.cxx | 44 +++++++++++++++++++---- 3 files changed, 54 insertions(+), 7 deletions(-)
New commits: commit 7b8073906adca8dae24c04a23708a3f3d582218f Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Thu Aug 7 18:57:50 2014 -0400 Ensure we export correct labal placement value for percent/stacked charts. Normal charts allow a variety of label placement options, but percent/stacked charts only allow three variants, and exporting a wrong value would trigger MS Office to think the file is corrupt. Change-Id: I8bdc1dc072b29e8df2c506b6b16c61279df12045 diff --git a/oox/source/export/chartexport.cxx b/oox/source/export/chartexport.cxx index 0845f71..882c52c 100644 --- a/oox/source/export/chartexport.cxx +++ b/oox/source/export/chartexport.cxx @@ -86,6 +86,7 @@ #include <xmloff/SchXMLSeriesHelper.hxx> #include "ColorPropertySet.hxx" #include <set> +#include <boost/unordered_set.hpp> #include <rtl/math.hxx> @@ -443,6 +444,8 @@ ChartExport::ChartExport( sal_Int32 nXmlNamespace, FSHelperPtr pFS, Reference< f , mbHasCategoryLabels( false ) , mbHasZAxis( false ) , mbIs3DChart( false ) + , mbStacked(false) + , mbPercent(false) { } @@ -2540,9 +2543,24 @@ struct LabelPlacementParam bool mbExport; sal_Int32 meDefault; + boost::unordered_set<sal_Int32> maAllowedValues; + LabelPlacementParam() : mbExport(true), meDefault(css::chart::DataLabelPlacement::OUTSIDE) {} + + void allowAll() + { + maAllowedValues.insert(css::chart::DataLabelPlacement::OUTSIDE); + maAllowedValues.insert(css::chart::DataLabelPlacement::INSIDE); + maAllowedValues.insert(css::chart::DataLabelPlacement::CENTER); + maAllowedValues.insert(css::chart::DataLabelPlacement::NEAR_ORIGIN); + maAllowedValues.insert(css::chart::DataLabelPlacement::TOP); + maAllowedValues.insert(css::chart::DataLabelPlacement::BOTTOM); + maAllowedValues.insert(css::chart::DataLabelPlacement::LEFT); + maAllowedValues.insert(css::chart::DataLabelPlacement::RIGHT); + maAllowedValues.insert(css::chart::DataLabelPlacement::AVOID_OVERLAP); + } }; const char* toOOXMLPlacement( sal_Int32 nPlacement ) @@ -2597,7 +2615,11 @@ void writeLabelProperties( { sal_Int32 nLabelPlacement = rLabelParam.meDefault; if (xPropSet->getPropertyValue("LabelPlacement") >>= nLabelPlacement) + { + if (!rLabelParam.maAllowedValues.count(nLabelPlacement)) + nLabelPlacement = rLabelParam.meDefault; pFS->singleElement(FSNS(XML_c, XML_dLblPos), XML_val, toOOXMLPlacement(nLabelPlacement), FSEND); + } } pFS->singleElement(FSNS(XML_c, XML_showLegendKey), XML_val, BS(aLabel.ShowLegendSymbol), FSEND); @@ -2633,6 +2655,7 @@ void ChartExport::exportDataLabels( LabelPlacementParam aParam; aParam.mbExport = !mbIs3DChart; aParam.meDefault = rInfo.mnDefLabelPos; + aParam.allowAll(); switch (getChartType()) // diagram chart type { case chart::TYPEID_PIE: @@ -2641,9 +2664,18 @@ void ChartExport::exportDataLabels( break; case chart::TYPEID_DOUGHNUT: case chart::TYPEID_AREA: - // Doughnut charts don't support label placement. + // Doughnut and area charts don't support label placement. aParam.mbExport = false; break; + case chart::TYPEID_BAR: + if (mbStacked || mbPercent) + { + aParam.maAllowedValues.clear(); + aParam.maAllowedValues.insert(css::chart::DataLabelPlacement::CENTER); + aParam.maAllowedValues.insert(css::chart::DataLabelPlacement::INSIDE); + aParam.maAllowedValues.insert(css::chart::DataLabelPlacement::NEAR_ORIGIN); + aParam.meDefault = css::chart::DataLabelPlacement::CENTER; + } default: ; } @@ -2768,17 +2800,15 @@ void ChartExport::exportGrouping( bool isBar ) FSHelperPtr pFS = GetFS(); Reference< XPropertySet > xPropSet( mxDiagram , uno::UNO_QUERY); // grouping - bool bStacked = false; if( GetProperty( xPropSet, "Stacked" ) ) - mAny >>= bStacked; - bool bPercentage = false; + mAny >>= mbStacked; if( GetProperty( xPropSet, "Percent" ) ) - mAny >>= bPercentage; + mAny >>= mbPercent; const char* grouping = NULL; - if( bStacked ) + if (mbStacked) grouping = "stacked"; - else if( bPercentage ) + else if (mbPercent) grouping = "percentStacked"; else { commit 3119e04b45a5598833aee2b114f6abcaf3c6808c Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Thu Aug 7 18:57:17 2014 -0400 Write test for exporting data label positions for percent stack bar chart. Change-Id: Idebb56fc96828ec38d5c239c16e5b413a50c837f diff --git a/chart2/qa/extras/chart2export.cxx b/chart2/qa/extras/chart2export.cxx index 664dba5..a76b43d 100644 --- a/chart2/qa/extras/chart2export.cxx +++ b/chart2/qa/extras/chart2export.cxx @@ -71,6 +71,7 @@ public: void testAxisNumberFormatODS(); void testDataLabelBordersDOCX(); void testDataLabel3DChartDOCX(); + void testDataLabelBarChartDOCX(); void testDataLabelDoughnutChartDOCX(); void testDataLabelAreaChartDOCX(); void testDataLabelDefaultLineChartDOCX(); @@ -110,6 +111,7 @@ public: CPPUNIT_TEST(testAxisNumberFormatODS); CPPUNIT_TEST(testDataLabelBordersDOCX); CPPUNIT_TEST(testDataLabel3DChartDOCX); + CPPUNIT_TEST(testDataLabelBarChartDOCX); CPPUNIT_TEST(testDataLabelDoughnutChartDOCX); CPPUNIT_TEST(testDataLabelAreaChartDOCX); CPPUNIT_TEST(testDataLabelDefaultLineChartDOCX); @@ -826,6 +828,21 @@ void Chart2ExportTest::testDataLabel3DChartDOCX() assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:bar3DChart/c:ser/c:dLbls/c:dLbl/c:dLblPos", 0); } +void Chart2ExportTest::testDataLabelBarChartDOCX() +{ + load("/chart2/qa/extras/data/docx/", "bar-chart-labels.docx"); + + Reference<chart2::XChartDocument> xChartDoc(getChartDocFromWriter(0), uno::UNO_QUERY); + CPPUNIT_ASSERT(xChartDoc.is()); + + xmlDocPtr pXmlDoc = parseExport("word/charts/chart","Office Open XML Text"); + CPPUNIT_ASSERT(pXmlDoc); + + assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[1]/c:dLbls/c:dLblPos", "val", "ctr"); + assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[2]/c:dLbls/c:dLblPos", "val", "inEnd"); + assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[3]/c:dLbls/c:dLblPos", "val", "inBase"); +} + void Chart2ExportTest::testDataLabelDoughnutChartDOCX() { load("/chart2/qa/extras/data/docx/", "doughnut-chart-labels.docx"); diff --git a/chart2/qa/extras/data/docx/bar-chart-labels.docx b/chart2/qa/extras/data/docx/bar-chart-labels.docx new file mode 100755 index 0000000..9ff8b4f Binary files /dev/null and b/chart2/qa/extras/data/docx/bar-chart-labels.docx differ _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits