diff --git a/sw/qa/extras/uiwriter/data/redline-autocorrect2.fodt b/sw/qa/extras/uiwriter/data/redline-autocorrect2.fodt
new file mode 100644
index 000000000000..4d65c5f465a2
--- /dev/null
+++ b/sw/qa/extras/uiwriter/data/redline-autocorrect2.fodt
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Unknown Author
+ 2020-11-03T19:19:05
+
+
+
+
+ Lorem,
+
+
+
diff --git a/sw/qa/extras/uiwriter/uiwriter.cxx b/sw/qa/extras/uiwriter/uiwriter.cxx
index aca558b923a6..2acfc17b7082 100644
--- a/sw/qa/extras/uiwriter/uiwriter.cxx
+++ b/sw/qa/extras/uiwriter/uiwriter.cxx
@@ -391,6 +391,7 @@ public:
void testInsertLongDateFormat();
void testSpellOnlineParameter();
void testRedlineAutoCorrect();
+ void testRedlineAutoCorrect2();
#if HAVE_FEATURE_PDFIUM
void testInsertPdf();
#endif
@@ -618,6 +619,7 @@ public:
CPPUNIT_TEST(testInsertLongDateFormat);
CPPUNIT_TEST(testSpellOnlineParameter);
CPPUNIT_TEST(testRedlineAutoCorrect);
+ CPPUNIT_TEST(testRedlineAutoCorrect2);
#if HAVE_FEATURE_PDFIUM
CPPUNIT_TEST(testInsertPdf);
#endif
@@ -7638,7 +7640,15 @@ void SwUiWriterTest::testRedlineAutoCorrect()
pWrtShell->Insert("et");
pWrtShell->AutoCorrect(corr, ' ');
// This was "Ttest" removing the tracked deletion silently.
- sReplaced = "ttest ";
+ // Don't replace, if a redline starts or ends within the text.
+ sReplaced = "tset ";
+ nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
+ CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast(pDoc->GetNodes()[nIndex])->GetText());
+
+ // Otherwise replace it
+ pWrtShell->Insert("tset");
+ pWrtShell->AutoCorrect(corr, ' ');
+ sReplaced = "tset test ";
nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast(pDoc->GetNodes()[nIndex])->GetText());
@@ -7646,11 +7656,43 @@ void SwUiWriterTest::testRedlineAutoCorrect()
dispatchCommand(mxComponent, ".uno:GoToStartOfDoc", {});
pWrtShell->Insert("a");
pWrtShell->AutoCorrect(corr, ' ');
- sReplaced = "A ttest ";
+ sReplaced = "A tset test ";
nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast(pDoc->GetNodes()[nIndex])->GetText());
}
+void SwUiWriterTest::testRedlineAutoCorrect2()
+{
+ SwDoc* pDoc = createDoc("redline-autocorrect2.fodt");
+ SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
+
+ dispatchCommand(mxComponent, ".uno:GoToEndOfDoc", {});
+
+ // show tracked deletion
+ RedlineFlags const nMode(pWrtShell->GetRedlineFlags() | RedlineFlags::On);
+ CPPUNIT_ASSERT(nMode & (RedlineFlags::ShowDelete | RedlineFlags::ShowInsert));
+ pWrtShell->SetRedlineFlags(nMode);
+ CPPUNIT_ASSERT(nMode & RedlineFlags::ShowDelete);
+
+ SwAutoCorrect corr(*SvxAutoCorrCfg::Get().GetAutoCorrect());
+ pWrtShell->Insert("...");
+ pWrtShell->AutoCorrect(corr, ' ');
+ sal_uLong nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
+
+ // This was "LoremLorem,…," (duplicating the deleted comma, but without deletion)
+ // Don't replace, if a redline starts or ends within the text.
+ OUString sReplaced = "Lorem,... ";
+ nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
+ CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast(pDoc->GetNodes()[nIndex])->GetText());
+
+ // Continue it:
+ pWrtShell->Insert("Lorem,...");
+ pWrtShell->AutoCorrect(corr, ' ');
+ nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
+ sReplaced = u"Lorem,... Lorem,… ";
+ CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast(pDoc->GetNodes()[nIndex])->GetText());
+}
+
void SwUiWriterTest::testTdf108423()
{
SwDoc* pDoc = createDoc();
diff --git a/sw/source/core/edit/acorrect.cxx b/sw/source/core/edit/acorrect.cxx
index 7ae0a778a59b..d7003ccfbaed 100644
--- a/sw/source/core/edit/acorrect.cxx
+++ b/sw/source/core/edit/acorrect.cxx
@@ -40,6 +40,8 @@
#include
#include
+#include
+#include
using namespace ::com::sun::star;
@@ -427,8 +429,28 @@ bool SwAutoCorrDoc::ChgAutoCorrWord( sal_Int32& rSttPos, sal_Int32 nEndPos,
const bool replaceLastChar = sFrameText.getLength() > nEndPos && pFnd->GetShort()[0] == ':'
&& pFnd->GetShort().endsWith(":");
- SwPaM aPam(pFrame->MapViewToModelPos(TextFrameIndex(rSttPos)),
- pFrame->MapViewToModelPos(TextFrameIndex(nEndPos + (replaceLastChar ? 1 : 0))));
+ SwPosition aStartPos( pFrame->MapViewToModelPos(TextFrameIndex(rSttPos) ));
+ SwPosition aEndPos( pFrame->MapViewToModelPos(TextFrameIndex(nEndPos + (replaceLastChar ? 1 : 0))) );
+ SwPaM aPam(aStartPos, aEndPos);
+
+ // don't replace, if a redline starts or ends within the original text
+ for ( SwRedlineTable::size_type nAct =
+ pDoc->getIDocumentRedlineAccess().GetRedlinePos( m_rCursor.GetNode(), RedlineType::Any );
+ nAct < pDoc->getIDocumentRedlineAccess().GetRedlineTable().size(); ++nAct )
+ {
+ const SwRangeRedline* pRed = pDoc->getIDocumentRedlineAccess().GetRedlineTable()[ nAct ];
+
+ if ( pRed->Start()->nNode > pTextNd->GetIndex() )
+ break;
+
+ // redline over the original text
+ if ( aStartPos < *pRed->End() && *pRed->Start() < aEndPos &&
+ // starting or ending within the original text
+ ( aStartPos < *pRed->Start() || *pRed->End() < aEndPos ) )
+ {
+ return bRet;
+ }
+ }
if( pFnd->IsTextOnly() )
{
diff --git a/test/Package_unittest.mk b/test/Package_unittest.mk
index 5973615edfed..2aabc9272eb4 100644
--- a/test/Package_unittest.mk
+++ b/test/Package_unittest.mk
@@ -24,6 +24,7 @@ $(eval $(call gb_Package_add_file,test_unittest,unittest/user/autotext/en-US/sta
$(eval $(call gb_Package_add_file,test_unittest,unittest/user/autotext/en-US/crdbus50.bau,user/autotext/en-US/crdbus50.bau))
$(eval $(call gb_Package_add_file,test_unittest,unittest/user/config/soffice.cfg/.dummy,empty-directory-dummy))
$(eval $(call gb_Package_add_file,test_unittest,unittest/user/autocorr/acor_en-US.dat,user/autocorr/acor_fr.dat))
+$(eval $(call gb_Package_add_file,test_unittest,unittest/user/autocorr/acor_en-GB.dat,user/autocorr/acor_en-GB.dat))
$(eval $(call gb_Package_add_file,test_unittest,unittest/user/config/soffice.cfg/modules/scalc/popupmenu/draw.xml,user/config/soffice.cfg/modules/scalc/popupmenu/draw.xml))
$(eval $(call gb_Package_add_file,test_unittest,unittest/user/config/soffice.cfg/modules/scalc/popupmenu/anchor.xml,user/config/soffice.cfg/modules/scalc/popupmenu/anchor.xml))
$(eval $(call gb_Package_add_file,test_unittest,unittest/user/config/soffice.cfg/modules/swriter/popupmenu/text.xml,user/config/soffice.cfg/modules/swriter/popupmenu/text.xml))
diff --git a/test/user-template/user/autocorr/acor_en-GB.dat b/test/user-template/user/autocorr/acor_en-GB.dat
new file mode 100644
index 000000000000..b74f1834caac
Binary files /dev/null and b/test/user-template/user/autocorr/acor_en-GB.dat differ