diff options
author | Balazs Varga <balazs.varga991@gmail.com> | 2019-04-09 16:12:35 +0200 |
---|---|---|
committer | László Németh <nemeth@numbertext.org> | 2019-04-15 09:12:59 +0200 |
commit | 11473832b5717cb3222ce72baee885bc9e8e2386 (patch) | |
tree | 2285cd4abdf37f14b7c6f14fd2528607e96abefe | |
parent | e21bc3267776d89e26368b62963fc57dc792f743 (diff) |
tdf#114181 XLSX combined chart: fix swapped primary and secondary axes etc.
In combined charts, now X category axis crosses the Y axis at the right
place, all data series are attached to the right Y axis, and the
Y major grid isn't lost.
Note: Let's check which axis is attached to the first charttype
(in case of combined chart, the first one is a column chart) and create
that axis first. In OOXML standard, the first CT_valAx tag contains the
axID of the primary axis and the second CT_valAx tag contains the axID
of the secondary axis.
Change-Id: Ib123f95ec41ef5dbbf0599efd7a646f4640a9b70
Reviewed-on: https://gerrit.libreoffice.org/70464
Reviewed-by: László Németh <nemeth@numbertext.org>
Tested-by: László Németh <nemeth@numbertext.org>
-rw-r--r-- | chart2/qa/extras/chart2import.cxx | 28 | ||||
-rw-r--r-- | chart2/qa/extras/data/xlsx/testCombinedChartAxis.xlsx | bin | 0 -> 20857 bytes | |||
-rw-r--r-- | oox/source/drawingml/chart/plotareaconverter.cxx | 34 |
3 files changed, 58 insertions, 4 deletions
diff --git a/chart2/qa/extras/chart2import.cxx b/chart2/qa/extras/chart2import.cxx index 47d1ce481a77..475b5bbe2209 100644 --- a/chart2/qa/extras/chart2import.cxx +++ b/chart2/qa/extras/chart2import.cxx @@ -102,6 +102,7 @@ public: void testAxisTitleDefaultRotationXLSX(); void testSecondaryAxisTitleDefaultRotationXLSX(); void testAxisTitleRotationXLSX(); + void testCombinedChartAttachedAxisXLSX(); void testTdf90510(); // Pie chart label placement settings(XLS) void testTdf109858(); // Pie chart label placement settings(XLSX) @@ -182,6 +183,7 @@ public: CPPUNIT_TEST(testAxisTitleDefaultRotationXLSX); CPPUNIT_TEST(testSecondaryAxisTitleDefaultRotationXLSX); CPPUNIT_TEST(testAxisTitleRotationXLSX); + CPPUNIT_TEST(testCombinedChartAttachedAxisXLSX); CPPUNIT_TEST(testTdf90510); CPPUNIT_TEST(testTdf109858); CPPUNIT_TEST(testTdf111173); @@ -1399,6 +1401,32 @@ void Chart2ImportTest::testAxisTitleRotationXLSX() } +void Chart2ImportTest::testCombinedChartAttachedAxisXLSX() +{ + load("/chart2/qa/extras/data/xlsx/", "testCombinedChartAxis.xlsx"); + Reference< chart2::XChartDocument> xChartDoc = getChartDocFromSheet(0, mxComponent); + // First series + Reference<chart2::XDataSeries> xSeries = getDataSeriesFromDoc(xChartDoc, 0); + CPPUNIT_ASSERT(xSeries.is()); + + Reference<beans::XPropertySet> xPropSet(xSeries, uno::UNO_QUERY_THROW); + sal_Int32 nAxisIndex = -1; + // First series (column chart) should be attached to secondary axis! + uno::Any aAny = xPropSet->getPropertyValue("AttachedAxisIndex"); + CPPUNIT_ASSERT(aAny >>= nAxisIndex); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), nAxisIndex); + + // Second series + xSeries = getDataSeriesFromDoc(xChartDoc, 0, 1); + CPPUNIT_ASSERT(xSeries.is()); + + xPropSet.set(xSeries, uno::UNO_QUERY_THROW); + // Second series (line chart) should be attached to primary axis! + aAny = xPropSet->getPropertyValue("AttachedAxisIndex"); + CPPUNIT_ASSERT(aAny >>= nAxisIndex); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nAxisIndex); +} + void Chart2ImportTest::testInternalDataProvider() { uno::Reference< chart2::XChartDocument > xChartDoc(getChartDocFromImpress("/chart2/qa/extras/data/odp/", "chart.odp"), uno::UNO_QUERY_THROW); const uno::Reference< chart2::data::XDataProvider >& rxDataProvider = xChartDoc->getDataProvider(); diff --git a/chart2/qa/extras/data/xlsx/testCombinedChartAxis.xlsx b/chart2/qa/extras/data/xlsx/testCombinedChartAxis.xlsx Binary files differnew file mode 100644 index 000000000000..47f8246e23cd --- /dev/null +++ b/chart2/qa/extras/data/xlsx/testCombinedChartAxis.xlsx diff --git a/oox/source/drawingml/chart/plotareaconverter.cxx b/oox/source/drawingml/chart/plotareaconverter.cxx index f3a4b8ebe493..8afdfda365ea 100644 --- a/oox/source/drawingml/chart/plotareaconverter.cxx +++ b/oox/source/drawingml/chart/plotareaconverter.cxx @@ -335,12 +335,36 @@ void PlotAreaConverter::convertFromModel( View3DModel& rView3DModel ) // store all axis models in a map, keyed by axis identifier typedef ModelMap< sal_Int32, AxisModel > AxisMap; AxisMap aAxisMap; + std::vector<sal_Int32>rValAxisIds; + std::vector<sal_Int32>rRealValAxisIds; + + for (auto const& atypeGroup : mrModel.maTypeGroups) + { + if (atypeGroup->maAxisIds.size() > 1) + { + // let's collect which axId belongs to the Y Axis according to maTypeGroups + rRealValAxisIds.push_back(atypeGroup->maAxisIds[1]); + } + } + for (auto const& axis : mrModel.maAxes) { OSL_ENSURE( axis->mnAxisId >= 0, "PlotAreaConverter::convertFromModel - invalid axis identifier" ); OSL_ENSURE( !aAxisMap.has( axis->mnAxisId ), "PlotAreaConverter::convertFromModel - axis identifiers not unique" ); if( axis->mnAxisId != -1 ) aAxisMap[ axis->mnAxisId ] = axis; + + if ( axis->mnAxisId != -1 && axis->mnTypeId == C_TOKEN(valAx) ) + { + for (size_t i = 0; i < rRealValAxisIds.size(); i++) + { + if (axis->mnAxisId == rRealValAxisIds[i]) + { + // let's collect which axId belongs to the Y Axis according to maAxes + rValAxisIds.push_back(axis->mnAxisId); + } + } + } } // group the type group models into different axes sets @@ -390,13 +414,15 @@ void PlotAreaConverter::convertFromModel( View3DModel& rView3DModel ) // varying point colors only for single series in single chart type bool bSupportsVaryColorsByPoint = mrModel.maTypeGroups.size() == 1; - // convert all axes sets - sal_Int32 nAxesSetIdx = 0; + // convert all axes sets, and check which axis is attached to the first maTypeGroups + sal_Int32 nStartAxesSetIdx = (rValAxisIds.size() > 1 && aAxesSets[0]->maAxes[1]->mnAxisId != rValAxisIds[0] ) ? 1 : 0; + sal_Int32 nAxesSetIdx = nStartAxesSetIdx; + for (auto const& axesSet : aAxesSets) { AxesSetConverter aAxesSetConv(*this, *axesSet); aAxesSetConv.convertFromModel( xDiagram, rView3DModel, nAxesSetIdx, bSupportsVaryColorsByPoint ); - if( nAxesSetIdx == 0 ) + if(nAxesSetIdx == nStartAxesSetIdx) { maAutoTitle = aAxesSetConv.getAutomaticTitle(); mb3dChart = aAxesSetConv.is3dChart(); @@ -407,7 +433,7 @@ void PlotAreaConverter::convertFromModel( View3DModel& rView3DModel ) { maAutoTitle.clear(); } - ++nAxesSetIdx; + nAxesSetIdx = 1 - nAxesSetIdx; } DataTableConverter dataTableConverter (*this, mrModel.mxDataTable.getOrCreate()); |