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_sw.hxx" 24 25 #define _SVSTDARR_USHORTS 26 #include <svl/smplhint.hxx> 27 #include <hintids.hxx> 28 #include <svl/itemiter.hxx> 29 #include <svl/eitem.hxx> 30 #include <svx/xdef.hxx> 31 #include <unotools/syslocale.hxx> 32 #include <editeng/boxitem.hxx> 33 #include <editeng/numitem.hxx> 34 #include <editeng/lrspitem.hxx> 35 #include <fmtcol.hxx> 36 #include <uitool.hxx> 37 #include <swmodule.hxx> 38 #include <wrtsh.hxx> 39 #include <docsh.hxx> 40 #include <errhdl.hxx> 41 #include <frmfmt.hxx> 42 #include <charfmt.hxx> 43 #include <poolfmt.hxx> 44 #include <pagedesc.hxx> 45 #include <docstyle.hxx> 46 #include <docary.hxx> 47 #include <ccoll.hxx> 48 #include <doc.hxx> 49 #include <IDocumentUndoRedo.hxx> 50 #include <cmdid.h> 51 #include <swstyle.h> 52 #include <app.hrc> 53 #include <paratr.hxx> 54 #include <SwStyleNameMapper.hxx> 55 #include <svl/cjkoptions.hxx> 56 #include <comphelper/processfactory.hxx> 57 #include <unotools/localedatawrapper.hxx> 58 #include <unotools/intlwrapper.hxx> 59 #include <numrule.hxx> 60 #include <fmthdft.hxx> 61 #include <svx/svxids.hrc> 62 #include <SwRewriter.hxx> 63 #include <svx/xfillit0.hxx> 64 #include <svx/xflftrit.hxx> 65 #include <svx/svdmodel.hxx> 66 #include <svx/drawitem.hxx> 67 #include <drawdoc.hxx> 68 69 // MD 06.02.95: Die Formatnamen in der Liste aller Namen haben als 70 // erstes Zeichen die Familie: 71 72 #define cCHAR (sal_Unicode)'c' 73 #define cPARA (sal_Unicode)'p' 74 #define cFRAME (sal_Unicode)'f' 75 #define cPAGE (sal_Unicode)'g' 76 #define cNUMRULE (sal_Unicode)'n' 77 78 // Dieses Zeichen wird bei der Herausgabe der Namen wieder entfernt und 79 // die Familie wird neu generiert. 80 81 // Ausserdem gibt es jetzt zusaetzlich das Bit bPhysical. Ist dieses Bit 82 // sal_True, werden die Pool-Formatnamen NICHT mit eingetragen. 83 84 class SwImplShellAction 85 { 86 SwWrtShell* pSh; 87 CurrShell* pCurrSh; 88 public: 89 SwImplShellAction( SwDoc& rDoc ); 90 ~SwImplShellAction(); 91 92 SwWrtShell* GetSh() { return pSh; } 93 }; 94 95 SwImplShellAction::SwImplShellAction( SwDoc& rDoc ) 96 : pCurrSh( 0 ) 97 { 98 if( rDoc.GetDocShell() ) 99 pSh = rDoc.GetDocShell()->GetWrtShell(); 100 else 101 pSh = 0; 102 103 if( pSh ) 104 { 105 pCurrSh = new CurrShell( pSh ); 106 pSh->StartAllAction(); 107 } 108 } 109 110 SwImplShellAction::~SwImplShellAction() 111 { 112 if( pCurrSh ) 113 { 114 pSh->EndAllAction(); 115 delete pCurrSh; 116 } 117 } 118 119 /*-------------------------------------------------------------------- 120 Beschreibung: SwCharFormate finden/anlegen 121 evtl. Style fuellen 122 --------------------------------------------------------------------*/ 123 124 SwCharFmt* lcl_FindCharFmt( SwDoc& rDoc, 125 const String& rName, 126 SwDocStyleSheet* pStyle = 0, 127 sal_Bool bCreate = sal_True ) 128 { 129 SwCharFmt* pFmt = 0; 130 if( rName.Len() ) 131 { 132 pFmt = rDoc.FindCharFmtByName( rName ); 133 if( !pFmt && rName == *SwStyleNameMapper::GetTextUINameArray()[ RES_POOLCOLL_STANDARD - 134 RES_POOLCOLL_TEXT_BEGIN ] ) 135 { 136 // Standard-Zeichenvorlage 137 pFmt = (SwCharFmt*)rDoc.GetDfltCharFmt(); 138 } 139 140 if( !pFmt && bCreate ) 141 { // Pool abklappern 142 const sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName(rName, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT); 143 if(nId != USHRT_MAX) 144 pFmt = rDoc.GetCharFmtFromPool(nId); 145 } 146 } 147 if(pStyle) 148 { 149 if(pFmt) 150 { 151 pStyle->SetPhysical(sal_True); 152 SwFmt* p = pFmt->DerivedFrom(); 153 if( p && !p->IsDefault() ) 154 pStyle->PresetParent( p->GetName() ); 155 else 156 pStyle->PresetParent( aEmptyStr ); 157 } 158 else 159 pStyle->SetPhysical(sal_False); 160 } 161 return pFmt; 162 } 163 164 165 /*-------------------------------------------------------------------- 166 Beschreibung: ParaFormate finden/erzeugen 167 Style fuellen 168 --------------------------------------------------------------------*/ 169 170 SwTxtFmtColl* lcl_FindParaFmt( SwDoc& rDoc, 171 const String& rName, 172 SwDocStyleSheet* pStyle = 0, 173 sal_Bool bCreate = sal_True ) 174 { 175 SwTxtFmtColl* pColl = 0; 176 177 if( rName.Len() ) 178 { 179 pColl = rDoc.FindTxtFmtCollByName( rName ); 180 if( !pColl && bCreate ) 181 { // Pool abklappern 182 const sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName(rName, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL); 183 if(nId != USHRT_MAX) 184 pColl = rDoc.GetTxtCollFromPool(nId); 185 } 186 } 187 188 if(pStyle) 189 { 190 if(pColl) 191 { 192 pStyle->SetPhysical(sal_True); 193 if( pColl->DerivedFrom() && !pColl->DerivedFrom()->IsDefault() ) 194 pStyle->PresetParent( pColl->DerivedFrom()->GetName() ); 195 else 196 pStyle->PresetParent( aEmptyStr ); 197 198 SwTxtFmtColl& rNext = pColl->GetNextTxtFmtColl(); 199 pStyle->PresetFollow(rNext.GetName()); 200 } 201 else 202 pStyle->SetPhysical(sal_False); 203 } 204 return pColl; 205 } 206 207 208 /*-------------------------------------------------------------------- 209 Beschreibung: Rahmenformate 210 --------------------------------------------------------------------*/ 211 212 213 SwFrmFmt* lcl_FindFrmFmt( SwDoc& rDoc, 214 const String& rName, 215 SwDocStyleSheet* pStyle = 0, 216 sal_Bool bCreate = sal_True ) 217 { 218 SwFrmFmt* pFmt = 0; 219 if( rName.Len() ) 220 { 221 pFmt = rDoc.FindFrmFmtByName( rName ); 222 if( !pFmt && bCreate ) 223 { // Pool abklappern 224 const sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName(rName, nsSwGetPoolIdFromName::GET_POOLID_FRMFMT); 225 if(nId != USHRT_MAX) 226 pFmt = rDoc.GetFrmFmtFromPool(nId); 227 } 228 } 229 230 if(pStyle) 231 { 232 if(pFmt) 233 { 234 pStyle->SetPhysical(sal_True); 235 if( pFmt->DerivedFrom() && !pFmt->DerivedFrom()->IsDefault() ) 236 pStyle->PresetParent( pFmt->DerivedFrom()->GetName() ); 237 else 238 pStyle->PresetParent( aEmptyStr ); 239 } 240 else 241 pStyle->SetPhysical(sal_False); 242 } 243 return pFmt; 244 } 245 246 /*-------------------------------------------------------------------- 247 Beschreibung: Seitendescriptoren 248 --------------------------------------------------------------------*/ 249 250 251 const SwPageDesc* lcl_FindPageDesc( SwDoc& rDoc, 252 const String& rName, 253 SwDocStyleSheet* pStyle = 0, 254 sal_Bool bCreate = sal_True ) 255 { 256 const SwPageDesc* pDesc = 0; 257 258 if( rName.Len() ) 259 { 260 pDesc = rDoc.FindPageDescByName( rName ); 261 if( !pDesc && bCreate ) 262 { 263 sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName(rName, nsSwGetPoolIdFromName::GET_POOLID_PAGEDESC); 264 if(nId != USHRT_MAX) 265 pDesc = rDoc.GetPageDescFromPool(nId); 266 } 267 } 268 269 if(pStyle) 270 { 271 if(pDesc) 272 { 273 pStyle->SetPhysical(sal_True); 274 if(pDesc->GetFollow()) 275 pStyle->PresetFollow(pDesc->GetFollow()->GetName()); 276 else 277 pStyle->PresetParent( aEmptyStr ); 278 } 279 else 280 pStyle->SetPhysical(sal_False); 281 } 282 return pDesc; 283 } 284 285 const SwNumRule* lcl_FindNumRule( SwDoc& rDoc, 286 const String& rName, 287 SwDocStyleSheet* pStyle = 0, 288 sal_Bool bCreate = sal_True ) 289 { 290 const SwNumRule* pRule = 0; 291 292 if( rName.Len() ) 293 { 294 pRule = rDoc.FindNumRulePtr( rName ); 295 if( !pRule && bCreate ) 296 { 297 sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName(rName, nsSwGetPoolIdFromName::GET_POOLID_NUMRULE); 298 if(nId != USHRT_MAX) 299 pRule = rDoc.GetNumRuleFromPool(nId); 300 } 301 } 302 303 if(pStyle) 304 { 305 if(pRule) 306 { 307 pStyle->SetPhysical(sal_True); 308 pStyle->PresetParent( aEmptyStr ); 309 } 310 else 311 pStyle->SetPhysical(sal_False); 312 } 313 return pRule; 314 } 315 316 317 sal_uInt16 lcl_FindName( const SwPoolFmtList& rLst, SfxStyleFamily eFam, 318 const String& rName ) 319 { 320 if( rLst.Count() ) 321 { 322 // suchen 323 String sSrch( ' ' ); 324 switch( eFam ) 325 { 326 case SFX_STYLE_FAMILY_CHAR: sSrch = cCHAR; break; 327 case SFX_STYLE_FAMILY_PARA: sSrch = cPARA; break; 328 case SFX_STYLE_FAMILY_FRAME: sSrch = cFRAME; break; 329 case SFX_STYLE_FAMILY_PAGE: sSrch = cPAGE; break; 330 case SFX_STYLE_FAMILY_PSEUDO: sSrch = cNUMRULE; break; 331 default:; //prevent warning 332 } 333 sSrch += rName; 334 for( sal_uInt16 i=0; i < rLst.Count(); ++i ) 335 if( *rLst[i] == sSrch ) 336 return i; 337 } 338 return USHRT_MAX; 339 } 340 341 sal_Bool FindPhyStyle( SwDoc& rDoc, const String& rName, SfxStyleFamily eFam ) 342 { 343 switch( eFam ) 344 { 345 case SFX_STYLE_FAMILY_CHAR : 346 return 0 != lcl_FindCharFmt( rDoc, rName, 0, sal_False ); 347 case SFX_STYLE_FAMILY_PARA : 348 return 0 != lcl_FindParaFmt( rDoc, rName, 0, sal_False ); 349 case SFX_STYLE_FAMILY_FRAME: 350 return 0 != lcl_FindFrmFmt( rDoc, rName, 0, sal_False ); 351 case SFX_STYLE_FAMILY_PAGE : 352 return 0 != lcl_FindPageDesc( rDoc, rName, 0, sal_False ); 353 case SFX_STYLE_FAMILY_PSEUDO: 354 return 0 != lcl_FindNumRule( rDoc, rName, 0, sal_False ); 355 default:; //prevent warning 356 } 357 return sal_False; 358 } 359 360 361 /*-------------------------------------------------------------------- 362 Beschreibung: Einfuegen von Strings in die Liste der Vorlagen 363 --------------------------------------------------------------------*/ 364 365 366 void SwPoolFmtList::Append( char cChar, const String& rStr ) 367 { 368 String* pStr = new String( cChar ); 369 *pStr += rStr; 370 for ( sal_uInt16 i=0; i < Count(); ++i ) 371 { 372 if( *operator[](i) == *pStr ) 373 { 374 delete pStr; 375 return; 376 } 377 } 378 Insert( pStr, Count() ); 379 } 380 381 /*-------------------------------------------------------------------- 382 Beschreibung: Liste kompletti loeschen 383 --------------------------------------------------------------------*/ 384 385 386 void SwPoolFmtList::Erase() 387 { 388 DeleteAndDestroy( 0, Count() ); 389 } 390 391 /* */ 392 393 /*-------------------------------------------------------------------- 394 Beschreibung: UI-seitige implementierung von StyleSheets 395 greift auf die Core-Engine zu 396 --------------------------------------------------------------------*/ 397 398 SwDocStyleSheet::SwDocStyleSheet( SwDoc& rDocument, 399 const String& rName, 400 SwDocStyleSheetPool& _rPool, 401 SfxStyleFamily eFam, 402 sal_uInt16 _nMask) : 403 404 SfxStyleSheetBase( rName, _rPool, eFam, _nMask ), 405 pCharFmt(0), 406 pColl(0), 407 pFrmFmt(0), 408 pDesc(0), 409 pNumRule(0), 410 411 rDoc(rDocument), 412 aCoreSet(GetPool().GetPool(), //UUUU sorted by indices, one double removed 413 RES_CHRATR_BEGIN, RES_CHRATR_END - 1, // [1 414 RES_PARATR_BEGIN, RES_PARATR_END - 1, // [60 415 // --> OD 2008-02-25 #refactorlists# 416 RES_PARATR_LIST_BEGIN, RES_PARATR_LIST_END - 1, // [77 417 // <-- 418 RES_FRMATR_BEGIN, RES_FRMATR_END - 1, // [82 419 RES_UNKNOWNATR_BEGIN, RES_UNKNOWNATR_END-1, // [143 420 421 //UUUU FillAttribute support 422 XATTR_FILL_FIRST, XATTR_FILL_LAST, // [1014 423 424 SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER, // [10023 425 SID_ATTR_PAGE, SID_ATTR_PAGE_EXT1, // [10050 426 SID_ATTR_PAGE_HEADERSET,SID_ATTR_PAGE_FOOTERSET, // [10058 427 SID_ATTR_PARA_MODEL, SID_ATTR_PARA_MODEL, // [10065 428 429 //UUUU items to hand over XPropertyList things like 430 // XColorList, XHatchList, XGradientList and XBitmapList 431 // to the Area TabPage 432 SID_COLOR_TABLE, SID_BITMAP_LIST, // [10179 433 434 SID_SWREGISTER_COLLECTION, SID_SWREGISTER_COLLECTION, // [10451 435 SID_ATTR_PARA_PAGENUM, SID_ATTR_PARA_PAGENUM, // [10457 436 SID_SWREGISTER_MODE, SID_SWREGISTER_MODE, // [10467 437 SID_PARA_BACKGRND_DESTINATION, SID_ATTR_BRUSH_CHAR, // [10590 438 SID_ATTR_NUMBERING_RULE, SID_ATTR_NUMBERING_RULE, // [10855 439 SID_ATTR_AUTO_STYLE_UPDATE, SID_ATTR_AUTO_STYLE_UPDATE, // [12065 440 FN_PARAM_FTN_INFO, FN_PARAM_FTN_INFO, // [21123 441 FN_COND_COLL, FN_COND_COLL, // [22401 442 0), 443 bPhysical(sal_False) 444 { 445 nHelpId = UCHAR_MAX; 446 } 447 448 449 SwDocStyleSheet::SwDocStyleSheet( const SwDocStyleSheet& rOrg) : 450 SfxStyleSheetBase(rOrg), 451 pCharFmt(rOrg.pCharFmt), 452 pColl(rOrg.pColl), 453 pFrmFmt(rOrg.pFrmFmt), 454 pDesc(rOrg.pDesc), 455 pNumRule(rOrg.pNumRule), 456 rDoc(rOrg.rDoc), 457 aCoreSet(rOrg.aCoreSet), 458 bPhysical(rOrg.bPhysical) 459 { 460 } 461 462 463 SwDocStyleSheet::~SwDocStyleSheet() 464 { 465 } 466 467 /*-------------------------------------------------------------------- 468 Beschreibung: Zuruecksetzen 469 --------------------------------------------------------------------*/ 470 471 472 void SwDocStyleSheet::Reset() 473 { 474 aName.Erase(); 475 aFollow.Erase(); 476 aParent.Erase(); 477 SetPhysical(sal_False); 478 } 479 480 /*-------------------------------------------------------------------- 481 Beschreibung: virtuelle Methoden 482 --------------------------------------------------------------------*/ 483 484 485 const String& SwDocStyleSheet::GetParent() const 486 { 487 if( !bPhysical ) 488 { 489 // dann pruefe, ob schon im Doc vorhanden 490 SwFmt* pFmt = 0; 491 SwGetPoolIdFromName eGetType; 492 switch(nFamily) 493 { 494 case SFX_STYLE_FAMILY_CHAR: 495 pFmt = rDoc.FindCharFmtByName( aName ); 496 eGetType = nsSwGetPoolIdFromName::GET_POOLID_CHRFMT; 497 break; 498 499 case SFX_STYLE_FAMILY_PARA: 500 pFmt = rDoc.FindTxtFmtCollByName( aName ); 501 eGetType = nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL; 502 break; 503 504 case SFX_STYLE_FAMILY_FRAME: 505 pFmt = rDoc.FindFrmFmtByName( aName ); 506 eGetType = nsSwGetPoolIdFromName::GET_POOLID_FRMFMT; 507 break; 508 509 case SFX_STYLE_FAMILY_PAGE: 510 case SFX_STYLE_FAMILY_PSEUDO: 511 default: 512 return aEmptyStr; // es gibt keinen Parent 513 } 514 515 String sTmp; 516 if( !pFmt ) // noch nicht vorhanden, also dflt. Parent 517 { 518 sal_uInt16 i = SwStyleNameMapper::GetPoolIdFromUIName( aName, eGetType ); 519 i = ::GetPoolParent( i ); 520 if( i && USHRT_MAX != i ) 521 SwStyleNameMapper::FillUIName( i, sTmp ); 522 } 523 else 524 { 525 SwFmt* p = pFmt->DerivedFrom(); 526 if( p && !p->IsDefault() ) 527 sTmp = p->GetName(); 528 } 529 SwDocStyleSheet* pThis = (SwDocStyleSheet*)this; 530 pThis->aParent = sTmp; 531 } 532 return aParent; 533 } 534 535 /*-------------------------------------------------------------------- 536 Beschreibung: Nachfolger 537 --------------------------------------------------------------------*/ 538 539 540 const String& SwDocStyleSheet::GetFollow() const 541 { 542 if( !bPhysical ) 543 { 544 SwDocStyleSheet* pThis = (SwDocStyleSheet*)this; 545 pThis->FillStyleSheet( FillAllInfo ); 546 } 547 return aFollow; 548 } 549 550 /*-------------------------------------------------------------------- 551 Beschreibung: Welche Verkettung ist moeglich 552 --------------------------------------------------------------------*/ 553 554 555 sal_Bool SwDocStyleSheet::HasFollowSupport() const 556 { 557 switch(nFamily) 558 { 559 case SFX_STYLE_FAMILY_PARA : 560 case SFX_STYLE_FAMILY_PAGE : return sal_True; 561 case SFX_STYLE_FAMILY_FRAME: 562 case SFX_STYLE_FAMILY_CHAR : 563 case SFX_STYLE_FAMILY_PSEUDO: return sal_False; 564 default: 565 ASSERT(!this, "unbekannte Style-Familie"); 566 } 567 return sal_False; 568 } 569 570 /*-------------------------------------------------------------------- 571 Beschreibung: Parent ? 572 --------------------------------------------------------------------*/ 573 574 575 sal_Bool SwDocStyleSheet::HasParentSupport() const 576 { 577 sal_Bool bRet = sal_False; 578 switch(nFamily) 579 { 580 case SFX_STYLE_FAMILY_CHAR : 581 case SFX_STYLE_FAMILY_PARA : 582 case SFX_STYLE_FAMILY_FRAME: bRet = sal_True; 583 default:; //prevent warning 584 } 585 return bRet; 586 } 587 588 589 sal_Bool SwDocStyleSheet::HasClearParentSupport() const 590 { 591 sal_Bool bRet = sal_False; 592 switch(nFamily) 593 { 594 case SFX_STYLE_FAMILY_PARA : 595 case SFX_STYLE_FAMILY_CHAR : 596 case SFX_STYLE_FAMILY_FRAME: bRet = sal_True; 597 default:; //prevent warning 598 } 599 return bRet; 600 } 601 602 /*-------------------------------------------------------------------- 603 Beschreibung: textuelle Beschreibung ermitteln 604 --------------------------------------------------------------------*/ 605 String SwDocStyleSheet::GetDescription(SfxMapUnit eUnit) 606 { 607 IntlWrapper aIntlWrapper( 608 ::comphelper::getProcessServiceFactory(), 609 SvtSysLocale().GetLocaleData().getLocale()); 610 611 String sPlus(String::CreateFromAscii(" + ")); 612 if ( SFX_STYLE_FAMILY_PAGE == nFamily ) 613 { 614 if( !pSet ) 615 GetItemSet(); 616 617 SfxItemIter aIter( *pSet ); 618 String aDesc; 619 const SfxPoolItem* pItem = aIter.FirstItem(); 620 621 while ( pItem ) 622 { 623 if(!IsInvalidItem(pItem)) 624 switch ( pItem->Which() ) 625 { 626 case RES_LR_SPACE: 627 case SID_ATTR_PAGE_SIZE: 628 case SID_ATTR_PAGE_MAXSIZE: 629 case SID_ATTR_PAGE_PAPERBIN: 630 case SID_ATTR_PAGE_APP: 631 case SID_ATTR_BORDER_INNER: 632 break; 633 default: 634 { 635 String aItemPresentation; 636 if ( !IsInvalidItem( pItem ) && 637 rPool.GetPool().GetPresentation( 638 *pItem, SFX_ITEM_PRESENTATION_COMPLETE, 639 eUnit, aItemPresentation, &aIntlWrapper ) ) 640 { 641 if ( aDesc.Len() && aItemPresentation.Len() ) 642 aDesc += sPlus; 643 aDesc += aItemPresentation; 644 } 645 } 646 } 647 pItem = aIter.NextItem(); 648 } 649 return aDesc; 650 } 651 else if ( SFX_STYLE_FAMILY_FRAME == nFamily || 652 SFX_STYLE_FAMILY_PARA == nFamily) 653 { 654 if( !pSet ) 655 GetItemSet(); 656 657 SfxItemIter aIter( *pSet ); 658 String aDesc; 659 const SfxPoolItem* pItem = aIter.FirstItem(); 660 661 String sPageNum, sModel, sBreak; 662 sal_Bool bHasWesternFontPrefix = sal_False; 663 sal_Bool bHasCJKFontPrefix = sal_False; 664 SvtCJKOptions aCJKOptions; 665 666 //UUUU Get currently used FillStyle and remember, also need the XFillFloatTransparenceItem 667 // to decide if gradient transparence is used 668 const XFillStyle eFillStyle(static_cast< const XFillStyleItem& >(pSet->Get(XATTR_FILLSTYLE)).GetValue()); 669 const bool bUseFloatTransparence(static_cast< const XFillFloatTransparenceItem& >(pSet->Get(XATTR_FILLFLOATTRANSPARENCE)).IsEnabled()); 670 671 while ( pItem ) 672 { 673 if(!IsInvalidItem(pItem)) 674 switch ( pItem->Which() ) 675 { 676 case SID_ATTR_AUTO_STYLE_UPDATE: 677 case SID_PARA_BACKGRND_DESTINATION: 678 case RES_PAGEDESC: 679 //CTL no yet supported 680 case RES_CHRATR_CTL_FONT: 681 case RES_CHRATR_CTL_FONTSIZE: 682 case RES_CHRATR_CTL_LANGUAGE: 683 case RES_CHRATR_CTL_POSTURE: 684 case RES_CHRATR_CTL_WEIGHT: 685 break; 686 default: 687 { 688 String aItemPresentation; 689 if ( !IsInvalidItem( pItem ) && 690 rPool.GetPool().GetPresentation( 691 *pItem, SFX_ITEM_PRESENTATION_COMPLETE, 692 eUnit, aItemPresentation, &aIntlWrapper ) ) 693 { 694 sal_Bool bIsDefault = sal_False; 695 switch ( pItem->Which() ) 696 { 697 //UUUU 698 case XATTR_FILLCOLOR: 699 { 700 // only use active FillStyle information 701 bIsDefault = (XFILL_SOLID == eFillStyle); 702 break; 703 } 704 case XATTR_FILLGRADIENT: 705 { 706 // only use active FillStyle information 707 bIsDefault = (XFILL_GRADIENT == eFillStyle); 708 break; 709 } 710 case XATTR_FILLHATCH: 711 { 712 // only use active FillStyle information 713 bIsDefault = (XFILL_HATCH == eFillStyle); 714 break; 715 } 716 case XATTR_FILLBITMAP: 717 { 718 // only use active FillStyle information 719 bIsDefault = (XFILL_BITMAP == eFillStyle); 720 break; 721 } 722 case XATTR_FILLTRANSPARENCE: 723 { 724 // only active when not FloatTransparence 725 bIsDefault = !bUseFloatTransparence; 726 break; 727 } 728 case XATTR_FILLFLOATTRANSPARENCE: 729 { 730 // only active when FloatTransparence 731 bIsDefault = bUseFloatTransparence; 732 break; 733 } 734 735 case SID_ATTR_PARA_PAGENUM: 736 sPageNum = aItemPresentation; 737 break; 738 case SID_ATTR_PARA_MODEL: 739 sModel = aItemPresentation; 740 break; 741 case RES_BREAK: 742 sBreak = aItemPresentation; 743 break; 744 case RES_CHRATR_CJK_FONT: 745 case RES_CHRATR_CJK_FONTSIZE: 746 case RES_CHRATR_CJK_LANGUAGE: 747 case RES_CHRATR_CJK_POSTURE: 748 case RES_CHRATR_CJK_WEIGHT: 749 if(aCJKOptions.IsCJKFontEnabled()) 750 bIsDefault = sal_True; 751 if(!bHasCJKFontPrefix) 752 { 753 aItemPresentation.Insert(SW_RESSTR(STR_CJK_FONT), 0); 754 bHasCJKFontPrefix = sal_True; 755 } 756 break; 757 case RES_CHRATR_FONT: 758 case RES_CHRATR_FONTSIZE: 759 case RES_CHRATR_LANGUAGE: 760 case RES_CHRATR_POSTURE: 761 case RES_CHRATR_WEIGHT: 762 if(!bHasWesternFontPrefix) 763 { 764 aItemPresentation.Insert(SW_RESSTR(STR_WESTERN_FONT), 0); 765 bHasWesternFontPrefix = sal_True; 766 bIsDefault = sal_True; 767 } 768 // no break; 769 default: 770 bIsDefault = sal_True; 771 } 772 if(bIsDefault) 773 { 774 if ( aDesc.Len() && aItemPresentation.Len() ) 775 aDesc += sPlus; 776 aDesc += aItemPresentation; 777 } 778 } 779 } 780 } 781 pItem = aIter.NextItem(); 782 } 783 //Sonderbehandlung fuer Umburch, Seitenvorlage und Seitenoffset 784 if(sBreak.Len() && !sModel.Len()) // wemm Model. dann ist Break ungueltig 785 { 786 if(aDesc.Len()) 787 aDesc += sPlus; 788 aDesc += sBreak; 789 } 790 if(sModel.Len()) 791 { 792 if(aDesc.Len()) 793 aDesc += sPlus; 794 aDesc += SW_RESSTR(STR_PAGEBREAK); 795 aDesc += sPlus; 796 aDesc += sModel; 797 if(sPageNum != String(UniString::CreateFromInt32(0))) 798 { 799 aDesc += sPlus; 800 aDesc += SW_RESSTR(STR_PAGEOFFSET); 801 aDesc += sPageNum; 802 } 803 } 804 return aDesc; 805 } 806 else if( SFX_STYLE_FAMILY_PSEUDO == nFamily ) 807 { 808 // if( pNumRule ) 809 // return pNumRule->GetName(); 810 //os: was sollte man bei Numerierungen schon anzeigen? 811 return aEmptyStr; 812 } 813 814 return SfxStyleSheetBase::GetDescription(eUnit); 815 } 816 817 818 String SwDocStyleSheet::GetDescription() 819 { 820 return GetDescription(SFX_MAPUNIT_CM); 821 } 822 823 /*-------------------------------------------------------------------- 824 Beschreibung: Namen setzen 825 --------------------------------------------------------------------*/ 826 827 828 sal_Bool SwDocStyleSheet::SetName( const String& rStr) 829 { 830 if( !rStr.Len() ) 831 return sal_False; 832 833 if( aName != rStr ) 834 { 835 if( !SfxStyleSheetBase::SetName( rStr )) 836 return sal_False; 837 } 838 else if(!bPhysical) 839 FillStyleSheet( FillPhysical ); 840 841 int bChg = sal_False; 842 switch(nFamily) 843 { 844 case SFX_STYLE_FAMILY_CHAR : 845 { 846 ASSERT(pCharFmt, "SwCharFormat fehlt!"); 847 if( pCharFmt && pCharFmt->GetName() != rStr ) 848 { 849 pCharFmt->SetName( rStr ); 850 bChg = sal_True; 851 } 852 break; 853 } 854 case SFX_STYLE_FAMILY_PARA : 855 { 856 ASSERT(pColl, "Collektion fehlt!"); 857 if( pColl && pColl->GetName() != rStr ) 858 { 859 if (pColl->GetName().Len() > 0) 860 rDoc.RenameFmt(*pColl, rStr); 861 else 862 pColl->SetName(rStr); 863 864 bChg = sal_True; 865 } 866 break; 867 } 868 case SFX_STYLE_FAMILY_FRAME: 869 { 870 ASSERT(pFrmFmt, "FrmFmt fehlt!"); 871 if( pFrmFmt && pFrmFmt->GetName() != rStr ) 872 { 873 if (pFrmFmt->GetName().Len() > 0) 874 rDoc.RenameFmt(*pFrmFmt, rStr); 875 else 876 pFrmFmt->SetName( rStr ); 877 878 bChg = sal_True; 879 } 880 break; 881 } 882 case SFX_STYLE_FAMILY_PAGE : 883 ASSERT(pDesc, "PageDesc fehlt!"); 884 if( pDesc && pDesc->GetName() != rStr ) 885 { 886 //PageDesc setzen - mit vorherigem kopieren - ist fuer das 887 //setzen des Namens wohl nicht notwendig. Deshalb erlauben 888 //wir hier mal einen cast. 889 // -> #116530# 890 SwPageDesc aPageDesc(*((SwPageDesc*)pDesc)); 891 String aOldName(aPageDesc.GetName()); 892 893 aPageDesc.SetName( rStr ); 894 bool const bDoesUndo = rDoc.GetIDocumentUndoRedo().DoesUndo(); 895 896 rDoc.GetIDocumentUndoRedo().DoUndo(aOldName.Len() > 0); 897 rDoc.ChgPageDesc(aOldName, aPageDesc); 898 rDoc.GetIDocumentUndoRedo().DoUndo(bDoesUndo); 899 // <- #116530# 900 901 rDoc.SetModified(); 902 bChg = sal_True; 903 } 904 break; 905 case SFX_STYLE_FAMILY_PSEUDO: 906 ASSERT(pNumRule, "NumRule fehlt!"); 907 908 // -> #106897# 909 if (pNumRule) 910 { 911 String aOldName = pNumRule->GetName(); 912 913 if (aOldName.Len() > 0) 914 { 915 if ( aOldName != rStr && 916 rDoc.RenameNumRule(aOldName, rStr)) 917 { 918 pNumRule = rDoc.FindNumRulePtr(rStr); 919 rDoc.SetModified(); 920 921 bChg = sal_True; 922 } 923 } 924 else 925 { 926 // --> OD 2008-07-08 #i91400# 927 ((SwNumRule*)pNumRule)->SetName( rStr, rDoc ); 928 // <-- 929 rDoc.SetModified(); 930 931 bChg = sal_True; 932 } 933 } 934 // <- #106897# 935 936 break; 937 938 default: 939 ASSERT(!this, "unbekannte Style-Familie"); 940 } 941 942 if( bChg ) 943 { 944 rPool.First(); // interne Liste muss geupdatet werden 945 rPool.Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_MODIFIED, *this ) ); 946 SwEditShell* pSh = rDoc.GetEditShell(); 947 if( pSh ) 948 pSh->CallChgLnk(); 949 } 950 return sal_True; 951 } 952 953 /*-------------------------------------------------------------------- 954 Beschreibung: Ableitungshirachie 955 --------------------------------------------------------------------*/ 956 957 958 sal_Bool SwDocStyleSheet::SetParent( const String& rStr) 959 { 960 SwFmt* pFmt = 0, *pParent = 0; 961 switch(nFamily) 962 { 963 case SFX_STYLE_FAMILY_CHAR : 964 ASSERT( pCharFmt, "SwCharFormat fehlt!" ) 965 if( 0 != ( pFmt = pCharFmt ) && rStr.Len() ) 966 pParent = lcl_FindCharFmt(rDoc, rStr); 967 break; 968 969 case SFX_STYLE_FAMILY_PARA : 970 ASSERT( pColl, "Collektion fehlt!") 971 if( 0 != ( pFmt = pColl ) && rStr.Len() ) 972 pParent = lcl_FindParaFmt( rDoc, rStr ); 973 break; 974 975 case SFX_STYLE_FAMILY_FRAME: 976 ASSERT(pFrmFmt, "FrameFormat fehlt!"); 977 if( 0 != ( pFmt = pFrmFmt ) && rStr.Len() ) 978 pParent = lcl_FindFrmFmt( rDoc, rStr ); 979 break; 980 981 case SFX_STYLE_FAMILY_PAGE: 982 case SFX_STYLE_FAMILY_PSEUDO: 983 break; 984 default: 985 ASSERT(!this, "unbekannte Style-Familie"); 986 } 987 988 sal_Bool bRet = sal_False; 989 if( pFmt && pFmt->DerivedFrom() && 990 pFmt->DerivedFrom()->GetName() != rStr ) 991 { 992 { 993 SwImplShellAction aTmp( rDoc ); 994 bRet = pFmt->SetDerivedFrom( pParent ); 995 } 996 997 if( bRet ) 998 { 999 aParent = rStr; 1000 rPool.Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_MODIFIED, 1001 *this ) ); 1002 } 1003 } 1004 1005 return bRet; 1006 } 1007 1008 /*-------------------------------------------------------------------- 1009 Beschreibung: Nachfolger detzen 1010 --------------------------------------------------------------------*/ 1011 1012 1013 sal_Bool SwDocStyleSheet::SetFollow( const String& rStr) 1014 { 1015 if( rStr.Len() && !SfxStyleSheetBase::SetFollow( rStr )) 1016 return sal_False; 1017 1018 SwImplShellAction aTmpSh( rDoc ); 1019 switch(nFamily) 1020 { 1021 case SFX_STYLE_FAMILY_PARA : 1022 { 1023 ASSERT(pColl, "Collection fehlt!"); 1024 if( pColl ) 1025 { 1026 SwTxtFmtColl* pFollow = pColl; 1027 if( rStr.Len() && 0 == (pFollow = lcl_FindParaFmt(rDoc, rStr) )) 1028 pFollow = pColl; 1029 1030 pColl->SetNextTxtFmtColl(*pFollow); 1031 } 1032 break; 1033 } 1034 case SFX_STYLE_FAMILY_PAGE : 1035 { 1036 ASSERT(pDesc, "PageDesc fehlt!"); 1037 if( pDesc ) 1038 { 1039 const SwPageDesc* pFollowDesc = rStr.Len() 1040 ? lcl_FindPageDesc(rDoc, rStr) 1041 : 0; 1042 sal_uInt16 nId; 1043 if( pFollowDesc != pDesc->GetFollow() && 1044 rDoc.FindPageDescByName( pDesc->GetName(), &nId ) ) 1045 { 1046 SwPageDesc aDesc( *pDesc ); 1047 aDesc.SetFollow( pFollowDesc ); 1048 rDoc.ChgPageDesc( nId, aDesc ); 1049 pDesc = &const_cast<const SwDoc &>(rDoc).GetPageDesc( nId ); 1050 } 1051 } 1052 break; 1053 } 1054 case SFX_STYLE_FAMILY_CHAR: 1055 case SFX_STYLE_FAMILY_FRAME: 1056 case SFX_STYLE_FAMILY_PSEUDO: 1057 break; 1058 default: 1059 ASSERT(!this, "unbekannte Style-Familie"); 1060 } 1061 1062 return sal_True; 1063 } 1064 1065 /*-------------------------------------------------------------------- 1066 Beschreibung: ueber Name und Family, Mask den ItemSet rausholen 1067 --------------------------------------------------------------------*/ 1068 1069 SfxItemSet& SwDocStyleSheet::GetItemSet() 1070 { 1071 if(!bPhysical) 1072 FillStyleSheet( FillPhysical ); 1073 1074 switch(nFamily) 1075 { 1076 case SFX_STYLE_FAMILY_CHAR: 1077 { 1078 ASSERT(pCharFmt, "Wo ist das SwCharFmt"); 1079 aCoreSet.Put(pCharFmt->GetAttrSet()); 1080 if(pCharFmt->DerivedFrom()) 1081 aCoreSet.SetParent(&pCharFmt->DerivedFrom()->GetAttrSet()); 1082 } 1083 break; 1084 case SFX_STYLE_FAMILY_PARA : 1085 case SFX_STYLE_FAMILY_FRAME: 1086 { 1087 SvxBoxInfoItem aBoxInfo( SID_ATTR_BORDER_INNER ); 1088 aBoxInfo.SetTable( sal_False ); 1089 aBoxInfo.SetDist( sal_True); // Abstandsfeld immer anzeigen 1090 aBoxInfo.SetMinDist( sal_True );// Minimalgroesse in Tabellen und Absaetzen setzen 1091 aBoxInfo.SetDefDist( MIN_BORDER_DIST );// Default-Abstand immer setzen 1092 // Einzelne Linien koennen nur in Tabellen DontCare-Status haben 1093 aBoxInfo.SetValid( VALID_DISABLE, sal_True ); 1094 if ( nFamily == SFX_STYLE_FAMILY_PARA ) 1095 { 1096 ASSERT(pColl, "Wo ist die Collektion"); 1097 aCoreSet.Put(pColl->GetAttrSet()); 1098 aCoreSet.Put( aBoxInfo ); 1099 aCoreSet.Put(SfxBoolItem(SID_ATTR_AUTO_STYLE_UPDATE, pColl->IsAutoUpdateFmt())); 1100 if(pColl->DerivedFrom()) 1101 aCoreSet.SetParent(&pColl->DerivedFrom()->GetAttrSet()); 1102 } 1103 else 1104 { 1105 ASSERT(pFrmFmt, "Wo ist das FrmFmt"); 1106 aCoreSet.Put(pFrmFmt->GetAttrSet()); 1107 aCoreSet.Put( aBoxInfo ); 1108 aCoreSet.Put(SfxBoolItem(SID_ATTR_AUTO_STYLE_UPDATE, pFrmFmt->IsAutoUpdateFmt())); 1109 if(pFrmFmt->DerivedFrom()) 1110 aCoreSet.SetParent(&pFrmFmt->DerivedFrom()->GetAttrSet()); 1111 1112 //UUUU create needed items for XPropertyList entries from the DrawModel so that 1113 // the Area TabPage can access them 1114 const SwDrawModel* pDrawModel = rDoc.GetDrawModel(); 1115 1116 aCoreSet.Put(SvxColorTableItem(pDrawModel->GetColorTableFromSdrModel(), SID_COLOR_TABLE)); 1117 aCoreSet.Put(SvxGradientListItem(pDrawModel->GetGradientListFromSdrModel(), SID_GRADIENT_LIST)); 1118 aCoreSet.Put(SvxHatchListItem(pDrawModel->GetHatchListFromSdrModel(), SID_HATCH_LIST)); 1119 aCoreSet.Put(SvxBitmapListItem(pDrawModel->GetBitmapListFromSdrModel(), SID_BITMAP_LIST)); 1120 } 1121 } 1122 break; 1123 1124 case SFX_STYLE_FAMILY_PAGE : 1125 { 1126 //UUUU set correct parent to get the XFILL_NONE FillStyle as needed 1127 if(!aCoreSet.GetParent()) 1128 { 1129 aCoreSet.SetParent(&rDoc.GetDfltFrmFmt()->GetAttrSet()); 1130 } 1131 1132 ASSERT(pDesc, "Kein PageDescriptor"); 1133 ::PageDescToItemSet(*((SwPageDesc*)pDesc), aCoreSet); 1134 } 1135 break; 1136 1137 case SFX_STYLE_FAMILY_PSEUDO: 1138 { 1139 ASSERT(pNumRule, "Keine NumRule"); 1140 SvxNumRule aRule = pNumRule->MakeSvxNumRule(); 1141 aCoreSet.Put(SvxNumBulletItem(aRule)); 1142 } 1143 break; 1144 1145 default: 1146 ASSERT(!this, "unbekannte Style-Familie"); 1147 } 1148 // Member der Basisklasse 1149 pSet = &aCoreSet; 1150 1151 return aCoreSet; 1152 } 1153 1154 // --> OD 2008-02-13 #newlistlevelattrs# 1155 void SwDocStyleSheet::MergeIndentAttrsOfListStyle( SfxItemSet& rSet ) 1156 { 1157 if ( nFamily != SFX_STYLE_FAMILY_PARA ) 1158 { 1159 return; 1160 } 1161 1162 ASSERT( pColl, "<SwDocStyleSheet::MergeIndentAttrsOfListStyle(..)> - missing paragraph style"); 1163 if ( pColl->AreListLevelIndentsApplicable() ) 1164 { 1165 ASSERT( pColl->GetItemState( RES_PARATR_NUMRULE ) == SFX_ITEM_SET, 1166 "<SwDocStyleSheet::MergeIndentAttrsOfListStyle(..)> - list level indents are applicable at paragraph style, but no list style found. Serious defect -> please inform OD." ); 1167 const String sNumRule = pColl->GetNumRule().GetValue(); 1168 if( sNumRule.Len() ) 1169 { 1170 const SwNumRule* pRule = rDoc.FindNumRulePtr( sNumRule ); 1171 if( pRule ) 1172 { 1173 const SwNumFmt& rFmt = pRule->Get( 0 ); 1174 if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT ) 1175 { 1176 SvxLRSpaceItem aLR( RES_LR_SPACE ); 1177 aLR.SetTxtLeft( rFmt.GetIndentAt() ); 1178 aLR.SetTxtFirstLineOfst( static_cast<short>(rFmt.GetFirstLineIndent()) ); 1179 rSet.Put( aLR ); 1180 } 1181 } 1182 } 1183 } 1184 } 1185 // <-- 1186 1187 /*-------------------------------------------------------------------- 1188 Beschreibung: ItemSet setzen 1189 --------------------------------------------------------------------*/ 1190 1191 // --> OD 2008-02-12 #newlistlevelattrs# 1192 // handling of parameter <bResetIndentAttrsAtParagraphStyle> 1193 void SwDocStyleSheet::SetItemSet( const SfxItemSet& rSet, 1194 const bool bResetIndentAttrsAtParagraphStyle ) 1195 { 1196 // gegebenenfalls Format erst ermitteln 1197 if(!bPhysical) 1198 FillStyleSheet( FillPhysical ); 1199 1200 SwImplShellAction aTmpSh( rDoc ); 1201 1202 ASSERT( &rSet != &aCoreSet, "SetItemSet mit eigenem Set ist nicht erlaubt" ); 1203 1204 // --> OD 2008-02-12 #newlistlevelattrs# 1205 if (rDoc.GetIDocumentUndoRedo().DoesUndo()) 1206 { 1207 SwRewriter aRewriter; 1208 aRewriter.AddRule( UNDO_ARG1, GetName() ); 1209 rDoc.GetIDocumentUndoRedo().StartUndo( UNDO_INSFMTATTR, &aRewriter ); 1210 } 1211 // <-- 1212 1213 SwFmt* pFmt = 0; 1214 SwPageDesc* pNewDsc = 0; 1215 sal_uInt16 nPgDscPos = 0; 1216 1217 switch(nFamily) 1218 { 1219 case SFX_STYLE_FAMILY_CHAR : 1220 { 1221 ASSERT(pCharFmt, "Wo ist das CharFormat"); 1222 pFmt = pCharFmt; 1223 } 1224 break; 1225 1226 case SFX_STYLE_FAMILY_PARA : 1227 { 1228 ASSERT(pColl, "Wo ist die Collection"); 1229 const SfxPoolItem* pAutoUpdate; 1230 if(SFX_ITEM_SET == rSet.GetItemState(SID_ATTR_AUTO_STYLE_UPDATE,sal_False, &pAutoUpdate )) 1231 { 1232 pColl->SetAutoUpdateFmt(((const SfxBoolItem*)pAutoUpdate)->GetValue()); 1233 } 1234 1235 const SwCondCollItem* pCondItem; 1236 if( SFX_ITEM_SET != rSet.GetItemState( FN_COND_COLL, sal_False, 1237 (const SfxPoolItem**)&pCondItem )) 1238 pCondItem = 0; 1239 1240 if( RES_CONDTXTFMTCOLL == pColl->Which() && pCondItem ) 1241 { 1242 SwFmt* pFindFmt; 1243 const CommandStruct* pCmds = SwCondCollItem::GetCmds(); 1244 for(sal_uInt16 i = 0; i < COND_COMMAND_COUNT; i++) 1245 { 1246 SwCollCondition aCond( 0, pCmds[ i ].nCnd, pCmds[ i ].nSubCond ); 1247 ((SwConditionTxtFmtColl*)pColl)->RemoveCondition( aCond ); 1248 const String& rStyle = pCondItem->GetStyle( i ); 1249 if( rStyle.Len() && 1250 0 != ( pFindFmt = lcl_FindParaFmt( rDoc, rStyle, 0, sal_True ))) 1251 { 1252 aCond.RegisterToFormat( *pFindFmt ); 1253 ((SwConditionTxtFmtColl*)pColl)->InsertCondition( aCond ); 1254 } 1255 } 1256 1257 // Document auf die neue Bedingungen updaten 1258 SwCondCollCondChg aMsg( pColl ); 1259 pColl->ModifyNotification( &aMsg, &aMsg ); 1260 } 1261 else if( pCondItem && !pColl->GetDepends() ) 1262 { 1263 // keine bedingte Vorlage, dann erstmal erzeugen und 1264 // alle wichtigen Werte uebernehmen 1265 SwConditionTxtFmtColl* pCColl = rDoc.MakeCondTxtFmtColl( 1266 pColl->GetName(), (SwTxtFmtColl*)pColl->DerivedFrom() ); 1267 if( pColl != &pColl->GetNextTxtFmtColl() ) 1268 pCColl->SetNextTxtFmtColl( pColl->GetNextTxtFmtColl() ); 1269 1270 if( pColl->IsAssignedToListLevelOfOutlineStyle()) 1271 pCColl->AssignToListLevelOfOutlineStyle(pColl->GetAssignedOutlineStyleLevel()); 1272 else 1273 pCColl->DeleteAssignmentToListLevelOfOutlineStyle(); 1274 1275 1276 1277 SwTxtFmtColl* pFindFmt; 1278 const CommandStruct* pCmds = SwCondCollItem::GetCmds(); 1279 for( sal_uInt16 i = 0; i < COND_COMMAND_COUNT; ++i ) 1280 { 1281 const String& rStyle = pCondItem->GetStyle( i ); 1282 if( rStyle.Len() && 1283 0 != ( pFindFmt = lcl_FindParaFmt( rDoc, rStyle, 0, sal_True ))) 1284 { 1285 pCColl->InsertCondition( SwCollCondition( pFindFmt, 1286 pCmds[ i ].nCnd, pCmds[ i ].nSubCond ) ); 1287 } 1288 } 1289 1290 rDoc.DelTxtFmtColl( pColl ); 1291 pColl = pCColl; 1292 } 1293 // --> OD 2008-02-12 #newlistlevelattrs# 1294 if ( bResetIndentAttrsAtParagraphStyle && 1295 rSet.GetItemState( RES_PARATR_NUMRULE, sal_False, 0 ) == SFX_ITEM_SET && 1296 rSet.GetItemState( RES_LR_SPACE, sal_False, 0 ) != SFX_ITEM_SET && 1297 pColl->GetItemState( RES_LR_SPACE, sal_False, 0 ) == SFX_ITEM_SET ) 1298 { 1299 rDoc.ResetAttrAtFormat( RES_LR_SPACE, *pColl ); 1300 } 1301 // <-- 1302 1303 // #i56252: If a standard numbering style is assigned to a standard paragraph style 1304 // we have to create a physical instance of the numbering style. If we do not and 1305 // neither the paragraph style nor the numbering style is used in the document 1306 // the numbering style will not be saved with the document and the assignment got lost. 1307 const SfxPoolItem* pNumRuleItem = 0; 1308 if( SFX_ITEM_SET == rSet.GetItemState( RES_PARATR_NUMRULE, sal_False, &pNumRuleItem ) ) 1309 { // Setting a numbering rule? 1310 String sNumRule = ((SwNumRuleItem*)pNumRuleItem)->GetValue(); 1311 if( sNumRule.Len() ) 1312 { 1313 SwNumRule* pRule = rDoc.FindNumRulePtr( sNumRule ); 1314 if( !pRule ) 1315 { // Numbering rule not in use yet. 1316 sal_uInt16 nPoolId = SwStyleNameMapper::GetPoolIdFromUIName( sNumRule, nsSwGetPoolIdFromName::GET_POOLID_NUMRULE ); 1317 if( USHRT_MAX != nPoolId ) // It's a standard numbering rule 1318 { 1319 pRule = rDoc.GetNumRuleFromPool( nPoolId ); // Create numbering rule (physical) 1320 } 1321 } 1322 } 1323 } 1324 1325 pFmt = pColl; 1326 1327 sal_uInt16 nId = pColl->GetPoolFmtId() & 1328 ~ ( COLL_GET_RANGE_BITS | POOLGRP_NOCOLLID ); 1329 switch( GetMask() & ( 0x0fff & ~SWSTYLEBIT_CONDCOLL ) ) 1330 { 1331 case SWSTYLEBIT_TEXT: 1332 nId |= COLL_TEXT_BITS; 1333 break; 1334 case SWSTYLEBIT_CHAPTER: 1335 nId |= COLL_DOC_BITS; 1336 break; 1337 case SWSTYLEBIT_LIST: 1338 nId |= COLL_LISTS_BITS; 1339 break; 1340 case SWSTYLEBIT_IDX: 1341 nId |= COLL_REGISTER_BITS; 1342 break; 1343 case SWSTYLEBIT_EXTRA: 1344 nId |= COLL_EXTRA_BITS; 1345 break; 1346 case SWSTYLEBIT_HTML: 1347 nId |= COLL_HTML_BITS; 1348 break; 1349 } 1350 pColl->SetPoolFmtId( nId ); 1351 break; 1352 } 1353 case SFX_STYLE_FAMILY_FRAME: 1354 { 1355 ASSERT(pFrmFmt, "Wo ist das FrmFmt"); 1356 const SfxPoolItem* pAutoUpdate; 1357 if(SFX_ITEM_SET == rSet.GetItemState(SID_ATTR_AUTO_STYLE_UPDATE,sal_False, &pAutoUpdate )) 1358 { 1359 pFrmFmt->SetAutoUpdateFmt(((const SfxBoolItem*)pAutoUpdate)->GetValue()); 1360 } 1361 pFmt = pFrmFmt; 1362 } 1363 break; 1364 1365 case SFX_STYLE_FAMILY_PAGE : 1366 { 1367 ASSERT(pDesc, "Wo ist der PageDescriptor"); 1368 1369 if( rDoc.FindPageDescByName( pDesc->GetName(), &nPgDscPos )) 1370 { 1371 pNewDsc = new SwPageDesc( *pDesc ); 1372 // --> OD 2005-05-09 #i48949# - no undo actions for the 1373 // copy of the page style 1374 ::sw::UndoGuard const ug(rDoc.GetIDocumentUndoRedo()); 1375 rDoc.CopyPageDesc(*pDesc, *pNewDsc); // #i7983# 1376 // <-- 1377 1378 pFmt = &pNewDsc->GetMaster(); 1379 } 1380 } 1381 break; 1382 1383 case SFX_STYLE_FAMILY_PSEUDO: 1384 { 1385 ASSERT(pNumRule, "Wo ist die NumRule"); 1386 1387 if (!pNumRule) 1388 break; 1389 1390 const SfxPoolItem* pItem; 1391 switch( rSet.GetItemState( SID_ATTR_NUMBERING_RULE, sal_False, &pItem )) 1392 { 1393 case SFX_ITEM_SET: 1394 { 1395 SvxNumRule* pSetRule = ((SvxNumBulletItem*)pItem)->GetNumRule(); 1396 pSetRule->UnLinkGraphics(); 1397 //SwNumRule aSetRule(rDoc.GetUniqueNumRuleName()); 1398 SwNumRule aSetRule(*pNumRule); 1399 aSetRule.SetSvxRule(*pSetRule, &rDoc); 1400 rDoc.ChgNumRuleFmts( aSetRule ); 1401 } 1402 break; 1403 case SFX_ITEM_DONTCARE: 1404 // NumRule auf default Werte 1405 // was sind die default Werte? 1406 { 1407 // --> OD 2008-02-11 #newlistlevelattrs# 1408 SwNumRule aRule( pNumRule->GetName(), 1409 // --> OD 2008-06-06 #i89178# 1410 numfunc::GetDefaultPositionAndSpaceMode() ); 1411 // <-- 1412 // <-- 1413 rDoc.ChgNumRuleFmts( aRule ); 1414 } 1415 break; 1416 } 1417 } 1418 break; 1419 1420 default: 1421 ASSERT(!this, "unbekannte Style-Familie"); 1422 } 1423 1424 if( pFmt && rSet.Count()) 1425 { 1426 SfxItemIter aIter( rSet ); 1427 const SfxPoolItem* pItem = aIter.GetCurItem(); 1428 while( sal_True ) 1429 { 1430 if( IsInvalidItem( pItem ) ) // Clearen 1431 { 1432 // --> OD 2008-02-12 #newlistlevelattrs# 1433 // use method <SwDoc::ResetAttrAtFormat(..)> in order to 1434 // create an Undo object for the attribute reset. 1435 // pFmt->ResetAttr( rSet.GetWhichByPos(aIter.GetCurPos())); 1436 rDoc.ResetAttrAtFormat( rSet.GetWhichByPos(aIter.GetCurPos()), 1437 *pFmt ); 1438 } 1439 1440 if( aIter.IsAtEnd() ) 1441 break; 1442 pItem = aIter.NextItem(); 1443 } 1444 SfxItemSet aSet(rSet); 1445 aSet.ClearInvalidItems(); 1446 1447 if(SFX_STYLE_FAMILY_FRAME == nFamily) 1448 { 1449 //UUUU Need to check for unique item for DrawingLayer items of type NameOrIndex 1450 // and evtl. correct that item to ensure unique names for that type. This call may 1451 // modify/correct entries inside of the given SfxItemSet 1452 rDoc.CheckForUniqueItemForLineFillNameOrIndex(aSet); 1453 } 1454 1455 aCoreSet.ClearItem(); 1456 1457 if( pNewDsc ) 1458 { 1459 ::ItemSetToPageDesc( aSet, *pNewDsc ); 1460 rDoc.ChgPageDesc( nPgDscPos, *pNewDsc ); 1461 pDesc = &const_cast<const SwDoc &>(rDoc).GetPageDesc( nPgDscPos ); 1462 rDoc.PreDelPageDesc(pNewDsc); // #i7983# 1463 delete pNewDsc; 1464 } 1465 else 1466 rDoc.ChgFmt(*pFmt, aSet); // alles gesetzten Putten 1467 } 1468 else 1469 { 1470 aCoreSet.ClearItem(); 1471 if( pNewDsc ) // den muessen wir noch vernichten!! 1472 { 1473 rDoc.PreDelPageDesc(pNewDsc); // #i7983# 1474 delete pNewDsc; 1475 } 1476 } 1477 1478 // --> OD 2008-02-12 #newlistlevelattrs# 1479 if (rDoc.GetIDocumentUndoRedo().DoesUndo()) 1480 { 1481 rDoc.GetIDocumentUndoRedo().EndUndo(UNDO_END, 0); 1482 } 1483 // <-- 1484 } 1485 1486 void lcl_SaveStyles( sal_uInt16 nFamily, SvPtrarr& rArr, SwDoc& rDoc ) 1487 { 1488 switch( nFamily ) 1489 { 1490 case SFX_STYLE_FAMILY_CHAR: 1491 { 1492 const SwCharFmts& rTbl = *rDoc.GetCharFmts(); 1493 for( sal_uInt16 n = 0, nCnt = rTbl.Count(); n < nCnt; ++n ) 1494 { 1495 void* p = (void*)rTbl[ n ]; 1496 rArr.Insert( p, n ); 1497 } 1498 } 1499 break; 1500 case SFX_STYLE_FAMILY_PARA: 1501 { 1502 const SwTxtFmtColls& rTbl = *rDoc.GetTxtFmtColls(); 1503 for( sal_uInt16 n = 0, nCnt = rTbl.Count(); n < nCnt; ++n ) 1504 { 1505 void* p = (void*)rTbl[ n ]; 1506 rArr.Insert( p, n ); 1507 } 1508 } 1509 break; 1510 case SFX_STYLE_FAMILY_FRAME: 1511 { 1512 const SwFrmFmts& rTbl = *rDoc.GetFrmFmts(); 1513 for( sal_uInt16 n = 0, nCnt = rTbl.Count(); n < nCnt; ++n ) 1514 { 1515 void* p = (void*)rTbl[ n ]; 1516 rArr.Insert( p, n ); 1517 } 1518 } 1519 break; 1520 1521 case SFX_STYLE_FAMILY_PAGE: 1522 { 1523 for( sal_uInt16 n = 0, nCnt = rDoc.GetPageDescCnt(); n < nCnt; ++n ) 1524 { 1525 void* p = 1526 (void*)&const_cast<const SwDoc &>(rDoc).GetPageDesc( n ); 1527 rArr.Insert( p, n ); 1528 } 1529 } 1530 break; 1531 1532 case SFX_STYLE_FAMILY_PSEUDO: 1533 { 1534 const SwNumRuleTbl& rTbl = rDoc.GetNumRuleTbl(); 1535 for( sal_uInt16 n = 0, nCnt = rTbl.Count(); n < nCnt; ++n ) 1536 { 1537 void* p = (void*)rTbl[ n ]; 1538 rArr.Insert( p, n ); 1539 } 1540 } 1541 break; 1542 } 1543 } 1544 1545 void lcl_DeleteInfoStyles( sal_uInt16 nFamily, SvPtrarr& rArr, SwDoc& rDoc ) 1546 { 1547 sal_uInt16 n, nCnt; 1548 switch( nFamily ) 1549 { 1550 case SFX_STYLE_FAMILY_CHAR: 1551 { 1552 SvUShorts aDelArr; 1553 const SwCharFmts& rTbl = *rDoc.GetCharFmts(); 1554 for( n = 0, nCnt = rTbl.Count(); n < nCnt; ++n ) 1555 { 1556 void* p = (void*)rTbl[ n ]; 1557 if( USHRT_MAX == rArr.GetPos( p )) 1558 aDelArr.Insert( n, 0 ); 1559 } 1560 for( n = 0, nCnt = aDelArr.Count(); n < nCnt; ++n ) 1561 rDoc.DelCharFmt( aDelArr[ n ] ); 1562 } 1563 break; 1564 1565 case SFX_STYLE_FAMILY_PARA : 1566 { 1567 SvUShorts aDelArr; 1568 const SwTxtFmtColls& rTbl = *rDoc.GetTxtFmtColls(); 1569 for( n = 0, nCnt = rTbl.Count(); n < nCnt; ++n ) 1570 { 1571 void* p = (void*)rTbl[ n ]; 1572 if( USHRT_MAX == rArr.GetPos( p )) 1573 aDelArr.Insert( n, 0 ); 1574 } 1575 for( n = 0, nCnt = aDelArr.Count(); n < nCnt; ++n ) 1576 rDoc.DelTxtFmtColl( aDelArr[ n ] ); 1577 } 1578 break; 1579 1580 case SFX_STYLE_FAMILY_FRAME: 1581 { 1582 SvPtrarr aDelArr; 1583 const SwFrmFmts& rTbl = *rDoc.GetFrmFmts(); 1584 for( n = 0, nCnt = rTbl.Count(); n < nCnt; ++n ) 1585 { 1586 void* p = (void*)rTbl[ n ]; 1587 if( USHRT_MAX == rArr.GetPos( p )) 1588 aDelArr.Insert( p, 0 ); 1589 } 1590 for( n = 0, nCnt = aDelArr.Count(); n < nCnt; ++n ) 1591 rDoc.DelFrmFmt( (SwFrmFmt*)aDelArr[ n ] ); 1592 } 1593 break; 1594 1595 case SFX_STYLE_FAMILY_PAGE: 1596 { 1597 SvUShorts aDelArr; 1598 for( n = 0, nCnt = rDoc.GetPageDescCnt(); n < nCnt; ++n ) 1599 { 1600 void* p = 1601 (void*)&const_cast<const SwDoc &>(rDoc).GetPageDesc( n ); 1602 if( USHRT_MAX == rArr.GetPos( p )) 1603 aDelArr.Insert( n, 0 ); 1604 } 1605 for( n = 0, nCnt = aDelArr.Count(); n < nCnt; ++n ) 1606 rDoc.DelPageDesc( aDelArr[ n ] ); 1607 } 1608 break; 1609 1610 1611 case SFX_STYLE_FAMILY_PSEUDO: 1612 { 1613 SvPtrarr aDelArr; 1614 const SwNumRuleTbl& rTbl = rDoc.GetNumRuleTbl(); 1615 for( n = 0, nCnt = rTbl.Count(); n < nCnt; ++n ) 1616 { 1617 void* p = (void*)rTbl[ n ]; 1618 if( USHRT_MAX == rArr.GetPos( p )) 1619 aDelArr.Insert( p, 0 ); 1620 } 1621 for( n = 0, nCnt = aDelArr.Count(); n < nCnt; ++n ) 1622 rDoc.DelNumRule( ((SwNumRule*)aDelArr[ n ])->GetName() ); 1623 } 1624 break; 1625 } 1626 } 1627 1628 /*-------------------------------------------------------------------- 1629 Beschreibung: Das Format ermitteln 1630 --------------------------------------------------------------------*/ 1631 1632 sal_Bool SwDocStyleSheet::FillStyleSheet( FillStyleType eFType ) 1633 { 1634 sal_Bool bRet = sal_False; 1635 sal_uInt16 nPoolId = USHRT_MAX; 1636 SwFmt* pFmt = 0; 1637 1638 sal_Bool bCreate = FillPhysical == eFType; 1639 sal_Bool bDeleteInfo = sal_False; 1640 sal_Bool bFillOnlyInfo = FillAllInfo == eFType; 1641 SvPtrarr aDelArr; 1642 1643 switch(nFamily) 1644 { 1645 case SFX_STYLE_FAMILY_CHAR: 1646 pCharFmt = lcl_FindCharFmt(rDoc, aName, this, bCreate ); 1647 bPhysical = 0 != pCharFmt; 1648 if( bFillOnlyInfo && !bPhysical ) 1649 { 1650 bDeleteInfo = sal_True; 1651 ::lcl_SaveStyles( static_cast< sal_uInt16 >(nFamily), aDelArr, rDoc ); 1652 pCharFmt = lcl_FindCharFmt(rDoc, aName, this, sal_True ); 1653 } 1654 1655 pFmt = pCharFmt; 1656 if( !bCreate && !pFmt ) 1657 { 1658 if( aName == *SwStyleNameMapper::GetTextUINameArray()[ RES_POOLCOLL_STANDARD - 1659 RES_POOLCOLL_TEXT_BEGIN ] ) 1660 nPoolId = 0; 1661 else 1662 nPoolId = SwStyleNameMapper::GetPoolIdFromUIName( aName, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT ); 1663 } 1664 1665 bRet = 0 != pCharFmt || USHRT_MAX != nPoolId; 1666 1667 if( bDeleteInfo ) 1668 pCharFmt = 0; 1669 break; 1670 1671 case SFX_STYLE_FAMILY_PARA: 1672 { 1673 pColl = lcl_FindParaFmt(rDoc, aName, this, bCreate); 1674 bPhysical = 0 != pColl; 1675 if( bFillOnlyInfo && !bPhysical ) 1676 { 1677 bDeleteInfo = sal_True; 1678 ::lcl_SaveStyles( static_cast< sal_uInt16 >(nFamily), aDelArr, rDoc ); 1679 pColl = lcl_FindParaFmt(rDoc, aName, this, sal_True ); 1680 } 1681 1682 pFmt = pColl; 1683 if( pColl ) 1684 PresetFollow( pColl->GetNextTxtFmtColl().GetName() ); 1685 else if( !bCreate ) 1686 nPoolId = SwStyleNameMapper::GetPoolIdFromUIName( aName, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL ); 1687 1688 bRet = 0 != pColl || USHRT_MAX != nPoolId; 1689 1690 if( bDeleteInfo ) 1691 pColl = 0; 1692 } 1693 break; 1694 1695 case SFX_STYLE_FAMILY_FRAME: 1696 pFrmFmt = lcl_FindFrmFmt(rDoc, aName, this, bCreate); 1697 bPhysical = 0 != pFrmFmt; 1698 if( bFillOnlyInfo && bPhysical ) 1699 { 1700 bDeleteInfo = sal_True; 1701 ::lcl_SaveStyles( static_cast< sal_uInt16 >(nFamily), aDelArr, rDoc ); 1702 pFrmFmt = lcl_FindFrmFmt(rDoc, aName, this, sal_True ); 1703 } 1704 pFmt = pFrmFmt; 1705 if( !bCreate && !pFmt ) 1706 nPoolId = SwStyleNameMapper::GetPoolIdFromUIName( aName, nsSwGetPoolIdFromName::GET_POOLID_FRMFMT ); 1707 1708 bRet = 0 != pFrmFmt || USHRT_MAX != nPoolId; 1709 1710 if( bDeleteInfo ) 1711 pFrmFmt = 0; 1712 break; 1713 1714 case SFX_STYLE_FAMILY_PAGE: 1715 pDesc = lcl_FindPageDesc(rDoc, aName, this, bCreate); 1716 bPhysical = 0 != pDesc; 1717 if( bFillOnlyInfo && !pDesc ) 1718 { 1719 bDeleteInfo = sal_True; 1720 ::lcl_SaveStyles( static_cast< sal_uInt16 >(nFamily), aDelArr, rDoc ); 1721 pDesc = lcl_FindPageDesc( rDoc, aName, this, sal_True ); 1722 } 1723 1724 if( pDesc ) 1725 { 1726 nPoolId = pDesc->GetPoolFmtId(); 1727 nHelpId = pDesc->GetPoolHelpId(); 1728 if( pDesc->GetPoolHlpFileId() != UCHAR_MAX ) 1729 aHelpFile = *rDoc.GetDocPattern( pDesc->GetPoolHlpFileId() ); 1730 else 1731 aHelpFile.Erase(); 1732 } 1733 else if( !bCreate ) 1734 nPoolId = SwStyleNameMapper::GetPoolIdFromUIName( aName, nsSwGetPoolIdFromName::GET_POOLID_PAGEDESC ); 1735 SetMask( USER_FMT & nPoolId ? SFXSTYLEBIT_USERDEF : 0 ); 1736 1737 bRet = 0 != pDesc || USHRT_MAX != nPoolId; 1738 if( bDeleteInfo ) 1739 pDesc = 0; 1740 break; 1741 1742 case SFX_STYLE_FAMILY_PSEUDO: 1743 pNumRule = lcl_FindNumRule(rDoc, aName, this, bCreate); 1744 bPhysical = 0 != pNumRule; 1745 if( bFillOnlyInfo && !pNumRule ) 1746 { 1747 bDeleteInfo = sal_True; 1748 ::lcl_SaveStyles( static_cast< sal_uInt16 >(nFamily), aDelArr, rDoc ); 1749 pNumRule = lcl_FindNumRule( rDoc, aName, this, sal_True ); 1750 } 1751 1752 if( pNumRule ) 1753 { 1754 nPoolId = pNumRule->GetPoolFmtId(); 1755 nHelpId = pNumRule->GetPoolHelpId(); 1756 if( pNumRule->GetPoolHlpFileId() != UCHAR_MAX ) 1757 aHelpFile = *rDoc.GetDocPattern( pNumRule->GetPoolHlpFileId() ); 1758 else 1759 aHelpFile.Erase(); 1760 } 1761 else if( !bCreate ) 1762 nPoolId = SwStyleNameMapper::GetPoolIdFromUIName( aName, nsSwGetPoolIdFromName::GET_POOLID_NUMRULE ); 1763 SetMask( USER_FMT & nPoolId ? SFXSTYLEBIT_USERDEF : 0 ); 1764 1765 bRet = 0 != pNumRule || USHRT_MAX != nPoolId; 1766 1767 if( bDeleteInfo ) 1768 pNumRule = 0; 1769 break; 1770 default:; //prevent warning 1771 } 1772 1773 if( SFX_STYLE_FAMILY_CHAR == nFamily || 1774 SFX_STYLE_FAMILY_PARA == nFamily || 1775 SFX_STYLE_FAMILY_FRAME == nFamily ) 1776 { 1777 if( pFmt ) 1778 nPoolId = pFmt->GetPoolFmtId(); 1779 1780 sal_uInt16 _nMask = 0; 1781 if( pFmt == rDoc.GetDfltCharFmt() ) 1782 _nMask |= SFXSTYLEBIT_READONLY; 1783 else if( USER_FMT & nPoolId ) 1784 _nMask |= SFXSTYLEBIT_USERDEF; 1785 1786 switch ( COLL_GET_RANGE_BITS & nPoolId ) 1787 { 1788 case COLL_TEXT_BITS: _nMask |= SWSTYLEBIT_TEXT; break; 1789 case COLL_DOC_BITS : _nMask |= SWSTYLEBIT_CHAPTER; break; 1790 case COLL_LISTS_BITS: _nMask |= SWSTYLEBIT_LIST; break; 1791 case COLL_REGISTER_BITS: _nMask |= SWSTYLEBIT_IDX; break; 1792 case COLL_EXTRA_BITS: _nMask |= SWSTYLEBIT_EXTRA; break; 1793 case COLL_HTML_BITS: _nMask |= SWSTYLEBIT_HTML; break; 1794 } 1795 1796 if( pFmt ) 1797 { 1798 ASSERT( bPhysical, "Format nicht gefunden" ); 1799 1800 nHelpId = pFmt->GetPoolHelpId(); 1801 if( pFmt->GetPoolHlpFileId() != UCHAR_MAX ) 1802 aHelpFile = *rDoc.GetDocPattern( pFmt->GetPoolHlpFileId() ); 1803 else 1804 aHelpFile.Erase(); 1805 1806 if( RES_CONDTXTFMTCOLL == pFmt->Which() ) 1807 _nMask |= SWSTYLEBIT_CONDCOLL; 1808 } 1809 1810 SetMask( _nMask ); 1811 } 1812 if( bDeleteInfo && bFillOnlyInfo ) 1813 ::lcl_DeleteInfoStyles( static_cast< sal_uInt16 >(nFamily), aDelArr, rDoc ); 1814 return bRet; 1815 } 1816 1817 /*-------------------------------------------------------------------- 1818 Beschreibung: Neues Format in der Core anlegen 1819 --------------------------------------------------------------------*/ 1820 1821 1822 void SwDocStyleSheet::Create() 1823 { 1824 switch(nFamily) 1825 { 1826 case SFX_STYLE_FAMILY_CHAR : 1827 pCharFmt = lcl_FindCharFmt( rDoc, aName ); 1828 if( !pCharFmt ) 1829 pCharFmt = rDoc.MakeCharFmt(aName, 1830 rDoc.GetDfltCharFmt()); 1831 pCharFmt->SetAuto( sal_False ); 1832 break; 1833 1834 case SFX_STYLE_FAMILY_PARA : 1835 pColl = lcl_FindParaFmt( rDoc, aName ); 1836 if( !pColl ) 1837 { 1838 SwTxtFmtColl *pPar = (*rDoc.GetTxtFmtColls())[0]; 1839 if( nMask & SWSTYLEBIT_CONDCOLL ) 1840 pColl = rDoc.MakeCondTxtFmtColl( aName, pPar ); 1841 else 1842 pColl = rDoc.MakeTxtFmtColl( aName, pPar ); 1843 } 1844 break; 1845 1846 case SFX_STYLE_FAMILY_FRAME: 1847 pFrmFmt = lcl_FindFrmFmt( rDoc, aName ); 1848 if( !pFrmFmt ) 1849 pFrmFmt = rDoc.MakeFrmFmt(aName, rDoc.GetDfltFrmFmt(), sal_False, sal_False); 1850 1851 break; 1852 1853 case SFX_STYLE_FAMILY_PAGE : 1854 pDesc = lcl_FindPageDesc( rDoc, aName ); 1855 if( !pDesc ) 1856 { 1857 sal_uInt16 nId = rDoc.MakePageDesc(aName); 1858 pDesc = &const_cast<const SwDoc &>(rDoc).GetPageDesc(nId); 1859 } 1860 break; 1861 1862 case SFX_STYLE_FAMILY_PSEUDO: 1863 pNumRule = lcl_FindNumRule( rDoc, aName ); 1864 if( !pNumRule ) 1865 { 1866 //JP 05.02.99: temp Namen erzeugen, damit kein ASSERT kommt 1867 String sTmpNm( aName ); 1868 if( !aName.Len() ) 1869 sTmpNm = rDoc.GetUniqueNumRuleName(); 1870 1871 // --> OD 2008-02-11 #newlistlevelattrs# 1872 SwNumRule* pRule = rDoc.GetNumRuleTbl()[ 1873 rDoc.MakeNumRule( sTmpNm, 0, sal_False, 1874 // --> OD 2008-06-06 #i89178# 1875 numfunc::GetDefaultPositionAndSpaceMode() ) ]; 1876 // <-- 1877 // <-- 1878 pRule->SetAutoRule( sal_False ); 1879 if( !aName.Len() ) 1880 { 1881 // --> OD 2008-07-08 #i91400# 1882 pRule->SetName( aName, rDoc ); 1883 // <-- 1884 } 1885 pNumRule = pRule; 1886 } 1887 break; 1888 default:; //prevent warning 1889 } 1890 bPhysical = sal_True; 1891 aCoreSet.ClearItem(); 1892 } 1893 1894 /*-------------------------------------------------------------------- 1895 Beschreibung: Konkrete Formate rausholen 1896 --------------------------------------------------------------------*/ 1897 1898 1899 1900 SwCharFmt* SwDocStyleSheet::GetCharFmt() 1901 { 1902 if(!bPhysical) 1903 FillStyleSheet( FillPhysical ); 1904 return pCharFmt; 1905 } 1906 1907 1908 SwTxtFmtColl* SwDocStyleSheet::GetCollection() 1909 { 1910 if(!bPhysical) 1911 FillStyleSheet( FillPhysical ); 1912 return pColl; 1913 } 1914 1915 1916 const SwPageDesc* SwDocStyleSheet::GetPageDesc() 1917 { 1918 if(!bPhysical) 1919 FillStyleSheet( FillPhysical ); 1920 return pDesc; 1921 } 1922 1923 const SwNumRule * SwDocStyleSheet::GetNumRule() 1924 { 1925 if(!bPhysical) 1926 FillStyleSheet( FillPhysical ); 1927 return pNumRule; 1928 } 1929 1930 void SwDocStyleSheet::SetNumRule(const SwNumRule& rRule) 1931 { 1932 DBG_ASSERT(pNumRule, "Wo ist die NumRule"); 1933 rDoc.ChgNumRuleFmts( rRule ); 1934 } 1935 1936 // Namen UND Familie aus String re-generieren 1937 // First() und Next() (s.u.) fuegen einen Kennbuchstaben an Pos.1 ein 1938 1939 void SwDocStyleSheet::PresetNameAndFamily(const String& rName) 1940 { 1941 switch( rName.GetChar(0) ) 1942 { 1943 case cPARA: nFamily = SFX_STYLE_FAMILY_PARA; break; 1944 case cFRAME: nFamily = SFX_STYLE_FAMILY_FRAME; break; 1945 case cPAGE: nFamily = SFX_STYLE_FAMILY_PAGE; break; 1946 case cNUMRULE: nFamily = SFX_STYLE_FAMILY_PSEUDO; break; 1947 default: nFamily = SFX_STYLE_FAMILY_CHAR; break; 1948 } 1949 aName = rName; 1950 aName.Erase( 0, 1 ); 1951 } 1952 1953 /*-------------------------------------------------------------------- 1954 Beschreibung: Ist das Format physikalisch schon vorhanden 1955 --------------------------------------------------------------------*/ 1956 1957 1958 void SwDocStyleSheet::SetPhysical(sal_Bool bPhys) 1959 { 1960 bPhysical = bPhys; 1961 1962 if(!bPhys) 1963 { 1964 pCharFmt = 0; 1965 pColl = 0; 1966 pFrmFmt = 0; 1967 pDesc = 0; 1968 } 1969 } 1970 1971 SwFrmFmt* SwDocStyleSheet::GetFrmFmt() 1972 { 1973 if(!bPhysical) 1974 FillStyleSheet( FillPhysical ); 1975 return pFrmFmt; 1976 } 1977 1978 1979 sal_Bool SwDocStyleSheet::IsUsed() const 1980 { 1981 if( !bPhysical ) 1982 { 1983 SwDocStyleSheet* pThis = (SwDocStyleSheet*)this; 1984 pThis->FillStyleSheet( FillOnlyName ); 1985 } 1986 1987 // immer noch nicht ? 1988 if( !bPhysical ) 1989 return sal_False; 1990 1991 const SwModify* pMod; 1992 switch( nFamily ) 1993 { 1994 case SFX_STYLE_FAMILY_CHAR : pMod = pCharFmt; break; 1995 case SFX_STYLE_FAMILY_PARA : pMod = pColl; break; 1996 case SFX_STYLE_FAMILY_FRAME: pMod = pFrmFmt; break; 1997 case SFX_STYLE_FAMILY_PAGE : pMod = pDesc; break; 1998 1999 case SFX_STYLE_FAMILY_PSEUDO: 2000 return pNumRule ? rDoc.IsUsed( *pNumRule ) : sal_False; 2001 2002 default: 2003 ASSERT(!this, "unbekannte Style-Familie"); 2004 return sal_False; 2005 } 2006 return rDoc.IsUsed( *pMod ); 2007 } 2008 2009 2010 sal_uLong SwDocStyleSheet::GetHelpId( String& rFile ) 2011 { 2012 static String sTemplateHelpFile = String::CreateFromAscii("swrhlppi.hlp"); 2013 2014 sal_uInt16 nId = 0; 2015 sal_uInt16 nPoolId = 0; 2016 unsigned char nFileId = UCHAR_MAX; 2017 2018 rFile = sTemplateHelpFile; 2019 2020 const SwFmt* pTmpFmt = 0; 2021 switch( nFamily ) 2022 { 2023 case SFX_STYLE_FAMILY_CHAR : 2024 if( !pCharFmt && 2025 0 == (pCharFmt = lcl_FindCharFmt( rDoc, aName, 0, sal_False )) ) 2026 { 2027 nId = SwStyleNameMapper::GetPoolIdFromUIName( aName, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT ); 2028 return USHRT_MAX == nId ? 0 : nId; 2029 } 2030 pTmpFmt = pCharFmt; 2031 break; 2032 2033 case SFX_STYLE_FAMILY_PARA: 2034 if( !pColl && 2035 0 == ( pColl = lcl_FindParaFmt( rDoc, aName, 0, sal_False )) ) 2036 { 2037 nId = SwStyleNameMapper::GetPoolIdFromUIName( aName, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL ); 2038 return USHRT_MAX == nId ? 0 : nId; 2039 } 2040 pTmpFmt = pColl; 2041 break; 2042 2043 case SFX_STYLE_FAMILY_FRAME: 2044 if( !pFrmFmt && 2045 0 == ( pFrmFmt = lcl_FindFrmFmt( rDoc, aName, 0, sal_False ) ) ) 2046 { 2047 nId = SwStyleNameMapper::GetPoolIdFromUIName( aName, nsSwGetPoolIdFromName::GET_POOLID_FRMFMT ); 2048 return USHRT_MAX == nId ? 0 : nId; 2049 } 2050 pTmpFmt = pFrmFmt; 2051 break; 2052 2053 case SFX_STYLE_FAMILY_PAGE: 2054 if( !pDesc && 2055 0 == ( pDesc = lcl_FindPageDesc( rDoc, aName, 0, sal_False ) ) ) 2056 { 2057 nId = SwStyleNameMapper::GetPoolIdFromUIName( aName, nsSwGetPoolIdFromName::GET_POOLID_PAGEDESC ); 2058 return USHRT_MAX == nId ? 0 : nId; 2059 } 2060 2061 nId = pDesc->GetPoolHelpId(); 2062 nFileId = pDesc->GetPoolHlpFileId(); 2063 nPoolId = pDesc->GetPoolFmtId(); 2064 break; 2065 2066 case SFX_STYLE_FAMILY_PSEUDO: 2067 if( !pNumRule && 2068 0 == ( pNumRule = lcl_FindNumRule( rDoc, aName, 0, sal_False ) ) ) 2069 { 2070 nId = SwStyleNameMapper::GetPoolIdFromUIName( aName, nsSwGetPoolIdFromName::GET_POOLID_NUMRULE ); 2071 return USHRT_MAX == nId ? 0 : nId; 2072 } 2073 2074 nId = pNumRule->GetPoolHelpId(); 2075 nFileId = pNumRule->GetPoolHlpFileId(); 2076 nPoolId = pNumRule->GetPoolFmtId(); 2077 break; 2078 2079 default: 2080 ASSERT(!this, "unbekannte Style-Familie"); 2081 return 0; 2082 } 2083 2084 if( pTmpFmt ) 2085 { 2086 nId = pTmpFmt->GetPoolHelpId(); 2087 nFileId = pTmpFmt->GetPoolHlpFileId(); 2088 nPoolId = pTmpFmt->GetPoolFmtId(); 2089 } 2090 2091 if( UCHAR_MAX != nFileId ) 2092 { 2093 const String *pTemplate = rDoc.GetDocPattern( nFileId ); 2094 if( pTemplate ) 2095 { 2096 // const String aHelpPath(MakeHelpPath(*pTemplate)); 2097 rFile = *pTemplate; 2098 } 2099 } 2100 else if( !IsPoolUserFmt( nPoolId ) ) 2101 { 2102 nId = nPoolId; 2103 } 2104 2105 // weil sich der SFX so anstellt mit der HilfeId: 2106 if( USHRT_MAX == nId ) 2107 nId = 0; // entsp. keine Hilfe anzeigen 2108 2109 return nId; 2110 } 2111 2112 2113 void SwDocStyleSheet::SetHelpId( const String& r, sal_uLong nId ) 2114 { 2115 sal_uInt8 nFileId = static_cast< sal_uInt8 >(rDoc.SetDocPattern( r )); 2116 sal_uInt16 nHId = static_cast< sal_uInt16 >(nId); //!! SFX hat eigenmaechtig auf sal_uLong umgestellt! 2117 2118 SwFmt* pTmpFmt = 0; 2119 switch( nFamily ) 2120 { 2121 case SFX_STYLE_FAMILY_CHAR : pTmpFmt = pCharFmt; break; 2122 case SFX_STYLE_FAMILY_PARA : pTmpFmt = pColl; break; 2123 case SFX_STYLE_FAMILY_FRAME: pTmpFmt = pFrmFmt; break; 2124 case SFX_STYLE_FAMILY_PAGE : 2125 ((SwPageDesc*)pDesc)->SetPoolHelpId( nHId ); 2126 ((SwPageDesc*)pDesc)->SetPoolHlpFileId( nFileId ); 2127 break; 2128 2129 case SFX_STYLE_FAMILY_PSEUDO: 2130 ((SwNumRule*)pNumRule)->SetPoolHelpId( nHId ); 2131 ((SwNumRule*)pNumRule)->SetPoolHlpFileId( nFileId ); 2132 break; 2133 2134 default: 2135 ASSERT(!this, "unbekannte Style-Familie"); 2136 return ; 2137 } 2138 if( pTmpFmt ) 2139 { 2140 pTmpFmt->SetPoolHelpId( nHId ); 2141 pTmpFmt->SetPoolHlpFileId( nFileId ); 2142 } 2143 } 2144 2145 2146 /* */ 2147 2148 /*-------------------------------------------------------------------- 2149 Beschreibung: Methoden fuer den DocStyleSheetPool 2150 --------------------------------------------------------------------*/ 2151 2152 SwDocStyleSheetPool::SwDocStyleSheetPool( SwDoc& rDocument, sal_Bool bOrg ) 2153 : SfxStyleSheetBasePool( rDocument.GetAttrPool() ) 2154 , mxStyleSheet( new SwDocStyleSheet( rDocument, aEmptyStr, *this, SFX_STYLE_FAMILY_CHAR, 0 ) ) 2155 , rDoc( rDocument ) 2156 { 2157 bOrganizer = bOrg; 2158 } 2159 2160 SwDocStyleSheetPool::~SwDocStyleSheetPool() 2161 { 2162 } 2163 2164 void SAL_CALL SwDocStyleSheetPool::acquire( ) throw () 2165 { 2166 comphelper::OWeakTypeObject::acquire(); 2167 } 2168 2169 void SAL_CALL SwDocStyleSheetPool::release( ) throw () 2170 { 2171 comphelper::OWeakTypeObject::release(); 2172 } 2173 2174 SfxStyleSheetBase& SwDocStyleSheetPool::Make( 2175 const String& rName, 2176 SfxStyleFamily eFam, 2177 sal_uInt16 _nMask, 2178 sal_uInt16 /*nPos*/ ) 2179 { 2180 mxStyleSheet->PresetName(rName); 2181 mxStyleSheet->PresetParent(aEmptyStr); 2182 mxStyleSheet->PresetFollow(aEmptyStr); 2183 mxStyleSheet->SetMask(_nMask) ; 2184 mxStyleSheet->SetFamily(eFam); 2185 mxStyleSheet->SetPhysical(sal_True); 2186 mxStyleSheet->Create(); 2187 2188 return *mxStyleSheet.get(); 2189 } 2190 2191 2192 SfxStyleSheetBase* SwDocStyleSheetPool::Create( const SfxStyleSheetBase& /*rOrg*/) 2193 { 2194 ASSERT(!this , "Create im SW-Stylesheet-Pool geht nicht" ); 2195 return NULL; 2196 } 2197 2198 2199 SfxStyleSheetBase* SwDocStyleSheetPool::Create( const String &, 2200 SfxStyleFamily, sal_uInt16 ) 2201 { 2202 ASSERT( !this, "Create im SW-Stylesheet-Pool geht nicht" ); 2203 return NULL; 2204 } 2205 2206 void SwDocStyleSheetPool::Replace( SfxStyleSheetBase& rSource, 2207 SfxStyleSheetBase& rTarget ) 2208 { 2209 SfxStyleFamily eFamily( rSource.GetFamily() ); 2210 if( rSource.HasParentSupport()) 2211 { 2212 const String& rParentName = rSource.GetParent(); 2213 if( 0 != rParentName.Len() ) 2214 { 2215 SfxStyleSheetBase* pParentOfNew = Find( rParentName, eFamily ); 2216 if( pParentOfNew ) 2217 rTarget.SetParent( rParentName ); 2218 } 2219 } 2220 if( rSource.HasFollowSupport()) 2221 { 2222 const String& rFollowName = rSource.GetFollow(); 2223 if( 0 != rFollowName.Len() ) 2224 { 2225 SfxStyleSheetBase* pFollowOfNew = Find( rFollowName, eFamily ); 2226 if( pFollowOfNew ) 2227 rTarget.SetFollow( rFollowName ); 2228 } 2229 } 2230 2231 SwImplShellAction aTmpSh( rDoc ); 2232 2233 sal_Bool bSwSrcPool = GetAppName() == rSource.GetPool().GetAppName(); 2234 if( SFX_STYLE_FAMILY_PAGE == eFamily && bSwSrcPool ) 2235 { 2236 // gesondert behandeln!! 2237 SwPageDesc* pDestDsc = 2238 (SwPageDesc*)((SwDocStyleSheet&)rTarget).GetPageDesc(); 2239 SwPageDesc* pCpyDsc = 2240 (SwPageDesc*)((SwDocStyleSheet&)rSource).GetPageDesc(); 2241 rDoc.CopyPageDesc( *pCpyDsc, *pDestDsc ); 2242 } 2243 else 2244 { 2245 const SwFmt *pSourceFmt = 0; 2246 SwFmt *pTargetFmt = 0; 2247 sal_uInt16 nPgDscPos = USHRT_MAX; 2248 switch( eFamily ) 2249 { 2250 case SFX_STYLE_FAMILY_CHAR : 2251 if( bSwSrcPool ) 2252 pSourceFmt = ((SwDocStyleSheet&)rSource).GetCharFmt(); 2253 pTargetFmt = ((SwDocStyleSheet&)rTarget).GetCharFmt(); 2254 break; 2255 case SFX_STYLE_FAMILY_PARA : 2256 if( bSwSrcPool ) 2257 pSourceFmt = ((SwDocStyleSheet&)rSource).GetCollection(); 2258 pTargetFmt = ((SwDocStyleSheet&)rTarget).GetCollection(); 2259 break; 2260 case SFX_STYLE_FAMILY_FRAME: 2261 if( bSwSrcPool ) 2262 pSourceFmt = ((SwDocStyleSheet&)rSource).GetFrmFmt(); 2263 pTargetFmt = ((SwDocStyleSheet&)rTarget).GetFrmFmt(); 2264 break; 2265 case SFX_STYLE_FAMILY_PAGE: 2266 if( bSwSrcPool ) 2267 pSourceFmt = &((SwDocStyleSheet&)rSource).GetPageDesc() 2268 ->GetMaster(); 2269 { 2270 SwPageDesc *pDesc = rDoc.FindPageDescByName( 2271 ((SwDocStyleSheet&)rTarget).GetPageDesc()->GetName(), 2272 &nPgDscPos ); 2273 2274 if( pDesc ) 2275 pTargetFmt = &pDesc->GetMaster(); 2276 } 2277 break; 2278 case SFX_STYLE_FAMILY_PSEUDO: 2279 // Eine NumRule besteht nur aus einem Item, also muss man 2280 // hier nichts loeschen. 2281 break; 2282 default:; //prevent warning 2283 } 2284 if( pTargetFmt ) 2285 { 2286 if( pSourceFmt ) 2287 pTargetFmt->DelDiffs( *pSourceFmt ); 2288 else if( USHRT_MAX != nPgDscPos ) 2289 pTargetFmt->ResetFmtAttr( RES_PAGEDESC, RES_FRMATR_END-1 ); 2290 else 2291 { 2292 // --> OD 2007-01-25 #i73790# - method renamed 2293 pTargetFmt->ResetAllFmtAttr(); 2294 // <-- 2295 } 2296 2297 if( USHRT_MAX != nPgDscPos ) 2298 rDoc.ChgPageDesc( nPgDscPos, 2299 const_cast<const SwDoc &>(rDoc). 2300 GetPageDesc(nPgDscPos) ); 2301 } 2302 ((SwDocStyleSheet&)rTarget).SetItemSet( rSource.GetItemSet() ); 2303 } 2304 } 2305 2306 SfxStyleSheetIteratorPtr SwDocStyleSheetPool::CreateIterator( SfxStyleFamily eFam, sal_uInt16 _nMask ) 2307 { 2308 return SfxStyleSheetIteratorPtr(new SwStyleSheetIterator( this, eFam, _nMask )); 2309 } 2310 2311 void SwDocStyleSheetPool::dispose() 2312 { 2313 mxStyleSheet.clear(); 2314 } 2315 2316 void SwDocStyleSheetPool::Remove( SfxStyleSheetBase* pStyle) 2317 { 2318 if( !pStyle ) 2319 return; 2320 2321 sal_Bool bBroadcast = sal_True; 2322 SwImplShellAction aTmpSh( rDoc ); 2323 const String& rName = pStyle->GetName(); 2324 switch( pStyle->GetFamily() ) 2325 { 2326 case SFX_STYLE_FAMILY_CHAR: 2327 { 2328 SwCharFmt* pFmt = lcl_FindCharFmt(rDoc, rName, 0, sal_False ); 2329 if(pFmt) 2330 rDoc.DelCharFmt(pFmt); 2331 } 2332 break; 2333 case SFX_STYLE_FAMILY_PARA: 2334 { 2335 SwTxtFmtColl* pColl = lcl_FindParaFmt(rDoc, rName, 0, sal_False ); 2336 if(pColl) 2337 rDoc.DelTxtFmtColl(pColl); 2338 } 2339 break; 2340 case SFX_STYLE_FAMILY_FRAME: 2341 { 2342 SwFrmFmt* pFmt = lcl_FindFrmFmt(rDoc, rName, 0, sal_False ); 2343 if(pFmt) 2344 rDoc.DelFrmFmt(pFmt); 2345 } 2346 break; 2347 case SFX_STYLE_FAMILY_PAGE : 2348 { 2349 sal_uInt16 nPos; 2350 if( rDoc.FindPageDescByName( rName, &nPos )) 2351 rDoc.DelPageDesc( nPos ); 2352 } 2353 break; 2354 2355 case SFX_STYLE_FAMILY_PSEUDO: 2356 { 2357 if( !rDoc.DelNumRule( rName ) ) 2358 // Broadcast nur versenden, wenn etwas geloescht wurde 2359 bBroadcast = sal_False; 2360 } 2361 break; 2362 2363 default: 2364 ASSERT(!this, "unbekannte Style-Familie"); 2365 bBroadcast = sal_False; 2366 } 2367 2368 if( bBroadcast ) 2369 Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_ERASED, *pStyle ) ); 2370 } 2371 2372 2373 2374 sal_Bool SwDocStyleSheetPool::SetParent( SfxStyleFamily eFam, 2375 const String &rStyle, const String &rParent ) 2376 { 2377 SwFmt* pFmt = 0, *pParent = 0; 2378 switch( eFam ) 2379 { 2380 case SFX_STYLE_FAMILY_CHAR : 2381 if( 0 != ( pFmt = lcl_FindCharFmt( rDoc, rStyle ) ) && rParent.Len() ) 2382 pParent = lcl_FindCharFmt(rDoc, rParent ); 2383 break; 2384 2385 case SFX_STYLE_FAMILY_PARA : 2386 if( 0 != ( pFmt = lcl_FindParaFmt( rDoc, rStyle ) ) && rParent.Len() ) 2387 pParent = lcl_FindParaFmt( rDoc, rParent ); 2388 break; 2389 2390 case SFX_STYLE_FAMILY_FRAME: 2391 if( 0 != ( pFmt = lcl_FindFrmFmt( rDoc, rStyle ) ) && rParent.Len() ) 2392 pParent = lcl_FindFrmFmt( rDoc, rParent ); 2393 break; 2394 2395 case SFX_STYLE_FAMILY_PAGE: 2396 case SFX_STYLE_FAMILY_PSEUDO: 2397 break; 2398 2399 default: 2400 ASSERT(!this, "unbekannte Style-Familie"); 2401 } 2402 2403 sal_Bool bRet = sal_False; 2404 if( pFmt && pFmt->DerivedFrom() && 2405 pFmt->DerivedFrom()->GetName() != rParent ) 2406 { 2407 { 2408 SwImplShellAction aTmpSh( rDoc ); 2409 bRet = pFmt->SetDerivedFrom( pParent ); 2410 } 2411 2412 if( bRet ) 2413 { 2414 // nur fuer das Broadcasting 2415 mxStyleSheet->PresetName( rStyle ); 2416 mxStyleSheet->PresetParent( rParent ); 2417 if( SFX_STYLE_FAMILY_PARA == eFam ) 2418 mxStyleSheet->PresetFollow( ((SwTxtFmtColl*)pFmt)-> 2419 GetNextTxtFmtColl().GetName() ); 2420 else 2421 mxStyleSheet->PresetFollow( aEmptyStr ); 2422 2423 Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_MODIFIED, 2424 *(mxStyleSheet.get()) ) ); 2425 } 2426 } 2427 2428 return bRet; 2429 } 2430 2431 SfxStyleSheetBase* SwDocStyleSheetPool::Find( const String& rName, 2432 SfxStyleFamily eFam, sal_uInt16 n ) 2433 { 2434 sal_uInt16 nSMask = n; 2435 if( SFX_STYLE_FAMILY_PARA == eFam && rDoc.get(IDocumentSettingAccess::HTML_MODE) ) 2436 { 2437 // dann sind nur HTML-Vorlagen von Interesse 2438 if( USHRT_MAX == nSMask ) 2439 nSMask = SWSTYLEBIT_HTML | SFXSTYLEBIT_USERDEF | SFXSTYLEBIT_USED; 2440 else 2441 nSMask &= SFXSTYLEBIT_USED | SFXSTYLEBIT_USERDEF | 2442 SWSTYLEBIT_CONDCOLL | SWSTYLEBIT_HTML; 2443 if( !nSMask ) 2444 nSMask = SWSTYLEBIT_HTML; 2445 } 2446 2447 const sal_Bool bSearchUsed = ( n != SFXSTYLEBIT_ALL && 2448 n & SFXSTYLEBIT_USED ) ? sal_True : sal_False; 2449 const SwModify* pMod = 0; 2450 2451 mxStyleSheet->SetPhysical( sal_False ); 2452 mxStyleSheet->PresetName( rName ); 2453 mxStyleSheet->SetFamily( eFam ); 2454 sal_Bool bFnd = mxStyleSheet->FillStyleSheet( SwDocStyleSheet::FillOnlyName ); 2455 2456 if( mxStyleSheet->IsPhysical() ) 2457 { 2458 switch( eFam ) 2459 { 2460 case SFX_STYLE_FAMILY_CHAR: 2461 pMod = mxStyleSheet->GetCharFmt(); 2462 break; 2463 2464 case SFX_STYLE_FAMILY_PARA: 2465 pMod = mxStyleSheet->GetCollection(); 2466 break; 2467 2468 case SFX_STYLE_FAMILY_FRAME: 2469 pMod = mxStyleSheet->GetFrmFmt(); 2470 break; 2471 2472 case SFX_STYLE_FAMILY_PAGE: 2473 pMod = mxStyleSheet->GetPageDesc(); 2474 break; 2475 2476 case SFX_STYLE_FAMILY_PSEUDO: 2477 { 2478 const SwNumRule* pRule = mxStyleSheet->GetNumRule(); 2479 if( pRule && 2480 !(bSearchUsed && (bOrganizer || rDoc.IsUsed(*pRule)) ) && 2481 (( nSMask & ~SFXSTYLEBIT_USED) == SFXSTYLEBIT_USERDEF 2482 ? !(pRule->GetPoolFmtId() & USER_FMT) 2483 // benutzte gesucht und keine gefunden 2484 : bSearchUsed )) 2485 bFnd = sal_False; 2486 } 2487 break; 2488 2489 default: 2490 ASSERT(!this, "unbekannte Style-Familie"); 2491 } 2492 } 2493 2494 // dann noch die Maske auswerten: 2495 if( pMod && !(bSearchUsed && (bOrganizer || rDoc.IsUsed(*pMod)) ) ) 2496 { 2497 const sal_uInt16 nId = SFX_STYLE_FAMILY_PAGE == eFam 2498 ? ((SwPageDesc*)pMod)->GetPoolFmtId() 2499 : ((SwFmt*)pMod)->GetPoolFmtId(); 2500 2501 if( ( nSMask & ~SFXSTYLEBIT_USED) == SFXSTYLEBIT_USERDEF 2502 ? !(nId & USER_FMT) 2503 // benutzte gesucht und keine gefunden 2504 : bSearchUsed ) 2505 bFnd = sal_False; 2506 } 2507 return bFnd ? mxStyleSheet.get() : 0; 2508 } 2509 2510 /* */ 2511 2512 SwStyleSheetIterator::SwStyleSheetIterator( SwDocStyleSheetPool* pBase, 2513 SfxStyleFamily eFam, sal_uInt16 n ) 2514 : SfxStyleSheetIterator( pBase, eFam, n ), 2515 mxIterSheet( new SwDocStyleSheet( pBase->GetDoc(), aEmptyStr, *pBase, SFX_STYLE_FAMILY_CHAR, 0 ) ), 2516 mxStyleSheet( new SwDocStyleSheet( pBase->GetDoc(), aEmptyStr, *pBase, SFX_STYLE_FAMILY_CHAR, 0 ) ) 2517 { 2518 bFirstCalled = sal_False; 2519 nLastPos = 0; 2520 StartListening( *pBase ); 2521 } 2522 2523 SwStyleSheetIterator::~SwStyleSheetIterator() 2524 { 2525 EndListening( mxIterSheet->GetPool() ); 2526 } 2527 2528 sal_uInt16 SwStyleSheetIterator::Count() 2529 { 2530 // Liste richtig fuellen lassen !! 2531 if( !bFirstCalled ) 2532 First(); 2533 return aLst.Count(); 2534 } 2535 2536 SfxStyleSheetBase* SwStyleSheetIterator::operator[]( sal_uInt16 nIdx ) 2537 { 2538 // gefunden 2539 if( !bFirstCalled ) 2540 First(); 2541 mxStyleSheet->PresetNameAndFamily( *aLst[ nIdx ] ); 2542 mxStyleSheet->SetPhysical( sal_False ); 2543 mxStyleSheet->FillStyleSheet( SwDocStyleSheet::FillOnlyName ); 2544 2545 return mxStyleSheet.get(); 2546 } 2547 2548 SfxStyleSheetBase* SwStyleSheetIterator::First() 2549 { 2550 // Alte Liste loeschen 2551 bFirstCalled = sal_True; 2552 nLastPos = 0; 2553 aLst.Erase(); 2554 2555 // aktuellen loeschen 2556 mxIterSheet->Reset(); 2557 2558 SwDoc& rDoc = ((SwDocStyleSheetPool*)pBasePool)->GetDoc(); 2559 const sal_uInt16 nSrchMask = nMask; 2560 const sal_Bool bIsSearchUsed = SearchUsed(); 2561 2562 const sal_Bool bOrganizer = ((SwDocStyleSheetPool*)pBasePool)->IsOrganizerMode(); 2563 2564 if( nSearchFamily == SFX_STYLE_FAMILY_CHAR 2565 || nSearchFamily == SFX_STYLE_FAMILY_ALL ) 2566 { 2567 const sal_uInt16 nArrLen = rDoc.GetCharFmts()->Count(); 2568 for( sal_uInt16 i = 0; i < nArrLen; i++ ) 2569 { 2570 SwCharFmt* pFmt = (*rDoc.GetCharFmts())[ i ]; 2571 if( pFmt->IsDefault() && pFmt != rDoc.GetDfltCharFmt() ) 2572 continue; 2573 2574 const sal_Bool bUsed = bIsSearchUsed && (bOrganizer || rDoc.IsUsed(*pFmt)); 2575 if( !bUsed ) 2576 { 2577 // Standard ist keine Benutzervorlage #46181# 2578 const sal_uInt16 nId = rDoc.GetDfltCharFmt() == pFmt ? 2579 sal_uInt16( RES_POOLCHR_INET_NORMAL ): 2580 pFmt->GetPoolFmtId(); 2581 if( (nSrchMask & ~SFXSTYLEBIT_USED) == SFXSTYLEBIT_USERDEF 2582 ? !(nId & USER_FMT) 2583 // benutzte gesucht und keine gefunden 2584 : bIsSearchUsed ) 2585 continue; 2586 2587 if( rDoc.get(IDocumentSettingAccess::HTML_MODE) && !(nId & USER_FMT) && 2588 !( RES_POOLCHR_HTML_BEGIN <= nId && 2589 nId < RES_POOLCHR_HTML_END ) && 2590 RES_POOLCHR_INET_NORMAL != nId && 2591 RES_POOLCHR_INET_VISIT != nId && 2592 RES_POOLCHR_FOOTNOTE != nId && 2593 RES_POOLCHR_ENDNOTE != nId ) 2594 continue; 2595 } 2596 2597 aLst.Append( cCHAR, pFmt == rDoc.GetDfltCharFmt() 2598 ? (const String&) *SwStyleNameMapper::GetTextUINameArray()[ RES_POOLCOLL_STANDARD - 2599 RES_POOLCOLL_TEXT_BEGIN ] 2600 : pFmt->GetName() ); 2601 } 2602 2603 // PoolFormate 2604 // 2605 if( nSrchMask == SFXSTYLEBIT_ALL ) 2606 { 2607 if( !rDoc.get(IDocumentSettingAccess::HTML_MODE) ) 2608 AppendStyleList(SwStyleNameMapper::GetChrFmtUINameArray(), 2609 bIsSearchUsed, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT, cCHAR); 2610 else 2611 { 2612 aLst.Append( cCHAR, *SwStyleNameMapper::GetChrFmtUINameArray()[ 2613 RES_POOLCHR_INET_NORMAL - RES_POOLCHR_BEGIN ] ); 2614 aLst.Append( cCHAR, *SwStyleNameMapper::GetChrFmtUINameArray()[ 2615 RES_POOLCHR_INET_VISIT - RES_POOLCHR_BEGIN ] ); 2616 aLst.Append( cCHAR, *SwStyleNameMapper::GetChrFmtUINameArray()[ 2617 RES_POOLCHR_ENDNOTE - RES_POOLCHR_BEGIN ] ); 2618 aLst.Append( cCHAR, *SwStyleNameMapper::GetChrFmtUINameArray()[ 2619 RES_POOLCHR_FOOTNOTE - RES_POOLCHR_BEGIN ] ); 2620 } 2621 AppendStyleList(SwStyleNameMapper::GetHTMLChrFmtUINameArray(), 2622 bIsSearchUsed, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT, cCHAR); 2623 } 2624 } 2625 2626 if( nSearchFamily == SFX_STYLE_FAMILY_PARA || 2627 nSearchFamily == SFX_STYLE_FAMILY_ALL ) 2628 { 2629 sal_uInt16 nSMask = nSrchMask; 2630 if( rDoc.get(IDocumentSettingAccess::HTML_MODE) ) 2631 { 2632 // dann sind nur HTML-Vorlagen von Interesse 2633 if( USHRT_MAX == nSMask ) 2634 nSMask = SWSTYLEBIT_HTML | SFXSTYLEBIT_USERDEF | 2635 SFXSTYLEBIT_USED; 2636 else 2637 nSMask &= SFXSTYLEBIT_USED | SFXSTYLEBIT_USERDEF | 2638 SWSTYLEBIT_CONDCOLL | SWSTYLEBIT_HTML; 2639 if( !nSMask ) 2640 nSMask = SWSTYLEBIT_HTML; 2641 } 2642 2643 const sal_uInt16 nArrLen = rDoc.GetTxtFmtColls()->Count(); 2644 for( sal_uInt16 i = 0; i < nArrLen; i++ ) 2645 { 2646 SwTxtFmtColl* pColl = (*rDoc.GetTxtFmtColls())[ i ]; 2647 2648 if(pColl->IsDefault()) 2649 continue; 2650 2651 const sal_Bool bUsed = bOrganizer || rDoc.IsUsed(*pColl); 2652 if( !(bIsSearchUsed && bUsed )) 2653 { 2654 const sal_uInt16 nId = pColl->GetPoolFmtId(); 2655 switch ( (nSMask & ~SFXSTYLEBIT_USED) ) 2656 { 2657 case SFXSTYLEBIT_USERDEF: 2658 if(!IsPoolUserFmt(nId)) continue; 2659 break; 2660 case SWSTYLEBIT_TEXT: 2661 if((nId & COLL_GET_RANGE_BITS) != COLL_TEXT_BITS) continue; 2662 break; 2663 case SWSTYLEBIT_CHAPTER: 2664 if((nId & COLL_GET_RANGE_BITS) != COLL_DOC_BITS) continue; 2665 break; 2666 case SWSTYLEBIT_LIST: 2667 if((nId & COLL_GET_RANGE_BITS) != COLL_LISTS_BITS) continue; 2668 break; 2669 case SWSTYLEBIT_IDX: 2670 if((nId & COLL_GET_RANGE_BITS) != COLL_REGISTER_BITS) continue; 2671 break; 2672 case SWSTYLEBIT_EXTRA: 2673 if((nId & COLL_GET_RANGE_BITS) != COLL_EXTRA_BITS) continue; 2674 break; 2675 2676 case SWSTYLEBIT_HTML | SFXSTYLEBIT_USERDEF: 2677 if(IsPoolUserFmt(nId)) 2678 break; 2679 // ansonten weiter 2680 case SWSTYLEBIT_HTML: 2681 if( (nId & COLL_GET_RANGE_BITS) != COLL_HTML_BITS) 2682 { 2683 // einige wollen wir aber auch in dieser Section sehen 2684 sal_Bool bWeiter = sal_True; 2685 switch( nId ) 2686 { 2687 case RES_POOLCOLL_SENDADRESS: // --> ADDRESS 2688 case RES_POOLCOLL_TABLE_HDLN: // --> TH 2689 case RES_POOLCOLL_TABLE: // --> TD 2690 case RES_POOLCOLL_TEXT: // --> P 2691 case RES_POOLCOLL_HEADLINE_BASE:// --> H 2692 case RES_POOLCOLL_HEADLINE1: // --> H1 2693 case RES_POOLCOLL_HEADLINE2: // --> H2 2694 case RES_POOLCOLL_HEADLINE3: // --> H3 2695 case RES_POOLCOLL_HEADLINE4: // --> H4 2696 case RES_POOLCOLL_HEADLINE5: // --> H5 2697 case RES_POOLCOLL_HEADLINE6: // --> H6 2698 case RES_POOLCOLL_STANDARD: // --> P 2699 case RES_POOLCOLL_FOOTNOTE: 2700 case RES_POOLCOLL_ENDNOTE: 2701 bWeiter = sal_False; 2702 break; 2703 } 2704 if( bWeiter ) 2705 continue; 2706 } 2707 break; 2708 case SWSTYLEBIT_CONDCOLL: 2709 if( RES_CONDTXTFMTCOLL != pColl->Which() ) continue; 2710 break; 2711 default: 2712 // benutzte gesucht und keine gefunden 2713 if( bIsSearchUsed ) 2714 continue; 2715 } 2716 } 2717 aLst.Append( cPARA, pColl->GetName() ); 2718 } 2719 2720 const sal_Bool bAll = nSMask == SFXSTYLEBIT_ALL; 2721 if ( bAll || (nSMask & ~SFXSTYLEBIT_USED) == SWSTYLEBIT_TEXT ) 2722 AppendStyleList(SwStyleNameMapper::GetTextUINameArray(), 2723 bIsSearchUsed, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, cPARA ); 2724 if ( bAll || (nSMask & ~SFXSTYLEBIT_USED) == SWSTYLEBIT_CHAPTER ) 2725 AppendStyleList(SwStyleNameMapper::GetDocUINameArray(), 2726 bIsSearchUsed, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, cPARA ) ; 2727 if ( bAll || (nSMask & ~SFXSTYLEBIT_USED) == SWSTYLEBIT_LIST ) 2728 AppendStyleList(SwStyleNameMapper::GetListsUINameArray(), 2729 bIsSearchUsed, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, cPARA ) ; 2730 if ( bAll || (nSMask & ~SFXSTYLEBIT_USED) == SWSTYLEBIT_IDX ) 2731 AppendStyleList(SwStyleNameMapper::GetRegisterUINameArray(), 2732 bIsSearchUsed, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, cPARA ) ; 2733 if ( bAll || (nSMask & ~SFXSTYLEBIT_USED) == SWSTYLEBIT_EXTRA ) 2734 AppendStyleList(SwStyleNameMapper::GetExtraUINameArray(), 2735 bIsSearchUsed, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, cPARA ) ; 2736 if ( bAll || (nSMask & ~SFXSTYLEBIT_USED) == SWSTYLEBIT_CONDCOLL ) 2737 { 2738 if( !bIsSearchUsed || 2739 rDoc.IsPoolTxtCollUsed( RES_POOLCOLL_TEXT )) 2740 aLst.Append( cPARA, *SwStyleNameMapper::GetTextUINameArray()[ 2741 RES_POOLCOLL_TEXT - RES_POOLCOLL_TEXT_BEGIN ] ); 2742 } 2743 if ( bAll || 2744 (nSMask & ~SFXSTYLEBIT_USED) == SWSTYLEBIT_HTML || 2745 (nSMask & ~SFXSTYLEBIT_USED) == 2746 (SWSTYLEBIT_HTML | SFXSTYLEBIT_USERDEF) ) 2747 { 2748 AppendStyleList(SwStyleNameMapper::GetHTMLUINameArray(), 2749 bIsSearchUsed, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, cPARA ) ; 2750 if( !bAll ) 2751 { 2752 // dann auch die, die wir mappen: 2753 static sal_uInt16 aPoolIds[] = { 2754 RES_POOLCOLL_SENDADRESS, // --> ADDRESS 2755 RES_POOLCOLL_TABLE_HDLN, // --> TH 2756 RES_POOLCOLL_TABLE, // --> TD 2757 RES_POOLCOLL_STANDARD, // --> P 2758 RES_POOLCOLL_TEXT, // --> P 2759 RES_POOLCOLL_HEADLINE_BASE, // --> H 2760 RES_POOLCOLL_HEADLINE1, // --> H1 2761 RES_POOLCOLL_HEADLINE2, // --> H2 2762 RES_POOLCOLL_HEADLINE3, // --> H3 2763 RES_POOLCOLL_HEADLINE4, // --> H4 2764 RES_POOLCOLL_HEADLINE5, // --> H5 2765 RES_POOLCOLL_HEADLINE6, // --> H6 2766 RES_POOLCOLL_FOOTNOTE, 2767 RES_POOLCOLL_ENDNOTE, 2768 0 2769 }; 2770 2771 sal_uInt16* pPoolIds = aPoolIds; 2772 String s; 2773 while( *pPoolIds ) 2774 { 2775 if( !bIsSearchUsed || rDoc.IsPoolTxtCollUsed( *pPoolIds ) ) 2776 aLst.Append( cPARA, 2777 s = SwStyleNameMapper::GetUIName( *pPoolIds, s )); 2778 ++pPoolIds; 2779 } 2780 } 2781 } 2782 } 2783 2784 if( nSearchFamily == SFX_STYLE_FAMILY_FRAME || 2785 nSearchFamily == SFX_STYLE_FAMILY_ALL ) 2786 { 2787 const sal_uInt16 nArrLen = rDoc.GetFrmFmts()->Count(); 2788 for( sal_uInt16 i = 0; i < nArrLen; i++ ) 2789 { 2790 SwFrmFmt* pFmt = (*rDoc.GetFrmFmts())[ i ]; 2791 2792 if(pFmt->IsDefault() || pFmt->IsAuto()) 2793 { 2794 continue; 2795 } 2796 2797 const sal_uInt16 nId = pFmt->GetPoolFmtId(); 2798 sal_Bool bUsed = bIsSearchUsed && ( bOrganizer || rDoc.IsUsed(*pFmt)); 2799 if( !bUsed ) 2800 { 2801 if( (nSrchMask & ~SFXSTYLEBIT_USED) == SFXSTYLEBIT_USERDEF 2802 ? !(nId & USER_FMT) 2803 // benutzte gesucht und keine gefunden 2804 : bIsSearchUsed ) 2805 { 2806 continue; 2807 } 2808 } 2809 2810 aLst.Append( cFRAME, pFmt->GetName() ); 2811 } 2812 2813 // PoolFormate 2814 // 2815 if ( nSrchMask == SFXSTYLEBIT_ALL ) 2816 AppendStyleList(SwStyleNameMapper::GetFrmFmtUINameArray(), 2817 bIsSearchUsed, nsSwGetPoolIdFromName::GET_POOLID_FRMFMT, cFRAME); 2818 } 2819 2820 if( nSearchFamily == SFX_STYLE_FAMILY_PAGE || 2821 nSearchFamily == SFX_STYLE_FAMILY_ALL ) 2822 { 2823 const sal_uInt16 nCount = rDoc.GetPageDescCnt(); 2824 for(sal_uInt16 i = 0; i < nCount; ++i) 2825 { 2826 const SwPageDesc& rDesc = 2827 const_cast<const SwDoc &>(rDoc).GetPageDesc(i); 2828 const sal_uInt16 nId = rDesc.GetPoolFmtId(); 2829 sal_Bool bUsed = bIsSearchUsed && ( bOrganizer || rDoc.IsUsed(rDesc)); 2830 if( !bUsed ) 2831 { 2832 if( (nSrchMask & ~SFXSTYLEBIT_USED) == SFXSTYLEBIT_USERDEF 2833 ? !(nId & USER_FMT) 2834 // benutzte gesucht und keine gefunden 2835 : bIsSearchUsed ) 2836 continue; 2837 } 2838 2839 aLst.Append( cPAGE, rDesc.GetName() ); 2840 } 2841 if ( nSrchMask == SFXSTYLEBIT_ALL ) 2842 AppendStyleList(SwStyleNameMapper::GetPageDescUINameArray(), 2843 bIsSearchUsed, nsSwGetPoolIdFromName::GET_POOLID_PAGEDESC, cPAGE); 2844 } 2845 2846 if( nSearchFamily == SFX_STYLE_FAMILY_PSEUDO || 2847 nSearchFamily == SFX_STYLE_FAMILY_ALL ) 2848 { 2849 const SwNumRuleTbl& rNumTbl = rDoc.GetNumRuleTbl(); 2850 for(sal_uInt16 i = 0; i < rNumTbl.Count(); ++i) 2851 { 2852 const SwNumRule& rRule = *rNumTbl[ i ]; 2853 if( !rRule.IsAutoRule() ) 2854 { 2855 sal_Bool bUsed = bIsSearchUsed && ( bOrganizer || rDoc.IsUsed(rRule) ); 2856 if( !bUsed ) 2857 { 2858 if( (nSrchMask & ~SFXSTYLEBIT_USED) == SFXSTYLEBIT_USERDEF 2859 ? !(rRule.GetPoolFmtId() & USER_FMT) 2860 // benutzte gesucht und keine gefunden 2861 : bIsSearchUsed ) 2862 continue; 2863 } 2864 2865 aLst.Append( cNUMRULE, rRule.GetName() ); 2866 } 2867 } 2868 if ( nSrchMask == SFXSTYLEBIT_ALL ) 2869 AppendStyleList(SwStyleNameMapper::GetNumRuleUINameArray(), 2870 bIsSearchUsed, nsSwGetPoolIdFromName::GET_POOLID_NUMRULE, cNUMRULE); 2871 } 2872 2873 if(aLst.Count() > 0) 2874 { 2875 nLastPos = USHRT_MAX; 2876 return Next(); 2877 } 2878 return 0; 2879 } 2880 2881 SfxStyleSheetBase* SwStyleSheetIterator::Next() 2882 { 2883 nLastPos++; 2884 if(aLst.Count() > 0 && nLastPos < aLst.Count()) 2885 { 2886 mxIterSheet->PresetNameAndFamily(*aLst[nLastPos]); 2887 mxIterSheet->SetPhysical( sal_False ); 2888 mxIterSheet->SetMask( nMask ); 2889 if(mxIterSheet->pSet) 2890 { 2891 mxIterSheet->pSet->ClearItem(0); 2892 mxIterSheet->pSet= 0; 2893 } 2894 return mxIterSheet.get(); 2895 } 2896 return 0; 2897 } 2898 2899 SfxStyleSheetBase* SwStyleSheetIterator::Find( const UniString& rName ) 2900 { 2901 // suchen 2902 if( !bFirstCalled ) 2903 First(); 2904 2905 nLastPos = lcl_FindName( aLst, nSearchFamily, rName ); 2906 if( USHRT_MAX != nLastPos ) 2907 { 2908 // gefunden 2909 mxStyleSheet->PresetNameAndFamily(*aLst[nLastPos]); 2910 // neuer Name gesetzt, also bestimme seine Daten 2911 mxStyleSheet->FillStyleSheet( SwDocStyleSheet::FillOnlyName ); 2912 if( !mxStyleSheet->IsPhysical() ) 2913 mxStyleSheet->SetPhysical( sal_False ); 2914 2915 return mxStyleSheet.get(); 2916 } 2917 return 0; 2918 } 2919 2920 void SwStyleSheetIterator::AppendStyleList(const SvStringsDtor& rList, 2921 sal_Bool bTestUsed, 2922 sal_uInt16 nSection, char cType ) 2923 { 2924 if( bTestUsed ) 2925 { 2926 SwDoc& rDoc = ((SwDocStyleSheetPool*)pBasePool)->GetDoc(); 2927 for ( sal_uInt16 i=0; i < rList.Count(); ++i ) 2928 { 2929 sal_Bool bUsed = sal_False; 2930 sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName(*rList[i], (SwGetPoolIdFromName)nSection); 2931 switch ( nSection ) 2932 { 2933 case nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL: 2934 bUsed = rDoc.IsPoolTxtCollUsed( nId ); 2935 break; 2936 case nsSwGetPoolIdFromName::GET_POOLID_CHRFMT: 2937 bUsed = rDoc.IsPoolFmtUsed( nId ); 2938 break; 2939 case nsSwGetPoolIdFromName::GET_POOLID_FRMFMT: 2940 bUsed = rDoc.IsPoolFmtUsed( nId ); 2941 case nsSwGetPoolIdFromName::GET_POOLID_PAGEDESC: 2942 bUsed = rDoc.IsPoolPageDescUsed( nId ); 2943 break; 2944 default: 2945 ASSERT( !this, "unknown PoolFmt-Id" ); 2946 } 2947 if ( bUsed ) 2948 aLst.Append( cType, *rList[i] ); 2949 } 2950 } 2951 else 2952 for ( sal_uInt16 i=0; i < rList.Count(); ++i ) 2953 aLst.Append( cType, *rList[i] ); 2954 } 2955 2956 void SwStyleSheetIterator::Notify( SfxBroadcaster&, const SfxHint& rHint ) 2957 { 2958 // suchen und aus der Anzeige-Liste entfernen !! 2959 if( rHint.ISA( SfxStyleSheetHint ) && 2960 SFX_STYLESHEET_ERASED == ((SfxStyleSheetHint&) rHint).GetHint() ) 2961 { 2962 SfxStyleSheetBase* pStyle = ((SfxStyleSheetHint&)rHint).GetStyleSheet(); 2963 2964 if (pStyle) 2965 { 2966 sal_uInt16 nTmpPos = lcl_FindName( aLst, pStyle->GetFamily(), 2967 pStyle->GetName() ); 2968 if( nTmpPos < aLst.Count() ) 2969 aLst.DeleteAndDestroy( nTmpPos ); 2970 } 2971 } 2972 } 2973 2974 2975