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