tdf#159068 sc: fix detective shapes (PDF/UA export)
The detective shapes(DetectiveArrow,ValidationCircle) don't have the
option to set alternative text, so it should be marked as decorative.
Change-Id: If83b29eb071b25f9eaa92a23337e416048b6aa8b
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/162059
Tested-by: Jenkins
Reviewed-by: Nagy Tibor <tibor.nagy.extern@allotropia.de>
diff --git a/sc/qa/extras/scpdfexport.cxx b/sc/qa/extras/scpdfexport.cxx
index de888c0..1121160 100644
--- a/sc/qa/extras/scpdfexport.cxx
+++ b/sc/qa/extras/scpdfexport.cxx
@@ -65,6 +65,7 @@ public:
void testExportFitToPage_Tdf103516();
void testUnoCommands_Tdf120161();
void testTdf64703_hiddenPageBreak();
void testTdf159068();
void testTdf159066();
void testTdf159065();
void testTdf123870();
@@ -79,6 +80,7 @@ public:
CPPUNIT_TEST(testExportFitToPage_Tdf103516);
CPPUNIT_TEST(testUnoCommands_Tdf120161);
CPPUNIT_TEST(testTdf64703_hiddenPageBreak);
CPPUNIT_TEST(testTdf159068);
CPPUNIT_TEST(testTdf159066);
CPPUNIT_TEST(testTdf159065);
CPPUNIT_TEST(testTdf123870);
@@ -398,6 +400,66 @@ void ScPDFExportTest::testTdf64703_hiddenPageBreak()
}
}
void ScPDFExportTest::testTdf159068()
{
loadFromFile(u"tdf159068.ods");
uno::Reference<frame::XModel> xModel(mxComponent, uno::UNO_QUERY);
// A1:C3
ScRange range1(0, 0, 0, 2, 2, 0);
exportToPDF(xModel, range1);
vcl::filter::PDFDocument aDocument;
SvFileStream aStream(maTempFile.GetURL(), StreamMode::READ);
CPPUNIT_ASSERT(aDocument.Read(aStream));
// The document has one page.
std::vector<vcl::filter::PDFObjectElement*> aPages = aDocument.GetPages();
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), aPages.size());
vcl::filter::PDFObjectElement* pContents = aPages[0]->LookupObject("Contents"_ostr);
CPPUNIT_ASSERT(pContents);
vcl::filter::PDFStreamElement* pStream = pContents->GetStream();
CPPUNIT_ASSERT(pStream);
SvMemoryStream& rObjectStream = pStream->GetMemory();
// Uncompress it.
SvMemoryStream aUncompressed;
ZCodec aZCodec;
aZCodec.BeginCompression();
rObjectStream.Seek(0);
aZCodec.Decompress(rObjectStream, aUncompressed);
CPPUNIT_ASSERT(aZCodec.EndCompression());
auto pStart = static_cast<const char*>(aUncompressed.GetData());
const char* const pEnd = pStart + aUncompressed.GetSize();
auto nArtifact(0);
auto nLine(0);
while (true)
{
++nLine;
auto const pLine = ::std::find(pStart, pEnd, '\n');
if (pLine == pEnd)
{
break;
}
std::string_view const line(pStart, pLine - pStart);
pStart = pLine + 1;
if (!line.empty() && line[0] != '%')
{
::std::cerr << nLine << ": " << line << "\n ";
if (o3tl::starts_with(line, "/Artifact BMC"))
nArtifact++;
}
}
// Without the fix in place, this test would have failed with
// - Expected: 5 (Artifact: Header, Footer, Rectangel, DetectiveArrow, ValidationCircle)
// - Actual : 2 (Artifact: Header, Footer)
CPPUNIT_ASSERT_EQUAL(static_cast<decltype(nArtifact)>(5), nArtifact);
}
void ScPDFExportTest::testTdf159066()
{
loadFromFile(u"tdf159066.ods");
diff --git a/sc/qa/extras/testdocuments/tdf159068.ods b/sc/qa/extras/testdocuments/tdf159068.ods
new file mode 100644
index 0000000..a0745d9
--- /dev/null
+++ b/sc/qa/extras/testdocuments/tdf159068.ods
Binary files differ
diff --git a/sc/source/core/tool/detfunc.cxx b/sc/source/core/tool/detfunc.cxx
index b5dc71b..59efb5a 100644
--- a/sc/source/core/tool/detfunc.cxx
+++ b/sc/source/core/tool/detfunc.cxx
@@ -373,6 +373,7 @@ void ScDetectiveFunc::InsertArrow( SCCOL nCol, SCROW nRow,
pBox->NbcSetStyleSheet(nullptr, true);
pBox->SetMergedItemSetAndBroadcast(rData.GetBoxSet());
pBox->SetDecorative(true);
pBox->SetLayer( SC_LAYER_INTERN );
pPage->InsertObject( pBox.get() );
pModel->AddCalcUndo( std::make_unique<SdrUndoInsertObj>( *pBox ) );
@@ -418,6 +419,7 @@ void ScDetectiveFunc::InsertArrow( SCCOL nCol, SCROW nRow,
pArrow->NbcSetLogicRect(tools::Rectangle::Normalize(aStartPos,aEndPos)); //TODO: needed ???
pArrow->SetMergedItemSetAndBroadcast(rAttrSet);
pArrow->SetDecorative(true);
pArrow->SetLayer( SC_LAYER_INTERN );
pPage->InsertObject( pArrow.get() );
pModel->AddCalcUndo( std::make_unique<SdrUndoInsertObj>( *pArrow ) );
@@ -561,6 +563,7 @@ void ScDetectiveFunc::DrawCircle( SCCOL nCol, SCROW nRow, ScDetectiveData& rData
pCircle->NbcSetStyleSheet(nullptr, true);
pCircle->SetMergedItemSetAndBroadcast(rAttrSet);
pCircle->SetDecorative(true);
pCircle->SetLayer( SC_LAYER_INTERN );
pPage->InsertObject( pCircle.get() );
pModel->AddCalcUndo( std::make_unique<SdrUndoInsertObj>( *pCircle ) );