From f7421e4df0a37ec66d4d4edcbee6ab0613ba1c60 Mon Sep 17 00:00:00 2001 From: Mike Kaganski Date: Wed, 15 Jul 2026 21:30:37 +0500 Subject: [PATCH] tdf#159450 Keep axis title centered on plot area with data table When a chart shows a data table, it is drawn as a strip at the bottom of the diagram, so the plot-area-plus-axes rectangle grows to include it. The vertical axis title was centered on that rectangle and thus ended up shifted downwards compared to MS Office, which centers it on the plot area alone. Center the left- and right-aligned axis titles on the plot area rectangle (which already excludes the data table) instead of on the plot area plus axes, so the title stays centered on the axis. Signed-off-by: Mike Kaganski Change-Id: If21ba0938cea16abc382e686b9c4e2b84caf2dca Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/6978 Reviewed-by: Miklos Vajna Tested-by: Jenkins CPCI (cherry picked from commit 48953636f24d522426d5f5e4ed9f0fc5ec6f30f5) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/208241 Reviewed-by: Xisco Fauli Tested-by: Jenkins --- chart2/qa/extras/chart2import2.cxx | 26 ++++++++++++++++++++++ chart2/qa/extras/data/xlsx/tdf159450.xlsx | Bin 0 -> 13857 bytes chart2/source/view/main/ChartView.cxx | 23 ++++++++++++------- 3 files changed, 41 insertions(+), 8 deletions(-) create mode 100644 chart2/qa/extras/data/xlsx/tdf159450.xlsx diff --git a/chart2/qa/extras/chart2import2.cxx b/chart2/qa/extras/chart2import2.cxx index 7fba95030162..1e83d03d7c56 100644 --- a/chart2/qa/extras/chart2import2.cxx +++ b/chart2/qa/extras/chart2import2.cxx @@ -883,6 +883,32 @@ CPPUNIT_TEST_FIXTURE(Chart2ImportTest2, testChartDataTableWithMultipleLegendEntr CPPUNIT_ASSERT(xDataTableShape.is()); } +CPPUNIT_TEST_FIXTURE(Chart2ImportTest2, testTdf159450AxisTitleWithDataTable) +{ + // The chart has a vertical axis title and a data table below the plot area. + // The axis title must stay centered on the plot area, not on the whole + // diagram including the data table below it (which used to shift it down). + loadFromFile(u"xlsx/tdf159450.xlsx"); + auto xDrawPage + = getChartDocFromSheet(0).queryThrow()->getDrawPage(); + auto xShapes = xDrawPage->getByIndex(0).queryThrow(); + + // The chart has a data table, drawn below the plot area. + CPPUNIT_ASSERT(getShapeByName(xShapes, u"CID/D=0:DataTable="_ustr).is()); + Reference xPlotArea = getShapeByName(xShapes, u"PlotAreaExcludingAxes"_ustr); + CPPUNIT_ASSERT(xPlotArea.is()); + Reference xAxisTitle + = getShapeByName(xShapes, u"CID/D=0:CS=0:Axis=1,0:Title="_ustr); + CPPUNIT_ASSERT(xAxisTitle.is()); + + // The vertical axis title is centered on the plot area. Before the fix it was + // centered on the plot area plus the data table below it, so its center sat + // about half the data table height lower. + sal_Int32 nTitleCenterY = xAxisTitle->getPosition().Y + xAxisTitle->getSize().Height / 2; + sal_Int32 nPlotCenterY = xPlotArea->getPosition().Y + xPlotArea->getSize().Height / 2; + CPPUNIT_ASSERT_DOUBLES_EQUAL(nPlotCenterY, nTitleCenterY, 20); +} + namespace { void lcl_assertAngles(const Reference& rAxis, const double& rExpectedLabelAngle, diff --git a/chart2/qa/extras/data/xlsx/tdf159450.xlsx b/chart2/qa/extras/data/xlsx/tdf159450.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..011bc9778d47839a9bee6b12ddafbaf1542a4399 GIT binary patch literal 13857 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