summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin Luth <justin.luth@collabora.com>2024-03-19 15:28:32 -0400
committerAron Budea <aron.budea@collabora.com>2024-03-26 17:36:03 +1030
commit5a78a44c486a2a49532d32a8ef53b2f2b4833ffe (patch)
tree23ce1b014051c7ba7ffc56d25f465b090969db07
parent098a2536d08a18981032273b55e287bd231dc58e (diff)
related tdf#147583 sw find: fix backwards search for string at end of para
Prior to this fix, it was finding every single character in the document when searching for ".$". Interestingly, the unit test worked even before the patch. Not sure how that could be possible... make CppunitTest_sw_uiwriter7 \ CPPUNIT_TEST_NAME=testTdf147583_backwardSearch Change-Id: I20779898c01736eb39ecd7db7d66c2c24e4358b0 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165037 Tested-by: Jenkins Reviewed-by: Justin Luth <jluth@mail.com> Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com> Reviewed-by: Miklos Vajna <vmiklos@collabora.com> (cherry picked from commit e830394c068c229bb840018f2f0e8810da6a1487)
-rw-r--r--sw/qa/extras/uiwriter/uiwriter7.cxx5
-rw-r--r--sw/source/core/crsr/findtxt.cxx19
2 files changed, 24 insertions, 0 deletions
diff --git a/sw/qa/extras/uiwriter/uiwriter7.cxx b/sw/qa/extras/uiwriter/uiwriter7.cxx
index dbae48e33798..127c78a1d583 100644
--- a/sw/qa/extras/uiwriter/uiwriter7.cxx
+++ b/sw/qa/extras/uiwriter/uiwriter7.cxx
@@ -386,6 +386,11 @@ CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf147583_backwardSearch)
xIndex.set(xSearch->findAll(xSearchDes), uno::UNO_SET_THROW);
// should actually be 10 (including the empty para with the comment marker, and the last para)
CPPUNIT_ASSERT_EQUAL(sal_Int32(8), xIndex->getCount());
+
+ xSearchDes->setSearchString(".$"); // any last character (not just full-stops) in a paragraph
+ xIndex.set(xSearch->findAll(xSearchDes), uno::UNO_SET_THROW);
+ // should be one for every non-empty paragraph
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(14), xIndex->getCount());
}
CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf69282)
diff --git a/sw/source/core/crsr/findtxt.cxx b/sw/source/core/crsr/findtxt.cxx
index e87e4d6ff5c1..6b6cec3268d2 100644
--- a/sw/source/core/crsr/findtxt.cxx
+++ b/sw/source/core/crsr/findtxt.cxx
@@ -729,6 +729,25 @@ bool DoSearch(SwPaM & rSearchPam,
SwTextNode const*const pNode, SwTextFrame const*const pFrame,
SwRootFrame const*const pLayout, SwPaM* pPam)
{
+ if (bRegSearch && rSearchOpt.searchString.endsWith("$"))
+ {
+ bool bAlwaysSearchingForEndOfPara = true;
+ sal_Int32 nIndex = 0;
+ while ((nIndex = rSearchOpt.searchString.indexOf("|", nIndex)) != -1)
+ {
+ if (!nIndex || rSearchOpt.searchString[nIndex - 1] != '$')
+ {
+ bAlwaysSearchingForEndOfPara = false;
+ break;
+ }
+ ++nIndex;
+ }
+ // when searching for something at the end of the paragraph, the para end must be in range
+ const AmbiguousIndex& rParaEnd = bSrchForward ? nEnd : nStart;
+ if (bAlwaysSearchingForEndOfPara && nTextLen.GetAnyIndex() != rParaEnd.GetAnyIndex())
+ return false;
+ }
+
bool bFound = false;
OUString sCleanStr;
std::vector<AmbiguousIndex> aFltArr;