diff options
author | Jens-Heiner Rechtien <hr@openoffice.org> | 2009-05-19 09:31:27 +0000 |
---|---|---|
committer | Jens-Heiner Rechtien <hr@openoffice.org> | 2009-05-19 09:31:27 +0000 |
commit | 7adb1f5739d72fb0d5e5ced375c3771bc7df69de (patch) | |
tree | 27eac4acb19264bb47666d7f89c2a2a7b589215d /linguistic/source/spelldsp.cxx | |
parent | 756ad3800d5defb7f8cdf5404d14c9a20cc168d6 (diff) |
CWS-TOOLING: integrate CWS tl66
2009-05-15 12:28:55 +0200 tl r271932 : #i91812# include fixed
2009-05-07 16:52:41 +0200 tl r271680 : #i97200# one more MathML export problem to fix
2009-05-05 08:33:29 +0200 tl r271494 : #i99401# positiv user-dicts vs negativ user-dicts
2009-05-04 14:14:03 +0200 tl r271452 : #i97200# warning free code; MathML 2.0 export
2009-05-04 13:26:30 +0200 tl r271448 : #i97200# write valid MathML 2.0 on export
2009-04-29 14:21:54 +0200 tl r271371 : #i97200# new MathML token
2009-04-29 11:12:07 +0200 tl r271360 : #i97200# inroducing separate files for import and export
2009-04-28 16:47:42 +0200 tl r271331 : #i97200# better MathML pretty printing
2009-04-28 11:21:57 +0200 tl r271315 : #i97200# MathML attributes and default namespace for MathML
2009-04-28 11:21:24 +0200 tl r271314 : #i97200# MathML attributes and default namespace for MathML
2009-04-23 12:44:18 +0200 tl r271154 : #i97200# math.dtd removed
2009-04-23 12:31:56 +0200 tl r271151 : #i97200# MathML: don't use namespace on attributes
2009-04-22 13:21:11 +0200 tl r271099 : warning-free code
2009-04-22 12:20:13 +0200 tl r271092 : #i100757# loop fixed
2009-04-22 11:29:51 +0200 tl r271086 : #97327# adding mongolian fingerprint for language guessing
2009-04-22 11:25:56 +0200 tl r271083 : #97327# adding mongolian fingerprint for language guessing
2009-04-21 10:39:21 +0200 tl r271025 : #99599# code fix for LRE/RLE embedding
2009-04-20 16:36:33 +0200 tl r270992 : #i99604# HasDigits fixed
2009-04-20 14:44:19 +0200 tl r270985 : #i99604# warning-free code for Windows
2009-04-20 13:48:13 +0200 tl r270980 : #i99604# HasDigits fix for non-ASCII characters
2009-04-20 13:47:50 +0200 tl r270979 : #i99604# HasDigits fix for non-ASCII characters
2009-04-20 12:28:15 +0200 tl r270973 : warning-free code after merging
2009-04-20 10:16:19 +0200 tl r270964 : warning-free code after merging
2009-04-17 14:43:36 +0200 tl r270948 : #i96846#
2009-04-16 13:09:15 +0200 tl r270883 : CWS-TOOLING: rebase CWS tl66 to trunk@270723 (milestone: DEV300:m46)
2009-04-14 14:34:08 +0200 tl r270770 : #101067# warning-free code
2009-04-02 09:07:44 +0200 tl r270368 : #i100757# performance patch for start-up (initialize language guessing on demand only)
2009-03-11 10:37:59 +0100 tl r269301 : #i100083# fixed system dictionary lookup
2009-03-06 13:10:23 +0100 tl r268998 : warning-free code for Windows non-pro
2009-02-23 14:01:23 +0100 tl r268355 : #i99401# winning rules for user-dictionaries changed
2009-02-19 14:05:57 +0100 tl r268281 : #i98644# suggestion improvement when first checker does not know any suggestions
2009-02-19 14:05:02 +0100 tl r268280 : #i98644# suggestion improvement when first checker does not know any suggestions
2009-02-19 13:58:51 +0100 tl r268279 : #i98644# suggestion improvement when first checker does not know any suggestions
2009-02-19 11:38:03 +0100 tl r268266 : #i98644# suggestion improvement when first checker does not know any suggestions
2009-02-12 11:58:34 +0100 tl r267642 : #i96846# some properties declared as maybevoid
2009-02-06 12:43:55 +0100 tl r267454 : #i98644# provide sugestions from secondary spell checkers if the primary does not provide ones
2009-02-05 13:02:26 +0100 tl r267418 : #i98880# a bit clean-up in the grammar checking framework
2009-02-04 12:15:37 +0100 tl r267363 : #i91812# remove unused/duplicate code
2009-02-04 12:09:34 +0100 tl r267362 : #i91812# remove unused/duplicate code
2009-02-04 11:07:57 +0100 tl r267355 : #i91812# remove unused code
2009-02-04 11:06:48 +0100 tl r267354 : #i91812# remove unused code
2009-02-03 14:52:43 +0100 tl r267331 : #i91812# remove unused code
2009-02-03 14:26:00 +0100 tl r267324 : #i91198# adding fingerprint for luxembourgish
2009-02-03 14:20:58 +0100 tl r267323 : #i91198# adding fingerprint for luxembourgish
2009-02-03 14:18:33 +0100 tl r267322 : #i91198# adding fingerprint for luxembourgish
2009-02-03 13:56:39 +0100 tl r267319 : #i91812# remove unused code
2009-02-03 12:41:50 +0100 tl r267314 : #i48400# auto-spellcheck improvement when deleting wrong chars
2009-02-03 11:48:51 +0100 tl r267310 : #i91812# remove unused code
2009-02-03 11:14:29 +0100 tl r267307 : warning free code
2009-02-03 10:45:21 +0100 tl r267306 : #i91812# remove unused code
2009-02-03 10:37:04 +0100 tl r267304 : #i33387# name change for 'View/Selection'
2009-02-03 10:36:17 +0100 tl r267303 : #i33387# name change for 'View/Selection'
2009-02-03 10:32:12 +0100 tl r267302 : #i30642# spelling error in context menu fixed
2009-02-03 10:27:34 +0100 tl r267301 : #i92210# remove unused code types.cxx cfgitem.*
Diffstat (limited to 'linguistic/source/spelldsp.cxx')
-rw-r--r-- | linguistic/source/spelldsp.cxx | 162 |
1 files changed, 111 insertions, 51 deletions
diff --git a/linguistic/source/spelldsp.cxx b/linguistic/source/spelldsp.cxx index d9882a3dbae8..48e64163dbe4 100644 --- a/linguistic/source/spelldsp.cxx +++ b/linguistic/source/spelldsp.cxx @@ -30,30 +30,25 @@ // 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 <cppuhelper/factory.hxx> // helper for factories #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 <svtools/lngmisc.hxx> -#include <unotools/processfactory.hxx> +#include <osl/mutex.hxx> #include <vector> -#ifndef _SPELLIMP_HXX -#include <spelldsp.hxx> -#endif -#ifndef _LNGPROPS_HXX -#include <lngprops.hxx> -#endif - #include "spelldsp.hxx" #include "spelldta.hxx" #include "lngsvcmgr.hxx" -#include <osl/mutex.hxx> +#include "lngprops.hxx" using namespace utl; @@ -90,6 +85,7 @@ public: //size_t Size() const { return aVec.size(); } 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 ); @@ -110,6 +106,12 @@ BOOL ProposalList::HasEntry( const OUString &rText ) const 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 )) @@ -279,6 +281,40 @@ Reference< XSpellAlternatives > SAL_CALL } +// 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, FALSE, TRUE ) ); + if (xNegEntry.is()) + xRes = xNegEntry; + else + { + Reference< XDictionaryEntry > xPosEntry( SearchDicList( xDList, + rWord, nLanguage, TRUE, TRUE ) ); + if (xPosEntry.is()) + xRes = xPosEntry; + } + } + + return xRes; +} + + BOOL SpellCheckerDispatcher::isValid_Impl( const OUString& rWord, LanguageType nLanguage, @@ -432,22 +468,13 @@ BOOL SpellCheckerDispatcher::isValid_Impl( } } - // countercheck against results from dictionary which have precedence! + // cross-check against results from dictionaries which have precedence! if (bCheckDics && GetDicList().is() && IsUseDicList( rProperties, GetPropSet() )) { - Reference< XDictionaryList > xDList( GetDicList(), UNO_QUERY ); - Reference< XDictionaryEntry > xPosEntry( SearchDicList( xDList, - aChkWord, nLanguage, TRUE, TRUE ) ); - if (xPosEntry.is()) - bRes = TRUE; - else - { - Reference< XDictionaryEntry > xNegEntry( SearchDicList( xDList, - aChkWord, nLanguage, FALSE, TRUE ) ); - if (xNegEntry.is()) - bRes = FALSE; - } + Reference< XDictionaryEntry > xTmp( lcl_GetRulingDictionaryEntry( aChkWord, nLanguage ) ); + if (xTmp.is()) + bRes = !xTmp->isNegative(); } } @@ -505,8 +532,8 @@ Reference< XSpellAlternatives > SpellCheckerDispatcher::spell_Impl( // try already instantiated services first { - const Reference< XSpellChecker > *pRef = - pEntry->aSvcRefs.getConstArray(); + const Reference< XSpellChecker > *pRef = pEntry->aSvcRefs.getConstArray(); + sal_Int32 nNumSugestions = -1; while (i <= pEntry->nLastTriedSvcIndex && (!bTmpResValid || xTmpRes.is()) ) { @@ -530,9 +557,24 @@ Reference< XSpellAlternatives > SpellCheckerDispatcher::spell_Impl( else bTmpResValid = FALSE; - // remember first found alternatives only + // 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; } @@ -555,6 +597,7 @@ Reference< XSpellAlternatives > SpellCheckerDispatcher::spell_Impl( //! thus the service needs not to now about it //aArgs.getArray()[1] <<= GetDicList(); + sal_Int32 nNumSugestions = -1; while (i < nLen && (!bTmpResValid || xTmpRes.is())) { // create specific service via it's implementation name @@ -596,9 +639,24 @@ Reference< XSpellAlternatives > SpellCheckerDispatcher::spell_Impl( else bTmpResValid = FALSE; - // remember first found alternatives only + // 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 = (INT16) i; ++i; @@ -634,42 +692,31 @@ Reference< XSpellAlternatives > SpellCheckerDispatcher::spell_Impl( if (GetDicList().is() && IsUseDicList( rProperties, GetPropSet() )) xDList = Reference< XDictionaryList >( GetDicList(), UNO_QUERY ); - // countercheck against results from dictionary which have precedence! + // cross-check against results from user-dictionaries which have precedence! if (bCheckDics && xDList.is()) { - Reference< XDictionaryEntry > xPosEntry( SearchDicList( xDList, - aChkWord, nLanguage, TRUE, TRUE ) ); - - if (xPosEntry.is()) + Reference< XDictionaryEntry > xTmp( lcl_GetRulingDictionaryEntry( aChkWord, nLanguage ) ); + if (xTmp.is()) { - xRes = NULL; // positive dictionaries have precedence over negative ones - eFailureType = -1; // no failure - } - else - { - Reference< XDictionaryEntry > xNegEntry( SearchDicList( xDList, - aChkWord, nLanguage, FALSE, TRUE ) ); - if (xNegEntry.is()) + if (xTmp->isNegative()) // positive entry found { eFailureType = SpellFailure::IS_NEGATIVE_WORD; // replacement text to be added to suggestions, if not empty - OUString aAddRplcTxt( xNegEntry->getReplacementText() ); + OUString aAddRplcTxt( xTmp->getReplacementText() ); // replacement text must not be in negative dictionary itself if (aAddRplcTxt.getLength() && !SearchDicList( xDList, aAddRplcTxt, nLanguage, FALSE, TRUE ).is()) { - aProposalList.Append( aAddRplcTxt ); -// // add suggestion if not already part of proposals -// if (!SeqHasEntry( aProposals, aAddRplcTxt)) -// { -// INT32 nLen = aProposals.getLength(); -// aProposals.realloc( nLen + 1); -// aProposals.getArray()[ nLen ] = aAddRplcTxt; -// } + aProposalList.Prepend( aAddRplcTxt ); } } + else // positive entry found + { + xRes = NULL; + eFailureType = -1; // no failure + } } } @@ -683,6 +730,7 @@ Reference< XSpellAlternatives > SpellCheckerDispatcher::spell_Impl( 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 ); @@ -693,7 +741,19 @@ Reference< XSpellAlternatives > SpellCheckerDispatcher::spell_Impl( xSetAlt->setFailureType( eFailureType ); } else - DBG_ASSERT( 0, "XSetSpellAlternatives not implemented!" ); + { + 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 ); + } + } } } |