diff options
author | Tünde Tóth <tundeth@gmail.com> | 2020-06-15 16:42:40 +0200 |
---|---|---|
committer | László Németh <nemeth@numbertext.org> | 2020-06-30 12:44:23 +0200 |
commit | 72613bd2a04b4b1ba614c0f645e9804ebfe73682 (patch) | |
tree | 84699adbd30081c0a90a4a9ea75ba453f3811589 | |
parent | d828da851efa8e243a940f3eceefc39c6c735f9b (diff) |
tdf#126425 Chart: fix missing legend with exceeding text
Ellipsize legend box contents, if the custom size of
the chart legend is too small to contain the text.
Change-Id: I91ef913f509b233912a8bfb878a1c80d577e2a88
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/96437
Tested-by: László Németh <nemeth@numbertext.org>
Reviewed-by: László Németh <nemeth@numbertext.org>
-rw-r--r-- | chart2/source/view/main/VLegend.cxx | 56 | ||||
-rw-r--r-- | sw/qa/extras/layout/data/long_legendentry.docx | bin | 0 -> 27020 bytes | |||
-rw-r--r-- | sw/qa/extras/layout/layout.cxx | 17 |
3 files changed, 67 insertions, 6 deletions
diff --git a/chart2/source/view/main/VLegend.cxx b/chart2/source/view/main/VLegend.cxx index 4642b63f55d4..d16495e426f3 100644 --- a/chart2/source/view/main/VLegend.cxx +++ b/chart2/source/view/main/VLegend.cxx @@ -408,18 +408,62 @@ awt::Size lcl_placeLegendEntries( DrawModelWrapper::removeShape( aTextShapes[nEntry] ); aTextShapes.pop_back(); } - if( nEntry < nNumberOfEntries ) + if( nEntry < nNumberOfEntries && ( nEntry != 0 || nNumberOfColumns != 1 ) ) { DrawModelWrapper::removeShape( rEntries[ nEntry ].aSymbol ); rEntries.pop_back(); nNumberOfEntries--; } } - nSumHeight -= aRowHeights[nRow]; - aRowHeights.pop_back(); - nRemainingSpace = rRemainingSpace.Height - nSumHeight; - if( nRemainingSpace>=0 ) - break; + if (nRow == 0 && nNumberOfColumns == 1) + { + try + { + OUString aLabelString = rEntries[0].aLabel[0]->getString(); + const OUString sDots = "..."; + ShapeFactory* pShapeFactory = ShapeFactory::getOrCreateShapeFactory(xShapeFactory); + for (sal_Int32 nNewLen = aLabelString.getLength() - sDots.getLength(); nNewLen > 0; nNewLen--) + { + OUString aNewLabel = aLabelString.copy(0, nNewLen) + sDots; + Reference<drawing::XShape> xEntry = pShapeFactory->createText( + xTarget, aNewLabel, rTextProperties.first, rTextProperties.second, uno::Any()); + nSumHeight = xEntry->getSize().Height; + nRemainingSpace = rRemainingSpace.Height - nSumHeight; + if (nRemainingSpace >= 0) + { + sal_Int32 nWidth = xEntry->getSize().Width + nSymbolPlusDistanceWidth; + if (rRemainingSpace.Width - nWidth >= 0) + { + aTextShapes.push_back(xEntry); + rEntries[0].aLabel[0]->setString(aNewLabel); + aRowHeights[0] = nSumHeight; + aColumnWidths[0] = nWidth; + break; + } + } + DrawModelWrapper::removeShape(xEntry); + } + if (aTextShapes.size() == 0) + { + DrawModelWrapper::removeShape(rEntries[0].aSymbol); + rEntries.pop_back(); + nNumberOfEntries--; + aRowHeights.pop_back(); + } + } + catch (const uno::Exception&) + { + DBG_UNHANDLED_EXCEPTION("chart2"); + } + } + else + { + nSumHeight -= aRowHeights[nRow]; + aRowHeights.pop_back(); + nRemainingSpace = rRemainingSpace.Height - nSumHeight; + if (nRemainingSpace >= 0) + break; + } } nNumberOfRows = static_cast<sal_Int32>(aRowHeights.size()); } diff --git a/sw/qa/extras/layout/data/long_legendentry.docx b/sw/qa/extras/layout/data/long_legendentry.docx Binary files differnew file mode 100644 index 000000000000..6259438a16e3 --- /dev/null +++ b/sw/qa/extras/layout/data/long_legendentry.docx diff --git a/sw/qa/extras/layout/layout.cxx b/sw/qa/extras/layout/layout.cxx index e5c2784c17cb..c8b5665c5e00 100644 --- a/sw/qa/extras/layout/layout.cxx +++ b/sw/qa/extras/layout/layout.cxx @@ -2363,6 +2363,23 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTdf75659) // These failed, if the legend names are empty strings. } +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTdf126425) +{ + SwDoc* pDoc = createDoc("long_legendentry.docx"); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr<GDIMetaFile> xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 14 + // - Actual : 12 + // i.e. the text of the chart legend lost. + assertXPath(pXmlDoc, "//textarray", 14); +} + CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTdf123268) { SwDoc* pDoc = createDoc("tdf123268.odt"); |