xref: /aoo4110/main/sw/source/core/layout/findfrm.cxx (revision b1cdbd2c)
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 "pagefrm.hxx"
29*b1cdbd2cSJim Jagielski #include "rootfrm.hxx"
30*b1cdbd2cSJim Jagielski #include "cntfrm.hxx"
31*b1cdbd2cSJim Jagielski #include "node.hxx"
32*b1cdbd2cSJim Jagielski #include "doc.hxx"
33*b1cdbd2cSJim Jagielski #include "frmtool.hxx"
34*b1cdbd2cSJim Jagielski #include "flyfrm.hxx"
35*b1cdbd2cSJim Jagielski #include <frmfmt.hxx>
36*b1cdbd2cSJim Jagielski #include <cellfrm.hxx>
37*b1cdbd2cSJim Jagielski #include <rowfrm.hxx>
38*b1cdbd2cSJim Jagielski #include <swtable.hxx>
39*b1cdbd2cSJim Jagielski 
40*b1cdbd2cSJim Jagielski #include "tabfrm.hxx"
41*b1cdbd2cSJim Jagielski #include "sectfrm.hxx"
42*b1cdbd2cSJim Jagielski #include "flyfrms.hxx"
43*b1cdbd2cSJim Jagielski #include "ftnfrm.hxx"
44*b1cdbd2cSJim Jagielski #include "txtftn.hxx"
45*b1cdbd2cSJim Jagielski #include "fmtftn.hxx"
46*b1cdbd2cSJim Jagielski #include <txtfrm.hxx>   // SwTxtFrm
47*b1cdbd2cSJim Jagielski #include <switerator.hxx>
48*b1cdbd2cSJim Jagielski 
49*b1cdbd2cSJim Jagielski /*************************************************************************
50*b1cdbd2cSJim Jagielski |*
51*b1cdbd2cSJim Jagielski |*	FindBodyCont, FindLastBodyCntnt()
52*b1cdbd2cSJim Jagielski |*
53*b1cdbd2cSJim Jagielski |*	Beschreibung		Sucht den ersten/letzten CntntFrm im BodyText unterhalb
54*b1cdbd2cSJim Jagielski |* 		der Seite.
55*b1cdbd2cSJim Jagielski |*	Ersterstellung		MA 15. Feb. 93
56*b1cdbd2cSJim Jagielski |*	Letzte Aenderung	MA 18. Apr. 94
57*b1cdbd2cSJim Jagielski |*
58*b1cdbd2cSJim Jagielski |*************************************************************************/
FindBodyCont()59*b1cdbd2cSJim Jagielski SwLayoutFrm *SwFtnBossFrm::FindBodyCont()
60*b1cdbd2cSJim Jagielski {
61*b1cdbd2cSJim Jagielski 	SwFrm *pLay = Lower();
62*b1cdbd2cSJim Jagielski 	while ( pLay && !pLay->IsBodyFrm() )
63*b1cdbd2cSJim Jagielski 		pLay = pLay->GetNext();
64*b1cdbd2cSJim Jagielski 	return (SwLayoutFrm*)pLay;
65*b1cdbd2cSJim Jagielski }
66*b1cdbd2cSJim Jagielski 
FindLastBodyCntnt()67*b1cdbd2cSJim Jagielski SwCntntFrm *SwPageFrm::FindLastBodyCntnt()
68*b1cdbd2cSJim Jagielski {
69*b1cdbd2cSJim Jagielski 	SwCntntFrm *pRet = FindFirstBodyCntnt();
70*b1cdbd2cSJim Jagielski 	SwCntntFrm *pNxt = pRet;
71*b1cdbd2cSJim Jagielski 	while ( pNxt && pNxt->IsInDocBody() && IsAnLower( pNxt ) )
72*b1cdbd2cSJim Jagielski 	{	pRet = pNxt;
73*b1cdbd2cSJim Jagielski 		pNxt = pNxt->FindNextCnt();
74*b1cdbd2cSJim Jagielski 	}
75*b1cdbd2cSJim Jagielski 	return pRet;
76*b1cdbd2cSJim Jagielski }
77*b1cdbd2cSJim Jagielski 
78*b1cdbd2cSJim Jagielski /*************************************************************************
79*b1cdbd2cSJim Jagielski |*
80*b1cdbd2cSJim Jagielski |*	SwLayoutFrm::ContainsCntnt
81*b1cdbd2cSJim Jagielski |*
82*b1cdbd2cSJim Jagielski |*	Beschreibung			Prueft, ob der Frame irgendwo in seiner
83*b1cdbd2cSJim Jagielski |*			untergeordneten Struktur einen oder mehrere CntntFrm's enthaelt;
84*b1cdbd2cSJim Jagielski |*			Falls ja wird der erste gefundene CntntFrm zurueckgegeben.
85*b1cdbd2cSJim Jagielski |*
86*b1cdbd2cSJim Jagielski |*	Ersterstellung		MA 13. May. 92
87*b1cdbd2cSJim Jagielski |*	Letzte Aenderung	MA 20. Apr. 94
88*b1cdbd2cSJim Jagielski |*
89*b1cdbd2cSJim Jagielski |*************************************************************************/
90*b1cdbd2cSJim Jagielski 
ContainsCntnt() const91*b1cdbd2cSJim Jagielski const SwCntntFrm *SwLayoutFrm::ContainsCntnt() const
92*b1cdbd2cSJim Jagielski {
93*b1cdbd2cSJim Jagielski 	//LayoutBlatt nach unten hin suchen und wenn dieses keinen Inhalt hat
94*b1cdbd2cSJim Jagielski 	//solange die weiteren Blatter abklappern bis Inhalt gefunden oder der
95*b1cdbd2cSJim Jagielski 	//this verlassen wird.
96*b1cdbd2cSJim Jagielski 	//Sections: Cntnt neben Sections wuerde so nicht gefunden (leere Section
97*b1cdbd2cSJim Jagielski 	//direct neben CntntFrm), deshalb muss fuer diese Aufwendiger rekursiv gesucht
98*b1cdbd2cSJim Jagielski 	//werden.
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski 	const SwLayoutFrm *pLayLeaf = this;
101*b1cdbd2cSJim Jagielski 	do
102*b1cdbd2cSJim Jagielski 	{
103*b1cdbd2cSJim Jagielski 		while ( (!pLayLeaf->IsSctFrm() || pLayLeaf == this ) &&
104*b1cdbd2cSJim Jagielski 				pLayLeaf->Lower() && pLayLeaf->Lower()->IsLayoutFrm() )
105*b1cdbd2cSJim Jagielski 			pLayLeaf = (SwLayoutFrm*)pLayLeaf->Lower();
106*b1cdbd2cSJim Jagielski 
107*b1cdbd2cSJim Jagielski 		if( pLayLeaf->IsSctFrm() && pLayLeaf != this )
108*b1cdbd2cSJim Jagielski 		{
109*b1cdbd2cSJim Jagielski 			const SwCntntFrm *pCnt = pLayLeaf->ContainsCntnt();
110*b1cdbd2cSJim Jagielski 			if( pCnt )
111*b1cdbd2cSJim Jagielski 				return pCnt;
112*b1cdbd2cSJim Jagielski 			if( pLayLeaf->GetNext() )
113*b1cdbd2cSJim Jagielski 			{
114*b1cdbd2cSJim Jagielski 				if( pLayLeaf->GetNext()->IsLayoutFrm() )
115*b1cdbd2cSJim Jagielski 				{
116*b1cdbd2cSJim Jagielski 					pLayLeaf = (SwLayoutFrm*)pLayLeaf->GetNext();
117*b1cdbd2cSJim Jagielski 					continue;
118*b1cdbd2cSJim Jagielski 				}
119*b1cdbd2cSJim Jagielski 				else
120*b1cdbd2cSJim Jagielski 					return (SwCntntFrm*)pLayLeaf->GetNext();
121*b1cdbd2cSJim Jagielski 			}
122*b1cdbd2cSJim Jagielski 		}
123*b1cdbd2cSJim Jagielski 		else if ( pLayLeaf->Lower() )
124*b1cdbd2cSJim Jagielski 			return (SwCntntFrm*)pLayLeaf->Lower();
125*b1cdbd2cSJim Jagielski 
126*b1cdbd2cSJim Jagielski 		pLayLeaf = pLayLeaf->GetNextLayoutLeaf();
127*b1cdbd2cSJim Jagielski 		if( !IsAnLower( pLayLeaf) )
128*b1cdbd2cSJim Jagielski 			return 0;
129*b1cdbd2cSJim Jagielski 	} while( pLayLeaf );
130*b1cdbd2cSJim Jagielski 	return 0;
131*b1cdbd2cSJim Jagielski }
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski /*************************************************************************
134*b1cdbd2cSJim Jagielski |*
135*b1cdbd2cSJim Jagielski |*	SwLayoutFrm::FirstCell
136*b1cdbd2cSJim Jagielski |*
137*b1cdbd2cSJim Jagielski |*	Beschreibung	ruft zunaechst ContainsAny auf, um in die innerste Zelle
138*b1cdbd2cSJim Jagielski |* 					hineinzukommen. Dort hangelt es sich wieder hoch zum
139*b1cdbd2cSJim Jagielski |*					ersten SwCellFrm, seit es SectionFrms gibt, reicht kein
140*b1cdbd2cSJim Jagielski |*					ContainsCntnt()->GetUpper() mehr...
141*b1cdbd2cSJim Jagielski |*	Ersterstellung		AMA 17. Mar. 99
142*b1cdbd2cSJim Jagielski |*	Letzte Aenderung	AMA 17. Mar. 99
143*b1cdbd2cSJim Jagielski |*
144*b1cdbd2cSJim Jagielski |*************************************************************************/
145*b1cdbd2cSJim Jagielski 
FirstCell() const146*b1cdbd2cSJim Jagielski const SwCellFrm *SwLayoutFrm::FirstCell() const
147*b1cdbd2cSJim Jagielski {
148*b1cdbd2cSJim Jagielski 	const SwFrm* pCnt = ContainsAny();
149*b1cdbd2cSJim Jagielski 	while( pCnt && !pCnt->IsCellFrm() )
150*b1cdbd2cSJim Jagielski 		pCnt = pCnt->GetUpper();
151*b1cdbd2cSJim Jagielski 	return (const SwCellFrm*)pCnt;
152*b1cdbd2cSJim Jagielski }
153*b1cdbd2cSJim Jagielski 
154*b1cdbd2cSJim Jagielski /*************************************************************************
155*b1cdbd2cSJim Jagielski |*
156*b1cdbd2cSJim Jagielski |*	SwLayoutFrm::ContainsAny
157*b1cdbd2cSJim Jagielski |*
158*b1cdbd2cSJim Jagielski |*	Beschreibung wie ContainsCntnt, nur dass nicht nur CntntFrms, sondern auch
159*b1cdbd2cSJim Jagielski |*			Bereiche und Tabellen zurueckgegeben werden.
160*b1cdbd2cSJim Jagielski |*	Ersterstellung		AMA 10. Mar. 99
161*b1cdbd2cSJim Jagielski |*	Letzte Aenderung	AMA 10. Mar. 99
162*b1cdbd2cSJim Jagielski |*
163*b1cdbd2cSJim Jagielski |*************************************************************************/
164*b1cdbd2cSJim Jagielski 
165*b1cdbd2cSJim Jagielski // --> OD 2006-02-01 #130797#
166*b1cdbd2cSJim Jagielski // New parameter <_bInvestigateFtnForSections> controls investigation of
167*b1cdbd2cSJim Jagielski // content of footnotes for sections.
ContainsAny(const bool _bInvestigateFtnForSections) const168*b1cdbd2cSJim Jagielski const SwFrm *SwLayoutFrm::ContainsAny( const bool _bInvestigateFtnForSections ) const
169*b1cdbd2cSJim Jagielski {
170*b1cdbd2cSJim Jagielski 	//LayoutBlatt nach unten hin suchen und wenn dieses keinen Inhalt hat
171*b1cdbd2cSJim Jagielski 	//solange die weiteren Blatter abklappern bis Inhalt gefunden oder der
172*b1cdbd2cSJim Jagielski 	//this verlassen wird.
173*b1cdbd2cSJim Jagielski 	// Oder bis wir einen SectionFrm oder TabFrm gefunden haben
174*b1cdbd2cSJim Jagielski 
175*b1cdbd2cSJim Jagielski 	const SwLayoutFrm *pLayLeaf = this;
176*b1cdbd2cSJim Jagielski     // --> OD 2006-02-01 #130797#
177*b1cdbd2cSJim Jagielski     const bool bNoFtn = IsSctFrm() && !_bInvestigateFtnForSections;
178*b1cdbd2cSJim Jagielski     // <--
179*b1cdbd2cSJim Jagielski 	do
180*b1cdbd2cSJim Jagielski 	{
181*b1cdbd2cSJim Jagielski 		while ( ( (!pLayLeaf->IsSctFrm() && !pLayLeaf->IsTabFrm())
182*b1cdbd2cSJim Jagielski 				 || pLayLeaf == this ) &&
183*b1cdbd2cSJim Jagielski 				pLayLeaf->Lower() && pLayLeaf->Lower()->IsLayoutFrm() )
184*b1cdbd2cSJim Jagielski 			pLayLeaf = (SwLayoutFrm*)pLayLeaf->Lower();
185*b1cdbd2cSJim Jagielski 
186*b1cdbd2cSJim Jagielski 		if( ( pLayLeaf->IsTabFrm() || pLayLeaf->IsSctFrm() )
187*b1cdbd2cSJim Jagielski 			&& pLayLeaf != this )
188*b1cdbd2cSJim Jagielski 		{
189*b1cdbd2cSJim Jagielski 			// Wir liefern jetzt auch "geloeschte" SectionFrms zurueck,
190*b1cdbd2cSJim Jagielski 			// damit diese beim SaveCntnt und RestoreCntnt mitgepflegt werden.
191*b1cdbd2cSJim Jagielski 			return pLayLeaf;
192*b1cdbd2cSJim Jagielski 		}
193*b1cdbd2cSJim Jagielski 		else if ( pLayLeaf->Lower() )
194*b1cdbd2cSJim Jagielski 			return (SwCntntFrm*)pLayLeaf->Lower();
195*b1cdbd2cSJim Jagielski 
196*b1cdbd2cSJim Jagielski 		pLayLeaf = pLayLeaf->GetNextLayoutLeaf();
197*b1cdbd2cSJim Jagielski 		if( bNoFtn && pLayLeaf && pLayLeaf->IsInFtn() )
198*b1cdbd2cSJim Jagielski 		{
199*b1cdbd2cSJim Jagielski 			do
200*b1cdbd2cSJim Jagielski 			{
201*b1cdbd2cSJim Jagielski 				pLayLeaf = pLayLeaf->GetNextLayoutLeaf();
202*b1cdbd2cSJim Jagielski 			} while( pLayLeaf && pLayLeaf->IsInFtn() );
203*b1cdbd2cSJim Jagielski 		}
204*b1cdbd2cSJim Jagielski 		if( !IsAnLower( pLayLeaf) )
205*b1cdbd2cSJim Jagielski 			return 0;
206*b1cdbd2cSJim Jagielski 	} while( pLayLeaf );
207*b1cdbd2cSJim Jagielski 	return 0;
208*b1cdbd2cSJim Jagielski }
209*b1cdbd2cSJim Jagielski 
210*b1cdbd2cSJim Jagielski 
211*b1cdbd2cSJim Jagielski /*************************************************************************
212*b1cdbd2cSJim Jagielski |*
213*b1cdbd2cSJim Jagielski |*	SwFrm::GetLower()
214*b1cdbd2cSJim Jagielski |*
215*b1cdbd2cSJim Jagielski |*	Ersterstellung		MA 27. Jul. 92
216*b1cdbd2cSJim Jagielski |*	Letzte Aenderung	MA 09. Oct. 97
217*b1cdbd2cSJim Jagielski |*
218*b1cdbd2cSJim Jagielski |*************************************************************************/
GetLower() const219*b1cdbd2cSJim Jagielski const SwFrm* SwFrm::GetLower() const
220*b1cdbd2cSJim Jagielski {
221*b1cdbd2cSJim Jagielski 	return IsLayoutFrm() ? ((SwLayoutFrm*)this)->Lower() : 0;
222*b1cdbd2cSJim Jagielski }
223*b1cdbd2cSJim Jagielski 
GetLower()224*b1cdbd2cSJim Jagielski SwFrm* SwFrm::GetLower()
225*b1cdbd2cSJim Jagielski {
226*b1cdbd2cSJim Jagielski 	return IsLayoutFrm() ? ((SwLayoutFrm*)this)->Lower() : 0;
227*b1cdbd2cSJim Jagielski }
228*b1cdbd2cSJim Jagielski 
229*b1cdbd2cSJim Jagielski /*************************************************************************
230*b1cdbd2cSJim Jagielski |*
231*b1cdbd2cSJim Jagielski |*	SwLayoutFrm::IsAnLower()
232*b1cdbd2cSJim Jagielski |*
233*b1cdbd2cSJim Jagielski |*	Ersterstellung		MA 18. Mar. 93
234*b1cdbd2cSJim Jagielski |*	Letzte Aenderung	MA 18. Mar. 93
235*b1cdbd2cSJim Jagielski |*
236*b1cdbd2cSJim Jagielski |*************************************************************************/
IsAnLower(const SwFrm * pAssumed) const237*b1cdbd2cSJim Jagielski sal_Bool SwLayoutFrm::IsAnLower( const SwFrm *pAssumed ) const
238*b1cdbd2cSJim Jagielski {
239*b1cdbd2cSJim Jagielski 	const SwFrm *pUp = pAssumed;
240*b1cdbd2cSJim Jagielski 	while ( pUp )
241*b1cdbd2cSJim Jagielski 	{
242*b1cdbd2cSJim Jagielski 		if ( pUp == this )
243*b1cdbd2cSJim Jagielski 			return sal_True;
244*b1cdbd2cSJim Jagielski 		if ( pUp->IsFlyFrm() )
245*b1cdbd2cSJim Jagielski             pUp = ((SwFlyFrm*)pUp)->GetAnchorFrm();
246*b1cdbd2cSJim Jagielski 		else
247*b1cdbd2cSJim Jagielski 			pUp = pUp->GetUpper();
248*b1cdbd2cSJim Jagielski 	}
249*b1cdbd2cSJim Jagielski 	return sal_False;
250*b1cdbd2cSJim Jagielski }
251*b1cdbd2cSJim Jagielski 
252*b1cdbd2cSJim Jagielski /** method to check relative position of layout frame to
253*b1cdbd2cSJim Jagielski     a given layout frame.
254*b1cdbd2cSJim Jagielski 
255*b1cdbd2cSJim Jagielski     OD 08.11.2002 - refactoring of pseudo-local method <lcl_Apres(..)> in
256*b1cdbd2cSJim Jagielski     <txtftn.cxx> for #104840#.
257*b1cdbd2cSJim Jagielski 
258*b1cdbd2cSJim Jagielski     @param _aCheckRefLayFrm
259*b1cdbd2cSJim Jagielski     constant reference of an instance of class <SwLayoutFrm> which
260*b1cdbd2cSJim Jagielski     is used as the reference for the relative position check.
261*b1cdbd2cSJim Jagielski 
262*b1cdbd2cSJim Jagielski     @author OD
263*b1cdbd2cSJim Jagielski 
264*b1cdbd2cSJim Jagielski     @return true, if <this> is positioned before the layout frame <p>
265*b1cdbd2cSJim Jagielski */
IsBefore(const SwLayoutFrm * _pCheckRefLayFrm) const266*b1cdbd2cSJim Jagielski bool SwLayoutFrm::IsBefore( const SwLayoutFrm* _pCheckRefLayFrm ) const
267*b1cdbd2cSJim Jagielski {
268*b1cdbd2cSJim Jagielski     ASSERT( !IsRootFrm() , "<IsBefore> called at a <SwRootFrm>.");
269*b1cdbd2cSJim Jagielski     ASSERT( !_pCheckRefLayFrm->IsRootFrm() , "<IsBefore> called with a <SwRootFrm>.");
270*b1cdbd2cSJim Jagielski 
271*b1cdbd2cSJim Jagielski     bool bReturn;
272*b1cdbd2cSJim Jagielski 
273*b1cdbd2cSJim Jagielski     // check, if on different pages
274*b1cdbd2cSJim Jagielski     const SwPageFrm *pMyPage = FindPageFrm();
275*b1cdbd2cSJim Jagielski     const SwPageFrm *pCheckRefPage = _pCheckRefLayFrm->FindPageFrm();
276*b1cdbd2cSJim Jagielski     if( pMyPage != pCheckRefPage )
277*b1cdbd2cSJim Jagielski     {
278*b1cdbd2cSJim Jagielski         // being on different page as check reference
279*b1cdbd2cSJim Jagielski         bReturn = pMyPage->GetPhyPageNum() < pCheckRefPage->GetPhyPageNum();
280*b1cdbd2cSJim Jagielski     }
281*b1cdbd2cSJim Jagielski     else
282*b1cdbd2cSJim Jagielski     {
283*b1cdbd2cSJim Jagielski         // being on same page as check reference
284*b1cdbd2cSJim Jagielski         // --> search my supreme parent <pUp>, which doesn't contain check reference.
285*b1cdbd2cSJim Jagielski         const SwLayoutFrm* pUp = this;
286*b1cdbd2cSJim Jagielski         while ( pUp->GetUpper() &&
287*b1cdbd2cSJim Jagielski                 !pUp->GetUpper()->IsAnLower( _pCheckRefLayFrm )
288*b1cdbd2cSJim Jagielski               )
289*b1cdbd2cSJim Jagielski             pUp = pUp->GetUpper();
290*b1cdbd2cSJim Jagielski         if( !pUp->GetUpper() )
291*b1cdbd2cSJim Jagielski         {
292*b1cdbd2cSJim Jagielski             // can occur, if <this> is a fly frm
293*b1cdbd2cSJim Jagielski             bReturn = false;
294*b1cdbd2cSJim Jagielski         }
295*b1cdbd2cSJim Jagielski         else
296*b1cdbd2cSJim Jagielski         {
297*b1cdbd2cSJim Jagielski             // travel through the next's of <pUp> and check if one of these
298*b1cdbd2cSJim Jagielski             // contain the check reference.
299*b1cdbd2cSJim Jagielski             SwLayoutFrm* pUpNext = (SwLayoutFrm*)pUp->GetNext();
300*b1cdbd2cSJim Jagielski             while ( pUpNext &&
301*b1cdbd2cSJim Jagielski                     !pUpNext->IsAnLower( _pCheckRefLayFrm ) )
302*b1cdbd2cSJim Jagielski             {
303*b1cdbd2cSJim Jagielski                 pUpNext = (SwLayoutFrm*)pUpNext->GetNext();
304*b1cdbd2cSJim Jagielski             }
305*b1cdbd2cSJim Jagielski             bReturn = pUpNext != 0;
306*b1cdbd2cSJim Jagielski         }
307*b1cdbd2cSJim Jagielski     }
308*b1cdbd2cSJim Jagielski 
309*b1cdbd2cSJim Jagielski     return bReturn;
310*b1cdbd2cSJim Jagielski }
311*b1cdbd2cSJim Jagielski 
312*b1cdbd2cSJim Jagielski //
313*b1cdbd2cSJim Jagielski // Local helper functions for GetNextLayoutLeaf
314*b1cdbd2cSJim Jagielski //
315*b1cdbd2cSJim Jagielski 
lcl_FindLayoutFrame(const SwFrm * pFrm,bool bNext)316*b1cdbd2cSJim Jagielski const SwFrm* lcl_FindLayoutFrame( const SwFrm* pFrm, bool bNext )
317*b1cdbd2cSJim Jagielski {
318*b1cdbd2cSJim Jagielski     const SwFrm* pRet = 0;
319*b1cdbd2cSJim Jagielski     if ( pFrm->IsFlyFrm() )
320*b1cdbd2cSJim Jagielski         pRet = bNext ? ((SwFlyFrm*)pFrm)->GetNextLink() : ((SwFlyFrm*)pFrm)->GetPrevLink();
321*b1cdbd2cSJim Jagielski     else
322*b1cdbd2cSJim Jagielski         pRet = bNext ? pFrm->GetNext() : pFrm->GetPrev();
323*b1cdbd2cSJim Jagielski 
324*b1cdbd2cSJim Jagielski     return pRet;
325*b1cdbd2cSJim Jagielski }
326*b1cdbd2cSJim Jagielski 
lcl_GetLower(const SwFrm * pFrm,bool bFwd)327*b1cdbd2cSJim Jagielski const SwFrm* lcl_GetLower( const SwFrm* pFrm, bool bFwd )
328*b1cdbd2cSJim Jagielski {
329*b1cdbd2cSJim Jagielski     if ( !pFrm->IsLayoutFrm() )
330*b1cdbd2cSJim Jagielski         return 0;
331*b1cdbd2cSJim Jagielski 
332*b1cdbd2cSJim Jagielski     return bFwd ?
333*b1cdbd2cSJim Jagielski            static_cast<const SwLayoutFrm*>(pFrm)->Lower() :
334*b1cdbd2cSJim Jagielski            static_cast<const SwLayoutFrm*>(pFrm)->GetLastLower();
335*b1cdbd2cSJim Jagielski }
336*b1cdbd2cSJim Jagielski 
337*b1cdbd2cSJim Jagielski /*************************************************************************
338*b1cdbd2cSJim Jagielski |*
339*b1cdbd2cSJim Jagielski |*  SwFrm::ImplGetNextLayoutLeaf
340*b1cdbd2cSJim Jagielski |*
341*b1cdbd2cSJim Jagielski |* Finds the next layout leaf. This is a layout frame, which does not
342*b1cdbd2cSJim Jagielski  * have a lower which is a LayoutFrame. That means, pLower can be 0 or a
343*b1cdbd2cSJim Jagielski  * content frame.
344*b1cdbd2cSJim Jagielski  *
345*b1cdbd2cSJim Jagielski  * However, pLower may be a TabFrm
346*b1cdbd2cSJim Jagielski  *
347*b1cdbd2cSJim Jagielski |*************************************************************************/
348*b1cdbd2cSJim Jagielski 
ImplGetNextLayoutLeaf(bool bFwd) const349*b1cdbd2cSJim Jagielski const SwLayoutFrm *SwFrm::ImplGetNextLayoutLeaf( bool bFwd ) const
350*b1cdbd2cSJim Jagielski {
351*b1cdbd2cSJim Jagielski     const SwFrm       *pFrm = this;
352*b1cdbd2cSJim Jagielski     const SwLayoutFrm *pLayoutFrm = 0;
353*b1cdbd2cSJim Jagielski     const SwFrm       *p = 0;
354*b1cdbd2cSJim Jagielski     bool bGoingUp = !bFwd;          // false for forward, true for backward
355*b1cdbd2cSJim Jagielski     do {
356*b1cdbd2cSJim Jagielski 
357*b1cdbd2cSJim Jagielski          bool bGoingFwdOrBwd = false, bGoingDown = false;
358*b1cdbd2cSJim Jagielski 
359*b1cdbd2cSJim Jagielski          bGoingDown = ( !bGoingUp && ( 0 != (p = lcl_GetLower( pFrm, bFwd ) ) ) );
360*b1cdbd2cSJim Jagielski          if ( !bGoingDown )
361*b1cdbd2cSJim Jagielski          {
362*b1cdbd2cSJim Jagielski              // I cannot go down, because either I'm currently going up or
363*b1cdbd2cSJim Jagielski              // because the is no lower.
364*b1cdbd2cSJim Jagielski              // I'll try to go forward:
365*b1cdbd2cSJim Jagielski              bGoingFwdOrBwd = (0 != (p = lcl_FindLayoutFrame( pFrm, bFwd ) ) );
366*b1cdbd2cSJim Jagielski              if ( !bGoingFwdOrBwd )
367*b1cdbd2cSJim Jagielski              {
368*b1cdbd2cSJim Jagielski                  // I cannot go forward, because there is no next frame.
369*b1cdbd2cSJim Jagielski                  // I'll try to go up:
370*b1cdbd2cSJim Jagielski                  bGoingUp = (0 != (p = pFrm->GetUpper() ) );
371*b1cdbd2cSJim Jagielski                  if ( !bGoingUp )
372*b1cdbd2cSJim Jagielski                  {
373*b1cdbd2cSJim Jagielski                     // I cannot go up, because there is no upper frame.
374*b1cdbd2cSJim Jagielski                     return 0;
375*b1cdbd2cSJim Jagielski                  }
376*b1cdbd2cSJim Jagielski              }
377*b1cdbd2cSJim Jagielski          }
378*b1cdbd2cSJim Jagielski 
379*b1cdbd2cSJim Jagielski         // If I could not go down or forward, I'll have to go up
380*b1cdbd2cSJim Jagielski         bGoingUp = !bGoingFwdOrBwd && !bGoingDown;
381*b1cdbd2cSJim Jagielski 
382*b1cdbd2cSJim Jagielski         pFrm = p;
383*b1cdbd2cSJim Jagielski         p = lcl_GetLower( pFrm, true );
384*b1cdbd2cSJim Jagielski 
385*b1cdbd2cSJim Jagielski     } while( ( p && !p->IsFlowFrm() ) ||
386*b1cdbd2cSJim Jagielski              pFrm == this ||
387*b1cdbd2cSJim Jagielski              0 == ( pLayoutFrm = pFrm->IsLayoutFrm() ? (SwLayoutFrm*)pFrm : 0 ) ||
388*b1cdbd2cSJim Jagielski              pLayoutFrm->IsAnLower( this ) );
389*b1cdbd2cSJim Jagielski 
390*b1cdbd2cSJim Jagielski     return pLayoutFrm;
391*b1cdbd2cSJim Jagielski }
392*b1cdbd2cSJim Jagielski 
393*b1cdbd2cSJim Jagielski 
394*b1cdbd2cSJim Jagielski 
395*b1cdbd2cSJim Jagielski /*************************************************************************
396*b1cdbd2cSJim Jagielski |*
397*b1cdbd2cSJim Jagielski |*    SwFrm::ImplGetNextCntntFrm( bool )
398*b1cdbd2cSJim Jagielski |*
399*b1cdbd2cSJim Jagielski |*      Rueckwaertswandern im Baum: Den untergeordneten Frm greifen,
400*b1cdbd2cSJim Jagielski |*      wenn es einen gibt und nicht gerade zuvor um eine Ebene
401*b1cdbd2cSJim Jagielski |*      aufgestiegen wurde (das wuerde zu einem endlosen Auf und Ab
402*b1cdbd2cSJim Jagielski |*      fuehren!). Damit wird sichergestellt, dass beim
403*b1cdbd2cSJim Jagielski |*      Rueckwaertswandern alle Unterbaeume durchsucht werden. Wenn
404*b1cdbd2cSJim Jagielski |*      abgestiegen wurde, wird zuerst an das Ende der Kette gegangen,
405*b1cdbd2cSJim Jagielski |*      weil im weiteren ja vom letzten Frm innerhalb eines anderen
406*b1cdbd2cSJim Jagielski |*      Frms rueckwaerts gegangen wird.
407*b1cdbd2cSJim Jagielski |*      Vorwaetzwander funktioniert analog.
408*b1cdbd2cSJim Jagielski |*
409*b1cdbd2cSJim Jagielski |*    Ersterstellung    ??
410*b1cdbd2cSJim Jagielski |*    Letzte Aenderung  MA 30. Oct. 97
411*b1cdbd2cSJim Jagielski |*
412*b1cdbd2cSJim Jagielski |*************************************************************************/
413*b1cdbd2cSJim Jagielski 
414*b1cdbd2cSJim Jagielski // Achtung: Fixes in ImplGetNextCntntFrm() muessen moeglicherweise auch in
415*b1cdbd2cSJim Jagielski // die weiter oben stehende Methode lcl_NextFrm(..) eingepflegt werden
ImplGetNextCntntFrm(bool bFwd) const416*b1cdbd2cSJim Jagielski const SwCntntFrm* SwCntntFrm::ImplGetNextCntntFrm( bool bFwd ) const
417*b1cdbd2cSJim Jagielski {
418*b1cdbd2cSJim Jagielski     const SwFrm *pFrm = this;
419*b1cdbd2cSJim Jagielski     // #100926#
420*b1cdbd2cSJim Jagielski     SwCntntFrm *pCntntFrm = 0;
421*b1cdbd2cSJim Jagielski     sal_Bool bGoingUp = sal_False;
422*b1cdbd2cSJim Jagielski     do {
423*b1cdbd2cSJim Jagielski         const SwFrm *p = 0;
424*b1cdbd2cSJim Jagielski         sal_Bool bGoingFwdOrBwd = sal_False, bGoingDown = sal_False;
425*b1cdbd2cSJim Jagielski 
426*b1cdbd2cSJim Jagielski         bGoingDown = ( !bGoingUp && ( 0 != ( p = lcl_GetLower( pFrm, true ) ) ) );
427*b1cdbd2cSJim Jagielski         if ( !bGoingDown )
428*b1cdbd2cSJim Jagielski         {
429*b1cdbd2cSJim Jagielski             bGoingFwdOrBwd = ( 0 != ( p = lcl_FindLayoutFrame( pFrm, bFwd ) ) );
430*b1cdbd2cSJim Jagielski             if ( !bGoingFwdOrBwd )
431*b1cdbd2cSJim Jagielski             {
432*b1cdbd2cSJim Jagielski                 bGoingUp = ( 0 != ( p = pFrm->GetUpper() ) );
433*b1cdbd2cSJim Jagielski                 if ( !bGoingUp )
434*b1cdbd2cSJim Jagielski                 {
435*b1cdbd2cSJim Jagielski                     return 0;
436*b1cdbd2cSJim Jagielski                 }
437*b1cdbd2cSJim Jagielski             }
438*b1cdbd2cSJim Jagielski         }
439*b1cdbd2cSJim Jagielski 
440*b1cdbd2cSJim Jagielski         bGoingUp = !(bGoingFwdOrBwd || bGoingDown);
441*b1cdbd2cSJim Jagielski 
442*b1cdbd2cSJim Jagielski         if ( !bFwd )
443*b1cdbd2cSJim Jagielski         {
444*b1cdbd2cSJim Jagielski             if( bGoingDown && p )
445*b1cdbd2cSJim Jagielski                 while ( p->GetNext() )
446*b1cdbd2cSJim Jagielski                     p = p->GetNext();
447*b1cdbd2cSJim Jagielski         }
448*b1cdbd2cSJim Jagielski 
449*b1cdbd2cSJim Jagielski         pFrm = p;
450*b1cdbd2cSJim Jagielski     } while ( 0 == (pCntntFrm = (pFrm->IsCntntFrm() ? (SwCntntFrm*)pFrm:0) ));
451*b1cdbd2cSJim Jagielski 
452*b1cdbd2cSJim Jagielski     return pCntntFrm;
453*b1cdbd2cSJim Jagielski }
454*b1cdbd2cSJim Jagielski 
455*b1cdbd2cSJim Jagielski 
456*b1cdbd2cSJim Jagielski 
457*b1cdbd2cSJim Jagielski 
458*b1cdbd2cSJim Jagielski /*************************************************************************
459*b1cdbd2cSJim Jagielski |*
460*b1cdbd2cSJim Jagielski |*	SwFrm::FindRootFrm(), FindTabFrm(), FindFtnFrm(), FindFlyFrm(),
461*b1cdbd2cSJim Jagielski |* 		   FindPageFrm(), FindColFrm()
462*b1cdbd2cSJim Jagielski |*
463*b1cdbd2cSJim Jagielski |*	Ersterstellung		??
464*b1cdbd2cSJim Jagielski |*	Letzte Aenderung	MA 05. Sep. 93
465*b1cdbd2cSJim Jagielski |*
466*b1cdbd2cSJim Jagielski |*************************************************************************/
FindPageFrm()467*b1cdbd2cSJim Jagielski SwPageFrm* SwFrm::FindPageFrm()
468*b1cdbd2cSJim Jagielski {
469*b1cdbd2cSJim Jagielski 	SwFrm *pRet = this;
470*b1cdbd2cSJim Jagielski 	while ( pRet && !pRet->IsPageFrm() )
471*b1cdbd2cSJim Jagielski 	{
472*b1cdbd2cSJim Jagielski 		if ( pRet->GetUpper() )
473*b1cdbd2cSJim Jagielski 			pRet = pRet->GetUpper();
474*b1cdbd2cSJim Jagielski 		else if ( pRet->IsFlyFrm() )
475*b1cdbd2cSJim Jagielski 		{
476*b1cdbd2cSJim Jagielski             // --> OD 2004-06-30 #i28701# - use new method <GetPageFrm()>
477*b1cdbd2cSJim Jagielski             if ( static_cast<SwFlyFrm*>(pRet)->GetPageFrm() )
478*b1cdbd2cSJim Jagielski                 pRet = static_cast<SwFlyFrm*>(pRet)->GetPageFrm();
479*b1cdbd2cSJim Jagielski 			else
480*b1cdbd2cSJim Jagielski                 pRet = static_cast<SwFlyFrm*>(pRet)->AnchorFrm();
481*b1cdbd2cSJim Jagielski 		}
482*b1cdbd2cSJim Jagielski 		else
483*b1cdbd2cSJim Jagielski 			return 0;
484*b1cdbd2cSJim Jagielski 	}
485*b1cdbd2cSJim Jagielski 	return (SwPageFrm*)pRet;
486*b1cdbd2cSJim Jagielski }
487*b1cdbd2cSJim Jagielski 
FindFtnBossFrm(sal_Bool bFootnotes)488*b1cdbd2cSJim Jagielski SwFtnBossFrm* SwFrm::FindFtnBossFrm( sal_Bool bFootnotes )
489*b1cdbd2cSJim Jagielski {
490*b1cdbd2cSJim Jagielski 	SwFrm *pRet = this;
491*b1cdbd2cSJim Jagielski 	// Innerhalb einer Tabelle gibt es keine Fussnotenbosse, auch spaltige
492*b1cdbd2cSJim Jagielski 	// Bereiche enthalten dort keine Fussnotentexte
493*b1cdbd2cSJim Jagielski 	if( pRet->IsInTab() )
494*b1cdbd2cSJim Jagielski 		pRet = pRet->FindTabFrm();
495*b1cdbd2cSJim Jagielski 	while ( pRet && !pRet->IsFtnBossFrm() )
496*b1cdbd2cSJim Jagielski 	{
497*b1cdbd2cSJim Jagielski 		if ( pRet->GetUpper() )
498*b1cdbd2cSJim Jagielski 			pRet = pRet->GetUpper();
499*b1cdbd2cSJim Jagielski 		else if ( pRet->IsFlyFrm() )
500*b1cdbd2cSJim Jagielski 		{
501*b1cdbd2cSJim Jagielski             // --> OD 2004-06-30 #i28701# - use new method <GetPageFrm()>
502*b1cdbd2cSJim Jagielski             if ( static_cast<SwFlyFrm*>(pRet)->GetPageFrm() )
503*b1cdbd2cSJim Jagielski                 pRet = static_cast<SwFlyFrm*>(pRet)->GetPageFrm();
504*b1cdbd2cSJim Jagielski             else
505*b1cdbd2cSJim Jagielski                 pRet = static_cast<SwFlyFrm*>(pRet)->AnchorFrm();
506*b1cdbd2cSJim Jagielski 		}
507*b1cdbd2cSJim Jagielski 		else
508*b1cdbd2cSJim Jagielski 			return 0;
509*b1cdbd2cSJim Jagielski 	}
510*b1cdbd2cSJim Jagielski 	if( bFootnotes && pRet && pRet->IsColumnFrm() &&
511*b1cdbd2cSJim Jagielski 		!pRet->GetNext() && !pRet->GetPrev() )
512*b1cdbd2cSJim Jagielski 	{
513*b1cdbd2cSJim Jagielski 		SwSectionFrm* pSct = pRet->FindSctFrm();
514*b1cdbd2cSJim Jagielski 		ASSERT( pSct, "FindFtnBossFrm: Single column outside section?" );
515*b1cdbd2cSJim Jagielski 		if( !pSct->IsFtnAtEnd() )
516*b1cdbd2cSJim Jagielski 			return pSct->FindFtnBossFrm( sal_True );
517*b1cdbd2cSJim Jagielski 	}
518*b1cdbd2cSJim Jagielski 	return (SwFtnBossFrm*)pRet;
519*b1cdbd2cSJim Jagielski }
520*b1cdbd2cSJim Jagielski 
ImplFindTabFrm()521*b1cdbd2cSJim Jagielski SwTabFrm* SwFrm::ImplFindTabFrm()
522*b1cdbd2cSJim Jagielski {
523*b1cdbd2cSJim Jagielski 	SwFrm *pRet = this;
524*b1cdbd2cSJim Jagielski 	while ( !pRet->IsTabFrm() )
525*b1cdbd2cSJim Jagielski 	{
526*b1cdbd2cSJim Jagielski 		pRet = pRet->GetUpper();
527*b1cdbd2cSJim Jagielski 		if ( !pRet )
528*b1cdbd2cSJim Jagielski 			return 0;
529*b1cdbd2cSJim Jagielski 	}
530*b1cdbd2cSJim Jagielski 	return (SwTabFrm*)pRet;
531*b1cdbd2cSJim Jagielski }
532*b1cdbd2cSJim Jagielski 
ImplFindSctFrm()533*b1cdbd2cSJim Jagielski SwSectionFrm* SwFrm::ImplFindSctFrm()
534*b1cdbd2cSJim Jagielski {
535*b1cdbd2cSJim Jagielski 	SwFrm *pRet = this;
536*b1cdbd2cSJim Jagielski 	while ( !pRet->IsSctFrm() )
537*b1cdbd2cSJim Jagielski 	{
538*b1cdbd2cSJim Jagielski 		pRet = pRet->GetUpper();
539*b1cdbd2cSJim Jagielski 		if ( !pRet )
540*b1cdbd2cSJim Jagielski 			return 0;
541*b1cdbd2cSJim Jagielski 	}
542*b1cdbd2cSJim Jagielski 	return (SwSectionFrm*)pRet;
543*b1cdbd2cSJim Jagielski }
544*b1cdbd2cSJim Jagielski 
ImplFindFtnFrm()545*b1cdbd2cSJim Jagielski SwFtnFrm *SwFrm::ImplFindFtnFrm()
546*b1cdbd2cSJim Jagielski {
547*b1cdbd2cSJim Jagielski 	SwFrm *pRet = this;
548*b1cdbd2cSJim Jagielski 	while ( !pRet->IsFtnFrm() )
549*b1cdbd2cSJim Jagielski 	{
550*b1cdbd2cSJim Jagielski 		pRet = pRet->GetUpper();
551*b1cdbd2cSJim Jagielski 		if ( !pRet )
552*b1cdbd2cSJim Jagielski 			return 0;
553*b1cdbd2cSJim Jagielski 	}
554*b1cdbd2cSJim Jagielski 	return (SwFtnFrm*)pRet;
555*b1cdbd2cSJim Jagielski }
556*b1cdbd2cSJim Jagielski 
ImplFindFlyFrm()557*b1cdbd2cSJim Jagielski SwFlyFrm *SwFrm::ImplFindFlyFrm()
558*b1cdbd2cSJim Jagielski {
559*b1cdbd2cSJim Jagielski 	const SwFrm *pRet = this;
560*b1cdbd2cSJim Jagielski 	do
561*b1cdbd2cSJim Jagielski 	{
562*b1cdbd2cSJim Jagielski 		if ( pRet->IsFlyFrm() )
563*b1cdbd2cSJim Jagielski 			return (SwFlyFrm*)pRet;
564*b1cdbd2cSJim Jagielski 		else
565*b1cdbd2cSJim Jagielski 			pRet = pRet->GetUpper();
566*b1cdbd2cSJim Jagielski 	} while ( pRet );
567*b1cdbd2cSJim Jagielski 	return 0;
568*b1cdbd2cSJim Jagielski }
569*b1cdbd2cSJim Jagielski 
FindColFrm()570*b1cdbd2cSJim Jagielski SwFrm *SwFrm::FindColFrm()
571*b1cdbd2cSJim Jagielski {
572*b1cdbd2cSJim Jagielski 	SwFrm *pFrm = this;
573*b1cdbd2cSJim Jagielski 	do
574*b1cdbd2cSJim Jagielski 	{	pFrm = pFrm->GetUpper();
575*b1cdbd2cSJim Jagielski 	} while ( pFrm && !pFrm->IsColumnFrm() );
576*b1cdbd2cSJim Jagielski 	return pFrm;
577*b1cdbd2cSJim Jagielski }
578*b1cdbd2cSJim Jagielski 
FindFooterOrHeader()579*b1cdbd2cSJim Jagielski SwFrm* SwFrm::FindFooterOrHeader()
580*b1cdbd2cSJim Jagielski {
581*b1cdbd2cSJim Jagielski 	SwFrm* pRet = this;
582*b1cdbd2cSJim Jagielski 	do
583*b1cdbd2cSJim Jagielski 	{	if ( pRet->GetType() & 0x0018 )	//Header und Footer
584*b1cdbd2cSJim Jagielski 			return pRet;
585*b1cdbd2cSJim Jagielski 		else if ( pRet->GetUpper() )
586*b1cdbd2cSJim Jagielski 			pRet = pRet->GetUpper();
587*b1cdbd2cSJim Jagielski 		else if ( pRet->IsFlyFrm() )
588*b1cdbd2cSJim Jagielski             pRet = ((SwFlyFrm*)pRet)->AnchorFrm();
589*b1cdbd2cSJim Jagielski 		else
590*b1cdbd2cSJim Jagielski 			return 0;
591*b1cdbd2cSJim Jagielski 	} while ( pRet );
592*b1cdbd2cSJim Jagielski 	return pRet;
593*b1cdbd2cSJim Jagielski }
594*b1cdbd2cSJim Jagielski 
FindFootNote() const595*b1cdbd2cSJim Jagielski const SwFtnFrm* SwFtnContFrm::FindFootNote() const
596*b1cdbd2cSJim Jagielski {
597*b1cdbd2cSJim Jagielski 	const SwFtnFrm* pRet = (SwFtnFrm*)Lower();
598*b1cdbd2cSJim Jagielski 	if( pRet && !pRet->GetAttr()->GetFtn().IsEndNote() )
599*b1cdbd2cSJim Jagielski 		return pRet;
600*b1cdbd2cSJim Jagielski 	return NULL;
601*b1cdbd2cSJim Jagielski }
602*b1cdbd2cSJim Jagielski 
GetPageAtPos(const Point & rPt,const Size * pSize,bool bExtend) const603*b1cdbd2cSJim Jagielski const SwPageFrm* SwRootFrm::GetPageAtPos( const Point& rPt, const Size* pSize, bool bExtend ) const
604*b1cdbd2cSJim Jagielski {
605*b1cdbd2cSJim Jagielski     const SwPageFrm* pRet = 0;
606*b1cdbd2cSJim Jagielski 
607*b1cdbd2cSJim Jagielski     SwRect aRect;
608*b1cdbd2cSJim Jagielski     if ( pSize )
609*b1cdbd2cSJim Jagielski     {
610*b1cdbd2cSJim Jagielski         aRect.Pos()  = rPt;
611*b1cdbd2cSJim Jagielski         aRect.SSize() = *pSize;
612*b1cdbd2cSJim Jagielski     }
613*b1cdbd2cSJim Jagielski 
614*b1cdbd2cSJim Jagielski     const SwFrm* pPage = Lower();
615*b1cdbd2cSJim Jagielski 
616*b1cdbd2cSJim Jagielski     if ( !bExtend )
617*b1cdbd2cSJim Jagielski     {
618*b1cdbd2cSJim Jagielski         if( !Frm().IsInside( rPt ) )
619*b1cdbd2cSJim Jagielski             return 0;
620*b1cdbd2cSJim Jagielski 
621*b1cdbd2cSJim Jagielski         // skip pages above point:
622*b1cdbd2cSJim Jagielski         while( pPage && rPt.Y() > pPage->Frm().Bottom() )
623*b1cdbd2cSJim Jagielski             pPage = pPage->GetNext();
624*b1cdbd2cSJim Jagielski     }
625*b1cdbd2cSJim Jagielski 
626*b1cdbd2cSJim Jagielski     ASSERT( GetPageNum() <= maPageRects.size(), "number of pages differes from page rect array size" )
627*b1cdbd2cSJim Jagielski     sal_uInt16 nPageIdx = 0;
628*b1cdbd2cSJim Jagielski 
629*b1cdbd2cSJim Jagielski     while ( pPage && !pRet )
630*b1cdbd2cSJim Jagielski     {
631*b1cdbd2cSJim Jagielski         const SwRect& rBoundRect = bExtend ? maPageRects[ nPageIdx++ ] : pPage->Frm();
632*b1cdbd2cSJim Jagielski 
633*b1cdbd2cSJim Jagielski         if ( (!pSize && rBoundRect.IsInside(rPt)) ||
634*b1cdbd2cSJim Jagielski               (pSize && rBoundRect.IsOver(aRect)) )
635*b1cdbd2cSJim Jagielski         {
636*b1cdbd2cSJim Jagielski             pRet = static_cast<const SwPageFrm*>(pPage);
637*b1cdbd2cSJim Jagielski         }
638*b1cdbd2cSJim Jagielski 
639*b1cdbd2cSJim Jagielski         pPage = pPage->GetNext();
640*b1cdbd2cSJim Jagielski     }
641*b1cdbd2cSJim Jagielski 
642*b1cdbd2cSJim Jagielski     return pRet;
643*b1cdbd2cSJim Jagielski }
644*b1cdbd2cSJim Jagielski 
645*b1cdbd2cSJim Jagielski /*************************************************************************
646*b1cdbd2cSJim Jagielski |*
647*b1cdbd2cSJim Jagielski |*	SwFrmFrm::GetAttrSet()
648*b1cdbd2cSJim Jagielski |*
649*b1cdbd2cSJim Jagielski |*	Ersterstellung		MA 02. Aug. 93
650*b1cdbd2cSJim Jagielski |*	Letzte Aenderung	MA 02. Aug. 93
651*b1cdbd2cSJim Jagielski |*
652*b1cdbd2cSJim Jagielski |*************************************************************************/
GetAttrSet() const653*b1cdbd2cSJim Jagielski const SwAttrSet* SwFrm::GetAttrSet() const
654*b1cdbd2cSJim Jagielski {
655*b1cdbd2cSJim Jagielski 	if ( IsCntntFrm() )
656*b1cdbd2cSJim Jagielski 		return &((const SwCntntFrm*)this)->GetNode()->GetSwAttrSet();
657*b1cdbd2cSJim Jagielski 	else
658*b1cdbd2cSJim Jagielski 		return &((const SwLayoutFrm*)this)->GetFmt()->GetAttrSet();
659*b1cdbd2cSJim Jagielski }
660*b1cdbd2cSJim Jagielski 
661*b1cdbd2cSJim Jagielski /*************************************************************************
662*b1cdbd2cSJim Jagielski |*
663*b1cdbd2cSJim Jagielski |*	SwFrm::_FindNext(), _FindPrev(), InvalidateNextPos()
664*b1cdbd2cSJim Jagielski |* 		   _FindNextCnt() geht in Tabellen und Bereiche hineinund liefert
665*b1cdbd2cSJim Jagielski |*         nur SwCntntFrms.
666*b1cdbd2cSJim Jagielski |*
667*b1cdbd2cSJim Jagielski |*	Beschreibung		Invalidiert die Position des Naechsten Frames.
668*b1cdbd2cSJim Jagielski |*		Dies ist der direkte Nachfolger, oder bei CntntFrm's der naechste
669*b1cdbd2cSJim Jagielski |*		CntntFrm der im gleichen Fluss liegt wie ich:
670*b1cdbd2cSJim Jagielski |* 		- Body,
671*b1cdbd2cSJim Jagielski |* 		- Fussnoten,
672*b1cdbd2cSJim Jagielski |* 		- Bei Kopf-/Fussbereichen ist die Benachrichtigung nur innerhalb des
673*b1cdbd2cSJim Jagielski |* 		  Bereiches weiterzuleiten.
674*b1cdbd2cSJim Jagielski |* 		- dito fuer Flys.
675*b1cdbd2cSJim Jagielski |* 		- Cntnts in Tabs halten sich ausschliesslich innerhalb ihrer Zelle
676*b1cdbd2cSJim Jagielski |* 		  auf.
677*b1cdbd2cSJim Jagielski |* 		- Tabellen verhalten sich prinzipiell analog zu den Cntnts
678*b1cdbd2cSJim Jagielski |* 		- Bereiche ebenfalls
679*b1cdbd2cSJim Jagielski |*	Ersterstellung		AK 14-Feb-1991
680*b1cdbd2cSJim Jagielski |*	Letzte Aenderung	AMA 10. Mar. 99
681*b1cdbd2cSJim Jagielski |*
682*b1cdbd2cSJim Jagielski |*************************************************************************/
683*b1cdbd2cSJim Jagielski 
684*b1cdbd2cSJim Jagielski // Diese Hilfsfunktion ist ein Aequivalent zur ImplGetNextCntntFrm()-Methode,
685*b1cdbd2cSJim Jagielski // sie liefert allerdings neben ContentFrames auch TabFrms und SectionFrms.
lcl_NextFrm(SwFrm * pFrm)686*b1cdbd2cSJim Jagielski SwFrm* lcl_NextFrm( SwFrm* pFrm )
687*b1cdbd2cSJim Jagielski {
688*b1cdbd2cSJim Jagielski 	SwFrm *pRet = 0;
689*b1cdbd2cSJim Jagielski 	sal_Bool bGoingUp = sal_False;
690*b1cdbd2cSJim Jagielski 	do {
691*b1cdbd2cSJim Jagielski 		SwFrm *p = 0;
692*b1cdbd2cSJim Jagielski 
693*b1cdbd2cSJim Jagielski 		sal_Bool bGoingFwd = sal_False;
694*b1cdbd2cSJim Jagielski         sal_Bool bGoingDown = (!bGoingUp && ( 0 != (p = pFrm->IsLayoutFrm() ? ((SwLayoutFrm*)pFrm)->Lower() : 0)));
695*b1cdbd2cSJim Jagielski 
696*b1cdbd2cSJim Jagielski         if( !bGoingDown )
697*b1cdbd2cSJim Jagielski         {
698*b1cdbd2cSJim Jagielski             bGoingFwd = (0 != (p = ( pFrm->IsFlyFrm() ? ((SwFlyFrm*)pFrm)->GetNextLink() : pFrm->GetNext())));
699*b1cdbd2cSJim Jagielski             if ( !bGoingFwd )
700*b1cdbd2cSJim Jagielski             {
701*b1cdbd2cSJim Jagielski                 bGoingUp = (0 != (p = pFrm->GetUpper()));
702*b1cdbd2cSJim Jagielski                 if ( !bGoingUp )
703*b1cdbd2cSJim Jagielski                 {
704*b1cdbd2cSJim Jagielski                     return 0;
705*b1cdbd2cSJim Jagielski                 }
706*b1cdbd2cSJim Jagielski             }
707*b1cdbd2cSJim Jagielski         }
708*b1cdbd2cSJim Jagielski 		bGoingUp = !(bGoingFwd || bGoingDown);
709*b1cdbd2cSJim Jagielski 		pFrm = p;
710*b1cdbd2cSJim Jagielski 	} while ( 0 == (pRet = ( ( pFrm->IsCntntFrm() || ( !bGoingUp &&
711*b1cdbd2cSJim Jagielski 			( pFrm->IsTabFrm() || pFrm->IsSctFrm() ) ) )? pFrm : 0 ) ) );
712*b1cdbd2cSJim Jagielski 	return pRet;
713*b1cdbd2cSJim Jagielski }
714*b1cdbd2cSJim Jagielski 
_FindNext()715*b1cdbd2cSJim Jagielski SwFrm *SwFrm::_FindNext()
716*b1cdbd2cSJim Jagielski {
717*b1cdbd2cSJim Jagielski 	sal_Bool bIgnoreTab = sal_False;
718*b1cdbd2cSJim Jagielski 	SwFrm *pThis = this;
719*b1cdbd2cSJim Jagielski 
720*b1cdbd2cSJim Jagielski 	if ( IsTabFrm() )
721*b1cdbd2cSJim Jagielski 	{
722*b1cdbd2cSJim Jagielski 		//Der letzte Cntnt der Tabelle wird
723*b1cdbd2cSJim Jagielski 		//gegriffen und dessen Nachfolger geliefert. Um die Spezialbeh.
724*b1cdbd2cSJim Jagielski 		//Fuer Tabellen (s.u.) auszuschalten wird bIgnoreTab gesetzt.
725*b1cdbd2cSJim Jagielski 		if ( ((SwTabFrm*)this)->GetFollow() )
726*b1cdbd2cSJim Jagielski 			return ((SwTabFrm*)this)->GetFollow();
727*b1cdbd2cSJim Jagielski 
728*b1cdbd2cSJim Jagielski 		pThis = ((SwTabFrm*)this)->FindLastCntnt();
729*b1cdbd2cSJim Jagielski 		if ( !pThis )
730*b1cdbd2cSJim Jagielski 			pThis = this;
731*b1cdbd2cSJim Jagielski 		bIgnoreTab = sal_True;
732*b1cdbd2cSJim Jagielski 	}
733*b1cdbd2cSJim Jagielski 	else if ( IsSctFrm() )
734*b1cdbd2cSJim Jagielski 	{
735*b1cdbd2cSJim Jagielski 		//Der letzte Cntnt des Bereichs wird gegriffen und dessen Nachfolger
736*b1cdbd2cSJim Jagielski 		// geliefert.
737*b1cdbd2cSJim Jagielski 		if ( ((SwSectionFrm*)this)->GetFollow() )
738*b1cdbd2cSJim Jagielski 			return ((SwSectionFrm*)this)->GetFollow();
739*b1cdbd2cSJim Jagielski 
740*b1cdbd2cSJim Jagielski 		pThis = ((SwSectionFrm*)this)->FindLastCntnt();
741*b1cdbd2cSJim Jagielski 		if ( !pThis )
742*b1cdbd2cSJim Jagielski 			pThis = this;
743*b1cdbd2cSJim Jagielski 	}
744*b1cdbd2cSJim Jagielski 	else if ( IsCntntFrm() )
745*b1cdbd2cSJim Jagielski 	{
746*b1cdbd2cSJim Jagielski 		if( ((SwCntntFrm*)this)->GetFollow() )
747*b1cdbd2cSJim Jagielski 			return ((SwCntntFrm*)this)->GetFollow();
748*b1cdbd2cSJim Jagielski 	}
749*b1cdbd2cSJim Jagielski     else if ( IsRowFrm() )
750*b1cdbd2cSJim Jagielski     {
751*b1cdbd2cSJim Jagielski         SwFrm* pMyUpper = GetUpper();
752*b1cdbd2cSJim Jagielski         if ( pMyUpper->IsTabFrm() && ((SwTabFrm*)pMyUpper)->GetFollow() )
753*b1cdbd2cSJim Jagielski             return ((SwTabFrm*)pMyUpper)->GetFollow()->GetLower();
754*b1cdbd2cSJim Jagielski         else return NULL;
755*b1cdbd2cSJim Jagielski     }
756*b1cdbd2cSJim Jagielski     else
757*b1cdbd2cSJim Jagielski 		return NULL;
758*b1cdbd2cSJim Jagielski 
759*b1cdbd2cSJim Jagielski 	SwFrm* pRet = NULL;
760*b1cdbd2cSJim Jagielski 	const sal_Bool bFtn  = pThis->IsInFtn();
761*b1cdbd2cSJim Jagielski 	if ( !bIgnoreTab && pThis->IsInTab() )
762*b1cdbd2cSJim Jagielski 	{
763*b1cdbd2cSJim Jagielski 		SwLayoutFrm *pUp = pThis->GetUpper();
764*b1cdbd2cSJim Jagielski 		while ( !pUp->IsCellFrm() )
765*b1cdbd2cSJim Jagielski 			pUp = pUp->GetUpper();
766*b1cdbd2cSJim Jagielski 		ASSERT( pUp, "Cntnt in Tabelle aber nicht in Zelle." );
767*b1cdbd2cSJim Jagielski         SwFrm* pNxt = ((SwCellFrm*)pUp)->GetFollowCell();
768*b1cdbd2cSJim Jagielski         if ( pNxt )
769*b1cdbd2cSJim Jagielski             pNxt = ((SwCellFrm*)pNxt)->ContainsCntnt();
770*b1cdbd2cSJim Jagielski         if ( !pNxt )
771*b1cdbd2cSJim Jagielski         {
772*b1cdbd2cSJim Jagielski 		    pNxt = lcl_NextFrm( pThis );
773*b1cdbd2cSJim Jagielski             if ( pUp->IsAnLower( pNxt ) )
774*b1cdbd2cSJim Jagielski 	    		pRet = pNxt;
775*b1cdbd2cSJim Jagielski         }
776*b1cdbd2cSJim Jagielski         else
777*b1cdbd2cSJim Jagielski             pRet = pNxt;
778*b1cdbd2cSJim Jagielski     }
779*b1cdbd2cSJim Jagielski 	else
780*b1cdbd2cSJim Jagielski 	{
781*b1cdbd2cSJim Jagielski 		const sal_Bool bBody = pThis->IsInDocBody();
782*b1cdbd2cSJim Jagielski 		SwFrm *pNxtCnt = lcl_NextFrm( pThis );
783*b1cdbd2cSJim Jagielski 		if ( pNxtCnt )
784*b1cdbd2cSJim Jagielski 		{
785*b1cdbd2cSJim Jagielski 			if ( bBody || bFtn )
786*b1cdbd2cSJim Jagielski 			{
787*b1cdbd2cSJim Jagielski 				while ( pNxtCnt )
788*b1cdbd2cSJim Jagielski 				{
789*b1cdbd2cSJim Jagielski                     // OD 02.04.2003 #108446# - check for endnote, only if found
790*b1cdbd2cSJim Jagielski                     // next content isn't contained in a section, that collect its
791*b1cdbd2cSJim Jagielski                     // endnotes at its end.
792*b1cdbd2cSJim Jagielski                     bool bEndn = IsInSct() && !IsSctFrm() &&
793*b1cdbd2cSJim Jagielski                                  ( !pNxtCnt->IsInSct() ||
794*b1cdbd2cSJim Jagielski                                    !pNxtCnt->FindSctFrm()->IsEndnAtEnd()
795*b1cdbd2cSJim Jagielski                                  );
796*b1cdbd2cSJim Jagielski                     if ( ( bBody && pNxtCnt->IsInDocBody() ) ||
797*b1cdbd2cSJim Jagielski                          ( pNxtCnt->IsInFtn() &&
798*b1cdbd2cSJim Jagielski                            ( bFtn ||
799*b1cdbd2cSJim Jagielski                              ( bEndn && pNxtCnt->FindFtnFrm()->GetAttr()->GetFtn().IsEndNote() )
800*b1cdbd2cSJim Jagielski                            )
801*b1cdbd2cSJim Jagielski                          )
802*b1cdbd2cSJim Jagielski                        )
803*b1cdbd2cSJim Jagielski 					{
804*b1cdbd2cSJim Jagielski 						pRet = pNxtCnt->IsInTab() ? pNxtCnt->FindTabFrm()
805*b1cdbd2cSJim Jagielski 													: (SwFrm*)pNxtCnt;
806*b1cdbd2cSJim Jagielski 						break;
807*b1cdbd2cSJim Jagielski 					}
808*b1cdbd2cSJim Jagielski 					pNxtCnt = lcl_NextFrm( pNxtCnt );
809*b1cdbd2cSJim Jagielski 				}
810*b1cdbd2cSJim Jagielski 			}
811*b1cdbd2cSJim Jagielski 			else if ( pThis->IsInFly() )
812*b1cdbd2cSJim Jagielski 			{
813*b1cdbd2cSJim Jagielski 				pRet = pNxtCnt->IsInTab() ? pNxtCnt->FindTabFrm()
814*b1cdbd2cSJim Jagielski 											: (SwFrm*)pNxtCnt;
815*b1cdbd2cSJim Jagielski 			}
816*b1cdbd2cSJim Jagielski 			else	//Fuss-/oder Kopfbereich
817*b1cdbd2cSJim Jagielski 			{
818*b1cdbd2cSJim Jagielski 				const SwFrm *pUp = pThis->GetUpper();
819*b1cdbd2cSJim Jagielski 				const SwFrm *pCntUp = pNxtCnt->GetUpper();
820*b1cdbd2cSJim Jagielski 				while ( pUp && pUp->GetUpper() &&
821*b1cdbd2cSJim Jagielski 						!pUp->IsHeaderFrm() && !pUp->IsFooterFrm() )
822*b1cdbd2cSJim Jagielski 					pUp = pUp->GetUpper();
823*b1cdbd2cSJim Jagielski 				while ( pCntUp && pCntUp->GetUpper() &&
824*b1cdbd2cSJim Jagielski 						!pCntUp->IsHeaderFrm() && !pCntUp->IsFooterFrm() )
825*b1cdbd2cSJim Jagielski 					pCntUp = pCntUp->GetUpper();
826*b1cdbd2cSJim Jagielski 				if ( pCntUp == pUp )
827*b1cdbd2cSJim Jagielski 				{
828*b1cdbd2cSJim Jagielski 					pRet = pNxtCnt->IsInTab() ? pNxtCnt->FindTabFrm()
829*b1cdbd2cSJim Jagielski 												: (SwFrm*)pNxtCnt;
830*b1cdbd2cSJim Jagielski 				}
831*b1cdbd2cSJim Jagielski 			}
832*b1cdbd2cSJim Jagielski 		}
833*b1cdbd2cSJim Jagielski 	}
834*b1cdbd2cSJim Jagielski 	if( pRet && pRet->IsInSct() )
835*b1cdbd2cSJim Jagielski 	{
836*b1cdbd2cSJim Jagielski 		SwSectionFrm* pSct = pRet->FindSctFrm();
837*b1cdbd2cSJim Jagielski 		//Fussnoten in spaltigen Rahmen duerfen nicht den Bereich
838*b1cdbd2cSJim Jagielski 		//liefern, der die Fussnoten umfasst
839*b1cdbd2cSJim Jagielski 		if( !pSct->IsAnLower( this ) &&
840*b1cdbd2cSJim Jagielski 			(!bFtn || pSct->IsInFtn() ) )
841*b1cdbd2cSJim Jagielski 			return pSct;
842*b1cdbd2cSJim Jagielski 	}
843*b1cdbd2cSJim Jagielski 	return pRet;
844*b1cdbd2cSJim Jagielski }
845*b1cdbd2cSJim Jagielski 
846*b1cdbd2cSJim Jagielski // --> OD 2005-12-01 #i27138# - add parameter <_bInSameFtn>
_FindNextCnt(const bool _bInSameFtn)847*b1cdbd2cSJim Jagielski SwCntntFrm *SwFrm::_FindNextCnt( const bool _bInSameFtn )
848*b1cdbd2cSJim Jagielski {
849*b1cdbd2cSJim Jagielski 	SwFrm *pThis = this;
850*b1cdbd2cSJim Jagielski 
851*b1cdbd2cSJim Jagielski 	if ( IsTabFrm() )
852*b1cdbd2cSJim Jagielski 	{
853*b1cdbd2cSJim Jagielski 		if ( ((SwTabFrm*)this)->GetFollow() )
854*b1cdbd2cSJim Jagielski 		{
855*b1cdbd2cSJim Jagielski 			pThis = ((SwTabFrm*)this)->GetFollow()->ContainsCntnt();
856*b1cdbd2cSJim Jagielski 			if( pThis )
857*b1cdbd2cSJim Jagielski 				return (SwCntntFrm*)pThis;
858*b1cdbd2cSJim Jagielski 		}
859*b1cdbd2cSJim Jagielski 		pThis = ((SwTabFrm*)this)->FindLastCntnt();
860*b1cdbd2cSJim Jagielski 		if ( !pThis )
861*b1cdbd2cSJim Jagielski 			return 0;
862*b1cdbd2cSJim Jagielski 	}
863*b1cdbd2cSJim Jagielski 	else if ( IsSctFrm() )
864*b1cdbd2cSJim Jagielski 	{
865*b1cdbd2cSJim Jagielski 		if ( ((SwSectionFrm*)this)->GetFollow() )
866*b1cdbd2cSJim Jagielski 		{
867*b1cdbd2cSJim Jagielski 			pThis = ((SwSectionFrm*)this)->GetFollow()->ContainsCntnt();
868*b1cdbd2cSJim Jagielski 			if( pThis )
869*b1cdbd2cSJim Jagielski 				return (SwCntntFrm*)pThis;
870*b1cdbd2cSJim Jagielski 		}
871*b1cdbd2cSJim Jagielski 		pThis = ((SwSectionFrm*)this)->FindLastCntnt();
872*b1cdbd2cSJim Jagielski 		if ( !pThis )
873*b1cdbd2cSJim Jagielski 			return 0;
874*b1cdbd2cSJim Jagielski 	}
875*b1cdbd2cSJim Jagielski 	else if ( IsCntntFrm() && ((SwCntntFrm*)this)->GetFollow() )
876*b1cdbd2cSJim Jagielski 		return ((SwCntntFrm*)this)->GetFollow();
877*b1cdbd2cSJim Jagielski 
878*b1cdbd2cSJim Jagielski 	if ( pThis->IsCntntFrm() )
879*b1cdbd2cSJim Jagielski 	{
880*b1cdbd2cSJim Jagielski 		const sal_Bool bBody = pThis->IsInDocBody();
881*b1cdbd2cSJim Jagielski 		const sal_Bool bFtn  = pThis->IsInFtn();
882*b1cdbd2cSJim Jagielski 		SwCntntFrm *pNxtCnt = ((SwCntntFrm*)pThis)->GetNextCntntFrm();
883*b1cdbd2cSJim Jagielski 		if ( pNxtCnt )
884*b1cdbd2cSJim Jagielski 		{
885*b1cdbd2cSJim Jagielski             // --> OD 2005-12-01 #i27138#
886*b1cdbd2cSJim Jagielski             if ( bBody || ( bFtn && !_bInSameFtn ) )
887*b1cdbd2cSJim Jagielski             // <--
888*b1cdbd2cSJim Jagielski 			{
889*b1cdbd2cSJim Jagielski                 // handling for environments 'footnotes' and 'document body frames':
890*b1cdbd2cSJim Jagielski                 while ( pNxtCnt )
891*b1cdbd2cSJim Jagielski 				{
892*b1cdbd2cSJim Jagielski 					if ( (bBody && pNxtCnt->IsInDocBody()) ||
893*b1cdbd2cSJim Jagielski 						 (bFtn	&& pNxtCnt->IsInFtn()) )
894*b1cdbd2cSJim Jagielski 						return pNxtCnt;
895*b1cdbd2cSJim Jagielski 					pNxtCnt = pNxtCnt->GetNextCntntFrm();
896*b1cdbd2cSJim Jagielski 				}
897*b1cdbd2cSJim Jagielski 			}
898*b1cdbd2cSJim Jagielski             // --> OD 2005-12-01 #i27138#
899*b1cdbd2cSJim Jagielski             else if ( bFtn && _bInSameFtn )
900*b1cdbd2cSJim Jagielski             {
901*b1cdbd2cSJim Jagielski                 // handling for environments 'each footnote':
902*b1cdbd2cSJim Jagielski                 // Assure that found next content frame belongs to the same footnotes
903*b1cdbd2cSJim Jagielski                 const SwFtnFrm* pFtnFrmOfNext( pNxtCnt->FindFtnFrm() );
904*b1cdbd2cSJim Jagielski                 const SwFtnFrm* pFtnFrmOfCurr( pThis->FindFtnFrm() );
905*b1cdbd2cSJim Jagielski                 ASSERT( pFtnFrmOfCurr,
906*b1cdbd2cSJim Jagielski                         "<SwFrm::_FindNextCnt() - unknown layout situation: current frame has to have an upper footnote frame." );
907*b1cdbd2cSJim Jagielski                 if ( pFtnFrmOfNext == pFtnFrmOfCurr )
908*b1cdbd2cSJim Jagielski                 {
909*b1cdbd2cSJim Jagielski                     return pNxtCnt;
910*b1cdbd2cSJim Jagielski                 }
911*b1cdbd2cSJim Jagielski                 else if ( pFtnFrmOfCurr->GetFollow() )
912*b1cdbd2cSJim Jagielski                 {
913*b1cdbd2cSJim Jagielski                     // next content frame has to be the first content frame
914*b1cdbd2cSJim Jagielski                     // in the follow footnote, which contains a content frame.
915*b1cdbd2cSJim Jagielski                     SwFtnFrm* pFollowFtnFrmOfCurr(
916*b1cdbd2cSJim Jagielski                                         const_cast<SwFtnFrm*>(pFtnFrmOfCurr) );
917*b1cdbd2cSJim Jagielski                     pNxtCnt = 0L;
918*b1cdbd2cSJim Jagielski                     do {
919*b1cdbd2cSJim Jagielski                         pFollowFtnFrmOfCurr = pFollowFtnFrmOfCurr->GetFollow();
920*b1cdbd2cSJim Jagielski                         pNxtCnt = pFollowFtnFrmOfCurr->ContainsCntnt();
921*b1cdbd2cSJim Jagielski                     } while ( !pNxtCnt && pFollowFtnFrmOfCurr->GetFollow() );
922*b1cdbd2cSJim Jagielski                     return pNxtCnt;
923*b1cdbd2cSJim Jagielski                 }
924*b1cdbd2cSJim Jagielski                 else
925*b1cdbd2cSJim Jagielski                 {
926*b1cdbd2cSJim Jagielski                     // current content frame is the last content frame in the
927*b1cdbd2cSJim Jagielski                     // footnote - no next content frame exists.
928*b1cdbd2cSJim Jagielski                     return 0L;
929*b1cdbd2cSJim Jagielski                 }
930*b1cdbd2cSJim Jagielski             }
931*b1cdbd2cSJim Jagielski             // <--
932*b1cdbd2cSJim Jagielski 			else if ( pThis->IsInFly() )
933*b1cdbd2cSJim Jagielski                 // handling for environments 'unlinked fly frame' and
934*b1cdbd2cSJim Jagielski                 // 'group of linked fly frames':
935*b1cdbd2cSJim Jagielski                 return pNxtCnt;
936*b1cdbd2cSJim Jagielski             else
937*b1cdbd2cSJim Jagielski 			{
938*b1cdbd2cSJim Jagielski                 // handling for environments 'page header' and 'page footer':
939*b1cdbd2cSJim Jagielski                 const SwFrm *pUp = pThis->GetUpper();
940*b1cdbd2cSJim Jagielski 				const SwFrm *pCntUp = pNxtCnt->GetUpper();
941*b1cdbd2cSJim Jagielski 				while ( pUp && pUp->GetUpper() &&
942*b1cdbd2cSJim Jagielski 						!pUp->IsHeaderFrm() && !pUp->IsFooterFrm() )
943*b1cdbd2cSJim Jagielski 					pUp = pUp->GetUpper();
944*b1cdbd2cSJim Jagielski 				while ( pCntUp && pCntUp->GetUpper() &&
945*b1cdbd2cSJim Jagielski 						!pCntUp->IsHeaderFrm() && !pCntUp->IsFooterFrm() )
946*b1cdbd2cSJim Jagielski 					pCntUp = pCntUp->GetUpper();
947*b1cdbd2cSJim Jagielski 				if ( pCntUp == pUp )
948*b1cdbd2cSJim Jagielski 					return pNxtCnt;
949*b1cdbd2cSJim Jagielski 			}
950*b1cdbd2cSJim Jagielski 		}
951*b1cdbd2cSJim Jagielski 	}
952*b1cdbd2cSJim Jagielski 	return 0;
953*b1cdbd2cSJim Jagielski }
954*b1cdbd2cSJim Jagielski 
955*b1cdbd2cSJim Jagielski /** method to determine previous content frame in the same environment
956*b1cdbd2cSJim Jagielski     for a flow frame (content frame, table frame, section frame)
957*b1cdbd2cSJim Jagielski 
958*b1cdbd2cSJim Jagielski     OD 2005-11-30 #i27138#
959*b1cdbd2cSJim Jagielski 
960*b1cdbd2cSJim Jagielski     @author OD
961*b1cdbd2cSJim Jagielski */
_FindPrevCnt(const bool _bInSameFtn)962*b1cdbd2cSJim Jagielski SwCntntFrm* SwFrm::_FindPrevCnt( const bool _bInSameFtn )
963*b1cdbd2cSJim Jagielski {
964*b1cdbd2cSJim Jagielski     if ( !IsFlowFrm() )
965*b1cdbd2cSJim Jagielski     {
966*b1cdbd2cSJim Jagielski         // nothing to do, if current frame isn't a flow frame.
967*b1cdbd2cSJim Jagielski         return 0L;
968*b1cdbd2cSJim Jagielski     }
969*b1cdbd2cSJim Jagielski 
970*b1cdbd2cSJim Jagielski     SwCntntFrm* pPrevCntntFrm( 0L );
971*b1cdbd2cSJim Jagielski 
972*b1cdbd2cSJim Jagielski     // Because method <SwCntntFrm::GetPrevCntntFrm()> is used to travel
973*b1cdbd2cSJim Jagielski     // through the layout, a content frame, at which the travel starts, is needed.
974*b1cdbd2cSJim Jagielski     SwCntntFrm* pCurrCntntFrm = dynamic_cast<SwCntntFrm*>(this);
975*b1cdbd2cSJim Jagielski 
976*b1cdbd2cSJim Jagielski     // perform shortcut, if current frame is a follow, and
977*b1cdbd2cSJim Jagielski     // determine <pCurrCntntFrm>, if current frame is a table or section frame
978*b1cdbd2cSJim Jagielski     if ( pCurrCntntFrm && pCurrCntntFrm->IsFollow() )
979*b1cdbd2cSJim Jagielski     {
980*b1cdbd2cSJim Jagielski         // previous content frame is its master content frame
981*b1cdbd2cSJim Jagielski         pPrevCntntFrm = pCurrCntntFrm->FindMaster();
982*b1cdbd2cSJim Jagielski     }
983*b1cdbd2cSJim Jagielski     else if ( IsTabFrm() )
984*b1cdbd2cSJim Jagielski     {
985*b1cdbd2cSJim Jagielski         SwTabFrm* pTabFrm( static_cast<SwTabFrm*>(this) );
986*b1cdbd2cSJim Jagielski         if ( pTabFrm->IsFollow() )
987*b1cdbd2cSJim Jagielski         {
988*b1cdbd2cSJim Jagielski             // previous content frame is the last content of its master table frame
989*b1cdbd2cSJim Jagielski             pPrevCntntFrm = pTabFrm->FindMaster()->FindLastCntnt();
990*b1cdbd2cSJim Jagielski         }
991*b1cdbd2cSJim Jagielski         else
992*b1cdbd2cSJim Jagielski         {
993*b1cdbd2cSJim Jagielski             // start content frame for the search is the first content frame of
994*b1cdbd2cSJim Jagielski             // the table frame.
995*b1cdbd2cSJim Jagielski             pCurrCntntFrm = pTabFrm->ContainsCntnt();
996*b1cdbd2cSJim Jagielski         }
997*b1cdbd2cSJim Jagielski     }
998*b1cdbd2cSJim Jagielski     else if ( IsSctFrm() )
999*b1cdbd2cSJim Jagielski     {
1000*b1cdbd2cSJim Jagielski         SwSectionFrm* pSectFrm( static_cast<SwSectionFrm*>(this) );
1001*b1cdbd2cSJim Jagielski         if ( pSectFrm->IsFollow() )
1002*b1cdbd2cSJim Jagielski         {
1003*b1cdbd2cSJim Jagielski             // previous content frame is the last content of its master section frame
1004*b1cdbd2cSJim Jagielski             pPrevCntntFrm = pSectFrm->FindMaster()->FindLastCntnt();
1005*b1cdbd2cSJim Jagielski         }
1006*b1cdbd2cSJim Jagielski         else
1007*b1cdbd2cSJim Jagielski         {
1008*b1cdbd2cSJim Jagielski             // start content frame for the search is the first content frame of
1009*b1cdbd2cSJim Jagielski             // the section frame.
1010*b1cdbd2cSJim Jagielski             pCurrCntntFrm = pSectFrm->ContainsCntnt();
1011*b1cdbd2cSJim Jagielski         }
1012*b1cdbd2cSJim Jagielski     }
1013*b1cdbd2cSJim Jagielski 
1014*b1cdbd2cSJim Jagielski     // search for next content frame, depending on the environment, in which
1015*b1cdbd2cSJim Jagielski     // the current frame is in.
1016*b1cdbd2cSJim Jagielski     if ( !pPrevCntntFrm && pCurrCntntFrm )
1017*b1cdbd2cSJim Jagielski     {
1018*b1cdbd2cSJim Jagielski         pPrevCntntFrm = pCurrCntntFrm->GetPrevCntntFrm();
1019*b1cdbd2cSJim Jagielski         if ( pPrevCntntFrm )
1020*b1cdbd2cSJim Jagielski         {
1021*b1cdbd2cSJim Jagielski             if ( pCurrCntntFrm->IsInFly() )
1022*b1cdbd2cSJim Jagielski             {
1023*b1cdbd2cSJim Jagielski                 // handling for environments 'unlinked fly frame' and
1024*b1cdbd2cSJim Jagielski                 // 'group of linked fly frames':
1025*b1cdbd2cSJim Jagielski                 // Nothing to do, <pPrevCntntFrm> is the one
1026*b1cdbd2cSJim Jagielski             }
1027*b1cdbd2cSJim Jagielski             else
1028*b1cdbd2cSJim Jagielski             {
1029*b1cdbd2cSJim Jagielski                 const bool bInDocBody = pCurrCntntFrm->IsInDocBody();
1030*b1cdbd2cSJim Jagielski                 const bool bInFtn  = pCurrCntntFrm->IsInFtn();
1031*b1cdbd2cSJim Jagielski                 if ( bInDocBody || ( bInFtn && !_bInSameFtn ) )
1032*b1cdbd2cSJim Jagielski                 {
1033*b1cdbd2cSJim Jagielski                     // handling for environments 'footnotes' and 'document body frames':
1034*b1cdbd2cSJim Jagielski                     // Assure that found previous frame is also in one of these
1035*b1cdbd2cSJim Jagielski                     // environments. Otherwise, travel further
1036*b1cdbd2cSJim Jagielski                     while ( pPrevCntntFrm )
1037*b1cdbd2cSJim Jagielski                     {
1038*b1cdbd2cSJim Jagielski                         if ( ( bInDocBody && pPrevCntntFrm->IsInDocBody() ) ||
1039*b1cdbd2cSJim Jagielski                              ( bInFtn && pPrevCntntFrm->IsInFtn() ) )
1040*b1cdbd2cSJim Jagielski                         {
1041*b1cdbd2cSJim Jagielski                             break;
1042*b1cdbd2cSJim Jagielski                         }
1043*b1cdbd2cSJim Jagielski                         pPrevCntntFrm = pPrevCntntFrm->GetPrevCntntFrm();
1044*b1cdbd2cSJim Jagielski                     }
1045*b1cdbd2cSJim Jagielski                 }
1046*b1cdbd2cSJim Jagielski                 else if ( bInFtn && _bInSameFtn )
1047*b1cdbd2cSJim Jagielski                 {
1048*b1cdbd2cSJim Jagielski                     // handling for environments 'each footnote':
1049*b1cdbd2cSJim Jagielski                     // Assure that found next content frame belongs to the same footnotes
1050*b1cdbd2cSJim Jagielski                     const SwFtnFrm* pFtnFrmOfPrev( pPrevCntntFrm->FindFtnFrm() );
1051*b1cdbd2cSJim Jagielski                     const SwFtnFrm* pFtnFrmOfCurr( pCurrCntntFrm->FindFtnFrm() );
1052*b1cdbd2cSJim Jagielski                     if ( pFtnFrmOfPrev != pFtnFrmOfCurr )
1053*b1cdbd2cSJim Jagielski                     {
1054*b1cdbd2cSJim Jagielski                         if ( pFtnFrmOfCurr->GetMaster() )
1055*b1cdbd2cSJim Jagielski                         {
1056*b1cdbd2cSJim Jagielski                             SwFtnFrm* pMasterFtnFrmOfCurr(
1057*b1cdbd2cSJim Jagielski                                         const_cast<SwFtnFrm*>(pFtnFrmOfCurr) );
1058*b1cdbd2cSJim Jagielski                             pPrevCntntFrm = 0L;
1059*b1cdbd2cSJim Jagielski                             // --> OD 2007-07-05 #146872#
1060*b1cdbd2cSJim Jagielski                             // correct wrong loop-condition
1061*b1cdbd2cSJim Jagielski                             do {
1062*b1cdbd2cSJim Jagielski                                 pMasterFtnFrmOfCurr = pMasterFtnFrmOfCurr->GetMaster();
1063*b1cdbd2cSJim Jagielski                                 pPrevCntntFrm = pMasterFtnFrmOfCurr->FindLastCntnt();
1064*b1cdbd2cSJim Jagielski                             } while ( !pPrevCntntFrm &&
1065*b1cdbd2cSJim Jagielski                                       pMasterFtnFrmOfCurr->GetMaster() );
1066*b1cdbd2cSJim Jagielski                             // <--
1067*b1cdbd2cSJim Jagielski                         }
1068*b1cdbd2cSJim Jagielski                         else
1069*b1cdbd2cSJim Jagielski                         {
1070*b1cdbd2cSJim Jagielski                             // current content frame is the first content in the
1071*b1cdbd2cSJim Jagielski                             // footnote - no previous content exists.
1072*b1cdbd2cSJim Jagielski                             pPrevCntntFrm = 0L;;
1073*b1cdbd2cSJim Jagielski                         }
1074*b1cdbd2cSJim Jagielski                     }
1075*b1cdbd2cSJim Jagielski                 }
1076*b1cdbd2cSJim Jagielski                 else
1077*b1cdbd2cSJim Jagielski                 {
1078*b1cdbd2cSJim Jagielski                     // handling for environments 'page header' and 'page footer':
1079*b1cdbd2cSJim Jagielski                     // Assure that found previous frame is also in the same
1080*b1cdbd2cSJim Jagielski                     // page header respectively page footer as <pCurrCntntFrm>
1081*b1cdbd2cSJim Jagielski                     // Note: At this point its clear, that <pCurrCntntFrm> has
1082*b1cdbd2cSJim Jagielski                     //       to be inside a page header or page footer and that
1083*b1cdbd2cSJim Jagielski                     //       neither <pCurrCntntFrm> nor <pPrevCntntFrm> are
1084*b1cdbd2cSJim Jagielski                     //       inside a fly frame.
1085*b1cdbd2cSJim Jagielski                     //       Thus, method <FindFooterOrHeader()> can be used.
1086*b1cdbd2cSJim Jagielski                     ASSERT( pCurrCntntFrm->FindFooterOrHeader(),
1087*b1cdbd2cSJim Jagielski                             "<SwFrm::_FindPrevCnt()> - unknown layout situation: current frame should be in page header or page footer" );
1088*b1cdbd2cSJim Jagielski                     ASSERT( !pPrevCntntFrm->IsInFly(),
1089*b1cdbd2cSJim Jagielski                             "<SwFrm::_FindPrevCnt()> - unknown layout situation: found previous frame should *not* be inside a fly frame." );
1090*b1cdbd2cSJim Jagielski                     if ( pPrevCntntFrm->FindFooterOrHeader() !=
1091*b1cdbd2cSJim Jagielski                                             pCurrCntntFrm->FindFooterOrHeader() )
1092*b1cdbd2cSJim Jagielski                     {
1093*b1cdbd2cSJim Jagielski                         pPrevCntntFrm = 0L;
1094*b1cdbd2cSJim Jagielski                     }
1095*b1cdbd2cSJim Jagielski                 }
1096*b1cdbd2cSJim Jagielski             }
1097*b1cdbd2cSJim Jagielski         }
1098*b1cdbd2cSJim Jagielski     }
1099*b1cdbd2cSJim Jagielski 
1100*b1cdbd2cSJim Jagielski     return pPrevCntntFrm;
1101*b1cdbd2cSJim Jagielski }
1102*b1cdbd2cSJim Jagielski 
_FindPrev()1103*b1cdbd2cSJim Jagielski SwFrm *SwFrm::_FindPrev()
1104*b1cdbd2cSJim Jagielski {
1105*b1cdbd2cSJim Jagielski 	sal_Bool bIgnoreTab = sal_False;
1106*b1cdbd2cSJim Jagielski 	SwFrm *pThis = this;
1107*b1cdbd2cSJim Jagielski 
1108*b1cdbd2cSJim Jagielski 	if ( IsTabFrm() )
1109*b1cdbd2cSJim Jagielski 	{
1110*b1cdbd2cSJim Jagielski 		//Der erste Cntnt der Tabelle wird
1111*b1cdbd2cSJim Jagielski 		//gegriffen und dessen Vorgaenger geliefert. Um die Spezialbeh.
1112*b1cdbd2cSJim Jagielski 		//Fuer Tabellen (s.u.) auszuschalten wird bIgnoreTab gesetzt.
1113*b1cdbd2cSJim Jagielski         if ( ((SwTabFrm*)this)->IsFollow() )
1114*b1cdbd2cSJim Jagielski             return ((SwTabFrm*)this)->FindMaster();
1115*b1cdbd2cSJim Jagielski         else
1116*b1cdbd2cSJim Jagielski 		    pThis = ((SwTabFrm*)this)->ContainsCntnt();
1117*b1cdbd2cSJim Jagielski 		bIgnoreTab = sal_True;
1118*b1cdbd2cSJim Jagielski 	}
1119*b1cdbd2cSJim Jagielski 
1120*b1cdbd2cSJim Jagielski     if ( pThis && pThis->IsCntntFrm() )
1121*b1cdbd2cSJim Jagielski     {
1122*b1cdbd2cSJim Jagielski 		SwCntntFrm *pPrvCnt = ((SwCntntFrm*)pThis)->GetPrevCntntFrm();
1123*b1cdbd2cSJim Jagielski 		if( !pPrvCnt )
1124*b1cdbd2cSJim Jagielski 			return 0;
1125*b1cdbd2cSJim Jagielski 		if ( !bIgnoreTab && pThis->IsInTab() )
1126*b1cdbd2cSJim Jagielski 		{
1127*b1cdbd2cSJim Jagielski 			SwLayoutFrm *pUp = pThis->GetUpper();
1128*b1cdbd2cSJim Jagielski 			while ( !pUp->IsCellFrm() )
1129*b1cdbd2cSJim Jagielski 				pUp = pUp->GetUpper();
1130*b1cdbd2cSJim Jagielski 			ASSERT( pUp, "Cntnt in Tabelle aber nicht in Zelle." );
1131*b1cdbd2cSJim Jagielski 			if ( pUp->IsAnLower( pPrvCnt ) )
1132*b1cdbd2cSJim Jagielski 				return pPrvCnt;
1133*b1cdbd2cSJim Jagielski 		}
1134*b1cdbd2cSJim Jagielski 		else
1135*b1cdbd2cSJim Jagielski 		{
1136*b1cdbd2cSJim Jagielski 			SwFrm* pRet;
1137*b1cdbd2cSJim Jagielski 			const sal_Bool bBody = pThis->IsInDocBody();
1138*b1cdbd2cSJim Jagielski 			const sal_Bool bFtn  = bBody ? sal_False : pThis->IsInFtn();
1139*b1cdbd2cSJim Jagielski 			if ( bBody || bFtn )
1140*b1cdbd2cSJim Jagielski 			{
1141*b1cdbd2cSJim Jagielski 				while ( pPrvCnt )
1142*b1cdbd2cSJim Jagielski 				{
1143*b1cdbd2cSJim Jagielski 					if ( (bBody && pPrvCnt->IsInDocBody()) ||
1144*b1cdbd2cSJim Jagielski 							(bFtn	&& pPrvCnt->IsInFtn()) )
1145*b1cdbd2cSJim Jagielski 					{
1146*b1cdbd2cSJim Jagielski 						pRet = pPrvCnt->IsInTab() ? pPrvCnt->FindTabFrm()
1147*b1cdbd2cSJim Jagielski 												  : (SwFrm*)pPrvCnt;
1148*b1cdbd2cSJim Jagielski 						return pRet;
1149*b1cdbd2cSJim Jagielski 					}
1150*b1cdbd2cSJim Jagielski 					pPrvCnt = pPrvCnt->GetPrevCntntFrm();
1151*b1cdbd2cSJim Jagielski 				}
1152*b1cdbd2cSJim Jagielski 			}
1153*b1cdbd2cSJim Jagielski 			else if ( pThis->IsInFly() )
1154*b1cdbd2cSJim Jagielski 			{
1155*b1cdbd2cSJim Jagielski 				pRet = pPrvCnt->IsInTab() ? pPrvCnt->FindTabFrm()
1156*b1cdbd2cSJim Jagielski 											: (SwFrm*)pPrvCnt;
1157*b1cdbd2cSJim Jagielski 				return pRet;
1158*b1cdbd2cSJim Jagielski 			}
1159*b1cdbd2cSJim Jagielski 			else	//Fuss-/oder Kopfbereich oder Fly
1160*b1cdbd2cSJim Jagielski 			{
1161*b1cdbd2cSJim Jagielski 				const SwFrm *pUp = pThis->GetUpper();
1162*b1cdbd2cSJim Jagielski 				const SwFrm *pCntUp = pPrvCnt->GetUpper();
1163*b1cdbd2cSJim Jagielski 				while ( pUp && pUp->GetUpper() &&
1164*b1cdbd2cSJim Jagielski 						!pUp->IsHeaderFrm() && !pUp->IsFooterFrm() )
1165*b1cdbd2cSJim Jagielski 					pUp = pUp->GetUpper();
1166*b1cdbd2cSJim Jagielski 				while ( pCntUp && pCntUp->GetUpper() )
1167*b1cdbd2cSJim Jagielski 					pCntUp = pCntUp->GetUpper();
1168*b1cdbd2cSJim Jagielski 				if ( pCntUp == pUp )
1169*b1cdbd2cSJim Jagielski 				{
1170*b1cdbd2cSJim Jagielski 					pRet = pPrvCnt->IsInTab() ? pPrvCnt->FindTabFrm()
1171*b1cdbd2cSJim Jagielski 												: (SwFrm*)pPrvCnt;
1172*b1cdbd2cSJim Jagielski 					return pRet;
1173*b1cdbd2cSJim Jagielski 				}
1174*b1cdbd2cSJim Jagielski 			}
1175*b1cdbd2cSJim Jagielski 		}
1176*b1cdbd2cSJim Jagielski 	}
1177*b1cdbd2cSJim Jagielski 	return 0;
1178*b1cdbd2cSJim Jagielski }
1179*b1cdbd2cSJim Jagielski 
ImplInvalidateNextPos(sal_Bool bNoFtn)1180*b1cdbd2cSJim Jagielski void SwFrm::ImplInvalidateNextPos( sal_Bool bNoFtn )
1181*b1cdbd2cSJim Jagielski {
1182*b1cdbd2cSJim Jagielski 	SwFrm *pFrm;
1183*b1cdbd2cSJim Jagielski 	if ( 0 != (pFrm = _FindNext()) )
1184*b1cdbd2cSJim Jagielski 	{
1185*b1cdbd2cSJim Jagielski 		if( pFrm->IsSctFrm() )
1186*b1cdbd2cSJim Jagielski 		{
1187*b1cdbd2cSJim Jagielski 			while( pFrm && pFrm->IsSctFrm() )
1188*b1cdbd2cSJim Jagielski 			{
1189*b1cdbd2cSJim Jagielski 				if( ((SwSectionFrm*)pFrm)->GetSection() )
1190*b1cdbd2cSJim Jagielski 				{
1191*b1cdbd2cSJim Jagielski 					SwFrm* pTmp = ((SwSectionFrm*)pFrm)->ContainsAny();
1192*b1cdbd2cSJim Jagielski 					if( pTmp )
1193*b1cdbd2cSJim Jagielski                         pTmp->InvalidatePos();
1194*b1cdbd2cSJim Jagielski 					else if( !bNoFtn )
1195*b1cdbd2cSJim Jagielski 						((SwSectionFrm*)pFrm)->InvalidateFtnPos();
1196*b1cdbd2cSJim Jagielski 					if( !IsInSct() || FindSctFrm()->GetFollow() != pFrm )
1197*b1cdbd2cSJim Jagielski 						pFrm->InvalidatePos();
1198*b1cdbd2cSJim Jagielski 					return;
1199*b1cdbd2cSJim Jagielski 				}
1200*b1cdbd2cSJim Jagielski 				pFrm = pFrm->FindNext();
1201*b1cdbd2cSJim Jagielski 			}
1202*b1cdbd2cSJim Jagielski 			if( pFrm )
1203*b1cdbd2cSJim Jagielski 			{
1204*b1cdbd2cSJim Jagielski 				if ( pFrm->IsSctFrm())
1205*b1cdbd2cSJim Jagielski 				{ // Damit der Inhalt eines Bereichs die Chance erhaelt,
1206*b1cdbd2cSJim Jagielski 				  // die Seite zu wechseln, muss er ebenfalls invalidiert werden.
1207*b1cdbd2cSJim Jagielski 					SwFrm* pTmp = ((SwSectionFrm*)pFrm)->ContainsAny();
1208*b1cdbd2cSJim Jagielski 					if( pTmp )
1209*b1cdbd2cSJim Jagielski                         pTmp->InvalidatePos();
1210*b1cdbd2cSJim Jagielski 					if( !IsInSct() || FindSctFrm()->GetFollow() != pFrm )
1211*b1cdbd2cSJim Jagielski 						pFrm->InvalidatePos();
1212*b1cdbd2cSJim Jagielski 				}
1213*b1cdbd2cSJim Jagielski 				else
1214*b1cdbd2cSJim Jagielski 					pFrm->InvalidatePos();
1215*b1cdbd2cSJim Jagielski 			}
1216*b1cdbd2cSJim Jagielski 		}
1217*b1cdbd2cSJim Jagielski 		else
1218*b1cdbd2cSJim Jagielski 			pFrm->InvalidatePos();
1219*b1cdbd2cSJim Jagielski 	}
1220*b1cdbd2cSJim Jagielski }
1221*b1cdbd2cSJim Jagielski 
1222*b1cdbd2cSJim Jagielski /** method to invalidate printing area of next frame
1223*b1cdbd2cSJim Jagielski 
1224*b1cdbd2cSJim Jagielski     OD 09.01.2004 #i11859#
1225*b1cdbd2cSJim Jagielski 
1226*b1cdbd2cSJim Jagielski     @author OD
1227*b1cdbd2cSJim Jagielski 
1228*b1cdbd2cSJim Jagielski     FME 2004-04-19 #i27145# Moved function from SwTxtFrm to SwFrm
1229*b1cdbd2cSJim Jagielski */
InvalidateNextPrtArea()1230*b1cdbd2cSJim Jagielski void SwFrm::InvalidateNextPrtArea()
1231*b1cdbd2cSJim Jagielski {
1232*b1cdbd2cSJim Jagielski     // determine next frame
1233*b1cdbd2cSJim Jagielski     SwFrm* pNextFrm = FindNext();
1234*b1cdbd2cSJim Jagielski     // skip empty section frames and hidden text frames
1235*b1cdbd2cSJim Jagielski     {
1236*b1cdbd2cSJim Jagielski         while ( pNextFrm &&
1237*b1cdbd2cSJim Jagielski                 ( ( pNextFrm->IsSctFrm() &&
1238*b1cdbd2cSJim Jagielski                     !static_cast<SwSectionFrm*>(pNextFrm)->GetSection() ) ||
1239*b1cdbd2cSJim Jagielski                   ( pNextFrm->IsTxtFrm() &&
1240*b1cdbd2cSJim Jagielski                     static_cast<SwTxtFrm*>(pNextFrm)->IsHiddenNow() ) ) )
1241*b1cdbd2cSJim Jagielski         {
1242*b1cdbd2cSJim Jagielski             pNextFrm = pNextFrm->FindNext();
1243*b1cdbd2cSJim Jagielski         }
1244*b1cdbd2cSJim Jagielski     }
1245*b1cdbd2cSJim Jagielski 
1246*b1cdbd2cSJim Jagielski     // Invalidate printing area of found next frame
1247*b1cdbd2cSJim Jagielski     if ( pNextFrm )
1248*b1cdbd2cSJim Jagielski     {
1249*b1cdbd2cSJim Jagielski         if ( pNextFrm->IsSctFrm() )
1250*b1cdbd2cSJim Jagielski         {
1251*b1cdbd2cSJim Jagielski             // Invalidate printing area of found section frame, if
1252*b1cdbd2cSJim Jagielski             // (1) this text frame isn't in a section OR
1253*b1cdbd2cSJim Jagielski             // (2) found section frame isn't a follow of the section frame this
1254*b1cdbd2cSJim Jagielski             //     text frame is in.
1255*b1cdbd2cSJim Jagielski             if ( !IsInSct() || FindSctFrm()->GetFollow() != pNextFrm )
1256*b1cdbd2cSJim Jagielski             {
1257*b1cdbd2cSJim Jagielski                 pNextFrm->InvalidatePrt();
1258*b1cdbd2cSJim Jagielski             }
1259*b1cdbd2cSJim Jagielski 
1260*b1cdbd2cSJim Jagielski             // Invalidate printing area of first content in found section.
1261*b1cdbd2cSJim Jagielski             SwFrm* pFstCntntOfSctFrm =
1262*b1cdbd2cSJim Jagielski                     static_cast<SwSectionFrm*>(pNextFrm)->ContainsAny();
1263*b1cdbd2cSJim Jagielski             if ( pFstCntntOfSctFrm )
1264*b1cdbd2cSJim Jagielski             {
1265*b1cdbd2cSJim Jagielski                 pFstCntntOfSctFrm->InvalidatePrt();
1266*b1cdbd2cSJim Jagielski             }
1267*b1cdbd2cSJim Jagielski         }
1268*b1cdbd2cSJim Jagielski         else
1269*b1cdbd2cSJim Jagielski         {
1270*b1cdbd2cSJim Jagielski             pNextFrm->InvalidatePrt();
1271*b1cdbd2cSJim Jagielski         }
1272*b1cdbd2cSJim Jagielski     }
1273*b1cdbd2cSJim Jagielski }
1274*b1cdbd2cSJim Jagielski 
1275*b1cdbd2cSJim Jagielski /*************************************************************************
1276*b1cdbd2cSJim Jagielski |*
1277*b1cdbd2cSJim Jagielski |*	  lcl_IsInColSect()
1278*b1cdbd2cSJim Jagielski |*		liefert nur sal_True, wenn der Frame _direkt_ in einem spaltigen Bereich steht,
1279*b1cdbd2cSJim Jagielski |*		nicht etwa, wenn er in einer Tabelle steht, die in einem spaltigen Bereich ist.
1280*b1cdbd2cSJim Jagielski |*
1281*b1cdbd2cSJim Jagielski |*************************************************************************/
1282*b1cdbd2cSJim Jagielski 
lcl_IsInColSct(const SwFrm * pUp)1283*b1cdbd2cSJim Jagielski sal_Bool lcl_IsInColSct( const SwFrm *pUp )
1284*b1cdbd2cSJim Jagielski {
1285*b1cdbd2cSJim Jagielski 	sal_Bool bRet = sal_False;
1286*b1cdbd2cSJim Jagielski 	while( pUp )
1287*b1cdbd2cSJim Jagielski 	{
1288*b1cdbd2cSJim Jagielski 		if( pUp->IsColumnFrm() )
1289*b1cdbd2cSJim Jagielski 			bRet = sal_True;
1290*b1cdbd2cSJim Jagielski 		else if( pUp->IsSctFrm() )
1291*b1cdbd2cSJim Jagielski 			return bRet;
1292*b1cdbd2cSJim Jagielski 		else if( pUp->IsTabFrm() )
1293*b1cdbd2cSJim Jagielski 			return sal_False;
1294*b1cdbd2cSJim Jagielski 		pUp = pUp->GetUpper();
1295*b1cdbd2cSJim Jagielski 	}
1296*b1cdbd2cSJim Jagielski 	return sal_False;
1297*b1cdbd2cSJim Jagielski }
1298*b1cdbd2cSJim Jagielski 
1299*b1cdbd2cSJim Jagielski /*************************************************************************
1300*b1cdbd2cSJim Jagielski |*
1301*b1cdbd2cSJim Jagielski |*	  SwFrm::IsMoveable();
1302*b1cdbd2cSJim Jagielski |*
1303*b1cdbd2cSJim Jagielski |*	  Ersterstellung	MA 09. Mar. 93
1304*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	MA 05. May. 95
1305*b1cdbd2cSJim Jagielski |*
1306*b1cdbd2cSJim Jagielski |*************************************************************************/
1307*b1cdbd2cSJim Jagielski /** determine, if frame is moveable in given environment
1308*b1cdbd2cSJim Jagielski 
1309*b1cdbd2cSJim Jagielski     OD 08.08.2003 #110978#
1310*b1cdbd2cSJim Jagielski     method replaced 'old' method <sal_Bool IsMoveable() const>.
1311*b1cdbd2cSJim Jagielski     Determines, if frame is moveable in given environment. if no environment
1312*b1cdbd2cSJim Jagielski     is given (parameter _pLayoutFrm == 0L), the movability in the actual
1313*b1cdbd2cSJim Jagielski     environment (<this->GetUpper()) is checked.
1314*b1cdbd2cSJim Jagielski 
1315*b1cdbd2cSJim Jagielski     @author OD
1316*b1cdbd2cSJim Jagielski */
1317*b1cdbd2cSJim Jagielski 
IsMoveable(const SwLayoutFrm * _pLayoutFrm) const1318*b1cdbd2cSJim Jagielski bool SwFrm::IsMoveable( const SwLayoutFrm* _pLayoutFrm ) const
1319*b1cdbd2cSJim Jagielski {
1320*b1cdbd2cSJim Jagielski     bool bRetVal = false;
1321*b1cdbd2cSJim Jagielski 
1322*b1cdbd2cSJim Jagielski     if ( !_pLayoutFrm )
1323*b1cdbd2cSJim Jagielski     {
1324*b1cdbd2cSJim Jagielski         _pLayoutFrm = GetUpper();
1325*b1cdbd2cSJim Jagielski     }
1326*b1cdbd2cSJim Jagielski 
1327*b1cdbd2cSJim Jagielski     if ( _pLayoutFrm && IsFlowFrm() )
1328*b1cdbd2cSJim Jagielski     {
1329*b1cdbd2cSJim Jagielski         if ( _pLayoutFrm->IsInSct() && lcl_IsInColSct( _pLayoutFrm ) )
1330*b1cdbd2cSJim Jagielski         {
1331*b1cdbd2cSJim Jagielski             bRetVal = true;
1332*b1cdbd2cSJim Jagielski         }
1333*b1cdbd2cSJim Jagielski         else if ( _pLayoutFrm->IsInFly() ||
1334*b1cdbd2cSJim Jagielski                   _pLayoutFrm->IsInDocBody() ||
1335*b1cdbd2cSJim Jagielski                   _pLayoutFrm->IsInFtn() )
1336*b1cdbd2cSJim Jagielski         {
1337*b1cdbd2cSJim Jagielski             if ( _pLayoutFrm->IsInTab() && !IsTabFrm() &&
1338*b1cdbd2cSJim Jagielski                  ( !IsCntntFrm() || !const_cast<SwFrm*>(this)->GetNextCellLeaf( MAKEPAGE_NONE ) ) )
1339*b1cdbd2cSJim Jagielski             {
1340*b1cdbd2cSJim Jagielski                 bRetVal = false;
1341*b1cdbd2cSJim Jagielski             }
1342*b1cdbd2cSJim Jagielski             else
1343*b1cdbd2cSJim Jagielski             {
1344*b1cdbd2cSJim Jagielski                 if ( _pLayoutFrm->IsInFly() )
1345*b1cdbd2cSJim Jagielski                 {
1346*b1cdbd2cSJim Jagielski                     // if fly frame has a follow (next linked fly frame),
1347*b1cdbd2cSJim Jagielski                     // frame is moveable.
1348*b1cdbd2cSJim Jagielski                     if ( const_cast<SwLayoutFrm*>(_pLayoutFrm)->FindFlyFrm()->GetNextLink() )
1349*b1cdbd2cSJim Jagielski                     {
1350*b1cdbd2cSJim Jagielski                         bRetVal = true;
1351*b1cdbd2cSJim Jagielski                     }
1352*b1cdbd2cSJim Jagielski                     else
1353*b1cdbd2cSJim Jagielski                     {
1354*b1cdbd2cSJim Jagielski                         // if environment is columned, frame is moveable, if
1355*b1cdbd2cSJim Jagielski                         // it isn't in last column.
1356*b1cdbd2cSJim Jagielski                         // search for column frame
1357*b1cdbd2cSJim Jagielski                         const SwFrm* pCol = _pLayoutFrm;
1358*b1cdbd2cSJim Jagielski                         while ( pCol && !pCol->IsColumnFrm() )
1359*b1cdbd2cSJim Jagielski                         {
1360*b1cdbd2cSJim Jagielski                             pCol = pCol->GetUpper();
1361*b1cdbd2cSJim Jagielski                         }
1362*b1cdbd2cSJim Jagielski                         // frame is moveable, if found column frame isn't last one.
1363*b1cdbd2cSJim Jagielski                         if ( pCol && pCol->GetNext() )
1364*b1cdbd2cSJim Jagielski                         {
1365*b1cdbd2cSJim Jagielski                             bRetVal = true;
1366*b1cdbd2cSJim Jagielski                         }
1367*b1cdbd2cSJim Jagielski                     }
1368*b1cdbd2cSJim Jagielski                 }
1369*b1cdbd2cSJim Jagielski                 else
1370*b1cdbd2cSJim Jagielski                 {
1371*b1cdbd2cSJim Jagielski                     bRetVal = true;
1372*b1cdbd2cSJim Jagielski                 }
1373*b1cdbd2cSJim Jagielski             }
1374*b1cdbd2cSJim Jagielski         }
1375*b1cdbd2cSJim Jagielski     }
1376*b1cdbd2cSJim Jagielski 
1377*b1cdbd2cSJim Jagielski     return bRetVal;
1378*b1cdbd2cSJim Jagielski }
1379*b1cdbd2cSJim Jagielski 
1380*b1cdbd2cSJim Jagielski /*************************************************************************
1381*b1cdbd2cSJim Jagielski |*
1382*b1cdbd2cSJim Jagielski |*	  SwFrm::SetInfFlags();
1383*b1cdbd2cSJim Jagielski |*
1384*b1cdbd2cSJim Jagielski |*	  Ersterstellung	MA 05. Apr. 94
1385*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	MA 05. Apr. 94
1386*b1cdbd2cSJim Jagielski |*
1387*b1cdbd2cSJim Jagielski |*************************************************************************/
SetInfFlags()1388*b1cdbd2cSJim Jagielski void SwFrm::SetInfFlags()
1389*b1cdbd2cSJim Jagielski {
1390*b1cdbd2cSJim Jagielski 	if ( !IsFlyFrm() && !GetUpper() ) //noch nicht gepastet, keine Informationen
1391*b1cdbd2cSJim Jagielski 		return;						  //lieferbar
1392*b1cdbd2cSJim Jagielski 
1393*b1cdbd2cSJim Jagielski 	bInfInvalid = bInfBody = bInfTab = bInfFly = bInfFtn = bInfSct = sal_False;
1394*b1cdbd2cSJim Jagielski 
1395*b1cdbd2cSJim Jagielski 	SwFrm *pFrm = this;
1396*b1cdbd2cSJim Jagielski 	if( IsFtnContFrm() )
1397*b1cdbd2cSJim Jagielski 		bInfFtn = sal_True;
1398*b1cdbd2cSJim Jagielski 	do
1399*b1cdbd2cSJim Jagielski 	{   // bInfBody wird nur am Seitenbody, nicht im ColumnBody gesetzt
1400*b1cdbd2cSJim Jagielski 		if ( pFrm->IsBodyFrm() && !bInfFtn && pFrm->GetUpper()
1401*b1cdbd2cSJim Jagielski 			 && pFrm->GetUpper()->IsPageFrm() )
1402*b1cdbd2cSJim Jagielski 			bInfBody = sal_True;
1403*b1cdbd2cSJim Jagielski 		else if ( pFrm->IsTabFrm() || pFrm->IsCellFrm() )
1404*b1cdbd2cSJim Jagielski 		{
1405*b1cdbd2cSJim Jagielski             bInfTab = sal_True;
1406*b1cdbd2cSJim Jagielski 		}
1407*b1cdbd2cSJim Jagielski 		else if ( pFrm->IsFlyFrm() )
1408*b1cdbd2cSJim Jagielski 			bInfFly = sal_True;
1409*b1cdbd2cSJim Jagielski 		else if ( pFrm->IsSctFrm() )
1410*b1cdbd2cSJim Jagielski 			bInfSct = sal_True;
1411*b1cdbd2cSJim Jagielski 		else if ( pFrm->IsFtnFrm() )
1412*b1cdbd2cSJim Jagielski 			bInfFtn = sal_True;
1413*b1cdbd2cSJim Jagielski 
1414*b1cdbd2cSJim Jagielski         pFrm = pFrm->GetUpper();
1415*b1cdbd2cSJim Jagielski 
1416*b1cdbd2cSJim Jagielski 	} while ( pFrm && !pFrm->IsPageFrm() ); //Oberhalb der Seite kommt nix
1417*b1cdbd2cSJim Jagielski }
1418*b1cdbd2cSJim Jagielski 
1419*b1cdbd2cSJim Jagielski /*-----------------22.8.2001 14:30------------------
1420*b1cdbd2cSJim Jagielski  * SwFrm::SetDirFlags( sal_Bool )
1421*b1cdbd2cSJim Jagielski  * actualizes the vertical or the righttoleft-flags.
1422*b1cdbd2cSJim Jagielski  * If the property is derived, it's from the upper or (for fly frames) from
1423*b1cdbd2cSJim Jagielski  * the anchor. Otherwise we've to call a virtual method to check the property.
1424*b1cdbd2cSJim Jagielski  * --------------------------------------------------*/
1425*b1cdbd2cSJim Jagielski 
SetDirFlags(sal_Bool bVert)1426*b1cdbd2cSJim Jagielski void SwFrm::SetDirFlags( sal_Bool bVert )
1427*b1cdbd2cSJim Jagielski {
1428*b1cdbd2cSJim Jagielski     if( bVert )
1429*b1cdbd2cSJim Jagielski     {
1430*b1cdbd2cSJim Jagielski         // OD 2004-01-21 #114969# - if derived, valid vertical flag only if
1431*b1cdbd2cSJim Jagielski         // vertical flag of upper/anchor is valid.
1432*b1cdbd2cSJim Jagielski         if( bDerivedVert )
1433*b1cdbd2cSJim Jagielski         {
1434*b1cdbd2cSJim Jagielski             const SwFrm* pAsk = IsFlyFrm() ?
1435*b1cdbd2cSJim Jagielski                           ((SwFlyFrm*)this)->GetAnchorFrm() : GetUpper();
1436*b1cdbd2cSJim Jagielski 
1437*b1cdbd2cSJim Jagielski             ASSERT( pAsk != this, "Autsch! Stack overflow is about to happen" )
1438*b1cdbd2cSJim Jagielski 
1439*b1cdbd2cSJim Jagielski             if( pAsk )
1440*b1cdbd2cSJim Jagielski             {
1441*b1cdbd2cSJim Jagielski                 bVertical = pAsk->IsVertical() ? 1 : 0;
1442*b1cdbd2cSJim Jagielski                 bReverse  = pAsk->IsReverse()  ? 1 : 0;
1443*b1cdbd2cSJim Jagielski 
1444*b1cdbd2cSJim Jagielski                 bVertLR  = pAsk->IsVertLR() ? 1 : 0;
1445*b1cdbd2cSJim Jagielski                 //Badaa: 2008-04-18 * Support for Classical Mongolian Script (SCMS) joint with Jiayanmin
1446*b1cdbd2cSJim Jagielski                 if ( !pAsk->bInvalidVert )
1447*b1cdbd2cSJim Jagielski                     bInvalidVert = sal_False;
1448*b1cdbd2cSJim Jagielski             }
1449*b1cdbd2cSJim Jagielski         }
1450*b1cdbd2cSJim Jagielski         else
1451*b1cdbd2cSJim Jagielski             CheckDirection( bVert );
1452*b1cdbd2cSJim Jagielski     }
1453*b1cdbd2cSJim Jagielski     else
1454*b1cdbd2cSJim Jagielski     {
1455*b1cdbd2cSJim Jagielski         sal_Bool bInv = 0;
1456*b1cdbd2cSJim Jagielski         if( !bDerivedR2L ) // CheckDirection is able to set bDerivedR2L!
1457*b1cdbd2cSJim Jagielski             CheckDirection( bVert );
1458*b1cdbd2cSJim Jagielski         if( bDerivedR2L )
1459*b1cdbd2cSJim Jagielski         {
1460*b1cdbd2cSJim Jagielski             const SwFrm* pAsk = IsFlyFrm() ?
1461*b1cdbd2cSJim Jagielski                           ((SwFlyFrm*)this)->GetAnchorFrm() : GetUpper();
1462*b1cdbd2cSJim Jagielski 
1463*b1cdbd2cSJim Jagielski             ASSERT( pAsk != this, "Autsch! Stack overflow is about to happen" )
1464*b1cdbd2cSJim Jagielski 
1465*b1cdbd2cSJim Jagielski             if( pAsk )
1466*b1cdbd2cSJim Jagielski                 bRightToLeft = pAsk->IsRightToLeft() ? 1 : 0;
1467*b1cdbd2cSJim Jagielski             if( !pAsk || pAsk->bInvalidR2L )
1468*b1cdbd2cSJim Jagielski                 bInv = bInvalidR2L;
1469*b1cdbd2cSJim Jagielski         }
1470*b1cdbd2cSJim Jagielski         bInvalidR2L = bInv;
1471*b1cdbd2cSJim Jagielski     }
1472*b1cdbd2cSJim Jagielski }
1473*b1cdbd2cSJim Jagielski 
GetNextCellLeaf(MakePageType)1474*b1cdbd2cSJim Jagielski SwLayoutFrm* SwFrm::GetNextCellLeaf( MakePageType )
1475*b1cdbd2cSJim Jagielski {
1476*b1cdbd2cSJim Jagielski     SwFrm* pTmpFrm = this;
1477*b1cdbd2cSJim Jagielski     while ( !pTmpFrm->IsCellFrm() )
1478*b1cdbd2cSJim Jagielski         pTmpFrm = pTmpFrm->GetUpper();
1479*b1cdbd2cSJim Jagielski 
1480*b1cdbd2cSJim Jagielski     ASSERT( pTmpFrm, "SwFrm::GetNextCellLeaf() without cell" )
1481*b1cdbd2cSJim Jagielski     return ((SwCellFrm*)pTmpFrm)->GetFollowCell();
1482*b1cdbd2cSJim Jagielski }
1483*b1cdbd2cSJim Jagielski 
GetPrevCellLeaf(MakePageType)1484*b1cdbd2cSJim Jagielski SwLayoutFrm* SwFrm::GetPrevCellLeaf( MakePageType )
1485*b1cdbd2cSJim Jagielski {
1486*b1cdbd2cSJim Jagielski     SwFrm* pTmpFrm = this;
1487*b1cdbd2cSJim Jagielski     while ( !pTmpFrm->IsCellFrm() )
1488*b1cdbd2cSJim Jagielski         pTmpFrm = pTmpFrm->GetUpper();
1489*b1cdbd2cSJim Jagielski 
1490*b1cdbd2cSJim Jagielski     ASSERT( pTmpFrm, "SwFrm::GetNextPreviousLeaf() without cell" )
1491*b1cdbd2cSJim Jagielski     return ((SwCellFrm*)pTmpFrm)->GetPreviousCell();
1492*b1cdbd2cSJim Jagielski }
1493*b1cdbd2cSJim Jagielski 
lcl_FindCorrespondingCellFrm(const SwRowFrm & rOrigRow,const SwCellFrm & rOrigCell,const SwRowFrm & rCorrRow,bool bInFollow)1494*b1cdbd2cSJim Jagielski SwCellFrm* lcl_FindCorrespondingCellFrm( const SwRowFrm& rOrigRow,
1495*b1cdbd2cSJim Jagielski                                          const SwCellFrm& rOrigCell,
1496*b1cdbd2cSJim Jagielski                                          const SwRowFrm& rCorrRow,
1497*b1cdbd2cSJim Jagielski                                          bool bInFollow )
1498*b1cdbd2cSJim Jagielski {
1499*b1cdbd2cSJim Jagielski     SwCellFrm* pRet = NULL;
1500*b1cdbd2cSJim Jagielski     SwCellFrm* pCell = (SwCellFrm*)rOrigRow.Lower();
1501*b1cdbd2cSJim Jagielski     SwCellFrm* pCorrCell = (SwCellFrm*)rCorrRow.Lower();
1502*b1cdbd2cSJim Jagielski 
1503*b1cdbd2cSJim Jagielski     while ( pCell != &rOrigCell && !pCell->IsAnLower( &rOrigCell ) )
1504*b1cdbd2cSJim Jagielski     {
1505*b1cdbd2cSJim Jagielski         pCell = (SwCellFrm*)pCell->GetNext();
1506*b1cdbd2cSJim Jagielski         pCorrCell = (SwCellFrm*)pCorrCell->GetNext();
1507*b1cdbd2cSJim Jagielski     }
1508*b1cdbd2cSJim Jagielski 
1509*b1cdbd2cSJim Jagielski     ASSERT( pCell && pCorrCell, "lcl_FindCorrespondingCellFrm does not work" )
1510*b1cdbd2cSJim Jagielski 
1511*b1cdbd2cSJim Jagielski     if ( pCell != &rOrigCell )
1512*b1cdbd2cSJim Jagielski     {
1513*b1cdbd2cSJim Jagielski         // rOrigCell must be a lower of pCell. We need to recurse into the rows:
1514*b1cdbd2cSJim Jagielski         ASSERT( pCell->Lower() && pCell->Lower()->IsRowFrm(),
1515*b1cdbd2cSJim Jagielski                 "lcl_FindCorrespondingCellFrm does not work" )
1516*b1cdbd2cSJim Jagielski 
1517*b1cdbd2cSJim Jagielski         SwRowFrm* pRow = (SwRowFrm*)pCell->Lower();
1518*b1cdbd2cSJim Jagielski         while ( !pRow->IsAnLower( &rOrigCell ) )
1519*b1cdbd2cSJim Jagielski             pRow = (SwRowFrm*)pRow->GetNext();
1520*b1cdbd2cSJim Jagielski 
1521*b1cdbd2cSJim Jagielski         SwRowFrm* pCorrRow = 0;
1522*b1cdbd2cSJim Jagielski         if ( bInFollow )
1523*b1cdbd2cSJim Jagielski             pCorrRow = pRow->GetFollowRow();
1524*b1cdbd2cSJim Jagielski         else
1525*b1cdbd2cSJim Jagielski         {
1526*b1cdbd2cSJim Jagielski             SwRowFrm* pTmpRow = static_cast<SwRowFrm*>(pCorrCell->GetLastLower());
1527*b1cdbd2cSJim Jagielski 
1528*b1cdbd2cSJim Jagielski             if ( pTmpRow && pTmpRow->GetFollowRow() == pRow )
1529*b1cdbd2cSJim Jagielski                 pCorrRow = pTmpRow;
1530*b1cdbd2cSJim Jagielski         }
1531*b1cdbd2cSJim Jagielski 
1532*b1cdbd2cSJim Jagielski         if ( pCorrRow )
1533*b1cdbd2cSJim Jagielski             pRet = lcl_FindCorrespondingCellFrm( *pRow, rOrigCell, *pCorrRow, bInFollow );
1534*b1cdbd2cSJim Jagielski     }
1535*b1cdbd2cSJim Jagielski     else
1536*b1cdbd2cSJim Jagielski         pRet = pCorrCell;
1537*b1cdbd2cSJim Jagielski 
1538*b1cdbd2cSJim Jagielski     return pRet;
1539*b1cdbd2cSJim Jagielski }
1540*b1cdbd2cSJim Jagielski 
1541*b1cdbd2cSJim Jagielski // VERSION OF GetFollowCell() that assumes that we always have a follow flow line:
GetFollowCell() const1542*b1cdbd2cSJim Jagielski SwCellFrm* SwCellFrm::GetFollowCell() const
1543*b1cdbd2cSJim Jagielski {
1544*b1cdbd2cSJim Jagielski     SwCellFrm* pRet = NULL;
1545*b1cdbd2cSJim Jagielski 
1546*b1cdbd2cSJim Jagielski     // NEW TABLES
1547*b1cdbd2cSJim Jagielski     // Covered cells do not have follow cells!
1548*b1cdbd2cSJim Jagielski     const long nRowSpan = GetLayoutRowSpan();
1549*b1cdbd2cSJim Jagielski     if ( nRowSpan < 1 )
1550*b1cdbd2cSJim Jagielski         return NULL;
1551*b1cdbd2cSJim Jagielski 
1552*b1cdbd2cSJim Jagielski     // find most upper row frame
1553*b1cdbd2cSJim Jagielski     const SwFrm* pRow = GetUpper();
1554*b1cdbd2cSJim Jagielski     while( !pRow->IsRowFrm() || !pRow->GetUpper()->IsTabFrm() )
1555*b1cdbd2cSJim Jagielski         pRow = pRow->GetUpper();
1556*b1cdbd2cSJim Jagielski 
1557*b1cdbd2cSJim Jagielski     if ( !pRow )
1558*b1cdbd2cSJim Jagielski         return NULL;
1559*b1cdbd2cSJim Jagielski 
1560*b1cdbd2cSJim Jagielski     const SwTabFrm* pTabFrm = static_cast<const SwTabFrm*>( pRow->GetUpper() );
1561*b1cdbd2cSJim Jagielski     if ( !pRow || !pTabFrm->GetFollow() || !pTabFrm->HasFollowFlowLine() )
1562*b1cdbd2cSJim Jagielski         return NULL;
1563*b1cdbd2cSJim Jagielski 
1564*b1cdbd2cSJim Jagielski     const SwCellFrm* pThisCell = this;
1565*b1cdbd2cSJim Jagielski 
1566*b1cdbd2cSJim Jagielski     // Get last cell of the current table frame that belongs to the rowspan:
1567*b1cdbd2cSJim Jagielski     if ( nRowSpan > 1 )
1568*b1cdbd2cSJim Jagielski     {
1569*b1cdbd2cSJim Jagielski         // optimization: Will end of row span be in last row or exceed row?
1570*b1cdbd2cSJim Jagielski         long nMax = 0;
1571*b1cdbd2cSJim Jagielski         while ( pRow->GetNext() && ++nMax < nRowSpan )
1572*b1cdbd2cSJim Jagielski             pRow = pRow->GetNext();
1573*b1cdbd2cSJim Jagielski 
1574*b1cdbd2cSJim Jagielski         if ( !pRow->GetNext() )
1575*b1cdbd2cSJim Jagielski         {
1576*b1cdbd2cSJim Jagielski             pThisCell = &pThisCell->FindStartEndOfRowSpanCell( false, true );
1577*b1cdbd2cSJim Jagielski             pRow = pThisCell->GetUpper();
1578*b1cdbd2cSJim Jagielski         }
1579*b1cdbd2cSJim Jagielski     }
1580*b1cdbd2cSJim Jagielski 
1581*b1cdbd2cSJim Jagielski     const SwRowFrm* pFollowRow = NULL;
1582*b1cdbd2cSJim Jagielski     if ( !pRow->GetNext() &&
1583*b1cdbd2cSJim Jagielski          NULL != ( pFollowRow = pRow->IsInSplitTableRow() ) &&
1584*b1cdbd2cSJim Jagielski          ( !pFollowRow->IsRowSpanLine() || nRowSpan > 1 ) )
1585*b1cdbd2cSJim Jagielski          pRet = lcl_FindCorrespondingCellFrm( *((SwRowFrm*)pRow), *pThisCell, *pFollowRow, true );
1586*b1cdbd2cSJim Jagielski 
1587*b1cdbd2cSJim Jagielski     return pRet;
1588*b1cdbd2cSJim Jagielski }
1589*b1cdbd2cSJim Jagielski 
1590*b1cdbd2cSJim Jagielski // VERSION OF GetPreviousCell() THAT ASSUMES THAT WE ALWAYS HAVE A FFL
GetPreviousCell() const1591*b1cdbd2cSJim Jagielski SwCellFrm* SwCellFrm::GetPreviousCell() const
1592*b1cdbd2cSJim Jagielski {
1593*b1cdbd2cSJim Jagielski     SwCellFrm* pRet = NULL;
1594*b1cdbd2cSJim Jagielski 
1595*b1cdbd2cSJim Jagielski     // NEW TABLES
1596*b1cdbd2cSJim Jagielski     // Covered cells do not have previous cells!
1597*b1cdbd2cSJim Jagielski     if ( GetLayoutRowSpan() < 1 )
1598*b1cdbd2cSJim Jagielski         return NULL;
1599*b1cdbd2cSJim Jagielski 
1600*b1cdbd2cSJim Jagielski     // find most upper row frame
1601*b1cdbd2cSJim Jagielski     const SwFrm* pRow = GetUpper();
1602*b1cdbd2cSJim Jagielski     while( !pRow->IsRowFrm() || !pRow->GetUpper()->IsTabFrm() )
1603*b1cdbd2cSJim Jagielski         pRow = pRow->GetUpper();
1604*b1cdbd2cSJim Jagielski 
1605*b1cdbd2cSJim Jagielski     ASSERT( pRow->GetUpper() && pRow->GetUpper()->IsTabFrm(), "GetPreviousCell without Table" );
1606*b1cdbd2cSJim Jagielski 
1607*b1cdbd2cSJim Jagielski     SwTabFrm* pTab = (SwTabFrm*)pRow->GetUpper();
1608*b1cdbd2cSJim Jagielski 
1609*b1cdbd2cSJim Jagielski     if ( pTab->IsFollow() )
1610*b1cdbd2cSJim Jagielski     {
1611*b1cdbd2cSJim Jagielski         const SwFrm* pTmp = pTab->GetFirstNonHeadlineRow();
1612*b1cdbd2cSJim Jagielski         const bool bIsInFirstLine = ( pTmp == pRow );
1613*b1cdbd2cSJim Jagielski 
1614*b1cdbd2cSJim Jagielski         if ( bIsInFirstLine )
1615*b1cdbd2cSJim Jagielski         {
1616*b1cdbd2cSJim Jagielski             SwTabFrm *pMaster = (SwTabFrm*)pTab->FindMaster();
1617*b1cdbd2cSJim Jagielski             if ( pMaster && pMaster->HasFollowFlowLine() )
1618*b1cdbd2cSJim Jagielski             {
1619*b1cdbd2cSJim Jagielski                 SwRowFrm* pMasterRow = static_cast<SwRowFrm*>(pMaster->GetLastLower());
1620*b1cdbd2cSJim Jagielski                 if ( pMasterRow )
1621*b1cdbd2cSJim Jagielski                     pRet = lcl_FindCorrespondingCellFrm( *((SwRowFrm*)pRow), *this, *pMasterRow, false );
1622*b1cdbd2cSJim Jagielski                 if ( pRet && pRet->GetTabBox()->getRowSpan() < 1 )
1623*b1cdbd2cSJim Jagielski                     pRet = &const_cast<SwCellFrm&>(pRet->FindStartEndOfRowSpanCell( true, true ));
1624*b1cdbd2cSJim Jagielski             }
1625*b1cdbd2cSJim Jagielski         }
1626*b1cdbd2cSJim Jagielski     }
1627*b1cdbd2cSJim Jagielski 
1628*b1cdbd2cSJim Jagielski     return pRet;
1629*b1cdbd2cSJim Jagielski }
1630*b1cdbd2cSJim Jagielski 
1631*b1cdbd2cSJim Jagielski // --> NEW TABLES
FindStartEndOfRowSpanCell(bool bStart,bool bCurrentTableOnly) const1632*b1cdbd2cSJim Jagielski const SwCellFrm& SwCellFrm::FindStartEndOfRowSpanCell( bool bStart, bool bCurrentTableOnly ) const
1633*b1cdbd2cSJim Jagielski {
1634*b1cdbd2cSJim Jagielski     const SwCellFrm* pRet = 0;
1635*b1cdbd2cSJim Jagielski 
1636*b1cdbd2cSJim Jagielski     const SwTabFrm* pTableFrm = dynamic_cast<const SwTabFrm*>(GetUpper()->GetUpper());
1637*b1cdbd2cSJim Jagielski 
1638*b1cdbd2cSJim Jagielski     if ( !bStart && pTableFrm->IsFollow() && pTableFrm->IsInHeadline( *this ) )
1639*b1cdbd2cSJim Jagielski         return *this;
1640*b1cdbd2cSJim Jagielski 
1641*b1cdbd2cSJim Jagielski     ASSERT( pTableFrm &&
1642*b1cdbd2cSJim Jagielski             (  bStart && GetTabBox()->getRowSpan() < 1 ||
1643*b1cdbd2cSJim Jagielski               !bStart && GetLayoutRowSpan() > 1 ),
1644*b1cdbd2cSJim Jagielski             "SwCellFrm::FindStartRowSpanCell: No rowspan, no table, no cookies" )
1645*b1cdbd2cSJim Jagielski 
1646*b1cdbd2cSJim Jagielski     if ( pTableFrm )
1647*b1cdbd2cSJim Jagielski     {
1648*b1cdbd2cSJim Jagielski         const SwTable* pTable = pTableFrm->GetTable();
1649*b1cdbd2cSJim Jagielski 
1650*b1cdbd2cSJim Jagielski         sal_uInt16 nMax = USHRT_MAX;
1651*b1cdbd2cSJim Jagielski         if ( bCurrentTableOnly )
1652*b1cdbd2cSJim Jagielski         {
1653*b1cdbd2cSJim Jagielski             const SwFrm* pCurrentRow = GetUpper();
1654*b1cdbd2cSJim Jagielski             const bool bDoNotEnterHeadline = bStart && pTableFrm->IsFollow() &&
1655*b1cdbd2cSJim Jagielski                                         !pTableFrm->IsInHeadline( *pCurrentRow );
1656*b1cdbd2cSJim Jagielski 
1657*b1cdbd2cSJim Jagielski             // check how many rows we are allowed to go up or down until we reach the end of
1658*b1cdbd2cSJim Jagielski             // the current table frame:
1659*b1cdbd2cSJim Jagielski             nMax = 0;
1660*b1cdbd2cSJim Jagielski             while ( bStart ? pCurrentRow->GetPrev() : pCurrentRow->GetNext() )
1661*b1cdbd2cSJim Jagielski             {
1662*b1cdbd2cSJim Jagielski                 if ( bStart )
1663*b1cdbd2cSJim Jagielski                 {
1664*b1cdbd2cSJim Jagielski                     // do not enter a repeated headline:
1665*b1cdbd2cSJim Jagielski                     if ( bDoNotEnterHeadline && pTableFrm->IsFollow() &&
1666*b1cdbd2cSJim Jagielski                          pTableFrm->IsInHeadline( *pCurrentRow->GetPrev() ) )
1667*b1cdbd2cSJim Jagielski                         break;
1668*b1cdbd2cSJim Jagielski 
1669*b1cdbd2cSJim Jagielski                     pCurrentRow = pCurrentRow->GetPrev();
1670*b1cdbd2cSJim Jagielski                 }
1671*b1cdbd2cSJim Jagielski                 else
1672*b1cdbd2cSJim Jagielski                     pCurrentRow = pCurrentRow->GetNext();
1673*b1cdbd2cSJim Jagielski 
1674*b1cdbd2cSJim Jagielski                 ++nMax;
1675*b1cdbd2cSJim Jagielski             }
1676*b1cdbd2cSJim Jagielski         }
1677*b1cdbd2cSJim Jagielski 
1678*b1cdbd2cSJim Jagielski         // By passing the nMax value for Find*OfRowSpan (in case of bCurrentTableOnly
1679*b1cdbd2cSJim Jagielski         // is set) we assure that we find a rMasterBox that has a SwCellFrm in
1680*b1cdbd2cSJim Jagielski         // the current table frame:
1681*b1cdbd2cSJim Jagielski         const SwTableBox& rMasterBox = bStart ?
1682*b1cdbd2cSJim Jagielski                                        GetTabBox()->FindStartOfRowSpan( *pTable, nMax ) :
1683*b1cdbd2cSJim Jagielski                                        GetTabBox()->FindEndOfRowSpan( *pTable, nMax );
1684*b1cdbd2cSJim Jagielski 
1685*b1cdbd2cSJim Jagielski         SwIterator<SwCellFrm,SwFmt> aIter( *rMasterBox.GetFrmFmt() );
1686*b1cdbd2cSJim Jagielski 
1687*b1cdbd2cSJim Jagielski         for ( SwCellFrm* pMasterCell = aIter.First(); pMasterCell; pMasterCell = aIter.Next() )
1688*b1cdbd2cSJim Jagielski         {
1689*b1cdbd2cSJim Jagielski             if ( pMasterCell->GetTabBox() == &rMasterBox )
1690*b1cdbd2cSJim Jagielski             {
1691*b1cdbd2cSJim Jagielski                 const SwTabFrm* pMasterTable = static_cast<const SwTabFrm*>(pMasterCell->GetUpper()->GetUpper());
1692*b1cdbd2cSJim Jagielski 
1693*b1cdbd2cSJim Jagielski                 if ( bCurrentTableOnly )
1694*b1cdbd2cSJim Jagielski                 {
1695*b1cdbd2cSJim Jagielski                     if ( pMasterTable == pTableFrm )
1696*b1cdbd2cSJim Jagielski                     {
1697*b1cdbd2cSJim Jagielski                         pRet = pMasterCell;
1698*b1cdbd2cSJim Jagielski                         break;
1699*b1cdbd2cSJim Jagielski                     }
1700*b1cdbd2cSJim Jagielski                 }
1701*b1cdbd2cSJim Jagielski                 else
1702*b1cdbd2cSJim Jagielski                 {
1703*b1cdbd2cSJim Jagielski                     if ( pMasterTable == pTableFrm ||
1704*b1cdbd2cSJim Jagielski                          (  (bStart && pMasterTable->IsAnFollow(pTableFrm)) ||
1705*b1cdbd2cSJim Jagielski                            (!bStart && pTableFrm->IsAnFollow(pMasterTable)) ) )
1706*b1cdbd2cSJim Jagielski                     {
1707*b1cdbd2cSJim Jagielski                         pRet = pMasterCell;
1708*b1cdbd2cSJim Jagielski                         break;
1709*b1cdbd2cSJim Jagielski                     }
1710*b1cdbd2cSJim Jagielski                 }
1711*b1cdbd2cSJim Jagielski             }
1712*b1cdbd2cSJim Jagielski         }
1713*b1cdbd2cSJim Jagielski     }
1714*b1cdbd2cSJim Jagielski 
1715*b1cdbd2cSJim Jagielski     ASSERT( pRet, "SwCellFrm::FindStartRowSpanCell: No result" )
1716*b1cdbd2cSJim Jagielski 
1717*b1cdbd2cSJim Jagielski     return *pRet;
1718*b1cdbd2cSJim Jagielski }
1719*b1cdbd2cSJim Jagielski // <-- NEW TABLES
1720*b1cdbd2cSJim Jagielski 
IsInSplitTableRow() const1721*b1cdbd2cSJim Jagielski const SwRowFrm* SwFrm::IsInSplitTableRow() const
1722*b1cdbd2cSJim Jagielski {
1723*b1cdbd2cSJim Jagielski     ASSERT( IsInTab(), "IsInSplitTableRow should only be called for frames in tables" )
1724*b1cdbd2cSJim Jagielski 
1725*b1cdbd2cSJim Jagielski     const SwFrm* pRow = this;
1726*b1cdbd2cSJim Jagielski 
1727*b1cdbd2cSJim Jagielski     // find most upper row frame
1728*b1cdbd2cSJim Jagielski     while( pRow && ( !pRow->IsRowFrm() || !pRow->GetUpper()->IsTabFrm() ) )
1729*b1cdbd2cSJim Jagielski         pRow = pRow->GetUpper();
1730*b1cdbd2cSJim Jagielski 
1731*b1cdbd2cSJim Jagielski     if ( !pRow ) return NULL;
1732*b1cdbd2cSJim Jagielski 
1733*b1cdbd2cSJim Jagielski     ASSERT( pRow->GetUpper()->IsTabFrm(), "Confusion in table layout" )
1734*b1cdbd2cSJim Jagielski 
1735*b1cdbd2cSJim Jagielski     const SwTabFrm* pTab = (SwTabFrm*)pRow->GetUpper();
1736*b1cdbd2cSJim Jagielski     // --> OD 2006-06-28 #b6443897#
1737*b1cdbd2cSJim Jagielski     // If most upper row frame is a headline row, the current frame
1738*b1cdbd2cSJim Jagielski     // can't be in a splitted table row. Thus, add corresponding condition.
1739*b1cdbd2cSJim Jagielski     if ( pRow->GetNext() ||
1740*b1cdbd2cSJim Jagielski          pTab->GetTable()->IsHeadline(
1741*b1cdbd2cSJim Jagielski                     *(static_cast<const SwRowFrm*>(pRow)->GetTabLine()) ) ||
1742*b1cdbd2cSJim Jagielski          !pTab->HasFollowFlowLine() ||
1743*b1cdbd2cSJim Jagielski          !pTab->GetFollow() )
1744*b1cdbd2cSJim Jagielski         return NULL;
1745*b1cdbd2cSJim Jagielski     // <--
1746*b1cdbd2cSJim Jagielski 
1747*b1cdbd2cSJim Jagielski     // skip headline
1748*b1cdbd2cSJim Jagielski     const SwRowFrm* pFollowRow = pTab->GetFollow()->GetFirstNonHeadlineRow();
1749*b1cdbd2cSJim Jagielski 
1750*b1cdbd2cSJim Jagielski     ASSERT( pFollowRow, "SwFrm::IsInSplitTableRow() does not work" )
1751*b1cdbd2cSJim Jagielski 
1752*b1cdbd2cSJim Jagielski     return pFollowRow;
1753*b1cdbd2cSJim Jagielski }
1754*b1cdbd2cSJim Jagielski 
IsInFollowFlowRow() const1755*b1cdbd2cSJim Jagielski const SwRowFrm* SwFrm::IsInFollowFlowRow() const
1756*b1cdbd2cSJim Jagielski {
1757*b1cdbd2cSJim Jagielski     ASSERT( IsInTab(), "IsInSplitTableRow should only be called for frames in tables" )
1758*b1cdbd2cSJim Jagielski 
1759*b1cdbd2cSJim Jagielski     // find most upper row frame
1760*b1cdbd2cSJim Jagielski     const SwFrm* pRow = this;
1761*b1cdbd2cSJim Jagielski     while( pRow && ( !pRow->IsRowFrm() || !pRow->GetUpper()->IsTabFrm() ) )
1762*b1cdbd2cSJim Jagielski         pRow = pRow->GetUpper();
1763*b1cdbd2cSJim Jagielski 
1764*b1cdbd2cSJim Jagielski     if ( !pRow ) return NULL;
1765*b1cdbd2cSJim Jagielski 
1766*b1cdbd2cSJim Jagielski     ASSERT( pRow->GetUpper()->IsTabFrm(), "Confusion in table layout" )
1767*b1cdbd2cSJim Jagielski 
1768*b1cdbd2cSJim Jagielski     const SwTabFrm* pTab = (SwTabFrm*)pRow->GetUpper();
1769*b1cdbd2cSJim Jagielski 
1770*b1cdbd2cSJim Jagielski     const SwTabFrm* pMaster = pTab->IsFollow() ? pTab->FindMaster() : 0;
1771*b1cdbd2cSJim Jagielski 
1772*b1cdbd2cSJim Jagielski     if ( !pMaster || !pMaster->HasFollowFlowLine() )
1773*b1cdbd2cSJim Jagielski         return NULL;
1774*b1cdbd2cSJim Jagielski 
1775*b1cdbd2cSJim Jagielski     const SwFrm* pTmp = pTab->GetFirstNonHeadlineRow();
1776*b1cdbd2cSJim Jagielski     const bool bIsInFirstLine = ( pTmp == pRow );
1777*b1cdbd2cSJim Jagielski 
1778*b1cdbd2cSJim Jagielski     if ( !bIsInFirstLine )
1779*b1cdbd2cSJim Jagielski         return NULL;
1780*b1cdbd2cSJim Jagielski 
1781*b1cdbd2cSJim Jagielski     const SwRowFrm* pMasterRow = static_cast<const SwRowFrm*>(pMaster->GetLastLower());
1782*b1cdbd2cSJim Jagielski     return pMasterRow;
1783*b1cdbd2cSJim Jagielski }
1784*b1cdbd2cSJim Jagielski 
IsInBalancedSection() const1785*b1cdbd2cSJim Jagielski bool SwFrm::IsInBalancedSection() const
1786*b1cdbd2cSJim Jagielski {
1787*b1cdbd2cSJim Jagielski     bool bRet = false;
1788*b1cdbd2cSJim Jagielski 
1789*b1cdbd2cSJim Jagielski     if ( IsInSct() )
1790*b1cdbd2cSJim Jagielski     {
1791*b1cdbd2cSJim Jagielski         const SwSectionFrm* pSectionFrm = FindSctFrm();
1792*b1cdbd2cSJim Jagielski         if ( pSectionFrm )
1793*b1cdbd2cSJim Jagielski             bRet = pSectionFrm->IsBalancedSection();
1794*b1cdbd2cSJim Jagielski     }
1795*b1cdbd2cSJim Jagielski     return bRet;
1796*b1cdbd2cSJim Jagielski }
1797*b1cdbd2cSJim Jagielski 
1798*b1cdbd2cSJim Jagielski /*
1799*b1cdbd2cSJim Jagielski  * SwLayoutFrm::GetLastLower()
1800*b1cdbd2cSJim Jagielski  */
GetLastLower() const1801*b1cdbd2cSJim Jagielski const SwFrm* SwLayoutFrm::GetLastLower() const
1802*b1cdbd2cSJim Jagielski {
1803*b1cdbd2cSJim Jagielski     const SwFrm* pRet = Lower();
1804*b1cdbd2cSJim Jagielski     if ( !pRet )
1805*b1cdbd2cSJim Jagielski         return 0;
1806*b1cdbd2cSJim Jagielski     while ( pRet->GetNext() )
1807*b1cdbd2cSJim Jagielski         pRet = pRet->GetNext();
1808*b1cdbd2cSJim Jagielski     return pRet;
1809*b1cdbd2cSJim Jagielski }
1810