xref: /aoo41x/main/sw/source/core/layout/layouter.cxx (revision efeef26f)
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