summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sw/inc/ndtxt.hxx5
-rw-r--r--sw/source/core/doc/doc.cxx4
-rw-r--r--sw/source/core/inc/wrong.hxx3
-rw-r--r--sw/source/core/layout/layact.cxx3
-rw-r--r--sw/source/core/text/txtfrm.cxx2
-rw-r--r--sw/source/core/text/wrong.cxx20
-rw-r--r--sw/source/core/txtnode/ndtxt.cxx14
-rw-r--r--sw/source/core/txtnode/txtedt.cxx43
-rw-r--r--sw/source/core/unocore/unoflatpara.cxx5
-rw-r--r--sw/source/core/unocore/unoobj.cxx2
10 files changed, 66 insertions, 35 deletions
diff --git a/sw/inc/ndtxt.hxx b/sw/inc/ndtxt.hxx
index 261fbdf62136..ba56bb5d6359 100644
--- a/sw/inc/ndtxt.hxx
+++ b/sw/inc/ndtxt.hxx
@@ -184,13 +184,16 @@ class SW_DLLPUBLIC SwTextNode: public SwContentNode, public ::sfx2::Metadatable
void DelFrms_TextNodePart();
public:
+ enum class WrongState { TODO, PENDING, DONE };
+
bool IsWordCountDirty() const;
+ WrongState GetWrongDirty() const;
bool IsWrongDirty() const;
bool IsGrammarCheckDirty() const;
bool IsSmartTagDirty() const;
bool IsAutoCompleteWordDirty() const;
void SetWordCountDirty( bool bNew ) const;
- void SetWrongDirty( bool bNew ) const;
+ void SetWrongDirty(WrongState eNew) const;
void SetGrammarCheckDirty( bool bNew ) const;
void SetSmartTagDirty( bool bNew ) const;
void SetAutoCompleteWordDirty( bool bNew ) const;
diff --git a/sw/source/core/doc/doc.cxx b/sw/source/core/doc/doc.cxx
index 789fbb94ad31..df4a5f6dad6b 100644
--- a/sw/source/core/doc/doc.cxx
+++ b/sw/source/core/doc/doc.cxx
@@ -1097,14 +1097,14 @@ static bool lcl_SpellAndGrammarAgain( const SwNodePtr& rpNd, void* pArgs )
{
if( pTextNode->GetWrong() &&
pTextNode->GetWrong()->InvalidateWrong() )
- pTextNode->SetWrongDirty( true );
+ pTextNode->SetWrongDirty(SwTextNode::WrongState::TODO);
if( pTextNode->GetGrammarCheck() &&
pTextNode->GetGrammarCheck()->InvalidateWrong() )
pTextNode->SetGrammarCheckDirty( true );
}
else
{
- pTextNode->SetWrongDirty( true );
+ pTextNode->SetWrongDirty(SwTextNode::WrongState::TODO);
if( pTextNode->GetWrong() )
pTextNode->GetWrong()->SetInvalid( 0, COMPLETE_STRING );
pTextNode->SetGrammarCheckDirty( true );
diff --git a/sw/source/core/inc/wrong.hxx b/sw/source/core/inc/wrong.hxx
index 085ab615bea6..840ca664b291 100644
--- a/sw/source/core/inc/wrong.hxx
+++ b/sw/source/core/inc/wrong.hxx
@@ -209,7 +209,8 @@ public:
inline void Validate(){ nBeginInvalid = nEndInvalid = COMPLETE_STRING; }
void Invalidate( sal_Int32 nBegin, sal_Int32 nEnd );
bool InvalidateWrong();
- bool Fresh( sal_Int32 &rStart, sal_Int32 &rEnd, sal_Int32 nPos,
+ enum class FreshState { FRESH, CURSOR, NOTHING };
+ FreshState Fresh( sal_Int32 &rStart, sal_Int32 &rEnd, sal_Int32 nPos,
sal_Int32 nLen, sal_uInt16 nIndex, sal_Int32 nCursorPos );
sal_uInt16 GetWrongPos( sal_Int32 nValue ) const;
diff --git a/sw/source/core/layout/layact.cxx b/sw/source/core/layout/layact.cxx
index e8a03f3343bb..500f42f0b6bd 100644
--- a/sw/source/core/layout/layact.cxx
+++ b/sw/source/core/layout/layact.cxx
@@ -1916,7 +1916,8 @@ bool SwLayIdle::_DoIdleJob( const SwContentFrm *pCnt, IdleJobType eJob )
case ONLINE_SPELLING :
{
SwRect aRepaint( const_cast<SwTextFrm*>(static_cast<const SwTextFrm*>(pCnt))->_AutoSpell( pContentNode, nTextPos ) );
- bPageValid = bPageValid && !pTextNode->IsWrongDirty();
+ // tdf#92036 PENDING should stop idle spell checking
+ bPageValid = bPageValid && (SwTextNode::WrongState::TODO != pTextNode->GetWrongDirty());
if( !bPageValid )
bAllValid = false;
if ( aRepaint.HasArea() )
diff --git a/sw/source/core/text/txtfrm.cxx b/sw/source/core/text/txtfrm.cxx
index b240c63fc3c2..c996bdcefa3a 100644
--- a/sw/source/core/text/txtfrm.cxx
+++ b/sw/source/core/text/txtfrm.cxx
@@ -845,7 +845,7 @@ static void lcl_SetWrong( SwTextFrm& rFrm, sal_Int32 nPos, sal_Int32 nCnt, bool
pTextNode->SetSmartTags( new SwWrongList( WRONGLIST_SMARTTAG ) );
pTextNode->GetSmartTags()->SetInvalid( nPos, nEnd );
}
- pTextNode->SetWrongDirty( true );
+ pTextNode->SetWrongDirty(SwTextNode::WrongState::TODO);
pTextNode->SetGrammarCheckDirty( true );
pTextNode->SetWordCountDirty( true );
pTextNode->SetAutoCompleteWordDirty( true );
diff --git a/sw/source/core/text/wrong.cxx b/sw/source/core/text/wrong.cxx
index 0ea4c52c3a79..1fb87d9ff692 100644
--- a/sw/source/core/text/wrong.cxx
+++ b/sw/source/core/text/wrong.cxx
@@ -356,11 +356,17 @@ void SwWrongList::Move( sal_Int32 nPos, sal_Int32 nDiff )
@return <true> if ???
*/
-bool SwWrongList::Fresh( sal_Int32 &rStart, sal_Int32 &rEnd, sal_Int32 nPos,
- sal_Int32 nLen, sal_uInt16 nIndex, sal_Int32 nCursorPos )
+auto SwWrongList::Fresh( sal_Int32 &rStart, sal_Int32 &rEnd, sal_Int32 nPos,
+ sal_Int32 nLen, sal_uInt16 nIndex, sal_Int32 nCursorPos ) -> FreshState
{
- // length of word must be greater than 0 and cursor position must be outside the word
- bool bRet = nLen && ( nCursorPos > nPos + nLen || nCursorPos < nPos );
+ // length of word must be greater than 0
+ // only report a spelling error if the cursor position is outside the word,
+ // so that the user is not annoyed while typing
+ FreshState eRet = (nLen)
+ ? (nCursorPos > nPos + nLen || nCursorPos < nPos)
+ ? FreshState::FRESH
+ : FreshState::CURSOR
+ : FreshState::NOTHING;
sal_Int32 nWrPos = 0;
sal_Int32 nWrEnd = rEnd;
@@ -383,11 +389,11 @@ bool SwWrongList::Fresh( sal_Int32 &rStart, sal_Int32 &rEnd, sal_Int32 nPos,
if( nCnt < Count() && nWrPos == nPos && Len( nCnt ) == nLen )
{
++nCnt;
- bRet = true;
+ eRet = FreshState::FRESH;
}
else
{
- if( bRet )
+ if (FreshState::FRESH == eRet)
{
if( rStart > nPos )
rStart = nPos;
@@ -417,7 +423,7 @@ bool SwWrongList::Fresh( sal_Int32 &rStart, sal_Int32 &rEnd, sal_Int32 nPos,
Remove( nIndex, nCnt - nIndex );
- return bRet;
+ return eRet;
}
void SwWrongList::Invalidate( sal_Int32 nBegin, sal_Int32 nEnd )
diff --git a/sw/source/core/txtnode/ndtxt.cxx b/sw/source/core/txtnode/ndtxt.cxx
index aa374587d594..08da02c165cd 100644
--- a/sw/source/core/txtnode/ndtxt.cxx
+++ b/sw/source/core/txtnode/ndtxt.cxx
@@ -428,7 +428,7 @@ SwContentNode *SwTextNode::SplitContentNode( const SwPosition &rPos )
{
pNode->SetWrong( GetWrong()->SplitList( nSplitPos ) );
}
- SetWrongDirty( true );
+ SetWrongDirty(WrongState::TODO);
if( GetGrammarCheck() )
{
@@ -531,7 +531,7 @@ SwContentNode *SwTextNode::SplitContentNode( const SwPosition &rPos )
{
SwWrongList *pList = GetWrong();
SetWrong( 0, false );
- SetWrongDirty( true );
+ SetWrongDirty(WrongState::TODO);
SwGrammarMarkUp *pList3 = GetGrammarCheck();
SetGrammarCheck( 0, false );
@@ -652,7 +652,7 @@ SwContentNode *SwTextNode::JoinNext()
if( pList )
{
pList->JoinList( pTextNode->GetWrong(), nOldLen );
- SetWrongDirty( true );
+ SetWrongDirty(WrongState::TODO);
SetWrong( 0, false );
}
else
@@ -661,7 +661,7 @@ SwContentNode *SwTextNode::JoinNext()
if( pList )
{
pList->Move( 0, nOldLen );
- SetWrongDirty( true );
+ SetWrongDirty(WrongState::TODO);
pTextNode->SetWrong( 0, false );
}
}
@@ -743,7 +743,7 @@ SwContentNode *SwTextNode::JoinPrev()
if( pList )
{
pList->JoinList( GetWrong(), Len() );
- SetWrongDirty( true );
+ SetWrongDirty(WrongState::TODO);
pTextNode->SetWrong( 0, false );
SetWrong( NULL );
}
@@ -753,7 +753,7 @@ SwContentNode *SwTextNode::JoinPrev()
if( pList )
{
pList->Move( 0, nLen );
- SetWrongDirty( true );
+ SetWrongDirty(WrongState::TODO);
SetWrong( 0, false );
}
}
@@ -1387,7 +1387,7 @@ const SwTextInputField* SwTextNode::GetOverlappingInputField( const SwTextAttr&
void SwTextNode::DelFrms_TextNodePart()
{
SetWrong( NULL );
- SetWrongDirty( true );
+ SetWrongDirty(WrongState::TODO);
SetGrammarCheck( NULL );
SetGrammarCheckDirty( true );
diff --git a/sw/source/core/txtnode/txtedt.cxx b/sw/source/core/txtnode/txtedt.cxx
index 582c60f189a6..98095cff33c4 100644
--- a/sw/source/core/txtnode/txtedt.cxx
+++ b/sw/source/core/txtnode/txtedt.cxx
@@ -1311,6 +1311,7 @@ SwRect SwTextFrm::_AutoSpell( const SwContentNode* pActNode, sal_Int32 nActPos )
}
bool bFresh = nBegin < nEnd;
+ bool bPending(false);
if( bFresh )
{
@@ -1353,13 +1354,19 @@ SwRect SwTextFrm::_AutoSpell( const SwContentNode* pActNode, sal_Int32 nActPos )
pNode->SetWrong( new SwWrongList( WRONGLIST_SPELL ) );
pNode->GetWrong()->SetInvalid( 0, nEnd );
}
- if( pNode->GetWrong()->Fresh( nChgStart, nChgEnd,
- nBegin, nLen, nInsertPos, nActPos ) )
- pNode->GetWrong()->Insert( OUString(), 0, nBegin, nLen, nInsertPos++ );
- else
+ SwWrongList::FreshState const eState(pNode->GetWrong()->Fresh(
+ nChgStart, nChgEnd, nBegin, nLen, nInsertPos, nActPos));
+ switch (eState)
{
- nInvStart = nBegin;
- nInvEnd = nBegin + nLen;
+ case SwWrongList::FreshState::FRESH:
+ pNode->GetWrong()->Insert(OUString(), 0, nBegin, nLen, nInsertPos++);
+ break;
+ case SwWrongList::FreshState::CURSOR:
+ bPending = true; // fall-through to mark as invalid
+ case SwWrongList::FreshState::NOTHING:
+ nInvStart = nBegin;
+ nInvEnd = nBegin + nLen;
+ break;
}
}
}
@@ -1402,12 +1409,17 @@ SwRect SwTextFrm::_AutoSpell( const SwContentNode* pActNode, sal_Int32 nActPos )
}
pNode->GetWrong()->SetInvalid( nInvStart, nInvEnd );
- pNode->SetWrongDirty( COMPLETE_STRING != pNode->GetWrong()->GetBeginInv() );
+ pNode->SetWrongDirty(
+ (COMPLETE_STRING != pNode->GetWrong()->GetBeginInv())
+ ? ((bPending)
+ ? SwTextNode::WrongState::PENDING
+ : SwTextNode::WrongState::TODO)
+ : SwTextNode::WrongState::DONE);
if( !pNode->GetWrong()->Count() && ! pNode->IsWrongDirty() )
pNode->SetWrong( NULL );
}
else
- pNode->SetWrongDirty( false );
+ pNode->SetWrongDirty(SwTextNode::WrongState::DONE);
if( bAddAutoCmpl )
pNode->SetAutoCompleteWordDirty( false );
@@ -2115,7 +2127,7 @@ struct SwParaIdleData_Impl
sal_uLong nNumberOfChars;
sal_uLong nNumberOfCharsExcludingSpaces;
bool bWordCountDirty;
- bool bWrongDirty; // Ist das Wrong-Feld auf invalid?
+ SwTextNode::WrongState eWrongDirty; ///< online spell checking needed/done?
bool bGrammarCheckDirty;
bool bSmartTagDirty;
bool bAutoComplDirty; // die ACompl-Liste muss angepasst werden
@@ -2129,7 +2141,7 @@ struct SwParaIdleData_Impl
nNumberOfChars ( 0 ),
nNumberOfCharsExcludingSpaces ( 0 ),
bWordCountDirty ( true ),
- bWrongDirty ( true ),
+ eWrongDirty ( SwTextNode::WrongState::TODO ),
bGrammarCheckDirty ( true ),
bSmartTagDirty ( true ),
bAutoComplDirty ( true ) {};
@@ -2276,17 +2288,22 @@ bool SwTextNode::IsWordCountDirty() const
return m_pParaIdleData_Impl && m_pParaIdleData_Impl->bWordCountDirty;
}
-void SwTextNode::SetWrongDirty( bool bNew ) const
+void SwTextNode::SetWrongDirty(WrongState eNew) const
{
if ( m_pParaIdleData_Impl )
{
- m_pParaIdleData_Impl->bWrongDirty = bNew;
+ m_pParaIdleData_Impl->eWrongDirty = eNew;
}
}
+auto SwTextNode::GetWrongDirty() const -> WrongState
+{
+ return (m_pParaIdleData_Impl) ? m_pParaIdleData_Impl->eWrongDirty : WrongState::DONE;
+}
+
bool SwTextNode::IsWrongDirty() const
{
- return m_pParaIdleData_Impl && m_pParaIdleData_Impl->bWrongDirty;
+ return m_pParaIdleData_Impl && m_pParaIdleData_Impl->eWrongDirty != WrongState::DONE;
}
void SwTextNode::SetGrammarCheckDirty( bool bNew ) const
diff --git a/sw/source/core/unocore/unoflatpara.cxx b/sw/source/core/unocore/unoflatpara.cxx
index 4af396abe703..4628abc8763e 100644
--- a/sw/source/core/unocore/unoflatpara.cxx
+++ b/sw/source/core/unocore/unoflatpara.cxx
@@ -199,7 +199,10 @@ void SAL_CALL SwXFlatParagraph::setChecked( ::sal_Int32 nType, sal_Bool bVal ) t
if (GetTextNode())
{
if ( text::TextMarkupType::SPELLCHECK == nType )
- GetTextNode()->SetWrongDirty( !bVal );
+ {
+ GetTextNode()->SetWrongDirty(
+ (bVal) ? SwTextNode::WrongState::DONE : SwTextNode::WrongState::TODO);
+ }
else if ( text::TextMarkupType::SMARTTAG == nType )
GetTextNode()->SetSmartTagDirty( !bVal );
else if( text::TextMarkupType::PROOFREADING == nType )
diff --git a/sw/source/core/unocore/unoobj.cxx b/sw/source/core/unocore/unoobj.cxx
index 779f84ab44a5..c3be1b1951e8 100644
--- a/sw/source/core/unocore/unoobj.cxx
+++ b/sw/source/core/unocore/unoobj.cxx
@@ -2514,7 +2514,7 @@ throw (uno::RuntimeException, std::exception)
if ( text::TextMarkupType::SPELLCHECK == nType )
{
- txtNode->SetWrongDirty(true);
+ txtNode->SetWrongDirty(SwTextNode::WrongState::TODO);
txtNode->SetWrong(0);
}
else if( text::TextMarkupType::PROOFREADING == nType )