xref: /aoo42x/main/sw/source/core/txtnode/atrftn.cxx (revision dec99bbd)
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 
29cdf0e10cSrcweir #define _SVSTDARR_USHORTS
30cdf0e10cSrcweir #define _SVSTDARR_USHORTSSORT
31cdf0e10cSrcweir #include <svl/svstdarr.hxx>
32cdf0e10cSrcweir #include <doc.hxx>
33cdf0e10cSrcweir #include <cntfrm.hxx>       // ASSERT in ~SwTxtFtn()
34cdf0e10cSrcweir #include <pagefrm.hxx>      // RemoveFtn()
35cdf0e10cSrcweir #include <fmtftn.hxx>
36cdf0e10cSrcweir #include <txtftn.hxx>
37cdf0e10cSrcweir #include <ftnidx.hxx>
38cdf0e10cSrcweir #include <ftninfo.hxx>
39cdf0e10cSrcweir #include <swfont.hxx>
40cdf0e10cSrcweir #include <ndtxt.hxx>
41cdf0e10cSrcweir #include <poolfmt.hxx>
42cdf0e10cSrcweir #include <ftnfrm.hxx>
43cdf0e10cSrcweir #include <ndindex.hxx>
44cdf0e10cSrcweir #include <fmtftntx.hxx>
45cdf0e10cSrcweir #include <section.hxx>
46cdf0e10cSrcweir #include <switerator.hxx>
47cdf0e10cSrcweir 
48cdf0e10cSrcweir /*************************************************************************
49cdf0e10cSrcweir |*
50cdf0e10cSrcweir |*    class SwFmtFtn
51cdf0e10cSrcweir |*
52cdf0e10cSrcweir *************************************************************************/
53cdf0e10cSrcweir 
54cdf0e10cSrcweir 
SwFmtFtn(bool bEndNote)55cdf0e10cSrcweir SwFmtFtn::SwFmtFtn( bool bEndNote )
56cdf0e10cSrcweir 	: SfxPoolItem( RES_TXTATR_FTN ),
57cdf0e10cSrcweir     pTxtAttr( 0 ),
58cdf0e10cSrcweir     nNumber( 0 ),
59cdf0e10cSrcweir     m_bEndNote( bEndNote )
60cdf0e10cSrcweir {
61cdf0e10cSrcweir }
62cdf0e10cSrcweir 
63cdf0e10cSrcweir 
operator ==(const SfxPoolItem & rAttr) const64cdf0e10cSrcweir int SwFmtFtn::operator==( const SfxPoolItem& rAttr ) const
65cdf0e10cSrcweir {
66cdf0e10cSrcweir 	ASSERT( SfxPoolItem::operator==( rAttr ), "keine gleichen Attribute" );
67cdf0e10cSrcweir 	return nNumber	== ((SwFmtFtn&)rAttr).nNumber &&
68cdf0e10cSrcweir 		   aNumber	== ((SwFmtFtn&)rAttr).aNumber &&
69cdf0e10cSrcweir            m_bEndNote == ((SwFmtFtn&)rAttr).m_bEndNote;
70cdf0e10cSrcweir }
71cdf0e10cSrcweir 
72cdf0e10cSrcweir 
Clone(SfxItemPool *) const73cdf0e10cSrcweir SfxPoolItem* SwFmtFtn::Clone( SfxItemPool* ) const
74cdf0e10cSrcweir {
75cdf0e10cSrcweir 	SwFmtFtn* pNew	= new SwFmtFtn;
76cdf0e10cSrcweir 	pNew->aNumber	= aNumber;
77cdf0e10cSrcweir 	pNew->nNumber	= nNumber;
78cdf0e10cSrcweir     pNew->m_bEndNote = m_bEndNote;
79cdf0e10cSrcweir 	return pNew;
80cdf0e10cSrcweir }
81cdf0e10cSrcweir 
SetEndNote(bool b)82cdf0e10cSrcweir void SwFmtFtn::SetEndNote( bool b )
83cdf0e10cSrcweir {
84cdf0e10cSrcweir     if ( b != m_bEndNote )
85cdf0e10cSrcweir     {
86cdf0e10cSrcweir         if ( GetTxtFtn() )
87cdf0e10cSrcweir         {
88cdf0e10cSrcweir             GetTxtFtn()->DelFrms(0);
89cdf0e10cSrcweir         }
90cdf0e10cSrcweir         m_bEndNote = b;
91cdf0e10cSrcweir     }
92cdf0e10cSrcweir }
93cdf0e10cSrcweir 
~SwFmtFtn()94cdf0e10cSrcweir SwFmtFtn::~SwFmtFtn()
95cdf0e10cSrcweir {
96cdf0e10cSrcweir }
97cdf0e10cSrcweir 
98cdf0e10cSrcweir 
GetFtnText(XubString & rStr) const99cdf0e10cSrcweir void SwFmtFtn::GetFtnText( XubString& rStr ) const
100cdf0e10cSrcweir {
101cdf0e10cSrcweir 	if( pTxtAttr->GetStartNode() )
102cdf0e10cSrcweir 	{
103cdf0e10cSrcweir 		SwNodeIndex aIdx( *pTxtAttr->GetStartNode(), 1 );
104cdf0e10cSrcweir 		SwCntntNode* pCNd = aIdx.GetNode().GetTxtNode();
105cdf0e10cSrcweir 		if( !pCNd )
106cdf0e10cSrcweir 			pCNd = aIdx.GetNodes().GoNext( &aIdx );
107cdf0e10cSrcweir 
108cdf0e10cSrcweir 		if( pCNd->IsTxtNode() )
109cdf0e10cSrcweir 			rStr = ((SwTxtNode*)pCNd)->GetExpandTxt();
110cdf0e10cSrcweir 	}
111cdf0e10cSrcweir }
112cdf0e10cSrcweir 
113cdf0e10cSrcweir 	// returnt den anzuzeigenden String der Fuss-/Endnote
GetViewNumStr(const SwDoc & rDoc,sal_Bool bInclStrings) const114cdf0e10cSrcweir XubString SwFmtFtn::GetViewNumStr( const SwDoc& rDoc, sal_Bool bInclStrings ) const
115cdf0e10cSrcweir {
116cdf0e10cSrcweir 	XubString sRet( GetNumStr() );
117cdf0e10cSrcweir 	if( !sRet.Len() )
118cdf0e10cSrcweir 	{
119cdf0e10cSrcweir 		// dann ist die Nummer von Interesse, also ueber die Info diese
120cdf0e10cSrcweir 		// besorgen.
121cdf0e10cSrcweir 		sal_Bool bMakeNum = sal_True;
122cdf0e10cSrcweir 		const SwSectionNode* pSectNd = pTxtAttr
123cdf0e10cSrcweir 					? SwUpdFtnEndNtAtEnd::FindSectNdWithEndAttr( *pTxtAttr )
124cdf0e10cSrcweir 					: 0;
125cdf0e10cSrcweir 
126cdf0e10cSrcweir 		if( pSectNd )
127cdf0e10cSrcweir 		{
128cdf0e10cSrcweir 			const SwFmtFtnEndAtTxtEnd& rFtnEnd = (SwFmtFtnEndAtTxtEnd&)
129cdf0e10cSrcweir                 pSectNd->GetSection().GetFmt()->GetFmtAttr(
130cdf0e10cSrcweir 					            IsEndNote() ?
131cdf0e10cSrcweir                                 static_cast<sal_uInt16>(RES_END_AT_TXTEND) :
132cdf0e10cSrcweir                                 static_cast<sal_uInt16>(RES_FTN_AT_TXTEND) );
133cdf0e10cSrcweir 
134cdf0e10cSrcweir 			if( FTNEND_ATTXTEND_OWNNUMANDFMT == rFtnEnd.GetValue() )
135cdf0e10cSrcweir 			{
136cdf0e10cSrcweir 				bMakeNum = sal_False;
137cdf0e10cSrcweir 				sRet = rFtnEnd.GetSwNumType().GetNumStr( GetNumber() );
138cdf0e10cSrcweir 				if( bInclStrings )
139cdf0e10cSrcweir 				{
140cdf0e10cSrcweir 					sRet.Insert( rFtnEnd.GetPrefix(), 0 );
141cdf0e10cSrcweir 					sRet += rFtnEnd.GetSuffix();
142cdf0e10cSrcweir 				}
143cdf0e10cSrcweir 			}
144cdf0e10cSrcweir 		}
145cdf0e10cSrcweir 
146cdf0e10cSrcweir 		if( bMakeNum )
147cdf0e10cSrcweir 		{
148cdf0e10cSrcweir 			const SwEndNoteInfo* pInfo;
149cdf0e10cSrcweir 			if( IsEndNote() )
150cdf0e10cSrcweir 				pInfo = &rDoc.GetEndNoteInfo();
151cdf0e10cSrcweir 			else
152cdf0e10cSrcweir 				pInfo = &rDoc.GetFtnInfo();
153cdf0e10cSrcweir 			sRet = pInfo->aFmt.GetNumStr( GetNumber() );
154cdf0e10cSrcweir 			if( bInclStrings )
155cdf0e10cSrcweir 			{
156cdf0e10cSrcweir 				sRet.Insert( pInfo->GetPrefix(), 0 );
157cdf0e10cSrcweir 				sRet += pInfo->GetSuffix();
158cdf0e10cSrcweir 			}
159cdf0e10cSrcweir 		}
160cdf0e10cSrcweir 	}
161cdf0e10cSrcweir 	return sRet;
162cdf0e10cSrcweir }
163cdf0e10cSrcweir 
164cdf0e10cSrcweir /*************************************************************************
165cdf0e10cSrcweir  *						class SwTxt/FmtFnt
166cdf0e10cSrcweir  *************************************************************************/
167cdf0e10cSrcweir 
SwTxtFtn(SwFmtFtn & rAttr,xub_StrLen nStartPos)168cdf0e10cSrcweir SwTxtFtn::SwTxtFtn( SwFmtFtn& rAttr, xub_StrLen nStartPos )
169cdf0e10cSrcweir     : SwTxtAttr( rAttr, nStartPos )
170cdf0e10cSrcweir     , m_pStartNode( 0 )
171cdf0e10cSrcweir     , m_pTxtNode( 0 )
172cdf0e10cSrcweir     , m_nSeqNo( USHRT_MAX )
173cdf0e10cSrcweir {
174cdf0e10cSrcweir     rAttr.pTxtAttr = this;
175cdf0e10cSrcweir     SetHasDummyChar(true);
176cdf0e10cSrcweir }
177cdf0e10cSrcweir 
178cdf0e10cSrcweir 
~SwTxtFtn()179cdf0e10cSrcweir SwTxtFtn::~SwTxtFtn()
180cdf0e10cSrcweir {
181cdf0e10cSrcweir 	SetStartNode( 0 );
182cdf0e10cSrcweir }
183cdf0e10cSrcweir 
184cdf0e10cSrcweir 
185cdf0e10cSrcweir 
SetStartNode(const SwNodeIndex * pNewNode,sal_Bool bDelNode)186cdf0e10cSrcweir void SwTxtFtn::SetStartNode( const SwNodeIndex *pNewNode, sal_Bool bDelNode )
187cdf0e10cSrcweir {
188cdf0e10cSrcweir 	if( pNewNode )
189cdf0e10cSrcweir 	{
190cdf0e10cSrcweir         if ( !m_pStartNode )
191cdf0e10cSrcweir         {
192cdf0e10cSrcweir             m_pStartNode = new SwNodeIndex( *pNewNode );
193cdf0e10cSrcweir         }
194cdf0e10cSrcweir         else
195cdf0e10cSrcweir         {
196cdf0e10cSrcweir             *m_pStartNode = *pNewNode;
197cdf0e10cSrcweir         }
198cdf0e10cSrcweir     }
199cdf0e10cSrcweir     else if ( m_pStartNode )
200cdf0e10cSrcweir 	{
201cdf0e10cSrcweir 		// Zwei Dinge muessen erledigt werden:
202cdf0e10cSrcweir 		// 1) Die Fussnoten muessen bei ihren Seiten abgemeldet werden
203cdf0e10cSrcweir 		// 2) Die Fussnoten-Sektion in den Inserts muss geloescht werden.
204cdf0e10cSrcweir 		SwDoc* pDoc;
205cdf0e10cSrcweir         if ( m_pTxtNode )
206cdf0e10cSrcweir         {
207cdf0e10cSrcweir             pDoc = m_pTxtNode->GetDoc();
208cdf0e10cSrcweir         }
209cdf0e10cSrcweir 		else
210cdf0e10cSrcweir 		{
211cdf0e10cSrcweir 			//JP 27.01.97: der sw3-Reader setzt einen StartNode aber das
212cdf0e10cSrcweir 			//				Attribut ist noch nicht im TextNode verankert.
213cdf0e10cSrcweir 			//				Wird es geloescht (z.B. bei Datei einfuegen mit
214cdf0e10cSrcweir 			//				Ftn in einen Rahmen), muss auch der Inhalt
215cdf0e10cSrcweir 			//				geloescht werden
216cdf0e10cSrcweir             pDoc = m_pStartNode->GetNodes().GetDoc();
217cdf0e10cSrcweir 		}
218cdf0e10cSrcweir 
219cdf0e10cSrcweir 		// Wir duerfen die Fussnotennodes nicht loeschen
220cdf0e10cSrcweir 		// und brauchen die Fussnotenframes nicht loeschen, wenn
221cdf0e10cSrcweir 		// wir im ~SwDoc() stehen.
222cdf0e10cSrcweir 		if( !pDoc->IsInDtor() )
223cdf0e10cSrcweir 		{
224cdf0e10cSrcweir 			if( bDelNode )
225cdf0e10cSrcweir 			{
226cdf0e10cSrcweir 				// 1) Die Section fuer die Fussnote wird beseitigt
227cdf0e10cSrcweir 				// Es kann sein, dass die Inserts schon geloescht wurden.
228cdf0e10cSrcweir                 pDoc->DeleteSection( &m_pStartNode->GetNode() );
229cdf0e10cSrcweir 			}
230cdf0e10cSrcweir 			else
231cdf0e10cSrcweir 				// Werden die Nodes nicht geloescht mussen sie bei den Seiten
232cdf0e10cSrcweir 				// abmeldet (Frms loeschen) werden, denn sonst bleiben sie
233cdf0e10cSrcweir 				// stehen (Undo loescht sie nicht!)
234cdf0e10cSrcweir 				DelFrms( 0 );
235cdf0e10cSrcweir 		}
236cdf0e10cSrcweir         DELETEZ( m_pStartNode );
237cdf0e10cSrcweir 
238cdf0e10cSrcweir 		// loesche die Fussnote noch aus dem Array am Dokument
239cdf0e10cSrcweir 		for( sal_uInt16 n = 0; n < pDoc->GetFtnIdxs().Count(); ++n )
240cdf0e10cSrcweir 			if( this == pDoc->GetFtnIdxs()[n] )
241cdf0e10cSrcweir 			{
242cdf0e10cSrcweir 				pDoc->GetFtnIdxs().Remove( n );
243cdf0e10cSrcweir 				// gibt noch weitere Fussnoten
244cdf0e10cSrcweir 				if( !pDoc->IsInDtor() && n < pDoc->GetFtnIdxs().Count() )
245cdf0e10cSrcweir 				{
246cdf0e10cSrcweir 					SwNodeIndex aTmp( pDoc->GetFtnIdxs()[n]->GetTxtNode() );
247cdf0e10cSrcweir 					pDoc->GetFtnIdxs().UpdateFtn( aTmp );
248cdf0e10cSrcweir 				}
249cdf0e10cSrcweir 				break;
250cdf0e10cSrcweir 			}
251cdf0e10cSrcweir 	}
252cdf0e10cSrcweir }
253cdf0e10cSrcweir 
254cdf0e10cSrcweir 
SetNumber(const sal_uInt16 nNewNum,const XubString * pStr)255cdf0e10cSrcweir void SwTxtFtn::SetNumber( const sal_uInt16 nNewNum, const XubString* pStr )
256cdf0e10cSrcweir {
257cdf0e10cSrcweir 	SwFmtFtn& rFtn = (SwFmtFtn&)GetFtn();
258cdf0e10cSrcweir 	if( pStr && pStr->Len() )
259cdf0e10cSrcweir 		rFtn.aNumber = *pStr;
260cdf0e10cSrcweir 	else
261cdf0e10cSrcweir 	{
262cdf0e10cSrcweir 		rFtn.nNumber = nNewNum;
263cdf0e10cSrcweir 		rFtn.aNumber = aEmptyStr;
264cdf0e10cSrcweir 	}
265cdf0e10cSrcweir 
266cdf0e10cSrcweir     ASSERT( m_pTxtNode, "SwTxtFtn: where is my TxtNode?" );
267cdf0e10cSrcweir     SwNodes &rNodes = m_pTxtNode->GetDoc()->GetNodes();
268cdf0e10cSrcweir     m_pTxtNode->ModifyNotification( 0, &rFtn );
269cdf0e10cSrcweir     if ( m_pStartNode )
270cdf0e10cSrcweir     {
271cdf0e10cSrcweir         // must iterate over all TxtNodes because of footnotes on other pages
272cdf0e10cSrcweir         SwNode* pNd;
273cdf0e10cSrcweir         sal_uLong nSttIdx = m_pStartNode->GetIndex() + 1;
274cdf0e10cSrcweir         sal_uLong nEndIdx = m_pStartNode->GetNode().EndOfSectionIndex();
275cdf0e10cSrcweir 		for( ; nSttIdx < nEndIdx; ++nSttIdx )
276cdf0e10cSrcweir 		{
277cdf0e10cSrcweir 			// Es koennen ja auch Grafiken in der Fussnote stehen ...
278cdf0e10cSrcweir 			if( ( pNd = rNodes[ nSttIdx ] )->IsTxtNode() )
279cdf0e10cSrcweir 				((SwTxtNode*)pNd)->ModifyNotification( 0, &rFtn );
280cdf0e10cSrcweir 		}
281cdf0e10cSrcweir 	}
282cdf0e10cSrcweir }
283cdf0e10cSrcweir 
284cdf0e10cSrcweir // Die Fussnoten duplizieren
CopyFtn(SwTxtFtn & rDest,SwTxtNode & rDestNode) const285*dec99bbdSOliver-Rainer Wittmann void SwTxtFtn::CopyFtn(
286*dec99bbdSOliver-Rainer Wittmann     SwTxtFtn & rDest,
287*dec99bbdSOliver-Rainer Wittmann     SwTxtNode & rDestNode ) const
288cdf0e10cSrcweir {
289cdf0e10cSrcweir     if (m_pStartNode && !rDest.GetStartNode())
290cdf0e10cSrcweir     {
291cdf0e10cSrcweir         // dest missing node section? create it here!
292cdf0e10cSrcweir         // (happens in SwTxtNode::CopyText if pDest == this)
293cdf0e10cSrcweir         rDest.MakeNewTextSection( rDestNode.GetNodes() );
294cdf0e10cSrcweir     }
295cdf0e10cSrcweir     if (m_pStartNode && rDest.GetStartNode())
296cdf0e10cSrcweir     {
297cdf0e10cSrcweir         // footnotes not necessarily in same document!
298cdf0e10cSrcweir         SwDoc *const pDstDoc = rDestNode.GetDoc();
299cdf0e10cSrcweir 		SwNodes &rDstNodes = pDstDoc->GetNodes();
300cdf0e10cSrcweir 
301cdf0e10cSrcweir         // copy only the content of the section
302cdf0e10cSrcweir         SwNodeRange aRg( *m_pStartNode, 1,
303cdf0e10cSrcweir                     *m_pStartNode->GetNode().EndOfSectionNode() );
304cdf0e10cSrcweir 
305cdf0e10cSrcweir         // insert at the end of rDest, i.e., the nodes are appended.
306cdf0e10cSrcweir         // nDestLen contains number of CntntNodes in rDest _before_ copy.
307cdf0e10cSrcweir         SwNodeIndex aStart( *(rDest.GetStartNode()) );
308cdf0e10cSrcweir 		SwNodeIndex aEnd( *aStart.GetNode().EndOfSectionNode() );
309cdf0e10cSrcweir 		sal_uLong  nDestLen = aEnd.GetIndex() - aStart.GetIndex() - 1;
310cdf0e10cSrcweir 
311*dec99bbdSOliver-Rainer Wittmann         m_pTxtNode->GetDoc()->CopyWithFlyInFly( aRg, 0, aEnd, NULL, sal_True );
312cdf0e10cSrcweir 
313cdf0e10cSrcweir         // in case the destination section was not empty, delete the old nodes
314cdf0e10cSrcweir         // before:   Src: SxxxE,  Dst: SnE
315cdf0e10cSrcweir         // now:      Src: SxxxE,  Dst: SnxxxE
316cdf0e10cSrcweir         // after:    Src: SxxxE,  Dst: SxxxE
317cdf0e10cSrcweir 		aStart++;
318cdf0e10cSrcweir 		rDstNodes.Delete( aStart, nDestLen );
319cdf0e10cSrcweir 	}
320cdf0e10cSrcweir 
321cdf0e10cSrcweir     // also copy user defined number string
322cdf0e10cSrcweir 	if( GetFtn().aNumber.Len() )
323cdf0e10cSrcweir     {
324cdf0e10cSrcweir         const_cast<SwFmtFtn &>(rDest.GetFtn()).aNumber = GetFtn().aNumber;
325cdf0e10cSrcweir     }
326cdf0e10cSrcweir }
327cdf0e10cSrcweir 
328cdf0e10cSrcweir 
329cdf0e10cSrcweir 	// lege eine neue leere TextSection fuer diese Fussnote an
MakeNewTextSection(SwNodes & rNodes)330cdf0e10cSrcweir void SwTxtFtn::MakeNewTextSection( SwNodes& rNodes )
331cdf0e10cSrcweir {
332cdf0e10cSrcweir     if ( m_pStartNode )
333cdf0e10cSrcweir         return;
334cdf0e10cSrcweir 
335cdf0e10cSrcweir 	// Nun verpassen wir dem TxtNode noch die Fussnotenvorlage.
336cdf0e10cSrcweir 	SwTxtFmtColl *pFmtColl;
337cdf0e10cSrcweir 	const SwEndNoteInfo* pInfo;
338cdf0e10cSrcweir 	sal_uInt16 nPoolId;
339cdf0e10cSrcweir 
340cdf0e10cSrcweir 	if( GetFtn().IsEndNote() )
341cdf0e10cSrcweir 	{
342cdf0e10cSrcweir 		pInfo = &rNodes.GetDoc()->GetEndNoteInfo();
343cdf0e10cSrcweir 		nPoolId = RES_POOLCOLL_ENDNOTE;
344cdf0e10cSrcweir 	}
345cdf0e10cSrcweir 	else
346cdf0e10cSrcweir 	{
347cdf0e10cSrcweir 		pInfo = &rNodes.GetDoc()->GetFtnInfo();
348cdf0e10cSrcweir 		nPoolId = RES_POOLCOLL_FOOTNOTE;
349cdf0e10cSrcweir 	}
350cdf0e10cSrcweir 
351cdf0e10cSrcweir 	if( 0 == (pFmtColl = pInfo->GetFtnTxtColl() ) )
352cdf0e10cSrcweir 		pFmtColl = rNodes.GetDoc()->GetTxtCollFromPool( nPoolId );
353cdf0e10cSrcweir 
354cdf0e10cSrcweir 	SwStartNode* pSttNd = rNodes.MakeTextSection( SwNodeIndex( rNodes.GetEndOfInserts() ),
355cdf0e10cSrcweir 										SwFootnoteStartNode, pFmtColl );
356cdf0e10cSrcweir     m_pStartNode = new SwNodeIndex( *pSttNd );
357cdf0e10cSrcweir }
358cdf0e10cSrcweir 
359cdf0e10cSrcweir 
DelFrms(const SwFrm * pSib)360cdf0e10cSrcweir void SwTxtFtn::DelFrms( const SwFrm* pSib )
361cdf0e10cSrcweir {
362cdf0e10cSrcweir     // delete the FtnFrames from the pages
363cdf0e10cSrcweir     ASSERT( m_pTxtNode, "SwTxtFtn: where is my TxtNode?" );
364cdf0e10cSrcweir     if ( !m_pTxtNode )
365cdf0e10cSrcweir         return;
366cdf0e10cSrcweir 
367cdf0e10cSrcweir     const SwRootFrm* pRoot = pSib ? pSib->getRootFrm() : 0;
368cdf0e10cSrcweir 	sal_Bool bFrmFnd = sal_False;
369cdf0e10cSrcweir 	{
370cdf0e10cSrcweir         SwIterator<SwCntntFrm,SwTxtNode> aIter( *m_pTxtNode );
371cdf0e10cSrcweir 		for( SwCntntFrm* pFnd = aIter.First(); pFnd; pFnd = aIter.Next() )
372cdf0e10cSrcweir 		{
373cdf0e10cSrcweir             if( pRoot != pFnd->getRootFrm() && pRoot )
374cdf0e10cSrcweir                 continue;
375cdf0e10cSrcweir             SwPageFrm* pPage = pFnd->FindPageFrm();
376cdf0e10cSrcweir             if( pPage )
377cdf0e10cSrcweir             {
378cdf0e10cSrcweir                 pPage->RemoveFtn( pFnd, this );
379cdf0e10cSrcweir                 bFrmFnd = sal_True;
380cdf0e10cSrcweir             }
381cdf0e10cSrcweir 		}
382cdf0e10cSrcweir 	}
383cdf0e10cSrcweir 	//JP 13.05.97: falls das Layout vorm loeschen der Fussnoten entfernt
384cdf0e10cSrcweir 	//				wird, sollte man das ueber die Fussnote selbst tun
385cdf0e10cSrcweir     if ( !bFrmFnd && m_pStartNode )
386cdf0e10cSrcweir     {
387cdf0e10cSrcweir         SwNodeIndex aIdx( *m_pStartNode );
388cdf0e10cSrcweir         SwCntntNode* pCNd = m_pTxtNode->GetNodes().GoNext( &aIdx );
389cdf0e10cSrcweir 		if( pCNd )
390cdf0e10cSrcweir 		{
391cdf0e10cSrcweir 			SwIterator<SwCntntFrm,SwCntntNode> aIter( *pCNd );
392cdf0e10cSrcweir 			for( SwCntntFrm* pFnd = aIter.First(); pFnd; pFnd = aIter.Next() )
393cdf0e10cSrcweir 			{
394cdf0e10cSrcweir                 if( pRoot != pFnd->getRootFrm() && pRoot )
395cdf0e10cSrcweir                     continue;
396cdf0e10cSrcweir 				SwPageFrm* pPage = pFnd->FindPageFrm();
397cdf0e10cSrcweir 
398cdf0e10cSrcweir 				SwFrm *pFrm = pFnd->GetUpper();
399cdf0e10cSrcweir 				while ( pFrm && !pFrm->IsFtnFrm() )
400cdf0e10cSrcweir 					pFrm = pFrm->GetUpper();
401cdf0e10cSrcweir 
402cdf0e10cSrcweir 				SwFtnFrm *pFtn = (SwFtnFrm*)pFrm;
403cdf0e10cSrcweir 				while ( pFtn && pFtn->GetMaster() )
404cdf0e10cSrcweir 					pFtn = pFtn->GetMaster();
405cdf0e10cSrcweir                 ASSERT( pFtn->GetAttr() == this, "Ftn mismatch error." );
406cdf0e10cSrcweir 
407cdf0e10cSrcweir 				while ( pFtn )
408cdf0e10cSrcweir 				{
409cdf0e10cSrcweir 					SwFtnFrm *pFoll = pFtn->GetFollow();
410cdf0e10cSrcweir 					pFtn->Cut();
411cdf0e10cSrcweir 					delete pFtn;
412cdf0e10cSrcweir 					pFtn = pFoll;
413cdf0e10cSrcweir 				}
414cdf0e10cSrcweir 
415cdf0e10cSrcweir                 // #i20556# During hiding of a section, the connection
416cdf0e10cSrcweir                 // to the layout is already lost. pPage may be 0:
417cdf0e10cSrcweir                 if ( pPage )
418cdf0e10cSrcweir                     pPage->UpdateFtnNum();
419cdf0e10cSrcweir 			}
420cdf0e10cSrcweir 		}
421cdf0e10cSrcweir 	}
422cdf0e10cSrcweir }
423cdf0e10cSrcweir 
424cdf0e10cSrcweir 
SetSeqRefNo()425cdf0e10cSrcweir sal_uInt16 SwTxtFtn::SetSeqRefNo()
426cdf0e10cSrcweir {
427cdf0e10cSrcweir     if( !m_pTxtNode )
428cdf0e10cSrcweir 		return USHRT_MAX;
429cdf0e10cSrcweir 
430cdf0e10cSrcweir     SwDoc* pDoc = m_pTxtNode->GetDoc();
431cdf0e10cSrcweir 	if( pDoc->IsInReading() )
432cdf0e10cSrcweir 		return USHRT_MAX;
433cdf0e10cSrcweir 
434cdf0e10cSrcweir 	sal_uInt16 n, nFtnCnt = pDoc->GetFtnIdxs().Count();
435cdf0e10cSrcweir 
436cdf0e10cSrcweir 	const sal_uInt8 nTmp = 255 < nFtnCnt ? 255 : static_cast<sal_uInt8>(nFtnCnt);
437cdf0e10cSrcweir 	SvUShortsSort aArr( nTmp, nTmp );
438cdf0e10cSrcweir 
439cdf0e10cSrcweir 	// dann testmal, ob die Nummer schon vergeben ist oder ob eine neue
440cdf0e10cSrcweir 	// bestimmt werden muss.
441cdf0e10cSrcweir 	SwTxtFtn* pTxtFtn;
442cdf0e10cSrcweir 	for( n = 0; n < nFtnCnt; ++n )
443cdf0e10cSrcweir     {
444cdf0e10cSrcweir         pTxtFtn = pDoc->GetFtnIdxs()[ n ];
445cdf0e10cSrcweir         if ( pTxtFtn != this )
446cdf0e10cSrcweir         {
447cdf0e10cSrcweir             aArr.Insert( pTxtFtn->m_nSeqNo );
448cdf0e10cSrcweir         }
449cdf0e10cSrcweir     }
450cdf0e10cSrcweir 
451cdf0e10cSrcweir     // test if number is already in use
452cdf0e10cSrcweir     if ( USHRT_MAX != m_nSeqNo )
453cdf0e10cSrcweir     {
454cdf0e10cSrcweir 		for( n = 0; n < aArr.Count(); ++n )
455cdf0e10cSrcweir         {
456cdf0e10cSrcweir             if ( aArr[ n ] > m_nSeqNo )
457cdf0e10cSrcweir             {
458cdf0e10cSrcweir                 return m_nSeqNo;    // free -> use
459cdf0e10cSrcweir             }
460cdf0e10cSrcweir             else if ( aArr[ n ] == m_nSeqNo )
461cdf0e10cSrcweir             {
462cdf0e10cSrcweir                 break;              // used -> create new one
463cdf0e10cSrcweir             }
464cdf0e10cSrcweir         }
465cdf0e10cSrcweir 
466cdf0e10cSrcweir         if ( n == aArr.Count() )
467cdf0e10cSrcweir         {
468cdf0e10cSrcweir             return m_nSeqNo;        // free -> use
469cdf0e10cSrcweir         }
470cdf0e10cSrcweir     }
471cdf0e10cSrcweir 
472cdf0e10cSrcweir 	// alle Nummern entsprechend geflag, also bestimme die richtige Nummer
473cdf0e10cSrcweir 	for( n = 0; n < aArr.Count(); ++n )
474cdf0e10cSrcweir 		if( n != aArr[ n ] )
475cdf0e10cSrcweir 			break;
476cdf0e10cSrcweir 
477cdf0e10cSrcweir     return m_nSeqNo = n;
478cdf0e10cSrcweir }
479cdf0e10cSrcweir 
SetUniqueSeqRefNo(SwDoc & rDoc)480cdf0e10cSrcweir void SwTxtFtn::SetUniqueSeqRefNo( SwDoc& rDoc )
481cdf0e10cSrcweir {
482cdf0e10cSrcweir 	sal_uInt16 n, nStt = 0, nFtnCnt = rDoc.GetFtnIdxs().Count();
483cdf0e10cSrcweir 
484cdf0e10cSrcweir 	const sal_uInt8 nTmp = 255 < nFtnCnt ? 255 : static_cast<sal_uInt8>(nFtnCnt);
485cdf0e10cSrcweir 	SvUShortsSort aArr( nTmp, nTmp );
486cdf0e10cSrcweir 
487cdf0e10cSrcweir 	// dann alle Nummern zusammensammeln die schon existieren
488cdf0e10cSrcweir 	SwTxtFtn* pTxtFtn;
489cdf0e10cSrcweir 	for( n = 0; n < nFtnCnt; ++n )
490cdf0e10cSrcweir     {
491cdf0e10cSrcweir         pTxtFtn = rDoc.GetFtnIdxs()[ n ];
492cdf0e10cSrcweir         if ( USHRT_MAX != pTxtFtn->m_nSeqNo )
493cdf0e10cSrcweir         {
494cdf0e10cSrcweir             aArr.Insert( pTxtFtn->m_nSeqNo );
495cdf0e10cSrcweir         }
496cdf0e10cSrcweir     }
497cdf0e10cSrcweir 
498cdf0e10cSrcweir 
499cdf0e10cSrcweir 	for( n = 0; n < nFtnCnt; ++n )
500cdf0e10cSrcweir     {
501cdf0e10cSrcweir         pTxtFtn = rDoc.GetFtnIdxs()[ n ];
502cdf0e10cSrcweir         if ( USHRT_MAX == pTxtFtn->m_nSeqNo )
503cdf0e10cSrcweir         {
504cdf0e10cSrcweir 			for( ; nStt < aArr.Count(); ++nStt )
505cdf0e10cSrcweir             {
506cdf0e10cSrcweir                 if ( nStt != aArr[ nStt ] )
507cdf0e10cSrcweir                 {
508cdf0e10cSrcweir                     pTxtFtn->m_nSeqNo = nStt;
509cdf0e10cSrcweir 					break;
510cdf0e10cSrcweir 				}
511cdf0e10cSrcweir             }
512cdf0e10cSrcweir 
513cdf0e10cSrcweir             if ( USHRT_MAX == pTxtFtn->m_nSeqNo )
514cdf0e10cSrcweir             {
515cdf0e10cSrcweir                 break; // found nothing
516cdf0e10cSrcweir             }
517cdf0e10cSrcweir         }
518cdf0e10cSrcweir     }
519cdf0e10cSrcweir 
520cdf0e10cSrcweir 	// alle Nummern schon vergeben, also mit nStt++ weitermachen
521cdf0e10cSrcweir 	for( ; n < nFtnCnt; ++n )
522cdf0e10cSrcweir     {
523cdf0e10cSrcweir         pTxtFtn = rDoc.GetFtnIdxs()[ n ];
524cdf0e10cSrcweir         if ( USHRT_MAX == pTxtFtn->m_nSeqNo )
525cdf0e10cSrcweir         {
526cdf0e10cSrcweir             pTxtFtn->m_nSeqNo = nStt++;
527cdf0e10cSrcweir         }
528cdf0e10cSrcweir     }
529cdf0e10cSrcweir }
530cdf0e10cSrcweir 
CheckCondColl()531cdf0e10cSrcweir void SwTxtFtn::CheckCondColl()
532cdf0e10cSrcweir {
533cdf0e10cSrcweir //FEATURE::CONDCOLL
534cdf0e10cSrcweir 	if( GetStartNode() )
535cdf0e10cSrcweir 		((SwStartNode&)GetStartNode()->GetNode()).CheckSectionCondColl();
536cdf0e10cSrcweir //FEATURE::CONDCOLL
537cdf0e10cSrcweir }
538cdf0e10cSrcweir 
539cdf0e10cSrcweir 
540cdf0e10cSrcweir 
541cdf0e10cSrcweir 
542