From 5a03ff2c5391d9a25d0bfbb1e4b3f1312df1c70b Mon Sep 17 00:00:00 2001 From: Mathias Bauer Date: Tue, 12 Jan 2010 08:29:31 +0100 Subject: #i107450#: code from svx/source/options moved to other libs --- svl/source/config/asiancfg.cxx | 294 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 294 insertions(+) create mode 100644 svl/source/config/asiancfg.cxx (limited to 'svl/source/config/asiancfg.cxx') diff --git a/svl/source/config/asiancfg.cxx b/svl/source/config/asiancfg.cxx new file mode 100644 index 000000000000..fb234781bdf8 --- /dev/null +++ b/svl/source/config/asiancfg.cxx @@ -0,0 +1,294 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: asiancfg.cxx,v $ + * $Revision: 1.7 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org 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 version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_svl.hxx" + +#include +#include +#include +#include +#include +#include +#include + +//----------------------------------------------------------------------------- +using namespace utl; +using namespace rtl; +using namespace com::sun::star; +using namespace com::sun::star::uno; +using namespace com::sun::star::beans; +using namespace com::sun::star::lang; + +#define C2U(cChar) OUString::createFromAscii(cChar) +const sal_Char sStartEndCharacters[] = "StartEndCharacters"; +const sal_Char sStartCharacters[] = "StartCharacters"; +const sal_Char sEndCharacters[] = "EndCharacters"; + +//----------------------------------------------------------------------------- +struct SvxForbiddenStruct_Impl +{ + Locale aLocale; + OUString sStartChars; + OUString sEndChars; +}; +//----------------------------------------------------------------------------- +typedef SvxForbiddenStruct_Impl* SvxForbiddenStruct_ImplPtr; +SV_DECL_PTRARR_DEL(SvxForbiddenStructArr, SvxForbiddenStruct_ImplPtr, 2, 2) +SV_IMPL_PTRARR(SvxForbiddenStructArr, SvxForbiddenStruct_ImplPtr); +//----------------------------------------------------------------------------- +struct SvxAsianConfig_Impl +{ + sal_Bool bKerningWesternTextOnly; + sal_Int16 nCharDistanceCompression; + + SvxForbiddenStructArr aForbiddenArr; + + SvxAsianConfig_Impl() : + bKerningWesternTextOnly(sal_True), + nCharDistanceCompression(0) {} +}; +/* -----------------------------16.01.01 15:36-------------------------------- + + ---------------------------------------------------------------------------*/ +Sequence lcl_GetPropertyNames() +{ + Sequence aNames(2); + OUString* pNames = aNames.getArray(); + pNames[0] = C2U("IsKerningWesternTextOnly"); + pNames[1] = C2U("CompressCharacterDistance"); + return aNames;; +} +// --------------------------------------------------------------------------- +SvxAsianConfig::SvxAsianConfig(sal_Bool bEnableNotify) : + utl::ConfigItem(C2U("Office.Common/AsianLayout")), + pImpl(new SvxAsianConfig_Impl) +{ + if(bEnableNotify) + EnableNotification(lcl_GetPropertyNames()); + Load(); +} +/* -----------------------------16.01.01 15:36-------------------------------- + + ---------------------------------------------------------------------------*/ +SvxAsianConfig::~SvxAsianConfig() +{ + delete pImpl; +} +/* -----------------------------17.01.01 09:57-------------------------------- + + ---------------------------------------------------------------------------*/ +void SvxAsianConfig::Load() +{ + Sequence aValues = GetProperties(lcl_GetPropertyNames()); + const Any* pValues = aValues.getConstArray(); + if(pValues[0].hasValue()) + pImpl->bKerningWesternTextOnly = *(sal_Bool*) pValues[0].getValue(); + pValues[1] >>= pImpl->nCharDistanceCompression; + + pImpl->aForbiddenArr.DeleteAndDestroy(0, pImpl->aForbiddenArr.Count()); + OUString sPropPrefix(C2U(sStartEndCharacters)); + Sequence aNodes = GetNodeNames(sPropPrefix); + + Sequence aPropNames(aNodes.getLength() * 2); + OUString* pNames = aPropNames.getArray(); + sal_Int32 nName = 0; + sPropPrefix += C2U("/"); + sal_Int32 nNode; + const OUString* pNodes = aNodes.getConstArray(); + for(nNode = 0; nNode < aNodes.getLength(); nNode++) + { + OUString sStart(sPropPrefix); + sStart += pNodes[nNode]; + sStart += C2U("/"); + pNames[nName] = sStart; pNames[nName++] += C2U("StartCharacters"); + pNames[nName] = sStart; pNames[nName++] += C2U("EndCharacters"); + } + Sequence aNodeValues = GetProperties(aPropNames); + const Any* pNodeValues = aNodeValues.getConstArray(); + nName = 0; + for(nNode = 0; nNode < aNodes.getLength(); nNode++) + { + SvxForbiddenStruct_ImplPtr pInsert = new SvxForbiddenStruct_Impl; + pInsert->aLocale.Language = pNodes[nNode].copy(0, 2); + DBG_ASSERT(pInsert->aLocale.Language.getLength(), "illegal language"); + pInsert->aLocale.Country = pNodes[nNode].copy(3, 2); + + pNodeValues[nName++] >>= pInsert->sStartChars; + pNodeValues[nName++] >>= pInsert->sEndChars; + pImpl->aForbiddenArr.Insert(pInsert, pImpl->aForbiddenArr.Count()); + } +} +/* -----------------------------17.01.01 09:57-------------------------------- + + ---------------------------------------------------------------------------*/ +void SvxAsianConfig::Notify( const Sequence& ) +{ + Load(); +} +/* -----------------------------16.01.01 15:36-------------------------------- + + ---------------------------------------------------------------------------*/ +void SvxAsianConfig::Commit() +{ + Sequence aValues(2); + Any* pValues = aValues.getArray(); + pValues[0].setValue(&pImpl->bKerningWesternTextOnly, ::getBooleanCppuType()); + pValues[1] <<= pImpl->nCharDistanceCompression; + PutProperties(lcl_GetPropertyNames(), aValues); + + + OUString sNode(C2U(sStartEndCharacters)); + if(!pImpl->aForbiddenArr.Count()) + ClearNodeSet(sNode); + else + { + Sequence aSetValues(2 * pImpl->aForbiddenArr.Count()); + PropertyValue* pSetValues = aSetValues.getArray(); + sal_Int32 nSetValue = 0; + const OUString sStartChars(C2U(sStartCharacters)); + const OUString sEndChars(C2U(sEndCharacters)); + for(sal_uInt16 i = 0; i < pImpl->aForbiddenArr.Count(); i++) + { + OUString sPrefix(sNode); + sPrefix += C2U("/"); + sPrefix += pImpl->aForbiddenArr[i]->aLocale.Language; + DBG_ASSERT(pImpl->aForbiddenArr[i]->aLocale.Language.getLength(), "illegal language"); + sPrefix += C2U("-"); + sPrefix += pImpl->aForbiddenArr[i]->aLocale.Country; + sPrefix += C2U("/"); + pSetValues[nSetValue].Name = sPrefix; pSetValues[nSetValue].Name += sStartChars; + pSetValues[nSetValue++].Value <<= pImpl->aForbiddenArr[i]->sStartChars; + pSetValues[nSetValue].Name = sPrefix; pSetValues[nSetValue].Name += sEndChars; + pSetValues[nSetValue++].Value <<= pImpl->aForbiddenArr[i]->sEndChars; + } + ReplaceSetProperties(sNode, aSetValues); + } +} +/* -----------------------------16.01.01 15:36-------------------------------- + + ---------------------------------------------------------------------------*/ +sal_Bool SvxAsianConfig::IsKerningWesternTextOnly() const +{ + return pImpl->bKerningWesternTextOnly; +} +/* -----------------------------16.01.01 15:36-------------------------------- + + ---------------------------------------------------------------------------*/ +void SvxAsianConfig::SetKerningWesternTextOnly(sal_Bool bSet) +{ + pImpl->bKerningWesternTextOnly = bSet; + SetModified(); +} +/* -----------------------------16.01.01 15:36-------------------------------- + + ---------------------------------------------------------------------------*/ +sal_Int16 SvxAsianConfig::GetCharDistanceCompression() const +{ + return pImpl->nCharDistanceCompression; +} +/* -----------------------------16.01.01 15:36-------------------------------- + + ---------------------------------------------------------------------------*/ +void SvxAsianConfig::SetCharDistanceCompression(sal_Int16 nSet) +{ + DBG_ASSERT(nSet >= 0 && nSet < 3, "compression value illegal"); + SetModified(); + pImpl->nCharDistanceCompression = nSet; +} +/* -----------------------------16.01.01 15:36-------------------------------- + + ---------------------------------------------------------------------------*/ +uno::Sequence SvxAsianConfig::GetStartEndCharLocales() +{ + Sequence aRet(pImpl->aForbiddenArr.Count()); + Locale* pRet = aRet.getArray(); + for(sal_uInt16 i = 0; i < pImpl->aForbiddenArr.Count(); i++) + { + pRet[i] = pImpl->aForbiddenArr[i]->aLocale; + } + return aRet; +} +/* -----------------------------16.01.01 15:36-------------------------------- + + ---------------------------------------------------------------------------*/ +sal_Bool SvxAsianConfig::GetStartEndChars( const Locale& rLocale, + OUString& rStartChars, + OUString& rEndChars ) +{ + for(sal_uInt16 i = 0; i < pImpl->aForbiddenArr.Count(); i++) + { + if(rLocale.Language == pImpl->aForbiddenArr[i]->aLocale.Language && + rLocale.Country == pImpl->aForbiddenArr[i]->aLocale.Country) + { + rStartChars = pImpl->aForbiddenArr[i]->sStartChars; + rEndChars = pImpl->aForbiddenArr[i]->sEndChars; + return sal_True; + } + } + return sal_False; +} +/* -----------------------------16.01.01 15:36-------------------------------- + + ---------------------------------------------------------------------------*/ +void SvxAsianConfig::SetStartEndChars( const Locale& rLocale, + const OUString* pStartChars, + const OUString* pEndChars ) +{ + sal_Bool bFound = sal_False; + for(sal_uInt16 i = 0; i < pImpl->aForbiddenArr.Count(); i++) + { + if(rLocale.Language == pImpl->aForbiddenArr[i]->aLocale.Language && + rLocale.Country == pImpl->aForbiddenArr[i]->aLocale.Country) + { + if(pStartChars && pEndChars) + { + pImpl->aForbiddenArr[i]->sStartChars = *pStartChars; + pImpl->aForbiddenArr[i]->sEndChars = *pEndChars; + } + else + pImpl->aForbiddenArr.DeleteAndDestroy(i, 1); + bFound = sal_True; + } + } + if(!bFound && pStartChars && pEndChars) + { + SvxForbiddenStruct_ImplPtr pInsert = new SvxForbiddenStruct_Impl; + pInsert->aLocale = rLocale; + pInsert->sStartChars = *pStartChars; + pInsert->sEndChars = *pEndChars; + pImpl->aForbiddenArr.Insert(pInsert, pImpl->aForbiddenArr.Count()); + } +#ifdef DBG_UTIL + else if(!bFound) + DBG_ERROR("attempt to clear unavailable data"); +#endif + SetModified(); +} -- cgit