xref: /AOO41X/main/sw/source/core/doc/docfmt.cxx (revision 8809db7a87f97847b57a57f4cd2b0104b2b83182)
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 
28 #define _ZFORLIST_DECLARE_TABLE
29 #define _SVSTDARR_USHORTSSORT
30 #define _SVSTDARR_USHORTS
31 #include <hintids.hxx>
32 #include <rtl/logfile.hxx>
33 #include <svl/itemiter.hxx>
34 #include <sfx2/app.hxx>
35 #include <editeng/tstpitem.hxx>
36 #include <editeng/eeitem.hxx>
37 #include <editeng/langitem.hxx>
38 #include <editeng/lrspitem.hxx>
39 #include <editeng/brkitem.hxx>
40 #include <svl/whiter.hxx>
41 #ifndef _ZFORLIST_HXX //autogen
42 #define _ZFORLIST_DECLARE_TABLE
43 #include <svl/zforlist.hxx>
44 #endif
45 #include <comphelper/processfactory.hxx>
46 #include <unotools/misccfg.hxx>
47 #include <com/sun/star/i18n/WordType.hdl>
48 #include <fmtpdsc.hxx>
49 #include <fmthdft.hxx>
50 #include <fmtcntnt.hxx>
51 #include <frmatr.hxx>
52 #include <doc.hxx>
53 #include <IDocumentUndoRedo.hxx>
54 #include <rootfrm.hxx>
55 #include <pagefrm.hxx>
56 #include <hints.hxx>            // fuer SwHyphenBug (in SetDefault)
57 #include <ndtxt.hxx>
58 #include <pam.hxx>
59 #include <UndoCore.hxx>
60 #include <UndoAttribute.hxx>
61 #include <ndgrf.hxx>
62 #include <pagedesc.hxx>         // Fuer Sonderbehandlung in InsFrmFmt
63 #include <rolbck.hxx>           // Undo-Attr
64 #include <mvsave.hxx>           // servieren: Veraenderungen erkennen
65 #include <txatbase.hxx>
66 #include <swtable.hxx>
67 #include <swtblfmt.hxx>
68 #include <charfmt.hxx>
69 #include <docary.hxx>
70 #include <paratr.hxx>
71 #include <redline.hxx>
72 #include <reffld.hxx>
73 #include <txtinet.hxx>
74 #include <fmtinfmt.hxx>
75 #include <breakit.hxx>
76 #include <SwStyleNameMapper.hxx>
77 #include <fmtautofmt.hxx>
78 #include <istyleaccess.hxx>
79 #include <SwUndoFmt.hxx>
80 #include <docsh.hxx>
81 
82 using namespace ::com::sun::star::i18n;
83 using namespace ::com::sun::star::lang;
84 using namespace ::com::sun::star::uno;
85 
86 SV_IMPL_PTRARR(SwFrmFmts,SwFrmFmtPtr)
87 SV_IMPL_PTRARR(SwCharFmts,SwCharFmtPtr)
88 
89 //Spezifische Frameformate (Rahmen)
90 SV_IMPL_PTRARR(SwSpzFrmFmts,SwFrmFmtPtr)
91 
92 /*
93  * interne Funktionen
94  */
95 
96 sal_Bool SetTxtFmtCollNext( const SwTxtFmtCollPtr& rpTxtColl, void* pArgs )
97 {
98     SwTxtFmtColl *pDel = (SwTxtFmtColl*) pArgs;
99     if ( &rpTxtColl->GetNextTxtFmtColl() == pDel )
100     {
101         rpTxtColl->SetNextTxtFmtColl( *rpTxtColl );
102     }
103     return sal_True;
104 }
105 
106 /*
107  * Zuruecksetzen der harten Formatierung fuer Text
108  */
109 
110 // Uebergabeparameter fuer _Rst und lcl_SetTxtFmtColl
111 struct ParaRstFmt
112 {
113     SwFmtColl* pFmtColl;
114     SwHistory* pHistory;
115     const SwPosition *pSttNd, *pEndNd;
116     const SfxItemSet* pDelSet;
117     sal_uInt16 nWhich;
118     bool bReset;
119     // --> OD 2007-11-06 #i62575#
120     bool bResetListAttrs;
121     // <--
122     bool bResetAll;
123     bool bInclRefToxMark;
124 
125     bool bKeepOutlineLevelAttr; //#outline level,add by zhaojianwei
126 
127     ParaRstFmt( const SwPosition* pStt, const SwPosition* pEnd,
128                 SwHistory* pHst, sal_uInt16 nWhch = 0, const SfxItemSet* pSet = 0 )
129         : pFmtColl(0),
130           pHistory(pHst),
131           pSttNd(pStt),
132           pEndNd(pEnd),
133           pDelSet(pSet),
134           nWhich(nWhch),
135           // --> OD 2007-11-06 #i62675#
136           bReset( false ),
137           bResetListAttrs( false ),
138           // <--
139           bResetAll( true ),
140           bInclRefToxMark( false ),
141           bKeepOutlineLevelAttr( false )    //#outline level,add by zhaojianwei
142     {}
143 
144     ParaRstFmt( SwHistory* pHst )
145         : pFmtColl(0),
146           pHistory(pHst),
147           pSttNd(0),
148           pEndNd(0),
149           pDelSet(0),
150           nWhich(0),
151           // --> OD 2007-11-06 #i62675#
152           bReset( false ),
153           bResetListAttrs( false ),
154           // <--
155           bResetAll( true ),
156           bInclRefToxMark( false ),
157           bKeepOutlineLevelAttr( false )    //#outline level,add by zhaojianwei
158     {}
159 };
160 
161 /* in pArgs steht die ChrFmtTablle vom Dokument
162  * (wird bei Selectionen am Start/Ende und bei keiner SSelection benoetigt)
163  */
164 
165 sal_Bool lcl_RstTxtAttr( const SwNodePtr& rpNd, void* pArgs )
166 {
167     ParaRstFmt* pPara = (ParaRstFmt*)pArgs;
168     SwTxtNode * pTxtNode = (SwTxtNode*)rpNd->GetTxtNode();
169     if( pTxtNode && pTxtNode->GetpSwpHints() )
170     {
171         SwIndex aSt( pTxtNode, 0 );
172         sal_uInt16 nEnd = pTxtNode->Len();
173 
174         if( &pPara->pSttNd->nNode.GetNode() == pTxtNode &&
175             pPara->pSttNd->nContent.GetIndex() )
176             aSt = pPara->pSttNd->nContent.GetIndex();
177 
178         if( &pPara->pEndNd->nNode.GetNode() == rpNd )
179             nEnd = pPara->pEndNd->nContent.GetIndex();
180 
181         if( pPara->pHistory )
182         {
183             // fuers Undo alle Attribute sichern
184             SwRegHistory aRHst( *pTxtNode, pPara->pHistory );
185             pTxtNode->GetpSwpHints()->Register( &aRHst );
186             pTxtNode->RstAttr( aSt, nEnd - aSt.GetIndex(), pPara->nWhich,
187                                 pPara->pDelSet, pPara->bInclRefToxMark );
188             if( pTxtNode->GetpSwpHints() )
189                 pTxtNode->GetpSwpHints()->DeRegister();
190         }
191         else
192             pTxtNode->RstAttr( aSt, nEnd - aSt.GetIndex(), pPara->nWhich,
193                                 pPara->pDelSet, pPara->bInclRefToxMark );
194     }
195     return sal_True;
196 }
197 
198 sal_Bool lcl_RstAttr( const SwNodePtr& rpNd, void* pArgs )
199 {
200     ParaRstFmt* pPara = (ParaRstFmt*)pArgs;
201     SwCntntNode* pNode = (SwCntntNode*)rpNd->GetCntntNode();
202     if( pNode && pNode->HasSwAttrSet() )
203     {
204         const sal_Bool bLocked = pNode->IsModifyLocked();
205         pNode->LockModify();
206 
207         SwDoc* pDoc = pNode->GetDoc();
208 
209         // --> OD 2008-04-14 #refactorlists#
210         // remove unused attribute RES_LR_SPACE
211         // add list attributes
212         SfxItemSet aSet( pDoc->GetAttrPool(),
213                          RES_PAGEDESC, RES_BREAK,
214                          RES_PARATR_NUMRULE, RES_PARATR_NUMRULE,
215                          RES_PARATR_OUTLINELEVEL,RES_PARATR_OUTLINELEVEL,//#outline level,removed by zhaojianwei
216                          RES_PARATR_LIST_BEGIN, RES_PARATR_LIST_END - 1,
217                          0 );
218         const SfxItemSet* pSet = pNode->GetpSwAttrSet();
219 
220         // --> OD 2008-04-15 #refactorlists#
221 //        std::vector<sal_uInt16> aClearWhichIds;
222         SvUShorts aClearWhichIds;
223         // <--
224         // --> OD 2008-04-15 #refactorlists#
225         // restoring all paragraph list attributes
226         {
227             SfxItemSet aListAttrSet( pDoc->GetAttrPool(),
228                                      RES_PARATR_LIST_BEGIN, RES_PARATR_LIST_END - 1,
229                                      0 );
230             aListAttrSet.Set( *pSet );
231             if ( aListAttrSet.Count() )
232             {
233                 aSet.Put( aListAttrSet );
234                 SfxItemIter aIter( aListAttrSet );
235                 const SfxPoolItem* pItem = aIter.GetCurItem();
236                 while( pItem )
237                 {
238                     aClearWhichIds.Insert( pItem->Which(), aClearWhichIds.Count() );
239                     pItem = aIter.NextItem();
240                 }
241             }
242         }
243         // <--
244 
245         const SfxPoolItem* pItem;
246   //      sal_uInt16 __READONLY_DATA aSavIds[ 3 ] = { RES_PAGEDESC, RES_BREAK,  //#outline level,removed by zhaojianwei
247   //                                              RES_PARATR_NUMRULE };
248         //for( sal_uInt16 n = 0; n < 3; ++n )
249         sal_uInt16 __READONLY_DATA aSavIds[ 4 ] = { RES_PAGEDESC, RES_BREAK,    //->add by zhaojianwei
250                                                 RES_PARATR_NUMRULE,
251                                                 RES_PARATR_OUTLINELEVEL };
252         for( sal_uInt16 n = 0; n < 4; ++n )                                     //<-end,zhaojianwei
253         {
254             if( SFX_ITEM_SET == pSet->GetItemState( aSavIds[ n ], sal_False, &pItem ))
255             {
256                 bool bSave = false;
257                 switch( aSavIds[ n ] )
258                 {
259                     case RES_PAGEDESC:
260                         bSave = 0 != ((SwFmtPageDesc*)pItem)->GetPageDesc();
261                     break;
262                     case RES_BREAK:
263                         bSave = SVX_BREAK_NONE != ((SvxFmtBreakItem*)pItem)->GetBreak();
264                     break;
265                     case RES_PARATR_NUMRULE:
266                     {
267                         bSave = 0 != ((SwNumRuleItem*)pItem)->GetValue().Len();
268                     }
269                     break;
270                     case RES_PARATR_OUTLINELEVEL:               //#outline level,add by zhaojianwei
271                     {
272                         bSave = pPara && pPara->bKeepOutlineLevelAttr;
273                     }
274                     break;                                      //<-end,zhaojianwei
275                 }
276                 if( bSave )
277                 {
278                     aSet.Put( *pItem );
279                     // --> OD 2008-04-15 #refactorlists#
280 //                    aClearWhichIds.push_back( aSavIds[n] );
281                     aClearWhichIds.Insert( aSavIds[n], aClearWhichIds.Count() );
282                 }
283             }
284         }
285 
286         // --> OD 2008-04-14 #refactorlists#
287         // do not clear items directly from item set and only clear to be kept
288         // attributes, if no deletion item set is found.
289 //        pNode->ClearItemsFromAttrSet( aClearWhichIds );
290         const bool bKeepAttributes =
291                     !pPara || !pPara->pDelSet || pPara->pDelSet->Count() == 0;
292         if ( bKeepAttributes )
293         {
294             pNode->ResetAttr( aClearWhichIds );
295         }
296         // <--
297 
298         if( !bLocked )
299             pNode->UnlockModify();
300 
301         if( pPara )
302         {
303             SwRegHistory aRegH( pNode, *pNode, pPara->pHistory );
304 
305             if( pPara->pDelSet && pPara->pDelSet->Count() )
306             {
307                 // --> OD 2008-04-15 #refactorlists#
308                 ASSERT( !bKeepAttributes,
309                         "<lcl_RstAttr(..)> - certain attributes are kept, but not needed. -> please inform OD" );
310                 // <--
311                 SfxItemIter aIter( *pPara->pDelSet );
312                 pItem = aIter.FirstItem();
313                 while( sal_True )
314                 {
315                     // --> OD 2008-04-14 #refactorlists#
316                     //
317                     if ( ( pItem->Which() != RES_PAGEDESC &&
318                            pItem->Which() != RES_BREAK &&
319                            pItem->Which() != RES_PARATR_NUMRULE ) ||
320                          ( aSet.GetItemState( pItem->Which(), sal_False ) != SFX_ITEM_SET ) )
321                     {
322                         pNode->ResetAttr( pItem->Which() );
323                     }
324                     // <--
325                     if( aIter.IsAtEnd() )
326                         break;
327                     pItem = aIter.NextItem();
328                 }
329             }
330             else if( pPara->bResetAll )
331                 pNode->ResetAllAttr();
332             else
333                 pNode->ResetAttr( RES_PARATR_BEGIN, POOLATTR_END - 1 );
334         }
335         else
336             pNode->ResetAllAttr();
337 
338         // --> OD 2008-04-15 #refactorlists#
339         // only restore saved attributes, if needed
340         if ( bKeepAttributes && aSet.Count() )
341         // <--
342         {
343             pNode->LockModify();
344 
345             pNode->SetAttr( aSet );
346 
347             if( !bLocked )
348                 pNode->UnlockModify();
349         }
350     }
351     return sal_True;
352 }
353 
354 void SwDoc::RstTxtAttrs(const SwPaM &rRg, sal_Bool bInclRefToxMark )
355 {
356     SwHistory* pHst = 0;
357     SwDataChanged aTmp( rRg, 0 );
358     if (GetIDocumentUndoRedo().DoesUndo())
359     {
360         SwUndoResetAttr* pUndo = new SwUndoResetAttr( rRg, RES_CHRFMT );
361         pHst = &pUndo->GetHistory();
362         GetIDocumentUndoRedo().AppendUndo(pUndo);
363     }
364     const SwPosition *pStt = rRg.Start(), *pEnd = rRg.End();
365     ParaRstFmt aPara( pStt, pEnd, pHst );
366     aPara.bInclRefToxMark = ( bInclRefToxMark == sal_True );
367     GetNodes().ForEach( pStt->nNode.GetIndex(), pEnd->nNode.GetIndex()+1,
368                         lcl_RstTxtAttr, &aPara );
369     SetModified();
370 }
371 
372 void SwDoc::ResetAttrs( const SwPaM &rRg,
373                         sal_Bool bTxtAttr,
374                         const SvUShortsSort* pAttrs,
375                         // --> OD 2008-11-28 #b96644#
376                         const bool bSendDataChangedEvents )
377                         // <--
378 {
379     SwPaM* pPam = (SwPaM*)&rRg;
380     if( !bTxtAttr && pAttrs && pAttrs->Count() &&
381         RES_TXTATR_END > (*pAttrs)[ 0 ] )
382         bTxtAttr = sal_True;
383 
384     if( !rRg.HasMark() )
385     {
386         SwTxtNode* pTxtNd = rRg.GetPoint()->nNode.GetNode().GetTxtNode();
387         if( !pTxtNd )
388             return ;
389 
390         pPam = new SwPaM( *rRg.GetPoint() );
391 
392         SwIndex& rSt = pPam->GetPoint()->nContent;
393         sal_uInt16 nMkPos, nPtPos = rSt.GetIndex();
394 
395         // JP 22.08.96: Sonderfall: steht der Crsr in einem URL-Attribut
396         //              dann wird dessen Bereich genommen
397         SwTxtAttr const*const pURLAttr(
398             pTxtNd->GetTxtAttrAt(rSt.GetIndex(), RES_TXTATR_INETFMT));
399         if (pURLAttr && pURLAttr->GetINetFmt().GetValue().Len())
400         {
401             nMkPos = *pURLAttr->GetStart();
402             nPtPos = *pURLAttr->GetEnd();
403         }
404         else
405         {
406             Boundary aBndry;
407             if( pBreakIt->GetBreakIter().is() )
408                 aBndry = pBreakIt->GetBreakIter()->getWordBoundary(
409                             pTxtNd->GetTxt(), nPtPos,
410                             pBreakIt->GetLocale( pTxtNd->GetLang( nPtPos ) ),
411                             WordType::ANY_WORD /*ANYWORD_IGNOREWHITESPACES*/,
412                             sal_True );
413 
414             if( aBndry.startPos < nPtPos && nPtPos < aBndry.endPos )
415             {
416                 nMkPos = (xub_StrLen)aBndry.startPos;
417                 nPtPos = (xub_StrLen)aBndry.endPos;
418             }
419             else
420             {
421                 nPtPos = nMkPos = rSt.GetIndex();
422                 if( bTxtAttr )
423                     pTxtNd->DontExpandFmt( rSt, sal_True );
424             }
425         }
426 
427         rSt = nMkPos;
428         pPam->SetMark();
429         pPam->GetPoint()->nContent = nPtPos;
430     }
431 
432     // --> OD 2008-11-28 #i96644#
433 //    SwDataChanged aTmp( *pPam, 0 );
434     std::auto_ptr< SwDataChanged > pDataChanged;
435     if ( bSendDataChangedEvents )
436     {
437         pDataChanged.reset( new SwDataChanged( *pPam, 0 ) );
438     }
439     // <--
440     SwHistory* pHst = 0;
441     if (GetIDocumentUndoRedo().DoesUndo())
442     {
443         SwUndoResetAttr* pUndo = new SwUndoResetAttr( rRg,
444             static_cast<sal_uInt16>(bTxtAttr ? RES_CONDTXTFMTCOLL : RES_TXTFMTCOLL ));
445         if( pAttrs && pAttrs->Count() )
446         {
447             pUndo->SetAttrs( *pAttrs );
448         }
449         pHst = &pUndo->GetHistory();
450         GetIDocumentUndoRedo().AppendUndo(pUndo);
451     }
452 
453     const SwPosition *pStt = pPam->Start(), *pEnd = pPam->End();
454     ParaRstFmt aPara( pStt, pEnd, pHst );
455 
456     // mst: not including META here; it seems attrs with CH_TXTATR are omitted
457     sal_uInt16 __FAR_DATA aResetableSetRange[] = {
458         RES_FRMATR_BEGIN, RES_FRMATR_END-1,
459         RES_CHRATR_BEGIN, RES_CHRATR_END-1,
460         RES_PARATR_BEGIN, RES_PARATR_END-1,
461         // --> OD 2008-02-25 #refactorlists#
462         RES_PARATR_LIST_BEGIN, RES_PARATR_LIST_END-1,
463         // <--
464         RES_TXTATR_INETFMT, RES_TXTATR_INETFMT,
465         RES_TXTATR_CHARFMT, RES_TXTATR_CHARFMT,
466         RES_TXTATR_CJK_RUBY, RES_TXTATR_CJK_RUBY,
467         RES_TXTATR_UNKNOWN_CONTAINER, RES_TXTATR_UNKNOWN_CONTAINER,
468         RES_UNKNOWNATR_BEGIN, RES_UNKNOWNATR_END-1,
469         0
470     };
471 
472     SfxItemSet aDelSet( GetAttrPool(), aResetableSetRange );
473     if( pAttrs && pAttrs->Count() )
474     {
475         for( sal_uInt16 n = pAttrs->Count(); n; )
476             if( POOLATTR_END > (*pAttrs)[ --n ] )
477                 aDelSet.Put( *GetDfltAttr( (*pAttrs)[ n ] ));
478 
479         if( aDelSet.Count() )
480             aPara.pDelSet = &aDelSet;
481     }
482 
483     sal_Bool bAdd = sal_True;
484     SwNodeIndex aTmpStt( pStt->nNode );
485     SwNodeIndex aTmpEnd( pEnd->nNode );
486     if( pStt->nContent.GetIndex() )     // nur ein Teil
487     {
488         // dann spaeter aufsetzen und alle CharFmtAttr -> TxtFmtAttr
489         SwTxtNode* pTNd = aTmpStt.GetNode().GetTxtNode();
490         if( pTNd && pTNd->HasSwAttrSet() && pTNd->GetpSwAttrSet()->Count() )
491         {
492             if (pHst)
493             {
494                 SwRegHistory history(pTNd, *pTNd, pHst);
495                 pTNd->FmtToTxtAttr(pTNd);
496             }
497             else
498             {
499                 pTNd->FmtToTxtAttr(pTNd);
500             }
501         }
502 
503         aTmpStt++;
504     }
505     if( pEnd->nContent.GetIndex() == pEnd->nNode.GetNode().GetCntntNode()->Len() )
506         // dann spaeter aufsetzen und alle CharFmtAttr -> TxtFmtAttr
507         aTmpEnd++, bAdd = sal_False;
508     else if( pStt->nNode != pEnd->nNode || !pStt->nContent.GetIndex() )
509     {
510         SwTxtNode* pTNd = aTmpEnd.GetNode().GetTxtNode();
511         if( pTNd && pTNd->HasSwAttrSet() && pTNd->GetpSwAttrSet()->Count() )
512         {
513             if (pHst)
514             {
515                 SwRegHistory history(pTNd, *pTNd, pHst);
516                 pTNd->FmtToTxtAttr(pTNd);
517             }
518             else
519             {
520                 pTNd->FmtToTxtAttr(pTNd);
521             }
522         }
523     }
524 
525     if( aTmpStt < aTmpEnd )
526         GetNodes().ForEach( pStt->nNode, aTmpEnd, lcl_RstAttr, &aPara );
527     else if( !rRg.HasMark() )
528     {
529         aPara.bResetAll = false ;
530         ::lcl_RstAttr( &pStt->nNode.GetNode(), &aPara );
531         aPara.bResetAll = true ;
532     }
533 
534     if( bTxtAttr )
535     {
536         if( bAdd )
537             aTmpEnd++;
538         GetNodes().ForEach( pStt->nNode, aTmpEnd, lcl_RstTxtAttr, &aPara );
539     }
540 
541     if( pPam != &rRg )
542         delete pPam;
543 
544     SetModified();
545 }
546 
547 #define DELETECHARSETS if ( bDelete ) { delete pCharSet; delete pOtherSet; }
548 
549 // Einfuegen der Hints nach Inhaltsformen;
550 // wird in SwDoc::Insert(..., SwFmtHint &rHt) benutzt
551 
552 static bool
553 lcl_InsAttr(SwDoc *const pDoc, const SwPaM &rRg, const SfxItemSet& rChgSet,
554             const SetAttrMode nFlags, SwUndoAttr *const pUndo)
555 {
556     // teil die Sets auf (fuer Selektion in Nodes)
557     const SfxItemSet* pCharSet = 0;
558     const SfxItemSet* pOtherSet = 0;
559     bool bDelete = false;
560     bool bCharAttr = false;
561     bool bOtherAttr = false;
562 
563     // Check, if we can work with rChgSet or if we have to create additional SfxItemSets
564     if ( 1 == rChgSet.Count() )
565     {
566         SfxItemIter aIter( rChgSet );
567         const SfxPoolItem* pItem = aIter.FirstItem();
568 
569         if (!IsInvalidItem(pItem))
570         {
571             const sal_uInt16 nWhich = pItem->Which();
572 
573             if ( isCHRATR(nWhich) ||
574                  (RES_TXTATR_CHARFMT == nWhich) ||
575                  (RES_TXTATR_INETFMT == nWhich) ||
576                  (RES_TXTATR_AUTOFMT == nWhich) ||
577                  (RES_TXTATR_UNKNOWN_CONTAINER == nWhich) )
578             {
579                 pCharSet  = &rChgSet;
580                 bCharAttr = true;
581             }
582 
583             if (    isPARATR(nWhich)
584                     || isPARATR_LIST(nWhich)
585                     || isFRMATR(nWhich)
586                     || isGRFATR(nWhich)
587                     || isUNKNOWNATR(nWhich) )
588             {
589                 pOtherSet = &rChgSet;
590                 bOtherAttr = true;
591             }
592         }
593     }
594 
595     // Build new itemset if either
596     // - rChgSet.Count() > 1 or
597     // - The attribute in rChgSet does not belong to one of the above categories
598     if ( !bCharAttr && !bOtherAttr )
599     {
600         SfxItemSet* pTmpCharItemSet = new SfxItemSet( pDoc->GetAttrPool(),
601                                    RES_CHRATR_BEGIN, RES_CHRATR_END-1,
602                                    RES_TXTATR_AUTOFMT, RES_TXTATR_AUTOFMT,
603                                    RES_TXTATR_INETFMT, RES_TXTATR_INETFMT,
604                                    RES_TXTATR_CHARFMT, RES_TXTATR_CHARFMT,
605                RES_TXTATR_UNKNOWN_CONTAINER, RES_TXTATR_UNKNOWN_CONTAINER,
606                                    0 );
607 
608         SfxItemSet* pTmpOtherItemSet = new SfxItemSet( pDoc->GetAttrPool(),
609                                     RES_PARATR_BEGIN, RES_PARATR_END-1,
610                                     // --> OD 2008-02-25 #refactorlists#
611                                     RES_PARATR_LIST_BEGIN, RES_PARATR_LIST_END-1,
612                                     // <--
613                                     RES_FRMATR_BEGIN, RES_FRMATR_END-1,
614                                     RES_GRFATR_BEGIN, RES_GRFATR_END-1,
615                                     RES_UNKNOWNATR_BEGIN, RES_UNKNOWNATR_END-1,
616                                     0 );
617 
618         pTmpCharItemSet->Put( rChgSet );
619         pTmpOtherItemSet->Put( rChgSet );
620 
621         pCharSet = pTmpCharItemSet;
622         pOtherSet = pTmpOtherItemSet;
623 
624         bDelete = true;
625     }
626 
627     SwHistory* pHistory = pUndo ? &pUndo->GetHistory() : 0;
628     bool bRet = false;
629     const SwPosition *pStt = rRg.Start(), *pEnd = rRg.End();
630     SwCntntNode* pNode = pStt->nNode.GetNode().GetCntntNode();
631 
632     if( pNode && pNode->IsTxtNode() )
633     {
634         // -> #i27615#
635         if (rRg.IsInFrontOfLabel())
636         {
637             SwTxtNode * pTxtNd = pNode->GetTxtNode();
638             SwNumRule * pNumRule = pTxtNd->GetNumRule();
639 
640             // --> OD 2005-10-24 #126346# - make code robust:
641             if ( !pNumRule )
642             {
643                 ASSERT( false,
644                         "<InsAttr(..)> - PaM in front of label, but text node has no numbering rule set. This is a serious defect, please inform OD." );
645                 DELETECHARSETS
646                 return false;
647             }
648             // <--
649 
650             SwNumFmt aNumFmt = pNumRule->Get(static_cast<sal_uInt16>(pTxtNd->GetActualListLevel()));
651             SwCharFmt * pCharFmt =
652                 pDoc->FindCharFmtByName(aNumFmt.GetCharFmtName());
653 
654             if (pCharFmt)
655             {
656                 if (pHistory)
657                     pHistory->Add(pCharFmt->GetAttrSet(), *pCharFmt);
658 
659                 if ( pCharSet )
660                     pCharFmt->SetFmtAttr(*pCharSet);
661             }
662 
663             DELETECHARSETS
664             return true;
665         }
666         // <- #i27615#
667 
668         const SwIndex& rSt = pStt->nContent;
669 
670         // Attribute ohne Ende haben keinen Bereich
671         if ( !bCharAttr && !bOtherAttr )
672         {
673             SfxItemSet aTxtSet( pDoc->GetAttrPool(),
674                         RES_TXTATR_NOEND_BEGIN, RES_TXTATR_NOEND_END-1 );
675             aTxtSet.Put( rChgSet );
676             if( aTxtSet.Count() )
677             {
678                 SwRegHistory history( pNode, *pNode, pHistory );
679                 bRet = history.InsertItems(
680                     aTxtSet, rSt.GetIndex(), rSt.GetIndex(), nFlags ) || bRet;
681 
682                 if (bRet && (pDoc->IsRedlineOn() || (!pDoc->IsIgnoreRedline()
683                                 && pDoc->GetRedlineTbl().Count())))
684                 {
685                     SwPaM aPam( pStt->nNode, pStt->nContent.GetIndex()-1,
686                                 pStt->nNode, pStt->nContent.GetIndex() );
687 
688                     if( pUndo )
689                         pUndo->SaveRedlineData( aPam, sal_True );
690 
691                     if( pDoc->IsRedlineOn() )
692                         pDoc->AppendRedline( new SwRedline( nsRedlineType_t::REDLINE_INSERT, aPam ), true);
693                     else
694                         pDoc->SplitRedline( aPam );
695                 }
696             }
697         }
698 
699         // TextAttribute mit Ende expandieren nie ihren Bereich
700         if ( !bCharAttr && !bOtherAttr )
701         {
702             // CharFmt wird gesondert behandelt !!!
703             // JP 22.08.96: URL-Attribute auch!!
704             // TEST_TEMP ToDo: AutoFmt!
705             SfxItemSet aTxtSet( pDoc->GetAttrPool(),
706                                 RES_TXTATR_REFMARK, RES_TXTATR_TOXMARK,
707                                 RES_TXTATR_META, RES_TXTATR_METAFIELD,
708                                 RES_TXTATR_CJK_RUBY, RES_TXTATR_CJK_RUBY,
709                                 0 );
710 
711             aTxtSet.Put( rChgSet );
712             if( aTxtSet.Count() )
713             {
714                 sal_uInt16 nInsCnt = rSt.GetIndex();
715                 sal_uInt16 nEnd = pStt->nNode == pEnd->nNode
716                                 ? pEnd->nContent.GetIndex()
717                                 : pNode->Len();
718                 SwRegHistory history( pNode, *pNode, pHistory );
719                 bRet = history.InsertItems( aTxtSet, nInsCnt, nEnd, nFlags )
720                     || bRet;
721 
722                 if (bRet && (pDoc->IsRedlineOn() || (!pDoc->IsIgnoreRedline()
723                                 && pDoc->GetRedlineTbl().Count())))
724                 {
725                     // wurde Text-Inhalt eingefuegt? (RefMark/TOXMarks ohne Ende)
726                     sal_Bool bTxtIns = nInsCnt != rSt.GetIndex();
727                     // wurde Inhalt eingefuegt oder ueber die Selektion gesetzt?
728                     SwPaM aPam( pStt->nNode, bTxtIns ? nInsCnt + 1 : nEnd,
729                                 pStt->nNode, nInsCnt );
730                     if( pUndo )
731                         pUndo->SaveRedlineData( aPam, bTxtIns );
732 
733                     if( pDoc->IsRedlineOn() )
734                         pDoc->AppendRedline( new SwRedline( bTxtIns
735                                 ? nsRedlineType_t::REDLINE_INSERT : nsRedlineType_t::REDLINE_FORMAT, aPam ), true);
736                     else if( bTxtIns )
737                         pDoc->SplitRedline( aPam );
738                 }
739             }
740         }
741     }
742 
743     // bei PageDesc's, die am Node gesetzt werden, muss immer das
744     // Auto-Flag gesetzt werden!!
745     if( pOtherSet && pOtherSet->Count() )
746     {
747         SwTableNode* pTblNd;
748         const SwFmtPageDesc* pDesc;
749         if( SFX_ITEM_SET == pOtherSet->GetItemState( RES_PAGEDESC,
750                         sal_False, (const SfxPoolItem**)&pDesc ))
751         {
752             if( pNode )
753             {
754                 // Auto-Flag setzen, nur in Vorlagen ist ohne Auto !
755                 SwFmtPageDesc aNew( *pDesc );
756                 // Bug 38479: AutoFlag wird jetzt in der WrtShell gesetzt
757                 // aNew.SetAuto();
758 
759                 // Tabellen kennen jetzt auch Umbrueche
760                 if( 0 == (nFlags & nsSetAttrMode::SETATTR_APICALL) &&
761                     0 != ( pTblNd = pNode->FindTableNode() ) )
762                 {
763                     SwTableNode* pCurTblNd = pTblNd;
764                     while ( 0 != ( pCurTblNd = pCurTblNd->StartOfSectionNode()->FindTableNode() ) )
765                         pTblNd = pCurTblNd;
766 
767                     // dann am Tabellen Format setzen
768                     SwFrmFmt* pFmt = pTblNd->GetTable().GetFrmFmt();
769                     SwRegHistory aRegH( pFmt, *pTblNd, pHistory );
770                     pFmt->SetFmtAttr( aNew );
771                     bRet = true;
772                 }
773                 else
774                 {
775                     SwRegHistory aRegH( pNode, *pNode, pHistory );
776                     bRet = pNode->SetAttr( aNew ) || bRet;
777                 }
778             }
779 
780             // bOtherAttr = true means that pOtherSet == rChgSet. In this case
781             // we know, that there is only one attribute in pOtherSet. We cannot
782             // perform the following operations, instead we return:
783             if ( bOtherAttr )
784                 return bRet;
785 
786             const_cast<SfxItemSet*>(pOtherSet)->ClearItem( RES_PAGEDESC );
787             if( !pOtherSet->Count() )
788             {
789                 DELETECHARSETS
790                 return bRet;
791             }
792         }
793 
794         // Tabellen kennen jetzt auch Umbrueche
795         const SvxFmtBreakItem* pBreak;
796         if( pNode && 0 == (nFlags & nsSetAttrMode::SETATTR_APICALL) &&
797             0 != (pTblNd = pNode->FindTableNode() ) &&
798             SFX_ITEM_SET == pOtherSet->GetItemState( RES_BREAK,
799                         sal_False, (const SfxPoolItem**)&pBreak ) )
800         {
801             SwTableNode* pCurTblNd = pTblNd;
802             while ( 0 != ( pCurTblNd = pCurTblNd->StartOfSectionNode()->FindTableNode() ) )
803                 pTblNd = pCurTblNd;
804 
805             // dann am Tabellen Format setzen
806             SwFrmFmt* pFmt = pTblNd->GetTable().GetFrmFmt();
807             SwRegHistory aRegH( pFmt, *pTblNd, pHistory );
808             pFmt->SetFmtAttr( *pBreak );
809             bRet = true;
810 
811             // bOtherAttr = true means that pOtherSet == rChgSet. In this case
812             // we know, that there is only one attribute in pOtherSet. We cannot
813             // perform the following operations, instead we return:
814             if ( bOtherAttr )
815                 return bRet;
816 
817             const_cast<SfxItemSet*>(pOtherSet)->ClearItem( RES_BREAK );
818             if( !pOtherSet->Count() )
819             {
820                 DELETECHARSETS
821                 return bRet;
822             }
823         }
824 
825         {
826             // wenns eine PoolNumRule ist, diese ggfs. anlegen
827             const SwNumRuleItem* pRule;
828             sal_uInt16 nPoolId;
829             if( SFX_ITEM_SET == pOtherSet->GetItemState( RES_PARATR_NUMRULE,
830                                 sal_False, (const SfxPoolItem**)&pRule ) &&
831                 !pDoc->FindNumRulePtr( pRule->GetValue() ) &&
832                 USHRT_MAX != (nPoolId = SwStyleNameMapper::GetPoolIdFromUIName ( pRule->GetValue(),
833                                 nsSwGetPoolIdFromName::GET_POOLID_NUMRULE )) )
834                 pDoc->GetNumRuleFromPool( nPoolId );
835         }
836 
837     }
838 
839     if( !rRg.HasMark() )        // kein Bereich
840     {
841         if( !pNode )
842         {
843             DELETECHARSETS
844             return bRet;
845         }
846 
847         if( pNode->IsTxtNode() && pCharSet && pCharSet->Count() )
848         {
849             SwTxtNode* pTxtNd = static_cast<SwTxtNode*>(pNode);
850             const SwIndex& rSt = pStt->nContent;
851             sal_uInt16 nMkPos, nPtPos = rSt.GetIndex();
852             const String& rStr = pTxtNd->GetTxt();
853 
854             // JP 22.08.96: Sonderfall: steht der Crsr in einem URL-Attribut
855             //              dann wird dessen Bereich genommen
856             SwTxtAttr const*const pURLAttr(
857                 pTxtNd->GetTxtAttrAt(rSt.GetIndex(), RES_TXTATR_INETFMT));
858             if (pURLAttr && pURLAttr->GetINetFmt().GetValue().Len())
859             {
860                 nMkPos = *pURLAttr->GetStart();
861                 nPtPos = *pURLAttr->GetEnd();
862             }
863             else
864             {
865                 Boundary aBndry;
866                 if( pBreakIt->GetBreakIter().is() )
867                     aBndry = pBreakIt->GetBreakIter()->getWordBoundary(
868                                 pTxtNd->GetTxt(), nPtPos,
869                                 pBreakIt->GetLocale( pTxtNd->GetLang( nPtPos ) ),
870                                 WordType::ANY_WORD /*ANYWORD_IGNOREWHITESPACES*/,
871                                 sal_True );
872 
873                 if( aBndry.startPos < nPtPos && nPtPos < aBndry.endPos )
874                 {
875                     nMkPos = (xub_StrLen)aBndry.startPos;
876                     nPtPos = (xub_StrLen)aBndry.endPos;
877                 }
878                 else
879                     nPtPos = nMkPos = rSt.GetIndex();
880             }
881 
882             // erstmal die zu ueberschreibenden Attribute aus dem
883             // SwpHintsArray entfernen, wenn die Selektion den gesamten
884             // Absatz umspannt. (Diese Attribute werden als FormatAttr.
885             // eingefuegt und verdraengen nie die TextAttr.!)
886             if( !(nFlags & nsSetAttrMode::SETATTR_DONTREPLACE ) &&
887                 pTxtNd->HasHints() && !nMkPos && nPtPos == rStr.Len() )
888             {
889                 SwIndex aSt( pTxtNd );
890                 if( pHistory )
891                 {
892                     // fuers Undo alle Attribute sichern
893                     SwRegHistory aRHst( *pTxtNd, pHistory );
894                     pTxtNd->GetpSwpHints()->Register( &aRHst );
895                     pTxtNd->RstAttr( aSt, nPtPos, 0, pCharSet );
896                     if( pTxtNd->GetpSwpHints() )
897                         pTxtNd->GetpSwpHints()->DeRegister();
898                 }
899                 else
900                     pTxtNd->RstAttr( aSt, nPtPos, 0, pCharSet );
901             }
902 
903             // the SwRegHistory inserts the attribute into the TxtNode!
904             SwRegHistory history( pNode, *pNode, pHistory );
905             bRet = history.InsertItems( *pCharSet, nMkPos, nPtPos, nFlags )
906                 || bRet;
907 
908             if( pDoc->IsRedlineOn() )
909             {
910                 SwPaM aPam( *pNode, nMkPos, *pNode, nPtPos );
911 
912                 if( pUndo )
913                     pUndo->SaveRedlineData( aPam, sal_False );
914                 pDoc->AppendRedline( new SwRedline( nsRedlineType_t::REDLINE_FORMAT, aPam ), true);
915             }
916         }
917         if( pOtherSet && pOtherSet->Count() )
918         {
919             SwRegHistory aRegH( pNode, *pNode, pHistory );
920             bRet = pNode->SetAttr( *pOtherSet ) || bRet;
921         }
922 
923         DELETECHARSETS
924         return bRet;
925     }
926 
927     if( pDoc->IsRedlineOn() && pCharSet && pCharSet->Count() )
928     {
929         if( pUndo )
930             pUndo->SaveRedlineData( rRg, sal_False );
931         pDoc->AppendRedline( new SwRedline( nsRedlineType_t::REDLINE_FORMAT, rRg ), true);
932     }
933 
934     /* jetzt wenn Bereich */
935     sal_uLong nNodes = 0;
936 
937     SwNodeIndex aSt( pDoc->GetNodes() );
938     SwNodeIndex aEnd( pDoc->GetNodes() );
939     SwIndex aCntEnd( pEnd->nContent );
940 
941     if( pNode )
942     {
943         sal_uInt16 nLen = pNode->Len();
944         if( pStt->nNode != pEnd->nNode )
945             aCntEnd.Assign( pNode, nLen );
946 
947         if( pStt->nContent.GetIndex() != 0 || aCntEnd.GetIndex() != nLen )
948         {
949             // the SwRegHistory inserts the attribute into the TxtNode!
950             if( pNode->IsTxtNode() && pCharSet && pCharSet->Count() )
951             {
952                 SwRegHistory history( pNode, *pNode, pHistory );
953                 bRet = history.InsertItems(*pCharSet,
954                         pStt->nContent.GetIndex(), aCntEnd.GetIndex(), nFlags)
955                     || bRet;
956             }
957 
958             if( pOtherSet && pOtherSet->Count() )
959             {
960                 SwRegHistory aRegH( pNode, *pNode, pHistory );
961                 bRet = pNode->SetAttr( *pOtherSet ) || bRet;
962             }
963 
964             // lediglich Selektion in einem Node.
965             if( pStt->nNode == pEnd->nNode )
966             {
967                 DELETECHARSETS
968                 return bRet;
969             }
970             ++nNodes;
971             aSt.Assign( pStt->nNode.GetNode(), +1 );
972         }
973         else
974             aSt = pStt->nNode;
975         aCntEnd = pEnd->nContent; // aEnd wurde veraendert !!
976     }
977     else
978         aSt.Assign( pStt->nNode.GetNode(), +1 );
979 
980     // aSt zeigt jetzt auf den ersten vollen Node
981 
982     /*
983      * die Selektion umfasst mehr als einen Node
984      */
985     if( pStt->nNode < pEnd->nNode )
986     {
987         pNode = pEnd->nNode.GetNode().GetCntntNode();
988         if(pNode)
989         {
990             sal_uInt16 nLen = pNode->Len();
991             if( aCntEnd.GetIndex() != nLen )
992             {
993                 // the SwRegHistory inserts the attribute into the TxtNode!
994                 if( pNode->IsTxtNode() && pCharSet && pCharSet->Count() )
995                 {
996                     SwRegHistory history( pNode, *pNode, pHistory );
997                     history.InsertItems(*pCharSet,
998                             0, aCntEnd.GetIndex(), nFlags);
999                 }
1000 
1001                 if( pOtherSet && pOtherSet->Count() )
1002                 {
1003                     SwRegHistory aRegH( pNode, *pNode, pHistory );
1004                     pNode->SetAttr( *pOtherSet );
1005                 }
1006 
1007                 ++nNodes;
1008                 aEnd = pEnd->nNode;
1009             }
1010             else
1011                 aEnd.Assign( pEnd->nNode.GetNode(), +1 );
1012         }
1013         else
1014             aEnd = pEnd->nNode;
1015     }
1016     else
1017         aEnd.Assign( pEnd->nNode.GetNode(), +1 );
1018 
1019     // aEnd zeigt jetzt HINTER den letzten voll Node
1020 
1021     /* Bearbeitung der vollstaendig selektierten Nodes. */
1022 // alle Attribute aus dem Set zuruecksetzen !!
1023     if( pCharSet && pCharSet->Count() && !( nsSetAttrMode::SETATTR_DONTREPLACE & nFlags ) )
1024     {
1025 
1026         ParaRstFmt aPara( pStt, pEnd, pHistory, 0, pCharSet );
1027         pDoc->GetNodes().ForEach( aSt, aEnd, lcl_RstTxtAttr, &aPara );
1028     }
1029 
1030     sal_Bool bCreateSwpHints = pCharSet && (
1031         SFX_ITEM_SET == pCharSet->GetItemState( RES_TXTATR_CHARFMT, sal_False ) ||
1032         SFX_ITEM_SET == pCharSet->GetItemState( RES_TXTATR_INETFMT, sal_False ) );
1033 
1034     for(; aSt < aEnd; aSt++ )
1035     {
1036         pNode = aSt.GetNode().GetCntntNode();
1037         if( !pNode )
1038             continue;
1039 
1040         SwTxtNode* pTNd = pNode->GetTxtNode();
1041         if( pHistory )
1042         {
1043             SwRegHistory aRegH( pNode, *pNode, pHistory );
1044             SwpHints *pSwpHints;
1045 
1046             if( pTNd && pCharSet && pCharSet->Count() )
1047             {
1048                 pSwpHints = bCreateSwpHints ? &pTNd->GetOrCreateSwpHints()
1049                                             : pTNd->GetpSwpHints();
1050                 if( pSwpHints )
1051                     pSwpHints->Register( &aRegH );
1052 
1053                 pTNd->SetAttr( *pCharSet, 0, pTNd->GetTxt().Len(), nFlags );
1054                 if( pSwpHints )
1055                     pSwpHints->DeRegister();
1056             }
1057             if( pOtherSet && pOtherSet->Count() )
1058                 pNode->SetAttr( *pOtherSet );
1059         }
1060         else
1061         {
1062             if( pTNd && pCharSet && pCharSet->Count() )
1063                 pTNd->SetAttr( *pCharSet, 0, pTNd->GetTxt().Len(), nFlags );
1064             if( pOtherSet && pOtherSet->Count() )
1065                 pNode->SetAttr( *pOtherSet );
1066         }
1067         ++nNodes;
1068     }
1069 
1070     DELETECHARSETS
1071     return (nNodes != 0) || bRet;
1072 }
1073 
1074 
1075 bool SwDoc::InsertPoolItem( const SwPaM &rRg, const SfxPoolItem &rHt,
1076                             const SetAttrMode nFlags )
1077 {
1078     SwDataChanged aTmp( rRg, 0 );
1079     SwUndoAttr* pUndoAttr = 0;
1080     if (GetIDocumentUndoRedo().DoesUndo())
1081     {
1082         GetIDocumentUndoRedo().ClearRedo();
1083         pUndoAttr = new SwUndoAttr( rRg, rHt, nFlags );
1084     }
1085 
1086     SfxItemSet aSet( GetAttrPool(), rHt.Which(), rHt.Which() );
1087     aSet.Put( rHt );
1088     bool bRet = lcl_InsAttr( this, rRg, aSet, nFlags, pUndoAttr );
1089 
1090     if (GetIDocumentUndoRedo().DoesUndo())
1091     {
1092         GetIDocumentUndoRedo().AppendUndo( pUndoAttr );
1093     }
1094 
1095     if( bRet )
1096         SetModified();
1097     return bRet;
1098 }
1099 
1100 bool SwDoc::InsertItemSet ( const SwPaM &rRg, const SfxItemSet &rSet,
1101                             const SetAttrMode nFlags )
1102 {
1103     SwDataChanged aTmp( rRg, 0 );
1104     SwUndoAttr* pUndoAttr = 0;
1105     if (GetIDocumentUndoRedo().DoesUndo())
1106     {
1107         GetIDocumentUndoRedo().ClearRedo();
1108         pUndoAttr = new SwUndoAttr( rRg, rSet, nFlags );
1109     }
1110 
1111     bool bRet = lcl_InsAttr( this, rRg, rSet, nFlags, pUndoAttr );
1112 
1113     if (GetIDocumentUndoRedo().DoesUndo())
1114     {
1115         GetIDocumentUndoRedo().AppendUndo( pUndoAttr );
1116     }
1117 
1118     if( bRet )
1119         SetModified();
1120     return bRet;
1121 }
1122 
1123 
1124     // Setze das Attribut im angegebenen Format. Ist Undo aktiv, wird
1125     // das alte in die Undo-History aufgenommen
1126 void SwDoc::SetAttr( const SfxPoolItem& rAttr, SwFmt& rFmt )
1127 {
1128     SfxItemSet aSet( GetAttrPool(), rAttr.Which(), rAttr.Which() );
1129     aSet.Put( rAttr );
1130     SetAttr( aSet, rFmt );
1131 }
1132 
1133 
1134     // Setze das Attribut im angegebenen Format. Ist Undo aktiv, wird
1135     // das alte in die Undo-History aufgenommen
1136 void SwDoc::SetAttr( const SfxItemSet& rSet, SwFmt& rFmt )
1137 {
1138     if (GetIDocumentUndoRedo().DoesUndo())
1139     {
1140         SwUndoFmtAttrHelper aTmp( rFmt );
1141         rFmt.SetFmtAttr( rSet );
1142         if ( aTmp.GetUndo() )
1143         {
1144             GetIDocumentUndoRedo().AppendUndo( aTmp.ReleaseUndo() );
1145         }
1146         else
1147         {
1148             GetIDocumentUndoRedo().ClearRedo();
1149         }
1150     }
1151     else
1152     {
1153         rFmt.SetFmtAttr( rSet );
1154     }
1155     SetModified();
1156 }
1157 
1158 // --> OD 2008-02-12 #newlistlevelattrs#
1159 void SwDoc::ResetAttrAtFormat( const sal_uInt16 nWhichId,
1160                                SwFmt& rChangedFormat )
1161 {
1162     SwUndo *const pUndo = (GetIDocumentUndoRedo().DoesUndo())
1163         ?   new SwUndoFmtResetAttr( rChangedFormat, nWhichId )
1164         :   0;
1165 
1166     const sal_Bool bAttrReset = rChangedFormat.ResetFmtAttr( nWhichId );
1167 
1168     if ( bAttrReset )
1169     {
1170         if ( pUndo )
1171         {
1172             GetIDocumentUndoRedo().AppendUndo( pUndo );
1173         }
1174 
1175         SetModified();
1176     }
1177     else if ( pUndo )
1178         delete pUndo;
1179 }
1180 // <--
1181 
1182 int lcl_SetNewDefTabStops( SwTwips nOldWidth, SwTwips nNewWidth,
1183                                 SvxTabStopItem& rChgTabStop )
1184 {
1185     // dann aender bei allen TabStop die default's auf den neuen Wert
1186     // !!! Achtung: hier wird immer auf dem PoolAttribut gearbeitet,
1187     //              damit nicht in allen Sets die gleiche Berechnung
1188     //              auf dem gleichen TabStop (gepoolt!) vorgenommen
1189     //              wird. Als Modify wird ein FmtChg verschickt.
1190 
1191     sal_uInt16 nOldCnt = rChgTabStop.Count();
1192     if( !nOldCnt || nOldWidth == nNewWidth )
1193         return sal_False;
1194 
1195     // suche den Anfang der Defaults
1196     SvxTabStop* pTabs = ((SvxTabStop*)rChgTabStop.GetStart())
1197                         + (nOldCnt-1);
1198     sal_uInt16 n;
1199 
1200     for( n = nOldCnt; n ; --n, --pTabs )
1201         if( SVX_TAB_ADJUST_DEFAULT != pTabs->GetAdjustment() )
1202             break;
1203     ++n;
1204     if( n < nOldCnt )   // die DefTabStops loeschen
1205         rChgTabStop.Remove( n, nOldCnt - n );
1206     return sal_True;
1207 }
1208 
1209 // Setze das Attribut als neues default Attribut in diesem Dokument.
1210 // Ist Undo aktiv, wird das alte in die Undo-History aufgenommen
1211 void SwDoc::SetDefault( const SfxPoolItem& rAttr )
1212 {
1213     SfxItemSet aSet( GetAttrPool(), rAttr.Which(), rAttr.Which() );
1214     aSet.Put( rAttr );
1215     SetDefault( aSet );
1216 }
1217 
1218 void SwDoc::SetDefault( const SfxItemSet& rSet )
1219 {
1220     if( !rSet.Count() )
1221         return;
1222 
1223     SwModify aCallMod( 0 );
1224     SwAttrSet aOld( GetAttrPool(), rSet.GetRanges() ),
1225             aNew( GetAttrPool(), rSet.GetRanges() );
1226     SfxItemIter aIter( rSet );
1227     sal_uInt16 nWhich;
1228     const SfxPoolItem* pItem = aIter.GetCurItem();
1229     SfxItemPool* pSdrPool = GetAttrPool().GetSecondaryPool();
1230     while( sal_True )
1231     {
1232         sal_Bool bCheckSdrDflt = sal_False;
1233         nWhich = pItem->Which();
1234         aOld.Put( GetAttrPool().GetDefaultItem( nWhich ) );
1235         GetAttrPool().SetPoolDefaultItem( *pItem );
1236         aNew.Put( GetAttrPool().GetDefaultItem( nWhich ) );
1237 
1238         if (isCHRATR(nWhich) || isTXTATR(nWhich))
1239         {
1240             aCallMod.Add( pDfltTxtFmtColl );
1241             aCallMod.Add( pDfltCharFmt );
1242             bCheckSdrDflt = 0 != pSdrPool;
1243         }
1244         else if ( isPARATR(nWhich) ||
1245                   // --> OD 2008-02-25 #refactorlists#
1246                   isPARATR_LIST(nWhich) )
1247                   // <--
1248         {
1249             aCallMod.Add( pDfltTxtFmtColl );
1250             bCheckSdrDflt = 0 != pSdrPool;
1251         }
1252         else if (isGRFATR(nWhich))
1253         {
1254             aCallMod.Add( pDfltGrfFmtColl );
1255         }
1256         else if (isFRMATR(nWhich))
1257         {
1258             aCallMod.Add( pDfltGrfFmtColl );
1259             aCallMod.Add( pDfltTxtFmtColl );
1260             aCallMod.Add( pDfltFrmFmt );
1261         }
1262         else if (isBOXATR(nWhich))
1263         {
1264             aCallMod.Add( pDfltFrmFmt );
1265         }
1266 
1267         // copy also the defaults
1268         if( bCheckSdrDflt )
1269         {
1270             sal_uInt16 nEdtWhich, nSlotId;
1271             if( 0 != (nSlotId = GetAttrPool().GetSlotId( nWhich ) ) &&
1272                 nSlotId != nWhich &&
1273                 0 != (nEdtWhich = pSdrPool->GetWhich( nSlotId )) &&
1274                 nSlotId != nEdtWhich )
1275             {
1276                 SfxPoolItem* pCpy = pItem->Clone();
1277                 pCpy->SetWhich( nEdtWhich );
1278                 pSdrPool->SetPoolDefaultItem( *pCpy );
1279                 delete pCpy;
1280             }
1281         }
1282 
1283         if( aIter.IsAtEnd() )
1284             break;
1285         pItem = aIter.NextItem();
1286     }
1287 
1288     if( aNew.Count() && aCallMod.GetDepends() )
1289     {
1290         if (GetIDocumentUndoRedo().DoesUndo())
1291         {
1292             GetIDocumentUndoRedo().AppendUndo( new SwUndoDefaultAttr( aOld ) );
1293         }
1294 
1295         const SfxPoolItem* pTmpItem;
1296         if( ( SFX_ITEM_SET ==
1297                 aNew.GetItemState( RES_PARATR_TABSTOP, sal_False, &pTmpItem ) ) &&
1298             ((SvxTabStopItem*)pTmpItem)->Count() )
1299         {
1300             // TabStop-Aenderungen behandeln wir erstmal anders:
1301             // dann aender bei allen TabStop die dafault's auf den neuen Wert
1302             // !!! Achtung: hier wird immer auf dem PoolAttribut gearbeitet,
1303             //              damit nicht in allen Sets die gleiche Berechnung
1304             //              auf dem gleichen TabStop (gepoolt!) vorgenommen
1305             //              wird. Als Modify wird ein FmtChg verschickt.
1306             SwTwips nNewWidth = (*(SvxTabStopItem*)pTmpItem)[ 0 ].GetTabPos(),
1307                     nOldWidth = ((SvxTabStopItem&)aOld.Get(RES_PARATR_TABSTOP))[ 0 ].GetTabPos();
1308 
1309             int bChg = sal_False;
1310             sal_uInt32 nMaxItems = GetAttrPool().GetItemCount2( RES_PARATR_TABSTOP );
1311             for( sal_uInt32 n = 0; n < nMaxItems; ++n )
1312                 if( 0 != (pTmpItem = GetAttrPool().GetItem2( RES_PARATR_TABSTOP, n ) ))
1313                     bChg |= lcl_SetNewDefTabStops( nOldWidth, nNewWidth,
1314                                                 *(SvxTabStopItem*)pTmpItem );
1315 
1316             aNew.ClearItem( RES_PARATR_TABSTOP );
1317             aOld.ClearItem( RES_PARATR_TABSTOP );
1318             if( bChg )
1319             {
1320                 SwFmtChg aChgFmt( pDfltCharFmt );
1321                 // dann sage mal den Frames bescheid
1322                 aCallMod.ModifyNotification( &aChgFmt, &aChgFmt );
1323             }
1324         }
1325     }
1326 
1327     if( aNew.Count() && aCallMod.GetDepends() )
1328     {
1329         SwAttrSetChg aChgOld( aOld, aOld );
1330         SwAttrSetChg aChgNew( aNew, aNew );
1331         aCallMod.ModifyNotification( &aChgOld, &aChgNew );      // alle veraenderten werden verschickt
1332     }
1333 
1334     // und die default-Formate wieder beim Object austragen
1335     SwClient* pDep;
1336     while( 0 != ( pDep = (SwClient*)aCallMod.GetDepends()) )
1337         aCallMod.Remove( pDep );
1338 
1339     SetModified();
1340 }
1341 
1342     // Erfrage das Default Attribut in diesem Dokument.
1343 const SfxPoolItem& SwDoc::GetDefault( sal_uInt16 nFmtHint ) const
1344 {
1345     return GetAttrPool().GetDefaultItem( nFmtHint );
1346 }
1347 
1348 /*
1349  * Loeschen der Formate
1350  */
1351 void SwDoc::DelCharFmt(sal_uInt16 nFmt, sal_Bool bBroadcast)
1352 {
1353     SwCharFmt * pDel = (*pCharFmtTbl)[nFmt];
1354 
1355     if (bBroadcast)
1356         BroadcastStyleOperation(pDel->GetName(), SFX_STYLE_FAMILY_CHAR,
1357                                 SFX_STYLESHEET_ERASED);
1358 
1359     if (GetIDocumentUndoRedo().DoesUndo())
1360     {
1361         SwUndo * pUndo =
1362             new SwUndoCharFmtDelete(pDel, this);
1363 
1364         GetIDocumentUndoRedo().AppendUndo(pUndo);
1365     }
1366 
1367     pCharFmtTbl->DeleteAndDestroy(nFmt);
1368 
1369     SetModified();
1370 }
1371 
1372 void SwDoc::DelCharFmt( SwCharFmt *pFmt, sal_Bool bBroadcast )
1373 {
1374     sal_uInt16 nFmt = pCharFmtTbl->GetPos( pFmt );
1375     ASSERT( USHRT_MAX != nFmt, "Fmt not found," );
1376 
1377     DelCharFmt( nFmt, bBroadcast );
1378 }
1379 
1380 void SwDoc::DelFrmFmt( SwFrmFmt *pFmt, sal_Bool bBroadcast )
1381 {
1382     if( pFmt->ISA( SwTableBoxFmt ) || pFmt->ISA( SwTableLineFmt ))
1383     {
1384         ASSERT( !this, "Format steht nicht mehr im DocArray, "
1385                        "kann per delete geloescht werden" );
1386         delete pFmt;
1387     }
1388     else
1389     {
1390 
1391         //Das Format muss in einem der beiden Arrays stehen, in welchem
1392         //werden wir schon merken.
1393         sal_uInt16 nPos;
1394         if ( USHRT_MAX != ( nPos = pFrmFmtTbl->GetPos( pFmt )) )
1395         {
1396             if (bBroadcast)
1397                 BroadcastStyleOperation(pFmt->GetName(),
1398                                         SFX_STYLE_FAMILY_FRAME,
1399                                         SFX_STYLESHEET_ERASED);
1400 
1401             if (GetIDocumentUndoRedo().DoesUndo())
1402             {
1403                 SwUndo * pUndo = new SwUndoFrmFmtDelete(pFmt, this);
1404 
1405                 GetIDocumentUndoRedo().AppendUndo(pUndo);
1406             }
1407 
1408             pFrmFmtTbl->DeleteAndDestroy( nPos );
1409         }
1410         else
1411         {
1412             nPos = GetSpzFrmFmts()->GetPos( pFmt );
1413             ASSERT( nPos != USHRT_MAX, "FrmFmt not found." );
1414             if( USHRT_MAX != nPos )
1415                 GetSpzFrmFmts()->DeleteAndDestroy( nPos );
1416         }
1417     }
1418 }
1419 
1420 void SwDoc::DelTblFrmFmt( SwTableFmt *pFmt )
1421 {
1422     sal_uInt16 nPos = pTblFrmFmtTbl->GetPos( pFmt );
1423     ASSERT( USHRT_MAX != nPos, "Fmt not found," );
1424     pTblFrmFmtTbl->DeleteAndDestroy( nPos );
1425 }
1426 
1427 /*
1428  * Erzeugen der Formate
1429  */
1430 SwFlyFrmFmt *SwDoc::MakeFlyFrmFmt( const String &rFmtName,
1431                                     SwFrmFmt *pDerivedFrom )
1432 {
1433     SwFlyFrmFmt *pFmt = new SwFlyFrmFmt( GetAttrPool(), rFmtName, pDerivedFrom );
1434     GetSpzFrmFmts()->Insert(pFmt, GetSpzFrmFmts()->Count());
1435     SetModified();
1436     return pFmt;
1437 }
1438 
1439 SwDrawFrmFmt *SwDoc::MakeDrawFrmFmt( const String &rFmtName,
1440                                      SwFrmFmt *pDerivedFrom )
1441 {
1442     SwDrawFrmFmt *pFmt = new SwDrawFrmFmt( GetAttrPool(), rFmtName, pDerivedFrom);
1443     GetSpzFrmFmts()->Insert(pFmt,GetSpzFrmFmts()->Count());
1444     SetModified();
1445     return pFmt;
1446 }
1447 
1448 
1449 sal_uInt16 SwDoc::GetTblFrmFmtCount(sal_Bool bUsed) const
1450 {
1451     sal_uInt16 nCount = pTblFrmFmtTbl->Count();
1452     if(bUsed)
1453     {
1454         SwAutoFmtGetDocNode aGetHt( &GetNodes() );
1455         for ( sal_uInt16 i = nCount; i; )
1456         {
1457             if((*pTblFrmFmtTbl)[--i]->GetInfo( aGetHt ))
1458 
1459                 --nCount;
1460         }
1461     }
1462 
1463     return nCount;
1464 }
1465 
1466 
1467 SwFrmFmt& SwDoc::GetTblFrmFmt(sal_uInt16 nFmt, sal_Bool bUsed ) const
1468 {
1469     sal_uInt16 nRemoved = 0;
1470     if(bUsed)
1471     {
1472         SwAutoFmtGetDocNode aGetHt( &GetNodes() );
1473         for ( sal_uInt16 i = 0; i <= nFmt; i++ )
1474         {
1475             while ( (*pTblFrmFmtTbl)[ i + nRemoved]->GetInfo( aGetHt ))
1476             {
1477                 nRemoved++;
1478             }
1479         }
1480     }
1481     return *((*pTblFrmFmtTbl)[nRemoved + nFmt]);
1482 }
1483 
1484 SwTableFmt* SwDoc::MakeTblFrmFmt( const String &rFmtName,
1485                                     SwFrmFmt *pDerivedFrom )
1486 {
1487     SwTableFmt* pFmt = new SwTableFmt( GetAttrPool(), rFmtName, pDerivedFrom );
1488     pTblFrmFmtTbl->Insert( pFmt, pTblFrmFmtTbl->Count() );
1489     SetModified();
1490 
1491     return pFmt;
1492 }
1493 
1494 SwFrmFmt *SwDoc::MakeFrmFmt(const String &rFmtName,
1495                             SwFrmFmt *pDerivedFrom,
1496                             sal_Bool bBroadcast, sal_Bool bAuto)
1497 {
1498 
1499     SwFrmFmt *pFmt = new SwFrmFmt( GetAttrPool(), rFmtName, pDerivedFrom );
1500 
1501     pFmt->SetAuto(bAuto);
1502     pFrmFmtTbl->Insert( pFmt, pFrmFmtTbl->Count());
1503     SetModified();
1504 
1505     if (bBroadcast)
1506     {
1507         BroadcastStyleOperation(rFmtName, SFX_STYLE_FAMILY_PARA,
1508                                 SFX_STYLESHEET_CREATED);
1509 
1510         if (GetIDocumentUndoRedo().DoesUndo())
1511         {
1512             SwUndo * pUndo = new SwUndoFrmFmtCreate(pFmt, pDerivedFrom, this);
1513 
1514             GetIDocumentUndoRedo().AppendUndo(pUndo);
1515         }
1516     }
1517 
1518     return pFmt;
1519 }
1520 
1521 SwFmt *SwDoc::_MakeFrmFmt(const String &rFmtName,
1522                             SwFmt *pDerivedFrom,
1523                             sal_Bool bBroadcast, sal_Bool bAuto)
1524 {
1525     SwFrmFmt *pFrmFmt = dynamic_cast<SwFrmFmt*>(pDerivedFrom);
1526     pFrmFmt = MakeFrmFmt( rFmtName, pFrmFmt, bBroadcast, bAuto );
1527     return dynamic_cast<SwFmt*>(pFrmFmt);
1528 }
1529 
1530 
1531 // --> OD 2005-01-13 #i40550# - add parameter <bAuto> - not relevant
1532 SwCharFmt *SwDoc::MakeCharFmt( const String &rFmtName,
1533                                SwCharFmt *pDerivedFrom,
1534                                sal_Bool bBroadcast,
1535                                sal_Bool )
1536 // <--
1537 {
1538     SwCharFmt *pFmt = new SwCharFmt( GetAttrPool(), rFmtName, pDerivedFrom );
1539     pCharFmtTbl->Insert( pFmt, pCharFmtTbl->Count() );
1540     pFmt->SetAuto( sal_False );
1541     SetModified();
1542 
1543     if (GetIDocumentUndoRedo().DoesUndo())
1544     {
1545         SwUndo * pUndo = new SwUndoCharFmtCreate(pFmt, pDerivedFrom, this);
1546 
1547         GetIDocumentUndoRedo().AppendUndo(pUndo);
1548     }
1549 
1550     if (bBroadcast)
1551     {
1552         BroadcastStyleOperation(rFmtName, SFX_STYLE_FAMILY_CHAR,
1553                                 SFX_STYLESHEET_CREATED);
1554     }
1555 
1556     return pFmt;
1557 }
1558 
1559 SwFmt *SwDoc::_MakeCharFmt(const String &rFmtName,
1560                             SwFmt *pDerivedFrom,
1561                             sal_Bool bBroadcast, sal_Bool bAuto)
1562 {
1563     SwCharFmt *pCharFmt = dynamic_cast<SwCharFmt*>(pDerivedFrom);
1564     pCharFmt = MakeCharFmt( rFmtName, pCharFmt, bBroadcast, bAuto );
1565     return dynamic_cast<SwFmt*>(pCharFmt);
1566 }
1567 
1568 
1569 /*
1570  * Erzeugen der FormatCollections
1571  */
1572 // TXT
1573 // --> OD 2005-01-13 #i40550# - add parameter <bAuto> - not relevant
1574 SwTxtFmtColl* SwDoc::MakeTxtFmtColl( const String &rFmtName,
1575                                      SwTxtFmtColl *pDerivedFrom,
1576                                      sal_Bool bBroadcast,
1577                                      sal_Bool )
1578 // <--
1579 {
1580     SwTxtFmtColl *pFmtColl = new SwTxtFmtColl( GetAttrPool(), rFmtName,
1581                                                 pDerivedFrom );
1582     pTxtFmtCollTbl->Insert(pFmtColl, pTxtFmtCollTbl->Count());
1583     pFmtColl->SetAuto( sal_False );
1584     SetModified();
1585 
1586     if (GetIDocumentUndoRedo().DoesUndo())
1587     {
1588         SwUndo * pUndo = new SwUndoTxtFmtCollCreate(pFmtColl, pDerivedFrom,
1589                                                     this);
1590         GetIDocumentUndoRedo().AppendUndo(pUndo);
1591     }
1592 
1593     if (bBroadcast)
1594         BroadcastStyleOperation(rFmtName, SFX_STYLE_FAMILY_PARA,
1595                                 SFX_STYLESHEET_CREATED);
1596 
1597     return pFmtColl;
1598 }
1599 
1600 SwFmt *SwDoc::_MakeTxtFmtColl(const String &rFmtName,
1601                             SwFmt *pDerivedFrom,
1602                             sal_Bool bBroadcast, sal_Bool bAuto)
1603 {
1604     SwTxtFmtColl *pTxtFmtColl = dynamic_cast<SwTxtFmtColl*>(pDerivedFrom);
1605     pTxtFmtColl = MakeTxtFmtColl( rFmtName, pTxtFmtColl, bBroadcast, bAuto );
1606     return dynamic_cast<SwFmt*>(pTxtFmtColl);
1607 }
1608 
1609 
1610 //FEATURE::CONDCOLL
1611 SwConditionTxtFmtColl* SwDoc::MakeCondTxtFmtColl( const String &rFmtName,
1612                                                   SwTxtFmtColl *pDerivedFrom,
1613                                                   sal_Bool bBroadcast)
1614 {
1615     SwConditionTxtFmtColl*pFmtColl = new SwConditionTxtFmtColl( GetAttrPool(),
1616                                                     rFmtName, pDerivedFrom );
1617     pTxtFmtCollTbl->Insert(pFmtColl, pTxtFmtCollTbl->Count());
1618     pFmtColl->SetAuto( sal_False );
1619     SetModified();
1620 
1621     if (bBroadcast)
1622         BroadcastStyleOperation(rFmtName, SFX_STYLE_FAMILY_PARA,
1623                                 SFX_STYLESHEET_CREATED);
1624 
1625     return pFmtColl;
1626 }
1627 //FEATURE::CONDCOLL
1628 
1629 // GRF
1630 
1631 SwGrfFmtColl* SwDoc::MakeGrfFmtColl( const String &rFmtName,
1632                                      SwGrfFmtColl *pDerivedFrom )
1633 {
1634     SwGrfFmtColl *pFmtColl = new SwGrfFmtColl( GetAttrPool(), rFmtName,
1635                                                 pDerivedFrom );
1636     pGrfFmtCollTbl->Insert( pFmtColl, pGrfFmtCollTbl->Count() );
1637     pFmtColl->SetAuto( sal_False );
1638     SetModified();
1639     return pFmtColl;
1640 }
1641 
1642 void SwDoc::DelTxtFmtColl(sal_uInt16 nFmtColl, sal_Bool bBroadcast)
1643 {
1644     ASSERT( nFmtColl, "Remove fuer Coll 0." );
1645 
1646     // Wer hat die zu loeschende als Next
1647     SwTxtFmtColl *pDel = (*pTxtFmtCollTbl)[nFmtColl];
1648     if( pDfltTxtFmtColl == pDel )
1649         return;     // default nie loeschen !!
1650 
1651     if (bBroadcast)
1652         BroadcastStyleOperation(pDel->GetName(), SFX_STYLE_FAMILY_PARA,
1653                                 SFX_STYLESHEET_ERASED);
1654 
1655     if (GetIDocumentUndoRedo().DoesUndo())
1656     {
1657         SwUndoTxtFmtCollDelete * pUndo =
1658             new SwUndoTxtFmtCollDelete(pDel, this);
1659 
1660         GetIDocumentUndoRedo().AppendUndo(pUndo);
1661     }
1662 
1663     // Die FmtColl austragen
1664     pTxtFmtCollTbl->Remove(nFmtColl);
1665     // Next korrigieren
1666     pTxtFmtCollTbl->ForEach( 1, pTxtFmtCollTbl->Count(),
1667                             &SetTxtFmtCollNext, pDel );
1668     delete pDel;
1669     SetModified();
1670 }
1671 
1672 void SwDoc::DelTxtFmtColl( SwTxtFmtColl *pColl, sal_Bool bBroadcast )
1673 {
1674     sal_uInt16 nFmt = pTxtFmtCollTbl->GetPos( pColl );
1675     ASSERT( USHRT_MAX != nFmt, "Collection not found," );
1676     DelTxtFmtColl( nFmt, bBroadcast );
1677 }
1678 
1679 sal_Bool lcl_SetTxtFmtColl( const SwNodePtr& rpNode, void* pArgs )
1680 {
1681     // ParaSetFmtColl * pPara = (ParaSetFmtColl*)pArgs;
1682     SwCntntNode* pCNd = (SwCntntNode*)rpNode->GetTxtNode();
1683     if( pCNd )
1684     {
1685         ParaRstFmt* pPara = (ParaRstFmt*)pArgs;
1686 
1687         SwTxtFmtColl* pFmt = static_cast<SwTxtFmtColl*>(pPara->pFmtColl);
1688         if ( pPara->bReset )
1689         {
1690 
1691             if( pFmt->GetAttrOutlineLevel() == 0 && pPara )
1692                 pPara->bKeepOutlineLevelAttr = true;
1693 
1694             lcl_RstAttr( pCNd, pPara );
1695 
1696             // --> OD 2007-11-06 #i62675#
1697             // --> OD 2008-04-15 #refactorlists#
1698             // check, if paragraph style has changed
1699             if ( pPara->bResetListAttrs &&
1700                  pFmt != pCNd->GetFmtColl() &&
1701                  pFmt->GetItemState( RES_PARATR_NUMRULE ) == SFX_ITEM_SET )
1702             {
1703                 // --> OD 2009-09-07 #b6876367#
1704                 // Check, if the list style of the paragraph will change.
1705                 bool bChangeOfListStyleAtParagraph( true );
1706                 SwTxtNode* pTNd( dynamic_cast<SwTxtNode*>(pCNd) );
1707                 ASSERT( pTNd,
1708                         "<lcl_SetTxtFmtColl(..)> - text node expected -> crash" );
1709                 {
1710                     SwNumRule* pNumRuleAtParagraph( pTNd->GetNumRule() );
1711                     if ( pNumRuleAtParagraph )
1712                     {
1713                         const SwNumRuleItem& rNumRuleItemAtParagraphStyle =
1714                                                             pFmt->GetNumRule();
1715                         if ( rNumRuleItemAtParagraphStyle.GetValue() ==
1716                                                 pNumRuleAtParagraph->GetName() )
1717                         {
1718                             bChangeOfListStyleAtParagraph = false;
1719                         }
1720                     }
1721                 }
1722 
1723                 if ( bChangeOfListStyleAtParagraph )
1724                 {
1725                     // --> OD 2008-04-08 #refactorlists#
1726                     std::auto_ptr< SwRegHistory > pRegH;
1727                     if ( pPara->pHistory )
1728                     {
1729                         pRegH.reset( new SwRegHistory( pTNd, *pTNd, pPara->pHistory ) );
1730                     }
1731 
1732                     pCNd->ResetAttr( RES_PARATR_NUMRULE );
1733 
1734                     // reset all list attributes
1735                     pCNd->ResetAttr( RES_PARATR_LIST_LEVEL );
1736                     pCNd->ResetAttr( RES_PARATR_LIST_ISRESTART );
1737                     pCNd->ResetAttr( RES_PARATR_LIST_RESTARTVALUE );
1738                     pCNd->ResetAttr( RES_PARATR_LIST_ISCOUNTED );
1739                     pCNd->ResetAttr( RES_PARATR_LIST_ID );
1740                 }
1741                 // <--
1742             }
1743             // <--
1744         }
1745 
1746         // erst in die History aufnehmen, damit ggfs. alte Daten
1747         // gesichert werden koennen
1748         if( pPara->pHistory )
1749             pPara->pHistory->Add( pCNd->GetFmtColl(), pCNd->GetIndex(),
1750                                     ND_TEXTNODE );
1751 
1752         pCNd->ChgFmtColl( pFmt );
1753 
1754         pPara->nWhich++;
1755     }
1756     return sal_True;
1757 }
1758 
1759 sal_Bool SwDoc::SetTxtFmtColl( const SwPaM &rRg,
1760                            SwTxtFmtColl *pFmt,
1761                            bool bReset,
1762                            bool bResetListAttrs )
1763 {
1764     SwDataChanged aTmp( rRg, 0 );
1765     const SwPosition *pStt = rRg.Start(), *pEnd = rRg.End();
1766     SwHistory* pHst = 0;
1767     sal_Bool bRet = sal_True;
1768 
1769     if (GetIDocumentUndoRedo().DoesUndo())
1770     {
1771         // --> OD 2008-04-15 #refactorlists#
1772         SwUndoFmtColl* pUndo = new SwUndoFmtColl( rRg, pFmt,
1773                                                   bReset,
1774                                                   bResetListAttrs );
1775         // <--
1776         pHst = pUndo->GetHistory();
1777         GetIDocumentUndoRedo().AppendUndo(pUndo);
1778     }
1779 
1780     ParaRstFmt aPara( pStt, pEnd, pHst );
1781     aPara.pFmtColl = pFmt;
1782     aPara.bReset = bReset;
1783     // --> OD 2007-11-06 #i62675#
1784     aPara.bResetListAttrs = bResetListAttrs;
1785     // <--
1786 
1787     GetNodes().ForEach( pStt->nNode.GetIndex(), pEnd->nNode.GetIndex()+1,
1788                         lcl_SetTxtFmtColl, &aPara );
1789     if( !aPara.nWhich )
1790         bRet = sal_False;           // keinen gueltigen Node gefunden
1791 
1792     if( bRet )
1793         SetModified();
1794     return bRet;
1795 }
1796 
1797 
1798 // ---- Kopiere die Formate in sich selbst (SwDoc) ----------------------
1799 
1800 SwFmt* SwDoc::CopyFmt( const SwFmt& rFmt,
1801                         const SvPtrarr& rFmtArr,
1802                         FNCopyFmt fnCopyFmt, const SwFmt& rDfltFmt )
1803 {
1804     //  kein-Autoformat || default Format || Collection-Format
1805     // dann suche danach.
1806     if( !rFmt.IsAuto() || !rFmt.GetRegisteredIn() )
1807         for( sal_uInt16 n = 0; n < rFmtArr.Count(); n++ )
1808         {
1809             // ist die Vorlage schon im Doc vorhanden ??
1810             if( ((SwFmt*)rFmtArr[n])->GetName().Equals( rFmt.GetName() ))
1811                 return (SwFmt*)rFmtArr[n];
1812         }
1813 
1814     // suche erstmal nach dem "Parent"
1815     SwFmt* pParent = (SwFmt*)&rDfltFmt;
1816     if( rFmt.DerivedFrom() && pParent != rFmt.DerivedFrom() )
1817         pParent = CopyFmt( *rFmt.DerivedFrom(), rFmtArr,
1818                                 fnCopyFmt, rDfltFmt );
1819 
1820     // erzeuge das Format und kopiere die Attribute
1821     // --> OD 2005-01-13 #i40550#
1822     SwFmt* pNewFmt = (this->*fnCopyFmt)( rFmt.GetName(), pParent, sal_False, sal_True );
1823     // <--
1824     pNewFmt->SetAuto( rFmt.IsAuto() );
1825     pNewFmt->CopyAttrs( rFmt, sal_True );           // kopiere Attribute
1826 
1827     pNewFmt->SetPoolFmtId( rFmt.GetPoolFmtId() );
1828     pNewFmt->SetPoolHelpId( rFmt.GetPoolHelpId() );
1829 
1830     // HelpFile-Id immer auf dflt setzen !!
1831     pNewFmt->SetPoolHlpFileId( UCHAR_MAX );
1832 
1833     return pNewFmt;
1834 }
1835 
1836 
1837 // ---- kopiere das Frame-Format --------
1838 SwFrmFmt* SwDoc::CopyFrmFmt( const SwFrmFmt& rFmt )
1839 {
1840 
1841     return (SwFrmFmt*)CopyFmt( rFmt, *GetFrmFmts(), &SwDoc::_MakeFrmFmt,
1842                                 *GetDfltFrmFmt() );
1843 }
1844 
1845 // ---- kopiere das Char-Format --------
1846 SwCharFmt* SwDoc::CopyCharFmt( const SwCharFmt& rFmt )
1847 {
1848     return (SwCharFmt*)CopyFmt( rFmt, *GetCharFmts(),
1849                                 &SwDoc::_MakeCharFmt,
1850                                 *GetDfltCharFmt() );
1851 }
1852 
1853 
1854 // --- Kopiere TextNodes ----
1855 
1856 SwTxtFmtColl* SwDoc::CopyTxtColl( const SwTxtFmtColl& rColl )
1857 {
1858     SwTxtFmtColl* pNewColl = FindTxtFmtCollByName( rColl.GetName() );
1859     if( pNewColl )
1860         return pNewColl;
1861 
1862     // suche erstmal nach dem "Parent"
1863     SwTxtFmtColl* pParent = pDfltTxtFmtColl;
1864     if( pParent != rColl.DerivedFrom() )
1865         pParent = CopyTxtColl( *(SwTxtFmtColl*)rColl.DerivedFrom() );
1866 
1867 
1868 //FEATURE::CONDCOLL
1869     if( RES_CONDTXTFMTCOLL == rColl.Which() )
1870     {
1871         pNewColl = new SwConditionTxtFmtColl( GetAttrPool(), rColl.GetName(),
1872                                                 pParent);
1873         pTxtFmtCollTbl->Insert( pNewColl, pTxtFmtCollTbl->Count() );
1874         pNewColl->SetAuto( sal_False );
1875         SetModified();
1876 
1877         // Kopiere noch die Bedingungen
1878         ((SwConditionTxtFmtColl*)pNewColl)->SetConditions(
1879                             ((SwConditionTxtFmtColl&)rColl).GetCondColls() );
1880     }
1881     else
1882 //FEATURE::CONDCOLL
1883         pNewColl = MakeTxtFmtColl( rColl.GetName(), pParent );
1884 
1885     // kopiere jetzt noch die Auto-Formate oder kopiere die Attribute
1886     pNewColl->CopyAttrs( rColl, sal_True );
1887 
1888     // setze noch den Outline-Level
1889     //if( NO_NUMBERING != rColl.GetOutlineLevel() ) //#outline level,zhaojianwei
1890     //  pNewColl->SetOutlineLevel( rColl.GetOutlineLevel() );
1891     if(rColl.IsAssignedToListLevelOfOutlineStyle())
1892         pNewColl->AssignToListLevelOfOutlineStyle(rColl.GetAssignedOutlineStyleLevel());//<-end,zhaojianwei
1893     //<-end
1894     pNewColl->SetPoolFmtId( rColl.GetPoolFmtId() );
1895     pNewColl->SetPoolHelpId( rColl.GetPoolHelpId() );
1896 
1897     // HelpFile-Id immer auf dflt setzen !!
1898     pNewColl->SetPoolHlpFileId( UCHAR_MAX );
1899 
1900     if( &rColl.GetNextTxtFmtColl() != &rColl )
1901         pNewColl->SetNextTxtFmtColl( *CopyTxtColl( rColl.GetNextTxtFmtColl() ));
1902 
1903     // ggfs. die NumRule erzeugen
1904     if( this != rColl.GetDoc() )
1905     {
1906         const SfxPoolItem* pItem;
1907         if( SFX_ITEM_SET == pNewColl->GetItemState( RES_PARATR_NUMRULE,
1908             sal_False, &pItem ))
1909         {
1910             const SwNumRule* pRule;
1911             const String& rName = ((SwNumRuleItem*)pItem)->GetValue();
1912             if( rName.Len() &&
1913                 0 != ( pRule = rColl.GetDoc()->FindNumRulePtr( rName )) &&
1914                 !pRule->IsAutoRule() )
1915             {
1916                 SwNumRule* pDestRule = FindNumRulePtr( rName );
1917                 if( pDestRule )
1918                     pDestRule->SetInvalidRule( sal_True );
1919                 else
1920                     MakeNumRule( rName, pRule );
1921             }
1922         }
1923     }
1924     return pNewColl;
1925 }
1926 
1927 // --- Kopiere GrafikNodes ----
1928 
1929 SwGrfFmtColl* SwDoc::CopyGrfColl( const SwGrfFmtColl& rColl )
1930 {
1931     SwGrfFmtColl* pNewColl = FindGrfFmtCollByName( rColl.GetName() );
1932     if( pNewColl )
1933         return pNewColl;
1934 
1935     // suche erstmal nach dem "Parent"
1936     SwGrfFmtColl* pParent = pDfltGrfFmtColl;
1937     if( pParent != rColl.DerivedFrom() )
1938         pParent = CopyGrfColl( *(SwGrfFmtColl*)rColl.DerivedFrom() );
1939 
1940     // falls nicht, so kopiere sie
1941     pNewColl = MakeGrfFmtColl( rColl.GetName(), pParent );
1942 
1943     // noch die Attribute kopieren
1944     pNewColl->CopyAttrs( rColl );
1945 
1946     pNewColl->SetPoolFmtId( rColl.GetPoolFmtId() );
1947     pNewColl->SetPoolHelpId( rColl.GetPoolHelpId() );
1948 
1949     // HelpFile-Id immer auf dflt setzen !!
1950     pNewColl->SetPoolHlpFileId( UCHAR_MAX );
1951 
1952     return pNewColl;
1953 }
1954 
1955 SwPageDesc* lcl_FindPageDesc( const SwPageDescs& rArr, const String& rName )
1956 {
1957     for( sal_uInt16 n = rArr.Count(); n; )
1958     {
1959         SwPageDesc* pDesc = rArr[ --n ];
1960         if( pDesc->GetName() == rName )
1961             return pDesc;
1962     }
1963     return 0;
1964 }
1965 
1966 void SwDoc::CopyFmtArr( const SvPtrarr& rSourceArr,
1967                         SvPtrarr& rDestArr,
1968                         FNCopyFmt fnCopyFmt,
1969                         SwFmt& rDfltFmt )
1970 {
1971     sal_uInt16 nSrc;
1972     SwFmt* pSrc, *pDest;
1973 
1974     // 1. Schritt alle Formate anlegen (das 0. ueberspringen - Default!)
1975     for( nSrc = rSourceArr.Count(); nSrc > 1; )
1976     {
1977         pSrc = (SwFmt*)rSourceArr[ --nSrc ];
1978         if( pSrc->IsDefault() || pSrc->IsAuto() )
1979             continue;
1980 
1981         if( 0 == FindFmtByName( rDestArr, pSrc->GetName() ) )
1982         {
1983             if( RES_CONDTXTFMTCOLL == pSrc->Which() )
1984                 MakeCondTxtFmtColl( pSrc->GetName(), (SwTxtFmtColl*)&rDfltFmt );
1985             else
1986                 // --> OD 2005-01-13 #i40550#
1987                 (this->*fnCopyFmt)( pSrc->GetName(), &rDfltFmt, sal_False, sal_True );
1988                 // <--
1989         }
1990     }
1991 
1992     // 2. Schritt alle Attribute kopieren, richtige Parents setzen
1993     for( nSrc = rSourceArr.Count(); nSrc > 1; )
1994     {
1995         pSrc = (SwFmt*)rSourceArr[ --nSrc ];
1996         if( pSrc->IsDefault() || pSrc->IsAuto() )
1997             continue;
1998 
1999         pDest = FindFmtByName( rDestArr, pSrc->GetName() );
2000         pDest->SetAuto( sal_False );
2001         pDest->DelDiffs( *pSrc );
2002 
2003         // #i94285#: existing <SwFmtPageDesc> instance, before copying attributes
2004         const SfxPoolItem* pItem;
2005         if( &GetAttrPool() != pSrc->GetAttrSet().GetPool() &&
2006             SFX_ITEM_SET == pSrc->GetAttrSet().GetItemState(
2007             RES_PAGEDESC, sal_False, &pItem ) &&
2008             ((SwFmtPageDesc*)pItem)->GetPageDesc() )
2009         {
2010             SwFmtPageDesc aPageDesc( *(SwFmtPageDesc*)pItem );
2011             const String& rNm = aPageDesc.GetPageDesc()->GetName();
2012             SwPageDesc* pPageDesc = ::lcl_FindPageDesc( aPageDescs, rNm );
2013             if( !pPageDesc )
2014             {
2015                 pPageDesc = aPageDescs[ MakePageDesc( rNm ) ];
2016             }
2017             aPageDesc.RegisterToPageDesc( *pPageDesc );
2018             SwAttrSet aTmpAttrSet( pSrc->GetAttrSet() );
2019             aTmpAttrSet.Put( aPageDesc );
2020             pDest->SetFmtAttr( aTmpAttrSet );
2021         }
2022         else
2023         {
2024             pDest->SetFmtAttr( pSrc->GetAttrSet() );
2025         }
2026 
2027         pDest->SetPoolFmtId( pSrc->GetPoolFmtId() );
2028         pDest->SetPoolHelpId( pSrc->GetPoolHelpId() );
2029 
2030         // HelpFile-Id immer auf dflt setzen !!
2031         pDest->SetPoolHlpFileId( UCHAR_MAX );
2032 
2033         if( pSrc->DerivedFrom() )
2034             pDest->SetDerivedFrom( FindFmtByName( rDestArr,
2035                                         pSrc->DerivedFrom()->GetName() ) );
2036         if( RES_TXTFMTCOLL == pSrc->Which() ||
2037             RES_CONDTXTFMTCOLL == pSrc->Which() )
2038         {
2039             SwTxtFmtColl* pSrcColl = (SwTxtFmtColl*)pSrc,
2040                         * pDstColl = (SwTxtFmtColl*)pDest;
2041             if( &pSrcColl->GetNextTxtFmtColl() != pSrcColl )
2042                 pDstColl->SetNextTxtFmtColl( *(SwTxtFmtColl*)FindFmtByName(
2043                     rDestArr, pSrcColl->GetNextTxtFmtColl().GetName() ) );
2044 
2045             // setze noch den Outline-Level
2046             //if( NO_NUMBERING != pSrcColl->GetOutlineLevel() ) //#outline level,zhaojianwei
2047             //  pDstColl->SetOutlineLevel( pSrcColl->GetOutlineLevel() );
2048             if(pSrcColl->IsAssignedToListLevelOfOutlineStyle())
2049                 pDstColl->AssignToListLevelOfOutlineStyle(pSrcColl->GetAssignedOutlineStyleLevel());//<-end,zhaojianwei
2050             //<-end
2051 
2052 //FEATURE::CONDCOLL
2053             if( RES_CONDTXTFMTCOLL == pSrc->Which() )
2054                 // Kopiere noch die Bedingungen
2055                 // aber erst die alten loeschen!
2056                 ((SwConditionTxtFmtColl*)pDstColl)->SetConditions(
2057                             ((SwConditionTxtFmtColl*)pSrc)->GetCondColls() );
2058 //FEATURE::CONDCOLL
2059         }
2060     }
2061 }
2062 
2063 void SwDoc::CopyPageDescHeaderFooterImpl( bool bCpyHeader,
2064                                 const SwFrmFmt& rSrcFmt, SwFrmFmt& rDestFmt )
2065 {
2066     // jetzt noch Header-/Footer-Attribute richtig behandeln
2067     // Contenten Nodes Dokumentuebergreifend kopieren!
2068     sal_uInt16 nAttr = static_cast<sal_uInt16>( bCpyHeader ? RES_HEADER : RES_FOOTER );
2069     const SfxPoolItem* pItem;
2070     if( SFX_ITEM_SET != rSrcFmt.GetAttrSet().GetItemState( nAttr, sal_False, &pItem ))
2071         return ;
2072 
2073     // Im Header steht noch der Verweis auf das Format aus dem
2074     // anderen Document!!
2075     SfxPoolItem* pNewItem = pItem->Clone();
2076 
2077     SwFrmFmt* pOldFmt;
2078     if( bCpyHeader )
2079          pOldFmt = ((SwFmtHeader*)pNewItem)->GetHeaderFmt();
2080     else
2081          pOldFmt = ((SwFmtFooter*)pNewItem)->GetFooterFmt();
2082 
2083     if( pOldFmt )
2084     {
2085         SwFrmFmt* pNewFmt = new SwFrmFmt( GetAttrPool(), "CpyDesc",
2086                                             GetDfltFrmFmt() );
2087         pNewFmt->CopyAttrs( *pOldFmt, sal_True );
2088 
2089         if( SFX_ITEM_SET == pNewFmt->GetAttrSet().GetItemState(
2090             RES_CNTNT, sal_False, &pItem ))
2091         {
2092             SwFmtCntnt* pCntnt = (SwFmtCntnt*)pItem;
2093             if( pCntnt->GetCntntIdx() )
2094             {
2095                 SwNodeIndex aTmpIdx( GetNodes().GetEndOfAutotext() );
2096                 const SwNodes& rSrcNds = rSrcFmt.GetDoc()->GetNodes();
2097                 SwStartNode* pSttNd = GetNodes().MakeEmptySection( aTmpIdx,
2098                                                 bCpyHeader
2099                                                     ? SwHeaderStartNode
2100                                                     : SwFooterStartNode );
2101                 const SwNode& rCSttNd = pCntnt->GetCntntIdx()->GetNode();
2102                 SwNodeRange aRg( rCSttNd, 0, *rCSttNd.EndOfSectionNode() );
2103                 aTmpIdx = *pSttNd->EndOfSectionNode();
2104                 rSrcNds._Copy( aRg, aTmpIdx );
2105                 aTmpIdx = *pSttNd;
2106                 rSrcFmt.GetDoc()->CopyFlyInFlyImpl( aRg, 0, aTmpIdx );
2107                 pNewFmt->SetFmtAttr( SwFmtCntnt( pSttNd ));
2108             }
2109             else
2110                 pNewFmt->ResetFmtAttr( RES_CNTNT );
2111         }
2112         if( bCpyHeader )
2113             ((SwFmtHeader*)pNewItem)->RegisterToFormat(*pNewFmt);
2114         else
2115             ((SwFmtFooter*)pNewItem)->RegisterToFormat(*pNewFmt);
2116         rDestFmt.SetFmtAttr( *pNewItem );
2117     }
2118     delete pNewItem;
2119 }
2120 
2121 void SwDoc::CopyPageDesc( const SwPageDesc& rSrcDesc, SwPageDesc& rDstDesc,
2122                             sal_Bool bCopyPoolIds )
2123 {
2124     sal_Bool bNotifyLayout = sal_False;
2125     SwRootFrm* pTmpRoot = GetCurrentLayout();//swmod 080219
2126 
2127     rDstDesc.SetLandscape( rSrcDesc.GetLandscape() );
2128     rDstDesc.SetNumType( rSrcDesc.GetNumType() );
2129     if( rDstDesc.ReadUseOn() != rSrcDesc.ReadUseOn() )
2130     {
2131         rDstDesc.WriteUseOn( rSrcDesc.ReadUseOn() );
2132         bNotifyLayout = sal_True;
2133     }
2134 
2135     if( bCopyPoolIds )
2136     {
2137         rDstDesc.SetPoolFmtId( rSrcDesc.GetPoolFmtId() );
2138         rDstDesc.SetPoolHelpId( rSrcDesc.GetPoolHelpId() );
2139         // HelpFile-Id immer auf dflt setzen !!
2140         rDstDesc.SetPoolHlpFileId( UCHAR_MAX );
2141     }
2142 
2143     if( rSrcDesc.GetFollow() != &rSrcDesc )
2144     {
2145         SwPageDesc* pFollow = ::lcl_FindPageDesc( aPageDescs,
2146                                     rSrcDesc.GetFollow()->GetName() );
2147         if( !pFollow )
2148         {
2149             // dann mal kopieren
2150             sal_uInt16 nPos = MakePageDesc( rSrcDesc.GetFollow()->GetName() );
2151             pFollow = aPageDescs[ nPos ];
2152             CopyPageDesc( *rSrcDesc.GetFollow(), *pFollow );
2153         }
2154         rDstDesc.SetFollow( pFollow );
2155         bNotifyLayout = sal_True;
2156     }
2157 
2158     // die Header/Footer-Attribute werden gesondert kopiert, die Content-
2159     // Sections muessen vollstaendig mitgenommen werden!
2160     {
2161         SfxItemSet aAttrSet( rSrcDesc.GetMaster().GetAttrSet() );
2162         aAttrSet.ClearItem( RES_HEADER );
2163         aAttrSet.ClearItem( RES_FOOTER );
2164 
2165         rDstDesc.GetMaster().DelDiffs( aAttrSet );
2166         rDstDesc.GetMaster().SetFmtAttr( aAttrSet );
2167 
2168         aAttrSet.ClearItem();
2169         aAttrSet.Put( rSrcDesc.GetLeft().GetAttrSet() );
2170         aAttrSet.ClearItem( RES_HEADER );
2171         aAttrSet.ClearItem( RES_FOOTER );
2172 
2173         rDstDesc.GetLeft().DelDiffs( aAttrSet );
2174         rDstDesc.GetLeft().SetFmtAttr( aAttrSet );
2175     }
2176 
2177     CopyHeader( rSrcDesc.GetMaster(), rDstDesc.GetMaster() );
2178     CopyFooter( rSrcDesc.GetMaster(), rDstDesc.GetMaster() );
2179     if( !rDstDesc.IsHeaderShared() )
2180         CopyHeader( rSrcDesc.GetLeft(), rDstDesc.GetLeft() );
2181     else
2182         rDstDesc.GetLeft().SetFmtAttr( rDstDesc.GetMaster().GetHeader() );
2183 
2184     if( !rDstDesc.IsFooterShared() )
2185         CopyFooter( rSrcDesc.GetLeft(), rDstDesc.GetLeft() );
2186     else
2187         rDstDesc.GetLeft().SetFmtAttr( rDstDesc.GetMaster().GetFooter() );
2188 
2189     if( bNotifyLayout && pTmpRoot )
2190     {
2191         std::set<SwRootFrm*> aAllLayouts = GetAllLayouts();//swmod 080225
2192         std::for_each( aAllLayouts.begin(), aAllLayouts.end(),std::mem_fun(&SwRootFrm::AllCheckPageDescs));//swmod 080226
2193     }
2194 
2195     //Wenn sich FussnotenInfo veraendert, so werden die Seiten
2196     //angetriggert.
2197     if( !(rDstDesc.GetFtnInfo() == rSrcDesc.GetFtnInfo()) )
2198     {
2199         rDstDesc.SetFtnInfo( rSrcDesc.GetFtnInfo() );
2200         SwMsgPoolItem  aInfo( RES_PAGEDESC_FTNINFO );
2201         {
2202             rDstDesc.GetMaster().ModifyBroadcast( &aInfo, 0, TYPE(SwFrm) );
2203         }
2204         {
2205             rDstDesc.GetLeft().ModifyBroadcast( &aInfo, 0, TYPE(SwFrm) );
2206         }
2207     }
2208 }
2209 
2210 void SwDoc::ReplaceStyles( SwDoc& rSource )
2211 {
2212     ::sw::UndoGuard const undoGuard(GetIDocumentUndoRedo());
2213 
2214     CopyFmtArr( *rSource.pCharFmtTbl, *pCharFmtTbl,
2215                 &SwDoc::_MakeCharFmt, *pDfltCharFmt );
2216     CopyFmtArr( *rSource.pFrmFmtTbl, *pFrmFmtTbl,
2217                 &SwDoc::_MakeFrmFmt, *pDfltFrmFmt );
2218     CopyFmtArr( *rSource.pTxtFmtCollTbl, *pTxtFmtCollTbl,
2219                 &SwDoc::_MakeTxtFmtColl, *pDfltTxtFmtColl );
2220 
2221     // und jetzt noch die Seiten-Vorlagen
2222     sal_uInt16 nCnt = rSource.aPageDescs.Count();
2223     if( nCnt )
2224     {
2225         // ein anderes Doc -> Numberformatter muessen gemergt werden
2226         SwTblNumFmtMerge aTNFM( rSource, *this );
2227 
2228         // 1. Schritt alle Formate anlegen (das 0. ueberspringen - Default!)
2229         while( nCnt )
2230         {
2231             SwPageDesc *pSrc = rSource.aPageDescs[ --nCnt ];
2232             if( 0 == ::lcl_FindPageDesc( aPageDescs, pSrc->GetName() ) )
2233                 MakePageDesc( pSrc->GetName() );
2234         }
2235 
2236         // 2. Schritt alle Attribute kopieren, richtige Parents setzen
2237         for( nCnt = rSource.aPageDescs.Count(); nCnt; )
2238         {
2239             SwPageDesc *pSrc = rSource.aPageDescs[ --nCnt ];
2240             CopyPageDesc( *pSrc, *::lcl_FindPageDesc( aPageDescs, pSrc->GetName() ));
2241         }
2242     }
2243 
2244     //JP 08.04.99: und dann sind da noch die Numerierungs-Vorlagen
2245     nCnt = rSource.GetNumRuleTbl().Count();
2246     if( nCnt )
2247     {
2248         const SwNumRuleTbl& rArr = rSource.GetNumRuleTbl();
2249         for( sal_uInt16 n = 0; n < nCnt; ++n )
2250         {
2251             const SwNumRule& rR = *rArr[ n ];
2252             if( !rR.IsAutoRule() )
2253             {
2254                 SwNumRule* pNew = FindNumRulePtr( rR.GetName());
2255                 if( pNew )
2256                     pNew->CopyNumRule( this, rR );
2257                 else
2258                     MakeNumRule( rR.GetName(), &rR );
2259             }
2260         }
2261     }
2262 
2263     if (undoGuard.UndoWasEnabled())
2264     {
2265         // nodes array was modified!
2266         GetIDocumentUndoRedo().DelAllUndoObj();
2267     }
2268 
2269     SetModified();
2270 }
2271 
2272 SwFmt* SwDoc::FindFmtByName( const SvPtrarr& rFmtArr,
2273                                     const String& rName ) const
2274 {
2275     SwFmt* pFnd = 0;
2276     for( sal_uInt16 n = 0; n < rFmtArr.Count(); n++ )
2277     {
2278         // ist die Vorlage schon im Doc vorhanden ??
2279         if( ((SwFmt*)rFmtArr[n])->GetName() == rName )
2280         {
2281             pFnd = (SwFmt*)rFmtArr[n];
2282             break;
2283         }
2284     }
2285     return pFnd;
2286 }
2287 
2288 void SwDoc::MoveLeftMargin( const SwPaM& rPam, sal_Bool bRight, sal_Bool bModulus )
2289 {
2290     SwHistory* pHistory = 0;
2291     if (GetIDocumentUndoRedo().DoesUndo())
2292     {
2293         SwUndoMoveLeftMargin* pUndo = new SwUndoMoveLeftMargin( rPam, bRight,
2294                                                                 bModulus );
2295         pHistory = &pUndo->GetHistory();
2296         GetIDocumentUndoRedo().AppendUndo( pUndo );
2297     }
2298 
2299     const SvxTabStopItem& rTabItem = (SvxTabStopItem&)GetDefault( RES_PARATR_TABSTOP );
2300     sal_uInt16 nDefDist = rTabItem.Count() ?
2301         static_cast<sal_uInt16>(rTabItem[0].GetTabPos()) : 1134;
2302     const SwPosition &rStt = *rPam.Start(), &rEnd = *rPam.End();
2303     SwNodeIndex aIdx( rStt.nNode );
2304     while( aIdx <= rEnd.nNode )
2305     {
2306         SwTxtNode* pTNd = aIdx.GetNode().GetTxtNode();
2307         if( pTNd )
2308         {
2309             SvxLRSpaceItem aLS( (SvxLRSpaceItem&)pTNd->SwCntntNode::GetAttr( RES_LR_SPACE ) );
2310 
2311             // --> FME 2008-09-16 #i93873# See also lcl_MergeListLevelIndentAsLRSpaceItem in thints.cxx
2312             if ( pTNd->AreListLevelIndentsApplicable() )
2313             {
2314                 const SwNumRule* pRule = pTNd->GetNumRule();
2315                 if ( pRule )
2316                 {
2317                     const int nListLevel = pTNd->GetActualListLevel();
2318                     if ( nListLevel >= 0 )
2319                     {
2320                         const SwNumFmt& rFmt = pRule->Get(static_cast<sal_uInt16>(nListLevel));
2321                         if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT )
2322                         {
2323                             aLS.SetTxtLeft( rFmt.GetIndentAt() );
2324                             aLS.SetTxtFirstLineOfst( static_cast<short>(rFmt.GetFirstLineIndent()) );
2325                         }
2326                     }
2327                 }
2328             }
2329 
2330             long nNext = aLS.GetTxtLeft();
2331             if( bModulus )
2332                 nNext = ( nNext / nDefDist ) * nDefDist;
2333 
2334             if( bRight )
2335                 nNext += nDefDist;
2336             else
2337                 nNext -= nDefDist;
2338 
2339             aLS.SetTxtLeft( nNext );
2340 
2341             SwRegHistory aRegH( pTNd, *pTNd, pHistory );
2342             pTNd->SetAttr( aLS );
2343         }
2344         aIdx++;
2345     }
2346     SetModified();
2347 }
2348 
2349 sal_Bool SwDoc::DontExpandFmt( const SwPosition& rPos, sal_Bool bFlag )
2350 {
2351     sal_Bool bRet = sal_False;
2352     SwTxtNode* pTxtNd = rPos.nNode.GetNode().GetTxtNode();
2353     if( pTxtNd )
2354     {
2355         bRet = pTxtNd->DontExpandFmt( rPos.nContent, bFlag );
2356         if( bRet && GetIDocumentUndoRedo().DoesUndo() )
2357         {
2358             GetIDocumentUndoRedo().AppendUndo( new SwUndoDontExpandFmt(rPos) );
2359         }
2360     }
2361     return bRet;
2362 }
2363 
2364 SwTableBoxFmt* SwDoc::MakeTableBoxFmt()
2365 {
2366     SwTableBoxFmt* pFmt = new SwTableBoxFmt( GetAttrPool(), aEmptyStr,
2367                                                 pDfltFrmFmt );
2368     SetModified();
2369     return pFmt;
2370 }
2371 
2372 SwTableLineFmt* SwDoc::MakeTableLineFmt()
2373 {
2374     SwTableLineFmt* pFmt = new SwTableLineFmt( GetAttrPool(), aEmptyStr,
2375                                                 pDfltFrmFmt );
2376     SetModified();
2377     return pFmt;
2378 }
2379 
2380 void SwDoc::_CreateNumberFormatter()
2381 {
2382     RTL_LOGFILE_CONTEXT_AUTHOR( aLog, "SW", "JP93722",  "SwDoc::_CreateNumberFormatter" );
2383 
2384     ASSERT( !pNumberFormatter, "ist doch schon vorhanden" );
2385 
2386 
2387     LanguageType eLang = LANGUAGE_SYSTEM; //System::GetLanguage();
2388 /*              ((const SvxLanguageItem&)GetAttrPool().
2389                     GetDefaultItem( RES_CHRATR_LANGUAGE )).GetLanguage();
2390 */
2391     Reference< XMultiServiceFactory > xMSF = ::comphelper::getProcessServiceFactory();
2392     pNumberFormatter = new SvNumberFormatter( xMSF, eLang );
2393     pNumberFormatter->SetEvalDateFormat( NF_EVALDATEFORMAT_FORMAT_INTL );
2394     pNumberFormatter->SetYear2000(static_cast<sal_uInt16>(::utl::MiscCfg().GetYear2000()));
2395 
2396 }
2397 
2398 SwTblNumFmtMerge::SwTblNumFmtMerge( const SwDoc& rSrc, SwDoc& rDest )
2399     : pNFmt( 0 )
2400 {
2401     // ein anderes Doc -> Numberformatter muessen gemergt werden
2402     SvNumberFormatter* pN;
2403     if( &rSrc != &rDest && 0 != ( pN = ((SwDoc&)rSrc).GetNumberFormatter( sal_False ) ))
2404         ( pNFmt = rDest.GetNumberFormatter( sal_True ))->MergeFormatter( *pN );
2405 
2406     if( &rSrc != &rDest )
2407         ((SwGetRefFieldType*)rSrc.GetSysFldType( RES_GETREFFLD ))->
2408             MergeWithOtherDoc( rDest );
2409 }
2410 
2411 SwTblNumFmtMerge::~SwTblNumFmtMerge()
2412 {
2413     if( pNFmt )
2414         pNFmt->ClearMergeTable();
2415 }
2416 
2417 
2418 void SwDoc::SetTxtFmtCollByAutoFmt( const SwPosition& rPos, sal_uInt16 nPoolId,
2419                                     const SfxItemSet* pSet )
2420 {
2421     SwPaM aPam( rPos );
2422     SwTxtNode* pTNd = rPos.nNode.GetNode().GetTxtNode();
2423 
2424     if( mbIsAutoFmtRedline && pTNd )
2425     {
2426         // dann das Redline Object anlegen
2427         const SwTxtFmtColl& rColl = *pTNd->GetTxtColl();
2428         SwRedline* pRedl = new SwRedline( nsRedlineType_t::REDLINE_FMTCOLL, aPam );
2429         pRedl->SetMark();
2430 
2431         // interressant sind nur die Items, die vom Set NICHT wieder
2432         // in den Node gesetzt werden. Also muss man die Differenz nehmen
2433         SwRedlineExtraData_FmtColl aExtraData( rColl.GetName(),
2434                                                 rColl.GetPoolFmtId() );
2435         if( pSet && pTNd->HasSwAttrSet() )
2436         {
2437             SfxItemSet aTmp( *pTNd->GetpSwAttrSet() );
2438             aTmp.Differentiate( *pSet );
2439             // das Adjust Item behalten wir extra
2440             const SfxPoolItem* pItem;
2441             if( SFX_ITEM_SET == pTNd->GetpSwAttrSet()->GetItemState(
2442                     RES_PARATR_ADJUST, sal_False, &pItem ))
2443                 aTmp.Put( *pItem );
2444             aExtraData.SetItemSet( aTmp );
2445         }
2446         pRedl->SetExtraData( &aExtraData );
2447 
2448 // !!!!!!!!! Undo fehlt noch !!!!!!!!!!!!!!!!!!
2449         AppendRedline( pRedl, true );
2450     }
2451 
2452     SetTxtFmtColl( aPam, GetTxtCollFromPool( nPoolId ) );
2453 
2454     if( pSet && pTNd && pSet->Count() )
2455     {
2456         aPam.SetMark();
2457         aPam.GetMark()->nContent.Assign( pTNd, pTNd->GetTxt().Len() );
2458         InsertItemSet( aPam, *pSet, 0 );
2459     }
2460 }
2461 
2462 void SwDoc::SetFmtItemByAutoFmt( const SwPaM& rPam, const SfxItemSet& rSet )
2463 {
2464     SwTxtNode* pTNd = rPam.GetPoint()->nNode.GetNode().GetTxtNode();
2465 
2466     RedlineMode_t eOld = GetRedlineMode();
2467 
2468     if( mbIsAutoFmtRedline && pTNd )
2469     {
2470         // dann das Redline Object anlegen
2471         SwRedline* pRedl = new SwRedline( nsRedlineType_t::REDLINE_FORMAT, rPam );
2472         if( !pRedl->HasMark() )
2473             pRedl->SetMark();
2474 
2475         // interressant sind nur die Items, die vom Set NICHT wieder
2476         // in den Node gesetzt werden. Also muss man die Differenz nehmen
2477         SwRedlineExtraData_Format aExtraData( rSet );
2478 
2479 /*
2480         if( pSet && pTNd->HasSwAttrSet() )
2481         {
2482             SfxItemSet aTmp( *pTNd->GetpSwAttrSet() );
2483             aTmp.Differentiate( *pSet );
2484             // das Adjust Item behalten wir extra
2485             const SfxPoolItem* pItem;
2486             if( SFX_ITEM_SET == pTNd->GetpSwAttrSet()->GetItemState(
2487                     RES_PARATR_ADJUST, sal_False, &pItem ))
2488                 aTmp.Put( *pItem );
2489             aExtraData.SetItemSet( aTmp );
2490         }
2491 */
2492         pRedl->SetExtraData( &aExtraData );
2493 
2494 // !!!!!!!!! Undo fehlt noch !!!!!!!!!!!!!!!!!!
2495         AppendRedline( pRedl, true );
2496 
2497         SetRedlineMode_intern( (RedlineMode_t)(eOld | nsRedlineMode_t::REDLINE_IGNORE));
2498     }
2499 
2500     InsertItemSet( rPam, rSet, nsSetAttrMode::SETATTR_DONTEXPAND );
2501     SetRedlineMode_intern( eOld );
2502 }
2503 
2504 void SwDoc::ChgFmt(SwFmt & rFmt, const SfxItemSet & rSet)
2505 {
2506     if (GetIDocumentUndoRedo().DoesUndo())
2507     {
2508         // copying <rSet> to <aSet>
2509         SfxItemSet aSet(rSet);
2510         // remove from <aSet> all items, which are already set at the format
2511         aSet.Differentiate(rFmt.GetAttrSet());
2512         // <aSet> contains now all *new* items for the format
2513 
2514         // copying current format item set to <aOldSet>
2515         SfxItemSet aOldSet(rFmt.GetAttrSet());
2516         // insert new items into <aOldSet>
2517         aOldSet.Put(aSet);
2518         // invalidate all new items in <aOldSet> in order to clear these items,
2519         // if the undo action is triggered.
2520         {
2521             SfxItemIter aIter(aSet);
2522 
2523             const SfxPoolItem * pItem = aIter.FirstItem();
2524             while (pItem != NULL)
2525             {
2526                 aOldSet.InvalidateItem(pItem->Which());
2527 
2528                 pItem = aIter.NextItem();
2529             }
2530         }
2531 
2532         SwUndo * pUndo = new SwUndoFmtAttr(aOldSet, rFmt);
2533 
2534         GetIDocumentUndoRedo().AppendUndo(pUndo);
2535     }
2536 
2537     rFmt.SetFmtAttr(rSet);
2538 }
2539 
2540 void SwDoc::RenameFmt(SwFmt & rFmt, const String & sNewName,
2541                       sal_Bool bBroadcast)
2542 {
2543     SfxStyleFamily eFamily = SFX_STYLE_FAMILY_ALL;
2544 
2545     if (GetIDocumentUndoRedo().DoesUndo())
2546     {
2547         SwUndo * pUndo = NULL;
2548 
2549         switch (rFmt.Which())
2550         {
2551         case RES_CHRFMT:
2552             pUndo = new SwUndoRenameCharFmt(rFmt.GetName(), sNewName, this);
2553             eFamily = SFX_STYLE_FAMILY_PARA;
2554             break;
2555         case RES_TXTFMTCOLL:
2556             pUndo = new SwUndoRenameFmtColl(rFmt.GetName(), sNewName, this);
2557             eFamily = SFX_STYLE_FAMILY_CHAR;
2558             break;
2559         case RES_FRMFMT:
2560             pUndo = new SwUndoRenameFrmFmt(rFmt.GetName(), sNewName, this);
2561             eFamily = SFX_STYLE_FAMILY_FRAME;
2562             break;
2563 
2564         default:
2565             break;
2566         }
2567 
2568         if (pUndo)
2569         {
2570             GetIDocumentUndoRedo().AppendUndo(pUndo);
2571         }
2572     }
2573 
2574     rFmt.SetName(sNewName);
2575 
2576     if (bBroadcast)
2577         BroadcastStyleOperation(sNewName, eFamily, SFX_STYLESHEET_MODIFIED);
2578 }
2579 
2580 // --> OD 2006-09-27 #i69627#
2581 namespace docfunc
2582 {
2583     bool HasOutlineStyleToBeWrittenAsNormalListStyle( SwDoc& rDoc )
2584     {
2585         // If a parent paragraph style of one of the parargraph styles, which
2586         // are assigned to the list levels of the outline style, has a list style
2587         // set or inherits a list style from its parent style, the outline style
2588         // has to be written as a normal list style to the OpenDocument file
2589         // format or the OpenOffice.org file format.
2590         bool bRet( false );
2591 
2592         const SwTxtFmtColls* pTxtFmtColls( rDoc.GetTxtFmtColls() );
2593         if ( pTxtFmtColls )
2594         {
2595             const sal_uInt16 nCount = pTxtFmtColls->Count();
2596             for ( sal_uInt16 i = 0; i < nCount; ++i )
2597             {
2598                 SwTxtFmtColl* pTxtFmtColl = (*pTxtFmtColls)[i];
2599 
2600                 if ( pTxtFmtColl->IsDefault() ||
2601                    //  pTxtFmtColl->GetOutlineLevel() == NO_NUMBERING ) //#outline level,zhaojianwei
2602                     ! pTxtFmtColl->IsAssignedToListLevelOfOutlineStyle() )  //<-end,zhaojianwei
2603                 {
2604                     continue;
2605                 }
2606 
2607                 const SwTxtFmtColl* pParentTxtFmtColl =
2608                    dynamic_cast<const SwTxtFmtColl*>( pTxtFmtColl->DerivedFrom());
2609                 if ( !pParentTxtFmtColl )
2610                     continue;
2611 
2612                 if ( SFX_ITEM_SET == pParentTxtFmtColl->GetItemState( RES_PARATR_NUMRULE ) )
2613                 {
2614                     // --> OD 2009-11-12 #i106218#
2615                     // consider that the outline style is set
2616                     const SwNumRuleItem& rDirectItem = pParentTxtFmtColl->GetNumRule();
2617                     if ( rDirectItem.GetValue() != rDoc.GetOutlineNumRule()->GetName() )
2618                     {
2619                         bRet = true;
2620                         break;
2621                     }
2622                     // <--
2623                 }
2624             }
2625 
2626         }
2627         return bRet;
2628     }
2629 }
2630 // <--
2631