Blob Blame History Raw
From 7189ce8281811d386b46504c60c3414af4b097ec Mon Sep 17 00:00:00 2001
From: Michael Stahl <mstahl@redhat.com>
Date: Thu, 4 Oct 2012 19:17:56 +0200
Subject: [PATCH] rhbz#820283, fdo#55462: sw: better fix for DOCX table import
 crash:

The fix in 6d2e09db4a677068095b0bebd08fbbb96620d60c is completely bogus.
Only vertically merged boxes result in dummy boxes with negative span,
while horizontally merged boxes result in different numbers of boxes per
line.  So instead of inserting boxes, adjust the width of the last box
in rows that are missing boxes, such that all lines have the same width.

(cherry picked from commit 4113d9664c60d004474dfc1cffbcd7dc50fa6dc4)

Conflicts:
	sw/source/core/docnode/ndtbl.cxx

Change-Id: I4e90e852b314bf6f7885bde7b450dab7c668469e
---
 sw/source/core/docnode/ndtbl.cxx | 51 +++++++++++++++++++---------------------
 1 file changed, 24 insertions(+), 27 deletions(-)

diff --git a/sw/source/core/docnode/ndtbl.cxx b/sw/source/core/docnode/ndtbl.cxx
index ca006bc..44a7556 100644
--- a/sw/source/core/docnode/ndtbl.cxx
+++ b/sw/source/core/docnode/ndtbl.cxx
@@ -1260,6 +1260,29 @@ SwNodeRange * SwNodes::ExpandRangeForTableBox(const SwNodeRange & rRange)
     return pResult;
 }
 
+static void
+lcl_SetTableBoxWidths2(SwTable & rTable, size_t const nMaxBoxes,
+        SwTableBoxFmt & rBoxFmt, SwDoc & rDoc)
+{
+    // rhbz#820283, fdo#55462: set default box widths so table width is covered
+    SwTableLines & rLines = rTable.GetTabLines();
+    for (size_t nTmpLine = 0; nTmpLine < rLines.Count(); ++nTmpLine)
+    {
+        SwTableBoxes & rBoxes = rLines[nTmpLine]->GetTabBoxes();
+        size_t const nMissing = nMaxBoxes - rBoxes.Count();
+        if (nMissing)
+        {
+            // default width for box at the end of an incomplete line
+            SwTableBoxFmt *const pNewFmt = rDoc.MakeTableBoxFmt();
+            pNewFmt->SetFmtAttr( SwFmtFrmSize(ATT_VAR_SIZE,
+                        (USHRT_MAX / nMaxBoxes) * (nMissing + 1)) );
+            pNewFmt->Add(rBoxes[rBoxes.Count() - 1]);
+        }
+    }
+    // default width for all boxes not at the end of an incomplete line
+    rBoxFmt.SetFmtAttr(SwFmtFrmSize(ATT_VAR_SIZE, USHRT_MAX / nMaxBoxes));
+}
+
 SwTableNode* SwNodes::TextToTable( const SwNodes::TableRanges_t & rTableNodes,
                                     SwTableFmt* pTblFmt,
                                     SwTableLineFmt* pLineFmt,
@@ -1371,33 +1394,7 @@ SwTableNode* SwNodes::TextToTable( const SwNodes::TableRanges_t & rTableNodes,
             nMaxBoxes = nBoxes;
     }
 
-    // die Tabelle ausgleichen, leere Sections einfuegen
-    sal_uInt16 n;
-
-    if( !aPosArr.empty() )
-    {
-        SwTableLines& rLns = pTable->GetTabLines();
-        sal_uInt16 nLastPos = 0;
-        for( n = 0; n < aPosArr.size(); ++n )
-        {
-            SwTableBoxFmt *pNewFmt = pDoc->MakeTableBoxFmt();
-            pNewFmt->SetFmtAttr( SwFmtFrmSize( ATT_VAR_SIZE,
-                                                aPosArr[ n ] - nLastPos ));
-            for( sal_uInt16 nLines2 = 0; nLines2 < rLns.Count(); ++nLines2 )
-                //JP 24.06.98: hier muss ein Add erfolgen, da das BoxFormat
-                //              von der rufenden Methode noch gebraucht wird!
-                pNewFmt->Add( rLns[ nLines2 ]->GetTabBoxes()[ n ] );
-
-            nLastPos = aPosArr[ n ];
-        }
-
-        // damit die Tabelle die richtige Groesse bekommt, im BoxFormat die
-        // Groesse nach "oben" transportieren.
-        OSL_ENSURE( !pBoxFmt->GetDepends(), "wer ist in dem Format noch angemeldet" );
-        pBoxFmt->SetFmtAttr( SwFmtFrmSize( ATT_VAR_SIZE, nLastPos ));
-    }
-    else
-        pBoxFmt->SetFmtAttr( SwFmtFrmSize( ATT_VAR_SIZE, USHRT_MAX / nMaxBoxes ));
+    lcl_SetTableBoxWidths2(*pTable, nMaxBoxes, *pBoxFmt, *pDoc);
 
     // das wars doch wohl ??
     return pTblNd;
-- 
1.7.11.4