xref: /trunk/main/xmloff/source/style/PageMasterImportPropMapper.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_xmloff.hxx"
30 
31 #include "PageMasterImportPropMapper.hxx"
32 #include "PageMasterPropMapper.hxx"
33 #include <xmloff/PageMasterStyleMap.hxx>
34 #include <xmloff/maptype.hxx>
35 #include <com/sun/star/table/BorderLine.hpp>
36 #include <com/sun/star/container/XNameContainer.hpp>
37 #include <xmloff/xmlimp.hxx>
38 
39 #define XML_LINE_LEFT 0
40 #define XML_LINE_RIGHT 1
41 #define XML_LINE_TOP 2
42 #define XML_LINE_BOTTOM 3
43 
44 using namespace ::com::sun::star;
45 using namespace ::com::sun::star::uno;
46 using namespace ::com::sun::star::container;
47 
48 PageMasterImportPropertyMapper::PageMasterImportPropertyMapper(
49         const UniReference< XMLPropertySetMapper >& rMapper,
50         SvXMLImport& rImp ) :
51     SvXMLImportPropertyMapper( rMapper, rImp ),
52     rImport( rImp )
53 {
54 }
55 
56 PageMasterImportPropertyMapper::~PageMasterImportPropertyMapper()
57 {
58 }
59 
60 sal_Bool PageMasterImportPropertyMapper::handleSpecialItem(
61         XMLPropertyState& rProperty,
62         ::std::vector< XMLPropertyState >& rProperties,
63         const ::rtl::OUString& rValue,
64         const SvXMLUnitConverter& rUnitConverter,
65         const SvXMLNamespaceMap& rNamespaceMap ) const
66 {
67     sal_Bool bRet = sal_False;
68     sal_Int16 nContextID =
69             getPropertySetMapper()->GetEntryContextId(rProperty.mnIndex);
70 
71     if( CTF_PM_REGISTER_STYLE==nContextID )
72     {
73         ::rtl::OUString sDisplayName( rImport.GetStyleDisplayName(
74                     XML_STYLE_FAMILY_TEXT_PARAGRAPH, rValue ) );
75         Reference < XNameContainer > xParaStyles =
76             rImport.GetTextImport()->GetParaStyles();
77         if( xParaStyles.is() && xParaStyles->hasByName( sDisplayName ) )
78         {
79             rProperty.maValue <<= sDisplayName;
80             bRet = sal_True;
81         }
82     }
83     else
84     {
85         bRet = SvXMLImportPropertyMapper::handleSpecialItem(
86                     rProperty, rProperties, rValue,
87                     rUnitConverter, rNamespaceMap );
88     }
89 
90     return bRet;
91 }
92 
93 
94 void PageMasterImportPropertyMapper::finished(::std::vector< XMLPropertyState >& rProperties, sal_Int32 nStartIndex, sal_Int32 nEndIndex ) const
95 {
96     SvXMLImportPropertyMapper::finished(rProperties, nStartIndex, nEndIndex);
97     XMLPropertyState* pAllPaddingProperty = NULL;
98     XMLPropertyState* pPadding[4] = { NULL, NULL, NULL, NULL };
99     XMLPropertyState* pNewPadding[4] = { NULL, NULL, NULL, NULL };
100     XMLPropertyState* pAllBorderProperty = NULL;
101     XMLPropertyState* pBorders[4] = { NULL, NULL, NULL, NULL };
102     XMLPropertyState* pNewBorders[4] = { NULL, NULL, NULL, NULL };
103     XMLPropertyState* pAllBorderWidthProperty = NULL;
104     XMLPropertyState* pBorderWidths[4] = { NULL, NULL, NULL, NULL };
105     XMLPropertyState* pAllHeaderPaddingProperty = NULL;
106     XMLPropertyState* pHeaderPadding[4] = { NULL, NULL, NULL, NULL };
107     XMLPropertyState* pHeaderNewPadding[4] = { NULL, NULL, NULL, NULL };
108     XMLPropertyState* pAllHeaderBorderProperty = NULL;
109     XMLPropertyState* pHeaderBorders[4] = { NULL, NULL, NULL, NULL };
110     XMLPropertyState* pHeaderNewBorders[4] = { NULL, NULL, NULL, NULL };
111     XMLPropertyState* pAllHeaderBorderWidthProperty = NULL;
112     XMLPropertyState* pHeaderBorderWidths[4] = { NULL, NULL, NULL, NULL };
113     XMLPropertyState* pAllFooterPaddingProperty = NULL;
114     XMLPropertyState* pFooterPadding[4] = { NULL, NULL, NULL, NULL };
115     XMLPropertyState* pFooterNewPadding[4] = { NULL, NULL, NULL, NULL };
116     XMLPropertyState* pAllFooterBorderProperty = NULL;
117     XMLPropertyState* pFooterBorders[4] = { NULL, NULL, NULL, NULL };
118     XMLPropertyState* pFooterNewBorders[4] = { NULL, NULL, NULL, NULL };
119     XMLPropertyState* pAllFooterBorderWidthProperty = NULL;
120     XMLPropertyState* pFooterBorderWidths[4] = { NULL, NULL, NULL, NULL };
121     XMLPropertyState* pHeaderHeight = NULL;
122     XMLPropertyState* pHeaderMinHeight = NULL;
123     XMLPropertyState* pHeaderDynamic = NULL;
124     XMLPropertyState* pFooterHeight = NULL;
125     XMLPropertyState* pFooterMinHeight = NULL;
126     XMLPropertyState* pFooterDynamic = NULL;
127     XMLPropertyState* pAllMarginProperty = NULL;
128     XMLPropertyState* pMargins[4] = { NULL, NULL, NULL, NULL };
129     ::std::auto_ptr<XMLPropertyState> pNewMargins[4];
130     XMLPropertyState* pAllHeaderMarginProperty = NULL;
131     XMLPropertyState* pHeaderMargins[4] = { NULL, NULL, NULL, NULL };
132     ::std::auto_ptr<XMLPropertyState> pNewHeaderMargins[4];
133     XMLPropertyState* pAllFooterMarginProperty = NULL;
134     XMLPropertyState* pFooterMargins[4] = { NULL, NULL, NULL, NULL };
135     ::std::auto_ptr<XMLPropertyState> pNewFooterMargins[4];
136 
137     ::std::vector< XMLPropertyState >::iterator aEnd = rProperties.end();
138     for (::std::vector< XMLPropertyState >::iterator aIter = rProperties.begin(); aIter != aEnd; ++aIter)
139     {
140         XMLPropertyState *property = &(*aIter);
141         sal_Int16 nContextID = getPropertySetMapper()->GetEntryContextId(property->mnIndex);
142         if (property->mnIndex >= nStartIndex && property->mnIndex < nEndIndex)
143         {
144             switch (nContextID)
145             {
146                 case CTF_PM_PADDINGALL                  : pAllPaddingProperty = property; break;
147                 case CTF_PM_PADDINGLEFT                 : pPadding[XML_LINE_LEFT] = property; break;
148                 case CTF_PM_PADDINGRIGHT                : pPadding[XML_LINE_RIGHT] = property; break;
149                 case CTF_PM_PADDINGTOP                  : pPadding[XML_LINE_TOP] = property; break;
150                 case CTF_PM_PADDINGBOTTOM               : pPadding[XML_LINE_BOTTOM] = property; break;
151                 case CTF_PM_BORDERALL                   : pAllBorderProperty = property; break;
152                 case CTF_PM_BORDERLEFT                  : pBorders[XML_LINE_LEFT] = property; break;
153                 case CTF_PM_BORDERRIGHT                 : pBorders[XML_LINE_RIGHT] = property; break;
154                 case CTF_PM_BORDERTOP                   : pBorders[XML_LINE_TOP] = property; break;
155                 case CTF_PM_BORDERBOTTOM                : pBorders[XML_LINE_BOTTOM] = property; break;
156                 case CTF_PM_BORDERWIDTHALL              : pAllBorderWidthProperty = property; break;
157                 case CTF_PM_BORDERWIDTHLEFT             : pBorderWidths[XML_LINE_LEFT] = property; break;
158                 case CTF_PM_BORDERWIDTHRIGHT            : pBorderWidths[XML_LINE_RIGHT] = property; break;
159                 case CTF_PM_BORDERWIDTHTOP              : pBorderWidths[XML_LINE_TOP] = property; break;
160                 case CTF_PM_BORDERWIDTHBOTTOM           : pBorderWidths[XML_LINE_BOTTOM] = property; break;
161                 case CTF_PM_HEADERPADDINGALL            : pAllHeaderPaddingProperty = property; break;
162                 case CTF_PM_HEADERPADDINGLEFT           : pHeaderPadding[XML_LINE_LEFT] = property; break;
163                 case CTF_PM_HEADERPADDINGRIGHT          : pHeaderPadding[XML_LINE_RIGHT] = property; break;
164                 case CTF_PM_HEADERPADDINGTOP            : pHeaderPadding[XML_LINE_TOP] = property; break;
165                 case CTF_PM_HEADERPADDINGBOTTOM         : pHeaderPadding[XML_LINE_BOTTOM] = property; break;
166                 case CTF_PM_HEADERBORDERALL             : pAllHeaderBorderProperty = property; break;
167                 case CTF_PM_HEADERBORDERLEFT            : pHeaderBorders[XML_LINE_LEFT] = property; break;
168                 case CTF_PM_HEADERBORDERRIGHT           : pHeaderBorders[XML_LINE_RIGHT] = property; break;
169                 case CTF_PM_HEADERBORDERTOP             : pHeaderBorders[XML_LINE_TOP] = property; break;
170                 case CTF_PM_HEADERBORDERBOTTOM          : pHeaderBorders[XML_LINE_BOTTOM] = property; break;
171                 case CTF_PM_HEADERBORDERWIDTHALL        : pAllHeaderBorderWidthProperty = property; break;
172                 case CTF_PM_HEADERBORDERWIDTHLEFT       : pHeaderBorderWidths[XML_LINE_LEFT] = property; break;
173                 case CTF_PM_HEADERBORDERWIDTHRIGHT      : pHeaderBorderWidths[XML_LINE_RIGHT] = property; break;
174                 case CTF_PM_HEADERBORDERWIDTHTOP        : pHeaderBorderWidths[XML_LINE_TOP] = property; break;
175                 case CTF_PM_HEADERBORDERWIDTHBOTTOM     : pHeaderBorderWidths[XML_LINE_BOTTOM] = property; break;
176                 case CTF_PM_FOOTERPADDINGALL            : pAllFooterPaddingProperty = property; break;
177                 case CTF_PM_FOOTERPADDINGLEFT           : pFooterPadding[XML_LINE_LEFT] = property; break;
178                 case CTF_PM_FOOTERPADDINGRIGHT          : pFooterPadding[XML_LINE_RIGHT] = property; break;
179                 case CTF_PM_FOOTERPADDINGTOP            : pFooterPadding[XML_LINE_TOP] = property; break;
180                 case CTF_PM_FOOTERPADDINGBOTTOM         : pFooterPadding[XML_LINE_BOTTOM] = property; break;
181                 case CTF_PM_FOOTERBORDERALL             : pAllFooterBorderProperty = property; break;
182                 case CTF_PM_FOOTERBORDERLEFT            : pFooterBorders[XML_LINE_LEFT] = property; break;
183                 case CTF_PM_FOOTERBORDERRIGHT           : pFooterBorders[XML_LINE_RIGHT] = property; break;
184                 case CTF_PM_FOOTERBORDERTOP             : pFooterBorders[XML_LINE_TOP] = property; break;
185                 case CTF_PM_FOOTERBORDERBOTTOM          : pFooterBorders[XML_LINE_BOTTOM] = property; break;
186                 case CTF_PM_FOOTERBORDERWIDTHALL        : pAllFooterBorderWidthProperty = property; break;
187                 case CTF_PM_FOOTERBORDERWIDTHLEFT       : pFooterBorderWidths[XML_LINE_LEFT] = property; break;
188                 case CTF_PM_FOOTERBORDERWIDTHRIGHT      : pFooterBorderWidths[XML_LINE_RIGHT] = property; break;
189                 case CTF_PM_FOOTERBORDERWIDTHTOP        : pFooterBorderWidths[XML_LINE_TOP] = property; break;
190                 case CTF_PM_FOOTERBORDERWIDTHBOTTOM     : pFooterBorderWidths[XML_LINE_BOTTOM] = property; break;
191                 case CTF_PM_HEADERHEIGHT                : pHeaderHeight = property; break;
192                 case CTF_PM_HEADERMINHEIGHT             : pHeaderMinHeight = property; break;
193                 case CTF_PM_FOOTERHEIGHT                : pFooterHeight = property; break;
194                 case CTF_PM_FOOTERMINHEIGHT             : pFooterMinHeight = property; break;
195                 case CTF_PM_MARGINALL   :
196                       pAllMarginProperty = property; break;
197                 case CTF_PM_MARGINTOP   :
198                       pMargins[XML_LINE_TOP] = property; break;
199                 case CTF_PM_MARGINBOTTOM:
200                       pMargins[XML_LINE_BOTTOM] = property; break;
201                 case CTF_PM_MARGINLEFT  :
202                       pMargins[XML_LINE_LEFT] = property; break;
203                 case CTF_PM_MARGINRIGHT :
204                       pMargins[XML_LINE_RIGHT] = property; break;
205                 case CTF_PM_HEADERMARGINALL   :
206                       pAllHeaderMarginProperty = property; break;
207                 case CTF_PM_HEADERMARGINTOP   :
208                       pHeaderMargins[XML_LINE_TOP] = property; break;
209                 case CTF_PM_HEADERMARGINBOTTOM:
210                       pHeaderMargins[XML_LINE_BOTTOM] = property; break;
211                 case CTF_PM_HEADERMARGINLEFT  :
212                       pHeaderMargins[XML_LINE_LEFT] = property; break;
213                 case CTF_PM_HEADERMARGINRIGHT :
214                       pHeaderMargins[XML_LINE_RIGHT] = property; break;
215                 case CTF_PM_FOOTERMARGINALL   :
216                       pAllFooterMarginProperty = property; break;
217                 case CTF_PM_FOOTERMARGINTOP   :
218                       pFooterMargins[XML_LINE_TOP] = property; break;
219                 case CTF_PM_FOOTERMARGINBOTTOM:
220                       pFooterMargins[XML_LINE_BOTTOM] = property; break;
221                 case CTF_PM_FOOTERMARGINLEFT  :
222                       pFooterMargins[XML_LINE_LEFT] = property; break;
223                 case CTF_PM_FOOTERMARGINRIGHT :
224                       pFooterMargins[XML_LINE_RIGHT] = property; break;
225             }
226         }
227     }
228 
229     for (sal_uInt16 i = 0; i < 4; i++)
230     {
231         if (pAllMarginProperty && !pMargins[i])
232         {
233             pNewMargins[i].reset(new XMLPropertyState(
234                 pAllMarginProperty->mnIndex + 1 + i,
235                 pAllMarginProperty->maValue));
236         }
237         if (pAllHeaderMarginProperty && !pHeaderMargins[i])
238         {
239             pNewHeaderMargins[i].reset(new XMLPropertyState(
240                 pAllHeaderMarginProperty->mnIndex + 1 + i,
241                 pAllHeaderMarginProperty->maValue));
242         }
243         if (pAllFooterMarginProperty && !pFooterMargins[i])
244         {
245             pNewFooterMargins[i].reset(new XMLPropertyState(
246                 pAllFooterMarginProperty->mnIndex + 1 + i,
247                 pAllFooterMarginProperty->maValue));
248         }
249         if (pAllPaddingProperty && !pPadding[i])
250             pNewPadding[i] = new XMLPropertyState(pAllPaddingProperty->mnIndex + 1 + i, pAllPaddingProperty->maValue);
251         if (pAllBorderProperty && !pBorders[i])
252         {
253             pNewBorders[i] = new XMLPropertyState(pAllBorderProperty->mnIndex + 1 + i, pAllBorderProperty->maValue);
254             pBorders[i] = pNewBorders[i];
255         }
256         if( !pBorderWidths[i] )
257             pBorderWidths[i] = pAllBorderWidthProperty;
258         else
259             pBorderWidths[i]->mnIndex = -1;
260         if( pBorders[i] )
261         {
262             table::BorderLine aBorderLine;
263             pBorders[i]->maValue >>= aBorderLine;
264             if( pBorderWidths[i] )
265             {
266                 table::BorderLine aBorderLineWidth;
267                 pBorderWidths[i]->maValue >>= aBorderLineWidth;
268                 aBorderLine.OuterLineWidth = aBorderLineWidth.OuterLineWidth;
269                 aBorderLine.InnerLineWidth = aBorderLineWidth.InnerLineWidth;
270                 aBorderLine.LineDistance = aBorderLineWidth.LineDistance;
271                 pBorders[i]->maValue <<= aBorderLine;
272             }
273         }
274         if (pAllHeaderPaddingProperty && !pHeaderPadding[i])
275             pHeaderNewPadding[i] = new XMLPropertyState(pAllHeaderPaddingProperty->mnIndex + 1 + i, pAllHeaderPaddingProperty->maValue);
276         if (pAllHeaderBorderProperty && !pHeaderBorders[i])
277             pHeaderNewBorders[i] = new XMLPropertyState(pAllHeaderBorderProperty->mnIndex + 1 + i, pAllHeaderBorderProperty->maValue);
278         if( !pHeaderBorderWidths[i] )
279             pHeaderBorderWidths[i] = pAllHeaderBorderWidthProperty;
280         else
281             pHeaderBorderWidths[i]->mnIndex = -1;
282         if( pHeaderBorders[i] )
283         {
284             table::BorderLine aBorderLine;
285             pHeaderBorders[i]->maValue >>= aBorderLine;
286             if( pHeaderBorderWidths[i] )
287             {
288                 table::BorderLine aBorderLineWidth;
289                 pHeaderBorderWidths[i]->maValue >>= aBorderLineWidth;
290                 aBorderLine.OuterLineWidth = aBorderLineWidth.OuterLineWidth;
291                 aBorderLine.InnerLineWidth = aBorderLineWidth.InnerLineWidth;
292                 aBorderLine.LineDistance = aBorderLineWidth.LineDistance;
293                 pHeaderBorders[i]->maValue <<= aBorderLine;
294             }
295         }
296         if (pAllFooterPaddingProperty && !pFooterPadding[i])
297             pFooterNewPadding[i] = new XMLPropertyState(pAllFooterPaddingProperty->mnIndex + 1 + i, pAllFooterPaddingProperty->maValue);
298         if (pAllFooterBorderProperty && !pFooterBorders[i])
299             pFooterNewBorders[i] = new XMLPropertyState(pAllFooterBorderProperty->mnIndex + 1 + i, pAllFooterBorderProperty->maValue);
300         if( !pFooterBorderWidths[i] )
301             pFooterBorderWidths[i] = pAllFooterBorderWidthProperty;
302         else
303             pFooterBorderWidths[i]->mnIndex = -1;
304         if( pFooterBorders[i] )
305         {
306             table::BorderLine aBorderLine;
307             pFooterBorders[i]->maValue >>= aBorderLine;
308             if( pFooterBorderWidths[i] )
309             {
310                 table::BorderLine aBorderLineWidth;
311                 pFooterBorderWidths[i]->maValue >>= aBorderLineWidth;
312                 aBorderLine.OuterLineWidth = aBorderLineWidth.OuterLineWidth;
313                 aBorderLine.InnerLineWidth = aBorderLineWidth.InnerLineWidth;
314                 aBorderLine.LineDistance = aBorderLineWidth.LineDistance;
315                 pFooterBorders[i]->maValue <<= aBorderLine;
316             }
317         }
318     }
319 
320     if (pHeaderHeight)
321     {
322         sal_Bool bValue(sal_False);
323         uno::Any aAny;
324         aAny.setValue( &bValue, ::getBooleanCppuType() );
325         pHeaderDynamic = new XMLPropertyState(pHeaderHeight->mnIndex + 2, aAny);
326     }
327     if (pHeaderMinHeight)
328     {
329         sal_Bool bValue(sal_True);
330         uno::Any aAny;
331         aAny.setValue( &bValue, ::getBooleanCppuType() );
332         pHeaderDynamic = new XMLPropertyState(pHeaderMinHeight->mnIndex + 1, aAny);
333     }
334     if (pFooterHeight)
335     {
336         sal_Bool bValue(sal_False);
337         uno::Any aAny;
338         aAny.setValue( &bValue, ::getBooleanCppuType() );
339         pFooterDynamic = new XMLPropertyState(pFooterHeight->mnIndex + 2, aAny);
340     }
341     if (pFooterMinHeight)
342     {
343         sal_Bool bValue(sal_True);
344         uno::Any aAny;
345         aAny.setValue( &bValue, ::getBooleanCppuType() );
346         pFooterDynamic = new XMLPropertyState(pFooterMinHeight->mnIndex + 1, aAny);
347     }
348     for (sal_uInt16 i = 0; i < 4; i++)
349     {
350         if (pNewMargins[i].get())
351         {
352             rProperties.push_back(*pNewMargins[i]);
353         }
354         if (pNewHeaderMargins[i].get())
355         {
356             rProperties.push_back(*pNewHeaderMargins[i]);
357         }
358         if (pNewFooterMargins[i].get())
359         {
360             rProperties.push_back(*pNewFooterMargins[i]);
361         }
362         if (pNewPadding[i])
363         {
364             rProperties.push_back(*pNewPadding[i]);
365             delete pNewPadding[i];
366         }
367         if (pNewBorders[i])
368         {
369             rProperties.push_back(*pNewBorders[i]);
370             delete pNewBorders[i];
371         }
372         if (pHeaderNewPadding[i])
373         {
374             rProperties.push_back(*pHeaderNewPadding[i]);
375             delete pHeaderNewPadding[i];
376         }
377         if (pHeaderNewBorders[i])
378         {
379             rProperties.push_back(*pHeaderNewBorders[i]);
380             delete pHeaderNewBorders[i];
381         }
382         if (pFooterNewPadding[i])
383         {
384             rProperties.push_back(*pFooterNewPadding[i]);
385             delete pFooterNewPadding[i];
386         }
387         if (pFooterNewBorders[i])
388         {
389             rProperties.push_back(*pFooterNewBorders[i]);
390             delete pFooterNewBorders[i];
391         }
392     }
393     if(pHeaderDynamic)
394     {
395         rProperties.push_back(*pHeaderDynamic);
396         delete pHeaderDynamic;
397     }
398     if(pFooterDynamic)
399     {
400         rProperties.push_back(*pFooterDynamic);
401         delete pFooterDynamic;
402     }
403 }
404 
405