xref: /trunk/main/xmloff/source/style/xmlnumi.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_xmloff.hxx"
30 
31 #include <com/sun/star/beans/PropertyValue.hpp>
32 #include <com/sun/star/beans/XPropertySet.hpp>
33 #include <com/sun/star/awt/Size.hpp>
34 #include <com/sun/star/awt/FontDescriptor.hpp>
35 #include <com/sun/star/text/HoriOrientation.hpp>
36 #include <com/sun/star/text/VertOrientation.hpp>
37 // --> OD 2008-01-16 #newlistlevelattrs#
38 #include <com/sun/star/text/PositionAndSpaceMode.hpp>
39 #include <com/sun/star/text/LabelFollow.hpp>
40 // <--
41 #include <com/sun/star/container/XNameContainer.hpp>
42 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
43 #include <com/sun/star/style/XStyle.hpp>
44 #include <com/sun/star/io/XOutputStream.hpp>
45 
46 #include <rtl/ustrbuf.hxx>
47 
48 #include <tools/urlobj.hxx>
49 #include <tools/debug.hxx>
50 #include <tools/fontenum.hxx>
51 
52 #include <xmloff/xmltkmap.hxx>
53 #include <xmloff/nmspmap.hxx>
54 #include "xmloff/xmlnmspe.hxx"
55 #include <xmloff/xmlimp.hxx>
56 #include <xmloff/XMLBase64ImportContext.hxx>
57 #include <xmloff/xmltoken.hxx>
58 
59 #include <xmloff/i18nmap.hxx>
60 #include <xmloff/xmluconv.hxx>
61 #include "fonthdl.hxx"
62 #include <xmloff/XMLFontStylesContext.hxx>
63 #include <xmloff/families.hxx>
64 #include <xmloff/maptype.hxx>
65 
66 #include <xmloff/xmlnumi.hxx>
67 
68 #define _SVSTDARR_USHORTS
69 #include <svl/svstdarr.hxx>
70 
71 
72 using ::rtl::OUString;
73 using ::rtl::OUStringBuffer;
74 
75 using namespace ::com::sun::star;
76 using namespace ::com::sun::star::uno;
77 using namespace ::com::sun::star::style;
78 using namespace ::com::sun::star::text;
79 using namespace ::com::sun::star::beans;
80 using namespace ::com::sun::star::container;
81 using namespace ::com::sun::star::lang;
82 using namespace ::com::sun::star::frame;
83 using namespace ::xmloff::token;
84 using namespace ::com::sun::star::io;
85 
86 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_SYMBOL_TEXT_DISTANCE[] =
87         "SymbolTextDistance";
88 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_PARENT_NUMBERING[] =
89         "ParentNumbering";
90 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_CHAR_STYLE_NAME[] =
91         "CharStyleName";
92 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_BULLET_CHAR[] ="BulletChar";
93 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_BULLET_RELSIZE[] = "BulletRelSize";
94 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_GRAPHIC_SIZE[] =
95         "GraphicSize";
96 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_VERT_ORIENT[] ="VertOrient";
97 
98 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_NUMBERINGTYPE[] = "NumberingType";
99 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_PREFIX[] = "Prefix";
100 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_SUFFIX[] = "Suffix";
101 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_ADJUST[] = "Adjust";
102 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_LEFT_MARGIN[] = "LeftMargin";
103 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_FIRST_LINE_OFFSET[] =
104     "FirstLineOffset";
105 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_BULLET_FONT[] = "BulletFont";
106 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_GRAPHICURL[] = "GraphicURL";
107 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_START_WITH[] = "StartWith";
108 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_BULLET_COLOR[] = "BulletColor";
109 // --> OD 2008-01-15 #newlistlevelattrs#
110 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_POSITION_AND_SPACE_MODE[] = "PositionAndSpaceMode";
111 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_LABEL_FOLLOWED_BY[] = "LabelFollowedBy";
112 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_LISTTAB_STOP_POSITION[] = "ListtabStopPosition";
113 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_FIRST_LINE_INDENT[] = "FirstLineIndent";
114 static sal_Char __READONLY_DATA XML_UNO_NAME_NRULE_INDENT_AT[] = "IndentAt";
115 // <--
116 
117 // ---------------------------------------------------------------------
118 
119 class SvxXMLListLevelStyleContext_Impl;
120 
121 class SvxXMLListLevelStyleAttrContext_Impl : public SvXMLImportContext
122 {
123     SvxXMLListLevelStyleContext_Impl&   rListLevel;
124 
125 public:
126 
127     SvxXMLListLevelStyleAttrContext_Impl(
128             SvXMLImport& rImport, sal_uInt16 nPrfx,
129             const OUString& rLName,
130             const Reference< xml::sax::XAttributeList >& xAttrList,
131             SvxXMLListLevelStyleContext_Impl& rLLevel   );
132     virtual ~SvxXMLListLevelStyleAttrContext_Impl();
133 
134     // --> OD 2008-01-16 #newlistlevelattrs#
135     virtual SvXMLImportContext *CreateChildContext(
136             sal_uInt16 nPrefix, const OUString& rLocalName,
137             const Reference< xml::sax::XAttributeList > & xAttrList );
138     // <--
139 };
140 
141 // ---------------------------------------------------------------------
142 
143 // --> OD 2008-01-16 #newlistlevelattrs#
144 class SvxXMLListLevelStyleLabelAlignmentAttrContext_Impl : public SvXMLImportContext
145 {
146     SvxXMLListLevelStyleContext_Impl&   rListLevel;
147 
148 public:
149 
150     SvxXMLListLevelStyleLabelAlignmentAttrContext_Impl(
151             SvXMLImport& rImport, sal_uInt16 nPrfx,
152             const OUString& rLName,
153             const Reference< xml::sax::XAttributeList >& xAttrList,
154             SvxXMLListLevelStyleContext_Impl& rLLevel   );
155     virtual ~SvxXMLListLevelStyleLabelAlignmentAttrContext_Impl();
156 };
157 // <--
158 
159 // ---------------------------------------------------------------------
160 
161 enum SvxXMLTextListLevelStyleAttrTokens
162 {
163     XML_TOK_TEXT_LEVEL_ATTR_LEVEL,
164     XML_TOK_TEXT_LEVEL_ATTR_STYLE_NAME,
165     XML_TOK_TEXT_LEVEL_ATTR_BULLET_CHAR,
166     XML_TOK_TEXT_LEVEL_ATTR_HREF,
167     XML_TOK_TEXT_LEVEL_ATTR_TYPE,
168     XML_TOK_TEXT_LEVEL_ATTR_SHOW,
169     XML_TOK_TEXT_LEVEL_ATTR_ACTUATE,
170     XML_TOK_TEXT_LEVEL_ATTR_NUM_FORMAT,
171     XML_TOK_TEXT_LEVEL_ATTR_NUM_PREFIX,
172     XML_TOK_TEXT_LEVEL_ATTR_NUM_SUFFIX,
173     XML_TOK_TEXT_LEVEL_ATTR_NUM_LETTER_SYNC,
174     XML_TOK_TEXT_LEVEL_ATTR_START_VALUE,
175     XML_TOK_TEXT_LEVEL_ATTR_DISPLAY_LEVELS,
176 
177     XML_TOK_TEXT_LEVEL_ATTR_END=XML_TOK_UNKNOWN
178 };
179 
180 const SvXMLTokenMapEntry* lcl_getLevelAttrTokenMap()
181 {
182     static __FAR_DATA SvXMLTokenMapEntry aLevelAttrTokenMap[] =
183     {
184         { XML_NAMESPACE_TEXT, XML_LEVEL, XML_TOK_TEXT_LEVEL_ATTR_LEVEL },
185         { XML_NAMESPACE_TEXT, XML_STYLE_NAME, XML_TOK_TEXT_LEVEL_ATTR_STYLE_NAME },
186         { XML_NAMESPACE_TEXT, XML_BULLET_CHAR, XML_TOK_TEXT_LEVEL_ATTR_BULLET_CHAR },
187         { XML_NAMESPACE_XLINK, XML_HREF, XML_TOK_TEXT_LEVEL_ATTR_HREF },
188         { XML_NAMESPACE_XLINK, XML_TYPE, XML_TOK_TEXT_LEVEL_ATTR_TYPE },
189         { XML_NAMESPACE_XLINK, XML_SHOW, XML_TOK_TEXT_LEVEL_ATTR_SHOW },
190         { XML_NAMESPACE_XLINK, XML_ACTUATE, XML_TOK_TEXT_LEVEL_ATTR_ACTUATE },
191 
192         { XML_NAMESPACE_STYLE, XML_NUM_FORMAT, XML_TOK_TEXT_LEVEL_ATTR_NUM_FORMAT },
193         { XML_NAMESPACE_STYLE, XML_NUM_PREFIX, XML_TOK_TEXT_LEVEL_ATTR_NUM_PREFIX },
194         { XML_NAMESPACE_STYLE, XML_NUM_SUFFIX, XML_TOK_TEXT_LEVEL_ATTR_NUM_SUFFIX },
195         { XML_NAMESPACE_STYLE, XML_NUM_LETTER_SYNC, XML_TOK_TEXT_LEVEL_ATTR_NUM_LETTER_SYNC },
196         { XML_NAMESPACE_TEXT, XML_START_VALUE, XML_TOK_TEXT_LEVEL_ATTR_START_VALUE },
197         { XML_NAMESPACE_TEXT, XML_DISPLAY_LEVELS, XML_TOK_TEXT_LEVEL_ATTR_DISPLAY_LEVELS },
198 
199         XML_TOKEN_MAP_END
200     };
201     return aLevelAttrTokenMap;
202 }
203 
204 class SvxXMLListLevelStyleContext_Impl : public SvXMLImportContext
205 {
206     friend class SvxXMLListLevelStyleAttrContext_Impl;
207     const OUString      sStarBats;
208     const OUString      sStarMath;
209 
210     OUString            sPrefix;
211     OUString            sSuffix;
212     OUString            sTextStyleName;
213     OUString            sNumFormat;
214     OUString            sNumLetterSync;
215     OUString            sBulletFontName;
216     OUString            sBulletFontStyleName;
217     OUString            sImageURL;
218 
219     Reference < XOutputStream > xBase64Stream;
220 
221     sal_Int32           nLevel;
222     sal_Int32           nSpaceBefore;
223     sal_Int32           nMinLabelWidth;
224     sal_Int32           nMinLabelDist;
225     sal_Int32           nImageWidth;
226     sal_Int32           nImageHeight;
227     sal_Int16           nNumStartValue;
228     sal_Int16           nNumDisplayLevels;
229 
230     sal_Int16           eAdjust;
231     sal_Int16           eBulletFontFamily;
232     sal_Int16           eBulletFontPitch;
233     rtl_TextEncoding    eBulletFontEncoding;
234     sal_Int16           eImageVertOrient;
235 
236     sal_Unicode         cBullet;
237 
238     sal_Int16           nRelSize;
239     Color               aColor;
240 
241     // --> OD 2008-01-16 #newlistlevelattrs#
242     sal_Int16           ePosAndSpaceMode;
243     sal_Int16           eLabelFollowedBy;
244     sal_Int32           nListtabStopPosition;
245     sal_Int32           nFirstLineIndent;
246     sal_Int32           nIndentAt;
247     // <--
248 
249     sal_Bool            bBullet : 1;
250     sal_Bool            bImage : 1;
251     sal_Bool            bNum : 1;
252     sal_Bool            bHasColor : 1;
253 
254     void SetRelSize( sal_Int16 nRel ) { nRelSize = nRel; }
255     void SetColor( sal_Int32 _aColor ) { aColor = _aColor; bHasColor = sal_True; }
256     void SetSpaceBefore( sal_Int32 nSet ) { nSpaceBefore = nSet; }
257     void SetMinLabelWidth( sal_Int32 nSet ) { nMinLabelWidth = nSet; }
258     void SetMinLabelDist( sal_Int32 nSet ) { nMinLabelDist = nSet; }
259     void SetAdjust( sal_Int16 eSet ) { eAdjust = eSet; }
260 
261     void SetBulletFontName( const OUString& rSet ) { sBulletFontName = rSet; }
262     void SetBulletFontStyleName( const OUString& rSet )
263          { sBulletFontStyleName = rSet; }
264     void SetBulletFontFamily( sal_Int16 eSet ) { eBulletFontFamily = eSet; }
265     void SetBulletFontPitch( sal_Int16 eSet ) { eBulletFontPitch = eSet; }
266     void SetBulletFontEncoding( rtl_TextEncoding eSet )
267          { eBulletFontEncoding = eSet; }
268 
269     void SetImageWidth( sal_Int32 nSet ) { nImageWidth = nSet; }
270     void SetImageHeight( sal_Int32 nSet ) { nImageHeight = nSet; }
271     void SetImageVertOrient( sal_Int16 eSet )
272          { eImageVertOrient = eSet; }
273 
274 public:
275 
276     SvxXMLListLevelStyleContext_Impl(
277             SvXMLImport& rImport, sal_uInt16 nPrfx,
278             const OUString& rLName,
279             const Reference< xml::sax::XAttributeList > & xAttrList );
280     virtual ~SvxXMLListLevelStyleContext_Impl();
281 
282     virtual SvXMLImportContext *CreateChildContext(
283             sal_uInt16 nPrefix, const OUString& rLocalName,
284             const Reference< xml::sax::XAttributeList > & xAttrList );
285 
286     sal_Int32 GetLevel() const { return nLevel; }
287     Sequence<beans::PropertyValue> GetProperties(
288             const SvI18NMap *pI18NMap=0 );
289 
290     // --> OD 2008-01-16 #newlistlevelattrs#
291     inline void SetPosAndSpaceMode( sal_Int16 eValue )
292     {
293         ePosAndSpaceMode = eValue;
294     }
295     inline void SetLabelFollowedBy( sal_Int16 eValue )
296     {
297         eLabelFollowedBy = eValue;
298     }
299     inline void SetListtabStopPosition( sal_Int32 nValue )
300     {
301         nListtabStopPosition = nValue;
302     }
303     inline void SetFirstLineIndent( sal_Int32 nValue )
304     {
305         nFirstLineIndent = nValue;
306     }
307     inline void SetIndentAt( sal_Int32 nValue )
308     {
309         nIndentAt = nValue;
310     }
311     // <--
312 };
313 
314 SvxXMLListLevelStyleContext_Impl::SvxXMLListLevelStyleContext_Impl(
315         SvXMLImport& rImport, sal_uInt16 nPrfx,
316         const OUString& rLName,
317         const Reference< xml::sax::XAttributeList > & xAttrList )
318 
319 :   SvXMLImportContext( rImport, nPrfx, rLName )
320 ,   sStarBats( RTL_CONSTASCII_USTRINGPARAM( "StarBats" ) )
321 ,   sStarMath( RTL_CONSTASCII_USTRINGPARAM( "StarMath" ) )
322 ,   sNumFormat( OUString::createFromAscii( "1" ) )
323 ,   nLevel( -1L )
324 ,   nSpaceBefore( 0L )
325 ,   nMinLabelWidth( 0L )
326 ,   nMinLabelDist( 0L )
327 ,   nImageWidth( 0L )
328 ,   nImageHeight( 0L )
329 ,   nNumStartValue( 1 )
330 ,   nNumDisplayLevels( 1 )
331 ,   eAdjust( HoriOrientation::LEFT )
332 ,   eBulletFontFamily( FAMILY_DONTKNOW )
333 ,   eBulletFontPitch( PITCH_DONTKNOW )
334 ,   eBulletFontEncoding( RTL_TEXTENCODING_DONTKNOW )
335 ,   eImageVertOrient(0)
336 ,   cBullet( 0 )
337 ,   nRelSize(0)
338 ,   aColor( 0 )
339 // --> OD 2008-01-16 #newlistelevelattrs#
340 ,   ePosAndSpaceMode( PositionAndSpaceMode::LABEL_WIDTH_AND_POSITION )
341 ,   eLabelFollowedBy( LabelFollow::LISTTAB )
342 ,   nListtabStopPosition( 0 )
343 ,   nFirstLineIndent( 0 )
344 ,   nIndentAt( 0 )
345 // <--
346 ,   bBullet( sal_False )
347 ,   bImage( sal_False )
348 ,   bNum( sal_False )
349 ,   bHasColor( sal_False )
350 {
351     if( IsXMLToken( rLName, XML_LIST_LEVEL_STYLE_NUMBER ) ||
352         IsXMLToken( rLName, XML_OUTLINE_LEVEL_STYLE )        )
353         bNum = sal_True;
354     else if( IsXMLToken( rLName, XML_LIST_LEVEL_STYLE_BULLET ) )
355         bBullet = sal_True;
356     else if( IsXMLToken( rLName, XML_LIST_LEVEL_STYLE_IMAGE ) )
357         bImage = sal_True;
358 
359     SvXMLTokenMap aTokenMap( lcl_getLevelAttrTokenMap() );
360     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
361     for( sal_Int16 i=0; i < nAttrCount; i++ )
362     {
363         const OUString& rAttrName = xAttrList->getNameByIndex( i );
364         OUString aLocalName;
365         sal_uInt16 nPrefix =
366             GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
367                                                             &aLocalName );
368         const OUString& rValue = xAttrList->getValueByIndex( i );
369 
370         switch( aTokenMap.Get( nPrefix, aLocalName ) )
371         {
372         case XML_TOK_TEXT_LEVEL_ATTR_LEVEL:
373             nLevel = rValue.toInt32();
374             if( nLevel >= 1L )
375                 nLevel--;
376             else
377                 nLevel = 0;
378             break;
379         case XML_TOK_TEXT_LEVEL_ATTR_STYLE_NAME:
380             sTextStyleName = rValue;
381             break;
382         case XML_TOK_TEXT_LEVEL_ATTR_BULLET_CHAR:
383             cBullet = rValue[0];
384             break;
385         case XML_TOK_TEXT_LEVEL_ATTR_HREF:
386             if( bImage )
387                 sImageURL = rValue;
388             break;
389         case XML_TOK_TEXT_LEVEL_ATTR_TYPE:
390         case XML_TOK_TEXT_LEVEL_ATTR_SHOW:
391         case XML_TOK_TEXT_LEVEL_ATTR_ACTUATE:
392             // This properties will be ignored
393             break;
394         case XML_TOK_TEXT_LEVEL_ATTR_NUM_FORMAT:
395             if( bNum )
396                 sNumFormat = rValue;
397             break;
398         case XML_TOK_TEXT_LEVEL_ATTR_NUM_PREFIX:
399             sPrefix = rValue;
400             break;
401         case XML_TOK_TEXT_LEVEL_ATTR_NUM_SUFFIX:
402             sSuffix = rValue;
403             break;
404         case XML_TOK_TEXT_LEVEL_ATTR_NUM_LETTER_SYNC:
405             if( bNum )
406                 sNumLetterSync = rValue;
407             break;
408         case XML_TOK_TEXT_LEVEL_ATTR_START_VALUE:
409             if( bNum )
410             {
411                 sal_Int32 nTmp = rValue.toInt32();
412                 nNumStartValue =
413                     (nTmp < 0L) ? 1 : ( (nTmp>SHRT_MAX) ? SHRT_MAX
414                                                         : (sal_Int16)nTmp );
415             }
416             break;
417         case XML_TOK_TEXT_LEVEL_ATTR_DISPLAY_LEVELS:
418             if( bNum )
419             {
420                 sal_Int32 nTmp = rValue.toInt32();
421                 nNumDisplayLevels =
422                     (nTmp < 1L) ? 1 : ( (nTmp>SHRT_MAX) ? SHRT_MAX
423                                                         : (sal_Int16)nTmp );
424             }
425             break;
426         }
427     }
428 }
429 
430 SvxXMLListLevelStyleContext_Impl::~SvxXMLListLevelStyleContext_Impl()
431 {
432 }
433 
434 SvXMLImportContext *SvxXMLListLevelStyleContext_Impl::CreateChildContext(
435         sal_uInt16 nPrefix, const OUString& rLocalName,
436         const Reference< xml::sax::XAttributeList > & xAttrList )
437 {
438     SvXMLImportContext *pContext = 0;
439     if( XML_NAMESPACE_STYLE == nPrefix &&
440         ( IsXMLToken( rLocalName, XML_LIST_LEVEL_PROPERTIES ) ||
441           IsXMLToken( rLocalName, XML_TEXT_PROPERTIES ) ) )
442     {
443         pContext = new SvxXMLListLevelStyleAttrContext_Impl( GetImport(),
444                                                              nPrefix,
445                                                              rLocalName,
446                                                              xAttrList,
447                                                              *this );
448     }
449     else if( (XML_NAMESPACE_OFFICE == nPrefix) && xmloff::token::IsXMLToken( rLocalName,
450                                         xmloff::token::XML_BINARY_DATA ) )
451     {
452         if( bImage && !sImageURL.getLength() && !xBase64Stream.is() )
453         {
454             xBase64Stream = GetImport().GetStreamForGraphicObjectURLFromBase64();
455             if( xBase64Stream.is() )
456                 pContext = new XMLBase64ImportContext( GetImport(), nPrefix,
457                                                     rLocalName, xAttrList,
458                                                     xBase64Stream );
459         }
460     }
461     if( !pContext )
462     {
463         pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
464     }
465 
466     return pContext;
467 }
468 
469 Sequence<beans::PropertyValue> SvxXMLListLevelStyleContext_Impl::GetProperties(
470         const SvI18NMap *pI18NMap )
471 {
472     sal_Int16 eType;
473 
474     sal_Int32 nCount = 0;
475     if( bBullet )
476     {
477         eType = NumberingType::CHAR_SPECIAL;
478         nCount = cBullet ? 15 : 14;
479     }
480     if( bImage )
481     {
482         eType = NumberingType::BITMAP;
483         nCount = 15;
484 
485         if( (sImageURL.getLength() > 0L) || xBase64Stream.is() )
486             nCount++;
487     }
488     if( bNum )
489     {
490         eType = NumberingType::ARABIC;
491         GetImport().GetMM100UnitConverter().convertNumFormat(
492                 eType, sNumFormat, sNumLetterSync, sal_True );
493         nCount = 15;
494     }
495 
496     if( ( bBullet || bNum ) && nRelSize )
497         nCount++;
498 
499     if( !bImage && bHasColor )
500     {
501         nCount++;
502     }
503 
504     if (bBullet && sSuffix.getLength())
505     {
506         sal_uInt16 const nVersion(GetImport().getGeneratorVersion());
507         sal_Int32 nUPD;
508         sal_Int32 nBuildId;
509         if (GetImport().getBuildIds(nUPD, nBuildId)
510             && (   (SvXMLImport::OOo_1x == nVersion)
511                 || (SvXMLImport::OOo_2x == nVersion)
512                 || (310 == nUPD) || (320 == nUPD) || (330 == nUPD)
513                 || ((300 == nUPD) && (nBuildId <= 9573))))
514         {
515             // #i93908# OOo < 3.4 wrote a bogus suffix for bullet chars
516             sSuffix = ::rtl::OUString(); // clear it
517         }
518     }
519 
520     Sequence<beans::PropertyValue> aPropSeq( nCount );
521     if( nCount > 0 )
522     {
523         beans::PropertyValue *pProps = aPropSeq.getArray();
524         sal_Int32 nPos = 0;
525         pProps[nPos].Name =
526                 OUString::createFromAscii( XML_UNO_NAME_NRULE_NUMBERINGTYPE );
527         pProps[nPos++].Value <<= (sal_Int16)eType ;
528 
529         pProps[nPos].Name = OUString::createFromAscii( XML_UNO_NAME_NRULE_PREFIX );
530         pProps[nPos++].Value <<= sPrefix;
531 
532         pProps[nPos].Name = OUString::createFromAscii( XML_UNO_NAME_NRULE_SUFFIX );
533         pProps[nPos++].Value <<= sSuffix;
534 
535         pProps[nPos].Name = OUString::createFromAscii( XML_UNO_NAME_NRULE_ADJUST );
536         pProps[nPos++].Value <<= eAdjust;
537 
538         sal_Int32 nLeftMargin = nSpaceBefore + nMinLabelWidth;
539         pProps[nPos].Name =
540             OUString::createFromAscii( XML_UNO_NAME_NRULE_LEFT_MARGIN );
541         pProps[nPos++].Value <<= (sal_Int32)nLeftMargin;
542 
543         sal_Int32 nFirstLineOffset = -nMinLabelWidth;
544 
545         pProps[nPos].Name =
546                 OUString::createFromAscii( XML_UNO_NAME_NRULE_FIRST_LINE_OFFSET );
547         pProps[nPos++].Value <<= (sal_Int32)nFirstLineOffset;
548 
549         pProps[nPos].Name =
550             OUString::createFromAscii(XML_UNO_NAME_NRULE_SYMBOL_TEXT_DISTANCE);
551         pProps[nPos++].Value <<= (sal_Int16)nMinLabelDist;
552 
553         // --> OD 2008-01-16 #newlistlevelattrs#
554         pProps[nPos].Name =
555             OUString::createFromAscii(XML_UNO_NAME_NRULE_POSITION_AND_SPACE_MODE);
556         pProps[nPos++].Value <<= (sal_Int16)ePosAndSpaceMode;
557         pProps[nPos].Name =
558             OUString::createFromAscii(XML_UNO_NAME_NRULE_LABEL_FOLLOWED_BY);
559         pProps[nPos++].Value <<= (sal_Int16)eLabelFollowedBy;
560         pProps[nPos].Name =
561             OUString::createFromAscii(XML_UNO_NAME_NRULE_LISTTAB_STOP_POSITION);
562         pProps[nPos++].Value <<= (sal_Int32)nListtabStopPosition;
563         pProps[nPos].Name =
564             OUString::createFromAscii(XML_UNO_NAME_NRULE_FIRST_LINE_INDENT);
565         pProps[nPos++].Value <<= (sal_Int32)nFirstLineIndent;
566         pProps[nPos].Name =
567             OUString::createFromAscii(XML_UNO_NAME_NRULE_INDENT_AT);
568         pProps[nPos++].Value <<= (sal_Int32)nIndentAt;
569         // <--
570 
571         OUString sDisplayTextStyleName = GetImport().GetStyleDisplayName(
572                                 XML_STYLE_FAMILY_TEXT_TEXT, sTextStyleName  );
573         OUString sStyleName = sDisplayTextStyleName;
574         if( sStyleName.getLength() && pI18NMap )
575             sStyleName = pI18NMap->Get( SFX_STYLE_FAMILY_CHAR, sStyleName );
576         pProps[nPos].Name =
577                 OUString::createFromAscii( XML_UNO_NAME_NRULE_CHAR_STYLE_NAME );
578         pProps[nPos++].Value <<= sDisplayTextStyleName;
579 
580         if( bBullet )
581         {
582             awt::FontDescriptor aFDesc;
583             aFDesc.Name = sBulletFontName;
584             if( sBulletFontName.getLength() )
585             {
586                 aFDesc.StyleName = sBulletFontStyleName;
587                 aFDesc.Family = eBulletFontFamily;
588                 aFDesc.Pitch = eBulletFontPitch;
589                 aFDesc.CharSet = eBulletFontEncoding;
590                 aFDesc.Weight = WEIGHT_DONTKNOW;
591                 //aFDesc.Transparant = sal_True;
592                 sal_Bool bStarSymbol = sal_False;
593                 if( aFDesc.Name.equalsIgnoreAsciiCase( sStarBats ) )
594                 {
595                     cBullet = GetImport().ConvStarBatsCharToStarSymbol( cBullet );
596                     bStarSymbol = sal_True;
597                 }
598                 else if( aFDesc.Name.equalsIgnoreAsciiCase( sStarMath ) )
599                 {
600                     cBullet = GetImport().ConvStarMathCharToStarSymbol( cBullet );
601                     bStarSymbol = sal_True;
602                 }
603                 if( bStarSymbol )
604                     aFDesc.Name =
605                         OUString( RTL_CONSTASCII_USTRINGPARAM("StarSymbol" ) );
606             }
607 
608             if( cBullet )
609             {
610                 OUStringBuffer sTmp(1);
611                 sTmp.append( cBullet );
612                 pProps[nPos].Name =
613                         OUString::createFromAscii( XML_UNO_NAME_NRULE_BULLET_CHAR );
614                 pProps[nPos++].Value <<= sTmp.makeStringAndClear();
615             }
616 
617             pProps[nPos].Name =
618                     OUString::createFromAscii( XML_UNO_NAME_NRULE_BULLET_FONT );
619             pProps[nPos++].Value <<= aFDesc;
620 
621         }
622 
623         if( bImage )
624         {
625             OUString sStr( sImageURL );
626             if( sImageURL.getLength() )
627             {
628                 sStr = GetImport().ResolveGraphicObjectURL( sImageURL,
629                                                                  sal_False );
630             }
631             else if( xBase64Stream.is() )
632             {
633                 sStr = GetImport().ResolveGraphicObjectURLFromBase64( xBase64Stream );
634 //              xBase64Stream = 0;
635             }
636 
637             if( sStr.getLength() )
638             {
639                 pProps[nPos].Name =
640                         OUString::createFromAscii( XML_UNO_NAME_NRULE_GRAPHICURL );
641                 pProps[nPos++].Value <<= sStr;
642             }
643 
644             awt::Size aSize( nImageWidth, nImageHeight );
645             pProps[nPos].Name =
646                 OUString::createFromAscii( XML_UNO_NAME_NRULE_GRAPHIC_SIZE );
647             pProps[nPos++].Value <<= aSize;
648 
649             pProps[nPos].Name =
650                 OUString::createFromAscii( XML_UNO_NAME_NRULE_VERT_ORIENT );
651             pProps[nPos++].Value <<= (sal_Int16)eImageVertOrient;
652         }
653 
654         if( bNum )
655         {
656             pProps[nPos].Name =
657                     OUString::createFromAscii( XML_UNO_NAME_NRULE_START_WITH );
658             pProps[nPos++].Value <<= (sal_Int16)nNumStartValue;
659 
660             pProps[nPos].Name =
661                 OUString::createFromAscii(XML_UNO_NAME_NRULE_PARENT_NUMBERING);
662             pProps[nPos++].Value <<= (sal_Int16)nNumDisplayLevels;
663         }
664 
665         if( ( bNum || bBullet ) && nRelSize )
666         {
667             pProps[nPos].Name =
668                 OUString::createFromAscii( XML_UNO_NAME_NRULE_BULLET_RELSIZE );
669             pProps[nPos++].Value <<= nRelSize;
670         }
671 
672         if( !bImage && bHasColor )
673         {
674             pProps[nPos].Name = OUString::createFromAscii( XML_UNO_NAME_NRULE_BULLET_COLOR );
675             pProps[nPos++].Value <<= (sal_Int32)aColor.GetColor();
676         }
677 
678         DBG_ASSERT( nPos == nCount, "array under/overflow" );
679     }
680 
681     return aPropSeq;
682 }
683 
684 // ---------------------------------------------------------------------
685 
686 enum SvxXMLStyleAttributesAttrTokens
687 {
688     XML_TOK_STYLE_ATTRIBUTES_ATTR_SPACE_BEFORE,
689     XML_TOK_STYLE_ATTRIBUTES_ATTR_MIN_LABEL_WIDTH,
690     XML_TOK_STYLE_ATTRIBUTES_ATTR_MIN_LABEL_DIST,
691     XML_TOK_STYLE_ATTRIBUTES_ATTR_TEXT_ALIGN,
692     XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_NAME,
693     XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_FAMILY,
694     XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_FAMILY_GENERIC,
695     XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_STYLENAME,
696     XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_PITCH,
697     XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_CHARSET,
698     XML_TOK_STYLE_ATTRIBUTES_ATTR_VERTICAL_POS,
699     XML_TOK_STYLE_ATTRIBUTES_ATTR_VERTICAL_REL,
700     XML_TOK_STYLE_ATTRIBUTES_ATTR_WIDTH,
701     XML_TOK_STYLE_ATTRIBUTES_ATTR_HEIGHT,
702     XML_TOK_STYLE_ATTRIBUTES_ATTR_COLOR,
703     XML_TOK_STYLE_ATTRIBUTES_ATTR_WINDOW_FONT_COLOR,
704     XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_SIZE,
705     // --> OD 2008-01-16 #newlistlevelattrs#
706     XML_TOK_STYLE_ATTRIBUTES_ATTR_POSITION_AND_SPACE_MODE,
707     // <--
708 
709     XML_TOK_STYLE_ATTRIBUTES_ATTR_END=XML_TOK_UNKNOWN
710 };
711 const SvXMLTokenMapEntry* lcl_getStyleAttributesAttrTokenMap()
712 {
713     static __FAR_DATA SvXMLTokenMapEntry aStyleAttributesAttrTokenMap[] =
714     {
715         { XML_NAMESPACE_TEXT, XML_SPACE_BEFORE,
716                 XML_TOK_STYLE_ATTRIBUTES_ATTR_SPACE_BEFORE },
717         { XML_NAMESPACE_TEXT, XML_MIN_LABEL_WIDTH,
718                 XML_TOK_STYLE_ATTRIBUTES_ATTR_MIN_LABEL_WIDTH },
719         { XML_NAMESPACE_TEXT, XML_MIN_LABEL_DISTANCE,
720                 XML_TOK_STYLE_ATTRIBUTES_ATTR_MIN_LABEL_DIST },
721         { XML_NAMESPACE_FO, XML_TEXT_ALIGN,
722                 XML_TOK_STYLE_ATTRIBUTES_ATTR_TEXT_ALIGN },
723         { XML_NAMESPACE_STYLE, XML_FONT_NAME,
724                 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_NAME },
725         { XML_NAMESPACE_FO, XML_FONT_FAMILY,
726                 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_FAMILY },
727         { XML_NAMESPACE_STYLE, XML_FONT_FAMILY_GENERIC,
728                 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_FAMILY_GENERIC },
729         { XML_NAMESPACE_STYLE, XML_FONT_STYLE_NAME,
730                 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_STYLENAME },
731         { XML_NAMESPACE_STYLE, XML_FONT_PITCH,
732                 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_PITCH },
733         { XML_NAMESPACE_STYLE, XML_FONT_CHARSET,
734                 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_CHARSET },
735         { XML_NAMESPACE_STYLE, XML_VERTICAL_POS,
736                 XML_TOK_STYLE_ATTRIBUTES_ATTR_VERTICAL_POS },
737         { XML_NAMESPACE_STYLE, XML_VERTICAL_REL,
738                 XML_TOK_STYLE_ATTRIBUTES_ATTR_VERTICAL_REL },
739         { XML_NAMESPACE_FO, XML_WIDTH,
740                 XML_TOK_STYLE_ATTRIBUTES_ATTR_WIDTH },
741         { XML_NAMESPACE_FO, XML_HEIGHT,
742                 XML_TOK_STYLE_ATTRIBUTES_ATTR_HEIGHT },
743         { XML_NAMESPACE_FO, XML_COLOR,
744                 XML_TOK_STYLE_ATTRIBUTES_ATTR_COLOR },
745         { XML_NAMESPACE_STYLE, XML_USE_WINDOW_FONT_COLOR,
746                 XML_TOK_STYLE_ATTRIBUTES_ATTR_WINDOW_FONT_COLOR },
747         { XML_NAMESPACE_FO, XML_FONT_SIZE,
748                 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_SIZE },
749         // --> OD 2008-01-16 #newlistlevelattrs#
750         { XML_NAMESPACE_TEXT, XML_LIST_LEVEL_POSITION_AND_SPACE_MODE,
751                 XML_TOK_STYLE_ATTRIBUTES_ATTR_POSITION_AND_SPACE_MODE },
752         // <--
753 
754         XML_TOKEN_MAP_END
755     };
756     return aStyleAttributesAttrTokenMap;
757 }
758 SvxXMLListLevelStyleAttrContext_Impl::SvxXMLListLevelStyleAttrContext_Impl(
759         SvXMLImport& rImport, sal_uInt16 nPrfx,
760         const OUString& rLName,
761         const Reference< xml::sax::XAttributeList > & xAttrList,
762         SvxXMLListLevelStyleContext_Impl& rLLevel ) :
763     SvXMLImportContext( rImport, nPrfx, rLName ),
764     rListLevel( rLLevel )
765 {
766     SvXMLTokenMap aTokenMap( lcl_getStyleAttributesAttrTokenMap() );
767     SvXMLUnitConverter& rUnitConv = GetImport().GetMM100UnitConverter();
768 
769     OUString sFontName, sFontFamily, sFontStyleName, sFontFamilyGeneric,
770              sFontPitch, sFontCharset;
771     OUString sVerticalPos, sVerticalRel;
772 
773     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
774     for( sal_Int16 i=0; i < nAttrCount; i++ )
775     {
776         const OUString& rAttrName = xAttrList->getNameByIndex( i );
777         OUString aLocalName;
778         sal_uInt16 nPrefix =
779             GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
780                                                             &aLocalName );
781         const OUString& rValue = xAttrList->getValueByIndex( i );
782 
783         sal_Int32 nVal;
784         switch( aTokenMap.Get( nPrefix, aLocalName ) )
785         {
786         case XML_TOK_STYLE_ATTRIBUTES_ATTR_SPACE_BEFORE:
787             if( rUnitConv.convertMeasure( nVal, rValue, SHRT_MIN, SHRT_MAX ) )
788                 rListLevel.SetSpaceBefore( nVal );
789             break;
790         case XML_TOK_STYLE_ATTRIBUTES_ATTR_MIN_LABEL_WIDTH:
791             if( rUnitConv.convertMeasure( nVal, rValue, 0, SHRT_MAX ) )
792                 rListLevel.SetMinLabelWidth( nVal );
793             break;
794         case XML_TOK_STYLE_ATTRIBUTES_ATTR_MIN_LABEL_DIST:
795             if( rUnitConv.convertMeasure( nVal, rValue, 0, USHRT_MAX ) )
796                 rListLevel.SetMinLabelDist( nVal );
797             break;
798         case XML_TOK_STYLE_ATTRIBUTES_ATTR_TEXT_ALIGN:
799             if( rValue.getLength() )
800             {
801                 sal_Int16 eAdjust = HoriOrientation::LEFT;
802                 if( IsXMLToken( rValue, XML_CENTER ) )
803                     eAdjust = HoriOrientation::CENTER;
804                 else if( IsXMLToken( rValue, XML_END ) )
805                     eAdjust = HoriOrientation::RIGHT;
806                 rListLevel.SetAdjust( eAdjust );
807             }
808             break;
809         case XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_NAME:
810             sFontName = rValue;
811             break;
812         case XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_FAMILY:
813             sFontFamily = rValue;
814             break;
815         case XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_FAMILY_GENERIC:
816             sFontFamilyGeneric = rValue;
817             break;
818         case XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_STYLENAME:
819             sFontStyleName = rValue;
820             break;
821         case XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_PITCH:
822             sFontPitch = rValue;
823             break;
824         case XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_CHARSET:
825             sFontCharset = rValue;
826             break;
827         case XML_TOK_STYLE_ATTRIBUTES_ATTR_VERTICAL_POS:
828             sVerticalPos = rValue;
829             break;
830         case XML_TOK_STYLE_ATTRIBUTES_ATTR_VERTICAL_REL:
831             sVerticalRel = rValue;
832             break;
833         case XML_TOK_STYLE_ATTRIBUTES_ATTR_WIDTH:
834             if( rUnitConv.convertMeasure( nVal, rValue, 0, SAL_MAX_INT32) )
835                 rListLevel.SetImageWidth( nVal );
836             break;
837         case XML_TOK_STYLE_ATTRIBUTES_ATTR_HEIGHT:
838             if( rUnitConv.convertMeasure( nVal, rValue, 0, SAL_MAX_INT32) )
839                 rListLevel.SetImageHeight( nVal );
840             break;
841         case XML_TOK_STYLE_ATTRIBUTES_ATTR_COLOR:
842             {
843                 Color aColor;
844                 if( SvXMLUnitConverter::convertColor( aColor, rValue ) )
845                     rListLevel.SetColor( (sal_Int32)aColor.GetColor() );
846             }
847             break;
848         case XML_TOK_STYLE_ATTRIBUTES_ATTR_WINDOW_FONT_COLOR:
849             {
850                 if( IsXMLToken( rValue, XML_TRUE ) )
851                     rListLevel.SetColor( (sal_Int32)0xffffffff );
852             }
853             break;
854         case XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_SIZE:
855             if(SvXMLUnitConverter::convertPercent( nVal, rValue ) )
856                 rListLevel.SetRelSize( (sal_Int16)nVal );
857             break;
858         // --> OD 2008-01-16 #newlistlevelattrs#
859         case XML_TOK_STYLE_ATTRIBUTES_ATTR_POSITION_AND_SPACE_MODE:
860             {
861                 sal_Int16 ePosAndSpaceMode = PositionAndSpaceMode::LABEL_WIDTH_AND_POSITION;
862                 if( IsXMLToken( rValue, XML_LABEL_ALIGNMENT ) )
863                     ePosAndSpaceMode = PositionAndSpaceMode::LABEL_ALIGNMENT;
864                 rListLevel.SetPosAndSpaceMode( ePosAndSpaceMode );
865             }
866             break;
867         // <--
868         }
869     }
870 
871     if( sFontName.getLength() )
872     {
873         const XMLFontStylesContext *pFontDecls =
874             GetImport().GetTextImport()->GetFontDecls();
875         if( pFontDecls )
876         {
877             ::std::vector < XMLPropertyState > aProps;
878             if( pFontDecls->FillProperties( sFontName, aProps, 0, 1, 2, 3, 4 ) )
879             {
880                 OUString sTmp;
881                 sal_Int16 nTmp = 0;
882                 ::std::vector< XMLPropertyState >::iterator i;
883                 for( i = aProps.begin(); i != aProps.end(); i++ )
884                 {
885                     switch( i->mnIndex )
886                     {
887                     case 0:
888                         i->maValue >>= sTmp;
889                         rListLevel.SetBulletFontName( sTmp);
890                         break;
891                     case 1:
892                         i->maValue >>= sTmp;
893                         rListLevel.SetBulletFontStyleName( sTmp );
894                         break;
895                     case 2:
896                         i->maValue >>= nTmp;
897                         rListLevel.SetBulletFontFamily( nTmp );
898                         break;
899                     case 3:
900                         i->maValue >>= nTmp;
901                         rListLevel.SetBulletFontPitch( nTmp );
902                         break;
903                     case 4:
904                         i->maValue >>= nTmp;
905                         rListLevel.SetBulletFontEncoding( nTmp );
906                         break;
907                     }
908                 }
909             }
910         }
911     }
912     if( sFontFamily.getLength() )
913     {
914         String sEmpty;
915         Any aAny;
916 
917         XMLFontFamilyNamePropHdl aFamilyNameHdl;
918         if( aFamilyNameHdl.importXML( sFontFamily, aAny, rUnitConv ) )
919         {
920             OUString sTmp;
921             aAny >>= sTmp;
922             rListLevel.SetBulletFontName( sTmp);
923         }
924 
925         XMLFontFamilyPropHdl aFamilyHdl;
926         if( sFontFamilyGeneric.getLength() &&
927             aFamilyHdl.importXML( sFontFamilyGeneric, aAny, rUnitConv  ) )
928         {
929             sal_Int16 nTmp = 0;
930             aAny >>= nTmp;
931             rListLevel.SetBulletFontFamily( nTmp );
932         }
933 
934         if( sFontStyleName.getLength() )
935             rListLevel.SetBulletFontStyleName( sFontStyleName );
936 
937         XMLFontPitchPropHdl aPitchHdl;
938         if( sFontPitch.getLength() &&
939             aPitchHdl.importXML( sFontPitch, aAny, rUnitConv  ) )
940         {
941             sal_Int16 nTmp = 0;
942             aAny >>= nTmp;
943             rListLevel.SetBulletFontPitch( nTmp );
944         }
945 
946         XMLFontEncodingPropHdl aEncHdl;
947         if( sFontCharset.getLength() &&
948             aEncHdl.importXML( sFontCharset, aAny, rUnitConv  ) )
949         {
950             sal_Int16 nTmp = 0;
951             aAny >>= nTmp;
952             rListLevel.SetBulletFontEncoding( nTmp );
953         }
954     }
955 
956     sal_Int16 eVertOrient = VertOrientation::LINE_CENTER;
957     if( sVerticalPos.getLength() )
958     {
959         if( IsXMLToken( sVerticalPos, XML_TOP ) )
960             eVertOrient = VertOrientation::LINE_TOP;
961         else if( IsXMLToken( sVerticalPos, XML_BOTTOM ) )
962             eVertOrient = VertOrientation::LINE_BOTTOM;
963     }
964     if( sVerticalRel.getLength() )
965     {
966         if( IsXMLToken( sVerticalRel, XML_BASELINE ) )
967         {
968             // TOP and BOTTOM are exchanged for a baseline relation
969             switch( eVertOrient  )
970             {
971             case VertOrientation::LINE_TOP:
972                 eVertOrient = VertOrientation::BOTTOM;
973                 break;
974             case VertOrientation::LINE_CENTER:
975                 eVertOrient = VertOrientation::CENTER;
976                 break;
977             case VertOrientation::LINE_BOTTOM:
978                 eVertOrient = VertOrientation::TOP;
979                 break;
980             }
981         }
982         else if( IsXMLToken( sVerticalRel, XML_CHAR ) )
983         {
984             switch( eVertOrient  )
985             {
986             case VertOrientation::LINE_TOP:
987                 eVertOrient = VertOrientation::CHAR_TOP;
988                 break;
989             case VertOrientation::LINE_CENTER:
990                 eVertOrient = VertOrientation::CHAR_CENTER;
991                 break;
992             case VertOrientation::LINE_BOTTOM:
993                 eVertOrient = VertOrientation::CHAR_BOTTOM;
994                 break;
995             }
996         }
997     }
998     rListLevel.SetImageVertOrient( eVertOrient );
999 }
1000 
1001 SvxXMLListLevelStyleAttrContext_Impl::~SvxXMLListLevelStyleAttrContext_Impl()
1002 {
1003 }
1004 
1005 // --> OD 2008-01-16 #newlistlevelattrs#
1006 SvXMLImportContext* SvxXMLListLevelStyleAttrContext_Impl::CreateChildContext(
1007         sal_uInt16 nPrefix, const OUString& rLocalName,
1008         const Reference< xml::sax::XAttributeList > & xAttrList )
1009 {
1010     SvXMLImportContext *pContext = 0;
1011     if ( XML_NAMESPACE_STYLE == nPrefix &&
1012          IsXMLToken( rLocalName, XML_LIST_LEVEL_LABEL_ALIGNMENT ) )
1013     {
1014         pContext = new SvxXMLListLevelStyleLabelAlignmentAttrContext_Impl( GetImport(),
1015                                                              nPrefix,
1016                                                              rLocalName,
1017                                                              xAttrList,
1018                                                              rListLevel );
1019     }
1020     if( !pContext )
1021     {
1022         pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
1023     }
1024 
1025     return pContext;
1026 }
1027 // <--
1028 
1029 // ---------------------------------------------------------------------
1030 
1031 // --> OD 2008-01-16 #newlistlevelattrs#
1032 enum SvxXMLStyleAttributesLabelAlignmentAttrTokens
1033 {
1034     XML_TOK_STYLE_ATTRIBUTES_ATTR_LABEL_FOLLOWED_BY,
1035     XML_TOK_STYLE_ATTRIBUTES_ATTR_LISTTAB_STOP_POSITION,
1036     XML_TOK_STYLE_ATTRIBUTES_ATTR_FIRST_LINE_INDENT,
1037     XML_TOK_STYLE_ATTRIBUTES_ATTR_INDENT_AT,
1038 
1039     XML_TOK_STYLE_ATTRIBUTES_LABEL_ALIGNMENT_ATTR_END=XML_TOK_UNKNOWN
1040 };
1041 const SvXMLTokenMapEntry* lcl_getStyleAlignmentAttributesAttrTokenMap()
1042 {
1043     static __FAR_DATA SvXMLTokenMapEntry aStyleAlignmentAttributesAttrTokenMap[] =
1044     {
1045         { XML_NAMESPACE_TEXT, XML_LABEL_FOLLOWED_BY,
1046                 XML_TOK_STYLE_ATTRIBUTES_ATTR_LABEL_FOLLOWED_BY },
1047         { XML_NAMESPACE_TEXT, XML_LIST_TAB_STOP_POSITION,
1048                 XML_TOK_STYLE_ATTRIBUTES_ATTR_LISTTAB_STOP_POSITION },
1049         { XML_NAMESPACE_FO, XML_TEXT_INDENT,
1050                 XML_TOK_STYLE_ATTRIBUTES_ATTR_FIRST_LINE_INDENT },
1051         { XML_NAMESPACE_FO, XML_MARGIN_LEFT,
1052                 XML_TOK_STYLE_ATTRIBUTES_ATTR_INDENT_AT },
1053 
1054         XML_TOKEN_MAP_END
1055     };
1056     return aStyleAlignmentAttributesAttrTokenMap;
1057 }
1058 SvxXMLListLevelStyleLabelAlignmentAttrContext_Impl::SvxXMLListLevelStyleLabelAlignmentAttrContext_Impl(
1059         SvXMLImport& rImport, sal_uInt16 nPrfx,
1060         const OUString& rLName,
1061         const Reference< xml::sax::XAttributeList > & xAttrList,
1062         SvxXMLListLevelStyleContext_Impl& rLLevel ) :
1063     SvXMLImportContext( rImport, nPrfx, rLName ),
1064     rListLevel( rLLevel )
1065 {
1066     SvXMLTokenMap aTokenMap( lcl_getStyleAlignmentAttributesAttrTokenMap() );
1067     SvXMLUnitConverter& rUnitConv = GetImport().GetMM100UnitConverter();
1068 
1069     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
1070     for( sal_Int16 i=0; i < nAttrCount; i++ )
1071     {
1072         const OUString& rAttrName = xAttrList->getNameByIndex( i );
1073         OUString aLocalName;
1074         sal_uInt16 nPrefix =
1075             GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
1076                                                             &aLocalName );
1077         const OUString& rValue = xAttrList->getValueByIndex( i );
1078 
1079         sal_Int32 nVal;
1080         switch( aTokenMap.Get( nPrefix, aLocalName ) )
1081         {
1082         case XML_TOK_STYLE_ATTRIBUTES_ATTR_LABEL_FOLLOWED_BY:
1083             {
1084                 sal_Int16 eLabelFollowedBy = LabelFollow::LISTTAB;
1085                 if( IsXMLToken( rValue, XML_SPACE ) )
1086                     eLabelFollowedBy = LabelFollow::SPACE;
1087                 else if( IsXMLToken( rValue, XML_NOTHING ) )
1088                     eLabelFollowedBy = LabelFollow::NOTHING;
1089                 rListLevel.SetLabelFollowedBy( eLabelFollowedBy );
1090             }
1091             break;
1092         case XML_TOK_STYLE_ATTRIBUTES_ATTR_LISTTAB_STOP_POSITION:
1093             if( rUnitConv.convertMeasure( nVal, rValue, 0, SHRT_MAX ) )
1094                 rListLevel.SetListtabStopPosition( nVal );
1095             break;
1096         case XML_TOK_STYLE_ATTRIBUTES_ATTR_FIRST_LINE_INDENT:
1097             if( rUnitConv.convertMeasure( nVal, rValue, SHRT_MIN, SHRT_MAX ) )
1098                 rListLevel.SetFirstLineIndent( nVal );
1099             break;
1100         case XML_TOK_STYLE_ATTRIBUTES_ATTR_INDENT_AT:
1101             if( rUnitConv.convertMeasure( nVal, rValue, SHRT_MIN, SHRT_MAX ) )
1102                 rListLevel.SetIndentAt( nVal );
1103             break;
1104         }
1105     }
1106 }
1107 
1108 SvxXMLListLevelStyleLabelAlignmentAttrContext_Impl::~SvxXMLListLevelStyleLabelAlignmentAttrContext_Impl()
1109 {
1110 }
1111 // <--
1112 
1113 // ---------------------------------------------------------------------
1114 
1115 typedef SvxXMLListLevelStyleContext_Impl *SvxXMLListLevelStyleContext_ImplPtr;
1116 SV_DECL_PTRARR( SvxXMLListStyle_Impl, SvxXMLListLevelStyleContext_ImplPtr,
1117                 10, 5 )
1118 
1119 void SvxXMLListStyleContext::SetAttribute( sal_uInt16 nPrefixKey,
1120                                            const OUString& rLocalName,
1121                                            const OUString& rValue )
1122 {
1123     if( XML_NAMESPACE_TEXT == nPrefixKey &&
1124         IsXMLToken( rLocalName, XML_CONSECUTIVE_NUMBERING ) )
1125     {
1126         bConsecutive = IsXMLToken( rValue, XML_TRUE );
1127     }
1128     else
1129     {
1130         SvXMLStyleContext::SetAttribute( nPrefixKey, rLocalName, rValue );
1131     }
1132 }
1133 
1134 
1135 SvxXMLListStyleContext::SvxXMLListStyleContext( SvXMLImport& rImport,
1136         sal_uInt16 nPrfx,
1137         const OUString& rLName,
1138         const Reference< xml::sax::XAttributeList > & xAttrList,
1139         sal_Bool bOutl )
1140 :   SvXMLStyleContext( rImport, nPrfx, rLName, xAttrList, bOutl ? XML_STYLE_FAMILY_TEXT_OUTLINE : XML_STYLE_FAMILY_TEXT_LIST )
1141 ,   sIsPhysical( RTL_CONSTASCII_USTRINGPARAM( "IsPhysical" ) )
1142 ,   sNumberingRules( RTL_CONSTASCII_USTRINGPARAM( "NumberingRules" ) )
1143 ,   sName( RTL_CONSTASCII_USTRINGPARAM( "Name" ) )
1144 ,   sIsContinuousNumbering( RTL_CONSTASCII_USTRINGPARAM( "IsContinuousNumbering" ) )
1145 ,   pLevelStyles( 0 )
1146 ,   nLevels( 0 )
1147 ,   bConsecutive( sal_False )
1148 ,   bOutline( bOutl )
1149 {
1150 }
1151 
1152 SvxXMLListStyleContext::~SvxXMLListStyleContext()
1153 {
1154     if( pLevelStyles )
1155     {
1156         while( pLevelStyles->Count() )
1157         {
1158             sal_uInt16 n = pLevelStyles->Count() - 1;
1159             SvxXMLListLevelStyleContext_Impl *pStyle = (*pLevelStyles)[n];
1160             pLevelStyles->Remove( n, 1 );
1161             pStyle->ReleaseRef();
1162         }
1163     }
1164 
1165     delete pLevelStyles;
1166 }
1167 
1168 TYPEINIT1( SvxXMLListStyleContext, SvXMLStyleContext );
1169 
1170 SvXMLImportContext *SvxXMLListStyleContext::CreateChildContext(
1171         sal_uInt16 nPrefix,
1172         const OUString& rLocalName,
1173         const Reference< xml::sax::XAttributeList > & xAttrList )
1174 {
1175     SvXMLImportContext *pContext = 0;
1176 
1177     if( XML_NAMESPACE_TEXT == nPrefix &&
1178         ( bOutline
1179             ? IsXMLToken( rLocalName, XML_OUTLINE_LEVEL_STYLE )
1180             : ( IsXMLToken( rLocalName, XML_LIST_LEVEL_STYLE_NUMBER ) ||
1181                 IsXMLToken( rLocalName, XML_LIST_LEVEL_STYLE_BULLET ) ||
1182                 IsXMLToken( rLocalName, XML_LIST_LEVEL_STYLE_IMAGE )    ) ) )
1183     {
1184         SvxXMLListLevelStyleContext_Impl *pLevelStyle =
1185             new SvxXMLListLevelStyleContext_Impl( GetImport(), nPrefix,
1186                                                   rLocalName, xAttrList );
1187         if( !pLevelStyles )
1188             pLevelStyles = new SvxXMLListStyle_Impl;
1189         pLevelStyles->Insert( pLevelStyle, pLevelStyles->Count() );
1190         pLevelStyle->AddRef();
1191 
1192         pContext = pLevelStyle;
1193     }
1194     else
1195     {
1196         pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
1197     }
1198 
1199     return pContext;
1200 }
1201 
1202 void SvxXMLListStyleContext::FillUnoNumRule(
1203         const Reference< container::XIndexReplace > & rNumRule,
1204         const SvI18NMap *pI18NMap ) const
1205 {
1206     try
1207     {
1208         if( pLevelStyles && rNumRule.is() )
1209         {
1210             sal_uInt16 nCount = pLevelStyles->Count();
1211             sal_Int32 l_nLevels = rNumRule->getCount();
1212             for( sal_uInt16 i=0; i < nCount; i++ )
1213             {
1214                 SvxXMLListLevelStyleContext_Impl *pLevelStyle =
1215                     (*pLevelStyles)[i];
1216                 sal_Int32 nLevel = pLevelStyle->GetLevel();
1217                 if( nLevel >= 0 && nLevel < l_nLevels )
1218                 {
1219                     Sequence<beans::PropertyValue> aProps =
1220                         pLevelStyle->GetProperties( pI18NMap );
1221                     Any aAny;
1222                     aAny <<= aProps;
1223                     rNumRule->replaceByIndex( nLevel, aAny );
1224                 }
1225             }
1226         }
1227 
1228         Reference < XPropertySet > xPropSet( rNumRule, UNO_QUERY );
1229         Reference< XPropertySetInfo > xPropSetInfo;
1230         if (xPropSet.is())
1231             xPropSetInfo = xPropSet->getPropertySetInfo();
1232         if( xPropSetInfo.is() &&
1233             xPropSetInfo->hasPropertyByName( sIsContinuousNumbering ) )
1234         {
1235             Any aAny;
1236             sal_Bool bTmp = bConsecutive;
1237             aAny.setValue( &bTmp, ::getBooleanCppuType() );
1238             xPropSet->setPropertyValue( sIsContinuousNumbering, aAny );
1239         }
1240     }
1241     catch( Exception& )
1242     {
1243         DBG_ERROR( "SvxXMLListStyleContext::FillUnoNumRule - Exception catched" );
1244     }
1245 }
1246 
1247 void SvxXMLListStyleContext::CreateAndInsertLate( sal_Bool bOverwrite )
1248 {
1249     if( bOutline )
1250     {
1251         if( bOverwrite )
1252         {
1253             const Reference< XIndexReplace >& rNumRule =
1254                 GetImport().GetTextImport()->GetChapterNumbering();
1255             // We don't set xNumberingRules here, to avoid using them
1256             // as numbering rules.
1257             if( rNumRule.is() )
1258                 FillUnoNumRule( rNumRule, 0 );
1259         }
1260     }
1261     else
1262     {
1263         Reference < XStyle > xStyle;
1264         const OUString& rName = GetDisplayName();
1265         if( 0 == rName.getLength() )
1266         {
1267             SetValid( sal_False );
1268             return;
1269         }
1270 
1271         const Reference < XNameContainer >& rNumStyles =
1272                 GetImport().GetTextImport()->GetNumberingStyles();
1273         if( !rNumStyles.is() )
1274         {
1275             SetValid( sal_False );
1276             return;
1277         }
1278 
1279         sal_Bool bNew = sal_False;
1280         if( rNumStyles->hasByName( rName ) )
1281         {
1282             Any aAny = rNumStyles->getByName( rName );
1283             aAny >>= xStyle;
1284         }
1285         else
1286         {
1287             Reference< XMultiServiceFactory > xFactory( GetImport().GetModel(),
1288                                                         UNO_QUERY );
1289             DBG_ASSERT( xFactory.is(), "no factory" );
1290             if( !xFactory.is() )
1291                 return;
1292 
1293             Reference < XInterface > xIfc = xFactory->createInstance(OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.style.NumberingStyle")) );
1294             if( !xIfc.is() )
1295                 return;
1296             Reference < XStyle > xTmp( xIfc, UNO_QUERY );
1297             xStyle = xTmp;
1298             if( !xStyle.is() )
1299                 return;
1300 
1301             Any aAny;
1302             aAny <<= xStyle;
1303             rNumStyles->insertByName( rName, aAny );
1304             bNew = sal_True;
1305         }
1306 
1307         Reference < XPropertySet > xPropSet( xStyle, UNO_QUERY );
1308         Reference< XPropertySetInfo > xPropSetInfo =
1309             xPropSet->getPropertySetInfo();
1310         if( !bNew && xPropSetInfo->hasPropertyByName( sIsPhysical ) )
1311         {
1312             Any aAny = xPropSet->getPropertyValue( sIsPhysical );
1313             bNew = !*(sal_Bool *)aAny.getValue();
1314         }
1315         if( rName != GetName() )
1316             GetImport().AddStyleDisplayName( XML_STYLE_FAMILY_TEXT_LIST,
1317                                              GetName(), rName );
1318 
1319         Any aAny = xPropSet->getPropertyValue( sNumberingRules );
1320         aAny >>= xNumRules;
1321         nLevels = xNumRules->getCount();
1322         if( bOverwrite || bNew )
1323         {
1324             FillUnoNumRule( xNumRules, 0 );
1325             aAny <<= xNumRules;
1326             xPropSet->setPropertyValue( sNumberingRules, aAny );
1327         }
1328         else
1329         {
1330             SetValid( sal_False );
1331         }
1332 
1333         SetNew( bNew );
1334     }
1335 }
1336 
1337 void SvxXMLListStyleContext::CreateAndInsertAuto() const
1338 {
1339     DBG_ASSERT( !bOutline, "Outlines cannot be inserted here" );
1340     DBG_ASSERT( !xNumRules.is(), "Numbering Rule is existing already" );
1341 
1342     const OUString& rName = GetName();
1343     if( bOutline || xNumRules.is() || 0 == rName.getLength() )
1344     {
1345         ((SvxXMLListStyleContext *)this)->SetValid( sal_False );
1346         return;
1347     }
1348 
1349     ((SvxXMLListStyleContext *)this)->xNumRules = CreateNumRule(
1350         GetImport().GetModel() );
1351     ((SvxXMLListStyleContext *)this)->nLevels = xNumRules->getCount();
1352 
1353     FillUnoNumRule( xNumRules, 0 );
1354 }
1355 
1356 Reference < XIndexReplace > SvxXMLListStyleContext::CreateNumRule(
1357                                 const Reference < XModel > & rModel )
1358 {
1359     Reference<XIndexReplace> xNumRule;
1360 
1361     Reference< XMultiServiceFactory > xFactory( rModel, UNO_QUERY );
1362     DBG_ASSERT( xFactory.is(), "no factory" );
1363     if( !xFactory.is() )
1364         return xNumRule;
1365 
1366     Reference < XInterface > xIfc = xFactory->createInstance(OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.text.NumberingRules")) );
1367     if( !xIfc.is() )
1368         return xNumRule;
1369 
1370     xNumRule = Reference<XIndexReplace>( xIfc, UNO_QUERY );
1371     DBG_ASSERT( xNumRule.is(), "go no numbering rule" );
1372 
1373     return xNumRule;
1374 }
1375 
1376 void SvxXMLListStyleContext::SetDefaultStyle(
1377         const Reference < XIndexReplace > & rNumRule,
1378         sal_Int16 nLevel,
1379         sal_Bool bOrdered )
1380 {
1381     Sequence<beans::PropertyValue> aPropSeq( bOrdered ? 1 : 4  );
1382     beans::PropertyValue *pProps = aPropSeq.getArray();
1383 
1384     pProps->Name =
1385                 OUString::createFromAscii( XML_UNO_NAME_NRULE_NUMBERINGTYPE );
1386     (pProps++)->Value <<= (sal_Int16)(bOrdered ? NumberingType::ARABIC
1387                                                : NumberingType::CHAR_SPECIAL );
1388     if( !bOrdered )
1389     {
1390         // TODO: Bullet-Font
1391         //aNumFmt.SetBulletFont( &SwNumRule::GetDefBulletFont() );
1392         awt::FontDescriptor aFDesc;
1393         aFDesc.Name = OUString(
1394 #if defined UNX
1395                         RTL_CONSTASCII_USTRINGPARAM( "starbats" )
1396 #else
1397                         RTL_CONSTASCII_USTRINGPARAM( "StarBats" )
1398 #endif
1399                                         );
1400         aFDesc.Family = FAMILY_DONTKNOW ;
1401         aFDesc.Pitch = PITCH_DONTKNOW ;
1402         aFDesc.CharSet = RTL_TEXTENCODING_SYMBOL ;
1403         aFDesc.Weight = WEIGHT_DONTKNOW;
1404         //aFDesc.Transparant = sal_True;
1405         pProps->Name =
1406                     OUString::createFromAscii( XML_UNO_NAME_NRULE_BULLET_FONT );
1407         (pProps++)->Value <<= aFDesc;
1408 
1409         OUStringBuffer sTmp(1);
1410         sTmp.append( (sal_Unicode)(0xF000 + 149) );
1411         pProps->Name =
1412                     OUString::createFromAscii( XML_UNO_NAME_NRULE_BULLET_CHAR );
1413         (pProps++)->Value <<= sTmp.makeStringAndClear();
1414         pProps->Name =
1415                 OUString::createFromAscii( XML_UNO_NAME_NRULE_CHAR_STYLE_NAME );
1416         (pProps++)->Value <<=
1417             OUString( RTL_CONSTASCII_USTRINGPARAM( "Numbering Symbols" ) );
1418     }
1419 
1420     Any aAny;
1421     aAny <<= aPropSeq;
1422     rNumRule->replaceByIndex( nLevel, aAny );
1423 }
1424 
1425