sw/source/core/docnode/ndtbl.cxx |   36 +++++++++++++++++++++++++++++++++++-
 1 file changed, 35 insertions(+), 1 deletion(-)

New commits:
commit 62cb3b8b8d6106c6aeb073b12d84973a107182ef
Author:     Michael Stahl <[email protected]>
AuthorDate: Wed Mar 13 18:57:21 2024 +0100
Commit:     Michael Stahl <[email protected]>
CommitDate: Thu Mar 14 09:43:15 2024 +0100

    tdf#157241 sw: fix crash on RTF paste or insert of nested tables
    
    The problem is that there are tables with only empty cell frames in the
    layout, which causes a crash in IsAllHiddenCell() added in commit
    ab7893544dc6be6dc192dffefd57cd5ddd421c35.
    
    This happens because first inner tables are created, with layout frames
    because the layout already exists.
    
    Then when SwNodes::TextToTable() is called for the outer table, it
    deletes the SwTextFrames, but not the SwTabFrames/SwCellFrames, so they
    remain uselessly in the layout.
    
    Delete these too, they will be recreated when the frame for the outer
    table is created.
    
    Also the transfer of any existing break to the outer table was missing.
    
    Change-Id: Idc2bc1d4c6572702510ae4355e4015c42770eb3e
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/164788
    Tested-by: Jenkins
    Reviewed-by: Michael Stahl <[email protected]>

diff --git a/sw/source/core/docnode/ndtbl.cxx b/sw/source/core/docnode/ndtbl.cxx
index 592e8914ae8c..00698a0c91c7 100644
--- a/sw/source/core/docnode/ndtbl.cxx
+++ b/sw/source/core/docnode/ndtbl.cxx
@@ -888,6 +888,34 @@ const SwTable* SwDoc::TextToTable( const 
SwInsertTableOptions& rInsTableOpts,
     return &rNdTable;
 }
 
+static void lcl_RemoveBreaksTable(SwTableNode & rNode, SwTableFormat *const 
pTableFormat)
+{
+    // delete old layout frames, new ones need to be created...
+    rNode.DelFrames(nullptr);
+
+    // remove PageBreaks/PageDesc/ColBreak
+    SwFrameFormat & rFormat(*rNode.GetTable().GetFrameFormat());
+
+    if (const SvxFormatBreakItem* pItem = rFormat.GetItemIfSet(RES_BREAK, 
false))
+    {
+        if (pTableFormat)
+        {
+            pTableFormat->SetFormatAttr(*pItem);
+        }
+        rFormat.ResetFormatAttr(RES_BREAK);
+    }
+
+    SwFormatPageDesc const*const 
pPageDescItem(rFormat.GetItemIfSet(RES_PAGEDESC, false));
+    if (pPageDescItem && pPageDescItem->GetPageDesc())
+    {
+        if (pTableFormat)
+        {
+            pTableFormat->SetFormatAttr(*pPageDescItem);
+        }
+        rFormat.ResetFormatAttr(RES_PAGEDESC);
+    }
+}
+
 static void lcl_RemoveBreaks(SwContentNode & rNode, SwTableFormat *const 
pTableFormat)
 {
     // delete old layout frames, new ones need to be created...
@@ -1386,7 +1414,13 @@ SwTableNode* SwNodes::TextToTable( const 
SwNodes::TableRanges_t & rTableNodes,
     for( nLines = 0; aNodeIndex <= rTableNodes.rbegin()->rbegin()->aEnd; 
++aNodeIndex,++nLines )
     {
         SwNode& rNode = aNodeIndex.GetNode();
-        if( rNode.IsContentNode() )
+        assert(!rNode.IsSectionNode()); // not possible in writerfilter import
+        if (rNode.IsTableNode())
+        {
+            lcl_RemoveBreaksTable(static_cast<SwTableNode&>(rNode),
+                    (0 == nLines) ? pTableFormat : nullptr);
+        }
+        else if (rNode.IsContentNode())
         {
             lcl_RemoveBreaks(static_cast<SwContentNode&>(rNode),
                     (0 == nLines) ? pTableFormat : nullptr);

Reply via email to