summaryrefslogtreecommitdiff
authorMichael Stahl <mstahl@redhat.com>2012-10-04 17:17:56 (GMT)
committer Michael Stahl <mstahl@redhat.com>2012-10-04 17:59:13 (GMT)
commit4113d9664c60d004474dfc1cffbcd7dc50fa6dc4 (patch) (side-by-side diff)
treee11fdf4e5d4d1bcff1f3f2f7dc1e2452e8e73239
parente1dee0aaacd8e30e2949053ebf351d76bad14ac3 (diff)
downloadcore-4113d9664c60d004474dfc1cffbcd7dc50fa6dc4.zip
core-4113d9664c60d004474dfc1cffbcd7dc50fa6dc4.tar.gz
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. Change-Id: I4e90e852b314bf6f7885bde7b450dab7c668469e
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--sw/source/core/docnode/ndtbl.cxx28
1 files changed, 24 insertions, 4 deletions
diff --git a/sw/source/core/docnode/ndtbl.cxx b/sw/source/core/docnode/ndtbl.cxx
index cc7e88f..e979768 100644
--- a/sw/source/core/docnode/ndtbl.cxx
+++ b/sw/source/core/docnode/ndtbl.cxx
@@ -1305,6 +1305,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.size(); ++nTmpLine)
+ {
+ SwTableBoxes & rBoxes = rLines[nTmpLine]->GetTabBoxes();
+ size_t const nMissing = nMaxBoxes - rBoxes.size();
+ 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.back());
+ }
+ }
+ // 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,
@@ -1392,10 +1415,7 @@ SwTableNode* SwNodes::TextToTable( const SwNodes::TableRanges_t & rTableNodes,
nMaxBoxes = nBoxes;
}
- SwTxtFmtColl *const pTxtColl(const_cast<SwTxtFmtColl*>(
- GetDoc()->GetDfltTxtFmtColl()));
- lcl_BalanceTable(*pTable, nMaxBoxes, *pTblNd, *pBoxFmt, *pTxtColl, 0, 0);
- lcl_SetTableBoxWidths(*pTable, nMaxBoxes, *pBoxFmt, *pDoc, 0);
+ lcl_SetTableBoxWidths2(*pTable, nMaxBoxes, *pBoxFmt, *pDoc);
return pTblNd;
}