1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski *
3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file
5*b1cdbd2cSJim Jagielski * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file
7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski *
11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski *
13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the
17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski * under the License.
19*b1cdbd2cSJim Jagielski *
20*b1cdbd2cSJim Jagielski *************************************************************/
21*b1cdbd2cSJim Jagielski
22*b1cdbd2cSJim Jagielski
23*b1cdbd2cSJim Jagielski
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_sw.hxx"
26*b1cdbd2cSJim Jagielski
27*b1cdbd2cSJim Jagielski
28*b1cdbd2cSJim Jagielski #include <txtftn.hxx>
29*b1cdbd2cSJim Jagielski #include <fmtftn.hxx>
30*b1cdbd2cSJim Jagielski #include <ftnidx.hxx>
31*b1cdbd2cSJim Jagielski #include <pagefrm.hxx>
32*b1cdbd2cSJim Jagielski #include <colfrm.hxx>
33*b1cdbd2cSJim Jagielski #include <rootfrm.hxx>
34*b1cdbd2cSJim Jagielski #include <cntfrm.hxx>
35*b1cdbd2cSJim Jagielski #include <doc.hxx>
36*b1cdbd2cSJim Jagielski #include <ndtxt.hxx>
37*b1cdbd2cSJim Jagielski #include <frmtool.hxx>
38*b1cdbd2cSJim Jagielski #include <swtable.hxx>
39*b1cdbd2cSJim Jagielski #include <ftnfrm.hxx>
40*b1cdbd2cSJim Jagielski #include <txtfrm.hxx>
41*b1cdbd2cSJim Jagielski #include <tabfrm.hxx>
42*b1cdbd2cSJim Jagielski #include <pagedesc.hxx>
43*b1cdbd2cSJim Jagielski #include <ftninfo.hxx>
44*b1cdbd2cSJim Jagielski #include <ndindex.hxx>
45*b1cdbd2cSJim Jagielski #include <sectfrm.hxx>
46*b1cdbd2cSJim Jagielski #include <pam.hxx>
47*b1cdbd2cSJim Jagielski #include <objectformatter.hxx>
48*b1cdbd2cSJim Jagielski #include "viewopt.hxx"
49*b1cdbd2cSJim Jagielski #include "viewsh.hxx"
50*b1cdbd2cSJim Jagielski #include <switerator.hxx>
51*b1cdbd2cSJim Jagielski
52*b1cdbd2cSJim Jagielski /*************************************************************************
53*b1cdbd2cSJim Jagielski |*
54*b1cdbd2cSJim Jagielski |* lcl_FindFtnPos() Sucht die Position des Attributes im FtnArray am
55*b1cdbd2cSJim Jagielski |* Dokument, dort stehen die Fussnoten gluecklicherweise nach ihrem
56*b1cdbd2cSJim Jagielski |* Index sortiert.
57*b1cdbd2cSJim Jagielski |*
58*b1cdbd2cSJim Jagielski |*************************************************************************/
59*b1cdbd2cSJim Jagielski
60*b1cdbd2cSJim Jagielski #define ENDNOTE 0x80000000
61*b1cdbd2cSJim Jagielski
lcl_FindFtnPos(const SwDoc * pDoc,const SwTxtFtn * pAttr)62*b1cdbd2cSJim Jagielski sal_uLong MA_FASTCALL lcl_FindFtnPos( const SwDoc *pDoc, const SwTxtFtn *pAttr )
63*b1cdbd2cSJim Jagielski {
64*b1cdbd2cSJim Jagielski const SwFtnIdxs &rFtnIdxs = pDoc->GetFtnIdxs();
65*b1cdbd2cSJim Jagielski
66*b1cdbd2cSJim Jagielski #ifdef MA_DEBUG
67*b1cdbd2cSJim Jagielski //Wenn das Array nicht stimmt haben wir ein Problem, denn viele
68*b1cdbd2cSJim Jagielski //Ftn-Functions bauen auf dem Array auf.
69*b1cdbd2cSJim Jagielski for ( sal_uInt16 k = 0; k+1 < rFtnIdxs.Count(); ++k )
70*b1cdbd2cSJim Jagielski {
71*b1cdbd2cSJim Jagielski SwIndex aIdx1(&pDoc->GetNodes());
72*b1cdbd2cSJim Jagielski SwIndex aIdx2(&pDoc->GetNodes());
73*b1cdbd2cSJim Jagielski rFtnIdxs[k]->pFtn-> GetTxtNode().GetIndex(aIdx1);
74*b1cdbd2cSJim Jagielski rFtnIdxs[k+1]->pFtn->GetTxtNode().GetIndex(aIdx2);
75*b1cdbd2cSJim Jagielski if ( aIdx1.GetIndex() > aIdx2.GetIndex() )
76*b1cdbd2cSJim Jagielski {
77*b1cdbd2cSJim Jagielski ASSERT( !rFtnIdxs.Count(), "FtnIdxs not up to date" );
78*b1cdbd2cSJim Jagielski }
79*b1cdbd2cSJim Jagielski else if ( aIdx1.GetIndex() == aIdx2.GetIndex() )
80*b1cdbd2cSJim Jagielski {
81*b1cdbd2cSJim Jagielski SwTxtFtn *p1 = rFtnIdxs[k];
82*b1cdbd2cSJim Jagielski SwTxtFtn *p2 = rFtnIdxs[k+1];
83*b1cdbd2cSJim Jagielski ASSERT( *p1->GetStart() < *p2->GetStart(),
84*b1cdbd2cSJim Jagielski "FtnIdxs not up to date" );
85*b1cdbd2cSJim Jagielski }
86*b1cdbd2cSJim Jagielski }
87*b1cdbd2cSJim Jagielski #endif
88*b1cdbd2cSJim Jagielski
89*b1cdbd2cSJim Jagielski sal_uInt16 nRet;
90*b1cdbd2cSJim Jagielski SwTxtFtnPtr pBla = (SwTxtFtn*)pAttr;
91*b1cdbd2cSJim Jagielski if ( rFtnIdxs.Seek_Entry( pBla, &nRet ) )
92*b1cdbd2cSJim Jagielski {
93*b1cdbd2cSJim Jagielski if( pAttr->GetFtn().IsEndNote() )
94*b1cdbd2cSJim Jagielski return sal_uLong(nRet) + ENDNOTE;
95*b1cdbd2cSJim Jagielski return nRet;
96*b1cdbd2cSJim Jagielski }
97*b1cdbd2cSJim Jagielski ASSERT( !pDoc, "FtnPos not found." );
98*b1cdbd2cSJim Jagielski return 0;
99*b1cdbd2cSJim Jagielski }
100*b1cdbd2cSJim Jagielski
operator <(const SwTxtFtn * pTxtFtn) const101*b1cdbd2cSJim Jagielski sal_Bool SwFtnFrm::operator<( const SwTxtFtn* pTxtFtn ) const
102*b1cdbd2cSJim Jagielski {
103*b1cdbd2cSJim Jagielski const SwDoc* pDoc = GetFmt()->GetDoc();
104*b1cdbd2cSJim Jagielski ASSERT( pDoc, "SwFtnFrm: Missing doc!" );
105*b1cdbd2cSJim Jagielski return lcl_FindFtnPos( pDoc, GetAttr() ) <
106*b1cdbd2cSJim Jagielski lcl_FindFtnPos( pDoc, pTxtFtn );
107*b1cdbd2cSJim Jagielski }
108*b1cdbd2cSJim Jagielski
109*b1cdbd2cSJim Jagielski /*************************************************************************
110*b1cdbd2cSJim Jagielski |*
111*b1cdbd2cSJim Jagielski |* sal_Bool lcl_NextFtnBoss( SwFtnBossFrm* pBoss, SwPageFrm* pPage)
112*b1cdbd2cSJim Jagielski |* setzt pBoss auf den naechsten SwFtnBossFrm, das kann entweder eine Spalte
113*b1cdbd2cSJim Jagielski |* oder eine Seite (ohne Spalten) sein. Wenn die Seite dabei gewechselt wird
114*b1cdbd2cSJim Jagielski |* enthaelt pPage die neue Seite und die Funktion liefert sal_True.
115*b1cdbd2cSJim Jagielski |*
116*b1cdbd2cSJim Jagielski |*************************************************************************/
117*b1cdbd2cSJim Jagielski
lcl_NextFtnBoss(SwFtnBossFrm * & rpBoss,SwPageFrm * & rpPage,sal_Bool bDontLeave)118*b1cdbd2cSJim Jagielski sal_Bool lcl_NextFtnBoss( SwFtnBossFrm* &rpBoss, SwPageFrm* &rpPage,
119*b1cdbd2cSJim Jagielski sal_Bool bDontLeave )
120*b1cdbd2cSJim Jagielski {
121*b1cdbd2cSJim Jagielski if( rpBoss->IsColumnFrm() )
122*b1cdbd2cSJim Jagielski {
123*b1cdbd2cSJim Jagielski if( rpBoss->GetNext() )
124*b1cdbd2cSJim Jagielski {
125*b1cdbd2cSJim Jagielski rpBoss = (SwFtnBossFrm*)rpBoss->GetNext(); //naechste Spalte
126*b1cdbd2cSJim Jagielski return sal_False;
127*b1cdbd2cSJim Jagielski }
128*b1cdbd2cSJim Jagielski if( rpBoss->IsInSct() )
129*b1cdbd2cSJim Jagielski {
130*b1cdbd2cSJim Jagielski SwSectionFrm* pSct = rpBoss->FindSctFrm()->GetFollow();
131*b1cdbd2cSJim Jagielski if( pSct )
132*b1cdbd2cSJim Jagielski {
133*b1cdbd2cSJim Jagielski ASSERT( pSct->Lower() && pSct->Lower()->IsColumnFrm(),
134*b1cdbd2cSJim Jagielski "Where's the column?" );
135*b1cdbd2cSJim Jagielski rpBoss = (SwColumnFrm*)pSct->Lower();
136*b1cdbd2cSJim Jagielski SwPageFrm* pOld = rpPage;
137*b1cdbd2cSJim Jagielski rpPage = pSct->FindPageFrm();
138*b1cdbd2cSJim Jagielski return pOld != rpPage;
139*b1cdbd2cSJim Jagielski }
140*b1cdbd2cSJim Jagielski else if( bDontLeave )
141*b1cdbd2cSJim Jagielski {
142*b1cdbd2cSJim Jagielski rpPage = NULL;
143*b1cdbd2cSJim Jagielski rpBoss = NULL;
144*b1cdbd2cSJim Jagielski return sal_False;
145*b1cdbd2cSJim Jagielski }
146*b1cdbd2cSJim Jagielski }
147*b1cdbd2cSJim Jagielski }
148*b1cdbd2cSJim Jagielski rpPage = (SwPageFrm*)rpPage->GetNext(); // naechste Seite
149*b1cdbd2cSJim Jagielski rpBoss = rpPage;
150*b1cdbd2cSJim Jagielski if( rpPage )
151*b1cdbd2cSJim Jagielski {
152*b1cdbd2cSJim Jagielski SwLayoutFrm* pBody = rpPage->FindBodyCont();
153*b1cdbd2cSJim Jagielski if( pBody && pBody->Lower() && pBody->Lower()->IsColumnFrm() )
154*b1cdbd2cSJim Jagielski rpBoss = (SwFtnBossFrm*)pBody->Lower(); // erste Spalte
155*b1cdbd2cSJim Jagielski }
156*b1cdbd2cSJim Jagielski return sal_True;
157*b1cdbd2cSJim Jagielski }
158*b1cdbd2cSJim Jagielski
159*b1cdbd2cSJim Jagielski /*************************************************************************
160*b1cdbd2cSJim Jagielski |*
161*b1cdbd2cSJim Jagielski |* sal_uInt16 lcl_ColumnNum( SwFrm* pBoss )
162*b1cdbd2cSJim Jagielski |* liefert die Spaltennummer, wenn pBoss eine Spalte ist,
163*b1cdbd2cSJim Jagielski |* sonst eine Null (bei Seiten).
164*b1cdbd2cSJim Jagielski |*
165*b1cdbd2cSJim Jagielski |*************************************************************************/
166*b1cdbd2cSJim Jagielski
lcl_ColumnNum(const SwFrm * pBoss)167*b1cdbd2cSJim Jagielski sal_uInt16 lcl_ColumnNum( const SwFrm* pBoss )
168*b1cdbd2cSJim Jagielski {
169*b1cdbd2cSJim Jagielski sal_uInt16 nRet = 0;
170*b1cdbd2cSJim Jagielski if( !pBoss->IsColumnFrm() )
171*b1cdbd2cSJim Jagielski return 0;
172*b1cdbd2cSJim Jagielski const SwFrm* pCol;
173*b1cdbd2cSJim Jagielski if( pBoss->IsInSct() )
174*b1cdbd2cSJim Jagielski {
175*b1cdbd2cSJim Jagielski pCol = pBoss->GetUpper()->FindColFrm();
176*b1cdbd2cSJim Jagielski if( pBoss->GetNext() || pBoss->GetPrev() )
177*b1cdbd2cSJim Jagielski {
178*b1cdbd2cSJim Jagielski while( pBoss )
179*b1cdbd2cSJim Jagielski {
180*b1cdbd2cSJim Jagielski ++nRet; // Section columns
181*b1cdbd2cSJim Jagielski pBoss = pBoss->GetPrev();
182*b1cdbd2cSJim Jagielski }
183*b1cdbd2cSJim Jagielski }
184*b1cdbd2cSJim Jagielski }
185*b1cdbd2cSJim Jagielski else
186*b1cdbd2cSJim Jagielski pCol = pBoss;
187*b1cdbd2cSJim Jagielski while( pCol )
188*b1cdbd2cSJim Jagielski {
189*b1cdbd2cSJim Jagielski nRet += 256; // Page columns
190*b1cdbd2cSJim Jagielski pCol = pCol->GetPrev();
191*b1cdbd2cSJim Jagielski }
192*b1cdbd2cSJim Jagielski return nRet;
193*b1cdbd2cSJim Jagielski }
194*b1cdbd2cSJim Jagielski
195*b1cdbd2cSJim Jagielski /*************************************************************************
196*b1cdbd2cSJim Jagielski |*
197*b1cdbd2cSJim Jagielski |* SwFtnContFrm::SwFtnContFrm()
198*b1cdbd2cSJim Jagielski |*
199*b1cdbd2cSJim Jagielski |*************************************************************************/
200*b1cdbd2cSJim Jagielski
201*b1cdbd2cSJim Jagielski
SwFtnContFrm(SwFrmFmt * pFmt,SwFrm * pSib)202*b1cdbd2cSJim Jagielski SwFtnContFrm::SwFtnContFrm( SwFrmFmt *pFmt, SwFrm* pSib ):
203*b1cdbd2cSJim Jagielski SwLayoutFrm( pFmt, pSib )
204*b1cdbd2cSJim Jagielski {
205*b1cdbd2cSJim Jagielski nType = FRMC_FTNCONT;
206*b1cdbd2cSJim Jagielski }
207*b1cdbd2cSJim Jagielski
208*b1cdbd2cSJim Jagielski
209*b1cdbd2cSJim Jagielski // lcl_Undersize(..) klappert einen SwFrm und dessen Inneres ab
210*b1cdbd2cSJim Jagielski // und liefert die Summe aller TxtFrm-Vergroesserungswuensche
211*b1cdbd2cSJim Jagielski
lcl_Undersize(const SwFrm * pFrm)212*b1cdbd2cSJim Jagielski long lcl_Undersize( const SwFrm* pFrm )
213*b1cdbd2cSJim Jagielski {
214*b1cdbd2cSJim Jagielski long nRet = 0;
215*b1cdbd2cSJim Jagielski SWRECTFN( pFrm )
216*b1cdbd2cSJim Jagielski if( pFrm->IsTxtFrm() )
217*b1cdbd2cSJim Jagielski {
218*b1cdbd2cSJim Jagielski if( ((SwTxtFrm*)pFrm)->IsUndersized() )
219*b1cdbd2cSJim Jagielski {
220*b1cdbd2cSJim Jagielski // Dieser TxtFrm waere gern ein bisschen groesser
221*b1cdbd2cSJim Jagielski nRet = ((SwTxtFrm*)pFrm)->GetParHeight() -
222*b1cdbd2cSJim Jagielski (pFrm->Prt().*fnRect->fnGetHeight)();
223*b1cdbd2cSJim Jagielski if( nRet < 0 )
224*b1cdbd2cSJim Jagielski nRet = 0;
225*b1cdbd2cSJim Jagielski }
226*b1cdbd2cSJim Jagielski }
227*b1cdbd2cSJim Jagielski else if( pFrm->IsLayoutFrm() )
228*b1cdbd2cSJim Jagielski {
229*b1cdbd2cSJim Jagielski const SwFrm* pNxt = ((SwLayoutFrm*)pFrm)->Lower();
230*b1cdbd2cSJim Jagielski while( pNxt )
231*b1cdbd2cSJim Jagielski {
232*b1cdbd2cSJim Jagielski nRet += lcl_Undersize( pNxt );
233*b1cdbd2cSJim Jagielski pNxt = pNxt->GetNext();
234*b1cdbd2cSJim Jagielski }
235*b1cdbd2cSJim Jagielski }
236*b1cdbd2cSJim Jagielski return nRet;
237*b1cdbd2cSJim Jagielski }
238*b1cdbd2cSJim Jagielski
239*b1cdbd2cSJim Jagielski /*************************************************************************
240*b1cdbd2cSJim Jagielski |*
241*b1cdbd2cSJim Jagielski |* SwFtnContFrm::Format()
242*b1cdbd2cSJim Jagielski |*
243*b1cdbd2cSJim Jagielski |* Beschreibung: "Formatiert" den Frame;
244*b1cdbd2cSJim Jagielski |* Die Fixsize wird hier nicht eingestellt.
245*b1cdbd2cSJim Jagielski |*
246*b1cdbd2cSJim Jagielski |*************************************************************************/
247*b1cdbd2cSJim Jagielski
248*b1cdbd2cSJim Jagielski
Format(const SwBorderAttrs *)249*b1cdbd2cSJim Jagielski void SwFtnContFrm::Format( const SwBorderAttrs * )
250*b1cdbd2cSJim Jagielski {
251*b1cdbd2cSJim Jagielski //GesamtBorder ermitteln, es gibt nur einen Abstand nach oben.
252*b1cdbd2cSJim Jagielski const SwPageFrm* pPage = FindPageFrm();
253*b1cdbd2cSJim Jagielski const SwPageFtnInfo &rInf = pPage->GetPageDesc()->GetFtnInfo();
254*b1cdbd2cSJim Jagielski const SwTwips nBorder = rInf.GetTopDist() + rInf.GetBottomDist() +
255*b1cdbd2cSJim Jagielski rInf.GetLineWidth();
256*b1cdbd2cSJim Jagielski SWRECTFN( this )
257*b1cdbd2cSJim Jagielski if ( !bValidPrtArea )
258*b1cdbd2cSJim Jagielski {
259*b1cdbd2cSJim Jagielski bValidPrtArea = sal_True;
260*b1cdbd2cSJim Jagielski (Prt().*fnRect->fnSetTop)( nBorder );
261*b1cdbd2cSJim Jagielski (Prt().*fnRect->fnSetWidth)( (Frm().*fnRect->fnGetWidth)() );
262*b1cdbd2cSJim Jagielski (Prt().*fnRect->fnSetHeight)((Frm().*fnRect->fnGetHeight)() - nBorder );
263*b1cdbd2cSJim Jagielski if( (Prt().*fnRect->fnGetHeight)() < 0 && !pPage->IsFtnPage() )
264*b1cdbd2cSJim Jagielski bValidSize = sal_False;
265*b1cdbd2cSJim Jagielski }
266*b1cdbd2cSJim Jagielski
267*b1cdbd2cSJim Jagielski if ( !bValidSize )
268*b1cdbd2cSJim Jagielski {
269*b1cdbd2cSJim Jagielski bool bGrow = pPage->IsFtnPage();
270*b1cdbd2cSJim Jagielski if( bGrow )
271*b1cdbd2cSJim Jagielski {
272*b1cdbd2cSJim Jagielski const ViewShell *pSh = getRootFrm() ? getRootFrm()->GetCurrShell() : 0;
273*b1cdbd2cSJim Jagielski if( pSh && pSh->GetViewOptions()->getBrowseMode() )
274*b1cdbd2cSJim Jagielski bGrow = false;
275*b1cdbd2cSJim Jagielski }
276*b1cdbd2cSJim Jagielski if( bGrow )
277*b1cdbd2cSJim Jagielski Grow( LONG_MAX, sal_False );
278*b1cdbd2cSJim Jagielski else
279*b1cdbd2cSJim Jagielski {
280*b1cdbd2cSJim Jagielski //Die Groesse in der VarSize wird durch den Inhalt plus den
281*b1cdbd2cSJim Jagielski //Raendern bestimmt.
282*b1cdbd2cSJim Jagielski SwTwips nRemaining = 0;
283*b1cdbd2cSJim Jagielski SwFrm *pFrm = pLower;
284*b1cdbd2cSJim Jagielski while ( pFrm )
285*b1cdbd2cSJim Jagielski { // lcl_Undersize(..) beruecksichtigt (rekursiv) TxtFrms, die gerne
286*b1cdbd2cSJim Jagielski // groesser waeren. Diese entstehen insbesondere in spaltigen Rahmen,
287*b1cdbd2cSJim Jagielski // wenn diese noch nicht ihre maximale Groesse haben.
288*b1cdbd2cSJim Jagielski nRemaining += (pFrm->Frm().*fnRect->fnGetHeight)()
289*b1cdbd2cSJim Jagielski + lcl_Undersize( pFrm );
290*b1cdbd2cSJim Jagielski pFrm = pFrm->GetNext();
291*b1cdbd2cSJim Jagielski }
292*b1cdbd2cSJim Jagielski //Jetzt noch den Rand addieren
293*b1cdbd2cSJim Jagielski nRemaining += nBorder;
294*b1cdbd2cSJim Jagielski
295*b1cdbd2cSJim Jagielski SwTwips nDiff;
296*b1cdbd2cSJim Jagielski if( IsInSct() )
297*b1cdbd2cSJim Jagielski {
298*b1cdbd2cSJim Jagielski nDiff = -(Frm().*fnRect->fnBottomDist)(
299*b1cdbd2cSJim Jagielski (GetUpper()->*fnRect->fnGetPrtBottom)() );
300*b1cdbd2cSJim Jagielski if( nDiff > 0 )
301*b1cdbd2cSJim Jagielski {
302*b1cdbd2cSJim Jagielski if( nDiff > (Frm().*fnRect->fnGetHeight)() )
303*b1cdbd2cSJim Jagielski nDiff = (Frm().*fnRect->fnGetHeight)();
304*b1cdbd2cSJim Jagielski (Frm().*fnRect->fnAddBottom)( -nDiff );
305*b1cdbd2cSJim Jagielski (Prt().*fnRect->fnAddHeight)( -nDiff );
306*b1cdbd2cSJim Jagielski }
307*b1cdbd2cSJim Jagielski }
308*b1cdbd2cSJim Jagielski nDiff = (Frm().*fnRect->fnGetHeight)() - nRemaining;
309*b1cdbd2cSJim Jagielski if ( nDiff > 0 )
310*b1cdbd2cSJim Jagielski Shrink( nDiff );
311*b1cdbd2cSJim Jagielski else if ( nDiff < 0 )
312*b1cdbd2cSJim Jagielski {
313*b1cdbd2cSJim Jagielski Grow( -nDiff );
314*b1cdbd2cSJim Jagielski //Es kann passieren, dass weniger Platz zur Verfuegung steht,
315*b1cdbd2cSJim Jagielski //als der bereits der Border benoetigt - die Groesse der
316*b1cdbd2cSJim Jagielski //PrtArea wird dann negativ.
317*b1cdbd2cSJim Jagielski SwTwips nPrtHeight = (Prt().*fnRect->fnGetHeight)();
318*b1cdbd2cSJim Jagielski if( nPrtHeight < 0 )
319*b1cdbd2cSJim Jagielski {
320*b1cdbd2cSJim Jagielski const SwTwips nTmpDiff = Max( (Prt().*fnRect->fnGetTop)(),
321*b1cdbd2cSJim Jagielski -nPrtHeight );
322*b1cdbd2cSJim Jagielski (Prt().*fnRect->fnSubTop)( nTmpDiff );
323*b1cdbd2cSJim Jagielski }
324*b1cdbd2cSJim Jagielski }
325*b1cdbd2cSJim Jagielski }
326*b1cdbd2cSJim Jagielski bValidSize = sal_True;
327*b1cdbd2cSJim Jagielski }
328*b1cdbd2cSJim Jagielski }
329*b1cdbd2cSJim Jagielski /*************************************************************************
330*b1cdbd2cSJim Jagielski |*
331*b1cdbd2cSJim Jagielski |* SwFtnContFrm::GrowFrm(), ShrinkFrm()
332*b1cdbd2cSJim Jagielski |*
333*b1cdbd2cSJim Jagielski |*************************************************************************/
334*b1cdbd2cSJim Jagielski
GrowFrm(SwTwips nDist,sal_Bool bTst,sal_Bool)335*b1cdbd2cSJim Jagielski SwTwips SwFtnContFrm::GrowFrm( SwTwips nDist, sal_Bool bTst, sal_Bool )
336*b1cdbd2cSJim Jagielski {
337*b1cdbd2cSJim Jagielski //Keine Pruefung ob FixSize oder nicht, die FtnContainer sind immer bis
338*b1cdbd2cSJim Jagielski //zur Maximalhoehe variabel.
339*b1cdbd2cSJim Jagielski //Wenn die Maximalhoehe LONG_MAX ist, so nehmen wir uns soviel Platz wie eben
340*b1cdbd2cSJim Jagielski //moeglich.
341*b1cdbd2cSJim Jagielski //Wenn die Seite eine spezielle Fussnotenseite ist, so nehmen wir uns auch
342*b1cdbd2cSJim Jagielski //soviel Platz wie eben moeglich.
343*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
344*b1cdbd2cSJim Jagielski if ( !GetUpper() || !GetUpper()->IsFtnBossFrm() )
345*b1cdbd2cSJim Jagielski { ASSERT( !this, "Keine FtnBoss." );
346*b1cdbd2cSJim Jagielski return 0;
347*b1cdbd2cSJim Jagielski }
348*b1cdbd2cSJim Jagielski #endif
349*b1cdbd2cSJim Jagielski
350*b1cdbd2cSJim Jagielski SWRECTFN( this )
351*b1cdbd2cSJim Jagielski if( (Frm().*fnRect->fnGetHeight)() > 0 &&
352*b1cdbd2cSJim Jagielski nDist > ( LONG_MAX - (Frm().*fnRect->fnGetHeight)() ) )
353*b1cdbd2cSJim Jagielski nDist = LONG_MAX - (Frm().*fnRect->fnGetHeight)();
354*b1cdbd2cSJim Jagielski
355*b1cdbd2cSJim Jagielski SwFtnBossFrm *pBoss = (SwFtnBossFrm*)GetUpper();
356*b1cdbd2cSJim Jagielski if( IsInSct() )
357*b1cdbd2cSJim Jagielski {
358*b1cdbd2cSJim Jagielski SwSectionFrm* pSect = FindSctFrm();
359*b1cdbd2cSJim Jagielski ASSERT( pSect, "GrowFrm: Missing SectFrm" );
360*b1cdbd2cSJim Jagielski // In a section, which has to maximize, a footnotecontainer is allowed
361*b1cdbd2cSJim Jagielski // to grow, when the section can't grow anymore.
362*b1cdbd2cSJim Jagielski if( !bTst && !pSect->IsColLocked() &&
363*b1cdbd2cSJim Jagielski pSect->ToMaximize( sal_False ) && pSect->Growable() )
364*b1cdbd2cSJim Jagielski {
365*b1cdbd2cSJim Jagielski pSect->InvalidateSize();
366*b1cdbd2cSJim Jagielski return 0;
367*b1cdbd2cSJim Jagielski }
368*b1cdbd2cSJim Jagielski }
369*b1cdbd2cSJim Jagielski const ViewShell *pSh = getRootFrm() ? getRootFrm()->GetCurrShell() : 0;
370*b1cdbd2cSJim Jagielski const sal_Bool bBrowseMode = pSh && pSh->GetViewOptions()->getBrowseMode();
371*b1cdbd2cSJim Jagielski SwPageFrm *pPage = pBoss->FindPageFrm();
372*b1cdbd2cSJim Jagielski if ( bBrowseMode || !pPage->IsFtnPage() )
373*b1cdbd2cSJim Jagielski {
374*b1cdbd2cSJim Jagielski if ( pBoss->GetMaxFtnHeight() != LONG_MAX )
375*b1cdbd2cSJim Jagielski {
376*b1cdbd2cSJim Jagielski nDist = Min( nDist, pBoss->GetMaxFtnHeight()
377*b1cdbd2cSJim Jagielski - (Frm().*fnRect->fnGetHeight)() );
378*b1cdbd2cSJim Jagielski if ( nDist <= 0 )
379*b1cdbd2cSJim Jagielski return 0L;
380*b1cdbd2cSJim Jagielski }
381*b1cdbd2cSJim Jagielski //Der FtnBoss will bezueglich des MaxWerts auch noch mitreden.
382*b1cdbd2cSJim Jagielski if( !IsInSct() )
383*b1cdbd2cSJim Jagielski {
384*b1cdbd2cSJim Jagielski const SwTwips nMax = pBoss->GetVarSpace();
385*b1cdbd2cSJim Jagielski if ( nDist > nMax )
386*b1cdbd2cSJim Jagielski nDist = nMax;
387*b1cdbd2cSJim Jagielski if ( nDist <= 0 )
388*b1cdbd2cSJim Jagielski return 0L;
389*b1cdbd2cSJim Jagielski }
390*b1cdbd2cSJim Jagielski }
391*b1cdbd2cSJim Jagielski else if( nDist > (GetPrev()->Frm().*fnRect->fnGetHeight)() )
392*b1cdbd2cSJim Jagielski //aber mehr als der Body kann koennen und wollen wir nun auch wieder
393*b1cdbd2cSJim Jagielski //nicht herausruecken.
394*b1cdbd2cSJim Jagielski nDist = (GetPrev()->Frm().*fnRect->fnGetHeight)();
395*b1cdbd2cSJim Jagielski
396*b1cdbd2cSJim Jagielski long nAvail = 0;
397*b1cdbd2cSJim Jagielski if ( bBrowseMode )
398*b1cdbd2cSJim Jagielski {
399*b1cdbd2cSJim Jagielski nAvail = GetUpper()->Prt().Height();
400*b1cdbd2cSJim Jagielski const SwFrm *pAvail = GetUpper()->Lower();
401*b1cdbd2cSJim Jagielski do
402*b1cdbd2cSJim Jagielski { nAvail -= pAvail->Frm().Height();
403*b1cdbd2cSJim Jagielski pAvail = pAvail->GetNext();
404*b1cdbd2cSJim Jagielski } while ( pAvail );
405*b1cdbd2cSJim Jagielski if ( nAvail > nDist )
406*b1cdbd2cSJim Jagielski nAvail = nDist;
407*b1cdbd2cSJim Jagielski }
408*b1cdbd2cSJim Jagielski
409*b1cdbd2cSJim Jagielski if ( !bTst )
410*b1cdbd2cSJim Jagielski {
411*b1cdbd2cSJim Jagielski (Frm().*fnRect->fnSetHeight)( (Frm().*fnRect->fnGetHeight)() + nDist );
412*b1cdbd2cSJim Jagielski //Badaa: 2008-04-18 * Support for Classical Mongolian Script (SCMS) joint with Jiayanmin
413*b1cdbd2cSJim Jagielski if( IsVertical() && !IsVertLR() && !IsReverse() )
414*b1cdbd2cSJim Jagielski Frm().Pos().X() -= nDist;
415*b1cdbd2cSJim Jagielski }
416*b1cdbd2cSJim Jagielski long nGrow = nDist - nAvail,
417*b1cdbd2cSJim Jagielski nReal = 0;
418*b1cdbd2cSJim Jagielski if ( nGrow > 0 )
419*b1cdbd2cSJim Jagielski {
420*b1cdbd2cSJim Jagielski sal_uInt8 nAdjust = pBoss->NeighbourhoodAdjustment( this );
421*b1cdbd2cSJim Jagielski if( NA_ONLY_ADJUST == nAdjust )
422*b1cdbd2cSJim Jagielski nReal = AdjustNeighbourhood( nGrow, bTst );
423*b1cdbd2cSJim Jagielski else
424*b1cdbd2cSJim Jagielski {
425*b1cdbd2cSJim Jagielski if( NA_GROW_ADJUST == nAdjust )
426*b1cdbd2cSJim Jagielski {
427*b1cdbd2cSJim Jagielski SwFrm* pFtn = Lower();
428*b1cdbd2cSJim Jagielski if( pFtn )
429*b1cdbd2cSJim Jagielski {
430*b1cdbd2cSJim Jagielski while( pFtn->GetNext() )
431*b1cdbd2cSJim Jagielski pFtn = pFtn->GetNext();
432*b1cdbd2cSJim Jagielski if( ((SwFtnFrm*)pFtn)->GetAttr()->GetFtn().IsEndNote() )
433*b1cdbd2cSJim Jagielski {
434*b1cdbd2cSJim Jagielski nReal = AdjustNeighbourhood( nGrow, bTst );
435*b1cdbd2cSJim Jagielski nAdjust = NA_GROW_SHRINK; // no more AdjustNeighbourhood
436*b1cdbd2cSJim Jagielski }
437*b1cdbd2cSJim Jagielski }
438*b1cdbd2cSJim Jagielski }
439*b1cdbd2cSJim Jagielski nReal += pBoss->Grow( nGrow - nReal, bTst );
440*b1cdbd2cSJim Jagielski if( ( NA_GROW_ADJUST == nAdjust || NA_ADJUST_GROW == nAdjust )
441*b1cdbd2cSJim Jagielski && nReal < nGrow )
442*b1cdbd2cSJim Jagielski nReal += AdjustNeighbourhood( nGrow - nReal, bTst );
443*b1cdbd2cSJim Jagielski }
444*b1cdbd2cSJim Jagielski }
445*b1cdbd2cSJim Jagielski
446*b1cdbd2cSJim Jagielski nReal += nAvail;
447*b1cdbd2cSJim Jagielski
448*b1cdbd2cSJim Jagielski if ( !bTst )
449*b1cdbd2cSJim Jagielski {
450*b1cdbd2cSJim Jagielski if ( nReal != nDist )
451*b1cdbd2cSJim Jagielski {
452*b1cdbd2cSJim Jagielski nDist -= nReal;
453*b1cdbd2cSJim Jagielski //Den masslosen Wunsch koennen wir leider nur in Grenzen erfuellen.
454*b1cdbd2cSJim Jagielski Frm().SSize().Height() -= nDist;
455*b1cdbd2cSJim Jagielski //Badaa: 2008-04-18 * Support for Classical Mongolian Script (SCMS) joint with Jiayanmin
456*b1cdbd2cSJim Jagielski if( IsVertical() && !IsVertLR() && !IsReverse() )
457*b1cdbd2cSJim Jagielski Frm().Pos().X() += nDist;
458*b1cdbd2cSJim Jagielski }
459*b1cdbd2cSJim Jagielski
460*b1cdbd2cSJim Jagielski //Nachfolger braucht nicht invalidiert werden, denn wir wachsen
461*b1cdbd2cSJim Jagielski //immer nach oben.
462*b1cdbd2cSJim Jagielski if( nReal )
463*b1cdbd2cSJim Jagielski {
464*b1cdbd2cSJim Jagielski _InvalidateSize();
465*b1cdbd2cSJim Jagielski _InvalidatePos();
466*b1cdbd2cSJim Jagielski InvalidatePage( pPage );
467*b1cdbd2cSJim Jagielski }
468*b1cdbd2cSJim Jagielski }
469*b1cdbd2cSJim Jagielski return nReal;
470*b1cdbd2cSJim Jagielski }
471*b1cdbd2cSJim Jagielski
472*b1cdbd2cSJim Jagielski
ShrinkFrm(SwTwips nDiff,sal_Bool bTst,sal_Bool bInfo)473*b1cdbd2cSJim Jagielski SwTwips SwFtnContFrm::ShrinkFrm( SwTwips nDiff, sal_Bool bTst, sal_Bool bInfo )
474*b1cdbd2cSJim Jagielski {
475*b1cdbd2cSJim Jagielski SwPageFrm *pPage = FindPageFrm();
476*b1cdbd2cSJim Jagielski bool bShrink = false;
477*b1cdbd2cSJim Jagielski if ( pPage )
478*b1cdbd2cSJim Jagielski {
479*b1cdbd2cSJim Jagielski if( !pPage->IsFtnPage() )
480*b1cdbd2cSJim Jagielski bShrink = true;
481*b1cdbd2cSJim Jagielski else
482*b1cdbd2cSJim Jagielski {
483*b1cdbd2cSJim Jagielski const ViewShell *pSh = getRootFrm()->GetCurrShell();
484*b1cdbd2cSJim Jagielski if( pSh && pSh->GetViewOptions()->getBrowseMode() )
485*b1cdbd2cSJim Jagielski bShrink = true;
486*b1cdbd2cSJim Jagielski }
487*b1cdbd2cSJim Jagielski }
488*b1cdbd2cSJim Jagielski if( bShrink )
489*b1cdbd2cSJim Jagielski {
490*b1cdbd2cSJim Jagielski SwTwips nRet = SwLayoutFrm::ShrinkFrm( nDiff, bTst, bInfo );
491*b1cdbd2cSJim Jagielski if( IsInSct() && !bTst )
492*b1cdbd2cSJim Jagielski FindSctFrm()->InvalidateNextPos();
493*b1cdbd2cSJim Jagielski if ( !bTst && nRet )
494*b1cdbd2cSJim Jagielski {
495*b1cdbd2cSJim Jagielski _InvalidatePos();
496*b1cdbd2cSJim Jagielski InvalidatePage( pPage );
497*b1cdbd2cSJim Jagielski }
498*b1cdbd2cSJim Jagielski return nRet;
499*b1cdbd2cSJim Jagielski }
500*b1cdbd2cSJim Jagielski return 0;
501*b1cdbd2cSJim Jagielski }
502*b1cdbd2cSJim Jagielski
503*b1cdbd2cSJim Jagielski
504*b1cdbd2cSJim Jagielski /*************************************************************************
505*b1cdbd2cSJim Jagielski |*
506*b1cdbd2cSJim Jagielski |* SwFtnFrm::SwFtnFrm()
507*b1cdbd2cSJim Jagielski |*
508*b1cdbd2cSJim Jagielski |*************************************************************************/
509*b1cdbd2cSJim Jagielski
510*b1cdbd2cSJim Jagielski
SwFtnFrm(SwFrmFmt * pFmt,SwFrm * pSib,SwCntntFrm * pCnt,SwTxtFtn * pAt)511*b1cdbd2cSJim Jagielski SwFtnFrm::SwFtnFrm( SwFrmFmt *pFmt, SwFrm* pSib, SwCntntFrm *pCnt, SwTxtFtn *pAt ):
512*b1cdbd2cSJim Jagielski SwLayoutFrm( pFmt, pSib ),
513*b1cdbd2cSJim Jagielski pFollow( 0 ),
514*b1cdbd2cSJim Jagielski pMaster( 0 ),
515*b1cdbd2cSJim Jagielski pRef( pCnt ),
516*b1cdbd2cSJim Jagielski pAttr( pAt ),
517*b1cdbd2cSJim Jagielski bBackMoveLocked( sal_False ),
518*b1cdbd2cSJim Jagielski // --> OD 2005-08-11 #i49383#
519*b1cdbd2cSJim Jagielski mbUnlockPosOfLowerObjs( true )
520*b1cdbd2cSJim Jagielski // <--
521*b1cdbd2cSJim Jagielski {
522*b1cdbd2cSJim Jagielski nType = FRMC_FTN;
523*b1cdbd2cSJim Jagielski }
524*b1cdbd2cSJim Jagielski
525*b1cdbd2cSJim Jagielski /*************************************************************************
526*b1cdbd2cSJim Jagielski |*
527*b1cdbd2cSJim Jagielski |* SwFtnFrm::InvalidateNxtFtnCnts()
528*b1cdbd2cSJim Jagielski |*
529*b1cdbd2cSJim Jagielski |*************************************************************************/
530*b1cdbd2cSJim Jagielski
531*b1cdbd2cSJim Jagielski
InvalidateNxtFtnCnts(SwPageFrm * pPage)532*b1cdbd2cSJim Jagielski void SwFtnFrm::InvalidateNxtFtnCnts( SwPageFrm *pPage )
533*b1cdbd2cSJim Jagielski {
534*b1cdbd2cSJim Jagielski if ( GetNext() )
535*b1cdbd2cSJim Jagielski {
536*b1cdbd2cSJim Jagielski SwFrm *pCnt = ((SwLayoutFrm*)GetNext())->ContainsAny();
537*b1cdbd2cSJim Jagielski if( pCnt )
538*b1cdbd2cSJim Jagielski {
539*b1cdbd2cSJim Jagielski pCnt->InvalidatePage( pPage );
540*b1cdbd2cSJim Jagielski pCnt->_InvalidatePrt();
541*b1cdbd2cSJim Jagielski do
542*b1cdbd2cSJim Jagielski { pCnt->_InvalidatePos();
543*b1cdbd2cSJim Jagielski if( pCnt->IsSctFrm() )
544*b1cdbd2cSJim Jagielski {
545*b1cdbd2cSJim Jagielski SwFrm* pTmp = ((SwSectionFrm*)pCnt)->ContainsAny();
546*b1cdbd2cSJim Jagielski if( pTmp )
547*b1cdbd2cSJim Jagielski pTmp->_InvalidatePos();
548*b1cdbd2cSJim Jagielski }
549*b1cdbd2cSJim Jagielski pCnt->GetUpper()->_InvalidateSize();
550*b1cdbd2cSJim Jagielski pCnt = pCnt->FindNext();
551*b1cdbd2cSJim Jagielski } while ( pCnt && GetUpper()->IsAnLower( pCnt ) );
552*b1cdbd2cSJim Jagielski }
553*b1cdbd2cSJim Jagielski }
554*b1cdbd2cSJim Jagielski }
555*b1cdbd2cSJim Jagielski
556*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
557*b1cdbd2cSJim Jagielski
GrowFrm(SwTwips nDist,sal_Bool bTst,sal_Bool bInfo)558*b1cdbd2cSJim Jagielski SwTwips SwFtnFrm::GrowFrm( SwTwips nDist, sal_Bool bTst, sal_Bool bInfo )
559*b1cdbd2cSJim Jagielski {
560*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 1
561*b1cdbd2cSJim Jagielski static sal_uInt16 nNum = USHRT_MAX;
562*b1cdbd2cSJim Jagielski SwTxtFtn* pTxtFtn = GetAttr();
563*b1cdbd2cSJim Jagielski if ( pTxtFtn->GetFtn().GetNumber() == nNum )
564*b1cdbd2cSJim Jagielski {
565*b1cdbd2cSJim Jagielski int bla = 5;
566*b1cdbd2cSJim Jagielski (void)bla;
567*b1cdbd2cSJim Jagielski
568*b1cdbd2cSJim Jagielski }
569*b1cdbd2cSJim Jagielski #endif
570*b1cdbd2cSJim Jagielski return SwLayoutFrm::GrowFrm( nDist, bTst, bInfo );
571*b1cdbd2cSJim Jagielski }
572*b1cdbd2cSJim Jagielski
573*b1cdbd2cSJim Jagielski
ShrinkFrm(SwTwips nDist,sal_Bool bTst,sal_Bool bInfo)574*b1cdbd2cSJim Jagielski SwTwips SwFtnFrm::ShrinkFrm( SwTwips nDist, sal_Bool bTst, sal_Bool bInfo )
575*b1cdbd2cSJim Jagielski {
576*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 1
577*b1cdbd2cSJim Jagielski static sal_uInt16 nNum = USHRT_MAX;
578*b1cdbd2cSJim Jagielski if( nNum != USHRT_MAX )
579*b1cdbd2cSJim Jagielski {
580*b1cdbd2cSJim Jagielski SwTxtFtn* pTxtFtn = GetAttr();
581*b1cdbd2cSJim Jagielski if( &pTxtFtn->GetAttr() && pTxtFtn->GetFtn().GetNumber() == nNum )
582*b1cdbd2cSJim Jagielski {
583*b1cdbd2cSJim Jagielski int bla = 5;
584*b1cdbd2cSJim Jagielski (void)bla;
585*b1cdbd2cSJim Jagielski }
586*b1cdbd2cSJim Jagielski }
587*b1cdbd2cSJim Jagielski #endif
588*b1cdbd2cSJim Jagielski return SwLayoutFrm::ShrinkFrm( nDist, bTst, bInfo );
589*b1cdbd2cSJim Jagielski }
590*b1cdbd2cSJim Jagielski #endif
591*b1cdbd2cSJim Jagielski
592*b1cdbd2cSJim Jagielski /*************************************************************************
593*b1cdbd2cSJim Jagielski |*
594*b1cdbd2cSJim Jagielski |* SwFtnFrm::Cut()
595*b1cdbd2cSJim Jagielski |*
596*b1cdbd2cSJim Jagielski |*************************************************************************/
597*b1cdbd2cSJim Jagielski
598*b1cdbd2cSJim Jagielski
Cut()599*b1cdbd2cSJim Jagielski void SwFtnFrm::Cut()
600*b1cdbd2cSJim Jagielski {
601*b1cdbd2cSJim Jagielski if ( GetNext() )
602*b1cdbd2cSJim Jagielski GetNext()->InvalidatePos();
603*b1cdbd2cSJim Jagielski else if ( GetPrev() )
604*b1cdbd2cSJim Jagielski GetPrev()->SetRetouche();
605*b1cdbd2cSJim Jagielski
606*b1cdbd2cSJim Jagielski //Erst removen, dann Upper Shrinken.
607*b1cdbd2cSJim Jagielski SwLayoutFrm *pUp = GetUpper();
608*b1cdbd2cSJim Jagielski
609*b1cdbd2cSJim Jagielski //Verkettung korrigieren.
610*b1cdbd2cSJim Jagielski SwFtnFrm *pFtn = (SwFtnFrm*)this;
611*b1cdbd2cSJim Jagielski if ( pFtn->GetFollow() )
612*b1cdbd2cSJim Jagielski pFtn->GetFollow()->SetMaster( pFtn->GetMaster() );
613*b1cdbd2cSJim Jagielski if ( pFtn->GetMaster() )
614*b1cdbd2cSJim Jagielski pFtn->GetMaster()->SetFollow( pFtn->GetFollow() );
615*b1cdbd2cSJim Jagielski pFtn->SetFollow( 0 );
616*b1cdbd2cSJim Jagielski pFtn->SetMaster( 0 );
617*b1cdbd2cSJim Jagielski
618*b1cdbd2cSJim Jagielski // Alle Verbindungen kappen.
619*b1cdbd2cSJim Jagielski Remove();
620*b1cdbd2cSJim Jagielski
621*b1cdbd2cSJim Jagielski if ( pUp )
622*b1cdbd2cSJim Jagielski {
623*b1cdbd2cSJim Jagielski //Die letzte Fussnote nimmt ihren Container mit.
624*b1cdbd2cSJim Jagielski if ( !pUp->Lower() )
625*b1cdbd2cSJim Jagielski {
626*b1cdbd2cSJim Jagielski SwPageFrm *pPage = pUp->FindPageFrm();
627*b1cdbd2cSJim Jagielski if ( pPage )
628*b1cdbd2cSJim Jagielski {
629*b1cdbd2cSJim Jagielski SwLayoutFrm *pBody = pPage->FindBodyCont();
630*b1cdbd2cSJim Jagielski if( pBody && !pBody->ContainsCntnt() )
631*b1cdbd2cSJim Jagielski pPage->getRootFrm()->SetSuperfluous();
632*b1cdbd2cSJim Jagielski }
633*b1cdbd2cSJim Jagielski SwSectionFrm* pSect = pUp->FindSctFrm();
634*b1cdbd2cSJim Jagielski pUp->Cut();
635*b1cdbd2cSJim Jagielski delete pUp;
636*b1cdbd2cSJim Jagielski // Wenn der letzte Fussnotencontainer aus einem spaltigen Bereich verschwindet,
637*b1cdbd2cSJim Jagielski // so kann dieser, falls er keinen Follow besitzt, zusammenschrumpfen.
638*b1cdbd2cSJim Jagielski if( pSect && !pSect->ToMaximize( sal_False ) && !pSect->IsColLocked() )
639*b1cdbd2cSJim Jagielski pSect->_InvalidateSize();
640*b1cdbd2cSJim Jagielski }
641*b1cdbd2cSJim Jagielski else
642*b1cdbd2cSJim Jagielski { if ( Frm().Height() )
643*b1cdbd2cSJim Jagielski pUp->Shrink( Frm().Height() );
644*b1cdbd2cSJim Jagielski pUp->SetCompletePaint();
645*b1cdbd2cSJim Jagielski pUp->InvalidatePage();
646*b1cdbd2cSJim Jagielski }
647*b1cdbd2cSJim Jagielski }
648*b1cdbd2cSJim Jagielski }
649*b1cdbd2cSJim Jagielski
650*b1cdbd2cSJim Jagielski /*************************************************************************
651*b1cdbd2cSJim Jagielski |*
652*b1cdbd2cSJim Jagielski |* SwFtnFrm::Paste()
653*b1cdbd2cSJim Jagielski |*
654*b1cdbd2cSJim Jagielski |*************************************************************************/
655*b1cdbd2cSJim Jagielski
656*b1cdbd2cSJim Jagielski
Paste(SwFrm * pParent,SwFrm * pSibling)657*b1cdbd2cSJim Jagielski void SwFtnFrm::Paste( SwFrm* pParent, SwFrm* pSibling )
658*b1cdbd2cSJim Jagielski {
659*b1cdbd2cSJim Jagielski ASSERT( pParent, "Kein Parent fuer Paste." );
660*b1cdbd2cSJim Jagielski ASSERT( pParent->IsLayoutFrm(), "Parent ist CntntFrm." );
661*b1cdbd2cSJim Jagielski ASSERT( pParent != this, "Bin selbst der Parent." );
662*b1cdbd2cSJim Jagielski ASSERT( pSibling != this, "Bin mein eigener Nachbar." );
663*b1cdbd2cSJim Jagielski ASSERT( !GetPrev() && !GetNext() && !GetUpper(),
664*b1cdbd2cSJim Jagielski "Bin noch irgendwo angemeldet." );
665*b1cdbd2cSJim Jagielski
666*b1cdbd2cSJim Jagielski //In den Baum einhaengen.
667*b1cdbd2cSJim Jagielski InsertBefore( (SwLayoutFrm*)pParent, pSibling );
668*b1cdbd2cSJim Jagielski
669*b1cdbd2cSJim Jagielski SWRECTFN( this )
670*b1cdbd2cSJim Jagielski if( (Frm().*fnRect->fnGetWidth)()!=(pParent->Prt().*fnRect->fnGetWidth)() )
671*b1cdbd2cSJim Jagielski _InvalidateSize();
672*b1cdbd2cSJim Jagielski _InvalidatePos();
673*b1cdbd2cSJim Jagielski SwPageFrm *pPage = FindPageFrm();
674*b1cdbd2cSJim Jagielski InvalidatePage( pPage );
675*b1cdbd2cSJim Jagielski if ( GetNext() )
676*b1cdbd2cSJim Jagielski GetNext()->_InvalidatePos();
677*b1cdbd2cSJim Jagielski if( (Frm().*fnRect->fnGetHeight)() )
678*b1cdbd2cSJim Jagielski pParent->Grow( (Frm().*fnRect->fnGetHeight)() );
679*b1cdbd2cSJim Jagielski
680*b1cdbd2cSJim Jagielski //Wenn mein Vorgaenger mein Master ist und/oder wenn mein Nachfolger mein
681*b1cdbd2cSJim Jagielski //Follow ist so kann ich deren Inhalt uebernehmen und sie vernichten.
682*b1cdbd2cSJim Jagielski if ( GetPrev() && GetPrev() == GetMaster() )
683*b1cdbd2cSJim Jagielski { ASSERT( SwFlowFrm::CastFlowFrm( GetPrev()->GetLower() ),
684*b1cdbd2cSJim Jagielski "Fussnote ohne Inhalt?" );
685*b1cdbd2cSJim Jagielski (SwFlowFrm::CastFlowFrm( GetPrev()->GetLower()))->
686*b1cdbd2cSJim Jagielski MoveSubTree( this, GetLower() );
687*b1cdbd2cSJim Jagielski SwFrm *pDel = GetPrev();
688*b1cdbd2cSJim Jagielski pDel->Cut();
689*b1cdbd2cSJim Jagielski delete pDel;
690*b1cdbd2cSJim Jagielski }
691*b1cdbd2cSJim Jagielski if ( GetNext() && GetNext() == GetFollow() )
692*b1cdbd2cSJim Jagielski { ASSERT( SwFlowFrm::CastFlowFrm( GetNext()->GetLower() ),
693*b1cdbd2cSJim Jagielski "Fussnote ohne Inhalt?" );
694*b1cdbd2cSJim Jagielski (SwFlowFrm::CastFlowFrm( GetNext()->GetLower()))->MoveSubTree( this );
695*b1cdbd2cSJim Jagielski SwFrm *pDel = GetNext();
696*b1cdbd2cSJim Jagielski pDel->Cut();
697*b1cdbd2cSJim Jagielski delete pDel;
698*b1cdbd2cSJim Jagielski }
699*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
700*b1cdbd2cSJim Jagielski SwDoc *pDoc = GetFmt()->GetDoc();
701*b1cdbd2cSJim Jagielski if ( GetPrev() )
702*b1cdbd2cSJim Jagielski {
703*b1cdbd2cSJim Jagielski ASSERT( lcl_FindFtnPos( pDoc, ((SwFtnFrm*)GetPrev())->GetAttr() ) <=
704*b1cdbd2cSJim Jagielski lcl_FindFtnPos( pDoc, GetAttr() ), "Prev ist not FtnPrev" );
705*b1cdbd2cSJim Jagielski }
706*b1cdbd2cSJim Jagielski if ( GetNext() )
707*b1cdbd2cSJim Jagielski {
708*b1cdbd2cSJim Jagielski ASSERT( lcl_FindFtnPos( pDoc, GetAttr() ) <=
709*b1cdbd2cSJim Jagielski lcl_FindFtnPos( pDoc, ((SwFtnFrm*)GetNext())->GetAttr() ),
710*b1cdbd2cSJim Jagielski "Next is not FtnNext" );
711*b1cdbd2cSJim Jagielski }
712*b1cdbd2cSJim Jagielski #endif
713*b1cdbd2cSJim Jagielski InvalidateNxtFtnCnts( pPage );
714*b1cdbd2cSJim Jagielski }
715*b1cdbd2cSJim Jagielski
716*b1cdbd2cSJim Jagielski /*************************************************************************
717*b1cdbd2cSJim Jagielski |*
718*b1cdbd2cSJim Jagielski |* SwFrm::GetNextFtnLeaf()
719*b1cdbd2cSJim Jagielski |*
720*b1cdbd2cSJim Jagielski |* Beschreibung Liefert das naechste LayoutBlatt in den das
721*b1cdbd2cSJim Jagielski |* Frame gemoved werden kann.
722*b1cdbd2cSJim Jagielski |* Neue Seiten werden nur dann erzeugt, wenn der Parameter sal_True ist.
723*b1cdbd2cSJim Jagielski |*
724*b1cdbd2cSJim Jagielski |*************************************************************************/
725*b1cdbd2cSJim Jagielski
726*b1cdbd2cSJim Jagielski
GetNextFtnLeaf(MakePageType eMakePage)727*b1cdbd2cSJim Jagielski SwLayoutFrm *SwFrm::GetNextFtnLeaf( MakePageType eMakePage )
728*b1cdbd2cSJim Jagielski {
729*b1cdbd2cSJim Jagielski SwFtnBossFrm *pOldBoss = FindFtnBossFrm();
730*b1cdbd2cSJim Jagielski SwPageFrm* pOldPage = pOldBoss->FindPageFrm();
731*b1cdbd2cSJim Jagielski SwPageFrm* pPage;
732*b1cdbd2cSJim Jagielski SwFtnBossFrm *pBoss = pOldBoss->IsColumnFrm() ?
733*b1cdbd2cSJim Jagielski (SwFtnBossFrm*)pOldBoss->GetNext() : 0; // naechste Spalte, wenn vorhanden
734*b1cdbd2cSJim Jagielski if( pBoss )
735*b1cdbd2cSJim Jagielski pPage = NULL;
736*b1cdbd2cSJim Jagielski else
737*b1cdbd2cSJim Jagielski {
738*b1cdbd2cSJim Jagielski if( pOldBoss->GetUpper()->IsSctFrm() )
739*b1cdbd2cSJim Jagielski { // Das kann nur in einem spaltigen Bereich sein
740*b1cdbd2cSJim Jagielski SwLayoutFrm* pNxt = pOldBoss->GetNextSctLeaf( eMakePage );
741*b1cdbd2cSJim Jagielski if( pNxt )
742*b1cdbd2cSJim Jagielski {
743*b1cdbd2cSJim Jagielski ASSERT( pNxt->IsColBodyFrm(), "GetNextFtnLeaf: Funny Leaf" );
744*b1cdbd2cSJim Jagielski pBoss = (SwFtnBossFrm*)pNxt->GetUpper();
745*b1cdbd2cSJim Jagielski pPage = pBoss->FindPageFrm();
746*b1cdbd2cSJim Jagielski }
747*b1cdbd2cSJim Jagielski else
748*b1cdbd2cSJim Jagielski return 0;
749*b1cdbd2cSJim Jagielski }
750*b1cdbd2cSJim Jagielski else
751*b1cdbd2cSJim Jagielski {
752*b1cdbd2cSJim Jagielski // naechste Seite
753*b1cdbd2cSJim Jagielski pPage = (SwPageFrm*)pOldPage->GetNext();
754*b1cdbd2cSJim Jagielski // Leerseiten ueberspringen
755*b1cdbd2cSJim Jagielski if( pPage && pPage->IsEmptyPage() )
756*b1cdbd2cSJim Jagielski pPage = (SwPageFrm*)pPage->GetNext();
757*b1cdbd2cSJim Jagielski pBoss = pPage;
758*b1cdbd2cSJim Jagielski }
759*b1cdbd2cSJim Jagielski }
760*b1cdbd2cSJim Jagielski // Was haben wir jetzt?
761*b1cdbd2cSJim Jagielski // pBoss != NULL, pPage==NULL => pBoss ist die auf der gleichen Seite folgende Spalte
762*b1cdbd2cSJim Jagielski // pBoss != NULL, pPage!=NULL => pBoss und pPage sind die folgende Seite (Empty uebersprungen)
763*b1cdbd2cSJim Jagielski // pBoss == NULL => pPage == NULL, es gibt keine folgende Seite
764*b1cdbd2cSJim Jagielski
765*b1cdbd2cSJim Jagielski //Wenn die Fussnote bereits einen Follow hat brauchen wir nicht zu suchen.
766*b1cdbd2cSJim Jagielski //Wenn allerdings zwischen Ftn und Follow unerwuenschte Leerseiten/spalten
767*b1cdbd2cSJim Jagielski //herumlungern, so legen wir auf der naechstbesten Seite/Spalte einen weiteren
768*b1cdbd2cSJim Jagielski //Follow an, der Rest wird sich schon finden.
769*b1cdbd2cSJim Jagielski SwFtnFrm *pFtn = FindFtnFrm();
770*b1cdbd2cSJim Jagielski if ( pFtn && pFtn->GetFollow() )
771*b1cdbd2cSJim Jagielski {
772*b1cdbd2cSJim Jagielski SwFtnBossFrm* pTmpBoss = pFtn->GetFollow()->FindFtnBossFrm();
773*b1cdbd2cSJim Jagielski // Folgende Faelle werden hier erkannt und akzeptiert
774*b1cdbd2cSJim Jagielski // 1. Die FtnBosse sind benachbarte Seiten oder benachbarte Spalten
775*b1cdbd2cSJim Jagielski // 2. Der neue ist die erste Spalte der benachbarten Seite
776*b1cdbd2cSJim Jagielski // 3. Der neue ist die erste Spalte in einem Bereich in der naechsten Spalte/Seite
777*b1cdbd2cSJim Jagielski while( pTmpBoss != pBoss && pTmpBoss && !pTmpBoss->GetPrev() )
778*b1cdbd2cSJim Jagielski pTmpBoss = pTmpBoss->GetUpper()->FindFtnBossFrm();
779*b1cdbd2cSJim Jagielski if( pTmpBoss == pBoss )
780*b1cdbd2cSJim Jagielski return pFtn->GetFollow();
781*b1cdbd2cSJim Jagielski }
782*b1cdbd2cSJim Jagielski
783*b1cdbd2cSJim Jagielski // Wenn wir keinen pBoss gefunden haben oder es sich um eine "falsche" Seite handelt,
784*b1cdbd2cSJim Jagielski // muss eine neue Seite her
785*b1cdbd2cSJim Jagielski if ( !pBoss || ( pPage && pPage->IsEndNotePage() && !pOldPage->IsEndNotePage() ) )
786*b1cdbd2cSJim Jagielski {
787*b1cdbd2cSJim Jagielski if ( eMakePage == MAKEPAGE_APPEND || eMakePage == MAKEPAGE_INSERT )
788*b1cdbd2cSJim Jagielski {
789*b1cdbd2cSJim Jagielski pBoss = InsertPage( pOldPage, pOldPage->IsFtnPage() );
790*b1cdbd2cSJim Jagielski ((SwPageFrm*)pBoss)->SetEndNotePage( pOldPage->IsEndNotePage() );
791*b1cdbd2cSJim Jagielski }
792*b1cdbd2cSJim Jagielski else
793*b1cdbd2cSJim Jagielski return 0;
794*b1cdbd2cSJim Jagielski }
795*b1cdbd2cSJim Jagielski if( pBoss->IsPageFrm() )
796*b1cdbd2cSJim Jagielski { // Wenn wir auf einer spaltigen Seite gelandet sind,
797*b1cdbd2cSJim Jagielski // gehen wir in die erste Spalte
798*b1cdbd2cSJim Jagielski SwLayoutFrm* pLay = pBoss->FindBodyCont();
799*b1cdbd2cSJim Jagielski if( pLay && pLay->Lower() && pLay->Lower()->IsColumnFrm() )
800*b1cdbd2cSJim Jagielski pBoss = (SwFtnBossFrm*)pLay->Lower();
801*b1cdbd2cSJim Jagielski }
802*b1cdbd2cSJim Jagielski //Seite/Spalte gefunden, da schummeln wir uns doch gleich mal 'rein
803*b1cdbd2cSJim Jagielski SwFtnContFrm *pCont = pBoss->FindFtnCont();
804*b1cdbd2cSJim Jagielski if ( !pCont && pBoss->GetMaxFtnHeight() &&
805*b1cdbd2cSJim Jagielski ( eMakePage == MAKEPAGE_APPEND || eMakePage == MAKEPAGE_INSERT ) )
806*b1cdbd2cSJim Jagielski pCont = pBoss->MakeFtnCont();
807*b1cdbd2cSJim Jagielski return pCont;
808*b1cdbd2cSJim Jagielski }
809*b1cdbd2cSJim Jagielski
810*b1cdbd2cSJim Jagielski /*************************************************************************
811*b1cdbd2cSJim Jagielski |*
812*b1cdbd2cSJim Jagielski |* SwFrm::GetPrevFtnLeaf()
813*b1cdbd2cSJim Jagielski |*
814*b1cdbd2cSJim Jagielski |* Beschreibung Liefert das vorhergehende LayoutBlatt in das der
815*b1cdbd2cSJim Jagielski |* Frame gemoved werden kann.
816*b1cdbd2cSJim Jagielski |*
817*b1cdbd2cSJim Jagielski |*************************************************************************/
818*b1cdbd2cSJim Jagielski
819*b1cdbd2cSJim Jagielski
GetPrevFtnLeaf(MakePageType eMakeFtn)820*b1cdbd2cSJim Jagielski SwLayoutFrm *SwFrm::GetPrevFtnLeaf( MakePageType eMakeFtn )
821*b1cdbd2cSJim Jagielski {
822*b1cdbd2cSJim Jagielski //Der Vorgaenger fuer eine Fussnote ist falls moeglich der Master
823*b1cdbd2cSJim Jagielski //in der Fussnoteneigenen Verkettung.
824*b1cdbd2cSJim Jagielski SwLayoutFrm *pRet = 0;
825*b1cdbd2cSJim Jagielski SwFtnFrm *pFtn = FindFtnFrm();
826*b1cdbd2cSJim Jagielski pRet = pFtn->GetMaster();
827*b1cdbd2cSJim Jagielski
828*b1cdbd2cSJim Jagielski SwFtnBossFrm* pOldBoss = FindFtnBossFrm();
829*b1cdbd2cSJim Jagielski SwPageFrm *pOldPage = pOldBoss->FindPageFrm();
830*b1cdbd2cSJim Jagielski
831*b1cdbd2cSJim Jagielski if ( !pOldBoss->GetPrev() && !pOldPage->GetPrev() )
832*b1cdbd2cSJim Jagielski return pRet; // es gibt weder eine Spalte noch eine Seite vor uns
833*b1cdbd2cSJim Jagielski
834*b1cdbd2cSJim Jagielski if ( !pRet )
835*b1cdbd2cSJim Jagielski {
836*b1cdbd2cSJim Jagielski bool bEndn = pFtn->GetAttr()->GetFtn().IsEndNote();
837*b1cdbd2cSJim Jagielski SwFrm* pTmpRef = NULL;
838*b1cdbd2cSJim Jagielski if( bEndn && pFtn->IsInSct() )
839*b1cdbd2cSJim Jagielski {
840*b1cdbd2cSJim Jagielski SwSectionFrm* pSect = pFtn->FindSctFrm();
841*b1cdbd2cSJim Jagielski if( pSect->IsEndnAtEnd() )
842*b1cdbd2cSJim Jagielski pTmpRef = pSect->FindLastCntnt( FINDMODE_LASTCNT );
843*b1cdbd2cSJim Jagielski }
844*b1cdbd2cSJim Jagielski if( !pTmpRef )
845*b1cdbd2cSJim Jagielski pTmpRef = pFtn->GetRef();
846*b1cdbd2cSJim Jagielski SwFtnBossFrm* pStop = pTmpRef->FindFtnBossFrm( !bEndn );
847*b1cdbd2cSJim Jagielski
848*b1cdbd2cSJim Jagielski const sal_uInt16 nNum = pStop->GetPhyPageNum();
849*b1cdbd2cSJim Jagielski
850*b1cdbd2cSJim Jagielski //Wenn die Fussnoten am Dokumentende angezeigt werden, so verlassen wir
851*b1cdbd2cSJim Jagielski //die Entsprechenden Seiten nicht.
852*b1cdbd2cSJim Jagielski //Selbiges gilt analog fuer die Endnotenseiten.
853*b1cdbd2cSJim Jagielski const sal_Bool bEndNote = pOldPage->IsEndNotePage();
854*b1cdbd2cSJim Jagielski const sal_Bool bFtnEndDoc = pOldPage->IsFtnPage();
855*b1cdbd2cSJim Jagielski SwFtnBossFrm* pNxtBoss = pOldBoss;
856*b1cdbd2cSJim Jagielski SwSectionFrm *pSect = pNxtBoss->GetUpper()->IsSctFrm() ?
857*b1cdbd2cSJim Jagielski (SwSectionFrm*)pNxtBoss->GetUpper() : 0;
858*b1cdbd2cSJim Jagielski
859*b1cdbd2cSJim Jagielski do
860*b1cdbd2cSJim Jagielski {
861*b1cdbd2cSJim Jagielski if( pNxtBoss->IsColumnFrm() && pNxtBoss->GetPrev() )
862*b1cdbd2cSJim Jagielski pNxtBoss = (SwFtnBossFrm*)pNxtBoss->GetPrev(); // eine Spalte zurueck
863*b1cdbd2cSJim Jagielski else // oder eine Seite zurueck
864*b1cdbd2cSJim Jagielski {
865*b1cdbd2cSJim Jagielski SwLayoutFrm* pBody = 0;
866*b1cdbd2cSJim Jagielski if( pSect )
867*b1cdbd2cSJim Jagielski {
868*b1cdbd2cSJim Jagielski if( pSect->IsFtnLock() )
869*b1cdbd2cSJim Jagielski {
870*b1cdbd2cSJim Jagielski if( pNxtBoss == pOldBoss )
871*b1cdbd2cSJim Jagielski return 0;
872*b1cdbd2cSJim Jagielski pStop = pNxtBoss;
873*b1cdbd2cSJim Jagielski }
874*b1cdbd2cSJim Jagielski else
875*b1cdbd2cSJim Jagielski {
876*b1cdbd2cSJim Jagielski pSect = (SwSectionFrm*)pSect->FindMaster();
877*b1cdbd2cSJim Jagielski if( !pSect || !pSect->Lower() )
878*b1cdbd2cSJim Jagielski return 0;
879*b1cdbd2cSJim Jagielski ASSERT( pSect->Lower()->IsColumnFrm(),
880*b1cdbd2cSJim Jagielski "GetPrevFtnLeaf: Where's the column?" );
881*b1cdbd2cSJim Jagielski pNxtBoss = (SwFtnBossFrm*)pSect->Lower();
882*b1cdbd2cSJim Jagielski pBody = pSect;
883*b1cdbd2cSJim Jagielski }
884*b1cdbd2cSJim Jagielski }
885*b1cdbd2cSJim Jagielski else
886*b1cdbd2cSJim Jagielski {
887*b1cdbd2cSJim Jagielski SwPageFrm* pPage = (SwPageFrm*)pNxtBoss->FindPageFrm()->GetPrev();
888*b1cdbd2cSJim Jagielski if( !pPage || pPage->GetPhyPageNum() < nNum ||
889*b1cdbd2cSJim Jagielski bEndNote != pPage->IsEndNotePage() || bFtnEndDoc != pPage->IsFtnPage() )
890*b1cdbd2cSJim Jagielski return NULL; // Keine in Frage kommende Seite mehr gefunden
891*b1cdbd2cSJim Jagielski pNxtBoss = pPage;
892*b1cdbd2cSJim Jagielski pBody = pPage->FindBodyCont();
893*b1cdbd2cSJim Jagielski }
894*b1cdbd2cSJim Jagielski // Die vorherige Seite haben wir nun, ggf. sollten wir in die letzte Spalte
895*b1cdbd2cSJim Jagielski // der Seite wechseln
896*b1cdbd2cSJim Jagielski if( pBody )
897*b1cdbd2cSJim Jagielski {
898*b1cdbd2cSJim Jagielski if ( pBody->Lower() && pBody->Lower()->IsColumnFrm() )
899*b1cdbd2cSJim Jagielski {
900*b1cdbd2cSJim Jagielski pNxtBoss = static_cast<SwFtnBossFrm*>(pBody->GetLastLower());
901*b1cdbd2cSJim Jagielski }
902*b1cdbd2cSJim Jagielski }
903*b1cdbd2cSJim Jagielski }
904*b1cdbd2cSJim Jagielski SwFtnContFrm *pCont = pNxtBoss->FindFtnCont();
905*b1cdbd2cSJim Jagielski if ( pCont )
906*b1cdbd2cSJim Jagielski {
907*b1cdbd2cSJim Jagielski pRet = pCont;
908*b1cdbd2cSJim Jagielski break;
909*b1cdbd2cSJim Jagielski }
910*b1cdbd2cSJim Jagielski if ( pStop == pNxtBoss )
911*b1cdbd2cSJim Jagielski { //Die Seite/Spalte auf der sich auch die Referenz tummelt, ist erreicht.
912*b1cdbd2cSJim Jagielski //Wir koennen jetzt probehalber mal einen Container erzeugen und
913*b1cdbd2cSJim Jagielski //uns hineinpasten.
914*b1cdbd2cSJim Jagielski if ( eMakeFtn == MAKEPAGE_FTN && pNxtBoss->GetMaxFtnHeight() )
915*b1cdbd2cSJim Jagielski pRet = pNxtBoss->MakeFtnCont();
916*b1cdbd2cSJim Jagielski break;
917*b1cdbd2cSJim Jagielski }
918*b1cdbd2cSJim Jagielski } while( !pRet );
919*b1cdbd2cSJim Jagielski }
920*b1cdbd2cSJim Jagielski if ( pRet )
921*b1cdbd2cSJim Jagielski {
922*b1cdbd2cSJim Jagielski const SwFtnBossFrm* pNewBoss = pRet->FindFtnBossFrm();
923*b1cdbd2cSJim Jagielski sal_Bool bJump = sal_False;
924*b1cdbd2cSJim Jagielski if( pOldBoss->IsColumnFrm() && pOldBoss->GetPrev() ) // es gibt eine vorherige Spalte
925*b1cdbd2cSJim Jagielski bJump = pOldBoss->GetPrev() != (SwFrm*)pNewBoss; // sind wir darin gelandet?
926*b1cdbd2cSJim Jagielski else if( pNewBoss->IsColumnFrm() && pNewBoss->GetNext() )
927*b1cdbd2cSJim Jagielski bJump = sal_True; // es gibt hinter dem neuen Boss noch eine Spalte, die aber nicht
928*b1cdbd2cSJim Jagielski // der alte Boss sein kann, das haben wir ja bereits geprueft.
929*b1cdbd2cSJim Jagielski else // hier landen wir nur, wenn neuer und alter Boss entweder Seiten oder letzte (neu)
930*b1cdbd2cSJim Jagielski { // bzw. erste (alt) Spalten einer Seite sind. In diesem Fall muss noch geprueft
931*b1cdbd2cSJim Jagielski // werden, ob Seiten ueberspringen wurden.
932*b1cdbd2cSJim Jagielski sal_uInt16 nDiff = pOldPage->GetPhyPageNum() - pRet->FindPageFrm()->GetPhyPageNum();
933*b1cdbd2cSJim Jagielski if ( nDiff > 2 ||
934*b1cdbd2cSJim Jagielski (nDiff > 1 && !((SwPageFrm*)pOldPage->GetPrev())->IsEmptyPage()) )
935*b1cdbd2cSJim Jagielski bJump = sal_True;
936*b1cdbd2cSJim Jagielski }
937*b1cdbd2cSJim Jagielski if( bJump )
938*b1cdbd2cSJim Jagielski SwFlowFrm::SetMoveBwdJump( sal_True );
939*b1cdbd2cSJim Jagielski }
940*b1cdbd2cSJim Jagielski return pRet;
941*b1cdbd2cSJim Jagielski }
942*b1cdbd2cSJim Jagielski
943*b1cdbd2cSJim Jagielski /*************************************************************************
944*b1cdbd2cSJim Jagielski |*
945*b1cdbd2cSJim Jagielski |* SwFrm::IsFtnAllowed()
946*b1cdbd2cSJim Jagielski |*
947*b1cdbd2cSJim Jagielski |*************************************************************************/
948*b1cdbd2cSJim Jagielski
949*b1cdbd2cSJim Jagielski
IsFtnAllowed() const950*b1cdbd2cSJim Jagielski sal_Bool SwFrm::IsFtnAllowed() const
951*b1cdbd2cSJim Jagielski {
952*b1cdbd2cSJim Jagielski if ( !IsInDocBody() )
953*b1cdbd2cSJim Jagielski return sal_False;
954*b1cdbd2cSJim Jagielski
955*b1cdbd2cSJim Jagielski if ( IsInTab() )
956*b1cdbd2cSJim Jagielski {
957*b1cdbd2cSJim Jagielski //Keine Ftns in wiederholten Headlines.
958*b1cdbd2cSJim Jagielski const SwTabFrm *pTab = ((SwFrm*)this)->ImplFindTabFrm();
959*b1cdbd2cSJim Jagielski if ( pTab->IsFollow() )
960*b1cdbd2cSJim Jagielski return !pTab->IsInHeadline( *this );
961*b1cdbd2cSJim Jagielski }
962*b1cdbd2cSJim Jagielski return sal_True;
963*b1cdbd2cSJim Jagielski }
964*b1cdbd2cSJim Jagielski
965*b1cdbd2cSJim Jagielski /*************************************************************************
966*b1cdbd2cSJim Jagielski |*
967*b1cdbd2cSJim Jagielski |* SwRootFrm::UpdateFtnNums()
968*b1cdbd2cSJim Jagielski |*
969*b1cdbd2cSJim Jagielski |*************************************************************************/
970*b1cdbd2cSJim Jagielski
971*b1cdbd2cSJim Jagielski
UpdateFtnNums()972*b1cdbd2cSJim Jagielski void SwRootFrm::UpdateFtnNums()
973*b1cdbd2cSJim Jagielski {
974*b1cdbd2cSJim Jagielski //Seitenweise Numerierung nur wenn es am Dokument so eingestellt ist.
975*b1cdbd2cSJim Jagielski if ( GetFmt()->GetDoc()->GetFtnInfo().eNum == FTNNUM_PAGE )
976*b1cdbd2cSJim Jagielski {
977*b1cdbd2cSJim Jagielski SwPageFrm *pPage = (SwPageFrm*)Lower();
978*b1cdbd2cSJim Jagielski while ( pPage && !pPage->IsFtnPage() )
979*b1cdbd2cSJim Jagielski {
980*b1cdbd2cSJim Jagielski pPage->UpdateFtnNum();
981*b1cdbd2cSJim Jagielski pPage = (SwPageFrm*)pPage->GetNext();
982*b1cdbd2cSJim Jagielski }
983*b1cdbd2cSJim Jagielski }
984*b1cdbd2cSJim Jagielski }
985*b1cdbd2cSJim Jagielski
986*b1cdbd2cSJim Jagielski /*************************************************************************
987*b1cdbd2cSJim Jagielski |*
988*b1cdbd2cSJim Jagielski |* RemoveFtns() Entfernen aller Fussnoten (nicht etwa die Referenzen)
989*b1cdbd2cSJim Jagielski |* und Entfernen aller Fussnotenseiten.
990*b1cdbd2cSJim Jagielski |*
991*b1cdbd2cSJim Jagielski |*************************************************************************/
992*b1cdbd2cSJim Jagielski
lcl_RemoveFtns(SwFtnBossFrm * pBoss,sal_Bool bPageOnly,sal_Bool bEndNotes)993*b1cdbd2cSJim Jagielski void lcl_RemoveFtns( SwFtnBossFrm* pBoss, sal_Bool bPageOnly, sal_Bool bEndNotes )
994*b1cdbd2cSJim Jagielski {
995*b1cdbd2cSJim Jagielski do
996*b1cdbd2cSJim Jagielski {
997*b1cdbd2cSJim Jagielski SwFtnContFrm *pCont = pBoss->FindFtnCont();
998*b1cdbd2cSJim Jagielski if ( pCont )
999*b1cdbd2cSJim Jagielski {
1000*b1cdbd2cSJim Jagielski SwFtnFrm *pFtn = (SwFtnFrm*)pCont->Lower();
1001*b1cdbd2cSJim Jagielski ASSERT( pFtn, "FtnCont ohne Ftn." );
1002*b1cdbd2cSJim Jagielski if ( bPageOnly )
1003*b1cdbd2cSJim Jagielski while ( pFtn->GetMaster() )
1004*b1cdbd2cSJim Jagielski pFtn = pFtn->GetMaster();
1005*b1cdbd2cSJim Jagielski do
1006*b1cdbd2cSJim Jagielski {
1007*b1cdbd2cSJim Jagielski SwFtnFrm *pNxt = (SwFtnFrm*)pFtn->GetNext();
1008*b1cdbd2cSJim Jagielski if ( !pFtn->GetAttr()->GetFtn().IsEndNote() ||
1009*b1cdbd2cSJim Jagielski bEndNotes )
1010*b1cdbd2cSJim Jagielski {
1011*b1cdbd2cSJim Jagielski pFtn->GetRef()->Prepare( PREP_FTN, (void*)pFtn->GetAttr() );
1012*b1cdbd2cSJim Jagielski if ( bPageOnly && !pNxt )
1013*b1cdbd2cSJim Jagielski pNxt = pFtn->GetFollow();
1014*b1cdbd2cSJim Jagielski pFtn->Cut();
1015*b1cdbd2cSJim Jagielski delete pFtn;
1016*b1cdbd2cSJim Jagielski }
1017*b1cdbd2cSJim Jagielski pFtn = pNxt;
1018*b1cdbd2cSJim Jagielski
1019*b1cdbd2cSJim Jagielski } while ( pFtn );
1020*b1cdbd2cSJim Jagielski }
1021*b1cdbd2cSJim Jagielski if( !pBoss->IsInSct() )
1022*b1cdbd2cSJim Jagielski {
1023*b1cdbd2cSJim Jagielski // A sectionframe with the Ftn/EndnAtEnd-flags may contain
1024*b1cdbd2cSJim Jagielski // foot/endnotes. If the last lower frame of the bodyframe is
1025*b1cdbd2cSJim Jagielski // a multicolumned sectionframe, it may contain footnotes, too.
1026*b1cdbd2cSJim Jagielski SwLayoutFrm* pBody = pBoss->FindBodyCont();
1027*b1cdbd2cSJim Jagielski if( pBody && pBody->Lower() )
1028*b1cdbd2cSJim Jagielski {
1029*b1cdbd2cSJim Jagielski SwFrm* pLow = pBody->Lower();
1030*b1cdbd2cSJim Jagielski while( pLow->GetNext() )
1031*b1cdbd2cSJim Jagielski {
1032*b1cdbd2cSJim Jagielski if( pLow->IsSctFrm() && ( !pLow->GetNext() ||
1033*b1cdbd2cSJim Jagielski ((SwSectionFrm*)pLow)->IsAnyNoteAtEnd() ) &&
1034*b1cdbd2cSJim Jagielski ((SwSectionFrm*)pLow)->Lower() &&
1035*b1cdbd2cSJim Jagielski ((SwSectionFrm*)pLow)->Lower()->IsColumnFrm() )
1036*b1cdbd2cSJim Jagielski lcl_RemoveFtns( (SwColumnFrm*)((SwSectionFrm*)pLow)->Lower(),
1037*b1cdbd2cSJim Jagielski bPageOnly, bEndNotes );
1038*b1cdbd2cSJim Jagielski pLow = pLow->GetNext();
1039*b1cdbd2cSJim Jagielski }
1040*b1cdbd2cSJim Jagielski }
1041*b1cdbd2cSJim Jagielski }
1042*b1cdbd2cSJim Jagielski // noch 'ne Spalte?
1043*b1cdbd2cSJim Jagielski pBoss = pBoss->IsColumnFrm() ? (SwColumnFrm*)pBoss->GetNext() : NULL;
1044*b1cdbd2cSJim Jagielski } while( pBoss );
1045*b1cdbd2cSJim Jagielski }
1046*b1cdbd2cSJim Jagielski
RemoveFtns(SwPageFrm * pPage,sal_Bool bPageOnly,sal_Bool bEndNotes)1047*b1cdbd2cSJim Jagielski void SwRootFrm::RemoveFtns( SwPageFrm *pPage, sal_Bool bPageOnly, sal_Bool bEndNotes )
1048*b1cdbd2cSJim Jagielski {
1049*b1cdbd2cSJim Jagielski if ( !pPage )
1050*b1cdbd2cSJim Jagielski pPage = (SwPageFrm*)Lower();
1051*b1cdbd2cSJim Jagielski
1052*b1cdbd2cSJim Jagielski do
1053*b1cdbd2cSJim Jagielski { // Bei spaltigen Seiten muessen wir in allen Spalten aufraeumen
1054*b1cdbd2cSJim Jagielski SwFtnBossFrm* pBoss;
1055*b1cdbd2cSJim Jagielski SwLayoutFrm* pBody = pPage->FindBodyCont();
1056*b1cdbd2cSJim Jagielski if( pBody && pBody->Lower() && pBody->Lower()->IsColumnFrm() )
1057*b1cdbd2cSJim Jagielski pBoss = (SwFtnBossFrm*)pBody->Lower(); // die erste Spalte
1058*b1cdbd2cSJim Jagielski else
1059*b1cdbd2cSJim Jagielski pBoss = pPage; // keine Spalten
1060*b1cdbd2cSJim Jagielski lcl_RemoveFtns( pBoss, bPageOnly, bEndNotes );
1061*b1cdbd2cSJim Jagielski if ( !bPageOnly )
1062*b1cdbd2cSJim Jagielski {
1063*b1cdbd2cSJim Jagielski if ( pPage->IsFtnPage() &&
1064*b1cdbd2cSJim Jagielski (!pPage->IsEndNotePage() || bEndNotes) )
1065*b1cdbd2cSJim Jagielski {
1066*b1cdbd2cSJim Jagielski SwFrm *pDel = pPage;
1067*b1cdbd2cSJim Jagielski pPage = (SwPageFrm*)pPage->GetNext();
1068*b1cdbd2cSJim Jagielski pDel->Cut();
1069*b1cdbd2cSJim Jagielski delete pDel;
1070*b1cdbd2cSJim Jagielski }
1071*b1cdbd2cSJim Jagielski else
1072*b1cdbd2cSJim Jagielski pPage = (SwPageFrm*)pPage->GetNext();
1073*b1cdbd2cSJim Jagielski }
1074*b1cdbd2cSJim Jagielski else
1075*b1cdbd2cSJim Jagielski break;
1076*b1cdbd2cSJim Jagielski
1077*b1cdbd2cSJim Jagielski } while ( pPage );
1078*b1cdbd2cSJim Jagielski }
1079*b1cdbd2cSJim Jagielski
1080*b1cdbd2cSJim Jagielski /*************************************************************************
1081*b1cdbd2cSJim Jagielski |*
1082*b1cdbd2cSJim Jagielski |* SetFtnPageDescs() Seitenvorlagen der Fussnotenseiten aendern
1083*b1cdbd2cSJim Jagielski |*
1084*b1cdbd2cSJim Jagielski |*************************************************************************/
1085*b1cdbd2cSJim Jagielski
CheckFtnPageDescs(sal_Bool bEndNote)1086*b1cdbd2cSJim Jagielski void SwRootFrm::CheckFtnPageDescs( sal_Bool bEndNote )
1087*b1cdbd2cSJim Jagielski {
1088*b1cdbd2cSJim Jagielski SwPageFrm *pPage = (SwPageFrm*)Lower();
1089*b1cdbd2cSJim Jagielski while ( pPage && !pPage->IsFtnPage() )
1090*b1cdbd2cSJim Jagielski pPage = (SwPageFrm*)pPage->GetNext();
1091*b1cdbd2cSJim Jagielski while ( pPage && pPage->IsEndNotePage() != bEndNote )
1092*b1cdbd2cSJim Jagielski pPage = (SwPageFrm*)pPage->GetNext();
1093*b1cdbd2cSJim Jagielski if ( pPage )
1094*b1cdbd2cSJim Jagielski SwFrm::CheckPageDescs( pPage, sal_False );
1095*b1cdbd2cSJim Jagielski }
1096*b1cdbd2cSJim Jagielski
1097*b1cdbd2cSJim Jagielski
1098*b1cdbd2cSJim Jagielski /*************************************************************************
1099*b1cdbd2cSJim Jagielski |*
1100*b1cdbd2cSJim Jagielski |* SwFtnBossFrm::MakeFtnCont()
1101*b1cdbd2cSJim Jagielski |*
1102*b1cdbd2cSJim Jagielski |*************************************************************************/
1103*b1cdbd2cSJim Jagielski
1104*b1cdbd2cSJim Jagielski
MakeFtnCont()1105*b1cdbd2cSJim Jagielski SwFtnContFrm *SwFtnBossFrm::MakeFtnCont()
1106*b1cdbd2cSJim Jagielski {
1107*b1cdbd2cSJim Jagielski //Einfuegen eines Fussnotencontainers. Der Fussnotencontainer sitzt
1108*b1cdbd2cSJim Jagielski //immer direkt hinter dem Bodytext.
1109*b1cdbd2cSJim Jagielski //Sein FrmFmt ist immer das DefaultFrmFmt.
1110*b1cdbd2cSJim Jagielski
1111*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
1112*b1cdbd2cSJim Jagielski if ( FindFtnCont() )
1113*b1cdbd2cSJim Jagielski { ASSERT( !this, "Fussnotencontainer bereits vorhanden." );
1114*b1cdbd2cSJim Jagielski return 0;
1115*b1cdbd2cSJim Jagielski }
1116*b1cdbd2cSJim Jagielski #endif
1117*b1cdbd2cSJim Jagielski
1118*b1cdbd2cSJim Jagielski SwFtnContFrm *pNew = new SwFtnContFrm( GetFmt()->GetDoc()->GetDfltFrmFmt(), this );
1119*b1cdbd2cSJim Jagielski SwLayoutFrm *pLay = FindBodyCont();
1120*b1cdbd2cSJim Jagielski pNew->Paste( this, pLay->GetNext() );
1121*b1cdbd2cSJim Jagielski return pNew;
1122*b1cdbd2cSJim Jagielski }
1123*b1cdbd2cSJim Jagielski
1124*b1cdbd2cSJim Jagielski /*************************************************************************
1125*b1cdbd2cSJim Jagielski |*
1126*b1cdbd2cSJim Jagielski |* SwFtnBossFrm::FindFtnCont()
1127*b1cdbd2cSJim Jagielski |*
1128*b1cdbd2cSJim Jagielski |*************************************************************************/
1129*b1cdbd2cSJim Jagielski
1130*b1cdbd2cSJim Jagielski
FindFtnCont()1131*b1cdbd2cSJim Jagielski SwFtnContFrm *SwFtnBossFrm::FindFtnCont()
1132*b1cdbd2cSJim Jagielski {
1133*b1cdbd2cSJim Jagielski SwFrm *pFrm = Lower();
1134*b1cdbd2cSJim Jagielski while( pFrm && !pFrm->IsFtnContFrm() )
1135*b1cdbd2cSJim Jagielski pFrm = pFrm->GetNext();
1136*b1cdbd2cSJim Jagielski
1137*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
1138*b1cdbd2cSJim Jagielski if ( pFrm )
1139*b1cdbd2cSJim Jagielski {
1140*b1cdbd2cSJim Jagielski SwFrm *pFtn = pFrm->GetLower();
1141*b1cdbd2cSJim Jagielski ASSERT( pFtn, "Cont ohne Fussnote." );
1142*b1cdbd2cSJim Jagielski while ( pFtn )
1143*b1cdbd2cSJim Jagielski {
1144*b1cdbd2cSJim Jagielski ASSERT( pFtn->IsFtnFrm(), "Nachbar von Fussnote keine Fussnote." );
1145*b1cdbd2cSJim Jagielski pFtn = pFtn->GetNext();
1146*b1cdbd2cSJim Jagielski }
1147*b1cdbd2cSJim Jagielski }
1148*b1cdbd2cSJim Jagielski #endif
1149*b1cdbd2cSJim Jagielski
1150*b1cdbd2cSJim Jagielski return (SwFtnContFrm*)pFrm;
1151*b1cdbd2cSJim Jagielski }
1152*b1cdbd2cSJim Jagielski
1153*b1cdbd2cSJim Jagielski /*************************************************************************
1154*b1cdbd2cSJim Jagielski |*
1155*b1cdbd2cSJim Jagielski |* SwFtnBossFrm::FindNearestFtnCont() Sucht den naechst greifbaren Fussnotencontainer.
1156*b1cdbd2cSJim Jagielski |*
1157*b1cdbd2cSJim Jagielski |*************************************************************************/
1158*b1cdbd2cSJim Jagielski
FindNearestFtnCont(sal_Bool bDontLeave)1159*b1cdbd2cSJim Jagielski SwFtnContFrm *SwFtnBossFrm::FindNearestFtnCont( sal_Bool bDontLeave )
1160*b1cdbd2cSJim Jagielski {
1161*b1cdbd2cSJim Jagielski SwFtnContFrm *pCont = 0;
1162*b1cdbd2cSJim Jagielski if ( GetFmt()->GetDoc()->GetFtnIdxs().Count() )
1163*b1cdbd2cSJim Jagielski {
1164*b1cdbd2cSJim Jagielski pCont = FindFtnCont();
1165*b1cdbd2cSJim Jagielski if ( !pCont )
1166*b1cdbd2cSJim Jagielski {
1167*b1cdbd2cSJim Jagielski SwPageFrm *pPage = FindPageFrm();
1168*b1cdbd2cSJim Jagielski SwFtnBossFrm* pBoss = this;
1169*b1cdbd2cSJim Jagielski sal_Bool bEndNote = pPage->IsEndNotePage();
1170*b1cdbd2cSJim Jagielski do
1171*b1cdbd2cSJim Jagielski {
1172*b1cdbd2cSJim Jagielski sal_Bool bChgPage = lcl_NextFtnBoss( pBoss, pPage, bDontLeave );
1173*b1cdbd2cSJim Jagielski // Haben wir noch einen Boss gefunden? Bei einem Seitenwechsel muss
1174*b1cdbd2cSJim Jagielski // zudem noch das EndNotenFlag uebereinstimmen
1175*b1cdbd2cSJim Jagielski if( pBoss && ( !bChgPage || pPage->IsEndNotePage() == bEndNote ) )
1176*b1cdbd2cSJim Jagielski pCont = pBoss->FindFtnCont();
1177*b1cdbd2cSJim Jagielski } while ( !pCont && pPage );
1178*b1cdbd2cSJim Jagielski }
1179*b1cdbd2cSJim Jagielski }
1180*b1cdbd2cSJim Jagielski return pCont;
1181*b1cdbd2cSJim Jagielski }
1182*b1cdbd2cSJim Jagielski
1183*b1cdbd2cSJim Jagielski
1184*b1cdbd2cSJim Jagielski /*************************************************************************
1185*b1cdbd2cSJim Jagielski |*
1186*b1cdbd2cSJim Jagielski |* SwFtnBossFrm::FindFirstFtn()
1187*b1cdbd2cSJim Jagielski |*
1188*b1cdbd2cSJim Jagielski |* Beschreibung Erste Fussnote des Fussnotenbosses suchen.
1189*b1cdbd2cSJim Jagielski |*
1190*b1cdbd2cSJim Jagielski |*************************************************************************/
1191*b1cdbd2cSJim Jagielski
1192*b1cdbd2cSJim Jagielski
FindFirstFtn()1193*b1cdbd2cSJim Jagielski SwFtnFrm *SwFtnBossFrm::FindFirstFtn()
1194*b1cdbd2cSJim Jagielski {
1195*b1cdbd2cSJim Jagielski //Erstmal den naechsten FussnotenContainer suchen.
1196*b1cdbd2cSJim Jagielski SwFtnContFrm *pCont = FindNearestFtnCont();
1197*b1cdbd2cSJim Jagielski if ( !pCont )
1198*b1cdbd2cSJim Jagielski return 0;
1199*b1cdbd2cSJim Jagielski
1200*b1cdbd2cSJim Jagielski //Ab der ersten Fussnote im Container die erste suchen, die
1201*b1cdbd2cSJim Jagielski //von der aktuellen Spalte (bzw. einspaltigen Seite) referenziert wird.
1202*b1cdbd2cSJim Jagielski
1203*b1cdbd2cSJim Jagielski SwFtnFrm *pRet = (SwFtnFrm*)pCont->Lower();
1204*b1cdbd2cSJim Jagielski const sal_uInt16 nRefNum = FindPageFrm()->GetPhyPageNum();
1205*b1cdbd2cSJim Jagielski const sal_uInt16 nRefCol = lcl_ColumnNum( this );
1206*b1cdbd2cSJim Jagielski sal_uInt16 nPgNum, nColNum; //Seitennummer, Spaltennummer
1207*b1cdbd2cSJim Jagielski SwFtnBossFrm* pBoss;
1208*b1cdbd2cSJim Jagielski SwPageFrm* pPage;
1209*b1cdbd2cSJim Jagielski if( pRet )
1210*b1cdbd2cSJim Jagielski {
1211*b1cdbd2cSJim Jagielski pBoss = pRet->GetRef()->FindFtnBossFrm();
1212*b1cdbd2cSJim Jagielski ASSERT( pBoss, "FindFirstFtn: No boss found" );
1213*b1cdbd2cSJim Jagielski if( !pBoss )
1214*b1cdbd2cSJim Jagielski return NULL; // ?There must be a bug, but no GPF
1215*b1cdbd2cSJim Jagielski pPage = pBoss->FindPageFrm();
1216*b1cdbd2cSJim Jagielski nPgNum = pPage->GetPhyPageNum();
1217*b1cdbd2cSJim Jagielski if ( nPgNum == nRefNum )
1218*b1cdbd2cSJim Jagielski {
1219*b1cdbd2cSJim Jagielski nColNum = lcl_ColumnNum( pBoss );
1220*b1cdbd2cSJim Jagielski if( nColNum == nRefCol )
1221*b1cdbd2cSJim Jagielski return pRet; //hat ihn.
1222*b1cdbd2cSJim Jagielski else if( nColNum > nRefCol )
1223*b1cdbd2cSJim Jagielski return NULL; //mind. eine Spalte zu weit.
1224*b1cdbd2cSJim Jagielski }
1225*b1cdbd2cSJim Jagielski else if ( nPgNum > nRefNum )
1226*b1cdbd2cSJim Jagielski return NULL; //mind. eine Seite zu weit.
1227*b1cdbd2cSJim Jagielski }
1228*b1cdbd2cSJim Jagielski else
1229*b1cdbd2cSJim Jagielski return NULL;
1230*b1cdbd2cSJim Jagielski // Ende, wenn Ref auf einer spaeteren Seite oder auf der gleichen Seite in einer
1231*b1cdbd2cSJim Jagielski // spaeteren Spalte liegt
1232*b1cdbd2cSJim Jagielski
1233*b1cdbd2cSJim Jagielski do
1234*b1cdbd2cSJim Jagielski {
1235*b1cdbd2cSJim Jagielski while ( pRet->GetFollow() )
1236*b1cdbd2cSJim Jagielski pRet = pRet->GetFollow();
1237*b1cdbd2cSJim Jagielski
1238*b1cdbd2cSJim Jagielski SwFtnFrm *pNxt = (SwFtnFrm*)pRet->GetNext();
1239*b1cdbd2cSJim Jagielski if ( !pNxt )
1240*b1cdbd2cSJim Jagielski {
1241*b1cdbd2cSJim Jagielski pBoss = pRet->FindFtnBossFrm();
1242*b1cdbd2cSJim Jagielski pPage = pBoss->FindPageFrm();
1243*b1cdbd2cSJim Jagielski lcl_NextFtnBoss( pBoss, pPage, sal_False ); // naechster FtnBoss
1244*b1cdbd2cSJim Jagielski pCont = pBoss ? pBoss->FindNearestFtnCont() : 0;
1245*b1cdbd2cSJim Jagielski if ( pCont )
1246*b1cdbd2cSJim Jagielski pNxt = (SwFtnFrm*)pCont->Lower();
1247*b1cdbd2cSJim Jagielski }
1248*b1cdbd2cSJim Jagielski if ( pNxt )
1249*b1cdbd2cSJim Jagielski {
1250*b1cdbd2cSJim Jagielski pRet = pNxt;
1251*b1cdbd2cSJim Jagielski pBoss = pRet->GetRef()->FindFtnBossFrm();
1252*b1cdbd2cSJim Jagielski pPage = pBoss->FindPageFrm();
1253*b1cdbd2cSJim Jagielski nPgNum = pPage->GetPhyPageNum();
1254*b1cdbd2cSJim Jagielski if ( nPgNum == nRefNum )
1255*b1cdbd2cSJim Jagielski {
1256*b1cdbd2cSJim Jagielski nColNum = lcl_ColumnNum( pBoss );
1257*b1cdbd2cSJim Jagielski if( nColNum == nRefCol )
1258*b1cdbd2cSJim Jagielski break; //hat ihn.
1259*b1cdbd2cSJim Jagielski else if( nColNum > nRefCol )
1260*b1cdbd2cSJim Jagielski pRet = 0; //mind. eine Spalte zu weit.
1261*b1cdbd2cSJim Jagielski }
1262*b1cdbd2cSJim Jagielski else if ( nPgNum > nRefNum )
1263*b1cdbd2cSJim Jagielski pRet = 0; //mind. eine Seite zu weit.
1264*b1cdbd2cSJim Jagielski }
1265*b1cdbd2cSJim Jagielski else
1266*b1cdbd2cSJim Jagielski pRet = 0; //Gibt eben keinen.
1267*b1cdbd2cSJim Jagielski } while( pRet );
1268*b1cdbd2cSJim Jagielski return pRet;
1269*b1cdbd2cSJim Jagielski }
1270*b1cdbd2cSJim Jagielski
1271*b1cdbd2cSJim Jagielski /*************************************************************************
1272*b1cdbd2cSJim Jagielski |*
1273*b1cdbd2cSJim Jagielski |* SwFtnBossFrm::FindFirstFtn()
1274*b1cdbd2cSJim Jagielski |*
1275*b1cdbd2cSJim Jagielski |* Beschreibunt Erste Fussnote zum Cnt suchen.
1276*b1cdbd2cSJim Jagielski |*
1277*b1cdbd2cSJim Jagielski |*************************************************************************/
1278*b1cdbd2cSJim Jagielski
1279*b1cdbd2cSJim Jagielski
FindFirstFtn(SwCntntFrm * pCnt) const1280*b1cdbd2cSJim Jagielski const SwFtnFrm *SwFtnBossFrm::FindFirstFtn( SwCntntFrm *pCnt ) const
1281*b1cdbd2cSJim Jagielski {
1282*b1cdbd2cSJim Jagielski const SwFtnFrm *pRet = ((SwFtnBossFrm*)this)->FindFirstFtn();
1283*b1cdbd2cSJim Jagielski if ( pRet )
1284*b1cdbd2cSJim Jagielski {
1285*b1cdbd2cSJim Jagielski const sal_uInt16 nColNum = lcl_ColumnNum( this ); //Spaltennummer
1286*b1cdbd2cSJim Jagielski const sal_uInt16 nPageNum = GetPhyPageNum();
1287*b1cdbd2cSJim Jagielski while ( pRet && (pRet->GetRef() != pCnt) )
1288*b1cdbd2cSJim Jagielski {
1289*b1cdbd2cSJim Jagielski while ( pRet->GetFollow() )
1290*b1cdbd2cSJim Jagielski pRet = pRet->GetFollow();
1291*b1cdbd2cSJim Jagielski
1292*b1cdbd2cSJim Jagielski if ( pRet->GetNext() )
1293*b1cdbd2cSJim Jagielski pRet = (const SwFtnFrm*)pRet->GetNext();
1294*b1cdbd2cSJim Jagielski else
1295*b1cdbd2cSJim Jagielski { SwFtnBossFrm *pBoss = (SwFtnBossFrm*)pRet->FindFtnBossFrm();
1296*b1cdbd2cSJim Jagielski SwPageFrm *pPage = pBoss->FindPageFrm();
1297*b1cdbd2cSJim Jagielski lcl_NextFtnBoss( pBoss, pPage, sal_False ); // naechster FtnBoss
1298*b1cdbd2cSJim Jagielski SwFtnContFrm *pCont = pBoss ? pBoss->FindNearestFtnCont() : 0;
1299*b1cdbd2cSJim Jagielski pRet = pCont ? (SwFtnFrm*)pCont->Lower() : 0;
1300*b1cdbd2cSJim Jagielski }
1301*b1cdbd2cSJim Jagielski if ( pRet )
1302*b1cdbd2cSJim Jagielski {
1303*b1cdbd2cSJim Jagielski const SwFtnBossFrm* pBoss = pRet->GetRef()->FindFtnBossFrm();
1304*b1cdbd2cSJim Jagielski if( pBoss->GetPhyPageNum() != nPageNum ||
1305*b1cdbd2cSJim Jagielski nColNum != lcl_ColumnNum( pBoss ) )
1306*b1cdbd2cSJim Jagielski pRet = 0;
1307*b1cdbd2cSJim Jagielski }
1308*b1cdbd2cSJim Jagielski }
1309*b1cdbd2cSJim Jagielski }
1310*b1cdbd2cSJim Jagielski return pRet;
1311*b1cdbd2cSJim Jagielski }
1312*b1cdbd2cSJim Jagielski
1313*b1cdbd2cSJim Jagielski /*************************************************************************
1314*b1cdbd2cSJim Jagielski |*
1315*b1cdbd2cSJim Jagielski |* SwFtnBossFrm::ResetFtn()
1316*b1cdbd2cSJim Jagielski |*
1317*b1cdbd2cSJim Jagielski |*************************************************************************/
1318*b1cdbd2cSJim Jagielski
1319*b1cdbd2cSJim Jagielski
ResetFtn(const SwFtnFrm * pCheck)1320*b1cdbd2cSJim Jagielski void SwFtnBossFrm::ResetFtn( const SwFtnFrm *pCheck )
1321*b1cdbd2cSJim Jagielski {
1322*b1cdbd2cSJim Jagielski //Vernichten der Inkarnationen von Fussnoten zum Attribut, wenn sie nicht
1323*b1cdbd2cSJim Jagielski //zu pAssumed gehoeren.
1324*b1cdbd2cSJim Jagielski ASSERT( !pCheck->GetMaster(), "Master not an Master." );
1325*b1cdbd2cSJim Jagielski
1326*b1cdbd2cSJim Jagielski SwNodeIndex aIdx( *pCheck->GetAttr()->GetStartNode(), 1 );
1327*b1cdbd2cSJim Jagielski SwCntntNode *pNd = aIdx.GetNode().GetCntntNode();
1328*b1cdbd2cSJim Jagielski if ( !pNd )
1329*b1cdbd2cSJim Jagielski pNd = pCheck->GetFmt()->GetDoc()->
1330*b1cdbd2cSJim Jagielski GetNodes().GoNextSection( &aIdx, sal_True, sal_False );
1331*b1cdbd2cSJim Jagielski SwIterator<SwFrm,SwCntntNode> aIter( *pNd );
1332*b1cdbd2cSJim Jagielski SwFrm* pFrm = aIter.First();
1333*b1cdbd2cSJim Jagielski while( pFrm )
1334*b1cdbd2cSJim Jagielski {
1335*b1cdbd2cSJim Jagielski if( pFrm->getRootFrm() == pCheck->getRootFrm() )
1336*b1cdbd2cSJim Jagielski {
1337*b1cdbd2cSJim Jagielski SwFrm *pTmp = pFrm->GetUpper();
1338*b1cdbd2cSJim Jagielski while ( pTmp && !pTmp->IsFtnFrm() )
1339*b1cdbd2cSJim Jagielski pTmp = pTmp->GetUpper();
1340*b1cdbd2cSJim Jagielski
1341*b1cdbd2cSJim Jagielski SwFtnFrm *pFtn = (SwFtnFrm*)pTmp;
1342*b1cdbd2cSJim Jagielski while ( pFtn && pFtn->GetMaster() )
1343*b1cdbd2cSJim Jagielski pFtn = pFtn->GetMaster();
1344*b1cdbd2cSJim Jagielski if ( pFtn != pCheck )
1345*b1cdbd2cSJim Jagielski {
1346*b1cdbd2cSJim Jagielski while ( pFtn )
1347*b1cdbd2cSJim Jagielski {
1348*b1cdbd2cSJim Jagielski SwFtnFrm *pNxt = pFtn->GetFollow();
1349*b1cdbd2cSJim Jagielski pFtn->Cut();
1350*b1cdbd2cSJim Jagielski delete pFtn;
1351*b1cdbd2cSJim Jagielski pFtn = pNxt;
1352*b1cdbd2cSJim Jagielski }
1353*b1cdbd2cSJim Jagielski }
1354*b1cdbd2cSJim Jagielski }
1355*b1cdbd2cSJim Jagielski
1356*b1cdbd2cSJim Jagielski pFrm = aIter.Next();
1357*b1cdbd2cSJim Jagielski }
1358*b1cdbd2cSJim Jagielski }
1359*b1cdbd2cSJim Jagielski
1360*b1cdbd2cSJim Jagielski /*************************************************************************
1361*b1cdbd2cSJim Jagielski |*
1362*b1cdbd2cSJim Jagielski |* SwFtnBossFrm::InsertFtn()
1363*b1cdbd2cSJim Jagielski |*
1364*b1cdbd2cSJim Jagielski |*************************************************************************/
1365*b1cdbd2cSJim Jagielski
1366*b1cdbd2cSJim Jagielski
InsertFtn(SwFtnFrm * pNew)1367*b1cdbd2cSJim Jagielski void SwFtnBossFrm::InsertFtn( SwFtnFrm* pNew )
1368*b1cdbd2cSJim Jagielski {
1369*b1cdbd2cSJim Jagielski #if (OSL_DEBUG_LEVEL > 1) && defined(DBG_UTIL)
1370*b1cdbd2cSJim Jagielski static sal_uInt16 nStop = 0;
1371*b1cdbd2cSJim Jagielski if ( nStop == pNew->GetFrmId() )
1372*b1cdbd2cSJim Jagielski {
1373*b1cdbd2cSJim Jagielski int bla = 5;
1374*b1cdbd2cSJim Jagielski (void)bla;
1375*b1cdbd2cSJim Jagielski }
1376*b1cdbd2cSJim Jagielski #endif
1377*b1cdbd2cSJim Jagielski //Die Fussnote haben wir, sie muss jetzt nur noch irgendwo
1378*b1cdbd2cSJim Jagielski //hin und zwar vor die Fussnote, deren Attribut vor das
1379*b1cdbd2cSJim Jagielski //der neuen zeigt (Position wird ueber das Doc ermittelt)
1380*b1cdbd2cSJim Jagielski //Gibt es in diesem Fussnotenboss noch keine Fussnoten, so muss eben ein
1381*b1cdbd2cSJim Jagielski //Container erzeugt werden.
1382*b1cdbd2cSJim Jagielski //Gibt es bereits einen Container aber noch keine Fussnote zu diesem
1383*b1cdbd2cSJim Jagielski //Fussnotenboss, so muss die Fussnote hinter die letzte Fussnote der dichtesten
1384*b1cdbd2cSJim Jagielski //Vorseite/spalte.
1385*b1cdbd2cSJim Jagielski
1386*b1cdbd2cSJim Jagielski ResetFtn( pNew );
1387*b1cdbd2cSJim Jagielski SwFtnFrm *pSibling = FindFirstFtn();
1388*b1cdbd2cSJim Jagielski sal_Bool bDontLeave = sal_False;
1389*b1cdbd2cSJim Jagielski
1390*b1cdbd2cSJim Jagielski // Ok, a sibling has been found, but is the sibling in an acceptable
1391*b1cdbd2cSJim Jagielski // environment?
1392*b1cdbd2cSJim Jagielski if( IsInSct() )
1393*b1cdbd2cSJim Jagielski {
1394*b1cdbd2cSJim Jagielski SwSectionFrm* pMySect = ImplFindSctFrm();
1395*b1cdbd2cSJim Jagielski bool bEndnt = pNew->GetAttr()->GetFtn().IsEndNote();
1396*b1cdbd2cSJim Jagielski if( bEndnt )
1397*b1cdbd2cSJim Jagielski {
1398*b1cdbd2cSJim Jagielski const SwSectionFmt* pEndFmt = pMySect->GetEndSectFmt();
1399*b1cdbd2cSJim Jagielski bDontLeave = 0 != pEndFmt;
1400*b1cdbd2cSJim Jagielski if( pSibling )
1401*b1cdbd2cSJim Jagielski {
1402*b1cdbd2cSJim Jagielski if( pEndFmt )
1403*b1cdbd2cSJim Jagielski {
1404*b1cdbd2cSJim Jagielski if( !pSibling->IsInSct() ||
1405*b1cdbd2cSJim Jagielski !pSibling->ImplFindSctFrm()->IsDescendantFrom( pEndFmt ) )
1406*b1cdbd2cSJim Jagielski pSibling = NULL;
1407*b1cdbd2cSJim Jagielski }
1408*b1cdbd2cSJim Jagielski else if( pSibling->IsInSct() )
1409*b1cdbd2cSJim Jagielski pSibling = NULL;
1410*b1cdbd2cSJim Jagielski }
1411*b1cdbd2cSJim Jagielski }
1412*b1cdbd2cSJim Jagielski else
1413*b1cdbd2cSJim Jagielski {
1414*b1cdbd2cSJim Jagielski bDontLeave = pMySect->IsFtnAtEnd();
1415*b1cdbd2cSJim Jagielski if( pSibling )
1416*b1cdbd2cSJim Jagielski {
1417*b1cdbd2cSJim Jagielski if( pMySect->IsFtnAtEnd() )
1418*b1cdbd2cSJim Jagielski {
1419*b1cdbd2cSJim Jagielski if( !pSibling->IsInSct() ||
1420*b1cdbd2cSJim Jagielski !pMySect->IsAnFollow( pSibling->ImplFindSctFrm() ) )
1421*b1cdbd2cSJim Jagielski pSibling = NULL;
1422*b1cdbd2cSJim Jagielski }
1423*b1cdbd2cSJim Jagielski else if( pSibling->IsInSct() )
1424*b1cdbd2cSJim Jagielski pSibling = NULL;
1425*b1cdbd2cSJim Jagielski }
1426*b1cdbd2cSJim Jagielski }
1427*b1cdbd2cSJim Jagielski }
1428*b1cdbd2cSJim Jagielski
1429*b1cdbd2cSJim Jagielski if( pSibling && pSibling->FindPageFrm()->IsEndNotePage() !=
1430*b1cdbd2cSJim Jagielski FindPageFrm()->IsEndNotePage() )
1431*b1cdbd2cSJim Jagielski pSibling = NULL;
1432*b1cdbd2cSJim Jagielski
1433*b1cdbd2cSJim Jagielski //Damit die Position herausgefunden werden kann.
1434*b1cdbd2cSJim Jagielski SwDoc *pDoc = GetFmt()->GetDoc();
1435*b1cdbd2cSJim Jagielski const sal_uLong nStPos = ::lcl_FindFtnPos( pDoc, pNew->GetAttr() );
1436*b1cdbd2cSJim Jagielski
1437*b1cdbd2cSJim Jagielski sal_uLong nCmpPos = 0;
1438*b1cdbd2cSJim Jagielski sal_uLong nLastPos = 0;
1439*b1cdbd2cSJim Jagielski SwFtnContFrm *pParent = 0;
1440*b1cdbd2cSJim Jagielski if( pSibling )
1441*b1cdbd2cSJim Jagielski {
1442*b1cdbd2cSJim Jagielski nCmpPos = ::lcl_FindFtnPos( pDoc, pSibling->GetAttr() );
1443*b1cdbd2cSJim Jagielski if( nCmpPos > nStPos )
1444*b1cdbd2cSJim Jagielski pSibling = NULL;
1445*b1cdbd2cSJim Jagielski }
1446*b1cdbd2cSJim Jagielski
1447*b1cdbd2cSJim Jagielski if ( !pSibling )
1448*b1cdbd2cSJim Jagielski { pParent = FindFtnCont();
1449*b1cdbd2cSJim Jagielski if ( !pParent )
1450*b1cdbd2cSJim Jagielski {
1451*b1cdbd2cSJim Jagielski //Es gibt noch keinen FussnotenContainer, also machen wir einen.
1452*b1cdbd2cSJim Jagielski //HAAAAAAAALT! So einfach ist das leider mal wieder nicht: Es kann
1453*b1cdbd2cSJim Jagielski //sein, dass irgendeine naechste Fussnote existiert die vor der
1454*b1cdbd2cSJim Jagielski //einzufuegenden zu stehen hat, weil z.B. eine Fussnote ueber zig
1455*b1cdbd2cSJim Jagielski //Seiten aufgespalten ist usw.
1456*b1cdbd2cSJim Jagielski pParent = FindNearestFtnCont( bDontLeave );
1457*b1cdbd2cSJim Jagielski if ( pParent )
1458*b1cdbd2cSJim Jagielski {
1459*b1cdbd2cSJim Jagielski SwFtnFrm *pFtn = (SwFtnFrm*)pParent->Lower();
1460*b1cdbd2cSJim Jagielski if ( pFtn )
1461*b1cdbd2cSJim Jagielski {
1462*b1cdbd2cSJim Jagielski
1463*b1cdbd2cSJim Jagielski nCmpPos = ::lcl_FindFtnPos( pDoc, pFtn->GetAttr() );
1464*b1cdbd2cSJim Jagielski if ( nCmpPos > nStPos )
1465*b1cdbd2cSJim Jagielski pParent = 0;
1466*b1cdbd2cSJim Jagielski }
1467*b1cdbd2cSJim Jagielski else
1468*b1cdbd2cSJim Jagielski pParent = 0;
1469*b1cdbd2cSJim Jagielski }
1470*b1cdbd2cSJim Jagielski }
1471*b1cdbd2cSJim Jagielski if ( !pParent )
1472*b1cdbd2cSJim Jagielski //Jetzt kann aber ein Fussnotencontainer gebaut werden.
1473*b1cdbd2cSJim Jagielski pParent = MakeFtnCont();
1474*b1cdbd2cSJim Jagielski else
1475*b1cdbd2cSJim Jagielski {
1476*b1cdbd2cSJim Jagielski //Ausgehend von der ersten Fussnote unterhalb des Parents wird die
1477*b1cdbd2cSJim Jagielski //erste Fussnote gesucht deren Index hinter dem Index der
1478*b1cdbd2cSJim Jagielski //einzufuegenden liegt; vor dieser kann der neue dann gepastet
1479*b1cdbd2cSJim Jagielski //werden.
1480*b1cdbd2cSJim Jagielski pSibling = (SwFtnFrm*)pParent->Lower();
1481*b1cdbd2cSJim Jagielski if ( !pSibling )
1482*b1cdbd2cSJim Jagielski { ASSERT( !this, "Keinen Platz fuer Fussnote gefunden.");
1483*b1cdbd2cSJim Jagielski return;
1484*b1cdbd2cSJim Jagielski }
1485*b1cdbd2cSJim Jagielski nCmpPos = ::lcl_FindFtnPos( pDoc, pSibling->GetAttr() );
1486*b1cdbd2cSJim Jagielski
1487*b1cdbd2cSJim Jagielski SwFtnBossFrm *pNxtB = this; //Immer den letzten merken, damit wir nicht
1488*b1cdbd2cSJim Jagielski SwFtnFrm *pLastSib = 0; //ueber das Ziel hinausschiessen.
1489*b1cdbd2cSJim Jagielski
1490*b1cdbd2cSJim Jagielski while ( pSibling && nCmpPos <= nStPos )
1491*b1cdbd2cSJim Jagielski {
1492*b1cdbd2cSJim Jagielski pLastSib = pSibling; // der kommt schon mal in Frage
1493*b1cdbd2cSJim Jagielski nLastPos = nCmpPos;
1494*b1cdbd2cSJim Jagielski
1495*b1cdbd2cSJim Jagielski while ( pSibling->GetFollow() )
1496*b1cdbd2cSJim Jagielski pSibling = pSibling->GetFollow();
1497*b1cdbd2cSJim Jagielski
1498*b1cdbd2cSJim Jagielski if ( pSibling->GetNext() )
1499*b1cdbd2cSJim Jagielski {
1500*b1cdbd2cSJim Jagielski pSibling = (SwFtnFrm*)pSibling->GetNext();
1501*b1cdbd2cSJim Jagielski ASSERT( !pSibling->GetMaster() || ( ENDNOTE > nStPos &&
1502*b1cdbd2cSJim Jagielski pSibling->GetAttr()->GetFtn().IsEndNote() ),
1503*b1cdbd2cSJim Jagielski "InsertFtn: Master expected I" );
1504*b1cdbd2cSJim Jagielski }
1505*b1cdbd2cSJim Jagielski else
1506*b1cdbd2cSJim Jagielski {
1507*b1cdbd2cSJim Jagielski pNxtB = pSibling->FindFtnBossFrm();
1508*b1cdbd2cSJim Jagielski SwPageFrm *pSibPage = pNxtB->FindPageFrm();
1509*b1cdbd2cSJim Jagielski sal_Bool bEndNote = pSibPage->IsEndNotePage();
1510*b1cdbd2cSJim Jagielski sal_Bool bChgPage = lcl_NextFtnBoss( pNxtB, pSibPage, bDontLeave );
1511*b1cdbd2cSJim Jagielski // Bei Seitenwechsel muss das EndNoteFlag ueberprueft werden.
1512*b1cdbd2cSJim Jagielski SwFtnContFrm *pCont = pNxtB && ( !bChgPage ||
1513*b1cdbd2cSJim Jagielski pSibPage->IsEndNotePage() == bEndNote )
1514*b1cdbd2cSJim Jagielski ? pNxtB->FindNearestFtnCont( bDontLeave ) : 0;
1515*b1cdbd2cSJim Jagielski if( pCont )
1516*b1cdbd2cSJim Jagielski pSibling = (SwFtnFrm*)pCont->Lower();
1517*b1cdbd2cSJim Jagielski else // kein weiterer FtnContainer, dann werden wir uns wohl hinter
1518*b1cdbd2cSJim Jagielski break; // pSibling haengen
1519*b1cdbd2cSJim Jagielski }
1520*b1cdbd2cSJim Jagielski if ( pSibling )
1521*b1cdbd2cSJim Jagielski {
1522*b1cdbd2cSJim Jagielski nCmpPos = ::lcl_FindFtnPos( pDoc, pSibling->GetAttr() );
1523*b1cdbd2cSJim Jagielski ASSERT( nCmpPos > nLastPos, "InsertFtn: Order of FtnFrm's buggy" );
1524*b1cdbd2cSJim Jagielski }
1525*b1cdbd2cSJim Jagielski }
1526*b1cdbd2cSJim Jagielski // pLastSib ist jetzt die letzte Fussnote vor uns,
1527*b1cdbd2cSJim Jagielski // pSibling leer oder die erste nach uns.
1528*b1cdbd2cSJim Jagielski if ( pSibling && pLastSib && (pSibling != pLastSib) )
1529*b1cdbd2cSJim Jagielski { //Sind wir vielleicht bereits ueber das Ziel hinausgeschossen?
1530*b1cdbd2cSJim Jagielski if ( nCmpPos > nStPos )
1531*b1cdbd2cSJim Jagielski pSibling = pLastSib;
1532*b1cdbd2cSJim Jagielski }
1533*b1cdbd2cSJim Jagielski else if ( !pSibling )
1534*b1cdbd2cSJim Jagielski { //Eine Chance haben wir noch: wir nehmen einfach die letzte
1535*b1cdbd2cSJim Jagielski //Fussnote im Parent. Ein Sonderfall, der z.B. beim
1536*b1cdbd2cSJim Jagielski //zurueckfliessen von Absaetzen mit mehreren Fussnoten
1537*b1cdbd2cSJim Jagielski //vorkommt.
1538*b1cdbd2cSJim Jagielski //Damit wir nicht die Reihenfolge verwuerfeln muessen wir den
1539*b1cdbd2cSJim Jagielski //Parent der letzten Fussnote, die wir an der Hand hatten benutzen.
1540*b1cdbd2cSJim Jagielski pSibling = pLastSib;
1541*b1cdbd2cSJim Jagielski while( pSibling->GetFollow() )
1542*b1cdbd2cSJim Jagielski pSibling = pSibling->GetFollow();
1543*b1cdbd2cSJim Jagielski ASSERT( !pSibling->GetNext(), "InsertFtn: Who's that guy?" );
1544*b1cdbd2cSJim Jagielski }
1545*b1cdbd2cSJim Jagielski }
1546*b1cdbd2cSJim Jagielski }
1547*b1cdbd2cSJim Jagielski else
1548*b1cdbd2cSJim Jagielski { //Die erste Fussnote der Spalte/Seite haben wir an der Hand, jetzt ausgehend
1549*b1cdbd2cSJim Jagielski //von dieser die erste zur selben Spalte/Seite suchen deren Index hinter
1550*b1cdbd2cSJim Jagielski //den uebergebenen zeigt, die letzte, die wir an der Hand hatten, ist
1551*b1cdbd2cSJim Jagielski //dann der Vorgaenger.
1552*b1cdbd2cSJim Jagielski SwFtnBossFrm* pBoss = pNew->GetRef()->FindFtnBossFrm(
1553*b1cdbd2cSJim Jagielski !pNew->GetAttr()->GetFtn().IsEndNote() );
1554*b1cdbd2cSJim Jagielski sal_uInt16 nRefNum = pBoss->GetPhyPageNum(); // Die Seiten- und
1555*b1cdbd2cSJim Jagielski sal_uInt16 nRefCol = lcl_ColumnNum( pBoss ); // Spaltennummer der neuen Fussnote
1556*b1cdbd2cSJim Jagielski sal_Bool bEnd = sal_False;
1557*b1cdbd2cSJim Jagielski SwFtnFrm *pLastSib = 0;
1558*b1cdbd2cSJim Jagielski while ( pSibling && !bEnd && (nCmpPos <= nStPos) )
1559*b1cdbd2cSJim Jagielski {
1560*b1cdbd2cSJim Jagielski pLastSib = pSibling;
1561*b1cdbd2cSJim Jagielski nLastPos = nCmpPos;
1562*b1cdbd2cSJim Jagielski
1563*b1cdbd2cSJim Jagielski while ( pSibling->GetFollow() )
1564*b1cdbd2cSJim Jagielski pSibling = pSibling->GetFollow();
1565*b1cdbd2cSJim Jagielski
1566*b1cdbd2cSJim Jagielski SwFtnFrm *pFoll = (SwFtnFrm*)pSibling->GetNext();
1567*b1cdbd2cSJim Jagielski if ( pFoll )
1568*b1cdbd2cSJim Jagielski {
1569*b1cdbd2cSJim Jagielski pBoss = pSibling->GetRef()->FindFtnBossFrm( !pSibling->
1570*b1cdbd2cSJim Jagielski GetAttr()->GetFtn().IsEndNote() );
1571*b1cdbd2cSJim Jagielski sal_uInt16 nTmpRef;
1572*b1cdbd2cSJim Jagielski if( nStPos >= ENDNOTE ||
1573*b1cdbd2cSJim Jagielski (nTmpRef = pBoss->GetPhyPageNum()) < nRefNum ||
1574*b1cdbd2cSJim Jagielski ( nTmpRef == nRefNum && lcl_ColumnNum( pBoss ) <= nRefCol ))
1575*b1cdbd2cSJim Jagielski pSibling = pFoll;
1576*b1cdbd2cSJim Jagielski else
1577*b1cdbd2cSJim Jagielski bEnd = sal_True;
1578*b1cdbd2cSJim Jagielski }
1579*b1cdbd2cSJim Jagielski else
1580*b1cdbd2cSJim Jagielski {
1581*b1cdbd2cSJim Jagielski SwFtnBossFrm* pNxtB = pSibling->FindFtnBossFrm();
1582*b1cdbd2cSJim Jagielski SwPageFrm *pSibPage = pNxtB->FindPageFrm();
1583*b1cdbd2cSJim Jagielski sal_Bool bEndNote = pSibPage->IsEndNotePage();
1584*b1cdbd2cSJim Jagielski sal_Bool bChgPage = lcl_NextFtnBoss( pNxtB, pSibPage, bDontLeave );
1585*b1cdbd2cSJim Jagielski // Bei Seitenwechsel muss das EndNoteFlag ueberprueft werden.
1586*b1cdbd2cSJim Jagielski SwFtnContFrm *pCont = pNxtB && ( !bChgPage ||
1587*b1cdbd2cSJim Jagielski pSibPage->IsEndNotePage() == bEndNote )
1588*b1cdbd2cSJim Jagielski ? pNxtB->FindNearestFtnCont( bDontLeave ) : 0;
1589*b1cdbd2cSJim Jagielski if ( pCont )
1590*b1cdbd2cSJim Jagielski pSibling = (SwFtnFrm*)pCont->Lower();
1591*b1cdbd2cSJim Jagielski else
1592*b1cdbd2cSJim Jagielski bEnd = sal_True;
1593*b1cdbd2cSJim Jagielski }
1594*b1cdbd2cSJim Jagielski if ( !bEnd && pSibling )
1595*b1cdbd2cSJim Jagielski nCmpPos = ::lcl_FindFtnPos( pDoc, pSibling->GetAttr() );
1596*b1cdbd2cSJim Jagielski if ( pSibling && pLastSib && (pSibling != pLastSib) )
1597*b1cdbd2cSJim Jagielski { //Sind wir vielleicht bereits ueber das Ziel hinausgeschossen?
1598*b1cdbd2cSJim Jagielski if ( (nLastPos < nCmpPos) && (nCmpPos > nStPos) )
1599*b1cdbd2cSJim Jagielski {
1600*b1cdbd2cSJim Jagielski pSibling = pLastSib;
1601*b1cdbd2cSJim Jagielski bEnd = sal_True;
1602*b1cdbd2cSJim Jagielski }
1603*b1cdbd2cSJim Jagielski }
1604*b1cdbd2cSJim Jagielski }
1605*b1cdbd2cSJim Jagielski }
1606*b1cdbd2cSJim Jagielski if ( pSibling )
1607*b1cdbd2cSJim Jagielski {
1608*b1cdbd2cSJim Jagielski nCmpPos = ::lcl_FindFtnPos( pDoc, pSibling->GetAttr() );
1609*b1cdbd2cSJim Jagielski if ( nCmpPos < nStPos )
1610*b1cdbd2cSJim Jagielski {
1611*b1cdbd2cSJim Jagielski while ( pSibling->GetFollow() )
1612*b1cdbd2cSJim Jagielski pSibling = pSibling->GetFollow();
1613*b1cdbd2cSJim Jagielski pParent = (SwFtnContFrm*)pSibling->GetUpper();
1614*b1cdbd2cSJim Jagielski pSibling = (SwFtnFrm*)pSibling->GetNext();
1615*b1cdbd2cSJim Jagielski }
1616*b1cdbd2cSJim Jagielski else
1617*b1cdbd2cSJim Jagielski {
1618*b1cdbd2cSJim Jagielski if( pSibling->GetMaster() )
1619*b1cdbd2cSJim Jagielski {
1620*b1cdbd2cSJim Jagielski if( ENDNOTE > nCmpPos || nStPos >= ENDNOTE )
1621*b1cdbd2cSJim Jagielski {
1622*b1cdbd2cSJim Jagielski ASSERT( sal_False, "InsertFtn: Master expected II" );
1623*b1cdbd2cSJim Jagielski do
1624*b1cdbd2cSJim Jagielski pSibling = pSibling->GetMaster();
1625*b1cdbd2cSJim Jagielski while ( pSibling->GetMaster() );
1626*b1cdbd2cSJim Jagielski }
1627*b1cdbd2cSJim Jagielski }
1628*b1cdbd2cSJim Jagielski pParent = (SwFtnContFrm*)pSibling->GetUpper();
1629*b1cdbd2cSJim Jagielski }
1630*b1cdbd2cSJim Jagielski }
1631*b1cdbd2cSJim Jagielski ASSERT( pParent, "paste in space?" );
1632*b1cdbd2cSJim Jagielski pNew->Paste( pParent, pSibling );
1633*b1cdbd2cSJim Jagielski }
1634*b1cdbd2cSJim Jagielski
1635*b1cdbd2cSJim Jagielski /*************************************************************************
1636*b1cdbd2cSJim Jagielski |*
1637*b1cdbd2cSJim Jagielski |* SwFtnBossFrm::AppendFtn()
1638*b1cdbd2cSJim Jagielski |*
1639*b1cdbd2cSJim Jagielski |*************************************************************************/
1640*b1cdbd2cSJim Jagielski
1641*b1cdbd2cSJim Jagielski
AppendFtn(SwCntntFrm * pRef,SwTxtFtn * pAttr)1642*b1cdbd2cSJim Jagielski void SwFtnBossFrm::AppendFtn( SwCntntFrm *pRef, SwTxtFtn *pAttr )
1643*b1cdbd2cSJim Jagielski {
1644*b1cdbd2cSJim Jagielski //Wenn es die Fussnote schon gibt tun wir nix.
1645*b1cdbd2cSJim Jagielski if ( FindFtn( pRef, pAttr ) )
1646*b1cdbd2cSJim Jagielski return;
1647*b1cdbd2cSJim Jagielski
1648*b1cdbd2cSJim Jagielski //Wenn Fussnoten am Dokumentende eingestellt sind, so brauchen wir 'eh erst
1649*b1cdbd2cSJim Jagielski //ab der entsprechenden Seite zu suchen.
1650*b1cdbd2cSJim Jagielski //Wenn es noch keine gibt, muss eben eine erzeugt werden.
1651*b1cdbd2cSJim Jagielski //Wenn es sich um eine Endnote handelt, muss eine Endnotenseite gesucht
1652*b1cdbd2cSJim Jagielski //bzw. erzeugt werden.
1653*b1cdbd2cSJim Jagielski SwDoc *pDoc = GetFmt()->GetDoc();
1654*b1cdbd2cSJim Jagielski SwFtnBossFrm *pBoss = this;
1655*b1cdbd2cSJim Jagielski SwPageFrm *pPage = FindPageFrm();
1656*b1cdbd2cSJim Jagielski SwPageFrm *pMyPage = pPage;
1657*b1cdbd2cSJim Jagielski sal_Bool bChgPage = sal_False;
1658*b1cdbd2cSJim Jagielski sal_Bool bEnd = sal_False;
1659*b1cdbd2cSJim Jagielski if ( pAttr->GetFtn().IsEndNote() )
1660*b1cdbd2cSJim Jagielski {
1661*b1cdbd2cSJim Jagielski bEnd = sal_True;
1662*b1cdbd2cSJim Jagielski if( GetUpper()->IsSctFrm() &&
1663*b1cdbd2cSJim Jagielski ((SwSectionFrm*)GetUpper())->IsEndnAtEnd() )
1664*b1cdbd2cSJim Jagielski {
1665*b1cdbd2cSJim Jagielski SwFrm* pLast =
1666*b1cdbd2cSJim Jagielski ((SwSectionFrm*)GetUpper())->FindLastCntnt( FINDMODE_ENDNOTE );
1667*b1cdbd2cSJim Jagielski if( pLast )
1668*b1cdbd2cSJim Jagielski {
1669*b1cdbd2cSJim Jagielski pBoss = pLast->FindFtnBossFrm();
1670*b1cdbd2cSJim Jagielski pPage = pBoss->FindPageFrm();
1671*b1cdbd2cSJim Jagielski }
1672*b1cdbd2cSJim Jagielski }
1673*b1cdbd2cSJim Jagielski else
1674*b1cdbd2cSJim Jagielski {
1675*b1cdbd2cSJim Jagielski while ( pPage->GetNext() && !pPage->IsEndNotePage() )
1676*b1cdbd2cSJim Jagielski {
1677*b1cdbd2cSJim Jagielski pPage = (SwPageFrm*)pPage->GetNext();
1678*b1cdbd2cSJim Jagielski bChgPage = sal_True;
1679*b1cdbd2cSJim Jagielski }
1680*b1cdbd2cSJim Jagielski if ( !pPage->IsEndNotePage() )
1681*b1cdbd2cSJim Jagielski {
1682*b1cdbd2cSJim Jagielski SwPageDesc *pDesc = pDoc->GetEndNoteInfo().GetPageDesc( *pDoc );
1683*b1cdbd2cSJim Jagielski pPage = ::InsertNewPage( *pDesc, pPage->GetUpper(),
1684*b1cdbd2cSJim Jagielski !pPage->OnRightPage(), sal_False, sal_True, 0 );
1685*b1cdbd2cSJim Jagielski pPage->SetEndNotePage( sal_True );
1686*b1cdbd2cSJim Jagielski bChgPage = sal_True;
1687*b1cdbd2cSJim Jagielski }
1688*b1cdbd2cSJim Jagielski else
1689*b1cdbd2cSJim Jagielski {
1690*b1cdbd2cSJim Jagielski //Wir koennen wenigstens schon mal ungefaehr die richtige Seite
1691*b1cdbd2cSJim Jagielski //suchen. Damit stellen wir sicher das wir auch bei hunderten
1692*b1cdbd2cSJim Jagielski //Fussnoten noch in endlicher Zeit fertig werden.
1693*b1cdbd2cSJim Jagielski SwPageFrm *pNxt = (SwPageFrm*)pPage->GetNext();
1694*b1cdbd2cSJim Jagielski const sal_uLong nStPos = ::lcl_FindFtnPos( pDoc, pAttr );
1695*b1cdbd2cSJim Jagielski while ( pNxt && pNxt->IsEndNotePage() )
1696*b1cdbd2cSJim Jagielski {
1697*b1cdbd2cSJim Jagielski SwFtnContFrm *pCont = pNxt->FindFtnCont();
1698*b1cdbd2cSJim Jagielski if ( pCont && pCont->Lower() )
1699*b1cdbd2cSJim Jagielski {
1700*b1cdbd2cSJim Jagielski ASSERT( pCont->Lower()->IsFtnFrm(), "Keine Ftn im Container" );
1701*b1cdbd2cSJim Jagielski if ( nStPos > ::lcl_FindFtnPos( pDoc,
1702*b1cdbd2cSJim Jagielski ((SwFtnFrm*)pCont->Lower())->GetAttr()))
1703*b1cdbd2cSJim Jagielski {
1704*b1cdbd2cSJim Jagielski pPage = pNxt;
1705*b1cdbd2cSJim Jagielski pNxt = (SwPageFrm*)pPage->GetNext();
1706*b1cdbd2cSJim Jagielski continue;
1707*b1cdbd2cSJim Jagielski }
1708*b1cdbd2cSJim Jagielski }
1709*b1cdbd2cSJim Jagielski break;
1710*b1cdbd2cSJim Jagielski }
1711*b1cdbd2cSJim Jagielski }
1712*b1cdbd2cSJim Jagielski }
1713*b1cdbd2cSJim Jagielski }
1714*b1cdbd2cSJim Jagielski else if( FTNPOS_CHAPTER == pDoc->GetFtnInfo().ePos && ( !GetUpper()->
1715*b1cdbd2cSJim Jagielski IsSctFrm() || !((SwSectionFrm*)GetUpper())->IsFtnAtEnd() ) )
1716*b1cdbd2cSJim Jagielski {
1717*b1cdbd2cSJim Jagielski while ( pPage->GetNext() && !pPage->IsFtnPage() &&
1718*b1cdbd2cSJim Jagielski !((SwPageFrm*)pPage->GetNext())->IsEndNotePage() )
1719*b1cdbd2cSJim Jagielski {
1720*b1cdbd2cSJim Jagielski pPage = (SwPageFrm*)pPage->GetNext();
1721*b1cdbd2cSJim Jagielski bChgPage = sal_True;
1722*b1cdbd2cSJim Jagielski }
1723*b1cdbd2cSJim Jagielski
1724*b1cdbd2cSJim Jagielski if ( !pPage->IsFtnPage() )
1725*b1cdbd2cSJim Jagielski {
1726*b1cdbd2cSJim Jagielski SwPageDesc *pDesc = pDoc->GetFtnInfo().GetPageDesc( *pDoc );
1727*b1cdbd2cSJim Jagielski pPage = ::InsertNewPage( *pDesc, pPage->GetUpper(),
1728*b1cdbd2cSJim Jagielski !pPage->OnRightPage(), sal_False, sal_True, pPage->GetNext() );
1729*b1cdbd2cSJim Jagielski bChgPage = sal_True;
1730*b1cdbd2cSJim Jagielski }
1731*b1cdbd2cSJim Jagielski else
1732*b1cdbd2cSJim Jagielski {
1733*b1cdbd2cSJim Jagielski //Wir koennen wenigstens schon mal ungefaehr die richtige Seite
1734*b1cdbd2cSJim Jagielski //suchen. Damit stellen wir sicher das wir auch bei hunderten
1735*b1cdbd2cSJim Jagielski //Fussnoten noch in endlicher Zeit fertig werden.
1736*b1cdbd2cSJim Jagielski SwPageFrm *pNxt = (SwPageFrm*)pPage->GetNext();
1737*b1cdbd2cSJim Jagielski const sal_uLong nStPos = ::lcl_FindFtnPos( pDoc, pAttr );
1738*b1cdbd2cSJim Jagielski while ( pNxt && pNxt->IsFtnPage() && !pNxt->IsEndNotePage() )
1739*b1cdbd2cSJim Jagielski {
1740*b1cdbd2cSJim Jagielski SwFtnContFrm *pCont = pNxt->FindFtnCont();
1741*b1cdbd2cSJim Jagielski if ( pCont && pCont->Lower() )
1742*b1cdbd2cSJim Jagielski {
1743*b1cdbd2cSJim Jagielski ASSERT( pCont->Lower()->IsFtnFrm(), "Keine Ftn im Container" );
1744*b1cdbd2cSJim Jagielski if ( nStPos > ::lcl_FindFtnPos( pDoc,
1745*b1cdbd2cSJim Jagielski ((SwFtnFrm*)pCont->Lower())->GetAttr()))
1746*b1cdbd2cSJim Jagielski {
1747*b1cdbd2cSJim Jagielski pPage = pNxt;
1748*b1cdbd2cSJim Jagielski pNxt = (SwPageFrm*)pPage->GetNext();
1749*b1cdbd2cSJim Jagielski continue;
1750*b1cdbd2cSJim Jagielski }
1751*b1cdbd2cSJim Jagielski }
1752*b1cdbd2cSJim Jagielski break;
1753*b1cdbd2cSJim Jagielski }
1754*b1cdbd2cSJim Jagielski }
1755*b1cdbd2cSJim Jagielski }
1756*b1cdbd2cSJim Jagielski
1757*b1cdbd2cSJim Jagielski //Erstmal eine Fussnote und die benoetigten CntntFrms anlegen.
1758*b1cdbd2cSJim Jagielski if ( !pAttr->GetStartNode() )
1759*b1cdbd2cSJim Jagielski { ASSERT( !this, "Kein Fussnoteninhalt." );
1760*b1cdbd2cSJim Jagielski return;
1761*b1cdbd2cSJim Jagielski }
1762*b1cdbd2cSJim Jagielski
1763*b1cdbd2cSJim Jagielski // Wenn es auf der Seite/Spalte bereits einen FtnCont gibt,
1764*b1cdbd2cSJim Jagielski // kann in einen spaltigen Bereich keiner erzeugt werden.
1765*b1cdbd2cSJim Jagielski if( pBoss->IsInSct() && pBoss->IsColumnFrm() && !pPage->IsFtnPage() )
1766*b1cdbd2cSJim Jagielski {
1767*b1cdbd2cSJim Jagielski SwSectionFrm* pSct = pBoss->FindSctFrm();
1768*b1cdbd2cSJim Jagielski if( bEnd ? !pSct->IsEndnAtEnd() : !pSct->IsFtnAtEnd() )
1769*b1cdbd2cSJim Jagielski {
1770*b1cdbd2cSJim Jagielski SwFtnContFrm* pFtnCont = pSct->FindFtnBossFrm(!bEnd)->FindFtnCont();
1771*b1cdbd2cSJim Jagielski if( pFtnCont )
1772*b1cdbd2cSJim Jagielski {
1773*b1cdbd2cSJim Jagielski SwFtnFrm* pTmp = (SwFtnFrm*)pFtnCont->Lower();
1774*b1cdbd2cSJim Jagielski if( bEnd )
1775*b1cdbd2cSJim Jagielski while( pTmp && !pTmp->GetAttr()->GetFtn().IsEndNote() )
1776*b1cdbd2cSJim Jagielski pTmp = (SwFtnFrm*)pTmp->GetNext();
1777*b1cdbd2cSJim Jagielski if( pTmp && *pTmp < pAttr )
1778*b1cdbd2cSJim Jagielski return;
1779*b1cdbd2cSJim Jagielski }
1780*b1cdbd2cSJim Jagielski }
1781*b1cdbd2cSJim Jagielski }
1782*b1cdbd2cSJim Jagielski
1783*b1cdbd2cSJim Jagielski SwFtnFrm *pNew = new SwFtnFrm( pDoc->GetDfltFrmFmt(), this, pRef, pAttr );
1784*b1cdbd2cSJim Jagielski {
1785*b1cdbd2cSJim Jagielski SwNodeIndex aIdx( *pAttr->GetStartNode(), 1 );
1786*b1cdbd2cSJim Jagielski ::_InsertCnt( pNew, pDoc, aIdx.GetIndex() );
1787*b1cdbd2cSJim Jagielski }
1788*b1cdbd2cSJim Jagielski // Wenn die Seite gewechselt (oder gar neu angelegt) wurde,
1789*b1cdbd2cSJim Jagielski // muessen wir uns dort in die erste Spalte setzen
1790*b1cdbd2cSJim Jagielski if( bChgPage )
1791*b1cdbd2cSJim Jagielski {
1792*b1cdbd2cSJim Jagielski SwLayoutFrm* pBody = pPage->FindBodyCont();
1793*b1cdbd2cSJim Jagielski ASSERT( pBody, "AppendFtn: NoPageBody?" );
1794*b1cdbd2cSJim Jagielski if( pBody->Lower() && pBody->Lower()->IsColumnFrm() )
1795*b1cdbd2cSJim Jagielski pBoss = (SwFtnBossFrm*)pBody->Lower();
1796*b1cdbd2cSJim Jagielski else
1797*b1cdbd2cSJim Jagielski pBoss = pPage; // bei nichtspaltigen Seiten auf die Seite selbst
1798*b1cdbd2cSJim Jagielski }
1799*b1cdbd2cSJim Jagielski pBoss->InsertFtn( pNew );
1800*b1cdbd2cSJim Jagielski if ( pNew->GetUpper() ) //Eingesetzt oder nicht?
1801*b1cdbd2cSJim Jagielski {
1802*b1cdbd2cSJim Jagielski ::RegistFlys( pNew->FindPageFrm(), pNew );
1803*b1cdbd2cSJim Jagielski SwSectionFrm* pSect = FindSctFrm();
1804*b1cdbd2cSJim Jagielski // Der Inhalt des FtnContainers in einem (spaltigen) Bereich
1805*b1cdbd2cSJim Jagielski // braucht nur kalkuliert zu werden,
1806*b1cdbd2cSJim Jagielski // wenn der Bereich bereits bis zur Unterkante seines Uppers geht.
1807*b1cdbd2cSJim Jagielski if( pSect && !pSect->IsJoinLocked() && ( bEnd ? !pSect->IsEndnAtEnd() :
1808*b1cdbd2cSJim Jagielski !pSect->IsFtnAtEnd() ) && pSect->Growable() )
1809*b1cdbd2cSJim Jagielski pSect->InvalidateSize();
1810*b1cdbd2cSJim Jagielski else
1811*b1cdbd2cSJim Jagielski {
1812*b1cdbd2cSJim Jagielski // --> OD 2005-05-18 #i49383# - disable unlock of position of
1813*b1cdbd2cSJim Jagielski // lower objects during format of footnote content.
1814*b1cdbd2cSJim Jagielski const bool bOldFtnFrmLocked( pNew->IsColLocked() );
1815*b1cdbd2cSJim Jagielski pNew->ColLock();
1816*b1cdbd2cSJim Jagielski pNew->KeepLockPosOfLowerObjs();
1817*b1cdbd2cSJim Jagielski // --> OD 2006-02-02 #i57914# - adjust fix #i49383#
1818*b1cdbd2cSJim Jagielski // no extra notify for footnote frame
1819*b1cdbd2cSJim Jagielski // SwLayNotify* pFtnFrmNotitfy = new SwLayNotify( pNew );
1820*b1cdbd2cSJim Jagielski // <--
1821*b1cdbd2cSJim Jagielski SwCntntFrm *pCnt = pNew->ContainsCntnt();
1822*b1cdbd2cSJim Jagielski while ( pCnt && pCnt->FindFtnFrm()->GetAttr() == pAttr )
1823*b1cdbd2cSJim Jagielski {
1824*b1cdbd2cSJim Jagielski pCnt->Calc();
1825*b1cdbd2cSJim Jagielski // --> OD 2005-05-17 #i49383# - format anchored objects
1826*b1cdbd2cSJim Jagielski if ( pCnt->IsTxtFrm() && pCnt->IsValid() )
1827*b1cdbd2cSJim Jagielski {
1828*b1cdbd2cSJim Jagielski if ( !SwObjectFormatter::FormatObjsAtFrm( *pCnt,
1829*b1cdbd2cSJim Jagielski *(pCnt->FindPageFrm()) ) )
1830*b1cdbd2cSJim Jagielski {
1831*b1cdbd2cSJim Jagielski // restart format with first content
1832*b1cdbd2cSJim Jagielski pCnt = pNew->ContainsCntnt();
1833*b1cdbd2cSJim Jagielski continue;
1834*b1cdbd2cSJim Jagielski }
1835*b1cdbd2cSJim Jagielski }
1836*b1cdbd2cSJim Jagielski // <--
1837*b1cdbd2cSJim Jagielski pCnt = (SwCntntFrm*)pCnt->FindNextCnt();
1838*b1cdbd2cSJim Jagielski }
1839*b1cdbd2cSJim Jagielski // --> OD 2005-05-18 #i49383#
1840*b1cdbd2cSJim Jagielski if ( !bOldFtnFrmLocked )
1841*b1cdbd2cSJim Jagielski {
1842*b1cdbd2cSJim Jagielski pNew->ColUnlock();
1843*b1cdbd2cSJim Jagielski }
1844*b1cdbd2cSJim Jagielski // --> OD 2006-02-02 #i57914# - adjust fix #i49383#
1845*b1cdbd2cSJim Jagielski // enable lock of lower object position before format of footnote frame.
1846*b1cdbd2cSJim Jagielski pNew->UnlockPosOfLowerObjs();
1847*b1cdbd2cSJim Jagielski // <--
1848*b1cdbd2cSJim Jagielski pNew->Calc();
1849*b1cdbd2cSJim Jagielski // --> OD 2006-02-02 #i57914# - adjust fix #i49383#
1850*b1cdbd2cSJim Jagielski // no extra notify for footnote frame
1851*b1cdbd2cSJim Jagielski // pNew->UnlockPosOfLowerObjs();
1852*b1cdbd2cSJim Jagielski // delete pFtnFrmNotitfy;
1853*b1cdbd2cSJim Jagielski // <--
1854*b1cdbd2cSJim Jagielski if ( !bOldFtnFrmLocked && !pNew->GetLower() &&
1855*b1cdbd2cSJim Jagielski !pNew->IsColLocked() && !pNew->IsBackMoveLocked() )
1856*b1cdbd2cSJim Jagielski {
1857*b1cdbd2cSJim Jagielski pNew->Cut();
1858*b1cdbd2cSJim Jagielski delete pNew;
1859*b1cdbd2cSJim Jagielski }
1860*b1cdbd2cSJim Jagielski // <--
1861*b1cdbd2cSJim Jagielski }
1862*b1cdbd2cSJim Jagielski pMyPage->UpdateFtnNum();
1863*b1cdbd2cSJim Jagielski }
1864*b1cdbd2cSJim Jagielski else
1865*b1cdbd2cSJim Jagielski delete pNew;
1866*b1cdbd2cSJim Jagielski }
1867*b1cdbd2cSJim Jagielski /*************************************************************************
1868*b1cdbd2cSJim Jagielski |*
1869*b1cdbd2cSJim Jagielski |* SwFtnBossFrm::FindFtn()
1870*b1cdbd2cSJim Jagielski |*
1871*b1cdbd2cSJim Jagielski |*************************************************************************/
1872*b1cdbd2cSJim Jagielski
1873*b1cdbd2cSJim Jagielski
FindFtn(const SwCntntFrm * pRef,const SwTxtFtn * pAttr)1874*b1cdbd2cSJim Jagielski SwFtnFrm *SwFtnBossFrm::FindFtn( const SwCntntFrm *pRef, const SwTxtFtn *pAttr )
1875*b1cdbd2cSJim Jagielski {
1876*b1cdbd2cSJim Jagielski //Der einfachste und sicherste Weg geht ueber das Attribut.
1877*b1cdbd2cSJim Jagielski ASSERT( pAttr->GetStartNode(), "FtnAtr ohne StartNode." );
1878*b1cdbd2cSJim Jagielski SwNodeIndex aIdx( *pAttr->GetStartNode(), 1 );
1879*b1cdbd2cSJim Jagielski SwCntntNode *pNd = aIdx.GetNode().GetCntntNode();
1880*b1cdbd2cSJim Jagielski if ( !pNd )
1881*b1cdbd2cSJim Jagielski pNd = pRef->GetAttrSet()->GetDoc()->
1882*b1cdbd2cSJim Jagielski GetNodes().GoNextSection( &aIdx, sal_True, sal_False );
1883*b1cdbd2cSJim Jagielski if ( !pNd )
1884*b1cdbd2cSJim Jagielski return 0;
1885*b1cdbd2cSJim Jagielski SwIterator<SwFrm,SwCntntNode> aIter( *pNd );
1886*b1cdbd2cSJim Jagielski SwFrm* pFrm = aIter.First();
1887*b1cdbd2cSJim Jagielski if( pFrm )
1888*b1cdbd2cSJim Jagielski do
1889*b1cdbd2cSJim Jagielski {
1890*b1cdbd2cSJim Jagielski pFrm = pFrm->GetUpper();
1891*b1cdbd2cSJim Jagielski // #i28500#, #i27243# Due to the endnode collector, there are
1892*b1cdbd2cSJim Jagielski // SwFtnFrms, which are not in the layout. Therefore the
1893*b1cdbd2cSJim Jagielski // bInfFtn flags are not set correctly, and a cell of FindFtnFrm
1894*b1cdbd2cSJim Jagielski // would return 0. Therefore we better call ImplFindFtnFrm().
1895*b1cdbd2cSJim Jagielski SwFtnFrm *pFtn = pFrm->ImplFindFtnFrm();
1896*b1cdbd2cSJim Jagielski if ( pFtn && pFtn->GetRef() == pRef )
1897*b1cdbd2cSJim Jagielski {
1898*b1cdbd2cSJim Jagielski // The following condition becomes true, if the whole
1899*b1cdbd2cSJim Jagielski // footnotecontent is a section. While no frames exist,
1900*b1cdbd2cSJim Jagielski // the HiddenFlag of the section is set, this causes
1901*b1cdbd2cSJim Jagielski // the GoNextSection-function leaves the footnote.
1902*b1cdbd2cSJim Jagielski if( pFtn->GetAttr() != pAttr )
1903*b1cdbd2cSJim Jagielski return 0;
1904*b1cdbd2cSJim Jagielski while ( pFtn && pFtn->GetMaster() )
1905*b1cdbd2cSJim Jagielski pFtn = pFtn->GetMaster();
1906*b1cdbd2cSJim Jagielski return pFtn;
1907*b1cdbd2cSJim Jagielski }
1908*b1cdbd2cSJim Jagielski
1909*b1cdbd2cSJim Jagielski } while ( 0 != (pFrm = aIter.Next()) );
1910*b1cdbd2cSJim Jagielski
1911*b1cdbd2cSJim Jagielski return 0;
1912*b1cdbd2cSJim Jagielski }
1913*b1cdbd2cSJim Jagielski /*************************************************************************
1914*b1cdbd2cSJim Jagielski |*
1915*b1cdbd2cSJim Jagielski |* SwFtnBossFrm::RemoveFtn()
1916*b1cdbd2cSJim Jagielski |*
1917*b1cdbd2cSJim Jagielski |*************************************************************************/
1918*b1cdbd2cSJim Jagielski
1919*b1cdbd2cSJim Jagielski
RemoveFtn(const SwCntntFrm * pRef,const SwTxtFtn * pAttr,sal_Bool bPrep)1920*b1cdbd2cSJim Jagielski void SwFtnBossFrm::RemoveFtn( const SwCntntFrm *pRef, const SwTxtFtn *pAttr,
1921*b1cdbd2cSJim Jagielski sal_Bool bPrep )
1922*b1cdbd2cSJim Jagielski {
1923*b1cdbd2cSJim Jagielski SwFtnFrm *pFtn = FindFtn( pRef, pAttr );
1924*b1cdbd2cSJim Jagielski if( pFtn )
1925*b1cdbd2cSJim Jagielski {
1926*b1cdbd2cSJim Jagielski do
1927*b1cdbd2cSJim Jagielski {
1928*b1cdbd2cSJim Jagielski SwFtnFrm *pFoll = pFtn->GetFollow();
1929*b1cdbd2cSJim Jagielski pFtn->Cut();
1930*b1cdbd2cSJim Jagielski delete pFtn;
1931*b1cdbd2cSJim Jagielski pFtn = pFoll;
1932*b1cdbd2cSJim Jagielski } while ( pFtn );
1933*b1cdbd2cSJim Jagielski if( bPrep && pRef->IsFollow() )
1934*b1cdbd2cSJim Jagielski {
1935*b1cdbd2cSJim Jagielski ASSERT( pRef->IsTxtFrm(), "NoTxtFrm has Footnote?" );
1936*b1cdbd2cSJim Jagielski SwTxtFrm* pMaster = (SwTxtFrm*)pRef->FindMaster();
1937*b1cdbd2cSJim Jagielski if( !pMaster->IsLocked() )
1938*b1cdbd2cSJim Jagielski pMaster->Prepare( PREP_FTN_GONE );
1939*b1cdbd2cSJim Jagielski }
1940*b1cdbd2cSJim Jagielski }
1941*b1cdbd2cSJim Jagielski FindPageFrm()->UpdateFtnNum();
1942*b1cdbd2cSJim Jagielski }
1943*b1cdbd2cSJim Jagielski
1944*b1cdbd2cSJim Jagielski /*************************************************************************
1945*b1cdbd2cSJim Jagielski |*
1946*b1cdbd2cSJim Jagielski |* SwFtnBossFrm::ChangeFtnRef()
1947*b1cdbd2cSJim Jagielski |*
1948*b1cdbd2cSJim Jagielski |*************************************************************************/
1949*b1cdbd2cSJim Jagielski
1950*b1cdbd2cSJim Jagielski
ChangeFtnRef(const SwCntntFrm * pOld,const SwTxtFtn * pAttr,SwCntntFrm * pNew)1951*b1cdbd2cSJim Jagielski void SwFtnBossFrm::ChangeFtnRef( const SwCntntFrm *pOld, const SwTxtFtn *pAttr,
1952*b1cdbd2cSJim Jagielski SwCntntFrm *pNew )
1953*b1cdbd2cSJim Jagielski {
1954*b1cdbd2cSJim Jagielski SwFtnFrm *pFtn = FindFtn( pOld, pAttr );
1955*b1cdbd2cSJim Jagielski while ( pFtn )
1956*b1cdbd2cSJim Jagielski {
1957*b1cdbd2cSJim Jagielski pFtn->SetRef( pNew );
1958*b1cdbd2cSJim Jagielski pFtn = pFtn->GetFollow();
1959*b1cdbd2cSJim Jagielski }
1960*b1cdbd2cSJim Jagielski }
1961*b1cdbd2cSJim Jagielski
1962*b1cdbd2cSJim Jagielski /*************************************************************************
1963*b1cdbd2cSJim Jagielski |*
1964*b1cdbd2cSJim Jagielski |* SwFtnBossFrm::CollectFtns()
1965*b1cdbd2cSJim Jagielski |*
1966*b1cdbd2cSJim Jagielski |*************************************************************************/
1967*b1cdbd2cSJim Jagielski
1968*b1cdbd2cSJim Jagielski
1969*b1cdbd2cSJim Jagielski /// OD 03.04.2003 #108446# - add parameter <_bCollectOnlyPreviousFtns> in
1970*b1cdbd2cSJim Jagielski /// order to control, if only footnotes, which are positioned before the
1971*b1cdbd2cSJim Jagielski /// footnote boss frame <this> have to be collected.
CollectFtns(const SwCntntFrm * _pRef,SwFtnBossFrm * _pOld,SvPtrarr & _rFtnArr,const sal_Bool _bCollectOnlyPreviousFtns)1972*b1cdbd2cSJim Jagielski void SwFtnBossFrm::CollectFtns( const SwCntntFrm* _pRef,
1973*b1cdbd2cSJim Jagielski SwFtnBossFrm* _pOld,
1974*b1cdbd2cSJim Jagielski SvPtrarr& _rFtnArr,
1975*b1cdbd2cSJim Jagielski const sal_Bool _bCollectOnlyPreviousFtns )
1976*b1cdbd2cSJim Jagielski {
1977*b1cdbd2cSJim Jagielski SwFtnFrm *pFtn = _pOld->FindFirstFtn();
1978*b1cdbd2cSJim Jagielski while( !pFtn )
1979*b1cdbd2cSJim Jagielski {
1980*b1cdbd2cSJim Jagielski if( _pOld->IsColumnFrm() )
1981*b1cdbd2cSJim Jagielski { // Spalten abklappern
1982*b1cdbd2cSJim Jagielski while ( !pFtn && _pOld->GetPrev() )
1983*b1cdbd2cSJim Jagielski {
1984*b1cdbd2cSJim Jagielski //Wenn wir keine Fussnote gefunden haben, ist noch nicht alles zu
1985*b1cdbd2cSJim Jagielski //spaet. Die Schleife wird beim Aufnehmen von Follow-Zeilen durch
1986*b1cdbd2cSJim Jagielski //Tabellen benoetigt. Fuer alle anderen Faelle ist sie in der Lage
1987*b1cdbd2cSJim Jagielski //'krumme' Verhaeltnisse zu korrigieren.
1988*b1cdbd2cSJim Jagielski _pOld = (SwFtnBossFrm*)_pOld->GetPrev();
1989*b1cdbd2cSJim Jagielski pFtn = _pOld->FindFirstFtn();
1990*b1cdbd2cSJim Jagielski }
1991*b1cdbd2cSJim Jagielski }
1992*b1cdbd2cSJim Jagielski if( !pFtn )
1993*b1cdbd2cSJim Jagielski {
1994*b1cdbd2cSJim Jagielski // vorherige Seite
1995*b1cdbd2cSJim Jagielski SwPageFrm* pPg;
1996*b1cdbd2cSJim Jagielski for ( SwFrm* pTmp = _pOld;
1997*b1cdbd2cSJim Jagielski 0 != ( pPg = (SwPageFrm*)pTmp->FindPageFrm()->GetPrev())
1998*b1cdbd2cSJim Jagielski && pPg->IsEmptyPage() ;
1999*b1cdbd2cSJim Jagielski )
2000*b1cdbd2cSJim Jagielski {
2001*b1cdbd2cSJim Jagielski pTmp = pPg;
2002*b1cdbd2cSJim Jagielski }
2003*b1cdbd2cSJim Jagielski if( !pPg )
2004*b1cdbd2cSJim Jagielski return;
2005*b1cdbd2cSJim Jagielski
2006*b1cdbd2cSJim Jagielski SwLayoutFrm* pBody = pPg->FindBodyCont();
2007*b1cdbd2cSJim Jagielski if( pBody->Lower() && pBody->Lower()->IsColumnFrm() )
2008*b1cdbd2cSJim Jagielski {
2009*b1cdbd2cSJim Jagielski // mehrspaltige Seite => letzte Spalte suchen
2010*b1cdbd2cSJim Jagielski _pOld = static_cast<SwFtnBossFrm*>(pBody->GetLastLower());
2011*b1cdbd2cSJim Jagielski }
2012*b1cdbd2cSJim Jagielski else
2013*b1cdbd2cSJim Jagielski _pOld = pPg; // einspaltige Seite
2014*b1cdbd2cSJim Jagielski pFtn = _pOld->FindFirstFtn();
2015*b1cdbd2cSJim Jagielski }
2016*b1cdbd2cSJim Jagielski }
2017*b1cdbd2cSJim Jagielski // OD 03.04.2003 #108446# - consider new parameter <_bCollectOnlyPreviousFtns>
2018*b1cdbd2cSJim Jagielski SwFtnBossFrm* pRefBossFrm = NULL;
2019*b1cdbd2cSJim Jagielski if ( _bCollectOnlyPreviousFtns )
2020*b1cdbd2cSJim Jagielski {
2021*b1cdbd2cSJim Jagielski pRefBossFrm = this;
2022*b1cdbd2cSJim Jagielski }
2023*b1cdbd2cSJim Jagielski _CollectFtns( _pRef, pFtn, _rFtnArr, _bCollectOnlyPreviousFtns, pRefBossFrm );
2024*b1cdbd2cSJim Jagielski }
2025*b1cdbd2cSJim Jagielski
2026*b1cdbd2cSJim Jagielski
2027*b1cdbd2cSJim Jagielski /*************************************************************************
2028*b1cdbd2cSJim Jagielski |*
2029*b1cdbd2cSJim Jagielski |* SwFtnBossFrm::_CollectFtns()
2030*b1cdbd2cSJim Jagielski |*
2031*b1cdbd2cSJim Jagielski |*************************************************************************/
FtnInArr(SvPtrarr & rFtnArr,SwFtnFrm * pFtn)2032*b1cdbd2cSJim Jagielski inline void FtnInArr( SvPtrarr& rFtnArr, SwFtnFrm* pFtn )
2033*b1cdbd2cSJim Jagielski {
2034*b1cdbd2cSJim Jagielski if ( USHRT_MAX == rFtnArr.GetPos( (VoidPtr)pFtn ) )
2035*b1cdbd2cSJim Jagielski rFtnArr.Insert( (VoidPtr)pFtn, rFtnArr.Count() );
2036*b1cdbd2cSJim Jagielski }
2037*b1cdbd2cSJim Jagielski
2038*b1cdbd2cSJim Jagielski /// OD 03.04.2003 #108446# - add parameters <_bCollectOnlyPreviousFtns> and
2039*b1cdbd2cSJim Jagielski /// <_pRefFtnBossFrm> in order to control, if only footnotes, which are positioned
2040*b1cdbd2cSJim Jagielski /// before the given reference footnote boss frame have to be collected.
2041*b1cdbd2cSJim Jagielski /// Note: if parameter <_bCollectOnlyPreviousFtns> is true, then parameter
2042*b1cdbd2cSJim Jagielski /// <_pRefFtnBossFrm> have to be referenced to an object.
2043*b1cdbd2cSJim Jagielski /// Adjust parameter names.
_CollectFtns(const SwCntntFrm * _pRef,SwFtnFrm * _pFtn,SvPtrarr & _rFtnArr,sal_Bool _bCollectOnlyPreviousFtns,const SwFtnBossFrm * _pRefFtnBossFrm)2044*b1cdbd2cSJim Jagielski void SwFtnBossFrm::_CollectFtns( const SwCntntFrm* _pRef,
2045*b1cdbd2cSJim Jagielski SwFtnFrm* _pFtn,
2046*b1cdbd2cSJim Jagielski SvPtrarr& _rFtnArr,
2047*b1cdbd2cSJim Jagielski sal_Bool _bCollectOnlyPreviousFtns,
2048*b1cdbd2cSJim Jagielski const SwFtnBossFrm* _pRefFtnBossFrm)
2049*b1cdbd2cSJim Jagielski {
2050*b1cdbd2cSJim Jagielski // OD 03.04.2003 #108446# - assert, that no reference footnote boss frame
2051*b1cdbd2cSJim Jagielski // is set, in spite of the order, that only previous footnotes has to be
2052*b1cdbd2cSJim Jagielski // collected.
2053*b1cdbd2cSJim Jagielski ASSERT( !_bCollectOnlyPreviousFtns || _pRefFtnBossFrm,
2054*b1cdbd2cSJim Jagielski "<SwFtnBossFrm::_CollectFtns(..)> - No reference footnote boss frame for collecting only previous footnotes set.\nCrash will be caused!" );
2055*b1cdbd2cSJim Jagielski
2056*b1cdbd2cSJim Jagielski //Alle Fussnoten die von pRef referenziert werden nacheinander
2057*b1cdbd2cSJim Jagielski //einsammeln (Attribut fuer Attribut), zusammengefuegen
2058*b1cdbd2cSJim Jagielski //(der Inhalt zu einem Attribut kann ueber mehrere Seiten verteilt sein)
2059*b1cdbd2cSJim Jagielski //und ausschneiden.
2060*b1cdbd2cSJim Jagielski
2061*b1cdbd2cSJim Jagielski SvPtrarr aNotFtnArr( 20, 20 ); //Zur Robustheit werden hier die nicht
2062*b1cdbd2cSJim Jagielski //dazugehoerigen Fussnoten eingetragen.
2063*b1cdbd2cSJim Jagielski //Wenn eine Fussnote zweimal angefasst wird
2064*b1cdbd2cSJim Jagielski //ists vorbei! So kommt die Funktion auch
2065*b1cdbd2cSJim Jagielski //noch mit einem kaputten Layout
2066*b1cdbd2cSJim Jagielski //einigermassen (ohne Schleife und Absturz)
2067*b1cdbd2cSJim Jagielski //"klar".
2068*b1cdbd2cSJim Jagielski
2069*b1cdbd2cSJim Jagielski //Hier sollte keiner mit einer Follow-Ftn ankommen, es sei denn er hat
2070*b1cdbd2cSJim Jagielski //ernste Absichten (:-)); spricht er kommt mit einer Ftn an die vor der
2071*b1cdbd2cSJim Jagielski //ersten der Referenz liegt.
2072*b1cdbd2cSJim Jagielski ASSERT( !_pFtn->GetMaster() || _pFtn->GetRef() != _pRef, "FollowFtn moven?" );
2073*b1cdbd2cSJim Jagielski while ( _pFtn->GetMaster() )
2074*b1cdbd2cSJim Jagielski _pFtn = _pFtn->GetMaster();
2075*b1cdbd2cSJim Jagielski
2076*b1cdbd2cSJim Jagielski sal_Bool bFound = sal_False;
2077*b1cdbd2cSJim Jagielski
2078*b1cdbd2cSJim Jagielski while ( _pFtn )
2079*b1cdbd2cSJim Jagielski {
2080*b1cdbd2cSJim Jagielski //Erstmal die naechste Fussnote der Spalte/Seite suchen, damit wir nicht
2081*b1cdbd2cSJim Jagielski //nach dem Cut jeder Fussnote von vorn anfangen muessen.
2082*b1cdbd2cSJim Jagielski SwFtnFrm *pNxtFtn = _pFtn;
2083*b1cdbd2cSJim Jagielski while ( pNxtFtn->GetFollow() )
2084*b1cdbd2cSJim Jagielski pNxtFtn = pNxtFtn->GetFollow();
2085*b1cdbd2cSJim Jagielski pNxtFtn = (SwFtnFrm*)pNxtFtn->GetNext();
2086*b1cdbd2cSJim Jagielski
2087*b1cdbd2cSJim Jagielski if ( !pNxtFtn )
2088*b1cdbd2cSJim Jagielski {
2089*b1cdbd2cSJim Jagielski SwFtnBossFrm* pBoss = _pFtn->FindFtnBossFrm();
2090*b1cdbd2cSJim Jagielski SwPageFrm* pPage = pBoss->FindPageFrm();
2091*b1cdbd2cSJim Jagielski do
2092*b1cdbd2cSJim Jagielski {
2093*b1cdbd2cSJim Jagielski lcl_NextFtnBoss( pBoss, pPage, sal_False );
2094*b1cdbd2cSJim Jagielski if( pBoss )
2095*b1cdbd2cSJim Jagielski {
2096*b1cdbd2cSJim Jagielski SwLayoutFrm* pCont = pBoss->FindFtnCont();
2097*b1cdbd2cSJim Jagielski if( pCont )
2098*b1cdbd2cSJim Jagielski {
2099*b1cdbd2cSJim Jagielski pNxtFtn = (SwFtnFrm*)pCont->Lower();
2100*b1cdbd2cSJim Jagielski if( pNxtFtn )
2101*b1cdbd2cSJim Jagielski {
2102*b1cdbd2cSJim Jagielski while( pNxtFtn->GetMaster() )
2103*b1cdbd2cSJim Jagielski pNxtFtn = pNxtFtn->GetMaster();
2104*b1cdbd2cSJim Jagielski if( pNxtFtn == _pFtn )
2105*b1cdbd2cSJim Jagielski pNxtFtn = NULL;
2106*b1cdbd2cSJim Jagielski }
2107*b1cdbd2cSJim Jagielski }
2108*b1cdbd2cSJim Jagielski }
2109*b1cdbd2cSJim Jagielski } while( !pNxtFtn && pBoss );
2110*b1cdbd2cSJim Jagielski }
2111*b1cdbd2cSJim Jagielski else if( !pNxtFtn->GetAttr()->GetFtn().IsEndNote() )
2112*b1cdbd2cSJim Jagielski { ASSERT( !pNxtFtn->GetMaster(), "_CollectFtn: Master exspected" );
2113*b1cdbd2cSJim Jagielski while ( pNxtFtn->GetMaster() )
2114*b1cdbd2cSJim Jagielski pNxtFtn = pNxtFtn->GetMaster();
2115*b1cdbd2cSJim Jagielski }
2116*b1cdbd2cSJim Jagielski if ( pNxtFtn == _pFtn )
2117*b1cdbd2cSJim Jagielski {
2118*b1cdbd2cSJim Jagielski ASSERT( sal_False, "_CollectFtn: Devil's circle" );
2119*b1cdbd2cSJim Jagielski pNxtFtn = 0;
2120*b1cdbd2cSJim Jagielski }
2121*b1cdbd2cSJim Jagielski
2122*b1cdbd2cSJim Jagielski // OD 03.04.2003 #108446# - determine, if found footnote has to be collected.
2123*b1cdbd2cSJim Jagielski sal_Bool bCollectFoundFtn = sal_False;
2124*b1cdbd2cSJim Jagielski if ( _pFtn->GetRef() == _pRef && !_pFtn->GetAttr()->GetFtn().IsEndNote() )
2125*b1cdbd2cSJim Jagielski {
2126*b1cdbd2cSJim Jagielski if ( _bCollectOnlyPreviousFtns )
2127*b1cdbd2cSJim Jagielski {
2128*b1cdbd2cSJim Jagielski SwFtnBossFrm* pBossOfFoundFtn = _pFtn->FindFtnBossFrm( sal_True );
2129*b1cdbd2cSJim Jagielski ASSERT( pBossOfFoundFtn,
2130*b1cdbd2cSJim Jagielski "<SwFtnBossFrm::_CollectFtns(..)> - footnote boss frame of found footnote frame missing.\nWrong layout!" );
2131*b1cdbd2cSJim Jagielski if ( !pBossOfFoundFtn || // don't crash, if no footnote boss is found.
2132*b1cdbd2cSJim Jagielski pBossOfFoundFtn->IsBefore( _pRefFtnBossFrm )
2133*b1cdbd2cSJim Jagielski )
2134*b1cdbd2cSJim Jagielski {
2135*b1cdbd2cSJim Jagielski bCollectFoundFtn = sal_True;
2136*b1cdbd2cSJim Jagielski }
2137*b1cdbd2cSJim Jagielski }
2138*b1cdbd2cSJim Jagielski else
2139*b1cdbd2cSJim Jagielski {
2140*b1cdbd2cSJim Jagielski bCollectFoundFtn = sal_True;
2141*b1cdbd2cSJim Jagielski }
2142*b1cdbd2cSJim Jagielski }
2143*b1cdbd2cSJim Jagielski
2144*b1cdbd2cSJim Jagielski if ( bCollectFoundFtn )
2145*b1cdbd2cSJim Jagielski {
2146*b1cdbd2cSJim Jagielski ASSERT( !_pFtn->GetMaster(), "FollowFtn moven?" );
2147*b1cdbd2cSJim Jagielski SwFtnFrm *pNxt = _pFtn->GetFollow();
2148*b1cdbd2cSJim Jagielski while ( pNxt )
2149*b1cdbd2cSJim Jagielski {
2150*b1cdbd2cSJim Jagielski SwFrm *pCnt = pNxt->ContainsAny();
2151*b1cdbd2cSJim Jagielski if ( pCnt )
2152*b1cdbd2cSJim Jagielski { //Unterwegs wird der Follow zerstoert weil er leer wird!
2153*b1cdbd2cSJim Jagielski do
2154*b1cdbd2cSJim Jagielski { SwFrm *pNxtCnt = pCnt->GetNext();
2155*b1cdbd2cSJim Jagielski pCnt->Cut();
2156*b1cdbd2cSJim Jagielski pCnt->Paste( _pFtn );
2157*b1cdbd2cSJim Jagielski pCnt = pNxtCnt;
2158*b1cdbd2cSJim Jagielski } while ( pCnt );
2159*b1cdbd2cSJim Jagielski }
2160*b1cdbd2cSJim Jagielski else
2161*b1cdbd2cSJim Jagielski { ASSERT( !pNxt, "Fussnote ohne Inhalt?" );
2162*b1cdbd2cSJim Jagielski pNxt->Cut();
2163*b1cdbd2cSJim Jagielski delete pNxt;
2164*b1cdbd2cSJim Jagielski }
2165*b1cdbd2cSJim Jagielski pNxt = _pFtn->GetFollow();
2166*b1cdbd2cSJim Jagielski }
2167*b1cdbd2cSJim Jagielski _pFtn->Cut();
2168*b1cdbd2cSJim Jagielski FtnInArr( _rFtnArr, _pFtn );
2169*b1cdbd2cSJim Jagielski bFound = sal_True;
2170*b1cdbd2cSJim Jagielski }
2171*b1cdbd2cSJim Jagielski else
2172*b1cdbd2cSJim Jagielski {
2173*b1cdbd2cSJim Jagielski FtnInArr( aNotFtnArr, _pFtn );
2174*b1cdbd2cSJim Jagielski if( bFound )
2175*b1cdbd2cSJim Jagielski break;
2176*b1cdbd2cSJim Jagielski }
2177*b1cdbd2cSJim Jagielski if ( pNxtFtn &&
2178*b1cdbd2cSJim Jagielski USHRT_MAX == _rFtnArr.GetPos( (VoidPtr)pNxtFtn ) &&
2179*b1cdbd2cSJim Jagielski USHRT_MAX == aNotFtnArr.GetPos( (VoidPtr)pNxtFtn ) )
2180*b1cdbd2cSJim Jagielski _pFtn = pNxtFtn;
2181*b1cdbd2cSJim Jagielski else
2182*b1cdbd2cSJim Jagielski break;
2183*b1cdbd2cSJim Jagielski }
2184*b1cdbd2cSJim Jagielski }
2185*b1cdbd2cSJim Jagielski
2186*b1cdbd2cSJim Jagielski /*************************************************************************
2187*b1cdbd2cSJim Jagielski |*
2188*b1cdbd2cSJim Jagielski |* SwFtnBossFrm::_MoveFtns()
2189*b1cdbd2cSJim Jagielski |*
2190*b1cdbd2cSJim Jagielski |*************************************************************************/
2191*b1cdbd2cSJim Jagielski
2192*b1cdbd2cSJim Jagielski
_MoveFtns(SvPtrarr & rFtnArr,sal_Bool bCalc)2193*b1cdbd2cSJim Jagielski void SwFtnBossFrm::_MoveFtns( SvPtrarr &rFtnArr, sal_Bool bCalc )
2194*b1cdbd2cSJim Jagielski {
2195*b1cdbd2cSJim Jagielski //Alle Fussnoten die von pRef referenziert werden muessen von der
2196*b1cdbd2cSJim Jagielski //aktuellen Position, die sich durch die alte Spalte/Seite ergab, auf eine
2197*b1cdbd2cSJim Jagielski //neue Position, bestimmt durch die neue Spalte/Seite, gemoved werden.
2198*b1cdbd2cSJim Jagielski const sal_uInt16 nMyNum = FindPageFrm()->GetPhyPageNum();
2199*b1cdbd2cSJim Jagielski const sal_uInt16 nMyCol = lcl_ColumnNum( this );
2200*b1cdbd2cSJim Jagielski SWRECTFN( this )
2201*b1cdbd2cSJim Jagielski
2202*b1cdbd2cSJim Jagielski // --> OD 2004-06-11 #i21478# - keep last inserted footnote in order to
2203*b1cdbd2cSJim Jagielski // format the content of the following one.
2204*b1cdbd2cSJim Jagielski SwFtnFrm* pLastInsertedFtn = 0L;
2205*b1cdbd2cSJim Jagielski for ( sal_uInt16 i = 0; i < rFtnArr.Count(); ++i )
2206*b1cdbd2cSJim Jagielski {
2207*b1cdbd2cSJim Jagielski SwFtnFrm *pFtn = (SwFtnFrm*)rFtnArr[i];
2208*b1cdbd2cSJim Jagielski
2209*b1cdbd2cSJim Jagielski SwFtnBossFrm* pRefBoss = pFtn->GetRef()->FindFtnBossFrm( sal_True );
2210*b1cdbd2cSJim Jagielski if( pRefBoss != this )
2211*b1cdbd2cSJim Jagielski {
2212*b1cdbd2cSJim Jagielski const sal_uInt16 nRefNum = pRefBoss->FindPageFrm()->GetPhyPageNum();
2213*b1cdbd2cSJim Jagielski const sal_uInt16 nRefCol = lcl_ColumnNum( this );
2214*b1cdbd2cSJim Jagielski if( nRefNum < nMyNum || ( nRefNum == nMyNum && nRefCol <= nMyCol ) )
2215*b1cdbd2cSJim Jagielski pRefBoss = this;
2216*b1cdbd2cSJim Jagielski }
2217*b1cdbd2cSJim Jagielski pRefBoss->InsertFtn( pFtn );
2218*b1cdbd2cSJim Jagielski
2219*b1cdbd2cSJim Jagielski if ( pFtn->GetUpper() ) //Robust, z.B. bei doppelten
2220*b1cdbd2cSJim Jagielski {
2221*b1cdbd2cSJim Jagielski // Damit FtnFrms, die nicht auf die Seite passen, nicht fuer zuviel
2222*b1cdbd2cSJim Jagielski // Unruhe sorgen (Loop 66312), wird ihr Inhalt zunaechst zusammengestaucht.
2223*b1cdbd2cSJim Jagielski // Damit wird der FtnCont erst gegrowt, wenn der Inhalt formatiert wird
2224*b1cdbd2cSJim Jagielski // und feststellt, dass er auf die Seite passt.
2225*b1cdbd2cSJim Jagielski SwFrm *pCnt = pFtn->ContainsAny();
2226*b1cdbd2cSJim Jagielski while( pCnt )
2227*b1cdbd2cSJim Jagielski {
2228*b1cdbd2cSJim Jagielski if( pCnt->IsLayoutFrm() )
2229*b1cdbd2cSJim Jagielski {
2230*b1cdbd2cSJim Jagielski SwFrm* pTmp = ((SwLayoutFrm*)pCnt)->ContainsAny();
2231*b1cdbd2cSJim Jagielski while( pTmp && ((SwLayoutFrm*)pCnt)->IsAnLower( pTmp ) )
2232*b1cdbd2cSJim Jagielski {
2233*b1cdbd2cSJim Jagielski pTmp->Prepare( PREP_MOVEFTN );
2234*b1cdbd2cSJim Jagielski (pTmp->Frm().*fnRect->fnSetHeight)(0);
2235*b1cdbd2cSJim Jagielski (pTmp->Prt().*fnRect->fnSetHeight)(0);
2236*b1cdbd2cSJim Jagielski pTmp = pTmp->FindNext();
2237*b1cdbd2cSJim Jagielski }
2238*b1cdbd2cSJim Jagielski }
2239*b1cdbd2cSJim Jagielski else
2240*b1cdbd2cSJim Jagielski pCnt->Prepare( PREP_MOVEFTN );
2241*b1cdbd2cSJim Jagielski (pCnt->Frm().*fnRect->fnSetHeight)(0);
2242*b1cdbd2cSJim Jagielski (pCnt->Prt().*fnRect->fnSetHeight)(0);
2243*b1cdbd2cSJim Jagielski pCnt = pCnt->GetNext();
2244*b1cdbd2cSJim Jagielski }
2245*b1cdbd2cSJim Jagielski (pFtn->Frm().*fnRect->fnSetHeight)(0);
2246*b1cdbd2cSJim Jagielski (pFtn->Prt().*fnRect->fnSetHeight)(0);
2247*b1cdbd2cSJim Jagielski pFtn->Calc();
2248*b1cdbd2cSJim Jagielski pFtn->GetUpper()->Calc();
2249*b1cdbd2cSJim Jagielski
2250*b1cdbd2cSJim Jagielski if( bCalc )
2251*b1cdbd2cSJim Jagielski {
2252*b1cdbd2cSJim Jagielski SwTxtFtn *pAttr = pFtn->GetAttr();
2253*b1cdbd2cSJim Jagielski pCnt = pFtn->ContainsAny();
2254*b1cdbd2cSJim Jagielski sal_Bool bUnlock = !pFtn->IsBackMoveLocked();
2255*b1cdbd2cSJim Jagielski pFtn->LockBackMove();
2256*b1cdbd2cSJim Jagielski
2257*b1cdbd2cSJim Jagielski // --> OD 2005-05-18 #i49383# - disable unlock of position of
2258*b1cdbd2cSJim Jagielski // lower objects during format of footnote content.
2259*b1cdbd2cSJim Jagielski pFtn->KeepLockPosOfLowerObjs();
2260*b1cdbd2cSJim Jagielski // --> OD 2006-02-02 #i57914# - adjust fix #i49383#
2261*b1cdbd2cSJim Jagielski // no extra notify for footnote frame
2262*b1cdbd2cSJim Jagielski // SwLayNotify aFtnFrmNotitfy( pFtn );
2263*b1cdbd2cSJim Jagielski // <--
2264*b1cdbd2cSJim Jagielski
2265*b1cdbd2cSJim Jagielski while ( pCnt && pCnt->FindFtnFrm()->GetAttr() == pAttr )
2266*b1cdbd2cSJim Jagielski {
2267*b1cdbd2cSJim Jagielski pCnt->_InvalidatePos();
2268*b1cdbd2cSJim Jagielski pCnt->Calc();
2269*b1cdbd2cSJim Jagielski // --> OD 2005-05-17 #i49383# - format anchored objects
2270*b1cdbd2cSJim Jagielski if ( pCnt->IsTxtFrm() && pCnt->IsValid() )
2271*b1cdbd2cSJim Jagielski {
2272*b1cdbd2cSJim Jagielski if ( !SwObjectFormatter::FormatObjsAtFrm( *pCnt,
2273*b1cdbd2cSJim Jagielski *(pCnt->FindPageFrm()) ) )
2274*b1cdbd2cSJim Jagielski {
2275*b1cdbd2cSJim Jagielski // restart format with first content
2276*b1cdbd2cSJim Jagielski pCnt = pFtn->ContainsAny();
2277*b1cdbd2cSJim Jagielski continue;
2278*b1cdbd2cSJim Jagielski }
2279*b1cdbd2cSJim Jagielski }
2280*b1cdbd2cSJim Jagielski // <--
2281*b1cdbd2cSJim Jagielski if( pCnt->IsSctFrm() )
2282*b1cdbd2cSJim Jagielski { // Wenn es sich um einen nichtleeren Bereich handelt,
2283*b1cdbd2cSJim Jagielski // iterieren wir auch ueber seinen Inhalt
2284*b1cdbd2cSJim Jagielski SwFrm* pTmp = ((SwSectionFrm*)pCnt)->ContainsAny();
2285*b1cdbd2cSJim Jagielski if( pTmp )
2286*b1cdbd2cSJim Jagielski pCnt = pTmp;
2287*b1cdbd2cSJim Jagielski else
2288*b1cdbd2cSJim Jagielski pCnt = pCnt->FindNext();
2289*b1cdbd2cSJim Jagielski }
2290*b1cdbd2cSJim Jagielski else
2291*b1cdbd2cSJim Jagielski pCnt = pCnt->FindNext();
2292*b1cdbd2cSJim Jagielski }
2293*b1cdbd2cSJim Jagielski if( bUnlock )
2294*b1cdbd2cSJim Jagielski {
2295*b1cdbd2cSJim Jagielski pFtn->UnlockBackMove();
2296*b1cdbd2cSJim Jagielski if( !pFtn->ContainsAny() && !pFtn->IsColLocked() )
2297*b1cdbd2cSJim Jagielski {
2298*b1cdbd2cSJim Jagielski pFtn->Cut();
2299*b1cdbd2cSJim Jagielski delete pFtn;
2300*b1cdbd2cSJim Jagielski // --> OD 2004-06-10 #i21478#
2301*b1cdbd2cSJim Jagielski pFtn = 0L;
2302*b1cdbd2cSJim Jagielski }
2303*b1cdbd2cSJim Jagielski }
2304*b1cdbd2cSJim Jagielski // --> OD 2005-05-18 #i49383#
2305*b1cdbd2cSJim Jagielski if ( pFtn )
2306*b1cdbd2cSJim Jagielski {
2307*b1cdbd2cSJim Jagielski // --> OD 2006-02-02 #i57914# - adjust fix #i49383#
2308*b1cdbd2cSJim Jagielski // enable lock of lower object position before format of footnote frame.
2309*b1cdbd2cSJim Jagielski pFtn->UnlockPosOfLowerObjs();
2310*b1cdbd2cSJim Jagielski pFtn->Calc();
2311*b1cdbd2cSJim Jagielski // pFtn->UnlockPosOfLowerObjs();
2312*b1cdbd2cSJim Jagielski // <--
2313*b1cdbd2cSJim Jagielski }
2314*b1cdbd2cSJim Jagielski // --> OD 2006-02-02 #i57914# - adjust fix #i49383#
2315*b1cdbd2cSJim Jagielski // no extra notify for footnote frame
2316*b1cdbd2cSJim Jagielski // else
2317*b1cdbd2cSJim Jagielski // {
2318*b1cdbd2cSJim Jagielski // aFtnFrmNotitfy.FrmDeleted();
2319*b1cdbd2cSJim Jagielski // }
2320*b1cdbd2cSJim Jagielski // <--
2321*b1cdbd2cSJim Jagielski }
2322*b1cdbd2cSJim Jagielski }
2323*b1cdbd2cSJim Jagielski else
2324*b1cdbd2cSJim Jagielski { ASSERT( !pFtn->GetMaster() && !pFtn->GetFollow(),
2325*b1cdbd2cSJim Jagielski "DelFtn und Master/Follow?" );
2326*b1cdbd2cSJim Jagielski delete pFtn;
2327*b1cdbd2cSJim Jagielski // --> OD 2004-06-10 #i21478#
2328*b1cdbd2cSJim Jagielski pFtn = 0L;
2329*b1cdbd2cSJim Jagielski }
2330*b1cdbd2cSJim Jagielski
2331*b1cdbd2cSJim Jagielski // --> OD 2004-06-10 #i21478#
2332*b1cdbd2cSJim Jagielski if ( pFtn )
2333*b1cdbd2cSJim Jagielski {
2334*b1cdbd2cSJim Jagielski pLastInsertedFtn = pFtn;
2335*b1cdbd2cSJim Jagielski }
2336*b1cdbd2cSJim Jagielski }
2337*b1cdbd2cSJim Jagielski
2338*b1cdbd2cSJim Jagielski // --> OD 2004-06-10 #i21478# - format content of footnote following
2339*b1cdbd2cSJim Jagielski // the new inserted ones.
2340*b1cdbd2cSJim Jagielski if ( bCalc && pLastInsertedFtn )
2341*b1cdbd2cSJim Jagielski {
2342*b1cdbd2cSJim Jagielski if ( pLastInsertedFtn->GetNext() )
2343*b1cdbd2cSJim Jagielski {
2344*b1cdbd2cSJim Jagielski SwFtnFrm* pNextFtn = static_cast<SwFtnFrm*>(pLastInsertedFtn->GetNext());
2345*b1cdbd2cSJim Jagielski SwTxtFtn* pAttr = pNextFtn->GetAttr();
2346*b1cdbd2cSJim Jagielski SwFrm* pCnt = pNextFtn->ContainsAny();
2347*b1cdbd2cSJim Jagielski
2348*b1cdbd2cSJim Jagielski sal_Bool bUnlock = !pNextFtn->IsBackMoveLocked();
2349*b1cdbd2cSJim Jagielski pNextFtn->LockBackMove();
2350*b1cdbd2cSJim Jagielski // --> OD 2005-05-18 #i49383# - disable unlock of position of
2351*b1cdbd2cSJim Jagielski // lower objects during format of footnote content.
2352*b1cdbd2cSJim Jagielski pNextFtn->KeepLockPosOfLowerObjs();
2353*b1cdbd2cSJim Jagielski // --> OD 2006-02-02 #i57914# - adjust fix #i49383#
2354*b1cdbd2cSJim Jagielski // no extra notify for footnote frame
2355*b1cdbd2cSJim Jagielski // SwLayNotify aFtnFrmNotitfy( pNextFtn );
2356*b1cdbd2cSJim Jagielski // <--
2357*b1cdbd2cSJim Jagielski
2358*b1cdbd2cSJim Jagielski while ( pCnt && pCnt->FindFtnFrm()->GetAttr() == pAttr )
2359*b1cdbd2cSJim Jagielski {
2360*b1cdbd2cSJim Jagielski pCnt->_InvalidatePos();
2361*b1cdbd2cSJim Jagielski pCnt->Calc();
2362*b1cdbd2cSJim Jagielski // --> OD 2005-05-17 #i49383# - format anchored objects
2363*b1cdbd2cSJim Jagielski if ( pCnt->IsTxtFrm() && pCnt->IsValid() )
2364*b1cdbd2cSJim Jagielski {
2365*b1cdbd2cSJim Jagielski if ( !SwObjectFormatter::FormatObjsAtFrm( *pCnt,
2366*b1cdbd2cSJim Jagielski *(pCnt->FindPageFrm()) ) )
2367*b1cdbd2cSJim Jagielski {
2368*b1cdbd2cSJim Jagielski // restart format with first content
2369*b1cdbd2cSJim Jagielski pCnt = pNextFtn->ContainsAny();
2370*b1cdbd2cSJim Jagielski continue;
2371*b1cdbd2cSJim Jagielski }
2372*b1cdbd2cSJim Jagielski }
2373*b1cdbd2cSJim Jagielski // <--
2374*b1cdbd2cSJim Jagielski if( pCnt->IsSctFrm() )
2375*b1cdbd2cSJim Jagielski { // Wenn es sich um einen nichtleeren Bereich handelt,
2376*b1cdbd2cSJim Jagielski // iterieren wir auch ueber seinen Inhalt
2377*b1cdbd2cSJim Jagielski SwFrm* pTmp = ((SwSectionFrm*)pCnt)->ContainsAny();
2378*b1cdbd2cSJim Jagielski if( pTmp )
2379*b1cdbd2cSJim Jagielski pCnt = pTmp;
2380*b1cdbd2cSJim Jagielski else
2381*b1cdbd2cSJim Jagielski pCnt = pCnt->FindNext();
2382*b1cdbd2cSJim Jagielski }
2383*b1cdbd2cSJim Jagielski else
2384*b1cdbd2cSJim Jagielski pCnt = pCnt->FindNext();
2385*b1cdbd2cSJim Jagielski }
2386*b1cdbd2cSJim Jagielski if( bUnlock )
2387*b1cdbd2cSJim Jagielski {
2388*b1cdbd2cSJim Jagielski pNextFtn->UnlockBackMove();
2389*b1cdbd2cSJim Jagielski }
2390*b1cdbd2cSJim Jagielski // --> OD 2005-05-18 #i49383#
2391*b1cdbd2cSJim Jagielski // --> OD 2006-02-02 #i57914# - adjust fix #i49383#
2392*b1cdbd2cSJim Jagielski // enable lock of lower object position before format of footnote frame.
2393*b1cdbd2cSJim Jagielski pNextFtn->UnlockPosOfLowerObjs();
2394*b1cdbd2cSJim Jagielski pNextFtn->Calc();
2395*b1cdbd2cSJim Jagielski // pNextFtn->UnlockPosOfLowerObjs();
2396*b1cdbd2cSJim Jagielski // <--
2397*b1cdbd2cSJim Jagielski }
2398*b1cdbd2cSJim Jagielski }
2399*b1cdbd2cSJim Jagielski }
2400*b1cdbd2cSJim Jagielski
2401*b1cdbd2cSJim Jagielski /*************************************************************************
2402*b1cdbd2cSJim Jagielski |*
2403*b1cdbd2cSJim Jagielski |* SwFtnBossFrm::MoveFtns()
2404*b1cdbd2cSJim Jagielski |*
2405*b1cdbd2cSJim Jagielski |*************************************************************************/
2406*b1cdbd2cSJim Jagielski
2407*b1cdbd2cSJim Jagielski
MoveFtns(const SwCntntFrm * pSrc,SwCntntFrm * pDest,SwTxtFtn * pAttr)2408*b1cdbd2cSJim Jagielski void SwFtnBossFrm::MoveFtns( const SwCntntFrm *pSrc, SwCntntFrm *pDest,
2409*b1cdbd2cSJim Jagielski SwTxtFtn *pAttr )
2410*b1cdbd2cSJim Jagielski {
2411*b1cdbd2cSJim Jagielski if( ( GetFmt()->GetDoc()->GetFtnInfo().ePos == FTNPOS_CHAPTER &&
2412*b1cdbd2cSJim Jagielski (!GetUpper()->IsSctFrm() || !((SwSectionFrm*)GetUpper())->IsFtnAtEnd()))
2413*b1cdbd2cSJim Jagielski || pAttr->GetFtn().IsEndNote() )
2414*b1cdbd2cSJim Jagielski return;
2415*b1cdbd2cSJim Jagielski
2416*b1cdbd2cSJim Jagielski ASSERT( this == pSrc->FindFtnBossFrm( sal_True ),
2417*b1cdbd2cSJim Jagielski "SwPageFrm::MoveFtns: source frame isn't on that FtnBoss" );
2418*b1cdbd2cSJim Jagielski
2419*b1cdbd2cSJim Jagielski SwFtnFrm *pFtn = FindFirstFtn();
2420*b1cdbd2cSJim Jagielski if( pFtn )
2421*b1cdbd2cSJim Jagielski {
2422*b1cdbd2cSJim Jagielski ChangeFtnRef( pSrc, pAttr, pDest );
2423*b1cdbd2cSJim Jagielski SwFtnBossFrm *pDestBoss = pDest->FindFtnBossFrm( sal_True );
2424*b1cdbd2cSJim Jagielski ASSERT( pDestBoss, "+SwPageFrm::MoveFtns: no destination boss" );
2425*b1cdbd2cSJim Jagielski if( pDestBoss ) // robust
2426*b1cdbd2cSJim Jagielski {
2427*b1cdbd2cSJim Jagielski SvPtrarr aFtnArr( 5, 5 );
2428*b1cdbd2cSJim Jagielski pDestBoss->_CollectFtns( pDest, pFtn, aFtnArr );
2429*b1cdbd2cSJim Jagielski if ( aFtnArr.Count() )
2430*b1cdbd2cSJim Jagielski {
2431*b1cdbd2cSJim Jagielski pDestBoss->_MoveFtns( aFtnArr, sal_True );
2432*b1cdbd2cSJim Jagielski SwPageFrm* pSrcPage = FindPageFrm();
2433*b1cdbd2cSJim Jagielski SwPageFrm* pDestPage = pDestBoss->FindPageFrm();
2434*b1cdbd2cSJim Jagielski // Nur beim Seitenwechsel FtnNum Updaten
2435*b1cdbd2cSJim Jagielski if( pSrcPage != pDestPage )
2436*b1cdbd2cSJim Jagielski {
2437*b1cdbd2cSJim Jagielski if( pSrcPage->GetPhyPageNum() > pDestPage->GetPhyPageNum() )
2438*b1cdbd2cSJim Jagielski pSrcPage->UpdateFtnNum();
2439*b1cdbd2cSJim Jagielski pDestPage->UpdateFtnNum();
2440*b1cdbd2cSJim Jagielski }
2441*b1cdbd2cSJim Jagielski }
2442*b1cdbd2cSJim Jagielski }
2443*b1cdbd2cSJim Jagielski }
2444*b1cdbd2cSJim Jagielski }
2445*b1cdbd2cSJim Jagielski
2446*b1cdbd2cSJim Jagielski /*************************************************************************
2447*b1cdbd2cSJim Jagielski |*
2448*b1cdbd2cSJim Jagielski |* SwFtnBossFrm::RearrangeFtns()
2449*b1cdbd2cSJim Jagielski |*
2450*b1cdbd2cSJim Jagielski |*************************************************************************/
2451*b1cdbd2cSJim Jagielski
2452*b1cdbd2cSJim Jagielski
RearrangeFtns(const SwTwips nDeadLine,const sal_Bool bLock,const SwTxtFtn * pAttr)2453*b1cdbd2cSJim Jagielski void SwFtnBossFrm::RearrangeFtns( const SwTwips nDeadLine, const sal_Bool bLock,
2454*b1cdbd2cSJim Jagielski const SwTxtFtn *pAttr )
2455*b1cdbd2cSJim Jagielski {
2456*b1cdbd2cSJim Jagielski //Alle Fussnoten der Spalte/Seite dergestalt anformatieren,
2457*b1cdbd2cSJim Jagielski //dass sie ggf. die Spalte/Seite wechseln.
2458*b1cdbd2cSJim Jagielski
2459*b1cdbd2cSJim Jagielski SwSaveFtnHeight aSave( this, nDeadLine );
2460*b1cdbd2cSJim Jagielski SwFtnFrm *pFtn = FindFirstFtn();
2461*b1cdbd2cSJim Jagielski if( pFtn && pFtn->GetPrev() && bLock )
2462*b1cdbd2cSJim Jagielski {
2463*b1cdbd2cSJim Jagielski SwFtnFrm* pFirst = (SwFtnFrm*)pFtn->GetUpper()->Lower();
2464*b1cdbd2cSJim Jagielski SwFrm* pCntnt = pFirst->ContainsAny();
2465*b1cdbd2cSJim Jagielski if( pCntnt )
2466*b1cdbd2cSJim Jagielski {
2467*b1cdbd2cSJim Jagielski sal_Bool bUnlock = !pFirst->IsBackMoveLocked();
2468*b1cdbd2cSJim Jagielski pFirst->LockBackMove();
2469*b1cdbd2cSJim Jagielski pFirst->Calc();
2470*b1cdbd2cSJim Jagielski pCntnt->Calc();
2471*b1cdbd2cSJim Jagielski // --> OD 2005-05-17 #i49383# - format anchored objects
2472*b1cdbd2cSJim Jagielski if ( pCntnt->IsTxtFrm() && pCntnt->IsValid() )
2473*b1cdbd2cSJim Jagielski {
2474*b1cdbd2cSJim Jagielski SwObjectFormatter::FormatObjsAtFrm( *pCntnt,
2475*b1cdbd2cSJim Jagielski *(pCntnt->FindPageFrm()) );
2476*b1cdbd2cSJim Jagielski }
2477*b1cdbd2cSJim Jagielski // <--
2478*b1cdbd2cSJim Jagielski if( bUnlock )
2479*b1cdbd2cSJim Jagielski pFirst->UnlockBackMove();
2480*b1cdbd2cSJim Jagielski }
2481*b1cdbd2cSJim Jagielski pFtn = FindFirstFtn();
2482*b1cdbd2cSJim Jagielski }
2483*b1cdbd2cSJim Jagielski SwDoc *pDoc = GetFmt()->GetDoc();
2484*b1cdbd2cSJim Jagielski const sal_uLong nFtnPos = pAttr ? ::lcl_FindFtnPos( pDoc, pAttr ) : 0;
2485*b1cdbd2cSJim Jagielski SwFrm *pCnt = pFtn ? pFtn->ContainsAny() : 0;
2486*b1cdbd2cSJim Jagielski if ( pCnt )
2487*b1cdbd2cSJim Jagielski {
2488*b1cdbd2cSJim Jagielski sal_Bool bMore = sal_True;
2489*b1cdbd2cSJim Jagielski sal_Bool bStart = pAttr == 0; // wenn kein Attribut uebergeben wird, alle bearbeiten
2490*b1cdbd2cSJim Jagielski // --> OD 2005-05-18 #i49383# - disable unlock of position of
2491*b1cdbd2cSJim Jagielski // lower objects during format of footnote and footnote content.
2492*b1cdbd2cSJim Jagielski SwFtnFrm* pLastFtnFrm( 0L );
2493*b1cdbd2cSJim Jagielski // --> OD 2006-02-02 #i57914# - adjust fix #i49383#
2494*b1cdbd2cSJim Jagielski // no extra notify for footnote frame
2495*b1cdbd2cSJim Jagielski // SwLayNotify* pFtnFrmNotify( 0L );
2496*b1cdbd2cSJim Jagielski // footnote frame needs to be locked, if <bLock> isn't set.
2497*b1cdbd2cSJim Jagielski bool bUnlockLastFtnFrm( false );
2498*b1cdbd2cSJim Jagielski // <--
2499*b1cdbd2cSJim Jagielski do
2500*b1cdbd2cSJim Jagielski {
2501*b1cdbd2cSJim Jagielski if( !bStart )
2502*b1cdbd2cSJim Jagielski bStart = ::lcl_FindFtnPos( pDoc, pCnt->FindFtnFrm()->GetAttr() )
2503*b1cdbd2cSJim Jagielski == nFtnPos;
2504*b1cdbd2cSJim Jagielski if( bStart )
2505*b1cdbd2cSJim Jagielski {
2506*b1cdbd2cSJim Jagielski pCnt->_InvalidatePos();
2507*b1cdbd2cSJim Jagielski pCnt->_InvalidateSize();
2508*b1cdbd2cSJim Jagielski pCnt->Prepare( PREP_ADJUST_FRM );
2509*b1cdbd2cSJim Jagielski SwFtnFrm* pFtnFrm = pCnt->FindFtnFrm();
2510*b1cdbd2cSJim Jagielski // --> OD 2005-05-18 #i49383#
2511*b1cdbd2cSJim Jagielski if ( pFtnFrm != pLastFtnFrm )
2512*b1cdbd2cSJim Jagielski {
2513*b1cdbd2cSJim Jagielski if ( pLastFtnFrm )
2514*b1cdbd2cSJim Jagielski {
2515*b1cdbd2cSJim Jagielski if ( !bLock && bUnlockLastFtnFrm )
2516*b1cdbd2cSJim Jagielski {
2517*b1cdbd2cSJim Jagielski pLastFtnFrm->ColUnlock();
2518*b1cdbd2cSJim Jagielski }
2519*b1cdbd2cSJim Jagielski // --> OD 2006-02-02 #i57914# - adjust fix #i49383#
2520*b1cdbd2cSJim Jagielski // enable lock of lower object position before format of footnote frame.
2521*b1cdbd2cSJim Jagielski pLastFtnFrm->UnlockPosOfLowerObjs();
2522*b1cdbd2cSJim Jagielski pLastFtnFrm->Calc();
2523*b1cdbd2cSJim Jagielski // pLastFtnFrm->UnlockPosOfLowerObjs();
2524*b1cdbd2cSJim Jagielski // no extra notify for footnote frame
2525*b1cdbd2cSJim Jagielski // delete pFtnFrmNotify;
2526*b1cdbd2cSJim Jagielski // <--
2527*b1cdbd2cSJim Jagielski if ( !bLock && bUnlockLastFtnFrm &&
2528*b1cdbd2cSJim Jagielski !pLastFtnFrm->GetLower() &&
2529*b1cdbd2cSJim Jagielski !pLastFtnFrm->IsColLocked() &&
2530*b1cdbd2cSJim Jagielski !pLastFtnFrm->IsBackMoveLocked() )
2531*b1cdbd2cSJim Jagielski {
2532*b1cdbd2cSJim Jagielski pLastFtnFrm->Cut();
2533*b1cdbd2cSJim Jagielski delete pLastFtnFrm;
2534*b1cdbd2cSJim Jagielski pLastFtnFrm = 0L;
2535*b1cdbd2cSJim Jagielski }
2536*b1cdbd2cSJim Jagielski }
2537*b1cdbd2cSJim Jagielski if ( !bLock )
2538*b1cdbd2cSJim Jagielski {
2539*b1cdbd2cSJim Jagielski bUnlockLastFtnFrm = !pFtnFrm->IsColLocked();
2540*b1cdbd2cSJim Jagielski pFtnFrm->ColLock();
2541*b1cdbd2cSJim Jagielski }
2542*b1cdbd2cSJim Jagielski pFtnFrm->KeepLockPosOfLowerObjs();
2543*b1cdbd2cSJim Jagielski pLastFtnFrm = pFtnFrm;
2544*b1cdbd2cSJim Jagielski // --> OD 2006-02-02 #i57914# - adjust fix #i49383#
2545*b1cdbd2cSJim Jagielski // no extra notify for footnote frame
2546*b1cdbd2cSJim Jagielski // pFtnFrmNotify = new SwLayNotify( pLastFtnFrm );
2547*b1cdbd2cSJim Jagielski // <--
2548*b1cdbd2cSJim Jagielski }
2549*b1cdbd2cSJim Jagielski // <--
2550*b1cdbd2cSJim Jagielski // OD 30.10.2002 #97265# - invalidate position of footnote
2551*b1cdbd2cSJim Jagielski // frame, if it's below its footnote container, in order to
2552*b1cdbd2cSJim Jagielski // assure its correct position, probably calculating its previous
2553*b1cdbd2cSJim Jagielski // footnote frames.
2554*b1cdbd2cSJim Jagielski {
2555*b1cdbd2cSJim Jagielski SWRECTFN( this );
2556*b1cdbd2cSJim Jagielski SwFrm* aFtnContFrm = pFtnFrm->GetUpper();
2557*b1cdbd2cSJim Jagielski if ( (pFtnFrm->Frm().*fnRect->fnTopDist)((aFtnContFrm->*fnRect->fnGetPrtBottom)()) > 0 )
2558*b1cdbd2cSJim Jagielski {
2559*b1cdbd2cSJim Jagielski pFtnFrm->_InvalidatePos();
2560*b1cdbd2cSJim Jagielski }
2561*b1cdbd2cSJim Jagielski }
2562*b1cdbd2cSJim Jagielski if ( bLock )
2563*b1cdbd2cSJim Jagielski {
2564*b1cdbd2cSJim Jagielski sal_Bool bUnlock = !pFtnFrm->IsBackMoveLocked();
2565*b1cdbd2cSJim Jagielski pFtnFrm->LockBackMove();
2566*b1cdbd2cSJim Jagielski pFtnFrm->Calc();
2567*b1cdbd2cSJim Jagielski pCnt->Calc();
2568*b1cdbd2cSJim Jagielski // --> OD 2005-05-17 #i49383# - format anchored objects
2569*b1cdbd2cSJim Jagielski if ( pCnt->IsTxtFrm() && pCnt->IsValid() )
2570*b1cdbd2cSJim Jagielski {
2571*b1cdbd2cSJim Jagielski if ( !SwObjectFormatter::FormatObjsAtFrm( *pCnt,
2572*b1cdbd2cSJim Jagielski *(pCnt->FindPageFrm()) ) )
2573*b1cdbd2cSJim Jagielski {
2574*b1cdbd2cSJim Jagielski // restart format with first content
2575*b1cdbd2cSJim Jagielski pCnt = pFtn->ContainsAny();
2576*b1cdbd2cSJim Jagielski continue;
2577*b1cdbd2cSJim Jagielski }
2578*b1cdbd2cSJim Jagielski }
2579*b1cdbd2cSJim Jagielski // <--
2580*b1cdbd2cSJim Jagielski if( bUnlock )
2581*b1cdbd2cSJim Jagielski {
2582*b1cdbd2cSJim Jagielski pFtnFrm->UnlockBackMove();
2583*b1cdbd2cSJim Jagielski if( !pFtnFrm->Lower() &&
2584*b1cdbd2cSJim Jagielski !pFtnFrm->IsColLocked() )
2585*b1cdbd2cSJim Jagielski {
2586*b1cdbd2cSJim Jagielski // --> OD 2005-08-10 #i49383#
2587*b1cdbd2cSJim Jagielski ASSERT( pLastFtnFrm == pFtnFrm,
2588*b1cdbd2cSJim Jagielski "<SwFtnBossFrm::RearrangeFtns(..)> - <pLastFtnFrm> != <pFtnFrm>" );
2589*b1cdbd2cSJim Jagielski pLastFtnFrm = 0L;
2590*b1cdbd2cSJim Jagielski // --> OD 2006-02-02 #i57914# - adjust fix #i49383#
2591*b1cdbd2cSJim Jagielski // no extra notify for footnote frame
2592*b1cdbd2cSJim Jagielski // pFtnFrmNotify->FrmDeleted();
2593*b1cdbd2cSJim Jagielski // delete pFtnFrmNotify;
2594*b1cdbd2cSJim Jagielski // <--
2595*b1cdbd2cSJim Jagielski pFtnFrm->Cut();
2596*b1cdbd2cSJim Jagielski delete pFtnFrm;
2597*b1cdbd2cSJim Jagielski }
2598*b1cdbd2cSJim Jagielski }
2599*b1cdbd2cSJim Jagielski }
2600*b1cdbd2cSJim Jagielski else
2601*b1cdbd2cSJim Jagielski {
2602*b1cdbd2cSJim Jagielski pFtnFrm->Calc();
2603*b1cdbd2cSJim Jagielski pCnt->Calc();
2604*b1cdbd2cSJim Jagielski // --> OD 2005-05-17 #i49383# - format anchored objects
2605*b1cdbd2cSJim Jagielski if ( pCnt->IsTxtFrm() && pCnt->IsValid() )
2606*b1cdbd2cSJim Jagielski {
2607*b1cdbd2cSJim Jagielski if ( !SwObjectFormatter::FormatObjsAtFrm( *pCnt,
2608*b1cdbd2cSJim Jagielski *(pCnt->FindPageFrm()) ) )
2609*b1cdbd2cSJim Jagielski {
2610*b1cdbd2cSJim Jagielski // restart format with first content
2611*b1cdbd2cSJim Jagielski pCnt = pFtn->ContainsAny();
2612*b1cdbd2cSJim Jagielski continue;
2613*b1cdbd2cSJim Jagielski }
2614*b1cdbd2cSJim Jagielski }
2615*b1cdbd2cSJim Jagielski // <--
2616*b1cdbd2cSJim Jagielski }
2617*b1cdbd2cSJim Jagielski }
2618*b1cdbd2cSJim Jagielski SwSectionFrm *pDel = NULL;
2619*b1cdbd2cSJim Jagielski if( pCnt->IsSctFrm() )
2620*b1cdbd2cSJim Jagielski {
2621*b1cdbd2cSJim Jagielski SwFrm* pTmp = ((SwSectionFrm*)pCnt)->ContainsAny();
2622*b1cdbd2cSJim Jagielski if( pTmp )
2623*b1cdbd2cSJim Jagielski {
2624*b1cdbd2cSJim Jagielski pCnt = pTmp;
2625*b1cdbd2cSJim Jagielski continue;
2626*b1cdbd2cSJim Jagielski }
2627*b1cdbd2cSJim Jagielski pDel = (SwSectionFrm*)pCnt;
2628*b1cdbd2cSJim Jagielski }
2629*b1cdbd2cSJim Jagielski if ( pCnt->GetNext() )
2630*b1cdbd2cSJim Jagielski pCnt = pCnt->GetNext();
2631*b1cdbd2cSJim Jagielski else
2632*b1cdbd2cSJim Jagielski {
2633*b1cdbd2cSJim Jagielski pCnt = pCnt->FindNext();
2634*b1cdbd2cSJim Jagielski if ( pCnt )
2635*b1cdbd2cSJim Jagielski {
2636*b1cdbd2cSJim Jagielski SwFtnFrm* pFtnFrm = pCnt->FindFtnFrm();
2637*b1cdbd2cSJim Jagielski if( pFtnFrm->GetRef()->FindFtnBossFrm(
2638*b1cdbd2cSJim Jagielski pFtnFrm->GetAttr()->GetFtn().IsEndNote() ) != this )
2639*b1cdbd2cSJim Jagielski bMore = sal_False;
2640*b1cdbd2cSJim Jagielski }
2641*b1cdbd2cSJim Jagielski else
2642*b1cdbd2cSJim Jagielski bMore = sal_False;
2643*b1cdbd2cSJim Jagielski }
2644*b1cdbd2cSJim Jagielski if( pDel )
2645*b1cdbd2cSJim Jagielski {
2646*b1cdbd2cSJim Jagielski pDel->Cut();
2647*b1cdbd2cSJim Jagielski delete pDel;
2648*b1cdbd2cSJim Jagielski }
2649*b1cdbd2cSJim Jagielski if ( bMore )
2650*b1cdbd2cSJim Jagielski {
2651*b1cdbd2cSJim Jagielski //Nicht weiter als bis zur angegebenen Fussnote, falls eine
2652*b1cdbd2cSJim Jagielski //angegeben wurde.
2653*b1cdbd2cSJim Jagielski if ( pAttr &&
2654*b1cdbd2cSJim Jagielski (::lcl_FindFtnPos( pDoc,
2655*b1cdbd2cSJim Jagielski pCnt->FindFtnFrm()->GetAttr()) > nFtnPos ) )
2656*b1cdbd2cSJim Jagielski bMore = sal_False;
2657*b1cdbd2cSJim Jagielski }
2658*b1cdbd2cSJim Jagielski } while ( bMore );
2659*b1cdbd2cSJim Jagielski // --> OD 2005-05-18 #i49383#
2660*b1cdbd2cSJim Jagielski if ( pLastFtnFrm )
2661*b1cdbd2cSJim Jagielski {
2662*b1cdbd2cSJim Jagielski if ( !bLock && bUnlockLastFtnFrm )
2663*b1cdbd2cSJim Jagielski {
2664*b1cdbd2cSJim Jagielski pLastFtnFrm->ColUnlock();
2665*b1cdbd2cSJim Jagielski }
2666*b1cdbd2cSJim Jagielski // --> OD 2006-02-02 #i57914# - adjust fix #i49383#
2667*b1cdbd2cSJim Jagielski // enable lock of lower object position before format of footnote frame.
2668*b1cdbd2cSJim Jagielski pLastFtnFrm->UnlockPosOfLowerObjs();
2669*b1cdbd2cSJim Jagielski pLastFtnFrm->Calc();
2670*b1cdbd2cSJim Jagielski // pLastFtnFrm->UnlockPosOfLowerObjs();
2671*b1cdbd2cSJim Jagielski // no extra notify for footnote frame
2672*b1cdbd2cSJim Jagielski // delete pFtnFrmNotify;
2673*b1cdbd2cSJim Jagielski // <--
2674*b1cdbd2cSJim Jagielski if ( !bLock && bUnlockLastFtnFrm &&
2675*b1cdbd2cSJim Jagielski !pLastFtnFrm->GetLower() &&
2676*b1cdbd2cSJim Jagielski !pLastFtnFrm->IsColLocked() &&
2677*b1cdbd2cSJim Jagielski !pLastFtnFrm->IsBackMoveLocked() )
2678*b1cdbd2cSJim Jagielski {
2679*b1cdbd2cSJim Jagielski pLastFtnFrm->Cut();
2680*b1cdbd2cSJim Jagielski delete pLastFtnFrm;
2681*b1cdbd2cSJim Jagielski }
2682*b1cdbd2cSJim Jagielski }
2683*b1cdbd2cSJim Jagielski // <--
2684*b1cdbd2cSJim Jagielski }
2685*b1cdbd2cSJim Jagielski }
2686*b1cdbd2cSJim Jagielski
2687*b1cdbd2cSJim Jagielski /*************************************************************************
2688*b1cdbd2cSJim Jagielski |*
2689*b1cdbd2cSJim Jagielski |* SwPageFrm::UpdateFtnNum()
2690*b1cdbd2cSJim Jagielski |*
2691*b1cdbd2cSJim Jagielski |*************************************************************************/
2692*b1cdbd2cSJim Jagielski
UpdateFtnNum()2693*b1cdbd2cSJim Jagielski void SwPageFrm::UpdateFtnNum()
2694*b1cdbd2cSJim Jagielski {
2695*b1cdbd2cSJim Jagielski //Seitenweise Numerierung nur wenn es am Dokument so eingestellt ist.
2696*b1cdbd2cSJim Jagielski if ( GetFmt()->GetDoc()->GetFtnInfo().eNum != FTNNUM_PAGE )
2697*b1cdbd2cSJim Jagielski return;
2698*b1cdbd2cSJim Jagielski
2699*b1cdbd2cSJim Jagielski SwLayoutFrm* pBody = FindBodyCont();
2700*b1cdbd2cSJim Jagielski if( !pBody || !pBody->Lower() )
2701*b1cdbd2cSJim Jagielski return;
2702*b1cdbd2cSJim Jagielski
2703*b1cdbd2cSJim Jagielski SwCntntFrm* pCntnt = pBody->ContainsCntnt();
2704*b1cdbd2cSJim Jagielski sal_uInt16 nNum = 0;
2705*b1cdbd2cSJim Jagielski
2706*b1cdbd2cSJim Jagielski while( pCntnt && pCntnt->FindPageFrm() == this )
2707*b1cdbd2cSJim Jagielski {
2708*b1cdbd2cSJim Jagielski if( ((SwTxtFrm*)pCntnt)->HasFtn() )
2709*b1cdbd2cSJim Jagielski {
2710*b1cdbd2cSJim Jagielski SwFtnBossFrm* pBoss = pCntnt->FindFtnBossFrm( sal_True );
2711*b1cdbd2cSJim Jagielski if( pBoss->GetUpper()->IsSctFrm() &&
2712*b1cdbd2cSJim Jagielski ((SwSectionFrm*)pBoss->GetUpper())->IsOwnFtnNum() )
2713*b1cdbd2cSJim Jagielski pCntnt = ((SwSectionFrm*)pBoss->GetUpper())->FindLastCntnt();
2714*b1cdbd2cSJim Jagielski else
2715*b1cdbd2cSJim Jagielski {
2716*b1cdbd2cSJim Jagielski SwFtnFrm* pFtn = (SwFtnFrm*)pBoss->FindFirstFtn( pCntnt );
2717*b1cdbd2cSJim Jagielski while( pFtn )
2718*b1cdbd2cSJim Jagielski {
2719*b1cdbd2cSJim Jagielski SwTxtFtn* pTxtFtn = pFtn->GetAttr();
2720*b1cdbd2cSJim Jagielski if( !pTxtFtn->GetFtn().IsEndNote() &&
2721*b1cdbd2cSJim Jagielski !pTxtFtn->GetFtn().GetNumStr().Len() &&
2722*b1cdbd2cSJim Jagielski !pFtn->GetMaster() &&
2723*b1cdbd2cSJim Jagielski (pTxtFtn->GetFtn().GetNumber() != ++nNum) )
2724*b1cdbd2cSJim Jagielski pTxtFtn->SetNumber( nNum );
2725*b1cdbd2cSJim Jagielski if ( pFtn->GetNext() )
2726*b1cdbd2cSJim Jagielski pFtn = (SwFtnFrm*)pFtn->GetNext();
2727*b1cdbd2cSJim Jagielski else
2728*b1cdbd2cSJim Jagielski {
2729*b1cdbd2cSJim Jagielski SwFtnBossFrm* pTmpBoss = pFtn->FindFtnBossFrm( sal_True );
2730*b1cdbd2cSJim Jagielski SwPageFrm* pPage = pTmpBoss->FindPageFrm();
2731*b1cdbd2cSJim Jagielski pFtn = NULL;
2732*b1cdbd2cSJim Jagielski lcl_NextFtnBoss( pTmpBoss, pPage, sal_False );
2733*b1cdbd2cSJim Jagielski if( pTmpBoss )
2734*b1cdbd2cSJim Jagielski {
2735*b1cdbd2cSJim Jagielski SwFtnContFrm *pCont = pTmpBoss->FindNearestFtnCont();
2736*b1cdbd2cSJim Jagielski if ( pCont )
2737*b1cdbd2cSJim Jagielski pFtn = (SwFtnFrm*)pCont->Lower();
2738*b1cdbd2cSJim Jagielski }
2739*b1cdbd2cSJim Jagielski }
2740*b1cdbd2cSJim Jagielski if( pFtn && pFtn->GetRef() != pCntnt )
2741*b1cdbd2cSJim Jagielski pFtn = NULL;
2742*b1cdbd2cSJim Jagielski }
2743*b1cdbd2cSJim Jagielski }
2744*b1cdbd2cSJim Jagielski }
2745*b1cdbd2cSJim Jagielski pCntnt = pCntnt->FindNextCnt();
2746*b1cdbd2cSJim Jagielski }
2747*b1cdbd2cSJim Jagielski }
2748*b1cdbd2cSJim Jagielski
2749*b1cdbd2cSJim Jagielski /*************************************************************************
2750*b1cdbd2cSJim Jagielski |*
2751*b1cdbd2cSJim Jagielski |* SwFtnBossFrm::SetFtnDeadLine()
2752*b1cdbd2cSJim Jagielski |*
2753*b1cdbd2cSJim Jagielski |*************************************************************************/
2754*b1cdbd2cSJim Jagielski
SetFtnDeadLine(const SwTwips nDeadLine)2755*b1cdbd2cSJim Jagielski void SwFtnBossFrm::SetFtnDeadLine( const SwTwips nDeadLine )
2756*b1cdbd2cSJim Jagielski {
2757*b1cdbd2cSJim Jagielski SwFrm *pBody = FindBodyCont();
2758*b1cdbd2cSJim Jagielski pBody->Calc();
2759*b1cdbd2cSJim Jagielski
2760*b1cdbd2cSJim Jagielski SwFrm *pCont = FindFtnCont();
2761*b1cdbd2cSJim Jagielski const SwTwips nMax = nMaxFtnHeight;//Aktuelle MaxHeight nicht ueberschreiten.
2762*b1cdbd2cSJim Jagielski SWRECTFN( this )
2763*b1cdbd2cSJim Jagielski if ( pCont )
2764*b1cdbd2cSJim Jagielski {
2765*b1cdbd2cSJim Jagielski pCont->Calc();
2766*b1cdbd2cSJim Jagielski nMaxFtnHeight = -(pCont->Frm().*fnRect->fnBottomDist)( nDeadLine );
2767*b1cdbd2cSJim Jagielski }
2768*b1cdbd2cSJim Jagielski else
2769*b1cdbd2cSJim Jagielski nMaxFtnHeight = -(pBody->Frm().*fnRect->fnBottomDist)( nDeadLine );
2770*b1cdbd2cSJim Jagielski
2771*b1cdbd2cSJim Jagielski const ViewShell *pSh = getRootFrm() ? getRootFrm()->GetCurrShell() : 0;
2772*b1cdbd2cSJim Jagielski if( pSh && pSh->GetViewOptions()->getBrowseMode() )
2773*b1cdbd2cSJim Jagielski nMaxFtnHeight += pBody->Grow( LONG_MAX, sal_True );
2774*b1cdbd2cSJim Jagielski if ( IsInSct() )
2775*b1cdbd2cSJim Jagielski nMaxFtnHeight += FindSctFrm()->Grow( LONG_MAX, sal_True );
2776*b1cdbd2cSJim Jagielski
2777*b1cdbd2cSJim Jagielski if ( nMaxFtnHeight < 0 )
2778*b1cdbd2cSJim Jagielski nMaxFtnHeight = 0;
2779*b1cdbd2cSJim Jagielski if ( nMax != LONG_MAX && nMaxFtnHeight > nMax )
2780*b1cdbd2cSJim Jagielski nMaxFtnHeight = nMax;
2781*b1cdbd2cSJim Jagielski }
2782*b1cdbd2cSJim Jagielski
2783*b1cdbd2cSJim Jagielski /*************************************************************************
2784*b1cdbd2cSJim Jagielski |*
2785*b1cdbd2cSJim Jagielski |* SwFtnBossFrm::GetVarSpace()
2786*b1cdbd2cSJim Jagielski |*
2787*b1cdbd2cSJim Jagielski |*************************************************************************/
GetVarSpace() const2788*b1cdbd2cSJim Jagielski SwTwips SwFtnBossFrm::GetVarSpace() const
2789*b1cdbd2cSJim Jagielski {
2790*b1cdbd2cSJim Jagielski //Fuer Seiten soll ein Wert von 20% der Seitenhoehe nicht unterschritten
2791*b1cdbd2cSJim Jagielski //werden (->AMA: was macht MS da?)
2792*b1cdbd2cSJim Jagielski //->AMA: Was ist da fuer Bereiche sinnvoll (und kompatibel zu MS ;-)?
2793*b1cdbd2cSJim Jagielski //AMA: MS kennt scheinbar kein Begrenzung, die Fussnoten nehmen durchaus
2794*b1cdbd2cSJim Jagielski // die ganze Seite/Spalte ein.
2795*b1cdbd2cSJim Jagielski
2796*b1cdbd2cSJim Jagielski const SwPageFrm* pPg = FindPageFrm();
2797*b1cdbd2cSJim Jagielski ASSERT( pPg || IsInSct(), "Footnote lost page" );
2798*b1cdbd2cSJim Jagielski
2799*b1cdbd2cSJim Jagielski const SwFrm *pBody = FindBodyCont();
2800*b1cdbd2cSJim Jagielski SwTwips nRet;
2801*b1cdbd2cSJim Jagielski if( pBody )
2802*b1cdbd2cSJim Jagielski {
2803*b1cdbd2cSJim Jagielski SWRECTFN( this )
2804*b1cdbd2cSJim Jagielski if( IsInSct() )
2805*b1cdbd2cSJim Jagielski {
2806*b1cdbd2cSJim Jagielski nRet = 0;
2807*b1cdbd2cSJim Jagielski SwTwips nTmp = (*fnRect->fnYDiff)( (pBody->*fnRect->fnGetPrtTop)(),
2808*b1cdbd2cSJim Jagielski (Frm().*fnRect->fnGetTop)() );
2809*b1cdbd2cSJim Jagielski const SwSectionFrm* pSect = FindSctFrm();
2810*b1cdbd2cSJim Jagielski // Endnotes in a ftncontainer causes a deadline:
2811*b1cdbd2cSJim Jagielski // the bottom of the last contentfrm
2812*b1cdbd2cSJim Jagielski if( pSect->IsEndnAtEnd() ) // endnotes allowed?
2813*b1cdbd2cSJim Jagielski {
2814*b1cdbd2cSJim Jagielski ASSERT( !Lower() || !Lower()->GetNext() || Lower()->GetNext()->
2815*b1cdbd2cSJim Jagielski IsFtnContFrm(), "FtnContainer exspected" );
2816*b1cdbd2cSJim Jagielski const SwFtnContFrm* pCont = Lower() ?
2817*b1cdbd2cSJim Jagielski (SwFtnContFrm*)Lower()->GetNext() : 0;
2818*b1cdbd2cSJim Jagielski if( pCont )
2819*b1cdbd2cSJim Jagielski {
2820*b1cdbd2cSJim Jagielski SwFtnFrm* pFtn = (SwFtnFrm*)pCont->Lower();
2821*b1cdbd2cSJim Jagielski while( pFtn)
2822*b1cdbd2cSJim Jagielski {
2823*b1cdbd2cSJim Jagielski if( pFtn->GetAttr()->GetFtn().IsEndNote() )
2824*b1cdbd2cSJim Jagielski { // endnote found
2825*b1cdbd2cSJim Jagielski SwFrm* pFrm = ((SwLayoutFrm*)Lower())->Lower();
2826*b1cdbd2cSJim Jagielski if( pFrm )
2827*b1cdbd2cSJim Jagielski {
2828*b1cdbd2cSJim Jagielski while( pFrm->GetNext() )
2829*b1cdbd2cSJim Jagielski pFrm = pFrm->GetNext(); // last cntntfrm
2830*b1cdbd2cSJim Jagielski nTmp += (*fnRect->fnYDiff)(
2831*b1cdbd2cSJim Jagielski (Frm().*fnRect->fnGetTop)(),
2832*b1cdbd2cSJim Jagielski (pFrm->Frm().*fnRect->fnGetBottom)() );
2833*b1cdbd2cSJim Jagielski }
2834*b1cdbd2cSJim Jagielski break;
2835*b1cdbd2cSJim Jagielski }
2836*b1cdbd2cSJim Jagielski pFtn = (SwFtnFrm*)pFtn->GetNext();
2837*b1cdbd2cSJim Jagielski }
2838*b1cdbd2cSJim Jagielski }
2839*b1cdbd2cSJim Jagielski }
2840*b1cdbd2cSJim Jagielski if( nTmp < nRet )
2841*b1cdbd2cSJim Jagielski nRet = nTmp;
2842*b1cdbd2cSJim Jagielski }
2843*b1cdbd2cSJim Jagielski else
2844*b1cdbd2cSJim Jagielski nRet = - (pPg->Prt().*fnRect->fnGetHeight)()/5;
2845*b1cdbd2cSJim Jagielski nRet += (pBody->Frm().*fnRect->fnGetHeight)();
2846*b1cdbd2cSJim Jagielski if( nRet < 0 )
2847*b1cdbd2cSJim Jagielski nRet = 0;
2848*b1cdbd2cSJim Jagielski }
2849*b1cdbd2cSJim Jagielski else
2850*b1cdbd2cSJim Jagielski nRet = 0;
2851*b1cdbd2cSJim Jagielski if ( IsPageFrm() )
2852*b1cdbd2cSJim Jagielski {
2853*b1cdbd2cSJim Jagielski const ViewShell *pSh = getRootFrm() ? getRootFrm()->GetCurrShell() : 0;
2854*b1cdbd2cSJim Jagielski if( pSh && pSh->GetViewOptions()->getBrowseMode() )
2855*b1cdbd2cSJim Jagielski nRet += BROWSE_HEIGHT - Frm().Height();
2856*b1cdbd2cSJim Jagielski }
2857*b1cdbd2cSJim Jagielski return nRet;
2858*b1cdbd2cSJim Jagielski }
2859*b1cdbd2cSJim Jagielski
2860*b1cdbd2cSJim Jagielski /*************************************************************************
2861*b1cdbd2cSJim Jagielski |*
2862*b1cdbd2cSJim Jagielski |* SwFtnBossFrm::NeighbourhoodAdjustment(SwFrm*)
2863*b1cdbd2cSJim Jagielski |*
2864*b1cdbd2cSJim Jagielski |* gibt Auskunft, ob die Groessenveraenderung von pFrm von AdjustNeighbourhood(...)
2865*b1cdbd2cSJim Jagielski |* oder von Grow/Shrink(..) verarbeitet werden sollte.
2866*b1cdbd2cSJim Jagielski |* Bei einem PageFrm oder in Spalten direkt unterhalb der Seite muss AdjustNei..
2867*b1cdbd2cSJim Jagielski |* gerufen werden, in Rahmenspalten Grow/Shrink.
2868*b1cdbd2cSJim Jagielski |* Spannend sind die spaltigen Bereiche: Wenn es in der Spalte einen Fussnotencontainer
2869*b1cdbd2cSJim Jagielski |* gibt und die Fussnoten nicht vom Bereich eingesammelt werden, ist ein Adjust..,
2870*b1cdbd2cSJim Jagielski |* ansonsten ein Grow/Shrink notwendig.
2871*b1cdbd2cSJim Jagielski |*
2872*b1cdbd2cSJim Jagielski |*************************************************************************/
2873*b1cdbd2cSJim Jagielski
_NeighbourhoodAdjustment(const SwFrm *) const2874*b1cdbd2cSJim Jagielski sal_uInt8 SwFtnBossFrm::_NeighbourhoodAdjustment( const SwFrm* ) const
2875*b1cdbd2cSJim Jagielski {
2876*b1cdbd2cSJim Jagielski sal_uInt8 nRet = NA_ONLY_ADJUST;
2877*b1cdbd2cSJim Jagielski if( GetUpper() && !GetUpper()->IsPageBodyFrm() )
2878*b1cdbd2cSJim Jagielski {
2879*b1cdbd2cSJim Jagielski // Spaltige Rahmen erfordern Grow/Shrink
2880*b1cdbd2cSJim Jagielski if( GetUpper()->IsFlyFrm() )
2881*b1cdbd2cSJim Jagielski nRet = NA_GROW_SHRINK;
2882*b1cdbd2cSJim Jagielski else
2883*b1cdbd2cSJim Jagielski {
2884*b1cdbd2cSJim Jagielski ASSERT( GetUpper()->IsSctFrm(), "NeighbourhoodAdjustment: Unexspected Upper" );
2885*b1cdbd2cSJim Jagielski if( !GetNext() && !GetPrev() )
2886*b1cdbd2cSJim Jagielski nRet = NA_GROW_ADJUST; // section with a single column (FtnAtEnd)
2887*b1cdbd2cSJim Jagielski else
2888*b1cdbd2cSJim Jagielski {
2889*b1cdbd2cSJim Jagielski const SwFrm* pTmp = Lower();
2890*b1cdbd2cSJim Jagielski ASSERT( pTmp, "NeighbourhoodAdjustment: Missing Lower()" );
2891*b1cdbd2cSJim Jagielski if( !pTmp->GetNext() )
2892*b1cdbd2cSJim Jagielski nRet = NA_GROW_SHRINK;
2893*b1cdbd2cSJim Jagielski else if( !GetUpper()->IsColLocked() )
2894*b1cdbd2cSJim Jagielski nRet = NA_ADJUST_GROW;
2895*b1cdbd2cSJim Jagielski ASSERT( !pTmp->GetNext() || pTmp->GetNext()->IsFtnContFrm(),
2896*b1cdbd2cSJim Jagielski "NeighbourhoodAdjustment: Who's that guy?" );
2897*b1cdbd2cSJim Jagielski }
2898*b1cdbd2cSJim Jagielski }
2899*b1cdbd2cSJim Jagielski }
2900*b1cdbd2cSJim Jagielski return nRet;
2901*b1cdbd2cSJim Jagielski }
2902*b1cdbd2cSJim Jagielski
2903*b1cdbd2cSJim Jagielski /*************************************************************************
2904*b1cdbd2cSJim Jagielski |*
2905*b1cdbd2cSJim Jagielski |* SwPageFrm::SetColMaxFtnHeight()
2906*b1cdbd2cSJim Jagielski |*
2907*b1cdbd2cSJim Jagielski |*************************************************************************/
SetColMaxFtnHeight()2908*b1cdbd2cSJim Jagielski void SwPageFrm::SetColMaxFtnHeight()
2909*b1cdbd2cSJim Jagielski {
2910*b1cdbd2cSJim Jagielski SwLayoutFrm *pBody = FindBodyCont();
2911*b1cdbd2cSJim Jagielski if( pBody && pBody->Lower() && pBody->Lower()->IsColumnFrm() )
2912*b1cdbd2cSJim Jagielski {
2913*b1cdbd2cSJim Jagielski SwColumnFrm* pCol = (SwColumnFrm*)pBody->Lower();
2914*b1cdbd2cSJim Jagielski do
2915*b1cdbd2cSJim Jagielski {
2916*b1cdbd2cSJim Jagielski pCol->SetMaxFtnHeight( GetMaxFtnHeight() );
2917*b1cdbd2cSJim Jagielski pCol = (SwColumnFrm*)pCol->GetNext();
2918*b1cdbd2cSJim Jagielski } while ( pCol );
2919*b1cdbd2cSJim Jagielski }
2920*b1cdbd2cSJim Jagielski }
2921*b1cdbd2cSJim Jagielski
2922*b1cdbd2cSJim Jagielski /*************************************************************************
2923*b1cdbd2cSJim Jagielski |*
2924*b1cdbd2cSJim Jagielski |* SwLayoutFrm::MoveLowerFtns
2925*b1cdbd2cSJim Jagielski |*
2926*b1cdbd2cSJim Jagielski |*************************************************************************/
2927*b1cdbd2cSJim Jagielski
2928*b1cdbd2cSJim Jagielski
MoveLowerFtns(SwCntntFrm * pStart,SwFtnBossFrm * pOldBoss,SwFtnBossFrm * pNewBoss,const sal_Bool bFtnNums)2929*b1cdbd2cSJim Jagielski sal_Bool SwLayoutFrm::MoveLowerFtns( SwCntntFrm *pStart, SwFtnBossFrm *pOldBoss,
2930*b1cdbd2cSJim Jagielski SwFtnBossFrm *pNewBoss, const sal_Bool bFtnNums )
2931*b1cdbd2cSJim Jagielski {
2932*b1cdbd2cSJim Jagielski SwDoc *pDoc = GetFmt()->GetDoc();
2933*b1cdbd2cSJim Jagielski if ( !pDoc->GetFtnIdxs().Count() )
2934*b1cdbd2cSJim Jagielski return sal_False;
2935*b1cdbd2cSJim Jagielski if( pDoc->GetFtnInfo().ePos == FTNPOS_CHAPTER &&
2936*b1cdbd2cSJim Jagielski ( !IsInSct() || !FindSctFrm()->IsFtnAtEnd() ) )
2937*b1cdbd2cSJim Jagielski return sal_True;
2938*b1cdbd2cSJim Jagielski
2939*b1cdbd2cSJim Jagielski if ( !pNewBoss )
2940*b1cdbd2cSJim Jagielski pNewBoss = FindFtnBossFrm( sal_True );
2941*b1cdbd2cSJim Jagielski if ( pNewBoss == pOldBoss )
2942*b1cdbd2cSJim Jagielski return sal_False;
2943*b1cdbd2cSJim Jagielski
2944*b1cdbd2cSJim Jagielski sal_Bool bMoved = sal_False;
2945*b1cdbd2cSJim Jagielski if( !pStart )
2946*b1cdbd2cSJim Jagielski pStart = ContainsCntnt();
2947*b1cdbd2cSJim Jagielski
2948*b1cdbd2cSJim Jagielski SvPtrarr aFtnArr( 5, 5 );
2949*b1cdbd2cSJim Jagielski
2950*b1cdbd2cSJim Jagielski while ( IsAnLower( pStart ) )
2951*b1cdbd2cSJim Jagielski {
2952*b1cdbd2cSJim Jagielski if ( ((SwTxtFrm*)pStart)->HasFtn() )
2953*b1cdbd2cSJim Jagielski {
2954*b1cdbd2cSJim Jagielski // OD 03.04.2003 #108446# - To avoid unnecessary moves of footnotes
2955*b1cdbd2cSJim Jagielski // use new parameter <_bCollectOnlyPreviousFtn> (4th parameter of
2956*b1cdbd2cSJim Jagielski // method <SwFtnBossFrm::CollectFtn(..)>) to control, that only
2957*b1cdbd2cSJim Jagielski // footnotes have to be collected, that are positioned before the
2958*b1cdbd2cSJim Jagielski // new dedicated footnote boss frame.
2959*b1cdbd2cSJim Jagielski pNewBoss->CollectFtns( pStart, pOldBoss, aFtnArr, sal_True );
2960*b1cdbd2cSJim Jagielski }
2961*b1cdbd2cSJim Jagielski pStart = pStart->GetNextCntntFrm();
2962*b1cdbd2cSJim Jagielski }
2963*b1cdbd2cSJim Jagielski
2964*b1cdbd2cSJim Jagielski ASSERT( pOldBoss->IsInSct() == pNewBoss->IsInSct(),
2965*b1cdbd2cSJim Jagielski "MoveLowerFtns: Section confusion" );
2966*b1cdbd2cSJim Jagielski SvPtrarr *pFtnArr;
2967*b1cdbd2cSJim Jagielski SwLayoutFrm* pNewChief = 0;
2968*b1cdbd2cSJim Jagielski SwLayoutFrm* pOldChief = 0;
2969*b1cdbd2cSJim Jagielski if( pStart && pOldBoss->IsInSct() && ( pOldChief = pOldBoss->FindSctFrm() )
2970*b1cdbd2cSJim Jagielski != ( pNewChief = pNewBoss->FindSctFrm() ) )
2971*b1cdbd2cSJim Jagielski {
2972*b1cdbd2cSJim Jagielski pFtnArr = new SvPtrarr( 5, 5 );
2973*b1cdbd2cSJim Jagielski pOldChief = pOldBoss->FindFtnBossFrm( sal_True );
2974*b1cdbd2cSJim Jagielski pNewChief = pNewBoss->FindFtnBossFrm( sal_True );
2975*b1cdbd2cSJim Jagielski while( pOldChief->IsAnLower( pStart ) )
2976*b1cdbd2cSJim Jagielski {
2977*b1cdbd2cSJim Jagielski if ( ((SwTxtFrm*)pStart)->HasFtn() )
2978*b1cdbd2cSJim Jagielski ((SwFtnBossFrm*)pNewChief)->CollectFtns( pStart,
2979*b1cdbd2cSJim Jagielski (SwFtnBossFrm*)pOldBoss, *pFtnArr );
2980*b1cdbd2cSJim Jagielski pStart = pStart->GetNextCntntFrm();
2981*b1cdbd2cSJim Jagielski }
2982*b1cdbd2cSJim Jagielski if( !pFtnArr->Count() )
2983*b1cdbd2cSJim Jagielski {
2984*b1cdbd2cSJim Jagielski delete pFtnArr;
2985*b1cdbd2cSJim Jagielski pFtnArr = NULL;
2986*b1cdbd2cSJim Jagielski }
2987*b1cdbd2cSJim Jagielski }
2988*b1cdbd2cSJim Jagielski else
2989*b1cdbd2cSJim Jagielski pFtnArr = NULL;
2990*b1cdbd2cSJim Jagielski
2991*b1cdbd2cSJim Jagielski if ( aFtnArr.Count() || pFtnArr )
2992*b1cdbd2cSJim Jagielski {
2993*b1cdbd2cSJim Jagielski if( aFtnArr.Count() )
2994*b1cdbd2cSJim Jagielski pNewBoss->_MoveFtns( aFtnArr, sal_True );
2995*b1cdbd2cSJim Jagielski if( pFtnArr )
2996*b1cdbd2cSJim Jagielski {
2997*b1cdbd2cSJim Jagielski ((SwFtnBossFrm*)pNewChief)->_MoveFtns( *pFtnArr, sal_True );
2998*b1cdbd2cSJim Jagielski delete pFtnArr;
2999*b1cdbd2cSJim Jagielski }
3000*b1cdbd2cSJim Jagielski bMoved = sal_True;
3001*b1cdbd2cSJim Jagielski
3002*b1cdbd2cSJim Jagielski // Nur bei einem Seitenwechsel muss die FtnNum neu berechnet werden
3003*b1cdbd2cSJim Jagielski if ( bFtnNums )
3004*b1cdbd2cSJim Jagielski {
3005*b1cdbd2cSJim Jagielski SwPageFrm* pOldPage = pOldBoss->FindPageFrm();
3006*b1cdbd2cSJim Jagielski SwPageFrm* pNewPage =pNewBoss->FindPageFrm();
3007*b1cdbd2cSJim Jagielski if( pOldPage != pNewPage )
3008*b1cdbd2cSJim Jagielski {
3009*b1cdbd2cSJim Jagielski pOldPage->UpdateFtnNum();
3010*b1cdbd2cSJim Jagielski pNewPage->UpdateFtnNum();
3011*b1cdbd2cSJim Jagielski }
3012*b1cdbd2cSJim Jagielski }
3013*b1cdbd2cSJim Jagielski }
3014*b1cdbd2cSJim Jagielski return bMoved;
3015*b1cdbd2cSJim Jagielski }
3016*b1cdbd2cSJim Jagielski
3017*b1cdbd2cSJim Jagielski /*************************************************************************
3018*b1cdbd2cSJim Jagielski |*
3019*b1cdbd2cSJim Jagielski |* SwLayoutFrm::MoveFtnCntFwd()
3020*b1cdbd2cSJim Jagielski |*
3021*b1cdbd2cSJim Jagielski |*************************************************************************/
3022*b1cdbd2cSJim Jagielski
3023*b1cdbd2cSJim Jagielski
MoveFtnCntFwd(sal_Bool bMakePage,SwFtnBossFrm * pOldBoss)3024*b1cdbd2cSJim Jagielski sal_Bool SwCntntFrm::MoveFtnCntFwd( sal_Bool bMakePage, SwFtnBossFrm *pOldBoss )
3025*b1cdbd2cSJim Jagielski {
3026*b1cdbd2cSJim Jagielski ASSERT( IsInFtn(), "Keine Ftn." );
3027*b1cdbd2cSJim Jagielski SwLayoutFrm *pFtn = FindFtnFrm();
3028*b1cdbd2cSJim Jagielski
3029*b1cdbd2cSJim Jagielski // The first paragraph in the first footnote in the first column in the
3030*b1cdbd2cSJim Jagielski // sectionfrm at the top of the page has not to move forward, if the
3031*b1cdbd2cSJim Jagielski // columnbody is empty.
3032*b1cdbd2cSJim Jagielski if( pOldBoss->IsInSct() && !pOldBoss->GetIndPrev() && !GetIndPrev() &&
3033*b1cdbd2cSJim Jagielski !pFtn->GetPrev() )
3034*b1cdbd2cSJim Jagielski {
3035*b1cdbd2cSJim Jagielski SwLayoutFrm* pBody = pOldBoss->FindBodyCont();
3036*b1cdbd2cSJim Jagielski if( !pBody || !pBody->Lower() )
3037*b1cdbd2cSJim Jagielski return sal_True;
3038*b1cdbd2cSJim Jagielski }
3039*b1cdbd2cSJim Jagielski
3040*b1cdbd2cSJim Jagielski //fix(9538): Wenn die Ftn noch Nachbarn hinter sich hat, so muessen
3041*b1cdbd2cSJim Jagielski //diese ersteinmal verschwinden.
3042*b1cdbd2cSJim Jagielski SwLayoutFrm *pNxt = (SwLayoutFrm*)pFtn->GetNext();
3043*b1cdbd2cSJim Jagielski SwLayoutFrm *pLst = 0;
3044*b1cdbd2cSJim Jagielski while ( pNxt )
3045*b1cdbd2cSJim Jagielski {
3046*b1cdbd2cSJim Jagielski while ( pNxt->GetNext() )
3047*b1cdbd2cSJim Jagielski pNxt = (SwLayoutFrm*)pNxt->GetNext();
3048*b1cdbd2cSJim Jagielski if ( pNxt == pLst )
3049*b1cdbd2cSJim Jagielski pNxt = 0;
3050*b1cdbd2cSJim Jagielski else
3051*b1cdbd2cSJim Jagielski { pLst = pNxt;
3052*b1cdbd2cSJim Jagielski SwCntntFrm *pCnt = pNxt->ContainsCntnt();
3053*b1cdbd2cSJim Jagielski if( pCnt )
3054*b1cdbd2cSJim Jagielski pCnt->MoveFtnCntFwd( sal_True, pOldBoss );
3055*b1cdbd2cSJim Jagielski pNxt = (SwLayoutFrm*)pFtn->GetNext();
3056*b1cdbd2cSJim Jagielski }
3057*b1cdbd2cSJim Jagielski }
3058*b1cdbd2cSJim Jagielski
3059*b1cdbd2cSJim Jagielski sal_Bool bSamePage = sal_True;
3060*b1cdbd2cSJim Jagielski SwLayoutFrm *pNewUpper =
3061*b1cdbd2cSJim Jagielski GetLeaf( bMakePage ? MAKEPAGE_INSERT : MAKEPAGE_NONE, sal_True );
3062*b1cdbd2cSJim Jagielski
3063*b1cdbd2cSJim Jagielski if ( pNewUpper )
3064*b1cdbd2cSJim Jagielski {
3065*b1cdbd2cSJim Jagielski sal_Bool bSameBoss = sal_True;
3066*b1cdbd2cSJim Jagielski SwFtnBossFrm * const pNewBoss = pNewUpper->FindFtnBossFrm();
3067*b1cdbd2cSJim Jagielski //Wechseln wir die Spalte/Seite?
3068*b1cdbd2cSJim Jagielski if ( sal_False == ( bSameBoss = pNewBoss == pOldBoss ) )
3069*b1cdbd2cSJim Jagielski {
3070*b1cdbd2cSJim Jagielski bSamePage = pOldBoss->FindPageFrm() == pNewBoss->FindPageFrm(); // Seitenwechsel?
3071*b1cdbd2cSJim Jagielski pNewUpper->Calc();
3072*b1cdbd2cSJim Jagielski }
3073*b1cdbd2cSJim Jagielski
3074*b1cdbd2cSJim Jagielski //Das Layoutblatt, dass wir fuer Fussnoten bekommen ist entweder
3075*b1cdbd2cSJim Jagielski //ein Fussnotencontainer oder eine Fussnote
3076*b1cdbd2cSJim Jagielski //Wenn es eine Fussnote ist, und sie die gleiche Fussnotenreferez
3077*b1cdbd2cSJim Jagielski //wie der alte Upper hat, so moven wir uns direkt hinein.
3078*b1cdbd2cSJim Jagielski //Ist die Referenz einen andere oder ist es ein Container, so wird
3079*b1cdbd2cSJim Jagielski //eine neue Fussnote erzeugt und in den Container gestellt.
3080*b1cdbd2cSJim Jagielski // Wenn wir in einem Bereich innerhalb der Fussnote sind, muss
3081*b1cdbd2cSJim Jagielski // SectionFrame noch angelegt werden.
3082*b1cdbd2cSJim Jagielski SwFtnFrm* pTmpFtn = pNewUpper->IsFtnFrm() ? ((SwFtnFrm*)pNewUpper) : 0;
3083*b1cdbd2cSJim Jagielski if( !pTmpFtn )
3084*b1cdbd2cSJim Jagielski {
3085*b1cdbd2cSJim Jagielski ASSERT( pNewUpper->IsFtnContFrm(), "Neuer Upper kein FtnCont.");
3086*b1cdbd2cSJim Jagielski SwFtnContFrm *pCont = (SwFtnContFrm*)pNewUpper;
3087*b1cdbd2cSJim Jagielski
3088*b1cdbd2cSJim Jagielski //Fussnote erzeugen.
3089*b1cdbd2cSJim Jagielski SwFtnFrm *pOld = FindFtnFrm();
3090*b1cdbd2cSJim Jagielski pTmpFtn = new SwFtnFrm( pOld->GetFmt()->GetDoc()->GetDfltFrmFmt(),
3091*b1cdbd2cSJim Jagielski pOld, pOld->GetRef(), pOld->GetAttr() );
3092*b1cdbd2cSJim Jagielski //Verkettung der Fussnoten.
3093*b1cdbd2cSJim Jagielski if ( pOld->GetFollow() )
3094*b1cdbd2cSJim Jagielski {
3095*b1cdbd2cSJim Jagielski pTmpFtn->SetFollow( pOld->GetFollow() );
3096*b1cdbd2cSJim Jagielski pOld->GetFollow()->SetMaster( pTmpFtn );
3097*b1cdbd2cSJim Jagielski }
3098*b1cdbd2cSJim Jagielski pOld->SetFollow( pTmpFtn );
3099*b1cdbd2cSJim Jagielski pTmpFtn->SetMaster( pOld );
3100*b1cdbd2cSJim Jagielski SwFrm* pNx = pCont->Lower();
3101*b1cdbd2cSJim Jagielski if( pNx && pTmpFtn->GetAttr()->GetFtn().IsEndNote() )
3102*b1cdbd2cSJim Jagielski while(pNx && !((SwFtnFrm*)pNx)->GetAttr()->GetFtn().IsEndNote())
3103*b1cdbd2cSJim Jagielski pNx = pNx->GetNext();
3104*b1cdbd2cSJim Jagielski pTmpFtn->Paste( pCont, pNx );
3105*b1cdbd2cSJim Jagielski pTmpFtn->Calc();
3106*b1cdbd2cSJim Jagielski }
3107*b1cdbd2cSJim Jagielski ASSERT( pTmpFtn->GetAttr() == FindFtnFrm()->GetAttr(), "Wrong Footnote!" );
3108*b1cdbd2cSJim Jagielski // Bereiche in Fussnoten beduerfen besonderer Behandlung
3109*b1cdbd2cSJim Jagielski SwLayoutFrm *pNewUp = pTmpFtn;
3110*b1cdbd2cSJim Jagielski if( IsInSct() )
3111*b1cdbd2cSJim Jagielski {
3112*b1cdbd2cSJim Jagielski SwSectionFrm* pSect = FindSctFrm();
3113*b1cdbd2cSJim Jagielski // Bereich in Fussnote (oder nur Fussnote in Bereich)?
3114*b1cdbd2cSJim Jagielski if( pSect->IsInFtn() )
3115*b1cdbd2cSJim Jagielski {
3116*b1cdbd2cSJim Jagielski if( pTmpFtn->Lower() && pTmpFtn->Lower()->IsSctFrm() &&
3117*b1cdbd2cSJim Jagielski pSect->GetFollow() == (SwSectionFrm*)pTmpFtn->Lower() )
3118*b1cdbd2cSJim Jagielski pNewUp = (SwSectionFrm*)pTmpFtn->Lower();
3119*b1cdbd2cSJim Jagielski else
3120*b1cdbd2cSJim Jagielski {
3121*b1cdbd2cSJim Jagielski pNewUp = new SwSectionFrm( *pSect, sal_False );
3122*b1cdbd2cSJim Jagielski pNewUp->InsertBefore( pTmpFtn, pTmpFtn->Lower() );
3123*b1cdbd2cSJim Jagielski static_cast<SwSectionFrm*>(pNewUp)->Init();
3124*b1cdbd2cSJim Jagielski pNewUp->Frm().Pos() = pTmpFtn->Frm().Pos();
3125*b1cdbd2cSJim Jagielski pNewUp->Frm().Pos().Y() += 1; //wg. Benachrichtigungen.
3126*b1cdbd2cSJim Jagielski
3127*b1cdbd2cSJim Jagielski // Wenn unser Bereichsframe einen Nachfolger hat, so muss dieser
3128*b1cdbd2cSJim Jagielski // umgehaengt werden hinter den neuen Follow der Bereichsframes.
3129*b1cdbd2cSJim Jagielski SwFrm* pTmp = pSect->GetNext();
3130*b1cdbd2cSJim Jagielski if( pTmp )
3131*b1cdbd2cSJim Jagielski {
3132*b1cdbd2cSJim Jagielski SwFlowFrm* pTmpNxt;
3133*b1cdbd2cSJim Jagielski if( pTmp->IsCntntFrm() )
3134*b1cdbd2cSJim Jagielski pTmpNxt = (SwCntntFrm*)pTmp;
3135*b1cdbd2cSJim Jagielski else if( pTmp->IsSctFrm() )
3136*b1cdbd2cSJim Jagielski pTmpNxt = (SwSectionFrm*)pTmp;
3137*b1cdbd2cSJim Jagielski else
3138*b1cdbd2cSJim Jagielski {
3139*b1cdbd2cSJim Jagielski ASSERT( pTmp->IsTabFrm(), "GetNextSctLeaf: Wrong Type" );
3140*b1cdbd2cSJim Jagielski pTmpNxt = (SwTabFrm*)pTmp;
3141*b1cdbd2cSJim Jagielski }
3142*b1cdbd2cSJim Jagielski pTmpNxt->MoveSubTree( pTmpFtn, pNewUp->GetNext() );
3143*b1cdbd2cSJim Jagielski }
3144*b1cdbd2cSJim Jagielski }
3145*b1cdbd2cSJim Jagielski }
3146*b1cdbd2cSJim Jagielski }
3147*b1cdbd2cSJim Jagielski
3148*b1cdbd2cSJim Jagielski MoveSubTree( pNewUp, pNewUp->Lower() );
3149*b1cdbd2cSJim Jagielski
3150*b1cdbd2cSJim Jagielski if( !bSameBoss )
3151*b1cdbd2cSJim Jagielski Prepare( PREP_BOSS_CHGD );
3152*b1cdbd2cSJim Jagielski }
3153*b1cdbd2cSJim Jagielski return bSamePage;
3154*b1cdbd2cSJim Jagielski }
3155*b1cdbd2cSJim Jagielski
3156*b1cdbd2cSJim Jagielski /*************************************************************************
3157*b1cdbd2cSJim Jagielski |*
3158*b1cdbd2cSJim Jagielski |* class SwSaveFtnHeight
3159*b1cdbd2cSJim Jagielski |*
3160*b1cdbd2cSJim Jagielski |*************************************************************************/
3161*b1cdbd2cSJim Jagielski
3162*b1cdbd2cSJim Jagielski
SwSaveFtnHeight(SwFtnBossFrm * pBs,const SwTwips nDeadLine)3163*b1cdbd2cSJim Jagielski SwSaveFtnHeight::SwSaveFtnHeight( SwFtnBossFrm *pBs, const SwTwips nDeadLine ) :
3164*b1cdbd2cSJim Jagielski pBoss( pBs ),
3165*b1cdbd2cSJim Jagielski nOldHeight( pBs->GetMaxFtnHeight() )
3166*b1cdbd2cSJim Jagielski {
3167*b1cdbd2cSJim Jagielski pBoss->SetFtnDeadLine( nDeadLine );
3168*b1cdbd2cSJim Jagielski nNewHeight = pBoss->GetMaxFtnHeight();
3169*b1cdbd2cSJim Jagielski }
3170*b1cdbd2cSJim Jagielski
3171*b1cdbd2cSJim Jagielski
3172*b1cdbd2cSJim Jagielski
~SwSaveFtnHeight()3173*b1cdbd2cSJim Jagielski SwSaveFtnHeight::~SwSaveFtnHeight()
3174*b1cdbd2cSJim Jagielski {
3175*b1cdbd2cSJim Jagielski //Wenn zwischendurch jemand an der DeadLine gedreht hat, so lassen wir
3176*b1cdbd2cSJim Jagielski //ihm seinen Spass!
3177*b1cdbd2cSJim Jagielski if ( nNewHeight == pBoss->GetMaxFtnHeight() )
3178*b1cdbd2cSJim Jagielski pBoss->nMaxFtnHeight = nOldHeight;
3179*b1cdbd2cSJim Jagielski }
3180*b1cdbd2cSJim Jagielski
3181*b1cdbd2cSJim Jagielski
3182*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
3183*b1cdbd2cSJim Jagielski //JP 15.10.2001: in a non pro version test if the attribute has the same
3184*b1cdbd2cSJim Jagielski // meaning which his reference is
3185*b1cdbd2cSJim Jagielski
3186*b1cdbd2cSJim Jagielski // Normally, the pRef member and the GetRefFromAttr() result has to be
3187*b1cdbd2cSJim Jagielski // identically. Sometimes footnote will be moved from a master to its follow,
3188*b1cdbd2cSJim Jagielski // but the GetRef() is called first, so we have to ignore a master/follow
3189*b1cdbd2cSJim Jagielski // mismatch.
3190*b1cdbd2cSJim Jagielski
GetRef() const3191*b1cdbd2cSJim Jagielski const SwCntntFrm* SwFtnFrm::GetRef() const
3192*b1cdbd2cSJim Jagielski {
3193*b1cdbd2cSJim Jagielski const SwCntntFrm* pRefAttr = GetRefFromAttr();
3194*b1cdbd2cSJim Jagielski ASSERT( pRef == pRefAttr || pRef->IsAnFollow( pRefAttr )
3195*b1cdbd2cSJim Jagielski || pRefAttr->IsAnFollow( pRef ),
3196*b1cdbd2cSJim Jagielski "access to deleted Frame? pRef != pAttr->GetRef()" );
3197*b1cdbd2cSJim Jagielski return pRef;
3198*b1cdbd2cSJim Jagielski }
3199*b1cdbd2cSJim Jagielski
GetRef()3200*b1cdbd2cSJim Jagielski SwCntntFrm* SwFtnFrm::GetRef()
3201*b1cdbd2cSJim Jagielski {
3202*b1cdbd2cSJim Jagielski const SwCntntFrm* pRefAttr = GetRefFromAttr();
3203*b1cdbd2cSJim Jagielski ASSERT( pRef == pRefAttr || pRef->IsAnFollow( pRefAttr )
3204*b1cdbd2cSJim Jagielski || pRefAttr->IsAnFollow( pRef ),
3205*b1cdbd2cSJim Jagielski "access to deleted Frame? pRef != pAttr->GetRef()" );
3206*b1cdbd2cSJim Jagielski return pRef;
3207*b1cdbd2cSJim Jagielski }
3208*b1cdbd2cSJim Jagielski
3209*b1cdbd2cSJim Jagielski #endif
3210*b1cdbd2cSJim Jagielski
GetRefFromAttr() const3211*b1cdbd2cSJim Jagielski const SwCntntFrm* SwFtnFrm::GetRefFromAttr() const
3212*b1cdbd2cSJim Jagielski {
3213*b1cdbd2cSJim Jagielski SwFtnFrm* pThis = (SwFtnFrm*)this;
3214*b1cdbd2cSJim Jagielski return pThis->GetRefFromAttr();
3215*b1cdbd2cSJim Jagielski }
3216*b1cdbd2cSJim Jagielski
GetRefFromAttr()3217*b1cdbd2cSJim Jagielski SwCntntFrm* SwFtnFrm::GetRefFromAttr()
3218*b1cdbd2cSJim Jagielski {
3219*b1cdbd2cSJim Jagielski ASSERT( pAttr, "invalid Attribute" );
3220*b1cdbd2cSJim Jagielski SwTxtNode& rTNd = (SwTxtNode&)pAttr->GetTxtNode();
3221*b1cdbd2cSJim Jagielski SwPosition aPos( rTNd, SwIndex( &rTNd, *pAttr->GetStart() ));
3222*b1cdbd2cSJim Jagielski SwCntntFrm* pCFrm = rTNd.getLayoutFrm( getRootFrm(), 0, &aPos, sal_False );
3223*b1cdbd2cSJim Jagielski return pCFrm;
3224*b1cdbd2cSJim Jagielski }
3225*b1cdbd2cSJim Jagielski
3226*b1cdbd2cSJim Jagielski /** search for last content in the current footnote frame
3227*b1cdbd2cSJim Jagielski
3228*b1cdbd2cSJim Jagielski OD 2005-12-02 #i27138#
3229*b1cdbd2cSJim Jagielski
3230*b1cdbd2cSJim Jagielski @author OD
3231*b1cdbd2cSJim Jagielski */
FindLastCntnt()3232*b1cdbd2cSJim Jagielski SwCntntFrm* SwFtnFrm::FindLastCntnt()
3233*b1cdbd2cSJim Jagielski {
3234*b1cdbd2cSJim Jagielski SwCntntFrm* pLastCntntFrm( 0L );
3235*b1cdbd2cSJim Jagielski
3236*b1cdbd2cSJim Jagielski // find last lower, which is a content frame or contains content.
3237*b1cdbd2cSJim Jagielski // hidden text frames, empty sections and empty tables have to be skipped.
3238*b1cdbd2cSJim Jagielski SwFrm* pLastLowerOfFtn( GetLower() );
3239*b1cdbd2cSJim Jagielski SwFrm* pTmpLastLower( pLastLowerOfFtn );
3240*b1cdbd2cSJim Jagielski while ( pTmpLastLower && pTmpLastLower->GetNext() )
3241*b1cdbd2cSJim Jagielski {
3242*b1cdbd2cSJim Jagielski pTmpLastLower = pTmpLastLower->GetNext();
3243*b1cdbd2cSJim Jagielski if ( ( pTmpLastLower->IsTxtFrm() &&
3244*b1cdbd2cSJim Jagielski !static_cast<SwTxtFrm*>(pTmpLastLower)->IsHiddenNow() ) ||
3245*b1cdbd2cSJim Jagielski ( pTmpLastLower->IsSctFrm() &&
3246*b1cdbd2cSJim Jagielski static_cast<SwSectionFrm*>(pTmpLastLower)->GetSection() &&
3247*b1cdbd2cSJim Jagielski static_cast<SwSectionFrm*>(pTmpLastLower)->ContainsCntnt() ) ||
3248*b1cdbd2cSJim Jagielski ( pTmpLastLower->IsTabFrm() &&
3249*b1cdbd2cSJim Jagielski static_cast<SwTabFrm*>(pTmpLastLower)->ContainsCntnt() ) )
3250*b1cdbd2cSJim Jagielski {
3251*b1cdbd2cSJim Jagielski pLastLowerOfFtn = pTmpLastLower;
3252*b1cdbd2cSJim Jagielski }
3253*b1cdbd2cSJim Jagielski }
3254*b1cdbd2cSJim Jagielski
3255*b1cdbd2cSJim Jagielski // determine last content frame depending on type of found last lower.
3256*b1cdbd2cSJim Jagielski if ( pLastLowerOfFtn && pLastLowerOfFtn->IsTabFrm() )
3257*b1cdbd2cSJim Jagielski {
3258*b1cdbd2cSJim Jagielski pLastCntntFrm = static_cast<SwTabFrm*>(pLastLowerOfFtn)->FindLastCntnt();
3259*b1cdbd2cSJim Jagielski }
3260*b1cdbd2cSJim Jagielski else if ( pLastLowerOfFtn && pLastLowerOfFtn->IsSctFrm() )
3261*b1cdbd2cSJim Jagielski {
3262*b1cdbd2cSJim Jagielski pLastCntntFrm = static_cast<SwSectionFrm*>(pLastLowerOfFtn)->FindLastCntnt();
3263*b1cdbd2cSJim Jagielski }
3264*b1cdbd2cSJim Jagielski else
3265*b1cdbd2cSJim Jagielski {
3266*b1cdbd2cSJim Jagielski pLastCntntFrm = dynamic_cast<SwCntntFrm*>(pLastLowerOfFtn);
3267*b1cdbd2cSJim Jagielski }
3268*b1cdbd2cSJim Jagielski
3269*b1cdbd2cSJim Jagielski return pLastCntntFrm;
3270*b1cdbd2cSJim Jagielski }
3271*b1cdbd2cSJim Jagielski
3272