xref: /AOO41X/main/sw/source/ui/app/docstyle.cxx (revision 86104fa76067a8d95ac3e0013158cb484ac62017)
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 
GetSh()93     SwWrtShell* GetSh() { return pSh; }
94 };
95 
SwImplShellAction(SwDoc & rDoc)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 
~SwImplShellAction()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 
lcl_FindCharFmt(SwDoc & rDoc,const String & rName,SwDocStyleSheet * pStyle=0,sal_Bool bCreate=sal_True)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 
lcl_FindParaFmt(SwDoc & rDoc,const String & rName,SwDocStyleSheet * pStyle=0,sal_Bool bCreate=sal_True)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 
lcl_FindFrmFmt(SwDoc & rDoc,const String & rName,SwDocStyleSheet * pStyle=0,sal_Bool bCreate=sal_True)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 
lcl_FindPageDesc(SwDoc & rDoc,const String & rName,SwDocStyleSheet * pStyle=0,sal_Bool bCreate=sal_True)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 
lcl_FindNumRule(SwDoc & rDoc,const String & rName,SwDocStyleSheet * pStyle=0,sal_Bool bCreate=sal_True)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 
lcl_FindName(const SwPoolFmtList & rLst,SfxStyleFamily eFam,const String & rName)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 
FindPhyStyle(SwDoc & rDoc,const String & rName,SfxStyleFamily eFam)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 
Append(char cChar,const String & rStr)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 
Erase()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 
SwDocStyleSheet(SwDoc & rDocument,const String & rName,SwDocStyleSheetPool & _rPool,SfxStyleFamily eFam,sal_uInt16 _nMask)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 
SwDocStyleSheet(const SwDocStyleSheet & rOrg)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 
~SwDocStyleSheet()455  SwDocStyleSheet::~SwDocStyleSheet()
456 {
457 }
458 
459 /*--------------------------------------------------------------------
460     Beschreibung:   Zuruecksetzen
461  --------------------------------------------------------------------*/
462 
463 
Reset()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 
GetParent() const477 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 
GetFollow() const532 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 
HasFollowSupport() const547 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 
HasParentSupport() const567 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 
HasClearParentSupport() const581 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  --------------------------------------------------------------------*/
GetDescription(SfxMapUnit eUnit)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 
GetDescription()767 String  SwDocStyleSheet::GetDescription()
768 {
769     return GetDescription(SFX_MAPUNIT_CM);
770 }
771 
772 /*--------------------------------------------------------------------
773     Beschreibung:   Namen setzen
774  --------------------------------------------------------------------*/
775 
776 
SetName(const String & rStr)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 
SetParent(const String & rStr)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 
SetFollow(const String & rStr)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 
GetItemSet()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#
MergeIndentAttrsOfListStyle(SfxItemSet & rSet)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>
SetItemSet(const SfxItemSet & rSet,const bool 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                 if( pColl->IsAssignedToListLevelOfOutlineStyle())
1205                     pCColl->AssignToListLevelOfOutlineStyle(pColl->GetAssignedOutlineStyleLevel());
1206                 else
1207                     pCColl->DeleteAssignmentToListLevelOfOutlineStyle();
1208 
1209 
1210 
1211                 SwTxtFmtColl* pFindFmt;
1212                 const CommandStruct* pCmds = SwCondCollItem::GetCmds();
1213                 for( sal_uInt16 i = 0; i < COND_COMMAND_COUNT; ++i )
1214                 {
1215                     const String& rStyle = pCondItem->GetStyle( i );
1216                     if( rStyle.Len() &&
1217                         0 != ( pFindFmt = lcl_FindParaFmt( rDoc, rStyle, 0, sal_True )))
1218                     {
1219                         pCColl->InsertCondition( SwCollCondition( pFindFmt,
1220                                     pCmds[ i ].nCnd, pCmds[ i ].nSubCond ) );
1221                     }
1222                 }
1223 
1224                 rDoc.DelTxtFmtColl( pColl );
1225                 pColl = pCColl;
1226             }
1227             // --> OD 2008-02-12 #newlistlevelattrs#
1228             if ( bResetIndentAttrsAtParagraphStyle &&
1229                  rSet.GetItemState( RES_PARATR_NUMRULE, sal_False, 0 ) == SFX_ITEM_SET &&
1230                  rSet.GetItemState( RES_LR_SPACE, sal_False, 0 ) != SFX_ITEM_SET &&
1231                  pColl->GetItemState( RES_LR_SPACE, sal_False, 0 ) == SFX_ITEM_SET )
1232             {
1233                 rDoc.ResetAttrAtFormat( RES_LR_SPACE, *pColl );
1234             }
1235             // <--
1236 
1237             // #i56252: If a standard numbering style is assigned to a standard paragraph style
1238             // we have to create a physical instance of the numbering style. If we do not and
1239             // neither the paragraph style nor the numbering style is used in the document
1240             // the numbering style will not be saved with the document and the assignment got lost.
1241             const SfxPoolItem* pNumRuleItem = 0;
1242             if( SFX_ITEM_SET == rSet.GetItemState( RES_PARATR_NUMRULE, sal_False, &pNumRuleItem ) )
1243             {   // Setting a numbering rule?
1244                 String sNumRule = ((SwNumRuleItem*)pNumRuleItem)->GetValue();
1245                 if( sNumRule.Len() )
1246                 {
1247                     SwNumRule* pRule = rDoc.FindNumRulePtr( sNumRule );
1248                     if( !pRule )
1249                     {   // Numbering rule not in use yet.
1250                         sal_uInt16 nPoolId = SwStyleNameMapper::GetPoolIdFromUIName( sNumRule, nsSwGetPoolIdFromName::GET_POOLID_NUMRULE );
1251                         if( USHRT_MAX != nPoolId ) // It's a standard numbering rule
1252                         {
1253                             pRule = rDoc.GetNumRuleFromPool( nPoolId ); // Create numbering rule (physical)
1254                         }
1255                     }
1256                 }
1257             }
1258 
1259             pFmt = pColl;
1260 
1261             sal_uInt16 nId = pColl->GetPoolFmtId() &
1262                             ~ ( COLL_GET_RANGE_BITS | POOLGRP_NOCOLLID );
1263             switch( GetMask() & ( 0x0fff & ~SWSTYLEBIT_CONDCOLL ) )
1264             {
1265                 case SWSTYLEBIT_TEXT:
1266                     nId |= COLL_TEXT_BITS;
1267                     break;
1268                 case SWSTYLEBIT_CHAPTER:
1269                     nId |= COLL_DOC_BITS;
1270                     break;
1271                 case SWSTYLEBIT_LIST:
1272                     nId |= COLL_LISTS_BITS;
1273                     break;
1274                 case SWSTYLEBIT_IDX:
1275                     nId |= COLL_REGISTER_BITS;
1276                     break;
1277                 case SWSTYLEBIT_EXTRA:
1278                     nId |= COLL_EXTRA_BITS;
1279                     break;
1280                 case SWSTYLEBIT_HTML:
1281                     nId |= COLL_HTML_BITS;
1282                     break;
1283             }
1284             pColl->SetPoolFmtId( nId );
1285             break;
1286         }
1287         case SFX_STYLE_FAMILY_FRAME:
1288         {
1289             ASSERT(pFrmFmt, "Wo ist das FrmFmt");
1290             const SfxPoolItem* pAutoUpdate;
1291             if(SFX_ITEM_SET == rSet.GetItemState(SID_ATTR_AUTO_STYLE_UPDATE,sal_False, &pAutoUpdate ))
1292             {
1293                 pFrmFmt->SetAutoUpdateFmt(((const SfxBoolItem*)pAutoUpdate)->GetValue());
1294             }
1295             pFmt = pFrmFmt;
1296         }
1297         break;
1298 
1299         case SFX_STYLE_FAMILY_PAGE :
1300             {
1301                 ASSERT(pDesc, "Wo ist der PageDescriptor");
1302 
1303                 if( rDoc.FindPageDescByName( pDesc->GetName(), &nPgDscPos ))
1304                 {
1305                     pNewDsc = new SwPageDesc( *pDesc );
1306                     // --> OD 2005-05-09 #i48949# - no undo actions for the
1307                     // copy of the page style
1308                     ::sw::UndoGuard const ug(rDoc.GetIDocumentUndoRedo());
1309                     rDoc.CopyPageDesc(*pDesc, *pNewDsc); // #i7983#
1310                     // <--
1311 
1312                     pFmt = &pNewDsc->GetMaster();
1313                 }
1314             }
1315             break;
1316 
1317         case SFX_STYLE_FAMILY_PSEUDO:
1318             {
1319                 ASSERT(pNumRule, "Wo ist die NumRule");
1320 
1321                 if (!pNumRule)
1322                     break;
1323 
1324                 const SfxPoolItem* pItem;
1325                 switch( rSet.GetItemState( SID_ATTR_NUMBERING_RULE, sal_False, &pItem ))
1326                 {
1327                 case SFX_ITEM_SET:
1328                 {
1329                     SvxNumRule* pSetRule = ((SvxNumBulletItem*)pItem)->GetNumRule();
1330                     pSetRule->UnLinkGraphics();
1331                     //SwNumRule aSetRule(rDoc.GetUniqueNumRuleName());
1332                     SwNumRule aSetRule(*pNumRule);
1333                     aSetRule.SetSvxRule(*pSetRule, &rDoc);
1334                     rDoc.ChgNumRuleFmts( aSetRule );
1335                 }
1336                 break;
1337                 case SFX_ITEM_DONTCARE:
1338                     // NumRule auf default Werte
1339                     // was sind die default Werte?
1340                     {
1341                         // --> OD 2008-02-11 #newlistlevelattrs#
1342                         SwNumRule aRule( pNumRule->GetName(),
1343                                          // --> OD 2008-06-06 #i89178#
1344                                          numfunc::GetDefaultPositionAndSpaceMode() );
1345                                          // <--
1346                         // <--
1347                         rDoc.ChgNumRuleFmts( aRule );
1348                     }
1349                     break;
1350                 }
1351             }
1352             break;
1353 
1354         default:
1355             ASSERT(!this, "unbekannte Style-Familie");
1356     }
1357 
1358     if( pFmt && rSet.Count())
1359     {
1360         SfxItemIter aIter( rSet );
1361         const SfxPoolItem* pItem = aIter.GetCurItem();
1362         while( sal_True )
1363         {
1364             if( IsInvalidItem( pItem ) )            // Clearen
1365             {
1366                 // --> OD 2008-02-12 #newlistlevelattrs#
1367                 // use method <SwDoc::ResetAttrAtFormat(..)> in order to
1368                 // create an Undo object for the attribute reset.
1369 //                pFmt->ResetAttr( rSet.GetWhichByPos(aIter.GetCurPos()));
1370                 rDoc.ResetAttrAtFormat( rSet.GetWhichByPos(aIter.GetCurPos()),
1371                                         *pFmt );
1372             }
1373 
1374             if( aIter.IsAtEnd() )
1375                 break;
1376             pItem = aIter.NextItem();
1377         }
1378         SfxItemSet aSet(rSet);
1379         aSet.ClearInvalidItems();
1380 
1381         aCoreSet.ClearItem();
1382 
1383         if( pNewDsc )
1384         {
1385             ::ItemSetToPageDesc( aSet, *pNewDsc );
1386             rDoc.ChgPageDesc( nPgDscPos, *pNewDsc );
1387             pDesc = &const_cast<const SwDoc &>(rDoc).GetPageDesc( nPgDscPos );
1388             rDoc.PreDelPageDesc(pNewDsc); // #i7983#
1389             delete pNewDsc;
1390         }
1391         else
1392             rDoc.ChgFmt(*pFmt, aSet);       // alles gesetzten Putten
1393     }
1394     else
1395     {
1396         aCoreSet.ClearItem();
1397         if( pNewDsc )           // den muessen wir noch vernichten!!
1398         {
1399             rDoc.PreDelPageDesc(pNewDsc); // #i7983#
1400             delete pNewDsc;
1401         }
1402     }
1403 
1404     // --> OD 2008-02-12 #newlistlevelattrs#
1405     if (rDoc.GetIDocumentUndoRedo().DoesUndo())
1406     {
1407         rDoc.GetIDocumentUndoRedo().EndUndo(UNDO_END, 0);
1408     }
1409     // <--
1410 }
1411 
lcl_SaveStyles(sal_uInt16 nFamily,SvPtrarr & rArr,SwDoc & rDoc)1412 void lcl_SaveStyles( sal_uInt16 nFamily, SvPtrarr& rArr, SwDoc& rDoc )
1413 {
1414     switch( nFamily )
1415     {
1416     case SFX_STYLE_FAMILY_CHAR:
1417         {
1418             const SwCharFmts& rTbl = *rDoc.GetCharFmts();
1419             for( sal_uInt16 n = 0, nCnt = rTbl.Count(); n < nCnt; ++n )
1420             {
1421                 void* p = (void*)rTbl[ n ];
1422                 rArr.Insert( p, n );
1423             }
1424         }
1425         break;
1426     case SFX_STYLE_FAMILY_PARA:
1427         {
1428             const SwTxtFmtColls& rTbl = *rDoc.GetTxtFmtColls();
1429             for( sal_uInt16 n = 0, nCnt = rTbl.Count(); n < nCnt; ++n )
1430             {
1431                 void* p = (void*)rTbl[ n ];
1432                 rArr.Insert( p, n );
1433             }
1434         }
1435         break;
1436     case SFX_STYLE_FAMILY_FRAME:
1437         {
1438             const SwFrmFmts& rTbl = *rDoc.GetFrmFmts();
1439             for( sal_uInt16 n = 0, nCnt = rTbl.Count(); n < nCnt; ++n )
1440             {
1441                 void* p = (void*)rTbl[ n ];
1442                 rArr.Insert( p, n );
1443             }
1444         }
1445         break;
1446 
1447     case SFX_STYLE_FAMILY_PAGE:
1448         {
1449             for( sal_uInt16 n = 0, nCnt = rDoc.GetPageDescCnt(); n < nCnt; ++n )
1450             {
1451                 void* p =
1452                     (void*)&const_cast<const SwDoc &>(rDoc).GetPageDesc( n );
1453                 rArr.Insert( p, n );
1454             }
1455         }
1456         break;
1457 
1458     case SFX_STYLE_FAMILY_PSEUDO:
1459         {
1460             const SwNumRuleTbl& rTbl = rDoc.GetNumRuleTbl();
1461             for( sal_uInt16 n = 0, nCnt = rTbl.Count(); n < nCnt; ++n )
1462             {
1463                 void* p = (void*)rTbl[ n ];
1464                 rArr.Insert( p, n );
1465             }
1466         }
1467         break;
1468     }
1469 }
1470 
lcl_DeleteInfoStyles(sal_uInt16 nFamily,SvPtrarr & rArr,SwDoc & rDoc)1471 void lcl_DeleteInfoStyles( sal_uInt16 nFamily, SvPtrarr& rArr, SwDoc& rDoc )
1472 {
1473     sal_uInt16 n, nCnt;
1474     switch( nFamily )
1475     {
1476     case SFX_STYLE_FAMILY_CHAR:
1477         {
1478             SvUShorts aDelArr;
1479             const SwCharFmts& rTbl = *rDoc.GetCharFmts();
1480             for( n = 0, nCnt = rTbl.Count(); n < nCnt; ++n )
1481             {
1482                 void* p = (void*)rTbl[ n ];
1483                 if( USHRT_MAX == rArr.GetPos( p ))
1484                     aDelArr.Insert( n, 0 );
1485             }
1486             for( n = 0, nCnt = aDelArr.Count(); n < nCnt; ++n )
1487                 rDoc.DelCharFmt( aDelArr[ n ] );
1488         }
1489         break;
1490 
1491     case SFX_STYLE_FAMILY_PARA :
1492         {
1493             SvUShorts aDelArr;
1494             const SwTxtFmtColls& rTbl = *rDoc.GetTxtFmtColls();
1495             for( n = 0, nCnt = rTbl.Count(); n < nCnt; ++n )
1496             {
1497                 void* p = (void*)rTbl[ n ];
1498                 if( USHRT_MAX == rArr.GetPos( p ))
1499                     aDelArr.Insert( n, 0 );
1500             }
1501             for( n = 0, nCnt = aDelArr.Count(); n < nCnt; ++n )
1502                 rDoc.DelTxtFmtColl( aDelArr[ n ] );
1503         }
1504         break;
1505 
1506     case SFX_STYLE_FAMILY_FRAME:
1507         {
1508             SvPtrarr aDelArr;
1509             const SwFrmFmts& rTbl = *rDoc.GetFrmFmts();
1510             for( n = 0, nCnt = rTbl.Count(); n < nCnt; ++n )
1511             {
1512                 void* p = (void*)rTbl[ n ];
1513                 if( USHRT_MAX == rArr.GetPos( p ))
1514                     aDelArr.Insert( p, 0 );
1515             }
1516             for( n = 0, nCnt = aDelArr.Count(); n < nCnt; ++n )
1517                 rDoc.DelFrmFmt( (SwFrmFmt*)aDelArr[ n ] );
1518         }
1519         break;
1520 
1521     case SFX_STYLE_FAMILY_PAGE:
1522         {
1523             SvUShorts aDelArr;
1524             for( n = 0, nCnt = rDoc.GetPageDescCnt(); n < nCnt; ++n )
1525             {
1526                 void* p =
1527                     (void*)&const_cast<const SwDoc &>(rDoc).GetPageDesc( n );
1528                 if( USHRT_MAX == rArr.GetPos( p ))
1529                     aDelArr.Insert( n, 0 );
1530             }
1531             for( n = 0, nCnt = aDelArr.Count(); n < nCnt; ++n )
1532                 rDoc.DelPageDesc( aDelArr[ n ] );
1533         }
1534         break;
1535 
1536 
1537     case SFX_STYLE_FAMILY_PSEUDO:
1538         {
1539             SvPtrarr aDelArr;
1540             const SwNumRuleTbl& rTbl = rDoc.GetNumRuleTbl();
1541             for( n = 0, nCnt = rTbl.Count(); n < nCnt; ++n )
1542             {
1543                 void* p = (void*)rTbl[ n ];
1544                 if( USHRT_MAX == rArr.GetPos( p ))
1545                     aDelArr.Insert( p, 0 );
1546             }
1547             for( n = 0, nCnt = aDelArr.Count(); n < nCnt; ++n )
1548                 rDoc.DelNumRule( ((SwNumRule*)aDelArr[ n ])->GetName() );
1549         }
1550         break;
1551     }
1552 }
1553 
1554 /*--------------------------------------------------------------------
1555     Beschreibung:   Das Format ermitteln
1556  --------------------------------------------------------------------*/
1557 
FillStyleSheet(FillStyleType eFType)1558 sal_Bool SwDocStyleSheet::FillStyleSheet( FillStyleType eFType )
1559 {
1560     sal_Bool bRet = sal_False;
1561     sal_uInt16 nPoolId = USHRT_MAX;
1562     SwFmt* pFmt = 0;
1563 
1564     sal_Bool bCreate = FillPhysical == eFType;
1565     sal_Bool bDeleteInfo = sal_False;
1566     sal_Bool bFillOnlyInfo = FillAllInfo == eFType;
1567     SvPtrarr aDelArr;
1568 
1569     switch(nFamily)
1570     {
1571     case SFX_STYLE_FAMILY_CHAR:
1572         pCharFmt = lcl_FindCharFmt(rDoc, aName, this, bCreate );
1573         bPhysical = 0 != pCharFmt;
1574         if( bFillOnlyInfo && !bPhysical )
1575         {
1576             bDeleteInfo = sal_True;
1577             ::lcl_SaveStyles( static_cast< sal_uInt16 >(nFamily), aDelArr, rDoc );
1578             pCharFmt = lcl_FindCharFmt(rDoc, aName, this, sal_True );
1579         }
1580 
1581         pFmt = pCharFmt;
1582         if( !bCreate && !pFmt )
1583         {
1584             if( aName == *SwStyleNameMapper::GetTextUINameArray()[ RES_POOLCOLL_STANDARD -
1585                                             RES_POOLCOLL_TEXT_BEGIN ] )
1586                 nPoolId = 0;
1587             else
1588                 nPoolId = SwStyleNameMapper::GetPoolIdFromUIName( aName, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT );
1589         }
1590 
1591         bRet = 0 != pCharFmt || USHRT_MAX != nPoolId;
1592 
1593         if( bDeleteInfo )
1594             pCharFmt = 0;
1595         break;
1596 
1597     case SFX_STYLE_FAMILY_PARA:
1598         {
1599             pColl = lcl_FindParaFmt(rDoc, aName, this, bCreate);
1600             bPhysical = 0 != pColl;
1601             if( bFillOnlyInfo && !bPhysical )
1602             {
1603                 bDeleteInfo = sal_True;
1604                 ::lcl_SaveStyles( static_cast< sal_uInt16 >(nFamily), aDelArr, rDoc );
1605                 pColl = lcl_FindParaFmt(rDoc, aName, this, sal_True );
1606             }
1607 
1608             pFmt = pColl;
1609             if( pColl )
1610                 PresetFollow( pColl->GetNextTxtFmtColl().GetName() );
1611             else if( !bCreate )
1612                 nPoolId = SwStyleNameMapper::GetPoolIdFromUIName( aName, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
1613 
1614             bRet = 0 != pColl || USHRT_MAX != nPoolId;
1615 
1616             if( bDeleteInfo )
1617                 pColl = 0;
1618         }
1619         break;
1620 
1621     case SFX_STYLE_FAMILY_FRAME:
1622         pFrmFmt = lcl_FindFrmFmt(rDoc,  aName, this, bCreate);
1623         bPhysical = 0 != pFrmFmt;
1624         if( bFillOnlyInfo && bPhysical )
1625         {
1626             bDeleteInfo = sal_True;
1627             ::lcl_SaveStyles( static_cast< sal_uInt16 >(nFamily), aDelArr, rDoc );
1628             pFrmFmt = lcl_FindFrmFmt(rDoc, aName, this, sal_True );
1629         }
1630         pFmt = pFrmFmt;
1631         if( !bCreate && !pFmt )
1632             nPoolId = SwStyleNameMapper::GetPoolIdFromUIName( aName, nsSwGetPoolIdFromName::GET_POOLID_FRMFMT );
1633 
1634         bRet = 0 != pFrmFmt || USHRT_MAX != nPoolId;
1635 
1636         if( bDeleteInfo )
1637             pFrmFmt = 0;
1638         break;
1639 
1640     case SFX_STYLE_FAMILY_PAGE:
1641         pDesc = lcl_FindPageDesc(rDoc, aName, this, bCreate);
1642         bPhysical = 0 != pDesc;
1643         if( bFillOnlyInfo && !pDesc )
1644         {
1645             bDeleteInfo = sal_True;
1646             ::lcl_SaveStyles( static_cast< sal_uInt16 >(nFamily), aDelArr, rDoc );
1647             pDesc = lcl_FindPageDesc( rDoc, aName, this, sal_True );
1648         }
1649 
1650         if( pDesc )
1651         {
1652             nPoolId = pDesc->GetPoolFmtId();
1653             nHelpId = pDesc->GetPoolHelpId();
1654             if( pDesc->GetPoolHlpFileId() != UCHAR_MAX )
1655                 aHelpFile = *rDoc.GetDocPattern( pDesc->GetPoolHlpFileId() );
1656             else
1657                 aHelpFile.Erase();
1658         }
1659         else if( !bCreate )
1660             nPoolId = SwStyleNameMapper::GetPoolIdFromUIName( aName, nsSwGetPoolIdFromName::GET_POOLID_PAGEDESC );
1661         SetMask( USER_FMT & nPoolId ? SFXSTYLEBIT_USERDEF : 0 );
1662 
1663         bRet = 0 != pDesc || USHRT_MAX != nPoolId;
1664         if( bDeleteInfo )
1665             pDesc = 0;
1666         break;
1667 
1668     case SFX_STYLE_FAMILY_PSEUDO:
1669         pNumRule = lcl_FindNumRule(rDoc, aName, this, bCreate);
1670         bPhysical = 0 != pNumRule;
1671         if( bFillOnlyInfo && !pNumRule )
1672         {
1673             bDeleteInfo = sal_True;
1674             ::lcl_SaveStyles( static_cast< sal_uInt16 >(nFamily), aDelArr, rDoc );
1675             pNumRule = lcl_FindNumRule( rDoc, aName, this, sal_True );
1676         }
1677 
1678         if( pNumRule )
1679         {
1680             nPoolId = pNumRule->GetPoolFmtId();
1681             nHelpId = pNumRule->GetPoolHelpId();
1682             if( pNumRule->GetPoolHlpFileId() != UCHAR_MAX )
1683                 aHelpFile = *rDoc.GetDocPattern( pNumRule->GetPoolHlpFileId() );
1684             else
1685                 aHelpFile.Erase();
1686         }
1687         else if( !bCreate )
1688             nPoolId = SwStyleNameMapper::GetPoolIdFromUIName( aName, nsSwGetPoolIdFromName::GET_POOLID_NUMRULE );
1689         SetMask( USER_FMT & nPoolId ? SFXSTYLEBIT_USERDEF : 0 );
1690 
1691         bRet = 0 != pNumRule || USHRT_MAX != nPoolId;
1692 
1693         if( bDeleteInfo )
1694             pNumRule = 0;
1695         break;
1696         default:; //prevent warning
1697     }
1698 
1699     if( SFX_STYLE_FAMILY_CHAR == nFamily ||
1700         SFX_STYLE_FAMILY_PARA == nFamily ||
1701         SFX_STYLE_FAMILY_FRAME == nFamily )
1702     {
1703         if( pFmt )
1704             nPoolId = pFmt->GetPoolFmtId();
1705 
1706         sal_uInt16 _nMask = 0;
1707         if( pFmt == rDoc.GetDfltCharFmt() )
1708             _nMask |= SFXSTYLEBIT_READONLY;
1709         else if( USER_FMT & nPoolId )
1710             _nMask |= SFXSTYLEBIT_USERDEF;
1711 
1712         switch ( COLL_GET_RANGE_BITS & nPoolId )
1713         {
1714         case COLL_TEXT_BITS:     _nMask |= SWSTYLEBIT_TEXT;   break;
1715         case COLL_DOC_BITS :     _nMask |= SWSTYLEBIT_CHAPTER; break;
1716         case COLL_LISTS_BITS:    _nMask |= SWSTYLEBIT_LIST;   break;
1717         case COLL_REGISTER_BITS: _nMask |= SWSTYLEBIT_IDX;    break;
1718         case COLL_EXTRA_BITS:    _nMask |= SWSTYLEBIT_EXTRA;      break;
1719         case COLL_HTML_BITS:     _nMask |= SWSTYLEBIT_HTML;   break;
1720         }
1721 
1722         if( pFmt )
1723         {
1724             ASSERT( bPhysical, "Format nicht gefunden" );
1725 
1726             nHelpId = pFmt->GetPoolHelpId();
1727             if( pFmt->GetPoolHlpFileId() != UCHAR_MAX )
1728                 aHelpFile = *rDoc.GetDocPattern( pFmt->GetPoolHlpFileId() );
1729             else
1730                 aHelpFile.Erase();
1731 
1732             if( RES_CONDTXTFMTCOLL == pFmt->Which() )
1733                 _nMask |= SWSTYLEBIT_CONDCOLL;
1734         }
1735 
1736         SetMask( _nMask );
1737     }
1738     if( bDeleteInfo && bFillOnlyInfo )
1739         ::lcl_DeleteInfoStyles( static_cast< sal_uInt16 >(nFamily), aDelArr, rDoc );
1740     return bRet;
1741 }
1742 
1743 /*--------------------------------------------------------------------
1744     Beschreibung:   Neues Format in der Core anlegen
1745  --------------------------------------------------------------------*/
1746 
1747 
Create()1748 void SwDocStyleSheet::Create()
1749 {
1750     switch(nFamily)
1751     {
1752         case SFX_STYLE_FAMILY_CHAR :
1753             pCharFmt = lcl_FindCharFmt( rDoc, aName );
1754             if( !pCharFmt )
1755                 pCharFmt = rDoc.MakeCharFmt(aName,
1756                                             rDoc.GetDfltCharFmt());
1757             pCharFmt->SetAuto( sal_False );
1758             break;
1759 
1760         case SFX_STYLE_FAMILY_PARA :
1761             pColl = lcl_FindParaFmt( rDoc, aName );
1762             if( !pColl )
1763             {
1764                 SwTxtFmtColl *pPar = (*rDoc.GetTxtFmtColls())[0];
1765                 if( nMask & SWSTYLEBIT_CONDCOLL )
1766                     pColl = rDoc.MakeCondTxtFmtColl( aName, pPar );
1767                 else
1768                     pColl = rDoc.MakeTxtFmtColl( aName, pPar );
1769             }
1770             break;
1771 
1772         case SFX_STYLE_FAMILY_FRAME:
1773             pFrmFmt = lcl_FindFrmFmt( rDoc, aName );
1774             if( !pFrmFmt )
1775                 pFrmFmt = rDoc.MakeFrmFmt(aName, rDoc.GetDfltFrmFmt(), sal_False, sal_False);
1776 
1777             break;
1778 
1779         case SFX_STYLE_FAMILY_PAGE :
1780             pDesc = lcl_FindPageDesc( rDoc, aName );
1781             if( !pDesc )
1782             {
1783                 sal_uInt16 nId = rDoc.MakePageDesc(aName);
1784                 pDesc = &const_cast<const SwDoc &>(rDoc).GetPageDesc(nId);
1785             }
1786             break;
1787 
1788         case SFX_STYLE_FAMILY_PSEUDO:
1789             pNumRule = lcl_FindNumRule( rDoc, aName );
1790             if( !pNumRule )
1791             {
1792                 //JP 05.02.99: temp Namen erzeugen, damit kein ASSERT kommt
1793                 String sTmpNm( aName );
1794                 if( !aName.Len() )
1795                     sTmpNm = rDoc.GetUniqueNumRuleName();
1796 
1797                 // --> OD 2008-02-11 #newlistlevelattrs#
1798                 SwNumRule* pRule = rDoc.GetNumRuleTbl()[
1799                     rDoc.MakeNumRule( sTmpNm, 0, sal_False,
1800                                       // --> OD 2008-06-06 #i89178#
1801                                       numfunc::GetDefaultPositionAndSpaceMode() ) ];
1802                                       // <--
1803                 // <--
1804                 pRule->SetAutoRule( sal_False );
1805                 if( !aName.Len() )
1806                 {
1807                     // --> OD 2008-07-08 #i91400#
1808                     pRule->SetName( aName, rDoc );
1809                     // <--
1810                 }
1811                 pNumRule = pRule;
1812             }
1813             break;
1814         default:; //prevent warning
1815     }
1816     bPhysical = sal_True;
1817     aCoreSet.ClearItem();
1818 }
1819 
1820 /*--------------------------------------------------------------------
1821     Beschreibung:   Konkrete Formate rausholen
1822  --------------------------------------------------------------------*/
1823 
1824 
1825 
GetCharFmt()1826 SwCharFmt* SwDocStyleSheet::GetCharFmt()
1827 {
1828     if(!bPhysical)
1829         FillStyleSheet( FillPhysical );
1830     return pCharFmt;
1831 }
1832 
1833 
GetCollection()1834 SwTxtFmtColl* SwDocStyleSheet::GetCollection()
1835 {
1836     if(!bPhysical)
1837         FillStyleSheet( FillPhysical );
1838     return pColl;
1839 }
1840 
1841 
GetPageDesc()1842 const SwPageDesc* SwDocStyleSheet::GetPageDesc()
1843 {
1844     if(!bPhysical)
1845         FillStyleSheet( FillPhysical );
1846     return pDesc;
1847 }
1848 
GetNumRule()1849 const SwNumRule * SwDocStyleSheet::GetNumRule()
1850 {
1851     if(!bPhysical)
1852         FillStyleSheet( FillPhysical );
1853     return pNumRule;
1854 }
1855 
SetNumRule(const SwNumRule & rRule)1856 void SwDocStyleSheet::SetNumRule(const SwNumRule& rRule)
1857 {
1858     DBG_ASSERT(pNumRule, "Wo ist die NumRule");
1859     rDoc.ChgNumRuleFmts( rRule );
1860 }
1861 
1862 // Namen UND Familie aus String re-generieren
1863 // First() und Next() (s.u.) fuegen einen Kennbuchstaben an Pos.1 ein
1864 
PresetNameAndFamily(const String & rName)1865 void SwDocStyleSheet::PresetNameAndFamily(const String& rName)
1866 {
1867     switch( rName.GetChar(0) )
1868     {
1869         case cPARA:     nFamily = SFX_STYLE_FAMILY_PARA; break;
1870         case cFRAME:    nFamily = SFX_STYLE_FAMILY_FRAME; break;
1871         case cPAGE:     nFamily = SFX_STYLE_FAMILY_PAGE; break;
1872         case cNUMRULE:  nFamily = SFX_STYLE_FAMILY_PSEUDO; break;
1873         default:        nFamily = SFX_STYLE_FAMILY_CHAR; break;
1874     }
1875     aName = rName;
1876     aName.Erase( 0, 1 );
1877 }
1878 
1879 /*--------------------------------------------------------------------
1880     Beschreibung:   Ist das Format physikalisch schon vorhanden
1881  --------------------------------------------------------------------*/
1882 
1883 
SetPhysical(sal_Bool bPhys)1884 void SwDocStyleSheet::SetPhysical(sal_Bool bPhys)
1885 {
1886     bPhysical = bPhys;
1887 
1888     if(!bPhys)
1889     {
1890         pCharFmt = 0;
1891         pColl    = 0;
1892         pFrmFmt  = 0;
1893         pDesc    = 0;
1894     }
1895 }
1896 
GetFrmFmt()1897 SwFrmFmt* SwDocStyleSheet::GetFrmFmt()
1898 {
1899     if(!bPhysical)
1900         FillStyleSheet( FillPhysical );
1901     return pFrmFmt;
1902 }
1903 
1904 
IsUsed() const1905 sal_Bool  SwDocStyleSheet::IsUsed() const
1906 {
1907     if( !bPhysical )
1908     {
1909         SwDocStyleSheet* pThis = (SwDocStyleSheet*)this;
1910         pThis->FillStyleSheet( FillOnlyName );
1911     }
1912 
1913     // immer noch nicht ?
1914     if( !bPhysical )
1915         return sal_False;
1916 
1917     const SwModify* pMod;
1918     switch( nFamily )
1919     {
1920     case SFX_STYLE_FAMILY_CHAR : pMod = pCharFmt;   break;
1921     case SFX_STYLE_FAMILY_PARA : pMod = pColl;      break;
1922     case SFX_STYLE_FAMILY_FRAME: pMod = pFrmFmt;    break;
1923     case SFX_STYLE_FAMILY_PAGE : pMod = pDesc;      break;
1924 
1925     case SFX_STYLE_FAMILY_PSEUDO:
1926             return pNumRule ? rDoc.IsUsed( *pNumRule ) : sal_False;
1927 
1928     default:
1929         ASSERT(!this, "unbekannte Style-Familie");
1930         return sal_False;
1931     }
1932     return rDoc.IsUsed( *pMod );
1933 }
1934 
1935 
GetHelpId(String & rFile)1936 sal_uLong  SwDocStyleSheet::GetHelpId( String& rFile )
1937 {
1938 static String sTemplateHelpFile = String::CreateFromAscii("swrhlppi.hlp");
1939 
1940     sal_uInt16 nId = 0;
1941     sal_uInt16 nPoolId = 0;
1942     unsigned char nFileId = UCHAR_MAX;
1943 
1944     rFile = sTemplateHelpFile;
1945 
1946     const SwFmt* pTmpFmt = 0;
1947     switch( nFamily )
1948     {
1949     case SFX_STYLE_FAMILY_CHAR :
1950         if( !pCharFmt &&
1951             0 == (pCharFmt = lcl_FindCharFmt( rDoc, aName, 0, sal_False )) )
1952         {
1953             nId = SwStyleNameMapper::GetPoolIdFromUIName( aName, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT );
1954             return USHRT_MAX == nId ? 0 : nId;
1955         }
1956         pTmpFmt = pCharFmt;
1957         break;
1958 
1959     case SFX_STYLE_FAMILY_PARA:
1960         if( !pColl &&
1961             0 == ( pColl = lcl_FindParaFmt( rDoc, aName, 0, sal_False )) )
1962         {
1963             nId = SwStyleNameMapper::GetPoolIdFromUIName( aName, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
1964             return USHRT_MAX == nId ? 0 : nId;
1965         }
1966         pTmpFmt = pColl;
1967         break;
1968 
1969     case SFX_STYLE_FAMILY_FRAME:
1970         if( !pFrmFmt &&
1971             0 == ( pFrmFmt = lcl_FindFrmFmt( rDoc, aName, 0, sal_False ) ) )
1972         {
1973             nId = SwStyleNameMapper::GetPoolIdFromUIName( aName, nsSwGetPoolIdFromName::GET_POOLID_FRMFMT );
1974             return USHRT_MAX == nId ? 0 : nId;
1975         }
1976         pTmpFmt = pFrmFmt;
1977         break;
1978 
1979     case SFX_STYLE_FAMILY_PAGE:
1980         if( !pDesc &&
1981             0 == ( pDesc = lcl_FindPageDesc( rDoc, aName, 0, sal_False ) ) )
1982         {
1983             nId = SwStyleNameMapper::GetPoolIdFromUIName( aName, nsSwGetPoolIdFromName::GET_POOLID_PAGEDESC );
1984             return USHRT_MAX == nId ? 0 : nId;
1985         }
1986 
1987         nId = pDesc->GetPoolHelpId();
1988         nFileId = pDesc->GetPoolHlpFileId();
1989         nPoolId = pDesc->GetPoolFmtId();
1990         break;
1991 
1992     case SFX_STYLE_FAMILY_PSEUDO:
1993         if( !pNumRule &&
1994             0 == ( pNumRule = lcl_FindNumRule( rDoc, aName, 0, sal_False ) ) )
1995         {
1996             nId = SwStyleNameMapper::GetPoolIdFromUIName( aName, nsSwGetPoolIdFromName::GET_POOLID_NUMRULE );
1997             return USHRT_MAX == nId ? 0 : nId;
1998         }
1999 
2000         nId = pNumRule->GetPoolHelpId();
2001         nFileId = pNumRule->GetPoolHlpFileId();
2002         nPoolId = pNumRule->GetPoolFmtId();
2003         break;
2004 
2005     default:
2006         ASSERT(!this, "unbekannte Style-Familie");
2007         return 0;
2008     }
2009 
2010     if( pTmpFmt )
2011     {
2012         nId = pTmpFmt->GetPoolHelpId();
2013         nFileId = pTmpFmt->GetPoolHlpFileId();
2014         nPoolId = pTmpFmt->GetPoolFmtId();
2015     }
2016 
2017     if( UCHAR_MAX != nFileId )
2018     {
2019         const String *pTemplate = rDoc.GetDocPattern( nFileId );
2020         if( pTemplate )
2021         {
2022 //          const String aHelpPath(MakeHelpPath(*pTemplate));
2023             rFile = *pTemplate;
2024         }
2025     }
2026     else if( !IsPoolUserFmt( nPoolId ) )
2027     {
2028         nId = nPoolId;
2029     }
2030 
2031     // weil sich der SFX so anstellt mit der HilfeId:
2032     if( USHRT_MAX == nId )
2033         nId = 0;        // entsp. keine Hilfe anzeigen
2034 
2035     return nId;
2036 }
2037 
2038 
SetHelpId(const String & r,sal_uLong nId)2039 void  SwDocStyleSheet::SetHelpId( const String& r, sal_uLong nId )
2040 {
2041     sal_uInt8 nFileId = static_cast< sal_uInt8 >(rDoc.SetDocPattern( r ));
2042     sal_uInt16 nHId = static_cast< sal_uInt16 >(nId);     //!! SFX hat eigenmaechtig auf sal_uLong umgestellt!
2043 
2044     SwFmt* pTmpFmt = 0;
2045     switch( nFamily )
2046     {
2047     case SFX_STYLE_FAMILY_CHAR : pTmpFmt = pCharFmt;    break;
2048     case SFX_STYLE_FAMILY_PARA : pTmpFmt = pColl;       break;
2049     case SFX_STYLE_FAMILY_FRAME: pTmpFmt = pFrmFmt;     break;
2050     case SFX_STYLE_FAMILY_PAGE :
2051         ((SwPageDesc*)pDesc)->SetPoolHelpId( nHId );
2052         ((SwPageDesc*)pDesc)->SetPoolHlpFileId( nFileId );
2053         break;
2054 
2055     case SFX_STYLE_FAMILY_PSEUDO:
2056         ((SwNumRule*)pNumRule)->SetPoolHelpId( nHId );
2057         ((SwNumRule*)pNumRule)->SetPoolHlpFileId( nFileId );
2058         break;
2059 
2060     default:
2061         ASSERT(!this, "unbekannte Style-Familie");
2062         return ;
2063     }
2064     if( pTmpFmt )
2065     {
2066         pTmpFmt->SetPoolHelpId( nHId );
2067         pTmpFmt->SetPoolHlpFileId( nFileId );
2068     }
2069 }
2070 
2071 
2072 /*  */
2073 
2074 /*--------------------------------------------------------------------
2075     Beschreibung:   Methoden fuer den DocStyleSheetPool
2076  --------------------------------------------------------------------*/
2077 
SwDocStyleSheetPool(SwDoc & rDocument,sal_Bool bOrg)2078 SwDocStyleSheetPool::SwDocStyleSheetPool( SwDoc& rDocument, sal_Bool bOrg )
2079 : SfxStyleSheetBasePool( rDocument.GetAttrPool() )
2080 , mxStyleSheet( new SwDocStyleSheet( rDocument, aEmptyStr, *this, SFX_STYLE_FAMILY_CHAR, 0 ) )
2081 , rDoc( rDocument )
2082 {
2083     bOrganizer = bOrg;
2084 }
2085 
~SwDocStyleSheetPool()2086  SwDocStyleSheetPool::~SwDocStyleSheetPool()
2087 {
2088 }
2089 
acquire()2090 void SAL_CALL SwDocStyleSheetPool::acquire(  ) throw ()
2091 {
2092     comphelper::OWeakTypeObject::acquire();
2093 }
2094 
release()2095 void SAL_CALL SwDocStyleSheetPool::release(  ) throw ()
2096 {
2097     comphelper::OWeakTypeObject::release();
2098 }
2099 
Make(const String & rName,SfxStyleFamily eFam,sal_uInt16 _nMask,sal_uInt16)2100 SfxStyleSheetBase&   SwDocStyleSheetPool::Make(
2101         const String&   rName,
2102         SfxStyleFamily  eFam,
2103         sal_uInt16          _nMask,
2104         sal_uInt16          /*nPos*/ )
2105 {
2106     mxStyleSheet->PresetName(rName);
2107     mxStyleSheet->PresetParent(aEmptyStr);
2108     mxStyleSheet->PresetFollow(aEmptyStr);
2109     mxStyleSheet->SetMask(_nMask) ;
2110     mxStyleSheet->SetFamily(eFam);
2111     mxStyleSheet->SetPhysical(sal_True);
2112     mxStyleSheet->Create();
2113 
2114     return *mxStyleSheet.get();
2115 }
2116 
2117 
Create(const SfxStyleSheetBase &)2118 SfxStyleSheetBase*   SwDocStyleSheetPool::Create( const SfxStyleSheetBase& /*rOrg*/)
2119 {
2120     ASSERT(!this , "Create im SW-Stylesheet-Pool geht nicht" );
2121     return NULL;
2122 }
2123 
2124 
Create(const String &,SfxStyleFamily,sal_uInt16)2125 SfxStyleSheetBase*   SwDocStyleSheetPool::Create( const String &,
2126                                                 SfxStyleFamily, sal_uInt16 )
2127 {
2128     ASSERT( !this, "Create im SW-Stylesheet-Pool geht nicht" );
2129     return NULL;
2130 }
2131 
Replace(SfxStyleSheetBase & rSource,SfxStyleSheetBase & rTarget)2132 void  SwDocStyleSheetPool::Replace( SfxStyleSheetBase& rSource,
2133                                             SfxStyleSheetBase& rTarget )
2134 {
2135     SfxStyleFamily eFamily( rSource.GetFamily() );
2136     if( rSource.HasParentSupport())
2137     {
2138         const String& rParentName = rSource.GetParent();
2139         if( 0 != rParentName.Len() )
2140         {
2141             SfxStyleSheetBase* pParentOfNew = Find( rParentName, eFamily );
2142             if( pParentOfNew )
2143                 rTarget.SetParent( rParentName );
2144         }
2145     }
2146     if( rSource.HasFollowSupport())
2147     {
2148         const String& rFollowName = rSource.GetFollow();
2149         if( 0 != rFollowName.Len() )
2150         {
2151             SfxStyleSheetBase* pFollowOfNew = Find( rFollowName, eFamily );
2152             if( pFollowOfNew )
2153                 rTarget.SetFollow( rFollowName );
2154         }
2155     }
2156 
2157     SwImplShellAction aTmpSh( rDoc );
2158 
2159     sal_Bool bSwSrcPool = GetAppName() == rSource.GetPool().GetAppName();
2160     if( SFX_STYLE_FAMILY_PAGE == eFamily && bSwSrcPool )
2161     {
2162         // gesondert behandeln!!
2163         SwPageDesc* pDestDsc =
2164             (SwPageDesc*)((SwDocStyleSheet&)rTarget).GetPageDesc();
2165         SwPageDesc* pCpyDsc =
2166             (SwPageDesc*)((SwDocStyleSheet&)rSource).GetPageDesc();
2167         rDoc.CopyPageDesc( *pCpyDsc, *pDestDsc );
2168     }
2169     else
2170     {
2171         const SwFmt *pSourceFmt = 0;
2172         SwFmt *pTargetFmt = 0;
2173         sal_uInt16 nPgDscPos = USHRT_MAX;
2174         switch( eFamily )
2175         {
2176         case SFX_STYLE_FAMILY_CHAR :
2177             if( bSwSrcPool )
2178                 pSourceFmt = ((SwDocStyleSheet&)rSource).GetCharFmt();
2179             pTargetFmt = ((SwDocStyleSheet&)rTarget).GetCharFmt();
2180             break;
2181         case SFX_STYLE_FAMILY_PARA :
2182             if( bSwSrcPool )
2183                 pSourceFmt = ((SwDocStyleSheet&)rSource).GetCollection();
2184             pTargetFmt = ((SwDocStyleSheet&)rTarget).GetCollection();
2185             break;
2186         case SFX_STYLE_FAMILY_FRAME:
2187             if( bSwSrcPool )
2188                 pSourceFmt = ((SwDocStyleSheet&)rSource).GetFrmFmt();
2189             pTargetFmt = ((SwDocStyleSheet&)rTarget).GetFrmFmt();
2190             break;
2191         case SFX_STYLE_FAMILY_PAGE:
2192             if( bSwSrcPool )
2193                 pSourceFmt = &((SwDocStyleSheet&)rSource).GetPageDesc()
2194                                 ->GetMaster();
2195             {
2196                 SwPageDesc *pDesc = rDoc.FindPageDescByName(
2197                     ((SwDocStyleSheet&)rTarget).GetPageDesc()->GetName(),
2198                     &nPgDscPos );
2199 
2200                 if( pDesc )
2201                     pTargetFmt = &pDesc->GetMaster();
2202             }
2203             break;
2204         case SFX_STYLE_FAMILY_PSEUDO:
2205             // Eine NumRule besteht nur aus einem Item, also muss man
2206             // hier nichts loeschen.
2207             break;
2208         default:; //prevent warning
2209         }
2210         if( pTargetFmt )
2211         {
2212             if( pSourceFmt )
2213                 pTargetFmt->DelDiffs( *pSourceFmt );
2214             else if( USHRT_MAX != nPgDscPos )
2215                 pTargetFmt->ResetFmtAttr( RES_PAGEDESC, RES_FRMATR_END-1 );
2216             else
2217             {
2218                 // --> OD 2007-01-25 #i73790# - method renamed
2219                 pTargetFmt->ResetAllFmtAttr();
2220                 // <--
2221             }
2222 
2223             if( USHRT_MAX != nPgDscPos )
2224                 rDoc.ChgPageDesc( nPgDscPos,
2225                                   const_cast<const SwDoc &>(rDoc).
2226                                   GetPageDesc(nPgDscPos) );
2227         }
2228         ((SwDocStyleSheet&)rTarget).SetItemSet( rSource.GetItemSet() );
2229     }
2230 }
2231 
CreateIterator(SfxStyleFamily eFam,sal_uInt16 _nMask)2232 SfxStyleSheetIteratorPtr SwDocStyleSheetPool::CreateIterator( SfxStyleFamily eFam, sal_uInt16 _nMask )
2233 {
2234     return SfxStyleSheetIteratorPtr(new SwStyleSheetIterator( this, eFam, _nMask ));
2235 }
2236 
dispose()2237 void SwDocStyleSheetPool::dispose()
2238 {
2239     mxStyleSheet.clear();
2240 }
2241 
Remove(SfxStyleSheetBase * pStyle)2242 void SwDocStyleSheetPool::Remove( SfxStyleSheetBase* pStyle)
2243 {
2244     if( !pStyle )
2245         return;
2246 
2247     sal_Bool bBroadcast = sal_True;
2248     SwImplShellAction aTmpSh( rDoc );
2249     const String& rName = pStyle->GetName();
2250     switch( pStyle->GetFamily() )
2251     {
2252     case SFX_STYLE_FAMILY_CHAR:
2253         {
2254             SwCharFmt* pFmt = lcl_FindCharFmt(rDoc, rName, 0, sal_False );
2255             if(pFmt)
2256                 rDoc.DelCharFmt(pFmt);
2257         }
2258         break;
2259     case SFX_STYLE_FAMILY_PARA:
2260         {
2261             SwTxtFmtColl* pColl = lcl_FindParaFmt(rDoc, rName, 0, sal_False );
2262             if(pColl)
2263                 rDoc.DelTxtFmtColl(pColl);
2264         }
2265         break;
2266     case SFX_STYLE_FAMILY_FRAME:
2267         {
2268             SwFrmFmt* pFmt = lcl_FindFrmFmt(rDoc, rName, 0, sal_False );
2269             if(pFmt)
2270                 rDoc.DelFrmFmt(pFmt);
2271         }
2272         break;
2273     case SFX_STYLE_FAMILY_PAGE :
2274         {
2275             sal_uInt16 nPos;
2276             if( rDoc.FindPageDescByName( rName, &nPos ))
2277                 rDoc.DelPageDesc( nPos );
2278         }
2279         break;
2280 
2281     case SFX_STYLE_FAMILY_PSEUDO:
2282         {
2283             if( !rDoc.DelNumRule( rName ) )
2284                 // Broadcast nur versenden, wenn etwas geloescht wurde
2285                 bBroadcast = sal_False;
2286         }
2287         break;
2288 
2289     default:
2290         ASSERT(!this, "unbekannte Style-Familie");
2291         bBroadcast = sal_False;
2292     }
2293 
2294     if( bBroadcast )
2295         Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_ERASED, *pStyle ) );
2296 }
2297 
2298 
2299 
SetParent(SfxStyleFamily eFam,const String & rStyle,const String & rParent)2300 sal_Bool  SwDocStyleSheetPool::SetParent( SfxStyleFamily eFam,
2301                                 const String &rStyle, const String &rParent )
2302 {
2303     SwFmt* pFmt = 0, *pParent = 0;
2304     switch( eFam )
2305     {
2306     case SFX_STYLE_FAMILY_CHAR :
2307         if( 0 != ( pFmt = lcl_FindCharFmt( rDoc, rStyle ) ) && rParent.Len() )
2308             pParent = lcl_FindCharFmt(rDoc, rParent );
2309         break;
2310 
2311     case SFX_STYLE_FAMILY_PARA :
2312         if( 0 != ( pFmt = lcl_FindParaFmt( rDoc, rStyle ) ) && rParent.Len() )
2313             pParent = lcl_FindParaFmt( rDoc, rParent );
2314         break;
2315 
2316     case SFX_STYLE_FAMILY_FRAME:
2317         if( 0 != ( pFmt = lcl_FindFrmFmt( rDoc, rStyle ) ) && rParent.Len() )
2318             pParent = lcl_FindFrmFmt( rDoc, rParent );
2319         break;
2320 
2321     case SFX_STYLE_FAMILY_PAGE:
2322     case SFX_STYLE_FAMILY_PSEUDO:
2323         break;
2324 
2325     default:
2326         ASSERT(!this, "unbekannte Style-Familie");
2327     }
2328 
2329     sal_Bool bRet = sal_False;
2330     if( pFmt && pFmt->DerivedFrom() &&
2331         pFmt->DerivedFrom()->GetName() != rParent )
2332     {
2333         {
2334             SwImplShellAction aTmpSh( rDoc );
2335             bRet = pFmt->SetDerivedFrom( pParent );
2336         }
2337 
2338         if( bRet )
2339         {
2340             // nur fuer das Broadcasting
2341             mxStyleSheet->PresetName( rStyle );
2342             mxStyleSheet->PresetParent( rParent );
2343             if( SFX_STYLE_FAMILY_PARA == eFam )
2344                 mxStyleSheet->PresetFollow( ((SwTxtFmtColl*)pFmt)->
2345                         GetNextTxtFmtColl().GetName() );
2346             else
2347                 mxStyleSheet->PresetFollow( aEmptyStr );
2348 
2349             Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_MODIFIED,
2350                                             *(mxStyleSheet.get()) ) );
2351         }
2352     }
2353 
2354     return bRet;
2355 }
2356 
Find(const String & rName,SfxStyleFamily eFam,sal_uInt16 n)2357 SfxStyleSheetBase* SwDocStyleSheetPool::Find( const String& rName,
2358                                             SfxStyleFamily eFam, sal_uInt16 n )
2359 {
2360     sal_uInt16 nSMask = n;
2361     if( SFX_STYLE_FAMILY_PARA == eFam && rDoc.get(IDocumentSettingAccess::HTML_MODE) )
2362     {
2363         // dann sind nur HTML-Vorlagen von Interesse
2364         if( USHRT_MAX == nSMask )
2365             nSMask = SWSTYLEBIT_HTML | SFXSTYLEBIT_USERDEF | SFXSTYLEBIT_USED;
2366         else
2367             nSMask &= SFXSTYLEBIT_USED | SFXSTYLEBIT_USERDEF |
2368                                 SWSTYLEBIT_CONDCOLL | SWSTYLEBIT_HTML;
2369         if( !nSMask )
2370             nSMask = SWSTYLEBIT_HTML;
2371     }
2372 
2373     const sal_Bool bSearchUsed = ( n != SFXSTYLEBIT_ALL &&
2374                              n & SFXSTYLEBIT_USED ) ? sal_True : sal_False;
2375     const SwModify* pMod = 0;
2376 
2377     mxStyleSheet->SetPhysical( sal_False );
2378     mxStyleSheet->PresetName( rName );
2379     mxStyleSheet->SetFamily( eFam );
2380     sal_Bool bFnd = mxStyleSheet->FillStyleSheet( SwDocStyleSheet::FillOnlyName );
2381 
2382     if( mxStyleSheet->IsPhysical() )
2383     {
2384         switch( eFam )
2385         {
2386         case SFX_STYLE_FAMILY_CHAR:
2387             pMod = mxStyleSheet->GetCharFmt();
2388             break;
2389 
2390         case SFX_STYLE_FAMILY_PARA:
2391             pMod = mxStyleSheet->GetCollection();
2392             break;
2393 
2394         case SFX_STYLE_FAMILY_FRAME:
2395             pMod = mxStyleSheet->GetFrmFmt();
2396             break;
2397 
2398         case SFX_STYLE_FAMILY_PAGE:
2399             pMod = mxStyleSheet->GetPageDesc();
2400             break;
2401 
2402         case SFX_STYLE_FAMILY_PSEUDO:
2403             {
2404                 const SwNumRule* pRule = mxStyleSheet->GetNumRule();
2405                 if( pRule &&
2406                     !(bSearchUsed && (bOrganizer || rDoc.IsUsed(*pRule)) ) &&
2407                     (( nSMask & ~SFXSTYLEBIT_USED) == SFXSTYLEBIT_USERDEF
2408                             ? !(pRule->GetPoolFmtId() & USER_FMT)
2409                                 // benutzte gesucht und keine gefunden
2410                             : bSearchUsed ))
2411                     bFnd = sal_False;
2412             }
2413             break;
2414 
2415         default:
2416             ASSERT(!this, "unbekannte Style-Familie");
2417         }
2418     }
2419 
2420     // dann noch die Maske auswerten:
2421     if( pMod && !(bSearchUsed && (bOrganizer || rDoc.IsUsed(*pMod)) ) )
2422     {
2423         const sal_uInt16 nId = SFX_STYLE_FAMILY_PAGE == eFam
2424                         ? ((SwPageDesc*)pMod)->GetPoolFmtId()
2425                         : ((SwFmt*)pMod)->GetPoolFmtId();
2426 
2427         if( ( nSMask & ~SFXSTYLEBIT_USED) == SFXSTYLEBIT_USERDEF
2428             ? !(nId & USER_FMT)
2429                 // benutzte gesucht und keine gefunden
2430             : bSearchUsed )
2431             bFnd = sal_False;
2432     }
2433     return bFnd ? mxStyleSheet.get() : 0;
2434 }
2435 
2436 /*  */
2437 
SwStyleSheetIterator(SwDocStyleSheetPool * pBase,SfxStyleFamily eFam,sal_uInt16 n)2438 SwStyleSheetIterator::SwStyleSheetIterator( SwDocStyleSheetPool* pBase,
2439                                 SfxStyleFamily eFam, sal_uInt16 n )
2440     : SfxStyleSheetIterator( pBase, eFam, n ),
2441     mxIterSheet( new SwDocStyleSheet( pBase->GetDoc(), aEmptyStr, *pBase, SFX_STYLE_FAMILY_CHAR, 0 ) ),
2442     mxStyleSheet( new SwDocStyleSheet( pBase->GetDoc(), aEmptyStr, *pBase, SFX_STYLE_FAMILY_CHAR, 0 ) )
2443 {
2444     bFirstCalled = sal_False;
2445     nLastPos = 0;
2446     StartListening( *pBase );
2447 }
2448 
~SwStyleSheetIterator()2449  SwStyleSheetIterator::~SwStyleSheetIterator()
2450 {
2451     EndListening( mxIterSheet->GetPool() );
2452 }
2453 
Count()2454 sal_uInt16  SwStyleSheetIterator::Count()
2455 {
2456     // Liste richtig fuellen lassen !!
2457     if( !bFirstCalled )
2458         First();
2459     return aLst.Count();
2460 }
2461 
operator [](sal_uInt16 nIdx)2462 SfxStyleSheetBase*  SwStyleSheetIterator::operator[]( sal_uInt16 nIdx )
2463 {
2464     // gefunden
2465     if( !bFirstCalled )
2466         First();
2467     mxStyleSheet->PresetNameAndFamily( *aLst[ nIdx ] );
2468     mxStyleSheet->SetPhysical( sal_False );
2469     mxStyleSheet->FillStyleSheet( SwDocStyleSheet::FillOnlyName );
2470 
2471     return mxStyleSheet.get();
2472 }
2473 
First()2474 SfxStyleSheetBase*  SwStyleSheetIterator::First()
2475 {
2476     // Alte Liste loeschen
2477     bFirstCalled = sal_True;
2478     nLastPos = 0;
2479     aLst.Erase();
2480 
2481     // aktuellen loeschen
2482     mxIterSheet->Reset();
2483 
2484     SwDoc& rDoc = ((SwDocStyleSheetPool*)pBasePool)->GetDoc();
2485     const sal_uInt16 nSrchMask = nMask;
2486     const sal_Bool bIsSearchUsed = SearchUsed();
2487 
2488     const sal_Bool bOrganizer = ((SwDocStyleSheetPool*)pBasePool)->IsOrganizerMode();
2489 
2490     if( nSearchFamily == SFX_STYLE_FAMILY_CHAR
2491      || nSearchFamily == SFX_STYLE_FAMILY_ALL )
2492     {
2493         const sal_uInt16 nArrLen = rDoc.GetCharFmts()->Count();
2494         for( sal_uInt16 i = 0; i < nArrLen; i++ )
2495         {
2496             SwCharFmt* pFmt = (*rDoc.GetCharFmts())[ i ];
2497             if( pFmt->IsDefault() && pFmt != rDoc.GetDfltCharFmt() )
2498                 continue;
2499 
2500             const sal_Bool  bUsed = bIsSearchUsed && (bOrganizer || rDoc.IsUsed(*pFmt));
2501             if( !bUsed )
2502             {
2503                 // Standard ist keine Benutzervorlage #46181#
2504                 const sal_uInt16 nId = rDoc.GetDfltCharFmt() == pFmt ?
2505                         sal_uInt16( RES_POOLCHR_INET_NORMAL ):
2506                                 pFmt->GetPoolFmtId();
2507                 if( (nSrchMask & ~SFXSTYLEBIT_USED) == SFXSTYLEBIT_USERDEF
2508                     ? !(nId & USER_FMT)
2509                         // benutzte gesucht und keine gefunden
2510                     : bIsSearchUsed )
2511                 continue;
2512 
2513                 if( rDoc.get(IDocumentSettingAccess::HTML_MODE) && !(nId & USER_FMT) &&
2514                     !( RES_POOLCHR_HTML_BEGIN <= nId &&
2515                           nId < RES_POOLCHR_HTML_END ) &&
2516                     RES_POOLCHR_INET_NORMAL != nId &&
2517                     RES_POOLCHR_INET_VISIT != nId &&
2518                     RES_POOLCHR_FOOTNOTE  != nId &&
2519                     RES_POOLCHR_ENDNOTE != nId )
2520                     continue;
2521             }
2522 
2523             aLst.Append( cCHAR, pFmt == rDoc.GetDfltCharFmt()
2524                         ? (const String&) *SwStyleNameMapper::GetTextUINameArray()[ RES_POOLCOLL_STANDARD -
2525                                                 RES_POOLCOLL_TEXT_BEGIN ]
2526                         : pFmt->GetName() );
2527         }
2528 
2529         // PoolFormate
2530         //
2531         if( nSrchMask == SFXSTYLEBIT_ALL )
2532         {
2533             if( !rDoc.get(IDocumentSettingAccess::HTML_MODE) )
2534                 AppendStyleList(SwStyleNameMapper::GetChrFmtUINameArray(),
2535                                 bIsSearchUsed, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT, cCHAR);
2536             else
2537             {
2538                 aLst.Append( cCHAR, *SwStyleNameMapper::GetChrFmtUINameArray()[
2539                         RES_POOLCHR_INET_NORMAL - RES_POOLCHR_BEGIN ] );
2540                 aLst.Append( cCHAR, *SwStyleNameMapper::GetChrFmtUINameArray()[
2541                         RES_POOLCHR_INET_VISIT - RES_POOLCHR_BEGIN ] );
2542                 aLst.Append( cCHAR, *SwStyleNameMapper::GetChrFmtUINameArray()[
2543                         RES_POOLCHR_ENDNOTE - RES_POOLCHR_BEGIN ] );
2544                 aLst.Append( cCHAR, *SwStyleNameMapper::GetChrFmtUINameArray()[
2545                         RES_POOLCHR_FOOTNOTE - RES_POOLCHR_BEGIN ] );
2546             }
2547             AppendStyleList(SwStyleNameMapper::GetHTMLChrFmtUINameArray(),
2548                                 bIsSearchUsed, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT, cCHAR);
2549         }
2550     }
2551 
2552     if( nSearchFamily == SFX_STYLE_FAMILY_PARA ||
2553         nSearchFamily == SFX_STYLE_FAMILY_ALL )
2554     {
2555         sal_uInt16 nSMask = nSrchMask;
2556         if( rDoc.get(IDocumentSettingAccess::HTML_MODE) )
2557         {
2558             // dann sind nur HTML-Vorlagen von Interesse
2559             if( USHRT_MAX == nSMask )
2560                 nSMask = SWSTYLEBIT_HTML | SFXSTYLEBIT_USERDEF |
2561                             SFXSTYLEBIT_USED;
2562             else
2563                 nSMask &= SFXSTYLEBIT_USED | SFXSTYLEBIT_USERDEF |
2564                                 SWSTYLEBIT_CONDCOLL | SWSTYLEBIT_HTML;
2565             if( !nSMask )
2566                 nSMask = SWSTYLEBIT_HTML;
2567         }
2568 
2569         const sal_uInt16 nArrLen = rDoc.GetTxtFmtColls()->Count();
2570         for( sal_uInt16 i = 0; i < nArrLen; i++ )
2571         {
2572             SwTxtFmtColl* pColl = (*rDoc.GetTxtFmtColls())[ i ];
2573 
2574             if(pColl->IsDefault())
2575                 continue;
2576 
2577             const sal_Bool bUsed = bOrganizer || rDoc.IsUsed(*pColl);
2578             if( !(bIsSearchUsed && bUsed ))
2579             {
2580                 const sal_uInt16 nId = pColl->GetPoolFmtId();
2581                 switch ( (nSMask & ~SFXSTYLEBIT_USED) )
2582                 {
2583                 case SFXSTYLEBIT_USERDEF:
2584                     if(!IsPoolUserFmt(nId)) continue;
2585                     break;
2586                 case SWSTYLEBIT_TEXT:
2587                     if((nId & COLL_GET_RANGE_BITS) != COLL_TEXT_BITS) continue;
2588                     break;
2589                 case SWSTYLEBIT_CHAPTER:
2590                     if((nId  & COLL_GET_RANGE_BITS) != COLL_DOC_BITS) continue;
2591                     break;
2592                 case SWSTYLEBIT_LIST:
2593                     if((nId  & COLL_GET_RANGE_BITS) != COLL_LISTS_BITS) continue;
2594                     break;
2595                 case SWSTYLEBIT_IDX:
2596                     if((nId  & COLL_GET_RANGE_BITS) != COLL_REGISTER_BITS) continue;
2597                     break;
2598                 case SWSTYLEBIT_EXTRA:
2599                     if((nId  & COLL_GET_RANGE_BITS) != COLL_EXTRA_BITS) continue;
2600                     break;
2601 
2602                 case SWSTYLEBIT_HTML | SFXSTYLEBIT_USERDEF:
2603                     if(IsPoolUserFmt(nId))
2604                         break;
2605                     // ansonten weiter
2606                 case SWSTYLEBIT_HTML:
2607                     if( (nId  & COLL_GET_RANGE_BITS) != COLL_HTML_BITS)
2608                     {
2609                         // einige wollen wir aber auch in dieser Section sehen
2610                         sal_Bool bWeiter = sal_True;
2611                         switch( nId )
2612                         {
2613                         case RES_POOLCOLL_SENDADRESS:   //  --> ADDRESS
2614                         case RES_POOLCOLL_TABLE_HDLN:   //  --> TH
2615                         case RES_POOLCOLL_TABLE:        //  --> TD
2616                         case RES_POOLCOLL_TEXT:         //  --> P
2617                         case RES_POOLCOLL_HEADLINE_BASE://  --> H
2618                         case RES_POOLCOLL_HEADLINE1:    //  --> H1
2619                         case RES_POOLCOLL_HEADLINE2:    //  --> H2
2620                         case RES_POOLCOLL_HEADLINE3:    //  --> H3
2621                         case RES_POOLCOLL_HEADLINE4:    //  --> H4
2622                         case RES_POOLCOLL_HEADLINE5:    //  --> H5
2623                         case RES_POOLCOLL_HEADLINE6:    //  --> H6
2624                         case RES_POOLCOLL_STANDARD:     //  --> P
2625                         case RES_POOLCOLL_FOOTNOTE:
2626                         case RES_POOLCOLL_ENDNOTE:
2627                             bWeiter = sal_False;
2628                             break;
2629                         }
2630                         if( bWeiter )
2631                             continue;
2632                     }
2633                     break;
2634                 case SWSTYLEBIT_CONDCOLL:
2635                     if( RES_CONDTXTFMTCOLL != pColl->Which() ) continue;
2636                     break;
2637                 default:
2638                     // benutzte gesucht und keine gefunden
2639                     if( bIsSearchUsed )
2640                         continue;
2641                 }
2642             }
2643             aLst.Append( cPARA, pColl->GetName() );
2644         }
2645 
2646         const sal_Bool bAll = nSMask == SFXSTYLEBIT_ALL;
2647         if ( bAll || (nSMask & ~SFXSTYLEBIT_USED) == SWSTYLEBIT_TEXT )
2648             AppendStyleList(SwStyleNameMapper::GetTextUINameArray(),
2649                             bIsSearchUsed, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, cPARA );
2650         if ( bAll || (nSMask & ~SFXSTYLEBIT_USED) == SWSTYLEBIT_CHAPTER )
2651             AppendStyleList(SwStyleNameMapper::GetDocUINameArray(),
2652                             bIsSearchUsed, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, cPARA ) ;
2653         if ( bAll || (nSMask & ~SFXSTYLEBIT_USED) == SWSTYLEBIT_LIST )
2654             AppendStyleList(SwStyleNameMapper::GetListsUINameArray(),
2655                             bIsSearchUsed, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, cPARA ) ;
2656         if ( bAll || (nSMask & ~SFXSTYLEBIT_USED) == SWSTYLEBIT_IDX )
2657             AppendStyleList(SwStyleNameMapper::GetRegisterUINameArray(),
2658                             bIsSearchUsed, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, cPARA ) ;
2659         if ( bAll || (nSMask & ~SFXSTYLEBIT_USED) == SWSTYLEBIT_EXTRA )
2660             AppendStyleList(SwStyleNameMapper::GetExtraUINameArray(),
2661                             bIsSearchUsed, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, cPARA ) ;
2662         if ( bAll || (nSMask & ~SFXSTYLEBIT_USED) == SWSTYLEBIT_CONDCOLL )
2663         {
2664             if( !bIsSearchUsed ||
2665                 rDoc.IsPoolTxtCollUsed( RES_POOLCOLL_TEXT ))
2666                 aLst.Append( cPARA, *SwStyleNameMapper::GetTextUINameArray()[
2667                         RES_POOLCOLL_TEXT - RES_POOLCOLL_TEXT_BEGIN ] );
2668         }
2669         if ( bAll ||
2670             (nSMask & ~SFXSTYLEBIT_USED) == SWSTYLEBIT_HTML ||
2671             (nSMask & ~SFXSTYLEBIT_USED) ==
2672                         (SWSTYLEBIT_HTML | SFXSTYLEBIT_USERDEF) )
2673         {
2674             AppendStyleList(SwStyleNameMapper::GetHTMLUINameArray(),
2675                             bIsSearchUsed, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, cPARA ) ;
2676             if( !bAll )
2677             {
2678                 // dann auch die, die wir mappen:
2679                 static sal_uInt16 aPoolIds[] = {
2680                     RES_POOLCOLL_SENDADRESS,    //  --> ADDRESS
2681                     RES_POOLCOLL_TABLE_HDLN,    //  --> TH
2682                     RES_POOLCOLL_TABLE,     //  --> TD
2683                     RES_POOLCOLL_STANDARD,      //  --> P
2684                     RES_POOLCOLL_TEXT,          //  --> P
2685                     RES_POOLCOLL_HEADLINE_BASE, //  --> H
2686                     RES_POOLCOLL_HEADLINE1, //  --> H1
2687                     RES_POOLCOLL_HEADLINE2, //  --> H2
2688                     RES_POOLCOLL_HEADLINE3, //  --> H3
2689                     RES_POOLCOLL_HEADLINE4, //  --> H4
2690                     RES_POOLCOLL_HEADLINE5, //  --> H5
2691                     RES_POOLCOLL_HEADLINE6, //  --> H6
2692                     RES_POOLCOLL_FOOTNOTE,
2693                     RES_POOLCOLL_ENDNOTE,
2694                     0
2695                     };
2696 
2697                 sal_uInt16* pPoolIds = aPoolIds;
2698                 String s;
2699                 while( *pPoolIds )
2700                 {
2701                     if( !bIsSearchUsed || rDoc.IsPoolTxtCollUsed( *pPoolIds ) )
2702                         aLst.Append( cPARA,
2703                             s = SwStyleNameMapper::GetUIName( *pPoolIds, s ));
2704                     ++pPoolIds;
2705                 }
2706             }
2707         }
2708     }
2709 
2710     if( nSearchFamily == SFX_STYLE_FAMILY_FRAME ||
2711         nSearchFamily == SFX_STYLE_FAMILY_ALL )
2712     {
2713         const sal_uInt16 nArrLen = rDoc.GetFrmFmts()->Count();
2714         for( sal_uInt16 i = 0; i < nArrLen; i++ )
2715         {
2716             SwFrmFmt* pFmt = (*rDoc.GetFrmFmts())[ i ];
2717 
2718             if(pFmt->IsDefault() || pFmt->IsAuto())
2719             {
2720                 continue;
2721             }
2722 
2723             const sal_uInt16 nId = pFmt->GetPoolFmtId();
2724             sal_Bool bUsed = bIsSearchUsed && ( bOrganizer || rDoc.IsUsed(*pFmt));
2725             if( !bUsed )
2726             {
2727                 if( (nSrchMask & ~SFXSTYLEBIT_USED) == SFXSTYLEBIT_USERDEF
2728                     ? !(nId & USER_FMT)
2729                     // benutzte gesucht und keine gefunden
2730                     : bIsSearchUsed )
2731                 {
2732                     continue;
2733                 }
2734             }
2735 
2736             aLst.Append( cFRAME, pFmt->GetName() );
2737         }
2738 
2739         // PoolFormate
2740         //
2741         if ( nSrchMask == SFXSTYLEBIT_ALL )
2742             AppendStyleList(SwStyleNameMapper::GetFrmFmtUINameArray(),
2743                                     bIsSearchUsed, nsSwGetPoolIdFromName::GET_POOLID_FRMFMT, cFRAME);
2744     }
2745 
2746     if( nSearchFamily == SFX_STYLE_FAMILY_PAGE ||
2747         nSearchFamily == SFX_STYLE_FAMILY_ALL )
2748     {
2749         const sal_uInt16 nCount = rDoc.GetPageDescCnt();
2750         for(sal_uInt16 i = 0; i < nCount; ++i)
2751         {
2752             const SwPageDesc& rDesc =
2753                 const_cast<const SwDoc &>(rDoc).GetPageDesc(i);
2754             const sal_uInt16 nId = rDesc.GetPoolFmtId();
2755             sal_Bool bUsed = bIsSearchUsed && ( bOrganizer || rDoc.IsUsed(rDesc));
2756             if( !bUsed )
2757             {
2758                 if( (nSrchMask & ~SFXSTYLEBIT_USED) == SFXSTYLEBIT_USERDEF
2759                     ? !(nId & USER_FMT)
2760                     // benutzte gesucht und keine gefunden
2761                     : bIsSearchUsed )
2762                     continue;
2763             }
2764 
2765             aLst.Append( cPAGE, rDesc.GetName() );
2766         }
2767         if ( nSrchMask == SFXSTYLEBIT_ALL )
2768             AppendStyleList(SwStyleNameMapper::GetPageDescUINameArray(),
2769                             bIsSearchUsed, nsSwGetPoolIdFromName::GET_POOLID_PAGEDESC, cPAGE);
2770     }
2771 
2772     if( nSearchFamily == SFX_STYLE_FAMILY_PSEUDO ||
2773         nSearchFamily == SFX_STYLE_FAMILY_ALL )
2774     {
2775         const SwNumRuleTbl& rNumTbl = rDoc.GetNumRuleTbl();
2776         for(sal_uInt16 i = 0; i < rNumTbl.Count(); ++i)
2777         {
2778             const SwNumRule& rRule = *rNumTbl[ i ];
2779             if( !rRule.IsAutoRule() )
2780             {
2781                 sal_Bool bUsed = bIsSearchUsed && ( bOrganizer || rDoc.IsUsed(rRule) );
2782                 if( !bUsed )
2783                 {
2784                     if( (nSrchMask & ~SFXSTYLEBIT_USED) == SFXSTYLEBIT_USERDEF
2785                         ? !(rRule.GetPoolFmtId() & USER_FMT)
2786                         // benutzte gesucht und keine gefunden
2787                         : bIsSearchUsed )
2788                         continue;
2789                 }
2790 
2791                 aLst.Append( cNUMRULE, rRule.GetName() );
2792             }
2793         }
2794         if ( nSrchMask == SFXSTYLEBIT_ALL )
2795             AppendStyleList(SwStyleNameMapper::GetNumRuleUINameArray(),
2796                             bIsSearchUsed, nsSwGetPoolIdFromName::GET_POOLID_NUMRULE, cNUMRULE);
2797     }
2798 
2799     if(aLst.Count() > 0)
2800     {
2801         nLastPos = USHRT_MAX;
2802         return Next();
2803     }
2804     return 0;
2805 }
2806 
Next()2807 SfxStyleSheetBase*  SwStyleSheetIterator::Next()
2808 {
2809     nLastPos++;
2810     if(aLst.Count() > 0 && nLastPos < aLst.Count())
2811     {
2812         mxIterSheet->PresetNameAndFamily(*aLst[nLastPos]);
2813         mxIterSheet->SetPhysical( sal_False );
2814         mxIterSheet->SetMask( nMask );
2815         if(mxIterSheet->pSet)
2816         {
2817             mxIterSheet->pSet->ClearItem(0);
2818             mxIterSheet->pSet= 0;
2819         }
2820         return mxIterSheet.get();
2821     }
2822     return 0;
2823 }
2824 
Find(const UniString & rName)2825 SfxStyleSheetBase*  SwStyleSheetIterator::Find( const UniString& rName )
2826 {
2827     // suchen
2828     if( !bFirstCalled )
2829         First();
2830 
2831     nLastPos = lcl_FindName( aLst, nSearchFamily, rName );
2832     if( USHRT_MAX != nLastPos )
2833     {
2834         // gefunden
2835         mxStyleSheet->PresetNameAndFamily(*aLst[nLastPos]);
2836         // neuer Name gesetzt, also bestimme seine Daten
2837         mxStyleSheet->FillStyleSheet( SwDocStyleSheet::FillOnlyName );
2838         if( !mxStyleSheet->IsPhysical() )
2839             mxStyleSheet->SetPhysical( sal_False );
2840 
2841         return mxStyleSheet.get();
2842     }
2843     return 0;
2844 }
2845 
AppendStyleList(const SvStringsDtor & rList,sal_Bool bTestUsed,sal_uInt16 nSection,char cType)2846 void SwStyleSheetIterator::AppendStyleList(const SvStringsDtor& rList,
2847                                             sal_Bool    bTestUsed,
2848                                             sal_uInt16 nSection, char cType )
2849 {
2850     if( bTestUsed )
2851     {
2852         SwDoc& rDoc = ((SwDocStyleSheetPool*)pBasePool)->GetDoc();
2853         for ( sal_uInt16 i=0; i < rList.Count(); ++i )
2854         {
2855             sal_Bool bUsed = sal_False;
2856             sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName(*rList[i], (SwGetPoolIdFromName)nSection);
2857             switch ( nSection )
2858             {
2859                 case nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL:
2860                         bUsed = rDoc.IsPoolTxtCollUsed( nId );
2861                         break;
2862                 case nsSwGetPoolIdFromName::GET_POOLID_CHRFMT:
2863                         bUsed = rDoc.IsPoolFmtUsed( nId );
2864                         break;
2865                 case nsSwGetPoolIdFromName::GET_POOLID_FRMFMT:
2866                         bUsed = rDoc.IsPoolFmtUsed( nId );
2867                 case nsSwGetPoolIdFromName::GET_POOLID_PAGEDESC:
2868                         bUsed = rDoc.IsPoolPageDescUsed( nId );
2869                         break;
2870                 default:
2871                     ASSERT( !this, "unknown PoolFmt-Id" );
2872             }
2873             if ( bUsed )
2874                 aLst.Append( cType, *rList[i] );
2875         }
2876     }
2877     else
2878         for ( sal_uInt16 i=0; i < rList.Count(); ++i )
2879             aLst.Append( cType, *rList[i] );
2880 }
2881 
Notify(SfxBroadcaster &,const SfxHint & rHint)2882 void  SwStyleSheetIterator::Notify( SfxBroadcaster&, const SfxHint& rHint )
2883 {
2884     // suchen und aus der Anzeige-Liste entfernen !!
2885     if( rHint.ISA( SfxStyleSheetHint ) &&
2886         SFX_STYLESHEET_ERASED == ((SfxStyleSheetHint&) rHint).GetHint() )
2887     {
2888         SfxStyleSheetBase* pStyle = ((SfxStyleSheetHint&)rHint).GetStyleSheet();
2889 
2890         if (pStyle)
2891         {
2892             sal_uInt16 nTmpPos = lcl_FindName( aLst, pStyle->GetFamily(),
2893                                            pStyle->GetName() );
2894             if( nTmpPos < aLst.Count() )
2895                 aLst.DeleteAndDestroy( nTmpPos );
2896         }
2897     }
2898 }
2899 
2900 
2901