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