summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSerge Krot <Serge.Krot@cib.de>2017-12-22 12:56:40 +0100
committerGabor Kelemen <kelemeng@ubuntu.com>2022-07-13 08:37:07 +0200
commitb809899432146beb1ef7534af5efc6e7f86f84f6 (patch)
treeece66faaddf3cea82aefd2a098b559b9267a4a3c
parentf18cb44329f20f6950bd8438195f9135c94c6a67 (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-xsw/qa/extras/uiwriter/data/tdf113877_insert_numbered_list.odtbin0 -> 7617 bytes
-rw-r--r--sw/qa/extras/uiwriter/uiwriter.cxx28
-rw-r--r--sw/source/filter/xml/xmlimp.cxx85
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
new file mode 100755
index 000000000000..db480edbebaf
--- /dev/null
+++ b/sw/qa/extras/uiwriter/data/tdf113877_insert_numbered_list.odt
Binary files differ
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];
+ }
+ }
+
}
}