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