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
10cdf0e10cSrcweir *
11*efeef26fSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir *
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.
19cdf0e10cSrcweir *
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 #include <objectformatter.hxx>
27cdf0e10cSrcweir #include <objectformattertxtfrm.hxx>
28cdf0e10cSrcweir #include <objectformatterlayfrm.hxx>
29cdf0e10cSrcweir #include <anchoredobject.hxx>
30cdf0e10cSrcweir #include <anchoreddrawobject.hxx>
31cdf0e10cSrcweir #include <sortedobjs.hxx>
32cdf0e10cSrcweir #include <pagefrm.hxx>
33cdf0e10cSrcweir #include <flyfrms.hxx>
34cdf0e10cSrcweir #include <txtfrm.hxx>
35cdf0e10cSrcweir #include <layact.hxx>
36cdf0e10cSrcweir #include <frmfmt.hxx>
37cdf0e10cSrcweir #include <fmtanchr.hxx>
38cdf0e10cSrcweir #include <doc.hxx>
39cdf0e10cSrcweir
40cdf0e10cSrcweir #include <vector>
41cdf0e10cSrcweir
42cdf0e10cSrcweir // =============================================================================
43cdf0e10cSrcweir // helper class <SwPageNumAndTypeOfAnchors>
44cdf0e10cSrcweir // --> OD 2004-10-04 #i26945# - Additionally the type of the anchor text frame
45cdf0e10cSrcweir // is collected - by type is meant 'master' or 'follow'.
46cdf0e10cSrcweir // =============================================================================
47cdf0e10cSrcweir class SwPageNumAndTypeOfAnchors
48cdf0e10cSrcweir {
49cdf0e10cSrcweir private:
50cdf0e10cSrcweir struct tEntry
51cdf0e10cSrcweir {
52cdf0e10cSrcweir SwAnchoredObject* mpAnchoredObj;
53cdf0e10cSrcweir sal_uInt32 mnPageNumOfAnchor;
54cdf0e10cSrcweir bool mbAnchoredAtMaster;
55cdf0e10cSrcweir };
56cdf0e10cSrcweir
57cdf0e10cSrcweir std::vector< tEntry* > maObjList;
58cdf0e10cSrcweir
59cdf0e10cSrcweir public:
SwPageNumAndTypeOfAnchors()60cdf0e10cSrcweir inline SwPageNumAndTypeOfAnchors()
61cdf0e10cSrcweir {
62cdf0e10cSrcweir }
~SwPageNumAndTypeOfAnchors()63cdf0e10cSrcweir inline ~SwPageNumAndTypeOfAnchors()
64cdf0e10cSrcweir {
65cdf0e10cSrcweir for ( std::vector< tEntry* >::iterator aIter = maObjList.begin();
66cdf0e10cSrcweir aIter != maObjList.end(); ++aIter )
67cdf0e10cSrcweir {
68cdf0e10cSrcweir delete (*aIter);
69cdf0e10cSrcweir }
70cdf0e10cSrcweir maObjList.clear();
71cdf0e10cSrcweir }
72cdf0e10cSrcweir
Collect(SwAnchoredObject & _rAnchoredObj)73cdf0e10cSrcweir inline void Collect( SwAnchoredObject& _rAnchoredObj )
74cdf0e10cSrcweir {
75cdf0e10cSrcweir tEntry* pNewEntry = new tEntry();
76cdf0e10cSrcweir pNewEntry->mpAnchoredObj = &_rAnchoredObj;
77cdf0e10cSrcweir // --> OD 2004-09-23 #i33751#, #i34060# - method <GetPageFrmOfAnchor()>
78cdf0e10cSrcweir // is replaced by method <FindPageFrmOfAnchor()>. It's return value
79cdf0e10cSrcweir // have to be checked.
80cdf0e10cSrcweir SwPageFrm* pPageFrmOfAnchor = _rAnchoredObj.FindPageFrmOfAnchor();
81cdf0e10cSrcweir if ( pPageFrmOfAnchor )
82cdf0e10cSrcweir {
83cdf0e10cSrcweir pNewEntry->mnPageNumOfAnchor = pPageFrmOfAnchor->GetPhyPageNum();
84cdf0e10cSrcweir }
85cdf0e10cSrcweir else
86cdf0e10cSrcweir {
87cdf0e10cSrcweir pNewEntry->mnPageNumOfAnchor = 0;
88cdf0e10cSrcweir }
89cdf0e10cSrcweir // <--
90cdf0e10cSrcweir // --> OD 2004-10-04 #i26945# - collect type of anchor
91cdf0e10cSrcweir SwTxtFrm* pAnchorCharFrm = _rAnchoredObj.FindAnchorCharFrm();
92cdf0e10cSrcweir if ( pAnchorCharFrm )
93cdf0e10cSrcweir {
94cdf0e10cSrcweir pNewEntry->mbAnchoredAtMaster = !pAnchorCharFrm->IsFollow();
95cdf0e10cSrcweir }
96cdf0e10cSrcweir else
97cdf0e10cSrcweir {
98cdf0e10cSrcweir pNewEntry->mbAnchoredAtMaster = true;
99cdf0e10cSrcweir }
100cdf0e10cSrcweir // <--
101cdf0e10cSrcweir maObjList.push_back( pNewEntry );
102cdf0e10cSrcweir }
103cdf0e10cSrcweir
operator [](sal_uInt32 _nIndex)104cdf0e10cSrcweir inline SwAnchoredObject* operator[]( sal_uInt32 _nIndex )
105cdf0e10cSrcweir {
106cdf0e10cSrcweir SwAnchoredObject* bRetObj = 0L;
107cdf0e10cSrcweir
108cdf0e10cSrcweir if ( _nIndex < Count())
109cdf0e10cSrcweir {
110cdf0e10cSrcweir bRetObj = maObjList[_nIndex]->mpAnchoredObj;
111cdf0e10cSrcweir }
112cdf0e10cSrcweir
113cdf0e10cSrcweir return bRetObj;
114cdf0e10cSrcweir }
115cdf0e10cSrcweir
GetPageNum(sal_uInt32 _nIndex)116cdf0e10cSrcweir inline sal_uInt32 GetPageNum( sal_uInt32 _nIndex )
117cdf0e10cSrcweir {
118cdf0e10cSrcweir sal_uInt32 nRetPgNum = 0L;
119cdf0e10cSrcweir
120cdf0e10cSrcweir if ( _nIndex < Count())
121cdf0e10cSrcweir {
122cdf0e10cSrcweir nRetPgNum = maObjList[_nIndex]->mnPageNumOfAnchor;
123cdf0e10cSrcweir }
124cdf0e10cSrcweir
125cdf0e10cSrcweir return nRetPgNum;
126cdf0e10cSrcweir }
127cdf0e10cSrcweir
128cdf0e10cSrcweir // --> OD 2004-10-04 #i26945#
AnchoredAtMaster(sal_uInt32 _nIndex)129cdf0e10cSrcweir inline bool AnchoredAtMaster( sal_uInt32 _nIndex )
130cdf0e10cSrcweir {
131cdf0e10cSrcweir bool bAnchoredAtMaster( true );
132cdf0e10cSrcweir
133cdf0e10cSrcweir if ( _nIndex < Count())
134cdf0e10cSrcweir {
135cdf0e10cSrcweir bAnchoredAtMaster = maObjList[_nIndex]->mbAnchoredAtMaster;
136cdf0e10cSrcweir }
137cdf0e10cSrcweir
138cdf0e10cSrcweir return bAnchoredAtMaster;
139cdf0e10cSrcweir }
140cdf0e10cSrcweir // <--
141cdf0e10cSrcweir
Count() const142cdf0e10cSrcweir inline sal_uInt32 Count() const
143cdf0e10cSrcweir {
144cdf0e10cSrcweir return maObjList.size();
145cdf0e10cSrcweir }
146cdf0e10cSrcweir };
147cdf0e10cSrcweir
148cdf0e10cSrcweir // =============================================================================
149cdf0e10cSrcweir // implementation of class <SwObjectFormatter>
150cdf0e10cSrcweir // =============================================================================
SwObjectFormatter(const SwPageFrm & _rPageFrm,SwLayAction * _pLayAction,const bool _bCollectPgNumOfAnchors)151cdf0e10cSrcweir SwObjectFormatter::SwObjectFormatter( const SwPageFrm& _rPageFrm,
152cdf0e10cSrcweir SwLayAction* _pLayAction,
153cdf0e10cSrcweir const bool _bCollectPgNumOfAnchors )
154cdf0e10cSrcweir : mrPageFrm( _rPageFrm ),
155cdf0e10cSrcweir mbFormatOnlyAsCharAnchored( false ),
156cdf0e10cSrcweir mbConsiderWrapOnObjPos( _rPageFrm.GetFmt()->getIDocumentSettingAccess()->get(IDocumentSettingAccess::CONSIDER_WRAP_ON_OBJECT_POSITION) ),
157cdf0e10cSrcweir mpLayAction( _pLayAction ),
158cdf0e10cSrcweir // --> OD 2004-10-04 #i26945#
159cdf0e10cSrcweir mpPgNumAndTypeOfAnchors( _bCollectPgNumOfAnchors ? new SwPageNumAndTypeOfAnchors() : 0L )
160cdf0e10cSrcweir // <--
161cdf0e10cSrcweir {
162cdf0e10cSrcweir }
163cdf0e10cSrcweir
~SwObjectFormatter()164cdf0e10cSrcweir SwObjectFormatter::~SwObjectFormatter()
165cdf0e10cSrcweir {
166cdf0e10cSrcweir delete mpPgNumAndTypeOfAnchors;
167cdf0e10cSrcweir }
168cdf0e10cSrcweir
CreateObjFormatter(SwFrm & _rAnchorFrm,const SwPageFrm & _rPageFrm,SwLayAction * _pLayAction)169cdf0e10cSrcweir SwObjectFormatter* SwObjectFormatter::CreateObjFormatter(
170cdf0e10cSrcweir SwFrm& _rAnchorFrm,
171cdf0e10cSrcweir const SwPageFrm& _rPageFrm,
172cdf0e10cSrcweir SwLayAction* _pLayAction )
173cdf0e10cSrcweir {
174cdf0e10cSrcweir SwObjectFormatter* pObjFormatter = 0L;
175cdf0e10cSrcweir if ( _rAnchorFrm.IsTxtFrm() )
176cdf0e10cSrcweir {
177cdf0e10cSrcweir pObjFormatter = SwObjectFormatterTxtFrm::CreateObjFormatter(
178cdf0e10cSrcweir static_cast<SwTxtFrm&>(_rAnchorFrm),
179cdf0e10cSrcweir _rPageFrm, _pLayAction );
180cdf0e10cSrcweir }
181cdf0e10cSrcweir else if ( _rAnchorFrm.IsLayoutFrm() )
182cdf0e10cSrcweir {
183cdf0e10cSrcweir pObjFormatter = SwObjectFormatterLayFrm::CreateObjFormatter(
184cdf0e10cSrcweir static_cast<SwLayoutFrm&>(_rAnchorFrm),
185cdf0e10cSrcweir _rPageFrm, _pLayAction );
186cdf0e10cSrcweir }
187cdf0e10cSrcweir else
188cdf0e10cSrcweir {
189cdf0e10cSrcweir ASSERT( false,
190cdf0e10cSrcweir "<SwObjectFormatter::CreateObjFormatter(..)> - unexcepted type of anchor frame" );
191cdf0e10cSrcweir }
192cdf0e10cSrcweir
193cdf0e10cSrcweir return pObjFormatter;
194cdf0e10cSrcweir }
195cdf0e10cSrcweir
196cdf0e10cSrcweir /** method to format all floating screen objects at the given anchor frame
197cdf0e10cSrcweir
198cdf0e10cSrcweir @author OD
199cdf0e10cSrcweir */
FormatObjsAtFrm(SwFrm & _rAnchorFrm,const SwPageFrm & _rPageFrm,SwLayAction * _pLayAction)200cdf0e10cSrcweir bool SwObjectFormatter::FormatObjsAtFrm( SwFrm& _rAnchorFrm,
201cdf0e10cSrcweir const SwPageFrm& _rPageFrm,
202cdf0e10cSrcweir SwLayAction* _pLayAction )
203cdf0e10cSrcweir {
204cdf0e10cSrcweir bool bSuccess( true );
205cdf0e10cSrcweir
206cdf0e10cSrcweir // create corresponding object formatter
207cdf0e10cSrcweir SwObjectFormatter* pObjFormatter =
208cdf0e10cSrcweir SwObjectFormatter::CreateObjFormatter( _rAnchorFrm, _rPageFrm, _pLayAction );
209cdf0e10cSrcweir
210cdf0e10cSrcweir if ( pObjFormatter )
211cdf0e10cSrcweir {
212cdf0e10cSrcweir // format anchored floating screen objects
213cdf0e10cSrcweir bSuccess = pObjFormatter->DoFormatObjs();
214cdf0e10cSrcweir }
215cdf0e10cSrcweir delete pObjFormatter;
216cdf0e10cSrcweir
217cdf0e10cSrcweir return bSuccess;
218cdf0e10cSrcweir }
219cdf0e10cSrcweir
220cdf0e10cSrcweir /** method to format a given floating screen object
221cdf0e10cSrcweir
222cdf0e10cSrcweir @author OD
223cdf0e10cSrcweir */
FormatObj(SwAnchoredObject & _rAnchoredObj,SwFrm * _pAnchorFrm,const SwPageFrm * _pPageFrm,SwLayAction * _pLayAction)224cdf0e10cSrcweir bool SwObjectFormatter::FormatObj( SwAnchoredObject& _rAnchoredObj,
225cdf0e10cSrcweir SwFrm* _pAnchorFrm,
226cdf0e10cSrcweir const SwPageFrm* _pPageFrm,
227cdf0e10cSrcweir SwLayAction* _pLayAction )
228cdf0e10cSrcweir {
229cdf0e10cSrcweir bool bSuccess( true );
230cdf0e10cSrcweir
231cdf0e10cSrcweir ASSERT( _pAnchorFrm || _rAnchoredObj.GetAnchorFrm(),
232cdf0e10cSrcweir "<SwObjectFormatter::FormatObj(..)> - missing anchor frame" );
233cdf0e10cSrcweir SwFrm& rAnchorFrm = _pAnchorFrm ? *(_pAnchorFrm) : *(_rAnchoredObj.AnchorFrm());
234cdf0e10cSrcweir
235cdf0e10cSrcweir ASSERT( _pPageFrm || rAnchorFrm.FindPageFrm(),
236cdf0e10cSrcweir "<SwObjectFormatter::FormatObj(..)> - missing page frame" );
237cdf0e10cSrcweir const SwPageFrm& rPageFrm = _pPageFrm ? *(_pPageFrm) : *(rAnchorFrm.FindPageFrm());
238cdf0e10cSrcweir
239cdf0e10cSrcweir // create corresponding object formatter
240cdf0e10cSrcweir SwObjectFormatter* pObjFormatter =
241cdf0e10cSrcweir SwObjectFormatter::CreateObjFormatter( rAnchorFrm, rPageFrm, _pLayAction );
242cdf0e10cSrcweir
243cdf0e10cSrcweir if ( pObjFormatter )
244cdf0e10cSrcweir {
245cdf0e10cSrcweir // format given floating screen object
246cdf0e10cSrcweir // --> OD 2005-01-10 #i40147# - check for moved forward anchor frame
247cdf0e10cSrcweir bSuccess = pObjFormatter->DoFormatObj( _rAnchoredObj, true );
248cdf0e10cSrcweir // <--
249cdf0e10cSrcweir }
250cdf0e10cSrcweir delete pObjFormatter;
251cdf0e10cSrcweir
252cdf0e10cSrcweir return bSuccess;
253cdf0e10cSrcweir }
254cdf0e10cSrcweir
255cdf0e10cSrcweir /** helper method for method <_FormatObj(..)> - performs the intrinsic format
256cdf0e10cSrcweir of the layout of the given layout frame and all its lower layout frames.
257cdf0e10cSrcweir
258cdf0e10cSrcweir OD 2004-06-28 #i28701#
259cdf0e10cSrcweir IMPORTANT NOTE:
260cdf0e10cSrcweir Method corresponds to methods <SwLayAction::FormatLayoutFly(..)> and
261cdf0e10cSrcweir <SwLayAction::FormatLayout(..)>. Thus, its code for the formatting have
262cdf0e10cSrcweir to be synchronised.
263cdf0e10cSrcweir
264cdf0e10cSrcweir @author OD
265cdf0e10cSrcweir */
_FormatLayout(SwLayoutFrm & _rLayoutFrm)266cdf0e10cSrcweir void SwObjectFormatter::_FormatLayout( SwLayoutFrm& _rLayoutFrm )
267cdf0e10cSrcweir {
268cdf0e10cSrcweir _rLayoutFrm.Calc();
269cdf0e10cSrcweir
270cdf0e10cSrcweir SwFrm* pLowerFrm = _rLayoutFrm.Lower();
271cdf0e10cSrcweir while ( pLowerFrm )
272cdf0e10cSrcweir {
273cdf0e10cSrcweir if ( pLowerFrm->IsLayoutFrm() )
274cdf0e10cSrcweir {
275cdf0e10cSrcweir _FormatLayout( *(static_cast<SwLayoutFrm*>(pLowerFrm)) );
276cdf0e10cSrcweir }
277cdf0e10cSrcweir pLowerFrm = pLowerFrm->GetNext();
278cdf0e10cSrcweir }
279cdf0e10cSrcweir }
280cdf0e10cSrcweir
281cdf0e10cSrcweir /** helper method for method <_FormatObj(..)> - performs the intrinsic
282cdf0e10cSrcweir format of the content of the given floating screen object.
283cdf0e10cSrcweir
284cdf0e10cSrcweir OD 2004-06-28 #i28701#
285cdf0e10cSrcweir
286cdf0e10cSrcweir @author OD
287cdf0e10cSrcweir */
_FormatObjCntnt(SwAnchoredObject & _rAnchoredObj)288cdf0e10cSrcweir void SwObjectFormatter::_FormatObjCntnt( SwAnchoredObject& _rAnchoredObj )
289cdf0e10cSrcweir {
290cdf0e10cSrcweir if ( !_rAnchoredObj.ISA(SwFlyFrm) )
291cdf0e10cSrcweir {
292cdf0e10cSrcweir // only Writer fly frames have content
293cdf0e10cSrcweir return;
294cdf0e10cSrcweir }
295cdf0e10cSrcweir
296cdf0e10cSrcweir SwFlyFrm& rFlyFrm = static_cast<SwFlyFrm&>(_rAnchoredObj);
297cdf0e10cSrcweir SwCntntFrm* pCntnt = rFlyFrm.ContainsCntnt();
298cdf0e10cSrcweir
299cdf0e10cSrcweir while ( pCntnt )
300cdf0e10cSrcweir {
301cdf0e10cSrcweir // format content
302cdf0e10cSrcweir pCntnt->OptCalc();
303cdf0e10cSrcweir
304cdf0e10cSrcweir // format floating screen objects at content text frame
305cdf0e10cSrcweir // --> OD 2004-11-01 #i23129#, #i36347# - pass correct page frame to
306cdf0e10cSrcweir // the object formatter
307cdf0e10cSrcweir if ( pCntnt->IsTxtFrm() &&
308cdf0e10cSrcweir !SwObjectFormatter::FormatObjsAtFrm( *pCntnt,
309cdf0e10cSrcweir *(pCntnt->FindPageFrm()),
310cdf0e10cSrcweir GetLayAction() ) )
311cdf0e10cSrcweir // <--
312cdf0e10cSrcweir {
313cdf0e10cSrcweir // restart format with first content
314cdf0e10cSrcweir pCntnt = rFlyFrm.ContainsCntnt();
315cdf0e10cSrcweir continue;
316cdf0e10cSrcweir }
317cdf0e10cSrcweir
318cdf0e10cSrcweir // continue with next content
319cdf0e10cSrcweir pCntnt = pCntnt->GetNextCntntFrm();
320cdf0e10cSrcweir }
321cdf0e10cSrcweir }
322cdf0e10cSrcweir
323cdf0e10cSrcweir /** performs the intrinsic format of a given floating screen object and its content.
324cdf0e10cSrcweir
325cdf0e10cSrcweir OD 2004-06-28 #i28701#
326cdf0e10cSrcweir
327cdf0e10cSrcweir @author OD
328cdf0e10cSrcweir */
_FormatObj(SwAnchoredObject & _rAnchoredObj)329cdf0e10cSrcweir void SwObjectFormatter::_FormatObj( SwAnchoredObject& _rAnchoredObj )
330cdf0e10cSrcweir {
331cdf0e10cSrcweir // check, if only as-character anchored object have to be formatted, and
332cdf0e10cSrcweir // check the anchor type
333cdf0e10cSrcweir if ( FormatOnlyAsCharAnchored() &&
334cdf0e10cSrcweir !(_rAnchoredObj.GetFrmFmt().GetAnchor().GetAnchorId() == FLY_AS_CHAR) )
335cdf0e10cSrcweir {
336cdf0e10cSrcweir return;
337cdf0e10cSrcweir }
338cdf0e10cSrcweir
339cdf0e10cSrcweir // collect anchor object and its 'anchor' page number, if requested
340cdf0e10cSrcweir if ( mpPgNumAndTypeOfAnchors )
341cdf0e10cSrcweir {
342cdf0e10cSrcweir mpPgNumAndTypeOfAnchors->Collect( _rAnchoredObj );
343cdf0e10cSrcweir }
344cdf0e10cSrcweir
345cdf0e10cSrcweir if ( _rAnchoredObj.ISA(SwFlyFrm) )
346cdf0e10cSrcweir {
347cdf0e10cSrcweir SwFlyFrm& rFlyFrm = static_cast<SwFlyFrm&>(_rAnchoredObj);
348cdf0e10cSrcweir // --> OD 2004-11-15 #i34753# - reset flag, which prevents a positioning
349cdf0e10cSrcweir if ( rFlyFrm.IsFlyLayFrm() )
350cdf0e10cSrcweir {
351cdf0e10cSrcweir static_cast<SwFlyLayFrm&>(rFlyFrm).SetNoMakePos( false );
352cdf0e10cSrcweir }
353cdf0e10cSrcweir // <--
354cdf0e10cSrcweir
355cdf0e10cSrcweir // FME 2007-08-30 #i81146# new loop control
356cdf0e10cSrcweir sal_uInt16 nLoopControlRuns = 0;
357cdf0e10cSrcweir const sal_uInt16 nLoopControlMax = 15;
358cdf0e10cSrcweir
359cdf0e10cSrcweir do {
360cdf0e10cSrcweir if ( mpLayAction )
361cdf0e10cSrcweir {
362cdf0e10cSrcweir mpLayAction->FormatLayoutFly( &rFlyFrm );
363cdf0e10cSrcweir // --> OD 2005-07-13 #124218# - consider, if the layout action
364cdf0e10cSrcweir // has to be restarted due to a delete of a page frame.
365cdf0e10cSrcweir if ( mpLayAction->IsAgain() )
366cdf0e10cSrcweir {
367cdf0e10cSrcweir break;
368cdf0e10cSrcweir }
369cdf0e10cSrcweir // <--
370cdf0e10cSrcweir }
371cdf0e10cSrcweir else
372cdf0e10cSrcweir {
373cdf0e10cSrcweir _FormatLayout( rFlyFrm );
374cdf0e10cSrcweir }
375cdf0e10cSrcweir // --> OD 2004-11-15 #i34753# - prevent further positioning, if
376cdf0e10cSrcweir // to-page|to-fly anchored Writer fly frame is already clipped.
377cdf0e10cSrcweir if ( rFlyFrm.IsFlyLayFrm() && rFlyFrm.IsClipped() )
378cdf0e10cSrcweir {
379cdf0e10cSrcweir static_cast<SwFlyLayFrm&>(rFlyFrm).SetNoMakePos( true );
380cdf0e10cSrcweir }
381cdf0e10cSrcweir // <--
382cdf0e10cSrcweir // --> OD 2004-11-02 #i23129#, #i36347# - pass correct page frame
383cdf0e10cSrcweir // to the object formatter
384cdf0e10cSrcweir SwObjectFormatter::FormatObjsAtFrm( rFlyFrm,
385cdf0e10cSrcweir *(rFlyFrm.FindPageFrm()),
386cdf0e10cSrcweir mpLayAction );
387cdf0e10cSrcweir // <--
388cdf0e10cSrcweir if ( mpLayAction )
389cdf0e10cSrcweir {
390cdf0e10cSrcweir mpLayAction->_FormatFlyCntnt( &rFlyFrm );
391cdf0e10cSrcweir // --> OD 2005-07-13 #124218# - consider, if the layout action
392cdf0e10cSrcweir // has to be restarted due to a delete of a page frame.
393cdf0e10cSrcweir if ( mpLayAction->IsAgain() )
394cdf0e10cSrcweir {
395cdf0e10cSrcweir break;
396cdf0e10cSrcweir }
397cdf0e10cSrcweir // <--
398cdf0e10cSrcweir }
399cdf0e10cSrcweir else
400cdf0e10cSrcweir {
401cdf0e10cSrcweir _FormatObjCntnt( rFlyFrm );
402cdf0e10cSrcweir }
403cdf0e10cSrcweir
404cdf0e10cSrcweir if ( ++nLoopControlRuns >= nLoopControlMax )
405cdf0e10cSrcweir {
406cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
407cdf0e10cSrcweir ASSERT( false, "LoopControl in SwObjectFormatter::_FormatObj: Stage 3!!!" );
408cdf0e10cSrcweir #endif
409cdf0e10cSrcweir rFlyFrm.ValidateThisAndAllLowers( 2 );
410cdf0e10cSrcweir nLoopControlRuns = 0;
411cdf0e10cSrcweir }
412cdf0e10cSrcweir
413cdf0e10cSrcweir // --> OD 2006-02-02 #i57917#
414cdf0e10cSrcweir // stop formatting of anchored object, if restart of layout process is requested.
415cdf0e10cSrcweir } while ( !rFlyFrm.IsValid() &&
416cdf0e10cSrcweir !_rAnchoredObj.RestartLayoutProcess() &&
417cdf0e10cSrcweir rFlyFrm.GetAnchorFrm() == &GetAnchorFrm() );
418cdf0e10cSrcweir // <--
419cdf0e10cSrcweir }
420cdf0e10cSrcweir else if ( _rAnchoredObj.ISA(SwAnchoredDrawObject) )
421cdf0e10cSrcweir {
422cdf0e10cSrcweir _rAnchoredObj.MakeObjPos();
423cdf0e10cSrcweir }
424cdf0e10cSrcweir }
425cdf0e10cSrcweir
426cdf0e10cSrcweir /** invokes the intrinsic format method for all floating screen objects,
427cdf0e10cSrcweir anchored at anchor frame on the given page frame
428cdf0e10cSrcweir
429cdf0e10cSrcweir OD 2004-06-28 #i28701#
430cdf0e10cSrcweir OD 2004-10-08 #i26945# - for format of floating screen objects for
431cdf0e10cSrcweir follow text frames, the 'master' text frame is passed to the method.
432cdf0e10cSrcweir Thus, the objects, whose anchor character is inside the follow text
433cdf0e10cSrcweir frame can be formatted.
434cdf0e10cSrcweir
435cdf0e10cSrcweir @author OD
436cdf0e10cSrcweir */
_FormatObjsAtFrm(SwTxtFrm * _pMasterTxtFrm)437cdf0e10cSrcweir bool SwObjectFormatter::_FormatObjsAtFrm( SwTxtFrm* _pMasterTxtFrm )
438cdf0e10cSrcweir {
439cdf0e10cSrcweir // --> OD 2004-10-08 #i26945#
440cdf0e10cSrcweir SwFrm* pAnchorFrm( 0L );
441cdf0e10cSrcweir if ( GetAnchorFrm().IsTxtFrm() &&
442cdf0e10cSrcweir static_cast<SwTxtFrm&>(GetAnchorFrm()).IsFollow() &&
443cdf0e10cSrcweir _pMasterTxtFrm )
444cdf0e10cSrcweir {
445cdf0e10cSrcweir pAnchorFrm = _pMasterTxtFrm;
446cdf0e10cSrcweir }
447cdf0e10cSrcweir else
448cdf0e10cSrcweir {
449cdf0e10cSrcweir pAnchorFrm = &GetAnchorFrm();
450cdf0e10cSrcweir }
451cdf0e10cSrcweir // <--
452cdf0e10cSrcweir if ( !pAnchorFrm->GetDrawObjs() )
453cdf0e10cSrcweir {
454cdf0e10cSrcweir // nothing to do, if no floating screen object is registered at the anchor frame.
455cdf0e10cSrcweir return true;
456cdf0e10cSrcweir }
457cdf0e10cSrcweir
458cdf0e10cSrcweir bool bSuccess( true );
459cdf0e10cSrcweir
460cdf0e10cSrcweir sal_uInt32 i = 0;
461cdf0e10cSrcweir for ( ; i < pAnchorFrm->GetDrawObjs()->Count(); ++i )
462cdf0e10cSrcweir {
463cdf0e10cSrcweir SwAnchoredObject* pAnchoredObj = (*pAnchorFrm->GetDrawObjs())[i];
464cdf0e10cSrcweir
465cdf0e10cSrcweir // check, if object's anchor is on the given page frame or
466cdf0e10cSrcweir // object is registered at the given page frame.
467cdf0e10cSrcweir // --> OD 2004-10-05 #i26945# - check, if the anchor character of the
468cdf0e10cSrcweir // anchored object is located in a follow text frame. If this anchor
469cdf0e10cSrcweir // follow text frame differs from the given anchor frame, the given
470cdf0e10cSrcweir // anchor frame is a 'master' text frame of the anchor follow text frame.
471cdf0e10cSrcweir // If the anchor follow text frame is in the same body as its 'master'
472cdf0e10cSrcweir // text frame, do not format the anchored object.
473cdf0e10cSrcweir // E.g., this situation can occur during the table row splitting algorithm.
474cdf0e10cSrcweir SwTxtFrm* pAnchorCharFrm = pAnchoredObj->FindAnchorCharFrm();
475cdf0e10cSrcweir const bool bAnchoredAtFollowInSameBodyAsMaster =
476cdf0e10cSrcweir pAnchorCharFrm && pAnchorCharFrm->IsFollow() &&
477cdf0e10cSrcweir pAnchorCharFrm != pAnchoredObj->GetAnchorFrm() &&
478cdf0e10cSrcweir pAnchorCharFrm->FindBodyFrm() ==
479cdf0e10cSrcweir static_cast<SwTxtFrm*>(pAnchoredObj->AnchorFrm())->FindBodyFrm();
480cdf0e10cSrcweir if ( bAnchoredAtFollowInSameBodyAsMaster )
481cdf0e10cSrcweir {
482cdf0e10cSrcweir continue;
483cdf0e10cSrcweir }
484cdf0e10cSrcweir // <--
485cdf0e10cSrcweir // --> OD 2004-09-23 #i33751#, #i34060# - method <GetPageFrmOfAnchor()>
486cdf0e10cSrcweir // is replaced by method <FindPageFrmOfAnchor()>. It's return value
487cdf0e10cSrcweir // have to be checked.
488cdf0e10cSrcweir SwPageFrm* pPageFrmOfAnchor = pAnchoredObj->FindPageFrmOfAnchor();
489cdf0e10cSrcweir ASSERT( pPageFrmOfAnchor,
490cdf0e10cSrcweir "<SwObjectFormatter::_FormatObjsAtFrm()> - missing page frame." );
491cdf0e10cSrcweir // --> OD 2004-10-08 #i26945#
492cdf0e10cSrcweir if ( pPageFrmOfAnchor && pPageFrmOfAnchor == &mrPageFrm )
493cdf0e10cSrcweir // <--
494cdf0e10cSrcweir {
495cdf0e10cSrcweir // if format of object fails, stop formatting and pass fail to
496cdf0e10cSrcweir // calling method via the return value.
497cdf0e10cSrcweir if ( !DoFormatObj( *pAnchoredObj ) )
498cdf0e10cSrcweir {
499cdf0e10cSrcweir bSuccess = false;
500cdf0e10cSrcweir break;
501cdf0e10cSrcweir }
502cdf0e10cSrcweir
503cdf0e10cSrcweir // considering changes at <pAnchorFrm->GetDrawObjs()> during
504cdf0e10cSrcweir // format of the object.
505cdf0e10cSrcweir if ( !pAnchorFrm->GetDrawObjs() ||
506cdf0e10cSrcweir i > pAnchorFrm->GetDrawObjs()->Count() )
507cdf0e10cSrcweir {
508cdf0e10cSrcweir break;
509cdf0e10cSrcweir }
510cdf0e10cSrcweir else
511cdf0e10cSrcweir {
512cdf0e10cSrcweir sal_uInt32 nActPosOfObj =
513cdf0e10cSrcweir pAnchorFrm->GetDrawObjs()->ListPosOf( *pAnchoredObj );
514cdf0e10cSrcweir if ( nActPosOfObj == pAnchorFrm->GetDrawObjs()->Count() ||
515cdf0e10cSrcweir nActPosOfObj > i )
516cdf0e10cSrcweir {
517cdf0e10cSrcweir --i;
518cdf0e10cSrcweir }
519cdf0e10cSrcweir else if ( nActPosOfObj < i )
520cdf0e10cSrcweir {
521cdf0e10cSrcweir i = nActPosOfObj;
522cdf0e10cSrcweir }
523cdf0e10cSrcweir }
524cdf0e10cSrcweir }
525cdf0e10cSrcweir } // end of loop on <pAnchorFrm->.GetDrawObjs()>
526cdf0e10cSrcweir
527cdf0e10cSrcweir return bSuccess;
528cdf0e10cSrcweir }
529cdf0e10cSrcweir
530cdf0e10cSrcweir /** accessor to collected anchored object
531cdf0e10cSrcweir
532cdf0e10cSrcweir OD 2004-07-05 #i28701#
533cdf0e10cSrcweir
534cdf0e10cSrcweir @author OD
535cdf0e10cSrcweir */
GetCollectedObj(const sal_uInt32 _nIndex)536cdf0e10cSrcweir SwAnchoredObject* SwObjectFormatter::GetCollectedObj( const sal_uInt32 _nIndex )
537cdf0e10cSrcweir {
538cdf0e10cSrcweir return mpPgNumAndTypeOfAnchors ? (*mpPgNumAndTypeOfAnchors)[_nIndex] : 0L;
539cdf0e10cSrcweir }
540cdf0e10cSrcweir
541cdf0e10cSrcweir /** accessor to 'anchor' page number of collected anchored object
542cdf0e10cSrcweir
543cdf0e10cSrcweir OD 2004-07-05 #i28701#
544cdf0e10cSrcweir
545cdf0e10cSrcweir @author OD
546cdf0e10cSrcweir */
GetPgNumOfCollected(const sal_uInt32 _nIndex)547cdf0e10cSrcweir sal_uInt32 SwObjectFormatter::GetPgNumOfCollected( const sal_uInt32 _nIndex )
548cdf0e10cSrcweir {
549cdf0e10cSrcweir return mpPgNumAndTypeOfAnchors ? mpPgNumAndTypeOfAnchors->GetPageNum(_nIndex) : 0L;
550cdf0e10cSrcweir }
551cdf0e10cSrcweir
552cdf0e10cSrcweir /** accessor to 'anchor' type of collected anchored object
553cdf0e10cSrcweir
554cdf0e10cSrcweir OD 2004-10-04 #i26945#
555cdf0e10cSrcweir
556cdf0e10cSrcweir @author OD
557cdf0e10cSrcweir */
IsCollectedAnchoredAtMaster(const sal_uInt32 _nIndex)558cdf0e10cSrcweir bool SwObjectFormatter::IsCollectedAnchoredAtMaster( const sal_uInt32 _nIndex )
559cdf0e10cSrcweir {
560cdf0e10cSrcweir return mpPgNumAndTypeOfAnchors
561cdf0e10cSrcweir ? mpPgNumAndTypeOfAnchors->AnchoredAtMaster(_nIndex)
562cdf0e10cSrcweir : true;
563cdf0e10cSrcweir }
564cdf0e10cSrcweir
565cdf0e10cSrcweir /** accessor to total number of collected anchored objects
566cdf0e10cSrcweir
567cdf0e10cSrcweir OD 2004-07-05 #i28701#
568cdf0e10cSrcweir
569cdf0e10cSrcweir @author OD
570cdf0e10cSrcweir */
CountOfCollected()571cdf0e10cSrcweir sal_uInt32 SwObjectFormatter::CountOfCollected()
572cdf0e10cSrcweir {
573cdf0e10cSrcweir return mpPgNumAndTypeOfAnchors ? mpPgNumAndTypeOfAnchors->Count() : 0L;
574cdf0e10cSrcweir }
575