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