xref: /trunk/main/xmloff/source/style/PageMasterExportPropMapper.cxx (revision ffd38472365e95f6a578737bc9a5eb0fac624a86)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 // MARKER(update_precomp.py): autogen include statement, do not remove
23 #include "precompiled_xmloff.hxx"
24 
25 #include "PageMasterExportPropMapper.hxx"
26 #include <xmloff/xmltoken.hxx>
27 #include <comphelper/types.hxx>
28 #include <com/sun/star/table/BorderLine.hpp>
29 #include <xmloff/PageMasterStyleMap.hxx>
30 #include <tools/debug.hxx>
31 #include <rtl/ustrbuf.hxx>
32 #include <comphelper/extract.hxx>
33 
34 //UUUU
35 #include <xmloff/txtprmap.hxx>
36 
37 using namespace ::com::sun::star;
38 using namespace ::com::sun::star::uno;
39 using namespace ::com::sun::star::beans;
40 using namespace ::comphelper;
41 using namespace ::xmloff::token;
42 
43 //______________________________________________________________________________
44 
45 inline sal_Bool lcl_HasSameLineWidth( const table::BorderLine& rLine1, const table::BorderLine& rLine2 )
46 {
47     return  (rLine1.InnerLineWidth == rLine2.InnerLineWidth) &&
48             (rLine1.OuterLineWidth == rLine2.OuterLineWidth) &&
49             (rLine1.LineDistance == rLine2.LineDistance);
50 }
51 
52 inline sal_Bool operator==( const table::BorderLine& rLine1, const table::BorderLine& rLine2 )
53 {
54     return  (rLine1.Color == rLine2.Color) &&
55             lcl_HasSameLineWidth( rLine1, rLine2 );
56 }
57 
58 inline void lcl_RemoveState( XMLPropertyState* pState )
59 {
60     pState->mnIndex = -1;
61     pState->maValue.clear();
62 }
63 
64 void lcl_RemoveStateIfZero16( XMLPropertyState* pState )
65 {
66     sal_Int16   nValue = sal_Int16();
67     if( (pState->maValue >>= nValue) && !nValue )
68         lcl_RemoveState( pState );
69 }
70 
71 void lcl_AddState(::std::vector< XMLPropertyState >& rPropState, sal_Int32 nIndex, const rtl::OUString& rProperty, uno::Reference< beans::XPropertySet >& xProps)
72 {
73     if(::cppu::any2bool(xProps->getPropertyValue(rProperty)))
74         rPropState.push_back(XMLPropertyState (nIndex, cppu::bool2any(sal_True)));
75 }
76 
77 //______________________________________________________________________________
78 // helper struct to handle equal XMLPropertyState's for page, header and footer
79 
80 struct XMLPropertyStateBuffer
81 {
82     XMLPropertyState*       pPMMarginAll;
83     XMLPropertyState*       pPMMarginTop;
84     XMLPropertyState*       pPMMarginBottom;
85     XMLPropertyState*       pPMMarginLeft;
86     XMLPropertyState*       pPMMarginRight;
87 
88     XMLPropertyState*       pPMBorderAll;
89     XMLPropertyState*       pPMBorderTop;
90     XMLPropertyState*       pPMBorderBottom;
91     XMLPropertyState*       pPMBorderLeft;
92     XMLPropertyState*       pPMBorderRight;
93 
94     XMLPropertyState*       pPMBorderWidthAll;
95     XMLPropertyState*       pPMBorderWidthTop;
96     XMLPropertyState*       pPMBorderWidthBottom;
97     XMLPropertyState*       pPMBorderWidthLeft;
98     XMLPropertyState*       pPMBorderWidthRight;
99 
100     XMLPropertyState*       pPMPaddingAll;
101     XMLPropertyState*       pPMPaddingTop;
102     XMLPropertyState*       pPMPaddingBottom;
103     XMLPropertyState*       pPMPaddingLeft;
104     XMLPropertyState*       pPMPaddingRight;
105 
106                             XMLPropertyStateBuffer();
107     void                    ContextFilter( ::std::vector< XMLPropertyState >& rPropState );
108 };
109 
110 XMLPropertyStateBuffer::XMLPropertyStateBuffer()
111     :   pPMMarginAll( NULL )
112     ,   pPMMarginTop( NULL )
113     ,   pPMMarginBottom( NULL )
114     ,   pPMMarginLeft( NULL )
115     ,   pPMMarginRight( NULL )
116     ,
117         pPMBorderAll( NULL ),
118         pPMBorderTop( NULL ),
119         pPMBorderBottom( NULL ),
120         pPMBorderLeft( NULL ),
121         pPMBorderRight( NULL ),
122 
123         pPMBorderWidthAll( NULL ),
124         pPMBorderWidthTop( NULL ),
125         pPMBorderWidthBottom( NULL ),
126         pPMBorderWidthLeft( NULL ),
127         pPMBorderWidthRight( NULL ),
128 
129         pPMPaddingAll( NULL ),
130         pPMPaddingTop( NULL ),
131         pPMPaddingBottom( NULL ),
132         pPMPaddingLeft( NULL ),
133         pPMPaddingRight( NULL )
134 {
135 }
136 
137 void XMLPropertyStateBuffer::ContextFilter( ::std::vector< XMLPropertyState >& )
138 {
139     if (pPMMarginAll)
140     {
141         lcl_RemoveState(pPMMarginAll); // #i117696# do not write fo:margin
142     }
143 
144     if( pPMBorderAll )
145     {
146         if( pPMBorderTop && pPMBorderBottom && pPMBorderLeft && pPMBorderRight )
147         {
148             table::BorderLine aLineTop, aLineBottom, aLineLeft, aLineRight;
149 
150             pPMBorderTop->maValue >>= aLineTop;
151             pPMBorderBottom->maValue >>= aLineBottom;
152             pPMBorderLeft->maValue >>= aLineLeft;
153             pPMBorderRight->maValue >>= aLineRight;
154 
155             if( (aLineTop == aLineBottom) && (aLineBottom == aLineLeft) && (aLineLeft == aLineRight) )
156             {
157                 lcl_RemoveState( pPMBorderTop );
158                 lcl_RemoveState( pPMBorderBottom );
159                 lcl_RemoveState( pPMBorderLeft );
160                 lcl_RemoveState( pPMBorderRight );
161             }
162             else
163                 lcl_RemoveState( pPMBorderAll );
164         }
165         else
166             lcl_RemoveState( pPMBorderAll );
167     }
168 
169     if( pPMBorderWidthAll )
170     {
171         if( pPMBorderWidthTop && pPMBorderWidthBottom && pPMBorderWidthLeft && pPMBorderWidthRight )
172         {
173             table::BorderLine aLineTop, aLineBottom, aLineLeft, aLineRight;
174 
175             pPMBorderWidthTop->maValue >>= aLineTop;
176             pPMBorderWidthBottom->maValue >>= aLineBottom;
177             pPMBorderWidthLeft->maValue >>= aLineLeft;
178             pPMBorderWidthRight->maValue >>= aLineRight;
179 
180             if( lcl_HasSameLineWidth( aLineTop, aLineBottom ) &&
181                 lcl_HasSameLineWidth( aLineBottom, aLineLeft ) &&
182                 lcl_HasSameLineWidth( aLineLeft, aLineRight ) )
183             {
184                 lcl_RemoveState( pPMBorderWidthTop );
185                 lcl_RemoveState( pPMBorderWidthBottom );
186                 lcl_RemoveState( pPMBorderWidthLeft );
187                 lcl_RemoveState( pPMBorderWidthRight );
188             }
189             else
190                 lcl_RemoveState( pPMBorderWidthAll );
191         }
192         else
193             lcl_RemoveState( pPMBorderWidthAll );
194     }
195 
196     if( pPMPaddingAll )
197     {
198         if( pPMPaddingTop && pPMPaddingBottom && pPMPaddingLeft && pPMPaddingRight )
199         {
200             sal_Int32 nTop = 0, nBottom = 0, nLeft = 0, nRight = 0;
201 
202             pPMPaddingTop->maValue >>= nTop;
203             pPMPaddingBottom->maValue >>= nBottom;
204             pPMPaddingLeft->maValue >>= nLeft;
205             pPMPaddingRight->maValue >>= nRight;
206 
207             if( (nTop == nBottom) && (nBottom == nLeft) && (nLeft == nRight) )
208             {
209                 lcl_RemoveState( pPMPaddingTop );
210                 lcl_RemoveState( pPMPaddingBottom );
211                 lcl_RemoveState( pPMPaddingLeft );
212                 lcl_RemoveState( pPMPaddingRight );
213             }
214             else
215                 lcl_RemoveState( pPMPaddingAll );
216         }
217         else
218             lcl_RemoveState( pPMPaddingAll );
219     }
220 }
221 
222 //______________________________________________________________________________
223 
224 XMLPageMasterExportPropMapper::XMLPageMasterExportPropMapper(
225         const UniReference< XMLPropertySetMapper >& rMapper,
226         SvXMLExport& rExport ) :
227     SvXMLExportPropertyMapper( rMapper ),
228     aBackgroundImageExport( rExport ),
229     aTextColumnsExport( rExport ),
230     aFootnoteSeparatorExport( rExport )
231 {
232 }
233 
234 XMLPageMasterExportPropMapper::~XMLPageMasterExportPropMapper()
235 {
236 }
237 
238 void XMLPageMasterExportPropMapper::handleElementItem(
239         SvXMLExport&,
240         const XMLPropertyState& rProperty,
241         sal_uInt16 /*nFlags*/,
242         const ::std::vector< XMLPropertyState >* pProperties,
243         sal_uInt32 nIdx ) const
244 {
245     XMLPageMasterExportPropMapper* pThis = (XMLPageMasterExportPropMapper*) this;
246 
247     sal_uInt32 nContextId = getPropertySetMapper()->GetEntryContextId( rProperty.mnIndex );
248     switch( nContextId )
249     {
250         case CTF_PM_GRAPHICURL:
251         case CTF_PM_HEADERGRAPHICURL:
252         case CTF_PM_FOOTERGRAPHICURL:
253             {
254                 DBG_ASSERT( pProperties && (nIdx >= 2), "property vector missing" );
255                 sal_Int32 nPos;
256                 sal_Int32 nFilter;
257                 switch( nContextId  )
258                 {
259                 case CTF_PM_GRAPHICURL:
260                     nPos = CTF_PM_GRAPHICPOSITION;
261                     nFilter = CTF_PM_GRAPHICFILTER;
262                     break;
263                 case CTF_PM_HEADERGRAPHICURL:
264                     nPos = CTF_PM_HEADERGRAPHICPOSITION;
265                     nFilter = CTF_PM_HEADERGRAPHICFILTER;
266                     break;
267                 case CTF_PM_FOOTERGRAPHICURL:
268                     nPos = CTF_PM_FOOTERGRAPHICPOSITION;
269                     nFilter = CTF_PM_FOOTERGRAPHICFILTER;
270                     break;
271                 default:
272                     nPos = 0;  // TODO What values should this be?
273                     nFilter = 0;
274                 }
275                 const Any*  pPos    = NULL;
276                 const Any*  pFilter = NULL;
277                 if( pProperties && (nIdx >= 2) )
278                 {
279                     const XMLPropertyState& rPos = (*pProperties)[nIdx - 2];
280                     DBG_ASSERT( getPropertySetMapper()->GetEntryContextId( rPos.mnIndex ) == nPos,
281                                 "invalid property map: pos expected" );
282                     if( getPropertySetMapper()->GetEntryContextId( rPos.mnIndex ) == nPos )
283                         pPos = &rPos.maValue;
284 
285                     const XMLPropertyState& rFilter = (*pProperties)[nIdx - 1];
286                     DBG_ASSERT( getPropertySetMapper()->GetEntryContextId( rFilter.mnIndex ) == nFilter,
287                                 "invalid property map: filter expected" );
288                     if( getPropertySetMapper()->GetEntryContextId( rFilter.mnIndex ) == nFilter )
289                         pFilter = &rFilter.maValue;
290                 }
291                 sal_uInt32 nPropIndex = rProperty.mnIndex;
292                 pThis->aBackgroundImageExport.exportXML( rProperty.maValue, pPos, pFilter, NULL,
293                     getPropertySetMapper()->GetEntryNameSpace( nPropIndex ),
294                     getPropertySetMapper()->GetEntryXMLName( nPropIndex ) );
295             }
296             break;
297         case CTF_PM_TEXTCOLUMNS:
298             pThis->aTextColumnsExport.exportXML( rProperty.maValue );
299             break;
300         case CTF_PM_FTN_LINE_WEIGTH:
301             pThis->aFootnoteSeparatorExport.exportXML( pProperties, nIdx,
302                                                        getPropertySetMapper());
303             break;
304     }
305 }
306 
307 void XMLPageMasterExportPropMapper::handleSpecialItem(
308         SvXMLAttributeList&,
309         const XMLPropertyState&,
310         const SvXMLUnitConverter&,
311         const SvXMLNamespaceMap&,
312         const ::std::vector< XMLPropertyState >*,
313         sal_uInt32 /*nIdx*/) const
314 {
315 }
316 
317 void XMLPageMasterExportPropMapper::ContextFilter(
318         ::std::vector< XMLPropertyState >& rPropState,
319         Reference< XPropertySet > rPropSet ) const
320 {
321     XMLPropertyStateBuffer  aPageBuffer;
322     XMLPropertyStateBuffer  aHeaderBuffer;
323     XMLPropertyStateBuffer  aFooterBuffer;
324 
325     XMLPropertyState*       pPMHeaderHeight     = NULL;
326     XMLPropertyState*       pPMHeaderMinHeight  = NULL;
327     XMLPropertyState*       pPMHeaderDynamic    = NULL;
328 
329     XMLPropertyState*       pPMFooterHeight     = NULL;
330     XMLPropertyState*       pPMFooterMinHeight  = NULL;
331     XMLPropertyState*       pPMFooterDynamic    = NULL;
332 
333     XMLPropertyState*       pPMScaleTo          = NULL;
334     XMLPropertyState*       pPMScaleToPages     = NULL;
335     XMLPropertyState*       pPMScaleToX         = NULL;
336     XMLPropertyState*       pPMScaleToY         = NULL;
337     XMLPropertyState*       pPMStandardMode     = NULL;
338     XMLPropertyState*       pPMGridBaseWidth    = NULL;
339     XMLPropertyState*       pPMGridSnapToChars  = NULL;
340 
341     XMLPropertyState*       pPrint              = NULL;
342 
343     //UUUU
344     XMLPropertyState* pRepeatOffsetX = NULL;
345     XMLPropertyState* pRepeatOffsetY = NULL;
346     XMLPropertyState* pHeaderRepeatOffsetX = NULL;
347     XMLPropertyState* pHeaderRepeatOffsetY = NULL;
348     XMLPropertyState* pFooterRepeatOffsetX = NULL;
349     XMLPropertyState* pFooterRepeatOffsetY = NULL;
350 
351     UniReference < XMLPropertySetMapper > aPropMapper(getPropertySetMapper());
352 
353     for( ::std::vector< XMLPropertyState >::iterator aIter = rPropState.begin(); aIter != rPropState.end(); ++aIter )
354     {
355         XMLPropertyState *pProp = &(*aIter);
356         sal_Int16 nContextId    = aPropMapper->GetEntryContextId( pProp->mnIndex );
357         sal_Int16 nFlag         = nContextId & CTF_PM_FLAGMASK;
358         sal_Int16 nSimpleId     = nContextId & (~CTF_PM_FLAGMASK | XML_PM_CTF_START);
359         sal_Int16 nPrintId      = nContextId & CTF_PM_PRINTMASK;
360 
361         XMLPropertyStateBuffer* pBuffer;
362         switch( nFlag )
363         {
364             case CTF_PM_HEADERFLAG:         pBuffer = &aHeaderBuffer;   break;
365             case CTF_PM_FOOTERFLAG:         pBuffer = &aFooterBuffer;   break;
366             default:                        pBuffer = &aPageBuffer;     break;
367         }
368 
369         switch( nSimpleId )
370         {
371             case CTF_PM_MARGINALL:          pBuffer->pPMMarginAll           = pProp;    break;
372             case CTF_PM_MARGINTOP:          pBuffer->pPMMarginTop           = pProp;    break;
373             case CTF_PM_MARGINBOTTOM:       pBuffer->pPMMarginBottom        = pProp;    break;
374             case CTF_PM_MARGINLEFT:         pBuffer->pPMMarginLeft          = pProp;    break;
375             case CTF_PM_MARGINRIGHT:        pBuffer->pPMMarginRight         = pProp;    break;
376             case CTF_PM_BORDERALL:          pBuffer->pPMBorderAll           = pProp;    break;
377             case CTF_PM_BORDERTOP:          pBuffer->pPMBorderTop           = pProp;    break;
378             case CTF_PM_BORDERBOTTOM:       pBuffer->pPMBorderBottom        = pProp;    break;
379             case CTF_PM_BORDERLEFT:         pBuffer->pPMBorderLeft          = pProp;    break;
380             case CTF_PM_BORDERRIGHT:        pBuffer->pPMBorderRight         = pProp;    break;
381             case CTF_PM_BORDERWIDTHALL:     pBuffer->pPMBorderWidthAll      = pProp;    break;
382             case CTF_PM_BORDERWIDTHTOP:     pBuffer->pPMBorderWidthTop      = pProp;    break;
383             case CTF_PM_BORDERWIDTHBOTTOM:  pBuffer->pPMBorderWidthBottom   = pProp;    break;
384             case CTF_PM_BORDERWIDTHLEFT:    pBuffer->pPMBorderWidthLeft     = pProp;    break;
385             case CTF_PM_BORDERWIDTHRIGHT:   pBuffer->pPMBorderWidthRight    = pProp;    break;
386             case CTF_PM_PADDINGALL:         pBuffer->pPMPaddingAll          = pProp;    break;
387             case CTF_PM_PADDINGTOP:         pBuffer->pPMPaddingTop          = pProp;    break;
388             case CTF_PM_PADDINGBOTTOM:      pBuffer->pPMPaddingBottom       = pProp;    break;
389             case CTF_PM_PADDINGLEFT:        pBuffer->pPMPaddingLeft         = pProp;    break;
390             case CTF_PM_PADDINGRIGHT:       pBuffer->pPMPaddingRight        = pProp;    break;
391         }
392 
393         switch( nContextId )
394         {
395             case CTF_PM_HEADERHEIGHT:       pPMHeaderHeight     = pProp;    break;
396             case CTF_PM_HEADERMINHEIGHT:    pPMHeaderMinHeight  = pProp;    break;
397             case CTF_PM_HEADERDYNAMIC:      pPMHeaderDynamic    = pProp;    break;
398             case CTF_PM_FOOTERHEIGHT:       pPMFooterHeight     = pProp;    break;
399             case CTF_PM_FOOTERMINHEIGHT:    pPMFooterMinHeight  = pProp;    break;
400             case CTF_PM_FOOTERDYNAMIC:      pPMFooterDynamic    = pProp;    break;
401             case CTF_PM_SCALETO:            pPMScaleTo          = pProp;    break;
402             case CTF_PM_SCALETOPAGES:       pPMScaleToPages     = pProp;    break;
403             case CTF_PM_SCALETOX:           pPMScaleToX         = pProp;    break;
404             case CTF_PM_SCALETOY:           pPMScaleToY         = pProp;    break;
405             case CTF_PM_STANDARD_MODE:      pPMStandardMode     = pProp;    break;
406             case CTP_PM_GRID_BASE_WIDTH:        pPMGridBaseWidth    = pProp;    break;
407             case CTP_PM_GRID_SNAP_TO_CHARS:     pPMGridSnapToChars  = pProp;    break;
408 
409             //UUUU
410             case CTF_PM_REPEAT_OFFSET_X:
411                 pRepeatOffsetX = pProp;
412                 break;
413 
414             //UUUU
415             case CTF_PM_REPEAT_OFFSET_Y:
416                 pRepeatOffsetY = pProp;
417                 break;
418 
419             //UUUU
420             case CTF_PM_HEADERREPEAT_OFFSET_X:
421                 pHeaderRepeatOffsetX = pProp;
422                 break;
423 
424             //UUUU
425             case CTF_PM_HEADERREPEAT_OFFSET_Y:
426                 pHeaderRepeatOffsetY = pProp;
427                 break;
428 
429             //UUUU
430             case CTF_PM_FOOTERREPEAT_OFFSET_X:
431                 pFooterRepeatOffsetX = pProp;
432                 break;
433 
434             //UUUU
435             case CTF_PM_FOOTERREPEAT_OFFSET_Y:
436                 pFooterRepeatOffsetY = pProp;
437                 break;
438 
439             //UUUU Sort out empty entries
440             case CTF_PM_FILLGRADIENTNAME:
441             case CTF_PM_FILLHATCHNAME:
442             case CTF_PM_FILLBITMAPNAME:
443             case CTF_PM_FILLTRANSNAME:
444 
445             case CTF_PM_HEADERFILLGRADIENTNAME:
446             case CTF_PM_HEADERFILLHATCHNAME:
447             case CTF_PM_HEADERFILLBITMAPNAME:
448             case CTF_PM_HEADERFILLTRANSNAME:
449 
450             case CTF_PM_FOOTERFILLGRADIENTNAME:
451             case CTF_PM_FOOTERFILLHATCHNAME:
452             case CTF_PM_FOOTERFILLBITMAPNAME:
453             case CTF_PM_FOOTERFILLTRANSNAME:
454             {
455                 rtl::OUString aStr;
456 
457                 if( (pProp->maValue >>= aStr) && 0 == aStr.getLength() )
458                 {
459                     pProp->mnIndex = -1;
460                 }
461 
462                 break;
463             }
464         }
465 
466         if (nPrintId == CTF_PM_PRINTMASK)
467         {
468             pPrint = pProp;
469             lcl_RemoveState(pPrint);
470         }
471     }
472 
473     //UUUU These entries need to be reduced to a single one for XML export.
474     // Both would be exported as 'draw:tile-repeat-offset' following a percent
475     // value and a 'vertical' or 'horizontal' tag as mark. If both would be active
476     // and both would be exported this would create an XML error (same property twice)
477     if(pRepeatOffsetX && pRepeatOffsetY)
478     {
479         sal_Int32 nOffset(0);
480 
481         if((pRepeatOffsetX->maValue >>= nOffset) && (!nOffset))
482         {
483             pRepeatOffsetX->mnIndex = -1;
484         }
485         else
486         {
487             pRepeatOffsetY->mnIndex = -1;
488         }
489     }
490 
491     //UUUU Same as above for Header
492     if(pHeaderRepeatOffsetX && pHeaderRepeatOffsetY)
493     {
494         sal_Int32 nOffset(0);
495 
496         if((pHeaderRepeatOffsetX->maValue >>= nOffset) && (!nOffset))
497         {
498             pHeaderRepeatOffsetX->mnIndex = -1;
499         }
500         else
501         {
502             pHeaderRepeatOffsetY->mnIndex = -1;
503         }
504     }
505 
506     //UUUU Same as above for Footer
507     if(pFooterRepeatOffsetX && pFooterRepeatOffsetY)
508     {
509         sal_Int32 nOffset(0);
510 
511         if((pFooterRepeatOffsetX->maValue >>= nOffset) && (!nOffset))
512         {
513             pFooterRepeatOffsetX->mnIndex = -1;
514         }
515         else
516         {
517             pFooterRepeatOffsetY->mnIndex = -1;
518         }
519     }
520 
521     if( pPMStandardMode && !getBOOL(pPMStandardMode->maValue) )
522     {
523         lcl_RemoveState(pPMStandardMode);
524         if( pPMGridBaseWidth )
525             lcl_RemoveState(pPMGridBaseWidth);
526         if( pPMGridSnapToChars )
527             lcl_RemoveState(pPMGridSnapToChars);
528     }
529 
530     if( pPMGridBaseWidth && pPMStandardMode )
531         lcl_RemoveState(pPMStandardMode);
532 
533     aPageBuffer.ContextFilter( rPropState );
534     aHeaderBuffer.ContextFilter( rPropState );
535     aFooterBuffer.ContextFilter( rPropState );
536 
537     if( pPMHeaderHeight && (!pPMHeaderDynamic || (pPMHeaderDynamic && getBOOL( pPMHeaderDynamic->maValue ))) )
538         lcl_RemoveState( pPMHeaderHeight );
539     if( pPMHeaderMinHeight && pPMHeaderDynamic && !getBOOL( pPMHeaderDynamic->maValue ) )
540         lcl_RemoveState( pPMHeaderMinHeight );
541     if( pPMHeaderDynamic )
542         lcl_RemoveState( pPMHeaderDynamic );
543 
544     if( pPMFooterHeight && (!pPMFooterDynamic || (pPMFooterDynamic && getBOOL( pPMFooterDynamic->maValue ))) )
545         lcl_RemoveState( pPMFooterHeight );
546     if( pPMFooterMinHeight && pPMFooterDynamic && !getBOOL( pPMFooterDynamic->maValue ) )
547         lcl_RemoveState( pPMFooterMinHeight );
548     if( pPMFooterDynamic )
549         lcl_RemoveState( pPMFooterDynamic );
550 
551     if( pPMScaleTo )
552         lcl_RemoveStateIfZero16( pPMScaleTo );
553     if( pPMScaleToPages )
554         lcl_RemoveStateIfZero16( pPMScaleToPages );
555     if( pPMScaleToX )
556         lcl_RemoveStateIfZero16( pPMScaleToX );
557     if( pPMScaleToY )
558         lcl_RemoveStateIfZero16( pPMScaleToY );
559 
560     if (pPrint)
561     {
562         lcl_AddState(rPropState, aPropMapper->FindEntryIndex(CTF_PM_PRINT_ANNOTATIONS), rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("PrintAnnotations")), rPropSet);
563         lcl_AddState(rPropState, aPropMapper->FindEntryIndex(CTF_PM_PRINT_CHARTS), rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("PrintCharts")), rPropSet);
564         lcl_AddState(rPropState, aPropMapper->FindEntryIndex(CTF_PM_PRINT_DRAWING), rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("PrintDrawing")), rPropSet);
565         lcl_AddState(rPropState, aPropMapper->FindEntryIndex(CTF_PM_PRINT_FORMULAS), rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("PrintFormulas")), rPropSet);
566         lcl_AddState(rPropState, aPropMapper->FindEntryIndex(CTF_PM_PRINT_GRID), rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("PrintGrid")), rPropSet);
567         lcl_AddState(rPropState, aPropMapper->FindEntryIndex(CTF_PM_PRINT_HEADERS), rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("PrintHeaders")), rPropSet);
568         lcl_AddState(rPropState, aPropMapper->FindEntryIndex(CTF_PM_PRINT_OBJECTS), rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("PrintObjects")), rPropSet);
569         lcl_AddState(rPropState, aPropMapper->FindEntryIndex(CTF_PM_PRINT_ZEROVALUES), rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("PrintZeroValues")), rPropSet);
570     }
571 
572     SvXMLExportPropertyMapper::ContextFilter(rPropState,rPropSet);
573 }
574