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 ) );