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 <objectformatterlayfrm.hxx>
27cdf0e10cSrcweir #include <anchoredobject.hxx>
28cdf0e10cSrcweir #include <sortedobjs.hxx>
29cdf0e10cSrcweir #include <layfrm.hxx>
30cdf0e10cSrcweir #include <pagefrm.hxx>
31cdf0e10cSrcweir
32cdf0e10cSrcweir // --> OD 2005-07-13 #124218#
33cdf0e10cSrcweir #include <layact.hxx>
34cdf0e10cSrcweir // <--
35cdf0e10cSrcweir
36cdf0e10cSrcweir // =============================================================================
37cdf0e10cSrcweir // implementation of class <SwObjectFormatterLayFrm>
38cdf0e10cSrcweir // =============================================================================
SwObjectFormatterLayFrm(SwLayoutFrm & _rAnchorLayFrm,const SwPageFrm & _rPageFrm,SwLayAction * _pLayAction)39cdf0e10cSrcweir SwObjectFormatterLayFrm::SwObjectFormatterLayFrm( SwLayoutFrm& _rAnchorLayFrm,
40cdf0e10cSrcweir const SwPageFrm& _rPageFrm,
41cdf0e10cSrcweir SwLayAction* _pLayAction )
42cdf0e10cSrcweir : SwObjectFormatter( _rPageFrm, _pLayAction ),
43cdf0e10cSrcweir mrAnchorLayFrm( _rAnchorLayFrm )
44cdf0e10cSrcweir {
45cdf0e10cSrcweir }
46cdf0e10cSrcweir
~SwObjectFormatterLayFrm()47cdf0e10cSrcweir SwObjectFormatterLayFrm::~SwObjectFormatterLayFrm()
48cdf0e10cSrcweir {
49cdf0e10cSrcweir }
50cdf0e10cSrcweir
CreateObjFormatter(SwLayoutFrm & _rAnchorLayFrm,const SwPageFrm & _rPageFrm,SwLayAction * _pLayAction)51cdf0e10cSrcweir SwObjectFormatterLayFrm* SwObjectFormatterLayFrm::CreateObjFormatter(
52cdf0e10cSrcweir SwLayoutFrm& _rAnchorLayFrm,
53cdf0e10cSrcweir const SwPageFrm& _rPageFrm,
54cdf0e10cSrcweir SwLayAction* _pLayAction )
55cdf0e10cSrcweir {
56cdf0e10cSrcweir if ( !_rAnchorLayFrm.IsPageFrm() &&
57cdf0e10cSrcweir !_rAnchorLayFrm.IsFlyFrm() )
58cdf0e10cSrcweir {
59cdf0e10cSrcweir ASSERT( false,
60cdf0e10cSrcweir "<SwObjectFormatterLayFrm::CreateObjFormatter(..)> - unexcepted type of anchor frame " );
61cdf0e10cSrcweir return 0L;
62cdf0e10cSrcweir }
63cdf0e10cSrcweir
64cdf0e10cSrcweir SwObjectFormatterLayFrm* pObjFormatter = 0L;
65cdf0e10cSrcweir
66cdf0e10cSrcweir // create object formatter, if floating screen objects are registered at
67cdf0e10cSrcweir // given anchor layout frame.
68cdf0e10cSrcweir if ( _rAnchorLayFrm.GetDrawObjs() ||
69cdf0e10cSrcweir ( _rAnchorLayFrm.IsPageFrm() &&
70cdf0e10cSrcweir static_cast<SwPageFrm&>(_rAnchorLayFrm).GetSortedObjs() ) )
71cdf0e10cSrcweir {
72cdf0e10cSrcweir pObjFormatter =
73cdf0e10cSrcweir new SwObjectFormatterLayFrm( _rAnchorLayFrm, _rPageFrm, _pLayAction );
74cdf0e10cSrcweir }
75cdf0e10cSrcweir
76cdf0e10cSrcweir return pObjFormatter;
77cdf0e10cSrcweir }
78cdf0e10cSrcweir
GetAnchorFrm()79cdf0e10cSrcweir SwFrm& SwObjectFormatterLayFrm::GetAnchorFrm()
80cdf0e10cSrcweir {
81cdf0e10cSrcweir return mrAnchorLayFrm;
82cdf0e10cSrcweir }
83cdf0e10cSrcweir
84cdf0e10cSrcweir // --> OD 2005-01-10 #i40147# - add parameter <_bCheckForMovedFwd>.
85cdf0e10cSrcweir // Not relevant for objects anchored at layout frame.
DoFormatObj(SwAnchoredObject & _rAnchoredObj,const bool)86cdf0e10cSrcweir bool SwObjectFormatterLayFrm::DoFormatObj( SwAnchoredObject& _rAnchoredObj,
87cdf0e10cSrcweir const bool )
88cdf0e10cSrcweir // <--
89cdf0e10cSrcweir {
90cdf0e10cSrcweir _FormatObj( _rAnchoredObj );
91cdf0e10cSrcweir
92cdf0e10cSrcweir // --> OD 2005-07-13 #124218# - consider that the layout action has to be
93cdf0e10cSrcweir // restarted due to a deleted page frame.
94cdf0e10cSrcweir return GetLayAction() ? !GetLayAction()->IsAgain() : true;
95cdf0e10cSrcweir // <--
96cdf0e10cSrcweir }
97cdf0e10cSrcweir
DoFormatObjs()98cdf0e10cSrcweir bool SwObjectFormatterLayFrm::DoFormatObjs()
99cdf0e10cSrcweir {
100cdf0e10cSrcweir bool bSuccess( true );
101cdf0e10cSrcweir
102cdf0e10cSrcweir bSuccess = _FormatObjsAtFrm();
103cdf0e10cSrcweir
104cdf0e10cSrcweir if ( bSuccess && GetAnchorFrm().IsPageFrm() )
105cdf0e10cSrcweir {
106cdf0e10cSrcweir // anchor layout frame is a page frame.
107cdf0e10cSrcweir // Thus, format also all anchored objects, which are registered at
108cdf0e10cSrcweir // this page frame, whose 'anchor' isn't on this page frame and whose
109cdf0e10cSrcweir // anchor frame is valid.
110cdf0e10cSrcweir bSuccess = _AdditionalFormatObjsOnPage();
111cdf0e10cSrcweir }
112cdf0e10cSrcweir
113cdf0e10cSrcweir return bSuccess;
114cdf0e10cSrcweir }
115cdf0e10cSrcweir
116cdf0e10cSrcweir /** method to format all anchored objects, which are registered at
117cdf0e10cSrcweir the page frame, whose 'anchor' isn't on this page frame and whose
118cdf0e10cSrcweir anchor frame is valid.
119cdf0e10cSrcweir
120cdf0e10cSrcweir OD 2004-07-02 #i28701#
121cdf0e10cSrcweir
122cdf0e10cSrcweir @author
123cdf0e10cSrcweir */
_AdditionalFormatObjsOnPage()124cdf0e10cSrcweir bool SwObjectFormatterLayFrm::_AdditionalFormatObjsOnPage()
125cdf0e10cSrcweir {
126cdf0e10cSrcweir if ( !GetAnchorFrm().IsPageFrm() )
127cdf0e10cSrcweir {
128cdf0e10cSrcweir ASSERT( false,
129cdf0e10cSrcweir "<SwObjectFormatterLayFrm::_AdditionalFormatObjsOnPage()> - mis-usage of method, call only for anchor frames of type page frame" );
130cdf0e10cSrcweir return true;
131cdf0e10cSrcweir }
132cdf0e10cSrcweir
133cdf0e10cSrcweir // --> OD 2005-07-13 #124218# - consider, if the layout action
134cdf0e10cSrcweir // has to be restarted due to a delete of a page frame.
135cdf0e10cSrcweir if ( GetLayAction() && GetLayAction()->IsAgain() )
136cdf0e10cSrcweir {
137cdf0e10cSrcweir return false;
138cdf0e10cSrcweir }
139cdf0e10cSrcweir // <--
140cdf0e10cSrcweir
141cdf0e10cSrcweir
142cdf0e10cSrcweir SwPageFrm& rPageFrm = static_cast<SwPageFrm&>(GetAnchorFrm());
143cdf0e10cSrcweir
144cdf0e10cSrcweir if ( !rPageFrm.GetSortedObjs() )
145cdf0e10cSrcweir {
146cdf0e10cSrcweir // nothing to do, if no floating screen object is registered at the anchor frame.
147cdf0e10cSrcweir return true;
148cdf0e10cSrcweir }
149cdf0e10cSrcweir
150cdf0e10cSrcweir bool bSuccess( true );
151cdf0e10cSrcweir
152cdf0e10cSrcweir sal_uInt32 i = 0;
153cdf0e10cSrcweir for ( ; i < rPageFrm.GetSortedObjs()->Count(); ++i )
154cdf0e10cSrcweir {
155cdf0e10cSrcweir SwAnchoredObject* pAnchoredObj = (*rPageFrm.GetSortedObjs())[i];
156cdf0e10cSrcweir
157cdf0e10cSrcweir // --> OD 2005-08-18 #i51941# - do not format object, which are anchored
158cdf0e10cSrcweir // inside or at fly frame.
159cdf0e10cSrcweir if ( pAnchoredObj->GetAnchorFrm()->FindFlyFrm() )
160cdf0e10cSrcweir {
161cdf0e10cSrcweir continue;
162cdf0e10cSrcweir }
163cdf0e10cSrcweir // <--
164cdf0e10cSrcweir // --> OD 2004-09-23 #i33751#, #i34060# - method <GetPageFrmOfAnchor()>
165cdf0e10cSrcweir // is replaced by method <FindPageFrmOfAnchor()>. It's return value
166cdf0e10cSrcweir // have to be checked.
167cdf0e10cSrcweir SwPageFrm* pPageFrmOfAnchor = pAnchoredObj->FindPageFrmOfAnchor();
168cdf0e10cSrcweir // --> OD 2004-10-08 #i26945# - check, if the page frame of the
169cdf0e10cSrcweir // object's anchor frame isn't the given page frame
170cdf0e10cSrcweir ASSERT( pPageFrmOfAnchor,
171cdf0e10cSrcweir "<SwObjectFormatterLayFrm::_AdditionalFormatObjsOnPage()> - missing page frame" )
172cdf0e10cSrcweir if ( pPageFrmOfAnchor &&
173cdf0e10cSrcweir // --> OD 2004-10-22 #i35911#
174cdf0e10cSrcweir pPageFrmOfAnchor->GetPhyPageNum() < rPageFrm.GetPhyPageNum() )
175cdf0e10cSrcweir // <--
176cdf0e10cSrcweir // <--
177cdf0e10cSrcweir {
178cdf0e10cSrcweir // if format of object fails, stop formatting and pass fail to
179cdf0e10cSrcweir // calling method via the return value.
180cdf0e10cSrcweir if ( !DoFormatObj( *pAnchoredObj ) )
181cdf0e10cSrcweir {
182cdf0e10cSrcweir bSuccess = false;
183cdf0e10cSrcweir break;
184cdf0e10cSrcweir }
185cdf0e10cSrcweir
186cdf0e10cSrcweir // considering changes at <GetAnchorFrm().GetDrawObjs()> during
187cdf0e10cSrcweir // format of the object.
188cdf0e10cSrcweir if ( !rPageFrm.GetSortedObjs() ||
189cdf0e10cSrcweir i > rPageFrm.GetSortedObjs()->Count() )
190cdf0e10cSrcweir {
191cdf0e10cSrcweir break;
192cdf0e10cSrcweir }
193cdf0e10cSrcweir else
194cdf0e10cSrcweir {
195cdf0e10cSrcweir sal_uInt32 nActPosOfObj =
196cdf0e10cSrcweir rPageFrm.GetSortedObjs()->ListPosOf( *pAnchoredObj );
197cdf0e10cSrcweir if ( nActPosOfObj == rPageFrm.GetSortedObjs()->Count() ||
198cdf0e10cSrcweir nActPosOfObj > i )
199cdf0e10cSrcweir {
200cdf0e10cSrcweir --i;
201cdf0e10cSrcweir }
202cdf0e10cSrcweir else if ( nActPosOfObj < i )
203cdf0e10cSrcweir {
204cdf0e10cSrcweir i = nActPosOfObj;
205cdf0e10cSrcweir }
206cdf0e10cSrcweir }
207cdf0e10cSrcweir }
208cdf0e10cSrcweir } // end of loop on <rPageFrm.GetSortedObjs()>
209cdf0e10cSrcweir
210cdf0e10cSrcweir return bSuccess;
211cdf0e10cSrcweir }
212