diff options
author | Michael Stahl <michael.stahl@allotropia.de> | 2021-08-27 14:38:18 +0200 |
---|---|---|
committer | Michael Stahl <michael.stahl@allotropia.de> | 2021-08-27 17:09:29 +0200 |
commit | 4bf04dea9afb30a9395e80b07a81d1908937ee8b (patch) | |
tree | 2c118bcecdc4f4937f8e70b9272c53bb537a99a4 | |
parent | 3608de9a3647294361c64b923b1ae413ad9755df (diff) |
tdf#128106 sw: copy bookmarks at start if whole node is copied
The CrossRefHeadingBookmarks are always at index 0 so copy them if the
selection also starts at index 0.
This happens in SwDoc::SplitDoc() for the 2nd etc. chapter.
Change-Id: I4765d497e65d3c8257f7eab59b8ba2088688967e
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/121147
Tested-by: Jenkins
Reviewed-by: Michael Stahl <michael.stahl@allotropia.de>
-rw-r--r-- | sw/qa/extras/uiwriter/uiwriter3.cxx | 6 | ||||
-rw-r--r-- | sw/source/core/doc/DocumentContentOperationsManager.cxx | 15 |
2 files changed, 17 insertions, 4 deletions
diff --git a/sw/qa/extras/uiwriter/uiwriter3.cxx b/sw/qa/extras/uiwriter/uiwriter3.cxx index 64e3c8fb61cb..c283f3022803 100644 --- a/sw/qa/extras/uiwriter/uiwriter3.cxx +++ b/sw/qa/extras/uiwriter/uiwriter3.cxx @@ -2664,7 +2664,8 @@ CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf128106) CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_BOOKMARK), fields[1]->GetField()->GetSubType()); CPPUNIT_ASSERT( static_cast<SwGetRefField const*>(fields[1]->GetField())->IsRefToHeadingCrossRefBookmark()); - // CPPUNIT_ASSERT_EQUAL(OUString("Chapter 2"), static_cast<SwGetRefField const*>(fields[1]->GetField())->GetPar2()); + CPPUNIT_ASSERT_EQUAL(OUString("Chapter 2"), + static_cast<SwGetRefField const*>(fields[1]->GetField())->GetPar2()); CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_BOOKMARK), fields[2]->GetField()->GetSubType()); CPPUNIT_ASSERT_EQUAL(OUString("Bookmarkchapter1"), static_cast<SwGetRefField const*>(fields[2]->GetField())->GetSetRefName()); @@ -2683,7 +2684,8 @@ CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf128106) CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_BOOKMARK), fields[5]->GetField()->GetSubType()); CPPUNIT_ASSERT( static_cast<SwGetRefField const*>(fields[5]->GetField())->IsRefToHeadingCrossRefBookmark()); - // CPPUNIT_ASSERT_EQUAL(OUString("Chapter 2"), static_cast<SwGetRefField const*>(fields[5]->GetField())->GetPar2()); + CPPUNIT_ASSERT_EQUAL(OUString("Chapter 2"), + static_cast<SwGetRefField const*>(fields[5]->GetField())->GetPar2()); tempDir.EnableKillingFile(); } diff --git a/sw/source/core/doc/DocumentContentOperationsManager.cxx b/sw/source/core/doc/DocumentContentOperationsManager.cxx index 35044a92a3bd..9af97d1c4626 100644 --- a/sw/source/core/doc/DocumentContentOperationsManager.cxx +++ b/sw/source/core/doc/DocumentContentOperationsManager.cxx @@ -251,10 +251,21 @@ namespace sw const SwPosition& rMarkEnd = pMark->GetMarkEnd(); // only include marks that are in the range and not touching both start and end // - not for annotation or checkbox marks. + bool const isIncludeStart( + (rStt.nContent.GetIndex() == 0 // paragraph start selected? + // also: only if inserting at the start - cross reference + // marks require index to be 0, and there could be one + // on the target node already + && rCpyPam.nContent.GetIndex() == 0) + || rMarkStart != rStt); + bool const isIncludeEnd( + (rEnd.nNode.GetNode().IsTextNode() // paragraph end selected? + && rEnd.nContent.GetIndex() == rEnd.nNode.GetNode().GetTextNode()->Len()) + || rMarkEnd != rEnd); const bool bIsNotOnBoundary = pMark->IsExpanded() - ? (rMarkStart != rStt || rMarkEnd != rEnd) // rMarkStart != rMarkEnd - : (rMarkStart != rStt && rMarkEnd != rEnd); // rMarkStart == rMarkEnd + ? (isIncludeStart || isIncludeEnd) // rMarkStart != rMarkEnd + : (isIncludeStart && isIncludeEnd); // rMarkStart == rMarkEnd const IDocumentMarkAccess::MarkType aMarkType = IDocumentMarkAccess::GetType(*pMark); if ( rMarkStart >= rStt && rMarkEnd <= rEnd && ( bIsNotOnBoundary |