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