2000-11-17 11:37:46 +00:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
|
|
|
* $RCSfile: misc.cxx,v $
|
|
|
|
*
|
2001-08-14 08:15:49 +00:00
|
|
|
* $Revision: 1.12 $
|
2000-11-17 11:37:46 +00:00
|
|
|
*
|
2001-08-14 08:15:49 +00:00
|
|
|
* last change: $Author: tl $ $Date: 2001-08-14 09:15:49 $
|
2000-11-17 11:37:46 +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): _______________________________________
|
|
|
|
*
|
|
|
|
*
|
|
|
|
************************************************************************/
|
|
|
|
|
|
|
|
#ifndef _STRING_HXX
|
|
|
|
#include <tools/string.hxx>
|
|
|
|
#endif
|
|
|
|
#ifndef _FSYS_HXX
|
|
|
|
#include <tools/fsys.hxx>
|
|
|
|
#endif
|
2000-11-21 17:29:14 +00:00
|
|
|
#ifndef _TOOLS_DEBUG_HXX
|
|
|
|
#include <tools/debug.hxx>
|
|
|
|
#endif
|
2000-12-22 11:45:48 +00:00
|
|
|
//#ifndef _RTL_USTRBUF_HXX_
|
|
|
|
//#include <rtl/ustrbuf.hxx>
|
|
|
|
//#endif
|
2000-11-17 11:37:46 +00:00
|
|
|
#ifndef INCLUDED_SVTOOLS_PATHOPTIONS_HXX
|
|
|
|
#include <svtools/pathoptions.hxx>
|
|
|
|
#endif
|
2000-12-22 11:45:48 +00:00
|
|
|
#ifndef _SVTOOLS_LNGMISC_HXX_
|
|
|
|
#include <svtools/lngmisc.hxx>
|
|
|
|
#endif
|
2000-11-17 11:37:46 +00:00
|
|
|
|
|
|
|
#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_
|
|
|
|
#include <com/sun/star/beans/XPropertySet.hpp>
|
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_BEANS_XFASTPROPERTYSET_HPP_
|
|
|
|
#include <com/sun/star/beans/XFastPropertySet.hpp>
|
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_BEANS_XPROPERTYCHANGELISTENER_HPP_
|
|
|
|
#include <com/sun/star/beans/XPropertyChangeListener.hpp>
|
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_FRAME_XTERMINATELISTENER_HPP_
|
|
|
|
#include <com/sun/star/frame/XTerminateListener.hpp>
|
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_FRAME_XDESKTOP_HPP_
|
|
|
|
#include <com/sun/star/frame/XDesktop.hpp>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include <com/sun/star/beans/PropertyValues.hpp>
|
|
|
|
#include <com/sun/star/uno/Sequence.hxx>
|
|
|
|
#include <com/sun/star/uno/Reference.h>
|
|
|
|
#include <com/sun/star/linguistic2/XDictionary1.hpp>
|
|
|
|
#include <com/sun/star/linguistic2/DictionaryType.hpp>
|
|
|
|
#include <com/sun/star/linguistic2/XSearchableDictionaryList.hpp>
|
|
|
|
#ifndef _UNOTOOLS_PROCESSFACTORY_HXX_
|
|
|
|
#include <unotools/processfactory.hxx>
|
|
|
|
#endif
|
|
|
|
|
2000-12-22 11:45:48 +00:00
|
|
|
#include "misc.hxx"
|
|
|
|
#include "defs.hxx"
|
|
|
|
#include "lngprops.hxx"
|
|
|
|
#include <hyphdta.hxx>
|
|
|
|
|
|
|
|
|
2000-11-17 11:37:46 +00:00
|
|
|
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;
|
2001-02-23 13:45:12 +00:00
|
|
|
using namespace com::sun::star::i18n;
|
2000-11-17 11:37:46 +00:00
|
|
|
using namespace com::sun::star::linguistic2;
|
|
|
|
|
|
|
|
namespace linguistic
|
|
|
|
{
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
osl::Mutex & GetLinguMutex()
|
|
|
|
{
|
|
|
|
static osl::Mutex aMutex;
|
|
|
|
return aMutex;
|
|
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2001-07-25 09:09:50 +00:00
|
|
|
/**
|
|
|
|
returns text-encoding used for ByteString unicode String conversion
|
|
|
|
*/
|
|
|
|
rtl_TextEncoding GetTextEncoding( INT16 nLanguage )
|
|
|
|
{
|
|
|
|
DBG_ASSERT( nLanguage != LANGUAGE_NONE, "invalid language argument" )
|
|
|
|
static INT16 nLastLanguage = LANGUAGE_NONE;
|
|
|
|
|
|
|
|
// set default value for unknown languages
|
|
|
|
static rtl_TextEncoding nEncoding = RTL_TEXTENCODING_DONTKNOW;
|
|
|
|
|
|
|
|
if (nLastLanguage != nLanguage)
|
|
|
|
{
|
|
|
|
nLastLanguage = nLanguage;
|
|
|
|
switch (nLanguage)
|
|
|
|
{
|
|
|
|
case LANGUAGE_GERMAN :
|
|
|
|
case LANGUAGE_GERMAN_SWISS :
|
|
|
|
case LANGUAGE_ENGLISH_US :
|
|
|
|
case LANGUAGE_ENGLISH_UK :
|
|
|
|
case LANGUAGE_FRENCH :
|
|
|
|
case LANGUAGE_ITALIAN :
|
|
|
|
case LANGUAGE_SPANISH :
|
|
|
|
case LANGUAGE_CATALAN :
|
|
|
|
case LANGUAGE_PORTUGUESE :
|
|
|
|
case LANGUAGE_PORTUGUESE_BRAZILIAN :
|
|
|
|
case LANGUAGE_DANISH :
|
|
|
|
case LANGUAGE_DUTCH :
|
|
|
|
case LANGUAGE_SWEDISH :
|
|
|
|
case LANGUAGE_FINNISH :
|
|
|
|
case LANGUAGE_NORWEGIAN_BOKMAL :
|
|
|
|
case LANGUAGE_NORWEGIAN_NYNORSK :
|
|
|
|
case LANGUAGE_AFRIKAANS :
|
|
|
|
nEncoding = RTL_TEXTENCODING_MS_1252; break;
|
|
|
|
case LANGUAGE_CZECH :
|
|
|
|
case LANGUAGE_HUNGARIAN :
|
|
|
|
case LANGUAGE_POLISH :
|
|
|
|
nEncoding = RTL_TEXTENCODING_MS_1250; break;
|
|
|
|
case LANGUAGE_RUSSIAN :
|
|
|
|
nEncoding = RTL_TEXTENCODING_MS_1251; break;
|
|
|
|
case LANGUAGE_GREEK :
|
|
|
|
nEncoding = RTL_TEXTENCODING_MS_1253; break;
|
|
|
|
default:
|
|
|
|
DBG_ERROR( "unexpected language" );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return nEncoding;
|
|
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2000-11-17 11:37:46 +00:00
|
|
|
BOOL IsUseDicList( const PropertyValues &rProperties,
|
|
|
|
const Reference< XPropertySet > &rxProp )
|
|
|
|
{
|
|
|
|
BOOL bRes = TRUE;
|
|
|
|
|
|
|
|
INT32 nLen = rProperties.getLength();
|
|
|
|
const PropertyValue *pVal = rProperties.getConstArray();
|
|
|
|
for (INT32 i = 0; i < nLen; ++i)
|
|
|
|
{
|
|
|
|
if (UPH_IS_USE_DICTIONARY_LIST == pVal[i].Handle)
|
|
|
|
{
|
|
|
|
pVal[i].Value >>= bRes;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (i >= nLen) // no temporary value found in 'rProperties'
|
|
|
|
{
|
|
|
|
Reference< XFastPropertySet > xFast( rxProp, UNO_QUERY );
|
|
|
|
if (xFast.is())
|
|
|
|
xFast->getFastPropertyValue( UPH_IS_USE_DICTIONARY_LIST ) >>= bRes;
|
|
|
|
}
|
|
|
|
|
|
|
|
return bRes;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2000-12-21 08:57:08 +00:00
|
|
|
BOOL IsIgnoreControlChars( const PropertyValues &rProperties,
|
|
|
|
const Reference< XPropertySet > &rxProp )
|
|
|
|
{
|
|
|
|
BOOL bRes = TRUE;
|
|
|
|
|
|
|
|
INT32 nLen = rProperties.getLength();
|
|
|
|
const PropertyValue *pVal = rProperties.getConstArray();
|
|
|
|
for (INT32 i = 0; i < nLen; ++i)
|
|
|
|
{
|
|
|
|
if (UPH_IS_IGNORE_CONTROL_CHARACTERS == pVal[i].Handle)
|
|
|
|
{
|
|
|
|
pVal[i].Value >>= bRes;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (i >= nLen) // no temporary value found in 'rProperties'
|
|
|
|
{
|
|
|
|
Reference< XFastPropertySet > xFast( rxProp, UNO_QUERY );
|
|
|
|
if (xFast.is())
|
|
|
|
xFast->getFastPropertyValue( UPH_IS_IGNORE_CONTROL_CHARACTERS ) >>= bRes;
|
|
|
|
}
|
|
|
|
|
|
|
|
return bRes;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2000-11-17 11:37:46 +00:00
|
|
|
static BOOL lcl_HasHyphInfo( const Reference<XDictionaryEntry> &xEntry )
|
|
|
|
{
|
|
|
|
BOOL bRes = FALSE;
|
|
|
|
if (xEntry.is())
|
|
|
|
{
|
|
|
|
// there has to be (at least one) '=' denoting a hyphenation position
|
|
|
|
// and it must not be before any character of the word
|
|
|
|
sal_Int32 nIdx = xEntry->getDictionaryWord().indexOf( '=' );
|
|
|
|
bRes = nIdx != -1 && nIdx != 0;
|
|
|
|
}
|
|
|
|
return bRes;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Reference< XDictionaryEntry > SearchDicList(
|
|
|
|
const Reference< XDictionaryList > &xDicList,
|
|
|
|
const OUString &rWord, INT16 nLanguage,
|
|
|
|
BOOL bSearchPosDics, BOOL bSearchSpellEntry )
|
|
|
|
{
|
|
|
|
MutexGuard aGuard( GetLinguMutex() );
|
|
|
|
|
|
|
|
Reference< XDictionaryEntry > xEntry;
|
|
|
|
|
|
|
|
if (!xDicList.is())
|
|
|
|
return xEntry;
|
|
|
|
|
|
|
|
const uno::Sequence< Reference< XDictionary > >
|
|
|
|
aDics( xDicList->getDictionaries() );
|
|
|
|
const Reference< XDictionary >
|
|
|
|
*pDic = aDics.getConstArray();
|
|
|
|
INT32 nDics = xDicList->getCount();
|
|
|
|
|
|
|
|
INT32 i;
|
|
|
|
for (i = 0; i < nDics; i++)
|
|
|
|
{
|
|
|
|
Reference< XDictionary1 > axDic( pDic[i], UNO_QUERY );
|
|
|
|
|
|
|
|
DictionaryType eType = axDic->getDictionaryType();
|
|
|
|
INT16 nLang = axDic->getLanguage();
|
|
|
|
|
|
|
|
if ( axDic.is() && axDic->isActive()
|
|
|
|
&& (nLang == nLanguage || nLang == LANGUAGE_NONE) )
|
|
|
|
{
|
|
|
|
DBG_ASSERT( eType != DictionaryType_MIXED,
|
|
|
|
"lng : unexpected dictionary type" );
|
|
|
|
|
|
|
|
if ( (!bSearchPosDics && eType == DictionaryType_NEGATIVE)
|
|
|
|
|| ( bSearchPosDics && eType == DictionaryType_POSITIVE))
|
|
|
|
{
|
|
|
|
if ( (xEntry = axDic->getEntry( rWord )).is() )
|
|
|
|
{
|
|
|
|
if (bSearchSpellEntry || lcl_HasHyphInfo( xEntry ))
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return xEntry;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
LanguageType LocaleToLanguage( const Locale& rLocale )
|
|
|
|
{
|
2000-12-15 09:21:30 +00:00
|
|
|
// empty Locale -> LANGUAGE_NONE
|
2000-11-17 11:37:46 +00:00
|
|
|
if ( rLocale.Language.getLength() == 0 )
|
|
|
|
return LANGUAGE_NONE;
|
|
|
|
|
|
|
|
// Variant of Locale is ignored
|
2000-12-15 09:21:30 +00:00
|
|
|
return ConvertIsoNamesToLanguage( rLocale.Language, rLocale.Country );
|
2000-11-17 11:37:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Locale& LanguageToLocale( Locale& rLocale, LanguageType eLang )
|
|
|
|
{
|
|
|
|
String aLangStr, aCtryStr;
|
2000-12-15 09:21:30 +00:00
|
|
|
if ( eLang != LANGUAGE_NONE /* && eLang != LANGUAGE_SYSTEM */)
|
|
|
|
ConvertLanguageToIsoNames( eLang, aLangStr, aCtryStr );
|
|
|
|
|
2000-11-17 11:37:46 +00:00
|
|
|
rLocale.Language = aLangStr;
|
|
|
|
rLocale.Country = aCtryStr;
|
2000-12-15 09:21:30 +00:00
|
|
|
rLocale.Variant = OUString();
|
2000-11-17 11:37:46 +00:00
|
|
|
|
|
|
|
return rLocale;
|
|
|
|
}
|
|
|
|
|
2000-12-15 09:21:30 +00:00
|
|
|
Locale CreateLocale( LanguageType eLang )
|
|
|
|
{
|
|
|
|
String aLangStr, aCtryStr;
|
|
|
|
if ( eLang != LANGUAGE_NONE /* && eLang != LANGUAGE_SYSTEM */)
|
|
|
|
ConvertLanguageToIsoNames( eLang, aLangStr, aCtryStr );
|
|
|
|
|
|
|
|
return Locale( aLangStr, aCtryStr, OUString() );
|
|
|
|
}
|
|
|
|
|
2000-11-17 11:37:46 +00:00
|
|
|
uno::Sequence< Locale > LangSeqToLocaleSeq( const uno::Sequence< INT16 > &rLangSeq )
|
|
|
|
{
|
|
|
|
const INT16 *pLang = rLangSeq.getConstArray();
|
|
|
|
INT32 nCount = rLangSeq.getLength();
|
|
|
|
|
|
|
|
uno::Sequence< Locale > aLocales( nCount );
|
|
|
|
Locale *pLocale = aLocales.getArray();
|
|
|
|
for (INT32 i = 0; i < nCount; ++i)
|
|
|
|
{
|
|
|
|
LanguageToLocale( pLocale[i], pLang[ i ] );
|
|
|
|
}
|
|
|
|
|
|
|
|
return aLocales;
|
|
|
|
}
|
|
|
|
|
|
|
|
uno::Sequence< INT16 >
|
|
|
|
LocaleSeqToLangSeq( uno::Sequence< Locale > &rLocaleSeq )
|
|
|
|
{
|
|
|
|
const Locale *pLocale = rLocaleSeq.getConstArray();
|
|
|
|
INT32 nCount = rLocaleSeq.getLength();
|
|
|
|
|
|
|
|
uno::Sequence< INT16 > aLangs( nCount );
|
|
|
|
INT16 *pLang = aLangs.getArray();
|
|
|
|
for (INT32 i = 0; i < nCount; ++i)
|
|
|
|
{
|
|
|
|
pLang[i] = LocaleToLanguage( pLocale[i] );
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return aLangs;
|
|
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2000-12-21 08:57:08 +00:00
|
|
|
|
2000-12-22 11:45:48 +00:00
|
|
|
static BOOL GetAltSpelling( INT16 &rnChgPos, INT16 &rnChgLen, OUString &rRplc,
|
|
|
|
Reference< XHyphenatedWord > &rxHyphWord )
|
2000-12-21 08:57:08 +00:00
|
|
|
{
|
2000-12-22 11:45:48 +00:00
|
|
|
BOOL bRes = rxHyphWord->isAlternativeSpelling();
|
|
|
|
if (bRes)
|
|
|
|
{
|
|
|
|
OUString aWord( rxHyphWord->getWord() ),
|
|
|
|
aHyphenatedWord( rxHyphWord->getHyphenatedWord() );
|
|
|
|
INT16 nHyphenationPos = rxHyphWord->getHyphenationPos(),
|
|
|
|
nHyphenPos = rxHyphWord->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;
|
|
|
|
}
|
2000-12-21 08:57:08 +00:00
|
|
|
|
2000-12-22 11:45:48 +00:00
|
|
|
// 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--)
|
|
|
|
;
|
|
|
|
|
|
|
|
rnChgPos = (INT16) nPosL;
|
|
|
|
rnChgLen = nPosR - nPosL + 1;
|
|
|
|
DBG_ASSERT( rnChgLen >= 0, "nChgLen < 0");
|
|
|
|
|
|
|
|
sal_Int32 nTxtStart = nPosL;
|
|
|
|
sal_Int32 nTxtLen = nAltPosL - nPosL + 1;
|
|
|
|
rRplc = aHyphenatedWord.copy( nTxtStart, nTxtLen );
|
|
|
|
}
|
|
|
|
return bRes;
|
2000-12-21 08:57:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2001-07-04 12:33:43 +00:00
|
|
|
static INT16 GetOrigWordPos( const OUString &rOrigWord, INT16 nPos )
|
2000-12-21 08:57:08 +00:00
|
|
|
{
|
2000-12-22 11:45:48 +00:00
|
|
|
INT32 nLen = rOrigWord.getLength();
|
2001-08-14 08:15:49 +00:00
|
|
|
INT32 i = -1;
|
|
|
|
while (nPos >= 0 && i++ < nLen)
|
2000-12-21 08:57:08 +00:00
|
|
|
{
|
2000-12-22 11:45:48 +00:00
|
|
|
sal_Unicode cChar = rOrigWord[i];
|
|
|
|
BOOL bSkip = IsHyphen( cChar ) || IsControlChar( cChar );
|
|
|
|
if (!bSkip)
|
2001-08-14 08:15:49 +00:00
|
|
|
--nPos;
|
2000-12-21 08:57:08 +00:00
|
|
|
}
|
2001-08-14 08:15:49 +00:00
|
|
|
return (0 <= i && i < nLen) ? i : -1;
|
2000-12-21 08:57:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2000-12-22 11:45:48 +00:00
|
|
|
INT32 GetPosInWordToCheck( const OUString &rTxt, INT32 nPos )
|
2000-12-21 08:57:08 +00:00
|
|
|
{
|
2000-12-22 11:45:48 +00:00
|
|
|
INT32 nRes = -1;
|
|
|
|
INT32 nLen = rTxt.getLength();
|
|
|
|
if (0 <= nPos && nPos < nLen)
|
2000-12-21 08:57:08 +00:00
|
|
|
{
|
2000-12-22 11:45:48 +00:00
|
|
|
INT32 nSkipped = 0;
|
|
|
|
BOOL bSkip;
|
|
|
|
for (INT32 i = 0; i <= nPos; ++i)
|
|
|
|
{
|
|
|
|
sal_Unicode cChar = rTxt[i];
|
|
|
|
bSkip = IsHyphen( cChar ) || IsControlChar( cChar );
|
|
|
|
if (bSkip)
|
|
|
|
++nSkipped;
|
|
|
|
}
|
|
|
|
nRes = nPos - nSkipped;
|
2000-12-21 08:57:08 +00:00
|
|
|
}
|
2000-12-22 11:45:48 +00:00
|
|
|
return nRes;
|
2000-12-21 08:57:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2000-12-22 11:45:48 +00:00
|
|
|
Reference< XHyphenatedWord > RebuildHyphensAndControlChars(
|
|
|
|
const OUString &rOrigWord,
|
|
|
|
Reference< XHyphenatedWord > &rxHyphWord )
|
2000-12-21 08:57:08 +00:00
|
|
|
{
|
2000-12-22 11:45:48 +00:00
|
|
|
Reference< XHyphenatedWord > xRes;
|
|
|
|
if (rOrigWord.getLength() && rxHyphWord.is())
|
2000-12-21 08:57:08 +00:00
|
|
|
{
|
2000-12-22 11:45:48 +00:00
|
|
|
INT16 nChgPos = 0,
|
|
|
|
nChgLen = 0;
|
|
|
|
OUString aRplc;
|
|
|
|
BOOL bAltSpelling = GetAltSpelling( nChgPos, nChgLen, aRplc, rxHyphWord );
|
|
|
|
|
|
|
|
OUString aOrigHyphenatedWord;
|
2001-08-14 08:15:49 +00:00
|
|
|
INT16 nOrigHyphenPos = -1;
|
|
|
|
INT16 nOrigHyphenationPos = -1;
|
2000-12-22 11:45:48 +00:00
|
|
|
if (!bAltSpelling)
|
2000-12-21 08:57:08 +00:00
|
|
|
{
|
2000-12-22 11:45:48 +00:00
|
|
|
#ifdef DEBUG
|
|
|
|
OUString aWord( rxHyphWord->getWord() );
|
|
|
|
#endif
|
|
|
|
aOrigHyphenatedWord = rOrigWord;
|
2001-08-14 08:15:49 +00:00
|
|
|
nOrigHyphenPos = GetOrigWordPos( rOrigWord, rxHyphWord->getHyphenPos() );
|
|
|
|
nOrigHyphenationPos = GetOrigWordPos( rOrigWord, rxHyphWord->getHyphenationPos() );
|
2000-12-22 11:45:48 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
OUString aLeft, aRight;
|
|
|
|
INT16 nPos = GetOrigWordPos( rOrigWord, nChgPos );
|
2001-08-14 08:15:49 +00:00
|
|
|
nPos += (-1 + nChgLen);
|
2000-12-22 11:45:48 +00:00
|
|
|
aLeft = rOrigWord.copy( 0, nPos );
|
2001-07-04 12:33:43 +00:00
|
|
|
aRight = rOrigWord.copy( nPos + nChgLen );
|
2000-12-22 11:45:48 +00:00
|
|
|
|
|
|
|
aOrigHyphenatedWord = aLeft;
|
|
|
|
aOrigHyphenatedWord += aRplc;
|
|
|
|
aOrigHyphenatedWord += aRight;
|
|
|
|
|
2001-08-14 08:15:49 +00:00
|
|
|
nOrigHyphenPos = aLeft.getLength() +
|
2000-12-22 11:45:48 +00:00
|
|
|
rxHyphWord->getHyphenPos() - nChgPos;
|
2001-08-14 08:15:49 +00:00
|
|
|
nOrigHyphenationPos = aLeft.getLength() +
|
|
|
|
rxHyphWord->getHyphenationPos() - nChgPos;
|
2000-12-21 08:57:08 +00:00
|
|
|
}
|
2000-12-22 11:45:48 +00:00
|
|
|
|
2001-08-14 08:15:49 +00:00
|
|
|
if (nOrigHyphenPos == -1 || nOrigHyphenationPos == -1)
|
2001-01-03 14:20:46 +00:00
|
|
|
{
|
2001-08-14 08:15:49 +00:00
|
|
|
DBG_ERROR( "failed to get nOrigHyphenPos or nOrigHyphenationPos" );
|
2001-01-03 14:20:46 +00:00
|
|
|
}
|
2000-12-22 11:45:48 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
INT16 nLang = LocaleToLanguage( rxHyphWord->getLocale() );
|
|
|
|
xRes = new HyphenatedWord(
|
2001-08-14 08:15:49 +00:00
|
|
|
rOrigWord, nLang, nOrigHyphenationPos,
|
2000-12-22 11:45:48 +00:00
|
|
|
aOrigHyphenatedWord, nOrigHyphenPos );
|
|
|
|
}
|
|
|
|
|
2000-12-21 08:57:08 +00:00
|
|
|
}
|
2000-12-22 11:45:48 +00:00
|
|
|
return xRes;
|
2000-12-21 08:57:08 +00:00
|
|
|
}
|
|
|
|
|
2000-12-22 11:45:48 +00:00
|
|
|
|
2000-12-21 08:57:08 +00:00
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2001-06-29 12:08:15 +00:00
|
|
|
|
|
|
|
static CharClass & lcl_GetCharClass()
|
|
|
|
{
|
|
|
|
static CharClass aCC( CreateLocale( LANGUAGE_ENGLISH_US ) );
|
|
|
|
return aCC;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
osl::Mutex & lcl_GetCharClassMutex()
|
|
|
|
{
|
|
|
|
static osl::Mutex aMutex;
|
|
|
|
return aMutex;
|
|
|
|
}
|
|
|
|
|
2000-11-17 11:37:46 +00:00
|
|
|
|
|
|
|
BOOL IsUpper( const String &rText, INT16 nLanguage )
|
|
|
|
{
|
2001-06-29 12:08:15 +00:00
|
|
|
MutexGuard aGuard( lcl_GetCharClassMutex() );
|
|
|
|
|
|
|
|
CharClass &rCC = lcl_GetCharClass();
|
|
|
|
rCC.setLocale( CreateLocale( nLanguage ) );
|
|
|
|
sal_Int32 nFlags = rCC.getStringType( rText, 0, rText.Len() );
|
2001-02-23 13:45:12 +00:00
|
|
|
return (nFlags & KCharacterType::UPPER)
|
|
|
|
&& !(nFlags & KCharacterType::LOWER);
|
2000-11-17 11:37:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
BOOL IsLower( const String &rText, INT16 nLanguage )
|
|
|
|
{
|
2001-06-29 12:08:15 +00:00
|
|
|
MutexGuard aGuard( lcl_GetCharClassMutex() );
|
|
|
|
|
|
|
|
CharClass &rCC = lcl_GetCharClass();
|
|
|
|
rCC.setLocale( CreateLocale( nLanguage ) );
|
|
|
|
sal_Int32 nFlags = rCC.getStringType( rText, 0, rText.Len() );
|
2001-02-23 13:45:12 +00:00
|
|
|
return (nFlags & KCharacterType::LOWER)
|
|
|
|
&& !(nFlags & KCharacterType::UPPER);
|
2000-11-17 11:37:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
String ToLower( const String &rText, INT16 nLanguage )
|
|
|
|
{
|
2001-06-29 12:08:15 +00:00
|
|
|
MutexGuard aGuard( lcl_GetCharClassMutex() );
|
|
|
|
|
|
|
|
CharClass &rCC = lcl_GetCharClass();
|
|
|
|
rCC.setLocale( CreateLocale( nLanguage ) );
|
|
|
|
return rCC.lower( rText );
|
2000-11-17 11:37:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
sal_Unicode ToLower( const sal_Unicode cChar, INT16 nLanguage )
|
|
|
|
{
|
2001-06-29 12:08:15 +00:00
|
|
|
MutexGuard aGuard( lcl_GetCharClassMutex() );
|
|
|
|
|
|
|
|
CharClass &rCC = lcl_GetCharClass();
|
|
|
|
rCC.setLocale( CreateLocale( nLanguage ) );
|
|
|
|
return rCC.lower( cChar ).GetChar(0);
|
2000-11-17 11:37:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
sal_Unicode ToUpper( const sal_Unicode cChar, INT16 nLanguage )
|
|
|
|
{
|
2001-06-29 12:08:15 +00:00
|
|
|
MutexGuard aGuard( lcl_GetCharClassMutex() );
|
|
|
|
|
|
|
|
CharClass &rCC = lcl_GetCharClass();
|
|
|
|
rCC.setLocale( CreateLocale( nLanguage ) );
|
|
|
|
return rCC.upper( cChar ).GetChar(0);
|
2000-11-17 11:37:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
BOOL HasDigits( const String &rText )
|
|
|
|
{
|
|
|
|
xub_StrLen nLen = rText.Len();
|
|
|
|
|
|
|
|
xub_StrLen i = 0;
|
|
|
|
while (i < nLen)
|
|
|
|
{
|
|
|
|
sal_Unicode cChar = rText.GetChar( i++ );
|
|
|
|
if ((sal_Unicode)'0' <= cChar && cChar <= (sal_Unicode)'9')
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
BOOL IsNumeric( const String &rText )
|
|
|
|
{
|
|
|
|
BOOL bRes = FALSE;
|
|
|
|
xub_StrLen nLen = rText.Len();
|
|
|
|
if (nLen)
|
|
|
|
{
|
|
|
|
bRes = TRUE;
|
|
|
|
xub_StrLen i = 0;
|
|
|
|
while (i < nLen)
|
|
|
|
{
|
|
|
|
sal_Unicode cChar = rText.GetChar( i++ );
|
|
|
|
if ( !((sal_Unicode)'0' <= cChar && cChar <= (sal_Unicode)'9') )
|
|
|
|
{
|
|
|
|
bRes = FALSE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return bRes;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
Reference< XInterface > GetOneInstanceService( const char *pServiceName )
|
|
|
|
{
|
|
|
|
Reference< XInterface > xRef;
|
|
|
|
|
|
|
|
if (pServiceName)
|
|
|
|
{
|
|
|
|
Reference< XMultiServiceFactory > xMgr( getProcessServiceFactory() );
|
|
|
|
if (xMgr.is())
|
|
|
|
{
|
|
|
|
xRef = xMgr->createInstance( A2OU( pServiceName ) );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return xRef;
|
|
|
|
}
|
|
|
|
|
|
|
|
Reference< XPropertySet > GetLinguProperties()
|
|
|
|
{
|
|
|
|
return Reference< XPropertySet > (
|
|
|
|
GetOneInstanceService( SN_LINGU_PROPERTIES ), UNO_QUERY );
|
|
|
|
}
|
|
|
|
|
|
|
|
Reference< XSearchableDictionaryList > GetSearchableDictionaryList()
|
|
|
|
{
|
|
|
|
return Reference< XSearchableDictionaryList > (
|
|
|
|
GetOneInstanceService( SN_DICTIONARY_LIST ), UNO_QUERY );
|
|
|
|
}
|
|
|
|
|
|
|
|
Reference< XDictionaryList > GetDictionaryList()
|
|
|
|
{
|
|
|
|
return Reference< XDictionaryList > (
|
|
|
|
GetOneInstanceService( SN_DICTIONARY_LIST ), UNO_QUERY );
|
|
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
AppExitListener::AppExitListener()
|
|
|
|
{
|
|
|
|
// add object to Desktop EventListeners in order to properly call
|
|
|
|
// the AtExit function at appliction exit.
|
|
|
|
Reference< XMultiServiceFactory >
|
|
|
|
xMgr = getProcessServiceFactory();
|
|
|
|
|
|
|
|
if (xMgr.is())
|
|
|
|
{
|
|
|
|
xDesktop = Reference< frame::XDesktop >(
|
|
|
|
xMgr->createInstance( A2OU( SN_DESKTOP ) ), UNO_QUERY );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
AppExitListener::~AppExitListener()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void AppExitListener::Activate()
|
|
|
|
{
|
|
|
|
if (xDesktop.is())
|
|
|
|
xDesktop->addTerminateListener( this );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void AppExitListener::Deactivate()
|
|
|
|
{
|
|
|
|
if (xDesktop.is())
|
|
|
|
xDesktop->removeTerminateListener( this );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void SAL_CALL
|
|
|
|
AppExitListener::disposing( const EventObject& rEvtSource )
|
|
|
|
throw(RuntimeException)
|
|
|
|
{
|
|
|
|
MutexGuard aGuard( GetLinguMutex() );
|
|
|
|
|
|
|
|
if (xDesktop.is() && rEvtSource.Source == xDesktop)
|
|
|
|
{
|
|
|
|
xDesktop = NULL; //! release reference to desktop
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void SAL_CALL
|
|
|
|
AppExitListener::queryTermination( const EventObject& rEvtSource )
|
|
|
|
throw(frame::TerminationVetoException, RuntimeException)
|
|
|
|
{
|
|
|
|
//MutexGuard aGuard( GetLinguMutex() );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void SAL_CALL
|
|
|
|
AppExitListener::notifyTermination( const EventObject& rEvtSource )
|
|
|
|
throw(RuntimeException)
|
|
|
|
{
|
|
|
|
MutexGuard aGuard( GetLinguMutex() );
|
|
|
|
|
|
|
|
if (xDesktop.is() && rEvtSource.Source == xDesktop)
|
|
|
|
{
|
|
|
|
AtExit();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
} // namespace linguistic
|
|
|
|
|