diff options
Diffstat (limited to 'linguistic/source/spelldsp.cxx')
-rw-r--r-- | linguistic/source/spelldsp.cxx | 855 |
1 files changed, 0 insertions, 855 deletions
diff --git a/linguistic/source/spelldsp.cxx b/linguistic/source/spelldsp.cxx deleted file mode 100644 index 0f6f6e2225..0000000000 --- a/linguistic/source/spelldsp.cxx +++ /dev/null @@ -1,855 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_linguistic.hxx" - -#include <com/sun/star/uno/Reference.h> -#include <com/sun/star/linguistic2/XSearchableDictionaryList.hpp> -#include <com/sun/star/linguistic2/SpellFailure.hpp> -#include <com/sun/star/registry/XRegistryKey.hpp> - -#include <cppuhelper/factory.hxx> // helper for factories -#include <unotools/localedatawrapper.hxx> -#include <unotools/processfactory.hxx> -#include <tools/debug.hxx> -#include <svl/lngmisc.hxx> -#include <osl/mutex.hxx> - -#include <vector> - -#include "spelldsp.hxx" -#include "linguistic/spelldta.hxx" -#include "lngsvcmgr.hxx" -#include "linguistic/lngprops.hxx" - - -using namespace utl; -using namespace osl; -using namespace com::sun::star; -using namespace com::sun::star::beans; -using namespace com::sun::star::lang; -using namespace com::sun::star::uno; -using namespace com::sun::star::linguistic2; -using namespace linguistic; - -using ::rtl::OUString; - -// ProposalList: list of proposals for misspelled words -// The order of strings in the array should be left unchanged because the -// spellchecker should have put the more likely suggestions at the top. -// New entries will be added to the end but duplicates are to be avoided. -// Removing entries is done by assigning the empty string. -// The sequence is constructed from all non empty strings in the original -// while maintaining the order. -class ProposalList -{ - std::vector< OUString > aVec; - - sal_Bool HasEntry( const OUString &rText ) const; - - // make copy c-tor and assignment operator private - ProposalList( const ProposalList & ); - ProposalList & operator = ( const ProposalList & ); - -public: - ProposalList() {} - - size_t Count() const; - void Prepend( const OUString &rText ); - void Append( const OUString &rNew ); - void Append( const std::vector< OUString > &rNew ); - void Append( const Sequence< OUString > &rNew ); - void Remove( const OUString &rText ); - Sequence< OUString > GetSequence() const; -}; - - -sal_Bool ProposalList::HasEntry( const OUString &rText ) const -{ - sal_Bool bFound = sal_False; - size_t nCnt = aVec.size(); - for (size_t i = 0; !bFound && i < nCnt; ++i) - { - if (aVec[i] == rText) - bFound = sal_True; - } - return bFound; -} - -void ProposalList::Prepend( const OUString &rText ) -{ - if (!HasEntry( rText )) - aVec.insert( aVec.begin(), rText ); -} - -void ProposalList::Append( const OUString &rText ) -{ - if (!HasEntry( rText )) - aVec.push_back( rText ); -} - -void ProposalList::Append( const std::vector< OUString > &rNew ) -{ - size_t nLen = rNew.size(); - for ( size_t i = 0; i < nLen; ++i) - { - const OUString &rText = rNew[i]; - if (!HasEntry( rText )) - Append( rText ); - } -} - -void ProposalList::Append( const Sequence< OUString > &rNew ) -{ - sal_Int32 nLen = rNew.getLength(); - const OUString *pNew = rNew.getConstArray(); - for (sal_Int32 i = 0; i < nLen; ++i) - { - const OUString &rText = pNew[i]; - if (!HasEntry( rText )) - Append( rText ); - } -} - -size_t ProposalList::Count() const -{ - // returns the number of non-empty strings in the vector - - size_t nRes = 0; - size_t nLen = aVec.size(); - for (size_t i = 0; i < nLen; ++i) - { - if (aVec[i].getLength() != 0) - ++nRes; - } - return nRes; -} - -Sequence< OUString > ProposalList::GetSequence() const -{ - sal_Int32 nCount = Count(); - sal_Int32 nIdx = 0; - Sequence< OUString > aRes( nCount ); - OUString *pRes = aRes.getArray(); - sal_Int32 nLen = aVec.size(); - for (sal_Int32 i = 0; i < nLen; ++i) - { - const OUString &rText = aVec[i]; - DBG_ASSERT( nIdx < nCount, "index our of range" ); - if (nIdx < nCount && rText.getLength() > 0) - pRes[ nIdx++ ] = rText; - } - return aRes; -} - -void ProposalList::Remove( const OUString &rText ) -{ - size_t nLen = aVec.size(); - for (size_t i = 0; i < nLen; ++i) - { - OUString &rEntry = aVec[i]; - if (rEntry == rText) - { - rEntry = OUString(); - break; // there should be only one matching entry - } - } -} - -sal_Bool SvcListHasLanguage( - const LangSvcEntries_Spell &rEntry, - LanguageType nLanguage ) -{ - sal_Bool bHasLanguage = sal_False; - Locale aTmpLocale; - - const Reference< XSpellChecker > *pRef = rEntry.aSvcRefs .getConstArray(); - sal_Int32 nLen = rEntry.aSvcRefs.getLength(); - for (sal_Int32 k = 0; k < nLen && !bHasLanguage; ++k) - { - if (pRef[k].is()) - { - if (0 == aTmpLocale.Language.getLength()) - aTmpLocale = CreateLocale( nLanguage ); - bHasLanguage = pRef[k]->hasLocale( aTmpLocale ); - } - } - - return bHasLanguage; -} - -SpellCheckerDispatcher::SpellCheckerDispatcher( LngSvcMgr &rLngSvcMgr ) : - rMgr (rLngSvcMgr) -{ - pCache = NULL; -} - - -SpellCheckerDispatcher::~SpellCheckerDispatcher() -{ - ClearSvcList(); - delete pCache; -} - - -void SpellCheckerDispatcher::ClearSvcList() -{ - // release memory for each table entry - SpellSvcByLangMap_t aTmp; - aSvcMap.swap( aTmp ); -} - - -Sequence< Locale > SAL_CALL SpellCheckerDispatcher::getLocales() - throw(RuntimeException) -{ - MutexGuard aGuard( GetLinguMutex() ); - - Sequence< Locale > aLocales( static_cast< sal_Int32 >(aSvcMap.size()) ); - Locale *pLocales = aLocales.getArray(); - SpellSvcByLangMap_t::const_iterator aIt; - for (aIt = aSvcMap.begin(); aIt != aSvcMap.end(); ++aIt) - { - *pLocales++ = CreateLocale( aIt->first ); - } - return aLocales; -} - - -sal_Bool SAL_CALL SpellCheckerDispatcher::hasLocale( const Locale& rLocale ) - throw(RuntimeException) -{ - MutexGuard aGuard( GetLinguMutex() ); - SpellSvcByLangMap_t::const_iterator aIt( aSvcMap.find( LocaleToLanguage( rLocale ) ) ); - return aIt != aSvcMap.end(); -} - - -sal_Bool SAL_CALL - SpellCheckerDispatcher::isValid( const OUString& rWord, const Locale& rLocale, - const PropertyValues& rProperties ) - throw(IllegalArgumentException, RuntimeException) -{ - MutexGuard aGuard( GetLinguMutex() ); - return isValid_Impl( rWord, LocaleToLanguage( rLocale ), rProperties, sal_True ); -} - - -Reference< XSpellAlternatives > SAL_CALL - SpellCheckerDispatcher::spell( const OUString& rWord, const Locale& rLocale, - const PropertyValues& rProperties ) - throw(IllegalArgumentException, RuntimeException) -{ - MutexGuard aGuard( GetLinguMutex() ); - return spell_Impl( rWord, LocaleToLanguage( rLocale ), rProperties, sal_True ); -} - - -// returns the overall result of cross-checking with all user-dictionaries -// including the IgnoreAll list -static Reference< XDictionaryEntry > lcl_GetRulingDictionaryEntry( - const OUString &rWord, - LanguageType nLanguage ) -{ - Reference< XDictionaryEntry > xRes; - - // the order of winning from top to bottom is: - // 1) IgnoreAll list will always win - // 2) Negative dictionaries will win over positive dictionaries - Reference< XDictionary > xIgnoreAll( GetIgnoreAllList() ); - if (xIgnoreAll.is()) - xRes = xIgnoreAll->getEntry( rWord ); - if (!xRes.is()) - { - Reference< XDictionaryList > xDList( GetDictionaryList() ); - Reference< XDictionaryEntry > xNegEntry( SearchDicList( xDList, - rWord, nLanguage, sal_False, sal_True ) ); - if (xNegEntry.is()) - xRes = xNegEntry; - else - { - Reference< XDictionaryEntry > xPosEntry( SearchDicList( xDList, - rWord, nLanguage, sal_True, sal_True ) ); - if (xPosEntry.is()) - xRes = xPosEntry; - } - } - - return xRes; -} - - -sal_Bool SpellCheckerDispatcher::isValid_Impl( - const OUString& rWord, - LanguageType nLanguage, - const PropertyValues& rProperties, - sal_Bool bCheckDics) - throw( RuntimeException, IllegalArgumentException ) -{ - MutexGuard aGuard( GetLinguMutex() ); - - sal_Bool bRes = sal_True; - - if (nLanguage == LANGUAGE_NONE || !rWord.getLength()) - return bRes; - - // search for entry with that language - SpellSvcByLangMap_t::iterator aIt( aSvcMap.find( nLanguage ) ); - LangSvcEntries_Spell *pEntry = aIt != aSvcMap.end() ? aIt->second.get() : NULL; - - if (!pEntry) - { -#ifdef LINGU_EXCEPTIONS - throw IllegalArgumentException(); -#endif - } - else - { - OUString aChkWord( rWord ); - Locale aLocale( CreateLocale( nLanguage ) ); - - // replace typographical apostroph by ascii apostroph - String aSingleQuote( GetLocaleDataWrapper( nLanguage ).getQuotationMarkEnd() ); - DBG_ASSERT( 1 == aSingleQuote.Len(), "unexpectend length of quotation mark" ); - if (aSingleQuote.Len()) - aChkWord = aChkWord.replace( aSingleQuote.GetChar(0), '\'' ); - - RemoveHyphens( aChkWord ); - if (IsIgnoreControlChars( rProperties, GetPropSet() )) - RemoveControlChars( aChkWord ); - - sal_Int32 nLen = pEntry->aSvcRefs.getLength(); - DBG_ASSERT( nLen == pEntry->aSvcImplNames.getLength(), - "lng : sequence length mismatch"); - DBG_ASSERT( pEntry->nLastTriedSvcIndex < nLen, - "lng : index out of range"); - - sal_Int32 i = 0; - sal_Bool bTmpRes = sal_True; - sal_Bool bTmpResValid = sal_False; - - // try already instantiated services first - { - const Reference< XSpellChecker > *pRef = - pEntry->aSvcRefs.getConstArray(); - while (i <= pEntry->nLastTriedSvcIndex - && (!bTmpResValid || sal_False == bTmpRes)) - { - bTmpResValid = sal_True; - if (pRef[i].is() && pRef[i]->hasLocale( aLocale )) - { - bTmpRes = GetCache().CheckWord( aChkWord, nLanguage ); - if (!bTmpRes) - { - bTmpRes = pRef[i]->isValid( aChkWord, aLocale, rProperties ); - - // Add correct words to the cache. - // But not those that are correct only because of - // the temporary supplied settings. - if (bTmpRes && 0 == rProperties.getLength()) - GetCache().AddWord( aChkWord, nLanguage ); - } - } - else - bTmpResValid = sal_False; - - if (bTmpResValid) - bRes = bTmpRes; - - ++i; - } - } - - // if still no result instantiate new services and try those - if ((!bTmpResValid || sal_False == bTmpRes) - && pEntry->nLastTriedSvcIndex < nLen - 1) - { - const OUString *pImplNames = pEntry->aSvcImplNames.getConstArray(); - Reference< XSpellChecker > *pRef = pEntry->aSvcRefs .getArray(); - - Reference< XMultiServiceFactory > xMgr( getProcessServiceFactory() ); - if (xMgr.is()) - { - // build service initialization argument - Sequence< Any > aArgs(2); - aArgs.getArray()[0] <<= GetPropSet(); - - while (i < nLen && (!bTmpResValid || sal_False == bTmpRes)) - { - // create specific service via it's implementation name - Reference< XSpellChecker > xSpell; - try - { - xSpell = Reference< XSpellChecker >( - xMgr->createInstanceWithArguments( - pImplNames[i], aArgs ), UNO_QUERY ); - } - catch (uno::Exception &) - { - DBG_ASSERT( 0, "createInstanceWithArguments failed" ); - } - pRef [i] = xSpell; - - Reference< XLinguServiceEventBroadcaster > - xBroadcaster( xSpell, UNO_QUERY ); - if (xBroadcaster.is()) - rMgr.AddLngSvcEvtBroadcaster( xBroadcaster ); - - bTmpResValid = sal_True; - if (xSpell.is() && xSpell->hasLocale( aLocale )) - { - bTmpRes = GetCache().CheckWord( aChkWord, nLanguage ); - if (!bTmpRes) - { - bTmpRes = xSpell->isValid( aChkWord, aLocale, rProperties ); - - // Add correct words to the cache. - // But not those that are correct only because of - // the temporary supplied settings. - if (bTmpRes && 0 == rProperties.getLength()) - GetCache().AddWord( aChkWord, nLanguage ); - } - } - else - bTmpResValid = sal_False; - - if (bTmpResValid) - bRes = bTmpRes; - - pEntry->nLastTriedSvcIndex = (sal_Int16) i; - ++i; - } - - // if language is not supported by any of the services - // remove it from the list. - if (i == nLen) - { - if (!SvcListHasLanguage( *pEntry, nLanguage )) - aSvcMap.erase( nLanguage ); - } - } - } - - // cross-check against results from dictionaries which have precedence! - if (bCheckDics && - GetDicList().is() && IsUseDicList( rProperties, GetPropSet() )) - { - Reference< XDictionaryEntry > xTmp( lcl_GetRulingDictionaryEntry( aChkWord, nLanguage ) ); - if (xTmp.is()) - bRes = !xTmp->isNegative(); - } - } - - return bRes; -} - - -Reference< XSpellAlternatives > SpellCheckerDispatcher::spell_Impl( - const OUString& rWord, - LanguageType nLanguage, - const PropertyValues& rProperties, - sal_Bool bCheckDics ) - throw(IllegalArgumentException, RuntimeException) -{ - MutexGuard aGuard( GetLinguMutex() ); - - Reference< XSpellAlternatives > xRes; - - if (nLanguage == LANGUAGE_NONE || !rWord.getLength()) - return xRes; - - // search for entry with that language - SpellSvcByLangMap_t::iterator aIt( aSvcMap.find( nLanguage ) ); - LangSvcEntries_Spell *pEntry = aIt != aSvcMap.end() ? aIt->second.get() : NULL; - - if (!pEntry) - { -#ifdef LINGU_EXCEPTIONS - throw IllegalArgumentException(); -#endif - } - else - { - OUString aChkWord( rWord ); - Locale aLocale( CreateLocale( nLanguage ) ); - - // replace typographical apostroph by ascii apostroph - String aSingleQuote( GetLocaleDataWrapper( nLanguage ).getQuotationMarkEnd() ); - DBG_ASSERT( 1 == aSingleQuote.Len(), "unexpectend length of quotation mark" ); - if (aSingleQuote.Len()) - aChkWord = aChkWord.replace( aSingleQuote.GetChar(0), '\'' ); - - RemoveHyphens( aChkWord ); - if (IsIgnoreControlChars( rProperties, GetPropSet() )) - RemoveControlChars( aChkWord ); - - sal_Int32 nLen = pEntry->aSvcRefs.getLength(); - DBG_ASSERT( nLen == pEntry->aSvcImplNames.getLength(), - "lng : sequence length mismatch"); - DBG_ASSERT( pEntry->nLastTriedSvcIndex < nLen, - "lng : index out of range"); - - sal_Int32 i = 0; - Reference< XSpellAlternatives > xTmpRes; - sal_Bool bTmpResValid = sal_False; - - // try already instantiated services first - { - const Reference< XSpellChecker > *pRef = pEntry->aSvcRefs.getConstArray(); - sal_Int32 nNumSugestions = -1; - while (i <= pEntry->nLastTriedSvcIndex - && (!bTmpResValid || xTmpRes.is()) ) - { - bTmpResValid = sal_True; - if (pRef[i].is() && pRef[i]->hasLocale( aLocale )) - { - sal_Bool bOK = GetCache().CheckWord( aChkWord, nLanguage ); - if (bOK) - xTmpRes = NULL; - else - { - xTmpRes = pRef[i]->spell( aChkWord, aLocale, rProperties ); - - // Add correct words to the cache. - // But not those that are correct only because of - // the temporary supplied settings. - if (!xTmpRes.is() && 0 == rProperties.getLength()) - GetCache().AddWord( aChkWord, nLanguage ); - } - } - else - bTmpResValid = sal_False; - - // return first found result if the word is not known by any checker. - // But if that result has no suggestions use the first one that does - // provide suggestions for the misspelled word. - if (!xRes.is() && bTmpResValid) - { - xRes = xTmpRes; - nNumSugestions = 0; - if (xRes.is()) - nNumSugestions = xRes->getAlternatives().getLength(); - } - sal_Int32 nTmpNumSugestions = 0; - if (xTmpRes.is() && bTmpResValid) - nTmpNumSugestions = xTmpRes->getAlternatives().getLength(); - if (xRes.is() && nNumSugestions == 0 && nTmpNumSugestions > 0) - { - xRes = xTmpRes; - nNumSugestions = nTmpNumSugestions; - } - - ++i; - } - } - - // if still no result instantiate new services and try those - if ((!bTmpResValid || xTmpRes.is()) - && pEntry->nLastTriedSvcIndex < nLen - 1) - { - const OUString *pImplNames = pEntry->aSvcImplNames.getConstArray(); - Reference< XSpellChecker > *pRef = pEntry->aSvcRefs .getArray(); - - Reference< XMultiServiceFactory > xMgr( getProcessServiceFactory() ); - if (xMgr.is()) - { - // build service initialization argument - Sequence< Any > aArgs(2); - aArgs.getArray()[0] <<= GetPropSet(); - - sal_Int32 nNumSugestions = -1; - while (i < nLen && (!bTmpResValid || xTmpRes.is())) - { - // create specific service via it's implementation name - Reference< XSpellChecker > xSpell; - try - { - xSpell = Reference< XSpellChecker >( - xMgr->createInstanceWithArguments( - pImplNames[i], aArgs ), UNO_QUERY ); - } - catch (uno::Exception &) - { - DBG_ASSERT( 0, "createInstanceWithArguments failed" ); - } - pRef [i] = xSpell; - - Reference< XLinguServiceEventBroadcaster > - xBroadcaster( xSpell, UNO_QUERY ); - if (xBroadcaster.is()) - rMgr.AddLngSvcEvtBroadcaster( xBroadcaster ); - - bTmpResValid = sal_True; - if (xSpell.is() && xSpell->hasLocale( aLocale )) - { - sal_Bool bOK = GetCache().CheckWord( aChkWord, nLanguage ); - if (bOK) - xTmpRes = NULL; - else - { - xTmpRes = xSpell->spell( aChkWord, aLocale, rProperties ); - - // Add correct words to the cache. - // But not those that are correct only because of - // the temporary supplied settings. - if (!xTmpRes.is() && 0 == rProperties.getLength()) - GetCache().AddWord( aChkWord, nLanguage ); - } - } - else - bTmpResValid = sal_False; - - // return first found result if the word is not known by any checker. - // But if that result has no suggestions use the first one that does - // provide suggestions for the misspelled word. - if (!xRes.is() && bTmpResValid) - { - xRes = xTmpRes; - nNumSugestions = 0; - if (xRes.is()) - nNumSugestions = xRes->getAlternatives().getLength(); - } - sal_Int32 nTmpNumSugestions = 0; - if (xTmpRes.is() && bTmpResValid) - nTmpNumSugestions = xTmpRes->getAlternatives().getLength(); - if (xRes.is() && nNumSugestions == 0 && nTmpNumSugestions > 0) - { - xRes = xTmpRes; - nNumSugestions = nTmpNumSugestions; - } - - pEntry->nLastTriedSvcIndex = (sal_Int16) i; - ++i; - } - - // if language is not supported by any of the services - // remove it from the list. - if (i == nLen) - { - if (!SvcListHasLanguage( *pEntry, nLanguage )) - aSvcMap.erase( nLanguage ); - } - } - } - - // if word is finally found to be correct - // clear previously remembered alternatives - if (bTmpResValid && !xTmpRes.is()) - xRes = NULL; - - // list of proposals found (to be checked against entries of - // neagtive dictionaries) - ProposalList aProposalList; - sal_Int16 eFailureType = -1; // no failure - if (xRes.is()) - { - aProposalList.Append( xRes->getAlternatives() ); - eFailureType = xRes->getFailureType(); - } - Reference< XDictionaryList > xDList; - if (GetDicList().is() && IsUseDicList( rProperties, GetPropSet() )) - xDList = Reference< XDictionaryList >( GetDicList(), UNO_QUERY ); - - // cross-check against results from user-dictionaries which have precedence! - if (bCheckDics && xDList.is()) - { - Reference< XDictionaryEntry > xTmp( lcl_GetRulingDictionaryEntry( aChkWord, nLanguage ) ); - if (xTmp.is()) - { - if (xTmp->isNegative()) // positive entry found - { - eFailureType = SpellFailure::IS_NEGATIVE_WORD; - - // replacement text to be added to suggestions, if not empty - OUString aAddRplcTxt( xTmp->getReplacementText() ); - - // replacement text must not be in negative dictionary itself - if (aAddRplcTxt.getLength() && - !SearchDicList( xDList, aAddRplcTxt, nLanguage, sal_False, sal_True ).is()) - { - aProposalList.Prepend( aAddRplcTxt ); - } - } - else // positive entry found - { - xRes = NULL; - eFailureType = -1; // no failure - } - } - } - - if (eFailureType != -1) // word misspelled or found in negative user-dictionary - { - // search suitable user-dictionaries for suggestions that are - // similar to the misspelled word - std::vector< OUString > aDicListProps; // list of proposals from user-dictionaries - SearchSimilarText( aChkWord, nLanguage, xDList, aDicListProps ); - aProposalList.Append( aDicListProps ); - Sequence< OUString > aProposals = aProposalList.GetSequence(); - - // remove entries listed in negative dictionaries - // (we don't want to display suggestions that will be regarded as misspelledlater on) - if (bCheckDics && xDList.is()) - SeqRemoveNegEntries( aProposals, xDList, nLanguage ); - - uno::Reference< linguistic2::XSetSpellAlternatives > xSetAlt( xRes, uno::UNO_QUERY ); - if (xSetAlt.is()) - { - xSetAlt->setAlternatives( aProposals ); - xSetAlt->setFailureType( eFailureType ); - } - else - { - if (xRes.is()) - { - DBG_ASSERT( 0, "XSetSpellAlternatives not implemented!" ); - } - else if (aProposals.getLength() > 0) - { - // no xRes but Proposals found from the user-dictionaries. - // Thus we need to create an xRes... - xRes = new linguistic::SpellAlternatives( rWord, nLanguage, - SpellFailure::IS_NEGATIVE_WORD, aProposals ); - } - } - } - } - - return xRes; -} - -uno::Sequence< sal_Int16 > SAL_CALL SpellCheckerDispatcher::getLanguages( ) -throw (uno::RuntimeException) -{ - MutexGuard aGuard( GetLinguMutex() ); - uno::Sequence< Locale > aTmp( getLocales() ); - uno::Sequence< sal_Int16 > aRes( LocaleSeqToLangSeq( aTmp ) ); - return aRes; -} - - -sal_Bool SAL_CALL SpellCheckerDispatcher::hasLanguage( - sal_Int16 nLanguage ) -throw (uno::RuntimeException) -{ - MutexGuard aGuard( GetLinguMutex() ); - Locale aLocale( CreateLocale( nLanguage ) ); - return hasLocale( aLocale ); -} - - -sal_Bool SAL_CALL SpellCheckerDispatcher::isValid( - const OUString& rWord, - sal_Int16 nLanguage, - const uno::Sequence< beans::PropertyValue >& rProperties ) -throw (lang::IllegalArgumentException, uno::RuntimeException) -{ - MutexGuard aGuard( GetLinguMutex() ); - Locale aLocale( CreateLocale( nLanguage ) ); - return isValid( rWord, aLocale, rProperties); -} - - -uno::Reference< linguistic2::XSpellAlternatives > SAL_CALL SpellCheckerDispatcher::spell( - const OUString& rWord, - sal_Int16 nLanguage, - const uno::Sequence< beans::PropertyValue >& rProperties ) -throw (lang::IllegalArgumentException, uno::RuntimeException) -{ - MutexGuard aGuard( GetLinguMutex() ); - Locale aLocale( CreateLocale( nLanguage ) ); - return spell( rWord, aLocale, rProperties); -} - - -void SpellCheckerDispatcher::SetServiceList( const Locale &rLocale, - const Sequence< OUString > &rSvcImplNames ) -{ - MutexGuard aGuard( GetLinguMutex() ); - - if (pCache) - pCache->Flush(); // new services may spell differently... - - sal_Int16 nLanguage = LocaleToLanguage( rLocale ); - - sal_Int32 nLen = rSvcImplNames.getLength(); - if (0 == nLen) - // remove entry - aSvcMap.erase( nLanguage ); - else - { - // modify/add entry - LangSvcEntries_Spell *pEntry = aSvcMap[ nLanguage ].get(); - if (pEntry) - { - pEntry->Clear(); - pEntry->aSvcImplNames = rSvcImplNames; - pEntry->aSvcRefs = Sequence< Reference < XSpellChecker > > ( nLen ); - } - else - { - boost::shared_ptr< LangSvcEntries_Spell > pTmpEntry( new LangSvcEntries_Spell( rSvcImplNames ) ); - pTmpEntry->aSvcRefs = Sequence< Reference < XSpellChecker > >( nLen ); - aSvcMap[ nLanguage ] = pTmpEntry; - } - } -} - - -Sequence< OUString > - SpellCheckerDispatcher::GetServiceList( const Locale &rLocale ) const -{ - MutexGuard aGuard( GetLinguMutex() ); - - Sequence< OUString > aRes; - - // search for entry with that language and use data from that - sal_Int16 nLanguage = LocaleToLanguage( rLocale ); - SpellCheckerDispatcher *pThis = (SpellCheckerDispatcher *) this; - const SpellSvcByLangMap_t::iterator aIt( pThis->aSvcMap.find( nLanguage ) ); - const LangSvcEntries_Spell *pEntry = aIt != aSvcMap.end() ? aIt->second.get() : NULL; - if (pEntry) - aRes = pEntry->aSvcImplNames; - - return aRes; -} - - -LinguDispatcher::DspType SpellCheckerDispatcher::GetDspType() const -{ - return DSP_SPELL; -} - -void SpellCheckerDispatcher::FlushSpellCache() -{ - if (pCache) - pCache->Flush(); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |