sw/qa/extras/layout/data/tdf64222.docx |binary sw/qa/extras/layout/layout.cxx | 7 +++ sw/source/core/text/txtfld.cxx | 61 +++++++++++++++++---------------- 3 files changed, 39 insertions(+), 29 deletions(-)
New commits: commit 2c0d3ce5292b45a8897758508ee61801e4e8340d Author: Samuel Mehrbrodt <samuel.mehrbr...@cib.de> AuthorDate: Fri Aug 30 15:19:49 2019 +0200 Commit: Samuel Mehrbrodt <samuel.mehrbr...@cib.de> CommitDate: Thu Sep 5 08:51:39 2019 +0200 tdf#64222 Consistently apply direct formatting to numbering Change-Id: I54d672409c969389f33dd07021f10e1203bb64c6 Reviewed-on: https://gerrit.libreoffice.org/78299 Tested-by: Jenkins Reviewed-by: Samuel Mehrbrodt <samuel.mehrbr...@cib.de> diff --git a/sw/qa/extras/layout/data/tdf64222.docx b/sw/qa/extras/layout/data/tdf64222.docx new file mode 100644 index 000000000000..4a2de828a902 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf64222.docx differ diff --git a/sw/qa/extras/layout/layout.cxx b/sw/qa/extras/layout/layout.cxx index f5cae5aa8405..6fd861d68dc8 100644 --- a/sw/qa/extras/layout/layout.cxx +++ b/sw/qa/extras/layout/layout.cxx @@ -3038,6 +3038,13 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testImageComment) CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(5), aPosition.nContent.GetIndex()); } +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTdf64222) +{ + createDoc("tdf64222.docx"); + xmlDocPtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page/body/txt[2]/Special", "nHeight", "560"); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/core/text/txtfld.cxx b/sw/source/core/text/txtfld.cxx index 440916cb001e..90edb00b7e0b 100644 --- a/sw/source/core/text/txtfld.cxx +++ b/sw/source/core/text/txtfld.cxx @@ -422,6 +422,7 @@ static void checkApplyParagraphMarkFormatToNumbering(SwFont* pNumFnt, SwTextForm TextFrameIndex const nTextLen(rInf.GetTextFrame()->GetText().getLength()); SwTextNode const* pNode(nullptr); sw::MergedAttrIterReverse iter(*rInf.GetTextFrame()); + std::shared_ptr<SfxItemSet> pSet; for (SwTextAttr const* pHint = iter.PrevAttr(&pNode); pHint; pHint = iter.PrevAttr(&pNode)) { @@ -431,41 +432,43 @@ static void checkApplyParagraphMarkFormatToNumbering(SwFont* pNumFnt, SwTextForm { break; // only those at para end are interesting } - // Formatting for the paragraph mark is set to apply only to the - // (non-existent) extra character at end of the text node. - if (pHint->Which() == RES_TXTATR_AUTOFMT - && pHint->GetStart() == *pHint->End()) + // Formatting for the paragraph mark is usually set to apply only to the + // (non-existent) extra character at end of the text node, but there can be + // other hints too (ending at nTextLen), so look for all matching hints. + // Still the (non-existent) extra character at the end is preferred if it exists. + if (pHint->Which() == RES_TXTATR_AUTOFMT) { - std::shared_ptr<SfxItemSet> pSet(pHint->GetAutoFormat().GetStyleHandle()); - - // Check each item and in case it should be ignored, then clear it. - std::unique_ptr<SfxItemSet> pCleanedSet; - if (pSet.get()) - { - pCleanedSet = pSet->Clone(); - - SfxItemIter aIter(*pSet); - const SfxPoolItem* pItem = aIter.GetCurItem(); - while (true) - { - if (SwTextNode::IsIgnoredCharFormatForNumbering(pItem->Which())) - pCleanedSet->ClearItem(pItem->Which()); - else if (pFormat && pFormat->HasItem(pItem->Which())) - pCleanedSet->ClearItem(pItem->Which()); + pSet = pHint->GetAutoFormat().GetStyleHandle(); + // When we find an empty hint (start == end) we got what we are looking for. + if (pHint->GetStart() == *pHint->End()) + break; + } + } - if (aIter.IsAtEnd()) - break; + // Check each item and in case it should be ignored, then clear it. + std::unique_ptr<SfxItemSet> pCleanedSet; + if (pSet.get()) + { + pCleanedSet = pSet->Clone(); - pItem = aIter.NextItem(); - } - } + SfxItemIter aIter(*pSet); + const SfxPoolItem* pItem = aIter.GetCurItem(); + while (true) + { + if (SwTextNode::IsIgnoredCharFormatForNumbering(pItem->Which())) + pCleanedSet->ClearItem(pItem->Which()); + else if (pFormat && pFormat->HasItem(pItem->Which())) + pCleanedSet->ClearItem(pItem->Which()); - // Highlightcolor also needed to be untouched, but we can't have that just by clearing the item - Color nSaveHighlight = pNumFnt->GetHighlightColor(); + if (aIter.IsAtEnd()) + break; - pNumFnt->SetDiffFnt(pCleanedSet.get(), pIDSA); - pNumFnt->SetHighlightColor(nSaveHighlight); + pItem = aIter.NextItem(); } + // Highlightcolor also needed to be untouched, but we can't have that just by clearing the item + Color nSaveHighlight = pNumFnt->GetHighlightColor(); + pNumFnt->SetDiffFnt(pCleanedSet.get(), pIDSA); + pNumFnt->SetHighlightColor(nSaveHighlight); } } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits