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