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