Kaydet (Commit) 864ab050 authored tarafından Serge Krot's avatar Serge Krot Kaydeden (comit) Thorsten Behrens

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/46978Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarThorsten Behrens <Thorsten.Behrens@CIB.de>
üst 88f6ffeb
......@@ -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");
......
......@@ -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];
}
}
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment