summaryrefslogtreecommitdiff
path: root/linguistic/source/lngopt.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'linguistic/source/lngopt.cxx')
-rw-r--r--linguistic/source/lngopt.cxx1098
1 files changed, 1098 insertions, 0 deletions
diff --git a/linguistic/source/lngopt.cxx b/linguistic/source/lngopt.cxx
new file mode 100644
index 000000000000..854123275b1e
--- /dev/null
+++ b/linguistic/source/lngopt.cxx
@@ -0,0 +1,1098 @@
+/*************************************************************************
+ *
+ * $RCSfile: lngopt.cxx,v $
+ *
+ * $Revision: 1.1.1.1 $
+ *
+ * last change: $Author: hr $ $Date: 2000-11-17 12:37:38 $
+ *
+ * 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): _______________________________________
+ *
+ *
+ ************************************************************************/
+
+#include "lngopt.hxx"
+#include "lngprops.hxx"
+#include "misc.hxx"
+
+#ifndef _TOOLS_DEBUG_HXX //autogen wg. DBG_ASSERT
+#include <tools/debug.hxx>
+#endif
+#ifndef _LANG_HXX
+#include <tools/lang.hxx>
+#endif
+
+#ifndef _TOOLS_INTN_HXX
+#include <tools/intn.hxx>
+#endif
+#ifndef _SV_SVAPP_HXX
+#include <vcl/svapp.hxx>
+#endif
+#ifndef _SV_SYSTEM_HXX
+#include <vcl/system.hxx>
+#endif
+
+#include <uno/lbnames.h> // CPPU_CURRENT_LANGUAGE_BINDING_NAME macro, which specify the environment type
+#include <cppuhelper/implbase1.hxx> // helper for implementations
+
+#include <cppuhelper/factory.hxx> // helper for factories
+#ifndef _COM_SUN_STAR_CONTAINER_XNAMEACCESS_HPP_
+#include <com/sun/star/container/XNameAccess.hpp>
+#endif
+#include <com/sun/star/registry/XSimpleRegistry.hpp>
+#include <com/sun/star/registry/XRegistryKey.hpp>
+#include <com/sun/star/lang/Locale.hpp>
+
+#ifndef _UNOTOOLS_PROCESSFACTORY_HXX_
+#include <unotools/processfactory.hxx>
+#endif
+
+using namespace utl;
+using namespace osl;
+using namespace rtl;
+using namespace com::sun::star;
+using namespace com::sun::star::container;
+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 namespace com::sun::star::registry;
+
+///////////////////////////////////////////////////////////////////////////
+
+
+static const char cLocaleDelim = '-';
+
+static INT16 CfgLocaleStrToLanguage( const OUString &rCfgLocaleStr )
+{
+ INT16 nRes = LANGUAGE_NONE;
+ if (rCfgLocaleStr.getLength())
+ {
+ INT32 nCount = rCfgLocaleStr.getTokenCount( cLocaleDelim );
+ if (nCount <= 3)
+ {
+ OUString aPart[3];
+ for (INT32 i = 0; i < nCount; ++i)
+ {
+ aPart[i] = rCfgLocaleStr.getToken( i, cLocaleDelim );
+ }
+ nRes = LocaleToLanguage( Locale( aPart[0], aPart[1], aPart[2] ) );
+ }
+ else
+ DBG_ERROR( "invalid Locale string" );
+ }
+ return nRes;
+}
+
+
+static const OUString LanguageToCfgLocaleStr( INT16 nLanguage )
+{
+ static const OUString aLocaleDelim( cLocaleDelim );
+ OUString aRes;
+ if (LANGUAGE_NONE != nLanguage)
+ {
+ Locale aLocale( CreateLocale( nLanguage ) );
+ if (aLocale.Language.getLength())
+ aRes += aLocale.Language;
+ if (aLocale.Country.getLength())
+ (aRes += aLocaleDelim) += aLocale.Country;
+ if (aLocale.Variant.getLength())
+ (aRes += aLocaleDelim) += aLocale.Variant;
+ }
+ return aRes;
+}
+
+///////////////////////////////////////////////////////////////////////////
+
+
+static void GetSeqLangSvcList( const Any &rVal )
+{
+ Reference< XNameAccess > xNameAcc;
+ rVal >>= xNameAcc;
+ if (xNameAcc.is())
+ {
+ const Sequence< OUString > aNames( xNameAcc->getElementNames() );
+ INT32 nLen = aNames.getLength();
+ if (nLen)
+ {
+ const OUString *pName = aNames.getConstArray();
+ for (INT32 i = 0; i < nLen; ++i)
+ {
+ Any aTmp( xNameAcc->getByName( pName[i] ) );
+ if (aTmp.hasValue())
+ {
+ Sequence< OUString > aSvcNames;
+ aTmp >>= aSvcNames;
+
+ INT32 nSvcs = aSvcNames.getLength();
+ if (nSvcs)
+ {
+ const OUString *pSvcName = aSvcNames.getConstArray();
+ for (INT32 j = 0; j < nSvcs; ++j)
+ {
+ OUString aImplName( pSvcName[i] );
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+
+static void GetSeqLangSvc( const Any &rVal )
+{
+}
+
+
+///////////////////////////////////////////////////////////////////////////
+
+
+LinguOptions::LinguOptionsData::LinguOptionsData() :
+ ConfigItem( A2OU("Office.Linguistic") )
+{
+ // get initial language to use (in case that it is not set later)
+ nDefaultLanguage = ::GetSystemLanguage();
+ if( nDefaultLanguage == LANGUAGE_SYSTEM )
+ nDefaultLanguage = System::GetLanguage();
+
+ // general options
+ bIsGermanPreReform = FALSE;
+ bIsUseDictionaryList =
+ bIsIgnoreControlCharacters = TRUE;
+
+ // spelling options
+ bIsSpellCapitalization =
+ bIsSpellSpecial = TRUE;
+ bIsSpellAuto =
+ bIsSpellInAllLanguages =
+ bIsSpellHideMarkings =
+ bIsSpellReverse =
+ bIsSpellWithDigits =
+ bIsSpellUpperCase = FALSE;
+
+ // hyphenation options
+ bIsHyphSpecial = TRUE;
+ bIsHyphAuto = FALSE;
+ nHyphMinLeading =
+ nHyphMinTrailing = 2;
+ nHyphMinWordLength = 0;
+
+ // OtherLingu options
+ nOtherIndex = -1;
+ bIsStdSpell =
+ bIsStdThes =
+ bIsStdHyph = FALSE;
+
+ LoadConfig();
+}
+
+
+Sequence< OUString > LinguOptions::LinguOptionsData::GetPropertyNames()
+{
+ static const char * aPropNames[] =
+ {
+ "General/DefaultLocale", // 0
+ "General/DictionaryList/ActiveDictionaries", // 1
+ "General/DictionaryList/IsUseDictionaryList", // 2
+ "General/IsIgnoreControlCharacters", // 3
+ "General/IsGermanPreReform", // 4
+ "SpellChecking/IsSpellUpperCase", // 5
+ "SpellChecking/IsSpellWithDigits", // 6
+ "SpellChecking/IsSpellCapitalization", // 7
+ "SpellChecking/IsSpellAuto", // 8
+ "SpellChecking/IsSpellSpecial", // 9
+ "SpellChecking/IsSpellInAllLocales", // 10
+ "SpellChecking/IsHideMarkings", // 11
+ "SpellChecking/IsReverseDirection", // 12
+ "Hyphenation/MinLeading", // 13
+ "Hyphenation/MinTrailing", // 14
+ "Hyphenation/MinWordLength", // 15
+ "Hyphenation/IsHyphSpecial", // 16
+ "Hyphenation/IsHyphAuto", // 17
+ "ExternalLinguistic/OtherLinguIndex", // 18
+ "ExternalLinguistic/IsUseStandardSpellChecker", // 19
+ "ExternalLinguistic/IsUseStandardHyphenator", // 20
+ "ExternalLinguistic/IsUseStandardThesaurus", // 21
+ "ServiceManager/SpellCheckerList", // 22
+ "ServiceManager/ThesaurusList", // 23
+ "ServiceManager/HyphenatorList" // 24
+ };
+
+ INT32 nCount = sizeof(aPropNames) / sizeof(aPropNames[0]);
+ Sequence< OUString > aNames( nCount );
+ OUString *pNames = aNames.getArray();
+ for(INT32 i = 0; i < nCount; ++i)
+ {
+ pNames[i] = A2OU( aPropNames[i] );
+ }
+ return aNames;
+}
+
+
+BOOL LinguOptions::LinguOptionsData::LoadConfig()
+{
+ BOOL bRes = FALSE;
+
+ Sequence< OUString > aNames = GetPropertyNames();
+ INT32 nProps = aNames.getLength();
+ const Sequence< Any > aValues = GetProperties( aNames );
+ EnableNotification( aNames );
+
+ if (nProps && aValues.getLength() == nProps)
+ {
+ const Any *pValue = aValues.getConstArray();
+ for (INT32 i = 0; i < nProps; ++i)
+ {
+ const Any &rVal = pValue[i];
+ if (rVal.hasValue())
+ {
+ switch (i)
+ {
+ case 0:
+ {
+ OUString aTmp;
+ rVal >>= aTmp;
+ nDefaultLanguage = CfgLocaleStrToLanguage( aTmp );
+ break;
+ }
+ case 1: rVal >>= aActiveDics; break;
+ case 2: rVal >>= bIsUseDictionaryList; break;
+ case 3: rVal >>= bIsIgnoreControlCharacters; break;
+ case 4: rVal >>= bIsGermanPreReform; break;
+ case 5: rVal >>= bIsSpellUpperCase; break;
+ case 6: rVal >>= bIsSpellWithDigits; break;
+ case 7: rVal >>= bIsSpellCapitalization; break;
+ case 8: rVal >>= bIsSpellAuto; break;
+ case 9: rVal >>= bIsSpellSpecial; break;
+ case 10: rVal >>= bIsSpellInAllLanguages; break;
+ case 11: rVal >>= bIsSpellHideMarkings; break;
+ case 12: rVal >>= bIsSpellReverse; break;
+ case 13: rVal >>= nHyphMinLeading; break;
+ case 14: rVal >>= nHyphMinTrailing; break;
+ case 15: rVal >>= nHyphMinWordLength; break;
+ case 16: rVal >>= bIsHyphSpecial; break;
+ case 17: rVal >>= bIsHyphAuto; break;
+ case 18: rVal >>= nOtherIndex; break;
+ case 19: rVal >>= bIsStdSpell; break;
+ case 20: rVal >>= bIsStdHyph; break;
+ case 21: rVal >>= bIsStdThes; break;
+ case 22: GetSeqLangSvcList( rVal ); break;
+ case 23: GetSeqLangSvcList( rVal ); break;
+ case 24: GetSeqLangSvc( rVal ); break;
+ default:
+ DBG_ERROR( "unexpected case" );
+ }
+ }
+ }
+
+ bRes = TRUE;
+ }
+ DBG_ASSERT( bRes, "LoadConfig failed" );
+
+ return bRes;
+}
+
+
+BOOL LinguOptions::LinguOptionsData::SaveConfig()
+{
+ const Sequence< OUString > aNames = GetPropertyNames();
+ INT32 nProps = aNames.getLength();
+ Sequence< Any > aValues( aNames.getLength() );
+ Any *pValue = aValues.getArray();
+
+ const Type &rBOOL = ::getBooleanCppuType();
+ const Type &rINT16 = ::getCppuType( (INT16 *) NULL );
+
+ for (INT32 i = 0; i < nProps; ++i)
+ {
+ Any &rVal = pValue[i];
+ switch (i)
+ {
+ case 0:
+ {
+ OUString aTmp( LanguageToCfgLocaleStr( nDefaultLanguage ) );
+ rVal = makeAny( aTmp );
+ }
+ case 1: rVal = makeAny( aActiveDics ); break;
+ case 2: rVal.setValue( &bIsUseDictionaryList, rBOOL ); break;
+ case 3: rVal.setValue( &bIsIgnoreControlCharacters, rBOOL ); break;
+ case 4: rVal.setValue( &bIsGermanPreReform, rBOOL ); break;
+ case 5: rVal.setValue( &bIsSpellUpperCase, rBOOL ); break;
+ case 6: rVal.setValue( &bIsSpellWithDigits, rBOOL ); break;
+ case 7: rVal.setValue( &bIsSpellCapitalization, rBOOL ); break;
+ case 8: rVal.setValue( &bIsSpellAuto, rBOOL ); break;
+ case 9: rVal.setValue( &bIsSpellSpecial, rBOOL ); break;
+ case 10: rVal.setValue( &bIsSpellInAllLanguages, rBOOL ); break;
+ case 11: rVal.setValue( &bIsSpellHideMarkings, rBOOL ); break;
+ case 12: rVal.setValue( &bIsSpellReverse, rBOOL ); break;
+ case 13: rVal.setValue( &nHyphMinLeading, rINT16 ); break;
+ case 14: rVal.setValue( &nHyphMinTrailing, rINT16 ); break;
+ case 15: rVal.setValue( &nHyphMinWordLength, rINT16 ); break;
+ case 16: rVal.setValue( &bIsHyphSpecial, rBOOL ); break;
+ case 17: rVal.setValue( &bIsHyphAuto, rBOOL ); break;
+ case 18: rVal.setValue( &nOtherIndex, rINT16 ); break;
+ case 19: rVal.setValue( &bIsStdSpell, rBOOL ); break;
+ case 20: rVal.setValue( &bIsStdHyph, rBOOL ); break;
+ case 21: rVal.setValue( &bIsStdThes, rBOOL ); break;
+ case 22: break;
+ case 23: break;
+ case 24: break;
+ default:
+ DBG_ERROR( "unexpected case" );
+ }
+ }
+
+ return PutProperties( aNames, aValues );
+}
+
+
+void LinguOptions::LinguOptionsData::Notify( const Sequence< OUString >& rPropertyNames )
+{
+ DBG_ERROR("properties have been changed");
+}
+
+
+void LinguOptions::LinguOptionsData::Commit()
+{
+ SaveConfig();
+}
+
+
+///////////////////////////////////////////////////////////////////////////
+
+// static member intialization
+LinguOptions::LinguOptionsData * LinguOptions::pData = NULL;
+
+
+LinguOptions::LinguOptions()
+{
+ if (!pData)
+ {
+ pData = new LinguOptionsData;
+ }
+
+ ++pData->aRefCount;
+}
+
+
+LinguOptions::LinguOptions(const LinguOptions &rOpt)
+{
+ DBG_ASSERT( pData, "lng : data missing" );
+ ++pData->aRefCount;
+}
+
+
+LinguOptions::~LinguOptions()
+{
+ MutexGuard aGuard( GetLinguMutex() );
+
+ if (--pData->aRefCount == 0)
+ {
+ delete pData; pData = NULL;
+ }
+}
+
+
+BOOL LinguOptions::SetValue( Any &rOld, const Any &rVal, INT32 nWID )
+{
+ MutexGuard aGuard( GetLinguMutex() );
+
+ BOOL bRes = FALSE;
+
+ INT16 *pnVal = 0;
+ BOOL *pbVal = 0;
+
+ switch( nWID )
+ {
+ case WID_IS_GERMAN_PRE_REFORM : pbVal = &pData->bIsGermanPreReform; break;
+ case WID_IS_USE_DICTIONARY_LIST : pbVal = &pData->bIsUseDictionaryList; break;
+ case WID_IS_IGNORE_CONTROL_CHARACTERS : pbVal = &pData->bIsIgnoreControlCharacters; break;
+ case WID_IS_HYPH_AUTO : pbVal = &pData->bIsHyphAuto; break;
+ case WID_IS_HYPH_SPECIAL : pbVal = &pData->bIsHyphSpecial; break;
+ case WID_IS_SPELL_AUTO : pbVal = &pData->bIsSpellAuto; break;
+ case WID_IS_SPELL_HIDE : pbVal = &pData->bIsSpellHideMarkings; break;
+ case WID_IS_SPELL_IN_ALL_LANGUAGES :pbVal = &pData->bIsSpellInAllLanguages; break;
+ case WID_IS_SPELL_SPECIAL : pbVal = &pData->bIsSpellSpecial; break;
+ case WID_IS_WRAP_REVERSE : pbVal = &pData->bIsSpellReverse; break;
+ case WID_DEFAULT_LANGUAGE : pnVal = &pData->nDefaultLanguage; break;
+ case WID_IS_STANDARD_HYPHENATOR : pbVal = &pData->bIsStdHyph; break;
+ case WID_IS_STANDARD_SPELL_CHECKER :pbVal = &pData->bIsStdSpell; break;
+ case WID_IS_STANDARD_THESAURUS : pbVal = &pData->bIsStdThes; break;
+ case WID_OTHER_LINGU_INDEX : pnVal = &pData->nOtherIndex; break;
+ case WID_IS_SPELL_CAPITALIZATION : pbVal = &pData->bIsSpellCapitalization; break;
+ case WID_IS_SPELL_WITH_DIGITS : pbVal = &pData->bIsSpellWithDigits; break;
+ case WID_IS_SPELL_UPPER_CASE : pbVal = &pData->bIsSpellUpperCase; break;
+ case WID_HYPH_MIN_LEADING : pnVal = &pData->nHyphMinLeading; break;
+ case WID_HYPH_MIN_TRAILING : pnVal = &pData->nHyphMinTrailing; break;
+ case WID_HYPH_MIN_WORD_LENGTH : pnVal = &pData->nHyphMinWordLength; break;
+ case WID_DEFAULT_LOCALE :
+ {
+ Locale aNew;
+ rVal >>= aNew;
+ INT16 nNew = LocaleToLanguage( aNew );
+ if (nNew != pData->nDefaultLanguage)
+ {
+ Locale aLocale( CreateLocale( pData->nDefaultLanguage ) );
+ rOld.setValue( &aLocale, ::getCppuType((Locale*)0 ));
+ pData->nDefaultLanguage = nNew;
+ bRes = TRUE;
+ }
+ break;
+ }
+ default :
+ {
+ DBG_ERROR("lng : unknown WID");
+ bRes = FALSE;
+ }
+ }
+
+ if (pbVal)
+ {
+ BOOL bNew;
+ rVal >>= bNew;
+ if (bNew != *pbVal)
+ {
+ rOld <<= *pbVal;
+ *pbVal = bNew;
+ bRes = TRUE;
+ }
+ }
+ if (pnVal)
+ {
+ INT16 nNew;
+ rVal >>= nNew;
+ if (nNew != *pnVal)
+ {
+ rOld <<= *pnVal;
+ *pnVal = nNew;
+ bRes = TRUE;
+ }
+ }
+
+ if (bRes)
+ pData->SetCfgItemModified();
+
+ return bRes;
+}
+
+void LinguOptions::GetValue( Any &rVal, INT32 nWID ) const
+{
+ MutexGuard aGuard( GetLinguMutex() );
+
+ INT16 *pnVal = 0;
+ BOOL *pbVal = 0;
+
+ switch( nWID )
+ {
+ case WID_IS_GERMAN_PRE_REFORM : pbVal = &pData->bIsGermanPreReform; break;
+ case WID_IS_USE_DICTIONARY_LIST : pbVal = &pData->bIsUseDictionaryList; break;
+ case WID_IS_IGNORE_CONTROL_CHARACTERS : pbVal = &pData->bIsIgnoreControlCharacters; break;
+ case WID_IS_HYPH_AUTO : pbVal = &pData->bIsHyphAuto; break;
+ case WID_IS_HYPH_SPECIAL : pbVal = &pData->bIsHyphSpecial; break;
+ case WID_IS_SPELL_AUTO : pbVal = &pData->bIsSpellAuto; break;
+ case WID_IS_SPELL_HIDE : pbVal = &pData->bIsSpellHideMarkings; break;
+ case WID_IS_SPELL_IN_ALL_LANGUAGES :pbVal = &pData->bIsSpellInAllLanguages; break;
+ case WID_IS_SPELL_SPECIAL : pbVal = &pData->bIsSpellSpecial; break;
+ case WID_IS_WRAP_REVERSE : pbVal = &pData->bIsSpellReverse; break;
+ case WID_DEFAULT_LANGUAGE : pnVal = &pData->nDefaultLanguage; break;
+ case WID_IS_STANDARD_HYPHENATOR : pbVal = &pData->bIsStdHyph; break;
+ case WID_IS_STANDARD_SPELL_CHECKER :pbVal = &pData->bIsStdSpell; break;
+ case WID_IS_STANDARD_THESAURUS : pbVal = &pData->bIsStdThes; break;
+ case WID_OTHER_LINGU_INDEX : pnVal = &pData->nOtherIndex; break;
+ case WID_IS_SPELL_CAPITALIZATION : pbVal = &pData->bIsSpellCapitalization; break;
+ case WID_IS_SPELL_WITH_DIGITS : pbVal = &pData->bIsSpellWithDigits; break;
+ case WID_IS_SPELL_UPPER_CASE : pbVal = &pData->bIsSpellUpperCase; break;
+ case WID_HYPH_MIN_LEADING : pnVal = &pData->nHyphMinLeading; break;
+ case WID_HYPH_MIN_TRAILING : pnVal = &pData->nHyphMinTrailing; break;
+ case WID_HYPH_MIN_WORD_LENGTH : pnVal = &pData->nHyphMinWordLength; break;
+ case WID_DEFAULT_LOCALE :
+ {
+ Locale aLocale( CreateLocale( pData->nDefaultLanguage ) );
+ rVal.setValue( &aLocale, ::getCppuType((Locale*)0 ));
+ break;
+ }
+ default :
+ {
+ DBG_ERROR("lng : unknown WID");
+ }
+ }
+
+ if (pbVal)
+ rVal <<= *pbVal;
+ if (pnVal)
+ rVal <<= *pnVal;
+}
+
+
+struct WID_Name
+{
+ INT32 nWID;
+ const char *pPropertyName;
+};
+
+WID_Name aWID_Name[] =
+{
+ WID_IS_GERMAN_PRE_REFORM, UPN_IS_GERMAN_PRE_REFORM,
+ WID_IS_USE_DICTIONARY_LIST, UPN_IS_USE_DICTIONARY_LIST,
+ WID_IS_IGNORE_CONTROL_CHARACTERS, UPN_IS_IGNORE_CONTROL_CHARACTERS,
+ WID_IS_SPELL_UPPER_CASE, UPN_IS_SPELL_UPPER_CASE,
+ WID_IS_SPELL_WITH_DIGITS, UPN_IS_SPELL_WITH_DIGITS,
+ WID_IS_SPELL_CAPITALIZATION, UPN_IS_SPELL_CAPITALIZATION,
+ WID_HYPH_MIN_LEADING, UPN_HYPH_MIN_LEADING,
+ WID_HYPH_MIN_TRAILING, UPN_HYPH_MIN_TRAILING,
+ WID_HYPH_MIN_WORD_LENGTH, UPN_HYPH_MIN_WORD_LENGTH,
+ WID_DEFAULT_LOCALE, UPN_DEFAULT_LOCALE,
+ WID_IS_SPELL_AUTO, UPN_IS_SPELL_AUTO,
+ WID_IS_SPELL_HIDE, UPN_IS_SPELL_HIDE,
+ WID_IS_SPELL_IN_ALL_LANGUAGES, UPN_IS_SPELL_IN_ALL_LANGUAGES,
+ WID_IS_SPELL_SPECIAL, UPN_IS_SPELL_SPECIAL,
+ WID_IS_HYPH_AUTO, UPN_IS_HYPH_AUTO,
+ WID_IS_HYPH_SPECIAL, UPN_IS_HYPH_SPECIAL,
+ WID_IS_WRAP_REVERSE, UPN_IS_WRAP_REVERSE,
+ WID_IS_STANDARD_HYPHENATOR, UPN_IS_STANDARD_HYPHENATOR,
+ WID_IS_STANDARD_SPELL_CHECKER, UPN_IS_STANDARD_SPELL_CHECKER,
+ WID_IS_STANDARD_THESAURUS, UPN_IS_STANDARD_THESAURUS,
+ WID_OTHER_LINGU_INDEX, UPN_OTHER_LINGU_INDEX,
+ WID_DEFAULT_LANGUAGE, UPN_DEFAULT_LANGUAGE
+};
+
+
+OUString LinguOptions::GetName( INT32 nWID ) const
+{
+ MutexGuard aGuard( GetLinguMutex() );
+
+ OUString aRes;
+
+ INT32 nLen = sizeof( aWID_Name ) / sizeof( aWID_Name[0] );
+ if (0 <= nWID && nWID < nLen
+ && aWID_Name[ nWID ].nWID == nWID)
+ {
+ aRes = OUString( RTL_CONSTASCII_USTRINGPARAM(
+ aWID_Name[ nWID ].pPropertyName ) );
+ }
+ else
+ {
+ DBG_ERROR("lng : unknown WID");
+ }
+
+ return aRes;
+}
+
+
+void LinguOptions::SetCfgActiveDictionaries(
+ Reference< XDictionaryList > &rDicList )
+{
+ if (rDicList.is())
+ {
+ Sequence< Reference< XDictionary > > aDics( rDicList->getDictionaries() );
+ const Reference< XDictionary > *pDic = aDics.getConstArray();
+ INT32 nCount = aDics.getLength();
+
+ pData->aActiveDics.realloc( nCount );
+ OUString *pActiveDic = pData->aActiveDics.getArray();
+ INT32 nLen = 0;
+ for (INT32 i = 0; i < nCount; ++i)
+ {
+ const Reference< XDictionary > &rDic = pDic[i];
+ if (rDic.is() && rDic->isActive())
+ pActiveDic[ nLen++ ] = rDic->getName();
+ }
+ pData->aActiveDics.realloc( nLen );
+
+ pData->SetCfgItemModified();
+ }
+}
+
+
+BOOL LinguOptions::Load()
+{
+ BOOL bRes = FALSE;
+ DBG_ASSERT( pData, "NULL Pointer" );
+ if (pData)
+ bRes = pData->LoadConfig();
+ return bRes;
+}
+
+
+BOOL LinguOptions::Save()
+{
+ BOOL bRes = FALSE;
+ DBG_ASSERT( pData, "NULL Pointer" );
+ if (pData)
+ bRes = pData->SaveConfig();
+ return bRes;
+}
+
+///////////////////////////////////////////////////////////////////////////
+
+void LinguProps::MyAppExitListener::AtExit()
+{
+ // save PropertySet upon application exit
+ rMyOpt.Save();
+}
+
+//! map must be sorted by first entry in alphabetical increasing order.
+
+static SfxItemPropertyMap aLinguProps[] =
+{
+ { MAP_CHAR_LEN(UPN_DEFAULT_LANGUAGE), WID_DEFAULT_LANGUAGE,
+ &::getCppuType( (sal_Int16*)0 ), 0, 0 },
+ { MAP_CHAR_LEN(UPN_DEFAULT_LOCALE), WID_DEFAULT_LOCALE,
+ &::getCppuType( (Locale* )0), 0, 0 },
+ { MAP_CHAR_LEN(UPN_HYPH_MIN_LEADING), WID_HYPH_MIN_LEADING,
+ &::getCppuType( (sal_Int16*)0 ), 0, 0 },
+ { MAP_CHAR_LEN(UPN_HYPH_MIN_TRAILING), WID_HYPH_MIN_TRAILING,
+ &::getCppuType( (sal_Int16*)0 ), 0, 0 },
+ { MAP_CHAR_LEN(UPN_HYPH_MIN_WORD_LENGTH), WID_HYPH_MIN_WORD_LENGTH,
+ &::getCppuType( (sal_Int16*)0 ), 0, 0 },
+ { MAP_CHAR_LEN(UPN_IS_GERMAN_PRE_REFORM), WID_IS_GERMAN_PRE_REFORM,
+ &::getBooleanCppuType(), 0, 0 },
+ { MAP_CHAR_LEN(UPN_IS_HYPH_AUTO), WID_IS_HYPH_AUTO,
+ &::getBooleanCppuType(), 0, 0 },
+ { MAP_CHAR_LEN(UPN_IS_HYPH_SPECIAL), WID_IS_HYPH_SPECIAL,
+ &::getBooleanCppuType(), 0, 0 },
+ { MAP_CHAR_LEN(UPN_IS_IGNORE_CONTROL_CHARACTERS), WID_IS_IGNORE_CONTROL_CHARACTERS,
+ &::getBooleanCppuType(), 0, 0 },
+ { MAP_CHAR_LEN(UPN_IS_SPELL_AUTO), WID_IS_SPELL_AUTO,
+ &::getBooleanCppuType(), 0, 0 },
+ { MAP_CHAR_LEN(UPN_IS_SPELL_CAPITALIZATION), WID_IS_SPELL_CAPITALIZATION,
+ &::getBooleanCppuType(), 0, 0 },
+ { MAP_CHAR_LEN(UPN_IS_SPELL_HIDE), WID_IS_SPELL_HIDE,
+ &::getBooleanCppuType(), 0, 0 },
+ { MAP_CHAR_LEN(UPN_IS_SPELL_IN_ALL_LANGUAGES), WID_IS_SPELL_IN_ALL_LANGUAGES,
+ &::getBooleanCppuType(), 0, 0 },
+ { MAP_CHAR_LEN(UPN_IS_SPELL_SPECIAL), WID_IS_SPELL_SPECIAL,
+ &::getBooleanCppuType(), 0, 0 },
+ { MAP_CHAR_LEN(UPN_IS_SPELL_UPPER_CASE), WID_IS_SPELL_UPPER_CASE,
+ &::getBooleanCppuType(), 0, 0 },
+ { MAP_CHAR_LEN(UPN_IS_SPELL_WITH_DIGITS), WID_IS_SPELL_WITH_DIGITS,
+ &::getBooleanCppuType(), 0, 0 },
+ { MAP_CHAR_LEN(UPN_IS_STANDARD_HYPHENATOR), WID_IS_STANDARD_HYPHENATOR,
+ &::getBooleanCppuType(), 0, 0 },
+ { MAP_CHAR_LEN(UPN_IS_STANDARD_SPELL_CHECKER), WID_IS_STANDARD_SPELL_CHECKER,
+ &::getBooleanCppuType(), 0, 0 },
+ { MAP_CHAR_LEN(UPN_IS_STANDARD_THESAURUS), WID_IS_STANDARD_THESAURUS,
+ &::getBooleanCppuType(), 0, 0 },
+ { MAP_CHAR_LEN(UPN_IS_USE_DICTIONARY_LIST), WID_IS_USE_DICTIONARY_LIST,
+ &::getBooleanCppuType(), 0, 0 },
+ { MAP_CHAR_LEN(UPN_IS_WRAP_REVERSE), WID_IS_WRAP_REVERSE,
+ &::getBooleanCppuType(), 0, 0 },
+ { MAP_CHAR_LEN(UPN_OTHER_LINGU_INDEX), WID_OTHER_LINGU_INDEX,
+ &::getCppuType( (sal_Int16*)0 ), 0, 0 },
+ { 0,0,0,0 }
+};
+
+LinguProps::LinguProps() :
+ aEvtListeners (GetLinguMutex()),
+ aPropListeners (GetLinguMutex()),
+ pMap (aLinguProps)
+{
+ bDisposing = FALSE;
+ pExitListener = new MyAppExitListener( aOpt );
+ xExitListener = pExitListener;
+ pExitListener->Activate();
+}
+
+LinguProps::~LinguProps()
+{
+ pExitListener->Deactivate();
+}
+
+void LinguProps::launchEvent( const PropertyChangeEvent &rEvt ) const
+{
+ cppu::OInterfaceContainerHelper *pContainer =
+ aPropListeners.getContainer( rEvt.PropertyHandle );
+ if (pContainer)
+ {
+ cppu::OInterfaceIteratorHelper aIt( *pContainer );
+ while (aIt.hasMoreElements())
+ {
+ Reference< XPropertyChangeListener > xRef( aIt.next(), UNO_QUERY );
+ if (xRef.is())
+ xRef->propertyChange( rEvt );
+ }
+ }
+}
+
+Reference< XInterface > SAL_CALL LinguProps_CreateInstance(
+ const Reference< XMultiServiceFactory > & rSMgr )
+ throw(Exception)
+{
+ Reference< XInterface > xService = (cppu::OWeakObject*)new LinguProps;
+ return xService;
+}
+
+Reference< XPropertySetInfo > SAL_CALL LinguProps::getPropertySetInfo()
+ throw(RuntimeException)
+{
+ MutexGuard aGuard( GetLinguMutex() );
+
+ static Reference< XPropertySetInfo > aRef =
+ new SfxItemPropertySetInfo( pMap );
+ return aRef;
+}
+
+void SAL_CALL LinguProps::setPropertyValue(
+ const OUString& rPropertyName, const Any& aValue )
+ throw(UnknownPropertyException, PropertyVetoException,
+ IllegalArgumentException, WrappedTargetException, RuntimeException)
+{
+ MutexGuard aGuard( GetLinguMutex() );
+
+ const SfxItemPropertyMap* pCur =
+ SfxItemPropertyMap::GetByName(pMap, rPropertyName);
+ if (pCur)
+ {
+ Any aOld;
+ if (aOpt.SetValue( aOld, aValue, pCur->nWID ))
+ {
+ PropertyChangeEvent aChgEvt( (XPropertySet *) this, rPropertyName,
+ FALSE, pCur->nWID, aOld, aValue );
+ launchEvent( aChgEvt );
+ }
+ }
+#ifdef LINGU_EXCEPTIONS
+ else
+ {
+ throw UnknownPropertyException();
+ }
+#endif
+}
+
+Any SAL_CALL LinguProps::getPropertyValue( const OUString& rPropertyName )
+ throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
+{
+ MutexGuard aGuard( GetLinguMutex() );
+
+ Any aRet;
+
+ const SfxItemPropertyMap* pCur = SfxItemPropertyMap::GetByName(pMap, rPropertyName);
+ if(pCur)
+ {
+ aOpt.GetValue( aRet, pCur->nWID );
+ }
+#ifdef LINGU_EXCEPTIONS
+ else
+ {
+ throw UnknownPropertyException();
+ }
+#endif
+
+ return aRet;
+}
+
+void SAL_CALL LinguProps::addPropertyChangeListener(
+ const OUString& rPropertyName,
+ const Reference< XPropertyChangeListener >& rxListener )
+ throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
+{
+ MutexGuard aGuard( GetLinguMutex() );
+
+ if (!bDisposing && rxListener.is())
+ {
+ const SfxItemPropertyMap* pCur =
+ SfxItemPropertyMap::GetByName( pMap, rPropertyName );
+ if(pCur)
+ aPropListeners.addInterface( pCur->nWID, rxListener );
+#ifdef LINGU_EXCEPTIONS
+ else
+ {
+ throw UnknownPropertyException();
+ }
+#endif
+ }
+}
+
+void SAL_CALL LinguProps::removePropertyChangeListener(
+ const OUString& rPropertyName,
+ const Reference< XPropertyChangeListener >& rxListener )
+ throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
+{
+ MutexGuard aGuard( GetLinguMutex() );
+
+ if (!bDisposing && rxListener.is())
+ {
+ const SfxItemPropertyMap* pCur =
+ SfxItemPropertyMap::GetByName( pMap, rPropertyName );
+ if(pCur)
+ aPropListeners.removeInterface( pCur->nWID, rxListener );
+#ifdef LINGU_EXCEPTIONS
+ else
+ {
+ throw UnknownPropertyException();
+ }
+#endif
+ }
+}
+
+void SAL_CALL LinguProps::addVetoableChangeListener(
+ const OUString& PropertyName,
+ const Reference< XVetoableChangeListener >& aListener )
+ throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
+{
+// MutexGuard aGuard( GetLinguMutex() );
+}
+
+void SAL_CALL LinguProps::removeVetoableChangeListener(
+ const OUString& PropertyName,
+ const Reference< XVetoableChangeListener >& aListener )
+ throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
+{
+// MutexGuard aGuard( GetLinguMutex() );
+}
+
+
+void SAL_CALL LinguProps::setFastPropertyValue( sal_Int32 nHandle, const Any& rValue )
+ throw(UnknownPropertyException, PropertyVetoException,
+ IllegalArgumentException, WrappedTargetException, RuntimeException)
+{
+ MutexGuard aGuard( GetLinguMutex() );
+
+ Any aOld;
+ if (aOpt.SetValue( aOld, rValue, nHandle ))
+ {
+ PropertyChangeEvent aChgEvt( (XPropertySet *) this,
+ aOpt.GetName( nHandle ), FALSE, nHandle, aOld, rValue );
+ launchEvent( aChgEvt );
+ }
+}
+
+
+Any SAL_CALL LinguProps::getFastPropertyValue( sal_Int32 nHandle )
+ throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
+{
+ MutexGuard aGuard( GetLinguMutex() );
+
+ Any aRes;
+ aOpt.GetValue( aRes, nHandle );
+ return aRes;
+}
+
+
+Sequence< PropertyValue > SAL_CALL
+ LinguProps::getPropertyValues()
+ throw(RuntimeException)
+{
+ MutexGuard aGuard( GetLinguMutex() );
+
+ INT32 nLen = sizeof (aLinguProps) / sizeof aLinguProps[0] - 1;
+ Sequence< PropertyValue > aProps( nLen );
+ PropertyValue *pProp = aProps.getArray();
+ for (INT32 i = 0; i < nLen; i++)
+ {
+ PropertyValue &rVal = pProp[i];
+ SfxItemPropertyMap &rItem = aLinguProps[i];
+ Any aAny;
+ aOpt.GetValue( aAny, rItem.nWID );
+
+ rVal.Name = OUString( rItem.pName, rItem.nNameLen, GetTextEncoding() );
+ rVal.Handle = rItem.nWID;
+ rVal.Value = aAny;
+ rVal.State = PropertyState_DIRECT_VALUE ;
+ }
+ return aProps;
+}
+
+void SAL_CALL
+ LinguProps::setPropertyValues( const Sequence< PropertyValue >& rProps )
+ throw(UnknownPropertyException, PropertyVetoException,
+ IllegalArgumentException, WrappedTargetException, RuntimeException)
+{
+ MutexGuard aGuard( GetLinguMutex() );
+
+ INT32 nLen = rProps.getLength();
+ const PropertyValue *pVal = rProps.getConstArray();
+ for (INT32 i = 0; i < nLen; ++i)
+ {
+ Any aOld;
+ const PropertyValue &rVal = pVal[i];
+ if (aOpt.SetValue( aOld, rVal.Value, rVal.Handle ))
+ {
+ PropertyChangeEvent aChgEvt( (XPropertySet *) this,
+ rVal.Name, FALSE, rVal.Handle, aOld, rVal.Value );
+ launchEvent( aChgEvt );
+ }
+ }
+}
+
+void SAL_CALL
+ LinguProps::dispose()
+ throw(RuntimeException)
+{
+ MutexGuard aGuard( GetLinguMutex() );
+
+ if (!bDisposing)
+ {
+ bDisposing = TRUE;
+
+ //! its too late to save the options here!
+ // (see AppExitListener for saving)
+ //aOpt.Save(); // save (possible) changes before exiting
+
+ EventObject aEvtObj( (XPropertySet *) this );
+ aEvtListeners.disposeAndClear( aEvtObj );
+ aPropListeners.disposeAndClear( aEvtObj );
+ }
+}
+
+void SAL_CALL
+ LinguProps::addEventListener( const Reference< XEventListener >& rxListener )
+ throw(RuntimeException)
+{
+ MutexGuard aGuard( GetLinguMutex() );
+
+ if (!bDisposing && rxListener.is())
+ aEvtListeners.addInterface( rxListener );
+}
+
+void SAL_CALL
+ LinguProps::removeEventListener( const Reference< XEventListener >& rxListener )
+ throw(RuntimeException)
+{
+ MutexGuard aGuard( GetLinguMutex() );
+
+ if (!bDisposing && rxListener.is())
+ aEvtListeners.removeInterface( rxListener );
+}
+
+
+///////////////////////////////////////////////////////////////////////////
+// Service specific part
+//
+
+// XServiceInfo
+OUString SAL_CALL LinguProps::getImplementationName()
+ throw(RuntimeException)
+{
+ MutexGuard aGuard( GetLinguMutex() );
+ return getImplementationName_Static();
+}
+
+// XServiceInfo
+sal_Bool SAL_CALL LinguProps::supportsService( const OUString& ServiceName )
+ throw(RuntimeException)
+{
+ MutexGuard aGuard( GetLinguMutex() );
+
+ uno::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;
+}
+
+// XServiceInfo
+uno::Sequence< OUString > SAL_CALL LinguProps::getSupportedServiceNames()
+ throw(RuntimeException)
+{
+ MutexGuard aGuard( GetLinguMutex() );
+ return getSupportedServiceNames_Static();
+}
+
+// ORegistryServiceManager_Static
+uno::Sequence< OUString > LinguProps::getSupportedServiceNames_Static()
+ throw()
+{
+ MutexGuard aGuard( GetLinguMutex() );
+
+ uno::Sequence< OUString > aSNS( 1 ); // auch mehr als 1 Service moeglich
+ aSNS.getArray()[0] = A2OU( SN_LINGU_PROPERTIES );
+ return aSNS;
+}
+
+
+sal_Bool SAL_CALL LinguProps_writeInfo( void * /*pServiceManager*/,
+ XRegistryKey * pRegistryKey )
+{
+ try
+ {
+ String aImpl( '/' );
+ aImpl += LinguProps::getImplementationName_Static().getStr();
+ aImpl.AppendAscii( "/UNO/SERVICES" );
+ Reference< XRegistryKey > xNewKey =
+ pRegistryKey->createKey(aImpl );
+ uno::Sequence< OUString > aServices = LinguProps::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 LinguProps_getFactory( const sal_Char * pImplName,
+ XMultiServiceFactory *pServiceManager, void * )
+{
+ void * pRet = 0;
+ if ( !LinguProps::getImplementationName_Static().compareToAscii( pImplName ) )
+ {
+ Reference< XSingleServiceFactory > xFactory =
+ cppu::createOneInstanceFactory(
+ pServiceManager,
+ LinguProps::getImplementationName_Static(),
+ LinguProps_CreateInstance,
+ LinguProps::getSupportedServiceNames_Static());
+ // acquire, because we return an interface pointer instead of a reference
+ xFactory->acquire();
+ pRet = xFactory.get();
+ }
+ return pRet;
+}
+
+///////////////////////////////////////////////////////////////////////////
+