Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : : *
6 : : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : : *
8 : : * OpenOffice.org - a multi-platform office productivity suite
9 : : *
10 : : * This file is part of OpenOffice.org.
11 : : *
12 : : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : : * it under the terms of the GNU Lesser General Public License version 3
14 : : * only, as published by the Free Software Foundation.
15 : : *
16 : : * OpenOffice.org is distributed in the hope that it will be useful,
17 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : : * GNU Lesser General Public License version 3 for more details
20 : : * (a copy is included in the LICENSE file that accompanied this code).
21 : : *
22 : : * You should have received a copy of the GNU Lesser General Public License
23 : : * version 3 along with OpenOffice.org. If not, see
24 : : * <http://www.openoffice.org/license.html>
25 : : * for a copy of the LGPLv3 License.
26 : : *
27 : : ************************************************************************/
28 : :
29 : : #include <tools/debug.hxx>
30 : : #include <XMLNumberStylesExport.hxx>
31 : : #include <XMLNumberStylesImport.hxx>
32 : : #include "xmloff/xmlnmspe.hxx"
33 : : #include <xmloff/xmlimp.hxx>
34 : : #include <xmloff/nmspmap.hxx>
35 : : #include <xmloff/xmltoken.hxx>
36 : :
37 : : #include "sdxmlexp_impl.hxx"
38 : : #include "sdxmlimp_impl.hxx"
39 : :
40 : : using namespace ::xmloff::token;
41 : :
42 : : using ::rtl::OUString;
43 : :
44 : : struct SdXMLDataStyleNumber
45 : : {
46 : : enum XMLTokenEnum meNumberStyle;
47 : : sal_Bool mbLong;
48 : : sal_Bool mbTextual;
49 : : sal_Bool mbDecimal02;
50 : : const char* mpText;
51 : : }
52 : : aSdXMLDataStyleNumbers[] =
53 : : {
54 : : { XML_DAY, sal_False, sal_False, sal_False, NULL },
55 : : { XML_DAY, sal_True, sal_False, sal_False, NULL },
56 : : { XML_MONTH, sal_True, sal_False, sal_False, NULL },
57 : : { XML_MONTH, sal_False, sal_True, sal_False, NULL },
58 : : { XML_MONTH, sal_True, sal_True, sal_False, NULL },
59 : : { XML_YEAR, sal_False, sal_False, sal_False, NULL },
60 : : { XML_YEAR, sal_True, sal_False, sal_False, NULL },
61 : : { XML_DAY_OF_WEEK, sal_False, sal_False, sal_False, NULL },
62 : : { XML_DAY_OF_WEEK, sal_True, sal_False, sal_False, NULL },
63 : : { XML_TEXT, sal_False, sal_False, sal_False, "." },
64 : : { XML_TEXT, sal_False, sal_False, sal_False, " " },
65 : : { XML_TEXT, sal_False, sal_False, sal_False, ", " },
66 : : { XML_TEXT, sal_False, sal_False, sal_False, ". " },
67 : : { XML_HOURS, sal_False, sal_False, sal_False, NULL },
68 : : { XML_MINUTES, sal_False, sal_False, sal_False, NULL },
69 : : { XML_TEXT, sal_False, sal_False, sal_False, ":" },
70 : : { XML_AM_PM, sal_False, sal_False, sal_False, NULL },
71 : : { XML_SECONDS, sal_False, sal_False, sal_False, NULL },
72 : : { XML_SECONDS, sal_False, sal_False, sal_True, NULL },
73 : : { XML_TOKEN_INVALID, 0, 0, 0, NULL }
74 : : };
75 : :
76 : : // date
77 : :
78 : : #define DATA_STYLE_NUMBER_END 0
79 : : #define DATA_STYLE_NUMBER_DAY 1 // <number:day/>
80 : : #define DATA_STYLE_NUMBER_DAY_LONG 2 // <number:day number:style="long"/>
81 : : #define DATA_STYLE_NUMBER_MONTH_LONG 3 // <number:month number:style="long"/>
82 : : #define DATA_STYLE_NUMBER_MONTH_TEXT 4 // <number:month number:textual="true"/>
83 : : #define DATA_STYLE_NUMBER_MONTH_LONG_TEXT 5 // <number:month number:style="long" number:textual="true"/>
84 : : #define DATA_STYLE_NUMBER_YEAR 6 // <number:year/>
85 : : #define DATA_STYLE_NUMBER_YEAR_LONG 7 // <number:year number:style="long"/>
86 : : #define DATA_STYLE_NUMBER_DAYOFWEEK 8 // <number:day-of-week/>
87 : : #define DATA_STYLE_NUMBER_DAYOFWEEK_LONG 9 // <number:day-of-week number:style="long"/>
88 : : #define DATA_STYLE_NUMBER_TEXT_POINT 10 // <number:text>.</number:text>
89 : : #define DATA_STYLE_NUMBER_TEXT_SPACE 11 // <number:text> </number:text>
90 : : #define DATA_STYLE_NUMBER_TEXT_COMMASPACE 12 // <number:text>, </number:text>
91 : : #define DATA_STYLE_NUMBER_TEXT_POINTSPACE 13 // <number:text>. </number:text>
92 : : #define DATA_STYLE_NUMBER_HOURS 14 // <number:hours/>
93 : : #define DATA_STYLE_NUMBER_MINUTES 15 // <number:minutes/>
94 : : #define DATA_STYLE_NUMBER_TEXT_COLON 16 // <number:text>:</number:text>
95 : : #define DATA_STYLE_NUMBER_AMPM 17 // <number:am-pm/>
96 : : #define DATA_STYLE_NUMBER_SECONDS 18 // <number:seconds/>
97 : : #define DATA_STYLE_NUMBER_SECONDS_02 19 // <number:seconds number:/>
98 : :
99 : :
100 : : struct SdXMLFixedDataStyle
101 : : {
102 : : const char* mpName;
103 : : sal_Bool mbAutomatic;
104 : : sal_Bool mbDateStyle;
105 : : sal_uInt8 mpFormat[8];
106 : : };
107 : :
108 : : const SdXMLFixedDataStyle aSdXML_Standard_Short =
109 : : {
110 : : "D1", sal_True, sal_True,
111 : : {
112 : : DATA_STYLE_NUMBER_DAY_LONG,
113 : : DATA_STYLE_NUMBER_TEXT_POINT,
114 : : DATA_STYLE_NUMBER_MONTH_LONG,
115 : : DATA_STYLE_NUMBER_TEXT_POINT,
116 : : DATA_STYLE_NUMBER_YEAR_LONG,
117 : : 0, 0, 0
118 : : }
119 : : };
120 : :
121 : : const SdXMLFixedDataStyle aSdXML_Standard_Long =
122 : : {
123 : : "D2", sal_True, sal_True,
124 : : {
125 : : DATA_STYLE_NUMBER_DAYOFWEEK_LONG,
126 : : DATA_STYLE_NUMBER_TEXT_COMMASPACE,
127 : : DATA_STYLE_NUMBER_DAY,
128 : : DATA_STYLE_NUMBER_TEXT_POINTSPACE,
129 : : DATA_STYLE_NUMBER_MONTH_LONG_TEXT,
130 : : DATA_STYLE_NUMBER_TEXT_SPACE,
131 : : DATA_STYLE_NUMBER_YEAR_LONG,
132 : : 0
133 : : }
134 : : };
135 : :
136 : : const SdXMLFixedDataStyle aSdXML_DateStyle_1 =
137 : : {
138 : : "D3", sal_False, sal_True,
139 : : {
140 : : DATA_STYLE_NUMBER_DAY_LONG,
141 : : DATA_STYLE_NUMBER_TEXT_POINT,
142 : : DATA_STYLE_NUMBER_MONTH_LONG,
143 : : DATA_STYLE_NUMBER_TEXT_POINT,
144 : : DATA_STYLE_NUMBER_YEAR,
145 : : 0, 0, 0
146 : : }
147 : : };
148 : :
149 : : const SdXMLFixedDataStyle aSdXML_DateStyle_2 =
150 : : {
151 : : "D4", sal_False, sal_True,
152 : : {
153 : : DATA_STYLE_NUMBER_DAY_LONG,
154 : : DATA_STYLE_NUMBER_TEXT_POINT,
155 : : DATA_STYLE_NUMBER_MONTH_LONG,
156 : : DATA_STYLE_NUMBER_TEXT_POINT,
157 : : DATA_STYLE_NUMBER_YEAR_LONG,
158 : : 0, 0, 0
159 : : }
160 : : };
161 : :
162 : : const SdXMLFixedDataStyle aSdXML_DateStyle_3 =
163 : : {
164 : : "D5", sal_False, sal_True,
165 : : {
166 : : DATA_STYLE_NUMBER_DAY,
167 : : DATA_STYLE_NUMBER_TEXT_POINTSPACE,
168 : : DATA_STYLE_NUMBER_MONTH_TEXT,
169 : : DATA_STYLE_NUMBER_TEXT_SPACE,
170 : : DATA_STYLE_NUMBER_YEAR_LONG,
171 : : 0, 0, 0
172 : : }
173 : : };
174 : :
175 : : const SdXMLFixedDataStyle aSdXML_DateStyle_4 =
176 : : {
177 : : "D6", sal_False, sal_True,
178 : : {
179 : : DATA_STYLE_NUMBER_DAY,
180 : : DATA_STYLE_NUMBER_TEXT_POINTSPACE,
181 : : DATA_STYLE_NUMBER_MONTH_LONG_TEXT,
182 : : DATA_STYLE_NUMBER_TEXT_SPACE,
183 : : DATA_STYLE_NUMBER_YEAR_LONG,
184 : : 0, 0, 0
185 : : }
186 : : };
187 : :
188 : : const SdXMLFixedDataStyle aSdXML_DateStyle_5 =
189 : : {
190 : : "D7", sal_False, sal_True,
191 : : {
192 : : DATA_STYLE_NUMBER_DAYOFWEEK,
193 : : DATA_STYLE_NUMBER_TEXT_COMMASPACE,
194 : : DATA_STYLE_NUMBER_DAY,
195 : : DATA_STYLE_NUMBER_TEXT_POINTSPACE,
196 : : DATA_STYLE_NUMBER_MONTH_LONG_TEXT,
197 : : DATA_STYLE_NUMBER_TEXT_SPACE,
198 : : DATA_STYLE_NUMBER_YEAR_LONG,
199 : : 0
200 : : }
201 : : };
202 : :
203 : : const SdXMLFixedDataStyle aSdXML_DateStyle_6 =
204 : : {
205 : : "D8", sal_False, sal_True,
206 : : {
207 : : DATA_STYLE_NUMBER_DAYOFWEEK_LONG,
208 : : DATA_STYLE_NUMBER_TEXT_COMMASPACE,
209 : : DATA_STYLE_NUMBER_DAY,
210 : : DATA_STYLE_NUMBER_TEXT_POINTSPACE,
211 : : DATA_STYLE_NUMBER_MONTH_LONG_TEXT,
212 : : DATA_STYLE_NUMBER_TEXT_SPACE,
213 : : DATA_STYLE_NUMBER_YEAR_LONG,
214 : : 0
215 : : }
216 : : };
217 : :
218 : : const SdXMLFixedDataStyle aSdXML_TimeStyle_1 =
219 : : { "T1", sal_True, sal_False,
220 : : {
221 : : DATA_STYLE_NUMBER_HOURS,
222 : : DATA_STYLE_NUMBER_TEXT_COLON,
223 : : DATA_STYLE_NUMBER_MINUTES,
224 : : DATA_STYLE_NUMBER_TEXT_COLON,
225 : : DATA_STYLE_NUMBER_SECONDS,
226 : : DATA_STYLE_NUMBER_AMPM,
227 : : 0, 0,
228 : : }
229 : : };
230 : :
231 : : const SdXMLFixedDataStyle aSdXML_TimeStyle_2 =
232 : : { "T2", sal_False, sal_False,
233 : : {
234 : : DATA_STYLE_NUMBER_HOURS,
235 : : DATA_STYLE_NUMBER_TEXT_COLON,
236 : : DATA_STYLE_NUMBER_MINUTES,
237 : : 0, 0, 0, 0, 0
238 : : }
239 : : };
240 : :
241 : : const SdXMLFixedDataStyle aSdXML_TimeStyle_3 =
242 : : { "T3", sal_False, sal_False,
243 : : {
244 : : DATA_STYLE_NUMBER_HOURS,
245 : : DATA_STYLE_NUMBER_TEXT_COLON,
246 : : DATA_STYLE_NUMBER_MINUTES,
247 : : DATA_STYLE_NUMBER_TEXT_COLON,
248 : : DATA_STYLE_NUMBER_SECONDS,
249 : : 0, 0, 0
250 : : }
251 : : };
252 : :
253 : : const SdXMLFixedDataStyle aSdXML_TimeStyle_4 =
254 : : { "T4", sal_False, sal_False,
255 : : {
256 : : DATA_STYLE_NUMBER_HOURS,
257 : : DATA_STYLE_NUMBER_TEXT_COLON,
258 : : DATA_STYLE_NUMBER_MINUTES,
259 : : DATA_STYLE_NUMBER_TEXT_COLON,
260 : : DATA_STYLE_NUMBER_SECONDS_02,
261 : : 0, 0, 0
262 : : }
263 : : };
264 : :
265 : : const SdXMLFixedDataStyle aSdXML_TimeStyle_5 =
266 : : { "T5", sal_False, sal_False,
267 : : {
268 : : DATA_STYLE_NUMBER_HOURS,
269 : : DATA_STYLE_NUMBER_TEXT_COLON,
270 : : DATA_STYLE_NUMBER_MINUTES,
271 : : DATA_STYLE_NUMBER_AMPM,
272 : : 0, 0, 0, 0
273 : : }
274 : : };
275 : :
276 : : const SdXMLFixedDataStyle aSdXML_TimeStyle_6 =
277 : : { "T6", sal_False, sal_False,
278 : : {
279 : : DATA_STYLE_NUMBER_HOURS,
280 : : DATA_STYLE_NUMBER_TEXT_COLON,
281 : : DATA_STYLE_NUMBER_MINUTES,
282 : : DATA_STYLE_NUMBER_TEXT_COLON,
283 : : DATA_STYLE_NUMBER_SECONDS,
284 : : DATA_STYLE_NUMBER_AMPM,
285 : : 0, 0
286 : : }
287 : : };
288 : :
289 : : const SdXMLFixedDataStyle aSdXML_TimeStyle_7 =
290 : : { "T7", sal_False, sal_False,
291 : : {
292 : : DATA_STYLE_NUMBER_HOURS,
293 : : DATA_STYLE_NUMBER_TEXT_COLON,
294 : : DATA_STYLE_NUMBER_MINUTES,
295 : : DATA_STYLE_NUMBER_TEXT_COLON,
296 : : DATA_STYLE_NUMBER_SECONDS_02,
297 : : DATA_STYLE_NUMBER_AMPM,
298 : : 0, 0
299 : : }
300 : : };
301 : :
302 : : const SdXMLFixedDataStyle* aSdXMLFixedDateFormats[SdXMLDateFormatCount] =
303 : : {
304 : : &aSdXML_Standard_Short,
305 : : &aSdXML_Standard_Long,
306 : : &aSdXML_DateStyle_1,
307 : : &aSdXML_DateStyle_2,
308 : : &aSdXML_DateStyle_3,
309 : : &aSdXML_DateStyle_4,
310 : : &aSdXML_DateStyle_5,
311 : : &aSdXML_DateStyle_6,
312 : : };
313 : :
314 : : const SdXMLFixedDataStyle* aSdXMLFixedTimeFormats[SdXMLTimeFormatCount] =
315 : : {
316 : : &aSdXML_TimeStyle_1,
317 : : &aSdXML_TimeStyle_2,
318 : : &aSdXML_TimeStyle_3,
319 : : &aSdXML_TimeStyle_4,
320 : : &aSdXML_TimeStyle_5,
321 : : &aSdXML_TimeStyle_6,
322 : : &aSdXML_TimeStyle_7
323 : : };
324 : :
325 : :
326 : : ///////////////////////////////////////////////////////////////////////
327 : : // export
328 : :
329 : 0 : static void SdXMLExportDataStyleNumber( SdXMLExport& rExport, SdXMLDataStyleNumber& rElement )
330 : : {
331 [ # # ]: 0 : if( rElement.mbDecimal02 )
332 : : {
333 [ # # ]: 0 : rExport.AddAttribute( XML_NAMESPACE_NUMBER, XML_DECIMAL_PLACES, XML_2 );
334 : : }
335 : :
336 [ # # ]: 0 : if( rElement.mbLong )
337 : : {
338 [ # # ]: 0 : rExport.AddAttribute( XML_NAMESPACE_NUMBER, XML_STYLE, XML_LONG );
339 : : }
340 : :
341 [ # # ]: 0 : if( rElement.mbTextual )
342 : : {
343 [ # # ]: 0 : rExport.AddAttribute( XML_NAMESPACE_NUMBER, XML_TEXTUAL, XML_TRUE );
344 : : }
345 : :
346 [ # # ]: 0 : SvXMLElementExport aNumberStyle( rExport, XML_NAMESPACE_NUMBER, rElement.meNumberStyle, sal_True, sal_False );
347 [ # # ]: 0 : if( rElement.mpText )
348 : : {
349 : 0 : OUString sAttrValue( OUString::createFromAscii( rElement.mpText ) );
350 [ # # ][ # # ]: 0 : rExport.GetDocHandler()->characters( sAttrValue );
351 [ # # ]: 0 : }
352 : 0 : }
353 : :
354 : 0 : static void SdXMLExportStyle( SdXMLExport& rExport, const SdXMLFixedDataStyle* pStyle, const SdXMLFixedDataStyle* pStyle2 = NULL )
355 : : {
356 : 0 : OUString sAttrValue;
357 : :
358 : : // name
359 : 0 : sAttrValue = OUString::createFromAscii( pStyle->mpName );
360 [ # # ]: 0 : if( pStyle2 )
361 : 0 : sAttrValue += OUString::createFromAscii( pStyle2->mpName );
362 : :
363 [ # # ]: 0 : rExport.AddAttribute( XML_NAMESPACE_STYLE, XML_NAME, sAttrValue );
364 : :
365 [ # # ]: 0 : if( pStyle->mbAutomatic )
366 : : {
367 [ # # ]: 0 : rExport.AddAttribute( XML_NAMESPACE_NUMBER, XML_AUTOMATIC_ORDER, XML_TRUE );
368 : : }
369 : :
370 [ # # ][ # # ]: 0 : SvXMLElementExport aElement( rExport, XML_NAMESPACE_NUMBER, pStyle->mbDateStyle ? XML_DATE_STYLE : XML_TIME_STYLE, sal_True, sal_True );
371 : :
372 [ # # ]: 0 : do
373 : : {
374 : :
375 : 0 : const sal_uInt8* pElements = (const sal_uInt8*)&pStyle->mpFormat[0];
376 : :
377 [ # # ]: 0 : while( *pElements )
378 : : {
379 : 0 : SdXMLDataStyleNumber& rElement = aSdXMLDataStyleNumbers[ (*pElements++) - 1 ];
380 [ # # ]: 0 : SdXMLExportDataStyleNumber( rExport, rElement );
381 : : }
382 : :
383 [ # # ]: 0 : if( pStyle2 )
384 : : {
385 : 0 : SdXMLDataStyleNumber& rElement = aSdXMLDataStyleNumbers[ DATA_STYLE_NUMBER_TEXT_SPACE - 1 ];
386 [ # # ]: 0 : SdXMLExportDataStyleNumber( rExport, rElement );
387 : : }
388 : :
389 : 0 : pStyle = pStyle2;
390 : 0 : pStyle2 = NULL;
391 : : }
392 [ # # ]: 0 : while( pStyle );
393 : 0 : }
394 : :
395 : 0 : void SdXMLNumberStylesExporter::exportTimeStyle( SdXMLExport& rExport, sal_Int32 nStyle )
396 : : {
397 : : DBG_ASSERT( (nStyle >= 0) && (nStyle < SdXMLTimeFormatCount), "Unknown time style!" );
398 [ # # ][ # # ]: 0 : if( (nStyle >= 0) && (nStyle < SdXMLTimeFormatCount) )
399 : 0 : SdXMLExportStyle( rExport, aSdXMLFixedTimeFormats[ nStyle ] );
400 : 0 : }
401 : :
402 : 0 : void SdXMLNumberStylesExporter::exportDateStyle( SdXMLExport& rExport, sal_Int32 nStyle )
403 : : {
404 [ # # ]: 0 : if( nStyle > 0x0f )
405 : : {
406 : 0 : int nDateStyle = nStyle & 0x0f;
407 : 0 : bool bHasDate = nDateStyle != 0;
408 : :
409 [ # # ]: 0 : if( nDateStyle > 1 )
410 : 0 : nDateStyle -= 2;
411 : :
412 : : DBG_ASSERT( (nDateStyle >= 0) && (nDateStyle < SdXMLDateFormatCount), "unknown date style!" );
413 : :
414 : 0 : int nTimeStyle = (nStyle >> 4) & 0x0f;
415 : 0 : bool bHasTime = nTimeStyle != 0;
416 : :
417 [ # # ]: 0 : if( nTimeStyle > 1 )
418 : 0 : nTimeStyle -= 2;
419 : :
420 : : DBG_ASSERT( (nTimeStyle >= 0) && (nTimeStyle < SdXMLTimeFormatCount), "Unknown time style!" );
421 : :
422 [ # # ][ # # ]: 0 : if( (nDateStyle >= 0) && (nDateStyle < SdXMLDateFormatCount) && (nTimeStyle >= 0) && (nTimeStyle < SdXMLTimeFormatCount) )
[ # # ][ # # ]
423 : : {
424 [ # # ]: 0 : if( bHasDate )
425 : : {
426 [ # # ]: 0 : if( bHasTime )
427 : : {
428 : 0 : SdXMLExportStyle( rExport, aSdXMLFixedDateFormats[ nDateStyle ], aSdXMLFixedTimeFormats[ nTimeStyle ] );
429 : : }
430 : : else
431 : : {
432 : 0 : SdXMLExportStyle( rExport, aSdXMLFixedDateFormats[ nDateStyle ] );
433 : : }
434 : : }
435 [ # # ]: 0 : else if( bHasTime )
436 : : {
437 : 0 : SdXMLExportStyle( rExport, aSdXMLFixedTimeFormats[ nTimeStyle ] );
438 : : }
439 : : }
440 : : }
441 : : else
442 : : {
443 : : DBG_ASSERT( (nStyle >= 0) && (nStyle < SdXMLDateFormatCount), "unknown date style!" );
444 [ # # ][ # # ]: 0 : if( (nStyle >= 0) && (nStyle < SdXMLDateFormatCount) )
445 : 0 : SdXMLExportStyle( rExport, aSdXMLFixedDateFormats[ nStyle ] );
446 : : }
447 : 0 : }
448 : :
449 : 0 : OUString SdXMLNumberStylesExporter::getTimeStyleName(const sal_Int32 nTimeFormat )
450 : : {
451 : 0 : sal_Int32 nFormat = nTimeFormat;
452 [ # # ]: 0 : if( nFormat > 1 )
453 : 0 : nFormat -= 2;
454 : :
455 [ # # ][ # # ]: 0 : if( (nFormat >= 0) && (nFormat < SdXMLTimeFormatCount) )
456 : : {
457 : 0 : return OUString::createFromAscii(aSdXMLFixedTimeFormats[nFormat]->mpName );
458 : : }
459 : : else
460 : : {
461 : 0 : return OUString();
462 : : }
463 : : }
464 : :
465 : 0 : OUString SdXMLNumberStylesExporter::getDateStyleName(const sal_Int32 nDateFormat )
466 : : {
467 : 0 : sal_Int32 nFormat = nDateFormat;
468 : :
469 [ # # ]: 0 : if( nFormat > 0x0f )
470 : : {
471 : 0 : OUString aStr;
472 [ # # ]: 0 : if( nFormat & 0x0f )
473 [ # # ]: 0 : aStr = getDateStyleName( nFormat & 0x0f );
474 : 0 : aStr += getTimeStyleName( (nFormat >> 4) & 0x0f );
475 : 0 : return aStr;
476 : : }
477 : :
478 [ # # ]: 0 : if( nFormat > 1 )
479 : 0 : nFormat -= 2;
480 : :
481 [ # # ][ # # ]: 0 : if( (nFormat >= 0) && (nFormat < SdXMLDateFormatCount) )
482 : : {
483 : 0 : return OUString::createFromAscii(aSdXMLFixedDateFormats[nFormat]->mpName );
484 : : }
485 : : else
486 : : {
487 : 0 : return OUString();
488 : : }
489 : : }
490 : :
491 : :
492 : : ///////////////////////////////////////////////////////////////////////
493 : : // import
494 : :
495 : : class SdXMLNumberFormatMemberImportContext : public SvXMLImportContext
496 : : {
497 : : private:
498 : : SdXMLNumberFormatImportContext* mpParent;
499 : :
500 : : OUString maNumberStyle;
501 : : sal_Bool mbLong;
502 : : sal_Bool mbTextual;
503 : : sal_Bool mbDecimal02;
504 : : OUString maText;
505 : : SvXMLImportContext* mpSlaveContext;
506 : :
507 : : public:
508 : : TYPEINFO();
509 : :
510 : : SdXMLNumberFormatMemberImportContext( SvXMLImport& rImport,
511 : : sal_uInt16 nPrfx,
512 : : const rtl::OUString& rLocalName,
513 : : const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
514 : : SdXMLNumberFormatImportContext* pParent,
515 : : SvXMLImportContext* pSlaveContext );
516 : : virtual ~SdXMLNumberFormatMemberImportContext();
517 : :
518 : : virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
519 : : const ::rtl::OUString& rLocalName,
520 : : const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList );
521 : :
522 : : virtual void StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList );
523 : :
524 : : virtual void EndElement();
525 : :
526 : : virtual void Characters( const ::rtl::OUString& rChars );
527 : : };
528 : :
529 [ # # ][ # # ]: 0 : TYPEINIT1( SdXMLNumberFormatMemberImportContext, SvXMLImportContext );
530 : :
531 : 0 : SdXMLNumberFormatMemberImportContext::SdXMLNumberFormatMemberImportContext( SvXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLocalName, const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList, SdXMLNumberFormatImportContext* pParent, SvXMLImportContext* pSlaveContext )
532 : : : SvXMLImportContext(rImport, nPrfx, rLocalName),
533 : : mpParent( pParent ),
534 : : maNumberStyle( rLocalName ),
535 : 0 : mpSlaveContext( pSlaveContext )
536 : : {
537 : 0 : mbLong = sal_False;
538 : 0 : mbTextual = sal_False;
539 : 0 : mbDecimal02 = sal_False;
540 : :
541 [ # # ][ # # ]: 0 : const sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
[ # # ]
542 [ # # ]: 0 : for(sal_Int16 i=0; i < nAttrCount; i++)
543 : : {
544 [ # # ][ # # ]: 0 : OUString sAttrName = xAttrList->getNameByIndex( i );
545 : 0 : OUString aLocalName;
546 [ # # ]: 0 : sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
547 [ # # ][ # # ]: 0 : OUString sValue = xAttrList->getValueByIndex( i );
548 : :
549 [ # # ]: 0 : if( nPrefix == XML_NAMESPACE_NUMBER )
550 : : {
551 [ # # ][ # # ]: 0 : if( IsXMLToken( aLocalName, XML_DECIMAL_PLACES ) )
552 : : {
553 [ # # ]: 0 : mbDecimal02 = IsXMLToken( sValue, XML_2 );
554 : : }
555 [ # # ][ # # ]: 0 : else if( IsXMLToken( aLocalName, XML_STYLE ) )
556 : : {
557 [ # # ]: 0 : mbLong = IsXMLToken( sValue, XML_LONG );
558 : : }
559 [ # # ][ # # ]: 0 : else if( IsXMLToken( aLocalName, XML_TEXTUAL ) )
560 : : {
561 [ # # ]: 0 : mbTextual = IsXMLToken( sValue, XML_TRUE );
562 : : }
563 : : }
564 : 0 : }
565 : :
566 : 0 : }
567 : :
568 : 0 : SdXMLNumberFormatMemberImportContext::~SdXMLNumberFormatMemberImportContext()
569 : : {
570 [ # # ]: 0 : }
571 : :
572 : 0 : SvXMLImportContext *SdXMLNumberFormatMemberImportContext::CreateChildContext( sal_uInt16 nPrefix,
573 : : const ::rtl::OUString& rLocalName,
574 : : const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList )
575 : : {
576 : 0 : return mpSlaveContext->CreateChildContext( nPrefix, rLocalName, xAttrList );
577 : : }
578 : :
579 : 0 : void SdXMLNumberFormatMemberImportContext::StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList )
580 : : {
581 : 0 : mpSlaveContext->StartElement( xAttrList );
582 : 0 : }
583 : :
584 : 0 : void SdXMLNumberFormatMemberImportContext::EndElement()
585 : : {
586 : 0 : mpSlaveContext->EndElement();
587 : :
588 [ # # ]: 0 : if( mpParent )
589 : 0 : mpParent->add( maNumberStyle, mbLong, mbTextual, mbDecimal02, maText );
590 : 0 : }
591 : :
592 : 0 : void SdXMLNumberFormatMemberImportContext::Characters( const ::rtl::OUString& rChars )
593 : : {
594 : 0 : mpSlaveContext->Characters( rChars );
595 : 0 : maText += rChars;
596 : 0 : }
597 : :
598 [ # # ][ # # ]: 12 : TYPEINIT1( SdXMLNumberFormatImportContext, SvXMLImportContext );
599 : :
600 : :
601 : 0 : SdXMLNumberFormatImportContext::SdXMLNumberFormatImportContext( SdXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLocalName, SvXMLNumImpData* pNewData, sal_uInt16 nNewType, const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList, SvXMLStylesContext& rStyles)
602 : : : SvXMLNumFormatContext(rImport, nPrfx, rLocalName, pNewData, nNewType, xAttrList, rStyles),
603 : : mbAutomatic( sal_False ),
604 : : mnIndex(0),
605 : 0 : mnKey( -1 )
606 : : {
607 [ # # ]: 0 : mbTimeStyle = IsXMLToken( rLocalName, XML_TIME_STYLE );
608 : :
609 [ # # ][ # # ]: 0 : const sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
[ # # ]
610 [ # # ]: 0 : for(sal_Int16 i=0; i < nAttrCount; i++)
611 : : {
612 [ # # ][ # # ]: 0 : OUString sAttrName = xAttrList->getNameByIndex( i );
613 : 0 : OUString aLocalName;
614 [ # # ]: 0 : sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
615 [ # # ][ # # ]: 0 : OUString sValue = xAttrList->getValueByIndex( i );
616 : :
617 [ # # ]: 0 : if( nPrefix == XML_NAMESPACE_NUMBER )
618 : : {
619 [ # # ][ # # ]: 0 : if( IsXMLToken( aLocalName, XML_AUTOMATIC_ORDER ) )
620 : : {
621 [ # # ]: 0 : mbAutomatic = IsXMLToken( sValue, XML_TRUE );
622 : : }
623 : : }
624 : 0 : }
625 : 0 : }
626 : :
627 : 0 : SdXMLNumberFormatImportContext::~SdXMLNumberFormatImportContext()
628 : : {
629 [ # # ]: 0 : }
630 : :
631 : 0 : void SdXMLNumberFormatImportContext::add( OUString& rNumberStyle, sal_Bool bLong, sal_Bool bTextual, sal_Bool bDecimal02, OUString& rText )
632 : : {
633 [ # # ][ # # ]: 0 : if( mnIndex == -1 || mnIndex == 16 )
634 : : {
635 : 0 : mnIndex = -1;
636 : 0 : return;
637 : : }
638 : :
639 : 0 : const SdXMLDataStyleNumber* pStyleMember = aSdXMLDataStyleNumbers;
640 [ # # ]: 0 : for( sal_uInt8 nIndex = 0; pStyleMember->meNumberStyle != XML_TOKEN_INVALID; nIndex++, pStyleMember++ )
641 : : {
642 [ # # ][ # # ]: 0 : if( (IsXMLToken(rNumberStyle, pStyleMember->meNumberStyle) &&
[ # # ][ # # ]
[ # # # # ]
[ # # # # ]
[ # # ]
643 : : (pStyleMember->mbLong == bLong) &&
644 : : (pStyleMember->mbTextual == bTextual) &&
645 : : (pStyleMember->mbDecimal02 == bDecimal02) &&
646 : 0 : ( ( (pStyleMember->mpText == NULL) && (rText.isEmpty()) ) ||
647 : 0 : ( pStyleMember->mpText && (rText.compareToAscii( pStyleMember->mpText ) == 0 )) ) ) )
648 : : {
649 : 0 : mnElements[mnIndex++] = nIndex + 1;
650 : 0 : return;
651 : : }
652 : : }
653 : : }
654 : :
655 : 0 : bool SdXMLNumberFormatImportContext::compareStyle( const SdXMLFixedDataStyle* pStyle, sal_Int16& nIndex ) const
656 : : {
657 [ # # ][ # # ]: 0 : if( (pStyle->mbAutomatic != mbAutomatic) && (nIndex == 0))
658 : 0 : return sal_False;
659 : :
660 : : sal_Int16 nCompareIndex;
661 [ # # ]: 0 : for( nCompareIndex = 0; nCompareIndex < 8; nIndex++, nCompareIndex++ )
662 : : {
663 [ # # ]: 0 : if( pStyle->mpFormat[nCompareIndex] != mnElements[nIndex] )
664 : 0 : return sal_False;
665 : : }
666 : :
667 : 0 : return sal_True;
668 : : }
669 : :
670 : 0 : void SdXMLNumberFormatImportContext::EndElement()
671 : : {
672 : 0 : SvXMLNumFormatContext::EndElement();
673 : :
674 [ # # ]: 0 : for( ; mnIndex < 16; mnIndex++ )
675 : : {
676 : 0 : mnElements[mnIndex] = 0;
677 : : }
678 : :
679 [ # # ]: 0 : if( mbTimeStyle )
680 : : {
681 : : // compare import with all time styles
682 [ # # ]: 0 : for( sal_Int16 nFormat = 0; nFormat < SdXMLTimeFormatCount; nFormat++ )
683 : : {
684 : 0 : sal_Int16 nIndex = 0;
685 [ # # ]: 0 : if( compareStyle( aSdXMLFixedTimeFormats[nFormat], nIndex ) )
686 : : {
687 : 0 : mnKey = nFormat + 2;
688 : : break;
689 : : }
690 : : }
691 : : }
692 : : else
693 : : {
694 : : // compare import with all date styles
695 [ # # ]: 0 : for( sal_Int16 nFormat = 0; nFormat < SdXMLDateFormatCount; nFormat++ )
696 : : {
697 : 0 : sal_Int16 nIndex = 0;
698 [ # # ]: 0 : if( compareStyle( aSdXMLFixedDateFormats[nFormat], nIndex ) )
699 : : {
700 : 0 : mnKey = nFormat + 2;
701 : : break;
702 : : }
703 [ # # ]: 0 : else if( mnElements[nIndex] == DATA_STYLE_NUMBER_TEXT_SPACE )
704 : : {
705 : : // if its a valid date ending with a space, see if a time style follows
706 [ # # ]: 0 : for( sal_Int16 nTimeFormat = 0; nTimeFormat < SdXMLTimeFormatCount; nTimeFormat++ )
707 : : {
708 : 0 : sal_Int16 nIndex2 = nIndex + 1;
709 [ # # ]: 0 : if( compareStyle( aSdXMLFixedTimeFormats[nTimeFormat], nIndex2 ) )
710 : : {
711 : 0 : mnKey = (nFormat + 2) | ((nTimeFormat + 2) << 4);
712 : : break;
713 : : }
714 : : }
715 : : }
716 : : }
717 : :
718 : : // no date style found? maybe its an extended time style
719 [ # # ]: 0 : if( mnKey == -1 )
720 : : {
721 : : // compare import with all time styles
722 [ # # ]: 0 : for( sal_Int16 nFormat = 0; nFormat < SdXMLTimeFormatCount; nFormat++ )
723 : : {
724 : 0 : sal_Int16 nIndex = 0;
725 [ # # ]: 0 : if( compareStyle( aSdXMLFixedTimeFormats[nFormat], nIndex ) )
726 : : {
727 : 0 : mnKey = (nFormat + 2) << 4;
728 : : break;
729 : : }
730 : : }
731 : : }
732 : : }
733 : 0 : }
734 : :
735 : 0 : SvXMLImportContext * SdXMLNumberFormatImportContext::CreateChildContext( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList )
736 : : {
737 [ # # ]: 0 : return new SdXMLNumberFormatMemberImportContext( GetImport(), nPrefix, rLocalName, xAttrList, this, SvXMLNumFormatContext::CreateChildContext( nPrefix, rLocalName, xAttrList ) );
738 : : }
739 : :
740 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|