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