Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : : *
6 : : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : : *
8 : : * OpenOffice.org - a multi-platform office productivity suite
9 : : *
10 : : * This file is part of OpenOffice.org.
11 : : *
12 : : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : : * it under the terms of the GNU Lesser General Public License version 3
14 : : * only, as published by the Free Software Foundation.
15 : : *
16 : : * OpenOffice.org is distributed in the hope that it will be useful,
17 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : : * GNU Lesser General Public License version 3 for more details
20 : : * (a copy is included in the LICENSE file that accompanied this code).
21 : : *
22 : : * You should have received a copy of the GNU Lesser General Public License
23 : : * version 3 along with OpenOffice.org. If not, see
24 : : * <http://www.openoffice.org/license.html>
25 : : * for a copy of the LGPLv3 License.
26 : : *
27 : : ************************************************************************/
28 : :
29 : : #include "hintids.hxx"
30 : : #include <editeng/protitem.hxx>
31 : : #include <editeng/opaqitem.hxx>
32 : : #include <editeng/ulspitem.hxx>
33 : : #include <editeng/lrspitem.hxx>
34 : : #include <svx/svdpage.hxx>
35 : : #include <svx/svditer.hxx>
36 : : #include <svx/fmglob.hxx>
37 : : #include <svx/svdogrp.hxx>
38 : : #include <svx/svdotext.hxx>
39 : : #include <svx/svdmodel.hxx>
40 : : #include <svx/svdpagv.hxx>
41 : : #include <svx/svdviter.hxx>
42 : : #include <svx/svdview.hxx>
43 : : #include <svx/shapepropertynotifier.hxx>
44 : : #include <svx/sdr/contact/objectcontactofobjlistpainter.hxx>
45 : : #include <svx/sdr/contact/displayinfo.hxx>
46 : : #include <fmtornt.hxx>
47 : : #include <viewimp.hxx>
48 : : #include <fmtsrnd.hxx>
49 : : #include <fmtanchr.hxx>
50 : : #include <node.hxx>
51 : : #include <fmtcntnt.hxx>
52 : : #include <pagefrm.hxx>
53 : : #include <rootfrm.hxx>
54 : : #include <frmtool.hxx> // Notify_Background
55 : : #include <flyfrm.hxx>
56 : : #include <frmfmt.hxx>
57 : : #include <dflyobj.hxx>
58 : : #include <dcontact.hxx>
59 : : #include <unodraw.hxx>
60 : : #include <IDocumentDrawModelAccess.hxx>
61 : : #include <doc.hxx>
62 : : #include <hints.hxx>
63 : : #include <txtfrm.hxx>
64 : : #include <editsh.hxx>
65 : : #include <docary.hxx>
66 : : #include <flyfrms.hxx>
67 : : #include <sortedobjs.hxx>
68 : : #include <basegfx/matrix/b2dhommatrix.hxx>
69 : : #include <basegfx/matrix/b2dhommatrixtools.hxx>
70 : : #include <svx/sdr/contact/viewcontactofvirtobj.hxx>
71 : : #include <drawinglayer/primitive2d/transformprimitive2d.hxx>
72 : : #include <svx/sdr/contact/viewobjectcontactofsdrobj.hxx>
73 : : #include <com/sun/star/text/WritingMode2.hpp>
74 : : #include <switerator.hxx>
75 : : #include <algorithm>
76 : :
77 : : using namespace ::com::sun::star;
78 : :
79 : :
80 [ + + ][ + + ]: 31290 : TYPEINIT1( SwContact, SwClient )
81 [ + + ][ + + ]: 18747 : TYPEINIT1( SwFlyDrawContact, SwContact )
82 [ + + ][ + - ]: 23129 : TYPEINIT1( SwDrawContact, SwContact )
83 : :
84 : 1044 : void setContextWritingMode( SdrObject* pObj, SwFrm* pAnchor )
85 : : {
86 [ + - ][ + - ]: 1044 : if( pObj && pAnchor )
87 : : {
88 : 1044 : short nWritingDirection = text::WritingMode2::LR_TB;
89 [ - + ]: 1044 : if( pAnchor->IsVertical() )
90 : : {
91 : 0 : nWritingDirection = text::WritingMode2::TB_RL;
92 [ - + ]: 1044 : } else if( pAnchor->IsRightToLeft() )
93 : : {
94 : 0 : nWritingDirection = text::WritingMode2::RL_TB;
95 : : }
96 : 1044 : pObj->SetContextWritingMode( nWritingDirection );
97 : : }
98 : 1044 : }
99 : :
100 : :
101 : : //Der Umgekehrte Weg: Sucht das Format zum angegebenen Objekt.
102 : : //Wenn das Object ein SwVirtFlyDrawObj ist so wird das Format von
103 : : //selbigem besorgt.
104 : : //Anderfalls ist es eben ein einfaches Zeichenobjekt. Diese hat einen
105 : : //UserCall und der ist Client vom gesuchten Format.
106 : :
107 : 2247 : SwFrmFmt *FindFrmFmt( SdrObject *pObj )
108 : : {
109 : 2247 : SwFrmFmt* pRetval = 0L;
110 : :
111 [ - + ]: 2247 : if ( pObj->ISA(SwVirtFlyDrawObj) )
112 : : {
113 : 0 : pRetval = ((SwVirtFlyDrawObj*)pObj)->GetFmt();
114 : : }
115 : : else
116 : : {
117 : 2247 : SwDrawContact* pContact = static_cast<SwDrawContact*>(GetUserCall( pObj ));
118 [ + + ]: 2247 : if ( pContact )
119 : : {
120 : 1482 : pRetval = pContact->GetFmt();
121 : : }
122 : : }
123 : 2247 : return pRetval;
124 : : }
125 : :
126 : 77 : sal_Bool HasWrap( const SdrObject* pObj )
127 : : {
128 [ + - ]: 77 : if ( pObj )
129 : : {
130 : 77 : const SwFrmFmt* pFmt = ::FindFrmFmt( pObj );
131 [ + - ]: 77 : if ( pFmt )
132 : : {
133 : 77 : return SURROUND_THROUGHT != pFmt->GetSurround().GetSurround();
134 : : }
135 : : }
136 : :
137 : 77 : return sal_False;
138 : : }
139 : :
140 : : /*****************************************************************************
141 : : *
142 : : * GetBoundRect liefert das BoundRect _inklusive_ Abstand des Objekts.
143 : : *
144 : : *****************************************************************************/
145 : :
146 : : // #i68520# - change naming
147 : 0 : SwRect GetBoundRectOfAnchoredObj( const SdrObject* pObj )
148 : : {
149 : 0 : SwRect aRet( pObj->GetCurrentBoundRect() );
150 : : // #i68520# - call cache of <SwAnchoredObject>
151 : 0 : SwContact* pContact( GetUserCall( pObj ) );
152 [ # # ]: 0 : if ( pContact )
153 : : {
154 : 0 : const SwAnchoredObject* pAnchoredObj( pContact->GetAnchoredObj( pObj ) );
155 [ # # ]: 0 : if ( pAnchoredObj )
156 : : {
157 : 0 : aRet = pAnchoredObj->GetObjRectWithSpaces();
158 : : }
159 : : }
160 : 0 : return aRet;
161 : : }
162 : :
163 : : //Liefert den UserCall ggf. vom Gruppenobjekt
164 : : // OD 2004-03-31 #i26791# - change return type
165 : 35017 : SwContact* GetUserCall( const SdrObject* pObj )
166 : : {
167 : : SdrObject *pTmp;
168 [ + + ][ + + ]: 35053 : while ( !pObj->GetUserCall() && 0 != (pTmp = pObj->GetUpGroup()) )
[ + + ]
169 : 36 : pObj = pTmp;
170 : : OSL_ENSURE( !pObj->GetUserCall() || pObj->GetUserCall()->ISA(SwContact),
171 : : "<::GetUserCall(..)> - wrong type of found object user call." );
172 : 35017 : return static_cast<SwContact*>(pObj->GetUserCall());
173 : : }
174 : :
175 : : // liefert sal_True falls das SrdObject ein Marquee-Object (Lauftext) ist
176 : 0 : sal_Bool IsMarqueeTextObj( const SdrObject& rObj )
177 : : {
178 : : SdrTextAniKind eTKind;
179 : 0 : return SdrInventor == rObj.GetObjInventor() &&
180 : 0 : OBJ_TEXT == rObj.GetObjIdentifier() &&
181 : : ( SDRTEXTANI_SCROLL == ( eTKind = ((SdrTextObj&)rObj).GetTextAniKind())
182 [ # # ][ # # ]: 0 : || SDRTEXTANI_ALTERNATE == eTKind || SDRTEXTANI_SLIDE == eTKind );
[ # # ]
[ # # # # ]
183 : : }
184 : :
185 : : /*************************************************************************
186 : : |*
187 : : |* SwContact, Ctor und Dtor
188 : : |*
189 : : |*************************************************************************/
190 : :
191 : 1350 : SwContact::SwContact( SwFrmFmt *pToRegisterIn ) :
192 : : SwClient( pToRegisterIn ),
193 [ + - ]: 1350 : mbInDTOR( false )
194 : 1350 : {}
195 : :
196 [ + - ]: 1254 : SwContact::~SwContact()
197 : : {
198 : 1254 : SetInDTOR();
199 [ - + ]: 1254 : }
200 : :
201 : 8 : bool SwContact::IsInDTOR() const
202 : : {
203 : 8 : return mbInDTOR;
204 : : }
205 : :
206 : 1936 : void SwContact::SetInDTOR()
207 : : {
208 : 1936 : mbInDTOR = true;
209 : 1936 : }
210 : :
211 : : /** method to move drawing object to corresponding visible layer
212 : :
213 : : @author OD
214 : : */
215 : 1950 : void SwContact::MoveObjToVisibleLayer( SdrObject* _pDrawObj )
216 : : {
217 : : // #i46297# - notify background about the arriving of
218 : : // the object and invalidate its position.
219 [ + - ]: 1950 : const bool bNotify( !GetFmt()->getIDocumentDrawModelAccess()->IsVisibleLayerId( _pDrawObj->GetLayer() ) );
220 : :
221 : 1950 : _MoveObjToLayer( true, _pDrawObj );
222 : :
223 : : // #i46297#
224 [ + + ]: 1950 : if ( bNotify )
225 : : {
226 : 556 : SwAnchoredObject* pAnchoredObj = GetAnchoredObj( _pDrawObj );
227 : : OSL_ENSURE( pAnchoredObj,
228 : : "<SwContact::MoveObjToInvisibleLayer(..)> - missing anchored object" );
229 [ + - ]: 556 : if ( pAnchoredObj )
230 : : {
231 : 556 : ::setContextWritingMode( _pDrawObj, pAnchoredObj->GetAnchorFrmContainingAnchPos() );
232 : : // Note: as-character anchored objects aren't registered at a page frame and
233 : : // a notification of its background isn't needed.
234 [ + + ]: 556 : if ( pAnchoredObj->GetPageFrm() )
235 : : {
236 : : ::Notify_Background( _pDrawObj, pAnchoredObj->GetPageFrm(),
237 [ + - ][ + - ]: 74 : pAnchoredObj->GetObjRect(), PREP_FLY_ARRIVE, sal_True );
238 : : }
239 : :
240 : 556 : pAnchoredObj->InvalidateObjPos();
241 : : }
242 : : }
243 : 1950 : }
244 : :
245 : : /** method to move drawing object to corresponding invisible layer
246 : :
247 : : OD 21.08.2003 #i18447#
248 : :
249 : : @author OD
250 : : */
251 : 1796 : void SwContact::MoveObjToInvisibleLayer( SdrObject* _pDrawObj )
252 : : {
253 : : // #i46297# - notify background about the leaving of the object.
254 [ + - ]: 1796 : const bool bNotify( GetFmt()->getIDocumentDrawModelAccess()->IsVisibleLayerId( _pDrawObj->GetLayer() ) );
255 : :
256 : 1796 : _MoveObjToLayer( false, _pDrawObj );
257 : :
258 : : // #i46297#
259 [ + + ]: 1796 : if ( bNotify )
260 : : {
261 : 550 : SwAnchoredObject* pAnchoredObj = GetAnchoredObj( _pDrawObj );
262 : : OSL_ENSURE( pAnchoredObj,
263 : : "<SwContact::MoveObjToInvisibleLayer(..)> - missing anchored object" );
264 : : // Note: as-character anchored objects aren't registered at a page frame and
265 : : // a notification of its background isn't needed.
266 [ - + ][ - + ]: 550 : if ( pAnchoredObj && pAnchoredObj->GetPageFrm() )
[ + - ]
267 : : {
268 : : ::Notify_Background( _pDrawObj, pAnchoredObj->GetPageFrm(),
269 [ # # ][ # # ]: 0 : pAnchoredObj->GetObjRect(), PREP_FLY_LEAVE, sal_True );
270 : : }
271 : : }
272 : 1796 : }
273 : :
274 : : /** method to move object to visible/invisible layer
275 : :
276 : : OD 21.08.2003 #i18447#
277 : : implementation for the public method <MoveObjToVisibleLayer(..)>
278 : : and <MoveObjToInvisibleLayer(..)>
279 : :
280 : : @author OD
281 : : */
282 : 4178 : void SwContact::_MoveObjToLayer( const bool _bToVisible,
283 : : SdrObject* _pDrawObj )
284 : : {
285 [ - + ]: 4178 : if ( !_pDrawObj )
286 : : {
287 : : OSL_FAIL( "SwDrawContact::_MoveObjToLayer(..) - no drawing object!" );
288 : 0 : return;
289 : : }
290 : :
291 [ - + ]: 4178 : if ( !GetRegisteredIn() )
292 : : {
293 : : OSL_FAIL( "SwDrawContact::_MoveObjToLayer(..) - no drawing frame format!" );
294 : 0 : return;
295 : : }
296 : :
297 : 4178 : const IDocumentDrawModelAccess* pIDDMA = static_cast<SwFrmFmt*>(GetRegisteredInNonConst())->getIDocumentDrawModelAccess();
298 [ - + ]: 4178 : if ( !pIDDMA )
299 : : {
300 : : OSL_FAIL( "SwDrawContact::_MoveObjToLayer(..) - no writer document!" );
301 : 0 : return;
302 : : }
303 : :
304 : : SdrLayerID nToHellLayerId =
305 [ + + ]: 4178 : _bToVisible ? pIDDMA->GetHellId() : pIDDMA->GetInvisibleHellId();
306 : : SdrLayerID nToHeavenLayerId =
307 [ + + ]: 4178 : _bToVisible ? pIDDMA->GetHeavenId() : pIDDMA->GetInvisibleHeavenId();
308 : : SdrLayerID nToControlLayerId =
309 [ + + ]: 4178 : _bToVisible ? pIDDMA->GetControlsId() : pIDDMA->GetInvisibleControlsId();
310 : : SdrLayerID nFromHellLayerId =
311 [ + + ]: 4178 : _bToVisible ? pIDDMA->GetInvisibleHellId() : pIDDMA->GetHellId();
312 : : SdrLayerID nFromHeavenLayerId =
313 [ + + ]: 4178 : _bToVisible ? pIDDMA->GetInvisibleHeavenId() : pIDDMA->GetHeavenId();
314 : : SdrLayerID nFromControlLayerId =
315 [ + + ]: 4178 : _bToVisible ? pIDDMA->GetInvisibleControlsId() : pIDDMA->GetControlsId();
316 : :
317 [ + + ]: 4178 : if ( _pDrawObj->ISA( SdrObjGroup ) )
318 : : {
319 : : // determine layer for group object
320 : : {
321 : : // proposed layer of a group object is the hell layer
322 : 66 : SdrLayerID nNewLayerId = nToHellLayerId;
323 [ - + ]: 66 : if ( ::CheckControlLayer( _pDrawObj ) )
324 : : {
325 : : // it has to be the control layer, if one of the member
326 : : // is a control
327 : 0 : nNewLayerId = nToControlLayerId;
328 : : }
329 [ + - + + ]: 132 : else if ( _pDrawObj->GetLayer() == pIDDMA->GetHeavenId() ||
[ + + ]
330 : 66 : _pDrawObj->GetLayer() == pIDDMA->GetInvisibleHeavenId() )
331 : : {
332 : : // it has to be the heaven layer, if method <GetLayer()> reveals
333 : : // a heaven layer
334 : 36 : nNewLayerId = nToHeavenLayerId;
335 : : }
336 : : // set layer at group object, but do *not* broadcast and
337 : : // no propagation to the members.
338 : : // Thus, call <NbcSetLayer(..)> at super class
339 : 66 : _pDrawObj->SdrObject::NbcSetLayer( nNewLayerId );
340 : : }
341 : :
342 : : // call method recursively for group object members
343 : : const SdrObjList* pLst =
344 : 66 : static_cast<SdrObjGroup*>(_pDrawObj)->GetSubList();
345 [ + - ]: 66 : if ( pLst )
346 : : {
347 [ + + ]: 498 : for ( sal_uInt16 i = 0; i < pLst->GetObjCount(); ++i )
348 : : {
349 : 432 : _MoveObjToLayer( _bToVisible, pLst->GetObj( i ) );
350 : : }
351 : : }
352 : : }
353 : : else
354 : : {
355 : 4112 : const SdrLayerID nLayerIdOfObj = _pDrawObj->GetLayer();
356 [ + + ]: 4112 : if ( nLayerIdOfObj == nFromHellLayerId )
357 : : {
358 : 118 : _pDrawObj->SetLayer( nToHellLayerId );
359 : : }
360 [ + + ]: 3994 : else if ( nLayerIdOfObj == nFromHeavenLayerId )
361 : : {
362 : 69 : _pDrawObj->SetLayer( nToHeavenLayerId );
363 : : }
364 [ + + ]: 3925 : else if ( nLayerIdOfObj == nFromControlLayerId )
365 : : {
366 : 4178 : _pDrawObj->SetLayer( nToControlLayerId );
367 : : }
368 : : }
369 : : }
370 : :
371 : : // -------------------------------------------------------------------------
372 : : // some virtual helper methods for information
373 : : // about the object (Writer fly frame resp. drawing object)
374 : :
375 : 1046 : const SwIndex& SwContact::GetCntntAnchorIndex() const
376 : : {
377 : 1046 : return GetCntntAnchor().nContent;
378 : : }
379 : :
380 : : /** get minimum order number of anchored objects handled by with contact
381 : :
382 : : @author
383 : : */
384 : 0 : sal_uInt32 SwContact::GetMinOrdNum() const
385 : : {
386 : 0 : sal_uInt32 nMinOrdNum( SAL_MAX_UINT32 );
387 : :
388 [ # # ]: 0 : std::list< SwAnchoredObject* > aObjs;
389 [ # # ]: 0 : GetAnchoredObjs( aObjs );
390 : :
391 [ # # ]: 0 : while ( !aObjs.empty() )
392 : : {
393 [ # # ][ # # ]: 0 : sal_uInt32 nTmpOrdNum = aObjs.back()->GetDrawObj()->GetOrdNum();
[ # # ]
394 : :
395 [ # # ]: 0 : if ( nTmpOrdNum < nMinOrdNum )
396 : : {
397 : 0 : nMinOrdNum = nTmpOrdNum;
398 : : }
399 : :
400 [ # # ]: 0 : aObjs.pop_back();
401 : : }
402 : :
403 : : OSL_ENSURE( nMinOrdNum != SAL_MAX_UINT32,
404 : : "<SwContact::GetMinOrdNum()> - no order number found." );
405 : 0 : return nMinOrdNum;
406 : : }
407 : :
408 : : /** get maximum order number of anchored objects handled by with contact
409 : :
410 : : @author
411 : : */
412 : 0 : sal_uInt32 SwContact::GetMaxOrdNum() const
413 : : {
414 : 0 : sal_uInt32 nMaxOrdNum( 0L );
415 : :
416 [ # # ]: 0 : std::list< SwAnchoredObject* > aObjs;
417 [ # # ]: 0 : GetAnchoredObjs( aObjs );
418 : :
419 [ # # ]: 0 : while ( !aObjs.empty() )
420 : : {
421 [ # # ][ # # ]: 0 : sal_uInt32 nTmpOrdNum = aObjs.back()->GetDrawObj()->GetOrdNum();
[ # # ]
422 : :
423 [ # # ]: 0 : if ( nTmpOrdNum > nMaxOrdNum )
424 : : {
425 : 0 : nMaxOrdNum = nTmpOrdNum;
426 : : }
427 : :
428 [ # # ]: 0 : aObjs.pop_back();
429 : : }
430 : :
431 : 0 : return nMaxOrdNum;
432 : : }
433 : : // -------------------------------------------------------------------------
434 : :
435 : : /*************************************************************************
436 : : |*
437 : : |* SwFlyDrawContact, Ctor und Dtor
438 : : |*
439 : : |*************************************************************************/
440 : :
441 : 662 : SwFlyDrawContact::SwFlyDrawContact( SwFlyFrmFmt *pToRegisterIn, SdrModel * ) :
442 : 662 : SwContact( pToRegisterIn )
443 : : {
444 : : // OD 2004-04-01 #i26791# - class <SwFlyDrawContact> contains the 'master'
445 : : // drawing object of type <SwFlyDrawObj> on its own.
446 [ + - ][ + - ]: 662 : mpMasterObj = new SwFlyDrawObj;
447 [ + - ]: 662 : mpMasterObj->SetOrdNum( 0xFFFFFFFE );
448 [ + - ]: 662 : mpMasterObj->SetUserCall( this );
449 : 662 : }
450 : :
451 : 572 : SwFlyDrawContact::~SwFlyDrawContact()
452 : : {
453 [ + - ]: 572 : if ( mpMasterObj )
454 : : {
455 [ + - ]: 572 : mpMasterObj->SetUserCall( 0 );
456 [ + - ][ + + ]: 572 : if ( mpMasterObj->GetPage() )
457 [ + - ][ + - ]: 51 : mpMasterObj->GetPage()->RemoveObject( mpMasterObj->GetOrdNum() );
[ + - ]
458 [ + - ][ + - ]: 572 : delete mpMasterObj;
459 : : }
460 [ - + ]: 1144 : }
461 : :
462 : : // OD 2004-03-29 #i26791#
463 : 0 : const SwAnchoredObject* SwFlyDrawContact::GetAnchoredObj( const SdrObject* _pSdrObj ) const
464 : : {
465 : : OSL_ENSURE( _pSdrObj,
466 : : "<SwFlyDrawContact::GetAnchoredObj(..)> - no object provided" );
467 : : OSL_ENSURE( _pSdrObj->ISA(SwVirtFlyDrawObj),
468 : : "<SwFlyDrawContact::GetAnchoredObj(..)> - wrong object type object provided" );
469 : : OSL_ENSURE( GetUserCall( _pSdrObj ) == const_cast<SwFlyDrawContact*>(this),
470 : : "<SwFlyDrawContact::GetAnchoredObj(..)> - provided object doesn't belongs to this contact" );
471 : :
472 : 0 : const SwAnchoredObject* pRetAnchoredObj = 0L;
473 : :
474 [ # # ][ # # ]: 0 : if ( _pSdrObj && _pSdrObj->ISA(SwVirtFlyDrawObj) )
[ # # ]
475 : : {
476 [ # # ]: 0 : pRetAnchoredObj = static_cast<const SwVirtFlyDrawObj*>(_pSdrObj)->GetFlyFrm();
477 : : }
478 : :
479 : 0 : return pRetAnchoredObj;
480 : : }
481 : :
482 : 4376 : SwAnchoredObject* SwFlyDrawContact::GetAnchoredObj( SdrObject* _pSdrObj )
483 : : {
484 : : OSL_ENSURE( _pSdrObj,
485 : : "<SwFlyDrawContact::GetAnchoredObj(..)> - no object provided" );
486 : : OSL_ENSURE( _pSdrObj->ISA(SwVirtFlyDrawObj),
487 : : "<SwFlyDrawContact::GetAnchoredObj(..)> - wrong object type provided" );
488 : : OSL_ENSURE( GetUserCall( _pSdrObj ) == this,
489 : : "<SwFlyDrawContact::GetAnchoredObj(..)> - provided object doesn't belongs to this contact" );
490 : :
491 : 4376 : SwAnchoredObject* pRetAnchoredObj = 0L;
492 : :
493 [ + - ][ + - ]: 4376 : if ( _pSdrObj && _pSdrObj->ISA(SwVirtFlyDrawObj) )
[ + - ]
494 : : {
495 [ + - ]: 4376 : pRetAnchoredObj = static_cast<SwVirtFlyDrawObj*>(_pSdrObj)->GetFlyFrm();
496 : : }
497 : :
498 : 4376 : return pRetAnchoredObj;
499 : : }
500 : :
501 : 552 : const SdrObject* SwFlyDrawContact::GetMaster() const
502 : : {
503 : 552 : return mpMasterObj;
504 : : }
505 : :
506 : 3321 : SdrObject* SwFlyDrawContact::GetMaster()
507 : : {
508 : 3321 : return mpMasterObj;
509 : : }
510 : :
511 : 0 : void SwFlyDrawContact::SetMaster( SdrObject* _pNewMaster )
512 : : {
513 : : OSL_ENSURE( _pNewMaster->ISA(SwFlyDrawObj),
514 : : "<SwFlyDrawContact::SetMaster(..)> - wrong type of new master object" );
515 : 0 : mpMasterObj = static_cast<SwFlyDrawObj *>(_pNewMaster);
516 : 0 : }
517 : :
518 : : /*************************************************************************
519 : : |*
520 : : |* SwFlyDrawContact::Modify()
521 : : |*
522 : : |*************************************************************************/
523 : :
524 : 343 : void SwFlyDrawContact::Modify( const SfxPoolItem*, const SfxPoolItem * )
525 : : {
526 : 343 : }
527 : :
528 : : // override method to control Writer fly frames,
529 : : // which are linked, and to assure that all objects anchored at/inside the
530 : : // Writer fly frame are also made visible.
531 : 1074 : void SwFlyDrawContact::MoveObjToVisibleLayer( SdrObject* _pDrawObj )
532 : : {
533 : : OSL_ENSURE( _pDrawObj->ISA(SwVirtFlyDrawObj),
534 : : "<SwFlyDrawContact::MoveObjToVisibleLayer(..)> - wrong SdrObject type -> crash" );
535 : :
536 [ + - ][ + - ]: 1074 : if ( GetFmt()->getIDocumentDrawModelAccess()->IsVisibleLayerId( _pDrawObj->GetLayer() ) )
537 : : {
538 : : // nothing to do
539 : 1074 : return;
540 : : }
541 : :
542 : 0 : SwFlyFrm* pFlyFrm = static_cast<SwVirtFlyDrawObj*>(_pDrawObj)->GetFlyFrm();
543 : :
544 : : // #i44464# - consider, that Writer fly frame content
545 : : // already exists - (e.g. WW8 document is inserted into a existing document).
546 [ # # ]: 0 : if ( !pFlyFrm->Lower() )
547 : : {
548 : 0 : pFlyFrm->InsertColumns();
549 : 0 : pFlyFrm->Chain( pFlyFrm->AnchorFrm() );
550 : 0 : pFlyFrm->InsertCnt();
551 : : }
552 [ # # ]: 0 : if ( pFlyFrm->GetDrawObjs() )
553 : : {
554 [ # # ]: 0 : for ( sal_uInt8 i = 0; i < pFlyFrm->GetDrawObjs()->Count(); ++i)
555 : : {
556 : : // #i28701# - consider type of objects in sorted object list.
557 : 0 : SdrObject* pObj = (*pFlyFrm->GetDrawObjs())[i]->DrawObj();
558 : 0 : SwContact* pContact = static_cast<SwContact*>(pObj->GetUserCall());
559 : 0 : pContact->MoveObjToVisibleLayer( pObj );
560 : : }
561 : : }
562 : :
563 : : // make fly frame visible
564 : 0 : SwContact::MoveObjToVisibleLayer( _pDrawObj );
565 : : }
566 : :
567 : : // override method to control Writer fly frames,
568 : : // which are linked, and to assure that all objects anchored at/inside the
569 : : // Writer fly frame are also made invisible.
570 : 0 : void SwFlyDrawContact::MoveObjToInvisibleLayer( SdrObject* _pDrawObj )
571 : : {
572 : : OSL_ENSURE( _pDrawObj->ISA(SwVirtFlyDrawObj),
573 : : "<SwFlyDrawContact::MoveObjToInvisibleLayer(..)> - wrong SdrObject type -> crash" );
574 : :
575 [ # # ][ # # ]: 0 : if ( !GetFmt()->getIDocumentDrawModelAccess()->IsVisibleLayerId( _pDrawObj->GetLayer() ) )
576 : : {
577 : : // nothing to do
578 : 0 : return;
579 : : }
580 : :
581 : 0 : SwFlyFrm* pFlyFrm = static_cast<SwVirtFlyDrawObj*>(_pDrawObj)->GetFlyFrm();
582 : :
583 : 0 : pFlyFrm->Unchain();
584 : 0 : pFlyFrm->DeleteCnt();
585 [ # # ]: 0 : if ( pFlyFrm->GetDrawObjs() )
586 : : {
587 [ # # ]: 0 : for ( sal_uInt8 i = 0; i < pFlyFrm->GetDrawObjs()->Count(); ++i)
588 : : {
589 : : // #i28701# - consider type of objects in sorted object list.
590 : 0 : SdrObject* pObj = (*pFlyFrm->GetDrawObjs())[i]->DrawObj();
591 : 0 : SwContact* pContact = static_cast<SwContact*>(pObj->GetUserCall());
592 : 0 : pContact->MoveObjToInvisibleLayer( pObj );
593 : : }
594 : : }
595 : :
596 : : // make fly frame invisible
597 : 0 : SwContact::MoveObjToInvisibleLayer( _pDrawObj );
598 : : }
599 : :
600 : : /** get data collection of anchored objects, handled by with contact
601 : :
602 : : @author
603 : : */
604 : 6 : void SwFlyDrawContact::GetAnchoredObjs( std::list<SwAnchoredObject*>& _roAnchoredObjs ) const
605 : : {
606 : 6 : const SwFrmFmt* pFmt = GetFmt();
607 : 6 : SwFlyFrm::GetAnchoredObjects( _roAnchoredObjs, *pFmt );
608 : 6 : }
609 : :
610 : : /*************************************************************************
611 : : |*
612 : : |* SwDrawContact, Ctor+Dtor
613 : : |*
614 : : |*************************************************************************/
615 : 3602 : bool CheckControlLayer( const SdrObject *pObj )
616 : : {
617 [ + + ]: 3602 : if ( FmFormInventor == pObj->GetObjInventor() )
618 : 1846 : return true;
619 [ + + ]: 1756 : if ( pObj->ISA( SdrObjGroup ) )
620 : : {
621 : 162 : const SdrObjList *pLst = ((SdrObjGroup*)pObj)->GetSubList();
622 [ + + ]: 1356 : for ( sal_uInt16 i = 0; i < pLst->GetObjCount(); ++i )
623 : : {
624 [ - + ]: 1194 : if ( ::CheckControlLayer( pLst->GetObj( i ) ) )
625 : : {
626 : : // OD 21.08.2003 #i18447# - return correct value ;-)
627 : 0 : return true;
628 : : }
629 : : }
630 : : }
631 : 3602 : return false;
632 : : }
633 : :
634 : 688 : SwDrawContact::SwDrawContact( SwFrmFmt* pToRegisterIn, SdrObject* pObj ) :
635 : : SwContact( pToRegisterIn ),
636 : : maAnchoredDrawObj(),
637 : : mbMasterObjCleared( false ),
638 : : mbDisconnectInProgress( false ),
639 : : mbUserCallActive( false ),
640 : : // Note: value of <meEventTypeOfCurrentUserCall> isn't of relevance, because
641 : : // <mbUserCallActive> is sal_False.
642 [ + - ][ + - ]: 688 : meEventTypeOfCurrentUserCall( SDRUSERCALL_MOVEONLY )
643 : : {
644 : : // clear list containing 'virtual' drawing objects.
645 : 688 : maDrawVirtObjs.clear();
646 : :
647 : : // --> #i33909# - assure, that drawing object is inserted
648 : : // in the drawing page.
649 [ + + ][ + - ]: 688 : if ( !pObj->IsInserted() )
650 : : {
651 [ + - ][ + - ]: 12 : pToRegisterIn->getIDocumentDrawModelAccess()->GetDrawModel()->GetPage(0)->
[ + - ]
652 [ + - ][ + - ]: 12 : InsertObject( pObj, pObj->GetOrdNumDirect() );
653 : : }
654 : :
655 : : //Controls muessen immer im Control-Layer liegen. Das gilt auch fuer
656 : : //Gruppenobjekte, wenn diese Controls enthalten.
657 [ + - ][ + + ]: 688 : if ( ::CheckControlLayer( pObj ) )
658 : : {
659 : : // set layer of object to corresponding invisible layer.
660 [ + - ][ + - ]: 470 : pObj->SetLayer( pToRegisterIn->getIDocumentDrawModelAccess()->GetInvisibleControlsId() );
[ + - ]
661 : : }
662 : :
663 : : // #i26791#
664 [ + - ]: 688 : pObj->SetUserCall( this );
665 [ + - ]: 688 : maAnchoredDrawObj.SetDrawObj( *pObj );
666 : :
667 : : // if there already exists an SwXShape for the object, ensure it knows about us, and the SdrObject
668 : : // #i99056#
669 [ + - ]: 688 : SwXShape::AddExistingShapeToFmt( *pObj );
670 : 688 : }
671 : :
672 [ + - ]: 682 : SwDrawContact::~SwDrawContact()
673 : : {
674 : 682 : SetInDTOR();
675 : :
676 [ + - ]: 682 : DisconnectFromLayout();
677 : :
678 : : // remove 'master' from drawing page
679 [ + - ]: 682 : RemoveMasterFromDrawPage();
680 : :
681 : : // remove and destroy 'virtual' drawing objects.
682 [ + - ]: 682 : RemoveAllVirtObjs();
683 : :
684 [ + - ]: 682 : if ( !mbMasterObjCleared )
685 : : {
686 [ + - ]: 682 : SdrObject* pObject = const_cast< SdrObject* >( maAnchoredDrawObj.GetDrawObj() );
687 [ + - ]: 682 : SdrObject::Free( pObject );
688 : : }
689 [ - + ]: 1364 : }
690 : :
691 : 0 : void SwDrawContact::GetTextObjectsFromFmt( std::list<SdrTextObj*>& rTextObjects, SwDoc* pDoc )
692 : : {
693 [ # # ]: 0 : for( sal_Int32 n=0; n<(sal_Int32)pDoc->GetSpzFrmFmts()->size(); n++ )
694 : : {
695 : 0 : SwFrmFmt* pFly = (*pDoc->GetSpzFrmFmts())[n];
696 [ # # ]: 0 : if( pFly->IsA( TYPE(SwDrawFrmFmt) ) )
697 : : {
698 : 0 : SwDrawContact* pContact = SwIterator<SwDrawContact,SwFrmFmt>::FirstElement(*pFly);
699 [ # # ]: 0 : if( pContact )
700 : : {
701 : 0 : SdrObject* pSdrO = pContact->GetMaster();
702 [ # # ]: 0 : if ( pSdrO )
703 : : {
704 [ # # ]: 0 : if ( pSdrO->IsA( TYPE(SdrObjGroup) ) )
705 : : {
706 [ # # ]: 0 : SdrObjListIter aListIter( *pSdrO, IM_DEEPNOGROUPS );
707 : : //iterate inside of a grouped object
708 [ # # ]: 0 : while( aListIter.IsMore() )
709 : : {
710 [ # # ]: 0 : SdrObject* pSdrOElement = aListIter.Next();
711 [ # # ][ # # ]: 0 : if( pSdrOElement && pSdrOElement->IsA( TYPE(SdrTextObj) ) &&
[ # # ][ # # ]
[ # # ][ # # ]
712 [ # # ]: 0 : static_cast<SdrTextObj*>( pSdrOElement)->HasText() )
713 : : {
714 [ # # ]: 0 : rTextObjects.push_back((SdrTextObj*) pSdrOElement);
715 : : }
716 : 0 : }
717 : : }
718 [ # # # # ]: 0 : else if( pSdrO->IsA( TYPE(SdrTextObj) ) &&
[ # # ]
719 : 0 : static_cast<SdrTextObj*>( pSdrO )->HasText() )
720 : : {
721 [ # # ]: 0 : rTextObjects.push_back((SdrTextObj*) pSdrO);
722 : : }
723 : : }
724 : : }
725 : : }
726 : : }
727 : 0 : }
728 : :
729 : : // OD 2004-03-29 #i26791#
730 : 3656 : const SwAnchoredObject* SwDrawContact::GetAnchoredObj( const SdrObject* _pSdrObj ) const
731 : : {
732 : : // handle default parameter value
733 [ - + ]: 3656 : if ( !_pSdrObj )
734 : : {
735 : 0 : _pSdrObj = GetMaster();
736 : : }
737 : :
738 : : OSL_ENSURE( _pSdrObj,
739 : : "<SwDrawContact::GetAnchoredObj(..)> - no object provided" );
740 : : OSL_ENSURE( _pSdrObj->ISA(SwDrawVirtObj) ||
741 : : ( !_pSdrObj->ISA(SdrVirtObj) && !_pSdrObj->ISA(SwDrawVirtObj) ),
742 : : "<SwDrawContact::GetAnchoredObj(..)> - wrong object type object provided" );
743 : : OSL_ENSURE( GetUserCall( _pSdrObj ) == const_cast<SwDrawContact*>(this) ||
744 : : _pSdrObj == GetMaster(),
745 : : "<SwDrawContact::GetAnchoredObj(..)> - provided object doesn't belongs to this contact" );
746 : :
747 : 3656 : const SwAnchoredObject* pRetAnchoredObj = 0L;
748 : :
749 [ + - ]: 3656 : if ( _pSdrObj )
750 : : {
751 [ - + ]: 3656 : if ( _pSdrObj->ISA(SwDrawVirtObj) )
752 : : {
753 : 0 : pRetAnchoredObj = static_cast<const SwDrawVirtObj*>(_pSdrObj)->GetAnchoredObj();
754 : : }
755 [ + - ][ + - ]: 3656 : else if ( !_pSdrObj->ISA(SdrVirtObj) && !_pSdrObj->ISA(SwDrawVirtObj) )
[ + - ]
756 : : {
757 : 3656 : pRetAnchoredObj = &maAnchoredDrawObj;
758 : : }
759 : : }
760 : :
761 : 3656 : return pRetAnchoredObj;
762 : : }
763 : :
764 : 9025 : SwAnchoredObject* SwDrawContact::GetAnchoredObj( SdrObject* _pSdrObj )
765 : : {
766 : : // handle default parameter value
767 [ + + ]: 9025 : if ( !_pSdrObj )
768 : : {
769 : 1303 : _pSdrObj = GetMaster();
770 : : }
771 : :
772 : : OSL_ENSURE( _pSdrObj,
773 : : "<SwDrawContact::GetAnchoredObj(..)> - no object provided" );
774 : : OSL_ENSURE( _pSdrObj->ISA(SwDrawVirtObj) ||
775 : : ( !_pSdrObj->ISA(SdrVirtObj) && !_pSdrObj->ISA(SwDrawVirtObj) ),
776 : : "<SwDrawContact::GetAnchoredObj(..)> - wrong object type object provided" );
777 : : OSL_ENSURE( GetUserCall( _pSdrObj ) == this || _pSdrObj == GetMaster(),
778 : : "<SwDrawContact::GetAnchoredObj(..)> - provided object doesn't belongs to this contact" );
779 : :
780 : 9025 : SwAnchoredObject* pRetAnchoredObj = 0L;
781 : :
782 [ + - ]: 9025 : if ( _pSdrObj )
783 : : {
784 [ - + ]: 9025 : if ( _pSdrObj->ISA(SwDrawVirtObj) )
785 : : {
786 : 0 : pRetAnchoredObj = static_cast<SwDrawVirtObj*>(_pSdrObj)->AnchoredObj();
787 : : }
788 [ + - ][ + - ]: 9025 : else if ( !_pSdrObj->ISA(SdrVirtObj) && !_pSdrObj->ISA(SwDrawVirtObj) )
[ + - ]
789 : : {
790 : 9025 : pRetAnchoredObj = &maAnchoredDrawObj;
791 : : }
792 : : }
793 : :
794 : 9025 : return pRetAnchoredObj;
795 : : }
796 : :
797 : 15 : const SdrObject* SwDrawContact::GetMaster() const
798 : : {
799 : 15 : return !mbMasterObjCleared
800 : 15 : ? maAnchoredDrawObj.GetDrawObj()
801 [ + - ]: 15 : : 0L;
802 : : }
803 : :
804 : 16892 : SdrObject* SwDrawContact::GetMaster()
805 : : {
806 : 16892 : return !mbMasterObjCleared
807 : 16892 : ? maAnchoredDrawObj.DrawObj()
808 [ + - ]: 16892 : : 0L;
809 : : }
810 : :
811 : : // overload <SwContact::SetMaster(..)> in order to
812 : : // assert, if the 'master' drawing object is replaced.
813 : : // replace of master object correctly handled, if
814 : : // handled by method <SwDrawContact::ChangeMasterObject(..)>. Thus, assert
815 : : // only, if a debug level is given.
816 : 0 : void SwDrawContact::SetMaster( SdrObject* _pNewMaster )
817 : : {
818 [ # # ]: 0 : if ( _pNewMaster )
819 : : {
820 : : OSL_FAIL( "debug notification - master replaced!" );
821 : 0 : maAnchoredDrawObj.SetDrawObj( *_pNewMaster );
822 : : }
823 : : else
824 : : {
825 : 0 : mbMasterObjCleared = true;
826 : : }
827 : 0 : }
828 : :
829 : 9 : const SwFrm* SwDrawContact::GetAnchorFrm( const SdrObject* _pDrawObj ) const
830 : : {
831 : 9 : const SwFrm* pAnchorFrm = 0L;
832 [ + - - + : 18 : if ( !_pDrawObj ||
# # # # ]
[ + - ]
833 : 9 : _pDrawObj == GetMaster() ||
834 : 0 : ( !_pDrawObj->GetUserCall() &&
835 : 0 : GetUserCall( _pDrawObj ) == static_cast<const SwContact* const>(this) ) )
836 : : {
837 : 9 : pAnchorFrm = maAnchoredDrawObj.GetAnchorFrm();
838 : : }
839 [ # # ]: 0 : else if ( _pDrawObj->ISA(SwDrawVirtObj) )
840 : : {
841 : 0 : pAnchorFrm = static_cast<const SwDrawVirtObj*>(_pDrawObj)->GetAnchorFrm();
842 : : }
843 : : else
844 : : {
845 : : OSL_FAIL( "<SwDrawContact::GetAnchorFrm(..)> - unknown drawing object." );
846 : : }
847 : :
848 : 9 : return pAnchorFrm;
849 : : }
850 : 12402 : SwFrm* SwDrawContact::GetAnchorFrm( SdrObject* _pDrawObj )
851 : : {
852 : 12402 : SwFrm* pAnchorFrm = 0L;
853 [ + + - + : 12460 : if ( !_pDrawObj ||
# # # # ]
[ + - ]
854 : 58 : _pDrawObj == GetMaster() ||
855 : 0 : ( !_pDrawObj->GetUserCall() &&
856 : 0 : GetUserCall( _pDrawObj ) == this ) )
857 : : {
858 : 12402 : pAnchorFrm = maAnchoredDrawObj.AnchorFrm();
859 : : }
860 : : else
861 : : {
862 : : OSL_ENSURE( _pDrawObj->ISA(SwDrawVirtObj),
863 : : "<SwDrawContact::GetAnchorFrm(..)> - unknown drawing object." );
864 : 0 : pAnchorFrm = static_cast<SwDrawVirtObj*>(_pDrawObj)->AnchorFrm();
865 : : }
866 : :
867 : 12402 : return pAnchorFrm;
868 : : }
869 : :
870 : : // method to create a new 'virtual' drawing object.
871 : 0 : SwDrawVirtObj* SwDrawContact::CreateVirtObj()
872 : : {
873 : : // determine 'master'
874 [ # # ]: 0 : SdrObject* pOrgMasterSdrObj = GetMaster();
875 : :
876 : : // create 'virtual' drawing object
877 [ # # ][ # # ]: 0 : SwDrawVirtObj* pNewDrawVirtObj = new SwDrawVirtObj ( *(pOrgMasterSdrObj), *(this) );
878 : :
879 : : // add new 'virtual' drawing object managing data structure
880 [ # # ]: 0 : maDrawVirtObjs.push_back( pNewDrawVirtObj );
881 : :
882 : 0 : return pNewDrawVirtObj;
883 : : }
884 : :
885 : : // destroys a given 'virtual' drawing object.
886 : : // side effect: 'virtual' drawing object is removed from data structure
887 : : // <maDrawVirtObjs>.
888 : 0 : void SwDrawContact::DestroyVirtObj( SwDrawVirtObj* _pVirtObj )
889 : : {
890 [ # # ]: 0 : if ( _pVirtObj )
891 : : {
892 [ # # ]: 0 : delete _pVirtObj;
893 : 0 : _pVirtObj = 0;
894 : : }
895 : 0 : }
896 : :
897 : : // add a 'virtual' drawing object to drawing page.
898 : : // Use an already created one, which isn't used, or create a new one.
899 : 0 : SwDrawVirtObj* SwDrawContact::AddVirtObj()
900 : : {
901 : 0 : SwDrawVirtObj* pAddedDrawVirtObj = 0L;
902 : :
903 : : // check, if a disconnected 'virtual' drawing object exist and use it
904 : : std::list<SwDrawVirtObj*>::const_iterator aFoundVirtObjIter =
905 : : std::find_if( maDrawVirtObjs.begin(), maDrawVirtObjs.end(),
906 [ # # ]: 0 : UsedOrUnusedVirtObjPred( false ) );
907 : :
908 [ # # ]: 0 : if ( aFoundVirtObjIter != maDrawVirtObjs.end() )
909 : : {
910 : : // use already created, disconnected 'virtual' drawing object
911 : 0 : pAddedDrawVirtObj = (*aFoundVirtObjIter);
912 : : }
913 : : else
914 : : {
915 : : // create new 'virtual' drawing object.
916 [ # # ]: 0 : pAddedDrawVirtObj = CreateVirtObj();
917 : : }
918 [ # # ]: 0 : pAddedDrawVirtObj->AddToDrawingPage();
919 : :
920 : 0 : return pAddedDrawVirtObj;
921 : : }
922 : :
923 : : // remove 'virtual' drawing objects and destroy them.
924 : 682 : void SwDrawContact::RemoveAllVirtObjs()
925 : : {
926 [ - + ]: 1364 : for ( std::list<SwDrawVirtObj*>::iterator aDrawVirtObjsIter = maDrawVirtObjs.begin();
927 : 682 : aDrawVirtObjsIter != maDrawVirtObjs.end();
928 : : ++aDrawVirtObjsIter )
929 : : {
930 : : // remove and destroy 'virtual object'
931 : 0 : SwDrawVirtObj* pDrawVirtObj = (*aDrawVirtObjsIter);
932 [ # # ]: 0 : pDrawVirtObj->RemoveFromWriterLayout();
933 [ # # ]: 0 : pDrawVirtObj->RemoveFromDrawingPage();
934 [ # # ]: 0 : DestroyVirtObj( pDrawVirtObj );
935 : : }
936 : 682 : maDrawVirtObjs.clear();
937 : 682 : }
938 : :
939 : 0 : SwDrawContact::VirtObjAnchoredAtFrmPred::VirtObjAnchoredAtFrmPred(
940 : : const SwFrm& _rAnchorFrm )
941 : 0 : : mpAnchorFrm( &_rAnchorFrm )
942 : : {
943 [ # # ]: 0 : if ( mpAnchorFrm->IsCntntFrm() )
944 : : {
945 : : const SwCntntFrm* pTmpFrm =
946 : 0 : static_cast<const SwCntntFrm*>( mpAnchorFrm );
947 [ # # ]: 0 : while ( pTmpFrm->IsFollow() )
948 : : {
949 : 0 : pTmpFrm = pTmpFrm->FindMaster();
950 : : }
951 : 0 : mpAnchorFrm = pTmpFrm;
952 : : }
953 : 0 : }
954 : :
955 : : // OD 2004-04-14 #i26791# - compare with master frame
956 : 0 : bool SwDrawContact::VirtObjAnchoredAtFrmPred::operator() ( const SwDrawVirtObj* _pDrawVirtObj )
957 : : {
958 : 0 : const SwFrm* pObjAnchorFrm = _pDrawVirtObj->GetAnchorFrm();
959 [ # # ][ # # ]: 0 : if ( pObjAnchorFrm && pObjAnchorFrm->IsCntntFrm() )
[ # # ]
960 : : {
961 : : const SwCntntFrm* pTmpFrm =
962 : 0 : static_cast<const SwCntntFrm*>( pObjAnchorFrm );
963 [ # # ]: 0 : while ( pTmpFrm->IsFollow() )
964 : : {
965 : 0 : pTmpFrm = pTmpFrm->FindMaster();
966 : : }
967 : 0 : pObjAnchorFrm = pTmpFrm;
968 : : }
969 : :
970 : 0 : return ( pObjAnchorFrm == mpAnchorFrm );
971 : : }
972 : :
973 : : // get drawing object ('master' or 'virtual') by frame.
974 : 2175 : SdrObject* SwDrawContact::GetDrawObjectByAnchorFrm( const SwFrm& _rAnchorFrm )
975 : : {
976 : 2175 : SdrObject* pRetDrawObj = 0L;
977 : :
978 : : // #i26791# - compare master frames instead of direct frames
979 : 2175 : const SwFrm* pProposedAnchorFrm = &_rAnchorFrm;
980 [ + - ]: 2175 : if ( pProposedAnchorFrm->IsCntntFrm() )
981 : : {
982 : : const SwCntntFrm* pTmpFrm =
983 : 2175 : static_cast<const SwCntntFrm*>( pProposedAnchorFrm );
984 [ + + ]: 2243 : while ( pTmpFrm->IsFollow() )
985 : : {
986 : 68 : pTmpFrm = pTmpFrm->FindMaster();
987 : : }
988 : 2175 : pProposedAnchorFrm = pTmpFrm;
989 : : }
990 : :
991 : 2175 : const SwFrm* pMasterObjAnchorFrm = GetAnchorFrm();
992 [ + - ][ + - ]: 2175 : if ( pMasterObjAnchorFrm && pMasterObjAnchorFrm->IsCntntFrm() )
[ + - ]
993 : : {
994 : : const SwCntntFrm* pTmpFrm =
995 : 2175 : static_cast<const SwCntntFrm*>( pMasterObjAnchorFrm );
996 [ + + ]: 2255 : while ( pTmpFrm->IsFollow() )
997 : : {
998 : 80 : pTmpFrm = pTmpFrm->FindMaster();
999 : : }
1000 : 2175 : pMasterObjAnchorFrm = pTmpFrm;
1001 : : }
1002 : :
1003 [ + - ][ + - ]: 2175 : if ( pMasterObjAnchorFrm && pMasterObjAnchorFrm == pProposedAnchorFrm )
1004 : : {
1005 : 2175 : pRetDrawObj = GetMaster();
1006 : : }
1007 : : else
1008 : : {
1009 : : std::list<SwDrawVirtObj*>::const_iterator aFoundVirtObjIter =
1010 : : std::find_if( maDrawVirtObjs.begin(), maDrawVirtObjs.end(),
1011 [ # # ][ # # ]: 0 : VirtObjAnchoredAtFrmPred( *pProposedAnchorFrm ) );
1012 : :
1013 [ # # ]: 0 : if ( aFoundVirtObjIter != maDrawVirtObjs.end() )
1014 : : {
1015 : 0 : pRetDrawObj = (*aFoundVirtObjIter);
1016 : : }
1017 : : }
1018 : :
1019 : 2175 : return pRetDrawObj;
1020 : : }
1021 : :
1022 : : /*************************************************************************
1023 : : |*
1024 : : |* SwDrawContact::Changed
1025 : : |*
1026 : : |*************************************************************************/
1027 : :
1028 : 856 : void SwDrawContact::NotifyBackgrdOfAllVirtObjs( const Rectangle* pOldBoundRect )
1029 : : {
1030 [ - + ]: 1712 : for ( std::list<SwDrawVirtObj*>::iterator aDrawVirtObjIter = maDrawVirtObjs.begin();
1031 : 856 : aDrawVirtObjIter != maDrawVirtObjs.end();
1032 : : ++aDrawVirtObjIter )
1033 : : {
1034 : 0 : SwDrawVirtObj* pDrawVirtObj = (*aDrawVirtObjIter);
1035 [ # # ][ # # ]: 0 : if ( pDrawVirtObj->GetAnchorFrm() )
1036 : : {
1037 : : // #i34640# - determine correct page frame
1038 [ # # ]: 0 : SwPageFrm* pPage = pDrawVirtObj->AnchoredObj()->FindPageFrmOfAnchor();
1039 [ # # ][ # # ]: 0 : if( pOldBoundRect && pPage )
1040 : : {
1041 [ # # ]: 0 : SwRect aOldRect( *pOldBoundRect );
1042 [ # # ]: 0 : aOldRect.Pos() += pDrawVirtObj->GetOffset();
1043 [ # # ][ # # ]: 0 : if( aOldRect.HasArea() )
1044 : : ::Notify_Background( pDrawVirtObj, pPage,
1045 [ # # ]: 0 : aOldRect, PREP_FLY_LEAVE,sal_True);
1046 : : }
1047 : : // #i34640# - include spacing for wrapping
1048 [ # # ]: 0 : SwRect aRect( pDrawVirtObj->GetAnchoredObj()->GetObjRectWithSpaces() );
1049 [ # # ][ # # ]: 0 : if( aRect.HasArea() )
1050 : : {
1051 [ # # ]: 0 : SwPageFrm* pPg = (SwPageFrm*)::FindPage( aRect, pPage );
1052 [ # # ]: 0 : if ( pPg )
1053 : : ::Notify_Background( pDrawVirtObj, pPg, aRect,
1054 [ # # ]: 0 : PREP_FLY_ARRIVE, sal_True );
1055 : : }
1056 [ # # ]: 0 : ::ClrContourCache( pDrawVirtObj );
1057 : : }
1058 : : }
1059 : 856 : }
1060 : :
1061 : : // OD 2004-04-08 #i26791# - local method to notify the background for a drawing object
1062 : 910 : void lcl_NotifyBackgroundOfObj( SwDrawContact& _rDrawContact,
1063 : : const SdrObject& _rObj,
1064 : : const Rectangle* _pOldObjRect )
1065 : : {
1066 : : // #i34640#
1067 : : SwAnchoredObject* pAnchoredObj =
1068 : 910 : const_cast<SwAnchoredObject*>(_rDrawContact.GetAnchoredObj( &_rObj ));
1069 [ + + ][ + + ]: 910 : if ( pAnchoredObj && pAnchoredObj->GetAnchorFrm() )
[ + - ]
1070 : : {
1071 : : // #i34640# - determine correct page frame
1072 [ + - ]: 674 : SwPageFrm* pPageFrm = pAnchoredObj->FindPageFrmOfAnchor();
1073 [ + + ][ + + ]: 674 : if( _pOldObjRect && pPageFrm )
1074 : : {
1075 [ + - ]: 16 : SwRect aOldRect( *_pOldObjRect );
1076 [ + - ][ + - ]: 16 : if( aOldRect.HasArea() )
1077 : : {
1078 : : // #i34640# - determine correct page frame
1079 [ + - ]: 16 : SwPageFrm* pOldPageFrm = (SwPageFrm*)::FindPage( aOldRect, pPageFrm );
1080 : : ::Notify_Background( &_rObj, pOldPageFrm, aOldRect,
1081 [ + - ]: 16 : PREP_FLY_LEAVE, sal_True);
1082 : : }
1083 : : }
1084 : : // #i34640# - include spacing for wrapping
1085 [ + - ]: 674 : SwRect aNewRect( pAnchoredObj->GetObjRectWithSpaces() );
1086 [ + - ][ + + ]: 674 : if( aNewRect.HasArea() && pPageFrm )
[ + + ][ + - ]
1087 : : {
1088 [ + - ]: 140 : pPageFrm = (SwPageFrm*)::FindPage( aNewRect, pPageFrm );
1089 : : ::Notify_Background( &_rObj, pPageFrm, aNewRect,
1090 [ + - ]: 140 : PREP_FLY_ARRIVE, sal_True );
1091 : : }
1092 [ + - ]: 674 : ClrContourCache( &_rObj );
1093 : : }
1094 : 910 : }
1095 : :
1096 : 2455 : void SwDrawContact::Changed( const SdrObject& rObj,
1097 : : SdrUserCallType eType,
1098 : : const Rectangle& rOldBoundRect )
1099 : : {
1100 : : // OD 2004-06-01 #i26791# - no event handling, if existing <ViewShell>
1101 : : // is in contruction
1102 : 2455 : SwDoc* pDoc = GetFmt()->GetDoc();
1103 [ + + + + ]: 4429 : if ( pDoc->GetCurrentViewShell() &&
[ + + ][ + - ]
1104 [ + - ]: 1974 : pDoc->GetCurrentViewShell()->IsInConstructor() )
1105 : : {
1106 : : return;
1107 : : }
1108 : :
1109 : : // #i44339#
1110 : : // no event handling, if document is in destruction.
1111 : : // Exception: It's the SDRUSERCALL_DELETE event
1112 [ - + ][ # # ]: 2443 : if ( pDoc->IsInDtor() && eType != SDRUSERCALL_DELETE )
[ + - ]
1113 : : {
1114 : : return;
1115 : : }
1116 : :
1117 : : //Action aufsetzen, aber nicht wenn gerade irgendwo eine Action laeuft.
1118 : 2443 : ViewShell *pSh = 0, *pOrg;
1119 [ + - ]: 2443 : SwRootFrm *pTmpRoot = pDoc->GetCurrentLayout();//swmod 080317
1120 [ + + ][ + - ]: 2443 : if ( pTmpRoot && pTmpRoot->IsCallbackActionEnabled() )
[ + + ]
1121 : : {
1122 [ + - ]: 1962 : pDoc->GetEditShell( &pOrg );
1123 : 1962 : pSh = pOrg;
1124 [ + - ]: 1962 : if ( pSh )
1125 [ + + ][ - + ]: 1962 : do
[ - + ]
1126 [ + + ][ - + ]: 1962 : { if ( pSh->Imp()->IsAction() || pSh->Imp()->IsIdleAction() )
[ + + ]
1127 : 1902 : pSh = 0;
1128 : : else
1129 : 60 : pSh = (ViewShell*)pSh->GetNext();
1130 : :
1131 : : } while ( pSh && pSh != pOrg );
1132 : :
1133 [ + + ]: 1962 : if ( pSh )
1134 [ + - ]: 60 : pTmpRoot->StartAllAction();
1135 : : }
1136 [ + - ]: 2443 : SdrObjUserCall::Changed( rObj, eType, rOldBoundRect );
1137 [ + - ]: 2443 : _Changed( rObj, eType, &rOldBoundRect ); //Achtung, ggf. Suizid!
1138 : :
1139 [ + + ]: 2443 : if ( pSh )
1140 [ + - ]: 2455 : pTmpRoot->EndAllAction();
1141 : : }
1142 : :
1143 : : // helper class for method <SwDrawContact::_Changed(..)> for handling nested
1144 : : // <SdrObjUserCall> events
1145 : : class NestedUserCallHdl
1146 : : {
1147 : : private:
1148 : : SwDrawContact* mpDrawContact;
1149 : : bool mbParentUserCallActive;
1150 : : SdrUserCallType meParentUserCallEventType;
1151 : :
1152 : : public:
1153 : 2443 : NestedUserCallHdl( SwDrawContact* _pDrawContact,
1154 : : SdrUserCallType _eEventType )
1155 : : : mpDrawContact( _pDrawContact ),
1156 : : mbParentUserCallActive( _pDrawContact->mbUserCallActive ),
1157 : 2443 : meParentUserCallEventType( _pDrawContact->meEventTypeOfCurrentUserCall )
1158 : : {
1159 : 2443 : mpDrawContact->mbUserCallActive = true;
1160 : 2443 : mpDrawContact->meEventTypeOfCurrentUserCall = _eEventType;
1161 : 2443 : }
1162 : :
1163 : 2443 : ~NestedUserCallHdl()
1164 : : {
1165 [ + - ]: 2443 : if ( mpDrawContact )
1166 : : {
1167 : 2443 : mpDrawContact->mbUserCallActive = mbParentUserCallActive;
1168 : 2443 : mpDrawContact->meEventTypeOfCurrentUserCall = meParentUserCallEventType;
1169 : : }
1170 : 2443 : }
1171 : :
1172 : 0 : void DrawContactDeleted()
1173 : : {
1174 : 0 : mpDrawContact = 0;
1175 : 0 : }
1176 : :
1177 : 2443 : bool IsNestedUserCall() const
1178 : : {
1179 : 2443 : return mbParentUserCallActive;
1180 : : }
1181 : :
1182 : 0 : void AssertNestedUserCall()
1183 : : {
1184 [ # # ]: 0 : if ( IsNestedUserCall() )
1185 : : {
1186 : 0 : bool bTmpAssert( true );
1187 : : // Currently its known, that a nested event SDRUSERCALL_RESIZE
1188 : : // could occur during parent user call SDRUSERCALL_INSERTED,
1189 : : // SDRUSERCALL_DELETE and SDRUSERCALL_RESIZE for edge objects.
1190 : : // Also possible are nested SDRUSERCALL_CHILD_RESIZE events for
1191 : : // edge objects
1192 : : // Thus, assert all other combinations
1193 [ # # ][ # # ]: 0 : if ( ( meParentUserCallEventType == SDRUSERCALL_INSERTED ||
[ # # ][ # # ]
1194 : : meParentUserCallEventType == SDRUSERCALL_DELETE ||
1195 : : meParentUserCallEventType == SDRUSERCALL_RESIZE ) &&
1196 : : mpDrawContact->meEventTypeOfCurrentUserCall == SDRUSERCALL_RESIZE )
1197 : : {
1198 : 0 : bTmpAssert = false;
1199 : : }
1200 [ # # ][ # # ]: 0 : else if ( meParentUserCallEventType == SDRUSERCALL_CHILD_RESIZE &&
1201 : : mpDrawContact->meEventTypeOfCurrentUserCall == SDRUSERCALL_CHILD_RESIZE )
1202 : : {
1203 : 0 : bTmpAssert = false;
1204 : : }
1205 : :
1206 : : if ( bTmpAssert )
1207 : : {
1208 : : OSL_FAIL( "<SwDrawContact::_Changed(..)> - unknown nested <UserCall> event. This is serious, please inform OD." );
1209 : : }
1210 : : }
1211 : 0 : }
1212 : : };
1213 : :
1214 : : //
1215 : : // !!!ACHTUNG!!! The object may commit suicide!!!
1216 : : //
1217 : 2443 : void SwDrawContact::_Changed( const SdrObject& rObj,
1218 : : SdrUserCallType eType,
1219 : : const Rectangle* pOldBoundRect )
1220 : : {
1221 : : // suppress handling of nested <SdrObjUserCall> events
1222 : 2443 : NestedUserCallHdl aNestedUserCallHdl( this, eType );
1223 [ - + ]: 2443 : if ( aNestedUserCallHdl.IsNestedUserCall() )
1224 : : {
1225 : 0 : aNestedUserCallHdl.AssertNestedUserCall();
1226 : 2443 : return;
1227 : : }
1228 : : // do *not* notify, if document is destructing
1229 : : // #i35912# - do *not* notify for as-character anchored
1230 : : // drawing objects.
1231 : : // #i35007#
1232 : : // improvement: determine as-character anchored object flag only once.
1233 [ + - ]: 2443 : const bool bAnchoredAsChar = ObjAnchoredAsChar();
1234 : 2443 : const bool bNotify = !(GetFmt()->GetDoc()->IsInDtor()) &&
1235 [ + - ]: 2443 : ( SURROUND_THROUGHT != GetFmt()->GetSurround().GetSurround() ) &&
1236 [ + + ]: 4886 : !bAnchoredAsChar;
[ + - + + ]
1237 [ - - - + : 2443 : switch( eType )
+ + - ]
1238 : : {
1239 : : case SDRUSERCALL_DELETE:
1240 : : {
1241 [ # # ]: 0 : if ( bNotify )
1242 : : {
1243 [ # # ]: 0 : lcl_NotifyBackgroundOfObj( *this, rObj, pOldBoundRect );
1244 : : // --> #i36181# - background of 'virtual'
1245 : : // drawing objects have also been notified.
1246 [ # # ]: 0 : NotifyBackgrdOfAllVirtObjs( pOldBoundRect );
1247 : : }
1248 [ # # ]: 0 : DisconnectFromLayout( false );
1249 [ # # ]: 0 : SetMaster( NULL );
1250 [ # # ][ # # ]: 0 : delete this;
1251 : : // --> #i65784# Prevent memory corruption
1252 : 0 : aNestedUserCallHdl.DrawContactDeleted();
1253 : 0 : break;
1254 : : }
1255 : : case SDRUSERCALL_INSERTED:
1256 : : {
1257 [ # # ]: 0 : if ( mbDisconnectInProgress )
1258 : : {
1259 : : OSL_FAIL( "<SwDrawContact::_Changed(..)> - Insert event during disconnection from layout is invalid." );
1260 : : }
1261 : : else
1262 : : {
1263 [ # # ]: 0 : ConnectToLayout();
1264 [ # # ]: 0 : if ( bNotify )
1265 : : {
1266 [ # # ]: 0 : lcl_NotifyBackgroundOfObj( *this, rObj, pOldBoundRect );
1267 : : }
1268 : : }
1269 : 0 : break;
1270 : : }
1271 : : case SDRUSERCALL_REMOVED:
1272 : : {
1273 [ # # ]: 0 : if ( bNotify )
1274 : : {
1275 [ # # ]: 0 : lcl_NotifyBackgroundOfObj( *this, rObj, pOldBoundRect );
1276 : : }
1277 [ # # ]: 0 : DisconnectFromLayout( false );
1278 : 0 : break;
1279 : : }
1280 : : case SDRUSERCALL_CHILD_INSERTED :
1281 : : case SDRUSERCALL_CHILD_REMOVED :
1282 : : {
1283 : : // --> #i113730#
1284 : : // force layer of controls for group objects containing control objects
1285 [ + - ][ + - ]: 12 : if(dynamic_cast< SdrObjGroup* >(maAnchoredDrawObj.DrawObj()))
[ + - ][ + - ]
1286 : : {
1287 [ + - ][ + - ]: 12 : if(::CheckControlLayer(maAnchoredDrawObj.DrawObj()))
[ - + ]
1288 : : {
1289 [ # # ]: 0 : const IDocumentDrawModelAccess* pIDDMA = static_cast<SwFrmFmt*>(GetRegisteredInNonConst())->getIDocumentDrawModelAccess();
1290 [ # # ][ # # ]: 0 : const SdrLayerID aCurrentLayer(maAnchoredDrawObj.DrawObj()->GetLayer());
1291 [ # # ]: 0 : const SdrLayerID aControlLayerID(pIDDMA->GetControlsId());
1292 [ # # ]: 0 : const SdrLayerID aInvisibleControlLayerID(pIDDMA->GetInvisibleControlsId());
1293 : :
1294 [ # # ][ # # ]: 0 : if(aCurrentLayer != aControlLayerID && aCurrentLayer != aInvisibleControlLayerID)
1295 : : {
1296 [ # # ][ # # ]: 0 : if ( aCurrentLayer == pIDDMA->GetInvisibleHellId() ||
[ # # ][ # # ]
1297 [ # # ]: 0 : aCurrentLayer == pIDDMA->GetInvisibleHeavenId() )
1298 : : {
1299 [ # # ][ # # ]: 0 : maAnchoredDrawObj.DrawObj()->SetLayer(aInvisibleControlLayerID);
1300 : : }
1301 : : else
1302 : : {
1303 [ # # ][ # # ]: 0 : maAnchoredDrawObj.DrawObj()->SetLayer(aControlLayerID);
1304 : : }
1305 : : }
1306 : : }
1307 : : }
1308 : : // fallthrough intended here
1309 : : }
1310 : : case SDRUSERCALL_MOVEONLY:
1311 : : case SDRUSERCALL_RESIZE:
1312 : : case SDRUSERCALL_CHILD_MOVEONLY :
1313 : : case SDRUSERCALL_CHILD_RESIZE :
1314 : : case SDRUSERCALL_CHILD_CHGATTR :
1315 : : case SDRUSERCALL_CHILD_DELETE :
1316 : : case SDRUSERCALL_CHILD_COPY :
1317 : : {
1318 : : // #i31698# - improvement
1319 : : // get instance <SwAnchoredDrawObject> only once
1320 : : const SwAnchoredDrawObject* pAnchoredDrawObj =
1321 [ + - ]: 2380 : static_cast<const SwAnchoredDrawObject*>( GetAnchoredObj( &rObj ) );
1322 : :
1323 : : /* protect against NULL pointer dereferencing */
1324 [ - + ]: 2380 : if(!pAnchoredDrawObj)
1325 : : {
1326 : 0 : break;
1327 : : }
1328 : :
1329 : : // OD 2004-04-06 #i26791# - adjust positioning and alignment attributes,
1330 : : // if positioning of drawing object isn't in progress.
1331 : : // #i53320# - no adjust of positioning attributes,
1332 : : // if drawing object isn't positioned.
1333 [ + + - + ]: 2798 : if ( !pAnchoredDrawObj->IsPositioningInProgress() &&
[ - + ]
1334 : 418 : !pAnchoredDrawObj->NotYetPositioned() )
1335 : : {
1336 : : // #i34748# - If no last object rectangle is
1337 : : // provided by the anchored object, use parameter <pOldBoundRect>.
1338 [ # # ]: 0 : const Rectangle& aOldObjRect = pAnchoredDrawObj->GetLastObjRect()
1339 : : ? *(pAnchoredDrawObj->GetLastObjRect())
1340 [ # # ][ # # ]: 0 : : *(pOldBoundRect);
1341 : : // #i79400#
1342 : : // always invalidate object rectangle inclusive spaces
1343 : 0 : pAnchoredDrawObj->InvalidateObjRectWithSpaces();
1344 : : // #i41324# - notify background before
1345 : : // adjusting position
1346 [ # # ]: 0 : if ( bNotify )
1347 : : {
1348 : : // #i31573# - correction
1349 : : // background of given drawing object.
1350 [ # # ]: 0 : lcl_NotifyBackgroundOfObj( *this, rObj, &aOldObjRect );
1351 : : }
1352 : : // #i31698# - determine layout direction
1353 : : // via draw frame format.
1354 : : SwFrmFmt::tLayoutDir eLayoutDir =
1355 [ # # ][ # # ]: 0 : pAnchoredDrawObj->GetFrmFmt().GetLayoutDir();
1356 : : // use geometry of drawing object
1357 [ # # ][ # # ]: 0 : SwRect aObjRect( rObj.GetSnapRect() );
1358 : : // If drawing object is a member of a group, the adjustment
1359 : : // of the positioning and the alignment attributes has to
1360 : : // be done for the top group object.
1361 [ # # ][ # # ]: 0 : if ( rObj.GetUpGroup() )
1362 : : {
1363 [ # # ]: 0 : const SdrObject* pGroupObj = rObj.GetUpGroup();
1364 [ # # ][ # # ]: 0 : while ( pGroupObj->GetUpGroup() )
1365 : : {
1366 [ # # ]: 0 : pGroupObj = pGroupObj->GetUpGroup();
1367 : : }
1368 : : // use geometry of drawing object
1369 [ # # ][ # # ]: 0 : aObjRect = pGroupObj->GetSnapRect();
1370 : : }
1371 : 0 : SwTwips nXPosDiff(0L);
1372 : 0 : SwTwips nYPosDiff(0L);
1373 [ # # # # ]: 0 : switch ( eLayoutDir )
1374 : : {
1375 : : case SwFrmFmt::HORI_L2R:
1376 : : {
1377 : 0 : nXPosDiff = aObjRect.Left() - aOldObjRect.Left();
1378 : 0 : nYPosDiff = aObjRect.Top() - aOldObjRect.Top();
1379 : : }
1380 : 0 : break;
1381 : : case SwFrmFmt::HORI_R2L:
1382 : : {
1383 : 0 : nXPosDiff = aOldObjRect.Right() - aObjRect.Right();
1384 : 0 : nYPosDiff = aObjRect.Top() - aOldObjRect.Top();
1385 : : }
1386 : 0 : break;
1387 : : case SwFrmFmt::VERT_R2L:
1388 : : {
1389 : 0 : nXPosDiff = aObjRect.Top() - aOldObjRect.Top();
1390 : 0 : nYPosDiff = aOldObjRect.Right() - aObjRect.Right();
1391 : : }
1392 : 0 : break;
1393 : : default:
1394 : : {
1395 : : OSL_FAIL( "<SwDrawContact::_Changed(..)> - unsupported layout direction" );
1396 : : }
1397 : : }
1398 : 0 : SfxItemSet aSet( GetFmt()->GetDoc()->GetAttrPool(),
1399 [ # # ]: 0 : RES_VERT_ORIENT, RES_HORI_ORIENT, 0 );
1400 [ # # ]: 0 : const SwFmtVertOrient& rVert = GetFmt()->GetVertOrient();
1401 [ # # ]: 0 : if ( nYPosDiff != 0 )
1402 : : {
1403 : :
1404 [ # # # # ]: 0 : if ( rVert.GetRelationOrient() == text::RelOrientation::CHAR ||
[ # # ]
1405 : 0 : rVert.GetRelationOrient() == text::RelOrientation::TEXT_LINE )
1406 : : {
1407 : 0 : nYPosDiff = -nYPosDiff;
1408 : : }
1409 : 0 : aSet.Put( SwFmtVertOrient( rVert.GetPos()+nYPosDiff,
1410 : : text::VertOrientation::NONE,
1411 [ # # ][ # # ]: 0 : rVert.GetRelationOrient() ) );
[ # # ]
1412 : : }
1413 : :
1414 [ # # ]: 0 : const SwFmtHoriOrient& rHori = GetFmt()->GetHoriOrient();
1415 [ # # ][ # # ]: 0 : if ( !bAnchoredAsChar && nXPosDiff != 0 )
1416 : : {
1417 : 0 : aSet.Put( SwFmtHoriOrient( rHori.GetPos()+nXPosDiff,
1418 : : text::HoriOrientation::NONE,
1419 [ # # ][ # # ]: 0 : rHori.GetRelationOrient() ) );
[ # # ]
1420 : : }
1421 : :
1422 [ # # ][ # # ]: 0 : if ( nYPosDiff ||
[ # # ]
1423 : 0 : ( !bAnchoredAsChar && nXPosDiff != 0 ) )
1424 : : {
1425 [ # # ]: 0 : GetFmt()->GetDoc()->SetFlyFrmAttr( *(GetFmt()), aSet );
1426 : : // keep new object rectangle, to avoid multiple
1427 : : // changes of the attributes by multiple event from
1428 : : // the drawing layer - e.g. group objects and its members
1429 : : // #i34748# - use new method
1430 : : // <SwAnchoredDrawObject::SetLastObjRect(..)>.
1431 : : const_cast<SwAnchoredDrawObject*>(pAnchoredDrawObj)
1432 [ # # ][ # # ]: 0 : ->SetLastObjRect( aObjRect.SVRect() );
1433 : : }
1434 [ # # ][ # # ]: 0 : else if ( aObjRect.SSize() != aOldObjRect.GetSize() )
1435 : : {
1436 [ # # ]: 0 : _InvalidateObjs();
1437 : : // #i35007# - notify anchor frame
1438 : : // of as-character anchored object
1439 [ # # ]: 0 : if ( bAnchoredAsChar )
1440 : : {
1441 [ # # ]: 0 : SwFrm* pAnchorFrm = const_cast<SwAnchoredDrawObject*>(pAnchoredDrawObj)->AnchorFrm();
1442 [ # # ]: 0 : if(pAnchorFrm)
1443 : : {
1444 [ # # ]: 0 : pAnchorFrm->Prepare( PREP_FLY_ATTR_CHG, GetFmt() );
1445 : : }
1446 : : }
1447 [ # # ]: 0 : }
1448 : : }
1449 : : }
1450 : 2380 : break;
1451 : : case SDRUSERCALL_CHGATTR:
1452 [ + + ]: 63 : if ( bNotify )
1453 : : {
1454 [ + - ]: 54 : lcl_NotifyBackgroundOfObj( *this, rObj, pOldBoundRect );
1455 : : }
1456 : 63 : break;
1457 : : default:
1458 : 2443 : break;
1459 [ + - ]: 2443 : }
1460 : : }
1461 : :
1462 : : namespace
1463 : : {
1464 : 816 : static const SwFmtAnchor* lcl_getAnchorFmt( const SfxPoolItem& _rItem )
1465 : : {
1466 : 816 : sal_uInt16 nWhich = _rItem.Which();
1467 : 816 : const SwFmtAnchor* pAnchorFmt = NULL;
1468 [ + + ]: 816 : if ( RES_ATTRSET_CHG == nWhich )
1469 : : {
1470 : 814 : static_cast<const SwAttrSetChg&>(_rItem).GetChgSet()->
1471 [ + - ]: 814 : GetItemState( RES_ANCHOR, sal_False, (const SfxPoolItem**)&pAnchorFmt );
1472 : : }
1473 [ - + ]: 2 : else if ( RES_ANCHOR == nWhich )
1474 : : {
1475 : 0 : pAnchorFmt = &static_cast<const SwFmtAnchor&>(_rItem);
1476 : : }
1477 : 816 : return pAnchorFmt;
1478 : : }
1479 : : }
1480 : :
1481 : : /*************************************************************************
1482 : : |*
1483 : : |* SwDrawContact::Modify()
1484 : : |*
1485 : : |*************************************************************************/
1486 : :
1487 : 634 : void SwDrawContact::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew )
1488 : : {
1489 : : OSL_ENSURE( !mbDisconnectInProgress,
1490 : : "<SwDrawContact::Modify(..)> called during disconnection.");
1491 : :
1492 [ + - ]: 634 : sal_uInt16 nWhich = pNew ? pNew->Which() : 0;
1493 [ + - ]: 634 : const SwFmtAnchor* pNewAnchorFmt = pNew ? lcl_getAnchorFmt( *pNew ) : NULL;
1494 : :
1495 [ + + ]: 634 : if ( pNewAnchorFmt )
1496 : : {
1497 : : // nicht auf ein Reset Anchor reagieren !!!!!
1498 [ + + ]: 184 : if ( SFX_ITEM_SET ==
1499 : 184 : GetFmt()->GetAttrSet().GetItemState( RES_ANCHOR, sal_False ) )
1500 : : {
1501 : : // no connect to layout during disconnection
1502 [ + - ]: 182 : if ( !mbDisconnectInProgress )
1503 : : {
1504 : : // determine old object retangle of 'master' drawing object
1505 : : // for notification
1506 : 182 : const Rectangle* pOldRect = 0L;
1507 [ + - ]: 182 : Rectangle aOldRect;
1508 [ + - ][ - + ]: 182 : if ( GetAnchorFrm() )
1509 : : {
1510 : : // --> #i36181# - include spacing in object
1511 : : // rectangle for notification.
1512 [ # # ][ # # ]: 0 : aOldRect = maAnchoredDrawObj.GetObjRectWithSpaces().SVRect();
1513 : 0 : pOldRect = &aOldRect;
1514 : : }
1515 : : // re-connect to layout due to anchor format change
1516 [ + - ]: 182 : ConnectToLayout( pNewAnchorFmt );
1517 : : // notify background of drawing objects
1518 [ + - ][ + - ]: 182 : lcl_NotifyBackgroundOfObj( *this, *GetMaster(), pOldRect );
1519 [ + - ]: 182 : NotifyBackgrdOfAllVirtObjs( pOldRect );
1520 : :
1521 [ + - ][ + - ]: 182 : const SwFmtAnchor* pOldAnchorFmt = pOld ? lcl_getAnchorFmt( *pOld ) : NULL;
1522 [ + - ][ + + ]: 182 : if ( !pOldAnchorFmt || ( pOldAnchorFmt->GetAnchorId() != pNewAnchorFmt->GetAnchorId() ) )
[ + + ]
1523 : : {
1524 : : OSL_ENSURE( maAnchoredDrawObj.DrawObj(), "SwDrawContact::Modify: no draw object here?" );
1525 [ + - ][ + - ]: 72 : if ( maAnchoredDrawObj.DrawObj() )
1526 : : {
1527 : : // --> #i102752#
1528 : : // assure that a ShapePropertyChangeNotifier exists
1529 [ + - ][ + - ]: 182 : maAnchoredDrawObj.DrawObj()->notifyShapePropertyChange( ::svx::eTextShapeAnchorType );
1530 : : }
1531 : : }
1532 : : }
1533 : : }
1534 : : else
1535 : 2 : DisconnectFromLayout();
1536 : : }
1537 : : // --> #i62875# - no further notification, if not connected to Writer layout
1538 [ + + + - ]: 574 : else if ( maAnchoredDrawObj.GetAnchorFrm() &&
[ + + ]
1539 : 124 : maAnchoredDrawObj.GetDrawObj()->GetUserCall() )
1540 : : {
1541 : : // --> #i28701# - on change of wrapping style, hell|heaven layer,
1542 : : // or wrapping style influence an update of the <SwSortedObjs> list,
1543 : : // the drawing object is registered in, has to be performed. This is triggered
1544 : : // by the 1st parameter of method call <_InvalidateObjs(..)>.
1545 [ + - ][ + - ]: 496 : if ( RES_SURROUND == nWhich ||
[ + - ][ + -
+ - + - -
+ ][ - + ]
1546 : : RES_OPAQUE == nWhich ||
1547 : : RES_WRAP_INFLUENCE_ON_OBJPOS == nWhich ||
1548 : : ( RES_ATTRSET_CHG == nWhich &&
1549 : 124 : ( SFX_ITEM_SET == ((SwAttrSetChg*)pNew)->GetChgSet()->GetItemState(
1550 : 124 : RES_SURROUND, sal_False ) ||
1551 : 124 : SFX_ITEM_SET == ((SwAttrSetChg*)pNew)->GetChgSet()->GetItemState(
1552 : 124 : RES_OPAQUE, sal_False ) ||
1553 : 124 : SFX_ITEM_SET == ((SwAttrSetChg*)pNew)->GetChgSet()->GetItemState(
1554 : 124 : RES_WRAP_INFLUENCE_ON_OBJPOS, sal_False ) ) ) )
1555 : : {
1556 : 0 : lcl_NotifyBackgroundOfObj( *this, *GetMaster(), 0L );
1557 : 0 : NotifyBackgrdOfAllVirtObjs( 0L );
1558 : 0 : _InvalidateObjs( true );
1559 : : }
1560 [ + - ][ + - ]: 558 : else if ( RES_UL_SPACE == nWhich || RES_LR_SPACE == nWhich ||
[ + - ][ + - ]
[ + - ][ + -
+ - + - +
+ - + #
# ][ + - ]
1561 : : RES_HORI_ORIENT == nWhich || RES_VERT_ORIENT == nWhich ||
1562 : : // #i28701# - add attribute 'Follow text flow'
1563 : : RES_FOLLOW_TEXT_FLOW == nWhich ||
1564 : : ( RES_ATTRSET_CHG == nWhich &&
1565 : 124 : ( SFX_ITEM_SET == ((SwAttrSetChg*)pNew)->GetChgSet()->GetItemState(
1566 : 124 : RES_LR_SPACE, sal_False ) ||
1567 : 124 : SFX_ITEM_SET == ((SwAttrSetChg*)pNew)->GetChgSet()->GetItemState(
1568 : 124 : RES_UL_SPACE, sal_False ) ||
1569 : 124 : SFX_ITEM_SET == ((SwAttrSetChg*)pNew)->GetChgSet()->GetItemState(
1570 : 124 : RES_HORI_ORIENT, sal_False ) ||
1571 : 62 : SFX_ITEM_SET == ((SwAttrSetChg*)pNew)->GetChgSet()->GetItemState(
1572 : 62 : RES_VERT_ORIENT, sal_False ) ||
1573 : 0 : SFX_ITEM_SET == ((SwAttrSetChg*)pNew)->GetChgSet()->GetItemState(
1574 : 0 : RES_FOLLOW_TEXT_FLOW, sal_False ) ) ) )
1575 : : {
1576 : 124 : lcl_NotifyBackgroundOfObj( *this, *GetMaster(), 0L );
1577 : 124 : NotifyBackgrdOfAllVirtObjs( 0L );
1578 : 124 : _InvalidateObjs();
1579 : : }
1580 : : // #i35443#
1581 [ # # ]: 0 : else if ( RES_ATTRSET_CHG == nWhich )
1582 : : {
1583 : 0 : lcl_NotifyBackgroundOfObj( *this, *GetMaster(), 0L );
1584 : 0 : NotifyBackgrdOfAllVirtObjs( 0L );
1585 : 0 : _InvalidateObjs();
1586 : : }
1587 : : else if ( RES_REMOVE_UNO_OBJECT == nWhich )
1588 : : {
1589 : : // nothing to do
1590 : : }
1591 : : #if OSL_DEBUG_LEVEL > 0
1592 : : else
1593 : : {
1594 : : OSL_FAIL( "<SwDrawContact::Modify(..)> - unhandled attribute? - please inform od@openoffice.org" );
1595 : : }
1596 : : #endif
1597 : : }
1598 : :
1599 : : // #i51474#
1600 : 634 : GetAnchoredObj( 0L )->ResetLayoutProcessBools();
1601 : 634 : }
1602 : :
1603 : : // OD 2004-03-31 #i26791#
1604 : : // #i28701# - added parameter <_bUpdateSortedObjsList>
1605 : 612 : void SwDrawContact::_InvalidateObjs( const bool _bUpdateSortedObjsList )
1606 : : {
1607 : : // invalidate position of existing 'virtual' drawing objects
1608 [ - + ]: 1224 : for ( std::list<SwDrawVirtObj*>::iterator aDisconnectIter = maDrawVirtObjs.begin();
1609 : 612 : aDisconnectIter != maDrawVirtObjs.end();
1610 : : ++aDisconnectIter )
1611 : : {
1612 : 0 : SwDrawVirtObj* pDrawVirtObj = (*aDisconnectIter);
1613 : : // #i33313# - invalidation only for connected
1614 : : // 'virtual' drawing objects
1615 [ # # ][ # # ]: 0 : if ( pDrawVirtObj->IsConnected() )
1616 : : {
1617 [ # # ]: 0 : pDrawVirtObj->AnchoredObj()->InvalidateObjPos();
1618 : : // #i28701#
1619 [ # # ]: 0 : if ( _bUpdateSortedObjsList )
1620 : : {
1621 [ # # ]: 0 : pDrawVirtObj->AnchoredObj()->UpdateObjInSortedList();
1622 : : }
1623 : : }
1624 : : }
1625 : :
1626 : : // invalidate position of 'master' drawing object
1627 : 612 : SwAnchoredObject* pAnchoredObj = GetAnchoredObj( 0L );
1628 : 612 : pAnchoredObj->InvalidateObjPos();
1629 : : // #i28701#
1630 [ - + ]: 612 : if ( _bUpdateSortedObjsList )
1631 : : {
1632 : 0 : pAnchoredObj->UpdateObjInSortedList();
1633 : : }
1634 : 612 : }
1635 : :
1636 : : /*************************************************************************
1637 : : |*
1638 : : |* SwDrawContact::DisconnectFromLayout()
1639 : : |*
1640 : : |*************************************************************************/
1641 : :
1642 : 2288 : void SwDrawContact::DisconnectFromLayout( bool _bMoveMasterToInvisibleLayer )
1643 : : {
1644 : 2288 : mbDisconnectInProgress = true;
1645 : :
1646 : : // --> #i36181# - notify background of drawing object
1647 [ + + + + : 4735 : if ( _bMoveMasterToInvisibleLayer &&
+ + ][ + + ]
1648 : 1800 : !(GetFmt()->GetDoc()->IsInDtor()) &&
1649 : 647 : GetAnchorFrm() )
1650 : : {
1651 [ + - ][ + - ]: 550 : const Rectangle aOldRect( maAnchoredDrawObj.GetObjRectWithSpaces().SVRect() );
1652 [ + - ][ + - ]: 550 : lcl_NotifyBackgroundOfObj( *this, *GetMaster(), &aOldRect );
1653 [ + - ]: 550 : NotifyBackgrdOfAllVirtObjs( &aOldRect );
1654 : : }
1655 : :
1656 : : // remove 'virtual' drawing objects from writer
1657 : : // layout and from drawing page
1658 [ - + ]: 4576 : for ( std::list<SwDrawVirtObj*>::iterator aDisconnectIter = maDrawVirtObjs.begin();
1659 : 2288 : aDisconnectIter != maDrawVirtObjs.end();
1660 : : ++aDisconnectIter )
1661 : : {
1662 : 0 : SwDrawVirtObj* pDrawVirtObj = (*aDisconnectIter);
1663 [ # # ]: 0 : pDrawVirtObj->RemoveFromWriterLayout();
1664 [ # # ]: 0 : pDrawVirtObj->RemoveFromDrawingPage();
1665 : : }
1666 : :
1667 [ + + ]: 2288 : if ( maAnchoredDrawObj.GetAnchorFrm() )
1668 : : {
1669 : 553 : maAnchoredDrawObj.AnchorFrm()->RemoveDrawObj( maAnchoredDrawObj );
1670 : : }
1671 : :
1672 [ + + ][ + - ]: 2288 : if ( _bMoveMasterToInvisibleLayer && GetMaster() && GetMaster()->IsInserted() )
[ + + ][ + + ]
1673 : : {
1674 [ + - ][ + - ]: 1796 : SdrViewIter aIter( GetMaster() );
1675 [ + - ][ + - ]: 1798 : for( SdrView* pView = aIter.FirstView(); pView;
[ + + ]
1676 : : pView = aIter.NextView() )
1677 : : {
1678 [ + - ][ + - ]: 2 : pView->MarkObj( GetMaster(), pView->GetSdrPageView(), sal_True );
1679 : : }
1680 : :
1681 : : // Instead of removing 'master' object from drawing page, move the
1682 : : // 'master' drawing object into the corresponding invisible layer.
1683 : : {
1684 : : //((SwFrmFmt*)GetRegisteredIn())->getIDocumentDrawModelAccess()->GetDrawModel()->GetPage(0)->
1685 : : // RemoveObject( GetMaster()->GetOrdNum() );
1686 : : // #i18447# - in order to consider group object correct
1687 : : // use new method <SwDrawContact::MoveObjToInvisibleLayer(..)>
1688 [ + - ][ + - ]: 1796 : MoveObjToInvisibleLayer( GetMaster() );
1689 : : }
1690 : : }
1691 : :
1692 : 2288 : mbDisconnectInProgress = false;
1693 : 2288 : }
1694 : :
1695 : : // method to remove 'master' drawing object from drawing page.
1696 : 684 : void SwDrawContact::RemoveMasterFromDrawPage()
1697 : : {
1698 [ + - ]: 684 : if ( GetMaster() )
1699 : : {
1700 : 684 : GetMaster()->SetUserCall( 0 );
1701 [ + + ]: 684 : if ( GetMaster()->IsInserted() )
1702 : : {
1703 : 682 : ((SwFrmFmt*)GetRegisteredIn())->getIDocumentDrawModelAccess()->GetDrawModel()->GetPage(0)->
1704 : 682 : RemoveObject( GetMaster()->GetOrdNum() );
1705 : : }
1706 : : }
1707 : 684 : }
1708 : :
1709 : : // disconnect for a dedicated drawing object - could be 'master' or 'virtual'.
1710 : : // a 'master' drawing object will disconnect a 'virtual' drawing object
1711 : : // in order to take its place.
1712 : : // #i19919# - no special case, if drawing object isn't in
1713 : : // page header/footer, in order to get drawing objects in repeating table headers
1714 : : // also working.
1715 : 548 : void SwDrawContact::DisconnectObjFromLayout( SdrObject* _pDrawObj )
1716 : : {
1717 [ - + ]: 548 : if ( _pDrawObj->ISA(SwDrawVirtObj) )
1718 : : {
1719 : 0 : SwDrawVirtObj* pDrawVirtObj = static_cast<SwDrawVirtObj*>(_pDrawObj);
1720 : 0 : pDrawVirtObj->RemoveFromWriterLayout();
1721 : 0 : pDrawVirtObj->RemoveFromDrawingPage();
1722 : : }
1723 : : else
1724 : : {
1725 : : std::list<SwDrawVirtObj*>::const_iterator aFoundVirtObjIter =
1726 : : std::find_if( maDrawVirtObjs.begin(), maDrawVirtObjs.end(),
1727 [ + - ]: 548 : UsedOrUnusedVirtObjPred( true ) );
1728 [ - + ]: 548 : if ( aFoundVirtObjIter != maDrawVirtObjs.end() )
1729 : : {
1730 : : // replace found 'virtual' drawing object by 'master' drawing
1731 : : // object and disconnect the 'virtual' one
1732 : 0 : SwDrawVirtObj* pDrawVirtObj = (*aFoundVirtObjIter);
1733 [ # # ]: 0 : SwFrm* pNewAnchorFrmOfMaster = pDrawVirtObj->AnchorFrm();
1734 : : // disconnect 'virtual' drawing object
1735 [ # # ]: 0 : pDrawVirtObj->RemoveFromWriterLayout();
1736 [ # # ]: 0 : pDrawVirtObj->RemoveFromDrawingPage();
1737 : : // disconnect 'master' drawing object from current frame
1738 [ # # ][ # # ]: 0 : GetAnchorFrm()->RemoveDrawObj( maAnchoredDrawObj );
1739 : : // re-connect 'master' drawing object to frame of found 'virtual'
1740 : : // drawing object.
1741 [ # # ]: 0 : pNewAnchorFrmOfMaster->AppendDrawObj( maAnchoredDrawObj );
1742 : : }
1743 : : else
1744 : : {
1745 : : // no connected 'virtual' drawing object found. Thus, disconnect
1746 : : // completely from layout.
1747 [ + - ]: 548 : DisconnectFromLayout();
1748 : : }
1749 : : }
1750 : 548 : }
1751 : :
1752 : : /*************************************************************************
1753 : : |*
1754 : : |* SwDrawContact::ConnectToLayout()
1755 : : |*
1756 : : |*************************************************************************/
1757 : 470 : SwTxtFrm* lcl_GetFlyInCntntAnchor( SwTxtFrm* _pProposedAnchorFrm,
1758 : : const xub_StrLen _nTxtOfs )
1759 : : {
1760 : 470 : SwTxtFrm* pAct = _pProposedAnchorFrm;
1761 : : SwTxtFrm* pTmp;
1762 [ - + ]: 470 : do
[ - + # # ]
1763 : : {
1764 : 470 : pTmp = pAct;
1765 : 470 : pAct = pTmp->GetFollow();
1766 : : }
1767 : 0 : while( pAct && _nTxtOfs >= pAct->GetOfst() );
1768 : 470 : return pTmp;
1769 : : }
1770 : :
1771 : 673 : void SwDrawContact::ConnectToLayout( const SwFmtAnchor* pAnch )
1772 : : {
1773 : : // *no* connect to layout during disconnection from layout.
1774 [ - + ]: 673 : if ( mbDisconnectInProgress )
1775 : : {
1776 : : OSL_FAIL( "<SwDrawContact::ConnectToLayout(..)> called during disconnection.");
1777 : 0 : return;
1778 : : }
1779 : :
1780 : : // --> #i33909# - *no* connect to layout, if 'master' drawing
1781 : : // object isn't inserted in the drawing page
1782 [ - + ]: 673 : if ( !GetMaster()->IsInserted() )
1783 : : {
1784 : : OSL_FAIL( "<SwDrawContact::ConnectToLayout(..)> - master drawing object not inserted -> no connect to layout. Please inform od@openoffice.org" );
1785 : 0 : return;
1786 : : }
1787 : :
1788 : 673 : SwFrmFmt* pDrawFrmFmt = (SwFrmFmt*)GetRegisteredIn();
1789 : :
1790 [ + + ]: 673 : if( !pDrawFrmFmt->getIDocumentLayoutAccess()->GetCurrentViewShell() )
1791 : 185 : return;
1792 : :
1793 : : // remove 'virtual' drawing objects from writer
1794 : : // layout and from drawing page, and remove 'master' drawing object from
1795 : : // writer layout - 'master' object will remain in drawing page.
1796 : 488 : DisconnectFromLayout( false );
1797 : :
1798 [ + - ]: 488 : if ( !pAnch )
1799 : : {
1800 : 488 : pAnch = &(pDrawFrmFmt->GetAnchor());
1801 : : }
1802 : :
1803 [ - + - ]: 488 : switch ( pAnch->GetAnchorId() )
1804 : : {
1805 : : case FLY_AT_PAGE:
1806 : : {
1807 : 0 : sal_uInt16 nPgNum = pAnch->GetPageNum();
1808 : 0 : ViewShell *pShell = pDrawFrmFmt->getIDocumentLayoutAccess()->GetCurrentViewShell();
1809 [ # # ]: 0 : if( !pShell )
1810 : 0 : break;
1811 : 0 : SwRootFrm* pRoot = pShell->GetLayout();
1812 : 0 : SwPageFrm *pPage = static_cast<SwPageFrm*>(pRoot->Lower());
1813 : :
1814 [ # # ][ # # ]: 0 : for ( sal_uInt16 i = 1; i < nPgNum && pPage; ++i )
[ # # ]
1815 : : {
1816 : 0 : pPage = static_cast<SwPageFrm*>(pPage->GetNext());
1817 : : }
1818 : :
1819 [ # # ]: 0 : if ( pPage )
1820 : : {
1821 : 0 : pPage->AppendDrawObj( maAnchoredDrawObj );
1822 : : }
1823 : : else
1824 : : //Sieht doof aus, ist aber erlaubt (vlg. SwFEShell::SetPageObjsNewPage)
1825 : 0 : pRoot->SetAssertFlyPages();
1826 : : }
1827 : 0 : break;
1828 : :
1829 : : case FLY_AT_CHAR:
1830 : : case FLY_AT_PARA:
1831 : : case FLY_AT_FLY:
1832 : : case FLY_AS_CHAR:
1833 : : {
1834 [ + + ]: 488 : if ( pAnch->GetAnchorId() == FLY_AS_CHAR )
1835 : : {
1836 [ + - ][ + - ]: 470 : ClrContourCache( GetMaster() );
1837 : : }
1838 : : // support drawing objects in header/footer,
1839 : : // but not control objects:
1840 : : // anchor at first found frame the 'master' object and
1841 : : // at the following frames 'virtual' drawing objects.
1842 : : // Note: method is similar to <SwFlyFrmFmt::MakeFrms(..)>
1843 : 488 : SwModify *pModify = 0;
1844 [ + - ][ + - ]: 488 : if( pAnch->GetCntntAnchor() )
1845 : : {
1846 [ - + ]: 488 : if ( pAnch->GetAnchorId() == FLY_AT_FLY )
1847 : : {
1848 [ # # ][ # # ]: 0 : SwNodeIndex aIdx( pAnch->GetCntntAnchor()->nNode );
1849 [ # # ][ # # ]: 0 : SwCntntNode* pCNd = pDrawFrmFmt->GetDoc()->GetNodes().GoNext( &aIdx );
1850 [ # # ][ # # ]: 0 : if ( SwIterator<SwFrm,SwCntntNode>::FirstElement( *pCNd ) )
1851 : 0 : pModify = pCNd;
1852 : : else
1853 : : {
1854 [ # # ]: 0 : const SwNodeIndex& rIdx = pAnch->GetCntntAnchor()->nNode;
1855 : 0 : SwFrmFmts& rFmts = *(pDrawFrmFmt->GetDoc()->GetSpzFrmFmts());
1856 [ # # ]: 0 : for( sal_uInt16 i = 0; i < rFmts.size(); ++i )
1857 : : {
1858 [ # # ]: 0 : SwFrmFmt* pFlyFmt = rFmts[i];
1859 [ # # ]: 0 : if( pFlyFmt->GetCntnt().GetCntntIdx() &&
[ # # # # ]
[ # # ]
1860 [ # # ]: 0 : rIdx == *(pFlyFmt->GetCntnt().GetCntntIdx()) )
1861 : : {
1862 : 0 : pModify = pFlyFmt;
1863 : 0 : break;
1864 : : }
1865 : : }
1866 : : }
1867 : : // #i29199# - It is possible, that
1868 : : // the anchor doesn't exist - E.g., reordering the
1869 : : // sub-documents in a master document.
1870 : : // Note: The anchor will be inserted later.
1871 [ # # ]: 0 : if ( !pModify )
1872 : : {
1873 : : // break to end of the current switch case.
1874 : : break;
1875 [ # # ][ # # ]: 0 : }
1876 : : }
1877 : : else
1878 : : {
1879 [ + - ]: 488 : pModify = pAnch->GetCntntAnchor()->nNode.GetNode().GetCntntNode();
1880 : : }
1881 : : }
1882 [ + - ]: 488 : SwIterator<SwFrm,SwModify> aIter( *pModify );
1883 : 488 : SwFrm* pAnchorFrmOfMaster = 0;
1884 [ + - ][ + - ]: 976 : for( SwFrm *pFrm = aIter.First(); pFrm; pFrm = aIter.Next() )
[ + + ]
1885 : : {
1886 : : // append drawing object, if
1887 : : // (1) proposed anchor frame isn't a follow and
1888 : : // (2) drawing object isn't a control object to be anchored
1889 : : // in header/footer.
1890 : 488 : const bool bAdd = ( !pFrm->IsCntntFrm() ||
1891 : 488 : !((SwCntntFrm*)pFrm)->IsFollow() ) &&
1892 [ + - ][ + - ]: 488 : ( !::CheckControlLayer( GetMaster() ) ||
1893 [ + + ][ + - ]: 1464 : !pFrm->FindFooterOrHeader() );
[ + - ]
[ + - + - ]
1894 : :
1895 [ + - ]: 488 : if( bAdd )
1896 : : {
1897 [ - + ][ # # ]: 488 : if ( FLY_AT_FLY == pAnch->GetAnchorId() && !pFrm->IsFlyFrm() )
[ - + ]
1898 : : {
1899 [ # # ]: 0 : pFrm = pFrm->FindFlyFrm();
1900 : : OSL_ENSURE( pFrm,
1901 : : "<SwDrawContact::ConnectToLayout(..)> - missing fly frame -> crash." );
1902 : : }
1903 : :
1904 : : // find correct follow for as character anchored objects
1905 [ + + + - ]: 958 : if ((pAnch->GetAnchorId() == FLY_AS_CHAR) &&
[ + + ]
1906 : 470 : pFrm->IsTxtFrm() )
1907 : : {
1908 : : pFrm = lcl_GetFlyInCntntAnchor(
1909 : : static_cast<SwTxtFrm*>(pFrm),
1910 [ + - ]: 470 : pAnch->GetCntntAnchor()->nContent.GetIndex() );
1911 : : }
1912 : :
1913 [ + - ]: 488 : if ( !pAnchorFrmOfMaster )
1914 : : {
1915 : : // append 'master' drawing object
1916 : 488 : pAnchorFrmOfMaster = pFrm;
1917 [ + - ]: 488 : pFrm->AppendDrawObj( maAnchoredDrawObj );
1918 : : }
1919 : : else
1920 : : {
1921 : : // append 'virtual' drawing object
1922 [ # # ]: 0 : SwDrawVirtObj* pDrawVirtObj = AddVirtObj();
1923 [ # # ]: 0 : if ( pAnch->GetAnchorId() == FLY_AS_CHAR )
1924 : : {
1925 [ # # ]: 0 : ClrContourCache( pDrawVirtObj );
1926 : : }
1927 [ # # ]: 0 : pFrm->AppendDrawObj( *(pDrawVirtObj->AnchoredObj()) );
1928 : :
1929 [ # # ]: 0 : pDrawVirtObj->ActionChanged();
1930 : : }
1931 : :
1932 [ + + ]: 488 : if ( pAnch->GetAnchorId() == FLY_AS_CHAR )
1933 : : {
1934 [ + - ]: 470 : pFrm->InvalidatePrt();
1935 : : }
1936 : : }
1937 [ + - ]: 488 : }
1938 : : }
1939 : 488 : break;
1940 : : default:
1941 : : OSL_FAIL( "Unknown Anchor." );
1942 : 0 : break;
1943 : : }
1944 [ + - ]: 488 : if ( GetAnchorFrm() )
1945 : : {
1946 : 488 : ::setContextWritingMode( maAnchoredDrawObj.DrawObj(), GetAnchorFrm() );
1947 : : // #i26791# - invalidate objects instead of direct positioning
1948 : 673 : _InvalidateObjs();
1949 : : }
1950 : : }
1951 : :
1952 : : // insert 'master' drawing object into drawing page
1953 : 0 : void SwDrawContact::InsertMasterIntoDrawPage()
1954 : : {
1955 [ # # ]: 0 : if ( !GetMaster()->IsInserted() )
1956 : : {
1957 : 0 : GetFmt()->getIDocumentDrawModelAccess()->GetDrawModel()->GetPage(0)
1958 : 0 : ->InsertObject( GetMaster(), GetMaster()->GetOrdNumDirect() );
1959 : : }
1960 : 0 : GetMaster()->SetUserCall( this );
1961 : 0 : }
1962 : :
1963 : : /*************************************************************************
1964 : : |*
1965 : : |* SwDrawContact::FindPage(), ChkPage()
1966 : : |*
1967 : : |*************************************************************************/
1968 : :
1969 : 63 : SwPageFrm* SwDrawContact::FindPage( const SwRect &rRect )
1970 : : {
1971 : : // --> #i28701# - use method <GetPageFrm()>
1972 : 63 : SwPageFrm* pPg = GetPageFrm();
1973 [ # # ][ - + ]: 63 : if ( !pPg && GetAnchorFrm() )
[ - + ]
1974 : 0 : pPg = GetAnchorFrm()->FindPageFrm();
1975 [ + - ]: 63 : if ( pPg )
1976 : 63 : pPg = (SwPageFrm*)::FindPage( rRect, pPg );
1977 : 63 : return pPg;
1978 : : }
1979 : :
1980 : 77 : void SwDrawContact::ChkPage()
1981 : : {
1982 [ - + ]: 77 : if ( mbDisconnectInProgress )
1983 : : {
1984 : : OSL_FAIL( "<SwDrawContact::ChkPage()> called during disconnection." );
1985 : 77 : return;
1986 : : }
1987 : :
1988 : : // --> #i28701#
1989 [ + - ]: 77 : SwPageFrm* pPg = ( maAnchoredDrawObj.GetAnchorFrm() &&
1990 [ + - ]: 77 : maAnchoredDrawObj.GetAnchorFrm()->IsPageFrm() )
1991 : : ? GetPageFrm()
1992 [ + - + + ]: 154 : : FindPage( GetMaster()->GetCurrentBoundRect() );
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + + ]
[ # # ]
1993 [ - + ]: 77 : if ( GetPageFrm() != pPg )
1994 : : {
1995 : : // if drawing object is anchor in header/footer a change of the page
1996 : : // is a dramatic change. Thus, completely re-connect to the layout
1997 [ # # # # ]: 0 : if ( maAnchoredDrawObj.GetAnchorFrm() &&
[ # # ]
1998 : 0 : maAnchoredDrawObj.GetAnchorFrm()->FindFooterOrHeader() )
1999 : : {
2000 : 0 : ConnectToLayout();
2001 : : }
2002 : : else
2003 : : {
2004 : : // --> #i28701# - use methods <GetPageFrm()> and <SetPageFrm>
2005 [ # # ]: 0 : if ( GetPageFrm() )
2006 : 0 : GetPageFrm()->RemoveDrawObjFromPage( maAnchoredDrawObj );
2007 : 0 : pPg->AppendDrawObjToPage( maAnchoredDrawObj );
2008 : 0 : SetPageFrm( pPg );
2009 : : }
2010 : : }
2011 : : }
2012 : :
2013 : : /*************************************************************************
2014 : : |*
2015 : : |* SwDrawContact::ChangeMasterObject()
2016 : : |*
2017 : : |*************************************************************************/
2018 : : // Important note:
2019 : : // method is called by method <SwDPage::ReplaceObject(..)>, which called its
2020 : : // corresponding superclass method <FmFormPage::ReplaceObject(..)>.
2021 : : // Note: 'master' drawing object *has* to be connected to layout triggered
2022 : : // by the caller of this, if method is called.
2023 : 0 : void SwDrawContact::ChangeMasterObject( SdrObject *pNewMaster )
2024 : : {
2025 : 0 : DisconnectFromLayout( false );
2026 : : // consider 'virtual' drawing objects
2027 : 0 : RemoveAllVirtObjs();
2028 : :
2029 : 0 : GetMaster()->SetUserCall( 0 );
2030 : 0 : SetMaster( pNewMaster );
2031 : 0 : GetMaster()->SetUserCall( this );
2032 : :
2033 : 0 : _InvalidateObjs();
2034 : 0 : }
2035 : :
2036 : : // get data collection of anchored objects, handled by with contact
2037 : 6 : void SwDrawContact::GetAnchoredObjs( std::list<SwAnchoredObject*>& _roAnchoredObjs ) const
2038 : : {
2039 [ + - ]: 6 : _roAnchoredObjs.push_back( const_cast<SwAnchoredDrawObject*>(&maAnchoredDrawObj) );
2040 : :
2041 [ - + ]: 12 : for ( std::list<SwDrawVirtObj*>::const_iterator aDrawVirtObjsIter = maDrawVirtObjs.begin();
2042 : 6 : aDrawVirtObjsIter != maDrawVirtObjs.end();
2043 : : ++aDrawVirtObjsIter )
2044 : : {
2045 [ # # ]: 0 : _roAnchoredObjs.push_back( (*aDrawVirtObjsIter)->AnchoredObj() );
2046 : : }
2047 : 6 : }
2048 : :
2049 : : //////////////////////////////////////////////////////////////////////////////////////
2050 : : // AW: own sdr::contact::ViewContact (VC) sdr::contact::ViewObjectContact (VOC) needed
2051 : : // since offset is defined different from SdrVirtObj's sdr::contact::ViewContactOfVirtObj.
2052 : : // For paint, that offset is used by setting at the OutputDevice; for primitives this is
2053 : : // not possible since we have no OutputDevice, but define the geometry itself.
2054 : :
2055 : : namespace sdr
2056 : : {
2057 : : namespace contact
2058 : : {
2059 : : class VOCOfDrawVirtObj : public ViewObjectContactOfSdrObj
2060 : : {
2061 : : protected:
2062 : : // This method is responsible for creating the graphical visualisation data which is
2063 : : // stored/cached in the local primitive. Default gets view-independent Primitive
2064 : : // from the ViewContact using ViewContact::getViewIndependentPrimitive2DSequence(), takes care of
2065 : : // visibility, handles glue and ghosted.
2066 : : // This method will not handle included hierarchies and not check geometric visibility.
2067 : : virtual drawinglayer::primitive2d::Primitive2DSequence createPrimitive2DSequence(const DisplayInfo& rDisplayInfo) const;
2068 : :
2069 : : public:
2070 : 0 : VOCOfDrawVirtObj(ObjectContact& rObjectContact, ViewContact& rViewContact)
2071 : 0 : : ViewObjectContactOfSdrObj(rObjectContact, rViewContact)
2072 : : {
2073 : 0 : }
2074 : :
2075 : : virtual ~VOCOfDrawVirtObj();
2076 : : };
2077 : :
2078 : : class VCOfDrawVirtObj : public ViewContactOfVirtObj
2079 : : {
2080 : : protected:
2081 : : // Create a Object-Specific ViewObjectContact, set ViewContact and
2082 : : // ObjectContact. Always needs to return something. Default is to create
2083 : : // a standard ViewObjectContact containing the given ObjectContact and *this
2084 : : virtual ViewObjectContact& CreateObjectSpecificViewObjectContact(ObjectContact& rObjectContact);
2085 : :
2086 : : public:
2087 : : // basic constructor, used from SdrObject.
2088 : 0 : VCOfDrawVirtObj(SwDrawVirtObj& rObj)
2089 : 0 : : ViewContactOfVirtObj(rObj)
2090 : : {
2091 : 0 : }
2092 : : virtual ~VCOfDrawVirtObj();
2093 : :
2094 : : // access to SwDrawVirtObj
2095 : 0 : SwDrawVirtObj& GetSwDrawVirtObj() const
2096 : : {
2097 : 0 : return (SwDrawVirtObj&)mrObject;
2098 : : }
2099 : : };
2100 : : } // end of namespace contact
2101 : : } // end of namespace sdr
2102 : :
2103 : : namespace sdr
2104 : : {
2105 : : namespace contact
2106 : : {
2107 : : // recursively collect primitive data from given VOC with given offset
2108 : 0 : void impAddPrimitivesFromGroup(const ViewObjectContact& rVOC, const basegfx::B2DHomMatrix& rOffsetMatrix, const DisplayInfo& rDisplayInfo, drawinglayer::primitive2d::Primitive2DSequence& rxTarget)
2109 : : {
2110 : 0 : const sal_uInt32 nSubHierarchyCount(rVOC.GetViewContact().GetObjectCount());
2111 : :
2112 [ # # ]: 0 : for(sal_uInt32 a(0L); a < nSubHierarchyCount; a++)
2113 : : {
2114 : 0 : const ViewObjectContact& rCandidate(rVOC.GetViewContact().GetViewContact(a).GetViewObjectContact(rVOC.GetObjectContact()));
2115 : :
2116 [ # # ]: 0 : if(rCandidate.GetViewContact().GetObjectCount())
2117 : : {
2118 : : // is a group object itself, call resursively
2119 : 0 : impAddPrimitivesFromGroup(rCandidate, rOffsetMatrix, rDisplayInfo, rxTarget);
2120 : : }
2121 : : else
2122 : : {
2123 : : // single object, add primitives; check model-view visibility
2124 [ # # ]: 0 : if(rCandidate.isPrimitiveVisible(rDisplayInfo))
2125 : : {
2126 [ # # ]: 0 : drawinglayer::primitive2d::Primitive2DSequence aNewSequence(rCandidate.getPrimitive2DSequence(rDisplayInfo));
2127 : :
2128 [ # # ]: 0 : if(aNewSequence.hasElements())
2129 : : {
2130 : : // get ranges
2131 : 0 : const drawinglayer::geometry::ViewInformation2D& rViewInformation2D(rCandidate.GetObjectContact().getViewInformation2D());
2132 [ # # ]: 0 : const basegfx::B2DRange aViewRange(rViewInformation2D.getViewport());
2133 [ # # ]: 0 : basegfx::B2DRange aObjectRange(rCandidate.getObjectRange());
2134 : :
2135 : : // correct with virtual object's offset
2136 [ # # ]: 0 : aObjectRange.transform(rOffsetMatrix);
2137 : :
2138 : : // check geometrical visibility (with offset)
2139 [ # # ][ # # ]: 0 : if(!aViewRange.overlaps(aObjectRange))
2140 : : {
2141 : : // not visible, release
2142 [ # # ]: 0 : aNewSequence.realloc(0);
2143 : : }
2144 : : }
2145 : :
2146 [ # # ]: 0 : if(aNewSequence.hasElements())
2147 : : {
2148 [ # # ]: 0 : drawinglayer::primitive2d::appendPrimitive2DSequenceToPrimitive2DSequence(rxTarget, aNewSequence);
2149 [ # # ]: 0 : }
2150 : : }
2151 : : }
2152 : : }
2153 : 0 : }
2154 : :
2155 : 0 : drawinglayer::primitive2d::Primitive2DSequence VOCOfDrawVirtObj::createPrimitive2DSequence(const DisplayInfo& rDisplayInfo) const
2156 : : {
2157 : 0 : const VCOfDrawVirtObj& rVC = static_cast< const VCOfDrawVirtObj& >(GetViewContact());
2158 [ # # ]: 0 : const SdrObject& rReferencedObject = rVC.GetSwDrawVirtObj().GetReferencedObj();
2159 [ # # ]: 0 : drawinglayer::primitive2d::Primitive2DSequence xRetval;
2160 : :
2161 : : // create offset transformation
2162 [ # # ]: 0 : basegfx::B2DHomMatrix aOffsetMatrix;
2163 [ # # ]: 0 : const Point aLocalOffset(rVC.GetSwDrawVirtObj().GetOffset());
2164 : :
2165 [ # # ][ # # ]: 0 : if(aLocalOffset.X() || aLocalOffset.Y())
[ # # ]
2166 : : {
2167 [ # # ]: 0 : aOffsetMatrix.set(0, 2, aLocalOffset.X());
2168 [ # # ]: 0 : aOffsetMatrix.set(1, 2, aLocalOffset.Y());
2169 : : }
2170 : :
2171 [ # # ][ # # ]: 0 : if(rReferencedObject.ISA(SdrObjGroup))
[ # # ]
2172 : : {
2173 : : // group object. Since the VOC/OC/VC hierarchy does not represent the
2174 : : // hierarchy virtual objects when they have group objects
2175 : : // (ViewContactOfVirtObj::GetObjectCount() returns null for that purpose)
2176 : : // to avoid multiple usages of VOCs (which would not work), the primitives
2177 : : // for the sub-hierarchy need to be collected here
2178 : :
2179 : : // Get the VOC of the referenced object (the Group) and fetch primitives from it
2180 [ # # ][ # # ]: 0 : const ViewObjectContact& rVOCOfRefObj = rReferencedObject.GetViewContact().GetViewObjectContact(GetObjectContact());
2181 [ # # ]: 0 : impAddPrimitivesFromGroup(rVOCOfRefObj, aOffsetMatrix, rDisplayInfo, xRetval);
2182 : : }
2183 : : else
2184 : : {
2185 : : // single object, use method from referenced object to get the Primitive2DSequence
2186 [ # # ][ # # ]: 0 : xRetval = rReferencedObject.GetViewContact().getViewIndependentPrimitive2DSequence();
[ # # ][ # # ]
2187 : : }
2188 : :
2189 [ # # ]: 0 : if(xRetval.hasElements())
2190 : : {
2191 : : // create transform primitive
2192 [ # # ][ # # ]: 0 : const drawinglayer::primitive2d::Primitive2DReference xReference(new drawinglayer::primitive2d::TransformPrimitive2D(aOffsetMatrix, xRetval));
[ # # ]
2193 [ # # ][ # # ]: 0 : xRetval = drawinglayer::primitive2d::Primitive2DSequence(&xReference, 1);
[ # # ]
2194 : : }
2195 : :
2196 [ # # ]: 0 : return xRetval;
2197 : : }
2198 : :
2199 : 0 : VOCOfDrawVirtObj::~VOCOfDrawVirtObj()
2200 : : {
2201 [ # # ]: 0 : }
2202 : :
2203 : 0 : ViewObjectContact& VCOfDrawVirtObj::CreateObjectSpecificViewObjectContact(ObjectContact& rObjectContact)
2204 : : {
2205 [ # # ]: 0 : return *(new VOCOfDrawVirtObj(rObjectContact, *this));
2206 : : }
2207 : :
2208 : 0 : VCOfDrawVirtObj::~VCOfDrawVirtObj()
2209 : : {
2210 [ # # ]: 0 : }
2211 : : } // end of namespace contact
2212 : : } // end of namespace sdr
2213 : :
2214 : : //////////////////////////////////////////////////////////////////////////////////////
2215 : :
2216 : : // =============================================================================
2217 : : /** implementation of class <SwDrawVirtObj>
2218 : :
2219 : : @author OD
2220 : : */
2221 : :
2222 [ # # ][ # # ]: 27631 : TYPEINIT1(SwDrawVirtObj,SdrVirtObj);
2223 : :
2224 : 0 : sdr::contact::ViewContact* SwDrawVirtObj::CreateObjectSpecificViewContact()
2225 : : {
2226 [ # # ]: 0 : return new sdr::contact::VCOfDrawVirtObj(*this);
2227 : : }
2228 : :
2229 : : // implemetation of SwDrawVirtObj
2230 : 0 : SwDrawVirtObj::SwDrawVirtObj( SdrObject& _rNewObj,
2231 : : SwDrawContact& _rDrawContact )
2232 : : : SdrVirtObj( _rNewObj ),
2233 : : // OD 2004-03-29 #i26791# - init new member <maAnchoredDrawObj>
2234 : : maAnchoredDrawObj(),
2235 [ # # ]: 0 : mrDrawContact( _rDrawContact )
2236 : : {
2237 : : // OD 2004-03-29 #i26791#
2238 [ # # ]: 0 : maAnchoredDrawObj.SetDrawObj( *this );
2239 : : // #i35635# - set initial position out of sight
2240 [ # # ]: 0 : NbcMove( Size( -RECT_EMPTY, -RECT_EMPTY ) );
2241 : 0 : }
2242 : :
2243 [ # # ]: 0 : SwDrawVirtObj::~SwDrawVirtObj()
2244 [ # # ]: 0 : {}
2245 : :
2246 : 0 : SwDrawVirtObj& SwDrawVirtObj::operator=( const SwDrawVirtObj& rObj )
2247 : : {
2248 : 0 : SdrVirtObj::operator=(rObj);
2249 : : // Note: Members <maAnchoredDrawObj> and <mrDrawContact>
2250 : : // haven't to be considered.
2251 : 0 : return *this;
2252 : : }
2253 : :
2254 : 0 : SwDrawVirtObj* SwDrawVirtObj::Clone() const
2255 : : {
2256 [ # # ]: 0 : SwDrawVirtObj* pObj = new SwDrawVirtObj( rRefObj, mrDrawContact );
2257 : :
2258 [ # # ]: 0 : if ( pObj )
2259 : : {
2260 : 0 : pObj->operator=( *this );
2261 : : // Note: Member <maAnchoredDrawObj> hasn't to be considered.
2262 : : }
2263 : :
2264 : 0 : return pObj;
2265 : : }
2266 : :
2267 : : // --------------------------------------------------------------------
2268 : : // connection to writer layout: <GetAnchoredObj()>, <SetAnchorFrm(..)>,
2269 : : // <GetAnchorFrm()>, <SetPageFrm(..)>, <GetPageFrm()> and <RemoveFromWriterLayout()>
2270 : : // --------------------------------------------------------------------
2271 : 0 : const SwAnchoredObject* SwDrawVirtObj::GetAnchoredObj() const
2272 : : {
2273 : 0 : return &maAnchoredDrawObj;
2274 : : }
2275 : :
2276 : 0 : SwAnchoredObject* SwDrawVirtObj::AnchoredObj()
2277 : : {
2278 : 0 : return &maAnchoredDrawObj;
2279 : : }
2280 : :
2281 : 0 : const SwFrm* SwDrawVirtObj::GetAnchorFrm() const
2282 : : {
2283 : : // OD 2004-03-29 #i26791# - use new member <maAnchoredDrawObj>
2284 : 0 : return maAnchoredDrawObj.GetAnchorFrm();
2285 : : }
2286 : :
2287 : 0 : SwFrm* SwDrawVirtObj::AnchorFrm()
2288 : : {
2289 : : // OD 2004-03-29 #i26791# - use new member <maAnchoredDrawObj>
2290 : 0 : return maAnchoredDrawObj.AnchorFrm();
2291 : : }
2292 : :
2293 : 0 : void SwDrawVirtObj::RemoveFromWriterLayout()
2294 : : {
2295 : : // remove contact object from frame for 'virtual' drawing object
2296 : : // OD 2004-03-29 #i26791# - use new member <maAnchoredDrawObj>
2297 [ # # ]: 0 : if ( maAnchoredDrawObj.GetAnchorFrm() )
2298 : : {
2299 : 0 : maAnchoredDrawObj.AnchorFrm()->RemoveDrawObj( maAnchoredDrawObj );
2300 : : }
2301 : 0 : }
2302 : :
2303 : : // --------------------------------------------------------------------
2304 : : // connection to writer layout: <AddToDrawingPage()>, <RemoveFromDrawingPage()>
2305 : : // --------------------------------------------------------------------
2306 : 0 : void SwDrawVirtObj::AddToDrawingPage()
2307 : : {
2308 : : // determine 'master'
2309 : 0 : SdrObject* pOrgMasterSdrObj = mrDrawContact.GetMaster();
2310 : :
2311 : : // insert 'virtual' drawing object into page, set layer and user call.
2312 : : SdrPage* pDrawPg;
2313 : : // #i27030# - apply order number of referenced object
2314 [ # # ]: 0 : if ( 0 != ( pDrawPg = pOrgMasterSdrObj->GetPage() ) )
2315 : : {
2316 : : // #i27030# - apply order number of referenced object
2317 : 0 : pDrawPg->InsertObject( this, GetReferencedObj().GetOrdNum() );
2318 : : }
2319 : : else
2320 : : {
2321 : 0 : pDrawPg = GetPage();
2322 [ # # ]: 0 : if ( pDrawPg )
2323 : : {
2324 : : pDrawPg->SetObjectOrdNum( GetOrdNumDirect(),
2325 : 0 : GetReferencedObj().GetOrdNum() );
2326 : : }
2327 : : else
2328 : : {
2329 : 0 : SetOrdNum( GetReferencedObj().GetOrdNum() );
2330 : : }
2331 : : }
2332 : 0 : SetUserCall( &mrDrawContact );
2333 : 0 : }
2334 : :
2335 : 0 : void SwDrawVirtObj::RemoveFromDrawingPage()
2336 : : {
2337 : 0 : SetUserCall( 0 );
2338 [ # # ]: 0 : if ( GetPage() )
2339 : : {
2340 : 0 : GetPage()->RemoveObject( GetOrdNum() );
2341 : : }
2342 : 0 : }
2343 : :
2344 : : // is 'virtual' drawing object connected to writer layout and to drawing layer.
2345 : 0 : bool SwDrawVirtObj::IsConnected() const
2346 : : {
2347 : 0 : bool bRetVal = GetAnchorFrm() &&
2348 [ # # ][ # # ]: 0 : ( GetPage() && GetUserCall() );
[ # # ]
2349 : :
2350 : 0 : return bRetVal;
2351 : : }
2352 : :
2353 : 0 : void SwDrawVirtObj::NbcSetAnchorPos(const Point& rPnt)
2354 : : {
2355 : 0 : SdrObject::NbcSetAnchorPos( rPnt );
2356 : 0 : }
2357 : :
2358 : : //////////////////////////////////////////////////////////////////////////////
2359 : : // #i97197#
2360 : : // the methods relevant for positioning
2361 : :
2362 : 0 : const Rectangle& SwDrawVirtObj::GetCurrentBoundRect() const
2363 : : {
2364 [ # # ]: 0 : if(aOutRect.IsEmpty())
2365 : : {
2366 : 0 : const_cast<SwDrawVirtObj*>(this)->RecalcBoundRect();
2367 : : }
2368 : :
2369 : 0 : return aOutRect;
2370 : : }
2371 : :
2372 : 0 : const Rectangle& SwDrawVirtObj::GetLastBoundRect() const
2373 : : {
2374 : 0 : return aOutRect;
2375 : : }
2376 : :
2377 : 0 : const Point SwDrawVirtObj::GetOffset() const
2378 : : {
2379 : : // do NOT use IsEmpty() here, there is already a useful offset
2380 : : // in the position
2381 [ # # ][ # # ]: 0 : if(aOutRect == Rectangle())
2382 : : {
2383 : 0 : return Point();
2384 : : }
2385 : : else
2386 : : {
2387 : 0 : return aOutRect.TopLeft() - GetReferencedObj().GetCurrentBoundRect().TopLeft();
2388 : : }
2389 : : }
2390 : :
2391 : 0 : void SwDrawVirtObj::SetBoundRectDirty()
2392 : : {
2393 : : // do nothing to not lose model information in aOutRect
2394 : 0 : }
2395 : :
2396 : 0 : void SwDrawVirtObj::RecalcBoundRect()
2397 : : {
2398 : : // OD 2004-04-05 #i26791# - switch order of calling <GetOffset()> and
2399 : : // <ReferencedObj().GetCurrentBoundRect()>, because <GetOffset()> calculates
2400 : : // its value by the 'BoundRect' of the referenced object.
2401 : :
2402 [ # # ]: 0 : const Point aOffset(GetOffset());
2403 [ # # ][ # # ]: 0 : aOutRect = ReferencedObj().GetCurrentBoundRect() + aOffset;
[ # # ]
2404 : 0 : }
2405 : :
2406 : 0 : basegfx::B2DPolyPolygon SwDrawVirtObj::TakeXorPoly() const
2407 : : {
2408 : 0 : basegfx::B2DPolyPolygon aRetval(rRefObj.TakeXorPoly());
2409 [ # # ][ # # ]: 0 : aRetval.transform(basegfx::tools::createTranslateB2DHomMatrix(GetOffset().X(), GetOffset().Y()));
[ # # ][ # # ]
[ # # ]
2410 : :
2411 : 0 : return aRetval;
2412 : : }
2413 : :
2414 : 0 : basegfx::B2DPolyPolygon SwDrawVirtObj::TakeContour() const
2415 : : {
2416 : 0 : basegfx::B2DPolyPolygon aRetval(rRefObj.TakeContour());
2417 [ # # ][ # # ]: 0 : aRetval.transform(basegfx::tools::createTranslateB2DHomMatrix(GetOffset().X(), GetOffset().Y()));
[ # # ][ # # ]
[ # # ]
2418 : :
2419 : 0 : return aRetval;
2420 : : }
2421 : :
2422 : 0 : SdrHdl* SwDrawVirtObj::GetHdl(sal_uInt32 nHdlNum) const
2423 : : {
2424 [ # # ]: 0 : SdrHdl* pHdl = rRefObj.GetHdl(nHdlNum);
2425 [ # # ]: 0 : Point aP(pHdl->GetPos() + GetOffset());
2426 [ # # ]: 0 : pHdl->SetPos(aP);
2427 : :
2428 : 0 : return pHdl;
2429 : : }
2430 : :
2431 : 0 : SdrHdl* SwDrawVirtObj::GetPlusHdl(const SdrHdl& rHdl, sal_uInt16 nPlNum) const
2432 : : {
2433 : 0 : SdrHdl* pHdl = rRefObj.GetPlusHdl(rHdl, nPlNum);
2434 : :
2435 [ # # ]: 0 : if (pHdl)
2436 [ # # ]: 0 : pHdl->SetPos(pHdl->GetPos() + GetOffset());
2437 : :
2438 : 0 : return pHdl;
2439 : : }
2440 : :
2441 : 0 : void SwDrawVirtObj::NbcMove(const Size& rSiz)
2442 : : {
2443 : 0 : SdrObject::NbcMove( rSiz );
2444 : 0 : }
2445 : :
2446 : 0 : void SwDrawVirtObj::NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact)
2447 : : {
2448 [ # # ]: 0 : rRefObj.NbcResize(rRef - GetOffset(), xFact, yFact);
2449 : 0 : SetRectsDirty();
2450 : 0 : }
2451 : :
2452 : 0 : void SwDrawVirtObj::NbcRotate(const Point& rRef, long nWink, double sn, double cs)
2453 : : {
2454 [ # # ]: 0 : rRefObj.NbcRotate(rRef - GetOffset(), nWink, sn, cs);
2455 : 0 : SetRectsDirty();
2456 : 0 : }
2457 : :
2458 : 0 : void SwDrawVirtObj::NbcMirror(const Point& rRef1, const Point& rRef2)
2459 : : {
2460 [ # # ][ # # ]: 0 : rRefObj.NbcMirror(rRef1 - GetOffset(), rRef2 - GetOffset());
2461 : 0 : SetRectsDirty();
2462 : 0 : }
2463 : :
2464 : 0 : void SwDrawVirtObj::NbcShear(const Point& rRef, long nWink, double tn, bool bVShear)
2465 : : {
2466 [ # # ]: 0 : rRefObj.NbcShear(rRef - GetOffset(), nWink, tn, bVShear);
2467 : 0 : SetRectsDirty();
2468 : 0 : }
2469 : :
2470 : 0 : void SwDrawVirtObj::Move(const Size& rSiz)
2471 : : {
2472 : 0 : SdrObject::Move( rSiz );
2473 : 0 : }
2474 : :
2475 : 0 : void SwDrawVirtObj::Resize(const Point& rRef, const Fraction& xFact, const Fraction& yFact)
2476 : : {
2477 [ # # ][ # # ]: 0 : if(xFact.GetNumerator() != xFact.GetDenominator() || yFact.GetNumerator() != yFact.GetDenominator())
[ # # ]
2478 : : {
2479 [ # # ][ # # ]: 0 : Rectangle aBoundRect0; if(pUserCall) aBoundRect0 = GetLastBoundRect();
[ # # ]
2480 [ # # ][ # # ]: 0 : rRefObj.Resize(rRef - GetOffset(), xFact, yFact);
2481 [ # # ]: 0 : SetRectsDirty();
2482 [ # # ]: 0 : SendUserCall(SDRUSERCALL_RESIZE, aBoundRect0);
2483 : : }
2484 : 0 : }
2485 : :
2486 : 0 : void SwDrawVirtObj::Rotate(const Point& rRef, long nWink, double sn, double cs)
2487 : : {
2488 [ # # ]: 0 : if(nWink)
2489 : : {
2490 [ # # ][ # # ]: 0 : Rectangle aBoundRect0; if(pUserCall) aBoundRect0 = GetLastBoundRect();
[ # # ]
2491 [ # # ][ # # ]: 0 : rRefObj.Rotate(rRef - GetOffset(), nWink, sn, cs);
2492 [ # # ]: 0 : SetRectsDirty();
2493 [ # # ]: 0 : SendUserCall(SDRUSERCALL_RESIZE, aBoundRect0);
2494 : : }
2495 : 0 : }
2496 : :
2497 : 0 : void SwDrawVirtObj::Mirror(const Point& rRef1, const Point& rRef2)
2498 : : {
2499 [ # # ][ # # ]: 0 : Rectangle aBoundRect0; if(pUserCall) aBoundRect0 = GetLastBoundRect();
[ # # ]
2500 [ # # ][ # # ]: 0 : rRefObj.Mirror(rRef1 - GetOffset(), rRef2 - GetOffset());
[ # # ]
2501 [ # # ]: 0 : SetRectsDirty();
2502 [ # # ]: 0 : SendUserCall(SDRUSERCALL_RESIZE, aBoundRect0);
2503 : 0 : }
2504 : :
2505 : 0 : void SwDrawVirtObj::Shear(const Point& rRef, long nWink, double tn, bool bVShear)
2506 : : {
2507 [ # # ]: 0 : if(nWink)
2508 : : {
2509 [ # # ][ # # ]: 0 : Rectangle aBoundRect0; if(pUserCall) aBoundRect0 = GetLastBoundRect();
[ # # ]
2510 [ # # ][ # # ]: 0 : rRefObj.Shear(rRef - GetOffset(), nWink, tn, bVShear);
2511 [ # # ]: 0 : SetRectsDirty();
2512 [ # # ]: 0 : SendUserCall(SDRUSERCALL_RESIZE, aBoundRect0);
2513 : : }
2514 : 0 : }
2515 : :
2516 : 0 : void SwDrawVirtObj::RecalcSnapRect()
2517 : : {
2518 : 0 : aSnapRect = rRefObj.GetSnapRect();
2519 [ # # ]: 0 : aSnapRect += GetOffset();
2520 : 0 : }
2521 : :
2522 : 0 : const Rectangle& SwDrawVirtObj::GetSnapRect() const
2523 : : {
2524 : 0 : ((SwDrawVirtObj*)this)->aSnapRect = rRefObj.GetSnapRect();
2525 [ # # ]: 0 : ((SwDrawVirtObj*)this)->aSnapRect += GetOffset();
2526 : :
2527 : 0 : return aSnapRect;
2528 : : }
2529 : :
2530 : 0 : void SwDrawVirtObj::SetSnapRect(const Rectangle& rRect)
2531 : : {
2532 [ # # ][ # # ]: 0 : Rectangle aBoundRect0; if(pUserCall) aBoundRect0 = GetLastBoundRect();
[ # # ]
2533 : 0 : Rectangle aR(rRect);
2534 [ # # ][ # # ]: 0 : aR -= GetOffset();
2535 [ # # ]: 0 : rRefObj.SetSnapRect(aR);
2536 [ # # ]: 0 : SetRectsDirty();
2537 [ # # ]: 0 : SendUserCall(SDRUSERCALL_RESIZE, aBoundRect0);
2538 : 0 : }
2539 : :
2540 : 0 : void SwDrawVirtObj::NbcSetSnapRect(const Rectangle& rRect)
2541 : : {
2542 : 0 : Rectangle aR(rRect);
2543 [ # # ][ # # ]: 0 : aR -= GetOffset();
2544 [ # # ]: 0 : SetRectsDirty();
2545 [ # # ]: 0 : rRefObj.NbcSetSnapRect(aR);
2546 : 0 : }
2547 : :
2548 : 0 : const Rectangle& SwDrawVirtObj::GetLogicRect() const
2549 : : {
2550 : 0 : ((SwDrawVirtObj*)this)->aSnapRect = rRefObj.GetLogicRect();
2551 [ # # ]: 0 : ((SwDrawVirtObj*)this)->aSnapRect += GetOffset();
2552 : :
2553 : 0 : return aSnapRect;
2554 : : }
2555 : :
2556 : 0 : void SwDrawVirtObj::SetLogicRect(const Rectangle& rRect)
2557 : : {
2558 [ # # ][ # # ]: 0 : Rectangle aBoundRect0; if(pUserCall) aBoundRect0 = GetLastBoundRect();
[ # # ]
2559 : 0 : Rectangle aR(rRect);
2560 [ # # ][ # # ]: 0 : aR -= GetOffset();
2561 [ # # ]: 0 : rRefObj.SetLogicRect(aR);
2562 [ # # ]: 0 : SetRectsDirty();
2563 [ # # ]: 0 : SendUserCall(SDRUSERCALL_RESIZE, aBoundRect0);
2564 : 0 : }
2565 : :
2566 : 0 : void SwDrawVirtObj::NbcSetLogicRect(const Rectangle& rRect)
2567 : : {
2568 : 0 : Rectangle aR(rRect);
2569 [ # # ][ # # ]: 0 : aR -= GetOffset();
2570 [ # # ]: 0 : rRefObj.NbcSetLogicRect(aR);
2571 [ # # ]: 0 : SetRectsDirty();
2572 : 0 : }
2573 : :
2574 : 0 : Point SwDrawVirtObj::GetSnapPoint(sal_uInt32 i) const
2575 : : {
2576 : 0 : Point aP(rRefObj.GetSnapPoint(i));
2577 : 0 : aP += GetOffset();
2578 : :
2579 : 0 : return aP;
2580 : : }
2581 : :
2582 : 0 : Point SwDrawVirtObj::GetPoint(sal_uInt32 i) const
2583 : : {
2584 [ # # ]: 0 : return Point(rRefObj.GetPoint(i) + GetOffset());
2585 : : }
2586 : :
2587 : 0 : void SwDrawVirtObj::NbcSetPoint(const Point& rPnt, sal_uInt32 i)
2588 : : {
2589 : 0 : Point aP(rPnt);
2590 [ # # ]: 0 : aP -= GetOffset();
2591 [ # # ]: 0 : rRefObj.SetPoint(aP, i);
2592 [ # # ]: 0 : SetRectsDirty();
2593 : 0 : }
2594 : :
2595 : 0 : bool SwDrawVirtObj::HasTextEdit() const
2596 : : {
2597 : 0 : return rRefObj.HasTextEdit();
2598 : : }
2599 : :
2600 : : // overloaded 'layer' methods for 'virtual' drawing object to assure,
2601 : : // that layer of 'virtual' object is the layer of the referenced object.
2602 : 0 : SdrLayerID SwDrawVirtObj::GetLayer() const
2603 : : {
2604 : 0 : return GetReferencedObj().GetLayer();
2605 : : }
2606 : :
2607 : 0 : void SwDrawVirtObj::NbcSetLayer(SdrLayerID nLayer)
2608 : : {
2609 : 0 : ReferencedObj().NbcSetLayer( nLayer );
2610 : 0 : SdrVirtObj::NbcSetLayer( ReferencedObj().GetLayer() );
2611 : 0 : }
2612 : :
2613 : 0 : void SwDrawVirtObj::SetLayer(SdrLayerID nLayer)
2614 : : {
2615 : 0 : ReferencedObj().SetLayer( nLayer );
2616 : 0 : SdrVirtObj::NbcSetLayer( ReferencedObj().GetLayer() );
2617 : 0 : }
2618 : :
2619 : 0 : bool SwDrawVirtObj::supportsFullDrag() const
2620 : : {
2621 : : // call parent
2622 : 0 : return SdrVirtObj::supportsFullDrag();
2623 : : }
2624 : :
2625 : 0 : SdrObject* SwDrawVirtObj::getFullDragClone() const
2626 : : {
2627 : : // call parent
2628 : 0 : return SdrVirtObj::getFullDragClone();
2629 : : }
2630 : :
2631 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|