1*efeef26fSAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*efeef26fSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*efeef26fSAndrew Rist * or more contributor license agreements. See the NOTICE file
5*efeef26fSAndrew Rist * distributed with this work for additional information
6*efeef26fSAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*efeef26fSAndrew Rist * to you under the Apache License, Version 2.0 (the
8*efeef26fSAndrew Rist * "License"); you may not use this file except in compliance
9*efeef26fSAndrew Rist * with the License. You may obtain a copy of the License at
10*efeef26fSAndrew Rist *
11*efeef26fSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*efeef26fSAndrew Rist *
13*efeef26fSAndrew Rist * Unless required by applicable law or agreed to in writing,
14*efeef26fSAndrew Rist * software distributed under the License is distributed on an
15*efeef26fSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*efeef26fSAndrew Rist * KIND, either express or implied. See the License for the
17*efeef26fSAndrew Rist * specific language governing permissions and limitations
18*efeef26fSAndrew Rist * under the License.
19*efeef26fSAndrew Rist *
20*efeef26fSAndrew Rist *************************************************************/
21*efeef26fSAndrew Rist
22*efeef26fSAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sw.hxx"
26cdf0e10cSrcweir
27cdf0e10cSrcweir
28cdf0e10cSrcweir
29cdf0e10cSrcweir #include "layouter.hxx"
30cdf0e10cSrcweir #include "doc.hxx"
31cdf0e10cSrcweir #include "sectfrm.hxx"
32cdf0e10cSrcweir #include "ftnboss.hxx"
33cdf0e10cSrcweir #include "cntfrm.hxx"
34cdf0e10cSrcweir #include "pagefrm.hxx"
35cdf0e10cSrcweir #include "ftnfrm.hxx"
36cdf0e10cSrcweir #include "txtfrm.hxx"
37cdf0e10cSrcweir
38cdf0e10cSrcweir // --> OD 2004-06-23 #i28701#
39cdf0e10cSrcweir #include <movedfwdfrmsbyobjpos.hxx>
40cdf0e10cSrcweir // <--
41cdf0e10cSrcweir // --> OD 2004-10-22 #i35911#
42cdf0e10cSrcweir #include <objstmpconsiderwrapinfl.hxx>
43cdf0e10cSrcweir // <--
44cdf0e10cSrcweir
45cdf0e10cSrcweir #define LOOP_DETECT 250
46cdf0e10cSrcweir
47cdf0e10cSrcweir class SwLooping
48cdf0e10cSrcweir {
49cdf0e10cSrcweir sal_uInt16 nMinPage;
50cdf0e10cSrcweir sal_uInt16 nMaxPage;
51cdf0e10cSrcweir sal_uInt16 nCount;
52cdf0e10cSrcweir sal_uInt16 mnLoopControlStage;
53cdf0e10cSrcweir public:
54cdf0e10cSrcweir SwLooping( SwPageFrm* pPage );
55cdf0e10cSrcweir void Control( SwPageFrm* pPage );
56cdf0e10cSrcweir void Drastic( SwFrm* pFrm );
IsLoopingLouieLight() const57cdf0e10cSrcweir bool IsLoopingLouieLight() const { return nCount > LOOP_DETECT - 30; };
58cdf0e10cSrcweir };
59cdf0e10cSrcweir
60cdf0e10cSrcweir class SwEndnoter
61cdf0e10cSrcweir {
62cdf0e10cSrcweir SwLayouter* pMaster;
63cdf0e10cSrcweir SwSectionFrm* pSect;
64cdf0e10cSrcweir SvPtrarr* pEndArr;
65cdf0e10cSrcweir public:
SwEndnoter(SwLayouter * pLay)66cdf0e10cSrcweir SwEndnoter( SwLayouter* pLay )
67cdf0e10cSrcweir : pMaster( pLay ), pSect( NULL ), pEndArr( NULL ) {}
~SwEndnoter()68cdf0e10cSrcweir ~SwEndnoter() { delete pEndArr; }
69cdf0e10cSrcweir void CollectEndnotes( SwSectionFrm* pSct );
70cdf0e10cSrcweir void CollectEndnote( SwFtnFrm* pFtn );
GetSect()71cdf0e10cSrcweir const SwSectionFrm* GetSect() { return pSect; }
72cdf0e10cSrcweir void InsertEndnotes();
HasEndnotes() const73cdf0e10cSrcweir sal_Bool HasEndnotes() const { return pEndArr && pEndArr->Count(); }
74cdf0e10cSrcweir };
75cdf0e10cSrcweir
CollectEndnotes(SwSectionFrm * pSct)76cdf0e10cSrcweir void SwEndnoter::CollectEndnotes( SwSectionFrm* pSct )
77cdf0e10cSrcweir {
78cdf0e10cSrcweir ASSERT( pSct, "CollectEndnotes: Which section?" );
79cdf0e10cSrcweir if( !pSect )
80cdf0e10cSrcweir pSect = pSct;
81cdf0e10cSrcweir else if( pSct != pSect )
82cdf0e10cSrcweir return;
83cdf0e10cSrcweir pSect->CollectEndnotes( pMaster );
84cdf0e10cSrcweir }
85cdf0e10cSrcweir
CollectEndnote(SwFtnFrm * pFtn)86cdf0e10cSrcweir void SwEndnoter::CollectEndnote( SwFtnFrm* pFtn )
87cdf0e10cSrcweir {
88cdf0e10cSrcweir if( pEndArr && USHRT_MAX != pEndArr->GetPos( (VoidPtr)pFtn ) )
89cdf0e10cSrcweir return;
90cdf0e10cSrcweir
91cdf0e10cSrcweir if( pFtn->GetUpper() )
92cdf0e10cSrcweir {
93cdf0e10cSrcweir // pFtn is the master, he incorporates its follows
94cdf0e10cSrcweir SwFtnFrm *pNxt = pFtn->GetFollow();
95cdf0e10cSrcweir while ( pNxt )
96cdf0e10cSrcweir {
97cdf0e10cSrcweir SwFrm *pCnt = pNxt->ContainsAny();
98cdf0e10cSrcweir if ( pCnt )
99cdf0e10cSrcweir {
100cdf0e10cSrcweir do
101cdf0e10cSrcweir { SwFrm *pNxtCnt = pCnt->GetNext();
102cdf0e10cSrcweir pCnt->Cut();
103cdf0e10cSrcweir pCnt->Paste( pFtn );
104cdf0e10cSrcweir pCnt = pNxtCnt;
105cdf0e10cSrcweir } while ( pCnt );
106cdf0e10cSrcweir }
107cdf0e10cSrcweir else
108cdf0e10cSrcweir { ASSERT( pNxt->Lower() && pNxt->Lower()->IsSctFrm(),
109cdf0e10cSrcweir "Endnote without content?" );
110cdf0e10cSrcweir pNxt->Cut();
111cdf0e10cSrcweir delete pNxt;
112cdf0e10cSrcweir }
113cdf0e10cSrcweir pNxt = pFtn->GetFollow();
114cdf0e10cSrcweir }
115cdf0e10cSrcweir if( pFtn->GetMaster() )
116cdf0e10cSrcweir return;
117cdf0e10cSrcweir pFtn->Cut();
118cdf0e10cSrcweir }
119cdf0e10cSrcweir else if( pEndArr )
120cdf0e10cSrcweir {
121cdf0e10cSrcweir for ( sal_uInt16 i = 0; i < pEndArr->Count(); ++i )
122cdf0e10cSrcweir {
123cdf0e10cSrcweir SwFtnFrm *pEndFtn = (SwFtnFrm*)((*pEndArr)[i]);
124cdf0e10cSrcweir if( pEndFtn->GetAttr() == pFtn->GetAttr() )
125cdf0e10cSrcweir {
126cdf0e10cSrcweir delete pFtn;
127cdf0e10cSrcweir return;
128cdf0e10cSrcweir }
129cdf0e10cSrcweir }
130cdf0e10cSrcweir }
131cdf0e10cSrcweir if( !pEndArr )
132cdf0e10cSrcweir pEndArr = new SvPtrarr( 5, 5 ); // deleted from the SwLayouter
133cdf0e10cSrcweir pEndArr->Insert( (VoidPtr)pFtn, pEndArr->Count() );
134cdf0e10cSrcweir }
135cdf0e10cSrcweir
InsertEndnotes()136cdf0e10cSrcweir void SwEndnoter::InsertEndnotes()
137cdf0e10cSrcweir {
138cdf0e10cSrcweir if( !pSect )
139cdf0e10cSrcweir return;
140cdf0e10cSrcweir if( !pEndArr || !pEndArr->Count() )
141cdf0e10cSrcweir {
142cdf0e10cSrcweir pSect = NULL;
143cdf0e10cSrcweir return;
144cdf0e10cSrcweir }
145cdf0e10cSrcweir ASSERT( pSect->Lower() && pSect->Lower()->IsFtnBossFrm(),
146cdf0e10cSrcweir "InsertEndnotes: Where's my column?" );
147cdf0e10cSrcweir SwFrm* pRef = pSect->FindLastCntnt( FINDMODE_MYLAST );
148cdf0e10cSrcweir SwFtnBossFrm *pBoss = pRef ? pRef->FindFtnBossFrm()
149cdf0e10cSrcweir : (SwFtnBossFrm*)pSect->Lower();
150cdf0e10cSrcweir pBoss->_MoveFtns( *pEndArr );
151cdf0e10cSrcweir delete pEndArr;
152cdf0e10cSrcweir pEndArr = NULL;
153cdf0e10cSrcweir pSect = NULL;
154cdf0e10cSrcweir }
155cdf0e10cSrcweir
SwLooping(SwPageFrm * pPage)156cdf0e10cSrcweir SwLooping::SwLooping( SwPageFrm* pPage )
157cdf0e10cSrcweir {
158cdf0e10cSrcweir ASSERT( pPage, "Where's my page?" );
159cdf0e10cSrcweir nMinPage = pPage->GetPhyPageNum();
160cdf0e10cSrcweir nMaxPage = nMinPage;
161cdf0e10cSrcweir nCount = 0;
162cdf0e10cSrcweir mnLoopControlStage = 0;
163cdf0e10cSrcweir }
164cdf0e10cSrcweir
Drastic(SwFrm * pFrm)165cdf0e10cSrcweir void SwLooping::Drastic( SwFrm* pFrm )
166cdf0e10cSrcweir {
167cdf0e10cSrcweir while( pFrm )
168cdf0e10cSrcweir {
169cdf0e10cSrcweir pFrm->ValidateThisAndAllLowers( mnLoopControlStage );
170cdf0e10cSrcweir pFrm = pFrm->GetNext();
171cdf0e10cSrcweir }
172cdf0e10cSrcweir }
173cdf0e10cSrcweir
Control(SwPageFrm * pPage)174cdf0e10cSrcweir void SwLooping::Control( SwPageFrm* pPage )
175cdf0e10cSrcweir {
176cdf0e10cSrcweir if( !pPage )
177cdf0e10cSrcweir return;
178cdf0e10cSrcweir sal_uInt16 nNew = pPage->GetPhyPageNum();
179cdf0e10cSrcweir if( nNew > nMaxPage )
180cdf0e10cSrcweir nMaxPage = nNew;
181cdf0e10cSrcweir if( nNew < nMinPage )
182cdf0e10cSrcweir {
183cdf0e10cSrcweir nMinPage = nNew;
184cdf0e10cSrcweir nMaxPage = nNew;
185cdf0e10cSrcweir nCount = 0;
186cdf0e10cSrcweir mnLoopControlStage = 0;
187cdf0e10cSrcweir }
188cdf0e10cSrcweir else if( nNew > nMinPage + 2 )
189cdf0e10cSrcweir {
190cdf0e10cSrcweir nMinPage = nNew - 2;
191cdf0e10cSrcweir nMaxPage = nNew;
192cdf0e10cSrcweir nCount = 0;
193cdf0e10cSrcweir mnLoopControlStage = 0;
194cdf0e10cSrcweir }
195cdf0e10cSrcweir else if( ++nCount > LOOP_DETECT )
196cdf0e10cSrcweir {
197cdf0e10cSrcweir #ifdef DBG_UTIL
198cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
199cdf0e10cSrcweir static sal_Bool bNoLouie = sal_False;
200cdf0e10cSrcweir if( bNoLouie )
201cdf0e10cSrcweir return;
202cdf0e10cSrcweir #endif
203cdf0e10cSrcweir #endif
204cdf0e10cSrcweir
205cdf0e10cSrcweir // FME 2007-08-30 #i81146# new loop control
206cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
207cdf0e10cSrcweir ASSERT( 0 != mnLoopControlStage, "Looping Louie: Stage 1!" );
208cdf0e10cSrcweir ASSERT( 1 != mnLoopControlStage, "Looping Louie: Stage 2!!" );
209cdf0e10cSrcweir ASSERT( 2 > mnLoopControlStage, "Looping Louie: Stage 3!!!" );
210cdf0e10cSrcweir #endif
211cdf0e10cSrcweir
212cdf0e10cSrcweir Drastic( pPage->Lower() );
213cdf0e10cSrcweir if( nNew > nMinPage && pPage->GetPrev() )
214cdf0e10cSrcweir Drastic( ((SwPageFrm*)pPage->GetPrev())->Lower() );
215cdf0e10cSrcweir if( nNew < nMaxPage && pPage->GetNext() )
216cdf0e10cSrcweir Drastic( ((SwPageFrm*)pPage->GetNext())->Lower() );
217cdf0e10cSrcweir
218cdf0e10cSrcweir ++mnLoopControlStage;
219cdf0e10cSrcweir nCount = 0;
220cdf0e10cSrcweir }
221cdf0e10cSrcweir }
222cdf0e10cSrcweir
223cdf0e10cSrcweir /*************************************************************************
224cdf0e10cSrcweir |*
225cdf0e10cSrcweir |* SwLayouter::SwLayouter()
226cdf0e10cSrcweir |*
227cdf0e10cSrcweir |* Ersterstellung AMA 02. Nov. 99
228cdf0e10cSrcweir |* Letzte Aenderung AMA 02. Nov. 99
229cdf0e10cSrcweir |*
230cdf0e10cSrcweir |*************************************************************************/
231cdf0e10cSrcweir
SwLayouter()232cdf0e10cSrcweir SwLayouter::SwLayouter()
233cdf0e10cSrcweir : pEndnoter( NULL ),
234cdf0e10cSrcweir pLooping( NULL ),
235cdf0e10cSrcweir // --> OD 2004-06-23 #i28701#
236cdf0e10cSrcweir mpMovedFwdFrms( 0L ),
237cdf0e10cSrcweir // <--
238cdf0e10cSrcweir // --> OD 2004-10-22 #i35911#
239cdf0e10cSrcweir mpObjsTmpConsiderWrapInfl( 0L )
240cdf0e10cSrcweir // <--
241cdf0e10cSrcweir {
242cdf0e10cSrcweir }
243cdf0e10cSrcweir
~SwLayouter()244cdf0e10cSrcweir SwLayouter::~SwLayouter()
245cdf0e10cSrcweir {
246cdf0e10cSrcweir delete pEndnoter;
247cdf0e10cSrcweir delete pLooping;
248cdf0e10cSrcweir // --> OD 2004-06-23 #i28701#
249cdf0e10cSrcweir delete mpMovedFwdFrms;
250cdf0e10cSrcweir mpMovedFwdFrms = 0L;
251cdf0e10cSrcweir // <--
252cdf0e10cSrcweir // --> OD 2004-10-22 #i35911#
253cdf0e10cSrcweir delete mpObjsTmpConsiderWrapInfl;
254cdf0e10cSrcweir mpObjsTmpConsiderWrapInfl = 0L;
255cdf0e10cSrcweir // <--
256cdf0e10cSrcweir }
257cdf0e10cSrcweir
_CollectEndnotes(SwSectionFrm * pSect)258cdf0e10cSrcweir void SwLayouter::_CollectEndnotes( SwSectionFrm* pSect )
259cdf0e10cSrcweir {
260cdf0e10cSrcweir if( !pEndnoter )
261cdf0e10cSrcweir pEndnoter = new SwEndnoter( this );
262cdf0e10cSrcweir pEndnoter->CollectEndnotes( pSect );
263cdf0e10cSrcweir }
264cdf0e10cSrcweir
HasEndnotes() const265cdf0e10cSrcweir sal_Bool SwLayouter::HasEndnotes() const
266cdf0e10cSrcweir {
267cdf0e10cSrcweir return pEndnoter->HasEndnotes();
268cdf0e10cSrcweir }
269cdf0e10cSrcweir
CollectEndnote(SwFtnFrm * pFtn)270cdf0e10cSrcweir void SwLayouter::CollectEndnote( SwFtnFrm* pFtn )
271cdf0e10cSrcweir {
272cdf0e10cSrcweir pEndnoter->CollectEndnote( pFtn );
273cdf0e10cSrcweir }
274cdf0e10cSrcweir
InsertEndnotes(SwSectionFrm * pSect)275cdf0e10cSrcweir void SwLayouter::InsertEndnotes( SwSectionFrm* pSect )
276cdf0e10cSrcweir {
277cdf0e10cSrcweir if( !pEndnoter || pEndnoter->GetSect() != pSect )
278cdf0e10cSrcweir return;
279cdf0e10cSrcweir pEndnoter->InsertEndnotes();
280cdf0e10cSrcweir }
281cdf0e10cSrcweir
LoopControl(SwPageFrm * pPage,sal_uInt8)282cdf0e10cSrcweir void SwLayouter::LoopControl( SwPageFrm* pPage, sal_uInt8 )
283cdf0e10cSrcweir {
284cdf0e10cSrcweir ASSERT( pLooping, "Looping: Lost control" );
285cdf0e10cSrcweir pLooping->Control( pPage );
286cdf0e10cSrcweir }
287cdf0e10cSrcweir
LoopingLouieLight(const SwDoc & rDoc,const SwTxtFrm & rFrm)288cdf0e10cSrcweir void SwLayouter::LoopingLouieLight( const SwDoc& rDoc, const SwTxtFrm& rFrm )
289cdf0e10cSrcweir {
290cdf0e10cSrcweir if ( pLooping && pLooping->IsLoopingLouieLight() )
291cdf0e10cSrcweir {
292cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
293cdf0e10cSrcweir ASSERT( false, "Looping Louie (Light): Fixating fractious frame" )
294cdf0e10cSrcweir #endif
295cdf0e10cSrcweir SwLayouter::InsertMovedFwdFrm( rDoc, rFrm, rFrm.FindPageFrm()->GetPhyPageNum() );
296cdf0e10cSrcweir }
297cdf0e10cSrcweir }
298cdf0e10cSrcweir
StartLooping(SwPageFrm * pPage)299cdf0e10cSrcweir sal_Bool SwLayouter::StartLooping( SwPageFrm* pPage )
300cdf0e10cSrcweir {
301cdf0e10cSrcweir if( pLooping )
302cdf0e10cSrcweir return sal_False;
303cdf0e10cSrcweir pLooping = new SwLooping( pPage );
304cdf0e10cSrcweir return sal_True;
305cdf0e10cSrcweir }
306cdf0e10cSrcweir
EndLoopControl()307cdf0e10cSrcweir void SwLayouter::EndLoopControl()
308cdf0e10cSrcweir {
309cdf0e10cSrcweir delete pLooping;
310cdf0e10cSrcweir pLooping = NULL;
311cdf0e10cSrcweir }
312cdf0e10cSrcweir
CollectEndnotes(SwDoc * pDoc,SwSectionFrm * pSect)313cdf0e10cSrcweir void SwLayouter::CollectEndnotes( SwDoc* pDoc, SwSectionFrm* pSect )
314cdf0e10cSrcweir {
315cdf0e10cSrcweir ASSERT( pDoc, "No doc, no fun" );
316cdf0e10cSrcweir if( !pDoc->GetLayouter() )
317cdf0e10cSrcweir pDoc->SetLayouter( new SwLayouter() );
318cdf0e10cSrcweir pDoc->GetLayouter()->_CollectEndnotes( pSect );
319cdf0e10cSrcweir }
320cdf0e10cSrcweir
Collecting(SwDoc * pDoc,SwSectionFrm * pSect,SwFtnFrm * pFtn)321cdf0e10cSrcweir sal_Bool SwLayouter::Collecting( SwDoc* pDoc, SwSectionFrm* pSect, SwFtnFrm* pFtn )
322cdf0e10cSrcweir {
323cdf0e10cSrcweir if( !pDoc->GetLayouter() )
324cdf0e10cSrcweir return sal_False;
325cdf0e10cSrcweir SwLayouter *pLayouter = pDoc->GetLayouter();
326cdf0e10cSrcweir if( pLayouter->pEndnoter && pLayouter->pEndnoter->GetSect() && pSect &&
327cdf0e10cSrcweir ( pLayouter->pEndnoter->GetSect()->IsAnFollow( pSect ) ||
328cdf0e10cSrcweir pSect->IsAnFollow( pLayouter->pEndnoter->GetSect() ) ) )
329cdf0e10cSrcweir {
330cdf0e10cSrcweir if( pFtn )
331cdf0e10cSrcweir pLayouter->CollectEndnote( pFtn );
332cdf0e10cSrcweir return sal_True;
333cdf0e10cSrcweir }
334cdf0e10cSrcweir return sal_False;
335cdf0e10cSrcweir }
336cdf0e10cSrcweir
StartLoopControl(SwDoc * pDoc,SwPageFrm * pPage)337cdf0e10cSrcweir sal_Bool SwLayouter::StartLoopControl( SwDoc* pDoc, SwPageFrm *pPage )
338cdf0e10cSrcweir {
339cdf0e10cSrcweir ASSERT( pDoc, "No doc, no fun" );
340cdf0e10cSrcweir if( !pDoc->GetLayouter() )
341cdf0e10cSrcweir pDoc->SetLayouter( new SwLayouter() );
342cdf0e10cSrcweir return !pDoc->GetLayouter()->pLooping &&
343cdf0e10cSrcweir pDoc->GetLayouter()->StartLooping( pPage );
344cdf0e10cSrcweir }
345cdf0e10cSrcweir
346cdf0e10cSrcweir // --> OD 2004-06-23 #i28701#
347cdf0e10cSrcweir // -----------------------------------------------------------------------------
348cdf0e10cSrcweir // methods to manage text frames, which are moved forward by the positioning
349cdf0e10cSrcweir // of its anchored objects
350cdf0e10cSrcweir // -----------------------------------------------------------------------------
ClearMovedFwdFrms(const SwDoc & _rDoc)351cdf0e10cSrcweir void SwLayouter::ClearMovedFwdFrms( const SwDoc& _rDoc )
352cdf0e10cSrcweir {
353cdf0e10cSrcweir if ( _rDoc.GetLayouter() &&
354cdf0e10cSrcweir _rDoc.GetLayouter()->mpMovedFwdFrms )
355cdf0e10cSrcweir {
356cdf0e10cSrcweir _rDoc.GetLayouter()->mpMovedFwdFrms->Clear();
357cdf0e10cSrcweir }
358cdf0e10cSrcweir }
359cdf0e10cSrcweir
InsertMovedFwdFrm(const SwDoc & _rDoc,const SwTxtFrm & _rMovedFwdFrmByObjPos,const sal_uInt32 _nToPageNum)360cdf0e10cSrcweir void SwLayouter::InsertMovedFwdFrm( const SwDoc& _rDoc,
361cdf0e10cSrcweir const SwTxtFrm& _rMovedFwdFrmByObjPos,
362cdf0e10cSrcweir const sal_uInt32 _nToPageNum )
363cdf0e10cSrcweir {
364cdf0e10cSrcweir if ( !_rDoc.GetLayouter() )
365cdf0e10cSrcweir {
366cdf0e10cSrcweir const_cast<SwDoc&>(_rDoc).SetLayouter( new SwLayouter() );
367cdf0e10cSrcweir }
368cdf0e10cSrcweir
369cdf0e10cSrcweir if ( !_rDoc.GetLayouter()->mpMovedFwdFrms )
370cdf0e10cSrcweir {
371cdf0e10cSrcweir const_cast<SwDoc&>(_rDoc).GetLayouter()->mpMovedFwdFrms =
372cdf0e10cSrcweir new SwMovedFwdFrmsByObjPos();
373cdf0e10cSrcweir }
374cdf0e10cSrcweir
375cdf0e10cSrcweir _rDoc.GetLayouter()->mpMovedFwdFrms->Insert( _rMovedFwdFrmByObjPos,
376cdf0e10cSrcweir _nToPageNum );
377cdf0e10cSrcweir }
378cdf0e10cSrcweir
379cdf0e10cSrcweir // --> OD 2005-01-12 #i40155#
RemoveMovedFwdFrm(const SwDoc & _rDoc,const SwTxtFrm & _rTxtFrm)380cdf0e10cSrcweir void SwLayouter::RemoveMovedFwdFrm( const SwDoc& _rDoc,
381cdf0e10cSrcweir const SwTxtFrm& _rTxtFrm )
382cdf0e10cSrcweir {
383cdf0e10cSrcweir sal_uInt32 nDummy;
384cdf0e10cSrcweir if ( SwLayouter::FrmMovedFwdByObjPos( _rDoc, _rTxtFrm, nDummy ) )
385cdf0e10cSrcweir {
386cdf0e10cSrcweir _rDoc.GetLayouter()->mpMovedFwdFrms->Remove( _rTxtFrm );
387cdf0e10cSrcweir }
388cdf0e10cSrcweir }
389cdf0e10cSrcweir // <--
390cdf0e10cSrcweir
FrmMovedFwdByObjPos(const SwDoc & _rDoc,const SwTxtFrm & _rTxtFrm,sal_uInt32 & _ornToPageNum)391cdf0e10cSrcweir bool SwLayouter::FrmMovedFwdByObjPos( const SwDoc& _rDoc,
392cdf0e10cSrcweir const SwTxtFrm& _rTxtFrm,
393cdf0e10cSrcweir sal_uInt32& _ornToPageNum )
394cdf0e10cSrcweir {
395cdf0e10cSrcweir if ( !_rDoc.GetLayouter() )
396cdf0e10cSrcweir {
397cdf0e10cSrcweir _ornToPageNum = 0;
398cdf0e10cSrcweir return false;
399cdf0e10cSrcweir }
400cdf0e10cSrcweir else if ( !_rDoc.GetLayouter()->mpMovedFwdFrms )
401cdf0e10cSrcweir {
402cdf0e10cSrcweir _ornToPageNum = 0;
403cdf0e10cSrcweir return false;
404cdf0e10cSrcweir }
405cdf0e10cSrcweir else
406cdf0e10cSrcweir {
407cdf0e10cSrcweir return _rDoc.GetLayouter()->mpMovedFwdFrms->
408cdf0e10cSrcweir FrmMovedFwdByObjPos( _rTxtFrm, _ornToPageNum );
409cdf0e10cSrcweir }
410cdf0e10cSrcweir }
411cdf0e10cSrcweir // <--
412cdf0e10cSrcweir // --> OD 2004-10-05 #i26945#
DoesRowContainMovedFwdFrm(const SwDoc & _rDoc,const SwRowFrm & _rRowFrm)413cdf0e10cSrcweir bool SwLayouter::DoesRowContainMovedFwdFrm( const SwDoc& _rDoc,
414cdf0e10cSrcweir const SwRowFrm& _rRowFrm )
415cdf0e10cSrcweir {
416cdf0e10cSrcweir if ( !_rDoc.GetLayouter() )
417cdf0e10cSrcweir {
418cdf0e10cSrcweir return false;
419cdf0e10cSrcweir }
420cdf0e10cSrcweir else if ( !_rDoc.GetLayouter()->mpMovedFwdFrms )
421cdf0e10cSrcweir {
422cdf0e10cSrcweir return false;
423cdf0e10cSrcweir }
424cdf0e10cSrcweir else
425cdf0e10cSrcweir {
426cdf0e10cSrcweir return _rDoc.GetLayouter()->
427cdf0e10cSrcweir mpMovedFwdFrms->DoesRowContainMovedFwdFrm( _rRowFrm );
428cdf0e10cSrcweir }
429cdf0e10cSrcweir }
430cdf0e10cSrcweir // <--
431cdf0e10cSrcweir
432cdf0e10cSrcweir // --> OD 2004-10-22 #i35911#
ClearObjsTmpConsiderWrapInfluence(const SwDoc & _rDoc)433cdf0e10cSrcweir void SwLayouter::ClearObjsTmpConsiderWrapInfluence( const SwDoc& _rDoc )
434cdf0e10cSrcweir {
435cdf0e10cSrcweir if ( _rDoc.GetLayouter() &&
436cdf0e10cSrcweir _rDoc.GetLayouter()->mpObjsTmpConsiderWrapInfl )
437cdf0e10cSrcweir {
438cdf0e10cSrcweir _rDoc.GetLayouter()->mpObjsTmpConsiderWrapInfl->Clear();
439cdf0e10cSrcweir }
440cdf0e10cSrcweir }
InsertObjForTmpConsiderWrapInfluence(const SwDoc & _rDoc,SwAnchoredObject & _rAnchoredObj)441cdf0e10cSrcweir void SwLayouter::InsertObjForTmpConsiderWrapInfluence(
442cdf0e10cSrcweir const SwDoc& _rDoc,
443cdf0e10cSrcweir SwAnchoredObject& _rAnchoredObj )
444cdf0e10cSrcweir {
445cdf0e10cSrcweir if ( !_rDoc.GetLayouter() )
446cdf0e10cSrcweir {
447cdf0e10cSrcweir const_cast<SwDoc&>(_rDoc).SetLayouter( new SwLayouter() );
448cdf0e10cSrcweir }
449cdf0e10cSrcweir
450cdf0e10cSrcweir if ( !_rDoc.GetLayouter()->mpObjsTmpConsiderWrapInfl )
451cdf0e10cSrcweir {
452cdf0e10cSrcweir const_cast<SwDoc&>(_rDoc).GetLayouter()->mpObjsTmpConsiderWrapInfl =
453cdf0e10cSrcweir new SwObjsMarkedAsTmpConsiderWrapInfluence();
454cdf0e10cSrcweir }
455cdf0e10cSrcweir
456cdf0e10cSrcweir _rDoc.GetLayouter()->mpObjsTmpConsiderWrapInfl->Insert( _rAnchoredObj );
457cdf0e10cSrcweir }
458cdf0e10cSrcweir // <--
459cdf0e10cSrcweir // --> OD 2005-01-12 #i40155#
ClearFrmsNotToWrap(const SwDoc & _rDoc)460cdf0e10cSrcweir void SwLayouter::ClearFrmsNotToWrap( const SwDoc& _rDoc )
461cdf0e10cSrcweir {
462cdf0e10cSrcweir if ( _rDoc.GetLayouter() )
463cdf0e10cSrcweir {
464cdf0e10cSrcweir const_cast<SwDoc&>(_rDoc).GetLayouter()->maFrmsNotToWrap.clear();
465cdf0e10cSrcweir }
466cdf0e10cSrcweir }
467cdf0e10cSrcweir
InsertFrmNotToWrap(const SwDoc & _rDoc,const SwFrm & _rFrm)468cdf0e10cSrcweir void SwLayouter::InsertFrmNotToWrap( const SwDoc& _rDoc,
469cdf0e10cSrcweir const SwFrm& _rFrm )
470cdf0e10cSrcweir {
471cdf0e10cSrcweir if ( !_rDoc.GetLayouter() )
472cdf0e10cSrcweir {
473cdf0e10cSrcweir const_cast<SwDoc&>(_rDoc).SetLayouter( new SwLayouter() );
474cdf0e10cSrcweir }
475cdf0e10cSrcweir
476cdf0e10cSrcweir if ( !SwLayouter::FrmNotToWrap( _rDoc, _rFrm ) )
477cdf0e10cSrcweir {
478cdf0e10cSrcweir const_cast<SwDoc&>(_rDoc).GetLayouter()->maFrmsNotToWrap.push_back( &_rFrm );
479cdf0e10cSrcweir }
480cdf0e10cSrcweir }
481cdf0e10cSrcweir
FrmNotToWrap(const IDocumentLayoutAccess & _rDLA,const SwFrm & _rFrm)482cdf0e10cSrcweir bool SwLayouter::FrmNotToWrap( const IDocumentLayoutAccess& _rDLA,
483cdf0e10cSrcweir const SwFrm& _rFrm )
484cdf0e10cSrcweir {
485cdf0e10cSrcweir const SwLayouter* pLayouter = _rDLA.GetLayouter();
486cdf0e10cSrcweir if ( !pLayouter )
487cdf0e10cSrcweir {
488cdf0e10cSrcweir return false;
489cdf0e10cSrcweir }
490cdf0e10cSrcweir else
491cdf0e10cSrcweir {
492cdf0e10cSrcweir bool bFrmNotToWrap( false );
493cdf0e10cSrcweir std::vector< const SwFrm* >::const_iterator aIter =
494cdf0e10cSrcweir pLayouter->maFrmsNotToWrap.begin();
495cdf0e10cSrcweir for ( ; aIter != pLayouter->maFrmsNotToWrap.end(); ++aIter )
496cdf0e10cSrcweir {
497cdf0e10cSrcweir const SwFrm* pFrm = *(aIter);
498cdf0e10cSrcweir if ( pFrm == &_rFrm )
499cdf0e10cSrcweir {
500cdf0e10cSrcweir bFrmNotToWrap = true;
501cdf0e10cSrcweir break;
502cdf0e10cSrcweir }
503cdf0e10cSrcweir }
504cdf0e10cSrcweir return bFrmNotToWrap;
505cdf0e10cSrcweir }
506cdf0e10cSrcweir }
507cdf0e10cSrcweir // <--
508cdf0e10cSrcweir
LOOPING_LOUIE_LIGHT(bool bCondition,const SwTxtFrm & rTxtFrm)509cdf0e10cSrcweir void LOOPING_LOUIE_LIGHT( bool bCondition, const SwTxtFrm& rTxtFrm )
510cdf0e10cSrcweir {
511cdf0e10cSrcweir if ( bCondition )
512cdf0e10cSrcweir {
513cdf0e10cSrcweir const SwDoc& rDoc = *rTxtFrm.GetAttrSet()->GetDoc();
514cdf0e10cSrcweir if ( rDoc.GetLayouter() )
515cdf0e10cSrcweir {
516cdf0e10cSrcweir const_cast<SwDoc&>(rDoc).GetLayouter()->LoopingLouieLight( rDoc, rTxtFrm );
517cdf0e10cSrcweir }
518cdf0e10cSrcweir }
519cdf0e10cSrcweir }
520cdf0e10cSrcweir
521cdf0e10cSrcweir // --> OD 2006-05-10 #i65250#
MoveBwdSuppressed(const SwDoc & p_rDoc,const SwFlowFrm & p_rFlowFrm,const SwLayoutFrm & p_rNewUpperFrm)522cdf0e10cSrcweir bool SwLayouter::MoveBwdSuppressed( const SwDoc& p_rDoc,
523cdf0e10cSrcweir const SwFlowFrm& p_rFlowFrm,
524cdf0e10cSrcweir const SwLayoutFrm& p_rNewUpperFrm )
525cdf0e10cSrcweir {
526cdf0e10cSrcweir bool bMoveBwdSuppressed( false );
527cdf0e10cSrcweir
528cdf0e10cSrcweir if ( !p_rDoc.GetLayouter() )
529cdf0e10cSrcweir {
530cdf0e10cSrcweir const_cast<SwDoc&>(p_rDoc).SetLayouter( new SwLayouter() );
531cdf0e10cSrcweir }
532cdf0e10cSrcweir
533cdf0e10cSrcweir // create hash map key
534cdf0e10cSrcweir tMoveBwdLayoutInfoKey aMoveBwdLayoutInfo;
535cdf0e10cSrcweir aMoveBwdLayoutInfo.mnFrmId = p_rFlowFrm.GetFrm()->GetFrmId();
536cdf0e10cSrcweir aMoveBwdLayoutInfo.mnNewUpperPosX = p_rNewUpperFrm.Frm().Pos().X();
537cdf0e10cSrcweir aMoveBwdLayoutInfo.mnNewUpperPosY = p_rNewUpperFrm.Frm().Pos().Y();
538cdf0e10cSrcweir aMoveBwdLayoutInfo.mnNewUpperWidth = p_rNewUpperFrm.Frm().Width();
539cdf0e10cSrcweir aMoveBwdLayoutInfo.mnNewUpperHeight = p_rNewUpperFrm.Frm().Height();
540cdf0e10cSrcweir SWRECTFN( (&p_rNewUpperFrm) )
541cdf0e10cSrcweir const SwFrm* pLastLower( p_rNewUpperFrm.Lower() );
542cdf0e10cSrcweir while ( pLastLower && pLastLower->GetNext() )
543cdf0e10cSrcweir {
544cdf0e10cSrcweir pLastLower = pLastLower->GetNext();
545cdf0e10cSrcweir }
546cdf0e10cSrcweir aMoveBwdLayoutInfo.mnFreeSpaceInNewUpper =
547cdf0e10cSrcweir pLastLower
548cdf0e10cSrcweir ? (pLastLower->Frm().*fnRect->fnBottomDist)( (p_rNewUpperFrm.*fnRect->fnGetPrtBottom)() )
549cdf0e10cSrcweir : (p_rNewUpperFrm.Frm().*fnRect->fnGetHeight)();
550cdf0e10cSrcweir
551cdf0e10cSrcweir // check for moving backward suppress threshold
552cdf0e10cSrcweir const sal_uInt16 cMoveBwdCountSuppressThreshold = 20;
553cdf0e10cSrcweir if ( ++const_cast<SwDoc&>(p_rDoc).GetLayouter()->maMoveBwdLayoutInfo[ aMoveBwdLayoutInfo ] >
554cdf0e10cSrcweir cMoveBwdCountSuppressThreshold )
555cdf0e10cSrcweir {
556cdf0e10cSrcweir bMoveBwdSuppressed = true;
557cdf0e10cSrcweir }
558cdf0e10cSrcweir
559cdf0e10cSrcweir return bMoveBwdSuppressed;
560cdf0e10cSrcweir }
561cdf0e10cSrcweir
ClearMoveBwdLayoutInfo(const SwDoc & _rDoc)562cdf0e10cSrcweir void SwLayouter::ClearMoveBwdLayoutInfo( const SwDoc& _rDoc )
563cdf0e10cSrcweir {
564cdf0e10cSrcweir if ( _rDoc.GetLayouter() )
565cdf0e10cSrcweir const_cast<SwDoc&>(_rDoc).GetLayouter()->maMoveBwdLayoutInfo.clear();
566cdf0e10cSrcweir }
567cdf0e10cSrcweir // <--
568