i18npool/source/characterclassification/cclass_unicode_parser.cxx | 18 offapi/com/sun/star/i18n/KParseTokens.idl | 7 sc/source/core/tool/compiler.cxx | 6 sw/inc/fesh.hxx | 2 sw/qa/extras/layout/data/2024-01-19_merged-cells-on-separate-pages-vertical-alignement.odt |binary sw/qa/extras/layout/data/table-split-bug.fodt | 440 ++++++++++ sw/qa/extras/layout/layout.cxx | 44 + sw/qa/extras/layout/layout3.cxx | 66 + sw/qa/extras/uiwriter/uiwriter9.cxx | 74 + sw/source/core/bastyp/calc.cxx | 2 sw/source/core/doc/DocumentContentOperationsManager.cxx | 11 sw/source/core/docnode/node2lay.cxx | 7 sw/source/core/layout/ssfrm.cxx | 2 sw/source/core/layout/tabfrm.cxx | 18 sw/source/core/undo/untblk.cxx | 4 sw/source/ui/misc/bookmark.cxx | 2 16 files changed, 682 insertions(+), 21 deletions(-)
New commits: commit 7b723367aa897c562646b5cd28a574b1295c6e46 Author: Michael Stahl <michael.st...@allotropia.de> AuthorDate: Tue Feb 4 10:36:50 2025 +0100 Commit: Michael Stahl <michael.st...@allotropia.de> CommitDate: Wed Feb 5 13:43:31 2025 +0100 tdf#159029 sw: layout: fix cell vertical orientation after split The vertical alignment of cells is implemented in SwCellFrame::Format(), but it is disabled if IsRebuildLastLine() is true (apparently since the time when splitting table rows was first implemented in commit 90b73c7b667b06d42f5e37196d25a85b6c787f33 "INTEGRATION: CWS cellbreak") which is in 2 different cases: 1. when another line fits on the page, around a call to lcl_RecalcRow(pLastLine) after RemoveFollowFlowLine() - this is the relevant case when the paragraph is deleted This case used to work by accident before commit 068c133ac41c97652909b88c432e3b73010efc3e, when after RemoveFollowFlowLine() of row 406 the text frame moved to the top, then a Split of the row after the one containing the last part of the merged cell with the problem was attempted and failed, and in lcl_RecalcRow() after the Split the alignment was fixed; this commit changed it so that the first row frame 6 had an invalid position, which caused an earlier correction of the position of all the cells and text frames during the lcl_RecalcRow() after joining the follow, where m_bIsRebuildLastLine was set. 2. after a successful Split() with bTryToSplit=true, i.e., a row was split - this is the relevant case on Undo of the paragraph delete This actually was a problem already before the above mentioned commit, but then it could be "fixed" by clicking on the cell, which stopped to work. Here there is no RemoveFollowFlowLine() at the start, but then again a failed attempt to Split a row followed by a successful Split between rows; before the 2nd Split the text frame is correctly positioned and valid, but then lcl_RecalcSplitLine() calling lcl_ShrinkCellsAndAllContent() moves the text frame up. In both cases, explicitly invalidate the PrtArea of cells in the last row where a vertical orientation is set. (regression from commit 068c133ac41c97652909b88c432e3b73010efc3e) Change-Id: I7d2e85bb76a4b77c7871d759abbebd6abeb31282 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/181113 Reviewed-by: Michael Stahl <michael.st...@allotropia.de> Tested-by: Jenkins (cherry picked from commit ee482e856143ee62b37869411a64c36a1d78c7cc) diff --git a/sw/inc/fesh.hxx b/sw/inc/fesh.hxx index 974d8120474b..6aff99bb31fe 100644 --- a/sw/inc/fesh.hxx +++ b/sw/inc/fesh.hxx @@ -671,7 +671,7 @@ public: void SetRowSplit( const SwFormatRowSplit &rSz ); std::unique_ptr<SwFormatRowSplit> GetRowSplit() const; - void SetBoxAlign( sal_uInt16 nOrient ); + SW_DLLPUBLIC void SetBoxAlign(sal_uInt16 nOrient); sal_uInt16 GetBoxAlign() const; ///< USHRT_MAX if ambiguous. bool BalanceRowHeight( bool bTstOnly, const bool bOptimize = false ); diff --git a/sw/qa/extras/layout/data/2024-01-19_merged-cells-on-separate-pages-vertical-alignement.odt b/sw/qa/extras/layout/data/2024-01-19_merged-cells-on-separate-pages-vertical-alignement.odt new file mode 100644 index 000000000000..e316e93fe087 Binary files /dev/null and b/sw/qa/extras/layout/data/2024-01-19_merged-cells-on-separate-pages-vertical-alignement.odt differ diff --git a/sw/qa/extras/layout/layout3.cxx b/sw/qa/extras/layout/layout3.cxx index 7304935c0189..1ae46f34b8ea 100644 --- a/sw/qa/extras/layout/layout3.cxx +++ b/sw/qa/extras/layout/layout3.cxx @@ -292,6 +292,72 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testSectionPageBreaksWithNestedSectionWith } } +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf159029) +{ + createSwDoc("2024-01-19_merged-cells-on-separate-pages-vertical-alignement.odt"); + + { + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page[1]/body/tab[1]/row[1]/cell[2]/infos/bounds", "top", + u"1970"_ustr); + assertXPath(pXmlDoc, "/root/page[1]/body/tab[1]/row[1]/cell[2]/txt[1]/infos/bounds", "top", + u"1970"_ustr); + discardDumpedLayout(); + } + + // set vert orient + SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell(); + pWrtShell->GotoTable("Table1"); + pWrtShell->Right(SwCursorSkipMode::Cells, /*bSelect=*/false, 1, /*bBasicCall=*/false); + pWrtShell->SetBoxAlign(css::text::VertOrientation::BOTTOM); + + { + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page[1]/body/tab[1]/row[1]/cell[2]/infos/bounds", "top", + u"1970"_ustr); + assertXPath(pXmlDoc, "/root/page[1]/body/tab[1]/row[1]/cell[2]/txt[1]/infos/bounds", "top", + u"15494"_ustr); + discardDumpedLayout(); + } + + // delete + pWrtShell->SttEndDoc(true); + pWrtShell->DelRight(); + + { + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page[1]/body/tab[1]/row[1]/cell[2]/infos/bounds", "top", + u"1694"_ustr); + // the problem was that this moved to the top of the cell + assertXPath(pXmlDoc, "/root/page[1]/body/tab[1]/row[1]/cell[2]/txt[1]/infos/bounds", "top", + u"15494"_ustr); + discardDumpedLayout(); + } + + pWrtShell->Undo(); + + { + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page[1]/body/tab[1]/row[1]/cell[2]/infos/bounds", "top", + u"1970"_ustr); + // the problem was that this moved to the top of the cell + assertXPath(pXmlDoc, "/root/page[1]/body/tab[1]/row[1]/cell[2]/txt[1]/infos/bounds", "top", + u"15494"_ustr); + discardDumpedLayout(); + } + + pWrtShell->Redo(); + + { + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page[1]/body/tab[1]/row[1]/cell[2]/infos/bounds", "top", + u"1694"_ustr); + assertXPath(pXmlDoc, "/root/page[1]/body/tab[1]/row[1]/cell[2]/txt[1]/infos/bounds", "top", + u"15494"_ustr); + discardDumpedLayout(); + } +} + CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf137523) { createSwDoc("tdf137523-1-min.fodt"); diff --git a/sw/source/core/layout/tabfrm.cxx b/sw/source/core/layout/tabfrm.cxx index c88099b31caf..2e9c088c3a40 100644 --- a/sw/source/core/layout/tabfrm.cxx +++ b/sw/source/core/layout/tabfrm.cxx @@ -182,6 +182,22 @@ void SwTabFrame::RegistFlys() } } +static void InvalidateVertOrientCells(SwRowFrame & rRow) +{ + for (SwFrame * pLower{rRow.Lower()}; pLower != nullptr; pLower = pLower->GetNext()) + { + SwCellFrame * pCell{static_cast<SwCellFrame *>(pLower)}; + if (pCell->GetLayoutRowSpan() != 1) + { + pCell = const_cast<SwCellFrame *>(&pCell->FindStartEndOfRowSpanCell(true)); + } + if (pCell->GetFormat()->GetVertOrient().GetVertOrient() != text::VertOrientation::NONE) + { // tdf#159029 force repositioning of content in cell because it + pCell->InvalidatePrt(); // was disabled by SetRebuildLastLine() + } + } +} + static void SwInvalidateAll( SwFrame *pFrame, tools::Long nBottom ); static void lcl_RecalcRow( SwRowFrame& rRow, tools::Long nBottom ); static bool lcl_ArrangeLowers( SwLayoutFrame *pLay, tools::Long lYStart, bool bInva ); @@ -846,6 +862,7 @@ static bool lcl_RecalcSplitLine( SwRowFrame& rLastLine, SwRowFrame& rFollowLine, // Everything looks fine. Splitting seems to be successful. We invalidate // rFollowLine to force a new formatting. ::SwInvalidateAll( &rFollowLine, LONG_MAX ); + InvalidateVertOrientCells(rLastLine); } else { @@ -2574,6 +2591,7 @@ void SwTabFrame::MakeAll(vcl::RenderContext* pRenderContext) ::SwInvalidateAll( pLastLine, LONG_MAX ); SetRebuildLastLine( true ); lcl_RecalcRow(*static_cast<SwRowFrame*>(pLastLine), LONG_MAX); + InvalidateVertOrientCells(*static_cast<SwRowFrame *>(pLastLine)); SetRebuildLastLine( false ); } commit 6ef22b387d0517734c9d0740049efde15572e8a6 Author: Michael Stahl <michael.st...@allotropia.de> AuthorDate: Thu Jan 30 18:36:42 2025 +0100 Commit: Michael Stahl <michael.st...@allotropia.de> CommitDate: Wed Feb 5 13:43:31 2025 +0100 tdf#158221 sw: fix performance disaster in SwInsertBookmarkDlg Moving the shell cursor without Start/EndAction results in formatting and repainting for every bookmark :( (regression from commit aa6ec3f79607478213272283b7eb17ec2116173c) Change-Id: I2eb77a7a6aa48a1f218957245d75399bddb594ff Reviewed-on: https://gerrit.libreoffice.org/c/core/+/180965 Tested-by: Jenkins Reviewed-by: Michael Stahl <michael.st...@allotropia.de> (cherry picked from commit 163ddd7a841fc4ee2b4a79a5ec5e5635bcc0cbc2) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/180983 Reviewed-by: Adolfo Jayme Barrientos <fit...@ubuntu.com> (cherry picked from commit 5e85d816db0e6c4bf31bdfa84faf0507f277e617) diff --git a/sw/source/ui/misc/bookmark.cxx b/sw/source/ui/misc/bookmark.cxx index 6431809c9569..947c9aec00ae 100644 --- a/sw/source/ui/misc/bookmark.cxx +++ b/sw/source/ui/misc/bookmark.cxx @@ -345,6 +345,7 @@ void SwInsertBookmarkDlg::PopulateTable() m_aTableBookmarks.clear(); m_xBookmarksBox->clear(); + m_rSh.StartAllAction(); IDocumentMarkAccess* const pMarkAccess = m_rSh.getIDocumentMarkAccess(); for (IDocumentMarkAccess::const_iterator_t ppBookmark = pMarkAccess->getBookmarksBegin(); ppBookmark != pMarkAccess->getBookmarksEnd(); ++ppBookmark) @@ -355,6 +356,7 @@ void SwInsertBookmarkDlg::PopulateTable() m_aTableBookmarks.emplace_back(*ppBookmark, (*ppBookmark)->GetName()); } } + m_rSh.EndAllAction(); m_nLastBookmarksCount = pMarkAccess->getBookmarksCount(); } commit f354480e8d3e02680862c87154e594f4f564903a Author: Michael Stahl <michael.st...@allotropia.de> AuthorDate: Thu Jan 30 15:06:34 2025 +0100 Commit: Michael Stahl <michael.st...@allotropia.de> CommitDate: Wed Feb 5 13:43:31 2025 +0100 (tdf#159377 related) sw: fix undo of table pasted in middle of paragraph The problem is that the !bCanMoveBack path doesn't work if the insert position's content index isn't 0. (regression from commit fcd4222d36e1864452163e5c94976eea353bbaf0) Change-Id: I746db2187ab8f2e24eb694dc94d7eea9f50e2d9f Reviewed-on: https://gerrit.libreoffice.org/c/core/+/180948 Tested-by: Jenkins Reviewed-by: Michael Stahl <michael.st...@allotropia.de> (cherry picked from commit 3227660e55416254463234f35a43268b9b4c2c9e) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/180964 Reviewed-by: Adolfo Jayme Barrientos <fit...@ubuntu.com> (cherry picked from commit d7a0bc8c8d2d2e4fa4c6e2e29e2de09ea9bb56a6) diff --git a/sw/qa/extras/uiwriter/uiwriter9.cxx b/sw/qa/extras/uiwriter/uiwriter9.cxx index b4d8e6662351..0ee6d2216ff4 100644 --- a/sw/qa/extras/uiwriter/uiwriter9.cxx +++ b/sw/qa/extras/uiwriter/uiwriter9.cxx @@ -114,6 +114,39 @@ CPPUNIT_TEST_FIXTURE(SwUiWriterTest9, testTdf159377) CPPUNIT_ASSERT_EQUAL(SwNodeOffset(28), pDoc->GetNodes().Count()); } +CPPUNIT_TEST_FIXTURE(SwUiWriterTest9, testPasteTableInMiddleOfParagraph) +{ + createSwDoc(); + + SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell(); + + SwInsertTableOptions aTableOptions(SwInsertTableFlags::DefaultBorder, 0); + pWrtShell->InsertTable(aTableOptions, /*nRows=*/2, /*nCols=*/2); + pWrtShell->MoveTable(GotoPrevTable, fnTableStart); + + dispatchCommand(mxComponent, u".uno:SelectTable"_ustr, {}); + dispatchCommand(mxComponent, u".uno:Copy"_ustr, {}); + + pWrtShell->Undo(); + + pWrtShell->Insert(u"AB"_ustr); + + pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/false, 1, /*bBasicCall=*/false); + + dispatchCommand(mxComponent, u".uno:Paste"_ustr, {}); + + pWrtShell->Undo(); + + // the problem was that the A was missing + CPPUNIT_ASSERT_EQUAL(OUString("AB"), + pWrtShell->GetCursor()->GetPointNode().GetTextNode()->GetText()); + + pWrtShell->Redo(); + pWrtShell->Undo(); + CPPUNIT_ASSERT_EQUAL(OUString("AB"), + pWrtShell->GetCursor()->GetPointNode().GetTextNode()->GetText()); +} + CPPUNIT_TEST_FIXTURE(SwUiWriterTest9, testTdf159049) { // The document contains a shape which has a text with a line break. When copying the text to diff --git a/sw/source/core/doc/DocumentContentOperationsManager.cxx b/sw/source/core/doc/DocumentContentOperationsManager.cxx index 55daad4e0f03..06d3f606df26 100644 --- a/sw/source/core/doc/DocumentContentOperationsManager.cxx +++ b/sw/source/core/doc/DocumentContentOperationsManager.cxx @@ -5071,7 +5071,9 @@ bool DocumentContentOperationsManager::CopyImplImpl(SwPaM& rPam, SwPosition& rPo // Note this doesn't just check IsStartNode() because SwDoc::AppendDoc() // intentionally sets it to the body start node, perhaps it should just // call SplitNode instead? - if (!pStt->GetNode().IsSectionNode() && !pStt->GetNode().IsTableNode()) + if ((!pStt->GetNode().IsSectionNode() && !pStt->GetNode().IsTableNode()) + || (pCopyPam->GetPoint()->GetContentIndex() != 0 // also if node will split + && pCopyPam->GetPoint()->GetContentIndex() != pCopyPam->GetPoint()->GetNode().GetContentNode()->Len())) { bCanMoveBack = pCopyPam->Move(fnMoveBackward, GoInContent); } @@ -5273,7 +5275,7 @@ bool DocumentContentOperationsManager::CopyImplImpl(SwPaM& rPam, SwPosition& rPo --aRg.aEnd; } } - assert(!bCanMoveBack); + assert((nDeleteTextNodes.get() != 0) == bCanMoveBack); } pDestTextNd = aInsPos.GetNode().GetTextNode(); commit d3ac5fbc5e43a2847a173301f7f46cc29b773507 Author: Michael Stahl <michael.st...@allotropia.de> AuthorDate: Thu Jan 30 14:47:01 2025 +0100 Commit: Michael Stahl <michael.st...@allotropia.de> CommitDate: Wed Feb 5 13:43:31 2025 +0100 tdf#159377 sw: fix undo of paste table into footnote Tables aren't allowed in footnotes, hence pasting a table into a footnote will paste only the text nodes in the cells but not the table nodes. This code isn't prepared for this situation, so the adjustment of the position doesn't happen. if (pCopyPam->GetPoint()->GetNode().IsStartNode()) pCopyPam->GetPoint()->Adjust(SwNodeOffset(-1)); But then the corresponding adjustment in SwUndoInserts::SetInsertRange() does happen and the stored start node index is wrong. It looks like both of these adjustments can simply be removed. (regression from commit fcd4222d36e1864452163e5c94976eea353bbaf0) Change-Id: Ib419b29da552cf1df7150178924c45e3743cd7d9 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/180947 Reviewed-by: Michael Stahl <michael.st...@allotropia.de> Tested-by: Jenkins (cherry picked from commit 3bbbe366e455f1b165f2f913fffd27f3a0e03a2d) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/180958 Reviewed-by: Adolfo Jayme Barrientos <fit...@ubuntu.com> (cherry picked from commit 4f8ba5de916e18e7ae8daf67c7f72fa69d394ad0) diff --git a/sw/qa/extras/uiwriter/uiwriter9.cxx b/sw/qa/extras/uiwriter/uiwriter9.cxx index be341f700cc3..b4d8e6662351 100644 --- a/sw/qa/extras/uiwriter/uiwriter9.cxx +++ b/sw/qa/extras/uiwriter/uiwriter9.cxx @@ -27,6 +27,7 @@ #include <wrtsh.hxx> #include <unotxdoc.hxx> #include <ndtxt.hxx> +#include <itabenum.hxx> #include <toxmgr.hxx> #include <IDocumentFieldsAccess.hxx> #include <IDocumentLayoutAccess.hxx> @@ -73,6 +74,46 @@ CPPUNIT_TEST_FIXTURE(SwUiWriterTest9, testTdf158785) CPPUNIT_ASSERT_EQUAL(IsAttrAtPos::NONE, aContentAtPos.eContentAtPos); } +CPPUNIT_TEST_FIXTURE(SwUiWriterTest9, testTdf159377) +{ + createSwDoc(); + + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell(); + + SwInsertTableOptions aTableOptions(SwInsertTableFlags::DefaultBorder, 0); + pWrtShell->InsertTable(aTableOptions, /*nRows=*/2, /*nCols=*/2); + pWrtShell->MoveTable(GotoPrevTable, fnTableStart); + + dispatchCommand(mxComponent, u".uno:SelectTable"_ustr, {}); + dispatchCommand(mxComponent, u".uno:Copy"_ustr, {}); + + pWrtShell->InsertFootnote(u""_ustr); + CPPUNIT_ASSERT(pWrtShell->IsCursorInFootnote()); + + CPPUNIT_ASSERT_EQUAL(SwNodeOffset(28), pDoc->GetNodes().Count()); + + dispatchCommand(mxComponent, u".uno:Paste"_ustr, {}); + + // this pasted the 4 text nodes in the table, but no table nodes + // as currently tables aren't allowed in footnotes + + CPPUNIT_ASSERT_EQUAL(SwNodeOffset(32), pDoc->GetNodes().Count()); + + pWrtShell->Undo(); + + // problem was that this was 29 with an extra text node in the footnote + CPPUNIT_ASSERT_EQUAL(SwNodeOffset(28), pDoc->GetNodes().Count()); + + pWrtShell->Redo(); + + CPPUNIT_ASSERT_EQUAL(SwNodeOffset(32), pDoc->GetNodes().Count()); + + pWrtShell->Undo(); + + CPPUNIT_ASSERT_EQUAL(SwNodeOffset(28), pDoc->GetNodes().Count()); +} + CPPUNIT_TEST_FIXTURE(SwUiWriterTest9, testTdf159049) { // The document contains a shape which has a text with a line break. When copying the text to diff --git a/sw/source/core/doc/DocumentContentOperationsManager.cxx b/sw/source/core/doc/DocumentContentOperationsManager.cxx index 234d73aecb05..55daad4e0f03 100644 --- a/sw/source/core/doc/DocumentContentOperationsManager.cxx +++ b/sw/source/core/doc/DocumentContentOperationsManager.cxx @@ -5478,11 +5478,6 @@ bool DocumentContentOperationsManager::CopyImplImpl(SwPaM& rPam, SwPosition& rPo { // Reset the offset to 0 as it was before the insertion pCopyPam->GetPoint()->Adjust(SwNodeOffset(+1)); - - // If the next node is a start node, then step back: SetInsertRange() - // will add 1 in this case, but that is too much... - if (pCopyPam->GetPoint()->GetNode().IsStartNode()) - pCopyPam->GetPoint()->Adjust(SwNodeOffset(-1)); } oInsContentIndex.reset(); pCopyPam->Exchange(); diff --git a/sw/source/core/undo/untblk.cxx b/sw/source/core/undo/untblk.cxx index c8967178c29a..f8b3f2c59b47 100644 --- a/sw/source/core/undo/untblk.cxx +++ b/sw/source/core/undo/untblk.cxx @@ -128,10 +128,6 @@ void SwUndoInserts::SetInsertRange( const SwPaM& rPam, bool bScanFlys, m_nSttContent = pTmpPos->GetContentIndex(); m_nDeleteTextNodes = nDeleteTextNodes; - if (m_nDeleteTextNodes == SwNodeOffset(0)) // if a table selection is added... - { - ++m_nSttNode; // ... then the CopyPam is not fully correct - } } // Fill m_FlyUndos with flys anchored to first and last paragraphs commit 0dfaaabb93ceecf263aaf231422d34479817786e Author: Michael Stahl <michael.st...@allotropia.de> AuthorDate: Wed Jan 29 19:54:14 2025 +0100 Commit: Michael Stahl <michael.st...@allotropia.de> CommitDate: Wed Feb 5 13:43:31 2025 +0100 tdf#158867 offapi,i18npool,starmath: fix "," in Math again This is essentially the same bug that was fixed in commit 2caa9d7ddcff3f6e380c306b737e9b5e9cdaf4c2 "Resolves: tdf#127873 accept ',' comma group separator in number entities again". The problem is that sw wants to recognize group separators only if there are 3 digits following so it really looks like a number (see bug tdf#42518), but starmath really wants to recognize either comma or dot as a decimal separator and uses the GROUP_SEPARATOR_IN_NUMBER as a hack to get this behaviour, so the same parser can work in any locale. Introduce new constant GROUP_SEPARATOR_IN_NUMBER_3 so that sw and starmath can request different parsing. sc/source/core/tool/compiler.cxx also uses GROUP_SEPARATOR_IN_NUMBER and it's unclear to me what is desired there, but there are no known regression reports so leave the behaviour there unchanged. (regression from commit 1bd9a51b826015746069fcc0d02a30a2ddc7e7f5) Change-Id: Icb7662f26d89677cf84ccad07a2ea4c380587ab4 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/180920 Tested-by: Jenkins Reviewed-by: Michael Stahl <michael.st...@allotropia.de> (cherry picked from commit ff16c4e3f27efc0fc9ed734b19ae778482566cdb) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/180956 Reviewed-by: Eike Rathke <er...@redhat.com> (cherry picked from commit 055b637ed9bdd02cd857664813a66afde51dfd0a) diff --git a/i18npool/source/characterclassification/cclass_unicode_parser.cxx b/i18npool/source/characterclassification/cclass_unicode_parser.cxx index 9ed95e2f907a..97fae9518adc 100644 --- a/i18npool/source/characterclassification/cclass_unicode_parser.cxx +++ b/i18npool/source/characterclassification/cclass_unicode_parser.cxx @@ -23,6 +23,7 @@ #include <rtl/character.hxx> #include <rtl/math.hxx> #include <rtl/ustring.hxx> +#include <sal/log.hxx> #include <com/sun/star/i18n/KParseTokens.hpp> #include <com/sun/star/i18n/KParseType.hpp> #include <com/sun/star/i18n/LocaleData2.hpp> @@ -441,7 +442,11 @@ void cclass_Unicode::initParserTable( const Locale& rLocale, sal_Int32 startChar cDecimalSepAlt = aItem.decimalSeparatorAlternative.toChar(); } - if (nContTypes & KParseTokens::GROUP_SEPARATOR_IN_NUMBER) + SAL_WARN_IF((nContTypes & KParseTokens::GROUP_SEPARATOR_IN_NUMBER) + && (nContTypes & KParseTokens::GROUP_SEPARATOR_IN_NUMBER_3), + "i18npool", "only one GROUP_SEPARATOR_IN_NUMBER* should be used"); + if (nContTypes & KParseTokens::GROUP_SEPARATOR_IN_NUMBER + || nContTypes & KParseTokens::GROUP_SEPARATOR_IN_NUMBER_3) { if ( cGroupSep < nDefCnt ) pTable[cGroupSep] |= ParserFlags::VALUE; @@ -827,13 +832,20 @@ void cclass_Unicode::parseText( ParseResult& r, const OUString& rText, sal_Int32 { if (current == cGroupSep) { - // accept only if it is followed by 3 digits + // depending or requested nContTypes, accept only if + // it is followed by 3 digits sal_Int32 tempIndex(index); sal_uInt32 const nextChar2((tempIndex < rText.getLength()) ? rText.iterateCodePoints(&tempIndex) : 0); sal_uInt32 const nextChar3((tempIndex < rText.getLength()) ? rText.iterateCodePoints(&tempIndex) : 0); - if (getFlags(nextChar, eState) & ParserFlags::VALUE_DIGIT + if ((nContTypes & KParseTokens::GROUP_SEPARATOR_IN_NUMBER_3) + && getFlags(nextChar, eState) & ParserFlags::VALUE_DIGIT && getFlags(nextChar2, eState) & ParserFlags::VALUE_DIGIT && getFlags(nextChar3, eState) & ParserFlags::VALUE_DIGIT) + { + nParseTokensType |= KParseTokens::GROUP_SEPARATOR_IN_NUMBER_3; + } + else if ((nContTypes & KParseTokens::GROUP_SEPARATOR_IN_NUMBER_3) == 0 + && getFlags(nextChar, eState) & ParserFlags::VALUE_DIGIT) { nParseTokensType |= KParseTokens::GROUP_SEPARATOR_IN_NUMBER; } diff --git a/offapi/com/sun/star/i18n/KParseTokens.idl b/offapi/com/sun/star/i18n/KParseTokens.idl index f06b9861d6df..bb04c251d82c 100644 --- a/offapi/com/sun/star/i18n/KParseTokens.idl +++ b/offapi/com/sun/star/i18n/KParseTokens.idl @@ -93,6 +93,13 @@ published constants KParseTokens /// Unicode (above 127) other number const long UNI_OTHER_NUMBER = 0x00080000; + /** The same as GROUP_SEPARATOR_IN_NUMBER, but require <em>3</em> + digits following the group separator. + + @since LibreOffice 25.2 + */ + const long GROUP_SEPARATOR_IN_NUMBER_3 = 0x04000000; + /** If this bit is set in <em>nContCharFlags</em> parameters, the locale's group separator characters in numbers are accepted and ignored/skipped. Else a group separator in a number ends the diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index 3f45f8c7041c..371407ca5c04 100644 --- a/sc/source/core/tool/compiler.cxx +++ b/sc/source/core/tool/compiler.cxx @@ -779,7 +779,7 @@ struct Convention_A1 : public ScCompiler::Convention static constexpr OUString aAddAllowed(u"?#"_ustr); return pCharClass->parseAnyToken( rFormula, nSrcPos, nStartFlags, aAddAllowed, - (bGroupSeparator ? nContFlags | KParseTokens::GROUP_SEPARATOR_IN_NUMBER : nContFlags), + (bGroupSeparator ? nContFlags | KParseTokens::GROUP_SEPARATOR_IN_NUMBER_3 : nContFlags), aAddAllowed ); } @@ -1404,7 +1404,7 @@ struct ConventionXL_A1 : public Convention_A1, public ConventionXL static constexpr OUString aAddAllowed(u"?!"_ustr); return pCharClass->parseAnyToken( rFormula, nSrcPos, nStartFlags, aAddAllowed, - (bGroupSeparator ? nContFlags | KParseTokens::GROUP_SEPARATOR_IN_NUMBER : nContFlags), + (bGroupSeparator ? nContFlags | KParseTokens::GROUP_SEPARATOR_IN_NUMBER_3 : nContFlags), aAddAllowed ); } @@ -1749,7 +1749,7 @@ struct ConventionXL_R1C1 : public ScCompiler::Convention, public ConventionXL return pCharClass->parseAnyToken( rFormula, nSrcPos, nStartFlags, aAddAllowed, - (bGroupSeparator ? nContFlags | KParseTokens::GROUP_SEPARATOR_IN_NUMBER : nContFlags), + (bGroupSeparator ? nContFlags | KParseTokens::GROUP_SEPARATOR_IN_NUMBER_3 : nContFlags), aAddAllowed ); } diff --git a/sw/source/core/bastyp/calc.cxx b/sw/source/core/bastyp/calc.cxx index 0c9643317a4e..e492b527ca7c 100644 --- a/sw/source/core/bastyp/calc.cxx +++ b/sw/source/core/bastyp/calc.cxx @@ -153,7 +153,7 @@ const sal_Int32 coStartFlags = // Continuing characters may be any alphanumeric, underscore, or dot. const sal_Int32 coContFlags = - (coStartFlags | i18n::KParseTokens::ASC_DOT | i18n::KParseTokens::GROUP_SEPARATOR_IN_NUMBER) + (coStartFlags | i18n::KParseTokens::ASC_DOT | i18n::KParseTokens::GROUP_SEPARATOR_IN_NUMBER_3) & ~i18n::KParseTokens::IGNORE_LEADING_WS; extern "C" { commit f8005649041fa8eb7500992a8a1803afcf031894 Author: Michael Stahl <michael.st...@allotropia.de> AuthorDate: Wed Jan 29 17:36:41 2025 +0100 Commit: Michael Stahl <michael.st...@allotropia.de> CommitDate: Wed Feb 5 13:43:31 2025 +0100 tdf#156348 sw: fix crash on converting text to table with SwSetExpField The problem is that the table node only gets a SwFrameFormat assigned at the end of the operation after all the nodes have been split etc., and moving a field into a newly split node calls sw::FindNeighbourFrameForNode() which needs to handle table node without SwFrameFormat now when going backwards (not when going forwards because the table node is always before the nodes in the table). (regression from commit 9dc6e2c9062725ef1f9d7e321cae5f4dbe8ca749) Change-Id: Ia0c1f7d7b14f525aa8de4a2b6492c39b59f31052 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/180914 Reviewed-by: Michael Stahl <michael.st...@allotropia.de> Tested-by: Jenkins (cherry picked from commit b5967157b37904219865fd847b20938b3ccfbd72) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/180919 Reviewed-by: Adolfo Jayme Barrientos <fit...@ubuntu.com> (cherry picked from commit 23d225dac8f717bea8e960e4c2130963db7f3920) diff --git a/sw/source/core/docnode/node2lay.cxx b/sw/source/core/docnode/node2lay.cxx index 312ce2dff440..3efaea7f08ff 100644 --- a/sw/source/core/docnode/node2lay.cxx +++ b/sw/source/core/docnode/node2lay.cxx @@ -115,7 +115,12 @@ static SwNode* GoPreviousWithFrame(SwNodeIndex *pIdx, SwFlowFrame const**const p // frame as the caller's one pFound = SwIterator<SwFrame, SwContentNode, sw::IteratorMode::UnwrapMulti>(*static_cast<SwContentNode*>(pNd)).First(); else if ( pNd->IsTableNode() ) - pFound = SwIterator<SwFrame,SwFormat>(*static_cast<SwTableNode*>(pNd)->GetTable().GetFrameFormat()).First(); + { + if (SwFrameFormat *const pFormat{static_cast<SwTableNode*>(pNd)->GetTable().GetFrameFormat()}) + { + pFound = SwIterator<SwFrame,SwFormat>(*pFormat).First(); + } + } else if( pNd->IsStartNode() && !pNd->IsSectionNode() ) { pNd = nullptr; commit 95cb316e4c7a595fe394da45cd18a5c35402ec5e Author: Michael Stahl <michael.st...@allotropia.de> AuthorDate: Thu Jan 23 20:07:42 2025 +0100 Commit: Michael Stahl <michael.st...@allotropia.de> CommitDate: Wed Feb 5 13:43:31 2025 +0100 sw: layout: fix bad split table resulting in empty cell The problem is that the table goes into an infinite loop of splitting and joining, because there is a temporarily negative PrtArea height in the top row's cells (-170), because of setting all heights to 0. This causes an inconsistency where it is first joined because in ShouldBwdMoved() another line of text in the right column cell can move backward, but then there isn't enough space for another row as the negative cell PrtArea height is added to the available space and so the line won't fit in SwTextFrameBreak::IsInside(); the same situation occurs until a "Looping Louie" aborts the iteration with a bad result. This is somehow caused by the hidden section following the table, but not sure how exactly (the "if (pNxt->IsHiddenNow()) bCalcNxt = false" suspect code was actually added in a later commit). Prevent it by preventing negative PrtArea heights. (regression from commit 0c96119895b347f8eb5bb89f393351bd3c02b9f1) Change-Id: I36ce8a8bf750cf407cece5ad3cc23374182179de Reviewed-on: https://gerrit.libreoffice.org/c/core/+/180719 Tested-by: Jenkins Reviewed-by: Michael Stahl <michael.st...@allotropia.de> (cherry picked from commit 225ce4b678f5f0241bf3757d9ab7e5223866c431) diff --git a/sw/qa/extras/layout/data/table-split-bug.fodt b/sw/qa/extras/layout/data/table-split-bug.fodt new file mode 100644 index 000000000000..935899af2a82 --- /dev/null +++ b/sw/qa/extras/layout/data/table-split-bug.fodt @@ -0,0 +1,440 @@ +<?xml version='1.0' encoding='UTF-8'?> +<office:document xmlns:officeooo="http://openoffice.org/2009/office" xmlns:css3t="http://www.w3.org/TR/css3-text/" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:rpt="http://openoffice.org/2005/report" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:dc="http://purl.org/dc/eleme nts/1.1/" xmlns:ooo="http://openoffice.org/2004/office" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0 " xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xforms="http://www.w3.org/2002/xforms" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.text"> + <office:settings> + <config:config-item-set config:name="ooo:view-settings"> + <config:config-item config:name="ViewAreaTop" config:type="long">0</config:config-item> + <config:config-item config:name="ViewAreaLeft" config:type="long">0</config:config-item> + <config:config-item config:name="ViewAreaWidth" config:type="long">21987</config:config-item> + <config:config-item config:name="ViewAreaHeight" config:type="long">17704</config:config-item> + <config:config-item config:name="ShowRedlineChanges" config:type="boolean">false</config:config-item> + <config:config-item config:name="InBrowseMode" config:type="boolean">false</config:config-item> + <config:config-item-map-indexed config:name="Views"> + <config:config-item-map-entry> + <config:config-item config:name="ViewId" config:type="string">view2</config:config-item> + <config:config-item config:name="ViewLeft" config:type="long">3401</config:config-item> + <config:config-item config:name="ViewTop" config:type="long">11201</config:config-item> + <config:config-item config:name="VisibleLeft" config:type="long">0</config:config-item> + <config:config-item config:name="VisibleTop" config:type="long">0</config:config-item> + <config:config-item config:name="VisibleRight" config:type="long">21985</config:config-item> + <config:config-item config:name="VisibleBottom" config:type="long">17702</config:config-item> + <config:config-item config:name="ZoomType" config:type="short">3</config:config-item> + <config:config-item config:name="ViewLayoutColumns" config:type="short">0</config:config-item> + <config:config-item config:name="ViewLayoutBookMode" config:type="boolean">false</config:config-item> + <config:config-item config:name="ZoomFactor" config:type="short">84</config:config-item> + <config:config-item config:name="IsSelectedFrame" config:type="boolean">false</config:config-item> + <config:config-item config:name="AnchoredTextOverflowLegacy" config:type="boolean">true</config:config-item> + </config:config-item-map-entry> + </config:config-item-map-indexed> + </config:config-item-set> + <config:config-item-set config:name="ooo:configuration-settings"> + <config:config-item config:name="PrintProspect" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintReversed" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintSingleJobs" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintLeftPages" config:type="boolean">true</config:config-item> + <config:config-item config:name="PrintTables" config:type="boolean">true</config:config-item> + <config:config-item config:name="PrintControls" config:type="boolean">true</config:config-item> + <config:config-item config:name="PrintPageBackground" config:type="boolean">true</config:config-item> + <config:config-item config:name="PrintDrawings" config:type="boolean">true</config:config-item> + <config:config-item config:name="PrintBlackFonts" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintAnnotationMode" config:type="short">0</config:config-item> + <config:config-item config:name="PrintTextPlaceholder" config:type="boolean">true</config:config-item> + <config:config-item config:name="ProtectFields" config:type="boolean">false</config:config-item> + <config:config-item config:name="ProtectBookmarks" config:type="boolean">false</config:config-item> + <config:config-item config:name="EmptyDbFieldHidesPara" config:type="boolean">false</config:config-item> + <config:config-item config:name="DisableOffPagePositioning" config:type="boolean">false</config:config-item> + <config:config-item config:name="SubtractFlysAnchoredAtFlys" config:type="boolean">true</config:config-item> + <config:config-item config:name="PropLineSpacingShrinksFirstLine" config:type="boolean">false</config:config-item> + <config:config-item config:name="ApplyParagraphMarkFormatToNumbering" config:type="boolean">true</config:config-item> + <config:config-item config:name="TreatSingleColumnBreakAsPageBreak" config:type="boolean">false</config:config-item> + <config:config-item config:name="EmbedSystemFonts" config:type="boolean">false</config:config-item> + <config:config-item config:name="EmbedComplexScriptFonts" config:type="boolean">true</config:config-item> + <config:config-item config:name="EmbedAsianScriptFonts" config:type="boolean">true</config:config-item> + <config:config-item config:name="EmbedLatinScriptFonts" config:type="boolean">true</config:config-item> + <config:config-item config:name="EmbedOnlyUsedFonts" config:type="boolean">false</config:config-item> + <config:config-item config:name="ContinuousEndnotes" config:type="boolean">false</config:config-item> + <config:config-item config:name="EmbedFonts" config:type="boolean">false</config:config-item> + <config:config-item config:name="ClippedPictures" config:type="boolean">false</config:config-item> + <config:config-item config:name="FloattableNomargins" config:type="boolean">false</config:config-item> + <config:config-item config:name="UnbreakableNumberings" config:type="boolean">false</config:config-item> + <config:config-item config:name="HeaderSpacingBelowLastPara" config:type="boolean">true</config:config-item> + <config:config-item config:name="AllowPrintJobCancel" config:type="boolean">false</config:config-item> + <config:config-item config:name="UseOldPrinterMetrics" config:type="boolean">false</config:config-item> + <config:config-item config:name="TabOverMargin" config:type="boolean">false</config:config-item> + <config:config-item config:name="TabsRelativeToIndent" config:type="boolean">false</config:config-item> + <config:config-item config:name="UseOldNumbering" config:type="boolean">true</config:config-item> + <config:config-item config:name="InvertBorderSpacing" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintPaperFromSetup" config:type="boolean">false</config:config-item> + <config:config-item config:name="UpdateFromTemplate" config:type="boolean">false</config:config-item> + <config:config-item config:name="CurrentDatabaseCommandType" config:type="int">0</config:config-item> + <config:config-item config:name="LinkUpdateMode" config:type="short">1</config:config-item> + <config:config-item config:name="AddParaSpacingToTableCells" config:type="boolean">true</config:config-item> + <config:config-item config:name="CurrentDatabaseCommand" config:type="string">ADRESSEN</config:config-item> + <config:config-item config:name="PrinterIndependentLayout" config:type="string">high-resolution</config:config-item> + <config:config-item config:name="ApplyUserData" config:type="boolean">true</config:config-item> + <config:config-item config:name="PrintFaxName" config:type="string"/> + <config:config-item config:name="CurrentDatabaseDataSource" config:type="string">Adreßbuch</config:config-item> + <config:config-item config:name="ClipAsCharacterAnchoredWriterFlyFrames" config:type="boolean">true</config:config-item> + <config:config-item config:name="IsKernAsianPunctuation" config:type="boolean">false</config:config-item> + <config:config-item config:name="SaveThumbnail" config:type="boolean">true</config:config-item> + <config:config-item config:name="UseFormerTextWrapping" config:type="boolean">false</config:config-item> + <config:config-item config:name="AddExternalLeading" config:type="boolean">true</config:config-item> + <config:config-item config:name="AddParaTableSpacing" config:type="boolean">true</config:config-item> + <config:config-item config:name="StylesNoDefault" config:type="boolean">false</config:config-item> + <config:config-item config:name="ChartAutoUpdate" config:type="boolean">true</config:config-item> + <config:config-item-map-indexed config:name="ForbiddenCharacters"> + <config:config-item-map-entry> + <config:config-item config:name="Language" config:type="string">de</config:config-item> + <config:config-item config:name="Country" config:type="string">DE</config:config-item> + <config:config-item config:name="Variant" config:type="string"/> + <config:config-item config:name="BeginLine" config:type="string"/> + <config:config-item config:name="EndLine" config:type="string"/> + </config:config-item-map-entry> + <config:config-item-map-entry> + <config:config-item config:name="Language" config:type="string">en</config:config-item> + <config:config-item config:name="Country" config:type="string">US</config:config-item> + <config:config-item config:name="Variant" config:type="string"/> + <config:config-item config:name="BeginLine" config:type="string"/> + <config:config-item config:name="EndLine" config:type="string"/> + </config:config-item-map-entry> + </config:config-item-map-indexed> + <config:config-item config:name="AddParaTableSpacingAtStart" config:type="boolean">true</config:config-item> + <config:config-item config:name="Rsid" config:type="int">15857532</config:config-item> + <config:config-item config:name="EmbeddedDatabaseName" config:type="string"/> + <config:config-item config:name="FieldAutoUpdate" config:type="boolean">true</config:config-item> + <config:config-item config:name="OutlineLevelYieldsNumbering" config:type="boolean">false</config:config-item> + <config:config-item config:name="AlignTabStopPosition" config:type="boolean">true</config:config-item> + <config:config-item config:name="CharacterCompressionType" config:type="short">0</config:config-item> + <config:config-item config:name="SaveGlobalDocumentLinks" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrinterPaperFromSetup" config:type="boolean">false</config:config-item> + <config:config-item config:name="UseFormerLineSpacing" config:type="boolean">false</config:config-item> + <config:config-item config:name="AddParaLineSpacingToTableCells" config:type="boolean">false</config:config-item> + <config:config-item config:name="UseFormerObjectPositioning" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintGraphics" config:type="boolean">true</config:config-item> + <config:config-item config:name="SurroundTextWrapSmall" config:type="boolean">true</config:config-item> + <config:config-item config:name="ConsiderTextWrapOnObjPos" config:type="boolean">false</config:config-item> + <config:config-item config:name="MsWordCompTrailingBlanks" config:type="boolean">false</config:config-item> + <config:config-item config:name="TabAtLeftIndentForParagraphsInList" config:type="boolean">true</config:config-item> + <config:config-item config:name="PrintRightPages" config:type="boolean">true</config:config-item> + <config:config-item config:name="IgnoreFirstLineIndentInNumbering" config:type="boolean">true</config:config-item> + <config:config-item config:name="RedlineProtectionKey" config:type="base64Binary"/> + <config:config-item config:name="DoNotJustifyLinesWithManualBreak" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintProspectRTL" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintEmptyPages" config:type="boolean">true</config:config-item> + <config:config-item config:name="DoNotResetParaAttrsForNumFont" config:type="boolean">true</config:config-item> + <config:config-item config:name="AddFrameOffsets" config:type="boolean">false</config:config-item> + <config:config-item config:name="IgnoreTabsAndBlanksForLineCalculation" config:type="boolean">false</config:config-item> + <config:config-item config:name="LoadReadonly" config:type="boolean">false</config:config-item> + <config:config-item config:name="DoNotCaptureDrawObjsOnPage" config:type="boolean">false</config:config-item> + <config:config-item config:name="AddVerticalFrameOffsets" config:type="boolean">false</config:config-item> + <config:config-item config:name="UnxForceZeroExtLeading" config:type="boolean">false</config:config-item> + <config:config-item config:name="IsLabelDocument" config:type="boolean">false</config:config-item> + <config:config-item config:name="TableRowKeep" config:type="boolean">false</config:config-item> + <config:config-item config:name="RsidRoot" config:type="int">691202</config:config-item> + <config:config-item config:name="PrintHiddenText" config:type="boolean">false</config:config-item> + <config:config-item config:name="ProtectForm" config:type="boolean">false</config:config-item> + <config:config-item config:name="MsWordCompMinLineHeightByFly" config:type="boolean">true</config:config-item> + <config:config-item config:name="BackgroundParaOverDrawings" config:type="boolean">false</config:config-item> + <config:config-item config:name="SaveVersionOnClose" config:type="boolean">false</config:config-item> + <config:config-item config:name="MathBaselineAlignment" config:type="boolean">false</config:config-item> + <config:config-item config:name="SmallCapsPercentage66" config:type="boolean">true</config:config-item> + <config:config-item config:name="CollapseEmptyCellPara" config:type="boolean">false</config:config-item> + <config:config-item config:name="TabOverflow" config:type="boolean">false</config:config-item> + </config:config-item-set> + </office:settings> + <office:font-face-decls> + <style:font-face style:name="Arial" svg:font-family="Arial" style:font-pitch="variable"/> + <style:font-face style:name="Arial Unicode MS" svg:font-family="'Arial Unicode MS'" style:font-pitch="variable"/> + <style:font-face style:name="HG Mincho Light J" svg:font-family="'HG Mincho Light J'" style:font-pitch="variable"/> + <style:font-face style:name="Thorndale" svg:font-family="Thorndale" style:font-family-generic="roman" style:font-pitch="variable"/> + </office:font-face-decls> + <office:styles> + <draw:gradient draw:name="gradient" draw:style="linear" draw:start-color="#000000" draw:end-color="#ffffff" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="0" draw:border="0%"/> + <draw:hatch draw:name="hatch" draw:style="single" draw:color="#3465a4" draw:distance="0.02cm" draw:rotation="0"/> + <style:default-style style:family="graphic"> + <style:graphic-properties svg:stroke-color="#808080" draw:fill-color="#cfe7f5" fo:wrap-option="no-wrap" draw:shadow-offset-x="0.3cm" draw:shadow-offset-y="0.3cm" draw:start-line-spacing-horizontal="0.283cm" draw:start-line-spacing-vertical="0.283cm" draw:end-line-spacing-horizontal="0.283cm" draw:end-line-spacing-vertical="0.283cm" style:flow-with-text="true"/> + <style:paragraph-properties style:text-autospace="ideograph-alpha" style:line-break="strict" style:writing-mode="lr-tb" style:font-independent-line-spacing="false"> + <style:tab-stops/> + </style:paragraph-properties> + <style:text-properties fo:color="#000000" style:font-name="Thorndale" fo:font-size="12pt" fo:language="de" fo:country="DE" style:font-name-asian="HG Mincho Light J" style:font-size-asian="12pt" style:language-asian="zxx" style:country-asian="none" style:font-name-complex="Arial Unicode MS" style:font-size-complex="12pt" style:language-complex="zxx" style:country-complex="none"/> + </style:default-style> + <style:default-style style:family="paragraph"> + <style:paragraph-properties fo:hyphenation-ladder-count="no-limit" style:text-autospace="ideograph-alpha" style:punctuation-wrap="hanging" style:line-break="strict" style:tab-stop-distance="1.27cm" style:writing-mode="lr-tb"/> + <style:text-properties fo:color="#000000" style:font-name="Thorndale" fo:font-size="12pt" fo:language="de" fo:country="DE" style:font-name-asian="HG Mincho Light J" style:font-size-asian="12pt" style:language-asian="zxx" style:country-asian="none" style:font-name-complex="Arial Unicode MS" style:font-size-complex="12pt" style:language-complex="zxx" style:country-complex="none" fo:hyphenate="false" fo:hyphenation-remain-char-count="2" fo:hyphenation-push-char-count="2" loext:hyphenation-no-caps="false"/> + </style:default-style> + <style:default-style style:family="table"> + <style:table-properties table:border-model="separating"/> + </style:default-style> + <style:default-style style:family="table-row"> + <style:table-row-properties fo:keep-together="always"/> + </style:default-style> + <style:style style:name="Standard" style:family="paragraph" style:class="text"> + <style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" loext:contextual-spacing="false"/> + <style:text-properties style:font-name="Arial" fo:font-family="Arial" style:font-pitch="variable" fo:font-weight="350"/> + </style:style> + <style:style style:name="Text_20_body" style:display-name="Text body" style:family="paragraph" style:parent-style-name="Standard" style:class="text"> + <style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" loext:contextual-spacing="false" fo:hyphenation-ladder-count="no-limit"/> + <style:text-properties style:font-name="Arial" fo:font-family="Arial" style:font-pitch="variable" fo:hyphenate="true" fo:hyphenation-remain-char-count="2" fo:hyphenation-push-char-count="2" loext:hyphenation-no-caps="false"/> + </style:style> + <style:style style:name="Footer" style:family="paragraph" style:parent-style-name="Standard" style:class="extra"> + <style:paragraph-properties> + <style:tab-stops> + <style:tab-stop style:position="8.5cm" style:type="center"/> + <style:tab-stop style:position="17.002cm" style:type="right"/> + </style:tab-stops> + </style:paragraph-properties> + </style:style> + <style:style style:name="Table_20_Contents" style:display-name="Table Contents" style:family="paragraph" style:parent-style-name="Text_20_body" style:class="extra"> + <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" loext:contextual-spacing="false" fo:text-indent="0cm" style:auto-text-indent="false"/> + </style:style> + <style:style style:name="TVS_20_Standard" style:display-name="TVS Standard" style:family="paragraph" style:master-page-name=""> + <style:paragraph-properties fo:hyphenation-ladder-count="no-limit" style:page-number="auto"/> + <style:text-properties style:font-name="Arial" fo:font-family="Arial" style:font-pitch="variable" fo:hyphenate="true" fo:hyphenation-remain-char-count="4" fo:hyphenation-push-char-count="4" loext:hyphenation-no-caps="false"/> + </style:style> + <style:style style:name="TVS_20_KopfzeileFKB_5f_S2" style:display-name="TVS KopfzeileFKB_S2" style:family="paragraph" style:parent-style-name="TVS_20_Standard"> + <style:paragraph-properties fo:text-align="center" style:justify-single-word="false"/> + <style:text-properties fo:font-size="8pt"/> + </style:style> + <style:style style:name="TVS_20_Anrede" style:display-name="TVS Anrede" style:family="paragraph" style:parent-style-name="TVS_20_Standard" style:next-style-name="TVS_20_Freitext"> + <style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0.42cm" loext:contextual-spacing="false" fo:line-height="150%"/> + </style:style> + <style:style style:name="TVS_20_Freitext" style:display-name="TVS Freitext" style:family="paragraph" style:parent-style-name="TVS_20_Standard"> + <style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" loext:contextual-spacing="false" fo:line-height="150%" fo:text-align="justify" style:justify-single-word="false"/> + </style:style> + <style:style style:name="TVS_20_Betreff" style:display-name="TVS Betreff" style:family="paragraph" style:parent-style-name="TVS_20_Standard" style:next-style-name="TVS_20_Anrede" style:master-page-name=""> + <style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="1.06cm" loext:contextual-spacing="false" fo:line-height="150%" style:page-number="auto"/> + <style:text-properties fo:font-weight="bold"/> + </style:style> + <style:style style:name="Fließtext" style:family="paragraph" style:parent-style-name="Text_20_body" style:default-outline-level=""> + <style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0.635cm" loext:contextual-spacing="false"/> + </style:style> + <style:style style:name="Footnote_20_Symbol" style:display-name="Footnote Symbol" style:family="text"/> + <style:style style:name="Endnote_20_Symbol" style:display-name="Endnote Symbol" style:family="text"/> + <style:style style:name="TVS_20_Fett" style:display-name="TVS Fett" style:family="text"> + <style:text-properties fo:font-weight="bold"/> + </style:style> + <style:style style:name="Footnote_20_anchor" style:display-name="Footnote anchor" style:family="text"> + <style:text-properties style:text-position="super 58%"/> + </style:style> + <style:style style:name="Endnote_20_anchor" style:display-name="Endnote anchor" style:family="text"> + <style:text-properties style:text-position="super 58%"/> + </style:style> + <text:outline-style style:name="Outline"> + <text:outline-level-style text:level="1" style:num-format=""> + <style:list-level-properties/> + </text:outline-level-style> + <text:outline-level-style text:level="2" style:num-format=""> + <style:list-level-properties/> + </text:outline-level-style> + <text:outline-level-style text:level="3" style:num-format=""> + <style:list-level-properties/> + </text:outline-level-style> + <text:outline-level-style text:level="4" style:num-format=""> + <style:list-level-properties/> + </text:outline-level-style> + <text:outline-level-style text:level="5" style:num-format=""> + <style:list-level-properties/> + </text:outline-level-style> + <text:outline-level-style text:level="6" style:num-format=""> + <style:list-level-properties/> + </text:outline-level-style> + <text:outline-level-style text:level="7" style:num-format=""> + <style:list-level-properties/> + </text:outline-level-style> + <text:outline-level-style text:level="8" style:num-format=""> + <style:list-level-properties/> + </text:outline-level-style> + <text:outline-level-style text:level="9" style:num-format=""> + <style:list-level-properties/> + </text:outline-level-style> + <text:outline-level-style text:level="10" style:num-format=""> + <style:list-level-properties/> + </text:outline-level-style> + </text:outline-style> + <text:notes-configuration text:note-class="footnote" text:citation-style-name="Footnote_20_Symbol" text:citation-body-style-name="Footnote_20_anchor" text:master-page-name="Standard" style:num-format="1" text:start-value="0" text:footnotes-position="page" text:start-numbering-at="document"/> + <text:notes-configuration text:note-class="endnote" text:citation-style-name="Endnote_20_Symbol" text:citation-body-style-name="Endnote_20_anchor" text:master-page-name="Endnote" style:num-format="1" text:start-value="0"/> + <text:linenumbering-configuration text:number-lines="false" text:offset="0.499cm" style:num-format="1" text:number-position="left" text:increment="5"/> + <style:default-page-layout> + <style:page-layout-properties style:writing-mode="lr-tb" style:layout-grid-standard-mode="true"/> + </style:default-page-layout> + </office:styles> + <office:automatic-styles> + <style:style style:name="Tabelle19" style:family="table"> + <style:table-properties style:width="16.302cm" table:align="margins"/> + </style:style> + <style:style style:name="Tabelle19.A" style:family="table-column"> + <style:table-column-properties style:column-width="0.504cm" style:rel-column-width="2028*"/> + </style:style> + <style:style style:name="Tabelle19.B" style:family="table-column"> + <style:table-column-properties style:column-width="15.797cm" style:rel-column-width="63507*"/> + </style:style> + <style:style style:name="Tabelle19.1" style:family="table-row"> + <style:table-row-properties fo:keep-together="auto"/> + </style:style> + <style:style style:name="Tabelle19.A1" style:family="table-cell"> + <style:table-cell-properties fo:padding-left="0.101cm" fo:padding-right="0.101cm" fo:padding-top="0.101cm" fo:padding-bottom="0.199cm" fo:border="none" style:writing-mode="page"/> + </style:style> + <style:style style:name="P13" style:family="paragraph" style:parent-style-name="TVS_20_Freitext" style:master-page-name=""> + <loext:graphic-properties draw:fill-hatch-name="hatch"/> + <style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" loext:contextual-spacing="false" fo:text-align="justify" style:justify-single-word="false" style:page-number="auto"/> + <style:text-properties/> + </style:style> + <style:style style:name="P24" style:family="paragraph" style:parent-style-name="Fließtext"> + <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" loext:contextual-spacing="false" fo:line-height="150%" fo:text-align="start" style:justify-single-word="false" fo:text-indent="0cm" style:auto-text-indent="false" style:writing-mode="lr-tb"/> + <style:text-properties/> + </style:style> + <style:style style:name="P26" style:family="paragraph" style:parent-style-name="Fließtext"> + <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:margin-top="0cm" fo:margin-bottom="0.212cm" loext:contextual-spacing="false" fo:line-height="150%" fo:text-align="start" style:justify-single-word="false" fo:text-indent="0cm" style:auto-text-indent="false" style:writing-mode="lr-tb"/> + <style:text-properties/> + </style:style> + <style:style style:name="P27" style:family="paragraph" style:parent-style-name="TVS_20_Freitext"> + <loext:graphic-properties draw:fill="none" draw:fill-hatch-name="hatch"/> + <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:margin-top="0cm" fo:margin-bottom="0.42cm" loext:contextual-spacing="false" fo:line-height="150%" fo:text-align="justify" style:justify-single-word="false" fo:hyphenation-ladder-count="no-limit" fo:text-indent="0cm" style:auto-text-indent="false" fo:background-color="transparent"> + <style:tab-stops> + <style:tab-stop style:position="0.499cm"/> + </style:tab-stops> + </style:paragraph-properties> + <style:text-properties fo:hyphenate="true" fo:hyphenation-remain-char-count="4" fo:hyphenation-push-char-count="4" loext:hyphenation-no-caps="false"/> + </style:style> + <style:style style:name="P28" style:family="paragraph" style:parent-style-name="Table_20_Contents"> + <style:paragraph-properties fo:text-align="justify" style:justify-single-word="false"/> + <style:text-properties/> + </style:style> + <style:style style:name="P30" style:family="paragraph" style:parent-style-name="TVS_20_Freitext"> + <style:paragraph-properties fo:text-align="justify" style:justify-single-word="false"/> + <style:text-properties/> + </style:style> + <style:style style:name="P31" style:family="paragraph" style:parent-style-name="TVS_20_Freitext"> + <style:text-properties/> + </style:style> + <style:style style:name="P37" style:family="paragraph" style:parent-style-name="TVS_20_Freitext"> + <loext:graphic-properties draw:fill-gradient-name="gradient" draw:fill-hatch-name="hatch"/> + <style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0.42cm" loext:contextual-spacing="false"/> + <style:text-properties/> + </style:style> + <style:style style:name="P38" style:family="paragraph" style:parent-style-name="TVS_20_Freitext"> + <loext:graphic-properties draw:fill-gradient-name="gradient" draw:fill-hatch-name="hatch"/> + <style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0.42cm" loext:contextual-spacing="false" fo:text-align="justify" style:justify-single-word="false"/> + <style:text-properties/> + </style:style> + <style:style style:name="P39" style:family="paragraph" style:parent-style-name="TVS_20_Freitext"> + <loext:graphic-properties draw:fill-gradient-name="gradient" draw:fill-hatch-name="hatch"/> + <style:paragraph-properties fo:margin-top="0.42cm" fo:margin-bottom="0.42cm" loext:contextual-spacing="false" fo:text-align="center" style:justify-single-word="false"/> + <style:text-properties/> + </style:style> + <style:style style:name="P40" style:family="paragraph" style:parent-style-name="TVS_20_Freitext"> + <loext:graphic-properties draw:fill-hatch-name="hatch"/> + <style:paragraph-properties fo:margin-top="0.42cm" fo:margin-bottom="0cm" loext:contextual-spacing="false" fo:text-align="justify" style:justify-single-word="false"/> + <style:text-properties style:font-name="Arial"/> + </style:style> + <style:style style:name="P41" style:family="paragraph" style:parent-style-name="TVS_20_Freitext" style:master-page-name=""> + <loext:graphic-properties draw:fill-hatch-name="hatch"/> + <style:paragraph-properties fo:margin-top="0.42cm" fo:margin-bottom="0cm" loext:contextual-spacing="false" fo:text-align="justify" style:justify-single-word="false" style:page-number="auto" fo:keep-with-next="always"/> + <style:text-properties style:font-name="Arial"/> + </style:style> + <style:style style:name="P46" style:family="paragraph" style:parent-style-name="TVS_20_Betreff" style:master-page-name="FABrief_5f_S1"> + <style:paragraph-properties style:page-number="auto"/> + </style:style> + <style:style style:name="T7" style:family="text"> + <style:text-properties fo:font-weight="bold" style:font-weight-asian="bold" style:font-weight-complex="bold"/> + </style:style> + <style:style style:name="Sect1" style:family="section"> + <style:section-properties style:editable="false"> + <style:columns fo:column-count="1" fo:column-gap="0cm"/> + </style:section-properties> + </style:style> + <style:page-layout style:name="pm1"> + <style:page-layout-properties fo:page-width="21.001cm" fo:page-height="29.7cm" style:num-format="1" style:paper-tray-name="[From printer settings]" style:print-orientation="portrait" fo:margin-top="2cm" fo:margin-bottom="2cm" fo:margin-left="2cm" fo:margin-right="2cm" fo:border="none" fo:padding="0cm" style:shadow="none" fo:background-color="transparent" style:writing-mode="lr-tb" style:layout-grid-color="#c0c0c0" style:layout-grid-lines="44" style:layout-grid-base-height="0.55cm" style:layout-grid-ruby-height="0cm" style:layout-grid-mode="none" style:layout-grid-ruby-below="false" style:layout-grid-print="true" style:layout-grid-display="true" style:layout-grid-base-width="0.37cm" style:layout-grid-snap-to="true" draw:fill="none" draw:fill-color="#cfe7f5" style:footnote-max-height="0cm"> + <style:columns fo:column-count="1" fo:column-gap="0cm"/> + <style:footnote-sep style:width="0.018cm" style:distance-before-sep="0.101cm" style:distance-after-sep="0.101cm" style:line-style="none" style:adjustment="left" style:rel-width="25%" style:color="#000000"/> + </style:page-layout-properties> + <style:header-style/> + <style:footer-style/> + </style:page-layout> + <style:page-layout style:name="pm2" style:page-usage="mirrored"> + <style:page-layout-properties fo:page-width="21.001cm" fo:page-height="29.7cm" style:num-format="1" style:paper-tray-name="[From printer settings]" style:print-orientation="portrait" fo:margin-top="1.3cm" fo:margin-bottom="1.799cm" fo:margin-left="2.9cm" fo:margin-right="1.799cm" fo:border="none" fo:padding="0cm" style:shadow="none" fo:background-color="transparent" style:writing-mode="lr-tb" style:layout-grid-color="#c0c0c0" style:layout-grid-lines="44" style:layout-grid-base-height="0.55cm" style:layout-grid-ruby-height="0cm" style:layout-grid-mode="none" style:layout-grid-ruby-below="false" style:layout-grid-print="true" style:layout-grid-display="true" style:layout-grid-base-width="0.37cm" style:layout-grid-snap-to="true" draw:fill="none" draw:fill-color="#cfe7f5" style:footnote-max-height="0cm"> + <style:columns fo:column-count="1" fo:column-gap="0cm"/> + <style:footnote-sep style:width="0.018cm" style:distance-before-sep="0.101cm" style:distance-after-sep="0.101cm" style:line-style="none" style:adjustment="left" style:rel-width="25%" style:color="#000000"/> + </style:page-layout-properties> + <style:header-style> + <style:header-footer-properties svg:height="1.9cm" fo:margin-left="0cm" fo:margin-right="0cm" fo:margin-bottom="1.401cm" fo:border="none" fo:padding="0cm" style:shadow="none" fo:background-color="transparent" style:dynamic-spacing="false" draw:fill="none" draw:fill-color="#cfe7f5"/> + </style:header-style> + <style:footer-style/> + </style:page-layout> + <style:page-layout style:name="pm4"> + <style:page-layout-properties fo:page-width="21.001cm" fo:page-height="29.7cm" style:num-format="1" style:print-orientation="portrait" fo:margin-top="2cm" fo:margin-bottom="2cm" fo:margin-left="2cm" fo:margin-right="2cm" style:writing-mode="lr-tb" style:layout-grid-color="#c0c0c0" style:layout-grid-lines="44" style:layout-grid-base-height="0.55cm" style:layout-grid-ruby-height="0cm" style:layout-grid-mode="none" style:layout-grid-ruby-below="false" style:layout-grid-print="true" style:layout-grid-display="true" style:layout-grid-base-width="0.37cm" style:layout-grid-snap-to="true" style:footnote-max-height="0cm"> + <style:footnote-sep style:line-style="none" style:adjustment="left" style:rel-width="25%" style:color="#000000"/> + </style:page-layout-properties> + <style:header-style/> + <style:footer-style/> + </style:page-layout> + <style:page-layout style:name="pm7"> + <style:page-layout-properties fo:page-width="21.001cm" fo:page-height="29.7cm" style:num-format="1" style:paper-tray-name="[From printer settings]" style:print-orientation="portrait" fo:margin-top="10.7cm" fo:margin-bottom="2.2cm" fo:margin-left="2.9cm" fo:margin-right="1.799cm" fo:border="none" fo:padding="0cm" style:shadow="none" fo:background-color="transparent" style:writing-mode="lr-tb" style:layout-grid-color="#c0c0c0" style:layout-grid-lines="44" style:layout-grid-base-height="0.55cm" style:layout-grid-ruby-height="0cm" style:layout-grid-mode="none" style:layout-grid-ruby-below="false" style:layout-grid-print="true" style:layout-grid-display="true" style:layout-grid-base-width="0.37cm" style:layout-grid-snap-to="true" draw:fill="none" draw:fill-color="#cfe7f5" style:footnote-max-height="0cm"> + <style:columns fo:column-count="1" fo:column-gap="0cm"/> + <style:footnote-sep style:width="0.018cm" style:distance-before-sep="0.101cm" style:distance-after-sep="0.101cm" style:line-style="none" style:adjustment="left" style:rel-width="25%" style:color="#000000"/> + </style:page-layout-properties> + <style:header-style/> + <style:footer-style> + <style:header-footer-properties svg:height="2.401cm" fo:margin-left="0cm" fo:margin-right="0cm" fo:margin-top="0.3cm" fo:border="none" fo:padding="0cm" style:shadow="none" fo:background-color="transparent" style:dynamic-spacing="false" draw:fill="none" draw:fill-color="#cfe7f5"/> + </style:footer-style> + </style:page-layout> + </office:automatic-styles> + <office:master-styles> + <style:master-page style:name="Standard" style:page-layout-name="pm1"/> + <style:master-page style:name="FABrief_5f_S2" style:display-name="FABrief_S2" style:page-layout-name="pm2"> + <style:header> + <text:p text:style-name="TVS_20_KopfzeileFKB_5f_S2">- <text:page-number text:select-page="current">3</text:page-number><text:s/>-</text:p> + </style:header> + </style:master-page> + <style:master-page style:name="Endnote" style:page-layout-name="pm4"/> + <style:master-page style:name="FABrief_5f_S1" style:display-name="FABrief_S1" style:page-layout-name="pm7" style:next-style-name="FABrief_5f_S2"> + <style:footer> + <text:p text:style-name="Footer"/> + </style:footer> + </style:master-page> + </office:master-styles> + <office:body> + <office:text text:use-soft-page-breaks="true"> + + <text:section text:style-name="Sect1" text:name="CopyA"> + <text:p text:style-name="P46"><text:span text:style-name="TVS_20_Fett">Herrn Diego Säbelzahn</text:span></text:p> + <text:p text:style-name="TVS_20_Betreff"><text:line-break/></text:p> + <text:p text:style-name="TVS_20_Anrede">Sehr geehrte Damen und Herren,</text:p> + <text:section text:style-name="Sect1" text:name="CopyESt"> + <text:p text:style-name="P37"><text:line-break/><text:line-break/></text:p> + </text:section> + <text:p text:style-name="P13"/> + <text:p text:style-name="P39"><text:span text:style-name="T7">bis zum </text:span></text:p> + <text:p text:style-name="P38">ein:</text:p> + <table:table table:name="Tabelle19" table:style-name="Tabelle19"> + <table:table-column table:style-name="Tabelle19.A"/> + <table:table-column table:style-name="Tabelle19.B"/> + <table:table-row table:style-name="Tabelle19.1"> + <table:table-cell table:style-name="Tabelle19.A1" office:value-type="string"> + <text:p text:style-name="P28">-</text:p> + </table:table-cell> + <table:table-cell table:style-name="Tabelle19.A1" office:value-type="string"> + <text:p text:style-name="P31">Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla Bla</text:p> + <text:p text:style-name="P31">A</text:p> + <text:p text:style-name="P31">B</text:p> + <text:p text:style-name="P24">C</text:p> + <text:p text:style-name="P24">D</text:p> + <text:p text:style-name="P24">E</text:p> + <text:p text:style-name="P24">F</text:p> + <text:p text:style-name="P24">G</text:p> + <text:p text:style-name="P24">H</text:p> + <text:p text:style-name="P26">I</text:p> + <text:p text:style-name="P31">J</text:p> + <text:p text:style-name="P31">K</text:p> + </table:table-cell> + </table:table-row> + </table:table> + <text:section text:style-name="Sect1" text:name="CopyFreitext" text:display="none"> + <text:p text:style-name="P30">- <text:placeholder text:placeholder-type="text"><TEXT></text:placeholder></text:p> + </text:section> + <text:p text:style-name="P40">Sie</text:p> + <text:p text:style-name="P41">Das</text:p> + <text:p text:style-name="P27">Be</text:p> + </text:section> + </office:text> + </office:body> +</office:document> diff --git a/sw/qa/extras/layout/layout.cxx b/sw/qa/extras/layout/layout.cxx index 8407a73599d1..23552e7b181f 100644 --- a/sw/qa/extras/layout/layout.cxx +++ b/sw/qa/extras/layout/layout.cxx @@ -353,6 +353,50 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter, TestTdf136588) "portion"_ostr, "effectively by modern-day small to "); } +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTableSplitBug) +{ + createSwDoc("table-split-bug.fodt"); + + { + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, + "/root/page[1]/body/section[3]/tab[1]/row[1]/cell[1]//txt[1]/infos/bounds", + "height", u"276"_ustr); + assertXPath(pXmlDoc, "/root/page[1]/body/section[3]/tab[1]/row[1]/cell[1]/infos/bounds", + "height", u"1274"_ustr); + discardDumpedLayout(); + } + + SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell(); + pWrtShell->Down(false, 1); + pWrtShell->Right(SwCursorSkipMode::Chars, /*bSelect=*/true, 1, /*bBasicCall=*/false); + pWrtShell->Delete(); + + { + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // the problem was that the paragraph in the left cell had height 0 + assertXPath(pXmlDoc, + "/root/page[1]/body/section[3]/tab[1]/row[1]/cell[1]//txt[1]/infos/bounds", + "height", u"276"_ustr); + assertXPath(pXmlDoc, "/root/page[1]/body/section[3]/tab[1]/row[1]/cell[1]/infos/bounds", + "height", u"1688"_ustr); + discardDumpedLayout(); + } + + pWrtShell->Undo(); + + { + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // the problem was that the paragraph in the left cell had height 0 + assertXPath(pXmlDoc, + "/root/page[1]/body/section[3]/tab[1]/row[1]/cell[1]//txt[1]/infos/bounds", + "height", u"276"_ustr); + assertXPath(pXmlDoc, "/root/page[1]/body/section[3]/tab[1]/row[1]/cell[1]/infos/bounds", + "height", u"1274"_ustr); + discardDumpedLayout(); + } +} + CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testRedlineFlysInBody) { createSwDoc(); diff --git a/sw/source/core/layout/ssfrm.cxx b/sw/source/core/layout/ssfrm.cxx index c36a7de33e5f..ab216a53beda 100644 --- a/sw/source/core/layout/ssfrm.cxx +++ b/sw/source/core/layout/ssfrm.cxx @@ -174,7 +174,7 @@ void SwFrame::SetTopBottomMargins( tools::Long nTop, tools::Long nBot ) { SwFrameAreaDefinition::FramePrintAreaWriteAccess aPrt(*this); aPrt.Top( nTop ); - aPrt.Height( getFrameArea().Height() - nTop - nBot ); + aPrt.Height(::std::max<decltype(nTop)>(0, getFrameArea().Height() - nTop - nBot)); } void SwFrame::SetLeftRightMargins( tools::Long nLeft, tools::Long nRight)