summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSzymon Kłos <szymon.klos@collabora.com>2019-01-22 17:43:45 +0100
committerSzymon Kłos <szymon.klos@collabora.com>2019-01-24 18:11:56 +0100
commit33f6848dc5abe71471b08dc6a8946feaa2d75ffc (patch)
tree32bab7667062e9925c9ffeba42ebdfacb61e1e69
parent1500ec88195466d119d73bdf7b85e8f5526e81fc (diff)
tdf#86731 Don't show 'spelling complete' when dictionary is missing
To check if dictionary is missing we have to run spelling which checks used language for each text portion. When AutoSpelling or manually invoked Spelling is performed SwDoc receives notification about missing dictionaries. Then it is possible to not show 'Completed' dialog. Change-Id: I040ce6565632294796c0206d20c4cd0066ca9643 Reviewed-on: https://gerrit.libreoffice.org/66813 Tested-by: Jenkins Reviewed-by: Szymon Kłos <szymon.klos@collabora.com>
-rw-r--r--sw/inc/doc.hxx8
-rw-r--r--sw/source/core/doc/doc.cxx9
-rw-r--r--sw/source/core/doc/docnew.cxx1
-rw-r--r--sw/source/core/txtnode/txtedt.cxx18
-rw-r--r--sw/source/uibase/dialog/SwSpellDialogChildWindow.cxx27
5 files changed, 50 insertions, 13 deletions
diff --git a/sw/inc/doc.hxx b/sw/inc/doc.hxx
index 4d1cf10c9010..9dda17de8e8b 100644
--- a/sw/inc/doc.hxx
+++ b/sw/inc/doc.hxx
@@ -312,6 +312,9 @@ private:
bool mbColumnSelection : 1; //< TRUE: this content has been created by a column selection (clipboard docs only)
bool mbIsPrepareSelAll : 1;
+ enum MissingDictionary { False = -1, Undefined = 0, True = 1 };
+ MissingDictionary meDictionaryMissing;
+
// true: Document contains at least one anchored object, which is anchored AT_PAGE with a content position.
// Thus, certain adjustment needed during formatting for these kind of anchored objects.
bool mbContainsAtPageObjWithContentAnchor : 1;
@@ -1635,6 +1638,11 @@ public:
*/
bool StartGrammarChecking( bool bSkipStart = false );
+ /// Use to notify if the dictionary can be found for a single content portion (has to be called for all portions)
+ void SetMissingDictionaries( bool bIsMissing );
+ /// Returns true if no dictionary can be found for any content
+ bool IsDictionaryMissing() { return meDictionaryMissing == MissingDictionary::True; }
+
private:
// Copies master header to left / first one, if necessary - used by ChgPageDesc().
void CopyMasterHeader(const SwPageDesc &rChged, const SwFormatHeader &rHead, SwPageDesc &pDesc, bool bLeft, bool bFirst);
diff --git a/sw/source/core/doc/doc.cxx b/sw/source/core/doc/doc.cxx
index 1e223e8b64a9..ee4dd7682dba 100644
--- a/sw/source/core/doc/doc.cxx
+++ b/sw/source/core/doc/doc.cxx
@@ -1827,4 +1827,13 @@ SwDoc::GetVbaEventProcessor()
return mxVbaEvents;
}
+void SwDoc::SetMissingDictionaries( bool bIsMissing )
+{
+ if( bIsMissing && meDictionaryMissing == MissingDictionary::Undefined )
+ meDictionaryMissing = MissingDictionary::True;
+ else if( !bIsMissing )
+ meDictionaryMissing = MissingDictionary::False;
+};
+
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/doc/docnew.cxx b/sw/source/core/doc/docnew.cxx
index a1034a6e482c..d17b8202d699 100644
--- a/sw/source/core/doc/docnew.cxx
+++ b/sw/source/core/doc/docnew.cxx
@@ -274,6 +274,7 @@ SwDoc::SwDoc()
mbClipBoard( false ),
mbColumnSelection( false ),
mbIsPrepareSelAll(false),
+ meDictionaryMissing( MissingDictionary::Undefined ),
mbContainsAtPageObjWithContentAnchor(false), //#i119292#, fdo#37024
meDocType(DOCTYPE_NATIVE)
diff --git a/sw/source/core/txtnode/txtedt.cxx b/sw/source/core/txtnode/txtedt.cxx
index 358669f3fba6..686b64dc89a2 100644
--- a/sw/source/core/txtnode/txtedt.cxx
+++ b/sw/source/core/txtnode/txtedt.cxx
@@ -88,6 +88,22 @@ using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::linguistic2;
using namespace ::com::sun::star::smarttags;
+namespace
+{
+ void DetectAndMarkMissingDictionaries( SwDoc* pDoc,
+ const uno::Reference< XSpellChecker1 >& xSpell,
+ const LanguageType eActLang )
+ {
+ if( !pDoc )
+ return;
+
+ if( xSpell.is() && !xSpell->hasLanguage( eActLang.get() ) )
+ pDoc->SetMissingDictionaries( true );
+ else
+ pDoc->SetMissingDictionaries( false );
+ }
+}
+
struct SwParaIdleData_Impl
{
SwWrongList* pWrong; // for spell checking
@@ -1054,6 +1070,7 @@ bool SwTextNode::Spell(SwSpellArgs* pArgs)
// get next language for next word, consider language attributes
// within the word
LanguageType eActLang = aScanner.GetCurrentLanguage();
+ DetectAndMarkMissingDictionaries( GetTextNode()->GetDoc(), pArgs->xSpeller, eActLang );
if( rWord.getLength() > 0 && LANGUAGE_NONE != eActLang )
{
@@ -1360,6 +1377,7 @@ SwRect SwTextFrame::AutoSpell_(SwTextNode & rNode, sal_Int32 nActPos)
// get next language for next word, consider language attributes
// within the word
LanguageType eActLang = aScanner.GetCurrentLanguage();
+ DetectAndMarkMissingDictionaries( pDoc, xSpell, eActLang );
bool bSpell = xSpell.is() && xSpell->hasLanguage( static_cast<sal_uInt16>(eActLang) );
if( bSpell && !rWord.isEmpty() )
diff --git a/sw/source/uibase/dialog/SwSpellDialogChildWindow.cxx b/sw/source/uibase/dialog/SwSpellDialogChildWindow.cxx
index 5502faa34954..0f6725fc64e8 100644
--- a/sw/source/uibase/dialog/SwSpellDialogChildWindow.cxx
+++ b/sw/source/uibase/dialog/SwSpellDialogChildWindow.cxx
@@ -405,20 +405,21 @@ The code below would only be part of the solution.
bCloseMessage = false; // no closing message if a wrap around has been denied
}
}
- if(aRet.empty())
+ bool bNoDictionaryAvailable = pWrtShell->GetDoc()->IsDictionaryMissing();
+ if( aRet.empty() && bCloseMessage && !bNoDictionaryAvailable )
{
- if(bCloseMessage)
- {
- LockFocusNotification( true );
- OUString sInfo(SwResId(STR_SPELLING_COMPLETED));
- // #i84610#
- std::unique_ptr<weld::MessageDialog> xBox(Application::CreateMessageDialog(GetWindow()->GetFrameWeld(),
- VclMessageType::Info, VclButtonsType::Ok, sInfo));
- xBox->run();
- LockFocusNotification( false );
- // take care that the now valid selection is stored
- LoseFocus();
- }
+ LockFocusNotification( true );
+ OUString sInfo( SwResId( STR_SPELLING_COMPLETED ) );
+ // #i84610#
+ std::unique_ptr<weld::MessageDialog> xBox(
+ Application::CreateMessageDialog( GetWindow()->GetFrameWeld(),
+ VclMessageType::Info,
+ VclButtonsType::Ok,
+ sInfo ) );
+ xBox->run();
+ LockFocusNotification( false );
+ // take care that the now valid selection is stored
+ LoseFocus();
}
}
return aRet;