21#include <com/sun/star/beans/XPropertySet.hpp>
22#include <com/sun/star/container/ElementExistException.hpp>
23#include <com/sun/star/container/XNameAccess.hpp>
24#include <com/sun/star/configuration/theDefaultProvider.hpp>
25#include <com/sun/star/i18n/BreakIterator.hpp>
26#include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
27#include <com/sun/star/lang/XComponent.hpp>
28#include <com/sun/star/lang/XServiceInfo.hpp>
29#include <com/sun/star/lang/XMultiServiceFactory.hpp>
30#include <com/sun/star/linguistic2/XSupportedLocales.hpp>
31#include <com/sun/star/linguistic2/XProofreader.hpp>
32#include <com/sun/star/linguistic2/XProofreadingIterator.hpp>
33#include <com/sun/star/linguistic2/SingleProofreadingError.hpp>
34#include <com/sun/star/linguistic2/ProofreadingResult.hpp>
35#include <com/sun/star/linguistic2/LinguServiceEvent.hpp>
36#include <com/sun/star/linguistic2/LinguServiceEventFlags.hpp>
37#include <com/sun/star/text/TextMarkupType.hpp>
38#include <com/sun/star/text/TextMarkupDescriptor.hpp>
39#include <com/sun/star/text/XMultiTextMarkup.hpp>
40#include <com/sun/star/text/XFlatParagraph.hpp>
41#include <com/sun/star/text/XFlatParagraphIterator.hpp>
42#include <com/sun/star/uno/XComponentContext.hpp>
47#include <osl/conditn.hxx>
140 const sal_Int32 nLen = rText.getLength();
141 bool bIllegalArgument =
false;
144 bIllegalArgument =
true;
147 if (nStartPos > nLen)
149 bIllegalArgument =
true;
152 if (bIllegalArgument)
154 SAL_WARN(
"linguistic",
"lcl_SkipWhiteSpaces: illegal arguments" );
157 sal_Int32 nRes = nStartPos;
158 if (0 <= nStartPos && nStartPos < nLen)
160 const sal_Unicode*
const pEnd = rText.getStr() + nLen;
161 const sal_Unicode *pText = rText.getStr() + nStartPos;
164 nRes = pText - rText.getStr();
167 DBG_ASSERT( 0 <= nRes && nRes <= nLen,
"lcl_SkipWhiteSpaces return value out of range" );
176 const sal_Int32 nLen = rText.getLength();
177 bool bIllegalArgument =
false;
180 bIllegalArgument =
true;
183 if (nStartPos > nLen)
185 bIllegalArgument =
true;
188 if (bIllegalArgument)
190 SAL_WARN(
"linguistic",
"lcl_BacktraceWhiteSpaces: illegal arguments" );
193 sal_Int32 nRes = nStartPos;
194 sal_Int32 nPosBefore = nStartPos - 1;
196 if (0 <= nPosBefore && nPosBefore < nLen &&
lcl_IsWhiteSpace( pStart[ nPosBefore ] ))
198 nStartPos = nPosBefore;
199 const sal_Unicode *pText = rText.getStr() + nStartPos;
203 nRes = pText - pStart + 1;
206 DBG_ASSERT( 0 <= nRes && nRes <= nLen,
"lcl_BacktraceWhiteSpaces return value out of range" );
215 osl_setThreadName(
"GrammarCheckingIterator");
223 const uno::Reference< text::XFlatParagraph >& xFlatPara,
224 sal_Int32 nStartIndex )
227 return xFlatPara->getLanguageOfText( nStartIndex, 1 );
235 std::map<OUString, css::uno::Any>::const_iterator aIter =
maMap.find(aKey);
236 if (aIter !=
maMap.end())
237 throw css::container::ElementExistException();
239 maMap[aKey] = aValue;
244 std::map<OUString, css::uno::Any>::const_iterator aIter =
maMap.find(aKey);
245 if (aIter ==
maMap.end())
246 throw css::container::NoSuchElementException();
248 return (*aIter).second;
261 throw css::lang::IndexOutOfBoundsException();
269 throw css::lang::IndexOutOfBoundsException();
271 return css::uno::Any();
277 static osl::Mutex SINGLETON;
283 m_bGCServicesChecked( false ),
284 m_nDocIdCounter( 0 ),
286 m_aEventListeners( MyMutex() ),
287 m_aNotifyListeners( MyMutex() )
301 ::osl::Guard< ::osl::Mutex > aGuard(
MyMutex() );
309 osl_joinWithThread(
t);
310 osl_destroyThread(
t);
316 ::osl::Guard< ::osl::Mutex > aGuard(
MyMutex() );
323 const uno::Reference< lang::XComponent > &xComponent )
338 aRes = OUString::number( nRes );
340 xComponent->addEventListener(
this );
348 const uno::Reference< text::XFlatParagraphIterator >& xFlatParaIterator,
349 const uno::Reference< text::XFlatParagraph >& xFlatPara,
350 const OUString & rDocId,
351 sal_Int32 nStartIndex,
361 aNewFPEntry.
m_xPara = xFlatPara;
367 ::osl::Guard< ::osl::Mutex > aGuard(
MyMutex() );
378 const linguistic2::ProofreadingResult &rRes,
379 const uno::Reference< text::XFlatParagraphIterator > &rxFlatParagraphIterator,
380 bool bIsAutomaticChecking )
382 DBG_ASSERT( rRes.xFlatParagraph.is(),
"xFlatParagraph is missing" );
384 bool bContinueWithNextPara =
false;
385 if (!rRes.xFlatParagraph.is() || rRes.xFlatParagraph->isModified())
388 bContinueWithNextPara =
true;
394 sal_Int32 nTextLen = rRes.aText.getLength();
395 bool bBoundariesOk = 0 <= rRes.nStartOfSentencePosition && rRes.nStartOfSentencePosition <= nTextLen &&
396 0 <= rRes.nBehindEndOfSentencePosition && rRes.nBehindEndOfSentencePosition <= nTextLen &&
397 0 <= rRes.nStartOfNextSentencePosition && rRes.nStartOfNextSentencePosition <= nTextLen &&
398 rRes.nStartOfSentencePosition <= rRes.nBehindEndOfSentencePosition &&
399 rRes.nBehindEndOfSentencePosition <= rRes.nStartOfNextSentencePosition;
400 DBG_ASSERT( bBoundariesOk,
"inconsistent sentence boundaries" );
402 uno::Reference< text::XMultiTextMarkup > xMulti( rRes.xFlatParagraph, uno::UNO_QUERY );
408 sal_Int32 nErrors = rRes.aErrors.getLength();
409 uno::Sequence< text::TextMarkupDescriptor > aDescriptors( nErrors + 1 );
410 text::TextMarkupDescriptor * pDescriptors = aDescriptors.getArray();
413 for (
const linguistic2::SingleProofreadingError &rError : rRes.aErrors)
415 text::TextMarkupDescriptor &rDesc = *pDescriptors++;
417 rDesc.nType = rError.nErrorType;
418 rDesc.nOffset = rError.nErrorStart;
419 rDesc.nLength = rError.nErrorLength;
425 if (rDesc.nType == text::TextMarkupType::SPELLCHECK)
426 rDesc.nType = text::TextMarkupType::PROOFREADING;
428 uno::Reference< container::XStringKeyMap > xKeyMap(
430 for(
const beans::PropertyValue& rProperty : rError.aProperties )
432 if ( rProperty.Name ==
"LineColor" )
434 xKeyMap->insertValue(rProperty.Name,
436 rDesc.xMarkupInfoContainer = xKeyMap;
438 else if ( rProperty.Name ==
"LineType" )
440 xKeyMap->insertValue(rProperty.Name,
442 rDesc.xMarkupInfoContainer = xKeyMap;
449 const sal_Int32 nSentenceLength = rRes.nStartOfNextSentencePosition - rRes.nStartOfSentencePosition;
450 pDescriptors->nType = text::TextMarkupType::SENTENCE;
451 pDescriptors->nOffset = rRes.nStartOfSentencePosition;
452 pDescriptors->nLength = nSentenceLength;
454 xMulti->commitMultiTextMarkup( aDescriptors ) ;
456 catch (lang::IllegalArgumentException &)
463 if (rRes.nStartOfNextSentencePosition < rRes.aText.getLength())
465 AddEntry( rxFlatParagraphIterator, rRes.xFlatParagraph, rRes.aDocumentIdentifier, rRes.nStartOfNextSentencePosition, bIsAutomaticChecking );
470 if (rRes.xFlatParagraph.is())
471 rRes.xFlatParagraph->setChecked( text::TextMarkupType::PROOFREADING,
true );
473 bContinueWithNextPara =
true;
477 if (bContinueWithNextPara)
480 if (rxFlatParagraphIterator.is())
481 AddEntry(rxFlatParagraphIterator, rxFlatParagraphIterator->getNextPara(),
482 rRes.aDocumentIdentifier, 0, bIsAutomaticChecking);
487std::pair<OUString, std::optional<OUString>>
490 if (!rLocale.Language.isEmpty())
495 return { aLangIt->second, {} };
497 for (
const auto& sFallbackBcp47 :
LanguageTag(rLocale).getFallbackStrings(
false))
501 return { aLangIt->second, sFallbackBcp47 };
510 lang::Locale &rLocale )
512 uno::Reference< linguistic2::XProofreader > xRes;
515 ::osl::Guard< ::osl::Mutex > aGuard(
MyMutex() );
525 !aSvcImplName.isEmpty())
532 xRes = aImplNameIt->second;
539 uno::Reference< linguistic2::XProofreader > xGC(
540 xContext->getServiceManager()->createInstanceWithContext(aSvcImplName, xContext),
541 uno::UNO_QUERY_THROW );
542 uno::Reference< linguistic2::XSupportedLocales > xSuppLoc( xGC, uno::UNO_QUERY_THROW );
544 if (xSuppLoc->hasLocale( rLocale ))
549 uno::Reference< linguistic2::XLinguServiceEventBroadcaster > xBC( xGC, uno::UNO_QUERY );
551 xBC->addLinguServiceEventListener(
this );
555 SAL_WARN(
"linguistic",
"grammar checker does not support required locale" );
558 catch (uno::Exception &)
560 SAL_WARN(
"linguistic",
"instantiating grammar checker failed" );
566 SAL_INFO(
"linguistic",
"No grammar checker found for \""
574static uno::Sequence<beans::PropertyValue>
577 uno::Reference<beans::XPropertySet>
const xProps(
578 xFlatPara, uno::UNO_QUERY_THROW);
579 css::uno::Any
a (nProofInfo);
581 {
"FieldPositions", xProps->getPropertyValue(
"FieldPositions") },
582 {
"FootnotePositions", xProps->getPropertyValue(
"FootnotePositions") },
583 {
"SortedTextId", xProps->getPropertyValue(
"SortedTextId") },
584 {
"DocumentElementsCount", xProps->getPropertyValue(
"DocumentElementsCount") },
594 bool bQueueEmpty =
false;
596 ::osl::Guard< ::osl::Mutex > aGuard(
MyMutex() );
607 uno::Reference< text::XFlatParagraphIterator > xFPIterator;
608 uno::Reference< text::XFlatParagraph > xFlatPara;
613 ::osl::Guard< ::osl::Mutex > aGuard(
MyMutex() );
616 xFlatPara = aFPEntryItem.
m_xPara;
624 if (xFlatPara.is() && xFPIterator.is())
628 OUString aCurTxt( xFlatPara->getText() );
631 const bool bModified = xFlatPara->isModified();
634 linguistic2::ProofreadingResult aRes;
638 osl::ClearableMutexGuard aGuard(
MyMutex());
641 sal_Int32 nSuggestedEnd
643 DBG_ASSERT((nSuggestedEnd == 0 && aCurTxt.isEmpty())
644 || nSuggestedEnd > nStartPos,
645 "nSuggestedEndOfSentencePos calculation failed?");
647 uno::Reference<linguistic2::XProofreader> xGC =
652 uno::Sequence<beans::PropertyValue>
const aProps(
654 aRes = xGC->doProofreading(aCurDocId, aCurTxt, aCurLocale,
655 nStartPos, nSuggestedEnd, aProps);
659 if (aRes.nBehindEndOfSentencePosition <= nStartPos
660 && aRes.nBehindEndOfSentencePosition != nSuggestedEnd)
664 "!! Grammarchecker failed to provide end of sentence !!");
665 aRes.nBehindEndOfSentencePosition = nSuggestedEnd;
668 aRes.xFlatParagraph = xFlatPara;
669 aRes.nStartOfSentencePosition = nStartPos;
675 aRes.aDocumentIdentifier = aCurDocId;
676 aRes.xFlatParagraph = xFlatPara;
677 aRes.aText = aCurTxt;
678 aRes.aLocale = aCurLocale;
679 aRes.nStartOfSentencePosition = nStartPos;
680 aRes.nBehindEndOfSentencePosition = nSuggestedEnd;
682 aRes.nStartOfNextSentencePosition
685 aCurTxt, aRes.nStartOfNextSentencePosition);
696 uno::Reference< text::XFlatParagraph > xFlatParaNext( xFPIterator->getNextPara() );
700 catch (css::uno::Exception &)
708 ::osl::Guard< ::osl::Mutex > aGuard(
MyMutex() );
717 ::osl::Guard< ::osl::Mutex > aGuard(
MyMutex() );
740 const uno::Reference< ::uno::XInterface > & xDoc,
741 const uno::Reference< text::XFlatParagraphIteratorProvider > & xIteratorProvider )
744 const bool bAutomatic =
true;
745 uno::Reference<text::XFlatParagraphIterator> xFPIterator = xIteratorProvider->getFlatParagraphIterator(
746 text::TextMarkupType::PROOFREADING, bAutomatic );
747 uno::Reference< text::XFlatParagraph > xPara( xFPIterator.is()? xFPIterator->getFirstPara() :
nullptr );
748 uno::Reference< lang::XComponent > xComponent( xDoc, uno::UNO_QUERY );
751 ::osl::Guard< ::osl::Mutex > aGuard(
MyMutex() );
752 if (xPara.is() && xComponent.is())
757 AddEntry( xFPIterator, xPara, aDocId, 0, bAutomatic );
764 const uno::Reference< uno::XInterface >& xDoc,
765 const uno::Reference< text::XFlatParagraph >& xFlatPara,
766 const OUString& rText,
768 sal_Int32 nStartOfSentencePos,
769 sal_Int32 nSuggestedEndOfSentencePos,
770 sal_Int32 nErrorPosInPara )
774 linguistic2::ProofreadingResult aRes;
776 uno::Reference< lang::XComponent > xComponent( xDoc, uno::UNO_QUERY );
777 if (xFlatPara.is() && xComponent.is() &&
778 ( nErrorPosInPara < 0 || nErrorPosInPara < rText.getLength()))
781 linguistic2::ProofreadingResult aTmpRes;
782 sal_Int32 nStartPos = nStartOfSentencePos >= 0 ? nStartOfSentencePos : 0;
788 sal_Int32 nOldStartOfSentencePos = nStartPos;
789 uno::Reference< linguistic2::XProofreader > xGC;
794 ::osl::Guard< ::osl::Mutex > aGuard(
MyMutex() );
797 DBG_ASSERT( nSuggestedEndOfSentencePos > nStartPos,
"nSuggestedEndOfSentencePos calculation failed?" );
802 sal_Int32 nEndPos = -1;
805 uno::Sequence<beans::PropertyValue>
const aProps(
807 aTmpRes = xGC->doProofreading( aDocId, rText,
808 aCurLocale, nStartPos, nSuggestedEndOfSentencePos, aProps );
812 if (aTmpRes.nBehindEndOfSentencePosition <= nStartPos)
814 SAL_WARN(
"linguistic",
"!! Grammarchecker failed to provide end of sentence !!" );
815 aTmpRes.nBehindEndOfSentencePosition = nSuggestedEndOfSentencePos;
818 aTmpRes.xFlatParagraph = xFlatPara;
819 aTmpRes.nStartOfSentencePosition = nStartPos;
820 nEndPos = aTmpRes.nBehindEndOfSentencePosition;
822 if ((nErrorPosInPara< 0 || nStartPos <= nErrorPosInPara) && nErrorPosInPara < nEndPos)
826 nEndPos = nSuggestedEndOfSentencePos;
828 aTmpRes.nBehindEndOfSentencePosition = nEndPos;
829 aTmpRes.nStartOfNextSentencePosition = nStartPos;
833 if (nStartPos <= nOldStartOfSentencePos)
835 SAL_WARN(
"linguistic",
"end-of-sentence detection failed?" );
836 nStartPos = nOldStartOfSentencePos + 1;
839 while (!bFound && nStartPos < rText.getLength());
841 if (bFound && !xFlatPara->isModified())
850 const OUString &rText,
851 sal_Int32 nSentenceStartPos,
852 const lang::Locale &rLocale )
858 uno::Reference< uno::XComponentContext > xContext = ::comphelper::getProcessComponentContext();
861 sal_Int32 nTextLen = rText.getLength();
862 sal_Int32 nEndPosition(0);
863 sal_Int32 nTmpStartPos = nSentenceStartPos;
866 sal_Int32
const nPrevEndPosition(nEndPosition);
867 nEndPosition = nTextLen;
868 if (nTmpStartPos < nTextLen)
870 nEndPosition =
m_xBreakIterator->endOfSentence( rText, nTmpStartPos, rLocale );
871 if (nEndPosition <= nPrevEndPosition)
876 nEndPosition = nTextLen;
879 if (nEndPosition < 0)
880 nEndPosition = nTextLen;
884 while (nEndPosition <= nSentenceStartPos && nEndPosition < nTextLen);
885 if (nEndPosition > nTextLen)
886 nEndPosition = nTextLen;
895 uno::Reference< linguistic2::XProofreader > xGC(elem.second);
897 xGC->resetIgnoreRules();
903 const uno::Reference< uno::XInterface >& xDoc )
906 ::osl::Guard< ::osl::Mutex > aGuard(
MyMutex() );
910 uno::Reference< lang::XComponent > xComponent( xDoc, uno::UNO_QUERY );
917 const DocMap_t::const_iterator aIt(
m_aDocIdMap.find( xComponent.get() ) );
921 OUString aDocId = aIt->second;
933 for (sal_Int32
i = 0;
i < nSize && !bRes; ++
i)
948 const linguistic2::LinguServiceEvent& rLngSvcEvent )
950 if (rLngSvcEvent.nEvent != linguistic2::LinguServiceEventFlags::PROOFREAD_AGAIN)
955 uno::Reference< uno::XInterface > xThis( getXWeak() );
956 linguistic2::LinguServiceEvent
aEvent( xThis, linguistic2::LinguServiceEventFlags::PROOFREAD_AGAIN );
958 &linguistic2::XLinguServiceEventListener::processLinguServiceEvent,
961 catch (uno::RuntimeException &)
965 catch (const ::uno::Exception &)
974 const uno::Reference< linguistic2::XLinguServiceEventListener >& xListener )
985 const uno::Reference< linguistic2::XLinguServiceEventListener >& xListener )
997 lang::EventObject aEvt(
static_cast<linguistic2::XProofreadingIterator *
>(
this) );
1004 ::osl::Guard< ::osl::Mutex > aGuard(
MyMutex() );
1023 const uno::Reference< lang::XEventListener >& xListener )
1033 const uno::Reference< lang::XEventListener >& xListener )
1052 uno::Reference< lang::XComponent > xDoc( rSource.Source, uno::UNO_QUERY );
1056 ::osl::Guard< ::osl::Mutex > aGuard(
MyMutex() );
1071 uno::Reference< lang::XMultiServiceFactory > xConfigurationProvider =
1072 configuration::theDefaultProvider::get( xContext );
1075 beans::PropertyValue aValue;
1076 aValue.Name =
"nodepath";
1077 aValue.Value <<= OUString(
"org.openoffice.Office.Linguistic/ServiceManager");
1078 uno::Sequence< uno::Any > aProps{
uno::Any(aValue) };
1080 xConfigurationProvider->createInstanceWithArguments(
1081 "com.sun.star.configuration.ConfigurationUpdateAccess", aProps ),
1082 uno::UNO_QUERY_THROW );
1084 catch (uno::Exception &)
1100 uno::Reference< container::XNameAccess > xNA(
GetUpdateAccess(), uno::UNO_QUERY_THROW );
1101 xNA.set( xNA->getByName(
"GrammarCheckerList" ), uno::UNO_QUERY_THROW );
1102 const uno::Sequence< OUString > aElementNames( xNA->getElementNames() );
1104 for (
const OUString& rElementName : aElementNames)
1106 uno::Sequence< OUString > aImplNames;
1107 uno::Any aTmp( xNA->getByName( rElementName ) );
1108 if (aTmp >>= aImplNames)
1110 if (aImplNames.hasElements())
1113 const OUString aImplName( aImplNames[0] );
1114 aTmpGCImplNamesByLang[rElementName] = aImplName;
1119 SAL_WARN(
"linguistic",
"failed to get aImplNames. Wrong type?" );
1123 catch (uno::Exception
const &)
1130 ::osl::Guard< ::osl::Mutex > aGuard(
MyMutex() );
1138 const OUString & rServiceName )
1146 return "com.sun.star.lingu2.ProofreadingIterator";
1152 return {
"com.sun.star.linguistic2.ProofreadingIterator" };
1157 const lang::Locale &rLocale,
1158 const uno::Sequence< OUString > &rSvcImplNames )
1160 ::osl::Guard< ::osl::Mutex > aGuard(
MyMutex() );
1164 if (rSvcImplNames.hasElements())
1165 aImplName = rSvcImplNames[0];
1169 if (!aImplName.isEmpty())
1178 const lang::Locale &rLocale )
const
1180 ::osl::Guard< ::osl::Mutex > aGuard(
MyMutex() );
1184 if (!aImplName.isEmpty())
1185 return { aImplName };
1190extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
1192 css::uno::XComponentContext* , css::uno::Sequence<css::uno::Any>
const&)
virtual sal_Bool SAL_CALL addLinguServiceEventListener(const css::uno::Reference< css::linguistic2::XLinguServiceEventListener > &xLstnr) override
comphelper::OInterfaceContainerHelper3< css::lang::XEventListener > m_aEventListeners
css::uno::Reference< css::linguistic2::XProofreader > GetGrammarChecker(css::lang::Locale &rLocale)
void GetConfiguredGCSvcs_Impl()
virtual sal_Bool SAL_CALL removeLinguServiceEventListener(const css::uno::Reference< css::linguistic2::XLinguServiceEventListener > &xLstnr) override
FPQueue_t m_aFPEntriesQueue
virtual OUString SAL_CALL getImplementationName() override
std::map< OUString, css::uno::Reference< css::linguistic2::XProofreader > > GCReferences_t
virtual void SAL_CALL dispose() override
virtual sal_Bool SAL_CALL isProofreading(const css::uno::Reference< css::uno::XInterface > &xDocument) override
std::deque< FPEntry > FPQueue_t
GCReferences_t m_aGCReferencesByService
virtual ~GrammarCheckingIterator() override
virtual css::uno::Sequence< OUString > GetServiceList(const css::lang::Locale &rLocale) const override
std::map< OUString, OUString > GCImplNames_t
void AddEntry(const css::uno::Reference< css::text::XFlatParagraphIterator > &xFlatParaIterator, const css::uno::Reference< css::text::XFlatParagraph > &xFlatPara, const OUString &rDocId, sal_Int32 nStartIndex, bool bAutomatic)
virtual void SAL_CALL processLinguServiceEvent(const css::linguistic2::LinguServiceEvent &aLngSvcEvent) override
comphelper::OInterfaceContainerHelper3< css::linguistic2::XLinguServiceEventListener > m_aNotifyListeners
static osl::Mutex & MyMutex()
beware of initialization order!
virtual void SAL_CALL disposing(const css::lang::EventObject &Source) override
std::map< XComponent *, OUString > DocMap_t
virtual sal_Bool SAL_CALL supportsService(const OUString &ServiceName) override
OUString m_aCurCheckedDocId
virtual void SAL_CALL startProofreading(const css::uno::Reference< css::uno::XInterface > &xDocument, const css::uno::Reference< css::text::XFlatParagraphIteratorProvider > &xIteratorProvider) override
void ProcessResult(const css::linguistic2::ProofreadingResult &rRes, const css::uno::Reference< css::text::XFlatParagraphIterator > &rxFlatParagraphIterator, bool bIsAutomaticChecking)
std::pair< OUString, std::optional< OUString > > getServiceForLocale(const css::lang::Locale &rLocale) const
virtual void SetServiceList(const css::lang::Locale &rLocale, const css::uno::Sequence< OUString > &rSvcImplNames) override
OUString GetOrCreateDocId(const css::uno::Reference< css::lang::XComponent > &xComp)
osl::Condition m_aWakeUpThread
virtual void SAL_CALL removeEventListener(const css::uno::Reference< css::lang::XEventListener > &aListener) override
virtual css::linguistic2::ProofreadingResult SAL_CALL checkSentenceAtPosition(const css::uno::Reference< css::uno::XInterface > &xDocument, const css::uno::Reference< css::text::XFlatParagraph > &xFlatParagraph, const OUString &aText, const css::lang::Locale &aLocale, ::sal_Int32 nStartOfSentencePosition, ::sal_Int32 nSuggestedBehindEndOfSentencePosition, ::sal_Int32 nErrorPositionInParagraph) override
css::uno::Reference< css::util::XChangesBatch > const & GetUpdateAccess() const
GrammarCheckingIterator()
virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override
virtual void SAL_CALL addEventListener(const css::uno::Reference< css::lang::XEventListener > &xListener) override
css::uno::Reference< css::util::XChangesBatch > m_xUpdateAccess
bool m_bGCServicesChecked
sal_Int32 m_nDocIdCounter
css::uno::Reference< css::i18n::XBreakIterator > m_xBreakIterator
virtual void SAL_CALL resetIgnoreRules() override
sal_Int32 GetSuggestedEndOfSentence(const OUString &rText, sal_Int32 nSentenceStartPos, const css::lang::Locale &rLocale)
GCImplNames_t m_aGCImplNamesByLang
static css::lang::Locale convertToLocale(LanguageType nLangID, bool bResolveSystem=true)
static OUString convertToBcp47(LanguageType nLangID)
Implementation of the css::container::XStringKeyMap interface.
virtual css::uno::Any SAL_CALL getValueByIndex(::sal_Int32 nIndex) override
virtual OUString SAL_CALL getKeyByIndex(::sal_Int32 nIndex) override
virtual sal_Bool SAL_CALL hasValue(const OUString &aKey) override
virtual css::uno::Any SAL_CALL getValue(const OUString &aKey) override
virtual void SAL_CALL insertValue(const OUString &aKey, const css::uno::Any &aValue) override
virtual ::sal_Int32 SAL_CALL getCount() override
std::map< OUString, css::uno::Any > maMap
sal_Int32 addInterface(const css::uno::Reference< ListenerT > &rxIFace)
void disposeAndClear(const css::lang::EventObject &rEvt)
sal_Int32 removeInterface(const css::uno::Reference< ListenerT > &rxIFace)
void notifyEach(void(SAL_CALL ListenerT::*NotificationMethod)(const EventT &), const EventT &Event)
#define DBG_ASSERT(sCon, aError)
#define TOOLS_WARN_EXCEPTION(area, stream)
const sal_Unicode aWhiteSpaces[]
static uno::Sequence< beans::PropertyValue > lcl_makeProperties(uno::Reference< text::XFlatParagraph > const &xFlatPara, sal_Int32 nProofInfo)
const sal_Int32 PROOFINFO_MARK_PARAGRAPH
static bool lcl_IsWhiteSpace(sal_Unicode cChar)
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * linguistic_GrammarCheckingIterator_get_implementation(css::uno::XComponentContext *, css::uno::Sequence< css::uno::Any > const &)
static sal_Int32 lcl_BacktraceWhiteSpaces(const OUString &rText, sal_Int32 nStartPos)
static void lcl_workerfunc(void *gci)
static sal_Int32 lcl_SkipWhiteSpaces(const OUString &rText, sal_Int32 nStartPos)
const sal_Int32 PROOFINFO_GET_PROOFRESULT
static lang::Locale lcl_GetPrimaryLanguageOfSentence(const uno::Reference< text::XFlatParagraph > &xFlatPara, sal_Int32 nStartIndex)
#define SAL_WARN(area, stream)
#define SAL_INFO(area, stream)
#define SAL_N_ELEMENTS(arr)
Reference< XComponentContext > getProcessComponentContext()
css::uno::Sequence< css::beans::PropertyValue > InitPropertySequence(::std::initializer_list< ::std::pair< OUString, css::uno::Any > > vInit)
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)
bool LinguIsUnspecified(LanguageType nLanguage)
Checks if a LanguageType is one of the values that denote absence of language or undetermined languag...
constexpr std::enable_if_t< std::is_signed_v< T >, std::make_unsigned_t< T > > make_unsigned(T value)
css::uno::Reference< css::text::XFlatParagraphIterator > m_xParaIterator
css::uno::Reference< css::text::XFlatParagraph > m_xPara