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