blob: a85ccfe607bcd35d84321076afd697deca0cbe90 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_svl.hxx"
#include <svl/asiancfg.hxx>
#include <svl/svarray.hxx>
#include <com/sun/star/uno/Any.hxx>
#include <com/sun/star/uno/Sequence.hxx>
#include <com/sun/star/lang/Locale.hpp>
#include <com/sun/star/beans/PropertyValue.hpp>
#include <tools/debug.hxx>
//-----------------------------------------------------------------------------
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<OUString> lcl_GetPropertyNames()
{
Sequence<OUString> 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<Any> 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<OUString> aNodes = GetNodeNames(sPropPrefix);
Sequence<OUString> 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<Any> 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<OUString>& )
{
Load();
}
/* -----------------------------16.01.01 15:36--------------------------------
---------------------------------------------------------------------------*/
void SvxAsianConfig::Commit()
{
Sequence<Any> 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<PropertyValue> 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<lang::Locale> SvxAsianConfig::GetStartEndCharLocales()
{
Sequence<Locale> 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();
}