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