[Libreoffice-commits] core.git: sw/qa sw/source

Serge Krot Serge.Krot at cib.de
Thu Dec 28 00:41:29 UTC 2017


 sw/qa/extras/uiwriter/data/tdf113877_insert_numbered_list.odt |binary
 sw/qa/extras/uiwriter/uiwriter.cxx                            |   28 +++
 sw/source/filter/xml/xmlimp.cxx                               |   85 ++++++++++
 3 files changed, 113 insertions(+)

New commits:
commit 864ab0502a4d3506413451e8c545144c6c15d777
Author: Serge Krot <Serge.Krot at cib.de>
Date:   Fri Dec 22 12:56:40 2017 +0100

    tdf#113877 Insert document: merge two lists into one
    
    When inserting a new document into current position we need to
    concat to lists into one.
    
    Added unit test.
    
    Change-Id: I10689256e0ffc5cf93722b1d45f09f610211b14a
    Reviewed-on: https://gerrit.libreoffice.org/46978
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Thorsten Behrens <Thorsten.Behrens at CIB.de>

diff --git a/sw/qa/extras/uiwriter/data/tdf113877_insert_numbered_list.odt b/sw/qa/extras/uiwriter/data/tdf113877_insert_numbered_list.odt
new file mode 100755
index 000000000000..db480edbebaf
Binary files /dev/null and b/sw/qa/extras/uiwriter/data/tdf113877_insert_numbered_list.odt differ
diff --git a/sw/qa/extras/uiwriter/uiwriter.cxx b/sw/qa/extras/uiwriter/uiwriter.cxx
index 256b3ea8077c..858bf691db23 100644
--- a/sw/qa/extras/uiwriter/uiwriter.cxx
+++ b/sw/qa/extras/uiwriter/uiwriter.cxx
@@ -262,6 +262,7 @@ public:
     void testTdf106736();
     void testTdf58604();
     void testTdf112025();
+    void testTdf113877();
     void testMsWordCompTrailingBlanks();
     void testCreateDocxAnnotation();
     void testTdf107976();
@@ -432,6 +433,7 @@ public:
     CPPUNIT_TEST(testTdf106736);
     CPPUNIT_TEST(testTdf58604);
     CPPUNIT_TEST(testTdf112025);
+    CPPUNIT_TEST(testTdf113877);
     CPPUNIT_TEST(testMsWordCompTrailingBlanks);
     CPPUNIT_TEST(testCreateDocxAnnotation);
     CPPUNIT_TEST(testTdf107976);
@@ -5258,6 +5260,32 @@ void SwUiWriterTest::testTdf114306()
     assertXPath(pXmlDoc, "/root/page[2]/body/tab[1]/row[1]/cell[1]/txt", 1);
 }
 
+void SwUiWriterTest::testTdf113877()
+{
+    load(DATA_DIRECTORY, "tdf113877_insert_numbered_list.odt");
+
+    // set a page cursor into the end of the document
+    uno::Reference<frame::XModel> xModel(mxComponent, uno::UNO_QUERY);
+    uno::Reference<text::XTextViewCursorSupplier> xTextViewCursorSupplier(xModel->getCurrentController(), uno::UNO_QUERY);
+    uno::Reference<text::XPageCursor> xCursor(xTextViewCursorSupplier->getViewCursor(), uno::UNO_QUERY);
+    xCursor->jumpToEndOfPage();
+
+    // insert the same document at current cursor position
+    {
+        const OUString insertFileid = m_directories.getURLFromSrc(DATA_DIRECTORY) + "tdf113877_insert_numbered_list.odt";
+        uno::Sequence<beans::PropertyValue> aPropertyValues(comphelper::InitPropertySequence({ { "Name", uno::makeAny(insertFileid) } }));
+        lcl_dispatchCommand(mxComponent, ".uno:InsertDoc", aPropertyValues);
+    }
+
+    // the initial list with 4 list items
+    CPPUNIT_ASSERT_EQUAL(getProperty<OUString>(getParagraph(1), "ListId"), getProperty<OUString>(getParagraph(4), "ListId"));
+
+    // the last of the first list, and the first of the inserted list
+    CPPUNIT_ASSERT_EQUAL(getProperty<OUString>(getParagraph(4), "ListId"), getProperty<OUString>(getParagraph(5), "ListId"));
+    CPPUNIT_ASSERT_EQUAL(getProperty<OUString>(getParagraph(5), "ListId"), getProperty<OUString>(getParagraph(6), "ListId"));
+    CPPUNIT_ASSERT_EQUAL(getProperty<OUString>(getParagraph(6), "ListId"), getProperty<OUString>(getParagraph(7), "ListId"));
+}
+
 void SwUiWriterTest::testTdf108524()
 {
     createDoc("tdf108524.odt");
diff --git a/sw/source/filter/xml/xmlimp.cxx b/sw/source/filter/xml/xmlimp.cxx
index 80350796f3cf..29d4a6e64c7b 100644
--- a/sw/source/filter/xml/xmlimp.cxx
+++ b/sw/source/filter/xml/xmlimp.cxx
@@ -826,6 +826,91 @@ void SwXMLImport::endDocument()
                     pPaM->Move( fnMoveBackward );
                 }
             }
+
+            // tdf#113877
+            // when we insert one document with list inside into another one with list at the insert position,
+            // the resulting numbering in these lists are not consequent.
+            //
+            // Main document:
+            //  1. One
+            //  2. Two
+            //  3. Three
+            //  4.                      <-- insert position
+            //
+            // Inserted document:
+            //  1. One
+            //  2. Two
+            //  3. Three
+            //  4.
+            //
+            // Expected result
+            //  1. One
+            //  2. Two
+            //  3. Three
+            //  4. One
+            //  5. Two
+            //  6. Three
+            //  7.
+            //
+            if (IsInsertMode() && m_pSttNdIdx->GetIndex())
+            {
+                sal_uLong index = 1;
+
+                // the last node of the main document where we have inserted a document
+                SwNode * p1 = pDoc->GetNodes()[m_pSttNdIdx->GetIndex() + 0];
+
+                // the first node of the inserted document
+                SwNode * p2 = pDoc->GetNodes()[m_pSttNdIdx->GetIndex() + index];
+
+                // the first node of the inserted document,
+                // which will be used to detect if inside inserted document a new list was started
+                const SfxPoolItem* listId2Initial = nullptr;
+
+                while (
+                    p1 && p2
+                    && (p1->GetNodeType() == p2->GetNodeType())
+                    && (p1->IsTextNode() == p2->IsTextNode())
+                    )
+                {
+                    SwContentNode * c1 = static_cast<SwContentNode *>(p1);
+                    SwContentNode * c2 = static_cast<SwContentNode *>(p2);
+
+                    const SfxPoolItem* listId1 = c1->GetNoCondAttr(RES_PARATR_LIST_ID, false);
+                    const SfxPoolItem* listId2 = c2->GetNoCondAttr(RES_PARATR_LIST_ID, false);
+
+                    if (!listId2Initial)
+                    {
+                        listId2Initial = listId2;
+                    }
+
+                    if (! (listId2Initial && listId2 && (*listId2Initial == *listId2)) )
+                    {
+                        // no more list items of the first list inside inserted document
+                        break;
+                    }
+
+                    if (listId1 && listId2)
+                    {
+                        c2->SetAttr(*listId1);
+                    }
+                    else
+                    {
+                        // no more appropriate list items
+                        break;
+                    }
+
+                    // get next item
+                    index++;
+                    if (index >= pDoc->GetNodes().Count())
+                    {
+                        // no more items
+                        break;
+                    }
+
+                    p2 = pDoc->GetNodes()[m_pSttNdIdx->GetIndex() + index];
+                }
+            }
+
         }
     }
 


More information about the Libreoffice-commits mailing list