update credits
[LibreOffice.git] / xmloff / source / style / xmlnumi.cxx
blob79542932bba27b7b8b7d66949f7339d1af109a98
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #include <com/sun/star/beans/PropertyValue.hpp>
21 #include <com/sun/star/beans/XPropertySet.hpp>
22 #include <com/sun/star/awt/Size.hpp>
23 #include <com/sun/star/awt/FontDescriptor.hpp>
24 #include <com/sun/star/text/HoriOrientation.hpp>
25 #include <com/sun/star/text/VertOrientation.hpp>
26 #include <com/sun/star/text/PositionAndSpaceMode.hpp>
27 #include <com/sun/star/text/LabelFollow.hpp>
28 #include <com/sun/star/container/XNameContainer.hpp>
29 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
30 #include <com/sun/star/style/XStyle.hpp>
31 #include <com/sun/star/io/XOutputStream.hpp>
33 #include <rtl/ustrbuf.hxx>
35 #include <tools/debug.hxx>
36 #include <tools/fontenum.hxx>
38 #include <sax/tools/converter.hxx>
40 #include <xmloff/xmltkmap.hxx>
41 #include <xmloff/nmspmap.hxx>
42 #include "xmloff/xmlnmspe.hxx"
43 #include <xmloff/xmlimp.hxx>
44 #include <xmloff/XMLBase64ImportContext.hxx>
45 #include <xmloff/xmltoken.hxx>
47 #include <xmloff/i18nmap.hxx>
48 #include <xmloff/xmluconv.hxx>
49 #include "fonthdl.hxx"
50 #include <xmloff/XMLFontStylesContext.hxx>
51 #include <xmloff/families.hxx>
52 #include <xmloff/maptype.hxx>
54 #include <xmloff/xmlnumi.hxx>
57 using namespace ::com::sun::star;
58 using namespace ::com::sun::star::uno;
59 using namespace ::com::sun::star::style;
60 using namespace ::com::sun::star::text;
61 using namespace ::com::sun::star::beans;
62 using namespace ::com::sun::star::container;
63 using namespace ::com::sun::star::lang;
64 using namespace ::com::sun::star::frame;
65 using namespace ::xmloff::token;
66 using namespace ::com::sun::star::io;
68 // ---------------------------------------------------------------------
70 class SvxXMLListLevelStyleContext_Impl;
72 class SvxXMLListLevelStyleAttrContext_Impl : public SvXMLImportContext
74 SvxXMLListLevelStyleContext_Impl& rListLevel;
76 public:
78 SvxXMLListLevelStyleAttrContext_Impl(
79 SvXMLImport& rImport, sal_uInt16 nPrfx,
80 const OUString& rLName,
81 const Reference< xml::sax::XAttributeList >& xAttrList,
82 SvxXMLListLevelStyleContext_Impl& rLLevel );
83 virtual ~SvxXMLListLevelStyleAttrContext_Impl();
85 virtual SvXMLImportContext *CreateChildContext(
86 sal_uInt16 nPrefix, const OUString& rLocalName,
87 const Reference< xml::sax::XAttributeList > & xAttrList );
90 // ---------------------------------------------------------------------
92 class SvxXMLListLevelStyleLabelAlignmentAttrContext_Impl : public SvXMLImportContext
94 SvxXMLListLevelStyleContext_Impl& rListLevel;
96 public:
98 SvxXMLListLevelStyleLabelAlignmentAttrContext_Impl(
99 SvXMLImport& rImport, sal_uInt16 nPrfx,
100 const OUString& rLName,
101 const Reference< xml::sax::XAttributeList >& xAttrList,
102 SvxXMLListLevelStyleContext_Impl& rLLevel );
103 virtual ~SvxXMLListLevelStyleLabelAlignmentAttrContext_Impl();
106 // ---------------------------------------------------------------------
108 enum SvxXMLTextListLevelStyleAttrTokens
110 XML_TOK_TEXT_LEVEL_ATTR_LEVEL,
111 XML_TOK_TEXT_LEVEL_ATTR_STYLE_NAME,
112 XML_TOK_TEXT_LEVEL_ATTR_BULLET_CHAR,
113 XML_TOK_TEXT_LEVEL_ATTR_HREF,
114 XML_TOK_TEXT_LEVEL_ATTR_TYPE,
115 XML_TOK_TEXT_LEVEL_ATTR_SHOW,
116 XML_TOK_TEXT_LEVEL_ATTR_ACTUATE,
117 XML_TOK_TEXT_LEVEL_ATTR_NUM_FORMAT,
118 XML_TOK_TEXT_LEVEL_ATTR_NUM_PREFIX,
119 XML_TOK_TEXT_LEVEL_ATTR_NUM_SUFFIX,
120 XML_TOK_TEXT_LEVEL_ATTR_NUM_LETTER_SYNC,
121 XML_TOK_TEXT_LEVEL_ATTR_START_VALUE,
122 XML_TOK_TEXT_LEVEL_ATTR_DISPLAY_LEVELS,
124 XML_TOK_TEXT_LEVEL_ATTR_END=XML_TOK_UNKNOWN
127 static const SvXMLTokenMapEntry* lcl_getLevelAttrTokenMap()
129 static SvXMLTokenMapEntry aLevelAttrTokenMap[] =
131 { XML_NAMESPACE_TEXT, XML_LEVEL, XML_TOK_TEXT_LEVEL_ATTR_LEVEL },
132 { XML_NAMESPACE_TEXT, XML_STYLE_NAME, XML_TOK_TEXT_LEVEL_ATTR_STYLE_NAME },
133 { XML_NAMESPACE_TEXT, XML_BULLET_CHAR, XML_TOK_TEXT_LEVEL_ATTR_BULLET_CHAR },
134 { XML_NAMESPACE_XLINK, XML_HREF, XML_TOK_TEXT_LEVEL_ATTR_HREF },
135 { XML_NAMESPACE_XLINK, XML_TYPE, XML_TOK_TEXT_LEVEL_ATTR_TYPE },
136 { XML_NAMESPACE_XLINK, XML_SHOW, XML_TOK_TEXT_LEVEL_ATTR_SHOW },
137 { XML_NAMESPACE_XLINK, XML_ACTUATE, XML_TOK_TEXT_LEVEL_ATTR_ACTUATE },
139 { XML_NAMESPACE_STYLE, XML_NUM_FORMAT, XML_TOK_TEXT_LEVEL_ATTR_NUM_FORMAT },
140 { XML_NAMESPACE_STYLE, XML_NUM_PREFIX, XML_TOK_TEXT_LEVEL_ATTR_NUM_PREFIX },
141 { XML_NAMESPACE_STYLE, XML_NUM_SUFFIX, XML_TOK_TEXT_LEVEL_ATTR_NUM_SUFFIX },
142 { XML_NAMESPACE_STYLE, XML_NUM_LETTER_SYNC, XML_TOK_TEXT_LEVEL_ATTR_NUM_LETTER_SYNC },
143 { XML_NAMESPACE_TEXT, XML_START_VALUE, XML_TOK_TEXT_LEVEL_ATTR_START_VALUE },
144 { XML_NAMESPACE_TEXT, XML_DISPLAY_LEVELS, XML_TOK_TEXT_LEVEL_ATTR_DISPLAY_LEVELS },
146 XML_TOKEN_MAP_END
148 return aLevelAttrTokenMap;
151 class SvxXMLListLevelStyleContext_Impl : public SvXMLImportContext
153 friend class SvxXMLListLevelStyleAttrContext_Impl;
154 const OUString sStarBats;
155 const OUString sStarMath;
157 OUString sPrefix;
158 OUString sSuffix;
159 OUString sTextStyleName;
160 OUString sNumFormat;
161 OUString sNumLetterSync;
162 OUString sBulletFontName;
163 OUString sBulletFontStyleName;
164 OUString sImageURL;
166 Reference < XOutputStream > xBase64Stream;
168 sal_Int32 nLevel;
169 sal_Int32 nSpaceBefore;
170 sal_Int32 nMinLabelWidth;
171 sal_Int32 nMinLabelDist;
172 sal_Int32 nImageWidth;
173 sal_Int32 nImageHeight;
174 sal_Int16 nNumStartValue;
175 sal_Int16 nNumDisplayLevels;
177 sal_Int16 eAdjust;
178 sal_Int16 eBulletFontFamily;
179 sal_Int16 eBulletFontPitch;
180 rtl_TextEncoding eBulletFontEncoding;
181 sal_Int16 eImageVertOrient;
183 sal_Unicode cBullet;
185 sal_Int16 nRelSize;
186 sal_Int32 m_nColor;
188 sal_Int16 ePosAndSpaceMode;
189 sal_Int16 eLabelFollowedBy;
190 sal_Int32 nListtabStopPosition;
191 sal_Int32 nFirstLineIndent;
192 sal_Int32 nIndentAt;
194 sal_Bool bBullet : 1;
195 sal_Bool bImage : 1;
196 sal_Bool bNum : 1;
197 sal_Bool bHasColor : 1;
199 void SetRelSize( sal_Int16 nRel ) { nRelSize = nRel; }
200 void SetColor( sal_Int32 nColor )
201 { m_nColor = nColor; bHasColor = sal_True; }
202 void SetSpaceBefore( sal_Int32 nSet ) { nSpaceBefore = nSet; }
203 void SetMinLabelWidth( sal_Int32 nSet ) { nMinLabelWidth = nSet; }
204 void SetMinLabelDist( sal_Int32 nSet ) { nMinLabelDist = nSet; }
205 void SetAdjust( sal_Int16 eSet ) { eAdjust = eSet; }
207 void SetBulletFontName( const OUString& rSet ) { sBulletFontName = rSet; }
208 void SetBulletFontStyleName( const OUString& rSet )
209 { sBulletFontStyleName = rSet; }
210 void SetBulletFontFamily( sal_Int16 eSet ) { eBulletFontFamily = eSet; }
211 void SetBulletFontPitch( sal_Int16 eSet ) { eBulletFontPitch = eSet; }
212 void SetBulletFontEncoding( rtl_TextEncoding eSet )
213 { eBulletFontEncoding = eSet; }
215 void SetImageWidth( sal_Int32 nSet ) { nImageWidth = nSet; }
216 void SetImageHeight( sal_Int32 nSet ) { nImageHeight = nSet; }
217 void SetImageVertOrient( sal_Int16 eSet )
218 { eImageVertOrient = eSet; }
220 public:
222 SvxXMLListLevelStyleContext_Impl(
223 SvXMLImport& rImport, sal_uInt16 nPrfx,
224 const OUString& rLName,
225 const Reference< xml::sax::XAttributeList > & xAttrList );
226 virtual ~SvxXMLListLevelStyleContext_Impl();
228 virtual SvXMLImportContext *CreateChildContext(
229 sal_uInt16 nPrefix, const OUString& rLocalName,
230 const Reference< xml::sax::XAttributeList > & xAttrList );
232 sal_Int32 GetLevel() const { return nLevel; }
233 Sequence<beans::PropertyValue> GetProperties(
234 const SvI18NMap *pI18NMap=0 );
236 inline void SetPosAndSpaceMode( sal_Int16 eValue )
238 ePosAndSpaceMode = eValue;
240 inline void SetLabelFollowedBy( sal_Int16 eValue )
242 eLabelFollowedBy = eValue;
244 inline void SetListtabStopPosition( sal_Int32 nValue )
246 nListtabStopPosition = nValue;
248 inline void SetFirstLineIndent( sal_Int32 nValue )
250 nFirstLineIndent = nValue;
252 inline void SetIndentAt( sal_Int32 nValue )
254 nIndentAt = nValue;
258 SvxXMLListLevelStyleContext_Impl::SvxXMLListLevelStyleContext_Impl(
259 SvXMLImport& rImport, sal_uInt16 nPrfx,
260 const OUString& rLName,
261 const Reference< xml::sax::XAttributeList > & xAttrList )
263 : SvXMLImportContext( rImport, nPrfx, rLName )
264 , sStarBats( "StarBats" )
265 , sStarMath( "StarMath" )
266 , sNumFormat( OUString("1") )
267 , nLevel( -1L )
268 , nSpaceBefore( 0L )
269 , nMinLabelWidth( 0L )
270 , nMinLabelDist( 0L )
271 , nImageWidth( 0L )
272 , nImageHeight( 0L )
273 , nNumStartValue( 1 )
274 , nNumDisplayLevels( 1 )
275 , eAdjust( HoriOrientation::LEFT )
276 , eBulletFontFamily( FAMILY_DONTKNOW )
277 , eBulletFontPitch( PITCH_DONTKNOW )
278 , eBulletFontEncoding( RTL_TEXTENCODING_DONTKNOW )
279 , eImageVertOrient(0)
280 , cBullet( 0 )
281 , nRelSize(0)
282 , m_nColor(0)
283 , ePosAndSpaceMode( PositionAndSpaceMode::LABEL_WIDTH_AND_POSITION )
284 , eLabelFollowedBy( LabelFollow::LISTTAB )
285 , nListtabStopPosition( 0 )
286 , nFirstLineIndent( 0 )
287 , nIndentAt( 0 )
288 , bBullet( sal_False )
289 , bImage( sal_False )
290 , bNum( sal_False )
291 , bHasColor( sal_False )
293 if( IsXMLToken( rLName, XML_LIST_LEVEL_STYLE_NUMBER ) ||
294 IsXMLToken( rLName, XML_OUTLINE_LEVEL_STYLE ) )
295 bNum = sal_True;
296 else if( IsXMLToken( rLName, XML_LIST_LEVEL_STYLE_BULLET ) )
297 bBullet = sal_True;
298 else if( IsXMLToken( rLName, XML_LIST_LEVEL_STYLE_IMAGE ) )
299 bImage = sal_True;
301 SvXMLTokenMap aTokenMap( lcl_getLevelAttrTokenMap() );
302 sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
303 for( sal_Int16 i=0; i < nAttrCount; i++ )
305 const OUString& rAttrName = xAttrList->getNameByIndex( i );
306 OUString aLocalName;
307 sal_uInt16 nPrefix =
308 GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
309 &aLocalName );
310 const OUString& rValue = xAttrList->getValueByIndex( i );
312 switch( aTokenMap.Get( nPrefix, aLocalName ) )
314 case XML_TOK_TEXT_LEVEL_ATTR_LEVEL:
315 nLevel = rValue.toInt32();
316 if( nLevel >= 1L )
317 nLevel--;
318 else
319 nLevel = 0;
320 break;
321 case XML_TOK_TEXT_LEVEL_ATTR_STYLE_NAME:
322 sTextStyleName = rValue;
323 break;
324 case XML_TOK_TEXT_LEVEL_ATTR_BULLET_CHAR:
325 cBullet = rValue[0];
326 break;
327 case XML_TOK_TEXT_LEVEL_ATTR_HREF:
328 if( bImage )
329 sImageURL = rValue;
330 break;
331 case XML_TOK_TEXT_LEVEL_ATTR_TYPE:
332 case XML_TOK_TEXT_LEVEL_ATTR_SHOW:
333 case XML_TOK_TEXT_LEVEL_ATTR_ACTUATE:
334 // This properties will be ignored
335 break;
336 case XML_TOK_TEXT_LEVEL_ATTR_NUM_FORMAT:
337 if( bNum )
338 sNumFormat = rValue;
339 break;
340 case XML_TOK_TEXT_LEVEL_ATTR_NUM_PREFIX:
341 sPrefix = rValue;
342 break;
343 case XML_TOK_TEXT_LEVEL_ATTR_NUM_SUFFIX:
344 sSuffix = rValue;
345 break;
346 case XML_TOK_TEXT_LEVEL_ATTR_NUM_LETTER_SYNC:
347 if( bNum )
348 sNumLetterSync = rValue;
349 break;
350 case XML_TOK_TEXT_LEVEL_ATTR_START_VALUE:
351 if( bNum )
353 sal_Int32 nTmp = rValue.toInt32();
354 nNumStartValue =
355 (nTmp < 0L) ? 1 : ( (nTmp>SHRT_MAX) ? SHRT_MAX
356 : (sal_Int16)nTmp );
358 break;
359 case XML_TOK_TEXT_LEVEL_ATTR_DISPLAY_LEVELS:
360 if( bNum )
362 sal_Int32 nTmp = rValue.toInt32();
363 nNumDisplayLevels =
364 (nTmp < 1L) ? 1 : ( (nTmp>SHRT_MAX) ? SHRT_MAX
365 : (sal_Int16)nTmp );
367 break;
372 SvxXMLListLevelStyleContext_Impl::~SvxXMLListLevelStyleContext_Impl()
376 SvXMLImportContext *SvxXMLListLevelStyleContext_Impl::CreateChildContext(
377 sal_uInt16 nPrefix, const OUString& rLocalName,
378 const Reference< xml::sax::XAttributeList > & xAttrList )
380 SvXMLImportContext *pContext = 0;
381 if( XML_NAMESPACE_STYLE == nPrefix &&
382 ( IsXMLToken( rLocalName, XML_LIST_LEVEL_PROPERTIES ) ||
383 IsXMLToken( rLocalName, XML_TEXT_PROPERTIES ) ) )
385 pContext = new SvxXMLListLevelStyleAttrContext_Impl( GetImport(),
386 nPrefix,
387 rLocalName,
388 xAttrList,
389 *this );
391 else if( (XML_NAMESPACE_OFFICE == nPrefix) && xmloff::token::IsXMLToken( rLocalName,
392 xmloff::token::XML_BINARY_DATA ) )
394 if( bImage && sImageURL.isEmpty() && !xBase64Stream.is() )
396 xBase64Stream = GetImport().GetStreamForGraphicObjectURLFromBase64();
397 if( xBase64Stream.is() )
398 pContext = new XMLBase64ImportContext( GetImport(), nPrefix,
399 rLocalName, xAttrList,
400 xBase64Stream );
403 if( !pContext )
405 pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
408 return pContext;
411 Sequence<beans::PropertyValue> SvxXMLListLevelStyleContext_Impl::GetProperties(
412 const SvI18NMap *pI18NMap )
414 sal_Int16 eType = NumberingType::NUMBER_NONE;
416 sal_Int32 nCount = 0;
417 if( bBullet )
419 eType = NumberingType::CHAR_SPECIAL;
420 nCount = cBullet ? 15 : 14;
422 if( bImage )
424 eType = NumberingType::BITMAP;
425 nCount = 15;
427 if( !sImageURL.isEmpty() || xBase64Stream.is() )
428 nCount++;
430 if( bNum )
432 eType = NumberingType::ARABIC;
433 GetImport().GetMM100UnitConverter().convertNumFormat(
434 eType, sNumFormat, sNumLetterSync, sal_True );
435 nCount = 15;
438 if( ( bBullet || bNum ) && nRelSize )
439 nCount++;
441 if( !bImage && bHasColor )
443 nCount++;
446 if (bBullet && !sSuffix.isEmpty())
448 sal_uInt16 const nVersion(GetImport().getGeneratorVersion());
449 sal_Int32 nUPD;
450 sal_Int32 nBuildId;
451 if (GetImport().getBuildIds(nUPD, nBuildId)
452 && ( (SvXMLImport::OOo_1x == nVersion)
453 || (SvXMLImport::OOo_2x == nVersion)
454 || (310 == nUPD) || (320 == nUPD) || (330 == nUPD)
455 || ((300 == nUPD) && (nBuildId <= 9573))))
457 // #i93908# OOo < 3.4 wrote a bogus suffix for bullet chars
458 sSuffix = OUString(); // clear it
462 Sequence<beans::PropertyValue> aPropSeq( nCount );
463 if( nCount > 0 )
465 beans::PropertyValue *pProps = aPropSeq.getArray();
466 sal_Int32 nPos = 0;
467 pProps[nPos].Name = "NumberingType";
468 pProps[nPos++].Value <<= (sal_Int16)eType ;
470 pProps[nPos].Name = "Prefix";
471 pProps[nPos++].Value <<= sPrefix;
473 pProps[nPos].Name = "Suffix";
474 pProps[nPos++].Value <<= sSuffix;
476 pProps[nPos].Name = "Adjust";
477 pProps[nPos++].Value <<= eAdjust;
479 sal_Int32 nLeftMargin = nSpaceBefore + nMinLabelWidth;
480 pProps[nPos].Name = "LeftMargin";
481 pProps[nPos++].Value <<= (sal_Int32)nLeftMargin;
483 sal_Int32 nFirstLineOffset = -nMinLabelWidth;
485 pProps[nPos].Name = "FirstLineOffset";
486 pProps[nPos++].Value <<= (sal_Int32)nFirstLineOffset;
488 pProps[nPos].Name = "SymbolTextDistance";
489 pProps[nPos++].Value <<= (sal_Int16)nMinLabelDist;
491 pProps[nPos].Name = "PositionAndSpaceMode";
492 pProps[nPos++].Value <<= (sal_Int16)ePosAndSpaceMode;
493 pProps[nPos].Name = "LabelFollowedBy";
494 pProps[nPos++].Value <<= (sal_Int16)eLabelFollowedBy;
495 pProps[nPos].Name = "ListtabStopPosition";
496 pProps[nPos++].Value <<= (sal_Int32)nListtabStopPosition;
497 pProps[nPos].Name = "FirstLineIndent";
498 pProps[nPos++].Value <<= (sal_Int32)nFirstLineIndent;
499 pProps[nPos].Name = "IndentAt";
500 pProps[nPos++].Value <<= (sal_Int32)nIndentAt;
502 OUString sDisplayTextStyleName = GetImport().GetStyleDisplayName(
503 XML_STYLE_FAMILY_TEXT_TEXT, sTextStyleName );
504 OUString sStyleName = sDisplayTextStyleName;
505 if( !sStyleName.isEmpty() && pI18NMap )
506 sStyleName = pI18NMap->Get( SFX_STYLE_FAMILY_CHAR, sStyleName );
507 pProps[nPos].Name = "CharStyleName";
508 pProps[nPos++].Value <<= sDisplayTextStyleName;
510 if( bBullet )
512 awt::FontDescriptor aFDesc;
513 aFDesc.Name = sBulletFontName;
514 if( !sBulletFontName.isEmpty() )
516 aFDesc.StyleName = sBulletFontStyleName;
517 aFDesc.Family = eBulletFontFamily;
518 aFDesc.Pitch = eBulletFontPitch;
519 aFDesc.CharSet = eBulletFontEncoding;
520 aFDesc.Weight = WEIGHT_DONTKNOW;
521 sal_Bool bStarSymbol = sal_False;
522 if( aFDesc.Name.equalsIgnoreAsciiCase( sStarBats ) )
524 cBullet = GetImport().ConvStarBatsCharToStarSymbol( cBullet );
525 bStarSymbol = sal_True;
527 else if( aFDesc.Name.equalsIgnoreAsciiCase( sStarMath ) )
529 cBullet = GetImport().ConvStarMathCharToStarSymbol( cBullet );
530 bStarSymbol = sal_True;
532 if( bStarSymbol )
533 aFDesc.Name = OUString( "StarSymbol" );
536 if( cBullet )
538 OUStringBuffer sTmp(1);
539 sTmp.append( cBullet );
540 pProps[nPos].Name = "BulletChar";
541 pProps[nPos++].Value <<= sTmp.makeStringAndClear();
544 pProps[nPos].Name = "BulletFont";
545 pProps[nPos++].Value <<= aFDesc;
549 if( bImage )
551 OUString sStr( sImageURL );
552 if( !sImageURL.isEmpty() )
554 sStr = GetImport().ResolveGraphicObjectURL( sImageURL,
555 sal_False );
557 else if( xBase64Stream.is() )
559 sStr = GetImport().ResolveGraphicObjectURLFromBase64( xBase64Stream );
562 if( !sStr.isEmpty() )
564 pProps[nPos].Name = "GraphicURL";
565 pProps[nPos++].Value <<= sStr;
568 awt::Size aSize( nImageWidth, nImageHeight );
569 pProps[nPos].Name = "GraphicSize";
570 pProps[nPos++].Value <<= aSize;
572 pProps[nPos].Name = "VertOrient";
573 pProps[nPos++].Value <<= (sal_Int16)eImageVertOrient;
576 if( bNum )
578 pProps[nPos].Name = "StartWith";
579 pProps[nPos++].Value <<= (sal_Int16)nNumStartValue;
581 pProps[nPos].Name = "ParentNumbering";
582 pProps[nPos++].Value <<= (sal_Int16)nNumDisplayLevels;
585 if( ( bNum || bBullet ) && nRelSize )
587 pProps[nPos].Name = "BulletRelSize";
588 pProps[nPos++].Value <<= nRelSize;
591 if( !bImage && bHasColor )
593 pProps[nPos].Name = "BulletColor";
594 pProps[nPos++].Value <<= m_nColor;
597 DBG_ASSERT( nPos == nCount, "array under/overflow" );
600 return aPropSeq;
603 // ---------------------------------------------------------------------
605 enum SvxXMLStyleAttributesAttrTokens
607 XML_TOK_STYLE_ATTRIBUTES_ATTR_SPACE_BEFORE,
608 XML_TOK_STYLE_ATTRIBUTES_ATTR_MIN_LABEL_WIDTH,
609 XML_TOK_STYLE_ATTRIBUTES_ATTR_MIN_LABEL_DIST,
610 XML_TOK_STYLE_ATTRIBUTES_ATTR_TEXT_ALIGN,
611 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_NAME,
612 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_FAMILY,
613 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_FAMILY_GENERIC,
614 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_STYLENAME,
615 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_PITCH,
616 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_CHARSET,
617 XML_TOK_STYLE_ATTRIBUTES_ATTR_VERTICAL_POS,
618 XML_TOK_STYLE_ATTRIBUTES_ATTR_VERTICAL_REL,
619 XML_TOK_STYLE_ATTRIBUTES_ATTR_WIDTH,
620 XML_TOK_STYLE_ATTRIBUTES_ATTR_HEIGHT,
621 XML_TOK_STYLE_ATTRIBUTES_ATTR_COLOR,
622 XML_TOK_STYLE_ATTRIBUTES_ATTR_WINDOW_FONT_COLOR,
623 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_SIZE,
624 XML_TOK_STYLE_ATTRIBUTES_ATTR_POSITION_AND_SPACE_MODE,
625 XML_TOK_STYLE_ATTRIBUTES_ATTR_END=XML_TOK_UNKNOWN
627 static const SvXMLTokenMapEntry* lcl_getStyleAttributesAttrTokenMap()
629 static SvXMLTokenMapEntry aStyleAttributesAttrTokenMap[] =
631 { XML_NAMESPACE_TEXT, XML_SPACE_BEFORE,
632 XML_TOK_STYLE_ATTRIBUTES_ATTR_SPACE_BEFORE },
633 { XML_NAMESPACE_TEXT, XML_MIN_LABEL_WIDTH,
634 XML_TOK_STYLE_ATTRIBUTES_ATTR_MIN_LABEL_WIDTH },
635 { XML_NAMESPACE_TEXT, XML_MIN_LABEL_DISTANCE,
636 XML_TOK_STYLE_ATTRIBUTES_ATTR_MIN_LABEL_DIST },
637 { XML_NAMESPACE_FO, XML_TEXT_ALIGN,
638 XML_TOK_STYLE_ATTRIBUTES_ATTR_TEXT_ALIGN },
639 { XML_NAMESPACE_STYLE, XML_FONT_NAME,
640 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_NAME },
641 { XML_NAMESPACE_FO, XML_FONT_FAMILY,
642 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_FAMILY },
643 { XML_NAMESPACE_STYLE, XML_FONT_FAMILY_GENERIC,
644 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_FAMILY_GENERIC },
645 { XML_NAMESPACE_STYLE, XML_FONT_STYLE_NAME,
646 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_STYLENAME },
647 { XML_NAMESPACE_STYLE, XML_FONT_PITCH,
648 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_PITCH },
649 { XML_NAMESPACE_STYLE, XML_FONT_CHARSET,
650 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_CHARSET },
651 { XML_NAMESPACE_STYLE, XML_VERTICAL_POS,
652 XML_TOK_STYLE_ATTRIBUTES_ATTR_VERTICAL_POS },
653 { XML_NAMESPACE_STYLE, XML_VERTICAL_REL,
654 XML_TOK_STYLE_ATTRIBUTES_ATTR_VERTICAL_REL },
655 { XML_NAMESPACE_FO, XML_WIDTH,
656 XML_TOK_STYLE_ATTRIBUTES_ATTR_WIDTH },
657 { XML_NAMESPACE_FO, XML_HEIGHT,
658 XML_TOK_STYLE_ATTRIBUTES_ATTR_HEIGHT },
659 { XML_NAMESPACE_FO, XML_COLOR,
660 XML_TOK_STYLE_ATTRIBUTES_ATTR_COLOR },
661 { XML_NAMESPACE_STYLE, XML_USE_WINDOW_FONT_COLOR,
662 XML_TOK_STYLE_ATTRIBUTES_ATTR_WINDOW_FONT_COLOR },
663 { XML_NAMESPACE_FO, XML_FONT_SIZE,
664 XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_SIZE },
665 { XML_NAMESPACE_TEXT, XML_LIST_LEVEL_POSITION_AND_SPACE_MODE,
666 XML_TOK_STYLE_ATTRIBUTES_ATTR_POSITION_AND_SPACE_MODE },
667 XML_TOKEN_MAP_END
669 return aStyleAttributesAttrTokenMap;
671 SvxXMLListLevelStyleAttrContext_Impl::SvxXMLListLevelStyleAttrContext_Impl(
672 SvXMLImport& rImport, sal_uInt16 nPrfx,
673 const OUString& rLName,
674 const Reference< xml::sax::XAttributeList > & xAttrList,
675 SvxXMLListLevelStyleContext_Impl& rLLevel ) :
676 SvXMLImportContext( rImport, nPrfx, rLName ),
677 rListLevel( rLLevel )
679 SvXMLTokenMap aTokenMap( lcl_getStyleAttributesAttrTokenMap() );
680 SvXMLUnitConverter& rUnitConv = GetImport().GetMM100UnitConverter();
682 OUString sFontName, sFontFamily, sFontStyleName, sFontFamilyGeneric,
683 sFontPitch, sFontCharset;
684 OUString sVerticalPos, sVerticalRel;
686 sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
687 for( sal_Int16 i=0; i < nAttrCount; i++ )
689 const OUString& rAttrName = xAttrList->getNameByIndex( i );
690 OUString aLocalName;
691 sal_uInt16 nPrefix =
692 GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
693 &aLocalName );
694 const OUString& rValue = xAttrList->getValueByIndex( i );
696 sal_Int32 nVal;
697 switch( aTokenMap.Get( nPrefix, aLocalName ) )
699 case XML_TOK_STYLE_ATTRIBUTES_ATTR_SPACE_BEFORE:
700 if (rUnitConv.convertMeasureToCore(nVal, rValue, SHRT_MIN, SHRT_MAX))
701 rListLevel.SetSpaceBefore( nVal );
702 break;
703 case XML_TOK_STYLE_ATTRIBUTES_ATTR_MIN_LABEL_WIDTH:
704 if (rUnitConv.convertMeasureToCore( nVal, rValue, 0, SHRT_MAX ))
705 rListLevel.SetMinLabelWidth( nVal );
706 break;
707 case XML_TOK_STYLE_ATTRIBUTES_ATTR_MIN_LABEL_DIST:
708 if (rUnitConv.convertMeasureToCore( nVal, rValue, 0, USHRT_MAX ))
709 rListLevel.SetMinLabelDist( nVal );
710 break;
711 case XML_TOK_STYLE_ATTRIBUTES_ATTR_TEXT_ALIGN:
712 if( !rValue.isEmpty() )
714 sal_Int16 eAdjust = HoriOrientation::LEFT;
715 if( IsXMLToken( rValue, XML_CENTER ) )
716 eAdjust = HoriOrientation::CENTER;
717 else if( IsXMLToken( rValue, XML_END ) )
718 eAdjust = HoriOrientation::RIGHT;
719 rListLevel.SetAdjust( eAdjust );
721 break;
722 case XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_NAME:
723 sFontName = rValue;
724 break;
725 case XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_FAMILY:
726 sFontFamily = rValue;
727 break;
728 case XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_FAMILY_GENERIC:
729 sFontFamilyGeneric = rValue;
730 break;
731 case XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_STYLENAME:
732 sFontStyleName = rValue;
733 break;
734 case XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_PITCH:
735 sFontPitch = rValue;
736 break;
737 case XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_CHARSET:
738 sFontCharset = rValue;
739 break;
740 case XML_TOK_STYLE_ATTRIBUTES_ATTR_VERTICAL_POS:
741 sVerticalPos = rValue;
742 break;
743 case XML_TOK_STYLE_ATTRIBUTES_ATTR_VERTICAL_REL:
744 sVerticalRel = rValue;
745 break;
746 case XML_TOK_STYLE_ATTRIBUTES_ATTR_WIDTH:
747 if (rUnitConv.convertMeasureToCore(nVal, rValue, 0, SAL_MAX_INT32))
748 rListLevel.SetImageWidth( nVal );
749 break;
750 case XML_TOK_STYLE_ATTRIBUTES_ATTR_HEIGHT:
751 if (rUnitConv.convertMeasureToCore(nVal, rValue, 0, SAL_MAX_INT32))
752 rListLevel.SetImageHeight( nVal );
753 break;
754 case XML_TOK_STYLE_ATTRIBUTES_ATTR_COLOR:
756 sal_Int32 nColor(0);
757 if (::sax::Converter::convertColor( nColor, rValue ))
759 rListLevel.SetColor( nColor );
762 break;
763 case XML_TOK_STYLE_ATTRIBUTES_ATTR_WINDOW_FONT_COLOR:
765 if( IsXMLToken( rValue, XML_TRUE ) )
766 rListLevel.SetColor( (sal_Int32)0xffffffff );
768 break;
769 case XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_SIZE:
770 if (::sax::Converter::convertPercent( nVal, rValue ))
771 rListLevel.SetRelSize( (sal_Int16)nVal );
772 break;
773 case XML_TOK_STYLE_ATTRIBUTES_ATTR_POSITION_AND_SPACE_MODE:
775 sal_Int16 ePosAndSpaceMode = PositionAndSpaceMode::LABEL_WIDTH_AND_POSITION;
776 if( IsXMLToken( rValue, XML_LABEL_ALIGNMENT ) )
777 ePosAndSpaceMode = PositionAndSpaceMode::LABEL_ALIGNMENT;
778 rListLevel.SetPosAndSpaceMode( ePosAndSpaceMode );
780 break;
784 if( !sFontName.isEmpty() )
786 const XMLFontStylesContext *pFontDecls =
787 GetImport().GetFontDecls();
788 if( pFontDecls )
790 ::std::vector < XMLPropertyState > aProps;
791 if( pFontDecls->FillProperties( sFontName, aProps, 0, 1, 2, 3, 4 ) )
793 OUString sTmp;
794 sal_Int16 nTmp = 0;
795 ::std::vector< XMLPropertyState >::iterator i;
796 for( i = aProps.begin(); i != aProps.end(); ++i )
798 switch( i->mnIndex )
800 case 0:
801 i->maValue >>= sTmp;
802 rListLevel.SetBulletFontName( sTmp);
803 break;
804 case 1:
805 i->maValue >>= sTmp;
806 rListLevel.SetBulletFontStyleName( sTmp );
807 break;
808 case 2:
809 i->maValue >>= nTmp;
810 rListLevel.SetBulletFontFamily( nTmp );
811 break;
812 case 3:
813 i->maValue >>= nTmp;
814 rListLevel.SetBulletFontPitch( nTmp );
815 break;
816 case 4:
817 i->maValue >>= nTmp;
818 rListLevel.SetBulletFontEncoding( nTmp );
819 break;
825 if( !sFontFamily.isEmpty() )
827 Any aAny;
829 XMLFontFamilyNamePropHdl aFamilyNameHdl;
830 if( aFamilyNameHdl.importXML( sFontFamily, aAny, rUnitConv ) )
832 OUString sTmp;
833 aAny >>= sTmp;
834 rListLevel.SetBulletFontName( sTmp);
837 XMLFontFamilyPropHdl aFamilyHdl;
838 if( !sFontFamilyGeneric.isEmpty() &&
839 aFamilyHdl.importXML( sFontFamilyGeneric, aAny, rUnitConv ) )
841 sal_Int16 nTmp = 0;
842 aAny >>= nTmp;
843 rListLevel.SetBulletFontFamily( nTmp );
846 if( !sFontStyleName.isEmpty() )
847 rListLevel.SetBulletFontStyleName( sFontStyleName );
849 XMLFontPitchPropHdl aPitchHdl;
850 if( !sFontPitch.isEmpty() &&
851 aPitchHdl.importXML( sFontPitch, aAny, rUnitConv ) )
853 sal_Int16 nTmp = 0;
854 aAny >>= nTmp;
855 rListLevel.SetBulletFontPitch( nTmp );
858 XMLFontEncodingPropHdl aEncHdl;
859 if( !sFontCharset.isEmpty() &&
860 aEncHdl.importXML( sFontCharset, aAny, rUnitConv ) )
862 sal_Int16 nTmp = 0;
863 aAny >>= nTmp;
864 rListLevel.SetBulletFontEncoding( nTmp );
868 sal_Int16 eVertOrient = VertOrientation::LINE_CENTER;
869 if( !sVerticalPos.isEmpty() )
871 if( IsXMLToken( sVerticalPos, XML_TOP ) )
872 eVertOrient = VertOrientation::LINE_TOP;
873 else if( IsXMLToken( sVerticalPos, XML_BOTTOM ) )
874 eVertOrient = VertOrientation::LINE_BOTTOM;
876 if( !sVerticalRel.isEmpty() )
878 if( IsXMLToken( sVerticalRel, XML_BASELINE ) )
880 // TOP and BOTTOM are exchanged for a baseline relation
881 switch( eVertOrient )
883 case VertOrientation::LINE_TOP:
884 eVertOrient = VertOrientation::BOTTOM;
885 break;
886 case VertOrientation::LINE_CENTER:
887 eVertOrient = VertOrientation::CENTER;
888 break;
889 case VertOrientation::LINE_BOTTOM:
890 eVertOrient = VertOrientation::TOP;
891 break;
894 else if( IsXMLToken( sVerticalRel, XML_CHAR ) )
896 switch( eVertOrient )
898 case VertOrientation::LINE_TOP:
899 eVertOrient = VertOrientation::CHAR_TOP;
900 break;
901 case VertOrientation::LINE_CENTER:
902 eVertOrient = VertOrientation::CHAR_CENTER;
903 break;
904 case VertOrientation::LINE_BOTTOM:
905 eVertOrient = VertOrientation::CHAR_BOTTOM;
906 break;
910 rListLevel.SetImageVertOrient( eVertOrient );
913 SvxXMLListLevelStyleAttrContext_Impl::~SvxXMLListLevelStyleAttrContext_Impl()
917 SvXMLImportContext* SvxXMLListLevelStyleAttrContext_Impl::CreateChildContext(
918 sal_uInt16 nPrefix, const OUString& rLocalName,
919 const Reference< xml::sax::XAttributeList > & xAttrList )
921 SvXMLImportContext *pContext = 0;
922 if ( XML_NAMESPACE_STYLE == nPrefix &&
923 IsXMLToken( rLocalName, XML_LIST_LEVEL_LABEL_ALIGNMENT ) )
925 pContext = new SvxXMLListLevelStyleLabelAlignmentAttrContext_Impl( GetImport(),
926 nPrefix,
927 rLocalName,
928 xAttrList,
929 rListLevel );
931 if( !pContext )
933 pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
936 return pContext;
939 // ---------------------------------------------------------------------
941 enum SvxXMLStyleAttributesLabelAlignmentAttrTokens
943 XML_TOK_STYLE_ATTRIBUTES_ATTR_LABEL_FOLLOWED_BY,
944 XML_TOK_STYLE_ATTRIBUTES_ATTR_LISTTAB_STOP_POSITION,
945 XML_TOK_STYLE_ATTRIBUTES_ATTR_FIRST_LINE_INDENT,
946 XML_TOK_STYLE_ATTRIBUTES_ATTR_INDENT_AT,
948 XML_TOK_STYLE_ATTRIBUTES_LABEL_ALIGNMENT_ATTR_END=XML_TOK_UNKNOWN
950 static const SvXMLTokenMapEntry* lcl_getStyleAlignmentAttributesAttrTokenMap()
952 static SvXMLTokenMapEntry aStyleAlignmentAttributesAttrTokenMap[] =
954 { XML_NAMESPACE_TEXT, XML_LABEL_FOLLOWED_BY,
955 XML_TOK_STYLE_ATTRIBUTES_ATTR_LABEL_FOLLOWED_BY },
956 { XML_NAMESPACE_TEXT, XML_LIST_TAB_STOP_POSITION,
957 XML_TOK_STYLE_ATTRIBUTES_ATTR_LISTTAB_STOP_POSITION },
958 { XML_NAMESPACE_FO, XML_TEXT_INDENT,
959 XML_TOK_STYLE_ATTRIBUTES_ATTR_FIRST_LINE_INDENT },
960 { XML_NAMESPACE_FO, XML_MARGIN_LEFT,
961 XML_TOK_STYLE_ATTRIBUTES_ATTR_INDENT_AT },
963 XML_TOKEN_MAP_END
965 return aStyleAlignmentAttributesAttrTokenMap;
967 SvxXMLListLevelStyleLabelAlignmentAttrContext_Impl::SvxXMLListLevelStyleLabelAlignmentAttrContext_Impl(
968 SvXMLImport& rImport, sal_uInt16 nPrfx,
969 const OUString& rLName,
970 const Reference< xml::sax::XAttributeList > & xAttrList,
971 SvxXMLListLevelStyleContext_Impl& rLLevel ) :
972 SvXMLImportContext( rImport, nPrfx, rLName ),
973 rListLevel( rLLevel )
975 SvXMLTokenMap aTokenMap( lcl_getStyleAlignmentAttributesAttrTokenMap() );
976 SvXMLUnitConverter& rUnitConv = GetImport().GetMM100UnitConverter();
978 sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
979 for( sal_Int16 i=0; i < nAttrCount; i++ )
981 const OUString& rAttrName = xAttrList->getNameByIndex( i );
982 OUString aLocalName;
983 sal_uInt16 nPrefix =
984 GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
985 &aLocalName );
986 const OUString& rValue = xAttrList->getValueByIndex( i );
988 sal_Int32 nVal;
989 switch( aTokenMap.Get( nPrefix, aLocalName ) )
991 case XML_TOK_STYLE_ATTRIBUTES_ATTR_LABEL_FOLLOWED_BY:
993 sal_Int16 eLabelFollowedBy = LabelFollow::LISTTAB;
994 if( IsXMLToken( rValue, XML_SPACE ) )
995 eLabelFollowedBy = LabelFollow::SPACE;
996 else if( IsXMLToken( rValue, XML_NOTHING ) )
997 eLabelFollowedBy = LabelFollow::NOTHING;
998 rListLevel.SetLabelFollowedBy( eLabelFollowedBy );
1000 break;
1001 case XML_TOK_STYLE_ATTRIBUTES_ATTR_LISTTAB_STOP_POSITION:
1002 if (rUnitConv.convertMeasureToCore(nVal, rValue, 0, SHRT_MAX))
1003 rListLevel.SetListtabStopPosition( nVal );
1004 break;
1005 case XML_TOK_STYLE_ATTRIBUTES_ATTR_FIRST_LINE_INDENT:
1006 if (rUnitConv.convertMeasureToCore(nVal, rValue, SHRT_MIN, SHRT_MAX))
1007 rListLevel.SetFirstLineIndent( nVal );
1008 break;
1009 case XML_TOK_STYLE_ATTRIBUTES_ATTR_INDENT_AT:
1010 if (rUnitConv.convertMeasureToCore(nVal, rValue, SHRT_MIN, SHRT_MAX))
1011 rListLevel.SetIndentAt( nVal );
1012 break;
1017 SvxXMLListLevelStyleLabelAlignmentAttrContext_Impl::~SvxXMLListLevelStyleLabelAlignmentAttrContext_Impl()
1021 // ---------------------------------------------------------------------
1023 class SvxXMLListStyle_Impl : public std::vector<SvxXMLListLevelStyleContext_Impl *> {};
1025 void SvxXMLListStyleContext::SetAttribute( sal_uInt16 nPrefixKey,
1026 const OUString& rLocalName,
1027 const OUString& rValue )
1029 if( XML_NAMESPACE_TEXT == nPrefixKey &&
1030 IsXMLToken( rLocalName, XML_CONSECUTIVE_NUMBERING ) )
1032 bConsecutive = IsXMLToken( rValue, XML_TRUE );
1034 else
1036 SvXMLStyleContext::SetAttribute( nPrefixKey, rLocalName, rValue );
1041 SvxXMLListStyleContext::SvxXMLListStyleContext( SvXMLImport& rImport,
1042 sal_uInt16 nPrfx,
1043 const OUString& rLName,
1044 const Reference< xml::sax::XAttributeList > & xAttrList,
1045 sal_Bool bOutl )
1046 : SvXMLStyleContext( rImport, nPrfx, rLName, xAttrList, bOutl ? XML_STYLE_FAMILY_TEXT_OUTLINE : XML_STYLE_FAMILY_TEXT_LIST )
1047 , sIsPhysical( "IsPhysical" )
1048 , sNumberingRules( "NumberingRules" )
1049 , sName( "Name" )
1050 , sIsContinuousNumbering( "IsContinuousNumbering" )
1051 , pLevelStyles( 0 )
1052 , nLevels( 0 )
1053 , bConsecutive( sal_False )
1054 , bOutline( bOutl )
1058 SvxXMLListStyleContext::~SvxXMLListStyleContext()
1060 if( pLevelStyles )
1062 while( !pLevelStyles->empty() )
1064 SvxXMLListLevelStyleContext_Impl *pStyle = pLevelStyles->back();
1065 pLevelStyles->pop_back();
1066 pStyle->ReleaseRef();
1070 delete pLevelStyles;
1073 TYPEINIT1( SvxXMLListStyleContext, SvXMLStyleContext );
1075 SvXMLImportContext *SvxXMLListStyleContext::CreateChildContext(
1076 sal_uInt16 nPrefix,
1077 const OUString& rLocalName,
1078 const Reference< xml::sax::XAttributeList > & xAttrList )
1080 SvXMLImportContext *pContext = 0;
1082 if( XML_NAMESPACE_TEXT == nPrefix &&
1083 ( bOutline
1084 ? IsXMLToken( rLocalName, XML_OUTLINE_LEVEL_STYLE )
1085 : ( IsXMLToken( rLocalName, XML_LIST_LEVEL_STYLE_NUMBER ) ||
1086 IsXMLToken( rLocalName, XML_LIST_LEVEL_STYLE_BULLET ) ||
1087 IsXMLToken( rLocalName, XML_LIST_LEVEL_STYLE_IMAGE ) ) ) )
1089 SvxXMLListLevelStyleContext_Impl *pLevelStyle =
1090 new SvxXMLListLevelStyleContext_Impl( GetImport(), nPrefix,
1091 rLocalName, xAttrList );
1092 if( !pLevelStyles )
1093 pLevelStyles = new SvxXMLListStyle_Impl;
1094 pLevelStyles->push_back( pLevelStyle );
1095 pLevelStyle->AddRef();
1097 pContext = pLevelStyle;
1099 else
1101 pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
1104 return pContext;
1107 void SvxXMLListStyleContext::FillUnoNumRule(
1108 const Reference< container::XIndexReplace > & rNumRule,
1109 const SvI18NMap *pI18NMap ) const
1113 if( pLevelStyles && rNumRule.is() )
1115 sal_uInt16 nCount = pLevelStyles->size();
1116 sal_Int32 l_nLevels = rNumRule->getCount();
1117 for( sal_uInt16 i=0; i < nCount; i++ )
1119 SvxXMLListLevelStyleContext_Impl *pLevelStyle =
1120 (*pLevelStyles)[i];
1121 sal_Int32 nLevel = pLevelStyle->GetLevel();
1122 if( nLevel >= 0 && nLevel < l_nLevels )
1124 Sequence<beans::PropertyValue> aProps =
1125 pLevelStyle->GetProperties( pI18NMap );
1126 Any aAny;
1127 aAny <<= aProps;
1128 rNumRule->replaceByIndex( nLevel, aAny );
1133 Reference < XPropertySet > xPropSet( rNumRule, UNO_QUERY );
1134 Reference< XPropertySetInfo > xPropSetInfo;
1135 if (xPropSet.is())
1136 xPropSetInfo = xPropSet->getPropertySetInfo();
1137 if( xPropSetInfo.is() &&
1138 xPropSetInfo->hasPropertyByName( sIsContinuousNumbering ) )
1140 Any aAny;
1141 sal_Bool bTmp = bConsecutive;
1142 aAny.setValue( &bTmp, ::getBooleanCppuType() );
1143 xPropSet->setPropertyValue( sIsContinuousNumbering, aAny );
1146 catch (const Exception&)
1148 OSL_FAIL( "SvxXMLListStyleContext::FillUnoNumRule - Exception caught" );
1152 void SvxXMLListStyleContext::CreateAndInsertLate( sal_Bool bOverwrite )
1154 if( bOutline )
1156 if( bOverwrite )
1158 const Reference< XIndexReplace >& rNumRule =
1159 GetImport().GetTextImport()->GetChapterNumbering();
1160 // We don't set xNumberingRules here, to avoid using them
1161 // as numbering rules.
1162 if( rNumRule.is() )
1163 FillUnoNumRule( rNumRule, 0 );
1166 else
1168 Reference < XStyle > xStyle;
1169 const OUString& rName = GetDisplayName();
1170 if( rName.isEmpty() )
1172 SetValid( sal_False );
1173 return;
1176 const Reference < XNameContainer >& rNumStyles =
1177 GetImport().GetTextImport()->GetNumberingStyles();
1178 if( !rNumStyles.is() )
1180 SetValid( sal_False );
1181 return;
1184 sal_Bool bNew = sal_False;
1185 if( rNumStyles->hasByName( rName ) )
1187 Any aAny = rNumStyles->getByName( rName );
1188 aAny >>= xStyle;
1190 else
1192 Reference< XMultiServiceFactory > xFactory( GetImport().GetModel(),
1193 UNO_QUERY );
1194 DBG_ASSERT( xFactory.is(), "no factory" );
1195 if( !xFactory.is() )
1196 return;
1198 Reference < XInterface > xIfc = xFactory->createInstance(OUString("com.sun.star.style.NumberingStyle") );
1199 if( !xIfc.is() )
1200 return;
1201 Reference < XStyle > xTmp( xIfc, UNO_QUERY );
1202 xStyle = xTmp;
1203 if( !xStyle.is() )
1204 return;
1206 Any aAny;
1207 aAny <<= xStyle;
1208 rNumStyles->insertByName( rName, aAny );
1209 bNew = sal_True;
1212 Reference < XPropertySet > xPropSet( xStyle, UNO_QUERY );
1213 Reference< XPropertySetInfo > xPropSetInfo =
1214 xPropSet->getPropertySetInfo();
1215 if( !bNew && xPropSetInfo->hasPropertyByName( sIsPhysical ) )
1217 Any aAny = xPropSet->getPropertyValue( sIsPhysical );
1218 bNew = !*(sal_Bool *)aAny.getValue();
1221 if ( xPropSetInfo->hasPropertyByName( "Hidden" ) )
1222 xPropSet->setPropertyValue( "Hidden", uno::makeAny( IsHidden( ) ) );
1224 if( rName != GetName() )
1225 GetImport().AddStyleDisplayName( XML_STYLE_FAMILY_TEXT_LIST,
1226 GetName(), rName );
1228 Any aAny = xPropSet->getPropertyValue( sNumberingRules );
1229 aAny >>= xNumRules;
1230 nLevels = xNumRules->getCount();
1231 if( bOverwrite || bNew )
1233 FillUnoNumRule( xNumRules, 0 );
1234 aAny <<= xNumRules;
1235 xPropSet->setPropertyValue( sNumberingRules, aAny );
1237 else
1239 SetValid( sal_False );
1242 SetNew( bNew );
1246 void SvxXMLListStyleContext::CreateAndInsertAuto() const
1248 DBG_ASSERT( !bOutline, "Outlines cannot be inserted here" );
1249 DBG_ASSERT( !xNumRules.is(), "Numbering Rule is existing already" );
1251 const OUString& rName = GetName();
1252 if( bOutline || xNumRules.is() || rName.isEmpty() )
1254 ((SvxXMLListStyleContext *)this)->SetValid( sal_False );
1255 return;
1258 ((SvxXMLListStyleContext *)this)->xNumRules = CreateNumRule(
1259 GetImport().GetModel() );
1260 ((SvxXMLListStyleContext *)this)->nLevels = xNumRules->getCount();
1262 FillUnoNumRule( xNumRules, 0 );
1265 Reference < XIndexReplace > SvxXMLListStyleContext::CreateNumRule(
1266 const Reference < XModel > & rModel )
1268 Reference<XIndexReplace> xNumRule;
1270 Reference< XMultiServiceFactory > xFactory( rModel, UNO_QUERY );
1271 DBG_ASSERT( xFactory.is(), "no factory" );
1272 if( !xFactory.is() )
1273 return xNumRule;
1275 Reference < XInterface > xIfc = xFactory->createInstance(OUString("com.sun.star.text.NumberingRules") );
1276 if( !xIfc.is() )
1277 return xNumRule;
1279 xNumRule = Reference<XIndexReplace>( xIfc, UNO_QUERY );
1280 DBG_ASSERT( xNumRule.is(), "go no numbering rule" );
1282 return xNumRule;
1285 void SvxXMLListStyleContext::SetDefaultStyle(
1286 const Reference < XIndexReplace > & rNumRule,
1287 sal_Int16 nLevel,
1288 sal_Bool bOrdered )
1290 Sequence<beans::PropertyValue> aPropSeq( bOrdered ? 1 : 4 );
1291 beans::PropertyValue *pProps = aPropSeq.getArray();
1293 pProps->Name = "NumberingType";
1294 (pProps++)->Value <<= (sal_Int16)(bOrdered ? NumberingType::ARABIC
1295 : NumberingType::CHAR_SPECIAL );
1296 if( !bOrdered )
1298 // TODO: Bullet-Font
1299 awt::FontDescriptor aFDesc;
1300 aFDesc.Name = OUString(
1301 #if defined UNX
1302 "starbats"
1303 #else
1304 "StarBats"
1305 #endif
1307 aFDesc.Family = FAMILY_DONTKNOW ;
1308 aFDesc.Pitch = PITCH_DONTKNOW ;
1309 aFDesc.CharSet = RTL_TEXTENCODING_SYMBOL ;
1310 aFDesc.Weight = WEIGHT_DONTKNOW;
1311 pProps->Name = "BulletFont";
1312 (pProps++)->Value <<= aFDesc;
1314 OUStringBuffer sTmp(1);
1315 sTmp.append( (sal_Unicode)(0xF000 + 149) );
1316 pProps->Name = "BulletChar";
1317 (pProps++)->Value <<= sTmp.makeStringAndClear();
1318 pProps->Name = "CharStyleName";
1319 (pProps++)->Value <<= OUString( "Numbering Symbols" );
1322 Any aAny;
1323 aAny <<= aPropSeq;
1324 rNumRule->replaceByIndex( nLevel, aAny );
1327 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */