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 302 : void SvxXMLNumRuleExport::exportLevelStyles( const uno::Reference< ::com::sun::star::container::XIndexReplace > & xNumRule,
63 : bool bOutline )
64 : {
65 302 : sal_Int32 nCount = xNumRule ->getCount();
66 3322 : for( sal_Int32 i=0; i<nCount; i++ )
67 : {
68 3020 : uno::Any aEntry( xNumRule->getByIndex( i ) );
69 6040 : uno::Sequence<beans::PropertyValue> aSeq;
70 3020 : if( aEntry >>= aSeq )
71 : {
72 3020 : exportLevelStyle( i, aSeq, bOutline );
73 : }
74 3020 : }
75 302 : }
76 :
77 3020 : void SvxXMLNumRuleExport::exportLevelStyle( sal_Int32 nLevel,
78 : const uno::Sequence<beans::PropertyValue>& rProps,
79 : bool bOutline )
80 : {
81 3020 : sal_Int16 eType = NumberingType::CHAR_SPECIAL;
82 :
83 3020 : sal_Int16 eAdjust = HoriOrientation::LEFT;
84 6040 : OUString sPrefix, sSuffix;
85 6040 : OUString sTextStyleName;
86 3020 : bool bHasColor = false;
87 3020 : sal_Int32 nColor = 0;
88 3020 : sal_Int32 nSpaceBefore = 0, nMinLabelWidth = 0, nMinLabelDist = 0;
89 :
90 3020 : sal_Int16 nStartValue = 1, nDisplayLevels = 1, nBullRelSize = 0;
91 :
92 3020 : sal_Unicode cBullet = 0xf095;
93 6040 : OUString sBulletFontName, sBulletFontStyleName ;
94 3020 : FontFamily eBulletFontFamily = FAMILY_DONTKNOW;
95 3020 : FontPitch eBulletFontPitch = PITCH_DONTKNOW;
96 3020 : rtl_TextEncoding eBulletFontEncoding = RTL_TEXTENCODING_DONTKNOW;
97 :
98 6040 : OUString sImageURL;
99 6040 : uno::Reference< ::com::sun::star::awt::XBitmap > xBitmap;
100 3020 : sal_Int32 nImageWidth = 0, nImageHeight = 0;
101 3020 : sal_Int16 eImageVertOrient = VertOrientation::LINE_CENTER;
102 :
103 3020 : sal_Int16 ePosAndSpaceMode = PositionAndSpaceMode::LABEL_WIDTH_AND_POSITION;
104 3020 : sal_Int16 eLabelFollowedBy = LabelFollow::LISTTAB;
105 3020 : sal_Int32 nListtabStopPosition( 0 );
106 3020 : sal_Int32 nFirstLineIndent( 0 );
107 3020 : sal_Int32 nIndentAt( 0 );
108 :
109 3020 : const sal_Int32 nCount = rProps.getLength();
110 3020 : const beans::PropertyValue* pPropArray = rProps.getConstArray();
111 39520 : for( sal_Int32 i=0; i<nCount; i++ )
112 : {
113 36500 : const beans::PropertyValue& rProp = pPropArray[i];
114 :
115 36500 : if( rProp.Name == "NumberingType" )
116 : {
117 3020 : rProp.Value >>= eType;
118 : }
119 33480 : else if( rProp.Name == "Prefix" )
120 : {
121 3020 : rProp.Value >>= sPrefix;
122 : }
123 30460 : else if( rProp.Name == "Suffix" )
124 : {
125 3020 : rProp.Value >>= sSuffix;
126 : }
127 27440 : else if( rProp.Name == "BulletChar" )
128 : {
129 612 : OUString sValue;
130 612 : rProp.Value >>= sValue;
131 612 : if( !sValue.isEmpty() )
132 : {
133 612 : cBullet = (sal_Unicode)sValue[0];
134 612 : }
135 : }
136 26828 : else if( rProp.Name == "BulletRelSize" )
137 : {
138 1600 : rProp.Value >>= nBullRelSize;
139 : }
140 25228 : else if( rProp.Name == "Adjust" )
141 : {
142 3020 : sal_Int16 nValue = 0;
143 3020 : rProp.Value >>= nValue;
144 3020 : eAdjust = nValue;
145 : }
146 22208 : else if( rProp.Name == "BulletFont" )
147 : {
148 616 : awt::FontDescriptor rFDesc;
149 616 : if( rProp.Value >>= rFDesc )
150 : {
151 616 : sBulletFontName = rFDesc.Name;
152 616 : sBulletFontStyleName = rFDesc.StyleName;
153 616 : eBulletFontFamily = static_cast< FontFamily >( rFDesc.Family );
154 616 : eBulletFontPitch = static_cast< FontPitch >( rFDesc.Pitch );
155 616 : eBulletFontEncoding = (rtl_TextEncoding)rFDesc.CharSet;
156 616 : }
157 : }
158 21592 : else if( rProp.Name == "GraphicURL" )
159 : {
160 0 : rProp.Value >>= sImageURL;
161 : }
162 21592 : else if( rProp.Name == "GraphicBitmap" )
163 : {
164 0 : rProp.Value >>= xBitmap;
165 : }
166 21592 : else if( rProp.Name == "BulletColor" )
167 : {
168 1600 : rProp.Value >>= nColor;
169 1600 : bHasColor = true;
170 : }
171 19992 : else if( rProp.Name == "StartWith" )
172 : {
173 3020 : rProp.Value >>= nStartValue;
174 : }
175 16972 : else if( rProp.Name == "LeftMargin" )
176 : {
177 1620 : rProp.Value >>= nSpaceBefore;
178 : }
179 15352 : else if( rProp.Name == "FirstLineOffset" )
180 : {
181 1620 : rProp.Value >>= nMinLabelWidth;
182 : }
183 13732 : else if( rProp.Name == "SymbolTextDistance" )
184 : {
185 1620 : rProp.Value >>= nMinLabelDist;
186 : }
187 12112 : else if( rProp.Name == "ParentNumbering" )
188 : {
189 1420 : rProp.Value >>= nDisplayLevels;
190 1420 : if( nDisplayLevels > nLevel+1 )
191 144 : nDisplayLevels = static_cast<sal_Int16>( nLevel )+1;
192 : }
193 10692 : else if( rProp.Name == "CharStyleName" )
194 : {
195 1420 : rProp.Value >>= sTextStyleName;
196 : }
197 9272 : else if( rProp.Name == "GraphicSize" )
198 : {
199 1600 : awt::Size aSize;
200 1600 : if( rProp.Value >>= aSize )
201 : {
202 1600 : nImageWidth = aSize.Width;
203 1600 : nImageHeight = aSize.Height;
204 : }
205 : }
206 7672 : else if( rProp.Name == "VertOrient" )
207 : {
208 0 : sal_Int16 nValue = 0;
209 0 : rProp.Value >>= nValue;
210 0 : eImageVertOrient = nValue;
211 : }
212 7672 : else if( rProp.Name == "PositionAndSpaceMode" )
213 : {
214 1420 : sal_Int16 nValue = 0;
215 1420 : rProp.Value >>= nValue;
216 1420 : ePosAndSpaceMode = nValue;
217 : }
218 6252 : else if( rProp.Name == "LabelFollowedBy" )
219 : {
220 1400 : sal_Int16 nValue = 0;
221 1400 : rProp.Value >>= nValue;
222 1400 : eLabelFollowedBy = nValue;
223 : }
224 4852 : else if( rProp.Name == "ListtabStopPosition" )
225 : {
226 1400 : rProp.Value >>= nListtabStopPosition;
227 : }
228 3452 : else if( rProp.Name == "FirstLineIndent" )
229 : {
230 1400 : rProp.Value >>= nFirstLineIndent;
231 : }
232 2052 : else if( rProp.Name == "IndentAt" )
233 : {
234 1400 : rProp.Value >>= nIndentAt;
235 : }
236 : }
237 :
238 3600 : if( bOutline && (NumberingType::CHAR_SPECIAL == eType ||
239 580 : NumberingType::BITMAP == eType) )
240 : {
241 : DBG_ASSERT( !bOutline,
242 : "SvxXMLNumRuleExport::exportLevelStyle: invalid style for outline" );
243 3020 : return;
244 : }
245 :
246 3020 : GetExport().CheckAttrList();
247 :
248 : // text:level
249 6040 : OUStringBuffer sTmp;
250 3020 : sTmp.append( nLevel + 1 );
251 3020 : 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 3020 : if (NumberingType::BITMAP != eType)
255 : {
256 3020 : if (!sTextStyleName.isEmpty())
257 : {
258 124 : GetExport().AddAttribute( XML_NAMESPACE_TEXT, XML_STYLE_NAME,
259 248 : GetExport().EncodeStyleName( sTextStyleName ) );
260 : }
261 3020 : if (!sPrefix.isEmpty())
262 : {
263 0 : GetExport().AddAttribute( XML_NAMESPACE_STYLE, XML_NUM_PREFIX,
264 0 : sPrefix );
265 : }
266 3020 : if (!sSuffix.isEmpty())
267 : {
268 840 : GetExport().AddAttribute( XML_NAMESPACE_STYLE, XML_NUM_SUFFIX,
269 840 : sSuffix );
270 : }
271 : }
272 :
273 3020 : enum XMLTokenEnum eElem = XML_LIST_LEVEL_STYLE_NUMBER;
274 3020 : if( NumberingType::CHAR_SPECIAL == eType )
275 : {
276 : // <text:list-level-style-bullet>
277 612 : eElem = XML_LIST_LEVEL_STYLE_BULLET;
278 :
279 612 : if( cBullet )
280 : {
281 612 : if( cBullet < ' ' )
282 : {
283 0 : cBullet = 0xF000 + 149;
284 : }
285 : // text:bullet-char="..."
286 612 : sTmp.append( cBullet );
287 612 : GetExport().AddAttribute( XML_NAMESPACE_TEXT, XML_BULLET_CHAR,
288 1224 : 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 2408 : 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 2408 : if( bOutline )
325 580 : eElem = XML_OUTLINE_LEVEL_STYLE;
326 : else
327 1828 : eElem = XML_LIST_LEVEL_STYLE_NUMBER;
328 :
329 2408 : GetExport().GetMM100UnitConverter().convertNumFormat( sTmp, eType );
330 2408 : GetExport().AddAttribute( XML_NAMESPACE_STYLE, XML_NUM_FORMAT,
331 4816 : sTmp.makeStringAndClear() );
332 2408 : GetExport().GetMM100UnitConverter().convertNumLetterSync( sTmp, eType );
333 2408 : if( !sTmp.isEmpty() )
334 0 : GetExport().AddAttribute( XML_NAMESPACE_STYLE,
335 : XML_NUM_LETTER_SYNC,
336 0 : sTmp.makeStringAndClear() );
337 :
338 2408 : if( nStartValue != 1 )
339 : {
340 44 : sTmp.append( (sal_Int32)nStartValue );
341 44 : GetExport().AddAttribute( XML_NAMESPACE_TEXT, XML_START_VALUE,
342 88 : sTmp.makeStringAndClear() );
343 : }
344 2408 : if( nDisplayLevels > 1 && NumberingType::NUMBER_NONE != eType )
345 : {
346 32 : sTmp.append( (sal_Int32)nDisplayLevels );
347 32 : GetExport().AddAttribute( XML_NAMESPACE_TEXT, XML_DISPLAY_LEVELS,
348 64 : sTmp.makeStringAndClear() );
349 : }
350 : }
351 :
352 : {
353 3020 : SvXMLElementExport aElem( GetExport(), XML_NAMESPACE_TEXT, eElem,
354 3020 : true, true );
355 :
356 6040 : OUStringBuffer sBuffer;
357 3020 : if ( ePosAndSpaceMode == PositionAndSpaceMode::LABEL_WIDTH_AND_POSITION )
358 : {
359 1620 : nSpaceBefore += nMinLabelWidth;
360 1620 : nMinLabelWidth = -nMinLabelWidth;
361 1620 : if( nSpaceBefore != 0 )
362 : {
363 1446 : GetExport().GetMM100UnitConverter().convertMeasureToXML(
364 2892 : sBuffer, nSpaceBefore );
365 1446 : GetExport().AddAttribute( XML_NAMESPACE_TEXT, XML_SPACE_BEFORE,
366 2892 : sBuffer.makeStringAndClear() );
367 : }
368 1620 : if( nMinLabelWidth != 0 )
369 : {
370 580 : GetExport().GetMM100UnitConverter().convertMeasureToXML(
371 1160 : sBuffer, nMinLabelWidth );
372 580 : GetExport().AddAttribute( XML_NAMESPACE_TEXT, XML_MIN_LABEL_WIDTH,
373 1160 : sBuffer.makeStringAndClear() );
374 : }
375 1620 : if( nMinLabelDist > 0 )
376 : {
377 20 : GetExport().GetMM100UnitConverter().convertMeasureToXML(
378 40 : sBuffer, nMinLabelDist );
379 20 : GetExport().AddAttribute( XML_NAMESPACE_TEXT, XML_MIN_LABEL_DISTANCE,
380 40 : sBuffer.makeStringAndClear() );
381 : }
382 : }
383 : /* Check, if properties for position-and-space-mode LABEL_ALIGNMENT
384 : are allowed to be exported. (#i89178#)
385 : */
386 1400 : else if ( ePosAndSpaceMode == PositionAndSpaceMode::LABEL_ALIGNMENT &&
387 : mbExportPositionAndSpaceModeLabelAlignment )
388 : {
389 1400 : GetExport().AddAttribute( XML_NAMESPACE_TEXT,
390 : XML_LIST_LEVEL_POSITION_AND_SPACE_MODE,
391 1400 : XML_LABEL_ALIGNMENT );
392 : }
393 3020 : if( HoriOrientation::LEFT != eAdjust )
394 : {
395 192 : enum XMLTokenEnum eValue = XML_TOKEN_INVALID;
396 192 : switch( eAdjust )
397 : {
398 192 : case HoriOrientation::RIGHT: eValue = XML_END; break;
399 0 : case HoriOrientation::CENTER: eValue = XML_CENTER; break;
400 : }
401 192 : if( eValue != XML_TOKEN_INVALID )
402 192 : GetExport().AddAttribute( XML_NAMESPACE_FO, XML_TEXT_ALIGN, eValue );
403 : }
404 :
405 3020 : 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 3020 : SvXMLElementExport aElement( GetExport(), XML_NAMESPACE_STYLE,
472 3020 : 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 3020 : if ( ePosAndSpaceMode == PositionAndSpaceMode::LABEL_ALIGNMENT &&
478 : mbExportPositionAndSpaceModeLabelAlignment )
479 : {
480 1400 : enum XMLTokenEnum eValue = XML_LISTTAB;
481 1400 : if ( eLabelFollowedBy == LabelFollow::SPACE )
482 : {
483 0 : eValue = XML_SPACE;
484 : }
485 1400 : else if ( eLabelFollowedBy == LabelFollow::NOTHING )
486 : {
487 0 : eValue = XML_NOTHING;
488 : }
489 1400 : GetExport().AddAttribute( XML_NAMESPACE_TEXT,
490 1400 : XML_LABEL_FOLLOWED_BY, eValue );
491 :
492 2800 : if ( eLabelFollowedBy == LabelFollow::LISTTAB &&
493 1400 : nListtabStopPosition > 0 )
494 : {
495 1400 : GetExport().GetMM100UnitConverter().convertMeasureToXML(
496 2800 : sBuffer, nListtabStopPosition );
497 1400 : GetExport().AddAttribute( XML_NAMESPACE_TEXT,
498 : XML_LIST_TAB_STOP_POSITION,
499 2800 : sBuffer.makeStringAndClear() );
500 : }
501 :
502 1400 : if ( nFirstLineIndent != 0 )
503 : {
504 1400 : GetExport().GetMM100UnitConverter().convertMeasureToXML(
505 2800 : sBuffer, nFirstLineIndent );
506 1400 : GetExport().AddAttribute( XML_NAMESPACE_FO,
507 : XML_TEXT_INDENT,
508 2800 : sBuffer.makeStringAndClear() );
509 : }
510 :
511 1400 : if ( nIndentAt != 0 )
512 : {
513 1396 : GetExport().GetMM100UnitConverter().convertMeasureToXML(
514 2792 : sBuffer, nIndentAt );
515 1396 : GetExport().AddAttribute( XML_NAMESPACE_FO,
516 : XML_MARGIN_LEFT,
517 2792 : sBuffer.makeStringAndClear() );
518 : }
519 :
520 1400 : SvXMLElementExport aLabelAlignmentElement( GetExport(), XML_NAMESPACE_STYLE,
521 : XML_LIST_LEVEL_LABEL_ALIGNMENT,
522 1400 : true, true );
523 3020 : }
524 : }
525 :
526 3020 : if( NumberingType::CHAR_SPECIAL == eType )
527 : {
528 612 : if( !sBulletFontName.isEmpty() )
529 : {
530 : OUString sStyleName =
531 612 : GetExport().GetFontAutoStylePool()->Find(
532 : sBulletFontName, sBulletFontStyleName,
533 : eBulletFontFamily, eBulletFontPitch,
534 1224 : eBulletFontEncoding );
535 :
536 612 : if( !sStyleName.isEmpty() )
537 : {
538 0 : GetExport().AddAttribute( XML_NAMESPACE_STYLE,
539 : XML_FONT_NAME,
540 0 : sStyleName );
541 : }
542 : else
543 : {
544 612 : Any aAny;
545 1224 : OUString sTemp;
546 :
547 : const SvXMLUnitConverter& rUnitConv =
548 612 : GetExport().GetMM100UnitConverter();
549 1224 : XMLFontFamilyNamePropHdl aFamilyNameHdl;
550 612 : aAny <<= sBulletFontName;
551 612 : if( aFamilyNameHdl.exportXML( sTemp, aAny, rUnitConv ) )
552 612 : GetExport().AddAttribute( XML_NAMESPACE_FO,
553 612 : XML_FONT_FAMILY, sTemp );
554 :
555 612 : if( !sBulletFontStyleName.isEmpty() )
556 0 : GetExport().AddAttribute( XML_NAMESPACE_STYLE,
557 : XML_FONT_STYLE_NAME,
558 0 : sBulletFontStyleName );
559 :
560 1224 : XMLFontFamilyPropHdl aFamilyHdl;
561 612 : aAny <<= (sal_Int16)eBulletFontFamily;
562 612 : if( aFamilyHdl.exportXML( sTemp, aAny, rUnitConv ) )
563 16 : GetExport().AddAttribute( XML_NAMESPACE_STYLE,
564 : XML_FONT_FAMILY_GENERIC,
565 16 : sTemp );
566 :
567 1224 : XMLFontPitchPropHdl aPitchHdl;
568 612 : aAny <<= (sal_Int16)eBulletFontPitch;
569 612 : if( aPitchHdl.exportXML( sTemp, aAny, rUnitConv ) )
570 12 : GetExport().AddAttribute( XML_NAMESPACE_STYLE,
571 12 : XML_FONT_PITCH, sTemp );
572 :
573 1224 : XMLFontEncodingPropHdl aEncHdl;
574 612 : aAny <<= (sal_Int16)eBulletFontEncoding;
575 612 : if( aEncHdl.exportXML( sTemp, aAny, rUnitConv ) )
576 20 : GetExport().AddAttribute( XML_NAMESPACE_STYLE,
577 632 : XML_FONT_CHARSET, sTemp );
578 612 : }
579 : }
580 : }
581 3020 : if( NumberingType::BITMAP != eType )
582 : {
583 : // fo:color = "#..."
584 3020 : if( bHasColor )
585 : {
586 1600 : if (0xffffffff == static_cast<sal_uInt32>(nColor))
587 : {
588 574 : GetExport().AddAttribute( XML_NAMESPACE_STYLE, XML_USE_WINDOW_FONT_COLOR, XML_TRUE );
589 : }
590 : else
591 : {
592 1026 : ::sax::Converter::convertColor( sBuffer, nColor );
593 1026 : GetExport().AddAttribute( XML_NAMESPACE_FO, XML_COLOR,
594 2052 : sBuffer.makeStringAndClear() );
595 : }
596 : }
597 : // fo:height="...%"
598 3020 : if( nBullRelSize )
599 : {
600 1600 : ::sax::Converter::convertPercent( sTmp, nBullRelSize );
601 1600 : GetExport().AddAttribute( XML_NAMESPACE_FO, XML_FONT_SIZE,
602 3200 : sTmp.makeStringAndClear() );
603 : }
604 : }
605 3020 : if( GetExport().GetAttrList().getLength() > 0 )
606 : {
607 1636 : SvXMLElementExport aElement( GetExport(), XML_NAMESPACE_STYLE,
608 1636 : XML_TEXT_PROPERTIES, true, true );
609 : }
610 3020 : if( NumberingType::BITMAP == eType && !sImageURL.isEmpty() )
611 : {
612 : // optional office:binary-data
613 0 : GetExport().AddEmbeddedGraphicObjectAsBase64( sImageURL );
614 3020 : }
615 3020 : }
616 : }
617 :
618 :
619 244 : void SvxXMLNumRuleExport::AddListStyleAttributes()
620 : {
621 244 : }
622 :
623 :
624 3612 : 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 3612 : mbExportPositionAndSpaceModeLabelAlignment( true )
631 : {
632 3612 : 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 3612 : mbExportPositionAndSpaceModeLabelAlignment = true;
643 : }
644 : }
645 3612 : }
646 :
647 3602 : SvxXMLNumRuleExport::~SvxXMLNumRuleExport()
648 : {
649 3602 : }
650 :
651 244 : void SvxXMLNumRuleExport::exportNumberingRule(
652 : const OUString& rName, bool bIsHidden,
653 : const Reference< XIndexReplace >& rNumRule )
654 : {
655 244 : Reference< XPropertySet > xPropSet( rNumRule, UNO_QUERY );
656 488 : Reference< XPropertySetInfo > xPropSetInfo;
657 244 : if( xPropSet.is() )
658 84 : xPropSetInfo = xPropSet->getPropertySetInfo();
659 :
660 244 : GetExport().CheckAttrList();
661 :
662 : // style:name="..."
663 244 : if( !rName.isEmpty() )
664 : {
665 244 : bool bEncoded = false;
666 244 : GetExport().AddAttribute( XML_NAMESPACE_STYLE, XML_NAME,
667 488 : GetExport().EncodeStyleName( rName, &bEncoded ) );
668 244 : if( bEncoded )
669 18 : GetExport().AddAttribute( XML_NAMESPACE_STYLE, XML_DISPLAY_NAME,
670 18 : rName);
671 : }
672 :
673 : // style:hidden="..."
674 244 : if ( bIsHidden && GetExport( ).getDefaultVersion( ) == SvtSaveOptions::ODFVER_LATEST )
675 0 : GetExport( ).AddAttribute( XML_NAMESPACE_STYLE, XML_HIDDEN, "true" );
676 :
677 : // text:consecutive-numbering="..."
678 244 : bool bContNumbering = false;
679 328 : if( xPropSetInfo.is() &&
680 84 : xPropSetInfo->hasPropertyByName( sIsContinuousNumbering ) )
681 : {
682 84 : Any aAny( xPropSet->getPropertyValue( sIsContinuousNumbering ) );
683 84 : bContNumbering = *(sal_Bool *)aAny.getValue();
684 : }
685 244 : if( bContNumbering )
686 0 : GetExport().AddAttribute( XML_NAMESPACE_TEXT,
687 0 : XML_CONSECUTIVE_NUMBERING, XML_TRUE );
688 :
689 : // other application specific attributes
690 244 : AddListStyleAttributes();
691 :
692 : {
693 244 : SvXMLElementExport aElem( GetExport(), XML_NAMESPACE_TEXT, XML_LIST_STYLE ,
694 244 : true, true );
695 244 : exportLevelStyles( rNumRule );
696 244 : }
697 244 : }
698 :
699 684 : bool SvxXMLNumRuleExport::exportStyle( const Reference< XStyle >& rStyle )
700 : {
701 684 : Reference< XPropertySet > xPropSet( rStyle, UNO_QUERY );
702 1368 : Reference< XPropertySetInfo > xPropSetInfo = xPropSet->getPropertySetInfo();
703 :
704 1368 : 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 684 : if( xPropSetInfo->hasPropertyByName( sIsPhysical ) )
709 : {
710 684 : aAny = xPropSet->getPropertyValue( sIsPhysical );
711 684 : if( !*(sal_Bool *)aAny.getValue() )
712 600 : return false;
713 : }
714 :
715 84 : aAny = xPropSet->getPropertyValue( sNumberingRules );
716 168 : Reference<XIndexReplace> xNumRule;
717 84 : aAny >>= xNumRule;
718 :
719 168 : OUString sName = rStyle->getName();
720 :
721 84 : bool bHidden = false;
722 84 : if ( xPropSetInfo->hasPropertyByName( "Hidden" ) )
723 : {
724 84 : aAny = xPropSet->getPropertyValue( "Hidden" );
725 84 : aAny >>= bHidden;
726 : }
727 :
728 84 : exportNumberingRule( sName, bHidden, xNumRule );
729 :
730 768 : return true;
731 : }
732 :
733 58 : void SvxXMLNumRuleExport::exportOutline()
734 : {
735 58 : Reference< XChapterNumberingSupplier > xCNSupplier( GetExport().GetModel(),
736 58 : UNO_QUERY );
737 : DBG_ASSERT( xCNSupplier.is(), "no chapter numbering supplier" );
738 :
739 58 : if( xCNSupplier.is() )
740 : {
741 58 : Reference< XIndexReplace > xNumRule( xCNSupplier->getChapterNumberingRules() );
742 : DBG_ASSERT( xNumRule.is(), "no chapter numbering rules" );
743 :
744 58 : 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 58 : OUString sOutlineStyleName;
750 : {
751 : Reference<XPropertySet> xNumRulePropSet(
752 58 : xCNSupplier->getChapterNumberingRules(), UNO_QUERY );
753 58 : if (xNumRulePropSet.is())
754 : {
755 58 : const OUString sName( "Name" );
756 58 : xNumRulePropSet->getPropertyValue( sName ) >>= sOutlineStyleName;
757 58 : }
758 : }
759 : const SvtSaveOptions::ODFDefaultVersion nODFVersion =
760 58 : GetExport().getDefaultVersion();
761 116 : if ( ( nODFVersion == SvtSaveOptions::ODFVER_010 ||
762 58 : nODFVersion == SvtSaveOptions::ODFVER_011 ) &&
763 0 : GetExport().writeOutlineStyleAsNormalListStyle() )
764 : {
765 0 : exportNumberingRule( sOutlineStyleName, false, xNumRule );
766 : }
767 : else
768 : {
769 58 : if ( nODFVersion != SvtSaveOptions::ODFVER_010 &&
770 : nODFVersion != SvtSaveOptions::ODFVER_011 )
771 : {
772 : // style:name="..."
773 58 : GetExport().CheckAttrList();
774 58 : if ( !sOutlineStyleName.isEmpty() )
775 : {
776 58 : bool bEncoded = false;
777 58 : GetExport().AddAttribute( XML_NAMESPACE_STYLE, XML_NAME,
778 58 : GetExport().EncodeStyleName( sOutlineStyleName,
779 116 : &bEncoded ) );
780 58 : if( bEncoded )
781 0 : GetExport().AddAttribute( XML_NAMESPACE_STYLE,
782 : XML_DISPLAY_NAME,
783 0 : sOutlineStyleName );
784 : }
785 : }
786 58 : SvXMLElementExport aElem( GetExport(), XML_NAMESPACE_TEXT,
787 58 : XML_OUTLINE_STYLE, true, true );
788 58 : exportLevelStyles( xNumRule, true );
789 58 : }
790 58 : }
791 58 : }
792 58 : }
793 :
794 60 : void SvxXMLNumRuleExport::exportStyles( bool bUsed,
795 : XMLTextListAutoStylePool *pPool,
796 : bool bExportChapterNumbering )
797 : {
798 60 : if( bExportChapterNumbering )
799 58 : exportOutline();
800 :
801 60 : Reference< XStyleFamiliesSupplier > xFamiliesSupp( GetExport().GetModel(), UNO_QUERY );
802 : DBG_ASSERT( xFamiliesSupp.is(), "No XStyleFamiliesSupplier from XModel for export!" );
803 60 : if( xFamiliesSupp.is() )
804 : {
805 60 : Reference< XNameAccess > xFamilies( xFamiliesSupp->getStyleFamilies() );
806 : DBG_ASSERT( xFamiliesSupp.is(), "getStyleFamilies() from XModel failed for export!" );
807 :
808 60 : if( xFamilies.is() )
809 : {
810 60 : const OUString aNumberStyleName( "NumberingStyles" );
811 :
812 120 : Reference< XIndexAccess > xStyles;
813 60 : if( xFamilies->hasByName( aNumberStyleName ) )
814 : {
815 60 : xFamilies->getByName( aNumberStyleName ) >>= xStyles;
816 :
817 : DBG_ASSERT( xStyles.is(), "Style not found for export!" );
818 :
819 60 : if( xStyles.is() )
820 : {
821 60 : const sal_Int32 nStyles = xStyles->getCount();
822 :
823 744 : for( sal_Int32 i=0; i < nStyles; i++ )
824 : {
825 684 : Reference< XStyle > xStyle;
826 684 : xStyles->getByIndex( i ) >>= xStyle;
827 :
828 684 : if( !bUsed || xStyle->isInUse() )
829 : {
830 684 : exportStyle( xStyle );
831 684 : if( pPool )
832 684 : pPool->RegisterName( xStyle->getName() );
833 : }
834 684 : }
835 : }
836 60 : }
837 60 : }
838 60 : }
839 60 : }
840 :
841 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|