diff options
author | Michael Stahl <Michael.Stahl@cib.de> | 2020-02-19 17:14:54 +0100 |
---|---|---|
committer | Michael Stahl <michael.stahl@cib.de> | 2020-02-19 18:51:01 +0100 |
commit | 83122add64ecbf0fd3ba30368d5d87bde3dac278 (patch) | |
tree | 2d9eed13f39187981ca80e1fc0dca05521489aa2 | |
parent | 73b6b3b4a22f047718d91a7057dba3a096171976 (diff) |
tdf#129553 sw_redlinehide: fix replace of paragraph breaks with $
The problem is that in the special selections that replace paragraph
breaks, the start and end node are actually different, hence have
different text frames.
(regression from 5e81b966778d82692b4763d892b457186a7f269d)
Practically the end content index is going to be 0 typically which
doesn't need mapping, but not sure if that's guaranteed anywhere.
Change-Id: I77c95c2f3e55edcc7aca6f4540cae90b3be5d79b
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/89050
Tested-by: Jenkins
Reviewed-by: Michael Stahl <michael.stahl@cib.de>
-rw-r--r-- | sw/source/core/crsr/findtxt.cxx | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/sw/source/core/crsr/findtxt.cxx b/sw/source/core/crsr/findtxt.cxx index ec1dc65d63a6..817091462d51 100644 --- a/sw/source/core/crsr/findtxt.cxx +++ b/sw/source/core/crsr/findtxt.cxx @@ -1101,8 +1101,10 @@ o3tl::optional<OUString> ReplaceBackReferences(const i18nutil::SearchOptions2& r if( pPam && pPam->HasMark() && SearchAlgorithms2::REGEXP == rSearchOpt.AlgorithmType2 ) { - const SwContentNode* pTextNode = pPam->GetContentNode(); - if (!pTextNode || !pTextNode->IsTextNode()) + SwContentNode const*const pTextNode = pPam->GetContentNode(); + SwContentNode const*const pMarkTextNode = pPam->GetContentNode(false); + if (!pTextNode || !pTextNode->IsTextNode() + || !pMarkTextNode || !pMarkTextNode->IsTextNode()) { return xRet; } @@ -1112,7 +1114,7 @@ o3tl::optional<OUString> ReplaceBackReferences(const i18nutil::SearchOptions2& r const bool bParaEnd = rSearchOpt.searchString == "$" || rSearchOpt.searchString == "^$" || rSearchOpt.searchString == "$^"; if (bParaEnd || (pLayout ? sw::FrameContainsNode(*pFrame, pPam->GetMark()->nNode.GetIndex()) - : pTextNode == pPam->GetContentNode(false))) + : pTextNode == pMarkTextNode)) { utl::TextSearch aSText( utl::TextSearch::UpgradeToSearchOptions2( rSearchOpt) ); OUString rStr = pLayout @@ -1122,8 +1124,16 @@ o3tl::optional<OUString> ReplaceBackReferences(const i18nutil::SearchOptions2& r AmbiguousIndex nEnd; if (pLayout) { - nStart.SetFrameIndex(pFrame->MapModelToViewPos(*pPam->Start())); - nEnd.SetFrameIndex(pFrame->MapModelToViewPos(*pPam->End())); + SwTextFrame const*const pStartFrame( + bParaEnd && *pPam->GetMark() < *pPam->GetPoint() + ? static_cast<SwTextFrame const*>(pMarkTextNode->getLayoutFrame(pLayout)) + : pFrame); + SwTextFrame const*const pEndFrame( + bParaEnd && *pPam->GetPoint() <= *pPam->GetMark() + ? static_cast<SwTextFrame const*>(pMarkTextNode->getLayoutFrame(pLayout)) + : pFrame); + nStart.SetFrameIndex(pStartFrame->MapModelToViewPos(*pPam->Start())); + nEnd.SetFrameIndex(pEndFrame->MapModelToViewPos(*pPam->End())); } else { |