INTEGRATION: CWS macosxspellchecker (1.1.2); FILE ADDED
2007/09/07 19:29:41 msicotte 1.1.2.2: #i77592#: Changed display name to match spec Mac OS X Spell Checker 2007/08/29 01:52:00 msicotte 1.1.2.1: #i77592#: new files to implement libmacosxspell680mxi.dylib
This commit is contained in:
parent
7398c6cf43
commit
4e386a897c
1 changed files with 731 additions and 0 deletions
731
lingucomponent/source/spellcheck/macosxspell/macspellimp.cxx
Normal file
731
lingucomponent/source/spellcheck/macosxspell/macspellimp.cxx
Normal file
|
@ -0,0 +1,731 @@
|
||||||
|
/*************************************************************************
|
||||||
|
*
|
||||||
|
* OpenOffice.org - a multi-platform office productivity suite
|
||||||
|
*
|
||||||
|
* $RCSfile: macspellimp.cxx,v $
|
||||||
|
*
|
||||||
|
* $Revision: 1.2 $
|
||||||
|
*
|
||||||
|
* last change: $Author: ihi $ $Date: 2007-09-13 18:05:25 $
|
||||||
|
*
|
||||||
|
* The Contents of this file are made available subject to
|
||||||
|
* the terms of GNU Lesser General Public License Version 2.1.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* GNU Lesser General Public License Version 2.1
|
||||||
|
* =============================================
|
||||||
|
* Copyright 2005 by Sun Microsystems, Inc.
|
||||||
|
* 901 San Antonio Road, Palo Alto, CA 94303, USA
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License version 2.1, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This library 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 for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||||
|
* MA 02111-1307 USA
|
||||||
|
*
|
||||||
|
************************************************************************/
|
||||||
|
|
||||||
|
// MARKER(update_precomp.py): autogen include statement, do not remove
|
||||||
|
#include "precompiled_lingucomponent.hxx"
|
||||||
|
|
||||||
|
#ifndef _COM_SUN_STAR_UNO_REFERENCE_H_
|
||||||
|
#include <com/sun/star/uno/Reference.h>
|
||||||
|
#endif
|
||||||
|
#ifndef _COM_SUN_STAR_LINGUISTIC2_XSEARCHABLEDICTIONARYLIST_HPP_
|
||||||
|
#include <com/sun/star/linguistic2/XSearchableDictionaryList.hpp>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <com/sun/star/linguistic2/SpellFailure.hpp>
|
||||||
|
#include <cppuhelper/factory.hxx> // helper for factories
|
||||||
|
#include <com/sun/star/registry/XRegistryKey.hpp>
|
||||||
|
|
||||||
|
#ifndef _TOOLS_DEBUG_HXX //autogen wg. DBG_ASSERT
|
||||||
|
#include <tools/debug.hxx>
|
||||||
|
#endif
|
||||||
|
#ifndef _UNOTOOLS_PROCESSFACTORY_HXX_
|
||||||
|
#include <unotools/processfactory.hxx>
|
||||||
|
#endif
|
||||||
|
#ifndef _OSL_MUTEX_HXX_
|
||||||
|
#include <osl/mutex.hxx>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//#include <hunspell.hxx>
|
||||||
|
#include <dictmgr.hxx>
|
||||||
|
|
||||||
|
#ifndef _MACSPELLIMP_H_
|
||||||
|
#include <macspellimp.hxx>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//#include <linguistic/lngprops.hxx>
|
||||||
|
#include "spelldta.hxx"
|
||||||
|
|
||||||
|
#ifndef INCLUDED_SVTOOLS_PATHOPTIONS_HXX
|
||||||
|
#include <svtools/pathoptions.hxx>
|
||||||
|
#endif
|
||||||
|
#ifndef INCLUDED_SVTOOLS_USEROPTIONS_HXX
|
||||||
|
#include <svtools/useroptions.hxx>
|
||||||
|
#endif
|
||||||
|
#include <osl/file.hxx>
|
||||||
|
#include <rtl/ustrbuf.hxx>
|
||||||
|
|
||||||
|
|
||||||
|
using namespace utl;
|
||||||
|
using namespace osl;
|
||||||
|
using namespace rtl;
|
||||||
|
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;
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
// dbg_dump for development
|
||||||
|
#if OSL_DEBUG_LEVEL > 1
|
||||||
|
#include <rtl/strbuf.hxx>
|
||||||
|
#include <rtl/ustring.hxx>
|
||||||
|
|
||||||
|
const sal_Char *dbg_dump(const rtl::OString &rStr)
|
||||||
|
{
|
||||||
|
static rtl::OStringBuffer aStr;
|
||||||
|
|
||||||
|
aStr = rtl::OStringBuffer(rStr);
|
||||||
|
aStr.append(static_cast<char>(0));
|
||||||
|
return aStr.getStr();
|
||||||
|
}
|
||||||
|
|
||||||
|
const sal_Char *dbg_dump(const rtl::OUString &rStr)
|
||||||
|
{
|
||||||
|
return dbg_dump(rtl::OUStringToOString(rStr, RTL_TEXTENCODING_UTF8));
|
||||||
|
}
|
||||||
|
|
||||||
|
const sal_Char *dbg_dump(rtl_String *pStr)
|
||||||
|
{
|
||||||
|
return dbg_dump(rtl::OString(pStr));
|
||||||
|
}
|
||||||
|
|
||||||
|
const sal_Char *dbg_dump(rtl_uString *pStr)
|
||||||
|
{
|
||||||
|
return dbg_dump(rtl::OUString(pStr));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
static BOOL operator == ( const Locale &rL1, const Locale &rL2 )
|
||||||
|
{
|
||||||
|
return rL1.Language == rL2.Language &&
|
||||||
|
rL1.Country == rL2.Country &&
|
||||||
|
rL1.Variant == rL2.Variant;
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
MacSpellChecker::MacSpellChecker() :
|
||||||
|
aEvtListeners ( GetLinguMutex() )
|
||||||
|
{
|
||||||
|
// aDicts = NULL;
|
||||||
|
aDEncs = NULL;
|
||||||
|
aDLocs = NULL;
|
||||||
|
aDNames = NULL;
|
||||||
|
bDisposing = FALSE;
|
||||||
|
pPropHelper = NULL;
|
||||||
|
numdict = 0;
|
||||||
|
NSApplicationLoad();
|
||||||
|
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
|
||||||
|
macSpell = [NSSpellChecker sharedSpellChecker];
|
||||||
|
macTag = [NSSpellChecker uniqueSpellDocumentTag];
|
||||||
|
[pool release];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MacSpellChecker::~MacSpellChecker()
|
||||||
|
{
|
||||||
|
// if (aDicts) {
|
||||||
|
// for (int i = 0; i < numdict; i++) {
|
||||||
|
// if (aDicts[i]) delete aDicts[i];
|
||||||
|
// aDicts[i] = NULL;
|
||||||
|
// }
|
||||||
|
// delete[] aDicts;
|
||||||
|
// }
|
||||||
|
// aDicts = NULL;
|
||||||
|
numdict = 0;
|
||||||
|
if (aDEncs) delete[] aDEncs;
|
||||||
|
aDEncs = NULL;
|
||||||
|
if (aDLocs) delete[] aDLocs;
|
||||||
|
aDLocs = NULL;
|
||||||
|
if (aDNames) delete[] aDNames;
|
||||||
|
aDNames = NULL;
|
||||||
|
if (pPropHelper)
|
||||||
|
pPropHelper->RemoveAsPropListener();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
PropertyHelper_Spell & MacSpellChecker::GetPropHelper_Impl()
|
||||||
|
{
|
||||||
|
if (!pPropHelper)
|
||||||
|
{
|
||||||
|
Reference< XPropertySet > xPropSet( GetLinguProperties(), UNO_QUERY );
|
||||||
|
|
||||||
|
pPropHelper = new PropertyHelper_Spell( (XSpellChecker *) this, xPropSet );
|
||||||
|
xPropHelper = pPropHelper;
|
||||||
|
pPropHelper->AddAsPropListener(); //! after a reference is established
|
||||||
|
}
|
||||||
|
return *pPropHelper;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Sequence< Locale > SAL_CALL MacSpellChecker::getLocales()
|
||||||
|
throw(RuntimeException)
|
||||||
|
{
|
||||||
|
MutexGuard aGuard( GetLinguMutex() );
|
||||||
|
|
||||||
|
// this routine should return the locales supported by the installed
|
||||||
|
// dictionaries. So here we need to parse both the user edited
|
||||||
|
// dictionary list and the shared dictionary list
|
||||||
|
// to see what dictionaries the admin/user has installed
|
||||||
|
|
||||||
|
int numusr; // number of user dictionary entries
|
||||||
|
int numshr; // number of shared dictionary entries
|
||||||
|
dictentry * spdict; // shared dict entry pointer
|
||||||
|
dictentry * updict; // user dict entry pointer
|
||||||
|
SvtPathOptions aPathOpt;
|
||||||
|
rtl_TextEncoding aEnc = RTL_TEXTENCODING_UTF8;
|
||||||
|
|
||||||
|
std::vector<objc_object *> postspdict;
|
||||||
|
//std::vector<dictentry *> postspdict;
|
||||||
|
std::vector<dictentry *> postupdict;
|
||||||
|
|
||||||
|
|
||||||
|
if (!numdict) {
|
||||||
|
|
||||||
|
// invoke a dictionary manager to get the user dictionary list
|
||||||
|
// TODO How on Mac OS X?
|
||||||
|
|
||||||
|
// invoke a second dictionary manager to get the shared dictionary list
|
||||||
|
NSArray *aLocales = [NSLocale availableLocaleIdentifiers];
|
||||||
|
|
||||||
|
//Test for existence of the dictionaries
|
||||||
|
for (unsigned int i = 0; i < [aLocales count]; i++)
|
||||||
|
{
|
||||||
|
if( [macSpell setLanguage:[aLocales objectAtIndex:i] ] )
|
||||||
|
{
|
||||||
|
postspdict.push_back( [ aLocales objectAtIndex:i ] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
numusr = postupdict.size();
|
||||||
|
numshr = postspdict.size();
|
||||||
|
|
||||||
|
// we really should merge these and remove duplicates but since
|
||||||
|
// users can name their dictionaries anything they want it would
|
||||||
|
// be impossible to know if a real duplication exists unless we
|
||||||
|
// add some unique key to each myspell dictionary
|
||||||
|
numdict = numshr + numusr;
|
||||||
|
|
||||||
|
if (numdict) {
|
||||||
|
aDLocs = new Locale [numdict];
|
||||||
|
aDEncs = new rtl_TextEncoding [numdict];
|
||||||
|
aDNames = new OUString [numdict];
|
||||||
|
aSuppLocales.realloc(numdict);
|
||||||
|
Locale * pLocale = aSuppLocales.getArray();
|
||||||
|
int numlocs = 0;
|
||||||
|
int newloc;
|
||||||
|
int i,j;
|
||||||
|
int k = 0;
|
||||||
|
|
||||||
|
//first add the user dictionaries
|
||||||
|
//TODO for MAC?
|
||||||
|
|
||||||
|
// now add the shared dictionaries
|
||||||
|
for (i = 0; i < numshr; i++) {
|
||||||
|
NSDictionary *aLocDict = [ NSLocale componentsFromLocaleIdentifier:postspdict[i] ];
|
||||||
|
NSString* aLang = [ aLocDict objectForKey:NSLocaleLanguageCode ];
|
||||||
|
NSString* aCountry = [ aLocDict objectForKey:NSLocaleCountryCode ];
|
||||||
|
OUString lang([aLang cStringUsingEncoding: NSUTF8StringEncoding], [aLang length], aEnc);
|
||||||
|
OUString country([ aCountry cStringUsingEncoding: NSUTF8StringEncoding], [aCountry length], aEnc);
|
||||||
|
Locale nLoc( lang, country, OUString() );
|
||||||
|
newloc = 1;
|
||||||
|
//eliminate duplicates (is this needed for MacOS?)
|
||||||
|
for (j = 0; j < numlocs; j++) {
|
||||||
|
if (nLoc == pLocale[j]) newloc = 0;
|
||||||
|
}
|
||||||
|
if (newloc) {
|
||||||
|
pLocale[numlocs] = nLoc;
|
||||||
|
numlocs++;
|
||||||
|
}
|
||||||
|
aDLocs[k] = nLoc;
|
||||||
|
//pointer to Hunspell dictionary - not needed for MAC
|
||||||
|
//aDicts[k] = NULL;
|
||||||
|
aDEncs[k] = 0;
|
||||||
|
// Dictionary file names not valid for Mac Spell
|
||||||
|
//aDNames[k] = aPathOpt.GetLinguisticPath() + A2OU("/ooo/") + A2OU(postspdict[i]->filename);
|
||||||
|
k++;
|
||||||
|
}
|
||||||
|
|
||||||
|
aSuppLocales.realloc(numlocs);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
/* no dictionary.lst found so register no dictionaries */
|
||||||
|
numdict = 0;
|
||||||
|
//aDicts = NULL;
|
||||||
|
aDEncs = NULL;
|
||||||
|
aDLocs = NULL;
|
||||||
|
aDNames = NULL;
|
||||||
|
aSuppLocales.realloc(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* de-allocation of memory is handled inside the DictMgr */
|
||||||
|
updict = NULL;
|
||||||
|
spdict = NULL;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return aSuppLocales;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
sal_Bool SAL_CALL MacSpellChecker::hasLocale(const Locale& rLocale)
|
||||||
|
throw(RuntimeException)
|
||||||
|
{
|
||||||
|
MutexGuard aGuard( GetLinguMutex() );
|
||||||
|
|
||||||
|
BOOL bRes = FALSE;
|
||||||
|
if (!aSuppLocales.getLength())
|
||||||
|
getLocales();
|
||||||
|
|
||||||
|
INT32 nLen = aSuppLocales.getLength();
|
||||||
|
for (INT32 i = 0; i < nLen; ++i)
|
||||||
|
{
|
||||||
|
const Locale *pLocale = aSuppLocales.getConstArray();
|
||||||
|
if (rLocale == pLocale[i])
|
||||||
|
{
|
||||||
|
bRes = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return bRes;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
INT16 MacSpellChecker::GetSpellFailure( const OUString &rWord, const Locale &rLocale )
|
||||||
|
{
|
||||||
|
rtl_TextEncoding aEnc;
|
||||||
|
|
||||||
|
// initialize a myspell object for each dictionary once
|
||||||
|
// (note: mutex is held higher up in isValid)
|
||||||
|
|
||||||
|
|
||||||
|
INT16 nRes = -1;
|
||||||
|
|
||||||
|
// first handle smart quotes both single and double
|
||||||
|
OUStringBuffer rBuf(rWord);
|
||||||
|
sal_Int32 n = rBuf.getLength();
|
||||||
|
sal_Unicode c;
|
||||||
|
for (sal_Int32 ix=0; ix < n; ix++) {
|
||||||
|
c = rBuf.charAt(ix);
|
||||||
|
if ((c == 0x201C) || (c == 0x201D)) rBuf.setCharAt(ix,(sal_Unicode)0x0022);
|
||||||
|
if ((c == 0x2018) || (c == 0x2019)) rBuf.setCharAt(ix,(sal_Unicode)0x0027);
|
||||||
|
}
|
||||||
|
OUString nWord(rBuf.makeStringAndClear());
|
||||||
|
|
||||||
|
if (n)
|
||||||
|
{
|
||||||
|
aEnc = 0;
|
||||||
|
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
|
||||||
|
NSString* aNSStr = [[NSString alloc] initWithCharacters: nWord.getStr() length: nWord.getLength()];
|
||||||
|
NSString* aLang = [[NSString alloc] initWithCharacters: rLocale.Language.getStr() length: rLocale.Language.getLength()];
|
||||||
|
if(rLocale.Country.getLength()>0)
|
||||||
|
{
|
||||||
|
NSString* aCountry = [[NSString alloc] initWithCharacters: rLocale.Country.getStr() length: rLocale.Country.getLength()];
|
||||||
|
NSString* aTag = @"_";
|
||||||
|
NSString* aTaggedCountry = [aTag stringByAppendingString:aCountry];
|
||||||
|
[aLang autorelease];
|
||||||
|
aLang = [aLang stringByAppendingString:aTaggedCountry];
|
||||||
|
}
|
||||||
|
|
||||||
|
int aCount;
|
||||||
|
NSRange range = [macSpell checkSpellingOfString:aNSStr startingAt:0 language:aLang wrap:FALSE inSpellDocumentWithTag:macTag wordCount:&aCount];
|
||||||
|
int rVal = 0;
|
||||||
|
if(range.length>0)
|
||||||
|
{
|
||||||
|
rVal = -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rVal = 1;
|
||||||
|
}
|
||||||
|
[pool release];
|
||||||
|
if (rVal != 1)
|
||||||
|
{
|
||||||
|
nRes = SpellFailure::SPELLING_ERROR;
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nRes;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
sal_Bool SAL_CALL
|
||||||
|
MacSpellChecker::isValid( const OUString& rWord, const Locale& rLocale,
|
||||||
|
const PropertyValues& rProperties )
|
||||||
|
throw(IllegalArgumentException, RuntimeException)
|
||||||
|
{
|
||||||
|
MutexGuard aGuard( GetLinguMutex() );
|
||||||
|
|
||||||
|
if (rLocale == Locale() || !rWord.getLength())
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
if (!hasLocale( rLocale ))
|
||||||
|
#ifdef LINGU_EXCEPTIONS
|
||||||
|
throw( IllegalArgumentException() );
|
||||||
|
#else
|
||||||
|
return TRUE;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Get property values to be used.
|
||||||
|
// These are be the default values set in the SN_LINGU_PROPERTIES
|
||||||
|
// PropertySet which are overridden by the supplied ones from the
|
||||||
|
// last argument.
|
||||||
|
// You'll probably like to use a simplier solution than the provided
|
||||||
|
// one using the PropertyHelper_Spell.
|
||||||
|
|
||||||
|
PropertyHelper_Spell &rHelper = GetPropHelper();
|
||||||
|
rHelper.SetTmpPropVals( rProperties );
|
||||||
|
|
||||||
|
INT16 nFailure = GetSpellFailure( rWord, rLocale );
|
||||||
|
if (nFailure != -1)
|
||||||
|
{
|
||||||
|
INT16 nLang = LocaleToLanguage( rLocale );
|
||||||
|
// postprocess result for errors that should be ignored
|
||||||
|
if ( (!rHelper.IsSpellUpperCase() && IsUpper( rWord, nLang ))
|
||||||
|
|| (!rHelper.IsSpellWithDigits() && HasDigits( rWord ))
|
||||||
|
|| (!rHelper.IsSpellCapitalization()
|
||||||
|
&& nFailure == SpellFailure::CAPTION_ERROR)
|
||||||
|
)
|
||||||
|
nFailure = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (nFailure == -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Reference< XSpellAlternatives >
|
||||||
|
MacSpellChecker::GetProposals( const OUString &rWord, const Locale &rLocale )
|
||||||
|
{
|
||||||
|
// Retrieves the return values for the 'spell' function call in case
|
||||||
|
// of a misspelled word.
|
||||||
|
// Especially it may give a list of suggested (correct) words:
|
||||||
|
|
||||||
|
Reference< XSpellAlternatives > xRes;
|
||||||
|
// note: mutex is held by higher up by spell which covers both
|
||||||
|
|
||||||
|
INT16 nLang = LocaleToLanguage( rLocale );
|
||||||
|
rtl_TextEncoding aEnc = RTL_TEXTENCODING_UTF8;
|
||||||
|
int count;
|
||||||
|
Sequence< OUString > aStr( 0 );
|
||||||
|
|
||||||
|
// first handle smart quotes (single and double)
|
||||||
|
OUStringBuffer rBuf(rWord);
|
||||||
|
sal_Int32 n = rBuf.getLength();
|
||||||
|
sal_Unicode c;
|
||||||
|
for (sal_Int32 ix=0; ix < n; ix++) {
|
||||||
|
c = rBuf.charAt(ix);
|
||||||
|
if ((c == 0x201C) || (c == 0x201D)) rBuf.setCharAt(ix,(sal_Unicode)0x0022);
|
||||||
|
if ((c == 0x2018) || (c == 0x2019)) rBuf.setCharAt(ix,(sal_Unicode)0x0027);
|
||||||
|
}
|
||||||
|
OUString nWord(rBuf.makeStringAndClear());
|
||||||
|
|
||||||
|
if (n)
|
||||||
|
{
|
||||||
|
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
|
||||||
|
NSString* aNSStr = [[NSString alloc] initWithCharacters: nWord.getStr() length: nWord.getLength()];
|
||||||
|
NSString* aLang = [[NSString alloc] initWithCharacters: rLocale.Language.getStr() length: rLocale.Language.getLength() ];
|
||||||
|
if(rLocale.Country.getLength()>0)
|
||||||
|
{
|
||||||
|
NSString* aCountry = [[NSString alloc] initWithCharacters: rLocale.Country.getStr() length: rLocale.Country.getLength() ];
|
||||||
|
NSString* aTag = @"_";
|
||||||
|
NSString* aTaggedCountry = [aTag stringByAppendingString:aCountry];
|
||||||
|
[aLang autorelease];
|
||||||
|
aLang = [aLang stringByAppendingString:aTaggedCountry];
|
||||||
|
}
|
||||||
|
[macSpell setLanguage:aLang];
|
||||||
|
NSArray *guesses = [macSpell guessesForWord:aNSStr];
|
||||||
|
count = [guesses count];
|
||||||
|
if (count)
|
||||||
|
{
|
||||||
|
aStr.realloc( count );
|
||||||
|
OUString *pStr = aStr.getArray();
|
||||||
|
for (int ii=0; ii < count; ii++)
|
||||||
|
{
|
||||||
|
// if needed add: if (suglst[ii] == NULL) continue;
|
||||||
|
NSString* guess = [guesses objectAtIndex:ii];
|
||||||
|
OUString cvtwrd([guess cStringUsingEncoding: NSUTF8StringEncoding], [guess length], aEnc);
|
||||||
|
pStr[ii] = cvtwrd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
[pool release];
|
||||||
|
}
|
||||||
|
|
||||||
|
// now return an empty alternative for no suggestions or the list of alternatives if some found
|
||||||
|
SpellAlternatives *pAlt = new SpellAlternatives;
|
||||||
|
String aTmp(rWord);
|
||||||
|
pAlt->SetWordLanguage( aTmp, nLang );
|
||||||
|
pAlt->SetFailureType( SpellFailure::SPELLING_ERROR );
|
||||||
|
pAlt->SetAlternatives( aStr );
|
||||||
|
xRes = pAlt;
|
||||||
|
return xRes;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Reference< XSpellAlternatives > SAL_CALL
|
||||||
|
MacSpellChecker::spell( const OUString& rWord, const Locale& rLocale,
|
||||||
|
const PropertyValues& rProperties )
|
||||||
|
throw(IllegalArgumentException, RuntimeException)
|
||||||
|
{
|
||||||
|
MutexGuard aGuard( GetLinguMutex() );
|
||||||
|
|
||||||
|
if (rLocale == Locale() || !rWord.getLength())
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (!hasLocale( rLocale ))
|
||||||
|
#ifdef LINGU_EXCEPTIONS
|
||||||
|
throw( IllegalArgumentException() );
|
||||||
|
#else
|
||||||
|
return NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
Reference< XSpellAlternatives > xAlt;
|
||||||
|
if (!isValid( rWord, rLocale, rProperties ))
|
||||||
|
{
|
||||||
|
xAlt = GetProposals( rWord, rLocale );
|
||||||
|
}
|
||||||
|
return xAlt;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Reference< XInterface > SAL_CALL MacSpellChecker_CreateInstance(
|
||||||
|
const Reference< XMultiServiceFactory > & /*rSMgr*/ )
|
||||||
|
throw(Exception)
|
||||||
|
{
|
||||||
|
|
||||||
|
Reference< XInterface > xService = (cppu::OWeakObject*) new MacSpellChecker;
|
||||||
|
return xService;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
sal_Bool SAL_CALL
|
||||||
|
MacSpellChecker::addLinguServiceEventListener(
|
||||||
|
const Reference< XLinguServiceEventListener >& rxLstnr )
|
||||||
|
throw(RuntimeException)
|
||||||
|
{
|
||||||
|
MutexGuard aGuard( GetLinguMutex() );
|
||||||
|
|
||||||
|
BOOL bRes = FALSE;
|
||||||
|
if (!bDisposing && rxLstnr.is())
|
||||||
|
{
|
||||||
|
bRes = GetPropHelper().addLinguServiceEventListener( rxLstnr );
|
||||||
|
}
|
||||||
|
return bRes;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
sal_Bool SAL_CALL
|
||||||
|
MacSpellChecker::removeLinguServiceEventListener(
|
||||||
|
const Reference< XLinguServiceEventListener >& rxLstnr )
|
||||||
|
throw(RuntimeException)
|
||||||
|
{
|
||||||
|
MutexGuard aGuard( GetLinguMutex() );
|
||||||
|
|
||||||
|
BOOL bRes = FALSE;
|
||||||
|
if (!bDisposing && rxLstnr.is())
|
||||||
|
{
|
||||||
|
DBG_ASSERT( xPropHelper.is(), "xPropHelper non existent" );
|
||||||
|
bRes = GetPropHelper().removeLinguServiceEventListener( rxLstnr );
|
||||||
|
}
|
||||||
|
return bRes;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
OUString SAL_CALL
|
||||||
|
MacSpellChecker::getServiceDisplayName( const Locale& /*rLocale*/ )
|
||||||
|
throw(RuntimeException)
|
||||||
|
{
|
||||||
|
MutexGuard aGuard( GetLinguMutex() );
|
||||||
|
return A2OU( "Mac OS X Spell Checker" );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SAL_CALL
|
||||||
|
MacSpellChecker::initialize( const Sequence< Any >& rArguments )
|
||||||
|
throw(Exception, RuntimeException)
|
||||||
|
{
|
||||||
|
MutexGuard aGuard( GetLinguMutex() );
|
||||||
|
|
||||||
|
if (!pPropHelper)
|
||||||
|
{
|
||||||
|
INT32 nLen = rArguments.getLength();
|
||||||
|
if (2 == nLen)
|
||||||
|
{
|
||||||
|
Reference< XPropertySet > xPropSet;
|
||||||
|
rArguments.getConstArray()[0] >>= xPropSet;
|
||||||
|
//rArguments.getConstArray()[1] >>= xDicList;
|
||||||
|
|
||||||
|
//! Pointer allows for access of the non-UNO functions.
|
||||||
|
//! And the reference to the UNO-functions while increasing
|
||||||
|
//! the ref-count and will implicitly free the memory
|
||||||
|
//! when the object is not longer used.
|
||||||
|
pPropHelper = new PropertyHelper_Spell( (XSpellChecker *) this, xPropSet );
|
||||||
|
xPropHelper = pPropHelper;
|
||||||
|
pPropHelper->AddAsPropListener(); //! after a reference is established
|
||||||
|
}
|
||||||
|
else
|
||||||
|
DBG_ERROR( "wrong number of arguments in sequence" );
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SAL_CALL
|
||||||
|
MacSpellChecker::dispose()
|
||||||
|
throw(RuntimeException)
|
||||||
|
{
|
||||||
|
MutexGuard aGuard( GetLinguMutex() );
|
||||||
|
|
||||||
|
if (!bDisposing)
|
||||||
|
{
|
||||||
|
bDisposing = TRUE;
|
||||||
|
EventObject aEvtObj( (XSpellChecker *) this );
|
||||||
|
aEvtListeners.disposeAndClear( aEvtObj );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SAL_CALL
|
||||||
|
MacSpellChecker::addEventListener( const Reference< XEventListener >& rxListener )
|
||||||
|
throw(RuntimeException)
|
||||||
|
{
|
||||||
|
MutexGuard aGuard( GetLinguMutex() );
|
||||||
|
|
||||||
|
if (!bDisposing && rxListener.is())
|
||||||
|
aEvtListeners.addInterface( rxListener );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SAL_CALL
|
||||||
|
MacSpellChecker::removeEventListener( const Reference< XEventListener >& rxListener )
|
||||||
|
throw(RuntimeException)
|
||||||
|
{
|
||||||
|
MutexGuard aGuard( GetLinguMutex() );
|
||||||
|
|
||||||
|
if (!bDisposing && rxListener.is())
|
||||||
|
aEvtListeners.removeInterface( rxListener );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
// Service specific part
|
||||||
|
//
|
||||||
|
|
||||||
|
OUString SAL_CALL MacSpellChecker::getImplementationName()
|
||||||
|
throw(RuntimeException)
|
||||||
|
{
|
||||||
|
MutexGuard aGuard( GetLinguMutex() );
|
||||||
|
|
||||||
|
return getImplementationName_Static();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
sal_Bool SAL_CALL MacSpellChecker::supportsService( const OUString& ServiceName )
|
||||||
|
throw(RuntimeException)
|
||||||
|
{
|
||||||
|
MutexGuard aGuard( GetLinguMutex() );
|
||||||
|
|
||||||
|
Sequence< OUString > aSNL = getSupportedServiceNames();
|
||||||
|
const OUString * pArray = aSNL.getConstArray();
|
||||||
|
for( INT32 i = 0; i < aSNL.getLength(); i++ )
|
||||||
|
if( pArray[i] == ServiceName )
|
||||||
|
return TRUE;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Sequence< OUString > SAL_CALL MacSpellChecker::getSupportedServiceNames()
|
||||||
|
throw(RuntimeException)
|
||||||
|
{
|
||||||
|
MutexGuard aGuard( GetLinguMutex() );
|
||||||
|
|
||||||
|
return getSupportedServiceNames_Static();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Sequence< OUString > MacSpellChecker::getSupportedServiceNames_Static()
|
||||||
|
throw()
|
||||||
|
{
|
||||||
|
MutexGuard aGuard( GetLinguMutex() );
|
||||||
|
|
||||||
|
Sequence< OUString > aSNS( 1 ); // auch mehr als 1 Service moeglich
|
||||||
|
aSNS.getArray()[0] = A2OU( SN_SPELLCHECKER );
|
||||||
|
return aSNS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
sal_Bool SAL_CALL MacSpellChecker_writeInfo(
|
||||||
|
void * /*pServiceManager*/, registry::XRegistryKey * pRegistryKey )
|
||||||
|
{
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
String aImpl( '/' );
|
||||||
|
aImpl += MacSpellChecker::getImplementationName_Static().getStr();
|
||||||
|
aImpl.AppendAscii( "/UNO/SERVICES" );
|
||||||
|
Reference< registry::XRegistryKey > xNewKey =
|
||||||
|
pRegistryKey->createKey( aImpl );
|
||||||
|
Sequence< OUString > aServices =
|
||||||
|
MacSpellChecker::getSupportedServiceNames_Static();
|
||||||
|
for( INT32 i = 0; i < aServices.getLength(); i++ )
|
||||||
|
xNewKey->createKey( aServices.getConstArray()[i] );
|
||||||
|
|
||||||
|
return sal_True;
|
||||||
|
}
|
||||||
|
catch(Exception &)
|
||||||
|
{
|
||||||
|
return sal_False;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void * SAL_CALL MacSpellChecker_getFactory( const sal_Char * pImplName,
|
||||||
|
XMultiServiceFactory * pServiceManager, void * )
|
||||||
|
{
|
||||||
|
void * pRet = 0;
|
||||||
|
if ( !MacSpellChecker::getImplementationName_Static().compareToAscii( pImplName ) )
|
||||||
|
{
|
||||||
|
Reference< XSingleServiceFactory > xFactory =
|
||||||
|
cppu::createOneInstanceFactory(
|
||||||
|
pServiceManager,
|
||||||
|
MacSpellChecker::getImplementationName_Static(),
|
||||||
|
MacSpellChecker_CreateInstance,
|
||||||
|
MacSpellChecker::getSupportedServiceNames_Static());
|
||||||
|
// acquire, because we return an interface pointer instead of a reference
|
||||||
|
xFactory->acquire();
|
||||||
|
pRet = xFactory.get();
|
||||||
|
}
|
||||||
|
return pRet;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
Loading…
Reference in a new issue