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