xref: /aoo41x/main/sw/source/core/doc/docfmt.cxx (revision 808c4840)
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
10efeef26fSAndrew Rist  *
11efeef26fSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12efeef26fSAndrew Rist  *
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.
19efeef26fSAndrew Rist  *
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 ),
134*808c4840SOliver-Rainer Wittmann           bInclRefToxMark( false )
135*808c4840SOliver-Rainer Wittmann     {
136*808c4840SOliver-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 ),
148*808c4840SOliver-Rainer Wittmann           bInclRefToxMark( false )
149*808c4840SOliver-Rainer Wittmann     {
150*808c4840SOliver-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 {
15969a74367SOliver-Rainer Wittmann     ParaRstFmt* pPara = (ParaRstFmt*)pArgs;
16069a74367SOliver-Rainer Wittmann     SwTxtNode * pTxtNode = (SwTxtNode*)rpNd->GetTxtNode();
16169a74367SOliver-Rainer Wittmann     if( pTxtNode && pTxtNode->GetpSwpHints() )
16269a74367SOliver-Rainer Wittmann     {
16369a74367SOliver-Rainer Wittmann         SwIndex aSt( pTxtNode, 0 );
16469a74367SOliver-Rainer Wittmann         sal_uInt16 nEnd = pTxtNode->Len();
165cdf0e10cSrcweir 
16669a74367SOliver-Rainer Wittmann         if( &pPara->pSttNd->nNode.GetNode() == pTxtNode &&
16769a74367SOliver-Rainer Wittmann             pPara->pSttNd->nContent.GetIndex() )
16869a74367SOliver-Rainer Wittmann             aSt = pPara->pSttNd->nContent.GetIndex();
169cdf0e10cSrcweir 
17069a74367SOliver-Rainer Wittmann         if( &pPara->pEndNd->nNode.GetNode() == rpNd )
17169a74367SOliver-Rainer Wittmann             nEnd = pPara->pEndNd->nContent.GetIndex();
172cdf0e10cSrcweir 
17369a74367SOliver-Rainer Wittmann         if( pPara->pHistory )
17469a74367SOliver-Rainer Wittmann         {
17569a74367SOliver-Rainer Wittmann             // fuers Undo alle Attribute sichern
176cdf0e10cSrcweir             SwRegHistory aRHst( *pTxtNode, pPara->pHistory );
17769a74367SOliver-Rainer Wittmann             pTxtNode->GetpSwpHints()->Register( &aRHst );
17869a74367SOliver-Rainer Wittmann             pTxtNode->RstTxtAttr( aSt, nEnd - aSt.GetIndex(), pPara->nWhich,
17969a74367SOliver-Rainer Wittmann                                   pPara->pDelSet, pPara->bInclRefToxMark );
18069a74367SOliver-Rainer Wittmann             if( pTxtNode->GetpSwpHints() )
18169a74367SOliver-Rainer Wittmann                 pTxtNode->GetpSwpHints()->DeRegister();
18269a74367SOliver-Rainer Wittmann         }
18369a74367SOliver-Rainer Wittmann         else
18469a74367SOliver-Rainer Wittmann             pTxtNode->RstTxtAttr( aSt, nEnd - aSt.GetIndex(), pPara->nWhich,
18569a74367SOliver-Rainer Wittmann                                   pPara->pDelSet, pPara->bInclRefToxMark );
18669a74367SOliver-Rainer Wittmann     }
18769a74367SOliver-Rainer Wittmann     return sal_True;
188cdf0e10cSrcweir }
189cdf0e10cSrcweir 
lcl_RstAttr(const SwNodePtr & rpNd,void * pArgs)190cdf0e10cSrcweir sal_Bool lcl_RstAttr( const SwNodePtr& rpNd, void* pArgs )
191cdf0e10cSrcweir {
192*808c4840SOliver-Rainer Wittmann     const ParaRstFmt* pPara = (ParaRstFmt*) pArgs;
193*808c4840SOliver-Rainer Wittmann     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 
201*808c4840SOliver-Rainer Wittmann         SfxItemSet aSavedAttrsSet(
202*808c4840SOliver-Rainer Wittmann             pDoc->GetAttrPool(),
203*808c4840SOliver-Rainer Wittmann             RES_PAGEDESC, RES_BREAK,
204*808c4840SOliver-Rainer Wittmann             RES_PARATR_NUMRULE, RES_PARATR_NUMRULE,
205*808c4840SOliver-Rainer Wittmann             RES_PARATR_LIST_BEGIN, RES_PARATR_LIST_END - 1,
206*808c4840SOliver-Rainer Wittmann             0 );
207*808c4840SOliver-Rainer Wittmann         const SfxItemSet* pAttrSetOfNode = pNode->GetpSwAttrSet();
208*808c4840SOliver-Rainer Wittmann 
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 );
215*808c4840SOliver-Rainer Wittmann             aListAttrSet.Set( *pAttrSetOfNode );
216cdf0e10cSrcweir             if ( aListAttrSet.Count() )
217cdf0e10cSrcweir             {
218*808c4840SOliver-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 
229*808c4840SOliver-Rainer Wittmann         const SfxPoolItem* pItem;
230*808c4840SOliver-Rainer Wittmann         sal_uInt16 __READONLY_DATA aSavIds[3] =
231*808c4840SOliver-Rainer Wittmann                 { RES_PAGEDESC, RES_BREAK, RES_PARATR_NUMRULE };
232*808c4840SOliver-Rainer Wittmann         for ( sal_uInt16 n = 0; n < 3; ++n )
233cdf0e10cSrcweir         {
234*808c4840SOliver-Rainer Wittmann             if ( SFX_ITEM_SET == pAttrSetOfNode->GetItemState( aSavIds[n], sal_False, &pItem ) )
235*808c4840SOliver-Rainer Wittmann             {
236cdf0e10cSrcweir                 bool bSave = false;
237*808c4840SOliver-Rainer Wittmann                 switch (aSavIds[n])
238*808c4840SOliver-Rainer Wittmann                 {
239*808c4840SOliver-Rainer Wittmann                 case RES_PAGEDESC:
240*808c4840SOliver-Rainer Wittmann                     bSave = 0 != ( (SwFmtPageDesc*) pItem )->GetPageDesc();
241cdf0e10cSrcweir                     break;
242*808c4840SOliver-Rainer Wittmann                 case RES_BREAK:
243*808c4840SOliver-Rainer Wittmann                     bSave = SVX_BREAK_NONE != ( (SvxFmtBreakItem*) pItem )->GetBreak();
244cdf0e10cSrcweir                     break;
245*808c4840SOliver-Rainer Wittmann                 case RES_PARATR_NUMRULE:
246*808c4840SOliver-Rainer Wittmann                     bSave = 0 != ( (SwNumRuleItem*) pItem )->GetValue().Len();
247cdf0e10cSrcweir                     break;
248*808c4840SOliver-Rainer Wittmann                 }
249*808c4840SOliver-Rainer Wittmann                 if ( bSave )
250*808c4840SOliver-Rainer Wittmann                 {
251*808c4840SOliver-Rainer Wittmann                     aSavedAttrsSet.Put( *pItem );
252cdf0e10cSrcweir                     aClearWhichIds.Insert( aSavIds[n], aClearWhichIds.Count() );
253cdf0e10cSrcweir                 }
254*808c4840SOliver-Rainer Wittmann             }
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 
269*808c4840SOliver-Rainer Wittmann         if ( pPara )
270*808c4840SOliver-Rainer Wittmann         {
271*808c4840SOliver-Rainer Wittmann             SwRegHistory aRegH( pNode, *pNode, pPara->pHistory );
272cdf0e10cSrcweir 
273*808c4840SOliver-Rainer Wittmann             if ( pPara->pDelSet && pPara->pDelSet->Count() )
274*808c4840SOliver-Rainer Wittmann             {
275cdf0e10cSrcweir                 ASSERT( !bKeepAttributes,
276cdf0e10cSrcweir                         "<lcl_RstAttr(..)> - certain attributes are kept, but not needed. -> please inform OD" );
277*808c4840SOliver-Rainer Wittmann                 SfxItemIter aIter( *pPara->pDelSet );
278*808c4840SOliver-Rainer Wittmann                 pItem = aIter.FirstItem();
279*808c4840SOliver-Rainer Wittmann                 while ( sal_True )
280*808c4840SOliver-Rainer Wittmann                 {
281cdf0e10cSrcweir                     if ( ( pItem->Which() != RES_PAGEDESC &&
282cdf0e10cSrcweir                            pItem->Which() != RES_BREAK &&
283cdf0e10cSrcweir                            pItem->Which() != RES_PARATR_NUMRULE ) ||
284*808c4840SOliver-Rainer Wittmann                          ( aSavedAttrsSet.GetItemState( pItem->Which(), sal_False ) != SFX_ITEM_SET ) )
285cdf0e10cSrcweir                     {
286cdf0e10cSrcweir                         pNode->ResetAttr( pItem->Which() );
287cdf0e10cSrcweir                     }
288*808c4840SOliver-Rainer Wittmann                     if ( aIter.IsAtEnd() )
289*808c4840SOliver-Rainer Wittmann                         break;
290*808c4840SOliver-Rainer Wittmann                     pItem = aIter.NextItem();
291*808c4840SOliver-Rainer Wittmann                 }
292*808c4840SOliver-Rainer Wittmann             }
293*808c4840SOliver-Rainer Wittmann             else if ( pPara->bResetAll )
294*808c4840SOliver-Rainer Wittmann                 pNode->ResetAllAttr();
295*808c4840SOliver-Rainer Wittmann             else
296*808c4840SOliver-Rainer Wittmann                 pNode->ResetAttr( RES_PARATR_BEGIN, POOLATTR_END - 1 );
297*808c4840SOliver-Rainer Wittmann         }
298*808c4840SOliver-Rainer Wittmann         else
299*808c4840SOliver-Rainer Wittmann             pNode->ResetAllAttr();
300cdf0e10cSrcweir 
301cdf0e10cSrcweir         // only restore saved attributes, if needed
302*808c4840SOliver-Rainer Wittmann         if ( bKeepAttributes && aSavedAttrsSet.Count() )
303*808c4840SOliver-Rainer Wittmann         {
304cdf0e10cSrcweir             pNode->LockModify();
305cdf0e10cSrcweir 
306*808c4840SOliver-Rainer Wittmann             pNode->SetAttr( aSavedAttrsSet );
307cdf0e10cSrcweir 
308*808c4840SOliver-Rainer Wittmann             if ( !bLocked )
309*808c4840SOliver-Rainer Wittmann                 pNode->UnlockModify();
310*808c4840SOliver-Rainer Wittmann         }
311*808c4840SOliver-Rainer Wittmann     }
312*808c4840SOliver-Rainer Wittmann     return sal_True;
313cdf0e10cSrcweir }
314cdf0e10cSrcweir 
315*808c4840SOliver-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,
52069a74367SOliver-Rainer Wittmann     //Modify here for #119405, by easyfan, 2012-05-24
52169a74367SOliver-Rainer Wittmann     const bool bExpandCharToPara=false)
52269a74367SOliver-Rainer Wittmann     //End of modification, by easyfan
523cdf0e10cSrcweir {
52469a74367SOliver-Rainer Wittmann     // 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();
536cdf0e10cSrcweir 
53725beb051SJürgen Schmidt         if (!IsInvalidItem(pItem))
538cdf0e10cSrcweir         {
53925beb051SJürgen Schmidt             const sal_uInt16 nWhich = pItem->Which();
540cdf0e10cSrcweir 
54125beb051SJürgen Schmidt             if ( isCHRATR(nWhich) ||
54225beb051SJürgen Schmidt                  (RES_TXTATR_CHARFMT == nWhich) ||
54325beb051SJürgen Schmidt                  (RES_TXTATR_INETFMT == nWhich) ||
54425beb051SJürgen Schmidt                  (RES_TXTATR_AUTOFMT == nWhich) ||
54525beb051SJürgen Schmidt                  (RES_TXTATR_UNKNOWN_CONTAINER == nWhich) )
54625beb051SJürgen Schmidt             {
54725beb051SJürgen Schmidt                 pCharSet  = &rChgSet;
54825beb051SJürgen Schmidt                 bCharAttr = true;
54925beb051SJürgen Schmidt             }
55025beb051SJürgen Schmidt 
55125beb051SJürgen Schmidt             if (    isPARATR(nWhich)
55225beb051SJürgen Schmidt                     || isPARATR_LIST(nWhich)
55325beb051SJürgen Schmidt                     || isFRMATR(nWhich)
55425beb051SJürgen Schmidt                     || isGRFATR(nWhich)
55525beb051SJürgen Schmidt                     || isUNKNOWNATR(nWhich) )
55625beb051SJürgen Schmidt             {
55725beb051SJürgen Schmidt                 pOtherSet = &rChgSet;
55825beb051SJürgen Schmidt                 bOtherAttr = true;
55925beb051SJürgen Schmidt             }
560cdf0e10cSrcweir         }
561cdf0e10cSrcweir     }
562cdf0e10cSrcweir 
563cdf0e10cSrcweir     // Build new itemset if either
564cdf0e10cSrcweir     // - rChgSet.Count() > 1 or
565cdf0e10cSrcweir     // - The attribute in rChgSet does not belong to one of the above categories
566cdf0e10cSrcweir     if ( !bCharAttr && !bOtherAttr )
567cdf0e10cSrcweir     {
568cdf0e10cSrcweir         SfxItemSet* pTmpCharItemSet = new SfxItemSet( pDoc->GetAttrPool(),
569cdf0e10cSrcweir                                    RES_CHRATR_BEGIN, RES_CHRATR_END-1,
570cdf0e10cSrcweir                                    RES_TXTATR_AUTOFMT, RES_TXTATR_AUTOFMT,
571cdf0e10cSrcweir                                    RES_TXTATR_INETFMT, RES_TXTATR_INETFMT,
572cdf0e10cSrcweir                                    RES_TXTATR_CHARFMT, RES_TXTATR_CHARFMT,
573cdf0e10cSrcweir                RES_TXTATR_UNKNOWN_CONTAINER, RES_TXTATR_UNKNOWN_CONTAINER,
574cdf0e10cSrcweir                                    0 );
575cdf0e10cSrcweir 
576cdf0e10cSrcweir         SfxItemSet* pTmpOtherItemSet = new SfxItemSet( pDoc->GetAttrPool(),
577cdf0e10cSrcweir                                     RES_PARATR_BEGIN, RES_PARATR_END-1,
578cdf0e10cSrcweir                                     RES_PARATR_LIST_BEGIN, RES_PARATR_LIST_END-1,
579cdf0e10cSrcweir                                     RES_FRMATR_BEGIN, RES_FRMATR_END-1,
580cdf0e10cSrcweir                                     RES_GRFATR_BEGIN, RES_GRFATR_END-1,
581cdf0e10cSrcweir                                     RES_UNKNOWNATR_BEGIN, RES_UNKNOWNATR_END-1,
582cdf0e10cSrcweir                                     0 );
583cdf0e10cSrcweir 
584cdf0e10cSrcweir         pTmpCharItemSet->Put( rChgSet );
585cdf0e10cSrcweir         pTmpOtherItemSet->Put( rChgSet );
586cdf0e10cSrcweir 
587cdf0e10cSrcweir         pCharSet = pTmpCharItemSet;
588cdf0e10cSrcweir         pOtherSet = pTmpOtherItemSet;
589cdf0e10cSrcweir 
590cdf0e10cSrcweir         bDelete = true;
591cdf0e10cSrcweir     }
592cdf0e10cSrcweir 
593cdf0e10cSrcweir     SwHistory* pHistory = pUndo ? &pUndo->GetHistory() : 0;
594cdf0e10cSrcweir     bool bRet = false;
59569a74367SOliver-Rainer Wittmann     const SwPosition *pStt = rRg.Start(), *pEnd = rRg.End();
59669a74367SOliver-Rainer Wittmann     SwCntntNode* pNode = pStt->nNode.GetNode().GetCntntNode();
597cdf0e10cSrcweir 
59869a74367SOliver-Rainer Wittmann     if( pNode && pNode->IsTxtNode() )
59969a74367SOliver-Rainer Wittmann     {
600cdf0e10cSrcweir         // -> #i27615#
601cdf0e10cSrcweir         if (rRg.IsInFrontOfLabel())
602cdf0e10cSrcweir         {
603cdf0e10cSrcweir             SwTxtNode * pTxtNd = pNode->GetTxtNode();
604cdf0e10cSrcweir             SwNumRule * pNumRule = pTxtNd->GetNumRule();
605cdf0e10cSrcweir 
606cdf0e10cSrcweir             if ( !pNumRule )
607cdf0e10cSrcweir             {
608cdf0e10cSrcweir                 ASSERT( false,
609cdf0e10cSrcweir                         "<InsAttr(..)> - PaM in front of label, but text node has no numbering rule set. This is a serious defect, please inform OD." );
610cdf0e10cSrcweir                 DELETECHARSETS
611cdf0e10cSrcweir                 return false;
612cdf0e10cSrcweir             }
613cdf0e10cSrcweir 
614cdf0e10cSrcweir             SwNumFmt aNumFmt = pNumRule->Get(static_cast<sal_uInt16>(pTxtNd->GetActualListLevel()));
615cdf0e10cSrcweir             SwCharFmt * pCharFmt =
616cdf0e10cSrcweir                 pDoc->FindCharFmtByName(aNumFmt.GetCharFmtName());
617cdf0e10cSrcweir 
618cdf0e10cSrcweir             if (pCharFmt)
619cdf0e10cSrcweir             {
620cdf0e10cSrcweir                 if (pHistory)
621cdf0e10cSrcweir                     pHistory->Add(pCharFmt->GetAttrSet(), *pCharFmt);
622cdf0e10cSrcweir 
623cdf0e10cSrcweir                 if ( pCharSet )
624cdf0e10cSrcweir                     pCharFmt->SetFmtAttr(*pCharSet);
625cdf0e10cSrcweir             }
626cdf0e10cSrcweir 
627cdf0e10cSrcweir             DELETECHARSETS
628cdf0e10cSrcweir             return true;
629cdf0e10cSrcweir         }
630cdf0e10cSrcweir 
63169a74367SOliver-Rainer Wittmann         const SwIndex& rSt = pStt->nContent;
632cdf0e10cSrcweir 
63369a74367SOliver-Rainer Wittmann         // Attribute ohne Ende haben keinen Bereich
634cdf0e10cSrcweir         if ( !bCharAttr && !bOtherAttr )
635cdf0e10cSrcweir         {
636cdf0e10cSrcweir             SfxItemSet aTxtSet( pDoc->GetAttrPool(),
63769a74367SOliver-Rainer Wittmann                         RES_TXTATR_NOEND_BEGIN, RES_TXTATR_NOEND_END-1 );
63869a74367SOliver-Rainer Wittmann             aTxtSet.Put( rChgSet );
63969a74367SOliver-Rainer Wittmann             if( aTxtSet.Count() )
64069a74367SOliver-Rainer Wittmann             {
641cdf0e10cSrcweir                 SwRegHistory history( pNode, *pNode, pHistory );
642cdf0e10cSrcweir                 bRet = history.InsertItems(
643cdf0e10cSrcweir                     aTxtSet, rSt.GetIndex(), rSt.GetIndex(), nFlags ) || bRet;
644cdf0e10cSrcweir 
645cdf0e10cSrcweir                 if (bRet && (pDoc->IsRedlineOn() || (!pDoc->IsIgnoreRedline()
646cdf0e10cSrcweir                                 && pDoc->GetRedlineTbl().Count())))
647cdf0e10cSrcweir                 {
64869a74367SOliver-Rainer Wittmann                     SwPaM aPam( pStt->nNode, pStt->nContent.GetIndex()-1,
64969a74367SOliver-Rainer Wittmann                                 pStt->nNode, pStt->nContent.GetIndex() );
650cdf0e10cSrcweir 
65169a74367SOliver-Rainer Wittmann                     if( pUndo )
65269a74367SOliver-Rainer Wittmann                         pUndo->SaveRedlineData( aPam, sal_True );
653cdf0e10cSrcweir 
65469a74367SOliver-Rainer Wittmann                     if( pDoc->IsRedlineOn() )
65569a74367SOliver-Rainer Wittmann                         pDoc->AppendRedline( new SwRedline( nsRedlineType_t::REDLINE_INSERT, aPam ), true);
65669a74367SOliver-Rainer Wittmann                     else
65769a74367SOliver-Rainer Wittmann                         pDoc->SplitRedline( aPam );
65869a74367SOliver-Rainer Wittmann                 }
65969a74367SOliver-Rainer Wittmann             }
66069a74367SOliver-Rainer Wittmann         }
661cdf0e10cSrcweir 
66269a74367SOliver-Rainer Wittmann         // TextAttribute mit Ende expandieren nie ihren Bereich
66369a74367SOliver-Rainer Wittmann         if ( !bCharAttr && !bOtherAttr )
664cdf0e10cSrcweir         {
66569a74367SOliver-Rainer Wittmann             // CharFmt wird gesondert behandelt !!!
66669a74367SOliver-Rainer Wittmann             // JP 22.08.96: URL-Attribute auch!!
667cdf0e10cSrcweir             // TEST_TEMP ToDo: AutoFmt!
66869a74367SOliver-Rainer Wittmann             SfxItemSet aTxtSet( pDoc->GetAttrPool(),
669cdf0e10cSrcweir                                 RES_TXTATR_REFMARK, RES_TXTATR_TOXMARK,
670cdf0e10cSrcweir                                 RES_TXTATR_META, RES_TXTATR_METAFIELD,
671cdf0e10cSrcweir                                 RES_TXTATR_CJK_RUBY, RES_TXTATR_CJK_RUBY,
67269a74367SOliver-Rainer Wittmann                                 RES_TXTATR_INPUTFIELD, RES_TXTATR_INPUTFIELD,
67369a74367SOliver-Rainer Wittmann                                 0 );
674cdf0e10cSrcweir 
67569a74367SOliver-Rainer Wittmann             aTxtSet.Put( rChgSet );
67669a74367SOliver-Rainer Wittmann             if( aTxtSet.Count() )
67769a74367SOliver-Rainer Wittmann             {
67869a74367SOliver-Rainer Wittmann                 sal_uInt16 nInsCnt = rSt.GetIndex();
67969a74367SOliver-Rainer Wittmann                 sal_uInt16 nEnd = pStt->nNode == pEnd->nNode
68069a74367SOliver-Rainer Wittmann                                 ? pEnd->nContent.GetIndex()
68169a74367SOliver-Rainer Wittmann                                 : pNode->Len();
682cdf0e10cSrcweir                 SwRegHistory history( pNode, *pNode, pHistory );
683cdf0e10cSrcweir                 bRet = history.InsertItems( aTxtSet, nInsCnt, nEnd, nFlags )
684dec99bbdSOliver-Rainer Wittmann                        || bRet;
685cdf0e10cSrcweir 
686cdf0e10cSrcweir                 if (bRet && (pDoc->IsRedlineOn() || (!pDoc->IsIgnoreRedline()
687cdf0e10cSrcweir                                 && pDoc->GetRedlineTbl().Count())))
688cdf0e10cSrcweir                 {
68969a74367SOliver-Rainer Wittmann                     // wurde Text-Inhalt eingefuegt? (RefMark/TOXMarks ohne Ende)
69069a74367SOliver-Rainer Wittmann                     sal_Bool bTxtIns = nInsCnt != rSt.GetIndex();
69169a74367SOliver-Rainer Wittmann                     // wurde Inhalt eingefuegt oder ueber die Selektion gesetzt?
69269a74367SOliver-Rainer Wittmann                     SwPaM aPam( pStt->nNode, bTxtIns ? nInsCnt + 1 : nEnd,
69369a74367SOliver-Rainer Wittmann                                 pStt->nNode, nInsCnt );
69469a74367SOliver-Rainer Wittmann                     if( pUndo )
69569a74367SOliver-Rainer Wittmann                         pUndo->SaveRedlineData( aPam, bTxtIns );
69669a74367SOliver-Rainer Wittmann 
69769a74367SOliver-Rainer Wittmann                     if( pDoc->IsRedlineOn() )
698dec99bbdSOliver-Rainer Wittmann                         pDoc->AppendRedline(
699dec99bbdSOliver-Rainer Wittmann                             new SwRedline(
700dec99bbdSOliver-Rainer Wittmann                                 bTxtIns ? nsRedlineType_t::REDLINE_INSERT : nsRedlineType_t::REDLINE_FORMAT, aPam ),
701dec99bbdSOliver-Rainer Wittmann                                 true);
70269a74367SOliver-Rainer Wittmann                     else if( bTxtIns )
70369a74367SOliver-Rainer Wittmann                         pDoc->SplitRedline( aPam );
70469a74367SOliver-Rainer Wittmann                 }
70569a74367SOliver-Rainer Wittmann             }
70669a74367SOliver-Rainer Wittmann         }
70769a74367SOliver-Rainer Wittmann     }
708cdf0e10cSrcweir 
70969a74367SOliver-Rainer Wittmann     // bei PageDesc's, die am Node gesetzt werden, muss immer das
71069a74367SOliver-Rainer Wittmann     // Auto-Flag gesetzt werden!!
711cdf0e10cSrcweir     if( pOtherSet && pOtherSet->Count() )
71269a74367SOliver-Rainer Wittmann     {
71369a74367SOliver-Rainer Wittmann         SwTableNode* pTblNd;
71469a74367SOliver-Rainer Wittmann         const SwFmtPageDesc* pDesc;
715cdf0e10cSrcweir         if( SFX_ITEM_SET == pOtherSet->GetItemState( RES_PAGEDESC,
71669a74367SOliver-Rainer Wittmann                         sal_False, (const SfxPoolItem**)&pDesc ))
71769a74367SOliver-Rainer Wittmann         {
71869a74367SOliver-Rainer Wittmann             if( pNode )
71969a74367SOliver-Rainer Wittmann             {
72069a74367SOliver-Rainer Wittmann                 // Auto-Flag setzen, nur in Vorlagen ist ohne Auto !
72169a74367SOliver-Rainer Wittmann                 SwFmtPageDesc aNew( *pDesc );
72269a74367SOliver-Rainer Wittmann                 // Bug 38479: AutoFlag wird jetzt in der WrtShell gesetzt
72369a74367SOliver-Rainer Wittmann                 // aNew.SetAuto();
72469a74367SOliver-Rainer Wittmann 
72569a74367SOliver-Rainer Wittmann                 // Tabellen kennen jetzt auch Umbrueche
72669a74367SOliver-Rainer Wittmann                 if( 0 == (nFlags & nsSetAttrMode::SETATTR_APICALL) &&
72769a74367SOliver-Rainer Wittmann                     0 != ( pTblNd = pNode->FindTableNode() ) )
72869a74367SOliver-Rainer Wittmann                 {
729cdf0e10cSrcweir                     SwTableNode* pCurTblNd = pTblNd;
730cdf0e10cSrcweir                     while ( 0 != ( pCurTblNd = pCurTblNd->StartOfSectionNode()->FindTableNode() ) )
731cdf0e10cSrcweir                         pTblNd = pCurTblNd;
732cdf0e10cSrcweir 
73369a74367SOliver-Rainer Wittmann                     // dann am Tabellen Format setzen
73469a74367SOliver-Rainer Wittmann                     SwFrmFmt* pFmt = pTblNd->GetTable().GetFrmFmt();
73569a74367SOliver-Rainer Wittmann                     SwRegHistory aRegH( pFmt, *pTblNd, pHistory );
736cdf0e10cSrcweir                     pFmt->SetFmtAttr( aNew );
737cdf0e10cSrcweir                     bRet = true;
738cdf0e10cSrcweir                 }
739cdf0e10cSrcweir                 else
740cdf0e10cSrcweir                 {
741cdf0e10cSrcweir                     SwRegHistory aRegH( pNode, *pNode, pHistory );
742cdf0e10cSrcweir                     bRet = pNode->SetAttr( aNew ) || bRet;
743cdf0e10cSrcweir                 }
744cdf0e10cSrcweir             }
745cdf0e10cSrcweir 
746cdf0e10cSrcweir             // bOtherAttr = true means that pOtherSet == rChgSet. In this case
747cdf0e10cSrcweir             // we know, that there is only one attribute in pOtherSet. We cannot
748cdf0e10cSrcweir             // perform the following operations, instead we return:
749cdf0e10cSrcweir             if ( bOtherAttr )
750cdf0e10cSrcweir                 return bRet;
751cdf0e10cSrcweir 
752cdf0e10cSrcweir             const_cast<SfxItemSet*>(pOtherSet)->ClearItem( RES_PAGEDESC );
753cdf0e10cSrcweir             if( !pOtherSet->Count() )
754cdf0e10cSrcweir             {
755cdf0e10cSrcweir                 DELETECHARSETS
756cdf0e10cSrcweir                 return bRet;
757cdf0e10cSrcweir             }
758cdf0e10cSrcweir         }
759cdf0e10cSrcweir 
76069a74367SOliver-Rainer Wittmann         // Tabellen kennen jetzt auch Umbrueche
76169a74367SOliver-Rainer Wittmann         const SvxFmtBreakItem* pBreak;
76269a74367SOliver-Rainer Wittmann         if( pNode && 0 == (nFlags & nsSetAttrMode::SETATTR_APICALL) &&
76369a74367SOliver-Rainer Wittmann             0 != (pTblNd = pNode->FindTableNode() ) &&
764cdf0e10cSrcweir             SFX_ITEM_SET == pOtherSet->GetItemState( RES_BREAK,
76569a74367SOliver-Rainer Wittmann                         sal_False, (const SfxPoolItem**)&pBreak ) )
76669a74367SOliver-Rainer Wittmann         {
767cdf0e10cSrcweir             SwTableNode* pCurTblNd = pTblNd;
768cdf0e10cSrcweir             while ( 0 != ( pCurTblNd = pCurTblNd->StartOfSectionNode()->FindTableNode() ) )
769cdf0e10cSrcweir                 pTblNd = pCurTblNd;
770cdf0e10cSrcweir 
77169a74367SOliver-Rainer Wittmann             // dann am Tabellen Format setzen
77269a74367SOliver-Rainer Wittmann             SwFrmFmt* pFmt = pTblNd->GetTable().GetFrmFmt();
77369a74367SOliver-Rainer Wittmann             SwRegHistory aRegH( pFmt, *pTblNd, pHistory );
774cdf0e10cSrcweir             pFmt->SetFmtAttr( *pBreak );
775cdf0e10cSrcweir             bRet = true;
776cdf0e10cSrcweir 
777cdf0e10cSrcweir             // bOtherAttr = true means that pOtherSet == rChgSet. In this case
778cdf0e10cSrcweir             // we know, that there is only one attribute in pOtherSet. We cannot
779cdf0e10cSrcweir             // perform the following operations, instead we return:
780cdf0e10cSrcweir             if ( bOtherAttr )
781cdf0e10cSrcweir                 return bRet;
782cdf0e10cSrcweir 
783cdf0e10cSrcweir             const_cast<SfxItemSet*>(pOtherSet)->ClearItem( RES_BREAK );
784cdf0e10cSrcweir             if( !pOtherSet->Count() )
785cdf0e10cSrcweir             {
786cdf0e10cSrcweir                 DELETECHARSETS
787cdf0e10cSrcweir                 return bRet;
788cdf0e10cSrcweir             }
789cdf0e10cSrcweir         }
790cdf0e10cSrcweir 
79169a74367SOliver-Rainer Wittmann         {
79269a74367SOliver-Rainer Wittmann             // wenns eine PoolNumRule ist, diese ggfs. anlegen
79369a74367SOliver-Rainer Wittmann             const SwNumRuleItem* pRule;
79469a74367SOliver-Rainer Wittmann             sal_uInt16 nPoolId;
795cdf0e10cSrcweir             if( SFX_ITEM_SET == pOtherSet->GetItemState( RES_PARATR_NUMRULE,
79669a74367SOliver-Rainer Wittmann                                 sal_False, (const SfxPoolItem**)&pRule ) &&
79769a74367SOliver-Rainer Wittmann                 !pDoc->FindNumRulePtr( pRule->GetValue() ) &&
79869a74367SOliver-Rainer Wittmann                 USHRT_MAX != (nPoolId = SwStyleNameMapper::GetPoolIdFromUIName ( pRule->GetValue(),
79969a74367SOliver-Rainer Wittmann                                 nsSwGetPoolIdFromName::GET_POOLID_NUMRULE )) )
80069a74367SOliver-Rainer Wittmann                 pDoc->GetNumRuleFromPool( nPoolId );
80169a74367SOliver-Rainer Wittmann         }
802cdf0e10cSrcweir 
80369a74367SOliver-Rainer Wittmann     }
804cdf0e10cSrcweir 
80569a74367SOliver-Rainer Wittmann     if( !rRg.HasMark() )		// kein Bereich
80669a74367SOliver-Rainer Wittmann     {
80769a74367SOliver-Rainer Wittmann         if( !pNode )
808cdf0e10cSrcweir         {
809cdf0e10cSrcweir             DELETECHARSETS
81069a74367SOliver-Rainer Wittmann             return bRet;
811cdf0e10cSrcweir         }
812cdf0e10cSrcweir 
813cdf0e10cSrcweir         if( pNode->IsTxtNode() && pCharSet && pCharSet->Count() )
814cdf0e10cSrcweir         {
815cdf0e10cSrcweir             SwTxtNode* pTxtNd = static_cast<SwTxtNode*>(pNode);
81669a74367SOliver-Rainer Wittmann             const SwIndex& rSt = pStt->nContent;
81769a74367SOliver-Rainer Wittmann             sal_uInt16 nMkPos, nPtPos = rSt.GetIndex();
81869a74367SOliver-Rainer Wittmann             const String& rStr = pTxtNd->GetTxt();
819cdf0e10cSrcweir 
82069a74367SOliver-Rainer Wittmann             // JP 22.08.96: Sonderfall: steht der Crsr in einem URL-Attribut
82169a74367SOliver-Rainer Wittmann             //				dann wird dessen Bereich genommen
822cdf0e10cSrcweir             SwTxtAttr const*const pURLAttr(
823cdf0e10cSrcweir                 pTxtNd->GetTxtAttrAt(rSt.GetIndex(), RES_TXTATR_INETFMT));
824cdf0e10cSrcweir             if (pURLAttr && pURLAttr->GetINetFmt().GetValue().Len())
82569a74367SOliver-Rainer Wittmann             {
82669a74367SOliver-Rainer Wittmann                 nMkPos = *pURLAttr->GetStart();
82769a74367SOliver-Rainer Wittmann                 nPtPos = *pURLAttr->End();
82869a74367SOliver-Rainer Wittmann             }
82969a74367SOliver-Rainer Wittmann             else
83069a74367SOliver-Rainer Wittmann             {
83169a74367SOliver-Rainer Wittmann                 Boundary aBndry;
83269a74367SOliver-Rainer Wittmann                 if( pBreakIt->GetBreakIter().is() )
83369a74367SOliver-Rainer Wittmann                     aBndry = pBreakIt->GetBreakIter()->getWordBoundary(
83469a74367SOliver-Rainer Wittmann                                 pTxtNd->GetTxt(), nPtPos,
83569a74367SOliver-Rainer Wittmann                                 pBreakIt->GetLocale( pTxtNd->GetLang( nPtPos ) ),
83669a74367SOliver-Rainer Wittmann                                 WordType::ANY_WORD /*ANYWORD_IGNOREWHITESPACES*/,
83769a74367SOliver-Rainer Wittmann                                 sal_True );
83869a74367SOliver-Rainer Wittmann 
83969a74367SOliver-Rainer Wittmann                 if( aBndry.startPos < nPtPos && nPtPos < aBndry.endPos )
84069a74367SOliver-Rainer Wittmann                 {
84169a74367SOliver-Rainer Wittmann                     nMkPos = (xub_StrLen)aBndry.startPos;
84269a74367SOliver-Rainer Wittmann                     nPtPos = (xub_StrLen)aBndry.endPos;
84369a74367SOliver-Rainer Wittmann                 }
84469a74367SOliver-Rainer Wittmann                 else
84569a74367SOliver-Rainer Wittmann                     nPtPos = nMkPos = rSt.GetIndex();
84669a74367SOliver-Rainer Wittmann             }
847cdf0e10cSrcweir 
84869a74367SOliver-Rainer Wittmann             // erstmal die zu ueberschreibenden Attribute aus dem
84969a74367SOliver-Rainer Wittmann             // SwpHintsArray entfernen, wenn die Selektion den gesamten
85069a74367SOliver-Rainer Wittmann             // Absatz umspannt. (Diese Attribute werden als FormatAttr.
85169a74367SOliver-Rainer Wittmann             // eingefuegt und verdraengen nie die TextAttr.!)
85269a74367SOliver-Rainer Wittmann             if( !(nFlags & nsSetAttrMode::SETATTR_DONTREPLACE ) &&
85369a74367SOliver-Rainer Wittmann                 pTxtNd->HasHints() && !nMkPos && nPtPos == rStr.Len() )
85469a74367SOliver-Rainer Wittmann             {
85569a74367SOliver-Rainer Wittmann                 SwIndex aSt( pTxtNd );
85669a74367SOliver-Rainer Wittmann                 if( pHistory )
85769a74367SOliver-Rainer Wittmann                 {
85869a74367SOliver-Rainer Wittmann                     // fuers Undo alle Attribute sichern
85969a74367SOliver-Rainer Wittmann                     SwRegHistory aRHst( *pTxtNd, pHistory );
86069a74367SOliver-Rainer Wittmann                     pTxtNd->GetpSwpHints()->Register( &aRHst );
86169a74367SOliver-Rainer Wittmann                     pTxtNd->RstTxtAttr( aSt, nPtPos, 0, pCharSet );
86269a74367SOliver-Rainer Wittmann                     if( pTxtNd->GetpSwpHints() )
86369a74367SOliver-Rainer Wittmann                         pTxtNd->GetpSwpHints()->DeRegister();
86469a74367SOliver-Rainer Wittmann                 }
865cdf0e10cSrcweir                 else
86669a74367SOliver-Rainer Wittmann                     pTxtNd->RstTxtAttr( aSt, nPtPos, 0, pCharSet );
86769a74367SOliver-Rainer Wittmann             }
868cdf0e10cSrcweir 
869cdf0e10cSrcweir             // the SwRegHistory inserts the attribute into the TxtNode!
870cdf0e10cSrcweir             SwRegHistory history( pNode, *pNode, pHistory );
871cdf0e10cSrcweir             bRet = history.InsertItems( *pCharSet, nMkPos, nPtPos, nFlags )
872cdf0e10cSrcweir                 || bRet;
873cdf0e10cSrcweir 
87469a74367SOliver-Rainer Wittmann             if( pDoc->IsRedlineOn() )
87569a74367SOliver-Rainer Wittmann             {
87669a74367SOliver-Rainer Wittmann                 SwPaM aPam( *pNode, nMkPos, *pNode, nPtPos );
877cdf0e10cSrcweir 
87869a74367SOliver-Rainer Wittmann                 if( pUndo )
87969a74367SOliver-Rainer Wittmann                     pUndo->SaveRedlineData( aPam, sal_False );
88069a74367SOliver-Rainer Wittmann                 pDoc->AppendRedline( new SwRedline( nsRedlineType_t::REDLINE_FORMAT, aPam ), true);
88169a74367SOliver-Rainer Wittmann             }
88269a74367SOliver-Rainer Wittmann         }
883cdf0e10cSrcweir         if( pOtherSet && pOtherSet->Count() )
88469a74367SOliver-Rainer Wittmann         {
88569a74367SOliver-Rainer Wittmann             SwRegHistory aRegH( pNode, *pNode, pHistory );
886cdf0e10cSrcweir             bRet = pNode->SetAttr( *pOtherSet ) || bRet;
887cdf0e10cSrcweir         }
888cdf0e10cSrcweir 
889cdf0e10cSrcweir         DELETECHARSETS
89069a74367SOliver-Rainer Wittmann         return bRet;
89169a74367SOliver-Rainer Wittmann     }
892cdf0e10cSrcweir 
893cdf0e10cSrcweir     if( pDoc->IsRedlineOn() && pCharSet && pCharSet->Count() )
89469a74367SOliver-Rainer Wittmann     {
89569a74367SOliver-Rainer Wittmann         if( pUndo )
89669a74367SOliver-Rainer Wittmann             pUndo->SaveRedlineData( rRg, sal_False );
89769a74367SOliver-Rainer Wittmann         pDoc->AppendRedline( new SwRedline( nsRedlineType_t::REDLINE_FORMAT, rRg ), true);
89869a74367SOliver-Rainer Wittmann     }
899cdf0e10cSrcweir 
90069a74367SOliver-Rainer Wittmann     /* jetzt wenn Bereich */
90169a74367SOliver-Rainer Wittmann     sal_uLong nNodes = 0;
902cdf0e10cSrcweir 
90369a74367SOliver-Rainer Wittmann     SwNodeIndex aSt( pDoc->GetNodes() );
90469a74367SOliver-Rainer Wittmann     SwNodeIndex aEnd( pDoc->GetNodes() );
90569a74367SOliver-Rainer Wittmann     SwIndex aCntEnd( pEnd->nContent );
906cdf0e10cSrcweir 
90769a74367SOliver-Rainer Wittmann     if( pNode )
90869a74367SOliver-Rainer Wittmann     {
90969a74367SOliver-Rainer Wittmann         sal_uInt16 nLen = pNode->Len();
91069a74367SOliver-Rainer Wittmann         if( pStt->nNode != pEnd->nNode )
91169a74367SOliver-Rainer Wittmann             aCntEnd.Assign( pNode, nLen );
912cdf0e10cSrcweir 
91369a74367SOliver-Rainer Wittmann         if( pStt->nContent.GetIndex() != 0 || aCntEnd.GetIndex() != nLen )
914cdf0e10cSrcweir         {
915cdf0e10cSrcweir             // the SwRegHistory inserts the attribute into the TxtNode!
916cdf0e10cSrcweir             if( pNode->IsTxtNode() && pCharSet && pCharSet->Count() )
917cdf0e10cSrcweir             {
918cdf0e10cSrcweir                 SwRegHistory history( pNode, *pNode, pHistory );
919cdf0e10cSrcweir                 bRet = history.InsertItems(*pCharSet,
920cdf0e10cSrcweir                         pStt->nContent.GetIndex(), aCntEnd.GetIndex(), nFlags)
921cdf0e10cSrcweir                     || bRet;
922cdf0e10cSrcweir             }
923cdf0e10cSrcweir 
924cdf0e10cSrcweir             if( pOtherSet && pOtherSet->Count() )
92569a74367SOliver-Rainer Wittmann             {
92669a74367SOliver-Rainer Wittmann                 SwRegHistory aRegH( pNode, *pNode, pHistory );
927cdf0e10cSrcweir                 bRet = pNode->SetAttr( *pOtherSet ) || bRet;
928cdf0e10cSrcweir             }
929cdf0e10cSrcweir 
93069a74367SOliver-Rainer Wittmann             // lediglich Selektion in einem Node.
93169a74367SOliver-Rainer Wittmann             if( pStt->nNode == pEnd->nNode )
932cdf0e10cSrcweir             {
93369a74367SOliver-Rainer Wittmann             //Modify here for #119405, by easyfan, 2012-05-24
93469a74367SOliver-Rainer Wittmann             //The data parameter flag: bExpandCharToPara, comes from the data member of SwDoc,
93569a74367SOliver-Rainer Wittmann             //Which is set in SW MS word Binary filter WW8ImplRreader. With this flag on, means that
93669a74367SOliver-Rainer Wittmann             //current setting attribute set is a character range properties set and comes from a MS word
93769a74367SOliver-Rainer Wittmann             //binary file, And the setting range include a paragraph end position (0X0D);
93869a74367SOliver-Rainer Wittmann             //More specifications, as such property inside the character range properties set recorded in
93969a74367SOliver-Rainer Wittmann             //MS word binary file are dealed and inserted into data model (SwDoc) one by one, so we
94069a74367SOliver-Rainer Wittmann             //only dealing the scenario that the char properties set with 1 item inside;
94169a74367SOliver-Rainer Wittmann 
94269a74367SOliver-Rainer Wittmann                     if (bExpandCharToPara && pCharSet && pCharSet->Count() ==1 )
94369a74367SOliver-Rainer Wittmann             {
94469a74367SOliver-Rainer Wittmann                 SwTxtNode* pCurrentNd = pStt->nNode.GetNode().GetTxtNode();
94569a74367SOliver-Rainer Wittmann 
94669a74367SOliver-Rainer Wittmann                 if (pCurrentNd)
94769a74367SOliver-Rainer Wittmann                 {
94869a74367SOliver-Rainer Wittmann                     pCurrentNd->TryCharSetExpandToNum(*pCharSet);
94969a74367SOliver-Rainer Wittmann 
95069a74367SOliver-Rainer Wittmann                 }
95169a74367SOliver-Rainer Wittmann             }
95269a74367SOliver-Rainer Wittmann             //End of modification, by easyfan
953cdf0e10cSrcweir                 DELETECHARSETS
954cdf0e10cSrcweir                 return bRet;
955cdf0e10cSrcweir             }
95669a74367SOliver-Rainer Wittmann             ++nNodes;
95769a74367SOliver-Rainer Wittmann             aSt.Assign( pStt->nNode.GetNode(), +1 );
95869a74367SOliver-Rainer Wittmann         }
95969a74367SOliver-Rainer Wittmann         else
96069a74367SOliver-Rainer Wittmann             aSt = pStt->nNode;
96169a74367SOliver-Rainer Wittmann         aCntEnd = pEnd->nContent; // aEnd wurde veraendert !!
96269a74367SOliver-Rainer Wittmann     }
96369a74367SOliver-Rainer Wittmann     else
96469a74367SOliver-Rainer Wittmann         aSt.Assign( pStt->nNode.GetNode(), +1 );
965cdf0e10cSrcweir 
96669a74367SOliver-Rainer Wittmann     // aSt zeigt jetzt auf den ersten vollen Node
967cdf0e10cSrcweir 
96869a74367SOliver-Rainer Wittmann     /*
96969a74367SOliver-Rainer Wittmann      * die Selektion umfasst mehr als einen Node
97069a74367SOliver-Rainer Wittmann      */
97169a74367SOliver-Rainer Wittmann     if( pStt->nNode < pEnd->nNode )
97269a74367SOliver-Rainer Wittmann     {
97369a74367SOliver-Rainer Wittmann         pNode = pEnd->nNode.GetNode().GetCntntNode();
97469a74367SOliver-Rainer Wittmann         if(pNode)
97569a74367SOliver-Rainer Wittmann         {
97669a74367SOliver-Rainer Wittmann             sal_uInt16 nLen = pNode->Len();
97769a74367SOliver-Rainer Wittmann             if( aCntEnd.GetIndex() != nLen )
978cdf0e10cSrcweir             {
979cdf0e10cSrcweir                 // the SwRegHistory inserts the attribute into the TxtNode!
980cdf0e10cSrcweir                 if( pNode->IsTxtNode() && pCharSet && pCharSet->Count() )
981cdf0e10cSrcweir                 {
982cdf0e10cSrcweir                     SwRegHistory history( pNode, *pNode, pHistory );
983cdf0e10cSrcweir                     history.InsertItems(*pCharSet,
984cdf0e10cSrcweir                             0, aCntEnd.GetIndex(), nFlags);
985cdf0e10cSrcweir                 }
986cdf0e10cSrcweir 
987cdf0e10cSrcweir                 if( pOtherSet && pOtherSet->Count() )
98869a74367SOliver-Rainer Wittmann                 {
98969a74367SOliver-Rainer Wittmann                     SwRegHistory aRegH( pNode, *pNode, pHistory );
990cdf0e10cSrcweir                     pNode->SetAttr( *pOtherSet );
99169a74367SOliver-Rainer Wittmann                 }
992cdf0e10cSrcweir 
99369a74367SOliver-Rainer Wittmann                 ++nNodes;
99469a74367SOliver-Rainer Wittmann                 aEnd = pEnd->nNode;
99569a74367SOliver-Rainer Wittmann             }
99669a74367SOliver-Rainer Wittmann             else
99769a74367SOliver-Rainer Wittmann                 aEnd.Assign( pEnd->nNode.GetNode(), +1 );
99869a74367SOliver-Rainer Wittmann         }
99969a74367SOliver-Rainer Wittmann         else
100069a74367SOliver-Rainer Wittmann             aEnd = pEnd->nNode;
100169a74367SOliver-Rainer Wittmann     }
100269a74367SOliver-Rainer Wittmann     else
100369a74367SOliver-Rainer Wittmann         aEnd.Assign( pEnd->nNode.GetNode(), +1 );
1004cdf0e10cSrcweir 
100569a74367SOliver-Rainer Wittmann     // aEnd zeigt jetzt HINTER den letzten voll Node
1006cdf0e10cSrcweir 
100769a74367SOliver-Rainer Wittmann     /* Bearbeitung der vollstaendig selektierten Nodes. */
1008cdf0e10cSrcweir // alle Attribute aus dem Set zuruecksetzen !!
1009cdf0e10cSrcweir     if( pCharSet && pCharSet->Count() && !( nsSetAttrMode::SETATTR_DONTREPLACE & nFlags ) )
101069a74367SOliver-Rainer Wittmann     {
1011cdf0e10cSrcweir 
1012cdf0e10cSrcweir         ParaRstFmt aPara( pStt, pEnd, pHistory, 0, pCharSet );
101369a74367SOliver-Rainer Wittmann         pDoc->GetNodes().ForEach( aSt, aEnd, lcl_RstTxtAttr, &aPara );
101469a74367SOliver-Rainer Wittmann     }
1015cdf0e10cSrcweir 
1016cdf0e10cSrcweir     sal_Bool bCreateSwpHints = pCharSet && (
1017cdf0e10cSrcweir         SFX_ITEM_SET == pCharSet->GetItemState( RES_TXTATR_CHARFMT, sal_False ) ||
1018cdf0e10cSrcweir         SFX_ITEM_SET == pCharSet->GetItemState( RES_TXTATR_INETFMT, sal_False ) );
1019cdf0e10cSrcweir 
102069a74367SOliver-Rainer Wittmann     for(; aSt < aEnd; aSt++ )
102169a74367SOliver-Rainer Wittmann     {
102269a74367SOliver-Rainer Wittmann         pNode = aSt.GetNode().GetCntntNode();
102369a74367SOliver-Rainer Wittmann         if( !pNode )
102469a74367SOliver-Rainer Wittmann             continue;
1025cdf0e10cSrcweir 
102669a74367SOliver-Rainer Wittmann         SwTxtNode* pTNd = pNode->GetTxtNode();
102769a74367SOliver-Rainer Wittmann         if( pHistory )
102869a74367SOliver-Rainer Wittmann         {
102969a74367SOliver-Rainer Wittmann             SwRegHistory aRegH( pNode, *pNode, pHistory );
103069a74367SOliver-Rainer Wittmann             SwpHints *pSwpHints;
1031cdf0e10cSrcweir 
1032cdf0e10cSrcweir             if( pTNd && pCharSet && pCharSet->Count() )
103369a74367SOliver-Rainer Wittmann             {
103469a74367SOliver-Rainer Wittmann                 pSwpHints = bCreateSwpHints ? &pTNd->GetOrCreateSwpHints()
103569a74367SOliver-Rainer Wittmann                                             : pTNd->GetpSwpHints();
103669a74367SOliver-Rainer Wittmann                 if( pSwpHints )
103769a74367SOliver-Rainer Wittmann                     pSwpHints->Register( &aRegH );
1038cdf0e10cSrcweir 
1039cdf0e10cSrcweir                 pTNd->SetAttr( *pCharSet, 0, pTNd->GetTxt().Len(), nFlags );
104069a74367SOliver-Rainer Wittmann                 if( pSwpHints )
104169a74367SOliver-Rainer Wittmann                     pSwpHints->DeRegister();
104269a74367SOliver-Rainer Wittmann             }
1043cdf0e10cSrcweir             if( pOtherSet && pOtherSet->Count() )
1044cdf0e10cSrcweir                 pNode->SetAttr( *pOtherSet );
104569a74367SOliver-Rainer Wittmann         }
104669a74367SOliver-Rainer Wittmann         else
104769a74367SOliver-Rainer Wittmann         {
1048cdf0e10cSrcweir             if( pTNd && pCharSet && pCharSet->Count() )
1049cdf0e10cSrcweir                 pTNd->SetAttr( *pCharSet, 0, pTNd->GetTxt().Len(), nFlags );
1050cdf0e10cSrcweir             if( pOtherSet && pOtherSet->Count() )
1051cdf0e10cSrcweir                 pNode->SetAttr( *pOtherSet );
105269a74367SOliver-Rainer Wittmann         }
105369a74367SOliver-Rainer Wittmann         ++nNodes;
105469a74367SOliver-Rainer Wittmann     }
1055cdf0e10cSrcweir 
105669a74367SOliver-Rainer Wittmann     //The data parameter flag: bExpandCharToPara, comes from the data member of SwDoc,
105769a74367SOliver-Rainer Wittmann     //Which is set in SW MS word Binary filter WW8ImplRreader. With this flag on, means that
105869a74367SOliver-Rainer Wittmann     //current setting attribute set is a character range properties set and comes from a MS word
105969a74367SOliver-Rainer Wittmann     //binary file, And the setting range include a paragraph end position (0X0D);
106069a74367SOliver-Rainer Wittmann     //More specifications, as such property inside the character range properties set recorded in
106169a74367SOliver-Rainer Wittmann     //MS word binary file are dealed and inserted into data model (SwDoc) one by one, so we
106269a74367SOliver-Rainer Wittmann     //only dealing the scenario that the char properties set with 1 item inside;
106369a74367SOliver-Rainer Wittmann     if (bExpandCharToPara && pCharSet && pCharSet->Count() ==1)
106469a74367SOliver-Rainer Wittmann     {
106569a74367SOliver-Rainer Wittmann         SwPosition aStartPos (*rRg.Start());
106669a74367SOliver-Rainer Wittmann         SwPosition aEndPos (*rRg.End());
1067abbaf3ecSJian Hong Cheng 
106869a74367SOliver-Rainer Wittmann         if (aEndPos.nNode.GetNode().GetTxtNode() && aEndPos.nContent != aEndPos.nNode.GetNode().GetTxtNode()->Len())
106969a74367SOliver-Rainer Wittmann             aEndPos.nNode--;
1070abbaf3ecSJian Hong Cheng 
107169a74367SOliver-Rainer Wittmann         for (;aStartPos<=aEndPos;aStartPos.nNode++)
107269a74367SOliver-Rainer Wittmann         {
107369a74367SOliver-Rainer Wittmann             SwTxtNode* pCurrentNd = aStartPos.nNode.GetNode().GetTxtNode();
107469a74367SOliver-Rainer Wittmann 
107569a74367SOliver-Rainer Wittmann             if (pCurrentNd)
107669a74367SOliver-Rainer Wittmann             {
107769a74367SOliver-Rainer Wittmann                 pCurrentNd->TryCharSetExpandToNum(*pCharSet);
107869a74367SOliver-Rainer Wittmann 
107969a74367SOliver-Rainer Wittmann             }
108069a74367SOliver-Rainer Wittmann 
108169a74367SOliver-Rainer Wittmann         }
108269a74367SOliver-Rainer Wittmann     }
1083abbaf3ecSJian Hong Cheng 
1084cdf0e10cSrcweir     DELETECHARSETS
1085cdf0e10cSrcweir     return (nNodes != 0) || bRet;
1086cdf0e10cSrcweir }
1087cdf0e10cSrcweir 
InsertPoolItem(const SwPaM & rRg,const SfxPoolItem & rHt,const SetAttrMode nFlags,const bool bExpandCharToPara)108869a74367SOliver-Rainer Wittmann bool SwDoc::InsertPoolItem(
108969a74367SOliver-Rainer Wittmann     const SwPaM &rRg,
109069a74367SOliver-Rainer Wittmann     const SfxPoolItem &rHt,
109169a74367SOliver-Rainer Wittmann     const SetAttrMode nFlags,
109269a74367SOliver-Rainer Wittmann     const bool bExpandCharToPara)
1093cdf0e10cSrcweir {
109469a74367SOliver-Rainer Wittmann     SwDataChanged aTmp( rRg, 0 );
109569a74367SOliver-Rainer Wittmann     SwUndoAttr* pUndoAttr = 0;
1096cdf0e10cSrcweir     if (GetIDocumentUndoRedo().DoesUndo())
1097cdf0e10cSrcweir     {
1098cdf0e10cSrcweir         GetIDocumentUndoRedo().ClearRedo();
109969a74367SOliver-Rainer Wittmann         pUndoAttr = new SwUndoAttr( rRg, rHt, nFlags );
110069a74367SOliver-Rainer Wittmann     }
1101cdf0e10cSrcweir 
110269a74367SOliver-Rainer Wittmann     SfxItemSet aSet( GetAttrPool(), rHt.Which(), rHt.Which() );
110369a74367SOliver-Rainer Wittmann     aSet.Put( rHt );
110469a74367SOliver-Rainer Wittmann     const bool bRet = lcl_InsAttr( this, rRg, aSet, nFlags, pUndoAttr,bExpandCharToPara );
1105cdf0e10cSrcweir 
1106cdf0e10cSrcweir     if (GetIDocumentUndoRedo().DoesUndo())
1107cdf0e10cSrcweir     {
1108cdf0e10cSrcweir         GetIDocumentUndoRedo().AppendUndo( pUndoAttr );
1109cdf0e10cSrcweir     }
1110cdf0e10cSrcweir 
111169a74367SOliver-Rainer Wittmann     if( bRet )
111269a74367SOliver-Rainer Wittmann     {
111369a74367SOliver-Rainer Wittmann         SetModified();
111469a74367SOliver-Rainer Wittmann     }
111569a74367SOliver-Rainer Wittmann     return bRet;
1116cdf0e10cSrcweir }
1117cdf0e10cSrcweir 
InsertItemSet(const SwPaM & rRg,const SfxItemSet & rSet,const SetAttrMode nFlags)1118cdf0e10cSrcweir bool SwDoc::InsertItemSet ( const SwPaM &rRg, const SfxItemSet &rSet,
1119cdf0e10cSrcweir                             const SetAttrMode nFlags )
1120cdf0e10cSrcweir {
1121cdf0e10cSrcweir 	SwDataChanged aTmp( rRg, 0 );
1122cdf0e10cSrcweir 	SwUndoAttr* pUndoAttr = 0;
1123cdf0e10cSrcweir     if (GetIDocumentUndoRedo().DoesUndo())
1124cdf0e10cSrcweir     {
1125cdf0e10cSrcweir         GetIDocumentUndoRedo().ClearRedo();
1126cdf0e10cSrcweir         pUndoAttr = new SwUndoAttr( rRg, rSet, nFlags );
1127cdf0e10cSrcweir 	}
1128cdf0e10cSrcweir 
1129cdf0e10cSrcweir     bool bRet = lcl_InsAttr( this, rRg, rSet, nFlags, pUndoAttr );
1130cdf0e10cSrcweir 
1131cdf0e10cSrcweir     if (GetIDocumentUndoRedo().DoesUndo())
1132cdf0e10cSrcweir     {
1133cdf0e10cSrcweir         GetIDocumentUndoRedo().AppendUndo( pUndoAttr );
1134cdf0e10cSrcweir     }
1135cdf0e10cSrcweir 
1136cdf0e10cSrcweir 	if( bRet )
1137cdf0e10cSrcweir 		SetModified();
1138cdf0e10cSrcweir 	return bRet;
1139cdf0e10cSrcweir }
1140cdf0e10cSrcweir 
1141cdf0e10cSrcweir 
1142cdf0e10cSrcweir 	// Setze das Attribut im angegebenen Format. Ist Undo aktiv, wird
1143cdf0e10cSrcweir 	// das alte in die Undo-History aufgenommen
SetAttr(const SfxPoolItem & rAttr,SwFmt & rFmt)1144cdf0e10cSrcweir void SwDoc::SetAttr( const SfxPoolItem& rAttr, SwFmt& rFmt )
1145cdf0e10cSrcweir {
1146cdf0e10cSrcweir 	SfxItemSet aSet( GetAttrPool(), rAttr.Which(), rAttr.Which() );
1147cdf0e10cSrcweir 	aSet.Put( rAttr );
1148cdf0e10cSrcweir 	SetAttr( aSet, rFmt );
1149cdf0e10cSrcweir }
1150cdf0e10cSrcweir 
1151cdf0e10cSrcweir 
1152cdf0e10cSrcweir 	// Setze das Attribut im angegebenen Format. Ist Undo aktiv, wird
1153cdf0e10cSrcweir 	// das alte in die Undo-History aufgenommen
SetAttr(const SfxItemSet & rSet,SwFmt & rFmt)1154cdf0e10cSrcweir void SwDoc::SetAttr( const SfxItemSet& rSet, SwFmt& rFmt )
1155cdf0e10cSrcweir {
1156cdf0e10cSrcweir     if (GetIDocumentUndoRedo().DoesUndo())
1157cdf0e10cSrcweir     {
1158cdf0e10cSrcweir         SwUndoFmtAttrHelper aTmp( rFmt );
1159cdf0e10cSrcweir         rFmt.SetFmtAttr( rSet );
1160cdf0e10cSrcweir         if ( aTmp.GetUndo() )
1161cdf0e10cSrcweir         {
1162cdf0e10cSrcweir             GetIDocumentUndoRedo().AppendUndo( aTmp.ReleaseUndo() );
1163cdf0e10cSrcweir         }
1164cdf0e10cSrcweir         else
1165cdf0e10cSrcweir         {
1166cdf0e10cSrcweir             GetIDocumentUndoRedo().ClearRedo();
1167cdf0e10cSrcweir         }
1168cdf0e10cSrcweir     }
1169cdf0e10cSrcweir     else
1170cdf0e10cSrcweir     {
1171cdf0e10cSrcweir         rFmt.SetFmtAttr( rSet );
1172cdf0e10cSrcweir     }
1173cdf0e10cSrcweir 	SetModified();
1174cdf0e10cSrcweir }
1175cdf0e10cSrcweir 
1176cdf0e10cSrcweir // --> OD 2008-02-12 #newlistlevelattrs#
ResetAttrAtFormat(const sal_uInt16 nWhichId,SwFmt & rChangedFormat)1177cdf0e10cSrcweir void SwDoc::ResetAttrAtFormat( const sal_uInt16 nWhichId,
1178cdf0e10cSrcweir                                SwFmt& rChangedFormat )
1179cdf0e10cSrcweir {
1180cdf0e10cSrcweir     SwUndo *const pUndo = (GetIDocumentUndoRedo().DoesUndo())
1181cdf0e10cSrcweir         ?   new SwUndoFmtResetAttr( rChangedFormat, nWhichId )
1182cdf0e10cSrcweir         :   0;
1183cdf0e10cSrcweir 
1184cdf0e10cSrcweir     const sal_Bool bAttrReset = rChangedFormat.ResetFmtAttr( nWhichId );
1185cdf0e10cSrcweir 
1186cdf0e10cSrcweir     if ( bAttrReset )
1187cdf0e10cSrcweir     {
1188cdf0e10cSrcweir         if ( pUndo )
1189cdf0e10cSrcweir         {
1190cdf0e10cSrcweir             GetIDocumentUndoRedo().AppendUndo( pUndo );
1191cdf0e10cSrcweir         }
1192cdf0e10cSrcweir 
1193cdf0e10cSrcweir         SetModified();
1194cdf0e10cSrcweir     }
1195cdf0e10cSrcweir     else if ( pUndo )
1196cdf0e10cSrcweir         delete pUndo;
1197cdf0e10cSrcweir }
1198cdf0e10cSrcweir // <--
1199cdf0e10cSrcweir 
lcl_SetNewDefTabStops(SwTwips nOldWidth,SwTwips nNewWidth,SvxTabStopItem & rChgTabStop)1200cdf0e10cSrcweir int lcl_SetNewDefTabStops( SwTwips nOldWidth, SwTwips nNewWidth,
1201cdf0e10cSrcweir 								SvxTabStopItem& rChgTabStop )
1202cdf0e10cSrcweir {
1203cdf0e10cSrcweir 	// dann aender bei allen TabStop die default's auf den neuen Wert
1204cdf0e10cSrcweir 	// !!! Achtung: hier wird immer auf dem PoolAttribut gearbeitet,
1205cdf0e10cSrcweir 	// 				damit nicht in allen Sets die gleiche Berechnung
1206cdf0e10cSrcweir 	//				auf dem gleichen TabStop (gepoolt!) vorgenommen
1207cdf0e10cSrcweir 	//				wird. Als Modify wird ein FmtChg verschickt.
1208cdf0e10cSrcweir 
1209cdf0e10cSrcweir 	sal_uInt16 nOldCnt = rChgTabStop.Count();
1210cdf0e10cSrcweir 	if( !nOldCnt || nOldWidth == nNewWidth )
1211cdf0e10cSrcweir 		return sal_False;
1212cdf0e10cSrcweir 
1213cdf0e10cSrcweir 	// suche den Anfang der Defaults
1214cdf0e10cSrcweir 	SvxTabStop* pTabs = ((SvxTabStop*)rChgTabStop.GetStart())
1215cdf0e10cSrcweir 						+ (nOldCnt-1);
1216cdf0e10cSrcweir 	sal_uInt16 n;
1217cdf0e10cSrcweir 
1218cdf0e10cSrcweir 	for( n = nOldCnt; n ; --n, --pTabs )
1219cdf0e10cSrcweir 		if( SVX_TAB_ADJUST_DEFAULT != pTabs->GetAdjustment() )
1220cdf0e10cSrcweir 			break;
1221cdf0e10cSrcweir 	++n;
1222cdf0e10cSrcweir 	if( n < nOldCnt )	// die DefTabStops loeschen
1223cdf0e10cSrcweir 		rChgTabStop.Remove( n, nOldCnt - n );
1224cdf0e10cSrcweir 	return sal_True;
1225cdf0e10cSrcweir }
1226cdf0e10cSrcweir 
1227cdf0e10cSrcweir // Setze das Attribut als neues default Attribut in diesem Dokument.
1228cdf0e10cSrcweir // Ist Undo aktiv, wird das alte in die Undo-History aufgenommen
SetDefault(const SfxPoolItem & rAttr)1229cdf0e10cSrcweir void SwDoc::SetDefault( const SfxPoolItem& rAttr )
1230cdf0e10cSrcweir {
1231cdf0e10cSrcweir 	SfxItemSet aSet( GetAttrPool(), rAttr.Which(), rAttr.Which() );
1232cdf0e10cSrcweir 	aSet.Put( rAttr );
1233cdf0e10cSrcweir 	SetDefault( aSet );
1234cdf0e10cSrcweir }
1235cdf0e10cSrcweir 
SetDefault(const SfxItemSet & rSet)1236cdf0e10cSrcweir void SwDoc::SetDefault( const SfxItemSet& rSet )
1237cdf0e10cSrcweir {
1238cdf0e10cSrcweir 	if( !rSet.Count() )
1239cdf0e10cSrcweir 		return;
1240cdf0e10cSrcweir 
1241cdf0e10cSrcweir 	SwModify aCallMod( 0 );
1242cdf0e10cSrcweir 	SwAttrSet aOld( GetAttrPool(), rSet.GetRanges() ),
1243cdf0e10cSrcweir 			aNew( GetAttrPool(), rSet.GetRanges() );
1244cdf0e10cSrcweir 	SfxItemIter aIter( rSet );
1245cdf0e10cSrcweir 	sal_uInt16 nWhich;
1246cdf0e10cSrcweir 	const SfxPoolItem* pItem = aIter.GetCurItem();
1247cdf0e10cSrcweir 	SfxItemPool* pSdrPool = GetAttrPool().GetSecondaryPool();
1248cdf0e10cSrcweir 	while( sal_True )
1249cdf0e10cSrcweir 	{
1250cdf0e10cSrcweir 		sal_Bool bCheckSdrDflt = sal_False;
1251cdf0e10cSrcweir 		nWhich = pItem->Which();
1252cdf0e10cSrcweir 		aOld.Put( GetAttrPool().GetDefaultItem( nWhich ) );
1253cdf0e10cSrcweir 		GetAttrPool().SetPoolDefaultItem( *pItem );
1254cdf0e10cSrcweir 		aNew.Put( GetAttrPool().GetDefaultItem( nWhich ) );
1255cdf0e10cSrcweir 
1256cdf0e10cSrcweir         if (isCHRATR(nWhich) || isTXTATR(nWhich))
1257cdf0e10cSrcweir         {
1258cdf0e10cSrcweir 			aCallMod.Add( pDfltTxtFmtColl );
1259cdf0e10cSrcweir 			aCallMod.Add( pDfltCharFmt );
1260cdf0e10cSrcweir 			bCheckSdrDflt = 0 != pSdrPool;
1261cdf0e10cSrcweir         }
1262cdf0e10cSrcweir         else if ( isPARATR(nWhich) ||
1263cdf0e10cSrcweir                   // --> OD 2008-02-25 #refactorlists#
1264cdf0e10cSrcweir                   isPARATR_LIST(nWhich) )
1265cdf0e10cSrcweir                   // <--
1266cdf0e10cSrcweir         {
1267cdf0e10cSrcweir 			aCallMod.Add( pDfltTxtFmtColl );
1268cdf0e10cSrcweir 			bCheckSdrDflt = 0 != pSdrPool;
1269cdf0e10cSrcweir         }
1270cdf0e10cSrcweir         else if (isGRFATR(nWhich))
1271cdf0e10cSrcweir         {
1272cdf0e10cSrcweir             aCallMod.Add( pDfltGrfFmtColl );
1273cdf0e10cSrcweir         }
1274cdf0e10cSrcweir         else if (isFRMATR(nWhich))
1275cdf0e10cSrcweir         {
1276cdf0e10cSrcweir 			aCallMod.Add( pDfltGrfFmtColl );
1277cdf0e10cSrcweir 			aCallMod.Add( pDfltTxtFmtColl );
1278cdf0e10cSrcweir 			aCallMod.Add( pDfltFrmFmt );
1279cdf0e10cSrcweir         }
1280cdf0e10cSrcweir         else if (isBOXATR(nWhich))
1281cdf0e10cSrcweir         {
1282cdf0e10cSrcweir             aCallMod.Add( pDfltFrmFmt );
1283cdf0e10cSrcweir         }
1284cdf0e10cSrcweir 
1285cdf0e10cSrcweir 		// copy also the defaults
1286cdf0e10cSrcweir 		if( bCheckSdrDflt )
1287cdf0e10cSrcweir 		{
1288cdf0e10cSrcweir 			sal_uInt16 nEdtWhich, nSlotId;
1289cdf0e10cSrcweir 			if( 0 != (nSlotId = GetAttrPool().GetSlotId( nWhich ) ) &&
1290cdf0e10cSrcweir 				nSlotId != nWhich &&
1291cdf0e10cSrcweir 				0 != (nEdtWhich = pSdrPool->GetWhich( nSlotId )) &&
1292cdf0e10cSrcweir 				nSlotId != nEdtWhich )
1293cdf0e10cSrcweir 			{
1294cdf0e10cSrcweir 				SfxPoolItem* pCpy = pItem->Clone();
1295cdf0e10cSrcweir 				pCpy->SetWhich( nEdtWhich );
1296cdf0e10cSrcweir 				pSdrPool->SetPoolDefaultItem( *pCpy );
1297cdf0e10cSrcweir 				delete pCpy;
1298cdf0e10cSrcweir 			}
1299cdf0e10cSrcweir 		}
1300cdf0e10cSrcweir 
1301cdf0e10cSrcweir 		if( aIter.IsAtEnd() )
1302cdf0e10cSrcweir 			break;
1303cdf0e10cSrcweir 		pItem = aIter.NextItem();
1304cdf0e10cSrcweir 	}
1305cdf0e10cSrcweir 
1306cdf0e10cSrcweir 	if( aNew.Count() && aCallMod.GetDepends() )
1307cdf0e10cSrcweir     {
1308cdf0e10cSrcweir         if (GetIDocumentUndoRedo().DoesUndo())
1309cdf0e10cSrcweir         {
1310cdf0e10cSrcweir             GetIDocumentUndoRedo().AppendUndo( new SwUndoDefaultAttr( aOld ) );
1311cdf0e10cSrcweir         }
1312cdf0e10cSrcweir 
1313cdf0e10cSrcweir 		const SfxPoolItem* pTmpItem;
1314cdf0e10cSrcweir 		if( ( SFX_ITEM_SET ==
1315cdf0e10cSrcweir                 aNew.GetItemState( RES_PARATR_TABSTOP, sal_False, &pTmpItem ) ) &&
1316cdf0e10cSrcweir 			((SvxTabStopItem*)pTmpItem)->Count() )
1317cdf0e10cSrcweir 		{
1318cdf0e10cSrcweir 			// TabStop-Aenderungen behandeln wir erstmal anders:
1319cdf0e10cSrcweir 			// dann aender bei allen TabStop die dafault's auf den neuen Wert
1320cdf0e10cSrcweir 			// !!! Achtung: hier wird immer auf dem PoolAttribut gearbeitet,
1321cdf0e10cSrcweir 			// 				damit nicht in allen Sets die gleiche Berechnung
1322cdf0e10cSrcweir 			//				auf dem gleichen TabStop (gepoolt!) vorgenommen
1323cdf0e10cSrcweir 			//				wird. Als Modify wird ein FmtChg verschickt.
1324cdf0e10cSrcweir 			SwTwips nNewWidth = (*(SvxTabStopItem*)pTmpItem)[ 0 ].GetTabPos(),
1325cdf0e10cSrcweir 					nOldWidth = ((SvxTabStopItem&)aOld.Get(RES_PARATR_TABSTOP))[ 0 ].GetTabPos();
1326cdf0e10cSrcweir 
1327cdf0e10cSrcweir 			int bChg = sal_False;
1328cdf0e10cSrcweir 			sal_uInt32 nMaxItems = GetAttrPool().GetItemCount2( RES_PARATR_TABSTOP );
1329cdf0e10cSrcweir 			for( sal_uInt32 n = 0; n < nMaxItems; ++n )
1330cdf0e10cSrcweir 				if( 0 != (pTmpItem = GetAttrPool().GetItem2( RES_PARATR_TABSTOP, n ) ))
1331cdf0e10cSrcweir 					bChg |= lcl_SetNewDefTabStops( nOldWidth, nNewWidth,
1332cdf0e10cSrcweir 												*(SvxTabStopItem*)pTmpItem );
1333cdf0e10cSrcweir 
1334cdf0e10cSrcweir 			aNew.ClearItem( RES_PARATR_TABSTOP );
1335cdf0e10cSrcweir 			aOld.ClearItem( RES_PARATR_TABSTOP );
1336cdf0e10cSrcweir 			if( bChg )
1337cdf0e10cSrcweir 			{
1338cdf0e10cSrcweir 				SwFmtChg aChgFmt( pDfltCharFmt );
1339cdf0e10cSrcweir 				// dann sage mal den Frames bescheid
1340cdf0e10cSrcweir 				aCallMod.ModifyNotification( &aChgFmt, &aChgFmt );
1341cdf0e10cSrcweir 			}
1342cdf0e10cSrcweir 		}
1343cdf0e10cSrcweir 	}
1344cdf0e10cSrcweir 
1345cdf0e10cSrcweir 	if( aNew.Count() && aCallMod.GetDepends() )
1346cdf0e10cSrcweir 	{
1347cdf0e10cSrcweir 		SwAttrSetChg aChgOld( aOld, aOld );
1348cdf0e10cSrcweir 		SwAttrSetChg aChgNew( aNew, aNew );
1349cdf0e10cSrcweir 		aCallMod.ModifyNotification( &aChgOld, &aChgNew );		// alle veraenderten werden verschickt
1350cdf0e10cSrcweir 	}
1351cdf0e10cSrcweir 
1352cdf0e10cSrcweir 	// und die default-Formate wieder beim Object austragen
1353cdf0e10cSrcweir 	SwClient* pDep;
1354cdf0e10cSrcweir 	while( 0 != ( pDep = (SwClient*)aCallMod.GetDepends()) )
1355cdf0e10cSrcweir 		aCallMod.Remove( pDep );
1356cdf0e10cSrcweir 
1357cdf0e10cSrcweir 	SetModified();
1358cdf0e10cSrcweir }
1359cdf0e10cSrcweir 
1360cdf0e10cSrcweir 	// Erfrage das Default Attribut in diesem Dokument.
GetDefault(sal_uInt16 nFmtHint) const1361cdf0e10cSrcweir const SfxPoolItem& SwDoc::GetDefault( sal_uInt16 nFmtHint ) const
1362cdf0e10cSrcweir {
1363cdf0e10cSrcweir 	return GetAttrPool().GetDefaultItem( nFmtHint );
1364cdf0e10cSrcweir }
1365cdf0e10cSrcweir 
1366cdf0e10cSrcweir /*
1367cdf0e10cSrcweir  * Loeschen der Formate
1368cdf0e10cSrcweir  */
DelCharFmt(sal_uInt16 nFmt,sal_Bool bBroadcast)1369cdf0e10cSrcweir void SwDoc::DelCharFmt(sal_uInt16 nFmt, sal_Bool bBroadcast)
1370cdf0e10cSrcweir {
1371cdf0e10cSrcweir     SwCharFmt * pDel = (*pCharFmtTbl)[nFmt];
1372cdf0e10cSrcweir 
1373cdf0e10cSrcweir     if (bBroadcast)
1374cdf0e10cSrcweir         BroadcastStyleOperation(pDel->GetName(), SFX_STYLE_FAMILY_CHAR,
1375cdf0e10cSrcweir                                 SFX_STYLESHEET_ERASED);
1376cdf0e10cSrcweir 
1377cdf0e10cSrcweir     if (GetIDocumentUndoRedo().DoesUndo())
1378cdf0e10cSrcweir     {
1379cdf0e10cSrcweir         SwUndo * pUndo =
1380cdf0e10cSrcweir             new SwUndoCharFmtDelete(pDel, this);
1381cdf0e10cSrcweir 
1382cdf0e10cSrcweir         GetIDocumentUndoRedo().AppendUndo(pUndo);
1383cdf0e10cSrcweir     }
1384cdf0e10cSrcweir 
1385cdf0e10cSrcweir 	pCharFmtTbl->DeleteAndDestroy(nFmt);
1386cdf0e10cSrcweir 
1387cdf0e10cSrcweir 	SetModified();
1388cdf0e10cSrcweir }
1389cdf0e10cSrcweir 
DelCharFmt(SwCharFmt * pFmt,sal_Bool bBroadcast)1390cdf0e10cSrcweir void SwDoc::DelCharFmt( SwCharFmt *pFmt, sal_Bool bBroadcast )
1391cdf0e10cSrcweir {
1392cdf0e10cSrcweir 	sal_uInt16 nFmt = pCharFmtTbl->GetPos( pFmt );
1393cdf0e10cSrcweir 	ASSERT( USHRT_MAX != nFmt, "Fmt not found," );
1394cdf0e10cSrcweir 
1395cdf0e10cSrcweir 	DelCharFmt( nFmt, bBroadcast );
1396cdf0e10cSrcweir }
1397cdf0e10cSrcweir 
DelFrmFmt(SwFrmFmt * pFmt,sal_Bool bBroadcast)1398cdf0e10cSrcweir void SwDoc::DelFrmFmt( SwFrmFmt *pFmt, sal_Bool bBroadcast )
1399cdf0e10cSrcweir {
1400cdf0e10cSrcweir 	if( pFmt->ISA( SwTableBoxFmt ) || pFmt->ISA( SwTableLineFmt ))
1401cdf0e10cSrcweir 	{
1402cdf0e10cSrcweir 		ASSERT( !this, "Format steht nicht mehr im DocArray, "
1403cdf0e10cSrcweir 					   "kann per delete geloescht werden" );
1404cdf0e10cSrcweir 		delete pFmt;
1405cdf0e10cSrcweir 	}
1406cdf0e10cSrcweir 	else
1407cdf0e10cSrcweir 	{
1408cdf0e10cSrcweir 
1409cdf0e10cSrcweir 		//Das Format muss in einem der beiden Arrays stehen, in welchem
1410cdf0e10cSrcweir 		//werden wir schon merken.
1411cdf0e10cSrcweir 		sal_uInt16 nPos;
1412cdf0e10cSrcweir 		if ( USHRT_MAX != ( nPos = pFrmFmtTbl->GetPos( pFmt )) )
1413cdf0e10cSrcweir         {
1414cdf0e10cSrcweir             if (bBroadcast)
1415cdf0e10cSrcweir                 BroadcastStyleOperation(pFmt->GetName(),
1416cdf0e10cSrcweir                                         SFX_STYLE_FAMILY_FRAME,
1417cdf0e10cSrcweir                                         SFX_STYLESHEET_ERASED);
1418cdf0e10cSrcweir 
1419cdf0e10cSrcweir             if (GetIDocumentUndoRedo().DoesUndo())
1420cdf0e10cSrcweir             {
1421cdf0e10cSrcweir                 SwUndo * pUndo = new SwUndoFrmFmtDelete(pFmt, this);
1422cdf0e10cSrcweir 
1423cdf0e10cSrcweir                 GetIDocumentUndoRedo().AppendUndo(pUndo);
1424cdf0e10cSrcweir             }
1425cdf0e10cSrcweir 
1426cdf0e10cSrcweir 			pFrmFmtTbl->DeleteAndDestroy( nPos );
1427cdf0e10cSrcweir         }
1428cdf0e10cSrcweir 		else
1429cdf0e10cSrcweir 		{
1430cdf0e10cSrcweir 			nPos = GetSpzFrmFmts()->GetPos( pFmt );
1431cdf0e10cSrcweir 			ASSERT( nPos != USHRT_MAX, "FrmFmt not found." );
1432cdf0e10cSrcweir 			if( USHRT_MAX != nPos )
1433cdf0e10cSrcweir 				GetSpzFrmFmts()->DeleteAndDestroy( nPos );
1434cdf0e10cSrcweir 		}
1435cdf0e10cSrcweir 	}
1436cdf0e10cSrcweir }
1437cdf0e10cSrcweir 
DelTblFrmFmt(SwTableFmt * pFmt)1438cdf0e10cSrcweir void SwDoc::DelTblFrmFmt( SwTableFmt *pFmt )
1439cdf0e10cSrcweir {
1440cdf0e10cSrcweir 	sal_uInt16 nPos = pTblFrmFmtTbl->GetPos( pFmt );
1441cdf0e10cSrcweir 	ASSERT( USHRT_MAX != nPos, "Fmt not found," );
1442cdf0e10cSrcweir 	pTblFrmFmtTbl->DeleteAndDestroy( nPos );
1443cdf0e10cSrcweir }
1444cdf0e10cSrcweir 
1445cdf0e10cSrcweir /*
1446cdf0e10cSrcweir  * Erzeugen der Formate
1447cdf0e10cSrcweir  */
MakeFlyFrmFmt(const String & rFmtName,SwFrmFmt * pDerivedFrom)1448cdf0e10cSrcweir SwFlyFrmFmt *SwDoc::MakeFlyFrmFmt( const String &rFmtName,
1449cdf0e10cSrcweir 									SwFrmFmt *pDerivedFrom )
1450cdf0e10cSrcweir {
1451cdf0e10cSrcweir 	SwFlyFrmFmt *pFmt = new SwFlyFrmFmt( GetAttrPool(), rFmtName, pDerivedFrom );
1452cdf0e10cSrcweir 	GetSpzFrmFmts()->Insert(pFmt, GetSpzFrmFmts()->Count());
1453cdf0e10cSrcweir 	SetModified();
1454cdf0e10cSrcweir 	return pFmt;
1455cdf0e10cSrcweir }
1456cdf0e10cSrcweir 
MakeDrawFrmFmt(const String & rFmtName,SwFrmFmt * pDerivedFrom)1457cdf0e10cSrcweir SwDrawFrmFmt *SwDoc::MakeDrawFrmFmt( const String &rFmtName,
1458cdf0e10cSrcweir 									 SwFrmFmt *pDerivedFrom )
1459cdf0e10cSrcweir {
1460cdf0e10cSrcweir 	SwDrawFrmFmt *pFmt = new SwDrawFrmFmt( GetAttrPool(), rFmtName, pDerivedFrom);
1461cdf0e10cSrcweir 	GetSpzFrmFmts()->Insert(pFmt,GetSpzFrmFmts()->Count());
1462cdf0e10cSrcweir 	SetModified();
1463cdf0e10cSrcweir 	return pFmt;
1464cdf0e10cSrcweir }
1465cdf0e10cSrcweir 
1466cdf0e10cSrcweir 
GetTblFrmFmtCount(sal_Bool bUsed) const1467cdf0e10cSrcweir sal_uInt16 SwDoc::GetTblFrmFmtCount(sal_Bool bUsed) const
1468cdf0e10cSrcweir {
1469cdf0e10cSrcweir 	sal_uInt16 nCount = pTblFrmFmtTbl->Count();
1470cdf0e10cSrcweir 	if(bUsed)
1471cdf0e10cSrcweir 	{
1472cdf0e10cSrcweir         SwAutoFmtGetDocNode aGetHt( &GetNodes() );
1473cdf0e10cSrcweir 		for ( sal_uInt16 i = nCount; i; )
1474cdf0e10cSrcweir 		{
1475cdf0e10cSrcweir 			if((*pTblFrmFmtTbl)[--i]->GetInfo( aGetHt ))
1476cdf0e10cSrcweir 
1477cdf0e10cSrcweir 				--nCount;
1478cdf0e10cSrcweir 		}
1479cdf0e10cSrcweir 	}
1480cdf0e10cSrcweir 
1481cdf0e10cSrcweir 	return nCount;
1482cdf0e10cSrcweir }
1483cdf0e10cSrcweir 
1484cdf0e10cSrcweir 
GetTblFrmFmt(sal_uInt16 nFmt,sal_Bool bUsed) const1485cdf0e10cSrcweir SwFrmFmt& SwDoc::GetTblFrmFmt(sal_uInt16 nFmt, sal_Bool bUsed ) const
1486cdf0e10cSrcweir {
1487cdf0e10cSrcweir 	sal_uInt16 nRemoved = 0;
1488cdf0e10cSrcweir 	if(bUsed)
1489cdf0e10cSrcweir 	{
1490cdf0e10cSrcweir         SwAutoFmtGetDocNode aGetHt( &GetNodes() );
1491cdf0e10cSrcweir 		for ( sal_uInt16 i = 0; i <= nFmt; i++ )
1492cdf0e10cSrcweir 		{
1493cdf0e10cSrcweir 			while ( (*pTblFrmFmtTbl)[ i + nRemoved]->GetInfo( aGetHt ))
1494cdf0e10cSrcweir 			{
1495cdf0e10cSrcweir 				nRemoved++;
1496cdf0e10cSrcweir 			}
1497cdf0e10cSrcweir 		}
1498cdf0e10cSrcweir 	}
1499cdf0e10cSrcweir 	return *((*pTblFrmFmtTbl)[nRemoved + nFmt]);
1500cdf0e10cSrcweir }
1501cdf0e10cSrcweir 
MakeTblFrmFmt(const String & rFmtName,SwFrmFmt * pDerivedFrom)1502cdf0e10cSrcweir SwTableFmt* SwDoc::MakeTblFrmFmt( const String &rFmtName,
1503cdf0e10cSrcweir 									SwFrmFmt *pDerivedFrom )
1504cdf0e10cSrcweir {
1505cdf0e10cSrcweir 	SwTableFmt* pFmt = new SwTableFmt( GetAttrPool(), rFmtName, pDerivedFrom );
1506cdf0e10cSrcweir 	pTblFrmFmtTbl->Insert( pFmt, pTblFrmFmtTbl->Count() );
1507cdf0e10cSrcweir 	SetModified();
1508cdf0e10cSrcweir 
1509cdf0e10cSrcweir 	return pFmt;
1510cdf0e10cSrcweir }
1511cdf0e10cSrcweir 
MakeFrmFmt(const String & rFmtName,SwFrmFmt * pDerivedFrom,sal_Bool bBroadcast,sal_Bool bAuto)1512cdf0e10cSrcweir SwFrmFmt *SwDoc::MakeFrmFmt(const String &rFmtName,
1513cdf0e10cSrcweir 							SwFrmFmt *pDerivedFrom,
1514cdf0e10cSrcweir                             sal_Bool bBroadcast, sal_Bool bAuto)
1515cdf0e10cSrcweir {
1516cdf0e10cSrcweir 
1517cdf0e10cSrcweir 	SwFrmFmt *pFmt = new SwFrmFmt( GetAttrPool(), rFmtName, pDerivedFrom );
1518cdf0e10cSrcweir 
1519cdf0e10cSrcweir     pFmt->SetAuto(bAuto);
1520cdf0e10cSrcweir 	pFrmFmtTbl->Insert( pFmt, pFrmFmtTbl->Count());
1521cdf0e10cSrcweir 	SetModified();
1522cdf0e10cSrcweir 
1523cdf0e10cSrcweir     if (bBroadcast)
1524cdf0e10cSrcweir     {
1525cdf0e10cSrcweir         BroadcastStyleOperation(rFmtName, SFX_STYLE_FAMILY_PARA,
1526cdf0e10cSrcweir                                 SFX_STYLESHEET_CREATED);
1527cdf0e10cSrcweir 
1528cdf0e10cSrcweir         if (GetIDocumentUndoRedo().DoesUndo())
1529cdf0e10cSrcweir         {
1530cdf0e10cSrcweir             SwUndo * pUndo = new SwUndoFrmFmtCreate(pFmt, pDerivedFrom, this);
1531cdf0e10cSrcweir 
1532cdf0e10cSrcweir             GetIDocumentUndoRedo().AppendUndo(pUndo);
1533cdf0e10cSrcweir         }
1534cdf0e10cSrcweir     }
1535cdf0e10cSrcweir 
1536cdf0e10cSrcweir 	return pFmt;
1537cdf0e10cSrcweir }
1538cdf0e10cSrcweir 
_MakeFrmFmt(const String & rFmtName,SwFmt * pDerivedFrom,sal_Bool bBroadcast,sal_Bool bAuto)1539cdf0e10cSrcweir SwFmt *SwDoc::_MakeFrmFmt(const String &rFmtName,
1540cdf0e10cSrcweir 							SwFmt *pDerivedFrom,
1541cdf0e10cSrcweir                             sal_Bool bBroadcast, sal_Bool bAuto)
1542cdf0e10cSrcweir {
1543cdf0e10cSrcweir     SwFrmFmt *pFrmFmt = dynamic_cast<SwFrmFmt*>(pDerivedFrom);
1544cdf0e10cSrcweir     pFrmFmt = MakeFrmFmt( rFmtName, pFrmFmt, bBroadcast, bAuto );
1545cdf0e10cSrcweir     return dynamic_cast<SwFmt*>(pFrmFmt);
1546cdf0e10cSrcweir }
1547cdf0e10cSrcweir 
1548cdf0e10cSrcweir 
1549cdf0e10cSrcweir // --> OD 2005-01-13 #i40550# - add parameter <bAuto> - not relevant
MakeCharFmt(const String & rFmtName,SwCharFmt * pDerivedFrom,sal_Bool bBroadcast,sal_Bool)1550cdf0e10cSrcweir SwCharFmt *SwDoc::MakeCharFmt( const String &rFmtName,
1551cdf0e10cSrcweir                                SwCharFmt *pDerivedFrom,
1552cdf0e10cSrcweir                                sal_Bool bBroadcast,
1553cdf0e10cSrcweir                                sal_Bool )
1554cdf0e10cSrcweir // <--
1555cdf0e10cSrcweir {
1556cdf0e10cSrcweir 	SwCharFmt *pFmt = new SwCharFmt( GetAttrPool(), rFmtName, pDerivedFrom );
1557cdf0e10cSrcweir     pCharFmtTbl->Insert( pFmt, pCharFmtTbl->Count() );
1558cdf0e10cSrcweir     pFmt->SetAuto( sal_False );
1559cdf0e10cSrcweir     SetModified();
1560cdf0e10cSrcweir 
1561cdf0e10cSrcweir     if (GetIDocumentUndoRedo().DoesUndo())
1562cdf0e10cSrcweir     {
1563cdf0e10cSrcweir         SwUndo * pUndo = new SwUndoCharFmtCreate(pFmt, pDerivedFrom, this);
1564cdf0e10cSrcweir 
1565cdf0e10cSrcweir         GetIDocumentUndoRedo().AppendUndo(pUndo);
1566cdf0e10cSrcweir     }
1567cdf0e10cSrcweir 
1568cdf0e10cSrcweir     if (bBroadcast)
1569cdf0e10cSrcweir     {
1570cdf0e10cSrcweir         BroadcastStyleOperation(rFmtName, SFX_STYLE_FAMILY_CHAR,
1571cdf0e10cSrcweir                                 SFX_STYLESHEET_CREATED);
1572cdf0e10cSrcweir     }
1573cdf0e10cSrcweir 
1574cdf0e10cSrcweir 	return pFmt;
1575cdf0e10cSrcweir }
1576cdf0e10cSrcweir 
_MakeCharFmt(const String & rFmtName,SwFmt * pDerivedFrom,sal_Bool bBroadcast,sal_Bool bAuto)1577cdf0e10cSrcweir SwFmt *SwDoc::_MakeCharFmt(const String &rFmtName,
1578cdf0e10cSrcweir 							SwFmt *pDerivedFrom,
1579cdf0e10cSrcweir                             sal_Bool bBroadcast, sal_Bool bAuto)
1580cdf0e10cSrcweir {
1581cdf0e10cSrcweir     SwCharFmt *pCharFmt = dynamic_cast<SwCharFmt*>(pDerivedFrom);
1582cdf0e10cSrcweir     pCharFmt = MakeCharFmt( rFmtName, pCharFmt, bBroadcast, bAuto );
1583cdf0e10cSrcweir     return dynamic_cast<SwFmt*>(pCharFmt);
1584cdf0e10cSrcweir }
1585cdf0e10cSrcweir 
1586cdf0e10cSrcweir 
1587cdf0e10cSrcweir /*
1588cdf0e10cSrcweir  * Erzeugen der FormatCollections
1589cdf0e10cSrcweir  */
1590cdf0e10cSrcweir // TXT
1591cdf0e10cSrcweir // --> OD 2005-01-13 #i40550# - add parameter <bAuto> - not relevant
MakeTxtFmtColl(const String & rFmtName,SwTxtFmtColl * pDerivedFrom,sal_Bool bBroadcast,sal_Bool)1592cdf0e10cSrcweir SwTxtFmtColl* SwDoc::MakeTxtFmtColl( const String &rFmtName,
1593cdf0e10cSrcweir 									 SwTxtFmtColl *pDerivedFrom,
1594cdf0e10cSrcweir                                      sal_Bool bBroadcast,
1595cdf0e10cSrcweir                                      sal_Bool )
1596cdf0e10cSrcweir // <--
1597cdf0e10cSrcweir {
1598cdf0e10cSrcweir 	SwTxtFmtColl *pFmtColl = new SwTxtFmtColl( GetAttrPool(), rFmtName,
1599cdf0e10cSrcweir 												pDerivedFrom );
1600cdf0e10cSrcweir 	pTxtFmtCollTbl->Insert(pFmtColl, pTxtFmtCollTbl->Count());
1601cdf0e10cSrcweir 	pFmtColl->SetAuto( sal_False );
1602cdf0e10cSrcweir 	SetModified();
1603cdf0e10cSrcweir 
1604cdf0e10cSrcweir     if (GetIDocumentUndoRedo().DoesUndo())
1605cdf0e10cSrcweir     {
1606cdf0e10cSrcweir         SwUndo * pUndo = new SwUndoTxtFmtCollCreate(pFmtColl, pDerivedFrom,
1607cdf0e10cSrcweir                                                     this);
1608cdf0e10cSrcweir         GetIDocumentUndoRedo().AppendUndo(pUndo);
1609cdf0e10cSrcweir     }
1610cdf0e10cSrcweir 
1611cdf0e10cSrcweir     if (bBroadcast)
1612cdf0e10cSrcweir         BroadcastStyleOperation(rFmtName, SFX_STYLE_FAMILY_PARA,
1613cdf0e10cSrcweir                                 SFX_STYLESHEET_CREATED);
1614cdf0e10cSrcweir 
1615cdf0e10cSrcweir 	return pFmtColl;
1616cdf0e10cSrcweir }
1617cdf0e10cSrcweir 
_MakeTxtFmtColl(const String & rFmtName,SwFmt * pDerivedFrom,sal_Bool bBroadcast,sal_Bool bAuto)1618cdf0e10cSrcweir SwFmt *SwDoc::_MakeTxtFmtColl(const String &rFmtName,
1619cdf0e10cSrcweir 							SwFmt *pDerivedFrom,
1620cdf0e10cSrcweir                             sal_Bool bBroadcast, sal_Bool bAuto)
1621cdf0e10cSrcweir {
1622cdf0e10cSrcweir     SwTxtFmtColl *pTxtFmtColl = dynamic_cast<SwTxtFmtColl*>(pDerivedFrom);
1623cdf0e10cSrcweir     pTxtFmtColl = MakeTxtFmtColl( rFmtName, pTxtFmtColl, bBroadcast, bAuto );
1624cdf0e10cSrcweir     return dynamic_cast<SwFmt*>(pTxtFmtColl);
1625cdf0e10cSrcweir }
1626cdf0e10cSrcweir 
1627cdf0e10cSrcweir 
1628cdf0e10cSrcweir //FEATURE::CONDCOLL
MakeCondTxtFmtColl(const String & rFmtName,SwTxtFmtColl * pDerivedFrom,sal_Bool bBroadcast)1629cdf0e10cSrcweir SwConditionTxtFmtColl* SwDoc::MakeCondTxtFmtColl( const String &rFmtName,
1630cdf0e10cSrcweir                                                   SwTxtFmtColl *pDerivedFrom,
1631cdf0e10cSrcweir                                                   sal_Bool bBroadcast)
1632cdf0e10cSrcweir {
1633cdf0e10cSrcweir 	SwConditionTxtFmtColl*pFmtColl = new SwConditionTxtFmtColl( GetAttrPool(),
1634cdf0e10cSrcweir 													rFmtName, pDerivedFrom );
1635cdf0e10cSrcweir 	pTxtFmtCollTbl->Insert(pFmtColl, pTxtFmtCollTbl->Count());
1636cdf0e10cSrcweir 	pFmtColl->SetAuto( sal_False );
1637cdf0e10cSrcweir 	SetModified();
1638cdf0e10cSrcweir 
1639cdf0e10cSrcweir     if (bBroadcast)
1640cdf0e10cSrcweir         BroadcastStyleOperation(rFmtName, SFX_STYLE_FAMILY_PARA,
1641cdf0e10cSrcweir                                 SFX_STYLESHEET_CREATED);
1642cdf0e10cSrcweir 
1643cdf0e10cSrcweir 	return pFmtColl;
1644cdf0e10cSrcweir }
1645cdf0e10cSrcweir //FEATURE::CONDCOLL
1646cdf0e10cSrcweir 
1647cdf0e10cSrcweir // GRF
1648cdf0e10cSrcweir 
MakeGrfFmtColl(const String & rFmtName,SwGrfFmtColl * pDerivedFrom)1649cdf0e10cSrcweir SwGrfFmtColl* SwDoc::MakeGrfFmtColl( const String &rFmtName,
1650cdf0e10cSrcweir 									 SwGrfFmtColl *pDerivedFrom )
1651cdf0e10cSrcweir {
1652cdf0e10cSrcweir 	SwGrfFmtColl *pFmtColl = new SwGrfFmtColl( GetAttrPool(), rFmtName,
1653cdf0e10cSrcweir 												pDerivedFrom );
1654cdf0e10cSrcweir 	pGrfFmtCollTbl->Insert( pFmtColl, pGrfFmtCollTbl->Count() );
1655cdf0e10cSrcweir 	pFmtColl->SetAuto( sal_False );
1656cdf0e10cSrcweir 	SetModified();
1657cdf0e10cSrcweir 	return pFmtColl;
1658cdf0e10cSrcweir }
1659cdf0e10cSrcweir 
DelTxtFmtColl(sal_uInt16 nFmtColl,sal_Bool bBroadcast)1660cdf0e10cSrcweir void SwDoc::DelTxtFmtColl(sal_uInt16 nFmtColl, sal_Bool bBroadcast)
1661cdf0e10cSrcweir {
1662cdf0e10cSrcweir 	ASSERT( nFmtColl, "Remove fuer Coll 0." );
1663cdf0e10cSrcweir 
1664cdf0e10cSrcweir 	// Wer hat die zu loeschende als Next
1665cdf0e10cSrcweir 	SwTxtFmtColl *pDel = (*pTxtFmtCollTbl)[nFmtColl];
1666cdf0e10cSrcweir 	if( pDfltTxtFmtColl == pDel )
1667cdf0e10cSrcweir 		return;		// default nie loeschen !!
1668cdf0e10cSrcweir 
1669cdf0e10cSrcweir     if (bBroadcast)
1670cdf0e10cSrcweir         BroadcastStyleOperation(pDel->GetName(), SFX_STYLE_FAMILY_PARA,
1671cdf0e10cSrcweir                                 SFX_STYLESHEET_ERASED);
1672cdf0e10cSrcweir 
1673cdf0e10cSrcweir     if (GetIDocumentUndoRedo().DoesUndo())
1674cdf0e10cSrcweir     {
1675cdf0e10cSrcweir         SwUndoTxtFmtCollDelete * pUndo =
1676cdf0e10cSrcweir             new SwUndoTxtFmtCollDelete(pDel, this);
1677cdf0e10cSrcweir 
1678cdf0e10cSrcweir         GetIDocumentUndoRedo().AppendUndo(pUndo);
1679cdf0e10cSrcweir     }
1680cdf0e10cSrcweir 
1681cdf0e10cSrcweir 	// Die FmtColl austragen
1682cdf0e10cSrcweir 	pTxtFmtCollTbl->Remove(nFmtColl);
1683cdf0e10cSrcweir 	// Next korrigieren
1684cdf0e10cSrcweir 	pTxtFmtCollTbl->ForEach( 1, pTxtFmtCollTbl->Count(),
1685cdf0e10cSrcweir 							&SetTxtFmtCollNext, pDel );
1686cdf0e10cSrcweir 	delete pDel;
1687cdf0e10cSrcweir 	SetModified();
1688cdf0e10cSrcweir }
1689cdf0e10cSrcweir 
DelTxtFmtColl(SwTxtFmtColl * pColl,sal_Bool bBroadcast)1690cdf0e10cSrcweir void SwDoc::DelTxtFmtColl( SwTxtFmtColl *pColl, sal_Bool bBroadcast )
1691cdf0e10cSrcweir {
1692cdf0e10cSrcweir 	sal_uInt16 nFmt = pTxtFmtCollTbl->GetPos( pColl );
1693cdf0e10cSrcweir 	ASSERT( USHRT_MAX != nFmt, "Collection not found," );
1694cdf0e10cSrcweir 	DelTxtFmtColl( nFmt, bBroadcast );
1695cdf0e10cSrcweir }
1696cdf0e10cSrcweir 
lcl_SetTxtFmtColl(const SwNodePtr & rpNode,void * pArgs)1697cdf0e10cSrcweir sal_Bool lcl_SetTxtFmtColl( const SwNodePtr& rpNode, void* pArgs )
1698cdf0e10cSrcweir {
1699*808c4840SOliver-Rainer Wittmann     SwCntntNode* pCNd = (SwCntntNode*) rpNode->GetTxtNode();
1700*808c4840SOliver-Rainer Wittmann     if ( pCNd )
1701*808c4840SOliver-Rainer Wittmann     {
1702*808c4840SOliver-Rainer Wittmann         ParaRstFmt* pPara = (ParaRstFmt*) pArgs;
1703cdf0e10cSrcweir 
1704*808c4840SOliver-Rainer Wittmann         SwTxtFmtColl* pFmt = static_cast< SwTxtFmtColl* >( pPara->pFmtColl );
1705*808c4840SOliver-Rainer Wittmann         if ( pPara->bReset )
1706cdf0e10cSrcweir         {
1707cdf0e10cSrcweir 
1708*808c4840SOliver-Rainer Wittmann             lcl_RstAttr( pCNd, pPara );
1709cdf0e10cSrcweir 
1710cdf0e10cSrcweir             // check, if paragraph style has changed
1711cdf0e10cSrcweir             if ( pPara->bResetListAttrs &&
1712cdf0e10cSrcweir                  pFmt != pCNd->GetFmtColl() &&
1713cdf0e10cSrcweir                  pFmt->GetItemState( RES_PARATR_NUMRULE ) == SFX_ITEM_SET )
1714cdf0e10cSrcweir             {
1715cdf0e10cSrcweir                 // --> OD 2009-09-07 #b6876367#
1716cdf0e10cSrcweir                 // Check, if the list style of the paragraph will change.
1717cdf0e10cSrcweir                 bool bChangeOfListStyleAtParagraph( true );
1718cdf0e10cSrcweir                 SwTxtNode* pTNd( dynamic_cast<SwTxtNode*>(pCNd) );
1719cdf0e10cSrcweir                 ASSERT( pTNd,
1720cdf0e10cSrcweir                         "<lcl_SetTxtFmtColl(..)> - text node expected -> crash" );
1721cdf0e10cSrcweir                 {
1722cdf0e10cSrcweir                     SwNumRule* pNumRuleAtParagraph( pTNd->GetNumRule() );
1723cdf0e10cSrcweir                     if ( pNumRuleAtParagraph )
1724cdf0e10cSrcweir                     {
1725cdf0e10cSrcweir                         const SwNumRuleItem& rNumRuleItemAtParagraphStyle =
1726cdf0e10cSrcweir                                                             pFmt->GetNumRule();
1727cdf0e10cSrcweir                         if ( rNumRuleItemAtParagraphStyle.GetValue() ==
1728cdf0e10cSrcweir                                                 pNumRuleAtParagraph->GetName() )
1729cdf0e10cSrcweir                         {
1730cdf0e10cSrcweir                             bChangeOfListStyleAtParagraph = false;
1731cdf0e10cSrcweir                         }
1732cdf0e10cSrcweir                     }
1733cdf0e10cSrcweir                 }
1734cdf0e10cSrcweir 
1735cdf0e10cSrcweir                 if ( bChangeOfListStyleAtParagraph )
1736cdf0e10cSrcweir                 {
1737cdf0e10cSrcweir                     std::auto_ptr< SwRegHistory > pRegH;
1738cdf0e10cSrcweir                     if ( pPara->pHistory )
1739cdf0e10cSrcweir                     {
1740cdf0e10cSrcweir                         pRegH.reset( new SwRegHistory( pTNd, *pTNd, pPara->pHistory ) );
1741cdf0e10cSrcweir                     }
1742cdf0e10cSrcweir 
1743cdf0e10cSrcweir                     pCNd->ResetAttr( RES_PARATR_NUMRULE );
1744cdf0e10cSrcweir 
1745cdf0e10cSrcweir                     // reset all list attributes
1746cdf0e10cSrcweir                     pCNd->ResetAttr( RES_PARATR_LIST_LEVEL );
1747cdf0e10cSrcweir                     pCNd->ResetAttr( RES_PARATR_LIST_ISRESTART );
1748cdf0e10cSrcweir                     pCNd->ResetAttr( RES_PARATR_LIST_RESTARTVALUE );
1749cdf0e10cSrcweir                     pCNd->ResetAttr( RES_PARATR_LIST_ISCOUNTED );
1750cdf0e10cSrcweir                     pCNd->ResetAttr( RES_PARATR_LIST_ID );
1751cdf0e10cSrcweir                 }
1752cdf0e10cSrcweir             }
1753cdf0e10cSrcweir         }
1754cdf0e10cSrcweir 
1755cdf0e10cSrcweir         // erst in die History aufnehmen, damit ggfs. alte Daten
1756cdf0e10cSrcweir 		// gesichert werden koennen
1757cdf0e10cSrcweir 		if( pPara->pHistory )
1758cdf0e10cSrcweir 			pPara->pHistory->Add( pCNd->GetFmtColl(), pCNd->GetIndex(),
1759cdf0e10cSrcweir 									ND_TEXTNODE );
1760cdf0e10cSrcweir 
1761cdf0e10cSrcweir         pCNd->ChgFmtColl( pFmt );
1762cdf0e10cSrcweir 
1763cdf0e10cSrcweir 		pPara->nWhich++;
1764cdf0e10cSrcweir 	}
1765cdf0e10cSrcweir 	return sal_True;
1766cdf0e10cSrcweir }
1767cdf0e10cSrcweir 
1768*808c4840SOliver-Rainer Wittmann 
SetTxtFmtColl(const SwPaM & rRg,SwTxtFmtColl * pFmt,const bool bReset,const bool bResetListAttrs)1769*808c4840SOliver-Rainer Wittmann sal_Bool SwDoc::SetTxtFmtColl(
1770*808c4840SOliver-Rainer Wittmann     const SwPaM &rRg,
1771*808c4840SOliver-Rainer Wittmann     SwTxtFmtColl *pFmt,
1772*808c4840SOliver-Rainer Wittmann     const bool bReset,
1773*808c4840SOliver-Rainer Wittmann     const bool bResetListAttrs )
1774cdf0e10cSrcweir {
1775cdf0e10cSrcweir 	SwDataChanged aTmp( rRg, 0 );
1776cdf0e10cSrcweir 	const SwPosition *pStt = rRg.Start(), *pEnd = rRg.End();
1777cdf0e10cSrcweir 	SwHistory* pHst = 0;
1778cdf0e10cSrcweir 	sal_Bool bRet = sal_True;
1779cdf0e10cSrcweir 
1780cdf0e10cSrcweir     if (GetIDocumentUndoRedo().DoesUndo())
1781cdf0e10cSrcweir     {
1782cdf0e10cSrcweir         SwUndoFmtColl* pUndo = new SwUndoFmtColl( rRg, pFmt,
1783cdf0e10cSrcweir                                                   bReset,
1784cdf0e10cSrcweir                                                   bResetListAttrs );
1785*808c4840SOliver-Rainer Wittmann         pHst = pUndo->GetHistory();
1786cdf0e10cSrcweir         GetIDocumentUndoRedo().AppendUndo(pUndo);
1787cdf0e10cSrcweir     }
1788cdf0e10cSrcweir 
1789cdf0e10cSrcweir     ParaRstFmt aPara( pStt, pEnd, pHst );
1790cdf0e10cSrcweir     aPara.pFmtColl = pFmt;
1791cdf0e10cSrcweir     aPara.bReset = bReset;
1792cdf0e10cSrcweir     aPara.bResetListAttrs = bResetListAttrs;
1793cdf0e10cSrcweir 
1794cdf0e10cSrcweir     GetNodes().ForEach( pStt->nNode.GetIndex(), pEnd->nNode.GetIndex()+1,
1795cdf0e10cSrcweir                         lcl_SetTxtFmtColl, &aPara );
1796*808c4840SOliver-Rainer Wittmann     if ( !aPara.nWhich )
1797cdf0e10cSrcweir         bRet = sal_False;           // keinen gueltigen Node gefunden
1798cdf0e10cSrcweir 
1799*808c4840SOliver-Rainer Wittmann     if ( bRet )
1800*808c4840SOliver-Rainer Wittmann     {
1801*808c4840SOliver-Rainer Wittmann         SetModified();
1802*808c4840SOliver-Rainer Wittmann     }
1803*808c4840SOliver-Rainer Wittmann 
1804*808c4840SOliver-Rainer Wittmann     return bRet;
1805cdf0e10cSrcweir }
1806cdf0e10cSrcweir 
1807cdf0e10cSrcweir 
1808cdf0e10cSrcweir // ---- Kopiere die Formate in sich selbst (SwDoc) ----------------------
1809cdf0e10cSrcweir 
CopyFmt(const SwFmt & rFmt,const SvPtrarr & rFmtArr,FNCopyFmt fnCopyFmt,const SwFmt & rDfltFmt)1810cdf0e10cSrcweir SwFmt* SwDoc::CopyFmt( const SwFmt& rFmt,
1811cdf0e10cSrcweir 						const SvPtrarr& rFmtArr,
1812cdf0e10cSrcweir 						FNCopyFmt fnCopyFmt, const SwFmt& rDfltFmt )
1813cdf0e10cSrcweir {
1814cdf0e10cSrcweir 	//  kein-Autoformat || default Format || Collection-Format
1815cdf0e10cSrcweir 	// dann suche danach.
1816cdf0e10cSrcweir 	if( !rFmt.IsAuto() || !rFmt.GetRegisteredIn() )
1817cdf0e10cSrcweir 		for( sal_uInt16 n = 0; n < rFmtArr.Count(); n++ )
1818cdf0e10cSrcweir 		{
1819cdf0e10cSrcweir 			// ist die Vorlage schon im Doc vorhanden ??
1820cdf0e10cSrcweir 			if( ((SwFmt*)rFmtArr[n])->GetName().Equals( rFmt.GetName() ))
1821cdf0e10cSrcweir 				return (SwFmt*)rFmtArr[n];
1822cdf0e10cSrcweir 		}
1823cdf0e10cSrcweir 
1824cdf0e10cSrcweir 	// suche erstmal nach dem "Parent"
1825cdf0e10cSrcweir 	SwFmt* pParent = (SwFmt*)&rDfltFmt;
1826cdf0e10cSrcweir 	if( rFmt.DerivedFrom() && pParent != rFmt.DerivedFrom() )
1827cdf0e10cSrcweir 		pParent = CopyFmt( *rFmt.DerivedFrom(), rFmtArr,
1828cdf0e10cSrcweir 								fnCopyFmt, rDfltFmt );
1829cdf0e10cSrcweir 
1830cdf0e10cSrcweir 	// erzeuge das Format und kopiere die Attribute
1831cdf0e10cSrcweir     // --> OD 2005-01-13 #i40550#
1832cdf0e10cSrcweir     SwFmt* pNewFmt = (this->*fnCopyFmt)( rFmt.GetName(), pParent, sal_False, sal_True );
1833cdf0e10cSrcweir     // <--
1834cdf0e10cSrcweir     pNewFmt->SetAuto( rFmt.IsAuto() );
1835cdf0e10cSrcweir 	pNewFmt->CopyAttrs( rFmt, sal_True );			// kopiere Attribute
1836cdf0e10cSrcweir 
1837cdf0e10cSrcweir 	pNewFmt->SetPoolFmtId( rFmt.GetPoolFmtId() );
1838cdf0e10cSrcweir 	pNewFmt->SetPoolHelpId( rFmt.GetPoolHelpId() );
1839cdf0e10cSrcweir 
1840cdf0e10cSrcweir 	// HelpFile-Id immer auf dflt setzen !!
1841cdf0e10cSrcweir 	pNewFmt->SetPoolHlpFileId( UCHAR_MAX );
1842cdf0e10cSrcweir 
1843cdf0e10cSrcweir 	return pNewFmt;
1844cdf0e10cSrcweir }
1845cdf0e10cSrcweir 
1846cdf0e10cSrcweir 
1847cdf0e10cSrcweir // ---- kopiere das Frame-Format --------
CopyFrmFmt(const SwFrmFmt & rFmt)1848cdf0e10cSrcweir SwFrmFmt* SwDoc::CopyFrmFmt( const SwFrmFmt& rFmt )
1849cdf0e10cSrcweir {
1850cdf0e10cSrcweir 
1851cdf0e10cSrcweir     return (SwFrmFmt*)CopyFmt( rFmt, *GetFrmFmts(), &SwDoc::_MakeFrmFmt,
1852cdf0e10cSrcweir                                 *GetDfltFrmFmt() );
1853cdf0e10cSrcweir }
1854cdf0e10cSrcweir 
1855cdf0e10cSrcweir // ---- kopiere das Char-Format --------
CopyCharFmt(const SwCharFmt & rFmt)1856cdf0e10cSrcweir SwCharFmt* SwDoc::CopyCharFmt( const SwCharFmt& rFmt )
1857cdf0e10cSrcweir {
1858cdf0e10cSrcweir 	return (SwCharFmt*)CopyFmt( rFmt, *GetCharFmts(),
1859cdf0e10cSrcweir 								&SwDoc::_MakeCharFmt,
1860cdf0e10cSrcweir 								*GetDfltCharFmt() );
1861cdf0e10cSrcweir }
1862cdf0e10cSrcweir 
1863cdf0e10cSrcweir 
1864cdf0e10cSrcweir // --- Kopiere TextNodes ----
1865cdf0e10cSrcweir 
CopyTxtColl(const SwTxtFmtColl & rColl)1866cdf0e10cSrcweir SwTxtFmtColl* SwDoc::CopyTxtColl( const SwTxtFmtColl& rColl )
1867cdf0e10cSrcweir {
1868cdf0e10cSrcweir 	SwTxtFmtColl* pNewColl = FindTxtFmtCollByName( rColl.GetName() );
1869cdf0e10cSrcweir 	if( pNewColl )
1870cdf0e10cSrcweir 		return pNewColl;
1871cdf0e10cSrcweir 
1872cdf0e10cSrcweir 	// suche erstmal nach dem "Parent"
1873cdf0e10cSrcweir 	SwTxtFmtColl* pParent = pDfltTxtFmtColl;
1874cdf0e10cSrcweir 	if( pParent != rColl.DerivedFrom() )
1875cdf0e10cSrcweir 		pParent = CopyTxtColl( *(SwTxtFmtColl*)rColl.DerivedFrom() );
1876cdf0e10cSrcweir 
1877cdf0e10cSrcweir 
1878cdf0e10cSrcweir //FEATURE::CONDCOLL
1879cdf0e10cSrcweir 	if( RES_CONDTXTFMTCOLL == rColl.Which() )
1880cdf0e10cSrcweir 	{
1881cdf0e10cSrcweir 		pNewColl = new SwConditionTxtFmtColl( GetAttrPool(), rColl.GetName(),
1882cdf0e10cSrcweir 												pParent);
1883cdf0e10cSrcweir 		pTxtFmtCollTbl->Insert( pNewColl, pTxtFmtCollTbl->Count() );
1884cdf0e10cSrcweir 		pNewColl->SetAuto( sal_False );
1885cdf0e10cSrcweir 		SetModified();
1886cdf0e10cSrcweir 
1887cdf0e10cSrcweir 		// Kopiere noch die Bedingungen
1888cdf0e10cSrcweir 		((SwConditionTxtFmtColl*)pNewColl)->SetConditions(
1889cdf0e10cSrcweir 							((SwConditionTxtFmtColl&)rColl).GetCondColls() );
1890cdf0e10cSrcweir 	}
1891cdf0e10cSrcweir 	else
1892cdf0e10cSrcweir //FEATURE::CONDCOLL
1893cdf0e10cSrcweir 		pNewColl = MakeTxtFmtColl( rColl.GetName(), pParent );
1894cdf0e10cSrcweir 
1895cdf0e10cSrcweir 	// kopiere jetzt noch die Auto-Formate oder kopiere die Attribute
1896cdf0e10cSrcweir 	pNewColl->CopyAttrs( rColl, sal_True );
1897cdf0e10cSrcweir 
1898*808c4840SOliver-Rainer Wittmann     // setze noch den Outline-Level
1899*808c4840SOliver-Rainer Wittmann     if ( rColl.IsAssignedToListLevelOfOutlineStyle() )
1900*808c4840SOliver-Rainer Wittmann         pNewColl->AssignToListLevelOfOutlineStyle( rColl.GetAssignedOutlineStyleLevel() );
1901*808c4840SOliver-Rainer Wittmann 
1902*808c4840SOliver-Rainer Wittmann     pNewColl->SetPoolFmtId( rColl.GetPoolFmtId() );
1903*808c4840SOliver-Rainer Wittmann     pNewColl->SetPoolHelpId( rColl.GetPoolHelpId() );
1904cdf0e10cSrcweir 
1905cdf0e10cSrcweir 	// HelpFile-Id immer auf dflt setzen !!
1906cdf0e10cSrcweir 	pNewColl->SetPoolHlpFileId( UCHAR_MAX );
1907cdf0e10cSrcweir 
1908cdf0e10cSrcweir 	if( &rColl.GetNextTxtFmtColl() != &rColl )
1909cdf0e10cSrcweir 		pNewColl->SetNextTxtFmtColl( *CopyTxtColl( rColl.GetNextTxtFmtColl() ));
1910cdf0e10cSrcweir 
1911cdf0e10cSrcweir 	// ggfs. die NumRule erzeugen
1912cdf0e10cSrcweir 	if( this != rColl.GetDoc() )
1913cdf0e10cSrcweir 	{
1914cdf0e10cSrcweir 		const SfxPoolItem* pItem;
1915cdf0e10cSrcweir 		if( SFX_ITEM_SET == pNewColl->GetItemState( RES_PARATR_NUMRULE,
1916cdf0e10cSrcweir 			sal_False, &pItem ))
1917cdf0e10cSrcweir 		{
1918cdf0e10cSrcweir 			const SwNumRule* pRule;
1919cdf0e10cSrcweir 			const String& rName = ((SwNumRuleItem*)pItem)->GetValue();
1920cdf0e10cSrcweir 			if( rName.Len() &&
1921cdf0e10cSrcweir 				0 != ( pRule = rColl.GetDoc()->FindNumRulePtr( rName )) &&
1922cdf0e10cSrcweir 				!pRule->IsAutoRule() )
1923cdf0e10cSrcweir 			{
1924cdf0e10cSrcweir 				SwNumRule* pDestRule = FindNumRulePtr( rName );
1925cdf0e10cSrcweir 				if( pDestRule )
1926cdf0e10cSrcweir 					pDestRule->SetInvalidRule( sal_True );
1927cdf0e10cSrcweir 				else
1928cdf0e10cSrcweir 					MakeNumRule( rName, pRule );
1929cdf0e10cSrcweir 			}
1930cdf0e10cSrcweir 		}
1931cdf0e10cSrcweir 	}
1932cdf0e10cSrcweir 	return pNewColl;
1933cdf0e10cSrcweir }
1934cdf0e10cSrcweir 
1935cdf0e10cSrcweir // --- Kopiere GrafikNodes ----
1936cdf0e10cSrcweir 
CopyGrfColl(const SwGrfFmtColl & rColl)1937cdf0e10cSrcweir SwGrfFmtColl* SwDoc::CopyGrfColl( const SwGrfFmtColl& rColl )
1938cdf0e10cSrcweir {
1939cdf0e10cSrcweir 	SwGrfFmtColl* pNewColl = FindGrfFmtCollByName( rColl.GetName() );
1940cdf0e10cSrcweir 	if( pNewColl )
1941cdf0e10cSrcweir 		return pNewColl;
1942cdf0e10cSrcweir 
1943cdf0e10cSrcweir 	// suche erstmal nach dem "Parent"
1944cdf0e10cSrcweir 	SwGrfFmtColl* pParent = pDfltGrfFmtColl;
1945cdf0e10cSrcweir 	if( pParent != rColl.DerivedFrom() )
1946cdf0e10cSrcweir 		pParent = CopyGrfColl( *(SwGrfFmtColl*)rColl.DerivedFrom() );
1947cdf0e10cSrcweir 
1948cdf0e10cSrcweir 	// falls nicht, so kopiere sie
1949cdf0e10cSrcweir 	pNewColl = MakeGrfFmtColl( rColl.GetName(), pParent );
1950cdf0e10cSrcweir 
1951cdf0e10cSrcweir 	// noch die Attribute kopieren
1952cdf0e10cSrcweir 	pNewColl->CopyAttrs( rColl );
1953cdf0e10cSrcweir 
1954cdf0e10cSrcweir 	pNewColl->SetPoolFmtId( rColl.GetPoolFmtId() );
1955cdf0e10cSrcweir 	pNewColl->SetPoolHelpId( rColl.GetPoolHelpId() );
1956cdf0e10cSrcweir 
1957cdf0e10cSrcweir 	// HelpFile-Id immer auf dflt setzen !!
1958cdf0e10cSrcweir 	pNewColl->SetPoolHlpFileId( UCHAR_MAX );
1959cdf0e10cSrcweir 
1960cdf0e10cSrcweir 	return pNewColl;
1961cdf0e10cSrcweir }
1962cdf0e10cSrcweir 
lcl_FindPageDesc(const SwPageDescs & rArr,const String & rName)1963cdf0e10cSrcweir SwPageDesc* lcl_FindPageDesc( const SwPageDescs& rArr, const String& rName )
1964cdf0e10cSrcweir {
1965cdf0e10cSrcweir 	for( sal_uInt16 n = rArr.Count(); n; )
1966cdf0e10cSrcweir 	{
1967cdf0e10cSrcweir 		SwPageDesc* pDesc = rArr[ --n ];
1968cdf0e10cSrcweir 		if( pDesc->GetName() == rName )
1969cdf0e10cSrcweir 			return pDesc;
1970cdf0e10cSrcweir 	}
1971cdf0e10cSrcweir 	return 0;
1972cdf0e10cSrcweir }
1973cdf0e10cSrcweir 
CopyFmtArr(const SvPtrarr & rSourceArr,SvPtrarr & rDestArr,FNCopyFmt fnCopyFmt,SwFmt & rDfltFmt)1974cdf0e10cSrcweir void SwDoc::CopyFmtArr( const SvPtrarr& rSourceArr,
1975cdf0e10cSrcweir 						SvPtrarr& rDestArr,
1976cdf0e10cSrcweir 						FNCopyFmt fnCopyFmt,
1977cdf0e10cSrcweir 						SwFmt& rDfltFmt )
1978cdf0e10cSrcweir {
1979cdf0e10cSrcweir 	sal_uInt16 nSrc;
1980cdf0e10cSrcweir 	SwFmt* pSrc, *pDest;
1981cdf0e10cSrcweir 
1982cdf0e10cSrcweir 	// 1. Schritt alle Formate anlegen (das 0. ueberspringen - Default!)
1983cdf0e10cSrcweir 	for( nSrc = rSourceArr.Count(); nSrc > 1; )
1984cdf0e10cSrcweir 	{
1985cdf0e10cSrcweir 		pSrc = (SwFmt*)rSourceArr[ --nSrc ];
1986cdf0e10cSrcweir 		if( pSrc->IsDefault() || pSrc->IsAuto() )
1987cdf0e10cSrcweir 			continue;
1988cdf0e10cSrcweir 
1989cdf0e10cSrcweir 		if( 0 == FindFmtByName( rDestArr, pSrc->GetName() ) )
1990cdf0e10cSrcweir 		{
1991cdf0e10cSrcweir 			if( RES_CONDTXTFMTCOLL == pSrc->Which() )
1992cdf0e10cSrcweir                 MakeCondTxtFmtColl( pSrc->GetName(), (SwTxtFmtColl*)&rDfltFmt );
1993cdf0e10cSrcweir 			else
1994cdf0e10cSrcweir                 // --> OD 2005-01-13 #i40550#
1995cdf0e10cSrcweir                 (this->*fnCopyFmt)( pSrc->GetName(), &rDfltFmt, sal_False, sal_True );
1996cdf0e10cSrcweir                 // <--
1997cdf0e10cSrcweir 		}
1998cdf0e10cSrcweir 	}
1999cdf0e10cSrcweir 
2000cdf0e10cSrcweir 	// 2. Schritt alle Attribute kopieren, richtige Parents setzen
2001cdf0e10cSrcweir 	for( nSrc = rSourceArr.Count(); nSrc > 1; )
2002cdf0e10cSrcweir 	{
2003cdf0e10cSrcweir 		pSrc = (SwFmt*)rSourceArr[ --nSrc ];
2004cdf0e10cSrcweir 		if( pSrc->IsDefault() || pSrc->IsAuto() )
2005cdf0e10cSrcweir 			continue;
2006cdf0e10cSrcweir 
2007cdf0e10cSrcweir 		pDest = FindFmtByName( rDestArr, pSrc->GetName() );
2008cdf0e10cSrcweir 		pDest->SetAuto( sal_False );
2009cdf0e10cSrcweir 		pDest->DelDiffs( *pSrc );
2010cdf0e10cSrcweir 
2011cdf0e10cSrcweir         // #i94285#: existing <SwFmtPageDesc> instance, before copying attributes
2012cdf0e10cSrcweir         const SfxPoolItem* pItem;
2013cdf0e10cSrcweir         if( &GetAttrPool() != pSrc->GetAttrSet().GetPool() &&
2014cdf0e10cSrcweir             SFX_ITEM_SET == pSrc->GetAttrSet().GetItemState(
2015cdf0e10cSrcweir             RES_PAGEDESC, sal_False, &pItem ) &&
2016cdf0e10cSrcweir             ((SwFmtPageDesc*)pItem)->GetPageDesc() )
2017cdf0e10cSrcweir         {
2018cdf0e10cSrcweir             SwFmtPageDesc aPageDesc( *(SwFmtPageDesc*)pItem );
2019cdf0e10cSrcweir             const String& rNm = aPageDesc.GetPageDesc()->GetName();
2020cdf0e10cSrcweir             SwPageDesc* pPageDesc = ::lcl_FindPageDesc( aPageDescs, rNm );
2021cdf0e10cSrcweir             if( !pPageDesc )
2022cdf0e10cSrcweir             {
2023cdf0e10cSrcweir                 pPageDesc = aPageDescs[ MakePageDesc( rNm ) ];
2024cdf0e10cSrcweir             }
2025cdf0e10cSrcweir             aPageDesc.RegisterToPageDesc( *pPageDesc );
2026cdf0e10cSrcweir             SwAttrSet aTmpAttrSet( pSrc->GetAttrSet() );
2027cdf0e10cSrcweir             aTmpAttrSet.Put( aPageDesc );
2028cdf0e10cSrcweir             pDest->SetFmtAttr( aTmpAttrSet );
2029cdf0e10cSrcweir         }
2030cdf0e10cSrcweir         else
2031cdf0e10cSrcweir         {
2032cdf0e10cSrcweir             pDest->SetFmtAttr( pSrc->GetAttrSet() );
2033cdf0e10cSrcweir         }
2034cdf0e10cSrcweir 
2035cdf0e10cSrcweir 		pDest->SetPoolFmtId( pSrc->GetPoolFmtId() );
2036cdf0e10cSrcweir 		pDest->SetPoolHelpId( pSrc->GetPoolHelpId() );
2037cdf0e10cSrcweir 
2038cdf0e10cSrcweir 		// HelpFile-Id immer auf dflt setzen !!
2039cdf0e10cSrcweir 		pDest->SetPoolHlpFileId( UCHAR_MAX );
2040cdf0e10cSrcweir 
2041cdf0e10cSrcweir 		if( pSrc->DerivedFrom() )
2042cdf0e10cSrcweir 			pDest->SetDerivedFrom( FindFmtByName( rDestArr,
2043cdf0e10cSrcweir 										pSrc->DerivedFrom()->GetName() ) );
2044cdf0e10cSrcweir 		if( RES_TXTFMTCOLL == pSrc->Which() ||
2045cdf0e10cSrcweir 			RES_CONDTXTFMTCOLL == pSrc->Which() )
2046cdf0e10cSrcweir 		{
2047cdf0e10cSrcweir 			SwTxtFmtColl* pSrcColl = (SwTxtFmtColl*)pSrc,
2048cdf0e10cSrcweir 						* pDstColl = (SwTxtFmtColl*)pDest;
2049cdf0e10cSrcweir 			if( &pSrcColl->GetNextTxtFmtColl() != pSrcColl )
2050cdf0e10cSrcweir 				pDstColl->SetNextTxtFmtColl( *(SwTxtFmtColl*)FindFmtByName(
2051cdf0e10cSrcweir 					rDestArr, pSrcColl->GetNextTxtFmtColl().GetName() ) );
2052cdf0e10cSrcweir 
2053cdf0e10cSrcweir 			// setze noch den Outline-Level
2054cdf0e10cSrcweir 			if(pSrcColl->IsAssignedToListLevelOfOutlineStyle())
2055*808c4840SOliver-Rainer Wittmann 				pDstColl->AssignToListLevelOfOutlineStyle(pSrcColl->GetAssignedOutlineStyleLevel());
2056cdf0e10cSrcweir 
2057cdf0e10cSrcweir //FEATURE::CONDCOLL
2058cdf0e10cSrcweir 			if( RES_CONDTXTFMTCOLL == pSrc->Which() )
2059cdf0e10cSrcweir 				// Kopiere noch die Bedingungen
2060cdf0e10cSrcweir 				// aber erst die alten loeschen!
2061cdf0e10cSrcweir 				((SwConditionTxtFmtColl*)pDstColl)->SetConditions(
2062cdf0e10cSrcweir 							((SwConditionTxtFmtColl*)pSrc)->GetCondColls() );
2063cdf0e10cSrcweir //FEATURE::CONDCOLL
2064cdf0e10cSrcweir 		}
2065cdf0e10cSrcweir 	}
2066cdf0e10cSrcweir }
2067cdf0e10cSrcweir 
CopyPageDescHeaderFooterImpl(bool bCpyHeader,const SwFrmFmt & rSrcFmt,SwFrmFmt & rDestFmt)2068cdf0e10cSrcweir void SwDoc::CopyPageDescHeaderFooterImpl( bool bCpyHeader,
2069cdf0e10cSrcweir 								const SwFrmFmt& rSrcFmt, SwFrmFmt& rDestFmt )
2070cdf0e10cSrcweir {
2071cdf0e10cSrcweir 	// jetzt noch Header-/Footer-Attribute richtig behandeln
2072cdf0e10cSrcweir 	// Contenten Nodes Dokumentuebergreifend kopieren!
2073cdf0e10cSrcweir 	sal_uInt16 nAttr = static_cast<sal_uInt16>( bCpyHeader ? RES_HEADER : RES_FOOTER );
2074cdf0e10cSrcweir 	const SfxPoolItem* pItem;
2075cdf0e10cSrcweir 	if( SFX_ITEM_SET != rSrcFmt.GetAttrSet().GetItemState( nAttr, sal_False, &pItem ))
2076cdf0e10cSrcweir 		return ;
2077cdf0e10cSrcweir 
2078cdf0e10cSrcweir 	// Im Header steht noch der Verweis auf das Format aus dem
2079cdf0e10cSrcweir 	// anderen Document!!
2080cdf0e10cSrcweir 	SfxPoolItem* pNewItem = pItem->Clone();
2081cdf0e10cSrcweir 
2082cdf0e10cSrcweir 	SwFrmFmt* pOldFmt;
2083cdf0e10cSrcweir 	if( bCpyHeader )
2084cdf0e10cSrcweir 		 pOldFmt = ((SwFmtHeader*)pNewItem)->GetHeaderFmt();
2085cdf0e10cSrcweir 	else
2086cdf0e10cSrcweir 		 pOldFmt = ((SwFmtFooter*)pNewItem)->GetFooterFmt();
2087cdf0e10cSrcweir 
2088cdf0e10cSrcweir 	if( pOldFmt )
2089cdf0e10cSrcweir 	{
2090cdf0e10cSrcweir 		SwFrmFmt* pNewFmt = new SwFrmFmt( GetAttrPool(), "CpyDesc",
2091cdf0e10cSrcweir 											GetDfltFrmFmt() );
2092cdf0e10cSrcweir 		pNewFmt->CopyAttrs( *pOldFmt, sal_True );
2093cdf0e10cSrcweir 
2094cdf0e10cSrcweir 		if( SFX_ITEM_SET == pNewFmt->GetAttrSet().GetItemState(
2095cdf0e10cSrcweir 			RES_CNTNT, sal_False, &pItem ))
2096cdf0e10cSrcweir 		{
2097cdf0e10cSrcweir 			SwFmtCntnt* pCntnt = (SwFmtCntnt*)pItem;
2098cdf0e10cSrcweir 			if( pCntnt->GetCntntIdx() )
2099cdf0e10cSrcweir 			{
2100cdf0e10cSrcweir 				SwNodeIndex aTmpIdx( GetNodes().GetEndOfAutotext() );
2101cdf0e10cSrcweir 				const SwNodes& rSrcNds = rSrcFmt.GetDoc()->GetNodes();
2102cdf0e10cSrcweir 				SwStartNode* pSttNd = GetNodes().MakeEmptySection( aTmpIdx,
2103cdf0e10cSrcweir 												bCpyHeader
2104cdf0e10cSrcweir 													? SwHeaderStartNode
2105cdf0e10cSrcweir 													: SwFooterStartNode );
2106cdf0e10cSrcweir 				const SwNode& rCSttNd = pCntnt->GetCntntIdx()->GetNode();
2107cdf0e10cSrcweir 				SwNodeRange aRg( rCSttNd, 0, *rCSttNd.EndOfSectionNode() );
2108cdf0e10cSrcweir 				aTmpIdx = *pSttNd->EndOfSectionNode();
2109cdf0e10cSrcweir 				rSrcNds._Copy( aRg, aTmpIdx );
2110cdf0e10cSrcweir 				aTmpIdx = *pSttNd;
2111cdf0e10cSrcweir                 rSrcFmt.GetDoc()->CopyFlyInFlyImpl( aRg, 0, aTmpIdx );
2112cdf0e10cSrcweir                 pNewFmt->SetFmtAttr( SwFmtCntnt( pSttNd ));
2113cdf0e10cSrcweir 			}
2114cdf0e10cSrcweir 			else
2115cdf0e10cSrcweir                 pNewFmt->ResetFmtAttr( RES_CNTNT );
2116cdf0e10cSrcweir 		}
2117cdf0e10cSrcweir 		if( bCpyHeader )
2118cdf0e10cSrcweir             ((SwFmtHeader*)pNewItem)->RegisterToFormat(*pNewFmt);
2119cdf0e10cSrcweir 		else
2120cdf0e10cSrcweir             ((SwFmtFooter*)pNewItem)->RegisterToFormat(*pNewFmt);
2121cdf0e10cSrcweir         rDestFmt.SetFmtAttr( *pNewItem );
2122cdf0e10cSrcweir 	}
2123cdf0e10cSrcweir 	delete pNewItem;
2124cdf0e10cSrcweir }
2125cdf0e10cSrcweir 
CopyPageDesc(const SwPageDesc & rSrcDesc,SwPageDesc & rDstDesc,sal_Bool bCopyPoolIds)2126cdf0e10cSrcweir void SwDoc::CopyPageDesc( const SwPageDesc& rSrcDesc, SwPageDesc& rDstDesc,
2127cdf0e10cSrcweir 							sal_Bool bCopyPoolIds )
2128cdf0e10cSrcweir {
2129cdf0e10cSrcweir 	sal_Bool bNotifyLayout = sal_False;
2130cdf0e10cSrcweir 	SwRootFrm* pTmpRoot = GetCurrentLayout();//swmod 080219
2131cdf0e10cSrcweir 
2132cdf0e10cSrcweir 	rDstDesc.SetLandscape( rSrcDesc.GetLandscape() );
2133cdf0e10cSrcweir 	rDstDesc.SetNumType( rSrcDesc.GetNumType() );
2134cdf0e10cSrcweir 	if( rDstDesc.ReadUseOn() != rSrcDesc.ReadUseOn() )
2135cdf0e10cSrcweir 	{
2136cdf0e10cSrcweir 		rDstDesc.WriteUseOn( rSrcDesc.ReadUseOn() );
2137cdf0e10cSrcweir 		bNotifyLayout = sal_True;
2138cdf0e10cSrcweir 	}
2139cdf0e10cSrcweir 
2140cdf0e10cSrcweir 	if( bCopyPoolIds )
2141cdf0e10cSrcweir 	{
2142cdf0e10cSrcweir 		rDstDesc.SetPoolFmtId( rSrcDesc.GetPoolFmtId() );
2143cdf0e10cSrcweir 		rDstDesc.SetPoolHelpId( rSrcDesc.GetPoolHelpId() );
2144cdf0e10cSrcweir 		// HelpFile-Id immer auf dflt setzen !!
2145cdf0e10cSrcweir 		rDstDesc.SetPoolHlpFileId( UCHAR_MAX );
2146cdf0e10cSrcweir 	}
2147cdf0e10cSrcweir 
2148cdf0e10cSrcweir 	if( rSrcDesc.GetFollow() != &rSrcDesc )
2149cdf0e10cSrcweir 	{
2150cdf0e10cSrcweir 		SwPageDesc* pFollow = ::lcl_FindPageDesc( aPageDescs,
2151cdf0e10cSrcweir 									rSrcDesc.GetFollow()->GetName() );
2152cdf0e10cSrcweir 		if( !pFollow )
2153cdf0e10cSrcweir 		{
2154cdf0e10cSrcweir 			// dann mal kopieren
2155cdf0e10cSrcweir 			sal_uInt16 nPos = MakePageDesc( rSrcDesc.GetFollow()->GetName() );
2156cdf0e10cSrcweir 			pFollow = aPageDescs[ nPos ];
2157cdf0e10cSrcweir 			CopyPageDesc( *rSrcDesc.GetFollow(), *pFollow );
2158cdf0e10cSrcweir 		}
2159cdf0e10cSrcweir 		rDstDesc.SetFollow( pFollow );
2160cdf0e10cSrcweir 		bNotifyLayout = sal_True;
2161cdf0e10cSrcweir 	}
2162cdf0e10cSrcweir 
2163cdf0e10cSrcweir 	// die Header/Footer-Attribute werden gesondert kopiert, die Content-
2164cdf0e10cSrcweir 	// Sections muessen vollstaendig mitgenommen werden!
2165cdf0e10cSrcweir 	{
2166cdf0e10cSrcweir 		SfxItemSet aAttrSet( rSrcDesc.GetMaster().GetAttrSet() );
2167cdf0e10cSrcweir 		aAttrSet.ClearItem( RES_HEADER );
2168cdf0e10cSrcweir 		aAttrSet.ClearItem( RES_FOOTER );
2169cdf0e10cSrcweir 
2170cdf0e10cSrcweir 		rDstDesc.GetMaster().DelDiffs( aAttrSet );
2171cdf0e10cSrcweir         rDstDesc.GetMaster().SetFmtAttr( aAttrSet );
2172cdf0e10cSrcweir 
2173cdf0e10cSrcweir 		aAttrSet.ClearItem();
2174cdf0e10cSrcweir 		aAttrSet.Put( rSrcDesc.GetLeft().GetAttrSet() );
2175cdf0e10cSrcweir 		aAttrSet.ClearItem( RES_HEADER );
2176cdf0e10cSrcweir 		aAttrSet.ClearItem( RES_FOOTER );
2177cdf0e10cSrcweir 
2178cdf0e10cSrcweir 		rDstDesc.GetLeft().DelDiffs( aAttrSet );
2179cdf0e10cSrcweir         rDstDesc.GetLeft().SetFmtAttr( aAttrSet );
2180cdf0e10cSrcweir 	}
2181cdf0e10cSrcweir 
2182cdf0e10cSrcweir 	CopyHeader( rSrcDesc.GetMaster(), rDstDesc.GetMaster() );
2183cdf0e10cSrcweir 	CopyFooter( rSrcDesc.GetMaster(), rDstDesc.GetMaster() );
2184cdf0e10cSrcweir 	if( !rDstDesc.IsHeaderShared() )
2185cdf0e10cSrcweir 		CopyHeader( rSrcDesc.GetLeft(), rDstDesc.GetLeft() );
2186cdf0e10cSrcweir 	else
2187cdf0e10cSrcweir         rDstDesc.GetLeft().SetFmtAttr( rDstDesc.GetMaster().GetHeader() );
2188cdf0e10cSrcweir 
2189cdf0e10cSrcweir 	if( !rDstDesc.IsFooterShared() )
2190cdf0e10cSrcweir 		CopyFooter( rSrcDesc.GetLeft(), rDstDesc.GetLeft() );
2191cdf0e10cSrcweir 	else
2192cdf0e10cSrcweir         rDstDesc.GetLeft().SetFmtAttr( rDstDesc.GetMaster().GetFooter() );
2193cdf0e10cSrcweir 
2194cdf0e10cSrcweir 	if( bNotifyLayout && pTmpRoot )
2195cdf0e10cSrcweir 	{
2196cdf0e10cSrcweir 		std::set<SwRootFrm*> aAllLayouts = GetAllLayouts();//swmod 080225
2197cdf0e10cSrcweir 		std::for_each( aAllLayouts.begin(), aAllLayouts.end(),std::mem_fun(&SwRootFrm::AllCheckPageDescs));//swmod 080226
2198cdf0e10cSrcweir 	}
2199cdf0e10cSrcweir 
2200cdf0e10cSrcweir 	//Wenn sich FussnotenInfo veraendert, so werden die Seiten
2201cdf0e10cSrcweir 	//angetriggert.
2202cdf0e10cSrcweir 	if( !(rDstDesc.GetFtnInfo() == rSrcDesc.GetFtnInfo()) )
2203cdf0e10cSrcweir 	{
2204cdf0e10cSrcweir 		rDstDesc.SetFtnInfo( rSrcDesc.GetFtnInfo() );
2205cdf0e10cSrcweir 		SwMsgPoolItem  aInfo( RES_PAGEDESC_FTNINFO );
2206cdf0e10cSrcweir 		{
2207cdf0e10cSrcweir             rDstDesc.GetMaster().ModifyBroadcast( &aInfo, 0, TYPE(SwFrm) );
2208cdf0e10cSrcweir 		}
2209cdf0e10cSrcweir 		{
2210cdf0e10cSrcweir             rDstDesc.GetLeft().ModifyBroadcast( &aInfo, 0, TYPE(SwFrm) );
2211cdf0e10cSrcweir 		}
2212cdf0e10cSrcweir 	}
2213cdf0e10cSrcweir }
2214cdf0e10cSrcweir 
ReplaceStyles(SwDoc & rSource)2215cdf0e10cSrcweir void SwDoc::ReplaceStyles( SwDoc& rSource )
2216cdf0e10cSrcweir {
2217cdf0e10cSrcweir     ::sw::UndoGuard const undoGuard(GetIDocumentUndoRedo());
2218cdf0e10cSrcweir 
2219cdf0e10cSrcweir 	CopyFmtArr( *rSource.pCharFmtTbl, *pCharFmtTbl,
2220cdf0e10cSrcweir 				&SwDoc::_MakeCharFmt, *pDfltCharFmt );
2221cdf0e10cSrcweir 	CopyFmtArr( *rSource.pFrmFmtTbl, *pFrmFmtTbl,
2222cdf0e10cSrcweir 				&SwDoc::_MakeFrmFmt, *pDfltFrmFmt );
2223cdf0e10cSrcweir 	CopyFmtArr( *rSource.pTxtFmtCollTbl, *pTxtFmtCollTbl,
2224cdf0e10cSrcweir 				&SwDoc::_MakeTxtFmtColl, *pDfltTxtFmtColl );
2225cdf0e10cSrcweir 
2226cdf0e10cSrcweir 	// und jetzt noch die Seiten-Vorlagen
2227cdf0e10cSrcweir 	sal_uInt16 nCnt = rSource.aPageDescs.Count();
2228cdf0e10cSrcweir 	if( nCnt )
2229cdf0e10cSrcweir 	{
2230cdf0e10cSrcweir 		// ein anderes Doc -> Numberformatter muessen gemergt werden
2231cdf0e10cSrcweir 		SwTblNumFmtMerge aTNFM( rSource, *this );
2232cdf0e10cSrcweir 
2233cdf0e10cSrcweir 		// 1. Schritt alle Formate anlegen (das 0. ueberspringen - Default!)
2234cdf0e10cSrcweir 		while( nCnt )
2235cdf0e10cSrcweir 		{
2236cdf0e10cSrcweir 			SwPageDesc *pSrc = rSource.aPageDescs[ --nCnt ];
2237cdf0e10cSrcweir 			if( 0 == ::lcl_FindPageDesc( aPageDescs, pSrc->GetName() ) )
2238cdf0e10cSrcweir 				MakePageDesc( pSrc->GetName() );
2239cdf0e10cSrcweir 		}
2240cdf0e10cSrcweir 
2241cdf0e10cSrcweir 		// 2. Schritt alle Attribute kopieren, richtige Parents setzen
2242cdf0e10cSrcweir 		for( nCnt = rSource.aPageDescs.Count(); nCnt; )
2243cdf0e10cSrcweir 		{
2244cdf0e10cSrcweir 			SwPageDesc *pSrc = rSource.aPageDescs[ --nCnt ];
2245cdf0e10cSrcweir 			CopyPageDesc( *pSrc, *::lcl_FindPageDesc( aPageDescs, pSrc->GetName() ));
2246cdf0e10cSrcweir 		}
2247cdf0e10cSrcweir 	}
2248cdf0e10cSrcweir 
2249cdf0e10cSrcweir 	//JP 08.04.99: und dann sind da noch die Numerierungs-Vorlagen
2250cdf0e10cSrcweir 	nCnt = rSource.GetNumRuleTbl().Count();
2251cdf0e10cSrcweir 	if( nCnt )
2252cdf0e10cSrcweir 	{
2253cdf0e10cSrcweir 		const SwNumRuleTbl& rArr = rSource.GetNumRuleTbl();
2254cdf0e10cSrcweir 		for( sal_uInt16 n = 0; n < nCnt; ++n )
2255cdf0e10cSrcweir 		{
2256cdf0e10cSrcweir 			const SwNumRule& rR = *rArr[ n ];
2257cdf0e10cSrcweir 			if( !rR.IsAutoRule() )
2258cdf0e10cSrcweir 			{
2259cdf0e10cSrcweir 				SwNumRule* pNew = FindNumRulePtr( rR.GetName());
2260cdf0e10cSrcweir 				if( pNew )
2261cdf0e10cSrcweir 					pNew->CopyNumRule( this, rR );
2262cdf0e10cSrcweir 				else
2263cdf0e10cSrcweir 					MakeNumRule( rR.GetName(), &rR );
2264cdf0e10cSrcweir 			}
2265cdf0e10cSrcweir 		}
2266cdf0e10cSrcweir 	}
2267cdf0e10cSrcweir 
2268cdf0e10cSrcweir     if (undoGuard.UndoWasEnabled())
2269cdf0e10cSrcweir     {
2270cdf0e10cSrcweir         // nodes array was modified!
2271cdf0e10cSrcweir         GetIDocumentUndoRedo().DelAllUndoObj();
2272cdf0e10cSrcweir     }
2273cdf0e10cSrcweir 
2274cdf0e10cSrcweir 	SetModified();
2275cdf0e10cSrcweir }
2276cdf0e10cSrcweir 
FindFmtByName(const SvPtrarr & rFmtArr,const String & rName) const2277cdf0e10cSrcweir SwFmt* SwDoc::FindFmtByName( const SvPtrarr& rFmtArr,
2278cdf0e10cSrcweir 									const String& rName ) const
2279cdf0e10cSrcweir {
2280cdf0e10cSrcweir 	SwFmt* pFnd = 0;
2281cdf0e10cSrcweir 	for( sal_uInt16 n = 0; n < rFmtArr.Count(); n++ )
2282cdf0e10cSrcweir 	{
2283cdf0e10cSrcweir 		// ist die Vorlage schon im Doc vorhanden ??
2284cdf0e10cSrcweir 		if( ((SwFmt*)rFmtArr[n])->GetName() == rName )
2285cdf0e10cSrcweir 		{
2286cdf0e10cSrcweir 			pFnd = (SwFmt*)rFmtArr[n];
2287cdf0e10cSrcweir 			break;
2288cdf0e10cSrcweir 		}
2289cdf0e10cSrcweir 	}
2290cdf0e10cSrcweir 	return pFnd;
2291cdf0e10cSrcweir }
2292cdf0e10cSrcweir 
MoveLeftMargin(const SwPaM & rPam,sal_Bool bRight,sal_Bool bModulus)2293cdf0e10cSrcweir void SwDoc::MoveLeftMargin( const SwPaM& rPam, sal_Bool bRight, sal_Bool bModulus )
2294cdf0e10cSrcweir {
2295cdf0e10cSrcweir 	SwHistory* pHistory = 0;
2296cdf0e10cSrcweir     if (GetIDocumentUndoRedo().DoesUndo())
2297cdf0e10cSrcweir     {
2298cdf0e10cSrcweir 		SwUndoMoveLeftMargin* pUndo = new SwUndoMoveLeftMargin( rPam, bRight,
2299cdf0e10cSrcweir 																bModulus );
2300cdf0e10cSrcweir         pHistory = &pUndo->GetHistory();
2301cdf0e10cSrcweir         GetIDocumentUndoRedo().AppendUndo( pUndo );
2302cdf0e10cSrcweir     }
2303cdf0e10cSrcweir 
2304cdf0e10cSrcweir 	const SvxTabStopItem& rTabItem = (SvxTabStopItem&)GetDefault( RES_PARATR_TABSTOP );
2305cdf0e10cSrcweir 	sal_uInt16 nDefDist = rTabItem.Count() ?
2306cdf0e10cSrcweir         static_cast<sal_uInt16>(rTabItem[0].GetTabPos()) : 1134;
2307cdf0e10cSrcweir 	const SwPosition &rStt = *rPam.Start(), &rEnd = *rPam.End();
2308cdf0e10cSrcweir 	SwNodeIndex aIdx( rStt.nNode );
2309cdf0e10cSrcweir 	while( aIdx <= rEnd.nNode )
2310cdf0e10cSrcweir 	{
2311cdf0e10cSrcweir 		SwTxtNode* pTNd = aIdx.GetNode().GetTxtNode();
2312cdf0e10cSrcweir 		if( pTNd )
2313cdf0e10cSrcweir 		{
2314cdf0e10cSrcweir             SvxLRSpaceItem aLS( (SvxLRSpaceItem&)pTNd->SwCntntNode::GetAttr( RES_LR_SPACE ) );
2315cdf0e10cSrcweir 
2316cdf0e10cSrcweir             // --> FME 2008-09-16 #i93873# See also lcl_MergeListLevelIndentAsLRSpaceItem in thints.cxx
2317cdf0e10cSrcweir             if ( pTNd->AreListLevelIndentsApplicable() )
2318cdf0e10cSrcweir             {
2319cdf0e10cSrcweir                 const SwNumRule* pRule = pTNd->GetNumRule();
2320cdf0e10cSrcweir                 if ( pRule )
2321cdf0e10cSrcweir                 {
2322cdf0e10cSrcweir                     const int nListLevel = pTNd->GetActualListLevel();
2323cdf0e10cSrcweir                     if ( nListLevel >= 0 )
2324cdf0e10cSrcweir                     {
2325cdf0e10cSrcweir                         const SwNumFmt& rFmt = pRule->Get(static_cast<sal_uInt16>(nListLevel));
2326cdf0e10cSrcweir                         if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT )
2327cdf0e10cSrcweir                         {
2328cdf0e10cSrcweir                             aLS.SetTxtLeft( rFmt.GetIndentAt() );
2329cdf0e10cSrcweir                             aLS.SetTxtFirstLineOfst( static_cast<short>(rFmt.GetFirstLineIndent()) );
2330cdf0e10cSrcweir                         }
2331cdf0e10cSrcweir                     }
2332cdf0e10cSrcweir                 }
2333cdf0e10cSrcweir             }
2334cdf0e10cSrcweir 
2335cdf0e10cSrcweir 			long nNext = aLS.GetTxtLeft();
2336cdf0e10cSrcweir 			if( bModulus )
2337cdf0e10cSrcweir 				nNext = ( nNext / nDefDist ) * nDefDist;
2338cdf0e10cSrcweir 
2339cdf0e10cSrcweir 			if( bRight )
2340cdf0e10cSrcweir 				nNext += nDefDist;
2341cdf0e10cSrcweir 			else
2342cdf0e10cSrcweir 				nNext -= nDefDist;
2343cdf0e10cSrcweir 
2344cdf0e10cSrcweir             aLS.SetTxtLeft( nNext );
2345cdf0e10cSrcweir 
2346cdf0e10cSrcweir 			SwRegHistory aRegH( pTNd, *pTNd, pHistory );
2347cdf0e10cSrcweir             pTNd->SetAttr( aLS );
2348cdf0e10cSrcweir 		}
2349cdf0e10cSrcweir 		aIdx++;
2350cdf0e10cSrcweir 	}
2351cdf0e10cSrcweir 	SetModified();
2352cdf0e10cSrcweir }
2353cdf0e10cSrcweir 
DontExpandFmt(const SwPosition & rPos,sal_Bool bFlag)2354cdf0e10cSrcweir sal_Bool SwDoc::DontExpandFmt( const SwPosition& rPos, sal_Bool bFlag )
2355cdf0e10cSrcweir {
2356cdf0e10cSrcweir 	sal_Bool bRet = sal_False;
2357cdf0e10cSrcweir 	SwTxtNode* pTxtNd = rPos.nNode.GetNode().GetTxtNode();
2358cdf0e10cSrcweir 	if( pTxtNd )
2359cdf0e10cSrcweir 	{
2360cdf0e10cSrcweir 		bRet = pTxtNd->DontExpandFmt( rPos.nContent, bFlag );
2361cdf0e10cSrcweir         if( bRet && GetIDocumentUndoRedo().DoesUndo() )
2362cdf0e10cSrcweir         {
2363cdf0e10cSrcweir             GetIDocumentUndoRedo().AppendUndo( new SwUndoDontExpandFmt(rPos) );
2364cdf0e10cSrcweir         }
2365cdf0e10cSrcweir     }
2366cdf0e10cSrcweir 	return bRet;
2367cdf0e10cSrcweir }
2368cdf0e10cSrcweir 
MakeTableBoxFmt()2369cdf0e10cSrcweir SwTableBoxFmt* SwDoc::MakeTableBoxFmt()
2370cdf0e10cSrcweir {
2371cdf0e10cSrcweir 	SwTableBoxFmt* pFmt = new SwTableBoxFmt( GetAttrPool(), aEmptyStr,
2372cdf0e10cSrcweir 												pDfltFrmFmt );
2373cdf0e10cSrcweir 	SetModified();
2374cdf0e10cSrcweir 	return pFmt;
2375cdf0e10cSrcweir }
2376cdf0e10cSrcweir 
MakeTableLineFmt()2377cdf0e10cSrcweir SwTableLineFmt* SwDoc::MakeTableLineFmt()
2378cdf0e10cSrcweir {
2379cdf0e10cSrcweir 	SwTableLineFmt* pFmt = new SwTableLineFmt( GetAttrPool(), aEmptyStr,
2380cdf0e10cSrcweir 												pDfltFrmFmt );
2381cdf0e10cSrcweir 	SetModified();
2382cdf0e10cSrcweir 	return pFmt;
2383cdf0e10cSrcweir }
2384cdf0e10cSrcweir 
_CreateNumberFormatter()2385cdf0e10cSrcweir void SwDoc::_CreateNumberFormatter()
2386cdf0e10cSrcweir {
2387cdf0e10cSrcweir 	RTL_LOGFILE_CONTEXT_AUTHOR( aLog, "SW", "JP93722",  "SwDoc::_CreateNumberFormatter" );
2388cdf0e10cSrcweir 
2389cdf0e10cSrcweir 	ASSERT( !pNumberFormatter, "ist doch schon vorhanden" );
2390cdf0e10cSrcweir 
2391cdf0e10cSrcweir 
2392cdf0e10cSrcweir 	LanguageType eLang = LANGUAGE_SYSTEM; //System::GetLanguage();
2393cdf0e10cSrcweir /*				((const SvxLanguageItem&)GetAttrPool().
2394cdf0e10cSrcweir 					GetDefaultItem( RES_CHRATR_LANGUAGE )).GetLanguage();
2395cdf0e10cSrcweir */
2396cdf0e10cSrcweir 	Reference< XMultiServiceFactory > xMSF = ::comphelper::getProcessServiceFactory();
2397cdf0e10cSrcweir 	pNumberFormatter = new SvNumberFormatter( xMSF, eLang );
2398cdf0e10cSrcweir 	pNumberFormatter->SetEvalDateFormat( NF_EVALDATEFORMAT_FORMAT_INTL );
2399cdf0e10cSrcweir 	pNumberFormatter->SetYear2000(static_cast<sal_uInt16>(::utl::MiscCfg().GetYear2000()));
2400cdf0e10cSrcweir 
2401cdf0e10cSrcweir }
2402cdf0e10cSrcweir 
SwTblNumFmtMerge(const SwDoc & rSrc,SwDoc & rDest)2403cdf0e10cSrcweir SwTblNumFmtMerge::SwTblNumFmtMerge( const SwDoc& rSrc, SwDoc& rDest )
2404cdf0e10cSrcweir 	: pNFmt( 0 )
2405cdf0e10cSrcweir {
2406cdf0e10cSrcweir 	// ein anderes Doc -> Numberformatter muessen gemergt werden
2407cdf0e10cSrcweir 	SvNumberFormatter* pN;
2408cdf0e10cSrcweir 	if( &rSrc != &rDest && 0 != ( pN = ((SwDoc&)rSrc).GetNumberFormatter( sal_False ) ))
2409cdf0e10cSrcweir 		( pNFmt = rDest.GetNumberFormatter( sal_True ))->MergeFormatter( *pN );
2410cdf0e10cSrcweir 
2411cdf0e10cSrcweir 	if( &rSrc != &rDest )
2412cdf0e10cSrcweir 		((SwGetRefFieldType*)rSrc.GetSysFldType( RES_GETREFFLD ))->
2413cdf0e10cSrcweir 			MergeWithOtherDoc( rDest );
2414cdf0e10cSrcweir }
2415cdf0e10cSrcweir 
~SwTblNumFmtMerge()2416cdf0e10cSrcweir SwTblNumFmtMerge::~SwTblNumFmtMerge()
2417cdf0e10cSrcweir {
2418cdf0e10cSrcweir 	if( pNFmt )
2419cdf0e10cSrcweir 		pNFmt->ClearMergeTable();
2420cdf0e10cSrcweir }
2421cdf0e10cSrcweir 
2422cdf0e10cSrcweir 
SetTxtFmtCollByAutoFmt(const SwPosition & rPos,sal_uInt16 nPoolId,const SfxItemSet * pSet)2423cdf0e10cSrcweir void SwDoc::SetTxtFmtCollByAutoFmt( const SwPosition& rPos, sal_uInt16 nPoolId,
2424cdf0e10cSrcweir 									const SfxItemSet* pSet )
2425cdf0e10cSrcweir {
2426cdf0e10cSrcweir 	SwPaM aPam( rPos );
2427cdf0e10cSrcweir 	SwTxtNode* pTNd = rPos.nNode.GetNode().GetTxtNode();
2428cdf0e10cSrcweir 
2429cdf0e10cSrcweir 	if( mbIsAutoFmtRedline && pTNd )
2430cdf0e10cSrcweir 	{
2431cdf0e10cSrcweir 		// dann das Redline Object anlegen
2432cdf0e10cSrcweir 		const SwTxtFmtColl& rColl = *pTNd->GetTxtColl();
2433cdf0e10cSrcweir 		SwRedline* pRedl = new SwRedline( nsRedlineType_t::REDLINE_FMTCOLL, aPam );
2434cdf0e10cSrcweir 		pRedl->SetMark();
2435cdf0e10cSrcweir 
2436cdf0e10cSrcweir 		// interressant sind nur die Items, die vom Set NICHT wieder
2437cdf0e10cSrcweir 		// in den Node gesetzt werden. Also muss man die Differenz nehmen
2438cdf0e10cSrcweir 		SwRedlineExtraData_FmtColl aExtraData( rColl.GetName(),
2439cdf0e10cSrcweir 												rColl.GetPoolFmtId() );
2440cdf0e10cSrcweir         if( pSet && pTNd->HasSwAttrSet() )
2441cdf0e10cSrcweir 		{
2442cdf0e10cSrcweir 			SfxItemSet aTmp( *pTNd->GetpSwAttrSet() );
2443cdf0e10cSrcweir 			aTmp.Differentiate( *pSet );
2444cdf0e10cSrcweir 			// das Adjust Item behalten wir extra
2445cdf0e10cSrcweir 			const SfxPoolItem* pItem;
2446cdf0e10cSrcweir 			if( SFX_ITEM_SET == pTNd->GetpSwAttrSet()->GetItemState(
2447cdf0e10cSrcweir 					RES_PARATR_ADJUST, sal_False, &pItem ))
2448cdf0e10cSrcweir 				aTmp.Put( *pItem );
2449cdf0e10cSrcweir 			aExtraData.SetItemSet( aTmp );
2450cdf0e10cSrcweir 		}
2451cdf0e10cSrcweir 		pRedl->SetExtraData( &aExtraData );
2452cdf0e10cSrcweir 
2453cdf0e10cSrcweir // !!!!!!!!! Undo fehlt noch !!!!!!!!!!!!!!!!!!
2454cdf0e10cSrcweir 		AppendRedline( pRedl, true );
2455cdf0e10cSrcweir 	}
2456cdf0e10cSrcweir 
2457cdf0e10cSrcweir 	SetTxtFmtColl( aPam, GetTxtCollFromPool( nPoolId ) );
2458cdf0e10cSrcweir 
2459cdf0e10cSrcweir 	if( pSet && pTNd && pSet->Count() )
2460cdf0e10cSrcweir 	{
2461cdf0e10cSrcweir 		aPam.SetMark();
2462cdf0e10cSrcweir 		aPam.GetMark()->nContent.Assign( pTNd, pTNd->GetTxt().Len() );
2463cdf0e10cSrcweir         InsertItemSet( aPam, *pSet, 0 );
2464cdf0e10cSrcweir     }
2465cdf0e10cSrcweir }
2466cdf0e10cSrcweir 
SetFmtItemByAutoFmt(const SwPaM & rPam,const SfxItemSet & rSet)2467cdf0e10cSrcweir void SwDoc::SetFmtItemByAutoFmt( const SwPaM& rPam, const SfxItemSet& rSet )
2468cdf0e10cSrcweir {
2469cdf0e10cSrcweir 	SwTxtNode* pTNd = rPam.GetPoint()->nNode.GetNode().GetTxtNode();
2470cdf0e10cSrcweir 
2471cdf0e10cSrcweir 	RedlineMode_t eOld = GetRedlineMode();
2472cdf0e10cSrcweir 
2473cdf0e10cSrcweir 	if( mbIsAutoFmtRedline && pTNd )
2474cdf0e10cSrcweir 	{
2475cdf0e10cSrcweir 		// dann das Redline Object anlegen
2476cdf0e10cSrcweir 		SwRedline* pRedl = new SwRedline( nsRedlineType_t::REDLINE_FORMAT, rPam );
2477cdf0e10cSrcweir 		if( !pRedl->HasMark() )
2478cdf0e10cSrcweir 			pRedl->SetMark();
2479cdf0e10cSrcweir 
2480cdf0e10cSrcweir 		// interressant sind nur die Items, die vom Set NICHT wieder
2481cdf0e10cSrcweir 		// in den Node gesetzt werden. Also muss man die Differenz nehmen
2482cdf0e10cSrcweir 		SwRedlineExtraData_Format aExtraData( rSet );
2483cdf0e10cSrcweir 
2484cdf0e10cSrcweir /*
2485cdf0e10cSrcweir         if( pSet && pTNd->HasSwAttrSet() )
2486cdf0e10cSrcweir 		{
2487cdf0e10cSrcweir 			SfxItemSet aTmp( *pTNd->GetpSwAttrSet() );
2488cdf0e10cSrcweir 			aTmp.Differentiate( *pSet );
2489cdf0e10cSrcweir 			// das Adjust Item behalten wir extra
2490cdf0e10cSrcweir 			const SfxPoolItem* pItem;
2491cdf0e10cSrcweir 			if( SFX_ITEM_SET == pTNd->GetpSwAttrSet()->GetItemState(
2492cdf0e10cSrcweir 					RES_PARATR_ADJUST, sal_False, &pItem ))
2493cdf0e10cSrcweir 				aTmp.Put( *pItem );
2494cdf0e10cSrcweir 			aExtraData.SetItemSet( aTmp );
2495cdf0e10cSrcweir 		}
2496cdf0e10cSrcweir */
2497cdf0e10cSrcweir 		pRedl->SetExtraData( &aExtraData );
2498cdf0e10cSrcweir 
2499cdf0e10cSrcweir // !!!!!!!!! Undo fehlt noch !!!!!!!!!!!!!!!!!!
2500cdf0e10cSrcweir 		AppendRedline( pRedl, true );
2501cdf0e10cSrcweir 
2502cdf0e10cSrcweir 		SetRedlineMode_intern( (RedlineMode_t)(eOld | nsRedlineMode_t::REDLINE_IGNORE));
2503cdf0e10cSrcweir 	}
2504cdf0e10cSrcweir 
2505cdf0e10cSrcweir     InsertItemSet( rPam, rSet, nsSetAttrMode::SETATTR_DONTEXPAND );
2506cdf0e10cSrcweir 	SetRedlineMode_intern( eOld );
2507cdf0e10cSrcweir }
2508cdf0e10cSrcweir 
ChgFmt(SwFmt & rFmt,const SfxItemSet & rSet)2509cdf0e10cSrcweir void SwDoc::ChgFmt(SwFmt & rFmt, const SfxItemSet & rSet)
2510cdf0e10cSrcweir {
2511cdf0e10cSrcweir     if (GetIDocumentUndoRedo().DoesUndo())
2512cdf0e10cSrcweir     {
2513cdf0e10cSrcweir         // copying <rSet> to <aSet>
2514cdf0e10cSrcweir         SfxItemSet aSet(rSet);
2515cdf0e10cSrcweir         // remove from <aSet> all items, which are already set at the format
2516cdf0e10cSrcweir         aSet.Differentiate(rFmt.GetAttrSet());
2517cdf0e10cSrcweir         // <aSet> contains now all *new* items for the format
2518cdf0e10cSrcweir 
2519cdf0e10cSrcweir         // copying current format item set to <aOldSet>
2520cdf0e10cSrcweir         SfxItemSet aOldSet(rFmt.GetAttrSet());
2521cdf0e10cSrcweir         // insert new items into <aOldSet>
2522cdf0e10cSrcweir         aOldSet.Put(aSet);
2523cdf0e10cSrcweir         // invalidate all new items in <aOldSet> in order to clear these items,
2524cdf0e10cSrcweir         // if the undo action is triggered.
2525cdf0e10cSrcweir         {
2526cdf0e10cSrcweir             SfxItemIter aIter(aSet);
2527cdf0e10cSrcweir 
2528cdf0e10cSrcweir             const SfxPoolItem * pItem = aIter.FirstItem();
2529cdf0e10cSrcweir             while (pItem != NULL)
2530cdf0e10cSrcweir             {
2531cdf0e10cSrcweir                 aOldSet.InvalidateItem(pItem->Which());
2532cdf0e10cSrcweir 
2533cdf0e10cSrcweir                 pItem = aIter.NextItem();
2534cdf0e10cSrcweir             }
2535cdf0e10cSrcweir         }
2536cdf0e10cSrcweir 
2537cdf0e10cSrcweir         SwUndo * pUndo = new SwUndoFmtAttr(aOldSet, rFmt);
2538cdf0e10cSrcweir 
2539cdf0e10cSrcweir         GetIDocumentUndoRedo().AppendUndo(pUndo);
2540cdf0e10cSrcweir     }
2541cdf0e10cSrcweir 
2542cdf0e10cSrcweir     rFmt.SetFmtAttr(rSet);
2543cdf0e10cSrcweir }
2544cdf0e10cSrcweir 
RenameFmt(SwFmt & rFmt,const String & sNewName,sal_Bool bBroadcast)2545cdf0e10cSrcweir void SwDoc::RenameFmt(SwFmt & rFmt, const String & sNewName,
2546cdf0e10cSrcweir                       sal_Bool bBroadcast)
2547cdf0e10cSrcweir {
2548cdf0e10cSrcweir     SfxStyleFamily eFamily = SFX_STYLE_FAMILY_ALL;
2549cdf0e10cSrcweir 
2550cdf0e10cSrcweir     if (GetIDocumentUndoRedo().DoesUndo())
2551cdf0e10cSrcweir     {
2552cdf0e10cSrcweir         SwUndo * pUndo = NULL;
2553cdf0e10cSrcweir 
2554cdf0e10cSrcweir         switch (rFmt.Which())
2555cdf0e10cSrcweir         {
2556cdf0e10cSrcweir         case RES_CHRFMT:
2557cdf0e10cSrcweir             pUndo = new SwUndoRenameCharFmt(rFmt.GetName(), sNewName, this);
2558cdf0e10cSrcweir             eFamily = SFX_STYLE_FAMILY_PARA;
2559cdf0e10cSrcweir             break;
2560cdf0e10cSrcweir         case RES_TXTFMTCOLL:
2561cdf0e10cSrcweir             pUndo = new SwUndoRenameFmtColl(rFmt.GetName(), sNewName, this);
2562cdf0e10cSrcweir             eFamily = SFX_STYLE_FAMILY_CHAR;
2563cdf0e10cSrcweir             break;
2564cdf0e10cSrcweir         case RES_FRMFMT:
2565cdf0e10cSrcweir             pUndo = new SwUndoRenameFrmFmt(rFmt.GetName(), sNewName, this);
2566cdf0e10cSrcweir             eFamily = SFX_STYLE_FAMILY_FRAME;
2567cdf0e10cSrcweir             break;
2568cdf0e10cSrcweir 
2569cdf0e10cSrcweir         default:
2570cdf0e10cSrcweir             break;
2571cdf0e10cSrcweir         }
2572cdf0e10cSrcweir 
2573cdf0e10cSrcweir         if (pUndo)
2574cdf0e10cSrcweir         {
2575cdf0e10cSrcweir             GetIDocumentUndoRedo().AppendUndo(pUndo);
2576cdf0e10cSrcweir         }
2577cdf0e10cSrcweir     }
2578cdf0e10cSrcweir 
2579cdf0e10cSrcweir     rFmt.SetName(sNewName);
2580cdf0e10cSrcweir 
2581cdf0e10cSrcweir     if (bBroadcast)
2582cdf0e10cSrcweir         BroadcastStyleOperation(sNewName, eFamily, SFX_STYLESHEET_MODIFIED);
2583cdf0e10cSrcweir }
2584cdf0e10cSrcweir 
2585cdf0e10cSrcweir // --> OD 2006-09-27 #i69627#
2586cdf0e10cSrcweir namespace docfunc
2587cdf0e10cSrcweir {
HasOutlineStyleToBeWrittenAsNormalListStyle(SwDoc & rDoc)2588cdf0e10cSrcweir     bool HasOutlineStyleToBeWrittenAsNormalListStyle( SwDoc& rDoc )
2589cdf0e10cSrcweir     {
2590cdf0e10cSrcweir         // If a parent paragraph style of one of the parargraph styles, which
2591cdf0e10cSrcweir         // are assigned to the list levels of the outline style, has a list style
2592cdf0e10cSrcweir         // set or inherits a list style from its parent style, the outline style
2593cdf0e10cSrcweir         // has to be written as a normal list style to the OpenDocument file
2594cdf0e10cSrcweir         // format or the OpenOffice.org file format.
2595cdf0e10cSrcweir         bool bRet( false );
2596cdf0e10cSrcweir 
2597cdf0e10cSrcweir         const SwTxtFmtColls* pTxtFmtColls( rDoc.GetTxtFmtColls() );
2598cdf0e10cSrcweir         if ( pTxtFmtColls )
2599cdf0e10cSrcweir         {
2600cdf0e10cSrcweir             const sal_uInt16 nCount = pTxtFmtColls->Count();
2601cdf0e10cSrcweir             for ( sal_uInt16 i = 0; i < nCount; ++i )
2602cdf0e10cSrcweir             {
2603cdf0e10cSrcweir                 SwTxtFmtColl* pTxtFmtColl = (*pTxtFmtColls)[i];
2604cdf0e10cSrcweir 
2605cdf0e10cSrcweir                 if ( pTxtFmtColl->IsDefault() ||
2606cdf0e10cSrcweir                    //  pTxtFmtColl->GetOutlineLevel() == NO_NUMBERING ) //#outline level,zhaojianwei
2607cdf0e10cSrcweir 					! pTxtFmtColl->IsAssignedToListLevelOfOutlineStyle() )	//<-end,zhaojianwei
2608cdf0e10cSrcweir                 {
2609cdf0e10cSrcweir                     continue;
2610cdf0e10cSrcweir                 }
2611cdf0e10cSrcweir 
2612cdf0e10cSrcweir                 const SwTxtFmtColl* pParentTxtFmtColl =
2613cdf0e10cSrcweir                    dynamic_cast<const SwTxtFmtColl*>( pTxtFmtColl->DerivedFrom());
2614cdf0e10cSrcweir                 if ( !pParentTxtFmtColl )
2615cdf0e10cSrcweir                     continue;
2616cdf0e10cSrcweir 
2617cdf0e10cSrcweir                 if ( SFX_ITEM_SET == pParentTxtFmtColl->GetItemState( RES_PARATR_NUMRULE ) )
2618cdf0e10cSrcweir                 {
2619cdf0e10cSrcweir                     // --> OD 2009-11-12 #i106218#
2620cdf0e10cSrcweir                     // consider that the outline style is set
2621cdf0e10cSrcweir                     const SwNumRuleItem& rDirectItem = pParentTxtFmtColl->GetNumRule();
2622cdf0e10cSrcweir                     if ( rDirectItem.GetValue() != rDoc.GetOutlineNumRule()->GetName() )
2623cdf0e10cSrcweir                     {
2624cdf0e10cSrcweir                         bRet = true;
2625cdf0e10cSrcweir                         break;
2626cdf0e10cSrcweir                     }
2627cdf0e10cSrcweir                     // <--
2628cdf0e10cSrcweir                 }
2629cdf0e10cSrcweir             }
2630cdf0e10cSrcweir 
2631cdf0e10cSrcweir         }
2632cdf0e10cSrcweir         return bRet;
2633cdf0e10cSrcweir     }
2634cdf0e10cSrcweir }
2635cdf0e10cSrcweir // <--
2636