chart2/source/view/axes/VCartesianAxis.cxx | 39 ++++++++++++++------ sw/qa/extras/layout/data/testTruncatedAxisLabel.odt |binary sw/qa/extras/layout/layout.cxx | 24 ++++++++++++ 3 files changed, 52 insertions(+), 11 deletions(-)
New commits: commit f10cbeffba8dc52b971bc3f6644eb0cf4bbeb5eb Author: Balazs Varga <balazs.varga...@gmail.com> AuthorDate: Mon Mar 2 13:55:35 2020 +0100 Commit: Xisco Faulí <xiscofa...@libreoffice.org> CommitDate: Tue Mar 10 11:38:57 2020 +0100 tdf#131060 tdf#117088 chart view: fix missing or truncated axis labels if we have enough space under the horizontal X axis. Note: allow truncation of vertical X axis labels only if they are text labels and the position is NEAR_AXIS or OUTSIDE_START. Regressions from commit 35d062f7879d5414334643cb90bff411726b2168 (tdf#116163: Limit label height in chart if needed) and commit 26caf1bc59c81704f11225e3e431e412deb8c475 (tdf#114179: Custom size and position of the chart wall) Change-Id: Idf86bc2b5482bb50a266cda57cc502621c2e08ed Reviewed-on: https://gerrit.libreoffice.org/c/core/+/89829 Tested-by: László Németh <nem...@numbertext.org> Reviewed-by: László Németh <nem...@numbertext.org> (cherry picked from commit 7c300296dd727990455449b19b111b9fc49eadad) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/90043 Tested-by: Jenkins Reviewed-by: Xisco Faulí <xiscofa...@libreoffice.org> diff --git a/chart2/source/view/axes/VCartesianAxis.cxx b/chart2/source/view/axes/VCartesianAxis.cxx index dc619d91ff66..594277b953f8 100644 --- a/chart2/source/view/axes/VCartesianAxis.cxx +++ b/chart2/source/view/axes/VCartesianAxis.cxx @@ -77,28 +77,29 @@ static void lcl_ResizeTextShapeToFitAvailableSpace( Reference< drawing::XShape > const AxisLabelProperties& rAxisLabelProperties, const OUString& rLabel, const tNameSequence& rPropNames, - const tAnySequence& rPropValues ) + const tAnySequence& rPropValues, + const bool bIsHorizontalAxis ) { uno::Reference< text::XTextRange > xTextRange( xShape2DText, uno::UNO_QUERY ); if( !xTextRange.is() ) return; - const sal_Int32 nFullHeight = rAxisLabelProperties.m_aFontReferenceSize.Height; + const sal_Int32 nFullSize = bIsHorizontalAxis ? rAxisLabelProperties.m_aFontReferenceSize.Height : rAxisLabelProperties.m_aFontReferenceSize.Width; - if( !nFullHeight || !rLabel.getLength() ) + if( !nFullSize || !rLabel.getLength() ) return; - sal_Int32 nMaxLabelsHeight = nFullHeight - rAxisLabelProperties.m_aMaximumSpaceForLabels.Height - rAxisLabelProperties.m_aMaximumSpaceForLabels.Y; + sal_Int32 nMaxLabelsSize = bIsHorizontalAxis ? rAxisLabelProperties.m_aMaximumSpaceForLabels.Height : rAxisLabelProperties.m_aMaximumSpaceForLabels.Width; const sal_Int32 nAvgCharWidth = xShape2DText->getSize().Width / rLabel.getLength(); - const sal_Int32 nTextSize = ShapeFactory::getSizeAfterRotation( xShape2DText, - rAxisLabelProperties.fRotationAngleDegree ).Height; + const sal_Int32 nTextSize = bIsHorizontalAxis ? ShapeFactory::getSizeAfterRotation(xShape2DText, rAxisLabelProperties.fRotationAngleDegree).Height : + ShapeFactory::getSizeAfterRotation(xShape2DText, rAxisLabelProperties.fRotationAngleDegree).Width; if( !nAvgCharWidth ) return; const OUString sDots = "..."; - const sal_Int32 nCharsToRemove = ( nTextSize - nMaxLabelsHeight ) / nAvgCharWidth + 1; + const sal_Int32 nCharsToRemove = ( nTextSize - nMaxLabelsSize ) / nAvgCharWidth + 1; sal_Int32 nNewLen = rLabel.getLength() - nCharsToRemove - sDots.getLength(); // Prevent from showing only dots if (nNewLen < 0) @@ -129,6 +130,7 @@ static Reference< drawing::XShape > createSingleLabel( , const AxisProperties& rAxisProperties , const tNameSequence& rPropNames , const tAnySequence& rPropValues + , const bool bIsHorizontalAxis ) { if(rLabel.isEmpty()) @@ -143,7 +145,7 @@ static Reference< drawing::XShape > createSingleLabel( ->createText( xTarget, aLabel, rPropNames, rPropValues, aATransformation ); if( rAxisProperties.m_bLimitSpaceForLabels ) - lcl_ResizeTextShapeToFitAvailableSpace(xShape2DText, rAxisLabelProperties, aLabel, rPropNames, rPropValues); + lcl_ResizeTextShapeToFitAvailableSpace(xShape2DText, rAxisLabelProperties, aLabel, rPropNames, rPropValues, bIsHorizontalAxis); LabelPositionHelper::correctPositionForRotation( xShape2DText , rAxisProperties.maLabelAlignment.meAlignment, rAxisLabelProperties.fRotationAngleDegree, rAxisProperties.m_bComplexCategories ); @@ -709,6 +711,21 @@ bool VCartesianAxis::createTextShapes( const bool bIsHorizontalAxis = pTickFactory->isHorizontalAxis(); const bool bIsVerticalAxis = pTickFactory->isVerticalAxis(); + if( m_bUseTextLabels && (m_aAxisProperties.m_eLabelPos == css::chart::ChartAxisLabelPosition_NEAR_AXIS || + m_aAxisProperties.m_eLabelPos == css::chart::ChartAxisLabelPosition_OUTSIDE_START)) + { + if (bIsHorizontalAxis) + { + rAxisLabelProperties.m_aMaximumSpaceForLabels.Y = pTickFactory->getXaxisStartPos().getY(); + rAxisLabelProperties.m_aMaximumSpaceForLabels.Height = rAxisLabelProperties.m_aFontReferenceSize.Height - rAxisLabelProperties.m_aMaximumSpaceForLabels.Y; + } + else if (bIsVerticalAxis) + { + rAxisLabelProperties.m_aMaximumSpaceForLabels.X = 0; + rAxisLabelProperties.m_aMaximumSpaceForLabels.Width = pTickFactory->getXaxisStartPos().getX(); + } + } + if (!isBreakOfLabelsAllowed(rAxisLabelProperties, bIsHorizontalAxis, bIsVerticalAxis) && !isAutoStaggeringOfLabelsAllowed(rAxisLabelProperties, bIsHorizontalAxis, bIsVerticalAxis) && !rAxisLabelProperties.isStaggered()) @@ -738,7 +755,7 @@ bool VCartesianAxis::createTextShapes( // recalculate the nLimitedSpaceForText in case of 90 and 270 degree if the text break is true if ( rAxisLabelProperties.fRotationAngleDegree == 90.0 || rAxisLabelProperties.fRotationAngleDegree == 270.0 ) { - nLimitedSpaceForText = rAxisLabelProperties.m_aFontReferenceSize.Height - pTickFactory->getXaxisStartPos().getY(); + nLimitedSpaceForText = rAxisLabelProperties.m_aMaximumSpaceForLabels.Height; m_aAxisProperties.m_bLimitSpaceForLabels = false; } @@ -853,7 +870,7 @@ bool VCartesianAxis::createTextShapes( pTickInfo->xTextShape = createSingleLabel( m_xShapeFactory, xTarget , aAnchorScreenPosition2D, aLabel , rAxisLabelProperties, m_aAxisProperties - , aPropNames, aPropValues ); + , aPropNames, aPropValues, bIsHorizontalAxis ); if(!pTickInfo->xTextShape.is()) continue; @@ -1022,7 +1039,7 @@ bool VCartesianAxis::createTextShapesSimple( pTickInfo->xTextShape = createSingleLabel( m_xShapeFactory, xTarget , aAnchorScreenPosition2D, aLabel , rAxisLabelProperties, m_aAxisProperties - , aPropNames, aPropValues ); + , aPropNames, aPropValues, bIsHorizontalAxis ); if(!pTickInfo->xTextShape.is()) continue; diff --git a/sw/qa/extras/layout/data/testTruncatedAxisLabel.odt b/sw/qa/extras/layout/data/testTruncatedAxisLabel.odt new file mode 100644 index 000000000000..f8eb74904102 Binary files /dev/null and b/sw/qa/extras/layout/data/testTruncatedAxisLabel.odt differ diff --git a/sw/qa/extras/layout/layout.cxx b/sw/qa/extras/layout/layout.cxx index f9698d48505a..36e34918f9a3 100644 --- a/sw/qa/extras/layout/layout.cxx +++ b/sw/qa/extras/layout/layout.cxx @@ -2410,6 +2410,30 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTdf122800) // This failed, if the textarray length of the first axis label not 22. } +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTruncatedAxisLabel) +{ + SwDoc* pDoc = createDoc("testTruncatedAxisLabel.odt"); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr<GDIMetaFile> xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocPtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + // test the X axis label visibility + assertXPathContent( + pXmlDoc, + "/metafile/push[1]/push[1]/push[1]/push[3]/push[1]/push[1]/push[1]/textarray[1]/text", + "Long axis label truncated 1"); + + // test the Y axis label visibility + assertXPathContent( + pXmlDoc, + "/metafile/push[1]/push[1]/push[1]/push[3]/push[1]/push[1]/push[1]/textarray[3]/text", + "-5.00"); +} + CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTdf128996) { SwDoc* pDoc = createDoc("tdf128996.docx"); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits