1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_svl.hxx"
26
27 #include <svl/asiancfg.hxx>
28 #include <svl/svarray.hxx>
29 #include <com/sun/star/uno/Any.hxx>
30 #include <com/sun/star/uno/Sequence.hxx>
31 #include <com/sun/star/lang/Locale.hpp>
32 #include <com/sun/star/beans/PropertyValue.hpp>
33 #include <tools/debug.hxx>
34
35 //-----------------------------------------------------------------------------
36 using namespace utl;
37 using namespace rtl;
38 using namespace com::sun::star;
39 using namespace com::sun::star::uno;
40 using namespace com::sun::star::beans;
41 using namespace com::sun::star::lang;
42
43 #define C2U(cChar) OUString::createFromAscii(cChar)
44 const sal_Char sStartEndCharacters[] = "StartEndCharacters";
45 const sal_Char sStartCharacters[] = "StartCharacters";
46 const sal_Char sEndCharacters[] = "EndCharacters";
47
48 //-----------------------------------------------------------------------------
49 struct SvxForbiddenStruct_Impl
50 {
51 Locale aLocale;
52 OUString sStartChars;
53 OUString sEndChars;
54 };
55 //-----------------------------------------------------------------------------
56 typedef SvxForbiddenStruct_Impl* SvxForbiddenStruct_ImplPtr;
57 SV_DECL_PTRARR_DEL(SvxForbiddenStructArr, SvxForbiddenStruct_ImplPtr, 2, 2)
58 SV_IMPL_PTRARR(SvxForbiddenStructArr, SvxForbiddenStruct_ImplPtr);
59 //-----------------------------------------------------------------------------
60 struct SvxAsianConfig_Impl
61 {
62 sal_Bool bKerningWesternTextOnly;
63 sal_Int16 nCharDistanceCompression;
64
65 SvxForbiddenStructArr aForbiddenArr;
66
SvxAsianConfig_ImplSvxAsianConfig_Impl67 SvxAsianConfig_Impl() :
68 bKerningWesternTextOnly(sal_True),
69 nCharDistanceCompression(0) {}
70 };
71 /* -----------------------------16.01.01 15:36--------------------------------
72
73 ---------------------------------------------------------------------------*/
lcl_GetPropertyNames()74 Sequence<OUString> lcl_GetPropertyNames()
75 {
76 Sequence<OUString> aNames(2);
77 OUString* pNames = aNames.getArray();
78 pNames[0] = C2U("IsKerningWesternTextOnly");
79 pNames[1] = C2U("CompressCharacterDistance");
80 return aNames;;
81 }
82 // ---------------------------------------------------------------------------
SvxAsianConfig(sal_Bool bEnableNotify)83 SvxAsianConfig::SvxAsianConfig(sal_Bool bEnableNotify) :
84 utl::ConfigItem(C2U("Office.Common/AsianLayout")),
85 pImpl(new SvxAsianConfig_Impl)
86 {
87 if(bEnableNotify)
88 EnableNotification(lcl_GetPropertyNames());
89 Load();
90 }
91 /* -----------------------------16.01.01 15:36--------------------------------
92
93 ---------------------------------------------------------------------------*/
~SvxAsianConfig()94 SvxAsianConfig::~SvxAsianConfig()
95 {
96 delete pImpl;
97 }
98 /* -----------------------------17.01.01 09:57--------------------------------
99
100 ---------------------------------------------------------------------------*/
Load()101 void SvxAsianConfig::Load()
102 {
103 Sequence<Any> aValues = GetProperties(lcl_GetPropertyNames());
104 const Any* pValues = aValues.getConstArray();
105 if(pValues[0].hasValue())
106 pImpl->bKerningWesternTextOnly = *(sal_Bool*) pValues[0].getValue();
107 pValues[1] >>= pImpl->nCharDistanceCompression;
108
109 pImpl->aForbiddenArr.DeleteAndDestroy(0, pImpl->aForbiddenArr.Count());
110 OUString sPropPrefix(C2U(sStartEndCharacters));
111 Sequence<OUString> aNodes = GetNodeNames(sPropPrefix);
112
113 Sequence<OUString> aPropNames(aNodes.getLength() * 2);
114 OUString* pNames = aPropNames.getArray();
115 sal_Int32 nName = 0;
116 sPropPrefix += C2U("/");
117 sal_Int32 nNode;
118 const OUString* pNodes = aNodes.getConstArray();
119 for(nNode = 0; nNode < aNodes.getLength(); nNode++)
120 {
121 OUString sStart(sPropPrefix);
122 sStart += pNodes[nNode];
123 sStart += C2U("/");
124 pNames[nName] = sStart; pNames[nName++] += C2U("StartCharacters");
125 pNames[nName] = sStart; pNames[nName++] += C2U("EndCharacters");
126 }
127 Sequence<Any> aNodeValues = GetProperties(aPropNames);
128 const Any* pNodeValues = aNodeValues.getConstArray();
129 nName = 0;
130 for(nNode = 0; nNode < aNodes.getLength(); nNode++)
131 {
132 SvxForbiddenStruct_ImplPtr pInsert = new SvxForbiddenStruct_Impl;
133 pInsert->aLocale.Language = pNodes[nNode].copy(0, 2);
134 DBG_ASSERT(pInsert->aLocale.Language.getLength(), "illegal language");
135 pInsert->aLocale.Country = pNodes[nNode].copy(3, 2);
136
137 pNodeValues[nName++] >>= pInsert->sStartChars;
138 pNodeValues[nName++] >>= pInsert->sEndChars;
139 pImpl->aForbiddenArr.Insert(pInsert, pImpl->aForbiddenArr.Count());
140 }
141 }
142 /* -----------------------------17.01.01 09:57--------------------------------
143
144 ---------------------------------------------------------------------------*/
Notify(const Sequence<OUString> &)145 void SvxAsianConfig::Notify( const Sequence<OUString>& )
146 {
147 Load();
148 }
149 /* -----------------------------16.01.01 15:36--------------------------------
150
151 ---------------------------------------------------------------------------*/
Commit()152 void SvxAsianConfig::Commit()
153 {
154 Sequence<Any> aValues(2);
155 Any* pValues = aValues.getArray();
156 pValues[0].setValue(&pImpl->bKerningWesternTextOnly, ::getBooleanCppuType());
157 pValues[1] <<= pImpl->nCharDistanceCompression;
158 PutProperties(lcl_GetPropertyNames(), aValues);
159
160
161 OUString sNode(C2U(sStartEndCharacters));
162 if(!pImpl->aForbiddenArr.Count())
163 ClearNodeSet(sNode);
164 else
165 {
166 Sequence<PropertyValue> aSetValues(2 * pImpl->aForbiddenArr.Count());
167 PropertyValue* pSetValues = aSetValues.getArray();
168 sal_Int32 nSetValue = 0;
169 const OUString sStartChars(C2U(sStartCharacters));
170 const OUString sEndChars(C2U(sEndCharacters));
171 for(sal_uInt16 i = 0; i < pImpl->aForbiddenArr.Count(); i++)
172 {
173 OUString sPrefix(sNode);
174 sPrefix += C2U("/");
175 sPrefix += pImpl->aForbiddenArr[i]->aLocale.Language;
176 DBG_ASSERT(pImpl->aForbiddenArr[i]->aLocale.Language.getLength(), "illegal language");
177 sPrefix += C2U("-");
178 sPrefix += pImpl->aForbiddenArr[i]->aLocale.Country;
179 sPrefix += C2U("/");
180 pSetValues[nSetValue].Name = sPrefix; pSetValues[nSetValue].Name += sStartChars;
181 pSetValues[nSetValue++].Value <<= pImpl->aForbiddenArr[i]->sStartChars;
182 pSetValues[nSetValue].Name = sPrefix; pSetValues[nSetValue].Name += sEndChars;
183 pSetValues[nSetValue++].Value <<= pImpl->aForbiddenArr[i]->sEndChars;
184 }
185 ReplaceSetProperties(sNode, aSetValues);
186 }
187 }
188 /* -----------------------------16.01.01 15:36--------------------------------
189
190 ---------------------------------------------------------------------------*/
IsKerningWesternTextOnly() const191 sal_Bool SvxAsianConfig::IsKerningWesternTextOnly() const
192 {
193 return pImpl->bKerningWesternTextOnly;
194 }
195 /* -----------------------------16.01.01 15:36--------------------------------
196
197 ---------------------------------------------------------------------------*/
SetKerningWesternTextOnly(sal_Bool bSet)198 void SvxAsianConfig::SetKerningWesternTextOnly(sal_Bool bSet)
199 {
200 pImpl->bKerningWesternTextOnly = bSet;
201 SetModified();
202 }
203 /* -----------------------------16.01.01 15:36--------------------------------
204
205 ---------------------------------------------------------------------------*/
GetCharDistanceCompression() const206 sal_Int16 SvxAsianConfig::GetCharDistanceCompression() const
207 {
208 return pImpl->nCharDistanceCompression;
209 }
210 /* -----------------------------16.01.01 15:36--------------------------------
211
212 ---------------------------------------------------------------------------*/
SetCharDistanceCompression(sal_Int16 nSet)213 void SvxAsianConfig::SetCharDistanceCompression(sal_Int16 nSet)
214 {
215 DBG_ASSERT(nSet >= 0 && nSet < 3, "compression value illegal");
216 SetModified();
217 pImpl->nCharDistanceCompression = nSet;
218 }
219 /* -----------------------------16.01.01 15:36--------------------------------
220
221 ---------------------------------------------------------------------------*/
GetStartEndCharLocales()222 uno::Sequence<lang::Locale> SvxAsianConfig::GetStartEndCharLocales()
223 {
224 Sequence<Locale> aRet(pImpl->aForbiddenArr.Count());
225 Locale* pRet = aRet.getArray();
226 for(sal_uInt16 i = 0; i < pImpl->aForbiddenArr.Count(); i++)
227 {
228 pRet[i] = pImpl->aForbiddenArr[i]->aLocale;
229 }
230 return aRet;
231 }
232 /* -----------------------------16.01.01 15:36--------------------------------
233
234 ---------------------------------------------------------------------------*/
GetStartEndChars(const Locale & rLocale,OUString & rStartChars,OUString & rEndChars)235 sal_Bool SvxAsianConfig::GetStartEndChars( const Locale& rLocale,
236 OUString& rStartChars,
237 OUString& rEndChars )
238 {
239 for(sal_uInt16 i = 0; i < pImpl->aForbiddenArr.Count(); i++)
240 {
241 if(rLocale.Language == pImpl->aForbiddenArr[i]->aLocale.Language &&
242 rLocale.Country == pImpl->aForbiddenArr[i]->aLocale.Country)
243 {
244 rStartChars = pImpl->aForbiddenArr[i]->sStartChars;
245 rEndChars = pImpl->aForbiddenArr[i]->sEndChars;
246 return sal_True;
247 }
248 }
249 return sal_False;
250 }
251 /* -----------------------------16.01.01 15:36--------------------------------
252
253 ---------------------------------------------------------------------------*/
SetStartEndChars(const Locale & rLocale,const OUString * pStartChars,const OUString * pEndChars)254 void SvxAsianConfig::SetStartEndChars( const Locale& rLocale,
255 const OUString* pStartChars,
256 const OUString* pEndChars )
257 {
258 sal_Bool bFound = sal_False;
259 for(sal_uInt16 i = 0; i < pImpl->aForbiddenArr.Count(); i++)
260 {
261 if(rLocale.Language == pImpl->aForbiddenArr[i]->aLocale.Language &&
262 rLocale.Country == pImpl->aForbiddenArr[i]->aLocale.Country)
263 {
264 if(pStartChars && pEndChars)
265 {
266 pImpl->aForbiddenArr[i]->sStartChars = *pStartChars;
267 pImpl->aForbiddenArr[i]->sEndChars = *pEndChars;
268 }
269 else
270 pImpl->aForbiddenArr.DeleteAndDestroy(i, 1);
271 bFound = sal_True;
272 }
273 }
274 if(!bFound && pStartChars && pEndChars)
275 {
276 SvxForbiddenStruct_ImplPtr pInsert = new SvxForbiddenStruct_Impl;
277 pInsert->aLocale = rLocale;
278 pInsert->sStartChars = *pStartChars;
279 pInsert->sEndChars = *pEndChars;
280 pImpl->aForbiddenArr.Insert(pInsert, pImpl->aForbiddenArr.Count());
281 }
282 #ifdef DBG_UTIL
283 else if(!bFound)
284 DBG_ERROR("attempt to clear unavailable data");
285 #endif
286 SetModified();
287 }
288