[Libreoffice-commits] core.git: Branch 'distro/nisz/libreoffice-7-0' - sw/inc sw/qa sw/source
László Németh (via logerrit)
logerrit at kemper.freedesktop.org
Fri Apr 23 13:51:17 UTC 2021
sw/inc/IDocumentRedlineAccess.hxx | 5 +++
sw/qa/extras/uiwriter/uiwriter.cxx | 13 +++++---
sw/source/core/doc/DocumentRedlineManager.cxx | 29 ++++++++++++++++++
sw/source/core/edit/acorrect.cxx | 41 +++++++++-----------------
sw/source/core/inc/DocumentRedlineManager.hxx | 5 +++
5 files changed, 63 insertions(+), 30 deletions(-)
New commits:
commit a2f9c539accc17cb980c35f810fa24f200c8bf1a
Author: László Németh <nemeth at numbertext.org>
AuthorDate: Mon Nov 9 11:36:57 2020 +0100
Commit: Gabor Kelemen <kelemen.gabor2 at nisz.hu>
CommitDate: Fri Apr 23 15:50:44 2021 +0200
tdf#83419 sw change tracking: clean-up autocorrect
fix of commit ac84cf7dda4a5150ff23e112ee16f00b8de8ec7c
(tdf#83419 sw change tracking: fix bad autocorrect).
Now automatic sentence capitalization and
correction of two initial capitals are allowed
again, if there is a tracked deletion in the same
paragraph before the modified word.
Change-Id: I8c583df2f14468b47079019009e7937f559b652b
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/105477
Tested-by: László Németh <nemeth at numbertext.org>
Reviewed-by: László Németh <nemeth at numbertext.org>
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/114548
Tested-by: Gabor Kelemen <kelemen.gabor2 at nisz.hu>
Reviewed-by: Gabor Kelemen <kelemen.gabor2 at nisz.hu>
diff --git a/sw/inc/IDocumentRedlineAccess.hxx b/sw/inc/IDocumentRedlineAccess.hxx
index 395fae8d47e2..0e4c9e33fb52 100644
--- a/sw/inc/IDocumentRedlineAccess.hxx
+++ b/sw/inc/IDocumentRedlineAccess.hxx
@@ -170,6 +170,11 @@ public:
/*[in]*/const SwNode& rNode,
/*[in]*/RedlineType nType) const = 0;
+ virtual bool HasRedline(
+ /*[in]*/const SwPaM& rPam,
+ /*[in]*/RedlineType nType,
+ /*[in]*/bool bStartOrEndInRange) const = 0;
+
virtual void CompressRedlines() = 0;
virtual const SwRangeRedline* GetRedline(
diff --git a/sw/qa/extras/uiwriter/uiwriter.cxx b/sw/qa/extras/uiwriter/uiwriter.cxx
index 8d2cd669630d..7b29b6026231 100644
--- a/sw/qa/extras/uiwriter/uiwriter.cxx
+++ b/sw/qa/extras/uiwriter/uiwriter.cxx
@@ -7538,8 +7538,14 @@ void SwUiWriterTest::testRedlineAutoCorrect()
pWrtShell->Insert("et");
pWrtShell->AutoCorrect(corr, ' ');
// This was "Ttest" removing the tracked deletion silently.
- // FIXME The second patch from bug #83419 is missing from backport
- sReplaced = "tstest ";
+ sReplaced = "tset ";
+ nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
+ CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
+
+ // Including capitalization
+ pWrtShell->Insert("end. word");
+ pWrtShell->AutoCorrect(corr, ' ');
+ sReplaced = "tset end. Word ";
nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
@@ -7547,8 +7553,7 @@ void SwUiWriterTest::testRedlineAutoCorrect()
dispatchCommand(mxComponent, ".uno:GoToStartOfDoc", {});
pWrtShell->Insert("a");
pWrtShell->AutoCorrect(corr, ' ');
- // FIXME The second patch from bug #83419 is missing from backport
- sReplaced = "A tstest ";
+ sReplaced = "A tset end. Word ";
nIndex = pWrtShell->GetCursor()->GetNode().GetIndex();
CPPUNIT_ASSERT_EQUAL(sReplaced, static_cast<SwTextNode*>(pDoc->GetNodes()[nIndex])->GetText());
}
diff --git a/sw/source/core/doc/DocumentRedlineManager.cxx b/sw/source/core/doc/DocumentRedlineManager.cxx
index f3aaa13a60d1..010a756af3e4 100644
--- a/sw/source/core/doc/DocumentRedlineManager.cxx
+++ b/sw/source/core/doc/DocumentRedlineManager.cxx
@@ -2523,6 +2523,35 @@ SwRedlineTable::size_type DocumentRedlineManager::GetRedlinePos( const SwNode& r
// #TODO - add 'SwExtraRedlineTable' also ?
}
+bool DocumentRedlineManager::HasRedline( const SwPaM& rPam, RedlineType nType, bool bStartOrEndInRange ) const // xxx
+{
+ SwPosition currentStart(*rPam.Start());
+ SwPosition currentEnd(*rPam.End());
+ SwNodeIndex pEndNodeIndex(currentEnd.nNode.GetNode());
+
+ for( SwRedlineTable::size_type n = GetRedlinePos( rPam.Start()->nNode.GetNode(), nType );
+ n < mpRedlineTable->size(); ++n )
+ {
+ const SwRangeRedline* pTmp = (*mpRedlineTable)[ n ];
+
+ if ( pTmp->Start()->nNode > pEndNodeIndex )
+ break;
+
+ if( RedlineType::Any != nType && nType != pTmp->GetType() )
+ continue;
+
+ // redline over the range
+ if ( currentStart < *pTmp->End() && *pTmp->Start() <= currentEnd &&
+ // starting or ending within the range
+ ( !bStartOrEndInRange ||
+ ( currentStart <= *pTmp->Start() || *pTmp->End() <= currentEnd ) ) )
+ {
+ return true;
+ }
+ }
+ return false;
+}
+
const SwRangeRedline* DocumentRedlineManager::GetRedline( const SwPosition& rPos,
SwRedlineTable::size_type* pFndPos ) const
{
diff --git a/sw/source/core/edit/acorrect.cxx b/sw/source/core/edit/acorrect.cxx
index d48adc51557f..c872fde907cc 100644
--- a/sw/source/core/edit/acorrect.cxx
+++ b/sw/source/core/edit/acorrect.cxx
@@ -40,6 +40,9 @@
#include <svl/zformat.hxx>
#include <editeng/acorrcfg.hxx>
+#include <redline.hxx>
+#include <IDocumentRedlineAccess.hxx>
+#include <rootfrm.hxx>
using namespace ::com::sun::star;
@@ -229,31 +232,10 @@ bool SwAutoCorrDoc::ReplaceRange( sal_Int32 nPos, sal_Int32 nSourceLength, const
// tdf#83419 avoid bad autocorrect with visible redlines
// e.g. replacing the first letter of the tracked deletion
// with its capitalized (and not deleted) version.
- if ( bDoReplace )
+ if ( bDoReplace && !pFrame->getRootFrame()->IsHideRedlines() &&
+ m_rEditSh.GetDoc()->getIDocumentRedlineAccess().HasRedline( *pPam, RedlineType::Delete, /*bStartOrEndInRange=*/false ) )
{
- const OUString& rOrigText = pos.first->GetText();
- // GetRedlineText() doesn't contain dummy characters, so handle them
- sal_Int32 nLengthCorrection = 0;
- for (sal_Int32 n = 0; n < rOrigText.getLength(); ++n)
- {
- sal_Unicode const Char = rOrigText[n];
- if ( CH_TXTATR_BREAKWORD == Char || CH_TXTATR_INWORD == Char )
- ++nLengthCorrection;
- }
- sal_Int32 nDelChars = rOrigText.getLength() - nLengthCorrection -
- pos.first->GetRedlineText().getLength();
- // Are there tracked deletions before the correction point?
- if ( nDelChars > 0 && pos.first->GetRedlineText().compareTo( nLengthCorrection == 0
- ? rOrigText
- : rOrigText.replaceAll(OUString(CH_TXTATR_INWORD), "")
- .replaceAll(OUString(CH_TXTATR_BREAKWORD), ""),
- pos.second + nSourceLength + nDelChars ) != 0 &&
- // and are they visible?
- pFrame->GetText().compareTo(
- rOrigText, pos.second + nSourceLength + nDelChars + nLengthCorrection) == 0 )
- {
- bDoReplace = false;
- }
+ bDoReplace = false;
}
if ( bDoReplace )
@@ -422,8 +404,15 @@ 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
+ if ( pDoc->getIDocumentRedlineAccess().HasRedline( aPam, RedlineType::Any, /*bStartOrEndInRange=*/true ) )
+ {
+ return bRet;
+ }
if( pFnd->IsTextOnly() )
{
diff --git a/sw/source/core/inc/DocumentRedlineManager.hxx b/sw/source/core/inc/DocumentRedlineManager.hxx
index a9811827e262..8f79088dec0f 100644
--- a/sw/source/core/inc/DocumentRedlineManager.hxx
+++ b/sw/source/core/inc/DocumentRedlineManager.hxx
@@ -76,6 +76,11 @@ public:
/*[in]*/const SwNode& rNode,
/*[in]*/RedlineType nType) const override;
+ virtual bool HasRedline(
+ /*[in]*/const SwPaM& rPam,
+ /*[in]*/RedlineType nType,
+ /*[in]*/bool bStartOrEndInRange) const override;
+
virtual void CompressRedlines() override;
virtual const SwRangeRedline* GetRedline(
More information about the Libreoffice-commits
mailing list