22#include <osl/file.hxx>
33#include <com/sun/star/frame/XStorable.hpp>
34#include <com/sun/star/uno/Reference.h>
35#include <com/sun/star/linguistic2/DictionaryEventFlags.hpp>
36#include <com/sun/star/linguistic2/DictionaryListEventFlags.hpp>
37#include <com/sun/star/ucb/SimpleFileAccess.hpp>
38#include <svtools/strings.hrc>
58static void AddInternal(
const uno::Reference< XDictionary > &rDic,
59 const OUString& rNew );
60static void AddUserData(
const uno::Reference< XDictionary > &rDic );
64 public cppu::WeakImplHelper
66 XDictionaryEventListener
81 disposing(
const EventObject& rSource )
override;
91 const uno::Reference< XDictionaryListEventListener >& rxListener );
93 const uno::Reference< XDictionaryListEventListener >& rxListener );
102 uno::Reference< XDictionaryList > xDicList ) :
104 xMyDicList (
std::move( xDicList )),
105 nCondensedEvt(0), nNumCollectEvtListeners(0)
113 "lng : event listeners are still existing");
127 uno::Reference< XDictionaryListEventListener > xSrc( rSource.Source, UNO_QUERY );
136 uno::Reference< XDictionary > xDic( rSource.Source, UNO_QUERY );
145 const DictionaryEvent& rDicEvent )
149 uno::Reference< XDictionary > xDic( rDicEvent.Source, UNO_QUERY );
150 DBG_ASSERT(xDic.is(),
"lng : missing event source");
155 (DictionaryEventFlags::ADD_ENTRY | DictionaryEventFlags::DEL_ENTRY))
156 || rDicEvent.xDictionaryEntry.is(),
157 "lng : missing dictionary entry" );
160 DictionaryType eDicType = xDic->getDictionaryType();
162 "lng : unexpected dictionary type");
163 if ((rDicEvent.nEvent & DictionaryEventFlags::ADD_ENTRY) && xDic->isActive())
165 DictionaryListEventFlags::ADD_NEG_ENTRY :
166 DictionaryListEventFlags::ADD_POS_ENTRY;
167 if ((rDicEvent.nEvent & DictionaryEventFlags::DEL_ENTRY) && xDic->isActive())
169 DictionaryListEventFlags::DEL_NEG_ENTRY :
170 DictionaryListEventFlags::DEL_POS_ENTRY;
171 if ((rDicEvent.nEvent & DictionaryEventFlags::ENTRIES_CLEARED) && xDic->isActive())
173 DictionaryListEventFlags::DEL_NEG_ENTRY :
174 DictionaryListEventFlags::DEL_POS_ENTRY;
175 if ((rDicEvent.nEvent & DictionaryEventFlags::CHG_LANGUAGE) && xDic->isActive())
177 DictionaryListEventFlags::DEACTIVATE_NEG_DIC
178 | DictionaryListEventFlags::ACTIVATE_NEG_DIC :
179 DictionaryListEventFlags::DEACTIVATE_POS_DIC
180 | DictionaryListEventFlags::ACTIVATE_POS_DIC;
181 if (rDicEvent.nEvent & DictionaryEventFlags::ACTIVATE_DIC)
183 DictionaryListEventFlags::ACTIVATE_NEG_DIC :
184 DictionaryListEventFlags::ACTIVATE_POS_DIC;
185 if (rDicEvent.nEvent & DictionaryEventFlags::DEACTIVATE_DIC)
187 DictionaryListEventFlags::DEACTIVATE_NEG_DIC :
188 DictionaryListEventFlags::DEACTIVATE_POS_DIC;
196 const uno::Reference< XDictionaryListEventListener >& xListener )
198 DBG_ASSERT( xListener.is(),
"empty reference" );
205 const uno::Reference< XDictionaryListEventListener >& xListener )
207 DBG_ASSERT( xListener.is(),
"empty reference" );
231 uno::Sequence< DictionaryEvent > aDicEvents;
270 const OUString &rDicDirURL,
271 bool bIsWriteablePath )
276 GetFolderContents( rDicDirURL,
false ) );
279 for (
const OUString&
aURL : aDirCnt)
283 OUString aDicTitle =
"";
289 OUString aExt(
aURL.copy(
nPos + 1).toAsciiLowerCase() );
293 else if (
"dcp" == aExt)
302 sal_Int32
nPos = aTmp1.lastIndexOf(
'/' );
304 aTmp1 = aTmp1.copy(
nPos + 1 );
307 size_t nCount = rDicList.size();
308 for(j = 0; j <
nCount; j++)
310 aTmp2 = rDicList[j]->getName();
322 DictionaryType
eType = bNeg ? DictionaryType_NEGATIVE : DictionaryType_POSITIVE;
323 uno::Reference< XDictionary > xDic =
338 size_t n = rDicList.size();
339 for (
size_t i = 0;
i <
n;
i++)
341 if ( rDicList[
i] == xDic )
353uno::Sequence< uno::Reference< XDictionary > > SAL_CALL
363uno::Reference< XDictionary > SAL_CALL
368 uno::Reference< XDictionary > xDic;
370 size_t nCount = rDicList.size();
373 const uno::Reference< XDictionary > &rDic = rDicList[
i];
374 if (rDic.is() && rDic->getName() == aDictionaryName)
385 const uno::Reference< XDictionary >& xDictionary )
393 if (xDictionary.is())
396 rDicList.push_back( xDictionary );
419 uno::Reference< XDictionary > xDic( rDicList[
nPos ] );
420 DBG_ASSERT(xDic.is(),
"lng : empty reference");
424 xDic->setActive(
false );
430 rDicList.erase( rDicList.begin() +
nPos );
437 const uno::Reference< XDictionaryListEventListener >& xListener,
445 DBG_ASSERT(!bReceiveVerbose,
"lng : not yet supported");
456 const uno::Reference< XDictionaryListEventListener >& xListener )
489uno::Reference< XDictionary > SAL_CALL
491 DictionaryType eDicType,
const OUString& rURL )
497 return new DictionaryNeo( rName, nLanguage, eDicType, rURL, bIsWriteablePath );
501uno::Reference< XDictionaryEntry > SAL_CALL
507 bSearchPosDics, bSearchSpellEntry );
520 EventObject aEvtObj(
static_cast<XDictionaryList *
>(
this) );
530 size_t nCount = rDicList.size();
534 uno::Reference< frame::XStorable > xStor( rDicList[
i] , UNO_QUERY );
539 if (!xStor->isReadonly() && xStor->hasLocation())
549 if (rDicList[
i].is())
581 for (
const OUString & aPath : aPaths)
583 const bool bIsWriteablePath = (aPath == aWriteablePath);
590 uno::Reference< XDictionary > xIgnAll(
592 DictionaryType_POSITIVE, OUString() ) );
596 xIgnAll->setActive(
true );
607 for (
const OUString& rActiveDic : aActiveDics)
609 if (!rActiveDic.isEmpty())
613 xDic->setActive(
true );
636 size_t nCount = rDicList.size();
640 uno::Reference< frame::XStorable > xStor( rDicList[
i], UNO_QUERY );
645 if (!xStor->isReadonly() && xStor->hasLocation())
660 return "com.sun.star.lingu2.DicList";
671 return {
"com.sun.star.linguistic2.DictionaryList" };
677 const OUString &rText, sal_Int32 nPos, std::u16string_view rDelim )
681 if (rText.isEmpty() ||
nPos >= rText.getLength())
683 else if (rDelim.empty())
686 if (!rToken.isEmpty())
687 nRes = rText.getLength();
692 for (
i =
nPos;
i < rText.getLength(); ++
i)
694 if (std::string_view::npos != rDelim.find( rText[
i] ))
698 if (
i >= rText.getLength())
699 rToken = rText.copy(
nPos );
710 const uno::Reference<XDictionary> &rDic,
711 const OUString& rNew )
717 OUString aDelim(
"!\"#$%&'()*+,-/:;<=>?[]\\_^`{|}~\t \n");
718 OSL_ENSURE(aDelim.indexOf(
u'.') == -1,
725 if( !aToken.isEmpty() && !
IsNumeric( aToken ) )
727 rDic->add( aToken,
false, OUString() );
732static void AddUserData(
const uno::Reference< XDictionary > &rDic )
749 if (rFileURL.isEmpty())
752 sal_Int32
nPos = rFileURL.lastIndexOf(
'.' );
754 aExt = rFileURL.copy(
nPos + 1 ).toAsciiLowerCase();
763 uno::Reference< io::XInputStream >
xStream;
766 uno::Reference< ucb::XSimpleFileAccess3 > xAccess( ucb::SimpleFileAccess::create(xContext) );
767 xStream = xAccess->openFileRead( rFileURL );
769 catch (
const uno::Exception &)
771 SAL_WARN(
"linguistic",
"failed to get input stream" );
780 return 2 == nDicVersion || nDicVersion >= 5;
783extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
785 css::uno::XComponentContext* , css::uno::Sequence<css::uno::Any>
const&)
787 return cppu::acquire(
new DicList());
OUString lowercase(const OUString &rStr, sal_Int32 nPos, sal_Int32 nCount) const
void DisposeAndClear(const EventObject &rEvtObj)
sal_Int16 EndCollectEvents()
comphelper::OInterfaceContainerHelper3< XDictionaryListEventListener > aDicListEvtListeners
sal_Int16 BeginCollectEvents()
virtual void SAL_CALL disposing(const EventObject &rSource) override
DicEvtListenerHelper(uno::Reference< XDictionaryList > xDicList)
bool RemoveDicListEvtListener(const uno::Reference< XDictionaryListEventListener > &rxListener)
uno::Reference< XDictionaryList > xMyDicList
virtual void SAL_CALL processDictionaryEvent(const DictionaryEvent &rDicEvent) override
virtual ~DicEvtListenerHelper() override
bool AddDicListEvtListener(const uno::Reference< XDictionaryListEventListener > &rxListener)
sal_Int16 nNumCollectEvtListeners
virtual void AtExit() override
virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override
virtual void SAL_CALL dispose() override
virtual sal_Bool SAL_CALL addDictionary(const css::uno::Reference< css::linguistic2::XDictionary > &xDictionary) override
rtl::Reference< DicEvtListenerHelper > mxDicEvtLstnrHelper
virtual css::uno::Reference< css::linguistic2::XDictionaryEntry > SAL_CALL queryDictionaryEntry(const OUString &aWord, const css::lang::Locale &aLocale, sal_Bool bSearchPosDics, sal_Bool bSpellEntry) override
void SearchForDictionaries(DictionaryVec_t &rDicList, const OUString &rDicDir, bool bIsWritePath)
virtual css::uno::Reference< css::linguistic2::XDictionary > SAL_CALL getDictionaryByName(const OUString &aDictionaryName) override
virtual sal_Bool SAL_CALL supportsService(const OUString &ServiceName) override
virtual ::sal_Int16 SAL_CALL flushEvents() override
virtual css::uno::Reference< css::linguistic2::XDictionary > SAL_CALL createDictionary(const OUString &aName, const css::lang::Locale &aLocale, css::linguistic2::DictionaryType eDicType, const OUString &aURL) override
std::vector< css::uno::Reference< css::linguistic2::XDictionary > > DictionaryVec_t
virtual ~DicList() override
virtual ::sal_Int16 SAL_CALL beginCollectEvents() override
rtl::Reference< MyAppExitListener > mxExitListener
DictionaryVec_t & GetOrCreateDicList()
sal_Int32 GetDicPos(const css::uno::Reference< css::linguistic2::XDictionary > &xDic)
virtual sal_Bool SAL_CALL addDictionaryListEventListener(const css::uno::Reference< css::linguistic2::XDictionaryListEventListener > &xListener, sal_Bool bReceiveVerbose) override
virtual ::sal_Int16 SAL_CALL endCollectEvents() override
virtual void SAL_CALL removeEventListener(const css::uno::Reference< css::lang::XEventListener > &aListener) override
virtual sal_Bool SAL_CALL removeDictionary(const css::uno::Reference< css::linguistic2::XDictionary > &xDictionary) override
virtual sal_Bool SAL_CALL removeDictionaryListEventListener(const css::uno::Reference< css::linguistic2::XDictionaryListEventListener > &xListener) override
virtual ::sal_Int16 SAL_CALL getCount() override
virtual void SAL_CALL addEventListener(const css::uno::Reference< css::lang::XEventListener > &xListener) override
::comphelper::OInterfaceContainerHelper3< css::lang::XEventListener > aEvtListeners
virtual OUString SAL_CALL getImplementationName() override
virtual css::uno::Sequence< css::uno::Reference< css::linguistic2::XDictionary > > SAL_CALL getDictionaries() override
OUString getName(sal_Int32 nIndex=LAST_SEGMENT, bool bIgnoreFinalSlash=true, DecodeMechanism eMechanism=DecodeMechanism::ToIUri, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const
const css::uno::Sequence< OUString > & GetActiveDics() const
const CharClass & GetCharClass() const
OUString GetFullName() const
OUString GetEmail() const
OUString GetTitle() const
OUString GetCompany() const
OUString GetPosition() const
OUString GetStreet() const
sal_Int32 addInterface(const css::uno::Reference< ListenerT > &rxIFace)
void disposeAndClear(const css::lang::EventObject &rEvt)
sal_Int32 getLength() const
sal_Int32 removeInterface(const css::uno::Reference< ListenerT > &rxIFace)
void notifyEach(void(SAL_CALL ListenerT::*NotificationMethod)(const EventT &), const EventT &Event)
static std::unique_ptr< SvStream > CreateStream(const OUString &rFileName, StreamMode eOpenMode, css::uno::Reference< css::awt::XWindow > xParentWin=nullptr)
#define DBG_ASSERT(sCon, aError)
sal_Int16 ReadDicVersion(SvStream &rStream, LanguageType &nLng, bool &bNeg, OUString &aDicName)
static sal_Int32 lcl_GetToken(OUString &rToken, const OUString &rText, sal_Int32 nPos, std::u16string_view rDelim)
static void AddInternal(const uno::Reference< XDictionary > &rDic, const OUString &rNew)
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * linguistic_DicList_get_implementation(css::uno::XComponentContext *, css::uno::Sequence< css::uno::Any > const &)
static void AddUserData(const uno::Reference< XDictionary > &rDic)
static bool IsVers2OrNewer(const OUString &rFileURL, LanguageType &nLng, bool &bNeg, OUString &aDicName)
#define SAL_WARN(area, stream)
std::locale Create(std::string_view aPrefixName, const LanguageTag &rLocale)
OUString get(TranslateId sContextAndId, const std::locale &loc)
css::uno::Sequence< DstElementType > containerToSequence(const SrcType &i_Container)
Reference< XComponentContext > getProcessComponentContext()
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)
uno::Reference< XDictionaryEntry > SearchDicList(const uno::Reference< XSearchableDictionaryList > &xDicList, const OUString &rWord, LanguageType nLanguage, bool bSearchPosDics, bool bSearchSpellEntry)
OUString GetDictionaryWriteablePath()
osl::Mutex & GetLinguMutex()
! multi-thread safe mutex for all platforms !!
bool IsNumeric(std::u16string_view rText)
css::lang::Locale LinguLanguageToLocale(LanguageType nLanguage)
Convert LanguageType to Locale for legacy handling.
std::vector< OUString > GetDictionaryPaths()
LanguageType LinguLocaleToLanguage(const css::lang::Locale &rLocale)
Convert Locale to LanguageType for legacy handling.