Files
libreoffice/svx/source/editeng/unolingu.cxx

886 lines
25 KiB
C++
Raw Normal View History

2000-09-18 16:07:07 +00:00
/*************************************************************************
*
* $RCSfile: unolingu.cxx,v $
*
* $Revision: 1.11 $
2000-09-18 16:07:07 +00:00
*
* last change: $Author: tl $ $Date: 2002-02-19 13:25:41 $
2000-09-18 16:07:07 +00:00
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
*
* - GNU Lesser General Public License Version 2.1
* - Sun Industry Standards Source License Version 1.1
*
* Sun Microsystems Inc., October, 2000
*
* GNU Lesser General Public License Version 2.1
* =============================================
* Copyright 2000 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
*
*
* Sun Industry Standards Source License Version 1.1
* =================================================
* The contents of this file are subject to the Sun Industry Standards
* Source License Version 1.1 (the "License"); You may not use this file
* except in compliance with the License. You may obtain a copy of the
* License at http://www.openoffice.org/license.html.
*
* Software provided under this License is provided on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
* WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
* MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
* See the License for the specific provisions governing your rights and
* obligations concerning the Software.
*
* The Initial Developer of the Original Code is: Sun Microsystems, Inc.
*
* Copyright: 2000 by Sun Microsystems, Inc.
*
* All Rights Reserved.
*
* Contributor(s): _______________________________________
*
*
************************************************************************/
#pragma hdrstop
#include <unolingu.hxx>
#include <cppuhelper/implbase1.hxx> // helper for implementations
2000-09-18 16:07:07 +00:00
#ifndef _LANG_HXX
#include <tools/lang.hxx>
#endif
#ifndef _TOOLS_DEBUG_HXX
#include <tools/debug.hxx>
#endif
#ifndef _URLOBJ_HXX
#include <tools/urlobj.hxx>
#endif
#ifndef INCLUDED_SVTOOLS_PATHOPTIONS_HXX
#include <svtools/pathoptions.hxx>
#endif
2000-09-18 16:07:07 +00:00
#ifndef _COM_SUN_STAR_FRAME_XSTORABLE_HPP_
#include <com/sun/star/frame/XStorable.hpp>
#endif
#ifndef _COM_SUN_STAR_FRAME_XMODEL_HPP_
#include <com/sun/star/frame/XModel.hpp>
#endif
#ifndef _COM_SUN_STAR_LANG_XEVENTLISTENER_HPP_
#include <com/sun/star/lang/XEventListener.hpp>
#endif
2000-10-23 11:08:49 +00:00
#include <comphelper/processfactory.hxx>
2000-09-18 16:07:07 +00:00
#ifndef _CPPUHELPER_IMPLBASE1_HXX_
#include <cppuhelper/implbase1.hxx> // helper for implementations
#endif
#ifndef _ISOLANG_HXX
#include <tools/isolang.hxx>
#endif
#ifndef _SVTOOLS_LINGUCFG_HXX_
#include <svtools/lingucfg.hxx>
#endif
2000-09-18 16:07:07 +00:00
#ifndef _SV_MSGBOX_HXX
#include <vcl/msgbox.hxx>
#endif
#ifndef _SHL_HXX
#include <tools/shl.hxx>
#endif
#ifndef _SVX_DIALMGR_HXX
#include <dialmgr.hxx>
#endif
#include "dialogs.hrc"
using namespace ::rtl;
2000-10-23 11:08:49 +00:00
using namespace ::comphelper;
2000-09-18 16:07:07 +00:00
using namespace ::com::sun::star;
using namespace ::com::sun::star::util;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::frame;
2000-10-27 09:25:31 +00:00
using namespace ::com::sun::star::linguistic2;
2000-09-18 16:07:07 +00:00
///////////////////////////////////////////////////////////////////////////
static Reference< XLinguServiceManager > GetLngSvcMgr_Impl()
{
Reference< XLinguServiceManager > xRes;
Reference< XMultiServiceFactory > xMgr = getProcessServiceFactory();
if (xMgr.is())
{
xRes = Reference< XLinguServiceManager > ( xMgr->createInstance(
OUString( RTL_CONSTASCII_USTRINGPARAM (
"com.sun.star.linguistic2.LinguServiceManager" ) ) ), UNO_QUERY ) ;
}
return xRes;
}
///////////////////////////////////////////////////////////////////////////
//! Dummy implementation in order to avoid loading of lingu DLL
//! when only the XSupportedLocales interface is used.
//! The dummy accesses the real implementation (and thus loading the DLL)
//! when "real" work needs to be done only.
class ThesDummy_Impl :
public cppu::WeakImplHelper1
<
::com::sun::star::linguistic2::XThesaurus
>
{
Reference< XThesaurus > xThes; // the real one...
Sequence< Locale > *pLocaleSeq;
void GetCfgLocales();
void ClearLocales()
{
delete pLocaleSeq; pLocaleSeq = 0;
}
public:
ThesDummy_Impl() : pLocaleSeq(0) {}
~ThesDummy_Impl();
// XSupportedLocales
virtual ::com::sun::star::uno::Sequence<
::com::sun::star::lang::Locale > SAL_CALL
getLocales()
throw(::com::sun::star::uno::RuntimeException);
virtual sal_Bool SAL_CALL
hasLocale( const ::com::sun::star::lang::Locale& rLocale )
throw(::com::sun::star::uno::RuntimeException);
// XThesaurus
virtual ::com::sun::star::uno::Sequence<
::com::sun::star::uno::Reference<
::com::sun::star::linguistic2::XMeaning > > SAL_CALL
queryMeanings( const ::rtl::OUString& rTerm,
const ::com::sun::star::lang::Locale& rLocale,
const ::com::sun::star::beans::PropertyValues& rProperties )
throw(::com::sun::star::lang::IllegalArgumentException,
::com::sun::star::uno::RuntimeException);
};
ThesDummy_Impl::~ThesDummy_Impl()
{
delete pLocaleSeq;
}
void ThesDummy_Impl::GetCfgLocales()
{
if (!pLocaleSeq)
{
SvtLinguConfigItem aCfg( String::CreateFromAscii( "Office.Linguistic/ServiceManager" ) );
String aNode( String::CreateFromAscii( "ThesaurusList" ) );
Sequence < OUString > aNodeNames( aCfg.GetNodeNames( aNode ) );
const OUString *pNodeNames = aNodeNames.getConstArray();
INT32 nLen = aNodeNames.getLength();
pLocaleSeq = new Sequence< Locale >( nLen );
Locale *pLocale = pLocaleSeq->getArray();
for (INT32 i = 0; i < nLen; ++i)
{
pLocale[i] = SvxCreateLocale(
ConvertIsoStringToLanguage( pNodeNames[i] ) );
}
}
}
uno::Sequence< lang::Locale > SAL_CALL
ThesDummy_Impl::getLocales()
throw(uno::RuntimeException)
{
if (xThes.is())
return xThes->getLocales();
else if (!pLocaleSeq)
GetCfgLocales();
return *pLocaleSeq;
}
sal_Bool SAL_CALL
ThesDummy_Impl::hasLocale( const lang::Locale& rLocale )
throw(uno::RuntimeException)
{
if (xThes.is())
return xThes->hasLocale( rLocale );
else if (!pLocaleSeq)
GetCfgLocales();
BOOL bFound = FALSE;
INT32 nLen = pLocaleSeq->getLength();
const Locale *pLocale = pLocaleSeq->getConstArray();
const Locale *pEnd = pLocale + nLen;
for ( ; pLocale < pEnd && !bFound; ++pLocale)
{
bFound = pLocale->Language == rLocale.Language &&
pLocale->Country == rLocale.Country &&
pLocale->Variant == rLocale.Variant;
}
return bFound;
}
uno::Sequence< uno::Reference< linguistic2::XMeaning > > SAL_CALL
ThesDummy_Impl::queryMeanings(
const rtl::OUString& rTerm,
const lang::Locale& rLocale,
const beans::PropertyValues& rProperties )
throw(lang::IllegalArgumentException,
uno::RuntimeException)
{
uno::Sequence< uno::Reference< linguistic2::XMeaning > > aRes;
if (!xThes.is())
{
Reference< XLinguServiceManager > xLngSvcMgr( GetLngSvcMgr_Impl() );
if (xLngSvcMgr.is())
{
xThes = xLngSvcMgr->getThesaurus();
ClearLocales();
}
}
DBG_ASSERT( xThes.is(), "Thesaurus missing" );
if (xThes.is())
aRes = xThes->queryMeanings( rTerm, rLocale, rProperties );
return aRes;
}
2000-09-18 16:07:07 +00:00
///////////////////////////////////////////////////////////////////////////
typedef cppu::WeakImplHelper1 < XEventListener > LinguMgrAppExitLstnrBaseClass;
class LinguMgrAppExitLstnr : public LinguMgrAppExitLstnrBaseClass
{
Reference< XComponent > xDesktop;
public:
LinguMgrAppExitLstnr();
virtual ~LinguMgrAppExitLstnr();
virtual void AtExit() = 0;
// lang::XEventListener
virtual void SAL_CALL disposing(const EventObject& rSource)
throw( RuntimeException );
};
LinguMgrAppExitLstnr::LinguMgrAppExitLstnr()
{
// add object to frame::Desktop EventListeners in order to properly call
// the AtExit function at appliction exit.
Reference< XMultiServiceFactory > xMgr = getProcessServiceFactory();
if ( xMgr.is() )
{
xDesktop = Reference< XComponent > ( xMgr->createInstance(
2000-10-24 10:38:57 +00:00
OUString( RTL_CONSTASCII_USTRINGPARAM ( "com.sun.star.frame.Desktop" ) ) ), UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
if (xDesktop.is())
xDesktop->addEventListener( this );
}
}
LinguMgrAppExitLstnr::~LinguMgrAppExitLstnr()
{
if (xDesktop.is())
{
xDesktop->removeEventListener( this );
xDesktop = NULL; //! release reference to desktop
}
DBG_ASSERT(!xDesktop.is(), "reference to desktop should be realeased");
}
void LinguMgrAppExitLstnr::disposing(const EventObject& rSource)
throw( RuntimeException )
{
if (xDesktop.is() && rSource.Source == xDesktop)
{
xDesktop->removeEventListener( this );
xDesktop = NULL; //! release reference to desktop
AtExit();
}
}
///////////////////////////////////////////////////////////////////////////
class LinguMgrExitLstnr : public LinguMgrAppExitLstnr
{
public:
virtual void AtExit();
};
void LinguMgrExitLstnr::AtExit()
{
// release references
2000-10-27 09:25:31 +00:00
LinguMgr::xLngSvcMgr = 0;
2000-09-18 16:07:07 +00:00
LinguMgr::xSpell = 0;
LinguMgr::xHyph = 0;
LinguMgr::xThes = 0;
LinguMgr::xDicList = 0;
LinguMgr::xProp = 0;
LinguMgr::xIgnoreAll = 0;
LinguMgr::xChangeAll = 0;
LinguMgr::bExiting = sal_True;
//TL:TODO: MBA fragen wie ich ohne Absturz hier meinen Speicher
// wieder freibekomme...
//delete LinguMgr::pExitLstnr;
LinguMgr::pExitLstnr = 0;
}
///////////////////////////////////////////////////////////////////////////
2000-10-27 09:25:31 +00:00
2000-09-18 16:07:07 +00:00
// static member initialization
LinguMgrExitLstnr * LinguMgr::pExitLstnr = 0;
sal_Bool LinguMgr::bExiting = sal_False;
2000-10-27 09:25:31 +00:00
Reference< XLinguServiceManager > LinguMgr::xLngSvcMgr = 0;
2000-09-18 16:07:07 +00:00
Reference< XSpellChecker1 > LinguMgr::xSpell = 0;
Reference< XHyphenator > LinguMgr::xHyph = 0;
Reference< XThesaurus > LinguMgr::xThes = 0;
Reference< XDictionaryList > LinguMgr::xDicList = 0;
Reference< XPropertySet > LinguMgr::xProp = 0;
Reference< XDictionary1 > LinguMgr::xIgnoreAll = 0;
Reference< XDictionary1 > LinguMgr::xChangeAll = 0;
2000-10-27 09:25:31 +00:00
Reference< XLinguServiceManager > LinguMgr::GetLngSvcMgr()
{
if (bExiting)
return 0;
if (!pExitLstnr)
pExitLstnr = new LinguMgrExitLstnr;
if (!xLngSvcMgr.is())
xLngSvcMgr = GetLngSvcMgr_Impl();
return xLngSvcMgr;
}
2000-09-18 16:07:07 +00:00
Reference< XSpellChecker1 > LinguMgr::GetSpellChecker()
{
return xSpell.is() ? xSpell : GetSpell();
}
Reference< XHyphenator > LinguMgr::GetHyphenator()
{
return xHyph.is() ? xHyph : GetHyph();
}
Reference< XThesaurus > LinguMgr::GetThesaurus()
{
return xThes.is() ? xThes : GetThes();
}
Reference< XDictionaryList > LinguMgr::GetDictionaryList()
{
return xDicList.is() ? xDicList : GetDicList();
}
Reference< XPropertySet > LinguMgr::GetLinguPropertySet()
{
return xProp.is() ? xProp : GetProp();
}
Reference< XDictionary1 > LinguMgr::GetStandardDic()
{
//! don't hold reference to this
//! (it may be removed from dictionary list and needs to be
//! created empty if accessed again)
return GetStandard();
}
Reference< XDictionary1 > LinguMgr::GetIgnoreAllList()
{
return xIgnoreAll.is() ? xIgnoreAll : GetIgnoreAll();
}
Reference< XDictionary1 > LinguMgr::GetChangeAllList()
{
return xChangeAll.is() ? xChangeAll : GetChangeAll();
}
Reference< XSpellChecker1 > LinguMgr::GetSpell()
{
if (bExiting)
return 0;
if (!pExitLstnr)
pExitLstnr = new LinguMgrExitLstnr;
2000-10-27 09:25:31 +00:00
if (!xLngSvcMgr.is())
xLngSvcMgr = GetLngSvcMgr_Impl();
if (xLngSvcMgr.is())
2000-09-18 16:07:07 +00:00
{
2000-10-27 09:25:31 +00:00
xSpell = Reference< XSpellChecker1 > (
xLngSvcMgr->getSpellChecker(), UNO_QUERY );
2000-09-18 16:07:07 +00:00
}
return xSpell;
}
Reference< XHyphenator > LinguMgr::GetHyph()
{
if (bExiting)
return 0;
if (!pExitLstnr)
pExitLstnr = new LinguMgrExitLstnr;
2000-10-27 09:25:31 +00:00
if (!xLngSvcMgr.is())
xLngSvcMgr = GetLngSvcMgr_Impl();
if (xLngSvcMgr.is())
2000-09-18 16:07:07 +00:00
{
2000-10-27 09:25:31 +00:00
xHyph = xLngSvcMgr->getHyphenator();
2000-09-18 16:07:07 +00:00
}
return xHyph;
}
Reference< XThesaurus > LinguMgr::GetThes()
{
if (bExiting)
return 0;
if (!pExitLstnr)
pExitLstnr = new LinguMgrExitLstnr;
//! use dummy implementation in order to avoid loading of lingu DLL
//! when only the XSupportedLocales interface is used.
//! The dummy accesses the real implementation (and thus loading the DLL)
//! when "real" work needs to be done only.
xThes = new ThesDummy_Impl;
/*
2000-10-27 09:25:31 +00:00
if (!xLngSvcMgr.is())
xLngSvcMgr = GetLngSvcMgr_Impl();
if (xLngSvcMgr.is())
2000-09-18 16:07:07 +00:00
{
2000-10-27 09:25:31 +00:00
xThes = xLngSvcMgr->getThesaurus();
2000-09-18 16:07:07 +00:00
}
*/
2000-09-18 16:07:07 +00:00
return xThes;
}
Reference< XDictionaryList > LinguMgr::GetDicList()
{
if (bExiting)
return 0;
if (!pExitLstnr)
pExitLstnr = new LinguMgrExitLstnr;
Reference< XMultiServiceFactory > xMgr( getProcessServiceFactory() );
if (xMgr.is())
{
xDicList = Reference< XDictionaryList > ( xMgr->createInstance(
OUString::createFromAscii(
2000-10-27 09:25:31 +00:00
"com.sun.star.linguistic2.DictionaryList") ), UNO_QUERY );
2000-09-18 16:07:07 +00:00
}
return xDicList;
}
Reference< XPropertySet > LinguMgr::GetProp()
{
if (bExiting)
return 0;
if (!pExitLstnr)
pExitLstnr = new LinguMgrExitLstnr;
Reference< XMultiServiceFactory > xMgr( getProcessServiceFactory() );
if (xMgr.is())
{
xProp = Reference< XPropertySet > ( xMgr->createInstance(
OUString::createFromAscii(
2000-10-27 09:25:31 +00:00
"com.sun.star.linguistic2.LinguProperties") ), UNO_QUERY );
2000-09-18 16:07:07 +00:00
}
return xProp;
}
Reference< XDictionary1 > LinguMgr::GetIgnoreAll()
{
if (bExiting)
return 0;
if (!pExitLstnr)
pExitLstnr = new LinguMgrExitLstnr;
Reference< XDictionaryList > xTmpDicList( GetDictionaryList() );
if (xTmpDicList.is())
{
xIgnoreAll = Reference< XDictionary1 > ( xTmpDicList->getDictionaryByName(
OUString::createFromAscii("IgnoreAllList") ), UNO_QUERY );
}
return xIgnoreAll;
}
Reference< XDictionary1 > LinguMgr::GetChangeAll()
{
if (bExiting)
return 0;
if (!pExitLstnr)
pExitLstnr = new LinguMgrExitLstnr;
2000-10-27 09:25:31 +00:00
Reference< XDictionaryList > xDicList( GetDictionaryList() , UNO_QUERY );
if (xDicList.is())
2000-09-18 16:07:07 +00:00
{
xChangeAll = Reference< XDictionary1 > (
2000-10-27 09:25:31 +00:00
xDicList->createDictionary(
2000-09-18 16:07:07 +00:00
OUString::createFromAscii("ChangeAllList"),
SvxCreateLocale( LANGUAGE_NONE ),
DictionaryType_NEGATIVE, String() ), UNO_QUERY );
}
return xChangeAll;
}
Reference< XDictionary1 > LinguMgr::GetStandard()
{
// Tries to return a dictionary which may hold positive entries is
// persistent and not read-only.
if (bExiting)
return 0;
Reference< XDictionaryList > xTmpDicList( GetDictionaryList() );
if (!xTmpDicList.is())
return NULL;
const OUString aDicName( RTL_CONSTASCII_USTRINGPARAM( "standard.dic" ) );
Reference< XDictionary1 > xDic( xTmpDicList->getDictionaryByName( aDicName ),
UNO_QUERY );
if (!xDic.is())
2000-09-18 16:07:07 +00:00
{
2000-10-27 09:25:31 +00:00
// try to create standard dictionary
Reference< XDictionary > xTmp;
2000-10-27 09:25:31 +00:00
try
{
xTmp = xTmpDicList->createDictionary( aDicName,
SvxCreateLocale( LANGUAGE_NONE ),
DictionaryType_POSITIVE,
SvxGetDictionaryURL( aDicName, sal_True ) );
}
catch(com::sun::star::uno::Exception &)
2000-09-18 16:07:07 +00:00
{
}
// add new dictionary to list
if (xTmp.is())
xTmpDicList->addDictionary( xTmp );
xDic = Reference< XDictionary1 > ( xTmp, UNO_QUERY );
}
#ifdef DEBUG
Reference< XStorable > xStor( xDic, UNO_QUERY );
DBG_ASSERT( xDic.is() && xDic->getDictionaryType() == DictionaryType_POSITIVE,
"wrong dictionary type");
DBG_ASSERT( xDic.is() && xDic->getLanguage() == LANGUAGE_NONE,
"wrong dictionary language");
DBG_ASSERT( !xStor.is() || (xStor->hasLocation() && !xStor->isReadonly()),
"dictionary not editable" );
#endif
2000-09-18 16:07:07 +00:00
return xDic;
}
///////////////////////////////////////////////////////////////////////////
Reference< XSpellChecker1 > SvxGetSpellChecker()
{
return LinguMgr::GetSpellChecker();
}
Reference< XHyphenator > SvxGetHyphenator()
{
return LinguMgr::GetHyphenator();
}
Reference< XThesaurus > SvxGetThesaurus()
{
return LinguMgr::GetThesaurus();
}
Reference< XDictionaryList > SvxGetDictionaryList()
{
return LinguMgr::GetDictionaryList();
}
Reference< XPropertySet > SvxGetLinguPropertySet()
{
return LinguMgr::GetLinguPropertySet();
}
//TL:TODO: remove argument or provide SvxGetIgnoreAllList with the same one
Reference< XDictionary1 > SvxGetOrCreatePosDic(
Reference< XDictionaryList > xDicList )
{
return LinguMgr::GetStandardDic();
}
Reference< XDictionary1 > SvxGetIgnoreAllList()
{
return LinguMgr::GetIgnoreAllList();
}
Reference< XDictionary1 > SvxGetChangeAllList()
{
return LinguMgr::GetChangeAllList();
}
///////////////////////////////////////////////////////////////////////////
#ifndef _COM_SUN_STAR_LINGUISTIC2_XHYPHENATEDWORD_HPP_
#include <com/sun/star/linguistic2/XHyphenatedWord.hpp>
#endif
SvxAlternativeSpelling SvxGetAltSpelling(
const ::com::sun::star::uno::Reference<
::com::sun::star::linguistic2::XHyphenatedWord > & rHyphWord )
{
SvxAlternativeSpelling aRes;
if (rHyphWord.is() && rHyphWord->isAlternativeSpelling())
{
OUString aWord( rHyphWord->getWord() ),
aHyphenatedWord( rHyphWord->getHyphenatedWord() );
INT16 nHyphenationPos = rHyphWord->getHyphenationPos(),
nHyphenPos = rHyphWord->getHyphenPos();
const sal_Unicode *pWord = aWord.getStr(),
*pAltWord = aHyphenatedWord.getStr();
// at least char changes directly left or right to the hyphen
// should(!) be handled properly...
//! nHyphenationPos and nHyphenPos differ at most by 1 (see above)
//! Beware: eg "Schiffahrt" in German (pre spelling reform)
//! proves to be a bit nasty (nChgPosLeft and nChgPosRight overlap
//! to an extend.)
// find first different char from left
sal_Int32 nPosL = 0,
nAltPosL = 0;
for (INT16 i = 0 ; pWord[ nPosL ] == pAltWord[ nAltPosL ]; nPosL++, nAltPosL++, i++)
{
// restrict changes area beginning to the right to
// the char immediately following the hyphen.
//! serves to insert the additional "f" in "Schiffahrt" at
//! position 5 rather than position 6.
if (i >= nHyphenationPos + 1)
break;
}
// find first different char from right
sal_Int32 nPosR = aWord.getLength() - 1,
nAltPosR = aHyphenatedWord.getLength() - 1;
for ( ; nPosR >= nPosL && nAltPosR >= nAltPosL
&& pWord[ nPosR ] == pAltWord[ nAltPosR ];
nPosR--, nAltPosR--)
;
INT16 nChgLen = nPosR - nPosL + 1;
DBG_ASSERT( nChgLen >= 0, "nChgLen < 0");
sal_Int32 nTxtStart = nPosL;
sal_Int32 nTxtLen = nAltPosL - nPosL + 1;
OUString aRplc( aHyphenatedWord.copy( nTxtStart, nTxtLen ) );
aRes.aReplacement = aRplc;
aRes.nChangedPos = (INT16) nPosL;
2000-09-18 16:07:07 +00:00
aRes.nChangedLength = nChgLen;
aRes.bIsAltSpelling = TRUE;
aRes.xHyphWord = rHyphWord;
}
return aRes;
}
2000-10-27 09:25:31 +00:00
2000-09-18 16:07:07 +00:00
///////////////////////////////////////////////////////////////////////////
SvxDicListChgClamp::SvxDicListChgClamp( Reference< XDictionaryList > &rxDicList ) :
xDicList ( rxDicList )
{
if (xDicList.is())
{
xDicList->beginCollectEvents();
}
}
SvxDicListChgClamp::~SvxDicListChgClamp()
{
if (xDicList.is())
{
xDicList->endCollectEvents();
}
}
///////////////////////////////////////////////////////////////////////////
String SvxGetDictionaryURL(const String &rDicName, sal_Bool bIsUserDic)
{
2000-11-27 06:37:52 +00:00
// build URL to use for new (persistent) dictionaries
SvtPathOptions aPathOpt;
String aDirName( bIsUserDic ?
aPathOpt.GetUserDictionaryPath() : aPathOpt.GetDictionaryPath() );
INetURLObject aURLObj;
aURLObj.SetSmartProtocol( INET_PROT_FILE );
aURLObj.SetSmartURL( aDirName );
DBG_ASSERT(!aURLObj.HasError(), "lng : invalid URL");
aURLObj.Append( rDicName );
DBG_ASSERT(!aURLObj.HasError(), "lng : invalid URL");
return aURLObj.GetMainURL();
2000-09-18 16:07:07 +00:00
}
//TL:TODO: soll mal den rictigen R<>ckgabetyp bekommen!
sal_Bool SvxAddEntryToDic(
Reference< XDictionary > &rxDic,
const OUString &rWord, sal_Bool bIsNeg,
const OUString &rRplcTxt, sal_Int16 nRplcLang,
sal_Bool bStripDot )
{
if (!rxDic.is())
return DIC_ERR_NOT_EXISTS;
OUString aTmp( rWord );
if (bStripDot)
{
sal_Int32 nLen = rWord.getLength();
if (nLen > 0 && '.' == rWord[ nLen - 1])
{
// remove trailing '.'
// (this is the official way to do this :-( )
aTmp = aTmp.copy( 0, nLen - 1 );
}
}
2000-10-27 09:25:31 +00:00
sal_Bool bAddOk = rxDic->add( aTmp, bIsNeg, rRplcTxt );
2000-09-18 16:07:07 +00:00
sal_Int16 nRes = DIC_ERR_NONE;
if (!bAddOk)
{
if (rxDic->isFull())
nRes = DIC_ERR_FULL;
else
{
Reference< XStorable > xStor( rxDic, UNO_QUERY );
if (xStor.is() && xStor->isReadonly())
nRes = DIC_ERR_READONLY;
else
nRes = DIC_ERR_UNKNOWN;
}
}
return nRes;
}
short SvxDicError( Window *pParent, sal_Int16 nError )
{
short nRes = 0;
if (DIC_ERR_NONE != nError)
{
int nRid;
switch (nError)
{
case DIC_ERR_FULL : nRid = RID_SVXSTR_DIC_ERR_FULL; break;
case DIC_ERR_READONLY : nRid = RID_SVXSTR_DIC_ERR_READONLY; break;
default:
nRid = RID_SVXSTR_DIC_ERR_UNKNOWN;
DBG_ASSERT(0, "unexpected case");
}
nRes = InfoBox( pParent, SVX_RESSTR( nRid ) ).Execute();
}
return nRes;
}
sal_Bool SvxSaveDictionaries( const Reference< XDictionaryList > &xDicList )
{
if (!xDicList.is())
return sal_True;
sal_Bool bRet = sal_True;
Sequence< Reference< XDictionary > > aDics( xDicList->getDictionaries() );
const Reference< XDictionary > *pDic = aDics.getConstArray();
INT32 nCount = aDics.getLength();
for (INT32 i = 0; i < nCount; i++)
2000-09-18 16:07:07 +00:00
{
try
{
Reference< XStorable > xStor( pDic[i], UNO_QUERY );
if (xStor.is())
{
if (!xStor->isReadonly() && xStor->hasLocation())
xStor->store();
}
}
catch(com::sun::star::uno::Exception &)
2000-09-18 16:07:07 +00:00
{
bRet = sal_False;
}
}
return bRet;
}
LanguageType SvxLocaleToLanguage( const Locale& rLocale )
{
// empty Locale -> LANGUAGE_NONE
2000-09-18 16:07:07 +00:00
if ( rLocale.Language.getLength() == 0 )
return LANGUAGE_NONE;
// Variant of Locale is ignored
return ConvertIsoNamesToLanguage( rLocale.Language, rLocale.Country );
2000-09-18 16:07:07 +00:00
}
Locale& SvxLanguageToLocale( Locale& rLocale, LanguageType eLang )
{
String aLangStr, aCtryStr;
if ( eLang != LANGUAGE_NONE /* && eLang != LANGUAGE_SYSTEM */)
ConvertLanguageToIsoNames( eLang, aLangStr, aCtryStr );
2000-09-18 16:07:07 +00:00
rLocale.Language = aLangStr;
rLocale.Country = aCtryStr;
rLocale.Variant = OUString();
2000-09-18 16:07:07 +00:00
return rLocale;
}
Locale SvxCreateLocale( LanguageType eLang )
{
String aLangStr, aCtryStr;
if ( eLang != LANGUAGE_NONE /* && eLang != LANGUAGE_SYSTEM */)
ConvertLanguageToIsoNames( eLang, aLangStr, aCtryStr );
2000-09-18 16:07:07 +00:00
return Locale( aLangStr, aCtryStr, OUString() );
2000-09-18 16:07:07 +00:00
}