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 62 : 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 62 : 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 5164 : void SetRelSize( sal_Int16 nRel ) { nRelSize = nRel; }
193 5164 : void SetColor( sal_Int32 nColor )
194 5164 : { m_nColor = nColor; bHasColor = true; }
195 5032 : void SetSpaceBefore( sal_Int32 nSet ) { nSpaceBefore = nSet; }
196 2666 : void SetMinLabelWidth( sal_Int32 nSet ) { nMinLabelWidth = nSet; }
197 130 : void SetMinLabelDist( sal_Int32 nSet ) { nMinLabelDist = nSet; }
198 102 : void SetAdjust( sal_Int16 eSet ) { eAdjust = eSet; }
199 :
200 2562 : void SetBulletFontName( const OUString& rSet ) { sBulletFontName = rSet; }
201 468 : void SetBulletFontStyleName( const OUString& rSet )
202 468 : { sBulletFontStyleName = rSet; }
203 476 : void SetBulletFontFamily( sal_Int16 eSet ) { eBulletFontFamily = eSet; }
204 454 : void SetBulletFontPitch( sal_Int16 eSet ) { eBulletFontPitch = eSet; }
205 558 : void SetBulletFontEncoding( rtl_TextEncoding eSet )
206 558 : { eBulletFontEncoding = eSet; }
207 :
208 0 : void SetImageWidth( sal_Int32 nSet ) { nImageWidth = nSet; }
209 0 : void SetImageHeight( sal_Int32 nSet ) { nImageHeight = nSet; }
210 15286 : void SetImageVertOrient( sal_Int16 eSet )
211 15286 : { 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 6526 : sal_Int32 GetLevel() const { return nLevel; }
226 : Sequence<beans::PropertyValue> GetProperties(
227 : const SvI18NMap *pI18NMap=0 );
228 :
229 3980 : inline void SetPosAndSpaceMode( sal_Int16 eValue )
230 : {
231 3980 : ePosAndSpaceMode = eValue;
232 3980 : }
233 3980 : inline void SetLabelFollowedBy( sal_Int16 eValue )
234 : {
235 3980 : eLabelFollowedBy = eValue;
236 3980 : }
237 3710 : inline void SetListtabStopPosition( sal_Int32 nValue )
238 : {
239 3710 : nListtabStopPosition = nValue;
240 3710 : }
241 3854 : inline void SetFirstLineIndent( sal_Int32 nValue )
242 : {
243 3854 : nFirstLineIndent = nValue;
244 3854 : }
245 3868 : inline void SetIndentAt( sal_Int32 nValue )
246 : {
247 3868 : nIndentAt = nValue;
248 3868 : }
249 : };
250 :
251 9946 : 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( false )
282 : , bImage( false )
283 : , bNum( false )
284 9946 : , bHasColor( false )
285 : {
286 15682 : if( IsXMLToken( rLName, XML_LIST_LEVEL_STYLE_NUMBER ) ||
287 5736 : IsXMLToken( rLName, XML_OUTLINE_LEVEL_STYLE ) )
288 7330 : bNum = true;
289 2616 : else if( IsXMLToken( rLName, XML_LIST_LEVEL_STYLE_BULLET ) )
290 2616 : bBullet = true;
291 0 : else if( IsXMLToken( rLName, XML_LIST_LEVEL_STYLE_IMAGE ) )
292 0 : bImage = true;
293 :
294 9946 : static const SvXMLTokenMap aTokenMap( lcl_getLevelAttrTokenMap() );
295 9946 : sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
296 32224 : for( sal_Int16 i=0; i < nAttrCount; i++ )
297 : {
298 22278 : const OUString& rAttrName = xAttrList->getNameByIndex( i );
299 44556 : OUString aLocalName;
300 : sal_uInt16 nPrefix =
301 22278 : GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
302 22278 : &aLocalName );
303 44556 : const OUString& rValue = xAttrList->getValueByIndex( i );
304 :
305 22278 : switch( aTokenMap.Get( nPrefix, aLocalName ) )
306 : {
307 : case XML_TOK_TEXT_LEVEL_ATTR_LEVEL:
308 9946 : nLevel = rValue.toInt32();
309 9946 : if( nLevel >= 1L )
310 9946 : nLevel--;
311 : else
312 0 : nLevel = 0;
313 9946 : break;
314 : case XML_TOK_TEXT_LEVEL_ATTR_STYLE_NAME:
315 776 : sTextStyleName = rValue;
316 776 : break;
317 : case XML_TOK_TEXT_LEVEL_ATTR_BULLET_CHAR:
318 2616 : if (!rValue.isEmpty())
319 2616 : cBullet = rValue[0];
320 2616 : 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 7330 : if( bNum )
332 7330 : sNumFormat = rValue;
333 7330 : break;
334 : case XML_TOK_TEXT_LEVEL_ATTR_NUM_PREFIX:
335 96 : sPrefix = rValue;
336 96 : break;
337 : case XML_TOK_TEXT_LEVEL_ATTR_NUM_SUFFIX:
338 1258 : sSuffix = rValue;
339 1258 : 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 88 : if( bNum )
346 : {
347 88 : sal_Int32 nTmp = rValue.toInt32();
348 : nNumStartValue =
349 : (nTmp < 0L) ? 1 : ( (nTmp>SHRT_MAX) ? SHRT_MAX
350 88 : : (sal_Int16)nTmp );
351 : }
352 88 : break;
353 : case XML_TOK_TEXT_LEVEL_ATTR_DISPLAY_LEVELS:
354 168 : if( bNum )
355 : {
356 168 : sal_Int32 nTmp = rValue.toInt32();
357 : nNumDisplayLevels =
358 : (nTmp < 1L) ? 1 : ( (nTmp>SHRT_MAX) ? SHRT_MAX
359 168 : : (sal_Int16)nTmp );
360 : }
361 168 : break;
362 : }
363 22278 : }
364 9946 : }
365 :
366 19892 : SvxXMLListLevelStyleContext_Impl::~SvxXMLListLevelStyleContext_Impl()
367 : {
368 19892 : }
369 :
370 15286 : SvXMLImportContext *SvxXMLListLevelStyleContext_Impl::CreateChildContext(
371 : sal_uInt16 nPrefix, const OUString& rLocalName,
372 : const Reference< xml::sax::XAttributeList > & xAttrList )
373 : {
374 15286 : SvXMLImportContext *pContext = 0;
375 45858 : if( XML_NAMESPACE_STYLE == nPrefix &&
376 20706 : ( IsXMLToken( rLocalName, XML_LIST_LEVEL_PROPERTIES ) ||
377 5420 : IsXMLToken( rLocalName, XML_TEXT_PROPERTIES ) ) )
378 : {
379 15286 : pContext = new SvxXMLListLevelStyleAttrContext_Impl( GetImport(),
380 : nPrefix,
381 : rLocalName,
382 : xAttrList,
383 15286 : *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 15286 : if( !pContext )
398 : {
399 0 : pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
400 : }
401 :
402 15286 : return pContext;
403 : }
404 :
405 6526 : Sequence<beans::PropertyValue> SvxXMLListLevelStyleContext_Impl::GetProperties(
406 : const SvI18NMap *pI18NMap )
407 : {
408 6526 : sal_Int16 eType = NumberingType::NUMBER_NONE;
409 :
410 6526 : sal_Int32 nCount = 0;
411 6526 : if( bBullet )
412 : {
413 2004 : eType = NumberingType::CHAR_SPECIAL;
414 2004 : nCount = 15; // 'cBullet' will be written anyway if 'bBullet' is true
415 : }
416 6526 : 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 6526 : if( bNum )
425 : {
426 4522 : eType = NumberingType::ARABIC;
427 4522 : GetImport().GetMM100UnitConverter().convertNumFormat(
428 9044 : eType, sNumFormat, sNumLetterSync, true );
429 4522 : nCount = 15;
430 : }
431 :
432 6526 : if( ( bBullet || bNum ) && nRelSize )
433 1804 : nCount++;
434 :
435 6526 : if( !bImage && bHasColor )
436 : {
437 1804 : nCount++;
438 : }
439 :
440 6526 : if (bBullet && !sSuffix.isEmpty())
441 : {
442 108 : sal_uInt16 const nVersion(GetImport().getGeneratorVersion());
443 : sal_Int32 nUPD;
444 : sal_Int32 nBuildId;
445 216 : if (GetImport().getBuildIds(nUPD, nBuildId)
446 108 : && ( (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 6526 : Sequence<beans::PropertyValue> aPropSeq( nCount );
457 6526 : if( nCount > 0 )
458 : {
459 6526 : beans::PropertyValue *pProps = aPropSeq.getArray();
460 6526 : sal_Int32 nPos = 0;
461 6526 : pProps[nPos].Name = "NumberingType";
462 6526 : pProps[nPos++].Value <<= (sal_Int16)eType ;
463 :
464 6526 : pProps[nPos].Name = "Prefix";
465 6526 : pProps[nPos++].Value <<= sPrefix;
466 :
467 6526 : pProps[nPos].Name = "Suffix";
468 6526 : pProps[nPos++].Value <<= sSuffix;
469 :
470 6526 : pProps[nPos].Name = "Adjust";
471 6526 : pProps[nPos++].Value <<= eAdjust;
472 :
473 6526 : sal_Int32 nLeftMargin = nSpaceBefore + nMinLabelWidth;
474 6526 : pProps[nPos].Name = "LeftMargin";
475 6526 : pProps[nPos++].Value <<= (sal_Int32)nLeftMargin;
476 :
477 6526 : sal_Int32 nFirstLineOffset = -nMinLabelWidth;
478 :
479 6526 : pProps[nPos].Name = "FirstLineOffset";
480 6526 : pProps[nPos++].Value <<= (sal_Int32)nFirstLineOffset;
481 :
482 6526 : pProps[nPos].Name = "SymbolTextDistance";
483 6526 : pProps[nPos++].Value <<= (sal_Int16)nMinLabelDist;
484 :
485 6526 : pProps[nPos].Name = "PositionAndSpaceMode";
486 6526 : pProps[nPos++].Value <<= (sal_Int16)ePosAndSpaceMode;
487 6526 : pProps[nPos].Name = "LabelFollowedBy";
488 6526 : pProps[nPos++].Value <<= (sal_Int16)eLabelFollowedBy;
489 6526 : pProps[nPos].Name = "ListtabStopPosition";
490 6526 : pProps[nPos++].Value <<= (sal_Int32)nListtabStopPosition;
491 6526 : pProps[nPos].Name = "FirstLineIndent";
492 6526 : pProps[nPos++].Value <<= (sal_Int32)nFirstLineIndent;
493 6526 : pProps[nPos].Name = "IndentAt";
494 6526 : pProps[nPos++].Value <<= (sal_Int32)nIndentAt;
495 :
496 6526 : OUString sDisplayTextStyleName = GetImport().GetStyleDisplayName(
497 13052 : XML_STYLE_FAMILY_TEXT_TEXT, sTextStyleName );
498 13052 : OUString sStyleName = sDisplayTextStyleName;
499 6526 : if( !sStyleName.isEmpty() && pI18NMap )
500 0 : sStyleName = pI18NMap->Get( SFX_STYLE_FAMILY_CHAR, sStyleName );
501 6526 : pProps[nPos].Name = "CharStyleName";
502 6526 : pProps[nPos++].Value <<= sDisplayTextStyleName;
503 :
504 6526 : if( bBullet )
505 : {
506 2004 : awt::FontDescriptor aFDesc;
507 2004 : aFDesc.Name = sBulletFontName;
508 2004 : if( !sBulletFontName.isEmpty() )
509 : {
510 1970 : aFDesc.StyleName = sBulletFontStyleName;
511 1970 : aFDesc.Family = eBulletFontFamily;
512 1970 : aFDesc.Pitch = eBulletFontPitch;
513 1970 : aFDesc.CharSet = eBulletFontEncoding;
514 1970 : aFDesc.Weight = WEIGHT_DONTKNOW;
515 1970 : bool bStarSymbol = false;
516 1970 : if( aFDesc.Name.equalsIgnoreAsciiCase( sStarBats ) )
517 : {
518 0 : cBullet = GetImport().ConvStarBatsCharToStarSymbol( cBullet );
519 0 : bStarSymbol = true;
520 : }
521 1970 : else if( aFDesc.Name.equalsIgnoreAsciiCase( sStarMath ) )
522 : {
523 0 : cBullet = GetImport().ConvStarMathCharToStarSymbol( cBullet );
524 0 : bStarSymbol = true;
525 : }
526 1970 : 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 4008 : OUStringBuffer sTmp(1);
533 2004 : sTmp.append( cBullet );
534 2004 : pProps[nPos].Name = "BulletChar";
535 2004 : pProps[nPos++].Value <<= sTmp.makeStringAndClear();
536 :
537 2004 : pProps[nPos].Name = "BulletFont";
538 4008 : pProps[nPos++].Value <<= aFDesc;
539 :
540 : }
541 :
542 6526 : 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 6526 : if( bNum )
569 : {
570 4522 : pProps[nPos].Name = "StartWith";
571 4522 : pProps[nPos++].Value <<= (sal_Int16)nNumStartValue;
572 :
573 4522 : pProps[nPos].Name = "ParentNumbering";
574 4522 : pProps[nPos++].Value <<= (sal_Int16)nNumDisplayLevels;
575 : }
576 :
577 6526 : if( ( bNum || bBullet ) && nRelSize )
578 : {
579 1804 : pProps[nPos].Name = "BulletRelSize";
580 1804 : pProps[nPos++].Value <<= nRelSize;
581 : }
582 :
583 6526 : if( !bImage && bHasColor )
584 : {
585 1804 : pProps[nPos].Name = "BulletColor";
586 1804 : pProps[nPos++].Value <<= m_nColor;
587 : }
588 :
589 6526 : DBG_ASSERT( nPos == nCount, "array under/overflow" );
590 : }
591 :
592 6526 : 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 60 : 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 60 : return aStyleAttributesAttrTokenMap;
660 : }
661 15286 : 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 15286 : rListLevel( rLLevel )
668 : {
669 15286 : static const SvXMLTokenMap aTokenMap( lcl_getStyleAttributesAttrTokenMap() );
670 15286 : SvXMLUnitConverter& rUnitConv = GetImport().GetMM100UnitConverter();
671 :
672 30572 : OUString sFontName, sFontFamily, sFontStyleName, sFontFamilyGeneric,
673 30572 : sFontPitch, sFontCharset;
674 30572 : OUString sVerticalPos, sVerticalRel;
675 :
676 15286 : sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
677 40284 : for( sal_Int16 i=0; i < nAttrCount; i++ )
678 : {
679 24998 : const OUString& rAttrName = xAttrList->getNameByIndex( i );
680 49996 : OUString aLocalName;
681 : sal_uInt16 nPrefix =
682 24998 : GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
683 24998 : &aLocalName );
684 49996 : const OUString& rValue = xAttrList->getValueByIndex( i );
685 :
686 : sal_Int32 nVal;
687 24998 : switch( aTokenMap.Get( nPrefix, aLocalName ) )
688 : {
689 : case XML_TOK_STYLE_ATTRIBUTES_ATTR_SPACE_BEFORE:
690 5032 : if (rUnitConv.convertMeasureToCore(nVal, rValue, SHRT_MIN, SHRT_MAX))
691 5032 : rListLevel.SetSpaceBefore( nVal );
692 5032 : break;
693 : case XML_TOK_STYLE_ATTRIBUTES_ATTR_MIN_LABEL_WIDTH:
694 2666 : if (rUnitConv.convertMeasureToCore( nVal, rValue, 0, SHRT_MAX ))
695 2666 : rListLevel.SetMinLabelWidth( nVal );
696 2666 : break;
697 : case XML_TOK_STYLE_ATTRIBUTES_ATTR_MIN_LABEL_DIST:
698 130 : if (rUnitConv.convertMeasureToCore( nVal, rValue, 0, USHRT_MAX ))
699 130 : rListLevel.SetMinLabelDist( nVal );
700 130 : break;
701 : case XML_TOK_STYLE_ATTRIBUTES_ATTR_TEXT_ALIGN:
702 102 : if( !rValue.isEmpty() )
703 : {
704 102 : sal_Int16 eAdjust = HoriOrientation::LEFT;
705 102 : if( IsXMLToken( rValue, XML_CENTER ) )
706 0 : eAdjust = HoriOrientation::CENTER;
707 102 : else if( IsXMLToken( rValue, XML_END ) )
708 102 : eAdjust = HoriOrientation::RIGHT;
709 102 : rListLevel.SetAdjust( eAdjust );
710 : }
711 102 : break;
712 : case XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_NAME:
713 482 : sFontName = rValue;
714 482 : break;
715 : case XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_FAMILY:
716 2114 : sFontFamily = rValue;
717 2114 : break;
718 : case XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_FAMILY_GENERIC:
719 28 : sFontFamilyGeneric = rValue;
720 28 : break;
721 : case XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_STYLENAME:
722 20 : sFontStyleName = rValue;
723 20 : break;
724 : case XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_PITCH:
725 6 : sFontPitch = rValue;
726 6 : break;
727 : case XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_CHARSET:
728 110 : sFontCharset = rValue;
729 110 : 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 3230 : sal_Int32 nColor(0);
747 3230 : if (::sax::Converter::convertColor( nColor, rValue ))
748 : {
749 3230 : rListLevel.SetColor( nColor );
750 : }
751 : }
752 3230 : break;
753 : case XML_TOK_STYLE_ATTRIBUTES_ATTR_WINDOW_FONT_COLOR:
754 : {
755 1934 : if( IsXMLToken( rValue, XML_TRUE ) )
756 1934 : rListLevel.SetColor( (sal_Int32)0xffffffff );
757 : }
758 1934 : break;
759 : case XML_TOK_STYLE_ATTRIBUTES_ATTR_FONT_SIZE:
760 5164 : if (::sax::Converter::convertPercent( nVal, rValue ))
761 5164 : rListLevel.SetRelSize( (sal_Int16)nVal );
762 5164 : break;
763 : case XML_TOK_STYLE_ATTRIBUTES_ATTR_POSITION_AND_SPACE_MODE:
764 : {
765 3980 : sal_Int16 ePosAndSpaceMode = PositionAndSpaceMode::LABEL_WIDTH_AND_POSITION;
766 3980 : if( IsXMLToken( rValue, XML_LABEL_ALIGNMENT ) )
767 3980 : ePosAndSpaceMode = PositionAndSpaceMode::LABEL_ALIGNMENT;
768 3980 : rListLevel.SetPosAndSpaceMode( ePosAndSpaceMode );
769 : }
770 3980 : break;
771 : }
772 24998 : }
773 :
774 15286 : if( !sFontName.isEmpty() )
775 : {
776 : const XMLFontStylesContext *pFontDecls =
777 482 : GetImport().GetFontDecls();
778 482 : if( pFontDecls )
779 : {
780 482 : ::std::vector < XMLPropertyState > aProps;
781 482 : if( pFontDecls->FillProperties( sFontName, aProps, 0, 1, 2, 3, 4 ) )
782 : {
783 448 : OUString sTmp;
784 448 : sal_Int16 nTmp = 0;
785 448 : ::std::vector< XMLPropertyState >::iterator i;
786 2688 : for( i = aProps.begin(); i != aProps.end(); ++i )
787 : {
788 2240 : switch( i->mnIndex )
789 : {
790 : case 0:
791 448 : i->maValue >>= sTmp;
792 448 : rListLevel.SetBulletFontName( sTmp);
793 448 : break;
794 : case 1:
795 448 : i->maValue >>= sTmp;
796 448 : rListLevel.SetBulletFontStyleName( sTmp );
797 448 : break;
798 : case 2:
799 448 : i->maValue >>= nTmp;
800 448 : rListLevel.SetBulletFontFamily( nTmp );
801 448 : break;
802 : case 3:
803 448 : i->maValue >>= nTmp;
804 448 : rListLevel.SetBulletFontPitch( nTmp );
805 448 : break;
806 : case 4:
807 448 : i->maValue >>= nTmp;
808 448 : rListLevel.SetBulletFontEncoding( nTmp );
809 448 : break;
810 : }
811 448 : }
812 482 : }
813 : }
814 : }
815 15286 : if( !sFontFamily.isEmpty() )
816 : {
817 2114 : Any aAny;
818 :
819 4228 : XMLFontFamilyNamePropHdl aFamilyNameHdl;
820 2114 : if( aFamilyNameHdl.importXML( sFontFamily, aAny, rUnitConv ) )
821 : {
822 2114 : OUString sTmp;
823 2114 : aAny >>= sTmp;
824 2114 : rListLevel.SetBulletFontName( sTmp);
825 : }
826 :
827 4228 : XMLFontFamilyPropHdl aFamilyHdl;
828 2142 : if( !sFontFamilyGeneric.isEmpty() &&
829 28 : aFamilyHdl.importXML( sFontFamilyGeneric, aAny, rUnitConv ) )
830 : {
831 28 : sal_Int16 nTmp = 0;
832 28 : aAny >>= nTmp;
833 28 : rListLevel.SetBulletFontFamily( nTmp );
834 : }
835 :
836 2114 : if( !sFontStyleName.isEmpty() )
837 20 : rListLevel.SetBulletFontStyleName( sFontStyleName );
838 :
839 4228 : XMLFontPitchPropHdl aPitchHdl;
840 2120 : if( !sFontPitch.isEmpty() &&
841 6 : aPitchHdl.importXML( sFontPitch, aAny, rUnitConv ) )
842 : {
843 6 : sal_Int16 nTmp = 0;
844 6 : aAny >>= nTmp;
845 6 : rListLevel.SetBulletFontPitch( nTmp );
846 : }
847 :
848 4228 : XMLFontEncodingPropHdl aEncHdl;
849 2224 : if( !sFontCharset.isEmpty() &&
850 110 : aEncHdl.importXML( sFontCharset, aAny, rUnitConv ) )
851 : {
852 110 : sal_Int16 nTmp = 0;
853 110 : aAny >>= nTmp;
854 110 : rListLevel.SetBulletFontEncoding( nTmp );
855 2114 : }
856 : }
857 :
858 15286 : sal_Int16 eVertOrient = VertOrientation::LINE_CENTER;
859 15286 : 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 15286 : 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 30572 : rListLevel.SetImageVertOrient( eVertOrient );
901 15286 : }
902 :
903 30572 : SvxXMLListLevelStyleAttrContext_Impl::~SvxXMLListLevelStyleAttrContext_Impl()
904 : {
905 30572 : }
906 :
907 3980 : SvXMLImportContext* SvxXMLListLevelStyleAttrContext_Impl::CreateChildContext(
908 : sal_uInt16 nPrefix, const OUString& rLocalName,
909 : const Reference< xml::sax::XAttributeList > & xAttrList )
910 : {
911 3980 : SvXMLImportContext *pContext = 0;
912 7960 : if ( XML_NAMESPACE_STYLE == nPrefix &&
913 3980 : IsXMLToken( rLocalName, XML_LIST_LEVEL_LABEL_ALIGNMENT ) )
914 : {
915 3980 : pContext = new SvxXMLListLevelStyleLabelAlignmentAttrContext_Impl( GetImport(),
916 : nPrefix,
917 : rLocalName,
918 : xAttrList,
919 3980 : rListLevel );
920 : }
921 3980 : if( !pContext )
922 : {
923 0 : pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
924 : }
925 :
926 3980 : 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 48 : 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 48 : return aStyleAlignmentAttributesAttrTokenMap;
954 : }
955 3980 : 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 3980 : rListLevel( rLLevel )
962 : {
963 3980 : static const SvXMLTokenMap aTokenMap( lcl_getStyleAlignmentAttributesAttrTokenMap() );
964 3980 : SvXMLUnitConverter& rUnitConv = GetImport().GetMM100UnitConverter();
965 :
966 3980 : sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
967 19392 : for( sal_Int16 i=0; i < nAttrCount; i++ )
968 : {
969 15412 : const OUString& rAttrName = xAttrList->getNameByIndex( i );
970 30824 : OUString aLocalName;
971 : sal_uInt16 nPrefix =
972 15412 : GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
973 15412 : &aLocalName );
974 30824 : const OUString& rValue = xAttrList->getValueByIndex( i );
975 :
976 : sal_Int32 nVal;
977 15412 : switch( aTokenMap.Get( nPrefix, aLocalName ) )
978 : {
979 : case XML_TOK_STYLE_ATTRIBUTES_ATTR_LABEL_FOLLOWED_BY:
980 : {
981 3980 : sal_Int16 eLabelFollowedBy = LabelFollow::LISTTAB;
982 3980 : if( IsXMLToken( rValue, XML_SPACE ) )
983 0 : eLabelFollowedBy = LabelFollow::SPACE;
984 3980 : else if( IsXMLToken( rValue, XML_NOTHING ) )
985 120 : eLabelFollowedBy = LabelFollow::NOTHING;
986 3980 : rListLevel.SetLabelFollowedBy( eLabelFollowedBy );
987 : }
988 3980 : break;
989 : case XML_TOK_STYLE_ATTRIBUTES_ATTR_LISTTAB_STOP_POSITION:
990 3710 : if (rUnitConv.convertMeasureToCore(nVal, rValue, 0, SHRT_MAX))
991 3710 : rListLevel.SetListtabStopPosition( nVal );
992 3710 : break;
993 : case XML_TOK_STYLE_ATTRIBUTES_ATTR_FIRST_LINE_INDENT:
994 3854 : if (rUnitConv.convertMeasureToCore(nVal, rValue, SHRT_MIN, SHRT_MAX))
995 3854 : rListLevel.SetFirstLineIndent( nVal );
996 3854 : break;
997 : case XML_TOK_STYLE_ATTRIBUTES_ATTR_INDENT_AT:
998 3868 : if (rUnitConv.convertMeasureToCore(nVal, rValue, SHRT_MIN, SHRT_MAX))
999 3868 : rListLevel.SetIndentAt( nVal );
1000 3868 : break;
1001 : }
1002 15412 : }
1003 3980 : }
1004 :
1005 7960 : SvxXMLListLevelStyleLabelAlignmentAttrContext_Impl::~SvxXMLListLevelStyleLabelAlignmentAttrContext_Impl()
1006 : {
1007 7960 : }
1008 :
1009 1084 : void SvxXMLListStyleContext::SetAttribute( sal_uInt16 nPrefixKey,
1010 : const OUString& rLocalName,
1011 : const OUString& rValue )
1012 : {
1013 1090 : if( XML_NAMESPACE_TEXT == nPrefixKey &&
1014 6 : IsXMLToken( rLocalName, XML_CONSECUTIVE_NUMBERING ) )
1015 : {
1016 6 : bConsecutive = IsXMLToken( rValue, XML_TRUE );
1017 : }
1018 : else
1019 : {
1020 1078 : SvXMLStyleContext::SetAttribute( nPrefixKey, rLocalName, rValue );
1021 : }
1022 1084 : }
1023 :
1024 1014 : SvxXMLListStyleContext::SvxXMLListStyleContext( SvXMLImport& rImport,
1025 : sal_uInt16 nPrfx,
1026 : const OUString& rLName,
1027 : const Reference< xml::sax::XAttributeList > & xAttrList,
1028 : bool bOutl )
1029 : : SvXMLStyleContext( rImport, nPrfx, rLName, xAttrList, bOutl ? XML_STYLE_FAMILY_TEXT_OUTLINE : XML_STYLE_FAMILY_TEXT_LIST )
1030 : , sIsPhysical( "IsPhysical" )
1031 : , sNumberingRules( "NumberingRules" )
1032 : , sIsContinuousNumbering( "IsContinuousNumbering" )
1033 : , pLevelStyles( 0 )
1034 : , nLevels( 0 )
1035 : , bConsecutive( false )
1036 1014 : , bOutline( bOutl )
1037 : {
1038 1014 : }
1039 :
1040 3042 : SvxXMLListStyleContext::~SvxXMLListStyleContext()
1041 : {
1042 1014 : if( pLevelStyles )
1043 : {
1044 11974 : while( !pLevelStyles->empty() )
1045 : {
1046 9946 : SvxXMLListLevelStyleContext_Impl *pStyle = pLevelStyles->back();
1047 9946 : pLevelStyles->pop_back();
1048 9946 : pStyle->ReleaseRef();
1049 : }
1050 : }
1051 :
1052 1014 : delete pLevelStyles;
1053 2028 : }
1054 :
1055 634 : TYPEINIT1( SvxXMLListStyleContext, SvXMLStyleContext );
1056 :
1057 9946 : SvXMLImportContext *SvxXMLListStyleContext::CreateChildContext(
1058 : sal_uInt16 nPrefix,
1059 : const OUString& rLocalName,
1060 : const Reference< xml::sax::XAttributeList > & xAttrList )
1061 : {
1062 9946 : SvXMLImportContext *pContext = 0;
1063 :
1064 29838 : if( XML_NAMESPACE_TEXT == nPrefix &&
1065 : ( bOutline
1066 3120 : ? IsXMLToken( rLocalName, XML_OUTLINE_LEVEL_STYLE )
1067 9442 : : ( IsXMLToken( rLocalName, XML_LIST_LEVEL_STYLE_NUMBER ) ||
1068 2616 : IsXMLToken( rLocalName, XML_LIST_LEVEL_STYLE_BULLET ) ||
1069 0 : IsXMLToken( rLocalName, XML_LIST_LEVEL_STYLE_IMAGE ) ) ) )
1070 : {
1071 : SvxXMLListLevelStyleContext_Impl *pLevelStyle =
1072 9946 : new SvxXMLListLevelStyleContext_Impl( GetImport(), nPrefix,
1073 9946 : rLocalName, xAttrList );
1074 9946 : if( !pLevelStyles )
1075 1014 : pLevelStyles = new SvxXMLListStyle_Impl;
1076 9946 : pLevelStyles->push_back( pLevelStyle );
1077 9946 : pLevelStyle->AddFirstRef();
1078 :
1079 9946 : pContext = pLevelStyle;
1080 : }
1081 : else
1082 : {
1083 0 : pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
1084 : }
1085 :
1086 9946 : return pContext;
1087 : }
1088 :
1089 672 : void SvxXMLListStyleContext::FillUnoNumRule(
1090 : const Reference< container::XIndexReplace > & rNumRule,
1091 : const SvI18NMap *pI18NMap ) const
1092 : {
1093 : try
1094 : {
1095 672 : if( pLevelStyles && rNumRule.is() )
1096 : {
1097 672 : sal_uInt16 nCount = pLevelStyles->size();
1098 672 : sal_Int32 l_nLevels = rNumRule->getCount();
1099 7198 : for( sal_uInt16 i=0; i < nCount; i++ )
1100 : {
1101 : SvxXMLListLevelStyleContext_Impl *pLevelStyle =
1102 6526 : (*pLevelStyles)[i];
1103 6526 : sal_Int32 nLevel = pLevelStyle->GetLevel();
1104 6526 : if( nLevel >= 0 && nLevel < l_nLevels )
1105 : {
1106 : Sequence<beans::PropertyValue> aProps =
1107 6526 : pLevelStyle->GetProperties( pI18NMap );
1108 13052 : Any aAny;
1109 6526 : aAny <<= aProps;
1110 13052 : rNumRule->replaceByIndex( nLevel, aAny );
1111 : }
1112 : }
1113 : }
1114 :
1115 672 : Reference < XPropertySet > xPropSet( rNumRule, UNO_QUERY );
1116 1344 : Reference< XPropertySetInfo > xPropSetInfo;
1117 672 : if (xPropSet.is())
1118 488 : xPropSetInfo = xPropSet->getPropertySetInfo();
1119 1160 : if( xPropSetInfo.is() &&
1120 488 : xPropSetInfo->hasPropertyByName( sIsContinuousNumbering ) )
1121 : {
1122 488 : Any aAny;
1123 488 : sal_Bool bTmp = bConsecutive;
1124 488 : aAny.setValue( &bTmp, ::getBooleanCppuType() );
1125 488 : xPropSet->setPropertyValue( sIsContinuousNumbering, aAny );
1126 672 : }
1127 : }
1128 0 : catch (const Exception&)
1129 : {
1130 : OSL_FAIL( "SvxXMLListStyleContext::FillUnoNumRule - Exception caught" );
1131 : }
1132 672 : }
1133 :
1134 454 : void SvxXMLListStyleContext::CreateAndInsertLate( bool bOverwrite )
1135 : {
1136 454 : if( bOutline )
1137 : {
1138 312 : if( bOverwrite )
1139 : {
1140 : const Reference< XIndexReplace >& rNumRule =
1141 312 : GetImport().GetTextImport()->GetChapterNumbering();
1142 : // We don't set xNumberingRules here, to avoid using them
1143 : // as numbering rules.
1144 312 : if( rNumRule.is() )
1145 312 : FillUnoNumRule( rNumRule, 0 );
1146 : }
1147 : }
1148 : else
1149 : {
1150 142 : Reference < XStyle > xStyle;
1151 142 : const OUString& rName = GetDisplayName();
1152 142 : if( rName.isEmpty() )
1153 : {
1154 0 : SetValid( false );
1155 0 : return;
1156 : }
1157 :
1158 : const Reference < XNameContainer >& rNumStyles =
1159 142 : GetImport().GetTextImport()->GetNumberingStyles();
1160 142 : if( !rNumStyles.is() )
1161 : {
1162 0 : SetValid( false );
1163 0 : return;
1164 : }
1165 :
1166 142 : bool bNew = false;
1167 142 : if( rNumStyles->hasByName( rName ) )
1168 : {
1169 18 : Any aAny = rNumStyles->getByName( rName );
1170 18 : aAny >>= xStyle;
1171 : }
1172 : else
1173 : {
1174 124 : Reference< XMultiServiceFactory > xFactory( GetImport().GetModel(),
1175 124 : UNO_QUERY );
1176 : DBG_ASSERT( xFactory.is(), "no factory" );
1177 124 : if( !xFactory.is() )
1178 0 : return;
1179 :
1180 248 : Reference < XInterface > xIfc = xFactory->createInstance("com.sun.star.style.NumberingStyle");
1181 124 : if( !xIfc.is() )
1182 0 : return;
1183 248 : Reference < XStyle > xTmp( xIfc, UNO_QUERY );
1184 124 : xStyle = xTmp;
1185 124 : if( !xStyle.is() )
1186 0 : return;
1187 :
1188 248 : Any aAny;
1189 124 : aAny <<= xStyle;
1190 124 : rNumStyles->insertByName( rName, aAny );
1191 248 : bNew = true;
1192 : }
1193 :
1194 284 : Reference < XPropertySet > xPropSet( xStyle, UNO_QUERY );
1195 : Reference< XPropertySetInfo > xPropSetInfo =
1196 284 : xPropSet->getPropertySetInfo();
1197 142 : if( !bNew && xPropSetInfo->hasPropertyByName( sIsPhysical ) )
1198 : {
1199 18 : Any aAny = xPropSet->getPropertyValue( sIsPhysical );
1200 18 : bNew = !*(sal_Bool *)aAny.getValue();
1201 : }
1202 :
1203 142 : if ( xPropSetInfo->hasPropertyByName( "Hidden" ) )
1204 142 : xPropSet->setPropertyValue( "Hidden", uno::makeAny( IsHidden( ) ) );
1205 :
1206 142 : if( rName != GetName() )
1207 58 : GetImport().AddStyleDisplayName( XML_STYLE_FAMILY_TEXT_LIST,
1208 116 : GetName(), rName );
1209 :
1210 284 : Any aAny = xPropSet->getPropertyValue( sNumberingRules );
1211 142 : aAny >>= xNumRules;
1212 142 : nLevels = xNumRules->getCount();
1213 142 : if( bOverwrite || bNew )
1214 : {
1215 142 : FillUnoNumRule( xNumRules, 0 );
1216 142 : aAny <<= xNumRules;
1217 142 : xPropSet->setPropertyValue( sNumberingRules, aAny );
1218 : }
1219 : else
1220 : {
1221 0 : SetValid( false );
1222 : }
1223 :
1224 284 : SetNew( bNew );
1225 : }
1226 : }
1227 :
1228 48 : void SvxXMLListStyleContext::CreateAndInsertAuto() const
1229 : {
1230 : DBG_ASSERT( !bOutline, "Outlines cannot be inserted here" );
1231 : DBG_ASSERT( !xNumRules.is(), "Numbering Rule is existing already" );
1232 :
1233 48 : const OUString& rName = GetName();
1234 48 : if( bOutline || xNumRules.is() || rName.isEmpty() )
1235 : {
1236 0 : ((SvxXMLListStyleContext *)this)->SetValid( false );
1237 48 : return;
1238 : }
1239 :
1240 96 : ((SvxXMLListStyleContext *)this)->xNumRules = CreateNumRule(
1241 96 : GetImport().GetModel() );
1242 48 : ((SvxXMLListStyleContext *)this)->nLevels = xNumRules->getCount();
1243 :
1244 48 : FillUnoNumRule( xNumRules, 0 );
1245 : }
1246 :
1247 228 : Reference < XIndexReplace > SvxXMLListStyleContext::CreateNumRule(
1248 : const Reference < XModel > & rModel )
1249 : {
1250 228 : Reference<XIndexReplace> xNumRule;
1251 :
1252 456 : Reference< XMultiServiceFactory > xFactory( rModel, UNO_QUERY );
1253 : DBG_ASSERT( xFactory.is(), "no factory" );
1254 228 : if( !xFactory.is() )
1255 0 : return xNumRule;
1256 :
1257 456 : Reference < XInterface > xIfc = xFactory->createInstance("com.sun.star.text.NumberingRules");
1258 228 : if( !xIfc.is() )
1259 0 : return xNumRule;
1260 :
1261 228 : xNumRule = Reference<XIndexReplace>( xIfc, UNO_QUERY );
1262 : DBG_ASSERT( xNumRule.is(), "go no numbering rule" );
1263 :
1264 228 : return xNumRule;
1265 : }
1266 :
1267 10 : void SvxXMLListStyleContext::SetDefaultStyle(
1268 : const Reference < XIndexReplace > & rNumRule,
1269 : sal_Int16 nLevel,
1270 : bool bOrdered )
1271 : {
1272 10 : Sequence<beans::PropertyValue> aPropSeq( bOrdered ? 1 : 4 );
1273 10 : beans::PropertyValue *pProps = aPropSeq.getArray();
1274 :
1275 10 : pProps->Name = "NumberingType";
1276 20 : (pProps++)->Value <<= (sal_Int16)(bOrdered ? NumberingType::ARABIC
1277 10 : : NumberingType::CHAR_SPECIAL );
1278 10 : if( !bOrdered )
1279 : {
1280 : // TODO: Bullet-Font
1281 10 : awt::FontDescriptor aFDesc;
1282 : aFDesc.Name =
1283 : #ifdef _WIN32
1284 : "StarBats"
1285 : #else
1286 : "starbats"
1287 : #endif
1288 10 : ;
1289 10 : aFDesc.Family = FAMILY_DONTKNOW ;
1290 10 : aFDesc.Pitch = PITCH_DONTKNOW ;
1291 10 : aFDesc.CharSet = RTL_TEXTENCODING_SYMBOL ;
1292 10 : aFDesc.Weight = WEIGHT_DONTKNOW;
1293 10 : pProps->Name = "BulletFont";
1294 10 : (pProps++)->Value <<= aFDesc;
1295 :
1296 20 : OUStringBuffer sTmp(1);
1297 10 : sTmp.append( (sal_Unicode)(0xF000 + 149) );
1298 10 : pProps->Name = "BulletChar";
1299 10 : (pProps++)->Value <<= sTmp.makeStringAndClear();
1300 10 : pProps->Name = "CharStyleName";
1301 20 : (pProps++)->Value <<= OUString( "Numbering Symbols" );
1302 : }
1303 :
1304 20 : Any aAny;
1305 10 : aAny <<= aPropSeq;
1306 20 : rNumRule->replaceByIndex( nLevel, aAny );
1307 10 : }
1308 :
1309 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|