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