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