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