xref: /AOO41X/main/sw/source/core/layout/objectformatter.cxx (revision efeef26f81c84063fb0a91bde3856d4a51172d90)
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