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 commit35d062f787
(tdf#116163: Limit label height in chart if needed) and commit26caf1bc59
(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 <nemeth@numbertext.org> Reviewed-by: László Németh <nemeth@numbertext.org>
This commit is contained in:
parent
b114e5659b
commit
7c300296dd
3 changed files with 52 additions and 11 deletions
|
@ -76,28 +76,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)
|
||||
|
@ -128,6 +129,7 @@ static Reference< drawing::XShape > createSingleLabel(
|
|||
, const AxisProperties& rAxisProperties
|
||||
, const tNameSequence& rPropNames
|
||||
, const tAnySequence& rPropValues
|
||||
, const bool bIsHorizontalAxis
|
||||
)
|
||||
{
|
||||
if(rLabel.isEmpty())
|
||||
|
@ -142,7 +144,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 );
|
||||
|
@ -716,6 +718,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())
|
||||
|
@ -745,7 +762,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;
|
||||
}
|
||||
|
||||
|
@ -860,7 +877,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;
|
||||
|
||||
|
@ -1029,7 +1046,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;
|
||||
|
||||
|
|
BIN
sw/qa/extras/layout/data/testTruncatedAxisLabel.odt
Normal file
BIN
sw/qa/extras/layout/data/testTruncatedAxisLabel.odt
Normal file
Binary file not shown.
|
@ -2416,6 +2416,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");
|
||||
|
|
Loading…
Reference in a new issue