sw/source/core/doc/DocumentContentOperationsManager.cxx | 21 ++++++++++------ sw/source/core/doc/docfmt.cxx | 4 +++ sw/source/core/inc/DocumentContentOperationsManager.hxx | 3 ++ 3 files changed, 21 insertions(+), 7 deletions(-)
New commits: commit 9f7ee38acec0cb614e37aecc5ea9c5f1c63b61b6 Author: Michael Stahl <michael.st...@cib.de> AuthorDate: Wed Oct 30 17:43:46 2019 +0100 Commit: Michael Stahl <michael.st...@cib.de> CommitDate: Thu Oct 31 11:47:47 2019 +0100 sw: copy bookmarks in SwDoc::CopyPageDescHeaderFooterImpl() When importing tdf113521-1.doc, a footer is copied, but the fieldmark in it is not copied, so there are CH_TXT_ATR_FIELD* in the copy without matching fieldmark, and the result is sw/source/filter/ww8/wrtw8nds.cxx:2342: virtual void MSWordExportBase::OutputTextNode(SwTextNode&): Assertion `pFieldmark' failed. Change-Id: I42b005e22b57f181e4e8bc52afb053546db5f741 Reviewed-on: https://gerrit.libreoffice.org/81792 Tested-by: Jenkins Reviewed-by: Michael Stahl <michael.st...@cib.de> diff --git a/sw/source/core/doc/DocumentContentOperationsManager.cxx b/sw/source/core/doc/DocumentContentOperationsManager.cxx index 2e53c74032e9..704603372c65 100644 --- a/sw/source/core/doc/DocumentContentOperationsManager.cxx +++ b/sw/source/core/doc/DocumentContentOperationsManager.cxx @@ -148,7 +148,7 @@ namespace } /* - The lcl_CopyBookmarks function has to copy bookmarks from the source to the destination nodes + The CopyBookmarks function has to copy bookmarks from the source to the destination nodes array. It is called after a call of the CopyNodes(..) function. But this function does not copy every node (at least at the moment: 2/08/2006 ), section start and end nodes will not be copied if the corresponding end/start node is outside the copied pam. @@ -218,10 +218,12 @@ namespace rChgPos.nContent.Assign( rChgPos.nNode.GetNode().GetContentNode(), nContentPos ); } +} + +namespace sw +{ // TODO: use SaveBookmark (from DelBookmarks) - void lcl_CopyBookmarks( - const SwPaM& rPam, - SwPaM& rCpyPam ) + void CopyBookmarks(const SwPaM& rPam, SwPosition& rCpyPam) { const SwDoc* pSrcDoc = rPam.GetDoc(); SwDoc* pDestDoc = rCpyPam.GetDoc(); @@ -229,7 +231,7 @@ namespace ::sw::UndoGuard const undoGuard(pDestDoc->GetIDocumentUndoRedo()); const SwPosition &rStt = *rPam.Start(), &rEnd = *rPam.End(); - SwPosition* pCpyStt = rCpyPam.Start(); + SwPosition const*const pCpyStt = &rCpyPam; typedef std::vector< const ::sw::mark::IMark* > mark_vector_t; mark_vector_t vMarksToCopy; @@ -319,7 +321,10 @@ namespace } } } +} // namespace sw +namespace +{ void lcl_DeleteRedlines( const SwPaM& rPam, SwPaM& rCpyPam ) { const SwDoc* pSrcDoc = rPam.GetDoc(); @@ -3398,7 +3403,7 @@ void DocumentContentOperationsManager::CopyWithFlyInFly( *aCpyPaM.GetPoint() = pCopiedPaM->second; } - lcl_CopyBookmarks(pCopiedPaM ? pCopiedPaM->first : aRgTmp, aCpyPaM); + sw::CopyBookmarks(pCopiedPaM ? pCopiedPaM->first : aRgTmp, *aCpyPaM.Start()); } if( bDelRedlines && ( RedlineFlags::DeleteRedlines & pDest->getIDocumentRedlineAccess().GetRedlineFlags() )) @@ -4919,7 +4924,9 @@ bool DocumentContentOperationsManager::CopyImplImpl(SwPaM& rPam, SwPosition& rPo // Also copy all bookmarks if( bCopyBookmarks && m_rDoc.getIDocumentMarkAccess()->getAllMarksCount() ) - lcl_CopyBookmarks( rPam, *pCopyPam ); + { + sw::CopyBookmarks(rPam, *pCopyPam->Start()); + } if( RedlineFlags::DeleteRedlines & eOld ) { diff --git a/sw/source/core/doc/docfmt.cxx b/sw/source/core/doc/docfmt.cxx index 7ad9ee7b6f77..d3fd405f6dd2 100644 --- a/sw/source/core/doc/docfmt.cxx +++ b/sw/source/core/doc/docfmt.cxx @@ -1392,6 +1392,10 @@ void SwDoc::CopyPageDescHeaderFooterImpl( bool bCpyHeader, rSrcNds.Copy_( aRg, aTmpIdx ); aTmpIdx = *pSttNd; rSrcFormat.GetDoc()->GetDocumentContentOperationsManager().CopyFlyInFlyImpl(aRg, nullptr, aTmpIdx); + // TODO: investigate calling CopyWithFlyInFly? + SwPaM const source(aRg.aStart, aRg.aEnd); + SwPosition dest(aTmpIdx); + sw::CopyBookmarks(source, dest); pNewFormat->SetFormatAttr( SwFormatContent( pSttNd )); } else diff --git a/sw/source/core/inc/DocumentContentOperationsManager.hxx b/sw/source/core/inc/DocumentContentOperationsManager.hxx index 3de0b68282bc..bf765d291d46 100644 --- a/sw/source/core/inc/DocumentContentOperationsManager.hxx +++ b/sw/source/core/inc/DocumentContentOperationsManager.hxx @@ -177,6 +177,9 @@ private: DocumentContentOperationsManager& operator=(DocumentContentOperationsManager const&) = delete; }; + +void CopyBookmarks(const SwPaM& rPam, SwPosition& rTarget); + } #endif // INCLUDED_SW_SOURCE_CORE_INC_DOCUMENTCONTENTOPERATIONSMANAGER_HXX _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits