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