chart2/qa/extras/chart2import2.cxx | 42 ++++++++++++ chart2/qa/extras/data/xls/testRotatedAxisTitlePositions.xls |binary sc/source/filter/excel/xichart.cxx | 17 ++-- 3 files changed, 50 insertions(+), 9 deletions(-)
New commits: commit 0bfca02bf492ec917633388aa01421a1e0dad31a Author: Markus Mohrhard <[email protected]> AuthorDate: Thu Aug 14 05:12:31 2025 +0800 Commit: Markus Mohrhard <[email protected]> CommitDate: Thu Aug 14 09:11:12 2025 +0200 tdf#94259: don't use the non-existed chart view during import During the import process the chart view shapes don't exist yet and therefore trying to infer the title size from the chart shape can't work. Luckily for the axis titles we can reuse the title size that was stored in the file. There are still small differences in the positioning of various objects between Calc and Excel but these are unrelated to this problem. Change-Id: Ibe243e24f7bab3eedd06ee26037bcedeac48354e Reviewed-on: https://gerrit.libreoffice.org/c/core/+/189538 Tested-by: Jenkins Reviewed-by: Markus Mohrhard <[email protected]> diff --git a/chart2/qa/extras/chart2import2.cxx b/chart2/qa/extras/chart2import2.cxx index 6f8bebfac85e..c20efb0f6835 100644 --- a/chart2/qa/extras/chart2import2.cxx +++ b/chart2/qa/extras/chart2import2.cxx @@ -1007,6 +1007,48 @@ CPPUNIT_TEST_FIXTURE(Chart2ImportTest2, testTdf136754) drawing::FillStyle_SOLID, eStyle); } +CPPUNIT_TEST_FIXTURE(Chart2ImportTest2, testTdf94259) +{ + loadFromFile(u"xls/testRotatedAxisTitlePositions.xls"); + { + uno::Reference<chart2::XChartDocument> xChartDoc = getChartDocFromSheet(0); + CPPUNIT_ASSERT(xChartDoc.is()); + + Reference<chart2::XAxis> xAxis = getAxisFromDoc(xChartDoc, 0, 1, 0); + CPPUNIT_ASSERT(xAxis.is()); + lcl_assertAngles(xAxis, 0, 90); + Reference<chart2::XTitle> xAxisTitle + = css::uno::Reference<chart2::XTitled>(xAxis, UNO_QUERY_THROW)->getTitleObject(); + Reference<beans::XPropertySet> xAxisTitleProps(xAxisTitle, UNO_QUERY_THROW); + + chart2::RelativePosition aRelPos; + CPPUNIT_ASSERT(xAxisTitleProps->getPropertyValue("RelativePosition") >>= aRelPos); + + // old value with my setup 0.0327998, new value: 0.822488 + CPPUNIT_ASSERT_GREATER(0.1, aRelPos.Secondary); + SAL_WARN("chart2", "Primary: " << aRelPos.Primary << ", " << aRelPos.Secondary); + } + { + uno::Reference<chart2::XChartDocument> xChartDoc = getChartDocFromSheet(1); + CPPUNIT_ASSERT(xChartDoc.is()); + + Reference<chart2::XAxis> xAxis = getAxisFromDoc(xChartDoc, 0, 1, 0); + CPPUNIT_ASSERT(xAxis.is()); + lcl_assertAngles(xAxis, 0, 270); + + Reference<chart2::XTitle> xAxisTitle + = css::uno::Reference<chart2::XTitled>(xAxis, UNO_QUERY_THROW)->getTitleObject(); + Reference<beans::XPropertySet> xAxisTitleProps(xAxisTitle, UNO_QUERY_THROW); + + chart2::RelativePosition aRelPos; + CPPUNIT_ASSERT(xAxisTitleProps->getPropertyValue("RelativePosition") >>= aRelPos); + + SAL_WARN("chart2", "Primary: " << aRelPos.Primary << ", " << aRelPos.Secondary); + // old value with my setup 0.0330348, new value: 0.0987283 + CPPUNIT_ASSERT_GREATER(0.05, aRelPos.Primary); + } +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/chart2/qa/extras/data/xls/testRotatedAxisTitlePositions.xls b/chart2/qa/extras/data/xls/testRotatedAxisTitlePositions.xls new file mode 100644 index 000000000000..c5419d3761c1 Binary files /dev/null and b/chart2/qa/extras/data/xls/testRotatedAxisTitlePositions.xls differ diff --git a/sc/source/filter/excel/xichart.cxx b/sc/source/filter/excel/xichart.cxx index ccb003e388c6..4763911bf82b 100644 --- a/sc/source/filter/excel/xichart.cxx +++ b/sc/source/filter/excel/xichart.cxx @@ -1206,22 +1206,21 @@ void XclImpChText::ConvertTitlePosition( const XclChTextKey& rTitleKey ) const try { Reference< XShape > xTitleShape( GetTitleShape( rTitleKey ), UNO_SET_THROW ); - // the call to XShape.getSize() may recalc the chart view - css::awt::Size aTitleSize = xTitleShape->getSize(); // rotated titles need special handling... Degree100 nScRot = XclTools::GetScRotation( GetRotation(), 0_deg100 ); double fRad = toRadians(nScRot); double fSin = fabs( sin( fRad ) ); // calculate the title position from the values in the CHTEXT record - css::awt::Point aTitlePos( - CalcHmmFromChartX( maData.maRect.mnX ), - CalcHmmFromChartY( maData.maRect.mnY ) ); - // add part of height to X direction, if title is rotated down (clockwise) + css::awt::Rectangle aTitleRect = CalcHmmFromChartRect(maData.maRect); + css::awt::Point aTitlePos(aTitleRect.X, aTitleRect.Y); + // add part of width to X direction, if title is rotated down (clockwise) if( nScRot > 18000_deg100 ) - aTitlePos.X += static_cast< sal_Int32 >( fSin * aTitleSize.Height + 0.5 ); - // add part of width to Y direction, if title is rotated up (counterclockwise) + { + aTitlePos.X += static_cast< sal_Int32 >( fSin * aTitleRect.Width + 0.5 ); + } + // add part of height to Y direction, if title is rotated up (counterclockwise) else if( nScRot > 0_deg100 ) - aTitlePos.Y += static_cast< sal_Int32 >( fSin * aTitleSize.Width + 0.5 ); + aTitlePos.Y += static_cast< sal_Int32 >( fSin * aTitleRect.Height + 0.5 ); // set the resulting position at the title shape xTitleShape->setPosition( aTitlePos ); }
