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 :
21 : #include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
22 : #include <com/sun/star/style/NumberingType.hpp>
23 : #include <com/sun/star/style/XStyle.hpp>
24 : #include <com/sun/star/container/XNameContainer.hpp>
25 : #include <com/sun/star/container/XIndexReplace.hpp>
26 : #include <com/sun/star/awt/XBitmap.hpp>
27 : #include <com/sun/star/awt/FontDescriptor.hpp>
28 : #include <com/sun/star/text/HoriOrientation.hpp>
29 : #include <com/sun/star/text/VertOrientation.hpp>
30 : #include <com/sun/star/text/XChapterNumberingSupplier.hpp>
31 : #include <com/sun/star/text/PositionAndSpaceMode.hpp>
32 : #include <com/sun/star/text/LabelFollow.hpp>
33 : #include <com/sun/star/beans/PropertyValue.hpp>
34 : #include <com/sun/star/beans/XPropertySet.hpp>
35 :
36 : #include <rtl/ustrbuf.hxx>
37 :
38 : #include <tools/debug.hxx>
39 :
40 : #include <sax/tools/converter.hxx>
41 :
42 : #include <xmloff/nmspmap.hxx>
43 : #include <xmloff/xmlnmspe.hxx>
44 : #include <xmloff/xmltoken.hxx>
45 : #include <xmloff/xmluconv.hxx>
46 : #include "fonthdl.hxx"
47 : #include <xmloff/XMLTextListAutoStylePool.hxx>
48 : #include <xmloff/xmlnume.hxx>
49 : #include <xmloff/xmlexp.hxx>
50 : #include <tools/fontenum.hxx>
51 :
52 :
53 :
54 : using namespace ::com::sun::star;
55 : using namespace ::com::sun::star::uno;
56 : using namespace ::com::sun::star::style;
57 : using namespace ::com::sun::star::text;
58 : using namespace ::com::sun::star::container;
59 : using namespace ::com::sun::star::beans;
60 : using namespace ::xmloff::token;
61 :
62 346 : void SvxXMLNumRuleExport::exportLevelStyles( const uno::Reference< ::com::sun::star::container::XIndexReplace > & xNumRule,
63 : bool bOutline )
64 : {
65 346 : sal_Int32 nCount = xNumRule ->getCount();
66 3806 : for( sal_Int32 i=0; i<nCount; i++ )
67 : {
68 3460 : uno::Any aEntry( xNumRule->getByIndex( i ) );
69 6920 : uno::Sequence<beans::PropertyValue> aSeq;
70 3460 : if( aEntry >>= aSeq )
71 : {
72 3460 : exportLevelStyle( i, aSeq, bOutline );
73 : }
74 3460 : }
75 346 : }
76 :
77 3460 : void SvxXMLNumRuleExport::exportLevelStyle( sal_Int32 nLevel,
78 : const uno::Sequence<beans::PropertyValue>& rProps,
79 : bool bOutline )
80 : {
81 3460 : sal_Int16 eType = NumberingType::CHAR_SPECIAL;
82 :
83 3460 : sal_Int16 eAdjust = HoriOrientation::LEFT;
84 6920 : OUString sPrefix, sSuffix;
85 6920 : OUString sTextStyleName;
86 3460 : bool bHasColor = false;
87 3460 : sal_Int32 nColor = 0;
88 3460 : sal_Int32 nSpaceBefore = 0, nMinLabelWidth = 0, nMinLabelDist = 0;
89 :
90 3460 : sal_Int16 nStartValue = 1, nDisplayLevels = 1, nBullRelSize = 0;
91 :
92 3460 : sal_Unicode cBullet = 0xf095;
93 6920 : OUString sBulletFontName, sBulletFontStyleName ;
94 3460 : FontFamily eBulletFontFamily = FAMILY_DONTKNOW;
95 3460 : FontPitch eBulletFontPitch = PITCH_DONTKNOW;
96 3460 : rtl_TextEncoding eBulletFontEncoding = RTL_TEXTENCODING_DONTKNOW;
97 :
98 6920 : OUString sImageURL;
99 6920 : uno::Reference< ::com::sun::star::awt::XBitmap > xBitmap;
100 3460 : sal_Int32 nImageWidth = 0, nImageHeight = 0;
101 3460 : sal_Int16 eImageVertOrient = VertOrientation::LINE_CENTER;
102 :
103 3460 : sal_Int16 ePosAndSpaceMode = PositionAndSpaceMode::LABEL_WIDTH_AND_POSITION;
104 3460 : sal_Int16 eLabelFollowedBy = LabelFollow::LISTTAB;
105 3460 : sal_Int32 nListtabStopPosition( 0 );
106 3460 : sal_Int32 nFirstLineIndent( 0 );
107 3460 : sal_Int32 nIndentAt( 0 );
108 :
109 3460 : const sal_Int32 nCount = rProps.getLength();
110 3460 : const beans::PropertyValue* pPropArray = rProps.getConstArray();
111 45422 : for( sal_Int32 i=0; i<nCount; i++ )
112 : {
113 41962 : const beans::PropertyValue& rProp = pPropArray[i];
114 :
115 41962 : if( rProp.Name == "NumberingType" )
116 : {
117 3460 : rProp.Value >>= eType;
118 : }
119 38502 : else if( rProp.Name == "Prefix" )
120 : {
121 3460 : rProp.Value >>= sPrefix;
122 : }
123 35042 : else if( rProp.Name == "Suffix" )
124 : {
125 3460 : rProp.Value >>= sSuffix;
126 : }
127 31582 : else if( rProp.Name == "BulletChar" )
128 : {
129 704 : OUString sValue;
130 704 : rProp.Value >>= sValue;
131 704 : if( !sValue.isEmpty() )
132 : {
133 704 : cBullet = (sal_Unicode)sValue[0];
134 704 : }
135 : }
136 30878 : else if( rProp.Name == "BulletRelSize" )
137 : {
138 1980 : rProp.Value >>= nBullRelSize;
139 : }
140 28898 : else if( rProp.Name == "Adjust" )
141 : {
142 3460 : sal_Int16 nValue = 0;
143 3460 : rProp.Value >>= nValue;
144 3460 : eAdjust = nValue;
145 : }
146 25438 : else if( rProp.Name == "BulletFont" )
147 : {
148 696 : awt::FontDescriptor rFDesc;
149 696 : if( rProp.Value >>= rFDesc )
150 : {
151 696 : sBulletFontName = rFDesc.Name;
152 696 : sBulletFontStyleName = rFDesc.StyleName;
153 696 : eBulletFontFamily = static_cast< FontFamily >( rFDesc.Family );
154 696 : eBulletFontPitch = static_cast< FontPitch >( rFDesc.Pitch );
155 696 : eBulletFontEncoding = (rtl_TextEncoding)rFDesc.CharSet;
156 696 : }
157 : }
158 24742 : else if( rProp.Name == "GraphicURL" )
159 : {
160 0 : rProp.Value >>= sImageURL;
161 : }
162 24742 : else if( rProp.Name == "GraphicBitmap" )
163 : {
164 0 : rProp.Value >>= xBitmap;
165 : }
166 24742 : else if( rProp.Name == "BulletColor" )
167 : {
168 1980 : rProp.Value >>= nColor;
169 1980 : bHasColor = true;
170 : }
171 22762 : else if( rProp.Name == "StartWith" )
172 : {
173 3460 : rProp.Value >>= nStartValue;
174 : }
175 19302 : else if( rProp.Name == "LeftMargin" )
176 : {
177 2030 : rProp.Value >>= nSpaceBefore;
178 : }
179 17272 : else if( rProp.Name == "FirstLineOffset" )
180 : {
181 2030 : rProp.Value >>= nMinLabelWidth;
182 : }
183 15242 : else if( rProp.Name == "SymbolTextDistance" )
184 : {
185 2030 : rProp.Value >>= nMinLabelDist;
186 : }
187 13212 : else if( rProp.Name == "ParentNumbering" )
188 : {
189 1480 : rProp.Value >>= nDisplayLevels;
190 1480 : if( nDisplayLevels > nLevel+1 )
191 126 : nDisplayLevels = static_cast<sal_Int16>( nLevel )+1;
192 : }
193 11732 : else if( rProp.Name == "CharStyleName" )
194 : {
195 1480 : rProp.Value >>= sTextStyleName;
196 : }
197 10252 : else if( rProp.Name == "GraphicSize" )
198 : {
199 1980 : awt::Size aSize;
200 1980 : if( rProp.Value >>= aSize )
201 : {
202 1980 : nImageWidth = aSize.Width;
203 1980 : nImageHeight = aSize.Height;
204 : }
205 : }
206 8272 : else if( rProp.Name == "VertOrient" )
207 : {
208 0 : sal_Int16 nValue = 0;
209 0 : rProp.Value >>= nValue;
210 0 : eImageVertOrient = nValue;
211 : }
212 8272 : else if( rProp.Name == "PositionAndSpaceMode" )
213 : {
214 1480 : sal_Int16 nValue = 0;
215 1480 : rProp.Value >>= nValue;
216 1480 : ePosAndSpaceMode = nValue;
217 : }
218 6792 : else if( rProp.Name == "LabelFollowedBy" )
219 : {
220 1430 : sal_Int16 nValue = 0;
221 1430 : rProp.Value >>= nValue;
222 1430 : eLabelFollowedBy = nValue;
223 : }
224 5362 : else if( rProp.Name == "ListtabStopPosition" )
225 : {
226 1430 : rProp.Value >>= nListtabStopPosition;
227 : }
228 3932 : else if( rProp.Name == "FirstLineIndent" )
229 : {
230 1430 : rProp.Value >>= nFirstLineIndent;
231 : }
232 2502 : else if( rProp.Name == "IndentAt" )
233 : {
234 1430 : rProp.Value >>= nIndentAt;
235 : }
236 : }
237 :
238 4180 : if( bOutline && (NumberingType::CHAR_SPECIAL == eType ||
239 720 : NumberingType::BITMAP == eType) )
240 : {
241 : DBG_ASSERT( !bOutline,
242 : "SvxXMLNumRuleExport::exportLevelStyle: invalid style for outline" );
243 3460 : return;
244 : }
245 :
246 3460 : GetExport().CheckAttrList();
247 :
248 : // text:level
249 6920 : OUStringBuffer sTmp;
250 3460 : sTmp.append( nLevel + 1 );
251 3460 : GetExport().AddAttribute( XML_NAMESPACE_TEXT, XML_LEVEL, sTmp.makeStringAndClear() );
252 : // #i110694#: no style-name on list-level-style-image
253 : // #i116149#: neither prefix/suffix
254 3460 : if (NumberingType::BITMAP != eType)
255 : {
256 3460 : if (!sTextStyleName.isEmpty())
257 : {
258 287 : GetExport().AddAttribute( XML_NAMESPACE_TEXT, XML_STYLE_NAME,
259 574 : GetExport().EncodeStyleName( sTextStyleName ) );
260 : }
261 3460 : if (!sPrefix.isEmpty())
262 : {
263 0 : GetExport().AddAttribute( XML_NAMESPACE_STYLE, XML_NUM_PREFIX,
264 0 : sPrefix );
265 : }
266 3460 : if (!sSuffix.isEmpty())
267 : {
268 629 : GetExport().AddAttribute( XML_NAMESPACE_STYLE, XML_NUM_SUFFIX,
269 629 : sSuffix );
270 : }
271 : }
272 :
273 3460 : enum XMLTokenEnum eElem = XML_LIST_LEVEL_STYLE_NUMBER;
274 3460 : if( NumberingType::CHAR_SPECIAL == eType )
275 : {
276 : // <text:list-level-style-bullet>
277 704 : eElem = XML_LIST_LEVEL_STYLE_BULLET;
278 :
279 704 : if( cBullet )
280 : {
281 704 : if( cBullet < ' ' )
282 : {
283 0 : cBullet = 0xF000 + 149;
284 : }
285 : // text:bullet-char="..."
286 704 : sTmp.append( cBullet );
287 704 : GetExport().AddAttribute( XML_NAMESPACE_TEXT, XML_BULLET_CHAR,
288 1408 : sTmp.makeStringAndClear() );
289 : }
290 : else
291 : {
292 : // If 'cBullet' is zero, XML_BULLET_CHAR must exist with blank.
293 0 : GetExport().AddAttribute( XML_NAMESPACE_TEXT, XML_BULLET_CHAR, "");
294 : }
295 : }
296 2756 : else if( NumberingType::BITMAP == eType )
297 : {
298 : // <text:list-level-style-image>
299 :
300 0 : eElem = XML_LIST_LEVEL_STYLE_IMAGE;
301 :
302 :
303 0 : if( !sImageURL.isEmpty() )
304 : {
305 0 : OUString sURL( GetExport().AddEmbeddedGraphicObject( sImageURL ) );
306 0 : if( !sURL.isEmpty() )
307 : {
308 0 : GetExport().AddAttribute( XML_NAMESPACE_XLINK, XML_HREF, sURL );
309 :
310 0 : GetExport().AddAttribute( XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE );
311 0 : GetExport().AddAttribute( XML_NAMESPACE_XLINK, XML_SHOW, XML_EMBED );
312 0 : GetExport().AddAttribute( XML_NAMESPACE_XLINK, XML_ACTUATE, XML_ONLOAD );
313 0 : }
314 : }
315 : else
316 : {
317 : DBG_ASSERT( !xBitmap.is(),
318 : "embedded images are not supported by now" );
319 : }
320 : }
321 : else
322 : {
323 : // <text:list-level-style-number> or <text:outline-level-style>
324 2756 : if( bOutline )
325 720 : eElem = XML_OUTLINE_LEVEL_STYLE;
326 : else
327 2036 : eElem = XML_LIST_LEVEL_STYLE_NUMBER;
328 :
329 2756 : GetExport().GetMM100UnitConverter().convertNumFormat( sTmp, eType );
330 2756 : GetExport().AddAttribute( XML_NAMESPACE_STYLE, XML_NUM_FORMAT,
331 5512 : sTmp.makeStringAndClear() );
332 2756 : SvXMLUnitConverter::convertNumLetterSync( sTmp, eType );
333 2756 : if( !sTmp.isEmpty() )
334 96 : GetExport().AddAttribute( XML_NAMESPACE_STYLE,
335 : XML_NUM_LETTER_SYNC,
336 192 : sTmp.makeStringAndClear() );
337 :
338 2756 : if( nStartValue != 1 )
339 : {
340 51 : sTmp.append( (sal_Int32)nStartValue );
341 51 : GetExport().AddAttribute( XML_NAMESPACE_TEXT, XML_START_VALUE,
342 102 : sTmp.makeStringAndClear() );
343 : }
344 2756 : if( nDisplayLevels > 1 && NumberingType::NUMBER_NONE != eType )
345 : {
346 17 : sTmp.append( (sal_Int32)nDisplayLevels );
347 17 : GetExport().AddAttribute( XML_NAMESPACE_TEXT, XML_DISPLAY_LEVELS,
348 34 : sTmp.makeStringAndClear() );
349 : }
350 : }
351 :
352 : {
353 3460 : SvXMLElementExport aElem( GetExport(), XML_NAMESPACE_TEXT, eElem,
354 3460 : true, true );
355 :
356 6920 : OUStringBuffer sBuffer;
357 3460 : if ( ePosAndSpaceMode == PositionAndSpaceMode::LABEL_WIDTH_AND_POSITION )
358 : {
359 2030 : nSpaceBefore += nMinLabelWidth;
360 2030 : nMinLabelWidth = -nMinLabelWidth;
361 2030 : if( nSpaceBefore != 0 )
362 : {
363 1798 : GetExport().GetMM100UnitConverter().convertMeasureToXML(
364 3596 : sBuffer, nSpaceBefore );
365 1798 : GetExport().AddAttribute( XML_NAMESPACE_TEXT, XML_SPACE_BEFORE,
366 3596 : sBuffer.makeStringAndClear() );
367 : }
368 2030 : if( nMinLabelWidth != 0 )
369 : {
370 540 : GetExport().GetMM100UnitConverter().convertMeasureToXML(
371 1080 : sBuffer, nMinLabelWidth );
372 540 : GetExport().AddAttribute( XML_NAMESPACE_TEXT, XML_MIN_LABEL_WIDTH,
373 1080 : sBuffer.makeStringAndClear() );
374 : }
375 2030 : if( nMinLabelDist > 0 )
376 : {
377 40 : GetExport().GetMM100UnitConverter().convertMeasureToXML(
378 80 : sBuffer, nMinLabelDist );
379 40 : GetExport().AddAttribute( XML_NAMESPACE_TEXT, XML_MIN_LABEL_DISTANCE,
380 80 : sBuffer.makeStringAndClear() );
381 : }
382 : }
383 : /* Check, if properties for position-and-space-mode LABEL_ALIGNMENT
384 : are allowed to be exported. (#i89178#)
385 : */
386 1430 : else if ( ePosAndSpaceMode == PositionAndSpaceMode::LABEL_ALIGNMENT &&
387 : mbExportPositionAndSpaceModeLabelAlignment )
388 : {
389 1430 : GetExport().AddAttribute( XML_NAMESPACE_TEXT,
390 : XML_LIST_LEVEL_POSITION_AND_SPACE_MODE,
391 1430 : XML_LABEL_ALIGNMENT );
392 : }
393 3460 : if( HoriOrientation::LEFT != eAdjust )
394 : {
395 100 : enum XMLTokenEnum eValue = XML_TOKEN_INVALID;
396 100 : switch( eAdjust )
397 : {
398 100 : case HoriOrientation::RIGHT: eValue = XML_END; break;
399 0 : case HoriOrientation::CENTER: eValue = XML_CENTER; break;
400 : }
401 100 : if( eValue != XML_TOKEN_INVALID )
402 100 : GetExport().AddAttribute( XML_NAMESPACE_FO, XML_TEXT_ALIGN, eValue );
403 : }
404 :
405 3460 : if( NumberingType::BITMAP == eType )
406 : {
407 0 : enum XMLTokenEnum eValue = XML_TOKEN_INVALID;
408 0 : switch( eImageVertOrient )
409 : {
410 : case VertOrientation::BOTTOM: // yes, its OK: BOTTOM means that the baseline
411 : // hits the frame at its topmost position
412 : case VertOrientation::LINE_TOP:
413 : case VertOrientation::CHAR_TOP:
414 0 : eValue = XML_TOP;
415 0 : break;
416 : case VertOrientation::CENTER:
417 : case VertOrientation::LINE_CENTER:
418 : case VertOrientation::CHAR_CENTER:
419 0 : eValue = XML_MIDDLE;
420 0 : break;
421 : case VertOrientation::TOP: // yes, its OK: TOP means that the baseline
422 : // hits the frame at its bottommost position
423 : case VertOrientation::LINE_BOTTOM:
424 : case VertOrientation::CHAR_BOTTOM:
425 0 : eValue = XML_BOTTOM;
426 0 : break;
427 : }
428 0 : if( eValue != XML_TOKEN_INVALID )
429 0 : GetExport().AddAttribute( XML_NAMESPACE_STYLE, XML_VERTICAL_POS, eValue );
430 :
431 0 : eValue = XML_TOKEN_INVALID;
432 0 : switch( eImageVertOrient )
433 : {
434 : case VertOrientation::TOP:
435 : case VertOrientation::CENTER:
436 : case VertOrientation::BOTTOM:
437 0 : eValue = XML_BASELINE;
438 0 : break;
439 : case VertOrientation::LINE_TOP:
440 : case VertOrientation::LINE_CENTER:
441 : case VertOrientation::LINE_BOTTOM:
442 0 : eValue = XML_LINE;
443 0 : break;
444 : case VertOrientation::CHAR_TOP:
445 : case VertOrientation::CHAR_CENTER:
446 : case VertOrientation::CHAR_BOTTOM:
447 0 : eValue = XML_CHAR;
448 0 : break;
449 : }
450 0 : if( eValue != XML_TOKEN_INVALID )
451 0 : GetExport().AddAttribute( XML_NAMESPACE_STYLE, XML_VERTICAL_REL, eValue );
452 :
453 0 : if( nImageWidth > 0 )
454 : {
455 0 : GetExport().GetMM100UnitConverter().convertMeasureToXML(
456 0 : sBuffer, nImageWidth );
457 0 : GetExport().AddAttribute( XML_NAMESPACE_FO, XML_WIDTH,
458 0 : sBuffer.makeStringAndClear() );
459 : }
460 :
461 0 : if( nImageHeight > 0 )
462 : {
463 0 : GetExport().GetMM100UnitConverter().convertMeasureToXML(
464 0 : sBuffer, nImageHeight );
465 0 : GetExport().AddAttribute( XML_NAMESPACE_FO, XML_HEIGHT,
466 0 : sBuffer.makeStringAndClear() );
467 : }
468 : }
469 :
470 : {
471 3460 : SvXMLElementExport aElement( GetExport(), XML_NAMESPACE_STYLE,
472 3460 : XML_LIST_LEVEL_PROPERTIES, true, true );
473 :
474 : /* Check, if properties for position-and-space-mode LABEL_ALIGNMENT
475 : are allowed to be exported. (#i89178#)
476 : */
477 3460 : if ( ePosAndSpaceMode == PositionAndSpaceMode::LABEL_ALIGNMENT &&
478 : mbExportPositionAndSpaceModeLabelAlignment )
479 : {
480 1430 : enum XMLTokenEnum eValue = XML_LISTTAB;
481 1430 : if ( eLabelFollowedBy == LabelFollow::SPACE )
482 : {
483 20 : eValue = XML_SPACE;
484 : }
485 1410 : else if ( eLabelFollowedBy == LabelFollow::NOTHING )
486 : {
487 9 : eValue = XML_NOTHING;
488 : }
489 1430 : GetExport().AddAttribute( XML_NAMESPACE_TEXT,
490 1430 : XML_LABEL_FOLLOWED_BY, eValue );
491 :
492 2831 : if ( eLabelFollowedBy == LabelFollow::LISTTAB &&
493 1401 : nListtabStopPosition > 0 )
494 : {
495 1346 : GetExport().GetMM100UnitConverter().convertMeasureToXML(
496 2692 : sBuffer, nListtabStopPosition );
497 1346 : GetExport().AddAttribute( XML_NAMESPACE_TEXT,
498 : XML_LIST_TAB_STOP_POSITION,
499 2692 : sBuffer.makeStringAndClear() );
500 : }
501 :
502 1430 : if ( nFirstLineIndent != 0 )
503 : {
504 1383 : GetExport().GetMM100UnitConverter().convertMeasureToXML(
505 2766 : sBuffer, nFirstLineIndent );
506 1383 : GetExport().AddAttribute( XML_NAMESPACE_FO,
507 : XML_TEXT_INDENT,
508 2766 : sBuffer.makeStringAndClear() );
509 : }
510 :
511 1430 : if ( nIndentAt != 0 )
512 : {
513 1381 : GetExport().GetMM100UnitConverter().convertMeasureToXML(
514 2762 : sBuffer, nIndentAt );
515 1381 : GetExport().AddAttribute( XML_NAMESPACE_FO,
516 : XML_MARGIN_LEFT,
517 2762 : sBuffer.makeStringAndClear() );
518 : }
519 :
520 1430 : SvXMLElementExport aLabelAlignmentElement( GetExport(), XML_NAMESPACE_STYLE,
521 : XML_LIST_LEVEL_LABEL_ALIGNMENT,
522 1430 : true, true );
523 3460 : }
524 : }
525 :
526 3460 : if( NumberingType::CHAR_SPECIAL == eType )
527 : {
528 704 : if( !sBulletFontName.isEmpty() )
529 : {
530 : OUString sStyleName =
531 694 : GetExport().GetFontAutoStylePool()->Find(
532 : sBulletFontName, sBulletFontStyleName,
533 : eBulletFontFamily, eBulletFontPitch,
534 1388 : eBulletFontEncoding );
535 :
536 694 : if( !sStyleName.isEmpty() )
537 : {
538 44 : GetExport().AddAttribute( XML_NAMESPACE_STYLE,
539 : XML_FONT_NAME,
540 44 : sStyleName );
541 : }
542 : else
543 : {
544 650 : Any aAny;
545 1300 : OUString sTemp;
546 :
547 : const SvXMLUnitConverter& rUnitConv =
548 650 : GetExport().GetMM100UnitConverter();
549 1300 : XMLFontFamilyNamePropHdl aFamilyNameHdl;
550 650 : aAny <<= sBulletFontName;
551 650 : if( aFamilyNameHdl.exportXML( sTemp, aAny, rUnitConv ) )
552 650 : GetExport().AddAttribute( XML_NAMESPACE_FO,
553 650 : XML_FONT_FAMILY, sTemp );
554 :
555 650 : if( !sBulletFontStyleName.isEmpty() )
556 0 : GetExport().AddAttribute( XML_NAMESPACE_STYLE,
557 : XML_FONT_STYLE_NAME,
558 0 : sBulletFontStyleName );
559 :
560 1300 : XMLFontFamilyPropHdl aFamilyHdl;
561 650 : aAny <<= (sal_Int16)eBulletFontFamily;
562 650 : if( aFamilyHdl.exportXML( sTemp, aAny, rUnitConv ) )
563 26 : GetExport().AddAttribute( XML_NAMESPACE_STYLE,
564 : XML_FONT_FAMILY_GENERIC,
565 26 : sTemp );
566 :
567 1300 : XMLFontPitchPropHdl aPitchHdl;
568 650 : aAny <<= (sal_Int16)eBulletFontPitch;
569 650 : if( aPitchHdl.exportXML( sTemp, aAny, rUnitConv ) )
570 21 : GetExport().AddAttribute( XML_NAMESPACE_STYLE,
571 21 : XML_FONT_PITCH, sTemp );
572 :
573 1300 : XMLFontEncodingPropHdl aEncHdl;
574 650 : aAny <<= (sal_Int16)eBulletFontEncoding;
575 650 : if( aEncHdl.exportXML( sTemp, aAny, rUnitConv ) )
576 38 : GetExport().AddAttribute( XML_NAMESPACE_STYLE,
577 688 : XML_FONT_CHARSET, sTemp );
578 694 : }
579 : }
580 : }
581 3460 : if( NumberingType::BITMAP != eType )
582 : {
583 : // fo:color = "#..."
584 3460 : if( bHasColor )
585 : {
586 1980 : if (0xffffffff == static_cast<sal_uInt32>(nColor))
587 : {
588 527 : GetExport().AddAttribute( XML_NAMESPACE_STYLE, XML_USE_WINDOW_FONT_COLOR, XML_TRUE );
589 : }
590 : else
591 : {
592 1453 : ::sax::Converter::convertColor( sBuffer, nColor );
593 1453 : GetExport().AddAttribute( XML_NAMESPACE_FO, XML_COLOR,
594 2906 : sBuffer.makeStringAndClear() );
595 : }
596 : }
597 : // fo:height="...%"
598 3460 : if( nBullRelSize )
599 : {
600 1980 : ::sax::Converter::convertPercent( sTmp, nBullRelSize );
601 1980 : GetExport().AddAttribute( XML_NAMESPACE_FO, XML_FONT_SIZE,
602 3960 : sTmp.makeStringAndClear() );
603 : }
604 : }
605 3460 : if( GetExport().GetAttrList().getLength() > 0 )
606 : {
607 2146 : SvXMLElementExport aElement( GetExport(), XML_NAMESPACE_STYLE,
608 2146 : XML_TEXT_PROPERTIES, true, true );
609 : }
610 3460 : if( NumberingType::BITMAP == eType && !sImageURL.isEmpty() )
611 : {
612 : // optional office:binary-data
613 0 : GetExport().AddEmbeddedGraphicObjectAsBase64( sImageURL );
614 3460 : }
615 3460 : }
616 : }
617 :
618 :
619 274 : void SvxXMLNumRuleExport::AddListStyleAttributes()
620 : {
621 274 : }
622 :
623 :
624 2122 : SvxXMLNumRuleExport::SvxXMLNumRuleExport( SvXMLExport& rExp ) :
625 : rExport( rExp ),
626 : sNumberingRules( "NumberingRules" ),
627 : sIsPhysical( "IsPhysical" ),
628 : sIsContinuousNumbering( "IsContinuousNumbering" ),
629 : // Let list style creation depend on Load/Save option "ODF format version" (#i89178#)
630 2122 : mbExportPositionAndSpaceModeLabelAlignment( true )
631 : {
632 2122 : switch ( GetExport().getDefaultVersion() )
633 : {
634 : case SvtSaveOptions::ODFVER_010:
635 : case SvtSaveOptions::ODFVER_011:
636 : {
637 0 : mbExportPositionAndSpaceModeLabelAlignment = false;
638 : }
639 0 : break;
640 : default: // ODFVER_UNKNOWN or ODFVER_012
641 : {
642 2122 : mbExportPositionAndSpaceModeLabelAlignment = true;
643 : }
644 : }
645 2122 : }
646 :
647 2117 : SvxXMLNumRuleExport::~SvxXMLNumRuleExport()
648 : {
649 2117 : }
650 :
651 274 : void SvxXMLNumRuleExport::exportNumberingRule(
652 : const OUString& rName, bool bIsHidden,
653 : const Reference< XIndexReplace >& rNumRule )
654 : {
655 274 : Reference< XPropertySet > xPropSet( rNumRule, UNO_QUERY );
656 548 : Reference< XPropertySetInfo > xPropSetInfo;
657 274 : if( xPropSet.is() )
658 76 : xPropSetInfo = xPropSet->getPropertySetInfo();
659 :
660 274 : GetExport().CheckAttrList();
661 :
662 : // style:name="..."
663 274 : if( !rName.isEmpty() )
664 : {
665 274 : bool bEncoded = false;
666 274 : GetExport().AddAttribute( XML_NAMESPACE_STYLE, XML_NAME,
667 548 : GetExport().EncodeStyleName( rName, &bEncoded ) );
668 274 : if( bEncoded )
669 29 : GetExport().AddAttribute( XML_NAMESPACE_STYLE, XML_DISPLAY_NAME,
670 29 : rName);
671 : }
672 :
673 : // style:hidden="..."
674 274 : if ( bIsHidden && GetExport( ).getDefaultVersion( ) == SvtSaveOptions::ODFVER_LATEST )
675 0 : GetExport( ).AddAttribute( XML_NAMESPACE_STYLE, XML_HIDDEN, "true" );
676 :
677 : // text:consecutive-numbering="..."
678 274 : bool bContNumbering = false;
679 350 : if( xPropSetInfo.is() &&
680 76 : xPropSetInfo->hasPropertyByName( sIsContinuousNumbering ) )
681 : {
682 76 : Any aAny( xPropSet->getPropertyValue( sIsContinuousNumbering ) );
683 76 : bContNumbering = *static_cast<sal_Bool const *>(aAny.getValue());
684 : }
685 274 : if( bContNumbering )
686 0 : GetExport().AddAttribute( XML_NAMESPACE_TEXT,
687 0 : XML_CONSECUTIVE_NUMBERING, XML_TRUE );
688 :
689 : // other application specific attributes
690 274 : AddListStyleAttributes();
691 :
692 : {
693 274 : SvXMLElementExport aElem( GetExport(), XML_NAMESPACE_TEXT, XML_LIST_STYLE ,
694 274 : true, true );
695 274 : exportLevelStyles( rNumRule );
696 274 : }
697 274 : }
698 :
699 795 : bool SvxXMLNumRuleExport::exportStyle( const Reference< XStyle >& rStyle )
700 : {
701 795 : Reference< XPropertySet > xPropSet( rStyle, UNO_QUERY );
702 1590 : Reference< XPropertySetInfo > xPropSetInfo = xPropSet->getPropertySetInfo();
703 :
704 1590 : Any aAny;
705 :
706 : // Don't export styles that aren't existing really. This may be the
707 : // case for StarOffice Writer's pool styles.
708 795 : if( xPropSetInfo->hasPropertyByName( sIsPhysical ) )
709 : {
710 795 : aAny = xPropSet->getPropertyValue( sIsPhysical );
711 795 : if( !*static_cast<sal_Bool const *>(aAny.getValue()) )
712 720 : return false;
713 : }
714 :
715 75 : aAny = xPropSet->getPropertyValue( sNumberingRules );
716 150 : Reference<XIndexReplace> xNumRule;
717 75 : aAny >>= xNumRule;
718 :
719 150 : OUString sName = rStyle->getName();
720 :
721 75 : bool bHidden = false;
722 75 : if ( xPropSetInfo->hasPropertyByName( "Hidden" ) )
723 : {
724 75 : aAny = xPropSet->getPropertyValue( "Hidden" );
725 75 : aAny >>= bHidden;
726 : }
727 :
728 75 : exportNumberingRule( sName, bHidden, xNumRule );
729 :
730 870 : return true;
731 : }
732 :
733 72 : void SvxXMLNumRuleExport::exportOutline()
734 : {
735 72 : Reference< XChapterNumberingSupplier > xCNSupplier( GetExport().GetModel(),
736 72 : UNO_QUERY );
737 : DBG_ASSERT( xCNSupplier.is(), "no chapter numbering supplier" );
738 :
739 72 : if( xCNSupplier.is() )
740 : {
741 72 : Reference< XIndexReplace > xNumRule( xCNSupplier->getChapterNumberingRules() );
742 : DBG_ASSERT( xNumRule.is(), "no chapter numbering rules" );
743 :
744 72 : if( xNumRule.is() )
745 : {
746 : /* Outline style has property style:name since ODF 1.2
747 : Thus, export this property and adjust fix for issue #i69627# (#i90780#)
748 : */
749 72 : OUString sOutlineStyleName;
750 : {
751 : Reference<XPropertySet> xNumRulePropSet(
752 72 : xCNSupplier->getChapterNumberingRules(), UNO_QUERY );
753 72 : if (xNumRulePropSet.is())
754 : {
755 72 : const OUString sName( "Name" );
756 72 : xNumRulePropSet->getPropertyValue( sName ) >>= sOutlineStyleName;
757 72 : }
758 : }
759 : const SvtSaveOptions::ODFDefaultVersion nODFVersion =
760 72 : GetExport().getDefaultVersion();
761 144 : if ( ( nODFVersion == SvtSaveOptions::ODFVER_010 ||
762 72 : nODFVersion == SvtSaveOptions::ODFVER_011 ) &&
763 0 : GetExport().writeOutlineStyleAsNormalListStyle() )
764 : {
765 0 : exportNumberingRule( sOutlineStyleName, false, xNumRule );
766 : }
767 : else
768 : {
769 72 : if ( nODFVersion != SvtSaveOptions::ODFVER_010 &&
770 : nODFVersion != SvtSaveOptions::ODFVER_011 )
771 : {
772 : // style:name="..."
773 72 : GetExport().CheckAttrList();
774 72 : if ( !sOutlineStyleName.isEmpty() )
775 : {
776 72 : bool bEncoded = false;
777 72 : GetExport().AddAttribute( XML_NAMESPACE_STYLE, XML_NAME,
778 72 : GetExport().EncodeStyleName( sOutlineStyleName,
779 144 : &bEncoded ) );
780 72 : if( bEncoded )
781 0 : GetExport().AddAttribute( XML_NAMESPACE_STYLE,
782 : XML_DISPLAY_NAME,
783 0 : sOutlineStyleName );
784 : }
785 : }
786 72 : SvXMLElementExport aElem( GetExport(), XML_NAMESPACE_TEXT,
787 72 : XML_OUTLINE_STYLE, true, true );
788 72 : exportLevelStyles( xNumRule, true );
789 72 : }
790 72 : }
791 72 : }
792 72 : }
793 :
794 73 : void SvxXMLNumRuleExport::exportStyles( bool bUsed,
795 : XMLTextListAutoStylePool *pPool,
796 : bool bExportChapterNumbering )
797 : {
798 73 : if( bExportChapterNumbering )
799 72 : exportOutline();
800 :
801 73 : Reference< XStyleFamiliesSupplier > xFamiliesSupp( GetExport().GetModel(), UNO_QUERY );
802 : DBG_ASSERT( xFamiliesSupp.is(), "No XStyleFamiliesSupplier from XModel for export!" );
803 73 : if( xFamiliesSupp.is() )
804 : {
805 73 : Reference< XNameAccess > xFamilies( xFamiliesSupp->getStyleFamilies() );
806 : DBG_ASSERT( xFamiliesSupp.is(), "getStyleFamilies() from XModel failed for export!" );
807 :
808 73 : if( xFamilies.is() )
809 : {
810 73 : const OUString aNumberStyleName( "NumberingStyles" );
811 :
812 146 : Reference< XIndexAccess > xStyles;
813 73 : if( xFamilies->hasByName( aNumberStyleName ) )
814 : {
815 73 : xFamilies->getByName( aNumberStyleName ) >>= xStyles;
816 :
817 : DBG_ASSERT( xStyles.is(), "Style not found for export!" );
818 :
819 73 : if( xStyles.is() )
820 : {
821 73 : const sal_Int32 nStyles = xStyles->getCount();
822 :
823 868 : for( sal_Int32 i=0; i < nStyles; i++ )
824 : {
825 795 : Reference< XStyle > xStyle;
826 795 : xStyles->getByIndex( i ) >>= xStyle;
827 :
828 795 : if( !bUsed || xStyle->isInUse() )
829 : {
830 795 : exportStyle( xStyle );
831 795 : if( pPool )
832 795 : pPool->RegisterName( xStyle->getName() );
833 : }
834 795 : }
835 : }
836 73 : }
837 73 : }
838 73 : }
839 73 : }
840 :
841 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|