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 44 PageMasterImportPropertyMapper::PageMasterImportPropertyMapper( 45 const UniReference< XMLPropertySetMapper >& rMapper, 46 SvXMLImport& rImp ) : 47 SvXMLImportPropertyMapper( rMapper, rImp ), 48 rImport( rImp ) 49 { 50 } 51 52 PageMasterImportPropertyMapper::~PageMasterImportPropertyMapper() 53 { 54 } 55 56 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 90 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