LCOV - code coverage report
Current view: top level - sw/source/core/draw - dcontact.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 430 1020 42.2 %
Date: 2012-08-25 Functions: 60 150 40.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 413 1454 28.4 %

           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: */

Generated by: LCOV version 1.10