xref: /aoo41x/main/svl/source/numbers/numfmuno.cxx (revision 40df464e)
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 #ifndef GCC
27 #endif
28 
29 #include <tools/color.hxx>
30 #include <tools/debug.hxx>
31 #include <i18npool/mslangid.hxx>
32 #include <vos/mutex.hxx>
33 #include <rtl/ustring.hxx>
34 
35 #include <com/sun/star/util/Date.hpp>
36 #include <com/sun/star/beans/PropertyAttribute.hpp>
37 
38 #include "numfmuno.hxx"
39 #include <svl/numuno.hxx>
40 #include <svl/zforlist.hxx>
41 #include <svl/zformat.hxx>
42 #include <svl/itemprop.hxx>
43 
44 using namespace com::sun::star;
45 
46 //------------------------------------------------------------------------
47 
48 #define SERVICENAME_NUMBERFORMATTER	"com.sun.star.util.NumberFormatter"
49 #define SERVICENAME_NUMBERSETTINGS	"com.sun.star.util.NumberFormatSettings"
50 #define SERVICENAME_NUMBERFORMATS	"com.sun.star.util.NumberFormats"
51 #define SERVICENAME_NUMBERFORMAT	"com.sun.star.util.NumberFormatProperties"
52 
53 //------------------------------------------------------------------------
54 
55 #define PROPERTYNAME_FMTSTR		"FormatString"
56 #define PROPERTYNAME_LOCALE		"Locale"
57 #define PROPERTYNAME_TYPE		"Type"
58 #define PROPERTYNAME_COMMENT 	"Comment"
59 #define PROPERTYNAME_CURREXT 	"CurrencyExtension"
60 #define PROPERTYNAME_CURRSYM 	"CurrencySymbol"
61 #define PROPERTYNAME_CURRABB 	"CurrencyAbbreviation"
62 #define PROPERTYNAME_DECIMALS	"Decimals"
63 #define PROPERTYNAME_LEADING	"LeadingZeros"
64 #define PROPERTYNAME_NEGRED		"NegativeRed"
65 #define PROPERTYNAME_STDFORM	"StandardFormat"
66 #define PROPERTYNAME_THOUS		"ThousandsSeparator"
67 #define PROPERTYNAME_USERDEF	"UserDefined"
68 
69 #define PROPERTYNAME_NOZERO		"NoZero"
70 #define PROPERTYNAME_NULLDATE	"NullDate"
71 #define PROPERTYNAME_STDDEC		"StandardDecimals"
72 #define PROPERTYNAME_TWODIGIT	"TwoDigitDateStart"
73 
74 //------------------------------------------------------------------------
75 
76 //	alles ohne Which-ID, Map nur fuer PropertySetInfo
77 
lcl_GetNumberFormatPropertyMap()78 const SfxItemPropertyMapEntry* lcl_GetNumberFormatPropertyMap()
79 {
80     static SfxItemPropertyMapEntry aNumberFormatPropertyMap_Impl[] =
81 	{
82 		{MAP_CHAR_LEN(PROPERTYNAME_FMTSTR),	  0, &getCppuType((rtl::OUString*)0),beans::PropertyAttribute::BOUND | beans::PropertyAttribute::READONLY, 0},
83 		{MAP_CHAR_LEN(PROPERTYNAME_LOCALE),	  0, &getCppuType((lang::Locale*)0),beans::PropertyAttribute::BOUND | beans::PropertyAttribute::READONLY, 0},
84 		{MAP_CHAR_LEN(PROPERTYNAME_TYPE),	  0, &getCppuType((sal_Int16*)0),	beans::PropertyAttribute::BOUND | beans::PropertyAttribute::READONLY, 0},
85 		{MAP_CHAR_LEN(PROPERTYNAME_COMMENT),  0, &getCppuType((rtl::OUString*)0),beans::PropertyAttribute::BOUND | beans::PropertyAttribute::READONLY, 0},
86 		{MAP_CHAR_LEN(PROPERTYNAME_CURREXT),  0, &getCppuType((rtl::OUString*)0),beans::PropertyAttribute::BOUND | beans::PropertyAttribute::READONLY, 0},
87 		{MAP_CHAR_LEN(PROPERTYNAME_CURRSYM),  0, &getCppuType((rtl::OUString*)0),beans::PropertyAttribute::BOUND | beans::PropertyAttribute::READONLY, 0},
88 		{MAP_CHAR_LEN(PROPERTYNAME_DECIMALS), 0, &getCppuType((sal_Int16*)0),	beans::PropertyAttribute::BOUND | beans::PropertyAttribute::READONLY, 0},
89 		{MAP_CHAR_LEN(PROPERTYNAME_LEADING),  0, &getCppuType((sal_Int16*)0),	beans::PropertyAttribute::BOUND | beans::PropertyAttribute::READONLY, 0},
90 		{MAP_CHAR_LEN(PROPERTYNAME_NEGRED),	  0, &getBooleanCppuType(),			beans::PropertyAttribute::BOUND | beans::PropertyAttribute::READONLY, 0},
91 		{MAP_CHAR_LEN(PROPERTYNAME_STDFORM),  0, &getBooleanCppuType(),			beans::PropertyAttribute::BOUND | beans::PropertyAttribute::READONLY, 0},
92 		{MAP_CHAR_LEN(PROPERTYNAME_THOUS),	  0, &getBooleanCppuType(),			beans::PropertyAttribute::BOUND | beans::PropertyAttribute::READONLY, 0},
93 		{MAP_CHAR_LEN(PROPERTYNAME_USERDEF),  0, &getBooleanCppuType(),			beans::PropertyAttribute::BOUND | beans::PropertyAttribute::READONLY, 0},
94 		{MAP_CHAR_LEN(PROPERTYNAME_CURRABB),  0, &getCppuType((rtl::OUString*)0),beans::PropertyAttribute::BOUND | beans::PropertyAttribute::READONLY, 0},
95 		{0,0,0,0,0,0}
96 	};
97 	return aNumberFormatPropertyMap_Impl;
98 }
99 
lcl_GetNumberSettingsPropertyMap()100 const SfxItemPropertyMapEntry* lcl_GetNumberSettingsPropertyMap()
101 {
102     static SfxItemPropertyMapEntry aNumberSettingsPropertyMap_Impl[] =
103 	{
104 		{MAP_CHAR_LEN(PROPERTYNAME_NOZERO),	  0, &getBooleanCppuType(),			beans::PropertyAttribute::BOUND, 0},
105 		{MAP_CHAR_LEN(PROPERTYNAME_NULLDATE), 0, &getCppuType((util::Date*)0),	beans::PropertyAttribute::BOUND, 0},
106 		{MAP_CHAR_LEN(PROPERTYNAME_STDDEC),	  0, &getCppuType((sal_Int16*)0),	beans::PropertyAttribute::BOUND, 0},
107 		{MAP_CHAR_LEN(PROPERTYNAME_TWODIGIT), 0, &getCppuType((sal_Int16*)0),	beans::PropertyAttribute::BOUND, 0},
108 		{0,0,0,0,0,0}
109 	};
110 	return aNumberSettingsPropertyMap_Impl;
111 }
112 
113 //----------------------------------------------------------------------------------------
114 
lcl_GetLanguage(const lang::Locale & rLocale)115 LanguageType lcl_GetLanguage( const lang::Locale& rLocale )
116 {
117 	//	empty language -> LANGUAGE_SYSTEM
118 	if ( rLocale.Language.getLength() == 0 )
119 		return LANGUAGE_SYSTEM;
120 
121 	LanguageType eRet = MsLangId::convertLocaleToLanguage( rLocale );
122 	if ( eRet == LANGUAGE_NONE )
123 		eRet = LANGUAGE_SYSTEM;			//! or throw an exception?
124 
125 	return eRet;
126 }
127 
128 //----------------------------------------------------------------------------------------
129 
SvNumberFormatterServiceObj()130 SvNumberFormatterServiceObj::SvNumberFormatterServiceObj()
131     :m_aMutex()
132 {
133 }
134 
~SvNumberFormatterServiceObj()135 SvNumberFormatterServiceObj::~SvNumberFormatterServiceObj()
136 {
137 }
138 
SvNumberFormatterServiceObj_CreateInstance(const::com::sun::star::uno::Reference<::com::sun::star::lang::XMultiServiceFactory> &)139 com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL SvNumberFormatterServiceObj_CreateInstance( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& )
140 {
141 	return ::com::sun::star::uno::Reference < ::com::sun::star::uno::XInterface >( ( ::cppu::OWeakObject* ) new SvNumberFormatterServiceObj );
142 }
143 
144 // XNumberFormatter
145 
attachNumberFormatsSupplier(const uno::Reference<util::XNumberFormatsSupplier> & _xSupplier)146 void SAL_CALL SvNumberFormatterServiceObj::attachNumberFormatsSupplier(
147 							const uno::Reference<util::XNumberFormatsSupplier>& _xSupplier )
148 									throw(uno::RuntimeException)
149 {
150     ::rtl::Reference< SvNumberFormatsSupplierObj > xAutoReleaseOld;
151 
152     // SYNCHRONIZED ->
153     {
154         ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );
155 
156 	    SvNumberFormatsSupplierObj*	pNew = SvNumberFormatsSupplierObj::getImplementation( _xSupplier );
157 	    if (!pNew)
158 		    throw uno::RuntimeException();		// wrong object
159 
160         xAutoReleaseOld = xSupplier;
161 
162         xSupplier = pNew;
163         m_aMutex = xSupplier->getSharedMutex();
164     }
165     // <- SYNCHRONIZED
166 }
167 
168 uno::Reference<util::XNumberFormatsSupplier> SAL_CALL
getNumberFormatsSupplier()169 							SvNumberFormatterServiceObj::getNumberFormatsSupplier()
170 									throw(uno::RuntimeException)
171 {
172     ::osl::MutexGuard aGuard( m_aMutex );
173 	return xSupplier.get();
174 }
175 
detectNumberFormat(sal_Int32 nKey,const rtl::OUString & aString)176 sal_Int32 SAL_CALL SvNumberFormatterServiceObj::detectNumberFormat(
177 									sal_Int32 nKey, const rtl::OUString& aString )
178 							throw(util::NotNumericException, uno::RuntimeException)
179 {
180     ::osl::MutexGuard aGuard( m_aMutex );
181 
182 	sal_Int32 nRet = 0;
183     SvNumberFormatter* pFormatter = xSupplier.is() ? xSupplier->GetNumberFormatter() : NULL;
184 	if (pFormatter)
185 	{
186 		String aTemp = aString;
187 		sal_uInt32 nUKey = nKey;
188 		double fValue = 0.0;
189 		if ( pFormatter->IsNumberFormat(aTemp, nUKey, fValue) )
190 			nRet = nUKey;
191 		else
192 			throw util::NotNumericException();
193 	}
194 	else
195 		throw uno::RuntimeException();
196 
197 	return nRet;
198 }
199 
convertStringToNumber(sal_Int32 nKey,const rtl::OUString & aString)200 double SAL_CALL SvNumberFormatterServiceObj::convertStringToNumber(
201 									sal_Int32 nKey, const rtl::OUString& aString )
202 							throw(util::NotNumericException, uno::RuntimeException)
203 {
204     ::osl::MutexGuard aGuard( m_aMutex );
205 
206 	double fRet = 0.0;
207     SvNumberFormatter* pFormatter = xSupplier.is() ? xSupplier->GetNumberFormatter() : NULL;
208 	if (pFormatter)
209 	{
210 		String aTemp = aString;
211 		sal_uInt32 nUKey = nKey;
212 		double fValue = 0.0;
213 		if ( pFormatter->IsNumberFormat(aTemp, nUKey, fValue) )
214 			fRet = fValue;
215 		else
216 			throw util::NotNumericException();
217 	}
218 	else
219 		throw uno::RuntimeException();
220 
221 	return fRet;
222 }
223 
convertNumberToString(sal_Int32 nKey,double fValue)224 rtl::OUString SAL_CALL SvNumberFormatterServiceObj::convertNumberToString(
225 									sal_Int32 nKey, double fValue ) throw(uno::RuntimeException)
226 {
227     ::osl::MutexGuard aGuard( m_aMutex );
228 
229 	String aRet;
230 	SvNumberFormatter* pFormatter = xSupplier.is() ? xSupplier->GetNumberFormatter() : NULL;
231 	if (pFormatter)
232 	{
233 		Color* pColor = NULL;
234 		pFormatter->GetOutputString(fValue, nKey, aRet, &pColor);
235 	}
236 	else
237 		throw uno::RuntimeException();
238 
239 	return aRet;
240 }
241 
queryColorForNumber(sal_Int32 nKey,double fValue,util::Color aDefaultColor)242 util::Color SAL_CALL SvNumberFormatterServiceObj::queryColorForNumber( sal_Int32 nKey,
243 									double fValue, util::Color aDefaultColor )
244 							throw(uno::RuntimeException)
245 {
246     ::osl::MutexGuard aGuard( m_aMutex );
247 
248 	util::Color nRet = aDefaultColor;		// color = sal_Int32
249     SvNumberFormatter* pFormatter = xSupplier.is() ? xSupplier->GetNumberFormatter() : NULL;
250 	if (pFormatter)
251 	{
252 		String aStr;
253 		Color* pColor = NULL;
254 		pFormatter->GetOutputString(fValue, nKey, aStr, &pColor);
255 		if (pColor)
256 			nRet = pColor->GetColor();
257 		// sonst Default behalten
258 	}
259 	else
260 		throw uno::RuntimeException();
261 
262 	return nRet;
263 }
264 
formatString(sal_Int32 nKey,const rtl::OUString & aString)265 rtl::OUString SAL_CALL SvNumberFormatterServiceObj::formatString( sal_Int32 nKey,
266 									const rtl::OUString& aString ) throw(uno::RuntimeException)
267 {
268     ::osl::MutexGuard aGuard( m_aMutex );
269 
270 	String aRet;
271     SvNumberFormatter* pFormatter = xSupplier.is() ? xSupplier->GetNumberFormatter() : NULL;
272 	if (pFormatter)
273 	{
274 		String aTemp = aString;
275 		Color* pColor = NULL;
276 		pFormatter->GetOutputString(aTemp, nKey, aRet, &pColor);
277 	}
278 	else
279 		throw uno::RuntimeException();
280 
281 	return aRet;
282 }
283 
queryColorForString(sal_Int32 nKey,const rtl::OUString & aString,util::Color aDefaultColor)284 util::Color SAL_CALL SvNumberFormatterServiceObj::queryColorForString( sal_Int32 nKey,
285 									const rtl::OUString& aString,util::Color aDefaultColor )
286 							throw(uno::RuntimeException)
287 {
288     ::osl::MutexGuard aGuard( m_aMutex );
289 
290 	util::Color nRet = aDefaultColor;		// color = sal_Int32
291     SvNumberFormatter* pFormatter = xSupplier.is() ? xSupplier->GetNumberFormatter() : NULL;
292 	if (pFormatter)
293 	{
294 		String aTemp = aString;
295 		String aStr;
296 		Color* pColor = NULL;
297 		pFormatter->GetOutputString(aTemp, nKey, aStr, &pColor);
298 		if (pColor)
299 			nRet = pColor->GetColor();
300 		// sonst Default behalten
301 	}
302 	else
303 		throw uno::RuntimeException();
304 
305 	return nRet;
306 }
307 
getInputString(sal_Int32 nKey,double fValue)308 rtl::OUString SAL_CALL SvNumberFormatterServiceObj::getInputString( sal_Int32 nKey, double fValue )
309 							throw(uno::RuntimeException)
310 {
311     ::osl::MutexGuard aGuard( m_aMutex );
312 
313 	String aRet;
314     SvNumberFormatter* pFormatter = xSupplier.is() ? xSupplier->GetNumberFormatter() : NULL;
315 	if (pFormatter)
316 		pFormatter->GetInputLineString(fValue, nKey, aRet);
317 	else
318 		throw uno::RuntimeException();
319 
320 	return aRet;
321 }
322 
323 // XNumberFormatPreviewer
324 
convertNumberToPreviewString(const rtl::OUString & aFormat,double fValue,const lang::Locale & nLocale,sal_Bool bAllowEnglish)325 rtl::OUString SAL_CALL SvNumberFormatterServiceObj::convertNumberToPreviewString(
326 									const rtl::OUString& aFormat, double fValue,
327 									const lang::Locale& nLocale, sal_Bool bAllowEnglish )
328 							throw(util::MalformedNumberFormatException, uno::RuntimeException)
329 {
330     ::osl::MutexGuard aGuard( m_aMutex );
331 
332 	String aRet;
333     SvNumberFormatter* pFormatter = xSupplier.is() ? xSupplier->GetNumberFormatter() : NULL;
334 	if (pFormatter)
335 	{
336 		String aOutString;
337 		String aFormString = aFormat;
338 		LanguageType eLang = lcl_GetLanguage( nLocale );
339 		Color* pColor = NULL;
340 
341 		sal_Bool bOk;
342 		if ( bAllowEnglish )
343 			bOk = pFormatter->GetPreviewStringGuess(
344 								aFormString, fValue, aOutString, &pColor, eLang );
345 		else
346 			bOk = pFormatter->GetPreviewString(
347 								aFormString, fValue, aOutString, &pColor, eLang );
348 
349 		if (bOk)
350 			aRet = aOutString;
351 		else
352 			throw util::MalformedNumberFormatException();
353 	}
354 	else
355 		throw uno::RuntimeException();
356 
357 	return aRet;
358 }
359 
queryPreviewColorForNumber(const rtl::OUString & aFormat,double fValue,const lang::Locale & nLocale,sal_Bool bAllowEnglish,util::Color aDefaultColor)360 util::Color SAL_CALL SvNumberFormatterServiceObj::queryPreviewColorForNumber(
361 									const rtl::OUString& aFormat, double fValue,
362 									const lang::Locale& nLocale, sal_Bool bAllowEnglish,
363 									util::Color aDefaultColor )
364 							throw(util::MalformedNumberFormatException, uno::RuntimeException)
365 {
366     ::osl::MutexGuard aGuard( m_aMutex );
367 
368 	util::Color nRet = aDefaultColor;		// color = sal_Int32
369     SvNumberFormatter* pFormatter = xSupplier.is() ? xSupplier->GetNumberFormatter() : NULL;
370 	if (pFormatter)
371 	{
372 		String aOutString;
373 		String aFormString = aFormat;
374 		LanguageType eLang = lcl_GetLanguage( nLocale );
375 		Color* pColor = NULL;
376 
377 		sal_Bool bOk;
378 		if ( bAllowEnglish )
379 			bOk = pFormatter->GetPreviewStringGuess(
380 								aFormString, fValue, aOutString, &pColor, eLang );
381 		else
382 			bOk = pFormatter->GetPreviewString(
383 								aFormString, fValue, aOutString, &pColor, eLang );
384 
385 		if (bOk)
386 		{
387 			if (pColor)
388 				nRet = pColor->GetColor();
389 			// sonst Default behalten
390 		}
391 		else
392 			throw util::MalformedNumberFormatException();
393 	}
394 	else
395 		throw uno::RuntimeException();
396 
397 	return nRet;
398 }
399 
400 // XServiceInfo
401 
getImplementationName()402 rtl::OUString SAL_CALL SvNumberFormatterServiceObj::getImplementationName()
403 							throw(uno::RuntimeException)
404 {
405 	return rtl::OUString::createFromAscii("com.sun.star.uno.util.numbers.SvNumberFormatterServiceObject");
406 }
407 
supportsService(const rtl::OUString & ServiceName)408 sal_Bool SAL_CALL SvNumberFormatterServiceObj::supportsService( const rtl::OUString& ServiceName )
409 							throw(uno::RuntimeException)
410 {
411 	return ( ServiceName.compareToAscii(SERVICENAME_NUMBERFORMATTER) == 0 );
412 }
413 
getSupportedServiceNames()414 uno::Sequence<rtl::OUString> SAL_CALL SvNumberFormatterServiceObj::getSupportedServiceNames()
415 							throw(uno::RuntimeException)
416 {
417 	uno::Sequence<rtl::OUString> aRet(1);
418 	rtl::OUString* pArray = aRet.getArray();
419 	pArray[0] = rtl::OUString::createFromAscii(SERVICENAME_NUMBERFORMATTER);
420 	return aRet;
421 }
422 
423 //------------------------------------------------------------------------
424 
SvNumberFormatsObj(SvNumberFormatsSupplierObj & _rParent,::comphelper::SharedMutex & _rMutex)425 SvNumberFormatsObj::SvNumberFormatsObj( SvNumberFormatsSupplierObj& _rParent, ::comphelper::SharedMutex& _rMutex )
426     :rSupplier( _rParent )
427     ,m_aMutex( _rMutex )
428 {
429 	rSupplier.acquire();
430 }
431 
~SvNumberFormatsObj()432 SvNumberFormatsObj::~SvNumberFormatsObj()
433 {
434 	rSupplier.release();
435 }
436 
437 // XNumberFormats
438 
getByKey(sal_Int32 nKey)439 uno::Reference<beans::XPropertySet> SAL_CALL SvNumberFormatsObj::getByKey( sal_Int32 nKey )
440 							throw(uno::RuntimeException)
441 {
442     ::osl::MutexGuard aGuard( m_aMutex );
443 
444 	SvNumberFormatter* pFormatter = rSupplier.GetNumberFormatter();
445 	const SvNumberformat* pFormat = pFormatter ? pFormatter->GetEntry(nKey) : NULL;
446 	if (pFormat)
447 		return new SvNumberFormatObj( rSupplier, nKey, m_aMutex );
448 	else
449 		throw uno::RuntimeException();
450 }
451 
queryKeys(sal_Int16 nType,const lang::Locale & nLocale,sal_Bool bCreate)452 uno::Sequence<sal_Int32> SAL_CALL SvNumberFormatsObj::queryKeys( sal_Int16 nType,
453 									const lang::Locale& nLocale, sal_Bool bCreate )
454 							throw(uno::RuntimeException)
455 {
456     ::osl::MutexGuard aGuard( m_aMutex );
457 
458 	SvNumberFormatter* pFormatter = rSupplier.GetNumberFormatter();
459 	if ( pFormatter )
460 	{
461 		sal_uInt32 nIndex = 0;
462 		LanguageType eLang = lcl_GetLanguage( nLocale );
463 		SvNumberFormatTable& rTable = bCreate ?
464 										pFormatter->ChangeCL( nType, nIndex, eLang ) :
465 										pFormatter->GetEntryTable( nType, nIndex, eLang );
466 		sal_uInt32 nCount = rTable.Count();
467 		uno::Sequence<sal_Int32> aSeq(nCount);
468 		sal_Int32* pAry = aSeq.getArray();
469 		for (sal_uInt32 i=0; i<nCount; i++)
470 			pAry[i] = rTable.GetObjectKey( i );
471 
472 		return aSeq;
473 	}
474 	else
475 		throw uno::RuntimeException();
476 }
477 
queryKey(const rtl::OUString & aFormat,const lang::Locale & nLocale,sal_Bool bScan)478 sal_Int32 SAL_CALL SvNumberFormatsObj::queryKey( const rtl::OUString& aFormat,
479 									const lang::Locale& nLocale, sal_Bool bScan )
480 							throw(uno::RuntimeException)
481 {
482     ::osl::MutexGuard aGuard( m_aMutex );
483 
484 	sal_Int32 nRet = 0;
485 	SvNumberFormatter* pFormatter = rSupplier.GetNumberFormatter();
486 	if (pFormatter)
487 	{
488 		String aFormStr = aFormat;
489 		LanguageType eLang = lcl_GetLanguage( nLocale );
490 		if (bScan)
491 		{
492 			//!	irgendwas muss hier noch passieren...
493 		}
494 		nRet = pFormatter->GetEntryKey( aFormat, eLang );
495 	}
496 	else
497 		throw uno::RuntimeException();
498 
499 	return nRet;
500 }
501 
addNew(const rtl::OUString & aFormat,const lang::Locale & nLocale)502 sal_Int32 SAL_CALL SvNumberFormatsObj::addNew( const rtl::OUString& aFormat,
503 									const lang::Locale& nLocale )
504 							throw(util::MalformedNumberFormatException, uno::RuntimeException)
505 {
506     ::osl::MutexGuard aGuard( m_aMutex );
507 
508 	sal_Int32 nRet = 0;
509 	SvNumberFormatter* pFormatter = rSupplier.GetNumberFormatter();
510 	if (pFormatter)
511 	{
512 		String aFormStr = aFormat;
513 		LanguageType eLang = lcl_GetLanguage( nLocale );
514 		sal_uInt32 nKey = 0;
515 		xub_StrLen nCheckPos = 0;
516 		short nType = 0;
517 		sal_Bool bOk = pFormatter->PutEntry( aFormStr, nCheckPos, nType, nKey, eLang );
518 		if (bOk)
519 			nRet = nKey;
520 		else if (nCheckPos)
521 		{
522 			throw util::MalformedNumberFormatException();		// ungueltiges Format
523 		}
524 		else
525 			throw uno::RuntimeException();						// anderer Fehler (z.B. schon vorhanden)
526 	}
527 	else
528 		throw uno::RuntimeException();
529 
530 	return nRet;
531 }
532 
addNewConverted(const rtl::OUString & aFormat,const lang::Locale & nLocale,const lang::Locale & nNewLocale)533 sal_Int32 SAL_CALL SvNumberFormatsObj::addNewConverted( const rtl::OUString& aFormat,
534 									const lang::Locale& nLocale, const lang::Locale& nNewLocale )
535 							throw(util::MalformedNumberFormatException, uno::RuntimeException)
536 {
537     ::osl::MutexGuard aGuard( m_aMutex );
538 
539 	sal_Int32 nRet = 0;
540 	SvNumberFormatter* pFormatter = rSupplier.GetNumberFormatter();
541 	if (pFormatter)
542 	{
543 		String aFormStr = aFormat;
544 		LanguageType eLang = lcl_GetLanguage( nLocale );
545 		LanguageType eNewLang = lcl_GetLanguage( nNewLocale );
546 		sal_uInt32 nKey = 0;
547 		xub_StrLen nCheckPos = 0;
548 		short nType = 0;
549 		sal_Bool bOk = pFormatter->PutandConvertEntry( aFormStr, nCheckPos, nType, nKey, eLang, eNewLang );
550         if (bOk || nKey > 0)
551 			nRet = nKey;
552 		else if (nCheckPos)
553 		{
554 			throw util::MalformedNumberFormatException();		// ungueltiges Format
555 		}
556 		else
557 			throw uno::RuntimeException();						// anderer Fehler (z.B. schon vorhanden)
558 	}
559 	else
560 		throw uno::RuntimeException();
561 
562 	return nRet;
563 }
564 
removeByKey(sal_Int32 nKey)565 void SAL_CALL SvNumberFormatsObj::removeByKey( sal_Int32 nKey ) throw(uno::RuntimeException)
566 {
567     ::osl::MutexGuard aGuard( m_aMutex );
568 	SvNumberFormatter* pFormatter = rSupplier.GetNumberFormatter();
569 
570 	if (pFormatter)
571 	{
572 		pFormatter->DeleteEntry(nKey);
573 		rSupplier.NumberFormatDeleted(nKey);		// Benachrichtigung fuers Dokument
574 	}
575 }
576 
generateFormat(sal_Int32 nBaseKey,const lang::Locale & nLocale,sal_Bool bThousands,sal_Bool bRed,sal_Int16 nDecimals,sal_Int16 nLeading)577 rtl::OUString SAL_CALL SvNumberFormatsObj::generateFormat( sal_Int32 nBaseKey,
578 									const lang::Locale& nLocale, sal_Bool bThousands,
579 									sal_Bool bRed, sal_Int16 nDecimals, sal_Int16 nLeading )
580 							throw(uno::RuntimeException)
581 {
582     ::osl::MutexGuard aGuard( m_aMutex );
583 
584 	String aRet;
585 	SvNumberFormatter* pFormatter = rSupplier.GetNumberFormatter();
586 	if (pFormatter)
587 	{
588 		LanguageType eLang = lcl_GetLanguage( nLocale );
589 		pFormatter->GenerateFormat( aRet, nBaseKey, eLang, bThousands, bRed, nDecimals, nLeading );
590 	}
591 	else
592 		throw uno::RuntimeException();
593 
594 	return aRet;
595 }
596 
597 // XNumberFormatTypes
598 
getStandardIndex(const lang::Locale & nLocale)599 sal_Int32 SAL_CALL SvNumberFormatsObj::getStandardIndex( const lang::Locale& nLocale )
600 							throw(uno::RuntimeException)
601 {
602     ::osl::MutexGuard aGuard( m_aMutex );
603 
604 	sal_Int32 nRet = 0;
605 	SvNumberFormatter* pFormatter = rSupplier.GetNumberFormatter();
606 	if (pFormatter)
607 	{
608 		LanguageType eLang = lcl_GetLanguage( nLocale );
609 		nRet = pFormatter->GetStandardIndex(eLang);
610 	}
611 	else
612 		throw uno::RuntimeException();
613 
614 	return nRet;
615 }
616 
getStandardFormat(sal_Int16 nType,const lang::Locale & nLocale)617 sal_Int32 SAL_CALL SvNumberFormatsObj::getStandardFormat( sal_Int16 nType, const lang::Locale& nLocale )
618 							throw(uno::RuntimeException)
619 {
620     ::osl::MutexGuard aGuard( m_aMutex );
621 
622 	sal_Int32 nRet = 0;
623 	SvNumberFormatter* pFormatter = rSupplier.GetNumberFormatter();
624 	if (pFormatter)
625 	{
626 		LanguageType eLang = lcl_GetLanguage( nLocale );
627 		//	mask out "defined" bit, so type from an existing number format
628 		//	can directly be used for getStandardFormat
629 		nType &= ~NUMBERFORMAT_DEFINED;
630 		nRet = pFormatter->GetStandardFormat(nType, eLang);
631 	}
632 	else
633 		throw uno::RuntimeException();
634 
635 	return nRet;
636 }
637 
getFormatIndex(sal_Int16 nIndex,const lang::Locale & nLocale)638 sal_Int32 SAL_CALL SvNumberFormatsObj::getFormatIndex( sal_Int16 nIndex, const lang::Locale& nLocale )
639 							throw(uno::RuntimeException)
640 {
641     ::osl::MutexGuard aGuard( m_aMutex );
642 
643 	sal_Int32 nRet = 0;
644 	SvNumberFormatter* pFormatter = rSupplier.GetNumberFormatter();
645 	if (pFormatter)
646 	{
647 		LanguageType eLang = lcl_GetLanguage( nLocale );
648 		nRet = pFormatter->GetFormatIndex( (NfIndexTableOffset)nIndex, eLang );
649 	}
650 	else
651 		throw uno::RuntimeException();
652 
653 	return nRet;
654 }
655 
isTypeCompatible(sal_Int16 nOldType,sal_Int16 nNewType)656 sal_Bool SAL_CALL SvNumberFormatsObj::isTypeCompatible( sal_Int16 nOldType, sal_Int16 nNewType )
657 							throw(uno::RuntimeException)
658 {
659     ::osl::MutexGuard aGuard( m_aMutex );
660 
661 	sal_Bool bRet = sal_False;
662 	SvNumberFormatter* pFormatter = rSupplier.GetNumberFormatter();
663 	if (pFormatter)
664 		bRet = pFormatter->IsCompatible( nOldType, nNewType );
665 	else
666 		throw uno::RuntimeException();
667 
668 	return bRet;
669 }
670 
getFormatForLocale(sal_Int32 nKey,const lang::Locale & nLocale)671 sal_Int32 SAL_CALL SvNumberFormatsObj::getFormatForLocale( sal_Int32 nKey, const lang::Locale& nLocale )
672 							throw(uno::RuntimeException)
673 {
674     ::osl::MutexGuard aGuard( m_aMutex );
675 
676 	sal_Int32 nRet = 0;
677 	SvNumberFormatter* pFormatter = rSupplier.GetNumberFormatter();
678 	if (pFormatter)
679 	{
680 		LanguageType eLang = lcl_GetLanguage( nLocale );
681 		nRet = pFormatter->GetFormatForLanguageIfBuiltIn(nKey, eLang);
682 	}
683 	else
684 		throw uno::RuntimeException();
685 
686 	return nRet;
687 }
688 
689 // XServiceInfo
690 
getImplementationName()691 rtl::OUString SAL_CALL SvNumberFormatsObj::getImplementationName()
692 							throw(uno::RuntimeException)
693 {
694 	return rtl::OUString::createFromAscii("SvNumberFormatsObj");
695 }
696 
supportsService(const rtl::OUString & ServiceName)697 sal_Bool SAL_CALL SvNumberFormatsObj::supportsService( const rtl::OUString& ServiceName )
698 							throw(uno::RuntimeException)
699 {
700 	return ( ServiceName.compareToAscii(SERVICENAME_NUMBERFORMATS) == 0 );
701 }
702 
getSupportedServiceNames()703 uno::Sequence<rtl::OUString> SAL_CALL SvNumberFormatsObj::getSupportedServiceNames()
704 							throw(uno::RuntimeException)
705 {
706 	uno::Sequence<rtl::OUString> aRet(1);
707 	rtl::OUString* pArray = aRet.getArray();
708 	pArray[0] = rtl::OUString::createFromAscii(SERVICENAME_NUMBERFORMATS);
709 	return aRet;
710 }
711 
712 //------------------------------------------------------------------------
713 
SvNumberFormatObj(SvNumberFormatsSupplierObj & rParent,sal_uLong nK,const::comphelper::SharedMutex & _rMutex)714 SvNumberFormatObj::SvNumberFormatObj( SvNumberFormatsSupplierObj& rParent, sal_uLong nK, const ::comphelper::SharedMutex& _rMutex )
715     :rSupplier( rParent )
716 	,nKey( nK )
717     ,m_aMutex( _rMutex )
718 {
719 	rSupplier.acquire();
720 }
721 
~SvNumberFormatObj()722 SvNumberFormatObj::~SvNumberFormatObj()
723 {
724 	rSupplier.release();
725 }
726 
727 // XPropertySet
728 
getPropertySetInfo()729 uno::Reference<beans::XPropertySetInfo> SAL_CALL SvNumberFormatObj::getPropertySetInfo()
730 							throw(uno::RuntimeException)
731 {
732     ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );
733 	static uno::Reference<beans::XPropertySetInfo> aRef =
734 		new SfxItemPropertySetInfo( lcl_GetNumberFormatPropertyMap() );
735 	return aRef;
736 }
737 
setPropertyValue(const rtl::OUString &,const uno::Any &)738 void SAL_CALL SvNumberFormatObj::setPropertyValue( const rtl::OUString&,
739 												   const uno::Any& )
740 				throw(beans::UnknownPropertyException, beans::PropertyVetoException,
741 						lang::IllegalArgumentException, lang::WrappedTargetException,
742 						uno::RuntimeException)
743 {
744 	throw beans::UnknownPropertyException();	//	everything is read-only
745 }
746 
getPropertyValue(const rtl::OUString & aPropertyName)747 uno::Any SAL_CALL SvNumberFormatObj::getPropertyValue( const rtl::OUString& aPropertyName )
748 				throw(beans::UnknownPropertyException, lang::WrappedTargetException,
749 						uno::RuntimeException)
750 {
751     ::osl::MutexGuard aGuard( m_aMutex );
752 
753 	uno::Any aRet;
754 	SvNumberFormatter* pFormatter = rSupplier.GetNumberFormatter();
755 	const SvNumberformat* pFormat = pFormatter ? pFormatter->GetEntry(nKey) : NULL;
756 	if (pFormat)
757 	{
758 		sal_Bool bThousand, bRed;
759 		sal_uInt16 nDecimals, nLeading;
760 
761 		String aString = aPropertyName;
762 		if (aString.EqualsAscii( PROPERTYNAME_FMTSTR ))
763 		{
764 			aRet <<= rtl::OUString( pFormat->GetFormatstring() );
765 		}
766 		else if (aString.EqualsAscii( PROPERTYNAME_LOCALE ))
767 		{
768 			lang::Locale aLocale( MsLangId::convertLanguageToLocale(
769                         	pFormat->GetLanguage()));
770 			aRet <<= aLocale;
771 		}
772 		else if (aString.EqualsAscii( PROPERTYNAME_TYPE ))
773 		{
774 			aRet <<= (sal_Int16)( pFormat->GetType() );
775 		}
776 		else if (aString.EqualsAscii( PROPERTYNAME_COMMENT ))
777 		{
778 			aRet <<= rtl::OUString( pFormat->GetComment() );
779 		}
780 		else if (aString.EqualsAscii( PROPERTYNAME_STDFORM ))
781 		{
782 			//!	SvNumberformat Member bStandard rausreichen?
783 			sal_Bool bStandard = ( ( nKey % SV_COUNTRY_LANGUAGE_OFFSET ) == 0 );
784 			aRet.setValue( &bStandard, getBooleanCppuType() );
785 		}
786 		else if (aString.EqualsAscii( PROPERTYNAME_USERDEF ))
787 		{
788 			sal_Bool bUserDef = ( ( pFormat->GetType() & NUMBERFORMAT_DEFINED ) != 0 );
789 			aRet.setValue( &bUserDef, getBooleanCppuType() );
790 		}
791 		else if (aString.EqualsAscii( PROPERTYNAME_DECIMALS ))
792 		{
793 			pFormat->GetFormatSpecialInfo( bThousand, bRed, nDecimals, nLeading );
794 			aRet <<= (sal_Int16)( nDecimals );
795 		}
796 		else if (aString.EqualsAscii( PROPERTYNAME_LEADING ))
797 		{
798 			pFormat->GetFormatSpecialInfo( bThousand, bRed, nDecimals, nLeading );
799 			aRet <<= (sal_Int16)( nLeading );
800 		}
801 		else if (aString.EqualsAscii( PROPERTYNAME_NEGRED ))
802 		{
803 			pFormat->GetFormatSpecialInfo( bThousand, bRed, nDecimals, nLeading );
804 			aRet.setValue( &bRed, getBooleanCppuType() );
805 		}
806 		else if (aString.EqualsAscii( PROPERTYNAME_THOUS ))
807 		{
808 			pFormat->GetFormatSpecialInfo( bThousand, bRed, nDecimals, nLeading );
809 			aRet.setValue( &bThousand, getBooleanCppuType() );
810 		}
811 		else if (aString.EqualsAscii( PROPERTYNAME_CURRSYM ))
812 		{
813 			String aSymbol, aExt;
814 			pFormat->GetNewCurrencySymbol( aSymbol, aExt );
815 			aRet <<= rtl::OUString( aSymbol );
816 		}
817 		else if (aString.EqualsAscii( PROPERTYNAME_CURREXT ))
818 		{
819 			String aSymbol, aExt;
820 			pFormat->GetNewCurrencySymbol( aSymbol, aExt );
821 			aRet <<= rtl::OUString( aExt );
822 		}
823 		else if (aString.EqualsAscii( PROPERTYNAME_CURRABB ))
824 		{
825 			String aSymbol, aExt;
826 			sal_Bool bBank = sal_False;
827 			pFormat->GetNewCurrencySymbol( aSymbol, aExt );
828 			const NfCurrencyEntry* pCurr = pFormatter->GetCurrencyEntry( bBank,
829 				aSymbol, aExt, pFormat->GetLanguage() );
830 			if ( pCurr )
831 				aRet <<= rtl::OUString( pCurr->GetBankSymbol() );
832 			else
833 				aRet <<= rtl::OUString();
834 		}
835 		else
836 			throw beans::UnknownPropertyException();
837 	}
838 	else
839 		throw uno::RuntimeException();
840 
841 	return aRet;
842 }
843 
addPropertyChangeListener(const rtl::OUString &,const uno::Reference<beans::XPropertyChangeListener> &)844 void SAL_CALL SvNumberFormatObj::addPropertyChangeListener( const rtl::OUString&,
845 						const uno::Reference<beans::XPropertyChangeListener>&)
846 						throw(beans::UnknownPropertyException,
847 						lang::WrappedTargetException, uno::RuntimeException)
848 {
849 	DBG_ERROR("not implemented");
850 }
851 
removePropertyChangeListener(const rtl::OUString &,const uno::Reference<beans::XPropertyChangeListener> &)852 void SAL_CALL SvNumberFormatObj::removePropertyChangeListener( const rtl::OUString&,
853 						const uno::Reference<beans::XPropertyChangeListener>&)
854 						throw(beans::UnknownPropertyException,
855 						lang::WrappedTargetException, uno::RuntimeException)
856 {
857 	DBG_ERROR("not implemented");
858 }
859 
addVetoableChangeListener(const rtl::OUString &,const uno::Reference<beans::XVetoableChangeListener> &)860 void SAL_CALL SvNumberFormatObj::addVetoableChangeListener( const rtl::OUString&,
861 						const uno::Reference<beans::XVetoableChangeListener>&)
862 						throw(beans::UnknownPropertyException,
863 						lang::WrappedTargetException, uno::RuntimeException)
864 {
865 	DBG_ERROR("not implemented");
866 }
867 
removeVetoableChangeListener(const rtl::OUString &,const uno::Reference<beans::XVetoableChangeListener> &)868 void SAL_CALL SvNumberFormatObj::removeVetoableChangeListener( const rtl::OUString&,
869 						const uno::Reference<beans::XVetoableChangeListener>&)
870 						throw(beans::UnknownPropertyException,
871 						lang::WrappedTargetException, uno::RuntimeException)
872 {
873 	DBG_ERROR("not implemented");
874 }
875 
876 // XPropertyAccess
877 
getPropertyValues()878 uno::Sequence<beans::PropertyValue> SAL_CALL SvNumberFormatObj::getPropertyValues()
879 							throw(uno::RuntimeException)
880 {
881     ::osl::MutexGuard aGuard( m_aMutex );
882 
883 	SvNumberFormatter* pFormatter = rSupplier.GetNumberFormatter();
884 	const SvNumberformat* pFormat = pFormatter ? pFormatter->GetEntry(nKey) : NULL;
885 	if (pFormat)
886 	{
887 		String aSymbol, aExt, aAbb;
888 		sal_Bool bBank = sal_False;
889 		pFormat->GetNewCurrencySymbol( aSymbol, aExt );
890 		const NfCurrencyEntry* pCurr = pFormatter->GetCurrencyEntry( bBank,
891 			aSymbol, aExt, pFormat->GetLanguage() );
892 		if ( pCurr )
893 			aAbb = pCurr->GetBankSymbol();
894 
895 		String aFmtStr = pFormat->GetFormatstring();
896 		String aComment = pFormat->GetComment();
897 		sal_Bool bStandard = ( ( nKey % SV_COUNTRY_LANGUAGE_OFFSET ) == 0 );
898 		//!	SvNumberformat Member bStandard rausreichen?
899 		sal_Bool bUserDef = ( ( pFormat->GetType() & NUMBERFORMAT_DEFINED ) != 0 );
900 		sal_Bool bThousand, bRed;
901 		sal_uInt16 nDecimals, nLeading;
902 		pFormat->GetFormatSpecialInfo( bThousand, bRed, nDecimals, nLeading );
903 		lang::Locale aLocale( MsLangId::convertLanguageToLocale(
904                     pFormat->GetLanguage()));
905 
906 		uno::Sequence<beans::PropertyValue> aSeq(13);
907 		beans::PropertyValue* pArray = aSeq.getArray();
908 
909 		pArray[0].Name = rtl::OUString::createFromAscii( PROPERTYNAME_FMTSTR );
910 		pArray[0].Value <<= rtl::OUString( aFmtStr );
911 		pArray[1].Name = rtl::OUString::createFromAscii( PROPERTYNAME_LOCALE );
912 		pArray[1].Value <<= aLocale;
913 		pArray[2].Name = rtl::OUString::createFromAscii( PROPERTYNAME_TYPE );
914 		pArray[2].Value <<= (sal_Int16)( pFormat->GetType() );
915 		pArray[3].Name = rtl::OUString::createFromAscii( PROPERTYNAME_COMMENT );
916 		pArray[3].Value <<= rtl::OUString( aComment );
917 		pArray[4].Name = rtl::OUString::createFromAscii( PROPERTYNAME_STDFORM );
918 		pArray[4].Value.setValue( &bStandard, getBooleanCppuType() );
919 		pArray[5].Name = rtl::OUString::createFromAscii( PROPERTYNAME_USERDEF );
920 		pArray[5].Value.setValue( &bUserDef, getBooleanCppuType() );
921 		pArray[6].Name = rtl::OUString::createFromAscii( PROPERTYNAME_DECIMALS );
922 		pArray[6].Value <<= (sal_Int16)( nDecimals );
923 		pArray[7].Name = rtl::OUString::createFromAscii( PROPERTYNAME_LEADING );
924 		pArray[7].Value <<= (sal_Int16)( nLeading );
925 		pArray[8].Name = rtl::OUString::createFromAscii( PROPERTYNAME_NEGRED );
926 		pArray[8].Value.setValue( &bRed, getBooleanCppuType() );
927 		pArray[9].Name = rtl::OUString::createFromAscii( PROPERTYNAME_THOUS );
928 		pArray[9].Value.setValue( &bThousand, getBooleanCppuType() );
929 		pArray[10].Name = rtl::OUString::createFromAscii( PROPERTYNAME_CURRSYM );
930 		pArray[10].Value <<= rtl::OUString( aSymbol );
931 		pArray[11].Name = rtl::OUString::createFromAscii( PROPERTYNAME_CURREXT );
932 		pArray[11].Value <<= rtl::OUString( aExt );
933 		pArray[12].Name = rtl::OUString::createFromAscii( PROPERTYNAME_CURRABB );
934 		pArray[12].Value <<= rtl::OUString( aAbb );
935 
936 		return aSeq;
937 	}
938 	else
939 		throw uno::RuntimeException();
940 }
941 
setPropertyValues(const uno::Sequence<beans::PropertyValue> &)942 void SAL_CALL SvNumberFormatObj::setPropertyValues( const uno::Sequence<beans::PropertyValue>& )
943 						throw(beans::UnknownPropertyException, beans::PropertyVetoException,
944 								lang::IllegalArgumentException, lang::WrappedTargetException,
945 								uno::RuntimeException)
946 {
947 	throw beans::UnknownPropertyException();	//	everything is read-only
948 }
949 
950 // XServiceInfo
951 
getImplementationName()952 rtl::OUString SAL_CALL SvNumberFormatObj::getImplementationName()
953 							throw(uno::RuntimeException)
954 {
955 	return rtl::OUString::createFromAscii("SvNumberFormatObj");
956 }
957 
supportsService(const rtl::OUString & ServiceName)958 sal_Bool SAL_CALL SvNumberFormatObj::supportsService( const rtl::OUString& ServiceName )
959 							throw(uno::RuntimeException)
960 {
961 	return ( ServiceName.compareToAscii(SERVICENAME_NUMBERFORMAT) == 0 );
962 }
963 
getSupportedServiceNames()964 uno::Sequence<rtl::OUString> SAL_CALL SvNumberFormatObj::getSupportedServiceNames()
965 							throw(uno::RuntimeException)
966 {
967 	uno::Sequence<rtl::OUString> aRet(1);
968 	rtl::OUString* pArray = aRet.getArray();
969 	pArray[0] = rtl::OUString::createFromAscii(SERVICENAME_NUMBERFORMAT);
970 	return aRet;
971 }
972 
973 //------------------------------------------------------------------------
974 
SvNumberFormatSettingsObj(SvNumberFormatsSupplierObj & rParent,const::comphelper::SharedMutex & _rMutex)975 SvNumberFormatSettingsObj::SvNumberFormatSettingsObj( SvNumberFormatsSupplierObj& rParent, const ::comphelper::SharedMutex& _rMutex )
976     :rSupplier( rParent )
977     ,m_aMutex( _rMutex )
978 {
979 	rSupplier.acquire();
980 }
981 
~SvNumberFormatSettingsObj()982 SvNumberFormatSettingsObj::~SvNumberFormatSettingsObj()
983 {
984 	rSupplier.release();
985 }
986 
987 // XPropertySet
988 
getPropertySetInfo()989 uno::Reference<beans::XPropertySetInfo> SAL_CALL SvNumberFormatSettingsObj::getPropertySetInfo()
990 							throw(uno::RuntimeException)
991 {
992     ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );
993 	static uno::Reference<beans::XPropertySetInfo> aRef =
994 		new SfxItemPropertySetInfo( lcl_GetNumberSettingsPropertyMap() );
995 	return aRef;
996 }
997 
setPropertyValue(const rtl::OUString & aPropertyName,const uno::Any & aValue)998 void SAL_CALL SvNumberFormatSettingsObj::setPropertyValue( const rtl::OUString& aPropertyName,
999 													const uno::Any& aValue )
1000 				throw(beans::UnknownPropertyException, beans::PropertyVetoException,
1001 						lang::IllegalArgumentException, lang::WrappedTargetException,
1002 						uno::RuntimeException)
1003 {
1004     ::osl::MutexGuard aGuard( m_aMutex );
1005 
1006 	SvNumberFormatter* pFormatter = rSupplier.GetNumberFormatter();
1007 	if (pFormatter)
1008 	{
1009 		String aString = aPropertyName;
1010 		if (aString.EqualsAscii( PROPERTYNAME_NOZERO ))
1011 		{
1012 			//	operator >>= shouldn't be used for bool (?)
1013 			if ( aValue.getValueTypeClass() == uno::TypeClass_BOOLEAN )
1014 				pFormatter->SetNoZero( *(sal_Bool*)aValue.getValue() );
1015 		}
1016 		else if (aString.EqualsAscii( PROPERTYNAME_NULLDATE ))
1017 		{
1018 			util::Date aDate;
1019 			if ( aValue >>= aDate )
1020 				pFormatter->ChangeNullDate( aDate.Day, aDate.Month, aDate.Year );
1021 		}
1022 		else if (aString.EqualsAscii( PROPERTYNAME_STDDEC ))
1023 		{
1024 			sal_Int16 nInt16 = sal_Int16();
1025 			if ( aValue >>= nInt16 )
1026 				pFormatter->ChangeStandardPrec( nInt16 );
1027 		}
1028 		else if (aString.EqualsAscii( PROPERTYNAME_TWODIGIT ))
1029 		{
1030 			sal_Int16 nInt16 = sal_Int16();
1031 			if ( aValue >>= nInt16 )
1032 				pFormatter->SetYear2000( nInt16 );
1033 		}
1034 		else
1035 			throw beans::UnknownPropertyException();
1036 
1037 		rSupplier.SettingsChanged();
1038 	}
1039 	else
1040 		throw uno::RuntimeException();
1041 }
1042 
getPropertyValue(const rtl::OUString & aPropertyName)1043 uno::Any SAL_CALL SvNumberFormatSettingsObj::getPropertyValue( const rtl::OUString& aPropertyName )
1044 				throw(beans::UnknownPropertyException, lang::WrappedTargetException,
1045 						uno::RuntimeException)
1046 {
1047     ::osl::MutexGuard aGuard( m_aMutex );
1048 
1049 	uno::Any aRet;
1050 	SvNumberFormatter* pFormatter = rSupplier.GetNumberFormatter();
1051 	if (pFormatter)
1052 	{
1053 		String aString = aPropertyName;
1054 		if (aString.EqualsAscii( PROPERTYNAME_NOZERO ))
1055 		{
1056 			sal_Bool bNoZero = pFormatter->GetNoZero();
1057 			aRet.setValue( &bNoZero, getBooleanCppuType() );
1058 		}
1059 		else if (aString.EqualsAscii( PROPERTYNAME_NULLDATE ))
1060 		{
1061 			Date* pDate = pFormatter->GetNullDate();
1062 			if (pDate)
1063 			{
1064 				util::Date aUnoDate( pDate->GetDay(), pDate->GetMonth(), pDate->GetYear() );
1065 				aRet <<= aUnoDate;
1066 			}
1067 		}
1068 		else if (aString.EqualsAscii( PROPERTYNAME_STDDEC ))
1069 			aRet <<= (sal_Int16)( pFormatter->GetStandardPrec() );
1070 		else if (aString.EqualsAscii( PROPERTYNAME_TWODIGIT ))
1071 			aRet <<= (sal_Int16)( pFormatter->GetYear2000() );
1072 		else
1073 			throw beans::UnknownPropertyException();
1074 	}
1075 	else
1076 		throw uno::RuntimeException();
1077 
1078 	return aRet;
1079 }
1080 
addPropertyChangeListener(const rtl::OUString &,const uno::Reference<beans::XPropertyChangeListener> &)1081 void SAL_CALL SvNumberFormatSettingsObj::addPropertyChangeListener( const rtl::OUString&,
1082 						const uno::Reference<beans::XPropertyChangeListener>&)
1083 						throw(beans::UnknownPropertyException,
1084 						lang::WrappedTargetException, uno::RuntimeException)
1085 {
1086 	DBG_ERROR("not implemented");
1087 }
1088 
removePropertyChangeListener(const rtl::OUString &,const uno::Reference<beans::XPropertyChangeListener> &)1089 void SAL_CALL SvNumberFormatSettingsObj::removePropertyChangeListener( const rtl::OUString&,
1090 						const uno::Reference<beans::XPropertyChangeListener>&)
1091 						throw(beans::UnknownPropertyException,
1092 						lang::WrappedTargetException, uno::RuntimeException)
1093 {
1094 	DBG_ERROR("not implemented");
1095 }
1096 
addVetoableChangeListener(const rtl::OUString &,const uno::Reference<beans::XVetoableChangeListener> &)1097 void SAL_CALL SvNumberFormatSettingsObj::addVetoableChangeListener( const rtl::OUString&,
1098 						const uno::Reference<beans::XVetoableChangeListener>&)
1099 						throw(beans::UnknownPropertyException,
1100 						lang::WrappedTargetException, uno::RuntimeException)
1101 {
1102 	DBG_ERROR("not implemented");
1103 }
1104 
removeVetoableChangeListener(const rtl::OUString &,const uno::Reference<beans::XVetoableChangeListener> &)1105 void SAL_CALL SvNumberFormatSettingsObj::removeVetoableChangeListener( const rtl::OUString&,
1106 						const uno::Reference<beans::XVetoableChangeListener>&)
1107 						throw(beans::UnknownPropertyException,
1108 						lang::WrappedTargetException, uno::RuntimeException)
1109 {
1110 	DBG_ERROR("not implemented");
1111 }
1112 
1113 // XServiceInfo
1114 
getImplementationName()1115 rtl::OUString SAL_CALL SvNumberFormatSettingsObj::getImplementationName()
1116 							throw(uno::RuntimeException)
1117 {
1118 	return rtl::OUString::createFromAscii("SvNumberFormatSettingsObj");
1119 }
1120 
supportsService(const rtl::OUString & ServiceName)1121 sal_Bool SAL_CALL SvNumberFormatSettingsObj::supportsService( const rtl::OUString& ServiceName )
1122 							throw(uno::RuntimeException)
1123 {
1124 	return ( ServiceName.compareToAscii(SERVICENAME_NUMBERSETTINGS) == 0 );
1125 }
1126 
getSupportedServiceNames()1127 uno::Sequence<rtl::OUString> SAL_CALL SvNumberFormatSettingsObj::getSupportedServiceNames()
1128 							throw(uno::RuntimeException)
1129 {
1130 	uno::Sequence<rtl::OUString> aRet(1);
1131 	rtl::OUString* pArray = aRet.getArray();
1132 	pArray[0] = rtl::OUString::createFromAscii(SERVICENAME_NUMBERSETTINGS);
1133 	return aRet;
1134 }
1135 
1136 
1137