diff options
author | Serge Krot <Serge.Krot@cib.de> | 2017-12-22 12:56:40 +0100 |
---|---|---|
committer | Gabor Kelemen <kelemeng@ubuntu.com> | 2022-07-13 08:37:07 +0200 |
commit | b809899432146beb1ef7534af5efc6e7f86f84f6 (patch) | |
tree | ece66faaddf3cea82aefd2a098b559b9267a4a3c | |
parent | f18cb44329f20f6950bd8438195f9135c94c6a67 (diff) |
tdf#113877 Insert document: merge two list into one
When inserting a new document into current position we need to
concat to lists into one.
Added unit tests.
Reviewed-on: https://gerrit.libreoffice.org/46991
Reviewed-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
Tested-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
(cherry picked from commit c59e028e5337d1511dbcc678a90ffdbe92a44521)
Change-Id: I10689256e0ffc5cf93722b1d45f09f610211b14a
-rwxr-xr-x | sw/qa/extras/uiwriter/data/tdf113877_insert_numbered_list.odt | bin | 0 -> 7617 bytes | |||
-rw-r--r-- | sw/qa/extras/uiwriter/uiwriter.cxx | 28 | ||||
-rw-r--r-- | sw/source/filter/xml/xmlimp.cxx | 85 |
3 files changed, 113 insertions, 0 deletions
diff --git a/sw/qa/extras/uiwriter/data/tdf113877_insert_numbered_list.odt b/sw/qa/extras/uiwriter/data/tdf113877_insert_numbered_list.odt Binary files differnew file mode 100755 index 000000000000..db480edbebaf --- /dev/null +++ b/sw/qa/extras/uiwriter/data/tdf113877_insert_numbered_list.odt diff --git a/sw/qa/extras/uiwriter/uiwriter.cxx b/sw/qa/extras/uiwriter/uiwriter.cxx index e30db243494c..7c8a4a6bd709 100644 --- a/sw/qa/extras/uiwriter/uiwriter.cxx +++ b/sw/qa/extras/uiwriter/uiwriter.cxx @@ -25,6 +25,7 @@ public: void testFdo69893(); void testFdo75110(); void testFdo75898(); + void testTdf113877(); CPPUNIT_TEST_SUITE(SwUiWriterTest); CPPUNIT_TEST(testReplaceForward); @@ -32,6 +33,7 @@ public: CPPUNIT_TEST(testFdo69893); CPPUNIT_TEST(testFdo75110); CPPUNIT_TEST(testFdo75898); + CPPUNIT_TEST(testTdf113877); CPPUNIT_TEST_SUITE_END(); private: @@ -145,6 +147,32 @@ void SwUiWriterTest::testFdo69893() CPPUNIT_ASSERT_EQUAL(OUString("Para after table."), rEnd.GetTxt()); } +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")); +} + CPPUNIT_TEST_SUITE_REGISTRATION(SwUiWriterTest); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sw/source/filter/xml/xmlimp.cxx b/sw/source/filter/xml/xmlimp.cxx index af7f5fa62852..c3888f268902 100644 --- a/sw/source/filter/xml/xmlimp.cxx +++ b/sw/source/filter/xml/xmlimp.cxx @@ -854,6 +854,91 @@ void SwXMLImport::endDocument( void ) 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() && pSttNdIdx->GetIndex()) + { + sal_uLong index = 1; + + // the last node of the main document where we have inserted a document + SwNode * p1 = pDoc->GetNodes()[pSttNdIdx->GetIndex() + 0]; + + // the first node of the inserted document + SwNode * p2 = pDoc->GetNodes()[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->IsTxtNode() == p2->IsTxtNode()) + ) + { + SwCntntNode * c1 = static_cast<SwCntntNode *>(p1); + SwCntntNode * c2 = static_cast<SwCntntNode *>(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()[pSttNdIdx->GetIndex() + index]; + } + } + } } |