Date: prev next · Thread: first prev next last
2013 Archives by date, by thread · List index


Hi,

I have submitted a patch for review:

    https://gerrit.libreoffice.org/4028

To pull it, you can do:

    git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/28/4028/1

fix fdo#64872 infinite loop saving as doc

When loading from odt, table cells which are covered (due to merging of
cells) are replaced with an empty cell by
SwXMLTableContext::ReplaceWithEmptyCell.  However if there is a sequence
of cells covered from above then their replacements are accidentally
inserted in reverse order, which produces this infinite loop problem when
saving as doc.

The reverse ordering in SwXMLTableContext::ReplaceWithEmptyCell was because
the insert position came from SwXMLTableContext::GetPrevStartNode which was
very careful to skip previous covered cells.  However those cells have
already been replaced with an empty cell so they should not be skipped.

Change-Id: I6a022cd1490afa181dbc3e4b2d6ed4af3077b363
---
M sw/source/filter/xml/xmltbli.cxx
1 file changed, 6 insertions(+), 20 deletions(-)



diff --git a/sw/source/filter/xml/xmltbli.cxx b/sw/source/filter/xml/xmltbli.cxx
index 5a367cd..617faf4 100644
--- a/sw/source/filter/xml/xmltbli.cxx
+++ b/sw/source/filter/xml/xmltbli.cxx
@@ -1804,29 +1804,15 @@
         // The last cell is the right one here.
         pPrevCell = GetCell( pRows->size()-1U, GetColumnCount()-1UL );
     }
-    else if( 0UL == nRow )
+    else if( nCol > 0UL )
     {
-        // There are no vertically merged cells within the first row, so the
-        // previous cell is the right one always.
-        if( nCol > 0UL )
-            pPrevCell = GetCell( nRow, nCol-1UL );
+        // The previous cell in this row.
+        pPrevCell = GetCell( nRow, nCol-1UL );
     }
-    else
+    else if( nRow > 0UL )
     {
-        // If there is a previous cell in the current row that is not spanned
-        // from the previous row, its the right one.
-        const SwXMLTableRow_Impl *pPrevRow = &(*pRows)[(sal_uInt16)nRow-1U];
-        sal_uInt32 i = nCol;
-        while( !pPrevCell &&  i > 0UL )
-        {
-            i--;
-            if( 1UL == pPrevRow->GetCell( i )->GetRowSpan() )
-                pPrevCell = GetCell( nRow, i );
-        }
-
-        // Otherwise, the last cell from the previous row is the right one.
-        if( !pPrevCell )
-            pPrevCell = pPrevRow->GetCell( GetColumnCount()-1UL );
+        // The last cell from the previous row.
+        pPrevCell = GetCell( nRow-1UL, GetColumnCount()-1UL );
     }
 
     const SwStartNode *pSttNd = 0;

-- 
To view, visit https://gerrit.libreoffice.org/4028
To unsubscribe, visit https://gerrit.libreoffice.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I6a022cd1490afa181dbc3e4b2d6ed4af3077b363
Gerrit-PatchSet: 1
Gerrit-Project: core
Gerrit-Branch: libreoffice-4-1
Gerrit-Owner: Luke Deller <luke@deller.id.au>


Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.