xref: /trunk/main/sw/source/core/doc/docftn.cxx (revision efeef26f)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sw.hxx"
26 
27 
28 #include <ftnidx.hxx>
29 #include <rootfrm.hxx>
30 #include <txtftn.hxx>
31 #include <fmtftn.hxx>
32 #include <pam.hxx>
33 #include <pagedesc.hxx>
34 #include <charfmt.hxx>
35 #include <UndoAttribute.hxx>
36 #include <hints.hxx>
37 #include <rolbck.hxx>
38 #include <doc.hxx>
39 #include <IDocumentUndoRedo.hxx>
40 #include <ndtxt.hxx>
41 #include <poolfmt.hxx>
42 #include <ftninfo.hxx>
43 
44 /*********************** SwFtnInfo ***************************/
45 
operator =(const SwEndNoteInfo & rInfo)46 SwEndNoteInfo& SwEndNoteInfo::operator=(const SwEndNoteInfo& rInfo)
47 {
48 	if( rInfo.GetFtnTxtColl() )
49 		rInfo.GetFtnTxtColl()->Add(this);
50 	else if ( GetRegisteredIn())
51 		GetRegisteredInNonConst()->Remove(this);
52 
53 	if ( rInfo.aPageDescDep.GetRegisteredIn() )
54 		((SwModify*)rInfo.aPageDescDep.GetRegisteredIn())->Add( &aPageDescDep );
55 	else if ( aPageDescDep.GetRegisteredIn() )
56 		((SwModify*)aPageDescDep.GetRegisteredIn())->Remove( &aPageDescDep );
57 
58 	if ( rInfo.aCharFmtDep.GetRegisteredIn() )
59 		((SwModify*)rInfo.aCharFmtDep.GetRegisteredIn())->Add( &aCharFmtDep );
60 	else if ( aCharFmtDep.GetRegisteredIn() )
61 		((SwModify*)aCharFmtDep.GetRegisteredIn())->Remove( &aCharFmtDep );
62 
63 	if ( rInfo.aAnchorCharFmtDep.GetRegisteredIn() )
64 		((SwModify*)rInfo.aAnchorCharFmtDep.GetRegisteredIn())->Add(
65 													&aAnchorCharFmtDep );
66 	else if( aAnchorCharFmtDep.GetRegisteredIn() )
67 		((SwModify*)aAnchorCharFmtDep.GetRegisteredIn())->Remove(
68 													&aAnchorCharFmtDep );
69 
70 	aFmt = rInfo.aFmt;
71 	nFtnOffset = rInfo.nFtnOffset;
72     m_bEndNote = rInfo.m_bEndNote;
73 	sPrefix = rInfo.sPrefix;
74 	sSuffix = rInfo.sSuffix;
75 	return *this;
76 }
77 
78 
operator ==(const SwEndNoteInfo & rInfo) const79 sal_Bool SwEndNoteInfo::operator==( const SwEndNoteInfo& rInfo ) const
80 {
81 	return  aPageDescDep.GetRegisteredIn() ==
82 								rInfo.aPageDescDep.GetRegisteredIn() &&
83 			aCharFmtDep.GetRegisteredIn() ==
84 								rInfo.aCharFmtDep.GetRegisteredIn() &&
85 			aAnchorCharFmtDep.GetRegisteredIn() ==
86 								rInfo.aAnchorCharFmtDep.GetRegisteredIn() &&
87 			GetFtnTxtColl() == rInfo.GetFtnTxtColl() &&
88 			aFmt.GetNumberingType() == rInfo.aFmt.GetNumberingType() &&
89 			nFtnOffset == rInfo.nFtnOffset &&
90             m_bEndNote == rInfo.m_bEndNote &&
91 			sPrefix == rInfo.sPrefix &&
92 			sSuffix == rInfo.sSuffix;
93 }
94 
95 
SwEndNoteInfo(const SwEndNoteInfo & rInfo)96 SwEndNoteInfo::SwEndNoteInfo(const SwEndNoteInfo& rInfo) :
97 	SwClient( rInfo.GetFtnTxtColl() ),
98 	aPageDescDep( this, 0 ),
99 	aCharFmtDep( this, 0 ),
100 	aAnchorCharFmtDep( this, 0 ),
101 	sPrefix( rInfo.sPrefix ),
102 	sSuffix( rInfo.sSuffix ),
103     m_bEndNote( true ),
104 	aFmt( rInfo.aFmt ),
105 	nFtnOffset( rInfo.nFtnOffset )
106 {
107 	if( rInfo.aPageDescDep.GetRegisteredIn() )
108 		((SwModify*)rInfo.aPageDescDep.GetRegisteredIn())->Add( &aPageDescDep );
109 
110 	if( rInfo.aCharFmtDep.GetRegisteredIn() )
111 		((SwModify*)rInfo.aCharFmtDep.GetRegisteredIn())->Add( &aCharFmtDep );
112 
113 	if( rInfo.aAnchorCharFmtDep.GetRegisteredIn() )
114 		((SwModify*)rInfo.aAnchorCharFmtDep.GetRegisteredIn())->Add(
115 				&aAnchorCharFmtDep );
116 }
117 
SwEndNoteInfo(SwTxtFmtColl * pFmt)118 SwEndNoteInfo::SwEndNoteInfo(SwTxtFmtColl *pFmt) :
119 	SwClient(pFmt),
120 	aPageDescDep( this, 0 ),
121 	aCharFmtDep( this, 0 ),
122 	aAnchorCharFmtDep( this, 0 ),
123     m_bEndNote( true ),
124 	nFtnOffset( 0 )
125 {
126 	aFmt.SetNumberingType(SVX_NUM_ROMAN_LOWER);
127 }
128 
GetPageDesc(SwDoc & rDoc) const129 SwPageDesc *SwEndNoteInfo::GetPageDesc( SwDoc &rDoc ) const
130 {
131 	if ( !aPageDescDep.GetRegisteredIn() )
132 	{
133 		SwPageDesc *pDesc = rDoc.GetPageDescFromPool( static_cast<sal_uInt16>(
134             m_bEndNote ? RES_POOLPAGE_ENDNOTE   : RES_POOLPAGE_FOOTNOTE ) );
135 		pDesc->Add( &((SwClient&)aPageDescDep) );
136 	}
137 
138 	return (SwPageDesc*)( aPageDescDep.GetRegisteredIn() );
139 }
140 
KnowsPageDesc() const141 bool SwEndNoteInfo::KnowsPageDesc() const
142 {
143     return (aPageDescDep.GetRegisteredIn() != 0);
144 }
145 
DependsOn(const SwPageDesc * pDesc) const146 bool SwEndNoteInfo::DependsOn( const SwPageDesc* pDesc ) const
147 {
148     return ( aPageDescDep.GetRegisteredIn() == pDesc );
149 }
150 
ChgPageDesc(SwPageDesc * pDesc)151 void SwEndNoteInfo::ChgPageDesc( SwPageDesc *pDesc )
152 {
153 	pDesc->Add( &((SwClient&)aPageDescDep) );
154 }
155 
SetFtnTxtColl(SwTxtFmtColl & rFmt)156 void SwEndNoteInfo::SetFtnTxtColl(SwTxtFmtColl& rFmt)
157 {
158 	rFmt.Add(this);
159 }
160 
GetCharFmt(SwDoc & rDoc) const161 SwCharFmt* SwEndNoteInfo::GetCharFmt(SwDoc &rDoc) const
162 {
163 	if ( !aCharFmtDep.GetRegisteredIn() )
164 	{
165 		SwCharFmt* pFmt = rDoc.GetCharFmtFromPool( static_cast<sal_uInt16>(
166             m_bEndNote ? RES_POOLCHR_ENDNOTE : RES_POOLCHR_FOOTNOTE ) );
167 		pFmt->Add( &((SwClient&)aCharFmtDep) );
168 	}
169 	return (SwCharFmt*)aCharFmtDep.GetRegisteredIn();
170 }
171 
SetCharFmt(SwCharFmt * pChFmt)172 void SwEndNoteInfo::SetCharFmt( SwCharFmt* pChFmt )
173 {
174 	DBG_ASSERT(pChFmt, "kein CharFmt?");
175 	pChFmt->Add( &((SwClient&)aCharFmtDep) );
176 }
177 
GetAnchorCharFmt(SwDoc & rDoc) const178 SwCharFmt* SwEndNoteInfo::GetAnchorCharFmt(SwDoc &rDoc) const
179 {
180 	if( !aAnchorCharFmtDep.GetRegisteredIn() )
181 	{
182 		SwCharFmt* pFmt = rDoc.GetCharFmtFromPool( static_cast<sal_uInt16>(
183             m_bEndNote ? RES_POOLCHR_ENDNOTE_ANCHOR : RES_POOLCHR_FOOTNOTE_ANCHOR ) );
184 		pFmt->Add( &((SwClient&)aAnchorCharFmtDep) );
185 	}
186 	return (SwCharFmt*)aAnchorCharFmtDep.GetRegisteredIn();
187 }
188 
SetAnchorCharFmt(SwCharFmt * pChFmt)189 void SwEndNoteInfo::SetAnchorCharFmt( SwCharFmt* pChFmt )
190 {
191 	DBG_ASSERT(pChFmt, "kein CharFmt?");
192 	pChFmt->Add( &((SwClient&)aAnchorCharFmtDep) );
193 }
194 
Modify(const SfxPoolItem * pOld,const SfxPoolItem * pNew)195 void SwEndNoteInfo::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew )
196 {
197 	sal_uInt16 nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0 ;
198 
199 	if( RES_ATTRSET_CHG == nWhich ||
200 		RES_FMT_CHG == nWhich )
201 	{
202 		SwDoc* pDoc;
203 		if( aCharFmtDep.GetRegisteredIn() )
204 			pDoc = ((SwCharFmt*)aCharFmtDep.GetRegisteredIn())->GetDoc();
205 		else
206 			pDoc = ((SwCharFmt*)aAnchorCharFmtDep.GetRegisteredIn())->GetDoc();
207 		SwFtnIdxs& rFtnIdxs = pDoc->GetFtnIdxs();
208 		for( sal_uInt16 nPos = 0; nPos < rFtnIdxs.Count(); ++nPos )
209 		{
210 			SwTxtFtn *pTxtFtn = rFtnIdxs[ nPos ];
211 			const SwFmtFtn &rFtn = pTxtFtn->GetFtn();
212             if ( rFtn.IsEndNote() == m_bEndNote )
213             {
214 				pTxtFtn->SetNumber( rFtn.GetNumber(), &rFtn.GetNumStr());
215             }
216 		}
217 	}
218 	else
219 		CheckRegistration( pOld, pNew );
220 }
221 
operator =(const SwFtnInfo & rInfo)222 SwFtnInfo& SwFtnInfo::operator=(const SwFtnInfo& rInfo)
223 {
224 	SwEndNoteInfo::operator=(rInfo);
225 	aQuoVadis =  rInfo.aQuoVadis;
226 	aErgoSum = rInfo.aErgoSum;
227 	ePos = rInfo.ePos;
228 	eNum = rInfo.eNum;
229 	return *this;
230 }
231 
232 
operator ==(const SwFtnInfo & rInfo) const233 sal_Bool SwFtnInfo::operator==( const SwFtnInfo& rInfo ) const
234 {
235 	return	ePos == rInfo.ePos &&
236 			eNum == rInfo.eNum &&
237 			SwEndNoteInfo::operator==(rInfo) &&
238 			aQuoVadis == rInfo.aQuoVadis &&
239 			aErgoSum == rInfo.aErgoSum;
240 }
241 
242 
SwFtnInfo(const SwFtnInfo & rInfo)243 SwFtnInfo::SwFtnInfo(const SwFtnInfo& rInfo) :
244 	SwEndNoteInfo( rInfo ),
245 	aQuoVadis( rInfo.aQuoVadis ),
246 	aErgoSum( rInfo.aErgoSum ),
247 	ePos( rInfo.ePos ),
248 	eNum( rInfo.eNum )
249 {
250     m_bEndNote = false;
251 }
252 
SwFtnInfo(SwTxtFmtColl * pFmt)253 SwFtnInfo::SwFtnInfo(SwTxtFmtColl *pFmt) :
254 	SwEndNoteInfo( pFmt ),
255 	ePos( FTNPOS_PAGE ),
256 	eNum( FTNNUM_DOC )
257 {
258 	aFmt.SetNumberingType(SVX_NUM_ARABIC);
259     m_bEndNote = false;
260 }
261 
262 /*********************** SwDoc ***************************/
263 
264 
SetFtnInfo(const SwFtnInfo & rInfo)265 void SwDoc::SetFtnInfo(const SwFtnInfo& rInfo)
266 {
267 	SwRootFrm* pTmpRoot = GetCurrentLayout();//swmod 080219
268 	if( !(GetFtnInfo() == rInfo) )
269 	{
270 		const SwFtnInfo &rOld = GetFtnInfo();
271 
272         if (GetIDocumentUndoRedo().DoesUndo())
273         {
274             GetIDocumentUndoRedo().AppendUndo( new SwUndoFootNoteInfo(rOld) );
275         }
276 
277 		sal_Bool bFtnPos  = rInfo.ePos != rOld.ePos;
278 		sal_Bool bFtnDesc = rOld.ePos == FTNPOS_CHAPTER &&
279 							rInfo.GetPageDesc( *this ) != rOld.GetPageDesc( *this );
280 		sal_Bool bExtra   = rInfo.aQuoVadis != rOld.aQuoVadis ||
281 							rInfo.aErgoSum != rOld.aErgoSum ||
282 							rInfo.aFmt.GetNumberingType() != rOld.aFmt.GetNumberingType() ||
283 							rInfo.GetPrefix() != rOld.GetPrefix() ||
284 							rInfo.GetSuffix() != rOld.GetSuffix();
285 		SwCharFmt *pOldChrFmt = rOld.GetCharFmt( *this ),
286 				  *pNewChrFmt = rInfo.GetCharFmt( *this );
287 		sal_Bool bFtnChrFmts = pOldChrFmt != pNewChrFmt;
288 
289 		*pFtnInfo = rInfo;
290 
291 		if (pTmpRoot)
292 		{
293 			std::set<SwRootFrm*> aAllLayouts = GetAllLayouts();//swmod 080304
294 			if ( bFtnPos )
295 				//pTmpRoot->RemoveFtns();
296 				std::for_each( aAllLayouts.begin(), aAllLayouts.end(),std::mem_fun(&SwRootFrm::AllRemoveFtns));//swmod 080305
297 			else
298 			{
299 				//pTmpRoot->UpdateFtnNums();
300 				std::for_each( aAllLayouts.begin(), aAllLayouts.end(),std::mem_fun(&SwRootFrm::UpdateFtnNums));//swmod 080304
301 				if ( bFtnDesc )
302 					//pTmpRoot->CheckFtnPageDescs( FALSE );
303 					std::for_each( aAllLayouts.begin(), aAllLayouts.end(),std::bind2nd(std::mem_fun(&SwRootFrm::CheckFtnPageDescs), sal_False));//swmod 080304
304 				if ( bExtra )
305 				{
306 					//Fuer die Benachrichtung bezueglich ErgoSum usw. sparen wir uns
307 					//extra-Code und nutzen die vorhandenen Wege.
308 					SwFtnIdxs& rFtnIdxs = GetFtnIdxs();
309 					for( sal_uInt16 nPos = 0; nPos < rFtnIdxs.Count(); ++nPos )
310 					{
311 						SwTxtFtn *pTxtFtn = rFtnIdxs[ nPos ];
312 						const SwFmtFtn &rFtn = pTxtFtn->GetFtn();
313 						if ( !rFtn.IsEndNote() )
314 							pTxtFtn->SetNumber( rFtn.GetNumber(), &rFtn.GetNumStr());
315 					}
316 				}
317 			}
318 		}	//swmod 080219
319 		if( FTNNUM_PAGE != rInfo.eNum )
320 			GetFtnIdxs().UpdateAllFtn();
321 		else if( bFtnChrFmts )
322 		{
323 			SwFmtChg aOld( pOldChrFmt );
324 			SwFmtChg aNew( pNewChrFmt );
325 			pFtnInfo->ModifyNotification( &aOld, &aNew );
326 		}
327 
328         // --> OD 2008-01-09 #i81002#
329         // no update during loading
330         if ( !IsInReading() )
331         {
332             UpdateRefFlds(NULL);
333         }
334         SetModified();
335 	}
336 }
337 
SetEndNoteInfo(const SwEndNoteInfo & rInfo)338 void SwDoc::SetEndNoteInfo(const SwEndNoteInfo& rInfo)
339 {
340 	SwRootFrm* pTmpRoot = GetCurrentLayout();//swmod 080219
341 	if( !(GetEndNoteInfo() == rInfo) )
342 	{
343         if(GetIDocumentUndoRedo().DoesUndo())
344         {
345             SwUndo *const pUndo( new SwUndoEndNoteInfo( GetEndNoteInfo() ) );
346             GetIDocumentUndoRedo().AppendUndo(pUndo);
347         }
348 
349 		sal_Bool bNumChg  = rInfo.nFtnOffset != GetEndNoteInfo().nFtnOffset;
350         // this seems to be an optimization: UpdateAllFtn() is only called
351         // if the offset changes; if the offset is the same,
352         // but type/prefix/suffix changes, just set new numbers.
353         bool const bExtra = !bNumChg &&
354                 (   (rInfo.aFmt.GetNumberingType() !=
355                         GetEndNoteInfo().aFmt.GetNumberingType())
356                 ||  (rInfo.GetPrefix() != GetEndNoteInfo().GetPrefix())
357                 ||  (rInfo.GetSuffix() != GetEndNoteInfo().GetSuffix())
358                 );
359 		sal_Bool bFtnDesc = rInfo.GetPageDesc( *this ) !=
360 							GetEndNoteInfo().GetPageDesc( *this );
361 		SwCharFmt *pOldChrFmt = GetEndNoteInfo().GetCharFmt( *this ),
362 				  *pNewChrFmt = rInfo.GetCharFmt( *this );
363 		sal_Bool bFtnChrFmts = pOldChrFmt != pNewChrFmt;
364 
365 		*pEndNoteInfo = rInfo;
366 
367 		if ( pTmpRoot )
368 		{
369 			if ( bFtnDesc )
370 				//pTmpRoot->CheckFtnPageDescs( TRUE );
371 			{
372 				std::set<SwRootFrm*> aAllLayouts = GetAllLayouts();
373 			    std::for_each( aAllLayouts.begin(), aAllLayouts.end(),std::bind2nd(std::mem_fun(&SwRootFrm::CheckFtnPageDescs), sal_True));//swmod 080304
374 			}
375 			if ( bExtra )
376 			{
377 				//Fuer die Benachrichtung bezueglich ErgoSum usw. sparen wir uns
378 				//extra-Code und nutzen die vorhandenen Wege.
379 				SwFtnIdxs& rFtnIdxs = GetFtnIdxs();
380 				for( sal_uInt16 nPos = 0; nPos < rFtnIdxs.Count(); ++nPos )
381 				{
382 					SwTxtFtn *pTxtFtn = rFtnIdxs[ nPos ];
383 					const SwFmtFtn &rFtn = pTxtFtn->GetFtn();
384 					if ( rFtn.IsEndNote() )
385 						pTxtFtn->SetNumber( rFtn.GetNumber(), &rFtn.GetNumStr());
386 				}
387 			}
388 		}	//swmod 080219
389 		if( bNumChg )
390 			GetFtnIdxs().UpdateAllFtn();
391 		else if( bFtnChrFmts )
392 		{
393 			SwFmtChg aOld( pOldChrFmt );
394 			SwFmtChg aNew( pNewChrFmt );
395 			pEndNoteInfo->ModifyNotification( &aOld, &aNew );
396 		}
397 
398         // --> OD 2008-01-09 #i81002#
399         // no update during loading
400         if ( !IsInReading() )
401         {
402             UpdateRefFlds(NULL);
403         }
404 		SetModified();
405 	}
406 }
407 
408 
SetCurFtn(const SwPaM & rPam,const String & rNumStr,sal_uInt16 nNumber,bool bIsEndNote)409 bool SwDoc::SetCurFtn( const SwPaM& rPam, const String& rNumStr,
410                        sal_uInt16 nNumber, bool bIsEndNote )
411 {
412 	SwFtnIdxs& rFtnArr = GetFtnIdxs();
413 	SwRootFrm* pTmpRoot = GetCurrentLayout();//swmod 080219
414 
415 	const SwPosition* pStt = rPam.Start(), *pEnd = rPam.End();
416 	const sal_uLong nSttNd = pStt->nNode.GetIndex();
417 	const xub_StrLen nSttCnt = pStt->nContent.GetIndex();
418 	const sal_uLong nEndNd = pEnd->nNode.GetIndex();
419 	const xub_StrLen nEndCnt = pEnd->nContent.GetIndex();
420 
421 	sal_uInt16 nPos;
422 	rFtnArr.SeekEntry( pStt->nNode, &nPos );
423 
424     SwUndoChangeFootNote* pUndo = 0;
425     if (GetIDocumentUndoRedo().DoesUndo())
426     {
427         GetIDocumentUndoRedo().ClearRedo(); // AppendUndo far below, so leave it
428         pUndo = new SwUndoChangeFootNote( rPam, rNumStr, nNumber, bIsEndNote );
429     }
430 
431 	SwTxtFtn* pTxtFtn;
432 	sal_uLong nIdx;
433 	sal_Bool bChg = sal_False;
434 	sal_Bool bTypeChgd = sal_False;
435 	sal_uInt16 n = nPos;		// sichern
436 	while( nPos < rFtnArr.Count() &&
437 			(( nIdx = _SwTxtFtn_GetIndex((pTxtFtn = rFtnArr[ nPos++ ] )))
438 				< nEndNd || ( nIdx == nEndNd &&
439 				nEndCnt >= *pTxtFtn->GetStart() )) )
440 		if( nIdx > nSttNd || ( nIdx == nSttNd &&
441 				nSttCnt <= *pTxtFtn->GetStart() ) )
442 		{
443 			const SwFmtFtn& rFtn = pTxtFtn->GetFtn();
444 			if( /*rFtn.GetNumber() != nNumber ||*/
445 				rFtn.GetNumStr() != rNumStr ||
446 				rFtn.IsEndNote() != bIsEndNote )
447 			{
448 				bChg = sal_True;
449                 if ( pUndo )
450                 {
451                     pUndo->GetHistory().Add( *pTxtFtn );
452                 }
453 
454 				pTxtFtn->SetNumber( nNumber, &rNumStr );
455 				if( rFtn.IsEndNote() != bIsEndNote )
456 				{
457 					((SwFmtFtn&)rFtn).SetEndNote( bIsEndNote );
458 					bTypeChgd = sal_True;
459 					pTxtFtn->CheckCondColl();
460                     //#i11339# dispose UNO wrapper when a footnote is changed to an endnote or vice versa
461                     SwPtrMsgPoolItem aMsgHint( RES_FOOTNOTE_DELETED, (void*)&pTxtFtn->GetAttr() );
462                     GetUnoCallBack()->ModifyNotification( &aMsgHint, &aMsgHint );
463                 }
464 			}
465 		}
466 
467 	nPos = n;		// nach vorne gibt es auch noch welche !
468 	while( nPos &&
469 			(( nIdx = _SwTxtFtn_GetIndex((pTxtFtn = rFtnArr[ --nPos ] )))
470 				> nSttNd || ( nIdx == nSttNd &&
471 				nSttCnt <= *pTxtFtn->GetStart() )) )
472 		if( nIdx < nEndNd || ( nIdx == nEndNd &&
473 			nEndCnt >= *pTxtFtn->GetStart() ) )
474 		{
475 			const SwFmtFtn& rFtn = pTxtFtn->GetFtn();
476 			if( /*rFtn.GetNumber() != nNumber ||*/
477 				rFtn.GetNumStr() != rNumStr ||
478 				rFtn.IsEndNote() != bIsEndNote )
479 			{
480 				bChg = sal_True;
481                 if ( pUndo )
482                 {
483                     pUndo->GetHistory().Add( *pTxtFtn );
484                 }
485 
486 				pTxtFtn->SetNumber( nNumber, &rNumStr );
487 				if( rFtn.IsEndNote() != bIsEndNote )
488 				{
489 					((SwFmtFtn&)rFtn).SetEndNote( bIsEndNote );
490 					bTypeChgd = sal_True;
491 					pTxtFtn->CheckCondColl();
492 				}
493 			}
494 		}
495 
496 	// wer muss angestossen werden ??
497 	if( bChg )
498 	{
499 		if( pUndo )
500         {
501             GetIDocumentUndoRedo().AppendUndo(pUndo);
502         }
503 
504 		if ( bTypeChgd )
505 			rFtnArr.UpdateAllFtn();
506 		if( FTNNUM_PAGE != GetFtnInfo().eNum )
507 		{
508 			if ( !bTypeChgd )
509 				rFtnArr.UpdateAllFtn();
510 		}
511 		else if( pTmpRoot )
512 			//
513 		{
514 			std::set<SwRootFrm*> aAllLayouts = GetAllLayouts();
515 			std::for_each( aAllLayouts.begin(), aAllLayouts.end(),std::mem_fun(&SwRootFrm::UpdateFtnNums));
516 		}	//swmod 080304pTmpRoot->UpdateFtnNums();	//swmod 080219
517         SetModified();
518 	}
519 	else
520 		delete pUndo;
521 	return bChg;
522 }
523 
524 
525 
526 
527 
528