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 #include <com/sun/star/xml/sax/SAXParseException.hpp> 27 #include <com/sun/star/xml/sax/XExtendedDocumentHandler.hpp> 28 #include <com/sun/star/xml/sax/SAXException.hpp> 29 #include <com/sun/star/xml/sax/XDocumentHandler.hpp> 30 #include <com/sun/star/xml/sax/XAttributeList.hpp> 31 #include <com/sun/star/xml/sax/XLocator.hpp> 32 #include <com/sun/star/container/XNameContainer.hpp> 33 #include <com/sun/star/beans/XPropertySet.hpp> 34 #include <com/sun/star/style/XStyleFamiliesSupplier.hpp> 35 #include <com/sun/star/style/XAutoStylesSupplier.hpp> 36 #include <com/sun/star/style/XAutoStyleFamily.hpp> 37 #ifndef _XMLOFF_PAGEMASTERPROPMAPPER_HXX 38 #include "PageMasterPropMapper.hxx" 39 #endif 40 #include <tools/debug.hxx> 41 #include <tools/list.hxx> 42 #include <svl/cntnrsrt.hxx> 43 #include <svl/itemset.hxx> 44 #include <xmloff/nmspmap.hxx> 45 #include "xmloff/xmlnmspe.hxx" 46 #include <xmloff/xmltoken.hxx> 47 48 #ifndef _XMLOFF_FAMILIES_HXX 49 #include <xmloff/families.hxx> 50 #endif 51 #include <xmloff/xmlimp.hxx> 52 #include <xmloff/xmlnumi.hxx> 53 #include <xmloff/xmlimppr.hxx> 54 #include <xmloff/xmlstyle.hxx> 55 #ifndef _XMLOFF_TXTSTYLI_HXX 56 #include <xmloff/txtstyli.hxx> 57 #endif 58 #ifndef _XMLOFF_TXTPRMAP_HXX 59 #include <xmloff/txtprmap.hxx> 60 #endif 61 #include <xmloff/xmlnumfi.hxx> 62 #include "XMLChartStyleContext.hxx" 63 #include "XMLChartPropertySetMapper.hxx" 64 #include <xmloff/XMLShapeStyleContext.hxx> 65 #include "FillStyleContext.hxx" 66 #include "XMLFootnoteConfigurationImportContext.hxx" 67 #include "XMLIndexBibliographyConfigurationContext.hxx" 68 #include "XMLLineNumberingImportContext.hxx" 69 #include "PageMasterImportContext.hxx" 70 #include "PageMasterImportPropMapper.hxx" 71 72 using ::rtl::OUString; 73 using ::rtl::OUStringBuffer; 74 75 using namespace ::com::sun::star; 76 using namespace ::com::sun::star::uno; 77 using namespace ::com::sun::star::container; 78 using namespace ::com::sun::star::style; 79 using namespace ::xmloff::token; 80 81 // --------------------------------------------------------------------- 82 83 static __FAR_DATA SvXMLTokenMapEntry aStyleStylesElemTokenMap[] = 84 { 85 { XML_NAMESPACE_STYLE, XML_STYLE, XML_TOK_STYLE_STYLE }, 86 { XML_NAMESPACE_STYLE, XML_PAGE_LAYOUT, XML_TOK_STYLE_PAGE_MASTER }, 87 { XML_NAMESPACE_TEXT, XML_LIST_STYLE, XML_TOK_TEXT_LIST_STYLE }, 88 { XML_NAMESPACE_TEXT, XML_OUTLINE_STYLE, XML_TOK_TEXT_OUTLINE }, 89 { XML_NAMESPACE_STYLE, XML_DEFAULT_STYLE, XML_TOK_STYLE_DEFAULT_STYLE }, 90 { XML_NAMESPACE_DRAW, XML_GRADIENT, XML_TOK_STYLES_GRADIENTSTYLES }, 91 { XML_NAMESPACE_DRAW, XML_HATCH, XML_TOK_STYLES_HATCHSTYLES }, 92 { XML_NAMESPACE_DRAW, XML_FILL_IMAGE, XML_TOK_STYLES_BITMAPSTYLES }, 93 { XML_NAMESPACE_DRAW, XML_OPACITY, XML_TOK_STYLES_TRANSGRADIENTSTYLES }, 94 { XML_NAMESPACE_DRAW, XML_MARKER, XML_TOK_STYLES_MARKERSTYLES }, 95 { XML_NAMESPACE_DRAW, XML_STROKE_DASH, XML_TOK_STYLES_DASHSTYLES }, 96 { XML_NAMESPACE_TEXT, XML_NOTES_CONFIGURATION, XML_TOK_TEXT_NOTE_CONFIG }, 97 { XML_NAMESPACE_TEXT, XML_BIBLIOGRAPHY_CONFIGURATION, XML_TOK_TEXT_BIBLIOGRAPHY_CONFIG }, 98 { XML_NAMESPACE_TEXT, XML_LINENUMBERING_CONFIGURATION,XML_TOK_TEXT_LINENUMBERING_CONFIG }, 99 { XML_NAMESPACE_STYLE, XML_DEFAULT_PAGE_LAYOUT, XML_TOK_STYLE_DEFAULT_PAGE_LAYOUT }, 100 XML_TOKEN_MAP_END 101 }; 102 103 const SvXMLTokenMap& SvXMLStylesContext::GetStyleStylesElemTokenMap() 104 { 105 if( !mpStyleStylesElemTokenMap ) 106 mpStyleStylesElemTokenMap = 107 new SvXMLTokenMap( aStyleStylesElemTokenMap ); 108 109 return *mpStyleStylesElemTokenMap; 110 } 111 112 // --------------------------------------------------------------------- 113 114 void SvXMLStyleContext::SetAttribute( sal_uInt16 nPrefixKey, 115 const OUString& rLocalName, 116 const OUString& rValue ) 117 { 118 // TODO: use a map here 119 if( XML_NAMESPACE_STYLE == nPrefixKey ) 120 { 121 if( IsXMLToken( rLocalName, XML_FAMILY ) ) 122 { 123 if( IsXMLToken( rValue, XML_PARAGRAPH ) ) 124 mnFamily = (sal_uInt16)SFX_STYLE_FAMILY_PARA; 125 else if( IsXMLToken( rValue, XML_TEXT ) ) 126 mnFamily = (sal_uInt16)SFX_STYLE_FAMILY_CHAR; 127 } 128 else if( IsXMLToken( rLocalName, XML_NAME ) ) 129 { 130 maName = rValue; 131 } 132 else if( IsXMLToken( rLocalName, XML_DISPLAY_NAME ) ) 133 { 134 maDisplayName = rValue; 135 } 136 else if( IsXMLToken( rLocalName, XML_PARENT_STYLE_NAME ) ) 137 { 138 maParentName = rValue; 139 } 140 else if( IsXMLToken( rLocalName, XML_NEXT_STYLE_NAME ) ) 141 { 142 maFollow = rValue; 143 } 144 else if( IsXMLToken( rLocalName, XML_HELP_FILE_NAME ) ) 145 { 146 maHelpFile = rValue; 147 } 148 else if( IsXMLToken( rLocalName, XML_HELP_ID ) ) 149 { 150 sal_Int32 nTmp = rValue.toInt32(); 151 mnHelpId = 152 (nTmp < 0L) ? 0U : ( (nTmp > USHRT_MAX) ? USHRT_MAX 153 : (sal_uInt16)nTmp ); 154 } 155 } 156 } 157 158 TYPEINIT1( SvXMLStyleContext, SvXMLImportContext ); 159 160 SvXMLStyleContext::SvXMLStyleContext( 161 SvXMLImport& rImp, sal_uInt16 nPrfx, 162 const OUString& rLName, 163 const uno::Reference< xml::sax::XAttributeList >&, 164 sal_uInt16 nFam, sal_Bool bDefault ) : 165 SvXMLImportContext( rImp, nPrfx, rLName ), 166 mnHelpId( UCHAR_MAX ), 167 mnFamily( nFam ), 168 mbValid( sal_True ), 169 mbNew( sal_True ), 170 mbDefaultStyle( bDefault ) 171 { 172 } 173 174 SvXMLStyleContext::~SvXMLStyleContext() 175 { 176 } 177 178 SvXMLImportContext *SvXMLStyleContext::CreateChildContext( sal_uInt16 nPrefix, 179 const OUString& rLocalName, 180 const uno::Reference< xml::sax::XAttributeList > & ) 181 { 182 return new SvXMLImportContext( GetImport(), nPrefix, rLocalName );; 183 } 184 185 void SvXMLStyleContext::StartElement( const uno::Reference< xml::sax::XAttributeList > & xAttrList ) 186 { 187 sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; 188 for( sal_Int16 i=0; i < nAttrCount; i++ ) 189 { 190 const OUString& rAttrName = xAttrList->getNameByIndex( i ); 191 OUString aLocalName; 192 sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName, &aLocalName ); 193 const OUString& rValue = xAttrList->getValueByIndex( i ); 194 195 SetAttribute( nPrefix, aLocalName, rValue ); 196 } 197 } 198 199 void SvXMLStyleContext::SetDefaults() 200 { 201 } 202 203 void SvXMLStyleContext::CreateAndInsert( sal_Bool /*bOverwrite*/ ) 204 { 205 } 206 207 void SvXMLStyleContext::CreateAndInsertLate( sal_Bool /*bOverwrite*/ ) 208 { 209 } 210 211 void SvXMLStyleContext::Finish( sal_Bool /*bOverwrite*/ ) 212 { 213 } 214 215 sal_Bool SvXMLStyleContext::IsTransient() const 216 { 217 return sal_False; 218 } 219 220 // --------------------------------------------------------------------- 221 222 class SvXMLStyleIndex_Impl 223 { 224 OUString sName; 225 sal_uInt16 nFamily; 226 const SvXMLStyleContext *pStyle; 227 228 public: 229 230 SvXMLStyleIndex_Impl( sal_uInt16 nFam, const OUString& rName ) : 231 sName( rName ), 232 nFamily( nFam ), 233 pStyle ( 0 ) 234 { 235 } 236 237 SvXMLStyleIndex_Impl( const SvXMLStyleContext *pStl ) : 238 sName( pStl->GetName() ), 239 nFamily( pStl->GetFamily() ), 240 pStyle ( pStl ) 241 { 242 } 243 244 const OUString& GetName() const { return sName; } 245 sal_uInt16 GetFamily() const { return nFamily; } 246 const SvXMLStyleContext *GetStyle() const { return pStyle; } 247 }; 248 249 int SvXMLStyleIndexCmp_Impl( const SvXMLStyleIndex_Impl& r1, 250 const SvXMLStyleIndex_Impl& r2 ) 251 { 252 int nRet; 253 if( (sal_uInt16)r1.GetFamily() < (sal_uInt16)r2.GetFamily() ) 254 nRet = -1; 255 else if( (sal_uInt16)r1.GetFamily() > (sal_uInt16)r2.GetFamily() ) 256 nRet = 1; 257 else 258 nRet = (int)r1.GetName().compareTo( r2.GetName() ); 259 260 return nRet; 261 } 262 263 // --------------------------------------------------------------------- 264 265 typedef SvXMLStyleContext *SvXMLStyleContextPtr; 266 DECLARE_LIST( SvXMLStyleContexts_Impl, SvXMLStyleContextPtr ) 267 268 DECLARE_CONTAINER_SORT_DEL( SvXMLStyleIndices_Impl, SvXMLStyleIndex_Impl ) 269 IMPL_CONTAINER_SORT( SvXMLStyleIndices_Impl, SvXMLStyleIndex_Impl, 270 SvXMLStyleIndexCmp_Impl ) 271 272 273 class SvXMLStylesContext_Impl 274 { 275 SvXMLStyleContexts_Impl aStyles; 276 SvXMLStyleIndices_Impl *pIndices; 277 sal_Bool bAutomaticStyle; 278 279 #ifdef DBG_UTIL 280 sal_uInt32 nIndexCreated; 281 #endif 282 283 void FlushIndex() { delete pIndices; pIndices = 0; } 284 285 public: 286 SvXMLStylesContext_Impl( sal_Bool bAuto ); 287 ~SvXMLStylesContext_Impl(); 288 289 sal_uInt32 GetStyleCount() const { return aStyles.Count(); } 290 291 const SvXMLStyleContext *GetStyle( sal_uInt32 i ) const 292 { 293 return i < aStyles.Count() ? aStyles.GetObject(i) : 0; 294 } 295 296 SvXMLStyleContext *GetStyle( sal_uInt32 i ) 297 { 298 return i < aStyles.Count() ? aStyles.GetObject(i) : 0; 299 } 300 301 inline void AddStyle( SvXMLStyleContext *pStyle ); 302 void Clear(); 303 304 const SvXMLStyleContext *FindStyleChildContext( sal_uInt16 nFamily, 305 const OUString& rName, sal_Bool bCreateIndex ) const; 306 sal_Bool IsAutomaticStyle() const { return bAutomaticStyle; } 307 }; 308 309 SvXMLStylesContext_Impl::SvXMLStylesContext_Impl( sal_Bool bAuto ) : 310 aStyles( 20, 5 ), 311 pIndices( 0 ), 312 bAutomaticStyle( bAuto ) 313 #ifdef DBG_UTIL 314 , nIndexCreated( 0 ) 315 #endif 316 {} 317 318 SvXMLStylesContext_Impl::~SvXMLStylesContext_Impl() 319 { 320 delete pIndices; 321 322 while( aStyles.Count() ) 323 { 324 SvXMLStyleContext *pStyle = aStyles.GetObject(0); 325 aStyles.Remove( 0UL ); 326 pStyle->ReleaseRef(); 327 } 328 } 329 330 inline void SvXMLStylesContext_Impl::AddStyle( SvXMLStyleContext *pStyle ) 331 { 332 aStyles.Insert( pStyle, aStyles.Count() ); 333 pStyle->AddRef(); 334 335 FlushIndex(); 336 } 337 338 void SvXMLStylesContext_Impl::Clear() 339 { 340 FlushIndex(); 341 342 while( aStyles.Count() ) 343 { 344 SvXMLStyleContext *pStyle = aStyles.GetObject(0); 345 aStyles.Remove( 0UL ); 346 pStyle->ReleaseRef(); 347 } 348 } 349 350 const SvXMLStyleContext *SvXMLStylesContext_Impl::FindStyleChildContext( 351 sal_uInt16 nFamily, 352 const OUString& rName, 353 sal_Bool bCreateIndex ) const 354 { 355 const SvXMLStyleContext *pStyle = 0; 356 357 if( !pIndices && bCreateIndex && aStyles.Count() > 0 ) 358 { 359 #ifdef DBG_UTIL 360 DBG_ASSERT( 0==nIndexCreated, 361 "Performance warning: sdbcx::Index created multiple times" ); 362 #endif 363 ((SvXMLStylesContext_Impl *)this)->pIndices = 364 new SvXMLStyleIndices_Impl( 365 sal::static_int_cast< sal_uInt16 >(aStyles.Count()), 5 ); 366 for( sal_uInt32 i=0; i < aStyles.Count(); i++ ) 367 { 368 SvXMLStyleIndex_Impl* pStyleIndex = new SvXMLStyleIndex_Impl( aStyles.GetObject(i)); 369 if (!pIndices->Insert( pStyleIndex )) 370 { 371 DBG_ERROR("Here is a double Style"); 372 delete pStyleIndex; 373 } 374 } 375 #ifdef DBG_UTIL 376 ((SvXMLStylesContext_Impl *)this)->nIndexCreated++; 377 #endif 378 } 379 380 if( pIndices ) 381 { 382 SvXMLStyleIndex_Impl aIndex( nFamily, rName ); 383 sal_uLong nPos = 0; 384 if( pIndices->Seek_Entry( &aIndex, &nPos ) ) 385 pStyle = pIndices->GetObject( nPos )->GetStyle(); 386 } 387 else 388 { 389 for( sal_uInt32 i=0; !pStyle && i < aStyles.Count(); i++ ) 390 { 391 const SvXMLStyleContext *pS = aStyles.GetObject( i ); 392 if( pS->GetFamily() == nFamily && 393 pS->GetName() == rName ) 394 pStyle = pS; 395 } 396 } 397 return pStyle; 398 } 399 400 // --------------------------------------------------------------------- 401 402 TYPEINIT1( SvXMLStylesContext, SvXMLImportContext ); 403 404 sal_uInt32 SvXMLStylesContext::GetStyleCount() const 405 { 406 return mpImpl->GetStyleCount(); 407 } 408 409 SvXMLStyleContext *SvXMLStylesContext::GetStyle( sal_uInt32 i ) 410 { 411 return mpImpl->GetStyle( i ); 412 } 413 414 const SvXMLStyleContext *SvXMLStylesContext::GetStyle( sal_uInt32 i ) const 415 { 416 return mpImpl->GetStyle( i ); 417 } 418 419 sal_Bool SvXMLStylesContext::IsAutomaticStyle() const 420 { 421 return mpImpl->IsAutomaticStyle(); 422 } 423 424 SvXMLStyleContext *SvXMLStylesContext::CreateStyleChildContext( 425 sal_uInt16 p_nPrefix, 426 const OUString& rLocalName, 427 const uno::Reference< xml::sax::XAttributeList > & xAttrList ) 428 { 429 SvXMLStyleContext *pStyle = NULL; 430 431 if(GetImport().GetDataStylesImport()) 432 { 433 pStyle = GetImport().GetDataStylesImport()->CreateChildContext(GetImport(), p_nPrefix, 434 rLocalName, xAttrList, *this); 435 } 436 437 if (!pStyle) 438 { 439 const SvXMLTokenMap& rTokenMap = GetStyleStylesElemTokenMap(); 440 sal_uInt16 nToken = rTokenMap.Get( p_nPrefix, rLocalName ); 441 switch( nToken ) 442 { 443 case XML_TOK_STYLE_STYLE: 444 case XML_TOK_STYLE_DEFAULT_STYLE: 445 { 446 sal_uInt16 nFamily = 0; 447 sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; 448 for( sal_Int16 i=0; i < nAttrCount; i++ ) 449 { 450 const OUString& rAttrName = xAttrList->getNameByIndex( i ); 451 OUString aLocalName; 452 sal_uInt16 nPrefix = 453 GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName, 454 &aLocalName ); 455 if( XML_NAMESPACE_STYLE == nPrefix && 456 IsXMLToken( aLocalName, XML_FAMILY ) ) 457 { 458 const OUString& rValue = xAttrList->getValueByIndex( i ); 459 nFamily = GetFamily( rValue ); 460 break; 461 } 462 } 463 pStyle = XML_TOK_STYLE_STYLE==nToken 464 ? CreateStyleStyleChildContext( nFamily, p_nPrefix, 465 rLocalName, xAttrList ) 466 : CreateDefaultStyleStyleChildContext( nFamily, p_nPrefix, 467 rLocalName, xAttrList ); 468 } 469 break; 470 case XML_TOK_STYLE_PAGE_MASTER: 471 case XML_TOK_STYLE_DEFAULT_PAGE_LAYOUT: 472 { 473 //there is not page family in odf now, so I specify one for it 474 sal_Bool bDefaultStyle = XML_TOK_STYLE_DEFAULT_PAGE_LAYOUT == nToken 475 ? sal_True: sal_False; 476 pStyle = new PageStyleContext( GetImport(), p_nPrefix, 477 rLocalName, xAttrList, *this, bDefaultStyle ); 478 } 479 break; 480 case XML_TOK_TEXT_LIST_STYLE: 481 pStyle = new SvxXMLListStyleContext( GetImport(), p_nPrefix, 482 rLocalName, xAttrList ); 483 break; 484 case XML_TOK_TEXT_OUTLINE: 485 pStyle = new SvxXMLListStyleContext( GetImport(), p_nPrefix, 486 rLocalName, xAttrList, sal_True ); 487 break; 488 case XML_TOK_TEXT_NOTE_CONFIG: 489 #ifndef SVX_LIGHT 490 pStyle = new XMLFootnoteConfigurationImportContext(GetImport(), 491 p_nPrefix, 492 rLocalName, 493 xAttrList); 494 #else 495 // create default context to skip content 496 pStyle = new SvXMLStyleContext( GetImport(), nPrefix, rLocalName, xAttrList ); 497 #endif // #ifndef SVX_LIGHT 498 break; 499 500 case XML_TOK_TEXT_BIBLIOGRAPHY_CONFIG: 501 #ifndef SVX_LIGHT 502 pStyle = new XMLIndexBibliographyConfigurationContext( 503 GetImport(), p_nPrefix, rLocalName, xAttrList); 504 #else 505 // create default context to skip content 506 pStyle = new SvXMLStyleContext( GetImport(), p_nPrefix, rLocalName, xAttrList ); 507 #endif // #ifndef SVX_LIGHT 508 break; 509 510 case XML_TOK_TEXT_LINENUMBERING_CONFIG: 511 #ifndef SVX_LIGHT 512 pStyle = new XMLLineNumberingImportContext( 513 GetImport(), p_nPrefix, rLocalName, xAttrList); 514 #else 515 // create default context to skip content 516 pStyle = new SvXMLStyleContext( GetImport(), p_nPrefix, rLocalName, xAttrList ); 517 #endif // #ifndef SVX_LIGHT 518 break; 519 520 // 521 // FillStyles 522 // 523 case XML_TOK_STYLES_GRADIENTSTYLES: 524 { 525 pStyle = new XMLGradientStyleContext( GetImport(), p_nPrefix, rLocalName, xAttrList ); 526 break; 527 } 528 case XML_TOK_STYLES_HATCHSTYLES: 529 { 530 pStyle = new XMLHatchStyleContext( GetImport(), p_nPrefix, rLocalName, xAttrList ); 531 break; 532 } 533 case XML_TOK_STYLES_BITMAPSTYLES: 534 { 535 pStyle = new XMLBitmapStyleContext( GetImport(), p_nPrefix, rLocalName, xAttrList ); 536 break; 537 } 538 case XML_TOK_STYLES_TRANSGRADIENTSTYLES: 539 { 540 pStyle = new XMLTransGradientStyleContext( GetImport(), p_nPrefix, rLocalName, xAttrList ); 541 break; 542 } 543 case XML_TOK_STYLES_MARKERSTYLES: 544 { 545 pStyle = new XMLMarkerStyleContext( GetImport(), p_nPrefix, rLocalName, xAttrList ); 546 break; 547 } 548 case XML_TOK_STYLES_DASHSTYLES: 549 { 550 pStyle = new XMLDashStyleContext( GetImport(), p_nPrefix, rLocalName, xAttrList ); 551 break; 552 } 553 } 554 } 555 556 return pStyle; 557 } 558 559 SvXMLStyleContext *SvXMLStylesContext::CreateStyleStyleChildContext( 560 sal_uInt16 nFamily, sal_uInt16 nPrefix, const OUString& rLocalName, 561 const uno::Reference< xml::sax::XAttributeList > & xAttrList ) 562 { 563 SvXMLStyleContext *pStyle = 0; 564 565 switch( nFamily ) 566 { 567 case XML_STYLE_FAMILY_TEXT_PARAGRAPH: 568 case XML_STYLE_FAMILY_TEXT_TEXT: 569 case XML_STYLE_FAMILY_TEXT_SECTION: 570 pStyle = new XMLTextStyleContext( GetImport(), nPrefix, rLocalName, 571 xAttrList, *this, nFamily ); 572 break; 573 574 case XML_STYLE_FAMILY_TEXT_RUBY: 575 pStyle = new XMLPropStyleContext( GetImport(), nPrefix, rLocalName, 576 xAttrList, *this, nFamily ); 577 break; 578 case XML_STYLE_FAMILY_SCH_CHART_ID: 579 pStyle = new XMLChartStyleContext( GetImport(), nPrefix, rLocalName, 580 xAttrList, *this, nFamily ); 581 break; 582 583 case XML_STYLE_FAMILY_SD_GRAPHICS_ID: 584 case XML_STYLE_FAMILY_SD_PRESENTATION_ID: 585 case XML_STYLE_FAMILY_SD_POOL_ID: 586 pStyle = new XMLShapeStyleContext( GetImport(), nPrefix, rLocalName, 587 xAttrList, *this, nFamily ); 588 } 589 590 return pStyle; 591 } 592 593 SvXMLStyleContext *SvXMLStylesContext::CreateDefaultStyleStyleChildContext( 594 sal_uInt16 /*nFamily*/, sal_uInt16 /*nPrefix*/, const OUString& /*rLocalName*/, 595 const uno::Reference< xml::sax::XAttributeList > & ) 596 { 597 return 0; 598 } 599 600 601 sal_Bool SvXMLStylesContext::InsertStyleFamily( sal_uInt16 ) const 602 { 603 return sal_True; 604 } 605 606 sal_uInt16 SvXMLStylesContext::GetFamily( 607 const ::rtl::OUString& rValue ) const 608 { 609 sal_uInt16 nFamily = 0U; 610 if( IsXMLToken( rValue, XML_PARAGRAPH ) ) 611 { 612 nFamily = XML_STYLE_FAMILY_TEXT_PARAGRAPH; 613 } 614 else if( IsXMLToken( rValue, XML_TEXT ) ) 615 { 616 nFamily = XML_STYLE_FAMILY_TEXT_TEXT; 617 } 618 else if( IsXMLToken( rValue, XML_DATA_STYLE ) ) 619 { 620 nFamily = XML_STYLE_FAMILY_DATA_STYLE; 621 } 622 else if ( IsXMLToken( rValue, XML_SECTION ) ) 623 { 624 nFamily = XML_STYLE_FAMILY_TEXT_SECTION; 625 } 626 else if( IsXMLToken( rValue, XML_TABLE ) ) 627 { 628 nFamily = XML_STYLE_FAMILY_TABLE_TABLE; 629 } 630 else if( IsXMLToken( rValue, XML_TABLE_COLUMN ) ) 631 nFamily = XML_STYLE_FAMILY_TABLE_COLUMN; 632 else if( IsXMLToken( rValue, XML_TABLE_ROW ) ) 633 nFamily = XML_STYLE_FAMILY_TABLE_ROW; 634 else if( IsXMLToken( rValue, XML_TABLE_CELL ) ) 635 nFamily = XML_STYLE_FAMILY_TABLE_CELL; 636 else if( rValue.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(XML_STYLE_FAMILY_SD_GRAPHICS_NAME))) 637 { 638 nFamily = XML_STYLE_FAMILY_SD_GRAPHICS_ID; 639 } 640 else if( rValue.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(XML_STYLE_FAMILY_SD_PRESENTATION_NAME))) 641 { 642 nFamily = XML_STYLE_FAMILY_SD_PRESENTATION_ID; 643 } 644 else if( rValue.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(XML_STYLE_FAMILY_SD_POOL_NAME))) 645 { 646 nFamily = XML_STYLE_FAMILY_SD_POOL_ID; 647 } 648 else if( rValue.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(XML_STYLE_FAMILY_SD_DRAWINGPAGE_NAME))) 649 { 650 nFamily = XML_STYLE_FAMILY_SD_DRAWINGPAGE_ID; 651 } 652 else if( rValue.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( XML_STYLE_FAMILY_SCH_CHART_NAME ))) 653 { 654 nFamily = XML_STYLE_FAMILY_SCH_CHART_ID; 655 } 656 else if ( IsXMLToken( rValue, XML_RUBY ) ) 657 { 658 nFamily = XML_STYLE_FAMILY_TEXT_RUBY; 659 } 660 661 return nFamily; 662 } 663 664 UniReference < SvXMLImportPropertyMapper > SvXMLStylesContext::GetImportPropertyMapper( 665 sal_uInt16 nFamily ) const 666 { 667 UniReference < SvXMLImportPropertyMapper > xMapper; 668 669 switch( nFamily ) 670 { 671 case XML_STYLE_FAMILY_TEXT_PARAGRAPH: 672 if( !mxParaImpPropMapper.is() ) 673 { 674 SvXMLStylesContext * pThis = (SvXMLStylesContext *)this; 675 pThis->mxParaImpPropMapper = 676 pThis->GetImport().GetTextImport() 677 ->GetParaImportPropertySetMapper(); 678 } 679 xMapper = mxParaImpPropMapper; 680 break; 681 case XML_STYLE_FAMILY_TEXT_TEXT: 682 if( !mxTextImpPropMapper.is() ) 683 { 684 SvXMLStylesContext * pThis = (SvXMLStylesContext *)this; 685 pThis->mxTextImpPropMapper = 686 pThis->GetImport().GetTextImport() 687 ->GetTextImportPropertySetMapper(); 688 } 689 xMapper = mxTextImpPropMapper; 690 break; 691 692 case XML_STYLE_FAMILY_TEXT_SECTION: 693 // don't cache section mapper, as it's rarely used 694 // *sigh*, cast to non-const, because this is a const method, 695 // but SvXMLImport::GetTextImport() isn't. 696 xMapper = ((SvXMLStylesContext*)this)->GetImport().GetTextImport()-> 697 GetSectionImportPropertySetMapper(); 698 break; 699 700 case XML_STYLE_FAMILY_TEXT_RUBY: 701 // don't cache section mapper, as it's rarely used 702 // *sigh*, cast to non-const, because this is a const method, 703 // but SvXMLImport::GetTextImport() isn't. 704 xMapper = ((SvXMLStylesContext*)this)->GetImport().GetTextImport()-> 705 GetRubyImportPropertySetMapper(); 706 break; 707 708 case XML_STYLE_FAMILY_SD_GRAPHICS_ID: 709 case XML_STYLE_FAMILY_SD_PRESENTATION_ID: 710 case XML_STYLE_FAMILY_SD_POOL_ID: 711 if(!mxShapeImpPropMapper.is()) 712 { 713 UniReference< XMLShapeImportHelper > aImpHelper = ((SvXMLImport&)GetImport()).GetShapeImport(); 714 ((SvXMLStylesContext*)this)->mxShapeImpPropMapper = 715 aImpHelper->GetPropertySetMapper(); 716 } 717 xMapper = mxShapeImpPropMapper; 718 break; 719 #ifndef SVX_LIGHT 720 case XML_STYLE_FAMILY_SCH_CHART_ID: 721 if( ! mxChartImpPropMapper.is() ) 722 { 723 XMLPropertySetMapper *pPropMapper = new XMLChartPropertySetMapper(); 724 mxChartImpPropMapper = new XMLChartImportPropertyMapper( pPropMapper, GetImport() ); 725 } 726 xMapper = mxChartImpPropMapper; 727 break; 728 #endif 729 case XML_STYLE_FAMILY_PAGE_MASTER: 730 if( ! mxPageImpPropMapper.is() ) 731 { 732 XMLPropertySetMapper *pPropMapper = 733 new XMLPageMasterPropSetMapper(); 734 mxPageImpPropMapper = 735 new PageMasterImportPropertyMapper( pPropMapper, 736 ((SvXMLStylesContext*)this)->GetImport() ); 737 } 738 xMapper = mxPageImpPropMapper; 739 break; 740 } 741 742 return xMapper; 743 } 744 745 Reference < XAutoStyleFamily > SvXMLStylesContext::GetAutoStyles( sal_uInt16 nFamily ) const 746 { 747 Reference < XAutoStyleFamily > xAutoStyles; 748 if( XML_STYLE_FAMILY_TEXT_TEXT == nFamily || XML_STYLE_FAMILY_TEXT_PARAGRAPH == nFamily) 749 { 750 bool bPara = XML_STYLE_FAMILY_TEXT_PARAGRAPH == nFamily; 751 OUString sName; 752 if( !bPara && mxTextAutoStyles.is() ) 753 xAutoStyles = mxTextAutoStyles; 754 else if( bPara && mxParaAutoStyles.is() ) 755 xAutoStyles = mxParaAutoStyles; 756 else 757 { 758 sName = bPara ? 759 OUString( RTL_CONSTASCII_USTRINGPARAM( "ParagraphStyles" ) ): 760 OUString( RTL_CONSTASCII_USTRINGPARAM( "CharacterStyles" ) ); 761 Reference< XAutoStylesSupplier > xAutoStylesSupp( GetImport().GetModel(), UNO_QUERY ); 762 Reference< XAutoStyles > xAutoStyleFamilies = xAutoStylesSupp->getAutoStyles(); 763 if (xAutoStyleFamilies->hasByName(sName)) 764 { 765 Any aAny = xAutoStyleFamilies->getByName( sName ); 766 xAutoStyles = *(Reference<XAutoStyleFamily>*)aAny.getValue(); 767 if( bPara ) 768 ((SvXMLStylesContext *)this)->mxParaAutoStyles = xAutoStyles; 769 else 770 ((SvXMLStylesContext *)this)->mxTextAutoStyles = xAutoStyles; 771 } 772 } 773 } 774 return xAutoStyles; 775 } 776 777 Reference < XNameContainer > SvXMLStylesContext::GetStylesContainer( 778 sal_uInt16 nFamily ) const 779 { 780 Reference < XNameContainer > xStyles; 781 OUString sName; 782 switch( nFamily ) 783 { 784 case XML_STYLE_FAMILY_TEXT_PARAGRAPH: 785 if( mxParaStyles.is() ) 786 xStyles = mxParaStyles; 787 else 788 sName = 789 OUString( RTL_CONSTASCII_USTRINGPARAM( "ParagraphStyles" ) ); 790 break; 791 792 case XML_STYLE_FAMILY_TEXT_TEXT: 793 if( mxTextStyles.is() ) 794 xStyles = mxTextStyles; 795 else 796 sName = 797 OUString( RTL_CONSTASCII_USTRINGPARAM( "CharacterStyles" ) ); 798 break; 799 } 800 if( !xStyles.is() && sName.getLength() ) 801 { 802 Reference< XStyleFamiliesSupplier > xFamiliesSupp( 803 GetImport().GetModel(), UNO_QUERY ); 804 if ( xFamiliesSupp.is() ) 805 { 806 Reference< XNameAccess > xFamilies = xFamiliesSupp->getStyleFamilies(); 807 if (xFamilies->hasByName(sName)) 808 { 809 xStyles.set(xFamilies->getByName( sName ),uno::UNO_QUERY); 810 811 switch( nFamily ) 812 { 813 case XML_STYLE_FAMILY_TEXT_PARAGRAPH: 814 ((SvXMLStylesContext *)this)->mxParaStyles = xStyles; 815 break; 816 817 case XML_STYLE_FAMILY_TEXT_TEXT: 818 ((SvXMLStylesContext *)this)->mxTextStyles = xStyles; 819 break; 820 } 821 } 822 } 823 } 824 825 return xStyles; 826 } 827 828 OUString SvXMLStylesContext::GetServiceName( sal_uInt16 nFamily ) const 829 { 830 String sServiceName; 831 switch( nFamily ) 832 { 833 case XML_STYLE_FAMILY_TEXT_PARAGRAPH: 834 sServiceName = msParaStyleServiceName; 835 break; 836 case XML_STYLE_FAMILY_TEXT_TEXT: 837 sServiceName = msTextStyleServiceName; 838 break; 839 } 840 841 return sServiceName; 842 } 843 844 845 SvXMLStylesContext::SvXMLStylesContext( SvXMLImport& rImport, sal_uInt16 nPrfx, 846 const OUString& rLName, 847 const uno::Reference< xml::sax::XAttributeList > &, sal_Bool bAuto ) : 848 SvXMLImportContext( rImport, nPrfx, rLName ), 849 msParaStyleServiceName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.style.ParagraphStyle" ) ), 850 msTextStyleServiceName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.style.CharacterStyle" ) ), 851 mpImpl( new SvXMLStylesContext_Impl( bAuto ) ), 852 mpStyleStylesElemTokenMap( 0 ) 853 { 854 } 855 856 857 SvXMLStylesContext::~SvXMLStylesContext() 858 { 859 delete mpStyleStylesElemTokenMap; 860 delete mpImpl; 861 } 862 863 SvXMLImportContext *SvXMLStylesContext::CreateChildContext( sal_uInt16 nPrefix, 864 const OUString& rLocalName, 865 const uno::Reference< xml::sax::XAttributeList > & xAttrList ) 866 { 867 SvXMLImportContext *pContext = 0; 868 869 SvXMLStyleContext *pStyle = 870 CreateStyleChildContext( nPrefix, rLocalName, xAttrList ); 871 // DBG_ASSERT( pStyle->GetFamily(), "Style without a family" ); 872 if( pStyle ) 873 { 874 if( !pStyle->IsTransient() ) 875 mpImpl->AddStyle( pStyle ); 876 pContext = pStyle; 877 } 878 else 879 { 880 pContext = new SvXMLImportContext( GetImport(), nPrefix, 881 rLocalName ); 882 } 883 884 return pContext; 885 } 886 887 void SvXMLStylesContext::EndElement() 888 { 889 } 890 891 void SvXMLStylesContext::AddStyle(SvXMLStyleContext& rNew) 892 { 893 mpImpl->AddStyle( &rNew ); 894 } 895 896 void SvXMLStylesContext::Clear() 897 { 898 mpImpl->Clear(); 899 } 900 901 void SvXMLStylesContext::CopyAutoStylesToDoc() 902 { 903 sal_uInt32 nCount = GetStyleCount(); 904 sal_uInt32 i; 905 for( i = 0; i < nCount; i++ ) 906 { 907 SvXMLStyleContext *pStyle = GetStyle( i ); 908 if( !pStyle || ( pStyle->GetFamily() != XML_STYLE_FAMILY_TEXT_TEXT && 909 pStyle->GetFamily() != XML_STYLE_FAMILY_TEXT_PARAGRAPH && 910 pStyle->GetFamily() != XML_STYLE_FAMILY_TABLE_CELL ) ) 911 continue; 912 pStyle->CreateAndInsert( sal_False ); 913 } 914 } 915 916 void SvXMLStylesContext::CopyStylesToDoc( sal_Bool bOverwrite, 917 sal_Bool bFinish ) 918 { 919 // pass 1: create text, paragraph and frame styles 920 sal_uInt32 nCount = GetStyleCount(); 921 sal_uInt32 i; 922 923 for( i = 0; i < nCount; i++ ) 924 { 925 SvXMLStyleContext *pStyle = GetStyle( i ); 926 if( !pStyle ) 927 continue; 928 929 if (pStyle->IsDefaultStyle()) 930 pStyle->SetDefaults(); 931 else if( InsertStyleFamily( pStyle->GetFamily() ) ) 932 pStyle->CreateAndInsert( bOverwrite ); 933 } 934 935 // pass 2: create list styles (they require char styles) 936 for( i=0; i<nCount; i++ ) 937 { 938 SvXMLStyleContext *pStyle = GetStyle( i ); 939 if( !pStyle || pStyle->IsDefaultStyle()) 940 continue; 941 942 if( InsertStyleFamily( pStyle->GetFamily() ) ) 943 pStyle->CreateAndInsertLate( bOverwrite ); 944 } 945 946 // pass3: finish creation of styles 947 if( bFinish ) 948 FinishStyles( bOverwrite ); 949 } 950 951 void SvXMLStylesContext::FinishStyles( sal_Bool bOverwrite ) 952 { 953 sal_uInt32 nCount = GetStyleCount(); 954 for( sal_uInt32 i=0; i<nCount; i++ ) 955 { 956 SvXMLStyleContext *pStyle = GetStyle( i ); 957 if( !pStyle || !pStyle->IsValid() || pStyle->IsDefaultStyle() ) 958 continue; 959 960 if( InsertStyleFamily( pStyle->GetFamily() ) ) 961 pStyle->Finish( bOverwrite ); 962 } 963 } 964 965 966 const SvXMLStyleContext *SvXMLStylesContext::FindStyleChildContext( 967 sal_uInt16 nFamily, 968 const OUString& rName, 969 sal_Bool bCreateIndex ) const 970 { 971 return mpImpl->FindStyleChildContext( nFamily, rName, bCreateIndex ); 972 } 973