xref: /aoo4110/main/xmloff/source/style/xmlnumfi.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_xmloff.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <unotools/syslocale.hxx>
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski #define _ZFORLIST_DECLARE_TABLE
30*b1cdbd2cSJim Jagielski #include <svl/zforlist.hxx>
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski #include <svl/zformat.hxx>
33*b1cdbd2cSJim Jagielski #include <svl/numuno.hxx>
34*b1cdbd2cSJim Jagielski #include <rtl/math.hxx>
35*b1cdbd2cSJim Jagielski #include <i18npool/mslangid.hxx>
36*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
37*b1cdbd2cSJim Jagielski #include <rtl/ustrbuf.hxx>
38*b1cdbd2cSJim Jagielski 
39*b1cdbd2cSJim Jagielski // #110680#
40*b1cdbd2cSJim Jagielski //#include <comphelper/processfactory.hxx>
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski #include <xmloff/xmlnumfi.hxx>
43*b1cdbd2cSJim Jagielski #include <xmloff/xmltkmap.hxx>
44*b1cdbd2cSJim Jagielski #include "xmloff/xmlnmspe.hxx"
45*b1cdbd2cSJim Jagielski #include <xmloff/xmlictxt.hxx>
46*b1cdbd2cSJim Jagielski #include <xmloff/xmlimp.hxx>
47*b1cdbd2cSJim Jagielski #include <xmloff/xmluconv.hxx>
48*b1cdbd2cSJim Jagielski #include <xmloff/nmspmap.hxx>
49*b1cdbd2cSJim Jagielski #include <xmloff/families.hxx>
50*b1cdbd2cSJim Jagielski #include <xmloff/xmltoken.hxx>
51*b1cdbd2cSJim Jagielski 
52*b1cdbd2cSJim Jagielski using ::rtl::OUString;
53*b1cdbd2cSJim Jagielski using ::rtl::OUStringBuffer;
54*b1cdbd2cSJim Jagielski 
55*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
56*b1cdbd2cSJim Jagielski using namespace ::xmloff::token;
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------
59*b1cdbd2cSJim Jagielski 
60*b1cdbd2cSJim Jagielski struct SvXMLNumFmtEntry
61*b1cdbd2cSJim Jagielski {
62*b1cdbd2cSJim Jagielski 	rtl::OUString	aName;
63*b1cdbd2cSJim Jagielski 	sal_uInt32		nKey;
64*b1cdbd2cSJim Jagielski 	sal_Bool		bRemoveAfterUse;
65*b1cdbd2cSJim Jagielski 
SvXMLNumFmtEntrySvXMLNumFmtEntry66*b1cdbd2cSJim Jagielski 	SvXMLNumFmtEntry( const rtl::OUString& rN, sal_uInt32 nK, sal_Bool bR ) :
67*b1cdbd2cSJim Jagielski 		aName(rN), nKey(nK), bRemoveAfterUse(bR) {}
68*b1cdbd2cSJim Jagielski };
69*b1cdbd2cSJim Jagielski 
70*b1cdbd2cSJim Jagielski typedef SvXMLNumFmtEntry* SvXMLNumFmtEntryPtr;
71*b1cdbd2cSJim Jagielski SV_DECL_PTRARR_DEL( SvXMLNumFmtEntryArr, SvXMLNumFmtEntryPtr, 4, 4 )
72*b1cdbd2cSJim Jagielski 
73*b1cdbd2cSJim Jagielski struct SvXMLEmbeddedElement
74*b1cdbd2cSJim Jagielski {
75*b1cdbd2cSJim Jagielski 	sal_Int32		nFormatPos;
76*b1cdbd2cSJim Jagielski 	rtl::OUString	aText;
77*b1cdbd2cSJim Jagielski 
SvXMLEmbeddedElementSvXMLEmbeddedElement78*b1cdbd2cSJim Jagielski 	SvXMLEmbeddedElement( sal_Int32 nFP, const rtl::OUString& rT ) :
79*b1cdbd2cSJim Jagielski 		nFormatPos(nFP), aText(rT) {}
80*b1cdbd2cSJim Jagielski 
81*b1cdbd2cSJim Jagielski 	//	comparison operators for PTRARR sorting - sorted by position
operator ==SvXMLEmbeddedElement82*b1cdbd2cSJim Jagielski 	sal_Bool operator ==( const SvXMLEmbeddedElement& r ) const	{ return nFormatPos == r.nFormatPos; }
operator <SvXMLEmbeddedElement83*b1cdbd2cSJim Jagielski 	sal_Bool operator < ( const SvXMLEmbeddedElement& r ) const	{ return nFormatPos <  r.nFormatPos; }
84*b1cdbd2cSJim Jagielski };
85*b1cdbd2cSJim Jagielski 
86*b1cdbd2cSJim Jagielski typedef SvXMLEmbeddedElement* SvXMLEmbeddedElementPtr;
87*b1cdbd2cSJim Jagielski SV_DECL_PTRARR_SORT_DEL( SvXMLEmbeddedElementArr, SvXMLEmbeddedElementPtr, 0, 4 )
88*b1cdbd2cSJim Jagielski 
89*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------
90*b1cdbd2cSJim Jagielski 
91*b1cdbd2cSJim Jagielski class SvXMLNumImpData
92*b1cdbd2cSJim Jagielski {
93*b1cdbd2cSJim Jagielski 	SvNumberFormatter*	pFormatter;
94*b1cdbd2cSJim Jagielski 	SvXMLTokenMap*		pStylesElemTokenMap;
95*b1cdbd2cSJim Jagielski 	SvXMLTokenMap*		pStyleElemTokenMap;
96*b1cdbd2cSJim Jagielski 	SvXMLTokenMap*		pStyleAttrTokenMap;
97*b1cdbd2cSJim Jagielski 	SvXMLTokenMap*		pStyleElemAttrTokenMap;
98*b1cdbd2cSJim Jagielski 	LocaleDataWrapper*	pLocaleData;
99*b1cdbd2cSJim Jagielski 	SvXMLNumFmtEntryArr	aNameEntries;
100*b1cdbd2cSJim Jagielski 
101*b1cdbd2cSJim Jagielski 	// #110680#
102*b1cdbd2cSJim Jagielski 	::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > mxServiceFactory;
103*b1cdbd2cSJim Jagielski 
104*b1cdbd2cSJim Jagielski public:
105*b1cdbd2cSJim Jagielski 	// #110680#
106*b1cdbd2cSJim Jagielski 	// SvXMLNumImpData( SvNumberFormatter* pFmt );
107*b1cdbd2cSJim Jagielski 	SvXMLNumImpData(
108*b1cdbd2cSJim Jagielski 		SvNumberFormatter* pFmt,
109*b1cdbd2cSJim Jagielski 		const uno::Reference<lang::XMultiServiceFactory>& xServiceFactory );
110*b1cdbd2cSJim Jagielski 	~SvXMLNumImpData();
111*b1cdbd2cSJim Jagielski 
GetNumberFormatter() const112*b1cdbd2cSJim Jagielski 	SvNumberFormatter*		GetNumberFormatter() const	{ return pFormatter; }
113*b1cdbd2cSJim Jagielski 	const SvXMLTokenMap&	GetStylesElemTokenMap();
114*b1cdbd2cSJim Jagielski 	const SvXMLTokenMap&	GetStyleElemTokenMap();
115*b1cdbd2cSJim Jagielski 	const SvXMLTokenMap&	GetStyleAttrTokenMap();
116*b1cdbd2cSJim Jagielski 	const SvXMLTokenMap&	GetStyleElemAttrTokenMap();
117*b1cdbd2cSJim Jagielski 	const LocaleDataWrapper&	GetLocaleData( LanguageType nLang );
118*b1cdbd2cSJim Jagielski 	sal_uInt32				GetKeyForName( const rtl::OUString& rName );
119*b1cdbd2cSJim Jagielski 	void					AddKey( sal_uInt32 nKey, const rtl::OUString& rName, sal_Bool bRemoveAfterUse );
120*b1cdbd2cSJim Jagielski 	void					SetUsed( sal_uInt32 nKey );
121*b1cdbd2cSJim Jagielski 	void					RemoveVolatileFormats();
122*b1cdbd2cSJim Jagielski };
123*b1cdbd2cSJim Jagielski 
124*b1cdbd2cSJim Jagielski 
125*b1cdbd2cSJim Jagielski struct SvXMLNumberInfo
126*b1cdbd2cSJim Jagielski {
127*b1cdbd2cSJim Jagielski 	sal_Int32	nDecimals;
128*b1cdbd2cSJim Jagielski 	sal_Int32	nInteger;
129*b1cdbd2cSJim Jagielski 	sal_Int32	nExpDigits;
130*b1cdbd2cSJim Jagielski 	sal_Int32	nNumerDigits;
131*b1cdbd2cSJim Jagielski 	sal_Int32	nDenomDigits;
132*b1cdbd2cSJim Jagielski 	sal_Bool	bGrouping;
133*b1cdbd2cSJim Jagielski 	sal_Bool	bDecReplace;
134*b1cdbd2cSJim Jagielski 	sal_Bool	bVarDecimals;
135*b1cdbd2cSJim Jagielski 	double		fDisplayFactor;
136*b1cdbd2cSJim Jagielski 	SvXMLEmbeddedElementArr	aEmbeddedElements;
137*b1cdbd2cSJim Jagielski 
SvXMLNumberInfoSvXMLNumberInfo138*b1cdbd2cSJim Jagielski 	SvXMLNumberInfo()
139*b1cdbd2cSJim Jagielski 	{
140*b1cdbd2cSJim Jagielski 		nDecimals = nInteger = nExpDigits = nNumerDigits = nDenomDigits = -1;
141*b1cdbd2cSJim Jagielski 		bGrouping = bDecReplace = bVarDecimals = sal_False;
142*b1cdbd2cSJim Jagielski 		fDisplayFactor = 1.0;
143*b1cdbd2cSJim Jagielski 	}
144*b1cdbd2cSJim Jagielski };
145*b1cdbd2cSJim Jagielski 
146*b1cdbd2cSJim Jagielski class SvXMLNumFmtElementContext : public SvXMLImportContext
147*b1cdbd2cSJim Jagielski {
148*b1cdbd2cSJim Jagielski 	SvXMLNumFormatContext&	rParent;
149*b1cdbd2cSJim Jagielski 	sal_uInt16				nType;
150*b1cdbd2cSJim Jagielski 	rtl::OUStringBuffer		aContent;
151*b1cdbd2cSJim Jagielski 	SvXMLNumberInfo			aNumInfo;
152*b1cdbd2cSJim Jagielski 	LanguageType			nElementLang;
153*b1cdbd2cSJim Jagielski 	sal_Bool				bLong;
154*b1cdbd2cSJim Jagielski 	sal_Bool				bTextual;
155*b1cdbd2cSJim Jagielski 	rtl::OUString			sCalendar;
156*b1cdbd2cSJim Jagielski 
157*b1cdbd2cSJim Jagielski public:
158*b1cdbd2cSJim Jagielski 				SvXMLNumFmtElementContext( SvXMLImport& rImport, sal_uInt16 nPrfx,
159*b1cdbd2cSJim Jagielski 									const rtl::OUString& rLName,
160*b1cdbd2cSJim Jagielski 									SvXMLNumFormatContext& rParentContext, sal_uInt16 nNewType,
161*b1cdbd2cSJim Jagielski 									const ::com::sun::star::uno::Reference<
162*b1cdbd2cSJim Jagielski 										::com::sun::star::xml::sax::XAttributeList>& xAttrList );
163*b1cdbd2cSJim Jagielski 	virtual		~SvXMLNumFmtElementContext();
164*b1cdbd2cSJim Jagielski 
165*b1cdbd2cSJim Jagielski 	virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
166*b1cdbd2cSJim Jagielski 									const rtl::OUString& rLocalName,
167*b1cdbd2cSJim Jagielski 									const ::com::sun::star::uno::Reference<
168*b1cdbd2cSJim Jagielski 									  	::com::sun::star::xml::sax::XAttributeList>& xAttrList );
169*b1cdbd2cSJim Jagielski 	virtual void Characters( const rtl::OUString& rChars );
170*b1cdbd2cSJim Jagielski 	virtual void EndElement();
171*b1cdbd2cSJim Jagielski 
172*b1cdbd2cSJim Jagielski 	void	AddEmbeddedElement( sal_Int32 nFormatPos, const rtl::OUString& rContent );
173*b1cdbd2cSJim Jagielski };
174*b1cdbd2cSJim Jagielski 
175*b1cdbd2cSJim Jagielski 
176*b1cdbd2cSJim Jagielski class SvXMLNumFmtEmbeddedTextContext : public SvXMLImportContext
177*b1cdbd2cSJim Jagielski {
178*b1cdbd2cSJim Jagielski 	SvXMLNumFmtElementContext&	rParent;
179*b1cdbd2cSJim Jagielski 	rtl::OUStringBuffer			aContent;
180*b1cdbd2cSJim Jagielski 	sal_Int32					nTextPosition;
181*b1cdbd2cSJim Jagielski 
182*b1cdbd2cSJim Jagielski public:
183*b1cdbd2cSJim Jagielski 				SvXMLNumFmtEmbeddedTextContext( SvXMLImport& rImport, sal_uInt16 nPrfx,
184*b1cdbd2cSJim Jagielski 									const rtl::OUString& rLName,
185*b1cdbd2cSJim Jagielski 									SvXMLNumFmtElementContext& rParentContext,
186*b1cdbd2cSJim Jagielski 									const ::com::sun::star::uno::Reference<
187*b1cdbd2cSJim Jagielski 										::com::sun::star::xml::sax::XAttributeList>& xAttrList );
188*b1cdbd2cSJim Jagielski 	virtual		~SvXMLNumFmtEmbeddedTextContext();
189*b1cdbd2cSJim Jagielski 
190*b1cdbd2cSJim Jagielski 	virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
191*b1cdbd2cSJim Jagielski 									const rtl::OUString& rLocalName,
192*b1cdbd2cSJim Jagielski 									const ::com::sun::star::uno::Reference<
193*b1cdbd2cSJim Jagielski 									  	::com::sun::star::xml::sax::XAttributeList>& xAttrList );
194*b1cdbd2cSJim Jagielski 	virtual void Characters( const rtl::OUString& rChars );
195*b1cdbd2cSJim Jagielski 	virtual void EndElement();
196*b1cdbd2cSJim Jagielski };
197*b1cdbd2cSJim Jagielski 
198*b1cdbd2cSJim Jagielski 
199*b1cdbd2cSJim Jagielski class SvXMLNumFmtMapContext : public SvXMLImportContext
200*b1cdbd2cSJim Jagielski {
201*b1cdbd2cSJim Jagielski 	SvXMLNumFormatContext&	rParent;
202*b1cdbd2cSJim Jagielski 	rtl::OUString			sCondition;
203*b1cdbd2cSJim Jagielski 	rtl::OUString			sName;
204*b1cdbd2cSJim Jagielski 
205*b1cdbd2cSJim Jagielski public:
206*b1cdbd2cSJim Jagielski 				SvXMLNumFmtMapContext( SvXMLImport& rImport, sal_uInt16 nPrfx,
207*b1cdbd2cSJim Jagielski 									const rtl::OUString& rLName,
208*b1cdbd2cSJim Jagielski 									SvXMLNumFormatContext& rParentContext,
209*b1cdbd2cSJim Jagielski 									const ::com::sun::star::uno::Reference<
210*b1cdbd2cSJim Jagielski 										::com::sun::star::xml::sax::XAttributeList>& xAttrList );
211*b1cdbd2cSJim Jagielski 	virtual		~SvXMLNumFmtMapContext();
212*b1cdbd2cSJim Jagielski 
213*b1cdbd2cSJim Jagielski 	virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
214*b1cdbd2cSJim Jagielski 									const rtl::OUString& rLocalName,
215*b1cdbd2cSJim Jagielski 									const ::com::sun::star::uno::Reference<
216*b1cdbd2cSJim Jagielski 									  	::com::sun::star::xml::sax::XAttributeList>& xAttrList );
217*b1cdbd2cSJim Jagielski 	virtual void Characters( const rtl::OUString& rChars );
218*b1cdbd2cSJim Jagielski 	virtual void EndElement();
219*b1cdbd2cSJim Jagielski };
220*b1cdbd2cSJim Jagielski 
221*b1cdbd2cSJim Jagielski 
222*b1cdbd2cSJim Jagielski class SvXMLNumFmtPropContext : public SvXMLImportContext
223*b1cdbd2cSJim Jagielski {
224*b1cdbd2cSJim Jagielski 	SvXMLNumFormatContext&	rParent;
225*b1cdbd2cSJim Jagielski 	Color					aColor;
226*b1cdbd2cSJim Jagielski 	sal_Bool				bColSet;
227*b1cdbd2cSJim Jagielski 
228*b1cdbd2cSJim Jagielski public:
229*b1cdbd2cSJim Jagielski 				SvXMLNumFmtPropContext( SvXMLImport& rImport, sal_uInt16 nPrfx,
230*b1cdbd2cSJim Jagielski 									const rtl::OUString& rLName,
231*b1cdbd2cSJim Jagielski 									SvXMLNumFormatContext& rParentContext,
232*b1cdbd2cSJim Jagielski 									const ::com::sun::star::uno::Reference<
233*b1cdbd2cSJim Jagielski 										::com::sun::star::xml::sax::XAttributeList>& xAttrList );
234*b1cdbd2cSJim Jagielski 	virtual		~SvXMLNumFmtPropContext();
235*b1cdbd2cSJim Jagielski 
236*b1cdbd2cSJim Jagielski 	virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
237*b1cdbd2cSJim Jagielski 									const rtl::OUString& rLocalName,
238*b1cdbd2cSJim Jagielski 									const ::com::sun::star::uno::Reference<
239*b1cdbd2cSJim Jagielski 									  	::com::sun::star::xml::sax::XAttributeList>& xAttrList );
240*b1cdbd2cSJim Jagielski 	virtual void Characters( const rtl::OUString& rChars );
241*b1cdbd2cSJim Jagielski 	virtual void EndElement();
242*b1cdbd2cSJim Jagielski };
243*b1cdbd2cSJim Jagielski 
244*b1cdbd2cSJim Jagielski 
245*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------
246*b1cdbd2cSJim Jagielski 
247*b1cdbd2cSJim Jagielski enum SvXMLStyleTokens
248*b1cdbd2cSJim Jagielski {
249*b1cdbd2cSJim Jagielski 	XML_TOK_STYLE_TEXT,
250*b1cdbd2cSJim Jagielski 	XML_TOK_STYLE_NUMBER,
251*b1cdbd2cSJim Jagielski 	XML_TOK_STYLE_SCIENTIFIC_NUMBER,
252*b1cdbd2cSJim Jagielski 	XML_TOK_STYLE_FRACTION,
253*b1cdbd2cSJim Jagielski 	XML_TOK_STYLE_CURRENCY_SYMBOL,
254*b1cdbd2cSJim Jagielski 	XML_TOK_STYLE_DAY,
255*b1cdbd2cSJim Jagielski 	XML_TOK_STYLE_MONTH,
256*b1cdbd2cSJim Jagielski 	XML_TOK_STYLE_YEAR,
257*b1cdbd2cSJim Jagielski 	XML_TOK_STYLE_ERA,
258*b1cdbd2cSJim Jagielski 	XML_TOK_STYLE_DAY_OF_WEEK,
259*b1cdbd2cSJim Jagielski 	XML_TOK_STYLE_WEEK_OF_YEAR,
260*b1cdbd2cSJim Jagielski 	XML_TOK_STYLE_QUARTER,
261*b1cdbd2cSJim Jagielski 	XML_TOK_STYLE_HOURS,
262*b1cdbd2cSJim Jagielski 	XML_TOK_STYLE_AM_PM,
263*b1cdbd2cSJim Jagielski 	XML_TOK_STYLE_MINUTES,
264*b1cdbd2cSJim Jagielski 	XML_TOK_STYLE_SECONDS,
265*b1cdbd2cSJim Jagielski 	XML_TOK_STYLE_BOOLEAN,
266*b1cdbd2cSJim Jagielski 	XML_TOK_STYLE_TEXT_CONTENT,
267*b1cdbd2cSJim Jagielski 	XML_TOK_STYLE_PROPERTIES,
268*b1cdbd2cSJim Jagielski 	XML_TOK_STYLE_MAP
269*b1cdbd2cSJim Jagielski };
270*b1cdbd2cSJim Jagielski 
271*b1cdbd2cSJim Jagielski enum SvXMLStyleAttrTokens
272*b1cdbd2cSJim Jagielski {
273*b1cdbd2cSJim Jagielski 	XML_TOK_STYLE_ATTR_NAME,
274*b1cdbd2cSJim Jagielski 	XML_TOK_STYLE_ATTR_LANGUAGE,
275*b1cdbd2cSJim Jagielski 	XML_TOK_STYLE_ATTR_COUNTRY,
276*b1cdbd2cSJim Jagielski 	XML_TOK_STYLE_ATTR_TITLE,
277*b1cdbd2cSJim Jagielski 	XML_TOK_STYLE_ATTR_AUTOMATIC_ORDER,
278*b1cdbd2cSJim Jagielski 	XML_TOK_STYLE_ATTR_FORMAT_SOURCE,
279*b1cdbd2cSJim Jagielski 	XML_TOK_STYLE_ATTR_TRUNCATE_ON_OVERFLOW,
280*b1cdbd2cSJim Jagielski 	XML_TOK_STYLE_ATTR_VOLATILE,
281*b1cdbd2cSJim Jagielski     XML_TOK_STYLE_ATTR_TRANSL_FORMAT,
282*b1cdbd2cSJim Jagielski     XML_TOK_STYLE_ATTR_TRANSL_LANGUAGE,
283*b1cdbd2cSJim Jagielski     XML_TOK_STYLE_ATTR_TRANSL_COUNTRY,
284*b1cdbd2cSJim Jagielski     XML_TOK_STYLE_ATTR_TRANSL_STYLE
285*b1cdbd2cSJim Jagielski };
286*b1cdbd2cSJim Jagielski 
287*b1cdbd2cSJim Jagielski enum SvXMLStyleElemAttrTokens
288*b1cdbd2cSJim Jagielski {
289*b1cdbd2cSJim Jagielski 	XML_TOK_ELEM_ATTR_DECIMAL_PLACES,
290*b1cdbd2cSJim Jagielski 	XML_TOK_ELEM_ATTR_MIN_INTEGER_DIGITS,
291*b1cdbd2cSJim Jagielski 	XML_TOK_ELEM_ATTR_GROUPING,
292*b1cdbd2cSJim Jagielski 	XML_TOK_ELEM_ATTR_DISPLAY_FACTOR,
293*b1cdbd2cSJim Jagielski 	XML_TOK_ELEM_ATTR_DECIMAL_REPLACEMENT,
294*b1cdbd2cSJim Jagielski 	XML_TOK_ELEM_ATTR_MIN_EXPONENT_DIGITS,
295*b1cdbd2cSJim Jagielski 	XML_TOK_ELEM_ATTR_MIN_NUMERATOR_DIGITS,
296*b1cdbd2cSJim Jagielski 	XML_TOK_ELEM_ATTR_MIN_DENOMINATOR_DIGITS,
297*b1cdbd2cSJim Jagielski 	XML_TOK_ELEM_ATTR_LANGUAGE,
298*b1cdbd2cSJim Jagielski 	XML_TOK_ELEM_ATTR_COUNTRY,
299*b1cdbd2cSJim Jagielski 	XML_TOK_ELEM_ATTR_STYLE,
300*b1cdbd2cSJim Jagielski 	XML_TOK_ELEM_ATTR_TEXTUAL,
301*b1cdbd2cSJim Jagielski 	XML_TOK_ELEM_ATTR_CALENDAR
302*b1cdbd2cSJim Jagielski };
303*b1cdbd2cSJim Jagielski 
304*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------
305*b1cdbd2cSJim Jagielski 
306*b1cdbd2cSJim Jagielski //
307*b1cdbd2cSJim Jagielski //	standard colors
308*b1cdbd2cSJim Jagielski //
309*b1cdbd2cSJim Jagielski 
310*b1cdbd2cSJim Jagielski #define XML_NUMF_COLORCOUNT		10
311*b1cdbd2cSJim Jagielski 
312*b1cdbd2cSJim Jagielski static ColorData aNumFmtStdColors[XML_NUMF_COLORCOUNT] =
313*b1cdbd2cSJim Jagielski {
314*b1cdbd2cSJim Jagielski 	COL_BLACK,
315*b1cdbd2cSJim Jagielski 	COL_LIGHTBLUE,
316*b1cdbd2cSJim Jagielski 	COL_LIGHTGREEN,
317*b1cdbd2cSJim Jagielski 	COL_LIGHTCYAN,
318*b1cdbd2cSJim Jagielski 	COL_LIGHTRED,
319*b1cdbd2cSJim Jagielski 	COL_LIGHTMAGENTA,
320*b1cdbd2cSJim Jagielski 	COL_BROWN,
321*b1cdbd2cSJim Jagielski 	COL_GRAY,
322*b1cdbd2cSJim Jagielski 	COL_YELLOW,
323*b1cdbd2cSJim Jagielski 	COL_WHITE
324*b1cdbd2cSJim Jagielski };
325*b1cdbd2cSJim Jagielski 
326*b1cdbd2cSJim Jagielski //
327*b1cdbd2cSJim Jagielski //	token maps
328*b1cdbd2cSJim Jagielski //
329*b1cdbd2cSJim Jagielski 
330*b1cdbd2cSJim Jagielski // maps for SvXMLUnitConverter::convertEnum
331*b1cdbd2cSJim Jagielski 
332*b1cdbd2cSJim Jagielski static __FAR_DATA SvXMLEnumMapEntry aStyleValueMap[] =
333*b1cdbd2cSJim Jagielski {
334*b1cdbd2cSJim Jagielski 	{ XML_SHORT,            sal_False	},
335*b1cdbd2cSJim Jagielski 	{ XML_LONG,             sal_True	},
336*b1cdbd2cSJim Jagielski 	{ XML_TOKEN_INVALID,    0 }
337*b1cdbd2cSJim Jagielski };
338*b1cdbd2cSJim Jagielski 
339*b1cdbd2cSJim Jagielski static __FAR_DATA SvXMLEnumMapEntry aFormatSourceMap[] =
340*b1cdbd2cSJim Jagielski {
341*b1cdbd2cSJim Jagielski 	{ XML_FIXED,	        sal_False },
342*b1cdbd2cSJim Jagielski 	{ XML_LANGUAGE,         sal_True  },
343*b1cdbd2cSJim Jagielski 	{ XML_TOKEN_INVALID,    0 }
344*b1cdbd2cSJim Jagielski };
345*b1cdbd2cSJim Jagielski 
346*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------
347*b1cdbd2cSJim Jagielski 
348*b1cdbd2cSJim Jagielski struct SvXMLDefaultDateFormat
349*b1cdbd2cSJim Jagielski {
350*b1cdbd2cSJim Jagielski 	NfIndexTableOffset			eFormat;
351*b1cdbd2cSJim Jagielski 	SvXMLDateElementAttributes	eDOW;
352*b1cdbd2cSJim Jagielski 	SvXMLDateElementAttributes	eDay;
353*b1cdbd2cSJim Jagielski 	SvXMLDateElementAttributes	eMonth;
354*b1cdbd2cSJim Jagielski 	SvXMLDateElementAttributes	eYear;
355*b1cdbd2cSJim Jagielski 	SvXMLDateElementAttributes	eHours;
356*b1cdbd2cSJim Jagielski 	SvXMLDateElementAttributes	eMins;
357*b1cdbd2cSJim Jagielski 	SvXMLDateElementAttributes	eSecs;
358*b1cdbd2cSJim Jagielski 	sal_Bool					bSystem;
359*b1cdbd2cSJim Jagielski };
360*b1cdbd2cSJim Jagielski 
361*b1cdbd2cSJim Jagielski static __FAR_DATA SvXMLDefaultDateFormat aDefaultDateFormats[] =
362*b1cdbd2cSJim Jagielski {
363*b1cdbd2cSJim Jagielski 	// format							day-of-week		day				month				year			hours			minutes			seconds			format-source
364*b1cdbd2cSJim Jagielski 
365*b1cdbd2cSJim Jagielski 	{ NF_DATE_SYSTEM_SHORT,				XML_DEA_NONE,	XML_DEA_ANY,	XML_DEA_ANY,		XML_DEA_ANY,	XML_DEA_NONE,	XML_DEA_NONE,	XML_DEA_NONE,	sal_True },
366*b1cdbd2cSJim Jagielski 	{ NF_DATE_SYSTEM_LONG,				XML_DEA_ANY,	XML_DEA_ANY,	XML_DEA_ANY,		XML_DEA_ANY,	XML_DEA_NONE,	XML_DEA_NONE,	XML_DEA_NONE,	sal_True },
367*b1cdbd2cSJim Jagielski 	{ NF_DATE_SYS_MMYY,					XML_DEA_NONE,	XML_DEA_NONE,	XML_DEA_LONG,		XML_DEA_SHORT,	XML_DEA_NONE,	XML_DEA_NONE,	XML_DEA_NONE,	sal_False },
368*b1cdbd2cSJim Jagielski 	{ NF_DATE_SYS_DDMMM,				XML_DEA_NONE,	XML_DEA_LONG,	XML_DEA_TEXTSHORT,	XML_DEA_NONE,	XML_DEA_NONE,	XML_DEA_NONE,	XML_DEA_NONE,	sal_False },
369*b1cdbd2cSJim Jagielski 	{ NF_DATE_SYS_DDMMYYYY,				XML_DEA_NONE,	XML_DEA_LONG,	XML_DEA_LONG,		XML_DEA_LONG,	XML_DEA_NONE,	XML_DEA_NONE,	XML_DEA_NONE,	sal_False },
370*b1cdbd2cSJim Jagielski 	{ NF_DATE_SYS_DDMMYY,				XML_DEA_NONE,	XML_DEA_LONG,	XML_DEA_LONG,		XML_DEA_SHORT,	XML_DEA_NONE,	XML_DEA_NONE,	XML_DEA_NONE,	sal_False },
371*b1cdbd2cSJim Jagielski 	{ NF_DATE_SYS_DMMMYY,				XML_DEA_NONE,	XML_DEA_SHORT,	XML_DEA_TEXTSHORT,	XML_DEA_SHORT,	XML_DEA_NONE,	XML_DEA_NONE,	XML_DEA_NONE,	sal_False },
372*b1cdbd2cSJim Jagielski 	{ NF_DATE_SYS_DMMMYYYY,				XML_DEA_NONE,	XML_DEA_SHORT,	XML_DEA_TEXTSHORT,	XML_DEA_LONG,	XML_DEA_NONE,	XML_DEA_NONE,	XML_DEA_NONE,	sal_False },
373*b1cdbd2cSJim Jagielski 	{ NF_DATE_SYS_DMMMMYYYY,			XML_DEA_NONE,	XML_DEA_SHORT,	XML_DEA_TEXTLONG,	XML_DEA_LONG,	XML_DEA_NONE,	XML_DEA_NONE,	XML_DEA_NONE,	sal_False },
374*b1cdbd2cSJim Jagielski 	{ NF_DATE_SYS_NNDMMMYY,				XML_DEA_SHORT,	XML_DEA_SHORT,	XML_DEA_TEXTSHORT,	XML_DEA_SHORT,	XML_DEA_NONE,	XML_DEA_NONE,	XML_DEA_NONE,	sal_False },
375*b1cdbd2cSJim Jagielski 	{ NF_DATE_SYS_NNDMMMMYYYY,			XML_DEA_SHORT,	XML_DEA_SHORT,	XML_DEA_TEXTLONG,	XML_DEA_LONG,	XML_DEA_NONE,	XML_DEA_NONE,	XML_DEA_NONE,	sal_False },
376*b1cdbd2cSJim Jagielski 	{ NF_DATE_SYS_NNNNDMMMMYYYY,		XML_DEA_LONG,	XML_DEA_SHORT,	XML_DEA_TEXTLONG,	XML_DEA_LONG,	XML_DEA_NONE,	XML_DEA_NONE,	XML_DEA_NONE,	sal_False },
377*b1cdbd2cSJim Jagielski 	{ NF_DATETIME_SYSTEM_SHORT_HHMM,	XML_DEA_NONE,	XML_DEA_ANY,	XML_DEA_ANY,		XML_DEA_ANY,	XML_DEA_ANY,	XML_DEA_ANY,	XML_DEA_NONE,	sal_True },
378*b1cdbd2cSJim Jagielski 	{ NF_DATETIME_SYS_DDMMYYYY_HHMMSS,	XML_DEA_NONE,	XML_DEA_ANY,	XML_DEA_ANY,		XML_DEA_ANY,	XML_DEA_ANY,	XML_DEA_ANY,	XML_DEA_ANY,	sal_False }
379*b1cdbd2cSJim Jagielski };
380*b1cdbd2cSJim Jagielski 
381*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------
382*b1cdbd2cSJim Jagielski 
383*b1cdbd2cSJim Jagielski SV_IMPL_PTRARR( SvXMLNumFmtEntryArr, SvXMLNumFmtEntryPtr );
384*b1cdbd2cSJim Jagielski SV_IMPL_OP_PTRARR_SORT( SvXMLEmbeddedElementArr, SvXMLEmbeddedElementPtr );
385*b1cdbd2cSJim Jagielski 
386*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------
387*b1cdbd2cSJim Jagielski 
388*b1cdbd2cSJim Jagielski //
389*b1cdbd2cSJim Jagielski //	SvXMLNumImpData
390*b1cdbd2cSJim Jagielski //
391*b1cdbd2cSJim Jagielski 
392*b1cdbd2cSJim Jagielski // #110680#
393*b1cdbd2cSJim Jagielski // SvXMLNumImpData::SvXMLNumImpData( SvNumberFormatter* pFmt ) :
SvXMLNumImpData(SvNumberFormatter * pFmt,const uno::Reference<lang::XMultiServiceFactory> & xServiceFactory)394*b1cdbd2cSJim Jagielski SvXMLNumImpData::SvXMLNumImpData(
395*b1cdbd2cSJim Jagielski 	SvNumberFormatter* pFmt,
396*b1cdbd2cSJim Jagielski 	const uno::Reference<lang::XMultiServiceFactory>& xServiceFactory )
397*b1cdbd2cSJim Jagielski :	pFormatter(pFmt),
398*b1cdbd2cSJim Jagielski 	pStylesElemTokenMap(NULL),
399*b1cdbd2cSJim Jagielski 	pStyleElemTokenMap(NULL),
400*b1cdbd2cSJim Jagielski 	pStyleAttrTokenMap(NULL),
401*b1cdbd2cSJim Jagielski 	pStyleElemAttrTokenMap(NULL),
402*b1cdbd2cSJim Jagielski 	pLocaleData(NULL),
403*b1cdbd2cSJim Jagielski 
404*b1cdbd2cSJim Jagielski 	// #110680#
405*b1cdbd2cSJim Jagielski 	mxServiceFactory(xServiceFactory)
406*b1cdbd2cSJim Jagielski {
407*b1cdbd2cSJim Jagielski 	DBG_ASSERT( mxServiceFactory.is(), "got no service manager" );
408*b1cdbd2cSJim Jagielski }
409*b1cdbd2cSJim Jagielski 
~SvXMLNumImpData()410*b1cdbd2cSJim Jagielski SvXMLNumImpData::~SvXMLNumImpData()
411*b1cdbd2cSJim Jagielski {
412*b1cdbd2cSJim Jagielski 	delete pStylesElemTokenMap;
413*b1cdbd2cSJim Jagielski 	delete pStyleElemTokenMap;
414*b1cdbd2cSJim Jagielski 	delete pStyleAttrTokenMap;
415*b1cdbd2cSJim Jagielski 	delete pStyleElemAttrTokenMap;
416*b1cdbd2cSJim Jagielski 	delete pLocaleData;
417*b1cdbd2cSJim Jagielski }
418*b1cdbd2cSJim Jagielski 
GetKeyForName(const rtl::OUString & rName)419*b1cdbd2cSJim Jagielski sal_uInt32 SvXMLNumImpData::GetKeyForName( const rtl::OUString& rName )
420*b1cdbd2cSJim Jagielski {
421*b1cdbd2cSJim Jagielski 	sal_uInt16 nCount = aNameEntries.Count();
422*b1cdbd2cSJim Jagielski 	for (sal_uInt16 i=0; i<nCount; i++)
423*b1cdbd2cSJim Jagielski 	{
424*b1cdbd2cSJim Jagielski 		const SvXMLNumFmtEntry* pObj = aNameEntries[i];
425*b1cdbd2cSJim Jagielski 		if ( pObj->aName == rName )
426*b1cdbd2cSJim Jagielski 			return pObj->nKey;				// found
427*b1cdbd2cSJim Jagielski 	}
428*b1cdbd2cSJim Jagielski 	return NUMBERFORMAT_ENTRY_NOT_FOUND;
429*b1cdbd2cSJim Jagielski }
430*b1cdbd2cSJim Jagielski 
AddKey(sal_uInt32 nKey,const rtl::OUString & rName,sal_Bool bRemoveAfterUse)431*b1cdbd2cSJim Jagielski void SvXMLNumImpData::AddKey( sal_uInt32 nKey, const rtl::OUString& rName, sal_Bool bRemoveAfterUse )
432*b1cdbd2cSJim Jagielski {
433*b1cdbd2cSJim Jagielski 	if ( bRemoveAfterUse )
434*b1cdbd2cSJim Jagielski 	{
435*b1cdbd2cSJim Jagielski 		//	if there is already an entry for this key without the bRemoveAfterUse flag,
436*b1cdbd2cSJim Jagielski 		//	clear the flag for this entry, too
437*b1cdbd2cSJim Jagielski 
438*b1cdbd2cSJim Jagielski 		sal_uInt16 nCount = aNameEntries.Count();
439*b1cdbd2cSJim Jagielski 		for (sal_uInt16 i=0; i<nCount; i++)
440*b1cdbd2cSJim Jagielski 		{
441*b1cdbd2cSJim Jagielski 			SvXMLNumFmtEntry* pObj = aNameEntries[i];
442*b1cdbd2cSJim Jagielski 			if ( pObj->nKey == nKey && !pObj->bRemoveAfterUse )
443*b1cdbd2cSJim Jagielski 			{
444*b1cdbd2cSJim Jagielski 				bRemoveAfterUse = sal_False;		// clear flag for new entry
445*b1cdbd2cSJim Jagielski 				break;
446*b1cdbd2cSJim Jagielski 			}
447*b1cdbd2cSJim Jagielski 		}
448*b1cdbd2cSJim Jagielski 	}
449*b1cdbd2cSJim Jagielski 	else
450*b1cdbd2cSJim Jagielski 	{
451*b1cdbd2cSJim Jagielski 		//	call SetUsed to clear the bRemoveAfterUse flag for other entries for this key
452*b1cdbd2cSJim Jagielski 		SetUsed( nKey );
453*b1cdbd2cSJim Jagielski 	}
454*b1cdbd2cSJim Jagielski 
455*b1cdbd2cSJim Jagielski 	SvXMLNumFmtEntry* pObj = new SvXMLNumFmtEntry( rName, nKey, bRemoveAfterUse );
456*b1cdbd2cSJim Jagielski 	aNameEntries.Insert( pObj, aNameEntries.Count() );
457*b1cdbd2cSJim Jagielski }
458*b1cdbd2cSJim Jagielski 
SetUsed(sal_uInt32 nKey)459*b1cdbd2cSJim Jagielski void SvXMLNumImpData::SetUsed( sal_uInt32 nKey )
460*b1cdbd2cSJim Jagielski {
461*b1cdbd2cSJim Jagielski 	sal_uInt16 nCount = aNameEntries.Count();
462*b1cdbd2cSJim Jagielski 	for (sal_uInt16 i=0; i<nCount; i++)
463*b1cdbd2cSJim Jagielski 	{
464*b1cdbd2cSJim Jagielski 		SvXMLNumFmtEntry* pObj = aNameEntries[i];
465*b1cdbd2cSJim Jagielski 		if ( pObj->nKey == nKey )
466*b1cdbd2cSJim Jagielski 		{
467*b1cdbd2cSJim Jagielski 			pObj->bRemoveAfterUse = sal_False;		// used -> don't remove
468*b1cdbd2cSJim Jagielski 
469*b1cdbd2cSJim Jagielski 			//	continue searching - there may be several entries for the same key
470*b1cdbd2cSJim Jagielski 			//	(with different names), the format must not be deleted if any one of
471*b1cdbd2cSJim Jagielski 			//	them is used
472*b1cdbd2cSJim Jagielski 		}
473*b1cdbd2cSJim Jagielski 	}
474*b1cdbd2cSJim Jagielski }
475*b1cdbd2cSJim Jagielski 
RemoveVolatileFormats()476*b1cdbd2cSJim Jagielski void SvXMLNumImpData::RemoveVolatileFormats()
477*b1cdbd2cSJim Jagielski {
478*b1cdbd2cSJim Jagielski 	//	remove temporary (volatile) formats from NumberFormatter
479*b1cdbd2cSJim Jagielski 	//	called at the end of each import (styles and content), so volatile formats
480*b1cdbd2cSJim Jagielski 	//	from styles can't be used in content
481*b1cdbd2cSJim Jagielski 
482*b1cdbd2cSJim Jagielski 	if ( !pFormatter )
483*b1cdbd2cSJim Jagielski 		return;
484*b1cdbd2cSJim Jagielski 
485*b1cdbd2cSJim Jagielski 	sal_uInt16 nCount = aNameEntries.Count();
486*b1cdbd2cSJim Jagielski 	for (sal_uInt16 i=0; i<nCount; i++)
487*b1cdbd2cSJim Jagielski 	{
488*b1cdbd2cSJim Jagielski 		const SvXMLNumFmtEntry* pObj = aNameEntries[i];
489*b1cdbd2cSJim Jagielski 		if ( pObj->bRemoveAfterUse )
490*b1cdbd2cSJim Jagielski         {
491*b1cdbd2cSJim Jagielski             const SvNumberformat* pFormat = pFormatter->GetEntry(pObj->nKey);
492*b1cdbd2cSJim Jagielski             if (pFormat && (pFormat->GetType() & NUMBERFORMAT_DEFINED))
493*b1cdbd2cSJim Jagielski 			    pFormatter->DeleteEntry( pObj->nKey );
494*b1cdbd2cSJim Jagielski         }
495*b1cdbd2cSJim Jagielski 	}
496*b1cdbd2cSJim Jagielski }
497*b1cdbd2cSJim Jagielski 
GetStylesElemTokenMap()498*b1cdbd2cSJim Jagielski const SvXMLTokenMap& SvXMLNumImpData::GetStylesElemTokenMap()
499*b1cdbd2cSJim Jagielski {
500*b1cdbd2cSJim Jagielski 	if( !pStylesElemTokenMap )
501*b1cdbd2cSJim Jagielski     {
502*b1cdbd2cSJim Jagielski         static __FAR_DATA SvXMLTokenMapEntry aStylesElemMap[] =
503*b1cdbd2cSJim Jagielski         {
504*b1cdbd2cSJim Jagielski 	        //	style elements
505*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_NUMBER_STYLE, 	   XML_TOK_STYLES_NUMBER_STYLE		},
506*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_CURRENCY_STYLE,    XML_TOK_STYLES_CURRENCY_STYLE	},
507*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_PERCENTAGE_STYLE,  XML_TOK_STYLES_PERCENTAGE_STYLE	},
508*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_DATE_STYLE, 	   XML_TOK_STYLES_DATE_STYLE		},
509*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_TIME_STYLE, 	   XML_TOK_STYLES_TIME_STYLE		},
510*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_BOOLEAN_STYLE,     XML_TOK_STYLES_BOOLEAN_STYLE		},
511*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_TEXT_STYLE, 	   XML_TOK_STYLES_TEXT_STYLE		},
512*b1cdbd2cSJim Jagielski 	        XML_TOKEN_MAP_END
513*b1cdbd2cSJim Jagielski         };
514*b1cdbd2cSJim Jagielski 
515*b1cdbd2cSJim Jagielski 		pStylesElemTokenMap = new SvXMLTokenMap( aStylesElemMap );
516*b1cdbd2cSJim Jagielski     }
517*b1cdbd2cSJim Jagielski 	return *pStylesElemTokenMap;
518*b1cdbd2cSJim Jagielski }
519*b1cdbd2cSJim Jagielski 
GetStyleElemTokenMap()520*b1cdbd2cSJim Jagielski const SvXMLTokenMap& SvXMLNumImpData::GetStyleElemTokenMap()
521*b1cdbd2cSJim Jagielski {
522*b1cdbd2cSJim Jagielski 	if( !pStyleElemTokenMap )
523*b1cdbd2cSJim Jagielski     {
524*b1cdbd2cSJim Jagielski         static __FAR_DATA SvXMLTokenMapEntry aStyleElemMap[] =
525*b1cdbd2cSJim Jagielski         {
526*b1cdbd2cSJim Jagielski 	        //	elements in a style
527*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_TEXT,				XML_TOK_STYLE_TEXT				},
528*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_NUMBER,		 	    XML_TOK_STYLE_NUMBER			},
529*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_SCIENTIFIC_NUMBER,	XML_TOK_STYLE_SCIENTIFIC_NUMBER	},
530*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_FRACTION,			XML_TOK_STYLE_FRACTION			},
531*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_CURRENCY_SYMBOL,	XML_TOK_STYLE_CURRENCY_SYMBOL	},
532*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_DAY,				XML_TOK_STYLE_DAY				},
533*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_MONTH,				XML_TOK_STYLE_MONTH				},
534*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_YEAR,				XML_TOK_STYLE_YEAR				},
535*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_ERA,				XML_TOK_STYLE_ERA				},
536*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_DAY_OF_WEEK,		XML_TOK_STYLE_DAY_OF_WEEK		},
537*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_WEEK_OF_YEAR,		XML_TOK_STYLE_WEEK_OF_YEAR		},
538*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_QUARTER,			XML_TOK_STYLE_QUARTER			},
539*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_HOURS,				XML_TOK_STYLE_HOURS				},
540*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_AM_PM,				XML_TOK_STYLE_AM_PM				},
541*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_MINUTES,			XML_TOK_STYLE_MINUTES			},
542*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_SECONDS,			XML_TOK_STYLE_SECONDS			},
543*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_BOOLEAN,			XML_TOK_STYLE_BOOLEAN			},
544*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_TEXT_CONTENT,		XML_TOK_STYLE_TEXT_CONTENT		},
545*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_STYLE,  XML_TEXT_PROPERTIES,    XML_TOK_STYLE_PROPERTIES		},
546*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_STYLE,  XML_MAP,				XML_TOK_STYLE_MAP				},
547*b1cdbd2cSJim Jagielski 	        XML_TOKEN_MAP_END
548*b1cdbd2cSJim Jagielski         };
549*b1cdbd2cSJim Jagielski 
550*b1cdbd2cSJim Jagielski 		pStyleElemTokenMap = new SvXMLTokenMap( aStyleElemMap );
551*b1cdbd2cSJim Jagielski     }
552*b1cdbd2cSJim Jagielski 	return *pStyleElemTokenMap;
553*b1cdbd2cSJim Jagielski }
554*b1cdbd2cSJim Jagielski 
GetStyleAttrTokenMap()555*b1cdbd2cSJim Jagielski const SvXMLTokenMap& SvXMLNumImpData::GetStyleAttrTokenMap()
556*b1cdbd2cSJim Jagielski {
557*b1cdbd2cSJim Jagielski 	if( !pStyleAttrTokenMap )
558*b1cdbd2cSJim Jagielski     {
559*b1cdbd2cSJim Jagielski         static __FAR_DATA SvXMLTokenMapEntry aStyleAttrMap[] =
560*b1cdbd2cSJim Jagielski         {
561*b1cdbd2cSJim Jagielski 	        //	attributes for a style
562*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_STYLE,  XML_NAME,			 	   XML_TOK_STYLE_ATTR_NAME					},
563*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_LANGUAGE,		 	   XML_TOK_STYLE_ATTR_LANGUAGE				},
564*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_COUNTRY,		 	   XML_TOK_STYLE_ATTR_COUNTRY				},
565*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_TITLE,			 	   XML_TOK_STYLE_ATTR_TITLE					},
566*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_AUTOMATIC_ORDER, 	   XML_TOK_STYLE_ATTR_AUTOMATIC_ORDER		},
567*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_FORMAT_SOURCE, 	       XML_TOK_STYLE_ATTR_FORMAT_SOURCE			},
568*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_TRUNCATE_ON_OVERFLOW,  XML_TOK_STYLE_ATTR_TRUNCATE_ON_OVERFLOW	},
569*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_STYLE,  XML_VOLATILE,		 	   XML_TOK_STYLE_ATTR_VOLATILE				},
570*b1cdbd2cSJim Jagielski             { XML_NAMESPACE_NUMBER, XML_TRANSLITERATION_FORMAT,     XML_TOK_STYLE_ATTR_TRANSL_FORMAT    },
571*b1cdbd2cSJim Jagielski             { XML_NAMESPACE_NUMBER, XML_TRANSLITERATION_LANGUAGE,   XML_TOK_STYLE_ATTR_TRANSL_LANGUAGE  },
572*b1cdbd2cSJim Jagielski             { XML_NAMESPACE_NUMBER, XML_TRANSLITERATION_COUNTRY,    XML_TOK_STYLE_ATTR_TRANSL_COUNTRY   },
573*b1cdbd2cSJim Jagielski             { XML_NAMESPACE_NUMBER, XML_TRANSLITERATION_STYLE,      XML_TOK_STYLE_ATTR_TRANSL_STYLE     },
574*b1cdbd2cSJim Jagielski 	        XML_TOKEN_MAP_END
575*b1cdbd2cSJim Jagielski         };
576*b1cdbd2cSJim Jagielski 
577*b1cdbd2cSJim Jagielski 		pStyleAttrTokenMap = new SvXMLTokenMap( aStyleAttrMap );
578*b1cdbd2cSJim Jagielski     }
579*b1cdbd2cSJim Jagielski 	return *pStyleAttrTokenMap;
580*b1cdbd2cSJim Jagielski }
581*b1cdbd2cSJim Jagielski 
GetStyleElemAttrTokenMap()582*b1cdbd2cSJim Jagielski const SvXMLTokenMap& SvXMLNumImpData::GetStyleElemAttrTokenMap()
583*b1cdbd2cSJim Jagielski {
584*b1cdbd2cSJim Jagielski 	if( !pStyleElemAttrTokenMap )
585*b1cdbd2cSJim Jagielski     {
586*b1cdbd2cSJim Jagielski         static __FAR_DATA SvXMLTokenMapEntry aStyleElemAttrMap[] =
587*b1cdbd2cSJim Jagielski         {
588*b1cdbd2cSJim Jagielski 	        //	attributes for an element within a style
589*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_DECIMAL_PLACES,		     XML_TOK_ELEM_ATTR_DECIMAL_PLACES		},
590*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_MIN_INTEGER_DIGITS,      XML_TOK_ELEM_ATTR_MIN_INTEGER_DIGITS	},
591*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_GROUPING,			 	 XML_TOK_ELEM_ATTR_GROUPING				},
592*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_DISPLAY_FACTOR,		 	 XML_TOK_ELEM_ATTR_DISPLAY_FACTOR		},
593*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_DECIMAL_REPLACEMENT,     XML_TOK_ELEM_ATTR_DECIMAL_REPLACEMENT	},
594*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_MIN_EXPONENT_DIGITS,     XML_TOK_ELEM_ATTR_MIN_EXPONENT_DIGITS	},
595*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_MIN_NUMERATOR_DIGITS,    XML_TOK_ELEM_ATTR_MIN_NUMERATOR_DIGITS	},
596*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_MIN_DENOMINATOR_DIGITS,  XML_TOK_ELEM_ATTR_MIN_DENOMINATOR_DIGITS },
597*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_LANGUAGE,			 	 XML_TOK_ELEM_ATTR_LANGUAGE				},
598*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_COUNTRY,			 	 XML_TOK_ELEM_ATTR_COUNTRY				},
599*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_STYLE,				 	 XML_TOK_ELEM_ATTR_STYLE				},
600*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_TEXTUAL,			 	 XML_TOK_ELEM_ATTR_TEXTUAL				},
601*b1cdbd2cSJim Jagielski 	        { XML_NAMESPACE_NUMBER, XML_CALENDAR,			 	 XML_TOK_ELEM_ATTR_CALENDAR				},
602*b1cdbd2cSJim Jagielski 	        XML_TOKEN_MAP_END
603*b1cdbd2cSJim Jagielski         };
604*b1cdbd2cSJim Jagielski 
605*b1cdbd2cSJim Jagielski 		pStyleElemAttrTokenMap = new SvXMLTokenMap( aStyleElemAttrMap );
606*b1cdbd2cSJim Jagielski     }
607*b1cdbd2cSJim Jagielski 	return *pStyleElemAttrTokenMap;
608*b1cdbd2cSJim Jagielski }
609*b1cdbd2cSJim Jagielski 
GetLocaleData(LanguageType nLang)610*b1cdbd2cSJim Jagielski const LocaleDataWrapper& SvXMLNumImpData::GetLocaleData( LanguageType nLang )
611*b1cdbd2cSJim Jagielski {
612*b1cdbd2cSJim Jagielski 	if ( !pLocaleData )
613*b1cdbd2cSJim Jagielski 		// #110680#
614*b1cdbd2cSJim Jagielski 		//pLocaleData = new LocaleDataWrapper(
615*b1cdbd2cSJim Jagielski 		//	(pFormatter ? pFormatter->GetServiceManager() :
616*b1cdbd2cSJim Jagielski 		//	::comphelper::getProcessServiceFactory()),
617*b1cdbd2cSJim Jagielski 		//	MsLangId::convertLanguageToLocale( nLang ) );
618*b1cdbd2cSJim Jagielski 		pLocaleData = new LocaleDataWrapper(
619*b1cdbd2cSJim Jagielski 			(pFormatter ? pFormatter->GetServiceManager() :
620*b1cdbd2cSJim Jagielski 			mxServiceFactory),
621*b1cdbd2cSJim Jagielski 			MsLangId::convertLanguageToLocale( nLang ) );
622*b1cdbd2cSJim Jagielski 	else
623*b1cdbd2cSJim Jagielski 		pLocaleData->setLocale( MsLangId::convertLanguageToLocale( nLang ) );
624*b1cdbd2cSJim Jagielski 	return *pLocaleData;
625*b1cdbd2cSJim Jagielski }
626*b1cdbd2cSJim Jagielski 
627*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------
628*b1cdbd2cSJim Jagielski 
629*b1cdbd2cSJim Jagielski //
630*b1cdbd2cSJim Jagielski //	SvXMLNumFmtMapContext
631*b1cdbd2cSJim Jagielski //
632*b1cdbd2cSJim Jagielski 
SvXMLNumFmtMapContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const rtl::OUString & rLName,SvXMLNumFormatContext & rParentContext,const uno::Reference<xml::sax::XAttributeList> & xAttrList)633*b1cdbd2cSJim Jagielski SvXMLNumFmtMapContext::SvXMLNumFmtMapContext( SvXMLImport& rImport,
634*b1cdbd2cSJim Jagielski 									sal_uInt16 nPrfx, const rtl::OUString& rLName,
635*b1cdbd2cSJim Jagielski 									SvXMLNumFormatContext& rParentContext,
636*b1cdbd2cSJim Jagielski 									const uno::Reference<xml::sax::XAttributeList>& xAttrList ) :
637*b1cdbd2cSJim Jagielski 	SvXMLImportContext( rImport, nPrfx, rLName ),
638*b1cdbd2cSJim Jagielski 	rParent( rParentContext )
639*b1cdbd2cSJim Jagielski {
640*b1cdbd2cSJim Jagielski 	sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
641*b1cdbd2cSJim Jagielski 	for( sal_Int16 i=0; i < nAttrCount; i++ )
642*b1cdbd2cSJim Jagielski 	{
643*b1cdbd2cSJim Jagielski 		OUString sAttrName = xAttrList->getNameByIndex( i );
644*b1cdbd2cSJim Jagielski 		OUString sValue = xAttrList->getValueByIndex( i );
645*b1cdbd2cSJim Jagielski 		OUString aLocalName;
646*b1cdbd2cSJim Jagielski 		sal_uInt16 nPrefix = rImport.GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
647*b1cdbd2cSJim Jagielski 		if ( nPrefix == XML_NAMESPACE_STYLE )
648*b1cdbd2cSJim Jagielski 		{
649*b1cdbd2cSJim Jagielski 			if ( IsXMLToken( aLocalName, XML_CONDITION) )
650*b1cdbd2cSJim Jagielski 				sCondition = sValue;
651*b1cdbd2cSJim Jagielski 			else if ( IsXMLToken( aLocalName, XML_APPLY_STYLE_NAME) )
652*b1cdbd2cSJim Jagielski 				sName = sValue;
653*b1cdbd2cSJim Jagielski 		}
654*b1cdbd2cSJim Jagielski 	}
655*b1cdbd2cSJim Jagielski }
656*b1cdbd2cSJim Jagielski 
~SvXMLNumFmtMapContext()657*b1cdbd2cSJim Jagielski SvXMLNumFmtMapContext::~SvXMLNumFmtMapContext()
658*b1cdbd2cSJim Jagielski {
659*b1cdbd2cSJim Jagielski }
660*b1cdbd2cSJim Jagielski 
CreateChildContext(sal_uInt16 nPrfx,const rtl::OUString & rLName,const uno::Reference<xml::sax::XAttributeList> &)661*b1cdbd2cSJim Jagielski SvXMLImportContext* SvXMLNumFmtMapContext::CreateChildContext(
662*b1cdbd2cSJim Jagielski 									sal_uInt16 nPrfx, const rtl::OUString& rLName,
663*b1cdbd2cSJim Jagielski 									const uno::Reference<xml::sax::XAttributeList>& )
664*b1cdbd2cSJim Jagielski {
665*b1cdbd2cSJim Jagielski 	// no elements supported - use default context
666*b1cdbd2cSJim Jagielski 	return new SvXMLImportContext( GetImport(), nPrfx, rLName );
667*b1cdbd2cSJim Jagielski }
668*b1cdbd2cSJim Jagielski 
Characters(const rtl::OUString &)669*b1cdbd2cSJim Jagielski void SvXMLNumFmtMapContext::Characters( const rtl::OUString& )
670*b1cdbd2cSJim Jagielski {
671*b1cdbd2cSJim Jagielski }
672*b1cdbd2cSJim Jagielski 
EndElement()673*b1cdbd2cSJim Jagielski void SvXMLNumFmtMapContext::EndElement()
674*b1cdbd2cSJim Jagielski {
675*b1cdbd2cSJim Jagielski 	rParent.AddCondition( sCondition, sName );
676*b1cdbd2cSJim Jagielski }
677*b1cdbd2cSJim Jagielski 
678*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------
679*b1cdbd2cSJim Jagielski 
680*b1cdbd2cSJim Jagielski //
681*b1cdbd2cSJim Jagielski //	SvXMLNumFmtPropContext
682*b1cdbd2cSJim Jagielski //
683*b1cdbd2cSJim Jagielski 
SvXMLNumFmtPropContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const rtl::OUString & rLName,SvXMLNumFormatContext & rParentContext,const uno::Reference<xml::sax::XAttributeList> & xAttrList)684*b1cdbd2cSJim Jagielski SvXMLNumFmtPropContext::SvXMLNumFmtPropContext( SvXMLImport& rImport,
685*b1cdbd2cSJim Jagielski 									sal_uInt16 nPrfx, const rtl::OUString& rLName,
686*b1cdbd2cSJim Jagielski 									SvXMLNumFormatContext& rParentContext,
687*b1cdbd2cSJim Jagielski 									const uno::Reference<xml::sax::XAttributeList>& xAttrList ) :
688*b1cdbd2cSJim Jagielski 	SvXMLImportContext( rImport, nPrfx, rLName ),
689*b1cdbd2cSJim Jagielski 	rParent( rParentContext ),
690*b1cdbd2cSJim Jagielski 	bColSet( sal_False )
691*b1cdbd2cSJim Jagielski {
692*b1cdbd2cSJim Jagielski 	sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
693*b1cdbd2cSJim Jagielski 	for( sal_Int16 i=0; i < nAttrCount; i++ )
694*b1cdbd2cSJim Jagielski 	{
695*b1cdbd2cSJim Jagielski 		OUString sAttrName = xAttrList->getNameByIndex( i );
696*b1cdbd2cSJim Jagielski 		OUString sValue = xAttrList->getValueByIndex( i );
697*b1cdbd2cSJim Jagielski 		OUString aLocalName;
698*b1cdbd2cSJim Jagielski 		sal_uInt16 nPrefix = rImport.GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
699*b1cdbd2cSJim Jagielski 		if ( nPrefix == XML_NAMESPACE_FO && IsXMLToken( aLocalName, XML_COLOR ) )
700*b1cdbd2cSJim Jagielski 			bColSet = SvXMLUnitConverter::convertColor( aColor, sValue );
701*b1cdbd2cSJim Jagielski 	}
702*b1cdbd2cSJim Jagielski }
703*b1cdbd2cSJim Jagielski 
~SvXMLNumFmtPropContext()704*b1cdbd2cSJim Jagielski SvXMLNumFmtPropContext::~SvXMLNumFmtPropContext()
705*b1cdbd2cSJim Jagielski {
706*b1cdbd2cSJim Jagielski }
707*b1cdbd2cSJim Jagielski 
CreateChildContext(sal_uInt16 nPrfx,const rtl::OUString & rLName,const uno::Reference<xml::sax::XAttributeList> &)708*b1cdbd2cSJim Jagielski SvXMLImportContext* SvXMLNumFmtPropContext::CreateChildContext(
709*b1cdbd2cSJim Jagielski 									sal_uInt16 nPrfx, const rtl::OUString& rLName,
710*b1cdbd2cSJim Jagielski 									const uno::Reference<xml::sax::XAttributeList>& )
711*b1cdbd2cSJim Jagielski {
712*b1cdbd2cSJim Jagielski 	// no elements supported - use default context
713*b1cdbd2cSJim Jagielski 	return new SvXMLImportContext( GetImport(), nPrfx, rLName );
714*b1cdbd2cSJim Jagielski }
715*b1cdbd2cSJim Jagielski 
Characters(const rtl::OUString &)716*b1cdbd2cSJim Jagielski void SvXMLNumFmtPropContext::Characters( const rtl::OUString& )
717*b1cdbd2cSJim Jagielski {
718*b1cdbd2cSJim Jagielski }
719*b1cdbd2cSJim Jagielski 
EndElement()720*b1cdbd2cSJim Jagielski void SvXMLNumFmtPropContext::EndElement()
721*b1cdbd2cSJim Jagielski {
722*b1cdbd2cSJim Jagielski 	if (bColSet)
723*b1cdbd2cSJim Jagielski 		rParent.AddColor( aColor );
724*b1cdbd2cSJim Jagielski }
725*b1cdbd2cSJim Jagielski 
726*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------
727*b1cdbd2cSJim Jagielski 
728*b1cdbd2cSJim Jagielski //
729*b1cdbd2cSJim Jagielski //	SvXMLNumFmtEmbeddedTextContext
730*b1cdbd2cSJim Jagielski //
731*b1cdbd2cSJim Jagielski 
SvXMLNumFmtEmbeddedTextContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const rtl::OUString & rLName,SvXMLNumFmtElementContext & rParentContext,const uno::Reference<xml::sax::XAttributeList> & xAttrList)732*b1cdbd2cSJim Jagielski SvXMLNumFmtEmbeddedTextContext::SvXMLNumFmtEmbeddedTextContext( SvXMLImport& rImport,
733*b1cdbd2cSJim Jagielski 									sal_uInt16 nPrfx, const rtl::OUString& rLName,
734*b1cdbd2cSJim Jagielski 									SvXMLNumFmtElementContext& rParentContext,
735*b1cdbd2cSJim Jagielski 									const uno::Reference<xml::sax::XAttributeList>& xAttrList ) :
736*b1cdbd2cSJim Jagielski 	SvXMLImportContext( rImport, nPrfx, rLName ),
737*b1cdbd2cSJim Jagielski 	rParent( rParentContext ),
738*b1cdbd2cSJim Jagielski 	nTextPosition( 0 )
739*b1cdbd2cSJim Jagielski {
740*b1cdbd2cSJim Jagielski 	sal_Int32 nAttrVal;
741*b1cdbd2cSJim Jagielski 
742*b1cdbd2cSJim Jagielski 	sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
743*b1cdbd2cSJim Jagielski 	for( sal_Int16 i=0; i < nAttrCount; i++ )
744*b1cdbd2cSJim Jagielski 	{
745*b1cdbd2cSJim Jagielski 		OUString sAttrName = xAttrList->getNameByIndex( i );
746*b1cdbd2cSJim Jagielski 		OUString sValue = xAttrList->getValueByIndex( i );
747*b1cdbd2cSJim Jagielski 		OUString aLocalName;
748*b1cdbd2cSJim Jagielski 		sal_uInt16 nPrefix = rImport.GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
749*b1cdbd2cSJim Jagielski 		if ( nPrefix == XML_NAMESPACE_NUMBER && IsXMLToken( aLocalName, XML_POSITION ) )
750*b1cdbd2cSJim Jagielski 		{
751*b1cdbd2cSJim Jagielski 			if ( SvXMLUnitConverter::convertNumber( nAttrVal, sValue, 0 ) )
752*b1cdbd2cSJim Jagielski 				nTextPosition = nAttrVal;
753*b1cdbd2cSJim Jagielski 		}
754*b1cdbd2cSJim Jagielski 	}
755*b1cdbd2cSJim Jagielski }
756*b1cdbd2cSJim Jagielski 
~SvXMLNumFmtEmbeddedTextContext()757*b1cdbd2cSJim Jagielski SvXMLNumFmtEmbeddedTextContext::~SvXMLNumFmtEmbeddedTextContext()
758*b1cdbd2cSJim Jagielski {
759*b1cdbd2cSJim Jagielski }
760*b1cdbd2cSJim Jagielski 
CreateChildContext(sal_uInt16 nPrfx,const rtl::OUString & rLName,const uno::Reference<xml::sax::XAttributeList> &)761*b1cdbd2cSJim Jagielski SvXMLImportContext* SvXMLNumFmtEmbeddedTextContext::CreateChildContext(
762*b1cdbd2cSJim Jagielski 									sal_uInt16 nPrfx, const rtl::OUString& rLName,
763*b1cdbd2cSJim Jagielski 									const uno::Reference<xml::sax::XAttributeList>& )
764*b1cdbd2cSJim Jagielski {
765*b1cdbd2cSJim Jagielski 	// no elements supported - use default context
766*b1cdbd2cSJim Jagielski 	return new SvXMLImportContext( GetImport(), nPrfx, rLName );
767*b1cdbd2cSJim Jagielski }
768*b1cdbd2cSJim Jagielski 
Characters(const rtl::OUString & rChars)769*b1cdbd2cSJim Jagielski void SvXMLNumFmtEmbeddedTextContext::Characters( const rtl::OUString& rChars )
770*b1cdbd2cSJim Jagielski {
771*b1cdbd2cSJim Jagielski 	aContent.append( rChars );
772*b1cdbd2cSJim Jagielski }
773*b1cdbd2cSJim Jagielski 
EndElement()774*b1cdbd2cSJim Jagielski void SvXMLNumFmtEmbeddedTextContext::EndElement()
775*b1cdbd2cSJim Jagielski {
776*b1cdbd2cSJim Jagielski 	rParent.AddEmbeddedElement( nTextPosition, aContent.makeStringAndClear() );
777*b1cdbd2cSJim Jagielski }
778*b1cdbd2cSJim Jagielski 
779*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------
780*b1cdbd2cSJim Jagielski 
lcl_ValidChar(sal_Unicode cChar,const SvXMLNumFormatContext & rParent)781*b1cdbd2cSJim Jagielski sal_Bool lcl_ValidChar( sal_Unicode cChar, const SvXMLNumFormatContext& rParent )
782*b1cdbd2cSJim Jagielski {
783*b1cdbd2cSJim Jagielski     sal_uInt16 nFormatType = rParent.GetType();
784*b1cdbd2cSJim Jagielski 
785*b1cdbd2cSJim Jagielski     // Treat space equal to non-breaking space separator.
786*b1cdbd2cSJim Jagielski     const sal_Unicode cNBSP = 0x00A0;
787*b1cdbd2cSJim Jagielski     sal_Unicode cTS;
788*b1cdbd2cSJim Jagielski     if ( ( nFormatType == XML_TOK_STYLES_NUMBER_STYLE ||
789*b1cdbd2cSJim Jagielski            nFormatType == XML_TOK_STYLES_CURRENCY_STYLE ||
790*b1cdbd2cSJim Jagielski            nFormatType == XML_TOK_STYLES_PERCENTAGE_STYLE ) &&
791*b1cdbd2cSJim Jagielski             (cChar == (cTS = rParent.GetLocaleData().getNumThousandSep().GetChar(0)) ||
792*b1cdbd2cSJim Jagielski              (cChar == ' ' && cTS == cNBSP)) )
793*b1cdbd2cSJim Jagielski     {
794*b1cdbd2cSJim Jagielski         //  #i22394# Extra occurrences of thousands separator must be quoted, so they
795*b1cdbd2cSJim Jagielski         //  aren't mis-interpreted as display-factor.
796*b1cdbd2cSJim Jagielski         //  This must be limited to the format types that can contain a number element,
797*b1cdbd2cSJim Jagielski         //  because the same character can be a date separator that should not be quoted
798*b1cdbd2cSJim Jagielski         //  in date formats.
799*b1cdbd2cSJim Jagielski 
800*b1cdbd2cSJim Jagielski         return sal_False;   // force quotes
801*b1cdbd2cSJim Jagielski     }
802*b1cdbd2cSJim Jagielski 
803*b1cdbd2cSJim Jagielski 	//	see ImpSvNumberformatScan::Next_Symbol
804*b1cdbd2cSJim Jagielski 	if ( cChar == ' ' ||
805*b1cdbd2cSJim Jagielski 		 cChar == '-' ||
806*b1cdbd2cSJim Jagielski 		 cChar == '/' ||
807*b1cdbd2cSJim Jagielski 		 cChar == '.' ||
808*b1cdbd2cSJim Jagielski 		 cChar == ',' ||
809*b1cdbd2cSJim Jagielski 		 cChar == ':' ||
810*b1cdbd2cSJim Jagielski 		 cChar == '\'' )
811*b1cdbd2cSJim Jagielski 		return sal_True;	// for all format types
812*b1cdbd2cSJim Jagielski 
813*b1cdbd2cSJim Jagielski 	//	percent sign must be used without quotes for percentage styles only
814*b1cdbd2cSJim Jagielski 	if ( nFormatType == XML_TOK_STYLES_PERCENTAGE_STYLE && cChar == '%' )
815*b1cdbd2cSJim Jagielski 		return sal_True;
816*b1cdbd2cSJim Jagielski 
817*b1cdbd2cSJim Jagielski 	//	don't put quotes around single parentheses (often used for negative numbers)
818*b1cdbd2cSJim Jagielski 	if ( ( nFormatType == XML_TOK_STYLES_NUMBER_STYLE ||
819*b1cdbd2cSJim Jagielski 		   nFormatType == XML_TOK_STYLES_CURRENCY_STYLE ||
820*b1cdbd2cSJim Jagielski 		   nFormatType == XML_TOK_STYLES_PERCENTAGE_STYLE ) &&
821*b1cdbd2cSJim Jagielski 		 ( cChar == '(' || cChar == ')' ) )
822*b1cdbd2cSJim Jagielski 		return sal_True;
823*b1cdbd2cSJim Jagielski 
824*b1cdbd2cSJim Jagielski 	return sal_False;
825*b1cdbd2cSJim Jagielski }
826*b1cdbd2cSJim Jagielski 
lcl_EnquoteIfNecessary(rtl::OUStringBuffer & rContent,const SvXMLNumFormatContext & rParent)827*b1cdbd2cSJim Jagielski void lcl_EnquoteIfNecessary( rtl::OUStringBuffer& rContent, const SvXMLNumFormatContext& rParent )
828*b1cdbd2cSJim Jagielski {
829*b1cdbd2cSJim Jagielski 	sal_Bool bQuote = sal_True;
830*b1cdbd2cSJim Jagielski 	sal_Int32 nLength = rContent.getLength();
831*b1cdbd2cSJim Jagielski 
832*b1cdbd2cSJim Jagielski 	if ( ( nLength == 1 &&
833*b1cdbd2cSJim Jagielski 			lcl_ValidChar( rContent.charAt(0), rParent ) ) ||
834*b1cdbd2cSJim Jagielski 		 ( nLength == 2 &&
835*b1cdbd2cSJim Jagielski 		 	lcl_ValidChar( rContent.charAt(0), rParent ) &&
836*b1cdbd2cSJim Jagielski 		 	rContent.charAt(1) == ' ' ) )
837*b1cdbd2cSJim Jagielski 	{
838*b1cdbd2cSJim Jagielski 		//	don't quote single separator characters like space or percent,
839*b1cdbd2cSJim Jagielski 		//	or separator characters followed by space (used in date formats)
840*b1cdbd2cSJim Jagielski 		bQuote = sal_False;
841*b1cdbd2cSJim Jagielski 	}
842*b1cdbd2cSJim Jagielski 	else if ( rParent.GetType() == XML_TOK_STYLES_PERCENTAGE_STYLE && nLength > 1 )
843*b1cdbd2cSJim Jagielski 	{
844*b1cdbd2cSJim Jagielski 		//	the percent character in percentage styles must be left out of quoting
845*b1cdbd2cSJim Jagielski 		//	(one occurence is enough even if there are several percent characters in the string)
846*b1cdbd2cSJim Jagielski 
847*b1cdbd2cSJim Jagielski 		rtl::OUString aString( rContent.getStr() );
848*b1cdbd2cSJim Jagielski 		sal_Int32 nPos = aString.indexOf( (sal_Unicode) '%' );
849*b1cdbd2cSJim Jagielski 		if ( nPos >= 0 )
850*b1cdbd2cSJim Jagielski 		{
851*b1cdbd2cSJim Jagielski 			if ( nPos + 1 < nLength )
852*b1cdbd2cSJim Jagielski 			{
853*b1cdbd2cSJim Jagielski 				if ( nPos + 2 == nLength && lcl_ValidChar( rContent.charAt(nPos + 1), rParent ) )
854*b1cdbd2cSJim Jagielski 				{
855*b1cdbd2cSJim Jagielski 					//	single character that doesn't need quoting
856*b1cdbd2cSJim Jagielski 				}
857*b1cdbd2cSJim Jagielski 				else
858*b1cdbd2cSJim Jagielski 				{
859*b1cdbd2cSJim Jagielski 					//	quote text behind percent character
860*b1cdbd2cSJim Jagielski 					rContent.insert( nPos + 1, (sal_Unicode) '"' );
861*b1cdbd2cSJim Jagielski 					rContent.append( (sal_Unicode) '"' );
862*b1cdbd2cSJim Jagielski 				}
863*b1cdbd2cSJim Jagielski 			}
864*b1cdbd2cSJim Jagielski 			if ( nPos > 0 )
865*b1cdbd2cSJim Jagielski 			{
866*b1cdbd2cSJim Jagielski 				if ( nPos == 1 && lcl_ValidChar( rContent.charAt(0), rParent ) )
867*b1cdbd2cSJim Jagielski 				{
868*b1cdbd2cSJim Jagielski 					//	single character that doesn't need quoting
869*b1cdbd2cSJim Jagielski 				}
870*b1cdbd2cSJim Jagielski 				else
871*b1cdbd2cSJim Jagielski 				{
872*b1cdbd2cSJim Jagielski 					//	quote text before percent character
873*b1cdbd2cSJim Jagielski 					rContent.insert( nPos, (sal_Unicode) '"' );
874*b1cdbd2cSJim Jagielski 					rContent.insert( 0, (sal_Unicode) '"' );
875*b1cdbd2cSJim Jagielski 				}
876*b1cdbd2cSJim Jagielski 			}
877*b1cdbd2cSJim Jagielski 			bQuote = sal_False;
878*b1cdbd2cSJim Jagielski 		}
879*b1cdbd2cSJim Jagielski 		// else: normal quoting (below)
880*b1cdbd2cSJim Jagielski 	}
881*b1cdbd2cSJim Jagielski 
882*b1cdbd2cSJim Jagielski 	if ( bQuote )
883*b1cdbd2cSJim Jagielski 	{
884*b1cdbd2cSJim Jagielski         // #i55469# quotes in the string itself have to be escaped
885*b1cdbd2cSJim Jagielski         rtl::OUString aString( rContent.getStr() );
886*b1cdbd2cSJim Jagielski         bool bEscape = ( aString.indexOf( (sal_Unicode) '"' ) >= 0 );
887*b1cdbd2cSJim Jagielski         if ( bEscape )
888*b1cdbd2cSJim Jagielski         {
889*b1cdbd2cSJim Jagielski             // A quote is turned into "\"" - a quote to end quoted text, an escaped quote,
890*b1cdbd2cSJim Jagielski             // and a quote to resume quoting.
891*b1cdbd2cSJim Jagielski             rtl::OUString aInsert( rtl::OUString::createFromAscii( "\"\\\"" ) );
892*b1cdbd2cSJim Jagielski 
893*b1cdbd2cSJim Jagielski             sal_Int32 nPos = 0;
894*b1cdbd2cSJim Jagielski             while ( nPos < rContent.getLength() )
895*b1cdbd2cSJim Jagielski             {
896*b1cdbd2cSJim Jagielski                 if ( rContent.charAt( nPos ) == (sal_Unicode) '"' )
897*b1cdbd2cSJim Jagielski                 {
898*b1cdbd2cSJim Jagielski                     rContent.insert( nPos, aInsert );
899*b1cdbd2cSJim Jagielski                     nPos += aInsert.getLength();
900*b1cdbd2cSJim Jagielski                 }
901*b1cdbd2cSJim Jagielski                 ++nPos;
902*b1cdbd2cSJim Jagielski             }
903*b1cdbd2cSJim Jagielski         }
904*b1cdbd2cSJim Jagielski 
905*b1cdbd2cSJim Jagielski 		//	quote string literals
906*b1cdbd2cSJim Jagielski 		rContent.insert( 0, (sal_Unicode) '"' );
907*b1cdbd2cSJim Jagielski 		rContent.append( (sal_Unicode) '"' );
908*b1cdbd2cSJim Jagielski 
909*b1cdbd2cSJim Jagielski         // remove redundant double quotes at start or end
910*b1cdbd2cSJim Jagielski         if ( bEscape )
911*b1cdbd2cSJim Jagielski         {
912*b1cdbd2cSJim Jagielski             if ( rContent.getLength() > 2 &&
913*b1cdbd2cSJim Jagielski                  rContent.charAt(0) == (sal_Unicode) '"' &&
914*b1cdbd2cSJim Jagielski                  rContent.charAt(1) == (sal_Unicode) '"' )
915*b1cdbd2cSJim Jagielski             {
916*b1cdbd2cSJim Jagielski                 String aTrimmed( rContent.makeStringAndClear().copy(2) );
917*b1cdbd2cSJim Jagielski                 rContent = rtl::OUStringBuffer( aTrimmed );
918*b1cdbd2cSJim Jagielski             }
919*b1cdbd2cSJim Jagielski 
920*b1cdbd2cSJim Jagielski             sal_Int32 nLen = rContent.getLength();
921*b1cdbd2cSJim Jagielski             if ( nLen > 2 &&
922*b1cdbd2cSJim Jagielski                  rContent.charAt(nLen-1) == (sal_Unicode) '"' &&
923*b1cdbd2cSJim Jagielski                  rContent.charAt(nLen-2) == (sal_Unicode) '"' )
924*b1cdbd2cSJim Jagielski             {
925*b1cdbd2cSJim Jagielski                 String aTrimmed( rContent.makeStringAndClear().copy( 0, nLen - 2 ) );
926*b1cdbd2cSJim Jagielski                 rContent = rtl::OUStringBuffer( aTrimmed );
927*b1cdbd2cSJim Jagielski             }
928*b1cdbd2cSJim Jagielski         }
929*b1cdbd2cSJim Jagielski 	}
930*b1cdbd2cSJim Jagielski }
931*b1cdbd2cSJim Jagielski 
932*b1cdbd2cSJim Jagielski //
933*b1cdbd2cSJim Jagielski //	SvXMLNumFmtElementContext
934*b1cdbd2cSJim Jagielski //
935*b1cdbd2cSJim Jagielski 
SvXMLNumFmtElementContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const rtl::OUString & rLName,SvXMLNumFormatContext & rParentContext,sal_uInt16 nNewType,const uno::Reference<xml::sax::XAttributeList> & xAttrList)936*b1cdbd2cSJim Jagielski SvXMLNumFmtElementContext::SvXMLNumFmtElementContext( SvXMLImport& rImport,
937*b1cdbd2cSJim Jagielski 									sal_uInt16 nPrfx, const rtl::OUString& rLName,
938*b1cdbd2cSJim Jagielski 									SvXMLNumFormatContext& rParentContext, sal_uInt16 nNewType,
939*b1cdbd2cSJim Jagielski 									const uno::Reference<xml::sax::XAttributeList>& xAttrList ) :
940*b1cdbd2cSJim Jagielski 	SvXMLImportContext( rImport, nPrfx, rLName ),
941*b1cdbd2cSJim Jagielski 	rParent( rParentContext ),
942*b1cdbd2cSJim Jagielski 	nType( nNewType ),
943*b1cdbd2cSJim Jagielski 	nElementLang( LANGUAGE_SYSTEM ),
944*b1cdbd2cSJim Jagielski 	bLong( sal_False ),
945*b1cdbd2cSJim Jagielski 	bTextual( sal_False )
946*b1cdbd2cSJim Jagielski {
947*b1cdbd2cSJim Jagielski 	OUString sLanguage, sCountry;
948*b1cdbd2cSJim Jagielski 	sal_Int32 nAttrVal;
949*b1cdbd2cSJim Jagielski 	sal_Bool bAttrBool;
950*b1cdbd2cSJim Jagielski 	sal_uInt16 nAttrEnum;
951*b1cdbd2cSJim Jagielski 	double fAttrDouble;
952*b1cdbd2cSJim Jagielski 
953*b1cdbd2cSJim Jagielski 	sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
954*b1cdbd2cSJim Jagielski 	for( sal_Int16 i=0; i < nAttrCount; i++ )
955*b1cdbd2cSJim Jagielski 	{
956*b1cdbd2cSJim Jagielski 		OUString sAttrName = xAttrList->getNameByIndex( i );
957*b1cdbd2cSJim Jagielski 		OUString sValue = xAttrList->getValueByIndex( i );
958*b1cdbd2cSJim Jagielski 		OUString aLocalName;
959*b1cdbd2cSJim Jagielski 		sal_uInt16 nPrefix = rImport.GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
960*b1cdbd2cSJim Jagielski 
961*b1cdbd2cSJim Jagielski 		const SvXMLTokenMap& rTokenMap = rParent.GetData()->GetStyleElemAttrTokenMap();
962*b1cdbd2cSJim Jagielski 		sal_uInt16 nToken = rTokenMap.Get( nPrefix, aLocalName );
963*b1cdbd2cSJim Jagielski 
964*b1cdbd2cSJim Jagielski 		switch (nToken)
965*b1cdbd2cSJim Jagielski 		{
966*b1cdbd2cSJim Jagielski 			case XML_TOK_ELEM_ATTR_DECIMAL_PLACES:
967*b1cdbd2cSJim Jagielski 				if ( SvXMLUnitConverter::convertNumber( nAttrVal, sValue, 0 ) )
968*b1cdbd2cSJim Jagielski 					aNumInfo.nDecimals = nAttrVal;
969*b1cdbd2cSJim Jagielski 				break;
970*b1cdbd2cSJim Jagielski 			case XML_TOK_ELEM_ATTR_MIN_INTEGER_DIGITS:
971*b1cdbd2cSJim Jagielski 				if ( SvXMLUnitConverter::convertNumber( nAttrVal, sValue, 0 ) )
972*b1cdbd2cSJim Jagielski 					aNumInfo.nInteger = nAttrVal;
973*b1cdbd2cSJim Jagielski 				break;
974*b1cdbd2cSJim Jagielski 			case XML_TOK_ELEM_ATTR_GROUPING:
975*b1cdbd2cSJim Jagielski 				if ( SvXMLUnitConverter::convertBool( bAttrBool, sValue ) )
976*b1cdbd2cSJim Jagielski 					aNumInfo.bGrouping = bAttrBool;
977*b1cdbd2cSJim Jagielski 				break;
978*b1cdbd2cSJim Jagielski 			case XML_TOK_ELEM_ATTR_DISPLAY_FACTOR:
979*b1cdbd2cSJim Jagielski 				if ( SvXMLUnitConverter::convertDouble( fAttrDouble, sValue ) )
980*b1cdbd2cSJim Jagielski 					aNumInfo.fDisplayFactor = fAttrDouble;
981*b1cdbd2cSJim Jagielski 				break;
982*b1cdbd2cSJim Jagielski 			case XML_TOK_ELEM_ATTR_DECIMAL_REPLACEMENT:
983*b1cdbd2cSJim Jagielski 				if ( sValue.getLength() > 0 )
984*b1cdbd2cSJim Jagielski 					aNumInfo.bDecReplace = sal_True;	// only a default string is supported
985*b1cdbd2cSJim Jagielski 				else
986*b1cdbd2cSJim Jagielski 					aNumInfo.bVarDecimals = sal_True;	// empty replacement string: variable decimals
987*b1cdbd2cSJim Jagielski 				break;
988*b1cdbd2cSJim Jagielski 			case XML_TOK_ELEM_ATTR_MIN_EXPONENT_DIGITS:
989*b1cdbd2cSJim Jagielski 				if ( SvXMLUnitConverter::convertNumber( nAttrVal, sValue, 0 ) )
990*b1cdbd2cSJim Jagielski 					aNumInfo.nExpDigits = nAttrVal;
991*b1cdbd2cSJim Jagielski 				break;
992*b1cdbd2cSJim Jagielski 			case XML_TOK_ELEM_ATTR_MIN_NUMERATOR_DIGITS:
993*b1cdbd2cSJim Jagielski 				if ( SvXMLUnitConverter::convertNumber( nAttrVal, sValue, 0 ) )
994*b1cdbd2cSJim Jagielski 					aNumInfo.nNumerDigits = nAttrVal;
995*b1cdbd2cSJim Jagielski 				break;
996*b1cdbd2cSJim Jagielski 			case XML_TOK_ELEM_ATTR_MIN_DENOMINATOR_DIGITS:
997*b1cdbd2cSJim Jagielski 				if ( SvXMLUnitConverter::convertNumber( nAttrVal, sValue, 0 ) )
998*b1cdbd2cSJim Jagielski 					aNumInfo.nDenomDigits = nAttrVal;
999*b1cdbd2cSJim Jagielski 				break;
1000*b1cdbd2cSJim Jagielski 			case XML_TOK_ELEM_ATTR_LANGUAGE:
1001*b1cdbd2cSJim Jagielski 				sLanguage = sValue;
1002*b1cdbd2cSJim Jagielski 				break;
1003*b1cdbd2cSJim Jagielski 			case XML_TOK_ELEM_ATTR_COUNTRY:
1004*b1cdbd2cSJim Jagielski 				sCountry = sValue;
1005*b1cdbd2cSJim Jagielski 				break;
1006*b1cdbd2cSJim Jagielski 			case XML_TOK_ELEM_ATTR_STYLE:
1007*b1cdbd2cSJim Jagielski 				if ( SvXMLUnitConverter::convertEnum( nAttrEnum, sValue, aStyleValueMap ) )
1008*b1cdbd2cSJim Jagielski 					bLong = (sal_Bool) nAttrEnum;
1009*b1cdbd2cSJim Jagielski 				break;
1010*b1cdbd2cSJim Jagielski 			case XML_TOK_ELEM_ATTR_TEXTUAL:
1011*b1cdbd2cSJim Jagielski 				if ( SvXMLUnitConverter::convertBool( bAttrBool, sValue ) )
1012*b1cdbd2cSJim Jagielski 					bTextual = bAttrBool;
1013*b1cdbd2cSJim Jagielski 				break;
1014*b1cdbd2cSJim Jagielski 			case XML_TOK_ELEM_ATTR_CALENDAR:
1015*b1cdbd2cSJim Jagielski 				sCalendar = sValue;
1016*b1cdbd2cSJim Jagielski 				break;
1017*b1cdbd2cSJim Jagielski 		}
1018*b1cdbd2cSJim Jagielski 	}
1019*b1cdbd2cSJim Jagielski 
1020*b1cdbd2cSJim Jagielski 	if ( sLanguage.getLength() || sCountry.getLength() )
1021*b1cdbd2cSJim Jagielski 	{
1022*b1cdbd2cSJim Jagielski 		nElementLang = MsLangId::convertIsoNamesToLanguage( sLanguage, sCountry );
1023*b1cdbd2cSJim Jagielski 		if ( nElementLang == LANGUAGE_DONTKNOW )
1024*b1cdbd2cSJim Jagielski 			nElementLang = LANGUAGE_SYSTEM;			//! error handling for invalid locales?
1025*b1cdbd2cSJim Jagielski 	}
1026*b1cdbd2cSJim Jagielski }
1027*b1cdbd2cSJim Jagielski 
~SvXMLNumFmtElementContext()1028*b1cdbd2cSJim Jagielski SvXMLNumFmtElementContext::~SvXMLNumFmtElementContext()
1029*b1cdbd2cSJim Jagielski {
1030*b1cdbd2cSJim Jagielski }
1031*b1cdbd2cSJim Jagielski 
CreateChildContext(sal_uInt16 nPrfx,const rtl::OUString & rLName,const uno::Reference<xml::sax::XAttributeList> & xAttrList)1032*b1cdbd2cSJim Jagielski SvXMLImportContext* SvXMLNumFmtElementContext::CreateChildContext(
1033*b1cdbd2cSJim Jagielski 									sal_uInt16 nPrfx, const rtl::OUString& rLName,
1034*b1cdbd2cSJim Jagielski 									const uno::Reference<xml::sax::XAttributeList>& xAttrList )
1035*b1cdbd2cSJim Jagielski {
1036*b1cdbd2cSJim Jagielski 	//	only number:number supports number:embedded-text child element
1037*b1cdbd2cSJim Jagielski 
1038*b1cdbd2cSJim Jagielski 	if ( nType == XML_TOK_STYLE_NUMBER &&
1039*b1cdbd2cSJim Jagielski 		 nPrfx == XML_NAMESPACE_NUMBER && IsXMLToken( rLName, XML_EMBEDDED_TEXT ) )
1040*b1cdbd2cSJim Jagielski 	{
1041*b1cdbd2cSJim Jagielski 		return new SvXMLNumFmtEmbeddedTextContext( GetImport(), nPrfx, rLName, *this, xAttrList );
1042*b1cdbd2cSJim Jagielski 	}
1043*b1cdbd2cSJim Jagielski 	else
1044*b1cdbd2cSJim Jagielski 		return new SvXMLImportContext( GetImport(), nPrfx, rLName );
1045*b1cdbd2cSJim Jagielski }
1046*b1cdbd2cSJim Jagielski 
Characters(const rtl::OUString & rChars)1047*b1cdbd2cSJim Jagielski void SvXMLNumFmtElementContext::Characters( const rtl::OUString& rChars )
1048*b1cdbd2cSJim Jagielski {
1049*b1cdbd2cSJim Jagielski 	aContent.append( rChars );
1050*b1cdbd2cSJim Jagielski }
1051*b1cdbd2cSJim Jagielski 
AddEmbeddedElement(sal_Int32 nFormatPos,const rtl::OUString & rContent)1052*b1cdbd2cSJim Jagielski void SvXMLNumFmtElementContext::AddEmbeddedElement( sal_Int32 nFormatPos, const rtl::OUString& rContent )
1053*b1cdbd2cSJim Jagielski {
1054*b1cdbd2cSJim Jagielski 	if ( rContent.getLength() )
1055*b1cdbd2cSJim Jagielski 	{
1056*b1cdbd2cSJim Jagielski 		SvXMLEmbeddedElement* pObj = new SvXMLEmbeddedElement( nFormatPos, rContent );
1057*b1cdbd2cSJim Jagielski 		if ( !aNumInfo.aEmbeddedElements.Insert( pObj ) )
1058*b1cdbd2cSJim Jagielski 		{
1059*b1cdbd2cSJim Jagielski 			//	there's already an element at this position - append text to existing element
1060*b1cdbd2cSJim Jagielski 
1061*b1cdbd2cSJim Jagielski 			delete pObj;
1062*b1cdbd2cSJim Jagielski 			sal_uInt16 nElementCount = aNumInfo.aEmbeddedElements.Count();
1063*b1cdbd2cSJim Jagielski 			for (sal_uInt16 i=0; i<nElementCount; i++)
1064*b1cdbd2cSJim Jagielski 			{
1065*b1cdbd2cSJim Jagielski 				pObj = aNumInfo.aEmbeddedElements[i];
1066*b1cdbd2cSJim Jagielski 				if ( pObj->nFormatPos == nFormatPos )
1067*b1cdbd2cSJim Jagielski 				{
1068*b1cdbd2cSJim Jagielski 					pObj->aText += rContent;
1069*b1cdbd2cSJim Jagielski 					break;
1070*b1cdbd2cSJim Jagielski 				}
1071*b1cdbd2cSJim Jagielski 			}
1072*b1cdbd2cSJim Jagielski 		}
1073*b1cdbd2cSJim Jagielski 	}
1074*b1cdbd2cSJim Jagielski }
1075*b1cdbd2cSJim Jagielski 
EndElement()1076*b1cdbd2cSJim Jagielski void SvXMLNumFmtElementContext::EndElement()
1077*b1cdbd2cSJim Jagielski {
1078*b1cdbd2cSJim Jagielski 	sal_Bool bEffLong = bLong;
1079*b1cdbd2cSJim Jagielski 	switch (nType)
1080*b1cdbd2cSJim Jagielski 	{
1081*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLE_TEXT:
1082*b1cdbd2cSJim Jagielski 			if ( rParent.HasLongDoW() &&
1083*b1cdbd2cSJim Jagielski 					rParent.GetLocaleData().getLongDateDayOfWeekSep() ==
1084*b1cdbd2cSJim Jagielski 						String( aContent.getStr() ) )
1085*b1cdbd2cSJim Jagielski 			{
1086*b1cdbd2cSJim Jagielski 				//	skip separator constant after long day of week
1087*b1cdbd2cSJim Jagielski 				//	(NF_KEY_NNNN contains the separator)
1088*b1cdbd2cSJim Jagielski 
1089*b1cdbd2cSJim Jagielski 				if ( rParent.ReplaceNfKeyword( NF_KEY_NNN, NF_KEY_NNNN ) )
1090*b1cdbd2cSJim Jagielski 				{
1091*b1cdbd2cSJim Jagielski 					//!aContent.setLength(0);		//! doesn't work, #76293#
1092*b1cdbd2cSJim Jagielski 					aContent = OUStringBuffer();
1093*b1cdbd2cSJim Jagielski 				}
1094*b1cdbd2cSJim Jagielski 
1095*b1cdbd2cSJim Jagielski 				rParent.SetHasLongDoW( sal_False );		// only once
1096*b1cdbd2cSJim Jagielski 			}
1097*b1cdbd2cSJim Jagielski 			if ( aContent.getLength() )
1098*b1cdbd2cSJim Jagielski 			{
1099*b1cdbd2cSJim Jagielski 				lcl_EnquoteIfNecessary( aContent, rParent );
1100*b1cdbd2cSJim Jagielski 				rParent.AddToCode( aContent.makeStringAndClear() );
1101*b1cdbd2cSJim Jagielski 			}
1102*b1cdbd2cSJim Jagielski 			break;
1103*b1cdbd2cSJim Jagielski 
1104*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLE_NUMBER:
1105*b1cdbd2cSJim Jagielski 			rParent.AddNumber( aNumInfo );
1106*b1cdbd2cSJim Jagielski 			break;
1107*b1cdbd2cSJim Jagielski 
1108*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLE_CURRENCY_SYMBOL:
1109*b1cdbd2cSJim Jagielski 			rParent.AddCurrency( aContent.makeStringAndClear(), nElementLang );
1110*b1cdbd2cSJim Jagielski 			break;
1111*b1cdbd2cSJim Jagielski 
1112*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLE_TEXT_CONTENT:
1113*b1cdbd2cSJim Jagielski 			rParent.AddToCode( OUString::valueOf((sal_Unicode)'@') );
1114*b1cdbd2cSJim Jagielski 			break;
1115*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLE_BOOLEAN:
1116*b1cdbd2cSJim Jagielski 			// ignored - only default boolean format is supported
1117*b1cdbd2cSJim Jagielski 			break;
1118*b1cdbd2cSJim Jagielski 
1119*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLE_DAY:
1120*b1cdbd2cSJim Jagielski 			rParent.UpdateCalendar( sCalendar );
1121*b1cdbd2cSJim Jagielski #if 0
1122*b1cdbd2cSJim Jagielski //! I18N doesn't provide SYSTEM or extended date information yet
1123*b1cdbd2cSJim Jagielski 			if ( rParent.IsFromSystem() )
1124*b1cdbd2cSJim Jagielski 				bEffLong = SvXMLNumFmtDefaults::IsSystemLongDay( rParent.GetInternational(), bLong );
1125*b1cdbd2cSJim Jagielski #endif
1126*b1cdbd2cSJim Jagielski 			rParent.AddNfKeyword(
1127*b1cdbd2cSJim Jagielski                 sal::static_int_cast< sal_uInt16 >(
1128*b1cdbd2cSJim Jagielski                     bEffLong ? NF_KEY_DD : NF_KEY_D ) );
1129*b1cdbd2cSJim Jagielski 			break;
1130*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLE_MONTH:
1131*b1cdbd2cSJim Jagielski 			rParent.UpdateCalendar( sCalendar );
1132*b1cdbd2cSJim Jagielski #if 0
1133*b1cdbd2cSJim Jagielski //! I18N doesn't provide SYSTEM or extended date information yet
1134*b1cdbd2cSJim Jagielski 			if ( rParent.IsFromSystem() )
1135*b1cdbd2cSJim Jagielski 			{
1136*b1cdbd2cSJim Jagielski 				bEffLong = SvXMLNumFmtDefaults::IsSystemLongMonth( rParent.GetInternational(), bLong );
1137*b1cdbd2cSJim Jagielski 				bTextual = SvXMLNumFmtDefaults::IsSystemTextualMonth( rParent.GetInternational(), bLong );
1138*b1cdbd2cSJim Jagielski 			}
1139*b1cdbd2cSJim Jagielski #endif
1140*b1cdbd2cSJim Jagielski 			rParent.AddNfKeyword(
1141*b1cdbd2cSJim Jagielski                 sal::static_int_cast< sal_uInt16 >(
1142*b1cdbd2cSJim Jagielski                     bTextual
1143*b1cdbd2cSJim Jagielski                     ? ( bEffLong ? NF_KEY_MMMM : NF_KEY_MMM )
1144*b1cdbd2cSJim Jagielski                     : ( bEffLong ? NF_KEY_MM : NF_KEY_M ) ) );
1145*b1cdbd2cSJim Jagielski 			break;
1146*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLE_YEAR:
1147*b1cdbd2cSJim Jagielski 			rParent.UpdateCalendar( sCalendar );
1148*b1cdbd2cSJim Jagielski #if 0
1149*b1cdbd2cSJim Jagielski //! I18N doesn't provide SYSTEM or extended date information yet
1150*b1cdbd2cSJim Jagielski 			if ( rParent.IsFromSystem() )
1151*b1cdbd2cSJim Jagielski 				bEffLong = SvXMLNumFmtDefaults::IsSystemLongYear( rParent.GetInternational(), bLong );
1152*b1cdbd2cSJim Jagielski #endif
1153*b1cdbd2cSJim Jagielski 			// Y after G (era) is replaced by E
1154*b1cdbd2cSJim Jagielski 			if ( rParent.HasEra() )
1155*b1cdbd2cSJim Jagielski 				rParent.AddNfKeyword(
1156*b1cdbd2cSJim Jagielski                     sal::static_int_cast< sal_uInt16 >(
1157*b1cdbd2cSJim Jagielski                         bEffLong ? NF_KEY_EEC : NF_KEY_EC ) );
1158*b1cdbd2cSJim Jagielski 			else
1159*b1cdbd2cSJim Jagielski 				rParent.AddNfKeyword(
1160*b1cdbd2cSJim Jagielski                     sal::static_int_cast< sal_uInt16 >(
1161*b1cdbd2cSJim Jagielski                         bEffLong ? NF_KEY_YYYY : NF_KEY_YY ) );
1162*b1cdbd2cSJim Jagielski 			break;
1163*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLE_ERA:
1164*b1cdbd2cSJim Jagielski 			rParent.UpdateCalendar( sCalendar );
1165*b1cdbd2cSJim Jagielski #if 0
1166*b1cdbd2cSJim Jagielski //! I18N doesn't provide SYSTEM or extended date information yet
1167*b1cdbd2cSJim Jagielski 			if ( rParent.IsFromSystem() )
1168*b1cdbd2cSJim Jagielski 				bEffLong = SvXMLNumFmtDefaults::IsSystemLongEra( rParent.GetInternational(), bLong );
1169*b1cdbd2cSJim Jagielski #endif
1170*b1cdbd2cSJim Jagielski 			rParent.AddNfKeyword(
1171*b1cdbd2cSJim Jagielski                 sal::static_int_cast< sal_uInt16 >(
1172*b1cdbd2cSJim Jagielski                     bEffLong ? NF_KEY_GGG : NF_KEY_G ) );
1173*b1cdbd2cSJim Jagielski 			//	HasEra flag is set
1174*b1cdbd2cSJim Jagielski 			break;
1175*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLE_DAY_OF_WEEK:
1176*b1cdbd2cSJim Jagielski 			rParent.UpdateCalendar( sCalendar );
1177*b1cdbd2cSJim Jagielski #if 0
1178*b1cdbd2cSJim Jagielski //! I18N doesn't provide SYSTEM or extended date information yet
1179*b1cdbd2cSJim Jagielski 			if ( rParent.IsFromSystem() )
1180*b1cdbd2cSJim Jagielski 				bEffLong = SvXMLNumFmtDefaults::IsSystemLongDayOfWeek( rParent.GetInternational(), bLong );
1181*b1cdbd2cSJim Jagielski #endif
1182*b1cdbd2cSJim Jagielski 			rParent.AddNfKeyword(
1183*b1cdbd2cSJim Jagielski                 sal::static_int_cast< sal_uInt16 >(
1184*b1cdbd2cSJim Jagielski                     bEffLong ? NF_KEY_NNNN : NF_KEY_NN ) );
1185*b1cdbd2cSJim Jagielski 			break;
1186*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLE_WEEK_OF_YEAR:
1187*b1cdbd2cSJim Jagielski 			rParent.UpdateCalendar( sCalendar );
1188*b1cdbd2cSJim Jagielski 			rParent.AddNfKeyword( NF_KEY_WW );
1189*b1cdbd2cSJim Jagielski 			break;
1190*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLE_QUARTER:
1191*b1cdbd2cSJim Jagielski 			rParent.UpdateCalendar( sCalendar );
1192*b1cdbd2cSJim Jagielski 			rParent.AddNfKeyword(
1193*b1cdbd2cSJim Jagielski                 sal::static_int_cast< sal_uInt16 >(
1194*b1cdbd2cSJim Jagielski                     bEffLong ? NF_KEY_QQ : NF_KEY_Q ) );
1195*b1cdbd2cSJim Jagielski 			break;
1196*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLE_HOURS:
1197*b1cdbd2cSJim Jagielski 			rParent.AddNfKeyword(
1198*b1cdbd2cSJim Jagielski                 sal::static_int_cast< sal_uInt16 >(
1199*b1cdbd2cSJim Jagielski                     bEffLong ? NF_KEY_HH : NF_KEY_H ) );
1200*b1cdbd2cSJim Jagielski 			break;
1201*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLE_AM_PM:
1202*b1cdbd2cSJim Jagielski 			//!	short/long?
1203*b1cdbd2cSJim Jagielski 			rParent.AddNfKeyword( NF_KEY_AMPM );
1204*b1cdbd2cSJim Jagielski 			break;
1205*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLE_MINUTES:
1206*b1cdbd2cSJim Jagielski 			rParent.AddNfKeyword(
1207*b1cdbd2cSJim Jagielski                 sal::static_int_cast< sal_uInt16 >(
1208*b1cdbd2cSJim Jagielski                     bEffLong ? NF_KEY_MMI : NF_KEY_MI ) );
1209*b1cdbd2cSJim Jagielski 			break;
1210*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLE_SECONDS:
1211*b1cdbd2cSJim Jagielski 			rParent.AddNfKeyword(
1212*b1cdbd2cSJim Jagielski                 sal::static_int_cast< sal_uInt16 >(
1213*b1cdbd2cSJim Jagielski                     bEffLong ? NF_KEY_SS : NF_KEY_S ) );
1214*b1cdbd2cSJim Jagielski 			if ( aNumInfo.nDecimals > 0 )
1215*b1cdbd2cSJim Jagielski 			{
1216*b1cdbd2cSJim Jagielski 				//	manually add the decimal places
1217*b1cdbd2cSJim Jagielski 				const String& rSep = rParent.GetLocaleData().getNumDecimalSep();
1218*b1cdbd2cSJim Jagielski 				for ( xub_StrLen j=0; j<rSep.Len(); j++ )
1219*b1cdbd2cSJim Jagielski 				{
1220*b1cdbd2cSJim Jagielski 					rParent.AddToCode( OUString::valueOf( rSep.GetChar(j) ) );
1221*b1cdbd2cSJim Jagielski 				}
1222*b1cdbd2cSJim Jagielski 				for (sal_Int32 i=0; i<aNumInfo.nDecimals; i++)
1223*b1cdbd2cSJim Jagielski 					rParent.AddToCode( OUString::valueOf((sal_Unicode)'0') );
1224*b1cdbd2cSJim Jagielski 			}
1225*b1cdbd2cSJim Jagielski 			break;
1226*b1cdbd2cSJim Jagielski 
1227*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLE_FRACTION:
1228*b1cdbd2cSJim Jagielski 			{
1229*b1cdbd2cSJim Jagielski                 if ( aNumInfo.nInteger >= 0 )
1230*b1cdbd2cSJim Jagielski                 {
1231*b1cdbd2cSJim Jagielski                     // add integer part only if min-integer-digits attribute is there
1232*b1cdbd2cSJim Jagielski                     aNumInfo.nDecimals = 0;
1233*b1cdbd2cSJim Jagielski                     rParent.AddNumber( aNumInfo );      // number without decimals
1234*b1cdbd2cSJim Jagielski                     rParent.AddToCode( OUString::valueOf((sal_Unicode)' ') );
1235*b1cdbd2cSJim Jagielski                 }
1236*b1cdbd2cSJim Jagielski 
1237*b1cdbd2cSJim Jagielski 				//!	build string and add at once
1238*b1cdbd2cSJim Jagielski 
1239*b1cdbd2cSJim Jagielski 				sal_Int32 i;
1240*b1cdbd2cSJim Jagielski 				for (i=0; i<aNumInfo.nNumerDigits; i++)
1241*b1cdbd2cSJim Jagielski 					rParent.AddToCode( OUString::valueOf((sal_Unicode)'?') );
1242*b1cdbd2cSJim Jagielski 				rParent.AddToCode( OUString::valueOf((sal_Unicode)'/') );
1243*b1cdbd2cSJim Jagielski 				for (i=0; i<aNumInfo.nDenomDigits; i++)
1244*b1cdbd2cSJim Jagielski 					rParent.AddToCode( OUString::valueOf((sal_Unicode)'?') );
1245*b1cdbd2cSJim Jagielski 			}
1246*b1cdbd2cSJim Jagielski 			break;
1247*b1cdbd2cSJim Jagielski 
1248*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLE_SCIENTIFIC_NUMBER:
1249*b1cdbd2cSJim Jagielski 			{
1250*b1cdbd2cSJim Jagielski 				rParent.AddNumber( aNumInfo );		// simple number
1251*b1cdbd2cSJim Jagielski 
1252*b1cdbd2cSJim Jagielski 				rParent.AddToCode( OUString::createFromAscii( "E+" ) );
1253*b1cdbd2cSJim Jagielski 				for (sal_Int32 i=0; i<aNumInfo.nExpDigits; i++)
1254*b1cdbd2cSJim Jagielski 					rParent.AddToCode( OUString::valueOf((sal_Unicode)'0') );
1255*b1cdbd2cSJim Jagielski 			}
1256*b1cdbd2cSJim Jagielski 			break;
1257*b1cdbd2cSJim Jagielski 
1258*b1cdbd2cSJim Jagielski 		default:
1259*b1cdbd2cSJim Jagielski 			DBG_ERROR("invalid element ID");
1260*b1cdbd2cSJim Jagielski 	}
1261*b1cdbd2cSJim Jagielski }
1262*b1cdbd2cSJim Jagielski 
1263*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------
1264*b1cdbd2cSJim Jagielski 
IsSystemLongDay(const SvtSysLocale &,sal_Bool bLong)1265*b1cdbd2cSJim Jagielski sal_Bool SvXMLNumFmtDefaults::IsSystemLongDay( const SvtSysLocale&, sal_Bool bLong )
1266*b1cdbd2cSJim Jagielski {
1267*b1cdbd2cSJim Jagielski     // TODO: merge system information and defaults into i18n locale data
1268*b1cdbd2cSJim Jagielski #if 0
1269*b1cdbd2cSJim Jagielski 	return bLong ? rIntn.IsLongDateDayLeadingZero() : rIntn.IsDateDayLeadingZero();
1270*b1cdbd2cSJim Jagielski #else
1271*b1cdbd2cSJim Jagielski     return !bLong;
1272*b1cdbd2cSJim Jagielski #endif
1273*b1cdbd2cSJim Jagielski }
1274*b1cdbd2cSJim Jagielski 
IsSystemLongMonth(const SvtSysLocale &,sal_Bool bLong)1275*b1cdbd2cSJim Jagielski sal_Bool SvXMLNumFmtDefaults::IsSystemLongMonth( const SvtSysLocale&, sal_Bool bLong )
1276*b1cdbd2cSJim Jagielski {
1277*b1cdbd2cSJim Jagielski     // TODO: merge system information and defaults into i18n locale data
1278*b1cdbd2cSJim Jagielski #if 0
1279*b1cdbd2cSJim Jagielski 	if (bLong)
1280*b1cdbd2cSJim Jagielski 	{
1281*b1cdbd2cSJim Jagielski 		MonthFormat eMonth = rIntn.GetLongDateMonthFormat();
1282*b1cdbd2cSJim Jagielski 		return ( eMonth == MONTH_ZERO || eMonth == MONTH_LONG );
1283*b1cdbd2cSJim Jagielski 	}
1284*b1cdbd2cSJim Jagielski 	else
1285*b1cdbd2cSJim Jagielski 		return rIntn.IsDateMonthLeadingZero();
1286*b1cdbd2cSJim Jagielski #else
1287*b1cdbd2cSJim Jagielski     return !bLong;
1288*b1cdbd2cSJim Jagielski #endif
1289*b1cdbd2cSJim Jagielski }
1290*b1cdbd2cSJim Jagielski 
IsSystemTextualMonth(const SvtSysLocale &,sal_Bool bLong)1291*b1cdbd2cSJim Jagielski sal_Bool SvXMLNumFmtDefaults::IsSystemTextualMonth( const SvtSysLocale&, sal_Bool bLong )
1292*b1cdbd2cSJim Jagielski {
1293*b1cdbd2cSJim Jagielski     // TODO: merge system information and defaults into i18n locale data
1294*b1cdbd2cSJim Jagielski #if 0
1295*b1cdbd2cSJim Jagielski 	if (bLong)
1296*b1cdbd2cSJim Jagielski 	{
1297*b1cdbd2cSJim Jagielski 		MonthFormat eMonth = rIntn.GetLongDateMonthFormat();
1298*b1cdbd2cSJim Jagielski 		return ( eMonth == MONTH_SHORT || eMonth == MONTH_LONG );
1299*b1cdbd2cSJim Jagielski 	}
1300*b1cdbd2cSJim Jagielski 	else
1301*b1cdbd2cSJim Jagielski 		return sal_False;
1302*b1cdbd2cSJim Jagielski #else
1303*b1cdbd2cSJim Jagielski     return bLong;
1304*b1cdbd2cSJim Jagielski #endif
1305*b1cdbd2cSJim Jagielski }
1306*b1cdbd2cSJim Jagielski 
IsSystemLongYear(const SvtSysLocale &,sal_Bool bLong)1307*b1cdbd2cSJim Jagielski sal_Bool SvXMLNumFmtDefaults::IsSystemLongYear( const SvtSysLocale&, sal_Bool bLong )
1308*b1cdbd2cSJim Jagielski {
1309*b1cdbd2cSJim Jagielski     // TODO: merge system information and defaults into i18n locale data
1310*b1cdbd2cSJim Jagielski #if 0
1311*b1cdbd2cSJim Jagielski 	return bLong ? rIntn.IsLongDateCentury() : rIntn.IsDateCentury();
1312*b1cdbd2cSJim Jagielski #else
1313*b1cdbd2cSJim Jagielski     return bLong;
1314*b1cdbd2cSJim Jagielski #endif
1315*b1cdbd2cSJim Jagielski }
1316*b1cdbd2cSJim Jagielski 
IsSystemLongEra(const SvtSysLocale & rSysLoc,sal_Bool bLong)1317*b1cdbd2cSJim Jagielski sal_Bool SvXMLNumFmtDefaults::IsSystemLongEra( const SvtSysLocale& rSysLoc, sal_Bool bLong )
1318*b1cdbd2cSJim Jagielski {
1319*b1cdbd2cSJim Jagielski     // TODO: merge system information and defaults into i18n locale data
1320*b1cdbd2cSJim Jagielski 	return IsSystemLongYear( rSysLoc, bLong );		// no separate setting
1321*b1cdbd2cSJim Jagielski }
1322*b1cdbd2cSJim Jagielski 
IsSystemLongDayOfWeek(const SvtSysLocale &,sal_Bool bLong)1323*b1cdbd2cSJim Jagielski sal_Bool SvXMLNumFmtDefaults::IsSystemLongDayOfWeek( const SvtSysLocale&, sal_Bool bLong )
1324*b1cdbd2cSJim Jagielski {
1325*b1cdbd2cSJim Jagielski     // TODO: merge system information and defaults into i18n locale data
1326*b1cdbd2cSJim Jagielski #if 0
1327*b1cdbd2cSJim Jagielski 	return ( bLong && rIntn.GetLongDateDayOfWeekFormat() == DAYOFWEEK_LONG );
1328*b1cdbd2cSJim Jagielski #else
1329*b1cdbd2cSJim Jagielski     return bLong && true;
1330*b1cdbd2cSJim Jagielski #endif
1331*b1cdbd2cSJim Jagielski }
1332*b1cdbd2cSJim Jagielski 
GetDefaultDateFormat(SvXMLDateElementAttributes eDOW,SvXMLDateElementAttributes eDay,SvXMLDateElementAttributes eMonth,SvXMLDateElementAttributes eYear,SvXMLDateElementAttributes eHours,SvXMLDateElementAttributes eMins,SvXMLDateElementAttributes eSecs,sal_Bool bSystem)1333*b1cdbd2cSJim Jagielski sal_uInt16 SvXMLNumFmtDefaults::GetDefaultDateFormat( SvXMLDateElementAttributes eDOW,
1334*b1cdbd2cSJim Jagielski 				SvXMLDateElementAttributes eDay, SvXMLDateElementAttributes eMonth,
1335*b1cdbd2cSJim Jagielski 				SvXMLDateElementAttributes eYear, SvXMLDateElementAttributes eHours,
1336*b1cdbd2cSJim Jagielski 				SvXMLDateElementAttributes eMins, SvXMLDateElementAttributes eSecs,
1337*b1cdbd2cSJim Jagielski 				sal_Bool bSystem )
1338*b1cdbd2cSJim Jagielski {
1339*b1cdbd2cSJim Jagielski 	const sal_uInt16 nCount = sizeof(aDefaultDateFormats) / sizeof(SvXMLDefaultDateFormat);
1340*b1cdbd2cSJim Jagielski 	for (sal_uInt16 nPos=0; nPos<nCount; nPos++)
1341*b1cdbd2cSJim Jagielski 	{
1342*b1cdbd2cSJim Jagielski 		const SvXMLDefaultDateFormat& rEntry = aDefaultDateFormats[nPos];
1343*b1cdbd2cSJim Jagielski 		if ( bSystem == rEntry.bSystem &&
1344*b1cdbd2cSJim Jagielski 			( eDOW   == rEntry.eDOW   || ( rEntry.eDOW   == XML_DEA_ANY && eDOW   != XML_DEA_NONE ) ) &&
1345*b1cdbd2cSJim Jagielski 			( eDay   == rEntry.eDay   || ( rEntry.eDay   == XML_DEA_ANY && eDay   != XML_DEA_NONE ) ) &&
1346*b1cdbd2cSJim Jagielski 			( eMonth == rEntry.eMonth || ( rEntry.eMonth == XML_DEA_ANY && eMonth != XML_DEA_NONE ) ) &&
1347*b1cdbd2cSJim Jagielski 			( eYear  == rEntry.eYear  || ( rEntry.eYear  == XML_DEA_ANY && eYear  != XML_DEA_NONE ) ) &&
1348*b1cdbd2cSJim Jagielski 			( eHours == rEntry.eHours || ( rEntry.eHours == XML_DEA_ANY && eHours != XML_DEA_NONE ) ) &&
1349*b1cdbd2cSJim Jagielski 			( eMins  == rEntry.eMins  || ( rEntry.eMins  == XML_DEA_ANY && eMins  != XML_DEA_NONE ) ) &&
1350*b1cdbd2cSJim Jagielski 			( eSecs  == rEntry.eSecs  || ( rEntry.eSecs  == XML_DEA_ANY && eSecs  != XML_DEA_NONE ) ) )
1351*b1cdbd2cSJim Jagielski 		{
1352*b1cdbd2cSJim Jagielski 			return sal::static_int_cast< sal_uInt16 >(rEntry.eFormat);
1353*b1cdbd2cSJim Jagielski 		}
1354*b1cdbd2cSJim Jagielski 	}
1355*b1cdbd2cSJim Jagielski 
1356*b1cdbd2cSJim Jagielski 	return NF_INDEX_TABLE_ENTRIES;	// invalid
1357*b1cdbd2cSJim Jagielski }
1358*b1cdbd2cSJim Jagielski 
1359*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------
1360*b1cdbd2cSJim Jagielski 
1361*b1cdbd2cSJim Jagielski //
1362*b1cdbd2cSJim Jagielski //	SvXMLNumFormatContext
1363*b1cdbd2cSJim Jagielski //
1364*b1cdbd2cSJim Jagielski 
SvXMLNumFormatContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const rtl::OUString & rLName,SvXMLNumImpData * pNewData,sal_uInt16 nNewType,const uno::Reference<xml::sax::XAttributeList> & xAttrList,SvXMLStylesContext & rStyles)1365*b1cdbd2cSJim Jagielski SvXMLNumFormatContext::SvXMLNumFormatContext( SvXMLImport& rImport,
1366*b1cdbd2cSJim Jagielski 									sal_uInt16 nPrfx, const rtl::OUString& rLName,
1367*b1cdbd2cSJim Jagielski 									SvXMLNumImpData* pNewData, sal_uInt16 nNewType,
1368*b1cdbd2cSJim Jagielski 									const uno::Reference<xml::sax::XAttributeList>& xAttrList,
1369*b1cdbd2cSJim Jagielski 									SvXMLStylesContext& rStyles ) :
1370*b1cdbd2cSJim Jagielski 	SvXMLStyleContext( rImport, nPrfx, rLName, xAttrList ),
1371*b1cdbd2cSJim Jagielski 	pData( pNewData ),
1372*b1cdbd2cSJim Jagielski 	pStyles( &rStyles ),
1373*b1cdbd2cSJim Jagielski 	aMyConditions(),
1374*b1cdbd2cSJim Jagielski 	nType( nNewType ),
1375*b1cdbd2cSJim Jagielski 	nKey(-1),
1376*b1cdbd2cSJim Jagielski 	nFormatLang( LANGUAGE_SYSTEM ),
1377*b1cdbd2cSJim Jagielski 	bAutoOrder( sal_False ),
1378*b1cdbd2cSJim Jagielski 	bFromSystem( sal_False ),
1379*b1cdbd2cSJim Jagielski 	bTruncate( sal_True ),
1380*b1cdbd2cSJim Jagielski 	bAutoDec( sal_False ),
1381*b1cdbd2cSJim Jagielski 	bAutoInt( sal_False ),
1382*b1cdbd2cSJim Jagielski 	bHasExtraText( sal_False ),
1383*b1cdbd2cSJim Jagielski 	bHasLongDoW( sal_False ),
1384*b1cdbd2cSJim Jagielski 	bHasEra( sal_False ),
1385*b1cdbd2cSJim Jagielski 	bHasDateTime( sal_False ),
1386*b1cdbd2cSJim Jagielski 	bRemoveAfterUse( sal_False ),
1387*b1cdbd2cSJim Jagielski 	eDateDOW( XML_DEA_NONE ),
1388*b1cdbd2cSJim Jagielski 	eDateDay( XML_DEA_NONE ),
1389*b1cdbd2cSJim Jagielski 	eDateMonth( XML_DEA_NONE ),
1390*b1cdbd2cSJim Jagielski 	eDateYear( XML_DEA_NONE ),
1391*b1cdbd2cSJim Jagielski 	eDateHours( XML_DEA_NONE ),
1392*b1cdbd2cSJim Jagielski 	eDateMins( XML_DEA_NONE ),
1393*b1cdbd2cSJim Jagielski 	eDateSecs( XML_DEA_NONE ),
1394*b1cdbd2cSJim Jagielski 	bDateNoDefault( sal_False )
1395*b1cdbd2cSJim Jagielski {
1396*b1cdbd2cSJim Jagielski 	OUString sLanguage, sCountry;
1397*b1cdbd2cSJim Jagielski     ::com::sun::star::i18n::NativeNumberXmlAttributes aNatNumAttr;
1398*b1cdbd2cSJim Jagielski 	sal_Bool bAttrBool;
1399*b1cdbd2cSJim Jagielski 	sal_uInt16 nAttrEnum;
1400*b1cdbd2cSJim Jagielski 
1401*b1cdbd2cSJim Jagielski 	sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
1402*b1cdbd2cSJim Jagielski 	for( sal_Int16 i=0; i < nAttrCount; i++ )
1403*b1cdbd2cSJim Jagielski 	{
1404*b1cdbd2cSJim Jagielski 		OUString sAttrName = xAttrList->getNameByIndex( i );
1405*b1cdbd2cSJim Jagielski 		OUString sValue = xAttrList->getValueByIndex( i );
1406*b1cdbd2cSJim Jagielski 		OUString aLocalName;
1407*b1cdbd2cSJim Jagielski 		sal_uInt16 nPrefix = rImport.GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
1408*b1cdbd2cSJim Jagielski 
1409*b1cdbd2cSJim Jagielski 		const SvXMLTokenMap& rTokenMap = pData->GetStyleAttrTokenMap();
1410*b1cdbd2cSJim Jagielski 		sal_uInt16 nToken = rTokenMap.Get( nPrefix, aLocalName );
1411*b1cdbd2cSJim Jagielski 		switch (nToken)
1412*b1cdbd2cSJim Jagielski 		{
1413*b1cdbd2cSJim Jagielski 			case XML_TOK_STYLE_ATTR_NAME:
1414*b1cdbd2cSJim Jagielski //				aName = sValue;
1415*b1cdbd2cSJim Jagielski 				break;
1416*b1cdbd2cSJim Jagielski 			case XML_TOK_STYLE_ATTR_LANGUAGE:
1417*b1cdbd2cSJim Jagielski 				sLanguage = sValue;
1418*b1cdbd2cSJim Jagielski 				break;
1419*b1cdbd2cSJim Jagielski 			case XML_TOK_STYLE_ATTR_COUNTRY:
1420*b1cdbd2cSJim Jagielski 				sCountry = sValue;
1421*b1cdbd2cSJim Jagielski 				break;
1422*b1cdbd2cSJim Jagielski 			case XML_TOK_STYLE_ATTR_TITLE:
1423*b1cdbd2cSJim Jagielski 				sFormatTitle = sValue;
1424*b1cdbd2cSJim Jagielski 				break;
1425*b1cdbd2cSJim Jagielski 			case XML_TOK_STYLE_ATTR_AUTOMATIC_ORDER:
1426*b1cdbd2cSJim Jagielski 				if ( SvXMLUnitConverter::convertBool( bAttrBool, sValue ) )
1427*b1cdbd2cSJim Jagielski 					bAutoOrder = bAttrBool;
1428*b1cdbd2cSJim Jagielski 				break;
1429*b1cdbd2cSJim Jagielski 			case XML_TOK_STYLE_ATTR_FORMAT_SOURCE:
1430*b1cdbd2cSJim Jagielski 				if ( SvXMLUnitConverter::convertEnum( nAttrEnum, sValue, aFormatSourceMap ) )
1431*b1cdbd2cSJim Jagielski 					bFromSystem = (sal_Bool) nAttrEnum;
1432*b1cdbd2cSJim Jagielski 				break;
1433*b1cdbd2cSJim Jagielski 			case XML_TOK_STYLE_ATTR_TRUNCATE_ON_OVERFLOW:
1434*b1cdbd2cSJim Jagielski 				if ( SvXMLUnitConverter::convertBool( bAttrBool, sValue ) )
1435*b1cdbd2cSJim Jagielski 					bTruncate = bAttrBool;
1436*b1cdbd2cSJim Jagielski 				break;
1437*b1cdbd2cSJim Jagielski 			case XML_TOK_STYLE_ATTR_VOLATILE:
1438*b1cdbd2cSJim Jagielski 				//	volatile formats can be removed after importing
1439*b1cdbd2cSJim Jagielski 				//	if not used in other styles
1440*b1cdbd2cSJim Jagielski 				if ( SvXMLUnitConverter::convertBool( bAttrBool, sValue ) )
1441*b1cdbd2cSJim Jagielski 					bRemoveAfterUse = bAttrBool;
1442*b1cdbd2cSJim Jagielski 				break;
1443*b1cdbd2cSJim Jagielski             case XML_TOK_STYLE_ATTR_TRANSL_FORMAT:
1444*b1cdbd2cSJim Jagielski                 aNatNumAttr.Format = sValue;
1445*b1cdbd2cSJim Jagielski                 break;
1446*b1cdbd2cSJim Jagielski             case XML_TOK_STYLE_ATTR_TRANSL_LANGUAGE:
1447*b1cdbd2cSJim Jagielski                 aNatNumAttr.Locale.Language = sValue;
1448*b1cdbd2cSJim Jagielski                 break;
1449*b1cdbd2cSJim Jagielski             case XML_TOK_STYLE_ATTR_TRANSL_COUNTRY:
1450*b1cdbd2cSJim Jagielski                 aNatNumAttr.Locale.Country = sValue;
1451*b1cdbd2cSJim Jagielski                 break;
1452*b1cdbd2cSJim Jagielski             case XML_TOK_STYLE_ATTR_TRANSL_STYLE:
1453*b1cdbd2cSJim Jagielski                 aNatNumAttr.Style = sValue;
1454*b1cdbd2cSJim Jagielski                 break;
1455*b1cdbd2cSJim Jagielski 		}
1456*b1cdbd2cSJim Jagielski 	}
1457*b1cdbd2cSJim Jagielski 
1458*b1cdbd2cSJim Jagielski 	if ( sLanguage.getLength() || sCountry.getLength() )
1459*b1cdbd2cSJim Jagielski 	{
1460*b1cdbd2cSJim Jagielski 		nFormatLang = MsLangId::convertIsoNamesToLanguage( sLanguage, sCountry );
1461*b1cdbd2cSJim Jagielski 		if ( nFormatLang == LANGUAGE_DONTKNOW )
1462*b1cdbd2cSJim Jagielski 			nFormatLang = LANGUAGE_SYSTEM;			//! error handling for invalid locales?
1463*b1cdbd2cSJim Jagielski 	}
1464*b1cdbd2cSJim Jagielski 
1465*b1cdbd2cSJim Jagielski     if ( aNatNumAttr.Format.getLength() )
1466*b1cdbd2cSJim Jagielski     {
1467*b1cdbd2cSJim Jagielski         SvNumberFormatter* pFormatter = pData->GetNumberFormatter();
1468*b1cdbd2cSJim Jagielski         if ( pFormatter )
1469*b1cdbd2cSJim Jagielski         {
1470*b1cdbd2cSJim Jagielski             sal_Int32 nNatNum = pFormatter->GetNatNum()->convertFromXmlAttributes( aNatNumAttr );
1471*b1cdbd2cSJim Jagielski             aFormatCode.appendAscii( RTL_CONSTASCII_STRINGPARAM( "[NatNum" ) );
1472*b1cdbd2cSJim Jagielski             aFormatCode.append( nNatNum, 10 );
1473*b1cdbd2cSJim Jagielski 
1474*b1cdbd2cSJim Jagielski 		    LanguageType eLang = MsLangId::convertLocaleToLanguage( aNatNumAttr.Locale );
1475*b1cdbd2cSJim Jagielski             if ( eLang == LANGUAGE_DONTKNOW )
1476*b1cdbd2cSJim Jagielski                 eLang = LANGUAGE_SYSTEM;            //! error handling for invalid locales?
1477*b1cdbd2cSJim Jagielski             if ( eLang != nFormatLang && eLang != LANGUAGE_SYSTEM )
1478*b1cdbd2cSJim Jagielski             {
1479*b1cdbd2cSJim Jagielski                 aFormatCode.appendAscii( RTL_CONSTASCII_STRINGPARAM( "][$-" ) );
1480*b1cdbd2cSJim Jagielski                 // language code in upper hex:
1481*b1cdbd2cSJim Jagielski                 aFormatCode.append( String::CreateFromInt32( sal_Int32( eLang ), 16 ).ToUpperAscii() );
1482*b1cdbd2cSJim Jagielski             }
1483*b1cdbd2cSJim Jagielski             aFormatCode.append( sal_Unicode(']') );
1484*b1cdbd2cSJim Jagielski         }
1485*b1cdbd2cSJim Jagielski     }
1486*b1cdbd2cSJim Jagielski }
1487*b1cdbd2cSJim Jagielski 
SvXMLNumFormatContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const rtl::OUString & rLName,const uno::Reference<xml::sax::XAttributeList> & xAttrList,const sal_Int32 nTempKey,SvXMLStylesContext & rStyles)1488*b1cdbd2cSJim Jagielski SvXMLNumFormatContext::SvXMLNumFormatContext( SvXMLImport& rImport,
1489*b1cdbd2cSJim Jagielski 									sal_uInt16 nPrfx, const rtl::OUString& rLName,
1490*b1cdbd2cSJim Jagielski 									const uno::Reference<xml::sax::XAttributeList>& xAttrList,
1491*b1cdbd2cSJim Jagielski 									const sal_Int32 nTempKey,
1492*b1cdbd2cSJim Jagielski 									SvXMLStylesContext& rStyles ) :
1493*b1cdbd2cSJim Jagielski 	SvXMLStyleContext( rImport, nPrfx, rLName, xAttrList, XML_STYLE_FAMILY_DATA_STYLE ),
1494*b1cdbd2cSJim Jagielski 	pData( NULL ),
1495*b1cdbd2cSJim Jagielski 	pStyles( &rStyles ),
1496*b1cdbd2cSJim Jagielski 	aMyConditions(),
1497*b1cdbd2cSJim Jagielski 	nType( 0 ),
1498*b1cdbd2cSJim Jagielski 	nKey(nTempKey),
1499*b1cdbd2cSJim Jagielski 	nFormatLang( LANGUAGE_SYSTEM ),
1500*b1cdbd2cSJim Jagielski 	bAutoOrder( sal_False ),
1501*b1cdbd2cSJim Jagielski 	bFromSystem( sal_False ),
1502*b1cdbd2cSJim Jagielski 	bTruncate( sal_True ),
1503*b1cdbd2cSJim Jagielski 	bAutoDec( sal_False ),
1504*b1cdbd2cSJim Jagielski 	bAutoInt( sal_False ),
1505*b1cdbd2cSJim Jagielski 	bHasExtraText( sal_False ),
1506*b1cdbd2cSJim Jagielski 	bHasLongDoW( sal_False ),
1507*b1cdbd2cSJim Jagielski 	bHasEra( sal_False ),
1508*b1cdbd2cSJim Jagielski 	bHasDateTime( sal_False ),
1509*b1cdbd2cSJim Jagielski 	bRemoveAfterUse( sal_False ),
1510*b1cdbd2cSJim Jagielski 	eDateDOW( XML_DEA_NONE ),
1511*b1cdbd2cSJim Jagielski 	eDateDay( XML_DEA_NONE ),
1512*b1cdbd2cSJim Jagielski 	eDateMonth( XML_DEA_NONE ),
1513*b1cdbd2cSJim Jagielski 	eDateYear( XML_DEA_NONE ),
1514*b1cdbd2cSJim Jagielski 	eDateHours( XML_DEA_NONE ),
1515*b1cdbd2cSJim Jagielski 	eDateMins( XML_DEA_NONE ),
1516*b1cdbd2cSJim Jagielski 	eDateSecs( XML_DEA_NONE ),
1517*b1cdbd2cSJim Jagielski 	bDateNoDefault( sal_False )
1518*b1cdbd2cSJim Jagielski {
1519*b1cdbd2cSJim Jagielski 	SetAttribute(XML_NAMESPACE_STYLE, GetXMLToken(XML_NAME), rLName);
1520*b1cdbd2cSJim Jagielski }
1521*b1cdbd2cSJim Jagielski 
~SvXMLNumFormatContext()1522*b1cdbd2cSJim Jagielski SvXMLNumFormatContext::~SvXMLNumFormatContext()
1523*b1cdbd2cSJim Jagielski {
1524*b1cdbd2cSJim Jagielski }
1525*b1cdbd2cSJim Jagielski 
CreateChildContext(sal_uInt16 nPrfx,const rtl::OUString & rLName,const uno::Reference<xml::sax::XAttributeList> & xAttrList)1526*b1cdbd2cSJim Jagielski SvXMLImportContext* SvXMLNumFormatContext::CreateChildContext(
1527*b1cdbd2cSJim Jagielski 									sal_uInt16 nPrfx, const rtl::OUString& rLName,
1528*b1cdbd2cSJim Jagielski 									const uno::Reference<xml::sax::XAttributeList>& xAttrList )
1529*b1cdbd2cSJim Jagielski {
1530*b1cdbd2cSJim Jagielski 	SvXMLImportContext* pContext = NULL;
1531*b1cdbd2cSJim Jagielski 
1532*b1cdbd2cSJim Jagielski 	const SvXMLTokenMap& rTokenMap = pData->GetStyleElemTokenMap();
1533*b1cdbd2cSJim Jagielski 	sal_uInt16 nToken = rTokenMap.Get( nPrfx, rLName );
1534*b1cdbd2cSJim Jagielski 	switch (nToken)
1535*b1cdbd2cSJim Jagielski 	{
1536*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLE_TEXT:
1537*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLE_NUMBER:
1538*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLE_SCIENTIFIC_NUMBER:
1539*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLE_FRACTION:
1540*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLE_CURRENCY_SYMBOL:
1541*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLE_DAY:
1542*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLE_MONTH:
1543*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLE_YEAR:
1544*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLE_ERA:
1545*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLE_DAY_OF_WEEK:
1546*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLE_WEEK_OF_YEAR:
1547*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLE_QUARTER:
1548*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLE_HOURS:
1549*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLE_AM_PM:
1550*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLE_MINUTES:
1551*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLE_SECONDS:
1552*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLE_BOOLEAN:
1553*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLE_TEXT_CONTENT:
1554*b1cdbd2cSJim Jagielski 			pContext = new SvXMLNumFmtElementContext( GetImport(), nPrfx, rLName,
1555*b1cdbd2cSJim Jagielski 														*this, nToken, xAttrList );
1556*b1cdbd2cSJim Jagielski 			break;
1557*b1cdbd2cSJim Jagielski 
1558*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLE_PROPERTIES:
1559*b1cdbd2cSJim Jagielski 			pContext = new SvXMLNumFmtPropContext( GetImport(), nPrfx, rLName,
1560*b1cdbd2cSJim Jagielski 														*this, xAttrList );
1561*b1cdbd2cSJim Jagielski 			break;
1562*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLE_MAP:
1563*b1cdbd2cSJim Jagielski 			{
1564*b1cdbd2cSJim Jagielski 				//	SvXMLNumFmtMapContext::EndElement adds to aMyConditions,
1565*b1cdbd2cSJim Jagielski 				//	so there's no need for an extra flag
1566*b1cdbd2cSJim Jagielski 				pContext = new SvXMLNumFmtMapContext( GetImport(), nPrfx, rLName,
1567*b1cdbd2cSJim Jagielski 															*this, xAttrList );
1568*b1cdbd2cSJim Jagielski 			}
1569*b1cdbd2cSJim Jagielski 			break;
1570*b1cdbd2cSJim Jagielski 	}
1571*b1cdbd2cSJim Jagielski 
1572*b1cdbd2cSJim Jagielski 	if( !pContext )
1573*b1cdbd2cSJim Jagielski 		pContext = new SvXMLImportContext( GetImport(), nPrfx, rLName );
1574*b1cdbd2cSJim Jagielski 	return pContext;
1575*b1cdbd2cSJim Jagielski }
1576*b1cdbd2cSJim Jagielski 
GetKey()1577*b1cdbd2cSJim Jagielski sal_Int32 SvXMLNumFormatContext::GetKey()
1578*b1cdbd2cSJim Jagielski {
1579*b1cdbd2cSJim Jagielski 	if (nKey > -1)
1580*b1cdbd2cSJim Jagielski 	{
1581*b1cdbd2cSJim Jagielski 		if (bRemoveAfterUse)
1582*b1cdbd2cSJim Jagielski 		{
1583*b1cdbd2cSJim Jagielski 			//	format is used -> don't remove
1584*b1cdbd2cSJim Jagielski 			bRemoveAfterUse = sal_False;
1585*b1cdbd2cSJim Jagielski 			if (pData)
1586*b1cdbd2cSJim Jagielski 				pData->SetUsed(nKey);
1587*b1cdbd2cSJim Jagielski 
1588*b1cdbd2cSJim Jagielski 			//	Add to import's list of keys now - CreateAndInsert didn't add
1589*b1cdbd2cSJim Jagielski 			//	the style if bRemoveAfterUse was set.
1590*b1cdbd2cSJim Jagielski 			GetImport().AddNumberStyle( nKey, GetName() );
1591*b1cdbd2cSJim Jagielski 		}
1592*b1cdbd2cSJim Jagielski 		return nKey;
1593*b1cdbd2cSJim Jagielski 	}
1594*b1cdbd2cSJim Jagielski 	else
1595*b1cdbd2cSJim Jagielski 	{
1596*b1cdbd2cSJim Jagielski 		// reset bRemoveAfterUse before CreateAndInsert, so AddKey is called without bRemoveAfterUse set
1597*b1cdbd2cSJim Jagielski 		bRemoveAfterUse = sal_False;
1598*b1cdbd2cSJim Jagielski 		CreateAndInsert(sal_True);
1599*b1cdbd2cSJim Jagielski 		return nKey;
1600*b1cdbd2cSJim Jagielski 	}
1601*b1cdbd2cSJim Jagielski }
1602*b1cdbd2cSJim Jagielski 
PrivateGetKey()1603*b1cdbd2cSJim Jagielski sal_Int32 SvXMLNumFormatContext::PrivateGetKey()
1604*b1cdbd2cSJim Jagielski {
1605*b1cdbd2cSJim Jagielski 	//	used for map elements in CreateAndInsert - don't reset bRemoveAfterUse flag
1606*b1cdbd2cSJim Jagielski 
1607*b1cdbd2cSJim Jagielski 	if (nKey > -1)
1608*b1cdbd2cSJim Jagielski 		return nKey;
1609*b1cdbd2cSJim Jagielski 	else
1610*b1cdbd2cSJim Jagielski 	{
1611*b1cdbd2cSJim Jagielski 		CreateAndInsert(sal_True);
1612*b1cdbd2cSJim Jagielski 		return nKey;
1613*b1cdbd2cSJim Jagielski 	}
1614*b1cdbd2cSJim Jagielski }
1615*b1cdbd2cSJim Jagielski 
CreateAndInsert(com::sun::star::uno::Reference<com::sun::star::util::XNumberFormatsSupplier> & xFormatsSupplier)1616*b1cdbd2cSJim Jagielski sal_Int32 SvXMLNumFormatContext::CreateAndInsert( com::sun::star::uno::Reference< com::sun::star::util::XNumberFormatsSupplier >& xFormatsSupplier )
1617*b1cdbd2cSJim Jagielski {
1618*b1cdbd2cSJim Jagielski     if (nKey <= -1)
1619*b1cdbd2cSJim Jagielski     {
1620*b1cdbd2cSJim Jagielski         SvNumberFormatter* pFormatter = NULL;
1621*b1cdbd2cSJim Jagielski 	    SvNumberFormatsSupplierObj* pObj =
1622*b1cdbd2cSJim Jagielski 					    SvNumberFormatsSupplierObj::getImplementation( xFormatsSupplier );
1623*b1cdbd2cSJim Jagielski 	    if (pObj)
1624*b1cdbd2cSJim Jagielski 		    pFormatter = pObj->GetNumberFormatter();
1625*b1cdbd2cSJim Jagielski 
1626*b1cdbd2cSJim Jagielski 	    if ( pFormatter )
1627*b1cdbd2cSJim Jagielski             return CreateAndInsert( pFormatter );
1628*b1cdbd2cSJim Jagielski         else
1629*b1cdbd2cSJim Jagielski             return -1;
1630*b1cdbd2cSJim Jagielski     }
1631*b1cdbd2cSJim Jagielski     else
1632*b1cdbd2cSJim Jagielski         return nKey;
1633*b1cdbd2cSJim Jagielski }
1634*b1cdbd2cSJim Jagielski 
CreateAndInsert(sal_Bool)1635*b1cdbd2cSJim Jagielski void SvXMLNumFormatContext::CreateAndInsert(sal_Bool /*bOverwrite*/)
1636*b1cdbd2cSJim Jagielski {
1637*b1cdbd2cSJim Jagielski     if (!(nKey > -1))
1638*b1cdbd2cSJim Jagielski 	    CreateAndInsert(pData->GetNumberFormatter());
1639*b1cdbd2cSJim Jagielski }
1640*b1cdbd2cSJim Jagielski 
CreateAndInsert(SvNumberFormatter * pFormatter)1641*b1cdbd2cSJim Jagielski sal_Int32 SvXMLNumFormatContext::CreateAndInsert(SvNumberFormatter* pFormatter)
1642*b1cdbd2cSJim Jagielski {
1643*b1cdbd2cSJim Jagielski 	if (!pFormatter)
1644*b1cdbd2cSJim Jagielski 	{
1645*b1cdbd2cSJim Jagielski 		DBG_ERROR("no number formatter");
1646*b1cdbd2cSJim Jagielski 		return -1;
1647*b1cdbd2cSJim Jagielski 	}
1648*b1cdbd2cSJim Jagielski 
1649*b1cdbd2cSJim Jagielski 	sal_uInt32 nIndex = NUMBERFORMAT_ENTRY_NOT_FOUND;
1650*b1cdbd2cSJim Jagielski 
1651*b1cdbd2cSJim Jagielski 	for (sal_uInt32 i = 0; i < aMyConditions.size(); i++)
1652*b1cdbd2cSJim Jagielski 	{
1653*b1cdbd2cSJim Jagielski 		SvXMLNumFormatContext* pStyle = (SvXMLNumFormatContext *)pStyles->FindStyleChildContext(
1654*b1cdbd2cSJim Jagielski 			XML_STYLE_FAMILY_DATA_STYLE, aMyConditions[i].sMapName, sal_False);
1655*b1cdbd2cSJim Jagielski 		if (pStyle)
1656*b1cdbd2cSJim Jagielski 		{
1657*b1cdbd2cSJim Jagielski 			if ((pStyle->PrivateGetKey() > -1))		// don't reset pStyle's bRemoveAfterUse flag
1658*b1cdbd2cSJim Jagielski 				AddCondition(i);
1659*b1cdbd2cSJim Jagielski 		}
1660*b1cdbd2cSJim Jagielski 	}
1661*b1cdbd2cSJim Jagielski 
1662*b1cdbd2cSJim Jagielski 	if ( !aFormatCode.getLength() )
1663*b1cdbd2cSJim Jagielski 	{
1664*b1cdbd2cSJim Jagielski 		//	insert empty format as empty string (with quotes)
1665*b1cdbd2cSJim Jagielski 		//	#93901# this check has to be done before inserting the conditions
1666*b1cdbd2cSJim Jagielski 		aFormatCode.appendAscii("\"\"");	// ""
1667*b1cdbd2cSJim Jagielski 	}
1668*b1cdbd2cSJim Jagielski 
1669*b1cdbd2cSJim Jagielski 	aFormatCode.insert( 0, aConditions.makeStringAndClear() );
1670*b1cdbd2cSJim Jagielski 	OUString sFormat = aFormatCode.makeStringAndClear();
1671*b1cdbd2cSJim Jagielski 
1672*b1cdbd2cSJim Jagielski 	//	test special cases
1673*b1cdbd2cSJim Jagielski 
1674*b1cdbd2cSJim Jagielski 	if ( bAutoDec )			// automatic decimal places
1675*b1cdbd2cSJim Jagielski 	{
1676*b1cdbd2cSJim Jagielski 		//	#99391# adjust only if the format contains no text elements, no conditions
1677*b1cdbd2cSJim Jagielski 		//	and no color definition (detected by the '[' at the start)
1678*b1cdbd2cSJim Jagielski 
1679*b1cdbd2cSJim Jagielski 		if ( nType == XML_TOK_STYLES_NUMBER_STYLE && !bHasExtraText &&
1680*b1cdbd2cSJim Jagielski 				aMyConditions.size() == 0 && sFormat.toChar() != (sal_Unicode)'[' )
1681*b1cdbd2cSJim Jagielski 			nIndex = pFormatter->GetStandardIndex( nFormatLang );
1682*b1cdbd2cSJim Jagielski 	}
1683*b1cdbd2cSJim Jagielski 	if ( bAutoInt )			// automatic integer digits
1684*b1cdbd2cSJim Jagielski 	{
1685*b1cdbd2cSJim Jagielski 		//!	only if two decimal places was set?
1686*b1cdbd2cSJim Jagielski 
1687*b1cdbd2cSJim Jagielski 		if ( nType == XML_TOK_STYLES_NUMBER_STYLE && !bHasExtraText &&
1688*b1cdbd2cSJim Jagielski 				aMyConditions.size() == 0 && sFormat.toChar() != (sal_Unicode)'[' )
1689*b1cdbd2cSJim Jagielski 			nIndex = pFormatter->GetFormatIndex( NF_NUMBER_SYSTEM, nFormatLang );
1690*b1cdbd2cSJim Jagielski 	}
1691*b1cdbd2cSJim Jagielski 
1692*b1cdbd2cSJim Jagielski 	//	boolean is always the builtin boolean format
1693*b1cdbd2cSJim Jagielski 	//	(no other boolean formats are implemented)
1694*b1cdbd2cSJim Jagielski 	if ( nType == XML_TOK_STYLES_BOOLEAN_STYLE )
1695*b1cdbd2cSJim Jagielski 		nIndex = pFormatter->GetFormatIndex( NF_BOOLEAN, nFormatLang );
1696*b1cdbd2cSJim Jagielski 
1697*b1cdbd2cSJim Jagielski 	//	check for default date formats
1698*b1cdbd2cSJim Jagielski 	if ( nType == XML_TOK_STYLES_DATE_STYLE && bAutoOrder && !bDateNoDefault )
1699*b1cdbd2cSJim Jagielski 	{
1700*b1cdbd2cSJim Jagielski 		NfIndexTableOffset eFormat = (NfIndexTableOffset) SvXMLNumFmtDefaults::GetDefaultDateFormat(
1701*b1cdbd2cSJim Jagielski 			eDateDOW, eDateDay, eDateMonth, eDateYear,
1702*b1cdbd2cSJim Jagielski 			eDateHours, eDateMins, eDateSecs, bFromSystem );
1703*b1cdbd2cSJim Jagielski 		if ( eFormat < NF_INDEX_TABLE_ENTRIES )
1704*b1cdbd2cSJim Jagielski 		{
1705*b1cdbd2cSJim Jagielski 			//	#109651# if a date format has the automatic-order attribute and
1706*b1cdbd2cSJim Jagielski 			//	contains exactly the elements of one of the default date formats,
1707*b1cdbd2cSJim Jagielski 			//	use that default format, with the element order and separators
1708*b1cdbd2cSJim Jagielski 			//	from the current locale settings
1709*b1cdbd2cSJim Jagielski 
1710*b1cdbd2cSJim Jagielski 			nIndex = pFormatter->GetFormatIndex( eFormat, nFormatLang );
1711*b1cdbd2cSJim Jagielski 		}
1712*b1cdbd2cSJim Jagielski 	}
1713*b1cdbd2cSJim Jagielski 
1714*b1cdbd2cSJim Jagielski 	if ( nIndex == NUMBERFORMAT_ENTRY_NOT_FOUND && sFormat.getLength() )
1715*b1cdbd2cSJim Jagielski 	{
1716*b1cdbd2cSJim Jagielski 		//	insert by format string
1717*b1cdbd2cSJim Jagielski 
1718*b1cdbd2cSJim Jagielski 		String aFormatStr( sFormat );
1719*b1cdbd2cSJim Jagielski 		nIndex = pFormatter->GetEntryKey( aFormatStr, nFormatLang );
1720*b1cdbd2cSJim Jagielski 		if ( nIndex == NUMBERFORMAT_ENTRY_NOT_FOUND )
1721*b1cdbd2cSJim Jagielski 		{
1722*b1cdbd2cSJim Jagielski 			xub_StrLen	nErrPos	= 0;
1723*b1cdbd2cSJim Jagielski 			short		l_nType	= 0;
1724*b1cdbd2cSJim Jagielski 			sal_Bool bOk = pFormatter->PutEntry( aFormatStr, nErrPos, l_nType, nIndex, nFormatLang );
1725*b1cdbd2cSJim Jagielski 			if ( !bOk && nErrPos == 0 && aFormatStr != String(sFormat) )
1726*b1cdbd2cSJim Jagielski 			{
1727*b1cdbd2cSJim Jagielski 				//	if the string was modified by PutEntry, look for an existing format
1728*b1cdbd2cSJim Jagielski 				//	with the modified string
1729*b1cdbd2cSJim Jagielski 				nIndex = pFormatter->GetEntryKey( aFormatStr, nFormatLang );
1730*b1cdbd2cSJim Jagielski 				if ( nIndex != NUMBERFORMAT_ENTRY_NOT_FOUND )
1731*b1cdbd2cSJim Jagielski 					bOk = sal_True;
1732*b1cdbd2cSJim Jagielski 			}
1733*b1cdbd2cSJim Jagielski 			if (!bOk)
1734*b1cdbd2cSJim Jagielski 				nIndex = NUMBERFORMAT_ENTRY_NOT_FOUND;
1735*b1cdbd2cSJim Jagielski 		}
1736*b1cdbd2cSJim Jagielski 	}
1737*b1cdbd2cSJim Jagielski 
1738*b1cdbd2cSJim Jagielski #if 0
1739*b1cdbd2cSJim Jagielski //! I18N doesn't provide SYSTEM or extended date information yet
1740*b1cdbd2cSJim Jagielski 	if ( nIndex != NUMBERFORMAT_ENTRY_NOT_FOUND && !bFromSystem )
1741*b1cdbd2cSJim Jagielski 	{
1742*b1cdbd2cSJim Jagielski 		//	instead of automatic date format, use fixed formats if bFromSystem is not set
1743*b1cdbd2cSJim Jagielski 		//!	prevent use of automatic formats in other cases, force user-defined format?
1744*b1cdbd2cSJim Jagielski 
1745*b1cdbd2cSJim Jagielski 		sal_uInt32 nNewIndex = nIndex;
1746*b1cdbd2cSJim Jagielski 
1747*b1cdbd2cSJim Jagielski 		NfIndexTableOffset eOffset = pFormatter->GetIndexTableOffset( nIndex );
1748*b1cdbd2cSJim Jagielski 		if ( eOffset == NF_DATE_SYSTEM_SHORT )
1749*b1cdbd2cSJim Jagielski 		{
1750*b1cdbd2cSJim Jagielski 			const International& rInt = pData->GetInternational( nFormatLang );
1751*b1cdbd2cSJim Jagielski 			if ( rInt.IsDateDayLeadingZero() && rInt.IsDateMonthLeadingZero() )
1752*b1cdbd2cSJim Jagielski 			{
1753*b1cdbd2cSJim Jagielski 				if ( rInt.IsDateCentury() )
1754*b1cdbd2cSJim Jagielski 					nNewIndex = pFormatter->GetFormatIndex( NF_DATE_SYS_DDMMYYYY, nFormatLang );
1755*b1cdbd2cSJim Jagielski 				else
1756*b1cdbd2cSJim Jagielski 					nNewIndex = pFormatter->GetFormatIndex( NF_DATE_SYS_DDMMYY, nFormatLang );
1757*b1cdbd2cSJim Jagielski 			}
1758*b1cdbd2cSJim Jagielski 		}
1759*b1cdbd2cSJim Jagielski 		else if ( eOffset == NF_DATE_SYSTEM_LONG )
1760*b1cdbd2cSJim Jagielski 		{
1761*b1cdbd2cSJim Jagielski 			const International& rInt = pData->GetInternational( nFormatLang );
1762*b1cdbd2cSJim Jagielski 			if ( !rInt.IsLongDateDayLeadingZero() )
1763*b1cdbd2cSJim Jagielski 			{
1764*b1cdbd2cSJim Jagielski 				sal_Bool bCentury = rInt.IsLongDateCentury();
1765*b1cdbd2cSJim Jagielski 				MonthFormat eMonth = rInt.GetLongDateMonthFormat();
1766*b1cdbd2cSJim Jagielski 				if ( eMonth == MONTH_LONG && bCentury )
1767*b1cdbd2cSJim Jagielski 				{
1768*b1cdbd2cSJim Jagielski 					if ( rInt.GetLongDateDayOfWeekFormat() == DAYOFWEEK_LONG )
1769*b1cdbd2cSJim Jagielski 						nNewIndex = pFormatter->GetFormatIndex( NF_DATE_SYS_NNNNDMMMMYYYY, nFormatLang );
1770*b1cdbd2cSJim Jagielski 					else
1771*b1cdbd2cSJim Jagielski 						nNewIndex = pFormatter->GetFormatIndex( NF_DATE_SYS_NNDMMMMYYYY, nFormatLang );
1772*b1cdbd2cSJim Jagielski 				}
1773*b1cdbd2cSJim Jagielski 				else if ( eMonth == MONTH_SHORT && !bCentury )
1774*b1cdbd2cSJim Jagielski 					nNewIndex = pFormatter->GetFormatIndex( NF_DATE_SYS_NNDMMMYY, nFormatLang );
1775*b1cdbd2cSJim Jagielski 			}
1776*b1cdbd2cSJim Jagielski 		}
1777*b1cdbd2cSJim Jagielski 
1778*b1cdbd2cSJim Jagielski 		if ( nNewIndex != nIndex )
1779*b1cdbd2cSJim Jagielski 		{
1780*b1cdbd2cSJim Jagielski 			//	verify the fixed format really matches the format string
1781*b1cdbd2cSJim Jagielski 			//	(not the case with some formats from locale data)
1782*b1cdbd2cSJim Jagielski 
1783*b1cdbd2cSJim Jagielski 			const SvNumberformat* pFixedFormat = pFormatter->GetEntry( nNewIndex );
1784*b1cdbd2cSJim Jagielski 			if ( pFixedFormat && pFixedFormat->GetFormatstring() == String(sFormat) )
1785*b1cdbd2cSJim Jagielski 				nIndex = nNewIndex;
1786*b1cdbd2cSJim Jagielski 		}
1787*b1cdbd2cSJim Jagielski 	}
1788*b1cdbd2cSJim Jagielski #endif
1789*b1cdbd2cSJim Jagielski 
1790*b1cdbd2cSJim Jagielski 	if ( nIndex != NUMBERFORMAT_ENTRY_NOT_FOUND && !bAutoOrder )
1791*b1cdbd2cSJim Jagielski 	{
1792*b1cdbd2cSJim Jagielski 		//	use fixed-order formats instead of SYS... if bAutoOrder is false
1793*b1cdbd2cSJim Jagielski 		//	(only if the format strings are equal for the locale)
1794*b1cdbd2cSJim Jagielski 
1795*b1cdbd2cSJim Jagielski 		NfIndexTableOffset eOffset = pFormatter->GetIndexTableOffset( nIndex );
1796*b1cdbd2cSJim Jagielski 		if ( eOffset == NF_DATE_SYS_DMMMYYYY )
1797*b1cdbd2cSJim Jagielski 		{
1798*b1cdbd2cSJim Jagielski 			sal_uInt32 nNewIndex = pFormatter->GetFormatIndex( NF_DATE_DIN_DMMMYYYY, nFormatLang );
1799*b1cdbd2cSJim Jagielski 			const SvNumberformat* pOldEntry = pFormatter->GetEntry( nIndex );
1800*b1cdbd2cSJim Jagielski 			const SvNumberformat* pNewEntry = pFormatter->GetEntry( nNewIndex );
1801*b1cdbd2cSJim Jagielski 			if ( pOldEntry && pNewEntry && pOldEntry->GetFormatstring() == pNewEntry->GetFormatstring() )
1802*b1cdbd2cSJim Jagielski 				nIndex = nNewIndex;
1803*b1cdbd2cSJim Jagielski 		}
1804*b1cdbd2cSJim Jagielski 		else if ( eOffset == NF_DATE_SYS_DMMMMYYYY )
1805*b1cdbd2cSJim Jagielski 		{
1806*b1cdbd2cSJim Jagielski 			sal_uInt32 nNewIndex = pFormatter->GetFormatIndex( NF_DATE_DIN_DMMMMYYYY, nFormatLang );
1807*b1cdbd2cSJim Jagielski 			const SvNumberformat* pOldEntry = pFormatter->GetEntry( nIndex );
1808*b1cdbd2cSJim Jagielski 			const SvNumberformat* pNewEntry = pFormatter->GetEntry( nNewIndex );
1809*b1cdbd2cSJim Jagielski 			if ( pOldEntry && pNewEntry && pOldEntry->GetFormatstring() == pNewEntry->GetFormatstring() )
1810*b1cdbd2cSJim Jagielski 				nIndex = nNewIndex;
1811*b1cdbd2cSJim Jagielski 		}
1812*b1cdbd2cSJim Jagielski 	}
1813*b1cdbd2cSJim Jagielski 
1814*b1cdbd2cSJim Jagielski 	if ((nIndex != NUMBERFORMAT_ENTRY_NOT_FOUND) && sFormatTitle.getLength())
1815*b1cdbd2cSJim Jagielski 	{
1816*b1cdbd2cSJim Jagielski 		SvNumberformat* pFormat = const_cast<SvNumberformat*>(pFormatter->GetEntry( nIndex ));
1817*b1cdbd2cSJim Jagielski 		if (pFormat)
1818*b1cdbd2cSJim Jagielski 		{
1819*b1cdbd2cSJim Jagielski 			String sTitle (sFormatTitle);
1820*b1cdbd2cSJim Jagielski 			pFormat->SetComment(sTitle);
1821*b1cdbd2cSJim Jagielski 		}
1822*b1cdbd2cSJim Jagielski 	}
1823*b1cdbd2cSJim Jagielski 
1824*b1cdbd2cSJim Jagielski 	if ( nIndex == NUMBERFORMAT_ENTRY_NOT_FOUND )
1825*b1cdbd2cSJim Jagielski 	{
1826*b1cdbd2cSJim Jagielski 		DBG_ERROR("invalid number format");
1827*b1cdbd2cSJim Jagielski 		nIndex = pFormatter->GetStandardIndex( nFormatLang );
1828*b1cdbd2cSJim Jagielski 	}
1829*b1cdbd2cSJim Jagielski 
1830*b1cdbd2cSJim Jagielski 	pData->AddKey( nIndex, GetName(), bRemoveAfterUse );
1831*b1cdbd2cSJim Jagielski 	nKey = nIndex;
1832*b1cdbd2cSJim Jagielski 
1833*b1cdbd2cSJim Jagielski 	//	Add to import's list of keys (shared between styles and content import)
1834*b1cdbd2cSJim Jagielski 	//	only if not volatile - formats are removed from NumberFormatter at the
1835*b1cdbd2cSJim Jagielski 	//	end of each import (in SvXMLNumFmtHelper dtor).
1836*b1cdbd2cSJim Jagielski 	//	If bRemoveAfterUse is reset later in GetKey, AddNumberStyle is called there.
1837*b1cdbd2cSJim Jagielski 
1838*b1cdbd2cSJim Jagielski 	if (!bRemoveAfterUse)
1839*b1cdbd2cSJim Jagielski 		GetImport().AddNumberStyle( nKey, GetName() );
1840*b1cdbd2cSJim Jagielski 
1841*b1cdbd2cSJim Jagielski #if 0
1842*b1cdbd2cSJim Jagielski 	ByteString aByte( String(sFormatName), gsl_getSystemTextEncoding() );
1843*b1cdbd2cSJim Jagielski 	aByte.Append( " | " );
1844*b1cdbd2cSJim Jagielski 	aByte.Append(ByteString( String(sFormat), gsl_getSystemTextEncoding() ));
1845*b1cdbd2cSJim Jagielski 	aByte.Append( " | " );
1846*b1cdbd2cSJim Jagielski 	aByte.Append(ByteString::CreateFromInt32( nIndex ));
1847*b1cdbd2cSJim Jagielski 
1848*b1cdbd2cSJim Jagielski //	DBG_ERROR(aByte.GetBuffer());
1849*b1cdbd2cSJim Jagielski 	int xxx=42;
1850*b1cdbd2cSJim Jagielski #endif
1851*b1cdbd2cSJim Jagielski 
1852*b1cdbd2cSJim Jagielski     return nKey;
1853*b1cdbd2cSJim Jagielski }
1854*b1cdbd2cSJim Jagielski 
Finish(sal_Bool bOverwrite)1855*b1cdbd2cSJim Jagielski void SvXMLNumFormatContext::Finish( sal_Bool bOverwrite )
1856*b1cdbd2cSJim Jagielski {
1857*b1cdbd2cSJim Jagielski 	SvXMLStyleContext::Finish( bOverwrite );
1858*b1cdbd2cSJim Jagielski //	AddCondition();
1859*b1cdbd2cSJim Jagielski }
1860*b1cdbd2cSJim Jagielski 
GetLocaleData() const1861*b1cdbd2cSJim Jagielski const LocaleDataWrapper& SvXMLNumFormatContext::GetLocaleData() const
1862*b1cdbd2cSJim Jagielski {
1863*b1cdbd2cSJim Jagielski 	return pData->GetLocaleData( nFormatLang );
1864*b1cdbd2cSJim Jagielski }
1865*b1cdbd2cSJim Jagielski 
AddToCode(const rtl::OUString & rString)1866*b1cdbd2cSJim Jagielski void SvXMLNumFormatContext::AddToCode( const rtl::OUString& rString )
1867*b1cdbd2cSJim Jagielski {
1868*b1cdbd2cSJim Jagielski 	aFormatCode.append( rString );
1869*b1cdbd2cSJim Jagielski 	bHasExtraText = sal_True;
1870*b1cdbd2cSJim Jagielski }
1871*b1cdbd2cSJim Jagielski 
AddNumber(const SvXMLNumberInfo & rInfo)1872*b1cdbd2cSJim Jagielski void SvXMLNumFormatContext::AddNumber( const SvXMLNumberInfo& rInfo )
1873*b1cdbd2cSJim Jagielski {
1874*b1cdbd2cSJim Jagielski 	SvNumberFormatter* pFormatter = pData->GetNumberFormatter();
1875*b1cdbd2cSJim Jagielski 	if (!pFormatter)
1876*b1cdbd2cSJim Jagielski 		return;
1877*b1cdbd2cSJim Jagielski 
1878*b1cdbd2cSJim Jagielski 	//	store special conditions
1879*b1cdbd2cSJim Jagielski 	bAutoDec = ( rInfo.nDecimals < 0 );
1880*b1cdbd2cSJim Jagielski 	bAutoInt = ( rInfo.nInteger < 0 );
1881*b1cdbd2cSJim Jagielski 
1882*b1cdbd2cSJim Jagielski 	sal_uInt16 nPrec = 0;
1883*b1cdbd2cSJim Jagielski 	sal_uInt16 nLeading = 0;
1884*b1cdbd2cSJim Jagielski 	if ( rInfo.nDecimals >= 0 )						//	< 0 : Default
1885*b1cdbd2cSJim Jagielski 		nPrec = (sal_uInt16) rInfo.nDecimals;
1886*b1cdbd2cSJim Jagielski 	if ( rInfo.nInteger >= 0 )						//	< 0 : Default
1887*b1cdbd2cSJim Jagielski 		nLeading = (sal_uInt16) rInfo.nInteger;
1888*b1cdbd2cSJim Jagielski 
1889*b1cdbd2cSJim Jagielski 	if ( bAutoDec )
1890*b1cdbd2cSJim Jagielski 	{
1891*b1cdbd2cSJim Jagielski 		if ( nType == XML_TOK_STYLES_CURRENCY_STYLE )
1892*b1cdbd2cSJim Jagielski 		{
1893*b1cdbd2cSJim Jagielski 			//	for currency formats, "automatic decimals" is used for the automatic
1894*b1cdbd2cSJim Jagielski 			//	currency format with (fixed) decimals from the locale settings
1895*b1cdbd2cSJim Jagielski 
1896*b1cdbd2cSJim Jagielski 			const LocaleDataWrapper& rLoc = pData->GetLocaleData( nFormatLang );
1897*b1cdbd2cSJim Jagielski 			nPrec = rLoc.getCurrDigits();
1898*b1cdbd2cSJim Jagielski 		}
1899*b1cdbd2cSJim Jagielski 		else
1900*b1cdbd2cSJim Jagielski 		{
1901*b1cdbd2cSJim Jagielski 			//	for other types, "automatic decimals" means dynamic determination of
1902*b1cdbd2cSJim Jagielski 			//	decimals, as achieved with the "general" keyword
1903*b1cdbd2cSJim Jagielski 
1904*b1cdbd2cSJim Jagielski 	        aFormatCode.append( pFormatter->GetStandardName( nFormatLang ) );
1905*b1cdbd2cSJim Jagielski 	        return;
1906*b1cdbd2cSJim Jagielski 		}
1907*b1cdbd2cSJim Jagielski 	}
1908*b1cdbd2cSJim Jagielski 	if ( bAutoInt )
1909*b1cdbd2cSJim Jagielski 	{
1910*b1cdbd2cSJim Jagielski 		//!...
1911*b1cdbd2cSJim Jagielski 	}
1912*b1cdbd2cSJim Jagielski 
1913*b1cdbd2cSJim Jagielski 	sal_uInt16 nGenPrec = nPrec;
1914*b1cdbd2cSJim Jagielski 	if ( rInfo.bDecReplace || rInfo.bVarDecimals )
1915*b1cdbd2cSJim Jagielski 		nGenPrec = 0;				// generate format without decimals...
1916*b1cdbd2cSJim Jagielski 
1917*b1cdbd2cSJim Jagielski 	sal_Bool bGrouping = rInfo.bGrouping;
1918*b1cdbd2cSJim Jagielski 	sal_uInt16 nEmbeddedCount = rInfo.aEmbeddedElements.Count();
1919*b1cdbd2cSJim Jagielski 	if ( nEmbeddedCount )
1920*b1cdbd2cSJim Jagielski 		bGrouping = sal_False;		// grouping and embedded characters can't be used together
1921*b1cdbd2cSJim Jagielski 
1922*b1cdbd2cSJim Jagielski 	String aNumStr;
1923*b1cdbd2cSJim Jagielski 	sal_uInt32 nStdIndex = pFormatter->GetStandardIndex( nFormatLang );
1924*b1cdbd2cSJim Jagielski 	pFormatter->GenerateFormat( aNumStr, nStdIndex, nFormatLang,
1925*b1cdbd2cSJim Jagielski 								bGrouping, sal_False, nGenPrec, nLeading );
1926*b1cdbd2cSJim Jagielski 
1927*b1cdbd2cSJim Jagielski     if ( rInfo.nExpDigits >= 0 && nLeading == 0 && !bGrouping && nEmbeddedCount == 0 )
1928*b1cdbd2cSJim Jagielski     {
1929*b1cdbd2cSJim Jagielski         // #i43959# For scientific numbers, "#" in the integer part forces a digit,
1930*b1cdbd2cSJim Jagielski         // so it has to be removed if nLeading is 0 (".00E+0", not "#.00E+0").
1931*b1cdbd2cSJim Jagielski 
1932*b1cdbd2cSJim Jagielski         aNumStr.EraseLeadingChars( (sal_Unicode)'#' );
1933*b1cdbd2cSJim Jagielski     }
1934*b1cdbd2cSJim Jagielski 
1935*b1cdbd2cSJim Jagielski 	if ( nEmbeddedCount )
1936*b1cdbd2cSJim Jagielski 	{
1937*b1cdbd2cSJim Jagielski 		//	insert embedded strings into number string
1938*b1cdbd2cSJim Jagielski 		//	only the integer part is supported
1939*b1cdbd2cSJim Jagielski 		//	nZeroPos is the string position where format position 0 is inserted
1940*b1cdbd2cSJim Jagielski 
1941*b1cdbd2cSJim Jagielski 	    xub_StrLen nZeroPos = aNumStr.Search( pData->GetLocaleData( nFormatLang ).getNumDecimalSep() );
1942*b1cdbd2cSJim Jagielski 	    if ( nZeroPos == STRING_NOTFOUND )
1943*b1cdbd2cSJim Jagielski 	    	nZeroPos = aNumStr.Len();
1944*b1cdbd2cSJim Jagielski 
1945*b1cdbd2cSJim Jagielski 		//	aEmbeddedElements is sorted - last entry has the largest position (leftmost)
1946*b1cdbd2cSJim Jagielski 		const SvXMLEmbeddedElement* pLastObj = rInfo.aEmbeddedElements[nEmbeddedCount - 1];
1947*b1cdbd2cSJim Jagielski 		sal_Int32 nLastFormatPos = pLastObj->nFormatPos;
1948*b1cdbd2cSJim Jagielski 		if ( nLastFormatPos >= nZeroPos )
1949*b1cdbd2cSJim Jagielski 		{
1950*b1cdbd2cSJim Jagielski 			//	add '#' characters so all embedded texts are really embedded in digits
1951*b1cdbd2cSJim Jagielski 			//	(there always has to be a digit before the leftmost embedded text)
1952*b1cdbd2cSJim Jagielski 
1953*b1cdbd2cSJim Jagielski 			xub_StrLen nAddCount = (xub_StrLen)nLastFormatPos + 1 - nZeroPos;
1954*b1cdbd2cSJim Jagielski 			String aDigitStr;
1955*b1cdbd2cSJim Jagielski 			aDigitStr.Fill( nAddCount, (sal_Unicode)'#' );
1956*b1cdbd2cSJim Jagielski 			aNumStr.Insert( aDigitStr, 0 );
1957*b1cdbd2cSJim Jagielski 			nZeroPos = nZeroPos + nAddCount;
1958*b1cdbd2cSJim Jagielski 		}
1959*b1cdbd2cSJim Jagielski 
1960*b1cdbd2cSJim Jagielski 		//	aEmbeddedElements is sorted with ascending positions - loop is from right to left
1961*b1cdbd2cSJim Jagielski 		for (sal_uInt16 nElement = 0; nElement < nEmbeddedCount; nElement++)
1962*b1cdbd2cSJim Jagielski 		{
1963*b1cdbd2cSJim Jagielski 			const SvXMLEmbeddedElement* pObj = rInfo.aEmbeddedElements[nElement];
1964*b1cdbd2cSJim Jagielski 			sal_Int32 nFormatPos = pObj->nFormatPos;
1965*b1cdbd2cSJim Jagielski 			sal_Int32 nInsertPos = nZeroPos - nFormatPos;
1966*b1cdbd2cSJim Jagielski 			if ( nFormatPos >= 0 && nInsertPos >= 0 )
1967*b1cdbd2cSJim Jagielski 			{
1968*b1cdbd2cSJim Jagielski 				rtl::OUStringBuffer aContent( pObj->aText );
1969*b1cdbd2cSJim Jagielski 				//	#107805# always quote embedded strings - even space would otherwise
1970*b1cdbd2cSJim Jagielski 				//	be recognized as thousands separator in French.
1971*b1cdbd2cSJim Jagielski 				aContent.insert( 0, (sal_Unicode) '"' );
1972*b1cdbd2cSJim Jagielski 				aContent.append( (sal_Unicode) '"' );
1973*b1cdbd2cSJim Jagielski 
1974*b1cdbd2cSJim Jagielski 				aNumStr.Insert( String( aContent.makeStringAndClear() ), (xub_StrLen)nInsertPos );
1975*b1cdbd2cSJim Jagielski 			}
1976*b1cdbd2cSJim Jagielski 		}
1977*b1cdbd2cSJim Jagielski 	}
1978*b1cdbd2cSJim Jagielski 
1979*b1cdbd2cSJim Jagielski 	aFormatCode.append( aNumStr );
1980*b1cdbd2cSJim Jagielski 
1981*b1cdbd2cSJim Jagielski 	if ( ( rInfo.bDecReplace || rInfo.bVarDecimals ) && nPrec )		// add decimal replacement (dashes)
1982*b1cdbd2cSJim Jagielski 	{
1983*b1cdbd2cSJim Jagielski 		//	add dashes for explicit decimal replacement, # for variable decimals
1984*b1cdbd2cSJim Jagielski 		sal_Unicode cAdd = rInfo.bDecReplace ? '-' : '#';
1985*b1cdbd2cSJim Jagielski 
1986*b1cdbd2cSJim Jagielski 		aFormatCode.append( pData->GetLocaleData( nFormatLang ).getNumDecimalSep() );
1987*b1cdbd2cSJim Jagielski 		for ( sal_uInt16 i=0; i<nPrec; i++)
1988*b1cdbd2cSJim Jagielski 			aFormatCode.append( cAdd );
1989*b1cdbd2cSJim Jagielski 	}
1990*b1cdbd2cSJim Jagielski 
1991*b1cdbd2cSJim Jagielski 	//	add extra thousands separators for display factor
1992*b1cdbd2cSJim Jagielski 
1993*b1cdbd2cSJim Jagielski 	if ( rInfo.fDisplayFactor != 1.0 && rInfo.fDisplayFactor > 0.0 )
1994*b1cdbd2cSJim Jagielski 	{
1995*b1cdbd2cSJim Jagielski 		//	test for 1.0 is just for optimization - nSepCount would be 0
1996*b1cdbd2cSJim Jagielski 
1997*b1cdbd2cSJim Jagielski 		//	one separator for each factor of 1000
1998*b1cdbd2cSJim Jagielski 		sal_Int32 nSepCount = (sal_Int32) ::rtl::math::round( log10(rInfo.fDisplayFactor) / 3.0 );
1999*b1cdbd2cSJim Jagielski 		if ( nSepCount > 0 )
2000*b1cdbd2cSJim Jagielski 		{
2001*b1cdbd2cSJim Jagielski 			OUString aSep = pData->GetLocaleData( nFormatLang ).getNumThousandSep();
2002*b1cdbd2cSJim Jagielski 			for ( sal_Int32 i=0; i<nSepCount; i++ )
2003*b1cdbd2cSJim Jagielski 				aFormatCode.append( aSep );
2004*b1cdbd2cSJim Jagielski 		}
2005*b1cdbd2cSJim Jagielski 	}
2006*b1cdbd2cSJim Jagielski }
2007*b1cdbd2cSJim Jagielski 
AddCurrency(const rtl::OUString & rContent,LanguageType nLang)2008*b1cdbd2cSJim Jagielski void SvXMLNumFormatContext::AddCurrency( const rtl::OUString& rContent, LanguageType nLang )
2009*b1cdbd2cSJim Jagielski {
2010*b1cdbd2cSJim Jagielski 	sal_Bool bAutomatic = sal_False;
2011*b1cdbd2cSJim Jagielski 	OUString aSymbol = rContent;
2012*b1cdbd2cSJim Jagielski 	if ( aSymbol.getLength() == 0 )
2013*b1cdbd2cSJim Jagielski 	{
2014*b1cdbd2cSJim Jagielski 		//	get currency symbol for language
2015*b1cdbd2cSJim Jagielski 
2016*b1cdbd2cSJim Jagielski 		//aSymbol = pData->GetLocaleData( nFormatLang ).getCurrSymbol();
2017*b1cdbd2cSJim Jagielski 
2018*b1cdbd2cSJim Jagielski 		SvNumberFormatter* pFormatter = pData->GetNumberFormatter();
2019*b1cdbd2cSJim Jagielski 		if ( pFormatter )
2020*b1cdbd2cSJim Jagielski 		{
2021*b1cdbd2cSJim Jagielski 			pFormatter->ChangeIntl( nFormatLang );
2022*b1cdbd2cSJim Jagielski 			String sCurString, sDummy;
2023*b1cdbd2cSJim Jagielski 			pFormatter->GetCompatibilityCurrency( sCurString, sDummy );
2024*b1cdbd2cSJim Jagielski 			aSymbol = sCurString;
2025*b1cdbd2cSJim Jagielski 
2026*b1cdbd2cSJim Jagielski 			bAutomatic = sal_True;
2027*b1cdbd2cSJim Jagielski 		}
2028*b1cdbd2cSJim Jagielski 	}
2029*b1cdbd2cSJim Jagielski 	else if ( nLang == LANGUAGE_SYSTEM && aSymbol.compareToAscii("CCC") == 0 )
2030*b1cdbd2cSJim Jagielski 	{
2031*b1cdbd2cSJim Jagielski 		//	"CCC" is used for automatic long symbol
2032*b1cdbd2cSJim Jagielski 		bAutomatic = sal_True;
2033*b1cdbd2cSJim Jagielski 	}
2034*b1cdbd2cSJim Jagielski 
2035*b1cdbd2cSJim Jagielski 	if ( bAutomatic )
2036*b1cdbd2cSJim Jagielski 	{
2037*b1cdbd2cSJim Jagielski 		//	remove unnecessary quotes before automatic symbol (formats like "-(0DM)")
2038*b1cdbd2cSJim Jagielski 		//	otherwise the currency symbol isn't recognized (#94048#)
2039*b1cdbd2cSJim Jagielski 
2040*b1cdbd2cSJim Jagielski 		sal_Int32 nLength = aFormatCode.getLength();
2041*b1cdbd2cSJim Jagielski 		if ( nLength > 1 && aFormatCode.charAt( nLength-1 ) == '"' )
2042*b1cdbd2cSJim Jagielski 		{
2043*b1cdbd2cSJim Jagielski 			//	find start of quoted string
2044*b1cdbd2cSJim Jagielski 			//	When SvXMLNumFmtElementContext::EndElement creates escaped quotes,
2045*b1cdbd2cSJim Jagielski 			//	they must be handled here, too.
2046*b1cdbd2cSJim Jagielski 
2047*b1cdbd2cSJim Jagielski 			sal_Int32 nFirst = nLength - 2;
2048*b1cdbd2cSJim Jagielski 			while ( nFirst >= 0 && aFormatCode.charAt( nFirst ) != '"' )
2049*b1cdbd2cSJim Jagielski 				--nFirst;
2050*b1cdbd2cSJim Jagielski 			if ( nFirst >= 0 )
2051*b1cdbd2cSJim Jagielski 			{
2052*b1cdbd2cSJim Jagielski 				//	remove both quotes from aFormatCode
2053*b1cdbd2cSJim Jagielski 				rtl::OUString aOld = aFormatCode.makeStringAndClear();
2054*b1cdbd2cSJim Jagielski 				if ( nFirst > 0 )
2055*b1cdbd2cSJim Jagielski 					aFormatCode.append( aOld.copy( 0, nFirst ) );
2056*b1cdbd2cSJim Jagielski 				if ( nLength > nFirst + 2 )
2057*b1cdbd2cSJim Jagielski 					aFormatCode.append( aOld.copy( nFirst + 1, nLength - nFirst - 2 ) );
2058*b1cdbd2cSJim Jagielski 			}
2059*b1cdbd2cSJim Jagielski 		}
2060*b1cdbd2cSJim Jagielski 	}
2061*b1cdbd2cSJim Jagielski 
2062*b1cdbd2cSJim Jagielski 	if (!bAutomatic)
2063*b1cdbd2cSJim Jagielski 		aFormatCode.appendAscii( "[$" );			// intro for "new" currency symbols
2064*b1cdbd2cSJim Jagielski 
2065*b1cdbd2cSJim Jagielski 	aFormatCode.append( aSymbol );
2066*b1cdbd2cSJim Jagielski 
2067*b1cdbd2cSJim Jagielski 	if (!bAutomatic)
2068*b1cdbd2cSJim Jagielski 	{
2069*b1cdbd2cSJim Jagielski 		if ( nLang != LANGUAGE_SYSTEM )
2070*b1cdbd2cSJim Jagielski 		{
2071*b1cdbd2cSJim Jagielski 			//	'-' sign and language code in hex:
2072*b1cdbd2cSJim Jagielski 			aFormatCode.append( (sal_Unicode) '-' );
2073*b1cdbd2cSJim Jagielski 			aFormatCode.append( String::CreateFromInt32( sal_Int32( nLang ), 16 ).ToUpperAscii() );
2074*b1cdbd2cSJim Jagielski 		}
2075*b1cdbd2cSJim Jagielski 
2076*b1cdbd2cSJim Jagielski 		aFormatCode.append( (sal_Unicode) ']' );	// end of "new" currency symbol
2077*b1cdbd2cSJim Jagielski 	}
2078*b1cdbd2cSJim Jagielski }
2079*b1cdbd2cSJim Jagielski 
AddNfKeyword(sal_uInt16 nIndex)2080*b1cdbd2cSJim Jagielski void SvXMLNumFormatContext::AddNfKeyword( sal_uInt16 nIndex )
2081*b1cdbd2cSJim Jagielski {
2082*b1cdbd2cSJim Jagielski 	SvNumberFormatter* pFormatter = pData->GetNumberFormatter();
2083*b1cdbd2cSJim Jagielski 	if (!pFormatter)
2084*b1cdbd2cSJim Jagielski 		return;
2085*b1cdbd2cSJim Jagielski 
2086*b1cdbd2cSJim Jagielski 	if ( nIndex == NF_KEY_G || nIndex == NF_KEY_GG || nIndex == NF_KEY_GGG )
2087*b1cdbd2cSJim Jagielski 		bHasEra = sal_True;
2088*b1cdbd2cSJim Jagielski 
2089*b1cdbd2cSJim Jagielski 	if ( nIndex == NF_KEY_NNNN )
2090*b1cdbd2cSJim Jagielski 	{
2091*b1cdbd2cSJim Jagielski 		nIndex = NF_KEY_NNN;
2092*b1cdbd2cSJim Jagielski 		bHasLongDoW = sal_True;			// to remove string constant with separator
2093*b1cdbd2cSJim Jagielski 	}
2094*b1cdbd2cSJim Jagielski 
2095*b1cdbd2cSJim Jagielski 	String sKeyword = pFormatter->GetKeyword( nFormatLang, nIndex );
2096*b1cdbd2cSJim Jagielski 
2097*b1cdbd2cSJim Jagielski 	if ( nIndex == NF_KEY_H  || nIndex == NF_KEY_HH  ||
2098*b1cdbd2cSJim Jagielski 		 nIndex == NF_KEY_MI || nIndex == NF_KEY_MMI ||
2099*b1cdbd2cSJim Jagielski 		 nIndex == NF_KEY_S  || nIndex == NF_KEY_SS )
2100*b1cdbd2cSJim Jagielski 	{
2101*b1cdbd2cSJim Jagielski 		if ( !bTruncate && !bHasDateTime )
2102*b1cdbd2cSJim Jagielski 		{
2103*b1cdbd2cSJim Jagielski 			//	with truncate-on-overflow = false, add "[]" to first time part
2104*b1cdbd2cSJim Jagielski 
2105*b1cdbd2cSJim Jagielski 			sKeyword.Insert( (sal_Unicode) '[', 0 );
2106*b1cdbd2cSJim Jagielski 			sKeyword.Append( (sal_Unicode) ']' );
2107*b1cdbd2cSJim Jagielski 		}
2108*b1cdbd2cSJim Jagielski 		bHasDateTime = sal_True;
2109*b1cdbd2cSJim Jagielski 	}
2110*b1cdbd2cSJim Jagielski 
2111*b1cdbd2cSJim Jagielski 	aFormatCode.append( sKeyword );
2112*b1cdbd2cSJim Jagielski 
2113*b1cdbd2cSJim Jagielski 	//	collect the date elements that the format contains, to recognize default date formats
2114*b1cdbd2cSJim Jagielski 	switch ( nIndex )
2115*b1cdbd2cSJim Jagielski 	{
2116*b1cdbd2cSJim Jagielski 		case NF_KEY_NN:		eDateDOW = XML_DEA_SHORT;		break;
2117*b1cdbd2cSJim Jagielski 		case NF_KEY_NNN:
2118*b1cdbd2cSJim Jagielski 		case NF_KEY_NNNN:	eDateDOW = XML_DEA_LONG;		break;
2119*b1cdbd2cSJim Jagielski 		case NF_KEY_D:		eDateDay = XML_DEA_SHORT;		break;
2120*b1cdbd2cSJim Jagielski 		case NF_KEY_DD:		eDateDay = XML_DEA_LONG;		break;
2121*b1cdbd2cSJim Jagielski 		case NF_KEY_M:		eDateMonth = XML_DEA_SHORT;		break;
2122*b1cdbd2cSJim Jagielski 		case NF_KEY_MM:		eDateMonth = XML_DEA_LONG;		break;
2123*b1cdbd2cSJim Jagielski 		case NF_KEY_MMM:	eDateMonth = XML_DEA_TEXTSHORT;	break;
2124*b1cdbd2cSJim Jagielski 		case NF_KEY_MMMM:	eDateMonth = XML_DEA_TEXTLONG;	break;
2125*b1cdbd2cSJim Jagielski 		case NF_KEY_YY:		eDateYear = XML_DEA_SHORT;		break;
2126*b1cdbd2cSJim Jagielski 		case NF_KEY_YYYY:	eDateYear = XML_DEA_LONG;		break;
2127*b1cdbd2cSJim Jagielski 		case NF_KEY_H:		eDateHours = XML_DEA_SHORT;		break;
2128*b1cdbd2cSJim Jagielski 		case NF_KEY_HH:		eDateHours = XML_DEA_LONG;		break;
2129*b1cdbd2cSJim Jagielski 		case NF_KEY_MI:		eDateMins = XML_DEA_SHORT;		break;
2130*b1cdbd2cSJim Jagielski 		case NF_KEY_MMI:	eDateMins = XML_DEA_LONG;		break;
2131*b1cdbd2cSJim Jagielski 		case NF_KEY_S:		eDateSecs = XML_DEA_SHORT;		break;
2132*b1cdbd2cSJim Jagielski 		case NF_KEY_SS:		eDateSecs = XML_DEA_LONG;		break;
2133*b1cdbd2cSJim Jagielski 		case NF_KEY_AP:
2134*b1cdbd2cSJim Jagielski 		case NF_KEY_AMPM:	break;			// AM/PM may or may not be in date/time formats -> ignore by itself
2135*b1cdbd2cSJim Jagielski 		default:
2136*b1cdbd2cSJim Jagielski 			bDateNoDefault = sal_True;		// any other element -> no default format
2137*b1cdbd2cSJim Jagielski 	}
2138*b1cdbd2cSJim Jagielski }
2139*b1cdbd2cSJim Jagielski 
lcl_IsAtEnd(rtl::OUStringBuffer & rBuffer,const String & rToken)2140*b1cdbd2cSJim Jagielski sal_Bool lcl_IsAtEnd( rtl::OUStringBuffer& rBuffer, const String& rToken )
2141*b1cdbd2cSJim Jagielski {
2142*b1cdbd2cSJim Jagielski     sal_Int32 nBufLen = rBuffer.getLength();
2143*b1cdbd2cSJim Jagielski     xub_StrLen nTokLen = rToken.Len();
2144*b1cdbd2cSJim Jagielski 
2145*b1cdbd2cSJim Jagielski     if ( nTokLen > nBufLen )
2146*b1cdbd2cSJim Jagielski     	return sal_False;
2147*b1cdbd2cSJim Jagielski 
2148*b1cdbd2cSJim Jagielski 	sal_Int32 nStartPos = nBufLen - nTokLen;
2149*b1cdbd2cSJim Jagielski 	for ( xub_StrLen nTokPos = 0; nTokPos < nTokLen; nTokPos++ )
2150*b1cdbd2cSJim Jagielski 		if ( rToken.GetChar( nTokPos ) != rBuffer.charAt( nStartPos + nTokPos ) )
2151*b1cdbd2cSJim Jagielski 			return sal_False;
2152*b1cdbd2cSJim Jagielski 
2153*b1cdbd2cSJim Jagielski 	return sal_True;
2154*b1cdbd2cSJim Jagielski }
2155*b1cdbd2cSJim Jagielski 
ReplaceNfKeyword(sal_uInt16 nOld,sal_uInt16 nNew)2156*b1cdbd2cSJim Jagielski sal_Bool SvXMLNumFormatContext::ReplaceNfKeyword( sal_uInt16 nOld, sal_uInt16 nNew )
2157*b1cdbd2cSJim Jagielski {
2158*b1cdbd2cSJim Jagielski 	//	replaces one keyword with another if it is found at the end of the code
2159*b1cdbd2cSJim Jagielski 
2160*b1cdbd2cSJim Jagielski 	SvNumberFormatter* pFormatter = pData->GetNumberFormatter();
2161*b1cdbd2cSJim Jagielski 	if (!pFormatter)
2162*b1cdbd2cSJim Jagielski 		return sal_False;
2163*b1cdbd2cSJim Jagielski 
2164*b1cdbd2cSJim Jagielski 	String sOldStr = pFormatter->GetKeyword( nFormatLang, nOld );
2165*b1cdbd2cSJim Jagielski 	if ( lcl_IsAtEnd( aFormatCode, sOldStr ) )
2166*b1cdbd2cSJim Jagielski 	{
2167*b1cdbd2cSJim Jagielski 		// remove old keyword
2168*b1cdbd2cSJim Jagielski 		aFormatCode.setLength( aFormatCode.getLength() - sOldStr.Len() );
2169*b1cdbd2cSJim Jagielski 
2170*b1cdbd2cSJim Jagielski 		// add new keyword
2171*b1cdbd2cSJim Jagielski 		String sNewStr = pFormatter->GetKeyword( nFormatLang, nNew );
2172*b1cdbd2cSJim Jagielski 		aFormatCode.append( sNewStr );
2173*b1cdbd2cSJim Jagielski 
2174*b1cdbd2cSJim Jagielski 		return sal_True;	// changed
2175*b1cdbd2cSJim Jagielski 	}
2176*b1cdbd2cSJim Jagielski 	return sal_False;		// not found
2177*b1cdbd2cSJim Jagielski }
2178*b1cdbd2cSJim Jagielski 
AddCondition(const sal_Int32 nIndex)2179*b1cdbd2cSJim Jagielski void SvXMLNumFormatContext::AddCondition( const sal_Int32 nIndex )
2180*b1cdbd2cSJim Jagielski {
2181*b1cdbd2cSJim Jagielski 	rtl::OUString rApplyName = aMyConditions[nIndex].sMapName;
2182*b1cdbd2cSJim Jagielski 	rtl::OUString rCondition = aMyConditions[nIndex].sCondition;
2183*b1cdbd2cSJim Jagielski 	SvNumberFormatter* pFormatter = pData->GetNumberFormatter();
2184*b1cdbd2cSJim Jagielski 	sal_uInt32 l_nKey = pData->GetKeyForName( rApplyName );
2185*b1cdbd2cSJim Jagielski 	OUString sValue = OUString::createFromAscii( "value()" );		//! define constant
2186*b1cdbd2cSJim Jagielski 	sal_Int32 nValLen = sValue.getLength();
2187*b1cdbd2cSJim Jagielski 
2188*b1cdbd2cSJim Jagielski 	if ( pFormatter && l_nKey != NUMBERFORMAT_ENTRY_NOT_FOUND &&
2189*b1cdbd2cSJim Jagielski 			rCondition.copy( 0, nValLen ) == sValue )
2190*b1cdbd2cSJim Jagielski 	{
2191*b1cdbd2cSJim Jagielski 		//!	test for valid conditions
2192*b1cdbd2cSJim Jagielski 		//!	test for default conditions
2193*b1cdbd2cSJim Jagielski 
2194*b1cdbd2cSJim Jagielski 		OUString sRealCond = rCondition.copy( nValLen, rCondition.getLength() - nValLen );
2195*b1cdbd2cSJim Jagielski 		sal_Bool bDefaultCond = sal_False;
2196*b1cdbd2cSJim Jagielski 
2197*b1cdbd2cSJim Jagielski 		//!	collect all conditions first and adjust default to >=0, >0 or <0 depending on count
2198*b1cdbd2cSJim Jagielski 		//!	allow blanks in conditions
2199*b1cdbd2cSJim Jagielski 		sal_Bool bFirstCond = ( aConditions.getLength() == 0 );
2200*b1cdbd2cSJim Jagielski 		if ( bFirstCond && aMyConditions.size() == 1 && sRealCond.compareToAscii( ">=0" ) == 0 )
2201*b1cdbd2cSJim Jagielski 			bDefaultCond = sal_True;
2202*b1cdbd2cSJim Jagielski 
2203*b1cdbd2cSJim Jagielski 		if ( nType == XML_TOK_STYLES_TEXT_STYLE && nIndex == 2 )
2204*b1cdbd2cSJim Jagielski 		{
2205*b1cdbd2cSJim Jagielski 			//	The third condition in a number format with a text part can only be
2206*b1cdbd2cSJim Jagielski 			//	"all other numbers", the condition string must be empty.
2207*b1cdbd2cSJim Jagielski 			bDefaultCond = sal_True;
2208*b1cdbd2cSJim Jagielski 		}
2209*b1cdbd2cSJim Jagielski 
2210*b1cdbd2cSJim Jagielski 		if (!bDefaultCond)
2211*b1cdbd2cSJim Jagielski 		{
2212*b1cdbd2cSJim Jagielski             sal_Int32 nPos = sRealCond.indexOf( '.' );
2213*b1cdbd2cSJim Jagielski             if ( nPos >= 0 )
2214*b1cdbd2cSJim Jagielski             {   // #i8026# #103991# localize decimal separator
2215*b1cdbd2cSJim Jagielski                 const String& rDecSep = GetLocaleData().getNumDecimalSep();
2216*b1cdbd2cSJim Jagielski                 if ( rDecSep.Len() > 1 || rDecSep.GetChar(0) != '.' )
2217*b1cdbd2cSJim Jagielski                     sRealCond = sRealCond.replaceAt( nPos, 1, rDecSep );
2218*b1cdbd2cSJim Jagielski             }
2219*b1cdbd2cSJim Jagielski 			aConditions.append( (sal_Unicode) '[' );
2220*b1cdbd2cSJim Jagielski 			aConditions.append( sRealCond );
2221*b1cdbd2cSJim Jagielski 			aConditions.append( (sal_Unicode) ']' );
2222*b1cdbd2cSJim Jagielski 		}
2223*b1cdbd2cSJim Jagielski 
2224*b1cdbd2cSJim Jagielski 		const SvNumberformat* pFormat = pFormatter->GetEntry(l_nKey);
2225*b1cdbd2cSJim Jagielski 		if ( pFormat )
2226*b1cdbd2cSJim Jagielski 			aConditions.append( OUString( pFormat->GetFormatstring() ) );
2227*b1cdbd2cSJim Jagielski 
2228*b1cdbd2cSJim Jagielski 		aConditions.append( (sal_Unicode) ';' );
2229*b1cdbd2cSJim Jagielski 	}
2230*b1cdbd2cSJim Jagielski }
2231*b1cdbd2cSJim Jagielski 
AddCondition(const sal_Int32 nIndex,const rtl::OUString & rFormat,const LocaleDataWrapper & rData)2232*b1cdbd2cSJim Jagielski void SvXMLNumFormatContext::AddCondition( const sal_Int32 nIndex, const rtl::OUString& rFormat, const LocaleDataWrapper& rData )
2233*b1cdbd2cSJim Jagielski {
2234*b1cdbd2cSJim Jagielski 	rtl::OUString rCondition = aMyConditions[nIndex].sCondition;
2235*b1cdbd2cSJim Jagielski 	OUString sValue = OUString::createFromAscii( "value()" );		//! define constant
2236*b1cdbd2cSJim Jagielski 	sal_Int32 nValLen = sValue.getLength();
2237*b1cdbd2cSJim Jagielski 
2238*b1cdbd2cSJim Jagielski 	if ( rCondition.copy( 0, nValLen ) == sValue )
2239*b1cdbd2cSJim Jagielski 	{
2240*b1cdbd2cSJim Jagielski 		//!	test for valid conditions
2241*b1cdbd2cSJim Jagielski 		//!	test for default conditions
2242*b1cdbd2cSJim Jagielski 
2243*b1cdbd2cSJim Jagielski 		OUString sRealCond = rCondition.copy( nValLen, rCondition.getLength() - nValLen );
2244*b1cdbd2cSJim Jagielski 		sal_Bool bDefaultCond = sal_False;
2245*b1cdbd2cSJim Jagielski 
2246*b1cdbd2cSJim Jagielski 		//!	collect all conditions first and adjust default to >=0, >0 or <0 depending on count
2247*b1cdbd2cSJim Jagielski 		//!	allow blanks in conditions
2248*b1cdbd2cSJim Jagielski 		sal_Bool bFirstCond = ( aConditions.getLength() == 0 );
2249*b1cdbd2cSJim Jagielski 		if ( bFirstCond && aMyConditions.size() == 1 && sRealCond.compareToAscii( ">=0" ) == 0 )
2250*b1cdbd2cSJim Jagielski 			bDefaultCond = sal_True;
2251*b1cdbd2cSJim Jagielski 
2252*b1cdbd2cSJim Jagielski 		if ( nType == XML_TOK_STYLES_TEXT_STYLE && nIndex == 2 )
2253*b1cdbd2cSJim Jagielski 		{
2254*b1cdbd2cSJim Jagielski 			//	The third condition in a number format with a text part can only be
2255*b1cdbd2cSJim Jagielski 			//	"all other numbers", the condition string must be empty.
2256*b1cdbd2cSJim Jagielski 			bDefaultCond = sal_True;
2257*b1cdbd2cSJim Jagielski 		}
2258*b1cdbd2cSJim Jagielski 
2259*b1cdbd2cSJim Jagielski 		if (!bDefaultCond)
2260*b1cdbd2cSJim Jagielski 		{
2261*b1cdbd2cSJim Jagielski             sal_Int32 nPos = sRealCond.indexOf( '.' );
2262*b1cdbd2cSJim Jagielski             if ( nPos >= 0 )
2263*b1cdbd2cSJim Jagielski             {   // #i8026# #103991# localize decimal separator
2264*b1cdbd2cSJim Jagielski                 const String& rDecSep = rData.getNumDecimalSep();
2265*b1cdbd2cSJim Jagielski                 if ( rDecSep.Len() > 1 || rDecSep.GetChar(0) != '.' )
2266*b1cdbd2cSJim Jagielski                     sRealCond = sRealCond.replaceAt( nPos, 1, rDecSep );
2267*b1cdbd2cSJim Jagielski             }
2268*b1cdbd2cSJim Jagielski 			aConditions.append( (sal_Unicode) '[' );
2269*b1cdbd2cSJim Jagielski 			aConditions.append( sRealCond );
2270*b1cdbd2cSJim Jagielski 			aConditions.append( (sal_Unicode) ']' );
2271*b1cdbd2cSJim Jagielski 		}
2272*b1cdbd2cSJim Jagielski 
2273*b1cdbd2cSJim Jagielski 		aConditions.append( rFormat );
2274*b1cdbd2cSJim Jagielski 
2275*b1cdbd2cSJim Jagielski 		aConditions.append( (sal_Unicode) ';' );
2276*b1cdbd2cSJim Jagielski 	}
2277*b1cdbd2cSJim Jagielski }
2278*b1cdbd2cSJim Jagielski 
AddCondition(const rtl::OUString & rCondition,const rtl::OUString & rApplyName)2279*b1cdbd2cSJim Jagielski void SvXMLNumFormatContext::AddCondition( const rtl::OUString& rCondition, const rtl::OUString& rApplyName )
2280*b1cdbd2cSJim Jagielski {
2281*b1cdbd2cSJim Jagielski 	MyCondition aCondition;
2282*b1cdbd2cSJim Jagielski 	aCondition.sCondition = rCondition;
2283*b1cdbd2cSJim Jagielski 	aCondition.sMapName = rApplyName;
2284*b1cdbd2cSJim Jagielski 	aMyConditions.push_back(aCondition);
2285*b1cdbd2cSJim Jagielski }
2286*b1cdbd2cSJim Jagielski 
AddColor(const Color & rColor)2287*b1cdbd2cSJim Jagielski void SvXMLNumFormatContext::AddColor( const Color& rColor )
2288*b1cdbd2cSJim Jagielski {
2289*b1cdbd2cSJim Jagielski 	SvNumberFormatter* pFormatter = pData->GetNumberFormatter();
2290*b1cdbd2cSJim Jagielski 	if (!pFormatter)
2291*b1cdbd2cSJim Jagielski 		return;
2292*b1cdbd2cSJim Jagielski 
2293*b1cdbd2cSJim Jagielski 	OUStringBuffer aColName;
2294*b1cdbd2cSJim Jagielski 	for ( sal_uInt16 i=0; i<XML_NUMF_COLORCOUNT; i++ )
2295*b1cdbd2cSJim Jagielski 		if ( rColor == aNumFmtStdColors[i] )
2296*b1cdbd2cSJim Jagielski 		{
2297*b1cdbd2cSJim Jagielski 			aColName = OUString( pFormatter->GetKeyword( nFormatLang, sal::static_int_cast< sal_uInt16 >(NF_KEY_FIRSTCOLOR + i) ) );
2298*b1cdbd2cSJim Jagielski 			break;
2299*b1cdbd2cSJim Jagielski 		}
2300*b1cdbd2cSJim Jagielski 
2301*b1cdbd2cSJim Jagielski 	if ( aColName.getLength() )
2302*b1cdbd2cSJim Jagielski 	{
2303*b1cdbd2cSJim Jagielski 		aColName.insert( 0, (sal_Unicode) '[' );
2304*b1cdbd2cSJim Jagielski 		aColName.append( (sal_Unicode) ']' );
2305*b1cdbd2cSJim Jagielski 		aFormatCode.insert( 0, aColName.makeStringAndClear() );
2306*b1cdbd2cSJim Jagielski 	}
2307*b1cdbd2cSJim Jagielski }
2308*b1cdbd2cSJim Jagielski 
UpdateCalendar(const rtl::OUString & rNewCalendar)2309*b1cdbd2cSJim Jagielski void SvXMLNumFormatContext::UpdateCalendar( const rtl::OUString& rNewCalendar )
2310*b1cdbd2cSJim Jagielski {
2311*b1cdbd2cSJim Jagielski 	if ( rNewCalendar != sCalendar )
2312*b1cdbd2cSJim Jagielski 	{
2313*b1cdbd2cSJim Jagielski 		sCalendar = rNewCalendar;
2314*b1cdbd2cSJim Jagielski 		if ( sCalendar.getLength() )
2315*b1cdbd2cSJim Jagielski 		{
2316*b1cdbd2cSJim Jagielski 			aFormatCode.appendAscii( "[~" );			// intro for calendar code
2317*b1cdbd2cSJim Jagielski 			aFormatCode.append( sCalendar );
2318*b1cdbd2cSJim Jagielski 			aFormatCode.append( (sal_Unicode) ']' );	// end of "new" currency symbolcalendar code
2319*b1cdbd2cSJim Jagielski 		}
2320*b1cdbd2cSJim Jagielski 	}
2321*b1cdbd2cSJim Jagielski }
2322*b1cdbd2cSJim Jagielski 
IsSystemLanguage()2323*b1cdbd2cSJim Jagielski sal_Bool SvXMLNumFormatContext::IsSystemLanguage()
2324*b1cdbd2cSJim Jagielski {
2325*b1cdbd2cSJim Jagielski     return nFormatLang == LANGUAGE_SYSTEM;
2326*b1cdbd2cSJim Jagielski }
2327*b1cdbd2cSJim Jagielski 
2328*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------
2329*b1cdbd2cSJim Jagielski 
2330*b1cdbd2cSJim Jagielski //
2331*b1cdbd2cSJim Jagielski //	SvXMLNumFmtHelper
2332*b1cdbd2cSJim Jagielski //
2333*b1cdbd2cSJim Jagielski 
2334*b1cdbd2cSJim Jagielski // #110680#
2335*b1cdbd2cSJim Jagielski //SvXMLNumFmtHelper::SvXMLNumFmtHelper(
2336*b1cdbd2cSJim Jagielski //						const uno::Reference<util::XNumberFormatsSupplier>& rSupp )
SvXMLNumFmtHelper(const uno::Reference<util::XNumberFormatsSupplier> & rSupp,const uno::Reference<lang::XMultiServiceFactory> & xServiceFactory)2337*b1cdbd2cSJim Jagielski SvXMLNumFmtHelper::SvXMLNumFmtHelper(
2338*b1cdbd2cSJim Jagielski 	const uno::Reference<util::XNumberFormatsSupplier>& rSupp,
2339*b1cdbd2cSJim Jagielski 	const uno::Reference<lang::XMultiServiceFactory>& xServiceFactory )
2340*b1cdbd2cSJim Jagielski :	mxServiceFactory(xServiceFactory)
2341*b1cdbd2cSJim Jagielski {
2342*b1cdbd2cSJim Jagielski 	DBG_ASSERT( mxServiceFactory.is(), "got no service manager" );
2343*b1cdbd2cSJim Jagielski 
2344*b1cdbd2cSJim Jagielski 	SvNumberFormatter* pFormatter = NULL;
2345*b1cdbd2cSJim Jagielski 	SvNumberFormatsSupplierObj* pObj =
2346*b1cdbd2cSJim Jagielski 					SvNumberFormatsSupplierObj::getImplementation( rSupp );
2347*b1cdbd2cSJim Jagielski 	if (pObj)
2348*b1cdbd2cSJim Jagielski 		pFormatter = pObj->GetNumberFormatter();
2349*b1cdbd2cSJim Jagielski 
2350*b1cdbd2cSJim Jagielski 	// #110680#
2351*b1cdbd2cSJim Jagielski 	// pData = new SvXMLNumImpData( pFormatter );
2352*b1cdbd2cSJim Jagielski 	pData = new SvXMLNumImpData( pFormatter, mxServiceFactory );
2353*b1cdbd2cSJim Jagielski }
2354*b1cdbd2cSJim Jagielski 
2355*b1cdbd2cSJim Jagielski // #110680#
2356*b1cdbd2cSJim Jagielski // SvXMLNumFmtHelper::SvXMLNumFmtHelper( SvNumberFormatter* pNumberFormatter )
SvXMLNumFmtHelper(SvNumberFormatter * pNumberFormatter,const uno::Reference<lang::XMultiServiceFactory> & xServiceFactory)2357*b1cdbd2cSJim Jagielski SvXMLNumFmtHelper::SvXMLNumFmtHelper(
2358*b1cdbd2cSJim Jagielski 	SvNumberFormatter* pNumberFormatter,
2359*b1cdbd2cSJim Jagielski 	const uno::Reference<lang::XMultiServiceFactory>& xServiceFactory )
2360*b1cdbd2cSJim Jagielski :	mxServiceFactory(xServiceFactory)
2361*b1cdbd2cSJim Jagielski {
2362*b1cdbd2cSJim Jagielski 	DBG_ASSERT( mxServiceFactory.is(), "got no service manager" );
2363*b1cdbd2cSJim Jagielski 
2364*b1cdbd2cSJim Jagielski 	// #110680#
2365*b1cdbd2cSJim Jagielski 	// pData = new SvXMLNumImpData( pNumberFormatter );
2366*b1cdbd2cSJim Jagielski 	pData = new SvXMLNumImpData( pNumberFormatter, mxServiceFactory );
2367*b1cdbd2cSJim Jagielski }
2368*b1cdbd2cSJim Jagielski 
~SvXMLNumFmtHelper()2369*b1cdbd2cSJim Jagielski SvXMLNumFmtHelper::~SvXMLNumFmtHelper()
2370*b1cdbd2cSJim Jagielski {
2371*b1cdbd2cSJim Jagielski 	//	remove temporary (volatile) formats from NumberFormatter
2372*b1cdbd2cSJim Jagielski 	pData->RemoveVolatileFormats();
2373*b1cdbd2cSJim Jagielski 
2374*b1cdbd2cSJim Jagielski 	delete pData;
2375*b1cdbd2cSJim Jagielski }
2376*b1cdbd2cSJim Jagielski 
CreateChildContext(SvXMLImport & rImport,sal_uInt16 nPrefix,const OUString & rLocalName,const uno::Reference<xml::sax::XAttributeList> & xAttrList,SvXMLStylesContext & rStyles)2377*b1cdbd2cSJim Jagielski SvXMLStyleContext*	SvXMLNumFmtHelper::CreateChildContext( SvXMLImport& rImport,
2378*b1cdbd2cSJim Jagielski 				sal_uInt16 nPrefix, const OUString& rLocalName,
2379*b1cdbd2cSJim Jagielski 				const uno::Reference<xml::sax::XAttributeList>& xAttrList,
2380*b1cdbd2cSJim Jagielski 				SvXMLStylesContext& rStyles )
2381*b1cdbd2cSJim Jagielski {
2382*b1cdbd2cSJim Jagielski 	SvXMLStyleContext* pContext = NULL;
2383*b1cdbd2cSJim Jagielski 
2384*b1cdbd2cSJim Jagielski 	const SvXMLTokenMap& rTokenMap = pData->GetStylesElemTokenMap();
2385*b1cdbd2cSJim Jagielski 	sal_uInt16 nToken = rTokenMap.Get( nPrefix, rLocalName );
2386*b1cdbd2cSJim Jagielski 	switch (nToken)
2387*b1cdbd2cSJim Jagielski 	{
2388*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLES_NUMBER_STYLE:
2389*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLES_CURRENCY_STYLE:
2390*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLES_PERCENTAGE_STYLE:
2391*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLES_DATE_STYLE:
2392*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLES_TIME_STYLE:
2393*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLES_BOOLEAN_STYLE:
2394*b1cdbd2cSJim Jagielski 		case XML_TOK_STYLES_TEXT_STYLE:
2395*b1cdbd2cSJim Jagielski 			pContext = new SvXMLNumFormatContext( rImport, nPrefix, rLocalName,
2396*b1cdbd2cSJim Jagielski 													pData, nToken, xAttrList, rStyles );
2397*b1cdbd2cSJim Jagielski 			break;
2398*b1cdbd2cSJim Jagielski 	}
2399*b1cdbd2cSJim Jagielski 
2400*b1cdbd2cSJim Jagielski 	// return NULL if not a data style, caller must handle other elements
2401*b1cdbd2cSJim Jagielski 	return pContext;
2402*b1cdbd2cSJim Jagielski }
2403*b1cdbd2cSJim Jagielski 
GetStylesElemTokenMap()2404*b1cdbd2cSJim Jagielski const SvXMLTokenMap& SvXMLNumFmtHelper::GetStylesElemTokenMap()
2405*b1cdbd2cSJim Jagielski {
2406*b1cdbd2cSJim Jagielski 	return pData->GetStylesElemTokenMap();
2407*b1cdbd2cSJim Jagielski }
2408*b1cdbd2cSJim Jagielski 
2409*b1cdbd2cSJim Jagielski /*sal_uInt32 SvXMLNumFmtHelper::GetKeyForName( const rtl::OUString& rName )
2410*b1cdbd2cSJim Jagielski {
2411*b1cdbd2cSJim Jagielski 	return pData->GetKeyForName( rName );
2412*b1cdbd2cSJim Jagielski }*/
2413*b1cdbd2cSJim Jagielski 
2414*b1cdbd2cSJim Jagielski 
2415