LibreOffice Module linguistic (master) 1
gciterator.hxx
Go to the documentation of this file.
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 *
9 * This file incorporates work covered by the following license notice:
10 *
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 */
19
20#pragma once
21
22#include <com/sun/star/i18n/XBreakIterator.hpp>
23#include <com/sun/star/lang/XComponent.hpp>
24#include <com/sun/star/lang/XServiceInfo.hpp>
25#include <com/sun/star/lang/XEventListener.hpp>
26#include <com/sun/star/linguistic2/XProofreadingIterator.hpp>
27#include <com/sun/star/linguistic2/XLinguServiceEventListener.hpp>
28#include <com/sun/star/linguistic2/XLinguServiceEventBroadcaster.hpp>
29#include <com/sun/star/util/XChangesBatch.hpp>
30
32#include <osl/mutex.hxx>
33#include <osl/conditn.hxx>
34#include <osl/thread.h>
35
36#include <com/sun/star/uno/Any.hxx>
38#include <i18nlangtag/lang.h>
39
40#include <map>
41#include <optional>
42#include <utility>
43#include <deque>
44
45#include "defs.hxx"
46
47
48struct FPEntry
49{
50 // flat paragraph iterator
51 css::uno::Reference< css::text::XFlatParagraphIterator > m_xParaIterator;
52
53 // flat paragraph
54 css::uno::Reference< css::text::XFlatParagraph > m_xPara;
55
56 // document ID to identify different documents
57 OUString m_aDocId;
58
59 // the starting position to be checked
60 sal_Int32 m_nStartIndex;
61
62 // the flag to identify whether the document does automatic grammar checking
64
66 : m_aDocId()
67 , m_nStartIndex( 0 )
68 , m_bAutomatic( false )
69 {
70 }
71};
72
73
75 public cppu::WeakImplHelper
76 <
77 css::linguistic2::XProofreadingIterator,
78 css::linguistic2::XLinguServiceEventListener,
79 css::linguistic2::XLinguServiceEventBroadcaster,
80 css::lang::XComponent,
81 css::lang::XServiceInfo
82 >,
83 public LinguDispatcher
84{
85 //the queue is keeping track of all sentences to be checked
86 //every element of this queue is a FlatParagraphEntry struct-object
87 typedef std::deque< FPEntry > FPQueue_t;
88
89 // queue for entries to be processed
91
92 // the flag to end the endless loop
93 bool m_bEnd;
94
95 // Note that it must be the pointer and not the uno-reference to check if it is the same implementation object
96 typedef std::map< XComponent *, OUString > DocMap_t;
98
99
100 // BCP-47 language tag -> implname mapping
101 typedef std::map< OUString, OUString > GCImplNames_t;
103
104 // implname -> UNO reference mapping
105 typedef std::map< OUString, css::uno::Reference< css::linguistic2::XProofreader > > GCReferences_t;
107
111 osl::Condition m_aWakeUpThread;
112 oslThread m_thread;
113
115 static osl::Mutex& MyMutex();
118
119 css::uno::Reference< css::i18n::XBreakIterator > m_xBreakIterator;
120 mutable css::uno::Reference< css::util::XChangesBatch > m_xUpdateAccess;
121
122 void TerminateThread();
123
124 sal_Int32 NextDocId();
125 OUString GetOrCreateDocId( const css::uno::Reference< css::lang::XComponent > &xComp );
126
127 void AddEntry(
128 const css::uno::Reference< css::text::XFlatParagraphIterator >& xFlatParaIterator,
129 const css::uno::Reference< css::text::XFlatParagraph >& xFlatPara,
130 const OUString &rDocId, sal_Int32 nStartIndex, bool bAutomatic );
131
132 void ProcessResult( const css::linguistic2::ProofreadingResult &rRes,
133 const css::uno::Reference< css::text::XFlatParagraphIterator > &rxFlatParagraphIterator,
134 bool bIsAutomaticChecking );
135
136 sal_Int32 GetSuggestedEndOfSentence( const OUString &rText, sal_Int32 nSentenceStartPos, const css::lang::Locale &rLocale );
137
139 css::uno::Reference< css::linguistic2::XProofreader > GetGrammarChecker( css::lang::Locale & rLocale );
140
141 css::uno::Reference< css::util::XChangesBatch > const & GetUpdateAccess() const;
142
145
146 // Gets the grammar checker service, using fallback locales if necessary,
147 // and the BCP-47 tag for the updated locale, if the fallback was used.
148 // Precondition: MyMutex() is locked.
149 std::pair<OUString, std::optional<OUString>>
150 getServiceForLocale(const css::lang::Locale& rLocale) const;
151
152public:
153
154 void DequeueAndCheck();
155
156 explicit GrammarCheckingIterator();
157 virtual ~GrammarCheckingIterator() override;
158
159 // XProofreadingIterator
160 virtual void SAL_CALL startProofreading( const css::uno::Reference< css::uno::XInterface >& xDocument, const css::uno::Reference< css::text::XFlatParagraphIteratorProvider >& xIteratorProvider ) override;
161 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;
162 virtual void SAL_CALL resetIgnoreRules( ) override;
163 virtual sal_Bool SAL_CALL isProofreading( const css::uno::Reference< css::uno::XInterface >& xDocument ) override;
164
165 // XLinguServiceEventListener
166 virtual void SAL_CALL processLinguServiceEvent( const css::linguistic2::LinguServiceEvent& aLngSvcEvent ) override;
167
168 // XLinguServiceEventBroadcaster
169 virtual sal_Bool SAL_CALL addLinguServiceEventListener( const css::uno::Reference< css::linguistic2::XLinguServiceEventListener >& xLstnr ) override;
170 virtual sal_Bool SAL_CALL removeLinguServiceEventListener( const css::uno::Reference< css::linguistic2::XLinguServiceEventListener >& xLstnr ) override;
171
172 // XComponent
173 virtual void SAL_CALL dispose( ) override;
174 virtual void SAL_CALL addEventListener( const css::uno::Reference< css::lang::XEventListener >& xListener ) override;
175 virtual void SAL_CALL removeEventListener( const css::uno::Reference< css::lang::XEventListener >& aListener ) override;
176
177 // XEventListener
178 virtual void SAL_CALL disposing( const css::lang::EventObject& Source ) override;
179
180 // XServiceInfo
181 virtual OUString SAL_CALL getImplementationName( ) override;
182 virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override;
183 virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames( ) override;
184
185 // LinguDispatcher
186 virtual void SetServiceList( const css::lang::Locale &rLocale, const css::uno::Sequence< OUString > &rSvcImplNames ) override;
187 virtual css::uno::Sequence< OUString > GetServiceList( const css::lang::Locale &rLocale ) const override;
188};
189
190
193class LngXStringKeyMap : public ::cppu::WeakImplHelper<css::container::XStringKeyMap>
194{
195public:
197
198 virtual css::uno::Any SAL_CALL getValue(const OUString& aKey) override;
199 virtual sal_Bool SAL_CALL hasValue(const OUString& aKey) override;
200 virtual void SAL_CALL insertValue(const OUString& aKey, const css::uno::Any& aValue) override;
201 virtual ::sal_Int32 SAL_CALL getCount() override;
202 virtual OUString SAL_CALL getKeyByIndex(::sal_Int32 nIndex) override;
203 virtual css::uno::Any SAL_CALL getValueByIndex(::sal_Int32 nIndex) override;
204
205private:
207 void operator=(LngXStringKeyMap const &) = delete;
208
209 ~LngXStringKeyMap() override{};
210
211 std::map<OUString, css::uno::Any> maMap;
212};
213
214/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
virtual sal_Bool SAL_CALL addLinguServiceEventListener(const css::uno::Reference< css::linguistic2::XLinguServiceEventListener > &xLstnr) override
Definition: gciterator.cxx:973
GrammarCheckingIterator(const GrammarCheckingIterator &)=delete
comphelper::OInterfaceContainerHelper3< css::lang::XEventListener > m_aEventListeners
Definition: gciterator.hxx:116
css::uno::Reference< css::linguistic2::XProofreader > GetGrammarChecker(css::lang::Locale &rLocale)
Definition: gciterator.cxx:509
virtual sal_Bool SAL_CALL removeLinguServiceEventListener(const css::uno::Reference< css::linguistic2::XLinguServiceEventListener > &xLstnr) override
Definition: gciterator.cxx:984
virtual OUString SAL_CALL getImplementationName() override
std::map< OUString, css::uno::Reference< css::linguistic2::XProofreader > > GCReferences_t
Definition: gciterator.hxx:105
virtual void SAL_CALL dispose() override
Definition: gciterator.cxx:995
virtual sal_Bool SAL_CALL isProofreading(const css::uno::Reference< css::uno::XInterface > &xDocument) override
Definition: gciterator.cxx:902
std::deque< FPEntry > FPQueue_t
Definition: gciterator.hxx:87
GCReferences_t m_aGCReferencesByService
Definition: gciterator.hxx:106
virtual ~GrammarCheckingIterator() override
Definition: gciterator.cxx:292
virtual css::uno::Sequence< OUString > GetServiceList(const css::lang::Locale &rLocale) const override
std::map< OUString, OUString > GCImplNames_t
Definition: gciterator.hxx:101
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)
Definition: gciterator.cxx:347
virtual void SAL_CALL processLinguServiceEvent(const css::linguistic2::LinguServiceEvent &aLngSvcEvent) override
Definition: gciterator.cxx:947
comphelper::OInterfaceContainerHelper3< css::linguistic2::XLinguServiceEventListener > m_aNotifyListeners
Definition: gciterator.hxx:117
static osl::Mutex & MyMutex()
beware of initialization order!
Definition: gciterator.cxx:275
virtual void SAL_CALL disposing(const css::lang::EventObject &Source) override
std::map< XComponent *, OUString > DocMap_t
Definition: gciterator.hxx:96
virtual sal_Bool SAL_CALL supportsService(const OUString &ServiceName) override
virtual void SAL_CALL startProofreading(const css::uno::Reference< css::uno::XInterface > &xDocument, const css::uno::Reference< css::text::XFlatParagraphIteratorProvider > &xIteratorProvider) override
Definition: gciterator.cxx:739
void ProcessResult(const css::linguistic2::ProofreadingResult &rRes, const css::uno::Reference< css::text::XFlatParagraphIterator > &rxFlatParagraphIterator, bool bIsAutomaticChecking)
Definition: gciterator.cxx:377
std::pair< OUString, std::optional< OUString > > getServiceForLocale(const css::lang::Locale &rLocale) const
Definition: gciterator.cxx:488
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)
Definition: gciterator.cxx:322
osl::Condition m_aWakeUpThread
Definition: gciterator.hxx:111
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
Definition: gciterator.cxx:763
css::uno::Reference< css::util::XChangesBatch > const & GetUpdateAccess() const
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
Definition: gciterator.hxx:120
css::uno::Reference< css::i18n::XBreakIterator > m_xBreakIterator
Definition: gciterator.hxx:119
virtual void SAL_CALL resetIgnoreRules() override
Definition: gciterator.cxx:891
GrammarCheckingIterator & operator=(const GrammarCheckingIterator &)=delete
sal_Int32 GetSuggestedEndOfSentence(const OUString &rText, sal_Int32 nSentenceStartPos, const css::lang::Locale &rLocale)
Definition: gciterator.cxx:849
GCImplNames_t m_aGCImplNamesByLang
Definition: gciterator.hxx:102
Implementation of the css::container::XStringKeyMap interface.
Definition: gciterator.hxx:194
virtual css::uno::Any SAL_CALL getValueByIndex(::sal_Int32 nIndex) override
Definition: gciterator.cxx:266
void operator=(LngXStringKeyMap const &)=delete
virtual OUString SAL_CALL getKeyByIndex(::sal_Int32 nIndex) override
Definition: gciterator.cxx:258
virtual sal_Bool SAL_CALL hasValue(const OUString &aKey) override
Definition: gciterator.cxx:251
LngXStringKeyMap(LngXStringKeyMap const &)=delete
virtual css::uno::Any SAL_CALL getValue(const OUString &aKey) override
Definition: gciterator.cxx:242
virtual void SAL_CALL insertValue(const OUString &aKey, const css::uno::Any &aValue) override
Definition: gciterator.cxx:233
virtual ::sal_Int32 SAL_CALL getCount() override
Definition: gciterator.cxx:256
~LngXStringKeyMap() override
Definition: gciterator.hxx:209
std::map< OUString, css::uno::Any > maMap
Definition: gciterator.hxx:209
sal_Int32 nIndex
bool m_bAutomatic
Definition: gciterator.hxx:63
css::uno::Reference< css::text::XFlatParagraphIterator > m_xParaIterator
Definition: gciterator.hxx:51
css::uno::Reference< css::text::XFlatParagraph > m_xPara
Definition: gciterator.hxx:54
sal_Int32 m_nStartIndex
Definition: gciterator.hxx:60
OUString m_aDocId
Definition: gciterator.hxx:57
unsigned char sal_Bool