LCOV - code coverage report
Current view: top level - svx/source/svdraw - svdobj.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 1006 1738 57.9 %
Date: 2015-06-13 12:38:46 Functions: 165 262 63.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <svx/svdobj.hxx>
      21             : #include <config_features.h>
      22             : 
      23             : #include "sal/config.h"
      24             : 
      25             : #include <com/sun/star/lang/XComponent.hpp>
      26             : #include <com/sun/star/text/RelOrientation.hpp>
      27             : 
      28             : #include "svdconv.hxx"
      29             : 
      30             : #include <basegfx/matrix/b2dhommatrix.hxx>
      31             : #include <basegfx/matrix/b2dhommatrixtools.hxx>
      32             : #include <basegfx/polygon/b2dpolygon.hxx>
      33             : #include <basegfx/polygon/b2dpolygontools.hxx>
      34             : #include <basegfx/polygon/b2dpolypolygoncutter.hxx>
      35             : #include <basegfx/polygon/b2dpolypolygontools.hxx>
      36             : #include <basegfx/range/b2drange.hxx>
      37             : #include <drawinglayer/processor2d/contourextractor2d.hxx>
      38             : #include <drawinglayer/processor2d/linegeometryextractor2d.hxx>
      39             : #include <editeng/editeng.hxx>
      40             : #include <editeng/eeitem.hxx>
      41             : #include <editeng/outlobj.hxx>
      42             : #include <math.h>
      43             : #include <sfx2/objface.hxx>
      44             : #include <sfx2/objsh.hxx>
      45             : #include <svl/whiter.hxx>
      46             : #include <svl/grabbagitem.hxx>
      47             : #include <svtools/colorcfg.hxx>
      48             : #include <tools/bigint.hxx>
      49             : #include <tools/diagnose_ex.h>
      50             : #include <tools/helpers.hxx>
      51             : #include <tools/line.hxx>
      52             : #include <vcl/graphictools.hxx>
      53             : #include <vcl/metaact.hxx>
      54             : #include <vcl/virdev.hxx>
      55             : #include <vector>
      56             : 
      57             : #include "svx/shapepropertynotifier.hxx"
      58             : #include "svdglob.hxx"
      59             : #include "svx/svdotable.hxx"
      60             : #include "svx/xlinjoit.hxx"
      61             : 
      62             : #include <svx/fmmodel.hxx>
      63             : #include <svx/polysc3d.hxx>
      64             : #include <svx/sdr/contact/displayinfo.hxx>
      65             : #include <svx/sdr/contact/objectcontactofobjlistpainter.hxx>
      66             : #include <sdr/contact/viewcontactofgraphic.hxx>
      67             : #include <svx/sdr/contact/viewcontactofsdrobj.hxx>
      68             : #include <sdr/properties/emptyproperties.hxx>
      69             : #include <svx/sdrhittesthelper.hxx>
      70             : #include <svx/sdrobjectuser.hxx>
      71             : #include <svx/sdrobjectfilter.hxx>
      72             : #include <svx/svddrag.hxx>
      73             : #include <svx/svdetc.hxx>
      74             : #include <svx/svdhdl.hxx>
      75             : #include <svx/svditer.hxx>
      76             : #include <svx/svdmodel.hxx>
      77             : #include <svx/svdoashp.hxx>
      78             : #include <svx/svdocapt.hxx>
      79             : #include <svx/svdocirc.hxx>
      80             : #include <svx/svdoedge.hxx>
      81             : #include <svx/svdograf.hxx>
      82             : #include <svx/svdogrp.hxx>
      83             : #include <svx/svdomeas.hxx>
      84             : #include <svx/svdomedia.hxx>
      85             : #include <svx/svdoole2.hxx>
      86             : #include <svx/svdopage.hxx>
      87             : #include <svx/svdopath.hxx>
      88             : #include <svx/svdorect.hxx>
      89             : #include <svx/svdotext.hxx>
      90             : #include <svx/svdouno.hxx>
      91             : #include <svx/svdovirt.hxx>
      92             : #include <svx/svdpage.hxx>
      93             : #include <svx/svdpool.hxx>
      94             : #include <svx/svdstr.hrc>
      95             : #include <svx/svdtrans.hxx>
      96             : #include <svx/svdundo.hxx>
      97             : #include <svx/svdview.hxx>
      98             : #include <sxlayitm.hxx>
      99             : #include <sxlogitm.hxx>
     100             : #include <sxmovitm.hxx>
     101             : #include <svx/sxmspitm.hxx>
     102             : #include <sxoneitm.hxx>
     103             : #include <sxonitm.hxx>
     104             : #include <sxopitm.hxx>
     105             : #include <sxraitm.hxx>
     106             : #include <sxreoitm.hxx>
     107             : #include <sxrooitm.hxx>
     108             : #include <sxsaitm.hxx>
     109             : #include <sxsoitm.hxx>
     110             : #include <sxtraitm.hxx>
     111             : #include <svx/unopage.hxx>
     112             : #include <svx/unoshape.hxx>
     113             : #include <svx/xbtmpit.hxx>
     114             : #include <svx/xenum.hxx>
     115             : #include <svx/xflclit.hxx>
     116             : #include <svx/xflftrit.hxx>
     117             : #include <svx/xflhtit.hxx>
     118             : #include <svx/xfltrit.hxx>
     119             : #include <svx/xgrad.hxx>
     120             : #include <svx/xhatch.hxx>
     121             : #include <svx/xlnclit.hxx>
     122             : #include <svx/xlndsit.hxx>
     123             : #include <svx/xlnedcit.hxx>
     124             : #include <svx/xlnedit.hxx>
     125             : #include <svx/xlnedwit.hxx>
     126             : #include <svx/xlnstcit.hxx>
     127             : #include <svx/xlnstit.hxx>
     128             : #include <svx/xlnstwit.hxx>
     129             : #include <svx/xlntrit.hxx>
     130             : #include <svx/xlnwtit.hxx>
     131             : #include <svx/xpoly.hxx>
     132             : #include <svx/svdglue.hxx>
     133             : #include <svx/svdsob.hxx>
     134             : #include <rtl/strbuf.hxx>
     135             : #include <svdoopengl.hxx>
     136             : #include <svdobjplusdata.hxx>
     137             : #include <svdobjuserdatalist.hxx>
     138             : 
     139             : #include <boost/scoped_ptr.hpp>
     140             : #include <boost/optional.hpp>
     141             : #include <libxml/xmlwriter.h>
     142             : 
     143             : using namespace ::com::sun::star;
     144             : 
     145             : 
     146             : 
     147           0 : TYPEINIT0(SdrObjUserCall);
     148             : 
     149       10005 : SdrObjUserCall::~SdrObjUserCall()
     150             : {
     151       10005 : }
     152             : 
     153       37110 : void SdrObjUserCall::Changed(const SdrObject& /*rObj*/, SdrUserCallType /*eType*/, const Rectangle& /*rOldBoundRect*/)
     154             : {
     155       37110 : }
     156             : 
     157           1 : SdrObjMacroHitRec::SdrObjMacroHitRec() :
     158             :     pOut(NULL),
     159             :     pVisiLayer(NULL),
     160             :     pPageView(NULL),
     161             :     nTol(0),
     162           1 :     bDown(false) {}
     163             : 
     164             : 
     165             : 
     166           0 : TYPEINIT0(SdrObjUserData);
     167             : 
     168       10388 : SdrObjUserData::SdrObjUserData(sal_uInt32 nInv, sal_uInt16 nId, sal_uInt16 nVer) :
     169             :     nInventor(nInv),
     170             :     nIdentifier(nId),
     171       10388 :     nVersion(nVer) {}
     172             : 
     173           9 : SdrObjUserData::SdrObjUserData(const SdrObjUserData& rData) :
     174             :     nInventor(rData.nInventor),
     175             :     nIdentifier(rData.nIdentifier),
     176           9 :     nVersion(rData.nVersion) {}
     177             : 
     178       10215 : SdrObjUserData::~SdrObjUserData() {}
     179             : 
     180        1363 : SdrObjGeoData::SdrObjGeoData():
     181             :     pGPL(NULL),
     182             :     bMovProt(false),
     183             :     bSizProt(false),
     184             :     bNoPrint(false),
     185             :     bClosedObj(false),
     186             :     mbVisible(true),
     187        1363 :     mnLayerID(0)
     188             : {
     189        1363 : }
     190             : 
     191        1360 : SdrObjGeoData::~SdrObjGeoData()
     192             : {
     193        1360 :     delete pGPL;
     194        1360 : }
     195             : 
     196          39 : SdrObjTransformInfoRec::SdrObjTransformInfoRec() :
     197             :     bSelectAllowed(true),
     198             :     bMoveAllowed(true),
     199             :     bResizeFreeAllowed(true),
     200             :     bResizePropAllowed(true),
     201             :     bRotateFreeAllowed(true),
     202             :     bRotate90Allowed(true),
     203             :     bMirrorFreeAllowed(true),
     204             :     bMirror45Allowed(true),
     205             :     bMirror90Allowed(true),
     206             :     bTransparenceAllowed(true),
     207             :     bGradientAllowed(true),
     208             :     bShearAllowed(true),
     209             :     bEdgeRadiusAllowed(true),
     210             :     bNoOrthoDesired(true),
     211             :     bNoContortion(true),
     212             :     bCanConvToPath(true),
     213             :     bCanConvToPoly(true),
     214             :     bCanConvToContour(false),
     215             :     bCanConvToPathLineToArea(true),
     216          39 :     bCanConvToPolyLineToArea(true) {}
     217             : 
     218      115236 : struct SdrObject::Impl
     219             : {
     220             :     sdr::ObjectUserVector maObjectUsers;
     221             : 
     222             :     boost::optional<double> mnRelativeWidth;
     223             :     sal_Int16               meRelativeWidthRelation;
     224             :     boost::optional<double> mnRelativeHeight;
     225             :     sal_Int16               meRelativeHeightRelation;
     226             : 
     227      116421 :     Impl() :
     228             :         meRelativeWidthRelation(text::RelOrientation::PAGE_FRAME),
     229      116421 :         meRelativeHeightRelation(text::RelOrientation::PAGE_FRAME) {}
     230             : };
     231             : 
     232             : 
     233             : // BaseProperties section
     234             : 
     235           0 : sdr::properties::BaseProperties* SdrObject::CreateObjectSpecificProperties()
     236             : {
     237           0 :     return new sdr::properties::EmptyProperties(*this);
     238             : }
     239             : 
     240     6843098 : sdr::properties::BaseProperties& SdrObject::GetProperties() const
     241             : {
     242     6843098 :     if(!mpProperties)
     243             :     {
     244             :         const_cast< SdrObject* >(this)->mpProperties =
     245      108603 :             const_cast< SdrObject* >(this)->CreateObjectSpecificProperties();
     246             :     }
     247             : 
     248     6843098 :     return *mpProperties;
     249             : }
     250             : 
     251             : 
     252             : // ObjectUser section
     253             : 
     254      113773 : void SdrObject::AddObjectUser(sdr::ObjectUser& rNewUser)
     255             : {
     256      113773 :     mpImpl->maObjectUsers.push_back(&rNewUser);
     257      113773 : }
     258             : 
     259      189113 : void SdrObject::RemoveObjectUser(sdr::ObjectUser& rOldUser)
     260             : {
     261             :     const sdr::ObjectUserVector::iterator aFindResult =
     262      189113 :         std::find(mpImpl->maObjectUsers.begin(), mpImpl->maObjectUsers.end(), &rOldUser);
     263      189113 :     if (aFindResult != mpImpl->maObjectUsers.end())
     264             :     {
     265       98802 :         mpImpl->maObjectUsers.erase(aFindResult);
     266             :     }
     267      189113 : }
     268             : 
     269             : 
     270             : // DrawContact section
     271             : 
     272           0 : sdr::contact::ViewContact* SdrObject::CreateObjectSpecificViewContact()
     273             : {
     274           0 :     return new sdr::contact::ViewContactOfSdrObj(*this);
     275             : }
     276             : 
     277     2264584 : sdr::contact::ViewContact& SdrObject::GetViewContact() const
     278             : {
     279     2264584 :     if(!mpViewContact)
     280             :     {
     281             :         const_cast< SdrObject* >(this)->mpViewContact =
     282      115627 :             const_cast< SdrObject* >(this)->CreateObjectSpecificViewContact();
     283             :     }
     284             : 
     285     2264584 :     return *mpViewContact;
     286             : }
     287             : 
     288             : // DrawContact support: Methods for handling Object changes
     289     1350473 : void SdrObject::ActionChanged() const
     290             : {
     291             :     // Do necessary ViewContact actions
     292     1350473 :     GetViewContact().ActionChanged();
     293     1350473 : }
     294             : 
     295             : 
     296             : 
     297     3057863 : void SdrObject::SetBoundRectDirty()
     298             : {
     299     3057863 :     aOutRect = Rectangle();
     300     3057863 : }
     301             : 
     302             : 
     303             : 
     304     7254077 : TYPEINIT1(SdrObject,SfxListener);
     305             : 
     306      116421 : SdrObject::SdrObject() :
     307      116421 :     mpImpl(new Impl),
     308             :     mpProperties(0L)
     309             :     ,mpViewContact(0L)
     310             :     ,pObjList(NULL)
     311             :     ,pPage(NULL)
     312             :     ,pModel(NULL)
     313             :     ,pUserCall(NULL)
     314             :     ,pPlusData(NULL)
     315             :     ,nOrdNum(0)
     316             :     ,pGrabBagItem(NULL)
     317             :     ,mnNavigationPosition(SAL_MAX_UINT32)
     318             :     ,mnLayerID(0)
     319             :     ,mpSvxShape( NULL )
     320             :     ,maWeakUnoShape()
     321      232842 :     ,mbDoNotInsertIntoPageAutomatically(false)
     322             : {
     323      116421 :     bVirtObj         =false;
     324      116421 :     bSnapRectDirty   =true;
     325      116421 :     bNetLock         =false;
     326      116421 :     bInserted        =false;
     327      116421 :     bGrouped         =false;
     328      116421 :     bMovProt         =false;
     329      116421 :     bSizProt         =false;
     330      116421 :     bNoPrint         =false;
     331      116421 :     bEmptyPresObj    =false;
     332      116421 :     bNotVisibleAsMaster=false;
     333      116421 :     bClosedObj       =false;
     334      116421 :     mbVisible        = true;
     335             : 
     336             :     // #i25616#
     337      116421 :     mbLineIsOutsideGeometry = false;
     338             : 
     339             :     // #i25616#
     340      116421 :     mbSupportTextIndentingOnLineWidthChange = false;
     341             : 
     342      116421 :     bNotMasterCachable=false;
     343      116421 :     bIsEdge=false;
     344      116421 :     bIs3DObj=false;
     345      116421 :     bMarkProt=false;
     346      116421 :     bIsUnoObj=false;
     347      116421 : }
     348             : 
     349      230472 : SdrObject::~SdrObject()
     350             : {
     351             :     // tell all the registered ObjectUsers that the page is in destruction
     352      115236 :     sdr::ObjectUserVector aListCopy(mpImpl->maObjectUsers.begin(), mpImpl->maObjectUsers.end());
     353      129949 :     for(sdr::ObjectUserVector::iterator aIterator = aListCopy.begin(); aIterator != aListCopy.end(); ++aIterator)
     354             :     {
     355       14713 :         sdr::ObjectUser* pObjectUser = *aIterator;
     356             :         DBG_ASSERT(pObjectUser, "SdrObject::~SdrObject: corrupt ObjectUser list (!)");
     357       14713 :         pObjectUser->ObjectInDestruction(*this);
     358             :     }
     359             : 
     360             :     // Clear the vector. This means that user do not need to call RemoveObjectUser()
     361             :     // when they get called from ObjectInDestruction().
     362      115236 :     mpImpl->maObjectUsers.clear();
     363             : 
     364             :     try
     365             :     {
     366      115236 :         SvxShape* pSvxShape = getSvxShape();
     367      115236 :         if ( pSvxShape )
     368             :         {
     369             :             OSL_ENSURE(!pSvxShape->HasSdrObjectOwnership(),"Please check where this call come from and replace it with SdrObject::Free");
     370           9 :             pSvxShape->InvalidateSdrObject();
     371           9 :             uno::Reference< lang::XComponent > xShapeComp( getWeakUnoShape(), uno::UNO_QUERY_THROW );
     372           9 :             xShapeComp->dispose();
     373             :         }
     374             :     }
     375           0 :     catch( const uno::Exception& )
     376             :     {
     377             :         DBG_UNHANDLED_EXCEPTION();
     378             :     }
     379             : 
     380      115236 :     SendUserCall(SDRUSERCALL_DELETE, GetLastBoundRect());
     381      115236 :     delete pPlusData;
     382             : 
     383      115236 :     delete pGrabBagItem;
     384             : 
     385      115236 :     if(mpProperties)
     386             :     {
     387      108189 :         delete mpProperties;
     388      108189 :         mpProperties = 0L;
     389             :     }
     390             : 
     391      115236 :     if(mpViewContact)
     392             :     {
     393      114443 :         delete mpViewContact;
     394      114443 :         mpViewContact = 0L;
     395             :     }
     396             : 
     397      115236 :     delete mpImpl;
     398      115236 : }
     399             : 
     400      303342 : void SdrObject::Free( SdrObject*& _rpObject )
     401             : {
     402      303342 :     SdrObject* pObject = _rpObject; _rpObject = NULL;
     403      303342 :     if ( pObject == NULL )
     404             :         // nothing to do
     405      193214 :         return;
     406             : 
     407      110128 :     SvxShape* pShape = pObject->getSvxShape();
     408      110128 :     if ( pShape && pShape->HasSdrObjectOwnership() )
     409             :         // only the shape is allowed to delete me, and will reset the ownership before doing so
     410           0 :         return;
     411             : 
     412      110128 :     delete pObject;
     413             : }
     414             : 
     415       54442 : SdrObjPlusData* SdrObject::NewPlusData()
     416             : {
     417       54442 :     return new SdrObjPlusData;
     418             : }
     419             : 
     420     3237917 : void SdrObject::SetRectsDirty(bool bNotMyself)
     421             : {
     422     3237917 :     if (!bNotMyself) {
     423     2422988 :         SetBoundRectDirty();
     424     2422988 :         bSnapRectDirty=true;
     425             :     }
     426     3237917 :     if (pObjList!=NULL) {
     427     2815833 :         pObjList->SetRectsDirty();
     428             :     }
     429     3237917 : }
     430             : 
     431      169826 : void SdrObject::SetModel(SdrModel* pNewModel)
     432             : {
     433      169826 :     if(pNewModel && pPage)
     434             :     {
     435      163047 :         if(pPage->GetModel() != pNewModel)
     436             :         {
     437           0 :             pPage = NULL;
     438             :         }
     439             :     }
     440             : 
     441             :     // update listeners at possible API wrapper object
     442      169826 :     if( pModel != pNewModel )
     443             :     {
     444      110271 :         SvxShape* pShape = getSvxShape();
     445      110271 :         if( pShape )
     446         331 :             pShape->ChangeModel( pNewModel );
     447             :     }
     448             : 
     449      169826 :     pModel = pNewModel;
     450      169826 : }
     451             : 
     452             : 
     453      141784 : void SdrObject::SetObjList(SdrObjList* pNewObjList)
     454             : {
     455      141784 :     pObjList=pNewObjList;
     456      141784 : }
     457             : 
     458             : 
     459      293214 : void SdrObject::SetPage(SdrPage* pNewPage)
     460             : {
     461      293214 :     SdrModel* pOldModel = pModel;
     462      293214 :     SdrPage* pOldPage = pPage;
     463             : 
     464      293214 :     pPage=pNewPage;
     465      293214 :     if (pPage!=NULL) {
     466      204551 :         SdrModel* pMod=pPage->GetModel();
     467      204551 :         if (pMod!=pModel && pMod!=NULL) {
     468      105372 :             SetModel(pMod);
     469             :         }}
     470             : 
     471             :     // The creation of the UNO shape in SdrObject::getUnoShape is influenced
     472             :     // by pPage, so when the page changes we need to discard the cached UNO
     473             :     // shape so that a new one will be created.
     474             :     // If the page is changing to another page with the same model, we
     475             :     // assume they create compatible UNO shape objects so we shouldn't have
     476             :     // to invalidate.
     477      293214 :     if (pOldPage != pPage && !(pOldPage && pPage && pOldModel == pModel))
     478             :     {
     479      193938 :         SvxShape* const pShape(getSvxShape());
     480      193938 :         if (pShape && !pShape->HasSdrObjectOwnership())
     481       27284 :             setUnoShape(NULL);
     482             :     }
     483      293214 : }
     484             : 
     485             : 
     486             : // init global static itempool
     487             : SdrItemPool* SdrObject::mpGlobalItemPool = NULL;
     488             : 
     489      402710 : SdrItemPool& SdrObject::GetGlobalDrawObjectItemPool()
     490             : {
     491      402710 :     if(!mpGlobalItemPool)
     492             :     {
     493          89 :         mpGlobalItemPool = new SdrItemPool();
     494          89 :         SfxItemPool* pGlobalOutlPool = EditEngine::CreatePool();
     495          89 :         mpGlobalItemPool->SetSecondaryPool(pGlobalOutlPool);
     496          89 :         mpGlobalItemPool->SetDefaultMetric((SfxMapUnit)SdrEngineDefaults::GetMapUnit());
     497          89 :         mpGlobalItemPool->FreezeIdRanges();
     498             :     }
     499             : 
     500      402710 :     return *mpGlobalItemPool;
     501             : }
     502             : 
     503          65 : void SdrObject::SetRelativeWidth( double nValue )
     504             : {
     505          65 :     mpImpl->mnRelativeWidth.reset( nValue );
     506          65 : }
     507             : 
     508         401 : void SdrObject::SetRelativeWidthRelation( sal_Int16 eValue )
     509             : {
     510         401 :     mpImpl->meRelativeWidthRelation = eValue;
     511         401 : }
     512             : 
     513          61 : void SdrObject::SetRelativeHeight( double nValue )
     514             : {
     515          61 :     mpImpl->mnRelativeHeight.reset( nValue );
     516          61 : }
     517             : 
     518         399 : void SdrObject::SetRelativeHeightRelation( sal_Int16 eValue )
     519             : {
     520         399 :     mpImpl->meRelativeHeightRelation = eValue;
     521         399 : }
     522             : 
     523        5560 : const double* SdrObject::GetRelativeWidth( ) const
     524             : {
     525        5560 :     if (!mpImpl->mnRelativeWidth)
     526        4905 :         return NULL;
     527             : 
     528         655 :     return &mpImpl->mnRelativeWidth.get();
     529             : }
     530             : 
     531         252 : sal_Int16 SdrObject::GetRelativeWidthRelation() const
     532             : {
     533         252 :     return mpImpl->meRelativeWidthRelation;
     534             : }
     535             : 
     536        5328 : const double* SdrObject::GetRelativeHeight( ) const
     537             : {
     538        5328 :     if (!mpImpl->mnRelativeHeight)
     539        4897 :         return NULL;
     540             : 
     541         431 :     return &mpImpl->mnRelativeHeight.get();
     542             : }
     543             : 
     544         221 : sal_Int16 SdrObject::GetRelativeHeightRelation() const
     545             : {
     546         221 :     return mpImpl->meRelativeHeightRelation;
     547             : }
     548             : 
     549      679983 : SfxItemPool & SdrObject::GetObjectItemPool() const
     550             : {
     551      679983 :     if(pModel)
     552      444626 :         return pModel->GetItemPool();
     553             : 
     554             :     // use a static global default pool
     555      235357 :     return SdrObject::GetGlobalDrawObjectItemPool();
     556             : }
     557             : 
     558     1290117 : sal_uInt32 SdrObject::GetObjInventor()   const
     559             : {
     560     1290117 :     return SdrInventor;
     561             : }
     562             : 
     563           0 : sal_uInt16 SdrObject::GetObjIdentifier() const
     564             : {
     565           0 :     return sal_uInt16(OBJ_NONE);
     566             : }
     567             : 
     568           0 : void SdrObject::TakeObjInfo(SdrObjTransformInfoRec& rInfo) const
     569             : {
     570           0 :     rInfo.bRotateFreeAllowed=false;
     571           0 :     rInfo.bMirrorFreeAllowed=false;
     572           0 :     rInfo.bTransparenceAllowed = false;
     573           0 :     rInfo.bGradientAllowed = false;
     574           0 :     rInfo.bShearAllowed     =false;
     575           0 :     rInfo.bEdgeRadiusAllowed=false;
     576           0 :     rInfo.bCanConvToPath    =false;
     577           0 :     rInfo.bCanConvToPoly    =false;
     578           0 :     rInfo.bCanConvToContour = false;
     579           0 :     rInfo.bCanConvToPathLineToArea=false;
     580           0 :     rInfo.bCanConvToPolyLineToArea=false;
     581           0 : }
     582             : 
     583     2086085 : SdrLayerID SdrObject::GetLayer() const
     584             : {
     585     2086085 :     return mnLayerID;
     586             : }
     587             : 
     588      300056 : void SdrObject::getMergedHierarchyLayerSet(SetOfByte& rSet) const
     589             : {
     590      300056 :     rSet.Set(GetLayer());
     591      300056 :     SdrObjList* pOL=GetSubList();
     592      300056 :     if (pOL!=NULL) {
     593      108522 :         const size_t nObjCount = pOL->GetObjCount();
     594      387460 :         for (size_t nObjNum = 0; nObjNum<nObjCount; ++nObjNum) {
     595      278938 :             pOL->GetObj(nObjNum)->getMergedHierarchyLayerSet(rSet);
     596             :         }
     597             :     }
     598      300056 : }
     599             : 
     600       32419 : void SdrObject::NbcSetLayer(SdrLayerID nLayer)
     601             : {
     602       32419 :     mnLayerID = nLayer;
     603       32419 : }
     604             : 
     605       23980 : void SdrObject::SetLayer(SdrLayerID nLayer)
     606             : {
     607       23980 :     NbcSetLayer(nLayer);
     608       23980 :     SetChanged();
     609       23980 :     BroadcastObjectChange();
     610       23980 : }
     611             : 
     612        2333 : void SdrObject::AddListener(SfxListener& rListener)
     613             : {
     614        2333 :     ImpForcePlusData();
     615        2333 :     if (pPlusData->pBroadcast==NULL) pPlusData->pBroadcast=new SfxBroadcaster;
     616        2333 :     rListener.StartListening(*pPlusData->pBroadcast);
     617        2333 : }
     618             : 
     619        2333 : void SdrObject::RemoveListener(SfxListener& rListener)
     620             : {
     621        2333 :     if (pPlusData!=NULL && pPlusData->pBroadcast!=NULL) {
     622        2333 :         rListener.EndListening(*pPlusData->pBroadcast);
     623        2333 :         if (!pPlusData->pBroadcast->HasListeners()) {
     624        1732 :             delete pPlusData->pBroadcast;
     625        1732 :             pPlusData->pBroadcast=NULL;
     626             :         }
     627             :     }
     628        2333 : }
     629             : 
     630         304 : const SfxBroadcaster* SdrObject::GetBroadcaster() const
     631             : {
     632         304 :     return pPlusData!=NULL ? pPlusData->pBroadcast : NULL;
     633             : }
     634             : 
     635        2327 : void SdrObject::AddReference(SdrVirtObj& rVrtObj)
     636             : {
     637        2327 :     AddListener(rVrtObj);
     638        2327 : }
     639             : 
     640        2327 : void SdrObject::DelReference(SdrVirtObj& rVrtObj)
     641             : {
     642        2327 :     RemoveListener(rVrtObj);
     643        2327 : }
     644             : 
     645           0 : bool SdrObject::HasRefPoint() const
     646             : {
     647           0 :     return false;
     648             : }
     649             : 
     650           0 : Point SdrObject::GetRefPoint() const
     651             : {
     652           0 :     return GetCurrentBoundRect().Center();
     653             : }
     654             : 
     655           0 : void SdrObject::SetRefPoint(const Point& /*rPnt*/)
     656             : {
     657           0 : }
     658             : 
     659      161165 : bool SdrObject::IsGroupObject() const
     660             : {
     661      161165 :     return GetSubList()!=NULL;
     662             : }
     663             : 
     664      596010 : SdrObjList* SdrObject::GetSubList() const
     665             : {
     666      596010 :     return NULL;
     667             : }
     668             : 
     669       24781 : SdrObject* SdrObject::GetUpGroup() const
     670             : {
     671       24781 :     return pObjList!=NULL ? pObjList->GetOwnerObj() : NULL;
     672             : }
     673             : 
     674       46036 : void SdrObject::SetName(const OUString& rStr)
     675             : {
     676       46036 :     if (!rStr.isEmpty() && !pPlusData)
     677             :     {
     678       43223 :         ImpForcePlusData();
     679             :     }
     680             : 
     681       46036 :     if(pPlusData && !pPlusData->aObjName.equals(rStr))
     682             :     {
     683             :         // Undo/Redo for setting object's name (#i73249#)
     684       43689 :         bool bUndo( false );
     685       43689 :         if ( GetModel() && GetModel()->IsUndoEnabled() )
     686             :         {
     687         704 :             bUndo = true;
     688             :             SdrUndoAction* pUndoAction =
     689             :                     SdrUndoFactory::CreateUndoObjectStrAttr(
     690             :                                                     *this,
     691             :                                                     SdrUndoObjStrAttr::OBJ_NAME,
     692             :                                                     GetName(),
     693         704 :                                                     rStr );
     694         704 :             GetModel()->BegUndo( pUndoAction->GetComment() );
     695         704 :             GetModel()->AddUndo( pUndoAction );
     696             :         }
     697       43689 :         pPlusData->aObjName = rStr;
     698             :         // Undo/Redo for setting object's name (#i73249#)
     699       43689 :         if ( bUndo )
     700             :         {
     701         704 :             GetModel()->EndUndo();
     702             :         }
     703       43689 :         SetChanged();
     704       43689 :         BroadcastObjectChange();
     705             :     }
     706       46036 : }
     707             : 
     708      182199 : OUString SdrObject::GetName() const
     709             : {
     710      182199 :     if(pPlusData)
     711             :     {
     712      107896 :         return pPlusData->aObjName;
     713             :     }
     714             : 
     715       74303 :     return OUString();
     716             : }
     717             : 
     718        1849 : void SdrObject::SetTitle(const OUString& rStr)
     719             : {
     720        1849 :     if (!rStr.isEmpty() && !pPlusData)
     721             :     {
     722           5 :         ImpForcePlusData();
     723             :     }
     724             : 
     725        1849 :     if(pPlusData && pPlusData->aObjTitle != rStr)
     726             :     {
     727             :         // Undo/Redo for setting object's title (#i73249#)
     728          14 :         bool bUndo( false );
     729          14 :         if ( GetModel() && GetModel()->IsUndoEnabled() )
     730             :         {
     731           0 :             bUndo = true;
     732             :             SdrUndoAction* pUndoAction =
     733             :                     SdrUndoFactory::CreateUndoObjectStrAttr(
     734             :                                                     *this,
     735             :                                                     SdrUndoObjStrAttr::OBJ_TITLE,
     736             :                                                     GetTitle(),
     737           0 :                                                     rStr );
     738           0 :             GetModel()->BegUndo( pUndoAction->GetComment() );
     739           0 :             GetModel()->AddUndo( pUndoAction );
     740             :         }
     741          14 :         pPlusData->aObjTitle = rStr;
     742             :         // Undo/Redo for setting object's title (#i73249#)
     743          14 :         if ( bUndo )
     744             :         {
     745           0 :             GetModel()->EndUndo();
     746             :         }
     747          14 :         SetChanged();
     748          14 :         BroadcastObjectChange();
     749             :     }
     750        1849 : }
     751             : 
     752      105088 : OUString SdrObject::GetTitle() const
     753             : {
     754      105088 :     if(pPlusData)
     755             :     {
     756       44454 :         return pPlusData->aObjTitle;
     757             :     }
     758             : 
     759       60634 :     return OUString();
     760             : }
     761             : 
     762        1957 : void SdrObject::SetDescription(const OUString& rStr)
     763             : {
     764        1957 :     if (!rStr.isEmpty() && !pPlusData)
     765             :     {
     766         206 :         ImpForcePlusData();
     767             :     }
     768             : 
     769        1957 :     if(pPlusData && !pPlusData->aObjDescription.equals(rStr))
     770             :     {
     771             :         // Undo/Redo for setting object's description (#i73249#)
     772         222 :         bool bUndo( false );
     773         222 :         if ( GetModel() && GetModel()->IsUndoEnabled() )
     774             :         {
     775           0 :             bUndo = true;
     776             :             SdrUndoAction* pUndoAction =
     777             :                     SdrUndoFactory::CreateUndoObjectStrAttr(
     778             :                                                     *this,
     779             :                                                     SdrUndoObjStrAttr::OBJ_DESCRIPTION,
     780             :                                                     GetDescription(),
     781           0 :                                                     rStr );
     782           0 :             GetModel()->BegUndo( pUndoAction->GetComment() );
     783           0 :             GetModel()->AddUndo( pUndoAction );
     784             :         }
     785         222 :         pPlusData->aObjDescription = rStr;
     786             :         // Undo/Redo for setting object's description (#i73249#)
     787         222 :         if ( bUndo )
     788             :         {
     789           0 :             GetModel()->EndUndo();
     790             :         }
     791         222 :         SetChanged();
     792         222 :         BroadcastObjectChange();
     793             :     }
     794        1957 : }
     795             : 
     796      105414 : OUString SdrObject::GetDescription() const
     797             : {
     798      105414 :     if(pPlusData)
     799             :     {
     800       44684 :         return pPlusData->aObjDescription;
     801             :     }
     802             : 
     803       60730 :     return OUString();
     804             : }
     805             : 
     806       49835 : sal_uInt32 SdrObject::GetOrdNum() const
     807             : {
     808       49835 :     if (pObjList!=NULL) {
     809       49835 :         if (pObjList->IsObjOrdNumsDirty()) {
     810       20070 :             pObjList->RecalcObjOrdNums();
     811             :         }
     812           0 :     } else const_cast<SdrObject*>(this)->nOrdNum=0;
     813       49835 :     return nOrdNum;
     814             : }
     815             : 
     816             : 
     817      364478 : void SdrObject::SetOrdNum(sal_uInt32 nNum)
     818             : {
     819      364478 :     nOrdNum = nNum;
     820      364478 : }
     821             : 
     822       15349 : void SdrObject::GetGrabBagItem(com::sun::star::uno::Any& rVal) const
     823             : {
     824       15349 :     if (pGrabBagItem != NULL)
     825       10419 :         pGrabBagItem->QueryValue(rVal);
     826             :     else {
     827        4930 :         uno::Sequence<beans::PropertyValue> aValue(0);
     828        4930 :         rVal = uno::makeAny(aValue);
     829             :     }
     830       15349 : }
     831             : 
     832        7340 : void SdrObject::SetGrabBagItem(const com::sun::star::uno::Any& rVal)
     833             : {
     834        7340 :     if (pGrabBagItem == NULL)
     835        2721 :         pGrabBagItem = new SfxGrabBagItem;
     836             : 
     837        7340 :     pGrabBagItem->PutValue(rVal);
     838             : 
     839        7340 :     SetChanged();
     840        7340 :     BroadcastObjectChange();
     841        7340 : }
     842             : 
     843         347 : sal_uInt32 SdrObject::GetNavigationPosition()
     844             : {
     845         347 :     if (pObjList!=NULL && pObjList->RecalcNavigationPositions())
     846             :     {
     847           0 :         return mnNavigationPosition;
     848             :     }
     849             :     else
     850         347 :         return GetOrdNum();
     851             : }
     852             : 
     853             : 
     854             : 
     855             : 
     856           0 : void SdrObject::SetNavigationPosition (const sal_uInt32 nNewPosition)
     857             : {
     858           0 :     mnNavigationPosition = nNewPosition;
     859           0 : }
     860             : 
     861             : 
     862             : 
     863             : 
     864             : // To make clearer that this method may trigger RecalcBoundRect and thus may be
     865             : // expensive and sometimes problematic (inside a bigger object change you will get
     866             : // non-useful BoundRects sometimes) I rename that method from GetBoundRect() to
     867             : // GetCurrentBoundRect().
     868      227483 : const Rectangle& SdrObject::GetCurrentBoundRect() const
     869             : {
     870      227483 :     if(aOutRect.IsEmpty())
     871             :     {
     872       98522 :         const_cast< SdrObject* >(this)->RecalcBoundRect();
     873             :     }
     874             : 
     875      227483 :     return aOutRect;
     876             : }
     877             : 
     878             : // To have a possibility to get the last calculated BoundRect e.g for producing
     879             : // the first rectangle for repaints (old and new need to be used) without forcing
     880             : // a RecalcBoundRect (which may be problematical and expensive sometimes) I add here
     881             : // a new method for accessing the last BoundRect.
     882      878806 : const Rectangle& SdrObject::GetLastBoundRect() const
     883             : {
     884      878806 :     return aOutRect;
     885             : }
     886             : 
     887      106156 : void SdrObject::RecalcBoundRect()
     888             : {
     889             :     // #i101680# suppress BoundRect calculations on import(s)
     890      106156 :     if(pModel && pModel->isLocked())
     891       61646 :         return;
     892             : 
     893             :     // central new method which will calculate the BoundRect using primitive geometry
     894       44510 :     if(aOutRect.IsEmpty())
     895             :     {
     896       43953 :         const drawinglayer::primitive2d::Primitive2DSequence xPrimitives(GetViewContact().getViewIndependentPrimitive2DSequence());
     897             : 
     898       43953 :         if(xPrimitives.hasElements())
     899             :         {
     900             :             // use neutral ViewInformation and get the range of the primitives
     901       41324 :             const drawinglayer::geometry::ViewInformation2D aViewInformation2D;
     902       41324 :             const basegfx::B2DRange aRange(drawinglayer::primitive2d::getB2DRangeFromPrimitive2DSequence(xPrimitives, aViewInformation2D));
     903             : 
     904       41324 :             if(!aRange.isEmpty())
     905             :             {
     906             :                 aOutRect = Rectangle(
     907       40958 :                     static_cast<long>(floor(aRange.getMinX())),
     908       40958 :                     static_cast<long>(floor(aRange.getMinY())),
     909       40958 :                     static_cast<long>(ceil(aRange.getMaxX())),
     910      163832 :                     static_cast<long>(ceil(aRange.getMaxY())));
     911       40958 :                 aOutRect -= GetGridOffset(); // don't include grid offset
     912       40958 :                 return;
     913         366 :             }
     914        2995 :         }
     915             :     }
     916             : }
     917             : 
     918      968869 : void SdrObject::BroadcastObjectChange() const
     919             : {
     920      968869 :     if( pModel && pModel->isLocked() )
     921     1850348 :         return;
     922             : 
     923       87390 :     bool bPlusDataBroadcast(pPlusData && pPlusData->pBroadcast);
     924       87390 :     bool bObjectChange(IsInserted() && pModel);
     925             : 
     926       87390 :     if(bPlusDataBroadcast || bObjectChange)
     927             :     {
     928       70982 :         SdrHint aHint(*this);
     929             : 
     930       70982 :         if(bPlusDataBroadcast)
     931             :         {
     932          24 :             pPlusData->pBroadcast->Broadcast(aHint);
     933             :         }
     934             : 
     935       70982 :         if(bObjectChange)
     936             :         {
     937       70982 :             pModel->Broadcast(aHint);
     938       70982 :         }
     939             :     }
     940             : }
     941             : 
     942     1120106 : void SdrObject::SetChanged()
     943             : {
     944             :     // For testing purposes, use the new ViewContact for change
     945             :     // notification now.
     946     1120106 :     ActionChanged();
     947             : 
     948     1120106 :     if(IsInserted() && pModel)
     949             :     {
     950      769351 :         pModel->SetChanged();
     951             :     }
     952     1120106 : }
     953             : 
     954             : // tooling for painting a single object to an OutputDevice.
     955           1 : bool SdrObject::SingleObjectPainter(OutputDevice& rOut) const
     956             : {
     957           1 :     sdr::contact::SdrObjectVector aObjectVector;
     958           1 :     aObjectVector.push_back(const_cast< SdrObject* >(this));
     959             : 
     960           2 :     sdr::contact::ObjectContactOfObjListPainter aPainter(rOut, aObjectVector, GetPage());
     961           2 :     sdr::contact::DisplayInfo aDisplayInfo;
     962             : 
     963           1 :     aPainter.ProcessDisplay(aDisplayInfo);
     964             : 
     965           2 :     return true;
     966             : }
     967             : 
     968           4 : bool SdrObject::LineGeometryUsageIsNecessary() const
     969             : {
     970           4 :     drawing::LineStyle eXLS = (drawing::LineStyle)static_cast<const XLineStyleItem&>(GetMergedItem(XATTR_LINESTYLE)).GetValue();
     971           4 :     return (eXLS != drawing::LineStyle_NONE);
     972             : }
     973             : 
     974           0 : SdrObject* SdrObject::Clone() const
     975             : {
     976           0 :     return CloneHelper< SdrObject >();
     977             : }
     978             : 
     979           0 : SdrObject* SdrObject::CloneWithShellIDs( const OUString& /*rSrcShellID*/, const OUString& /*rDestShellID*/ ) const
     980             : {
     981           0 :     return Clone();
     982             : }
     983             : 
     984         734 : SdrObject& SdrObject::operator=(const SdrObject& rObj)
     985             : {
     986         734 :     if( this == &rObj )
     987           0 :         return *this;
     988             : 
     989         734 :     if(mpProperties)
     990             :     {
     991           0 :         delete mpProperties;
     992           0 :         mpProperties = 0L;
     993             :     }
     994             : 
     995         734 :     if(mpViewContact)
     996             :     {
     997           0 :         delete mpViewContact;
     998           0 :         mpViewContact = 0L;
     999             :     }
    1000             : 
    1001             :     // The Clone() method uses the local copy constructor from the individual
    1002             :     // sdr::properties::BaseProperties class. Since the target class maybe for another
    1003             :     // draw object, an SdrObject needs to be provided, as in the normal constructor.
    1004         734 :     mpProperties = &rObj.GetProperties().Clone(*this);
    1005             : 
    1006         734 :     pModel  =rObj.pModel;
    1007         734 :     pPage = rObj.pPage;
    1008         734 :     aOutRect=rObj.aOutRect;
    1009         734 :     mnLayerID = rObj.mnLayerID;
    1010         734 :     aAnchor =rObj.aAnchor;
    1011         734 :     bVirtObj=rObj.bVirtObj;
    1012         734 :     bSizProt=rObj.bSizProt;
    1013         734 :     bMovProt=rObj.bMovProt;
    1014         734 :     bNoPrint=rObj.bNoPrint;
    1015         734 :     mbVisible=rObj.mbVisible;
    1016         734 :     bMarkProt=rObj.bMarkProt;
    1017         734 :     bEmptyPresObj =rObj.bEmptyPresObj;
    1018         734 :     bNotVisibleAsMaster=rObj.bNotVisibleAsMaster;
    1019         734 :     bSnapRectDirty=true;
    1020         734 :     bNotMasterCachable=rObj.bNotMasterCachable;
    1021         734 :     delete pPlusData;
    1022         734 :     pPlusData=NULL;
    1023         734 :     if (rObj.pPlusData!=NULL) {
    1024         200 :         pPlusData=rObj.pPlusData->Clone(this);
    1025             :     }
    1026         734 :     if (pPlusData!=NULL && pPlusData->pBroadcast!=NULL) {
    1027           0 :         delete pPlusData->pBroadcast; // broadcaster isn't copied
    1028           0 :         pPlusData->pBroadcast=NULL;
    1029             :     }
    1030             : 
    1031         734 :     delete pGrabBagItem;
    1032         734 :     pGrabBagItem=NULL;
    1033         734 :     if (rObj.pGrabBagItem!=NULL)
    1034         247 :         pGrabBagItem=static_cast< SfxGrabBagItem* >( rObj.pGrabBagItem->Clone() );
    1035             : 
    1036         734 :     aGridOffset = rObj.aGridOffset;
    1037         734 :     return *this;
    1038             : }
    1039             : 
    1040         116 : OUString SdrObject::TakeObjNameSingul() const
    1041             : {
    1042         116 :     OUStringBuffer sName(ImpGetResStr(STR_ObjNameSingulNONE));
    1043             : 
    1044         232 :     OUString aName(GetName());
    1045         116 :     if (!aName.isEmpty())
    1046             :     {
    1047           0 :         sName.append(' ');
    1048           0 :         sName.append('\'');
    1049           0 :         sName.append(aName);
    1050           0 :         sName.append('\'');
    1051             :     }
    1052         232 :     return sName.makeStringAndClear();
    1053             : }
    1054             : 
    1055           0 : OUString SdrObject::TakeObjNamePlural() const
    1056             : {
    1057           0 :     return ImpGetResStr(STR_ObjNamePluralNONE);
    1058             : }
    1059             : 
    1060           1 : void SdrObject::ImpTakeDescriptionStr(sal_uInt16 nStrCacheID, OUString& rStr, sal_uInt16 nVal) const
    1061             : {
    1062           1 :     rStr = ImpGetResStr(nStrCacheID);
    1063           1 :     sal_Int32 nPos = rStr.indexOf("%1");
    1064           1 :     if (nPos >= 0)
    1065             :     {
    1066             :         // Replace '%1' with the object name.
    1067           1 :         OUString aObjName(TakeObjNameSingul());
    1068           1 :         rStr = rStr.replaceAt(nPos, 2, aObjName);
    1069             :     }
    1070             : 
    1071           1 :     nPos = rStr.indexOf("%2");
    1072           1 :     if (nPos >= 0)
    1073             :         // Replace '%2' with the passed value.
    1074           0 :         rStr = rStr.replaceAt(
    1075           0 :             nPos, 2, OUString::number(nVal));
    1076           1 : }
    1077             : 
    1078       55809 : void SdrObject::ImpForcePlusData()
    1079             : {
    1080       55809 :     if (!pPlusData)
    1081       54442 :         pPlusData = NewPlusData();
    1082       55809 : }
    1083             : 
    1084           0 : OUString SdrObject::GetAngleStr(long nAngle, bool bNoDegChar) const
    1085             : {
    1086           0 :     OUString aStr;
    1087           0 :     if (pModel!=NULL) {
    1088           0 :         SdrModel::TakeAngleStr(nAngle,aStr,bNoDegChar);
    1089             :     }
    1090           0 :     return aStr;
    1091             : }
    1092             : 
    1093           0 : OUString SdrObject::GetMetrStr(long nVal, MapUnit /*eWantMap*/, bool bNoUnitChars) const
    1094             : {
    1095           0 :     OUString aStr;
    1096           0 :     if (pModel!=NULL) {
    1097           0 :         pModel->TakeMetricStr(nVal,aStr,bNoUnitChars);
    1098             :     }
    1099           0 :     return aStr;
    1100             : }
    1101             : 
    1102           0 : basegfx::B2DPolyPolygon SdrObject::TakeXorPoly() const
    1103             : {
    1104           0 :     basegfx::B2DPolyPolygon aRetval;
    1105           0 :     const Rectangle aR(GetCurrentBoundRect());
    1106           0 :     const basegfx::B2DRange aRange(aR.Left(), aR.Top(), aR.Right(), aR.Bottom());
    1107           0 :     aRetval.append(basegfx::tools::createPolygonFromRect(aRange));
    1108             : 
    1109           0 :     return aRetval;
    1110             : }
    1111             : 
    1112           9 : basegfx::B2DPolyPolygon SdrObject::TakeContour() const
    1113             : {
    1114           9 :     basegfx::B2DPolyPolygon aRetval;
    1115             : 
    1116             :     // create cloned object without text, but with drawing::LineStyle_SOLID,
    1117             :     // COL_BLACK as line color and drawing::FillStyle_NONE
    1118           9 :     SdrObject* pClone = Clone();
    1119             : 
    1120           9 :     if(pClone)
    1121             :     {
    1122           9 :         const SdrTextObj* pTextObj = dynamic_cast< const SdrTextObj* >(this);
    1123             : 
    1124           9 :         if(pTextObj)
    1125             :         {
    1126             :             // no text and no text animation
    1127           9 :             pClone->SetMergedItem(SdrTextAniKindItem(SDRTEXTANI_NONE));
    1128           9 :             pClone->SetOutlinerParaObject(0);
    1129             :         }
    1130             : 
    1131           9 :         const SdrEdgeObj* pEdgeObj = dynamic_cast< const SdrEdgeObj* >(this);
    1132             : 
    1133           9 :         if(pEdgeObj)
    1134             :         {
    1135             :             // create connections if connector, will be cleaned up when
    1136             :             // deleting the connector again
    1137           0 :             SdrObject* pLeft = pEdgeObj->GetConnectedNode(true);
    1138           0 :             SdrObject* pRight = pEdgeObj->GetConnectedNode(false);
    1139             : 
    1140           0 :             if(pLeft)
    1141             :             {
    1142           0 :                 pClone->ConnectToNode(true, pLeft);
    1143             :             }
    1144             : 
    1145           0 :             if(pRight)
    1146             :             {
    1147           0 :                 pClone->ConnectToNode(false, pRight);
    1148             :             }
    1149             :         }
    1150             : 
    1151           9 :         SfxItemSet aNewSet(GetObjectItemPool());
    1152             : 
    1153             :         // #i101980# ignore LineWidth; that's what the old implementation
    1154             :         // did. With line width, the result may be huge due to fat/thick
    1155             :         // line decompositions
    1156           9 :         aNewSet.Put(XLineWidthItem(0));
    1157             : 
    1158             :         // solid black lines and no fill
    1159           9 :         aNewSet.Put(XLineStyleItem(drawing::LineStyle_SOLID));
    1160           9 :         aNewSet.Put(XLineColorItem(OUString(), Color(COL_BLACK)));
    1161           9 :         aNewSet.Put(XFillStyleItem(drawing::FillStyle_NONE));
    1162           9 :         pClone->SetMergedItemSet(aNewSet);
    1163             : 
    1164             :         // get sequence from clone
    1165           9 :         const sdr::contact::ViewContact& rVC(pClone->GetViewContact());
    1166          18 :         const drawinglayer::primitive2d::Primitive2DSequence xSequence(rVC.getViewIndependentPrimitive2DSequence());
    1167             : 
    1168           9 :         if(xSequence.hasElements())
    1169             :         {
    1170             :             // use neutral ViewInformation
    1171           9 :             const drawinglayer::geometry::ViewInformation2D aViewInformation2D;
    1172             : 
    1173             :             // create extractor, process and get result (with hairlines as opened polygons)
    1174          18 :             drawinglayer::processor2d::ContourExtractor2D aExtractor(aViewInformation2D, false);
    1175           9 :             aExtractor.process(xSequence);
    1176           9 :             const basegfx::B2DPolyPolygonVector& rResult(aExtractor.getExtractedContour());
    1177           9 :             const sal_uInt32 nSize(rResult.size());
    1178             : 
    1179             :             // when count is one, it is implied that the object has only its normal
    1180             :             // contour anyways and TakeCountour() is to return an empty PolyPolygon
    1181             :             // (see old implementation for historical reasons)
    1182           9 :             if(nSize > 1)
    1183             :             {
    1184             :                 // the topology for contour is correctly a vector of PolyPolygons; for
    1185             :                 // historical reasons cut it back to a single tools::PolyPolygon here
    1186           9 :                 for(sal_uInt32 a(0); a < nSize; a++)
    1187             :                 {
    1188           6 :                     aRetval.append(rResult[a]);
    1189             :                 }
    1190           9 :             }
    1191             :         }
    1192             : 
    1193          18 :         delete pClone;
    1194             :     }
    1195             : 
    1196           9 :     return aRetval;
    1197             : }
    1198             : 
    1199           0 : sal_uInt32 SdrObject::GetHdlCount() const
    1200             : {
    1201           0 :     return 8L;
    1202             : }
    1203             : 
    1204           0 : SdrHdl* SdrObject::GetHdl(sal_uInt32 nHdlNum) const
    1205             : {
    1206           0 :     SdrHdl* pH=NULL;
    1207           0 :     const Rectangle& rR=GetSnapRect();
    1208           0 :     switch (nHdlNum) {
    1209           0 :         case 0: pH=new SdrHdl(rR.TopLeft(),     HDL_UPLFT); break;
    1210           0 :         case 1: pH=new SdrHdl(rR.TopCenter(),   HDL_UPPER); break;
    1211           0 :         case 2: pH=new SdrHdl(rR.TopRight(),    HDL_UPRGT); break;
    1212           0 :         case 3: pH=new SdrHdl(rR.LeftCenter(),  HDL_LEFT ); break;
    1213           0 :         case 4: pH=new SdrHdl(rR.RightCenter(), HDL_RIGHT); break;
    1214           0 :         case 5: pH=new SdrHdl(rR.BottomLeft(),  HDL_LWLFT); break;
    1215           0 :         case 6: pH=new SdrHdl(rR.BottomCenter(),HDL_LOWER); break;
    1216           0 :         case 7: pH=new SdrHdl(rR.BottomRight(), HDL_LWRGT); break;
    1217             :     }
    1218           0 :     return pH;
    1219             : }
    1220             : 
    1221           0 : sal_uInt32 SdrObject::GetPlusHdlCount(const SdrHdl& /*rHdl*/) const
    1222             : {
    1223           0 :     return 0L;
    1224             : }
    1225             : 
    1226           0 : SdrHdl* SdrObject::GetPlusHdl(const SdrHdl& /*rHdl*/, sal_uInt32 /*nPlNum*/) const
    1227             : {
    1228           0 :     return 0L;
    1229             : }
    1230             : 
    1231          39 : void SdrObject::AddToHdlList(SdrHdlList& rHdlList) const
    1232             : {
    1233          39 :     sal_uInt32 nCount=GetHdlCount();
    1234         379 :     for (sal_uInt32 i=0L; i<nCount; i++) {
    1235         340 :         SdrHdl* pHdl=GetHdl(i);
    1236         340 :         if (pHdl!=NULL) {
    1237         340 :             rHdlList.AddHdl(pHdl);
    1238             :         }
    1239             :     }
    1240          39 : }
    1241             : 
    1242           0 : void SdrObject::addCropHandles(SdrHdlList& /*rTarget*/) const
    1243             : {
    1244             :     // Default implementation, does nothing. Overloaded in
    1245             :     // SdrGrafObj and SwVirtFlyDrawObj
    1246           0 : }
    1247             : 
    1248           0 : Rectangle SdrObject::ImpDragCalcRect(const SdrDragStat& rDrag) const
    1249             : {
    1250           0 :     Rectangle aTmpRect(GetSnapRect());
    1251           0 :     Rectangle aRect(aTmpRect);
    1252           0 :     const SdrHdl* pHdl=rDrag.GetHdl();
    1253           0 :     SdrHdlKind eHdl=pHdl==NULL ? HDL_MOVE : pHdl->GetKind();
    1254           0 :     bool bEcke=(eHdl==HDL_UPLFT || eHdl==HDL_UPRGT || eHdl==HDL_LWLFT || eHdl==HDL_LWRGT);
    1255           0 :     bool bOrtho=rDrag.GetView()!=NULL && rDrag.GetView()->IsOrtho();
    1256           0 :     bool bBigOrtho=bEcke && bOrtho && rDrag.GetView()->IsBigOrtho();
    1257           0 :     Point aPos(rDrag.GetNow());
    1258           0 :     bool bLft=(eHdl==HDL_UPLFT || eHdl==HDL_LEFT  || eHdl==HDL_LWLFT);
    1259           0 :     bool bRgt=(eHdl==HDL_UPRGT || eHdl==HDL_RIGHT || eHdl==HDL_LWRGT);
    1260           0 :     bool bTop=(eHdl==HDL_UPRGT || eHdl==HDL_UPPER || eHdl==HDL_UPLFT);
    1261           0 :     bool bBtm=(eHdl==HDL_LWRGT || eHdl==HDL_LOWER || eHdl==HDL_LWLFT);
    1262           0 :     if (bLft) aTmpRect.Left()  =aPos.X();
    1263           0 :     if (bRgt) aTmpRect.Right() =aPos.X();
    1264           0 :     if (bTop) aTmpRect.Top()   =aPos.Y();
    1265           0 :     if (bBtm) aTmpRect.Bottom()=aPos.Y();
    1266           0 :     if (bOrtho) { // Ortho
    1267           0 :         long nWdt0=aRect.Right() -aRect.Left();
    1268           0 :         long nHgt0=aRect.Bottom()-aRect.Top();
    1269           0 :         long nXMul=aTmpRect.Right() -aTmpRect.Left();
    1270           0 :         long nYMul=aTmpRect.Bottom()-aTmpRect.Top();
    1271           0 :         long nXDiv=nWdt0;
    1272           0 :         long nYDiv=nHgt0;
    1273           0 :         bool bXNeg=(nXMul<0)!=(nXDiv<0);
    1274           0 :         bool bYNeg=(nYMul<0)!=(nYDiv<0);
    1275           0 :         nXMul=std::abs(nXMul);
    1276           0 :         nYMul=std::abs(nYMul);
    1277           0 :         nXDiv=std::abs(nXDiv);
    1278           0 :         nYDiv=std::abs(nYDiv);
    1279           0 :         Fraction aXFact(nXMul,nXDiv); // fractions for canceling
    1280           0 :         Fraction aYFact(nYMul,nYDiv); // and for comparing
    1281           0 :         nXMul=aXFact.GetNumerator();
    1282           0 :         nYMul=aYFact.GetNumerator();
    1283           0 :         nXDiv=aXFact.GetDenominator();
    1284           0 :         nYDiv=aYFact.GetDenominator();
    1285           0 :         if (bEcke) { // corner point handles
    1286           0 :             bool bUseX=(aXFact<aYFact) != bBigOrtho;
    1287           0 :             if (bUseX) {
    1288           0 :                 long nNeed=long(BigInt(nHgt0)*BigInt(nXMul)/BigInt(nXDiv));
    1289           0 :                 if (bYNeg) nNeed=-nNeed;
    1290           0 :                 if (bTop) aTmpRect.Top()=aTmpRect.Bottom()-nNeed;
    1291           0 :                 if (bBtm) aTmpRect.Bottom()=aTmpRect.Top()+nNeed;
    1292             :             } else {
    1293           0 :                 long nNeed=long(BigInt(nWdt0)*BigInt(nYMul)/BigInt(nYDiv));
    1294           0 :                 if (bXNeg) nNeed=-nNeed;
    1295           0 :                 if (bLft) aTmpRect.Left()=aTmpRect.Right()-nNeed;
    1296           0 :                 if (bRgt) aTmpRect.Right()=aTmpRect.Left()+nNeed;
    1297             :             }
    1298             :         } else { // apex handles
    1299           0 :             if ((bLft || bRgt) && nXDiv!=0) {
    1300           0 :                 long nHgt0b=aRect.Bottom()-aRect.Top();
    1301           0 :                 long nNeed=long(BigInt(nHgt0b)*BigInt(nXMul)/BigInt(nXDiv));
    1302           0 :                 aTmpRect.Top()-=(nNeed-nHgt0b)/2;
    1303           0 :                 aTmpRect.Bottom()=aTmpRect.Top()+nNeed;
    1304             :             }
    1305           0 :             if ((bTop || bBtm) && nYDiv!=0) {
    1306           0 :                 long nWdt0b=aRect.Right()-aRect.Left();
    1307           0 :                 long nNeed=long(BigInt(nWdt0b)*BigInt(nYMul)/BigInt(nYDiv));
    1308           0 :                 aTmpRect.Left()-=(nNeed-nWdt0b)/2;
    1309           0 :                 aTmpRect.Right()=aTmpRect.Left()+nNeed;
    1310             :             }
    1311           0 :         }
    1312             :     }
    1313           0 :     aTmpRect.Justify();
    1314           0 :     return aTmpRect;
    1315             : }
    1316             : 
    1317             : 
    1318             : 
    1319         140 : bool SdrObject::hasSpecialDrag() const
    1320             : {
    1321         140 :     return false;
    1322             : }
    1323             : 
    1324           2 : bool SdrObject::supportsFullDrag() const
    1325             : {
    1326           2 :     return true;
    1327             : }
    1328             : 
    1329           4 : SdrObject* SdrObject::getFullDragClone() const
    1330             : {
    1331             :     // default uses simple clone
    1332           4 :     return Clone();
    1333             : }
    1334             : 
    1335           0 : bool SdrObject::beginSpecialDrag(SdrDragStat& rDrag) const
    1336             : {
    1337           0 :     const SdrHdl* pHdl = rDrag.GetHdl();
    1338             : 
    1339           0 :     SdrHdlKind eHdl = (pHdl == NULL) ? HDL_MOVE : pHdl->GetKind();
    1340             : 
    1341           0 :     if(eHdl==HDL_UPLFT || eHdl==HDL_UPPER || eHdl==HDL_UPRGT ||
    1342           0 :         eHdl==HDL_LEFT || eHdl==HDL_RIGHT || eHdl==HDL_LWLFT ||
    1343           0 :         eHdl==HDL_LOWER || eHdl==HDL_LWRGT)
    1344             :     {
    1345           0 :         return true;
    1346             :     }
    1347             : 
    1348           0 :     return false;
    1349             : }
    1350             : 
    1351           0 : bool SdrObject::applySpecialDrag(SdrDragStat& rDrag)
    1352             : {
    1353           0 :     Rectangle aNewRect(ImpDragCalcRect(rDrag));
    1354             : 
    1355           0 :     if(aNewRect != GetSnapRect())
    1356             :     {
    1357           0 :            NbcSetSnapRect(aNewRect);
    1358             :     }
    1359             : 
    1360           0 :     return true;
    1361             : }
    1362             : 
    1363           0 : OUString SdrObject::getSpecialDragComment(const SdrDragStat& /*rDrag*/) const
    1364             : {
    1365           0 :     return OUString();
    1366             : }
    1367             : 
    1368           2 : basegfx::B2DPolyPolygon SdrObject::getSpecialDragPoly(const SdrDragStat& /*rDrag*/) const
    1369             : {
    1370             :     // default has nothing to add
    1371           2 :     return basegfx::B2DPolyPolygon();
    1372             : }
    1373             : 
    1374             : 
    1375             : // Create
    1376           0 : bool SdrObject::BegCreate(SdrDragStat& rStat)
    1377             : {
    1378           0 :     rStat.SetOrtho4Possible();
    1379           0 :     Rectangle aRect1(rStat.GetStart(), rStat.GetNow());
    1380           0 :     aRect1.Justify();
    1381           0 :     rStat.SetActionRect(aRect1);
    1382           0 :     aOutRect = aRect1;
    1383           0 :     return true;
    1384             : }
    1385             : 
    1386           0 : bool SdrObject::MovCreate(SdrDragStat& rStat)
    1387             : {
    1388           0 :     rStat.TakeCreateRect(aOutRect);
    1389           0 :     rStat.SetActionRect(aOutRect);
    1390           0 :     aOutRect.Justify();
    1391             : 
    1392           0 :     return true;
    1393             : }
    1394             : 
    1395           0 : bool SdrObject::EndCreate(SdrDragStat& rStat, SdrCreateCmd eCmd)
    1396             : {
    1397           0 :     rStat.TakeCreateRect(aOutRect);
    1398           0 :     aOutRect.Justify();
    1399             : 
    1400           0 :     return (eCmd==SDRCREATE_FORCEEND || rStat.GetPointAnz()>=2);
    1401             : }
    1402             : 
    1403           0 : void SdrObject::BrkCreate(SdrDragStat& /*rStat*/)
    1404             : {
    1405           0 : }
    1406             : 
    1407           0 : bool SdrObject::BckCreate(SdrDragStat& /*rStat*/)
    1408             : {
    1409           0 :     return false;
    1410             : }
    1411             : 
    1412           0 : basegfx::B2DPolyPolygon SdrObject::TakeCreatePoly(const SdrDragStat& rDrag) const
    1413             : {
    1414           0 :     Rectangle aRect1;
    1415           0 :     rDrag.TakeCreateRect(aRect1);
    1416           0 :     aRect1.Justify();
    1417             : 
    1418           0 :     basegfx::B2DPolyPolygon aRetval;
    1419           0 :     const basegfx::B2DRange aRange(aRect1.Left(), aRect1.Top(), aRect1.Right(), aRect1.Bottom());
    1420           0 :     aRetval.append(basegfx::tools::createPolygonFromRect(aRange));
    1421           0 :     return aRetval;
    1422             : }
    1423             : 
    1424           0 : Pointer SdrObject::GetCreatePointer() const
    1425             : {
    1426           0 :     return Pointer(PointerStyle::Cross);
    1427             : }
    1428             : 
    1429             : // transformations
    1430        1733 : void SdrObject::NbcMove(const Size& rSiz)
    1431             : {
    1432        1733 :     MoveRect(aOutRect,rSiz);
    1433        1733 :     SetRectsDirty();
    1434        1733 : }
    1435             : 
    1436           0 : void SdrObject::NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact)
    1437             : {
    1438           0 :     bool bXMirr=(xFact.GetNumerator()<0) != (xFact.GetDenominator()<0);
    1439           0 :     bool bYMirr=(yFact.GetNumerator()<0) != (yFact.GetDenominator()<0);
    1440           0 :     if (bXMirr || bYMirr) {
    1441           0 :         Point aRef1(GetSnapRect().Center());
    1442           0 :         if (bXMirr) {
    1443           0 :             Point aRef2(aRef1);
    1444           0 :             aRef2.Y()++;
    1445           0 :             NbcMirrorGluePoints(aRef1,aRef2);
    1446             :         }
    1447           0 :         if (bYMirr) {
    1448           0 :             Point aRef2(aRef1);
    1449           0 :             aRef2.X()++;
    1450           0 :             NbcMirrorGluePoints(aRef1,aRef2);
    1451             :         }
    1452             :     }
    1453           0 :     ResizeRect(aOutRect,rRef,xFact,yFact);
    1454           0 :     SetRectsDirty();
    1455           0 : }
    1456             : 
    1457           0 : void SdrObject::NbcRotate(const Point& rRef, long nAngle, double sn, double cs)
    1458             : {
    1459           0 :     SetGlueReallyAbsolute(true);
    1460           0 :     aOutRect.Move(-rRef.X(),-rRef.Y());
    1461           0 :     Rectangle R(aOutRect);
    1462           0 :     if (sn==1.0 && cs==0.0) { // 90deg
    1463           0 :         aOutRect.Left()  =-R.Bottom();
    1464           0 :         aOutRect.Right() =-R.Top();
    1465           0 :         aOutRect.Top()   =R.Left();
    1466           0 :         aOutRect.Bottom()=R.Right();
    1467           0 :     } else if (sn==0.0 && cs==-1.0) { // 180deg
    1468           0 :         aOutRect.Left()  =-R.Right();
    1469           0 :         aOutRect.Right() =-R.Left();
    1470           0 :         aOutRect.Top()   =-R.Bottom();
    1471           0 :         aOutRect.Bottom()=-R.Top();
    1472           0 :     } else if (sn==-1.0 && cs==0.0) { // 270deg
    1473           0 :         aOutRect.Left()  =R.Top();
    1474           0 :         aOutRect.Right() =R.Bottom();
    1475           0 :         aOutRect.Top()   =-R.Right();
    1476           0 :         aOutRect.Bottom()=-R.Left();
    1477             :     }
    1478           0 :     aOutRect.Move(rRef.X(),rRef.Y());
    1479           0 :     aOutRect.Justify(); // just in case
    1480           0 :     SetRectsDirty();
    1481           0 :     NbcRotateGluePoints(rRef,nAngle,sn,cs);
    1482           0 :     SetGlueReallyAbsolute(false);
    1483           0 : }
    1484             : 
    1485           0 : void SdrObject::NbcMirror(const Point& rRef1, const Point& rRef2)
    1486             : {
    1487           0 :     SetGlueReallyAbsolute(true);
    1488           0 :     aOutRect.Move(-rRef1.X(),-rRef1.Y());
    1489           0 :     Rectangle R(aOutRect);
    1490           0 :     long dx=rRef2.X()-rRef1.X();
    1491           0 :     long dy=rRef2.Y()-rRef1.Y();
    1492           0 :     if (dx==0) {          // vertical axis
    1493           0 :         aOutRect.Left() =-R.Right();
    1494           0 :         aOutRect.Right()=-R.Left();
    1495           0 :     } else if (dy==0) {   // horizontal axis
    1496           0 :         aOutRect.Top()   =-R.Bottom();
    1497           0 :         aOutRect.Bottom()=-R.Top();
    1498           0 :     } else if (dx==dy) {  // 45deg axis
    1499           0 :         aOutRect.Left()  =R.Top();
    1500           0 :         aOutRect.Right() =R.Bottom();
    1501           0 :         aOutRect.Top()   =R.Left();
    1502           0 :         aOutRect.Bottom()=R.Right();
    1503           0 :     } else if (dx==-dy) { // 45deg axis
    1504           0 :         aOutRect.Left()  =-R.Bottom();
    1505           0 :         aOutRect.Right() =-R.Top();
    1506           0 :         aOutRect.Top()   =-R.Right();
    1507           0 :         aOutRect.Bottom()=-R.Left();
    1508             :     }
    1509           0 :     aOutRect.Move(rRef1.X(),rRef1.Y());
    1510           0 :     aOutRect.Justify(); // just in case
    1511           0 :     SetRectsDirty();
    1512           0 :     NbcMirrorGluePoints(rRef1,rRef2);
    1513           0 :     SetGlueReallyAbsolute(false);
    1514           0 : }
    1515             : 
    1516           0 : void SdrObject::NbcShear(const Point& rRef, long nAngle, double tn, bool bVShear)
    1517             : {
    1518           0 :     SetGlueReallyAbsolute(true);
    1519           0 :     NbcShearGluePoints(rRef,nAngle,tn,bVShear);
    1520           0 :     SetGlueReallyAbsolute(false);
    1521           0 : }
    1522             : 
    1523      152628 : void SdrObject::Move(const Size& rSiz)
    1524             : {
    1525      152628 :     if (rSiz.Width()!=0 || rSiz.Height()!=0) {
    1526       61182 :         Rectangle aBoundRect0; if (pUserCall!=NULL) aBoundRect0=GetLastBoundRect();
    1527       61182 :         NbcMove(rSiz);
    1528       61182 :         SetChanged();
    1529       61182 :         BroadcastObjectChange();
    1530       61182 :         SendUserCall(SDRUSERCALL_MOVEONLY,aBoundRect0);
    1531             :     }
    1532      152628 : }
    1533             : 
    1534           0 : void SdrObject::NbcCrop(const Point& /*rRef*/, const Fraction& /*xFact*/, const Fraction& /*yFact*/) {
    1535             :     // Default: does nothing. Real behaviour in SwVirtFlyDrawObj and SdrGrafObj
    1536           0 : }
    1537             : 
    1538         648 : void SdrObject::Resize(const Point& rRef, const Fraction& xFact, const Fraction& yFact, bool bUnsetRelative)
    1539             : {
    1540         648 :     if (xFact.GetNumerator()!=xFact.GetDenominator() || yFact.GetNumerator()!=yFact.GetDenominator()) {
    1541         648 :         if (bUnsetRelative)
    1542             :         {
    1543         519 :             mpImpl->mnRelativeWidth.reset();
    1544         519 :             mpImpl->meRelativeWidthRelation = text::RelOrientation::PAGE_FRAME;
    1545         519 :             mpImpl->meRelativeHeightRelation = text::RelOrientation::PAGE_FRAME;
    1546         519 :             mpImpl->mnRelativeHeight.reset();
    1547             :         }
    1548         648 :         Rectangle aBoundRect0; if (pUserCall!=NULL) aBoundRect0=GetLastBoundRect();
    1549         648 :         NbcResize(rRef,xFact,yFact);
    1550         648 :         SetChanged();
    1551         648 :         BroadcastObjectChange();
    1552         648 :         SendUserCall(SDRUSERCALL_RESIZE,aBoundRect0);
    1553             :     }
    1554         648 : }
    1555             : 
    1556           0 : void SdrObject::Crop(const Point& rRef, const Fraction& xFact, const Fraction& yFact)
    1557             : {
    1558           0 :     Rectangle aBoundRect0; if (pUserCall!=NULL) aBoundRect0=GetLastBoundRect();
    1559           0 :     NbcCrop(rRef, xFact, yFact);
    1560           0 :     SetChanged();
    1561           0 :     BroadcastObjectChange();
    1562           0 :     SendUserCall(SDRUSERCALL_RESIZE,aBoundRect0);
    1563           0 : }
    1564             : 
    1565        1319 : void SdrObject::Rotate(const Point& rRef, long nAngle, double sn, double cs)
    1566             : {
    1567        1319 :     if (nAngle!=0) {
    1568        1318 :         Rectangle aBoundRect0; if (pUserCall!=NULL) aBoundRect0=GetLastBoundRect();
    1569        1318 :         NbcRotate(rRef,nAngle,sn,cs);
    1570        1318 :         SetChanged();
    1571        1318 :         BroadcastObjectChange();
    1572        1318 :         SendUserCall(SDRUSERCALL_RESIZE,aBoundRect0);
    1573             :     }
    1574        1319 : }
    1575             : 
    1576           2 : void SdrObject::Mirror(const Point& rRef1, const Point& rRef2)
    1577             : {
    1578           2 :     Rectangle aBoundRect0; if (pUserCall!=NULL) aBoundRect0=GetLastBoundRect();
    1579           2 :     NbcMirror(rRef1,rRef2);
    1580           2 :     SetChanged();
    1581           2 :     BroadcastObjectChange();
    1582           2 :     SendUserCall(SDRUSERCALL_RESIZE,aBoundRect0);
    1583           2 : }
    1584             : 
    1585           2 : void SdrObject::Shear(const Point& rRef, long nAngle, double tn, bool bVShear)
    1586             : {
    1587           2 :     if (nAngle!=0) {
    1588           2 :         Rectangle aBoundRect0; if (pUserCall!=NULL) aBoundRect0=GetLastBoundRect();
    1589           2 :         NbcShear(rRef,nAngle,tn,bVShear);
    1590           2 :         SetChanged();
    1591           2 :         BroadcastObjectChange();
    1592           2 :         SendUserCall(SDRUSERCALL_RESIZE,aBoundRect0);
    1593             :     }
    1594           2 : }
    1595             : 
    1596           0 : void SdrObject::NbcSetRelativePos(const Point& rPnt)
    1597             : {
    1598           0 :     Point aRelPos0(GetSnapRect().TopLeft()-aAnchor);
    1599           0 :     Size aSiz(rPnt.X()-aRelPos0.X(),rPnt.Y()-aRelPos0.Y());
    1600           0 :     NbcMove(aSiz); // This also calls SetRectsDirty()
    1601           0 : }
    1602             : 
    1603           0 : void SdrObject::SetRelativePos(const Point& rPnt)
    1604             : {
    1605           0 :     if (rPnt!=GetRelativePos()) {
    1606           0 :         Rectangle aBoundRect0; if (pUserCall!=NULL) aBoundRect0=GetLastBoundRect();
    1607           0 :         NbcSetRelativePos(rPnt);
    1608           0 :         SetChanged();
    1609           0 :         BroadcastObjectChange();
    1610           0 :         SendUserCall(SDRUSERCALL_MOVEONLY,aBoundRect0);
    1611             :     }
    1612           0 : }
    1613             : 
    1614           0 : Point SdrObject::GetRelativePos() const
    1615             : {
    1616           0 :     return GetSnapRect().TopLeft()-aAnchor;
    1617             : }
    1618             : 
    1619          26 : void SdrObject::ImpSetAnchorPos(const Point& rPnt)
    1620             : {
    1621          26 :     aAnchor = rPnt;
    1622          26 : }
    1623             : 
    1624        5113 : void SdrObject::NbcSetAnchorPos(const Point& rPnt)
    1625             : {
    1626        5113 :     Size aSiz(rPnt.X()-aAnchor.X(),rPnt.Y()-aAnchor.Y());
    1627        5113 :     aAnchor=rPnt;
    1628        5113 :     NbcMove(aSiz); // This also calls SetRectsDirty()
    1629        5113 : }
    1630             : 
    1631        6882 : void SdrObject::SetAnchorPos(const Point& rPnt)
    1632             : {
    1633        6882 :     if (rPnt!=aAnchor) {
    1634        5113 :         Rectangle aBoundRect0; if (pUserCall!=NULL) aBoundRect0=GetLastBoundRect();
    1635        5113 :         NbcSetAnchorPos(rPnt);
    1636        5113 :         SetChanged();
    1637        5113 :         BroadcastObjectChange();
    1638        5113 :         SendUserCall(SDRUSERCALL_MOVEONLY,aBoundRect0);
    1639             :     }
    1640        6882 : }
    1641             : 
    1642      122582 : const Point& SdrObject::GetAnchorPos() const
    1643             : {
    1644      122582 :     return aAnchor;
    1645             : }
    1646             : 
    1647           0 : void SdrObject::RecalcSnapRect()
    1648             : {
    1649           0 : }
    1650             : 
    1651        3258 : const Rectangle& SdrObject::GetSnapRect() const
    1652             : {
    1653        3258 :     return aOutRect;
    1654             : }
    1655             : 
    1656       16461 : void SdrObject::NbcSetSnapRect(const Rectangle& rRect)
    1657             : {
    1658       16461 :     aOutRect=rRect;
    1659       16461 : }
    1660             : 
    1661        6339 : const Rectangle& SdrObject::GetLogicRect() const
    1662             : {
    1663        6339 :     return GetSnapRect();
    1664             : }
    1665             : 
    1666        9497 : void SdrObject::NbcSetLogicRect(const Rectangle& rRect)
    1667             : {
    1668        9497 :     NbcSetSnapRect(rRect);
    1669        9497 : }
    1670             : 
    1671        2792 : void SdrObject::AdjustToMaxRect( const Rectangle& rMaxRect, bool /* bShrinkOnly = false */ )
    1672             : {
    1673        2792 :     SetLogicRect( rMaxRect );
    1674        2792 : }
    1675             : 
    1676       89159 : void SdrObject::SetSnapRect(const Rectangle& rRect)
    1677             : {
    1678       89159 :     Rectangle aBoundRect0; if (pUserCall!=NULL) aBoundRect0=GetLastBoundRect();
    1679       89159 :     NbcSetSnapRect(rRect);
    1680       89159 :     SetChanged();
    1681       89159 :     BroadcastObjectChange();
    1682       89159 :     SendUserCall(SDRUSERCALL_RESIZE,aBoundRect0);
    1683       89159 : }
    1684             : 
    1685       75126 : void SdrObject::SetLogicRect(const Rectangle& rRect)
    1686             : {
    1687       75126 :     Rectangle aBoundRect0; if (pUserCall!=NULL) aBoundRect0=GetLastBoundRect();
    1688       75126 :     NbcSetLogicRect(rRect);
    1689       75126 :     SetChanged();
    1690       75126 :     BroadcastObjectChange();
    1691       75126 :     SendUserCall(SDRUSERCALL_RESIZE,aBoundRect0);
    1692       75126 : }
    1693             : 
    1694          76 : long SdrObject::GetRotateAngle() const
    1695             : {
    1696          76 :     return 0;
    1697             : }
    1698             : 
    1699           0 : long SdrObject::GetShearAngle(bool /*bVertical*/) const
    1700             : {
    1701           0 :     return 0;
    1702             : }
    1703             : 
    1704           0 : sal_uInt32 SdrObject::GetSnapPointCount() const
    1705             : {
    1706           0 :     return GetPointCount();
    1707             : }
    1708             : 
    1709           0 : Point SdrObject::GetSnapPoint(sal_uInt32 i) const
    1710             : {
    1711           0 :     return GetPoint(i);
    1712             : }
    1713             : 
    1714         143 : bool SdrObject::IsPolyObj() const
    1715             : {
    1716         143 :     return false;
    1717             : }
    1718             : 
    1719           0 : sal_uInt32 SdrObject::GetPointCount() const
    1720             : {
    1721           0 :     return 0L;
    1722             : }
    1723             : 
    1724           0 : Point SdrObject::GetPoint(sal_uInt32 /*i*/) const
    1725             : {
    1726           0 :     return Point();
    1727             : }
    1728             : 
    1729           0 : void SdrObject::SetPoint(const Point& rPnt, sal_uInt32 i)
    1730             : {
    1731           0 :     Rectangle aBoundRect0; if (pUserCall!=NULL) aBoundRect0=GetLastBoundRect();
    1732           0 :     NbcSetPoint(rPnt, i);
    1733           0 :     SetChanged();
    1734           0 :     BroadcastObjectChange();
    1735           0 :     SendUserCall(SDRUSERCALL_RESIZE,aBoundRect0);
    1736           0 : }
    1737             : 
    1738           0 : void SdrObject::NbcSetPoint(const Point& /*rPnt*/, sal_uInt32 /*i*/)
    1739             : {
    1740           0 : }
    1741             : 
    1742           0 : bool SdrObject::HasTextEdit() const
    1743             : {
    1744           0 :     return false;
    1745             : }
    1746             : 
    1747           0 : OString SdrObject::stringify() const
    1748             : {
    1749           0 :     OStringBuffer aString(100);
    1750           0 :     aString.append(aAnchor.X()).
    1751           0 :             append(aAnchor.Y()).
    1752           0 :             append(aGridOffset.X()).
    1753           0 :             append(aGridOffset.Y()).
    1754           0 :             append((sal_Int32)nOrdNum).
    1755           0 :             append((sal_Int32)mnNavigationPosition).
    1756           0 :             append(mbSupportTextIndentingOnLineWidthChange).
    1757           0 :             append(mbLineIsOutsideGeometry).
    1758           0 :             append(bMarkProt).
    1759           0 :             append(bIs3DObj).
    1760           0 :             append(bIsEdge).
    1761           0 :             append(bClosedObj).
    1762           0 :             append(bNotVisibleAsMaster).
    1763           0 :             append(bEmptyPresObj).
    1764           0 :             append(mbVisible).
    1765           0 :             append(bNoPrint).
    1766           0 :             append(bSizProt).
    1767           0 :             append(bMovProt).
    1768           0 :             append(bGrouped).
    1769           0 :             append(bInserted).
    1770           0 :             append(bNetLock).
    1771           0 :             append(bVirtObj).
    1772             :             //append(maBLIPSizeRectangle).
    1773           0 :             append(mnLayerID);
    1774             : 
    1775           0 :     SvMemoryStream aStream;
    1776           0 :     SfxItemSet aSet(GetMergedItemSet());
    1777           0 :     aSet.InvalidateDefaultItems();
    1778           0 :     aSet.Store(aStream, true);
    1779           0 :     aString.append(static_cast<const char *>(aStream.GetBuffer()), aStream.GetEndOfData());
    1780             : 
    1781           0 :     return aString.makeStringAndClear();
    1782             : }
    1783             : 
    1784           0 : void SdrObject::dumpAsXml(xmlTextWriterPtr pWriter) const
    1785             : {
    1786           0 :     xmlTextWriterStartElement(pWriter, BAD_CAST("sdrObject"));
    1787           0 :     xmlTextWriterWriteFormatAttribute(pWriter, BAD_CAST("ptr"), "%p", this);
    1788           0 :     xmlTextWriterWriteFormatAttribute(pWriter, BAD_CAST("symbol"), "%s", BAD_CAST(typeid(*this).name()));
    1789           0 :     xmlTextWriterWriteFormatAttribute(pWriter, BAD_CAST("name"), "%s", BAD_CAST(GetName().toUtf8().getStr()));
    1790           0 :     xmlTextWriterWriteFormatAttribute(pWriter, BAD_CAST("title"), "%s", BAD_CAST(GetTitle().toUtf8().getStr()));
    1791           0 :     xmlTextWriterWriteFormatAttribute(pWriter, BAD_CAST("description"), "%s", BAD_CAST(GetDescription().toUtf8().getStr()));
    1792           0 :     xmlTextWriterWriteFormatAttribute(pWriter, BAD_CAST("nOrdNum"), "%" SAL_PRIuUINT32, GetOrdNumDirect());
    1793           0 :     xmlTextWriterWriteAttribute(pWriter, BAD_CAST("aOutRect"), BAD_CAST(aOutRect.toString().getStr()));
    1794             : 
    1795           0 :     if (const OutlinerParaObject* pOutliner = GetOutlinerParaObject())
    1796           0 :         pOutliner->dumpAsXml(pWriter);
    1797             : 
    1798           0 :     xmlTextWriterEndElement(pWriter);
    1799           0 : }
    1800             : 
    1801           0 : bool SdrObject::BegTextEdit(SdrOutliner& /*rOutl*/)
    1802             : {
    1803           0 :     return false;
    1804             : }
    1805             : 
    1806           0 : void SdrObject::EndTextEdit(SdrOutliner& /*rOutl*/)
    1807             : {
    1808           0 : }
    1809             : 
    1810        6197 : void SdrObject::SetOutlinerParaObject(OutlinerParaObject* pTextObject)
    1811             : {
    1812        6197 :     Rectangle aBoundRect0; if (pUserCall!=NULL) aBoundRect0=GetLastBoundRect();
    1813        6197 :     NbcSetOutlinerParaObject(pTextObject);
    1814        6197 :     SetChanged();
    1815        6197 :     BroadcastObjectChange();
    1816        6197 :     if (GetCurrentBoundRect()!=aBoundRect0) {
    1817        1275 :         SendUserCall(SDRUSERCALL_RESIZE,aBoundRect0);
    1818             :     }
    1819        6197 : }
    1820             : 
    1821           0 : void SdrObject::NbcSetOutlinerParaObject(OutlinerParaObject* /*pTextObject*/)
    1822             : {
    1823           0 : }
    1824             : 
    1825        1126 : OutlinerParaObject* SdrObject::GetOutlinerParaObject() const
    1826             : {
    1827        1126 :     return NULL;
    1828             : }
    1829             : 
    1830         223 : void SdrObject::NbcReformatText()
    1831             : {
    1832         223 : }
    1833             : 
    1834           0 : void SdrObject::ReformatText()
    1835             : {
    1836           0 :     Rectangle aBoundRect0; if (pUserCall!=NULL) aBoundRect0=GetLastBoundRect();
    1837           0 :     NbcReformatText();
    1838           0 :     SetChanged();
    1839           0 :     BroadcastObjectChange();
    1840           0 :     if (GetCurrentBoundRect()!=aBoundRect0) {
    1841           0 :         SendUserCall(SDRUSERCALL_RESIZE,aBoundRect0);
    1842             :     }
    1843           0 : }
    1844             : 
    1845           0 : void SdrObject::BurnInStyleSheetAttributes()
    1846             : {
    1847           0 :     GetProperties().ForceStyleToHardAttributes();
    1848           0 : }
    1849             : 
    1850           5 : bool SdrObject::HasMacro() const
    1851             : {
    1852           5 :     return false;
    1853             : }
    1854             : 
    1855           0 : SdrObject* SdrObject::CheckMacroHit(const SdrObjMacroHitRec& rRec) const
    1856             : {
    1857           0 :     if(rRec.pPageView)
    1858             :     {
    1859           0 :         return SdrObjectPrimitiveHit(*this, rRec.aPos, rRec.nTol, *rRec.pPageView, rRec.pVisiLayer, false);
    1860             :     }
    1861             : 
    1862           0 :     return 0;
    1863             : }
    1864             : 
    1865           0 : Pointer SdrObject::GetMacroPointer(const SdrObjMacroHitRec&) const
    1866             : {
    1867           0 :     return Pointer(PointerStyle::RefHand);
    1868             : }
    1869             : 
    1870           0 : void SdrObject::PaintMacro(OutputDevice& rOut, const Rectangle& , const SdrObjMacroHitRec& ) const
    1871             : {
    1872           0 :     const RasterOp eRop(rOut.GetRasterOp());
    1873           0 :     const basegfx::B2DPolyPolygon aPolyPolygon(TakeXorPoly());
    1874           0 :     const sal_uInt32 nCount(aPolyPolygon.count());
    1875             : 
    1876           0 :     rOut.SetLineColor(COL_BLACK);
    1877           0 :     rOut.SetFillColor();
    1878           0 :     rOut.SetRasterOp(ROP_INVERT);
    1879             : 
    1880           0 :     for(sal_uInt32 a(0); a < nCount; a++)
    1881             :     {
    1882           0 :         rOut.DrawPolyLine(aPolyPolygon.getB2DPolygon(a));
    1883             :     }
    1884             : 
    1885           0 :     rOut.SetRasterOp(eRop);
    1886           0 : }
    1887             : 
    1888           0 : bool SdrObject::DoMacro(const SdrObjMacroHitRec&)
    1889             : {
    1890           0 :     return false;
    1891             : }
    1892             : 
    1893           0 : OUString SdrObject::GetMacroPopupComment(const SdrObjMacroHitRec&) const
    1894             : {
    1895           0 :     return OUString();
    1896             : }
    1897             : 
    1898           0 : bool SdrObject::IsMacroHit(const SdrObjMacroHitRec& rRec) const
    1899             : {
    1900           0 :     return CheckMacroHit(rRec) != NULL;
    1901             : }
    1902             : 
    1903             : 
    1904             : 
    1905           0 : SdrObjGeoData* SdrObject::NewGeoData() const
    1906             : {
    1907           0 :     return new SdrObjGeoData;
    1908             : }
    1909             : 
    1910        1363 : void SdrObject::SaveGeoData(SdrObjGeoData& rGeo) const
    1911             : {
    1912        1363 :     rGeo.aBoundRect    =GetCurrentBoundRect();
    1913        1363 :     rGeo.aAnchor       =aAnchor       ;
    1914        1363 :     rGeo.bMovProt      =bMovProt      ;
    1915        1363 :     rGeo.bSizProt      =bSizProt      ;
    1916        1363 :     rGeo.bNoPrint      =bNoPrint      ;
    1917        1363 :     rGeo.mbVisible     =mbVisible     ;
    1918        1363 :     rGeo.bClosedObj    =bClosedObj    ;
    1919        1363 :     rGeo.mnLayerID = mnLayerID;
    1920             : 
    1921             :     // user-defined glue points
    1922        1363 :     if (pPlusData!=NULL && pPlusData->pGluePoints!=NULL) {
    1923           0 :         if (rGeo.pGPL!=NULL) {
    1924           0 :             *rGeo.pGPL=*pPlusData->pGluePoints;
    1925             :         } else {
    1926           0 :             rGeo.pGPL=new SdrGluePointList(*pPlusData->pGluePoints);
    1927             :         }
    1928             :     } else {
    1929        1363 :         if (rGeo.pGPL!=NULL) {
    1930           0 :             delete rGeo.pGPL;
    1931           0 :             rGeo.pGPL=NULL;
    1932             :         }
    1933             :     }
    1934        1363 : }
    1935             : 
    1936           1 : void SdrObject::RestGeoData(const SdrObjGeoData& rGeo)
    1937             : {
    1938           1 :     SetRectsDirty();
    1939           1 :     aOutRect      =rGeo.aBoundRect    ;
    1940           1 :     aAnchor       =rGeo.aAnchor       ;
    1941           1 :     bMovProt      =rGeo.bMovProt      ;
    1942           1 :     bSizProt      =rGeo.bSizProt      ;
    1943           1 :     bNoPrint      =rGeo.bNoPrint      ;
    1944           1 :     mbVisible     =rGeo.mbVisible     ;
    1945           1 :     bClosedObj    =rGeo.bClosedObj    ;
    1946           1 :     mnLayerID = rGeo.mnLayerID;
    1947             : 
    1948             :     // user-defined glue points
    1949           1 :     if (rGeo.pGPL!=NULL) {
    1950           0 :         ImpForcePlusData();
    1951           0 :         if (pPlusData->pGluePoints!=NULL) {
    1952           0 :             *pPlusData->pGluePoints=*rGeo.pGPL;
    1953             :         } else {
    1954           0 :             pPlusData->pGluePoints=new SdrGluePointList(*rGeo.pGPL);
    1955             :         }
    1956             :     } else {
    1957           1 :         if (pPlusData!=NULL && pPlusData->pGluePoints!=NULL) {
    1958           0 :             delete pPlusData->pGluePoints;
    1959           0 :             pPlusData->pGluePoints=NULL;
    1960             :         }
    1961             :     }
    1962           1 : }
    1963             : 
    1964          35 : SdrObjGeoData* SdrObject::GetGeoData() const
    1965             : {
    1966          35 :     SdrObjGeoData* pGeo=NewGeoData();
    1967          35 :     SaveGeoData(*pGeo);
    1968          35 :     return pGeo;
    1969             : }
    1970             : 
    1971           1 : void SdrObject::SetGeoData(const SdrObjGeoData& rGeo)
    1972             : {
    1973           1 :     Rectangle aBoundRect0; if (pUserCall!=NULL) aBoundRect0=GetLastBoundRect();
    1974           1 :     RestGeoData(rGeo);
    1975           1 :     SetChanged();
    1976           1 :     BroadcastObjectChange();
    1977           1 :     SendUserCall(SDRUSERCALL_RESIZE,aBoundRect0);
    1978           1 : }
    1979             : 
    1980             : 
    1981             : // ItemSet access
    1982             : 
    1983     4435338 : const SfxItemSet& SdrObject::GetObjectItemSet() const
    1984             : {
    1985     4435338 :     return GetProperties().GetObjectItemSet();
    1986             : }
    1987             : 
    1988     1586062 : const SfxItemSet& SdrObject::GetMergedItemSet() const
    1989             : {
    1990     1586062 :     return GetProperties().GetMergedItemSet();
    1991             : }
    1992             : 
    1993           0 : void SdrObject::SetObjectItem(const SfxPoolItem& rItem)
    1994             : {
    1995           0 :     GetProperties().SetObjectItem(rItem);
    1996           0 : }
    1997             : 
    1998       56150 : void SdrObject::SetMergedItem(const SfxPoolItem& rItem)
    1999             : {
    2000       56150 :     GetProperties().SetMergedItem(rItem);
    2001       56150 : }
    2002             : 
    2003        2606 : void SdrObject::ClearMergedItem(const sal_uInt16 nWhich)
    2004             : {
    2005        2606 :     GetProperties().ClearMergedItem(nWhich);
    2006        2606 : }
    2007             : 
    2008       74967 : void SdrObject::SetObjectItemSet(const SfxItemSet& rSet)
    2009             : {
    2010       74967 :     GetProperties().SetObjectItemSet(rSet);
    2011       74967 : }
    2012             : 
    2013       14640 : void SdrObject::SetMergedItemSet(const SfxItemSet& rSet, bool bClearAllItems)
    2014             : {
    2015       14640 :     GetProperties().SetMergedItemSet(rSet, bClearAllItems);
    2016       14640 : }
    2017             : 
    2018      170206 : const SfxPoolItem& SdrObject::GetObjectItem(const sal_uInt16 nWhich) const
    2019             : {
    2020      170206 :     return GetObjectItemSet().Get(nWhich);
    2021             : }
    2022             : 
    2023       75237 : SfxMapUnit SdrObject::GetObjectMapUnit() const
    2024             : {
    2025       75237 :     return GetObjectItemPool().GetMetric(0);
    2026             : }
    2027             : 
    2028     1375593 : const SfxPoolItem& SdrObject::GetMergedItem(const sal_uInt16 nWhich) const
    2029             : {
    2030     1375593 :     return GetMergedItemSet().Get(nWhich);
    2031             : }
    2032             : 
    2033      114927 : void SdrObject::SetMergedItemSetAndBroadcast(const SfxItemSet& rSet, bool bClearAllItems)
    2034             : {
    2035      114927 :     GetProperties().SetMergedItemSetAndBroadcast(rSet, bClearAllItems);
    2036      114927 : }
    2037             : 
    2038         204 : void SdrObject::ApplyNotPersistAttr(const SfxItemSet& rAttr)
    2039             : {
    2040         204 :     Rectangle aBoundRect0; if (pUserCall!=NULL) aBoundRect0=GetLastBoundRect();
    2041         204 :     NbcApplyNotPersistAttr(rAttr);
    2042         204 :     SetChanged();
    2043         204 :     BroadcastObjectChange();
    2044         204 :     SendUserCall(SDRUSERCALL_RESIZE,aBoundRect0);
    2045         204 : }
    2046             : 
    2047         204 : void SdrObject::NbcApplyNotPersistAttr(const SfxItemSet& rAttr)
    2048             : {
    2049         204 :     const Rectangle& rSnap=GetSnapRect();
    2050         204 :     const Rectangle& rLogic=GetLogicRect();
    2051         204 :     Point aRef1(rSnap.Center());
    2052         204 :     Point aRef2(aRef1); aRef2.Y()++;
    2053         204 :     const SfxPoolItem *pPoolItem=NULL;
    2054         204 :     if (rAttr.GetItemState(SDRATTR_TRANSFORMREF1X,true,&pPoolItem)==SfxItemState::SET) {
    2055           0 :         aRef1.X()=static_cast<const SdrTransformRef1XItem*>(pPoolItem)->GetValue();
    2056             :     }
    2057         204 :     if (rAttr.GetItemState(SDRATTR_TRANSFORMREF1Y,true,&pPoolItem)==SfxItemState::SET) {
    2058           0 :         aRef1.Y()=static_cast<const SdrTransformRef1YItem*>(pPoolItem)->GetValue();
    2059             :     }
    2060         204 :     if (rAttr.GetItemState(SDRATTR_TRANSFORMREF2X,true,&pPoolItem)==SfxItemState::SET) {
    2061           0 :         aRef2.X()=static_cast<const SdrTransformRef2XItem*>(pPoolItem)->GetValue();
    2062             :     }
    2063         204 :     if (rAttr.GetItemState(SDRATTR_TRANSFORMREF2Y,true,&pPoolItem)==SfxItemState::SET) {
    2064           0 :         aRef2.Y()=static_cast<const SdrTransformRef2YItem*>(pPoolItem)->GetValue();
    2065             :     }
    2066             : 
    2067         204 :     Rectangle aNewSnap(rSnap);
    2068         204 :     if (rAttr.GetItemState(SDRATTR_MOVEX,true,&pPoolItem)==SfxItemState::SET) {
    2069           0 :         long n=static_cast<const SdrMoveXItem*>(pPoolItem)->GetValue();
    2070           0 :         aNewSnap.Move(n,0);
    2071             :     }
    2072         204 :     if (rAttr.GetItemState(SDRATTR_MOVEY,true,&pPoolItem)==SfxItemState::SET) {
    2073           0 :         long n=static_cast<const SdrMoveYItem*>(pPoolItem)->GetValue();
    2074           0 :         aNewSnap.Move(0,n);
    2075             :     }
    2076         204 :     if (rAttr.GetItemState(SDRATTR_ONEPOSITIONX,true,&pPoolItem)==SfxItemState::SET) {
    2077           0 :         long n=static_cast<const SdrOnePositionXItem*>(pPoolItem)->GetValue();
    2078           0 :         aNewSnap.Move(n-aNewSnap.Left(),0);
    2079             :     }
    2080         204 :     if (rAttr.GetItemState(SDRATTR_ONEPOSITIONY,true,&pPoolItem)==SfxItemState::SET) {
    2081           0 :         long n=static_cast<const SdrOnePositionYItem*>(pPoolItem)->GetValue();
    2082           0 :         aNewSnap.Move(0,n-aNewSnap.Top());
    2083             :     }
    2084         204 :     if (rAttr.GetItemState(SDRATTR_ONESIZEWIDTH,true,&pPoolItem)==SfxItemState::SET) {
    2085           0 :         long n=static_cast<const SdrOneSizeWidthItem*>(pPoolItem)->GetValue();
    2086           0 :         aNewSnap.Right()=aNewSnap.Left()+n;
    2087             :     }
    2088         204 :     if (rAttr.GetItemState(SDRATTR_ONESIZEHEIGHT,true,&pPoolItem)==SfxItemState::SET) {
    2089           0 :         long n=static_cast<const SdrOneSizeHeightItem*>(pPoolItem)->GetValue();
    2090           0 :         aNewSnap.Bottom()=aNewSnap.Top()+n;
    2091             :     }
    2092         204 :     if (aNewSnap!=rSnap) {
    2093           0 :         if (aNewSnap.GetSize()==rSnap.GetSize()) {
    2094           0 :             NbcMove(Size(aNewSnap.Left()-rSnap.Left(),aNewSnap.Top()-rSnap.Top()));
    2095             :         } else {
    2096           0 :             NbcSetSnapRect(aNewSnap);
    2097             :         }
    2098             :     }
    2099             : 
    2100         204 :     if (rAttr.GetItemState(SDRATTR_SHEARANGLE,true,&pPoolItem)==SfxItemState::SET) {
    2101           0 :         long n=static_cast<const SdrShearAngleItem*>(pPoolItem)->GetValue();
    2102           0 :         n-=GetShearAngle();
    2103           0 :         if (n!=0) {
    2104           0 :             double nTan=tan(n*nPi180);
    2105           0 :             NbcShear(aRef1,n,nTan,false);
    2106             :         }
    2107             :     }
    2108         204 :     if (rAttr.GetItemState(SDRATTR_ROTATEANGLE,true,&pPoolItem)==SfxItemState::SET) {
    2109          83 :         long n=static_cast<const SdrAngleItem*>(pPoolItem)->GetValue();
    2110          83 :         n-=GetRotateAngle();
    2111          83 :         if (n!=0) {
    2112           1 :             double nSin=sin(n*nPi180);
    2113           1 :             double nCos=cos(n*nPi180);
    2114           1 :             NbcRotate(aRef1,n,nSin,nCos);
    2115             :         }
    2116             :     }
    2117         204 :     if (rAttr.GetItemState(SDRATTR_ROTATEONE,true,&pPoolItem)==SfxItemState::SET) {
    2118           0 :         long n=static_cast<const SdrRotateOneItem*>(pPoolItem)->GetValue();
    2119           0 :         double nSin=sin(n*nPi180);
    2120           0 :         double nCos=cos(n*nPi180);
    2121           0 :         NbcRotate(aRef1,n,nSin,nCos);
    2122             :     }
    2123         204 :     if (rAttr.GetItemState(SDRATTR_HORZSHEARONE,true,&pPoolItem)==SfxItemState::SET) {
    2124           0 :         long n=static_cast<const SdrHorzShearOneItem*>(pPoolItem)->GetValue();
    2125           0 :         double nTan=tan(n*nPi180);
    2126           0 :         NbcShear(aRef1,n,nTan,false);
    2127             :     }
    2128         204 :     if (rAttr.GetItemState(SDRATTR_VERTSHEARONE,true,&pPoolItem)==SfxItemState::SET) {
    2129           0 :         long n=static_cast<const SdrVertShearOneItem*>(pPoolItem)->GetValue();
    2130           0 :         double nTan=tan(n*nPi180);
    2131           0 :         NbcShear(aRef1,n,nTan,true);
    2132             :     }
    2133             : 
    2134         204 :     if (rAttr.GetItemState(SDRATTR_OBJMOVEPROTECT,true,&pPoolItem)==SfxItemState::SET) {
    2135          27 :         bool b=static_cast<const SdrYesNoItem*>(pPoolItem)->GetValue();
    2136          27 :         SetMoveProtect(b);
    2137             :     }
    2138         204 :     if (rAttr.GetItemState(SDRATTR_OBJSIZEPROTECT,true,&pPoolItem)==SfxItemState::SET) {
    2139          27 :         bool b=static_cast<const SdrYesNoItem*>(pPoolItem)->GetValue();
    2140          27 :         SetResizeProtect(b);
    2141             :     }
    2142             : 
    2143             :     /* move protect always sets size protect */
    2144         204 :     if( IsMoveProtect() )
    2145          27 :         SetResizeProtect( true );
    2146             : 
    2147         204 :     if (rAttr.GetItemState(SDRATTR_OBJPRINTABLE,true,&pPoolItem)==SfxItemState::SET) {
    2148           0 :         bool b=static_cast<const SdrObjPrintableItem*>(pPoolItem)->GetValue();
    2149           0 :         SetPrintable(b);
    2150             :     }
    2151             : 
    2152         204 :     if (rAttr.GetItemState(SDRATTR_OBJVISIBLE,true,&pPoolItem)==SfxItemState::SET) {
    2153           0 :         bool b=static_cast<const SdrObjVisibleItem*>(pPoolItem)->GetValue();
    2154           0 :         SetVisible(b);
    2155             :     }
    2156             : 
    2157         204 :     SdrLayerID nLayer=SDRLAYER_NOTFOUND;
    2158         204 :     if (rAttr.GetItemState(SDRATTR_LAYERID,true,&pPoolItem)==SfxItemState::SET) {
    2159           0 :         nLayer=static_cast<const SdrLayerIdItem*>(pPoolItem)->GetValue();
    2160             :     }
    2161         204 :     if (rAttr.GetItemState(SDRATTR_LAYERNAME,true,&pPoolItem)==SfxItemState::SET && pModel!=NULL) {
    2162           0 :         OUString aLayerName=static_cast<const SdrLayerNameItem*>(pPoolItem)->GetValue();
    2163           0 :         const SdrLayerAdmin* pLayAd=pPage!=NULL ? &pPage->GetLayerAdmin() : pModel!=NULL ? &pModel->GetLayerAdmin() : NULL;
    2164           0 :         if (pLayAd!=NULL) {
    2165           0 :             const SdrLayer* pLayer=pLayAd->GetLayer(aLayerName, true);
    2166           0 :             if (pLayer!=NULL) {
    2167           0 :                 nLayer=pLayer->GetID();
    2168             :             }
    2169           0 :         }
    2170             : 
    2171             :     }
    2172         204 :     if (nLayer!=SDRLAYER_NOTFOUND) {
    2173           0 :         NbcSetLayer(nLayer);
    2174             :     }
    2175             : 
    2176         204 :     if (rAttr.GetItemState(SDRATTR_OBJECTNAME,true,&pPoolItem)==SfxItemState::SET) {
    2177          41 :         OUString aName=static_cast<const SfxStringItem*>(pPoolItem)->GetValue();
    2178          41 :         SetName(aName);
    2179             :     }
    2180         204 :     Rectangle aNewLogic(rLogic);
    2181         204 :     if (rAttr.GetItemState(SDRATTR_LOGICSIZEWIDTH,true,&pPoolItem)==SfxItemState::SET) {
    2182           0 :         long n=static_cast<const SdrLogicSizeWidthItem*>(pPoolItem)->GetValue();
    2183           0 :         aNewLogic.Right()=aNewLogic.Left()+n;
    2184             :     }
    2185         204 :     if (rAttr.GetItemState(SDRATTR_LOGICSIZEHEIGHT,true,&pPoolItem)==SfxItemState::SET) {
    2186           0 :         long n=static_cast<const SdrLogicSizeHeightItem*>(pPoolItem)->GetValue();
    2187           0 :         aNewLogic.Bottom()=aNewLogic.Top()+n;
    2188             :     }
    2189         204 :     if (aNewLogic!=rLogic) {
    2190           0 :         NbcSetLogicRect(aNewLogic);
    2191             :     }
    2192         204 :     Fraction aResizeX(1,1);
    2193         408 :     Fraction aResizeY(1,1);
    2194         204 :     if (rAttr.GetItemState(SDRATTR_RESIZEXONE,true,&pPoolItem)==SfxItemState::SET) {
    2195           0 :         aResizeX*=static_cast<const SdrResizeXOneItem*>(pPoolItem)->GetValue();
    2196             :     }
    2197         204 :     if (rAttr.GetItemState(SDRATTR_RESIZEYONE,true,&pPoolItem)==SfxItemState::SET) {
    2198           0 :         aResizeY*=static_cast<const SdrResizeYOneItem*>(pPoolItem)->GetValue();
    2199             :     }
    2200         204 :     if (aResizeX!=Fraction(1,1) || aResizeY!=Fraction(1,1)) {
    2201           0 :         NbcResize(aRef1,aResizeX,aResizeY);
    2202         204 :     }
    2203         204 : }
    2204             : 
    2205           0 : static void lcl_SetItem(SfxItemSet& rAttr, bool bMerge, const SfxPoolItem& rItem)
    2206             : {
    2207           0 :     if (bMerge) rAttr.MergeValue(rItem,true);
    2208           0 :     else rAttr.Put(rItem);
    2209           0 : }
    2210             : 
    2211           0 : void SdrObject::TakeNotPersistAttr(SfxItemSet& rAttr, bool bMerge) const
    2212             : {
    2213           0 :     const Rectangle& rSnap=GetSnapRect();
    2214           0 :     const Rectangle& rLogic=GetLogicRect();
    2215           0 :     lcl_SetItem(rAttr,bMerge,makeSdrObjMoveProtectItem(IsMoveProtect()));
    2216           0 :     lcl_SetItem(rAttr,bMerge,makeSdrObjSizeProtectItem(IsResizeProtect()));
    2217           0 :     lcl_SetItem(rAttr,bMerge,SdrObjPrintableItem(IsPrintable()));
    2218           0 :     lcl_SetItem(rAttr,bMerge,SdrObjVisibleItem(IsVisible()));
    2219           0 :     lcl_SetItem(rAttr,bMerge,makeSdrRotateAngleItem(GetRotateAngle()));
    2220           0 :     lcl_SetItem(rAttr,bMerge,SdrShearAngleItem(GetShearAngle()));
    2221           0 :     lcl_SetItem(rAttr,bMerge,SdrOneSizeWidthItem(rSnap.GetWidth()-1));
    2222           0 :     lcl_SetItem(rAttr,bMerge,SdrOneSizeHeightItem(rSnap.GetHeight()-1));
    2223           0 :     lcl_SetItem(rAttr,bMerge,SdrOnePositionXItem(rSnap.Left()));
    2224           0 :     lcl_SetItem(rAttr,bMerge,SdrOnePositionYItem(rSnap.Top()));
    2225           0 :     if (rLogic.GetWidth()!=rSnap.GetWidth()) {
    2226           0 :         lcl_SetItem(rAttr,bMerge,SdrLogicSizeWidthItem(rLogic.GetWidth()-1));
    2227             :     }
    2228           0 :     if (rLogic.GetHeight()!=rSnap.GetHeight()) {
    2229           0 :         lcl_SetItem(rAttr,bMerge,SdrLogicSizeHeightItem(rLogic.GetHeight()-1));
    2230             :     }
    2231           0 :     OUString aName(GetName());
    2232             : 
    2233           0 :     if (!aName.isEmpty())
    2234             :     {
    2235           0 :         lcl_SetItem(rAttr, bMerge, makeSdrObjectNameItem(aName));
    2236             :     }
    2237             : 
    2238           0 :     lcl_SetItem(rAttr,bMerge,SdrLayerIdItem(GetLayer()));
    2239           0 :     const SdrLayerAdmin* pLayAd=pPage!=NULL ? &pPage->GetLayerAdmin() : pModel!=NULL ? &pModel->GetLayerAdmin() : NULL;
    2240           0 :     if (pLayAd!=NULL) {
    2241           0 :         const SdrLayer* pLayer=pLayAd->GetLayerPerID(GetLayer());
    2242           0 :         if (pLayer!=NULL) {
    2243           0 :             lcl_SetItem(rAttr,bMerge,SdrLayerNameItem(pLayer->GetName()));
    2244             :         }
    2245             :     }
    2246           0 :     Point aRef1(rSnap.Center());
    2247           0 :     Point aRef2(aRef1); aRef2.Y()++;
    2248           0 :     lcl_SetItem(rAttr,bMerge,SdrTransformRef1XItem(aRef1.X()));
    2249           0 :     lcl_SetItem(rAttr,bMerge,SdrTransformRef1YItem(aRef1.Y()));
    2250           0 :     lcl_SetItem(rAttr,bMerge,SdrTransformRef2XItem(aRef2.X()));
    2251           0 :     lcl_SetItem(rAttr,bMerge,SdrTransformRef2YItem(aRef2.Y()));
    2252           0 : }
    2253             : 
    2254       78180 : SfxStyleSheet* SdrObject::GetStyleSheet() const
    2255             : {
    2256       78180 :     return GetProperties().GetStyleSheet();
    2257             : }
    2258             : 
    2259        6663 : void SdrObject::SetStyleSheet(SfxStyleSheet* pNewStyleSheet, bool bDontRemoveHardAttr)
    2260             : {
    2261        6663 :     Rectangle aBoundRect0;
    2262             : 
    2263        6663 :     if(pUserCall)
    2264          19 :         aBoundRect0 = GetLastBoundRect();
    2265             : 
    2266        6663 :     NbcSetStyleSheet(pNewStyleSheet, bDontRemoveHardAttr);
    2267        6663 :     SetChanged();
    2268        6663 :     BroadcastObjectChange();
    2269        6663 :     SendUserCall(SDRUSERCALL_CHGATTR, aBoundRect0);
    2270        6663 : }
    2271             : 
    2272       12136 : void SdrObject::NbcSetStyleSheet(SfxStyleSheet* pNewStyleSheet, bool bDontRemoveHardAttr)
    2273             : {
    2274             :     // only allow graphic and presentation styles for shapes
    2275       12136 :     if( pNewStyleSheet && (pNewStyleSheet->GetFamily() == SFX_STYLE_FAMILY_PARA) && (pNewStyleSheet->GetFamily() == SFX_STYLE_FAMILY_PAGE) )
    2276       12136 :         return;
    2277             : 
    2278       12136 :     GetProperties().SetStyleSheet(pNewStyleSheet, bDontRemoveHardAttr);
    2279             : }
    2280             : 
    2281             : // Broadcasting while setting attributes is managed by the AttrObj.
    2282             : 
    2283             : 
    2284         771 : bool SdrObject::IsNode() const
    2285             : {
    2286         771 :     return true;
    2287             : }
    2288             : 
    2289          60 : SdrGluePoint SdrObject::GetVertexGluePoint(sal_uInt16 nPosNum) const
    2290             : {
    2291             :     // #i41936# Use SnapRect for default GluePoints
    2292          60 :     const Rectangle aR(GetSnapRect());
    2293          60 :     Point aPt;
    2294             : 
    2295          60 :     switch(nPosNum)
    2296             :     {
    2297          15 :         case 0 : aPt = aR.TopCenter();    break;
    2298          15 :         case 1 : aPt = aR.RightCenter();  break;
    2299          15 :         case 2 : aPt = aR.BottomCenter(); break;
    2300          15 :         case 3 : aPt = aR.LeftCenter();   break;
    2301             :     }
    2302             : 
    2303          60 :     aPt -= aR.Center();
    2304          60 :     SdrGluePoint aGP(aPt);
    2305          60 :     aGP.SetPercent(false);
    2306             : 
    2307          60 :     return aGP;
    2308             : }
    2309             : 
    2310           0 : SdrGluePoint SdrObject::GetCornerGluePoint(sal_uInt16 nPosNum) const
    2311             : {
    2312           0 :     Rectangle aR(GetCurrentBoundRect());
    2313           0 :     Point aPt;
    2314           0 :     switch (nPosNum) {
    2315           0 :         case 0 : aPt=aR.TopLeft();     break;
    2316           0 :         case 1 : aPt=aR.TopRight();    break;
    2317           0 :         case 2 : aPt=aR.BottomRight(); break;
    2318           0 :         case 3 : aPt=aR.BottomLeft();  break;
    2319             :     }
    2320           0 :     aPt-=GetSnapRect().Center();
    2321           0 :     SdrGluePoint aGP(aPt);
    2322           0 :     aGP.SetPercent(false);
    2323           0 :     return aGP;
    2324             : }
    2325             : 
    2326      216525 : const SdrGluePointList* SdrObject::GetGluePointList() const
    2327             : {
    2328      216525 :     if (pPlusData!=NULL) return pPlusData->pGluePoints;
    2329      179769 :     return NULL;
    2330             : }
    2331             : 
    2332             : 
    2333         340 : SdrGluePointList* SdrObject::ForceGluePointList()
    2334             : {
    2335         340 :     ImpForcePlusData();
    2336         340 :     if (pPlusData->pGluePoints==NULL) {
    2337          44 :         pPlusData->pGluePoints=new SdrGluePointList;
    2338             :     }
    2339         340 :     return pPlusData->pGluePoints;
    2340             : }
    2341             : 
    2342        4578 : void SdrObject::SetGlueReallyAbsolute(bool bOn)
    2343             : {
    2344             :     // First a const call to see whether there are any glue points.
    2345             :     // Force const call!
    2346        4578 :     if (GetGluePointList()!=NULL) {
    2347          36 :         SdrGluePointList* pGPL=ForceGluePointList();
    2348          36 :         pGPL->SetReallyAbsolute(bOn,*this);
    2349             :     }
    2350        4578 : }
    2351             : 
    2352        1847 : void SdrObject::NbcRotateGluePoints(const Point& rRef, long nAngle, double sn, double cs)
    2353             : {
    2354             :     // First a const call to see whether there are any glue points.
    2355             :     // Force const call!
    2356        1847 :     if (GetGluePointList()!=NULL) {
    2357          15 :         SdrGluePointList* pGPL=ForceGluePointList();
    2358          15 :         pGPL->Rotate(rRef,nAngle,sn,cs,this);
    2359             :     }
    2360        1847 : }
    2361             : 
    2362      208798 : void SdrObject::NbcMirrorGluePoints(const Point& rRef1, const Point& rRef2)
    2363             : {
    2364             :     // First a const call to see whether there are any glue points.
    2365             :     // Force const call!
    2366      208798 :     if (GetGluePointList()!=NULL) {
    2367           3 :         SdrGluePointList* pGPL=ForceGluePointList();
    2368           3 :         pGPL->Mirror(rRef1,rRef2,this);
    2369             :     }
    2370      208798 : }
    2371             : 
    2372           2 : void SdrObject::NbcShearGluePoints(const Point& rRef, long nAngle, double tn, bool bVShear)
    2373             : {
    2374             :     // First a const call to see whether there are any glue points.
    2375             :     // Force const call!
    2376           2 :     if (GetGluePointList()!=NULL) {
    2377           0 :         SdrGluePointList* pGPL=ForceGluePointList();
    2378           0 :         pGPL->Shear(rRef,nAngle,tn,bVShear,this);
    2379             :     }
    2380           2 : }
    2381             : 
    2382           0 : bool SdrObject::IsEdge() const
    2383             : {
    2384           0 :     return false;
    2385             : }
    2386             : 
    2387           0 : void SdrObject::ConnectToNode(bool /*bTail1*/, SdrObject* /*pObj*/)
    2388             : {
    2389           0 : }
    2390             : 
    2391           0 : void SdrObject::DisconnectFromNode(bool /*bTail1*/)
    2392             : {
    2393           0 : }
    2394             : 
    2395           0 : SdrObject* SdrObject::GetConnectedNode(bool /*bTail1*/) const
    2396             : {
    2397           0 :     return NULL;
    2398             : }
    2399             : 
    2400             : 
    2401             : 
    2402           0 : void extractLineContourFromPrimitive2DSequence(
    2403             :     const drawinglayer::primitive2d::Primitive2DSequence& rxSequence,
    2404             :     basegfx::B2DPolygonVector& rExtractedHairlines,
    2405             :     basegfx::B2DPolyPolygonVector& rExtractedLineFills)
    2406             : {
    2407           0 :     rExtractedHairlines.clear();
    2408           0 :     rExtractedLineFills.clear();
    2409             : 
    2410           0 :     if(rxSequence.hasElements())
    2411             :     {
    2412             :         // use neutral ViewInformation
    2413           0 :         const drawinglayer::geometry::ViewInformation2D aViewInformation2D;
    2414             : 
    2415             :         // create extractor, process and get result
    2416           0 :         drawinglayer::processor2d::LineGeometryExtractor2D aExtractor(aViewInformation2D);
    2417           0 :         aExtractor.process(rxSequence);
    2418             : 
    2419             :         // copy line results
    2420           0 :         rExtractedHairlines = aExtractor.getExtractedHairlines();
    2421             : 
    2422             :         // copy fill rsults
    2423           0 :         rExtractedLineFills = aExtractor.getExtractedLineFills();
    2424             :     }
    2425           0 : }
    2426             : 
    2427             : 
    2428             : 
    2429           0 : SdrObject* SdrObject::ImpConvertToContourObj(SdrObject* pRet, bool bForceLineDash)
    2430             : {
    2431           0 :     bool bNoChange(true);
    2432             : 
    2433           0 :     if(pRet->LineGeometryUsageIsNecessary())
    2434             :     {
    2435           0 :         basegfx::B2DPolyPolygon aMergedLineFillPolyPolygon;
    2436           0 :         basegfx::B2DPolyPolygon aMergedHairlinePolyPolygon;
    2437           0 :         const drawinglayer::primitive2d::Primitive2DSequence xSequence(pRet->GetViewContact().getViewIndependentPrimitive2DSequence());
    2438             : 
    2439           0 :         if(xSequence.hasElements())
    2440             :         {
    2441           0 :             basegfx::B2DPolygonVector aExtractedHairlines;
    2442           0 :             basegfx::B2DPolyPolygonVector aExtractedLineFills;
    2443             : 
    2444           0 :             extractLineContourFromPrimitive2DSequence(xSequence, aExtractedHairlines, aExtractedLineFills);
    2445             : 
    2446           0 :             if(!aExtractedHairlines.empty())
    2447             :             {
    2448             :                 // for SdrObject creation, just copy all to a single Hairline-PolyPolygon
    2449           0 :                 for(size_t a(0); a < aExtractedHairlines.size(); a++)
    2450             :                 {
    2451           0 :                     aMergedHairlinePolyPolygon.append(aExtractedHairlines[a]);
    2452             :                 }
    2453             :             }
    2454             : 
    2455             :             // check for fill rsults
    2456           0 :             if(!aExtractedLineFills.empty())
    2457             :             {
    2458             :                 // merge to a single tools::PolyPolygon (OR)
    2459           0 :                 aMergedLineFillPolyPolygon = basegfx::tools::mergeToSinglePolyPolygon(aExtractedLineFills);
    2460           0 :             }
    2461             :         }
    2462             : 
    2463           0 :         if(aMergedLineFillPolyPolygon.count() || (bForceLineDash && aMergedHairlinePolyPolygon.count()))
    2464             :         {
    2465           0 :             SfxItemSet aSet(pRet->GetMergedItemSet());
    2466           0 :             drawing::FillStyle eOldFillStyle = static_cast<const XFillStyleItem&>(aSet.Get(XATTR_FILLSTYLE)).GetValue();
    2467           0 :             SdrPathObj* aLinePolygonPart = NULL;
    2468           0 :             SdrPathObj* aLineHairlinePart = NULL;
    2469           0 :             bool bBuildGroup(false);
    2470             : 
    2471           0 :             if(aMergedLineFillPolyPolygon.count())
    2472             :             {
    2473             :                 // create SdrObject for filled line geometry
    2474           0 :                 aLinePolygonPart = new SdrPathObj(OBJ_PATHFILL, aMergedLineFillPolyPolygon);
    2475           0 :                 aLinePolygonPart->SetModel(pRet->GetModel());
    2476             : 
    2477             :                 // correct item properties
    2478           0 :                 aSet.Put(XLineWidthItem(0L));
    2479           0 :                 aSet.Put(XLineStyleItem(drawing::LineStyle_NONE));
    2480           0 :                 Color aColorLine = static_cast<const XLineColorItem&>(aSet.Get(XATTR_LINECOLOR)).GetColorValue();
    2481           0 :                 sal_uInt16 nTransLine = static_cast<const XLineTransparenceItem&>(aSet.Get(XATTR_LINETRANSPARENCE)).GetValue();
    2482           0 :                 aSet.Put(XFillColorItem(OUString(), aColorLine));
    2483           0 :                 aSet.Put(XFillStyleItem(drawing::FillStyle_SOLID));
    2484           0 :                 aSet.Put(XFillTransparenceItem(nTransLine));
    2485             : 
    2486           0 :                 aLinePolygonPart->SetMergedItemSet(aSet);
    2487             :             }
    2488             : 
    2489           0 :             if(aMergedHairlinePolyPolygon.count())
    2490             :             {
    2491             :                 // create SdrObject for hairline geometry
    2492             :                 // OBJ_PATHLINE is necessary here, not OBJ_PATHFILL. This is intended
    2493             :                 // to get a non-filled object. If the poly is closed, the PathObj takes care for
    2494             :                 // the correct closed state.
    2495           0 :                 aLineHairlinePart = new SdrPathObj(OBJ_PATHLINE, aMergedHairlinePolyPolygon);
    2496           0 :                 aLineHairlinePart->SetModel(pRet->GetModel());
    2497             : 
    2498           0 :                 aSet.Put(XLineWidthItem(0L));
    2499           0 :                 aSet.Put(XFillStyleItem(drawing::FillStyle_NONE));
    2500           0 :                 aSet.Put(XLineStyleItem(drawing::LineStyle_SOLID));
    2501             : 
    2502             :                 // it is also necessary to switch off line start and ends here
    2503           0 :                 aSet.Put(XLineStartWidthItem(0));
    2504           0 :                 aSet.Put(XLineEndWidthItem(0));
    2505             : 
    2506           0 :                 aLineHairlinePart->SetMergedItemSet(aSet);
    2507             : 
    2508           0 :                 if(aLinePolygonPart)
    2509             :                 {
    2510           0 :                     bBuildGroup = true;
    2511             :                 }
    2512             :             }
    2513             : 
    2514             :             // check if original geometry should be added (e.g. filled and closed)
    2515           0 :             bool bAddOriginalGeometry(false);
    2516           0 :             SdrPathObj* pPath = PTR_CAST(SdrPathObj, pRet);
    2517             : 
    2518           0 :             if(pPath && pPath->IsClosed())
    2519             :             {
    2520           0 :                 if(eOldFillStyle != drawing::FillStyle_NONE)
    2521             :                 {
    2522           0 :                     bAddOriginalGeometry = true;
    2523             :                 }
    2524             :             }
    2525             : 
    2526             :             // do we need a group?
    2527           0 :             if(bBuildGroup || bAddOriginalGeometry)
    2528             :             {
    2529           0 :                 SdrObject* pGroup = new SdrObjGroup;
    2530           0 :                 pGroup->SetModel(pRet->GetModel());
    2531             : 
    2532           0 :                 if(bAddOriginalGeometry)
    2533             :                 {
    2534             :                     // Add a clone of the original geometry.
    2535           0 :                     aSet.ClearItem();
    2536           0 :                     aSet.Put(pRet->GetMergedItemSet());
    2537           0 :                     aSet.Put(XLineStyleItem(drawing::LineStyle_NONE));
    2538           0 :                     aSet.Put(XLineWidthItem(0L));
    2539             : 
    2540           0 :                     SdrObject* pClone = pRet->Clone();
    2541             : 
    2542           0 :                     pClone->SetModel(pRet->GetModel());
    2543           0 :                     pClone->SetMergedItemSet(aSet);
    2544             : 
    2545           0 :                     pGroup->GetSubList()->NbcInsertObject(pClone);
    2546             :                 }
    2547             : 
    2548           0 :                 if(aLinePolygonPart)
    2549             :                 {
    2550           0 :                     pGroup->GetSubList()->NbcInsertObject(aLinePolygonPart);
    2551             :                 }
    2552             : 
    2553           0 :                 if(aLineHairlinePart)
    2554             :                 {
    2555           0 :                     pGroup->GetSubList()->NbcInsertObject(aLineHairlinePart);
    2556             :                 }
    2557             : 
    2558           0 :                 pRet = pGroup;
    2559             : 
    2560             :                 // be more careful with the state describing bool
    2561           0 :                 bNoChange = false;
    2562             :             }
    2563             :             else
    2564             :             {
    2565           0 :                 if(aLinePolygonPart)
    2566             :                 {
    2567           0 :                     pRet = aLinePolygonPart;
    2568             :                     // be more careful with the state describing bool
    2569           0 :                     bNoChange = false;
    2570             :                 }
    2571           0 :                 else if(aLineHairlinePart)
    2572             :                 {
    2573           0 :                     pRet = aLineHairlinePart;
    2574             :                     // be more careful with the state describing bool
    2575           0 :                     bNoChange = false;
    2576             :                 }
    2577           0 :             }
    2578           0 :         }
    2579             :     }
    2580             : 
    2581           0 :     if(bNoChange)
    2582             :     {
    2583             :         // due to current method usage, create and return a clone when nothing has changed
    2584           0 :         SdrObject* pClone = pRet->Clone();
    2585           0 :         pClone->SetModel(pRet->GetModel());
    2586           0 :         pRet = pClone;
    2587             :     }
    2588             : 
    2589           0 :     return pRet;
    2590             : }
    2591             : 
    2592             : 
    2593             : 
    2594             : 
    2595             : 
    2596             : 
    2597          24 : void SdrObject::SetMarkProtect(bool bProt)
    2598             : {
    2599          24 :     bMarkProt = bProt;
    2600          24 : }
    2601             : 
    2602             : 
    2603             : 
    2604             : 
    2605             : 
    2606             : 
    2607             : 
    2608        7906 : void SdrObject::SetEmptyPresObj(bool bEpt)
    2609             : {
    2610        7906 :     bEmptyPresObj = bEpt;
    2611        7906 : }
    2612             : 
    2613             : 
    2614        1033 : void SdrObject::SetNotVisibleAsMaster(bool bFlg)
    2615             : {
    2616        1033 :     bNotVisibleAsMaster=bFlg;
    2617        1033 : }
    2618             : 
    2619             : 
    2620             : 
    2621             : 
    2622             : // convert this path object to contour object, even when it is a group
    2623           0 : SdrObject* SdrObject::ConvertToContourObj(SdrObject* pRet, bool bForceLineDash) const
    2624             : {
    2625           0 :     if(pRet->ISA(SdrObjGroup))
    2626             :     {
    2627           0 :         SdrObjList* pObjList2 = pRet->GetSubList();
    2628           0 :         SdrObject* pGroup = new SdrObjGroup;
    2629           0 :         pGroup->SetModel(pRet->GetModel());
    2630             : 
    2631           0 :         for(size_t a=0; a<pObjList2->GetObjCount(); ++a)
    2632             :         {
    2633           0 :             SdrObject* pIterObj = pObjList2->GetObj(a);
    2634           0 :             pGroup->GetSubList()->NbcInsertObject(ConvertToContourObj(pIterObj, bForceLineDash));
    2635             :         }
    2636             : 
    2637           0 :         pRet = pGroup;
    2638             :     }
    2639             :     else
    2640             :     {
    2641           0 :         if(pRet && pRet->ISA(SdrPathObj))
    2642             :         {
    2643           0 :             SdrPathObj* pPathObj = static_cast<SdrPathObj*>(pRet);
    2644             : 
    2645             :             // bezier geometry got created, even for straight edges since the given
    2646             :             // object is a result of DoConvertToPolyObj. For conversion to contour
    2647             :             // this is not really needed and can be reduced again AFAP
    2648           0 :             pPathObj->SetPathPoly(basegfx::tools::simplifyCurveSegments(pPathObj->GetPathPoly()));
    2649             :         }
    2650             : 
    2651           0 :         pRet = ImpConvertToContourObj(pRet, bForceLineDash);
    2652             :     }
    2653             : 
    2654             :     // #i73441# preserve LayerID
    2655           0 :     if(pRet && pRet->GetLayer() != GetLayer())
    2656             :     {
    2657           0 :         pRet->SetLayer(GetLayer());
    2658             :     }
    2659             : 
    2660           0 :     return pRet;
    2661             : }
    2662             : 
    2663             : 
    2664             : 
    2665          26 : SdrObject* SdrObject::ConvertToPolyObj(bool bBezier, bool bLineToArea) const
    2666             : {
    2667          26 :     SdrObject* pRet = DoConvertToPolyObj(bBezier, true);
    2668             : 
    2669          26 :     if(pRet && bLineToArea)
    2670             :     {
    2671           0 :         SdrObject* pNewRet = ConvertToContourObj(pRet);
    2672           0 :         delete pRet;
    2673           0 :         pRet = pNewRet;
    2674             :     }
    2675             : 
    2676             :     // #i73441# preserve LayerID
    2677          26 :     if(pRet && pRet->GetLayer() != GetLayer())
    2678             :     {
    2679           0 :         pRet->SetLayer(GetLayer());
    2680             :     }
    2681             : 
    2682          26 :     return pRet;
    2683             : }
    2684             : 
    2685             : 
    2686             : 
    2687           0 : SdrObject* SdrObject::DoConvertToPolyObj(bool /*bBezier*/, bool /*bAddText*/) const
    2688             : {
    2689           0 :     return NULL;
    2690             : }
    2691             : 
    2692             : 
    2693             : 
    2694      141784 : void SdrObject::SetInserted(bool bIns)
    2695             : {
    2696      141784 :     if (bIns!=IsInserted()) {
    2697      141784 :         bInserted=bIns;
    2698      141784 :         Rectangle aBoundRect0(GetLastBoundRect());
    2699      141784 :         if (bIns) SendUserCall(SDRUSERCALL_INSERTED,aBoundRect0);
    2700       29851 :         else SendUserCall(SDRUSERCALL_REMOVED,aBoundRect0);
    2701             : 
    2702      141784 :         if (pPlusData!=NULL && pPlusData->pBroadcast!=NULL) {
    2703        1059 :             SdrHint aHint(*this);
    2704        1059 :             aHint.SetKind(bIns?HINT_OBJINSERTED:HINT_OBJREMOVED);
    2705        1059 :             pPlusData->pBroadcast->Broadcast(aHint);
    2706             :         }
    2707             :     }
    2708      141784 : }
    2709             : 
    2710         219 : void SdrObject::SetMoveProtect(bool bProt)
    2711             : {
    2712         219 :     if(IsMoveProtect() != bProt)
    2713             :     {
    2714             :         // #i77187# secured and simplified
    2715         102 :         bMovProt = bProt;
    2716         102 :         SetChanged();
    2717         102 :         BroadcastObjectChange();
    2718             :     }
    2719         219 : }
    2720             : 
    2721         968 : void SdrObject::SetResizeProtect(bool bProt)
    2722             : {
    2723         968 :     if(IsResizeProtect() != bProt)
    2724             :     {
    2725             :         // #i77187# secured and simplified
    2726         827 :         bSizProt = bProt;
    2727         827 :         SetChanged();
    2728         827 :         BroadcastObjectChange();
    2729             :     }
    2730         968 : }
    2731             : 
    2732        1784 : void SdrObject::SetPrintable(bool bPrn)
    2733             : {
    2734        1784 :     if( bPrn == bNoPrint )
    2735             :     {
    2736           0 :         bNoPrint=!bPrn;
    2737           0 :         SetChanged();
    2738           0 :         if (IsInserted() && pModel!=NULL)
    2739             :         {
    2740           0 :             SdrHint aHint(*this);
    2741           0 :             pModel->Broadcast(aHint);
    2742             :         }
    2743             :     }
    2744        1784 : }
    2745             : 
    2746        1788 : void SdrObject::SetVisible(bool bVisible)
    2747             : {
    2748        1788 :     if( bVisible != mbVisible )
    2749             :     {
    2750           4 :         mbVisible = bVisible;
    2751           4 :         SetChanged();
    2752           4 :         if (IsInserted() && pModel!=NULL)
    2753             :         {
    2754           4 :             SdrHint aHint(*this);
    2755           4 :             pModel->Broadcast(aHint);
    2756             :         }
    2757             :     }
    2758        1788 : }
    2759             : 
    2760             : 
    2761             : 
    2762      179177 : sal_uInt16 SdrObject::GetUserDataCount() const
    2763             : {
    2764      179177 :     if (pPlusData==NULL || pPlusData->pUserDataList==NULL) return 0;
    2765       88719 :     return pPlusData->pUserDataList->GetUserDataCount();
    2766             : }
    2767             : 
    2768       89237 : SdrObjUserData* SdrObject::GetUserData(sal_uInt16 nNum) const
    2769             : {
    2770       89237 :     if (pPlusData==NULL || pPlusData->pUserDataList==NULL) return NULL;
    2771       89237 :     return pPlusData->pUserDataList->GetUserData(nNum);
    2772             : }
    2773             : 
    2774        9702 : void SdrObject::AppendUserData(SdrObjUserData* pData)
    2775             : {
    2776        9702 :     if (!pData)
    2777             :     {
    2778             :         OSL_FAIL("SdrObject::AppendUserData(): pData is NULL pointer.");
    2779        9702 :         return;
    2780             :     }
    2781             : 
    2782        9702 :     ImpForcePlusData();
    2783        9702 :     if (!pPlusData->pUserDataList)
    2784        9441 :         pPlusData->pUserDataList = new SdrObjUserDataList;
    2785             : 
    2786        9702 :     pPlusData->pUserDataList->AppendUserData(pData);
    2787             : }
    2788             : 
    2789           6 : void SdrObject::DeleteUserData(sal_uInt16 nNum)
    2790             : {
    2791           6 :     sal_uInt16 nCount=GetUserDataCount();
    2792           6 :     if (nNum<nCount) {
    2793           6 :         pPlusData->pUserDataList->DeleteUserData(nNum);
    2794           6 :         if (nCount==1)  {
    2795           3 :             delete pPlusData->pUserDataList;
    2796           3 :             pPlusData->pUserDataList=NULL;
    2797             :         }
    2798             :     } else {
    2799             :         OSL_FAIL("SdrObject::DeleteUserData(): Invalid Index.");
    2800             :     }
    2801           6 : }
    2802             : 
    2803      220368 : void SdrObject::SetUserCall(SdrObjUserCall* pUser)
    2804             : {
    2805      220368 :     pUserCall = pUser;
    2806      220368 : }
    2807             : 
    2808             : 
    2809     1131856 : void SdrObject::SendUserCall(SdrUserCallType eUserCall, const Rectangle& rBoundRect) const
    2810             : {
    2811     1131856 :     SdrObject* pGroup = NULL;
    2812             : 
    2813     1131856 :     if( pObjList && pObjList->GetListKind() == SDROBJLIST_GROUPOBJ )
    2814      594319 :         pGroup = pObjList->GetOwnerObj();
    2815             : 
    2816     1131856 :     if ( pUserCall )
    2817             :     {
    2818      335864 :         pUserCall->Changed( *this, eUserCall, rBoundRect );
    2819             :     }
    2820             : 
    2821     2858031 :     while( pGroup )
    2822             :     {
    2823             :         // broadcast to group
    2824      594319 :         if( pGroup->GetUserCall() )
    2825             :         {
    2826       14165 :             SdrUserCallType eChildUserType = SDRUSERCALL_CHILD_CHGATTR;
    2827             : 
    2828       14165 :             switch( eUserCall )
    2829             :             {
    2830             :                 case SDRUSERCALL_MOVEONLY:
    2831        4410 :                     eChildUserType = SDRUSERCALL_CHILD_MOVEONLY;
    2832        4410 :                 break;
    2833             : 
    2834             :                 case SDRUSERCALL_RESIZE:
    2835        4058 :                     eChildUserType = SDRUSERCALL_CHILD_RESIZE;
    2836        4058 :                 break;
    2837             : 
    2838             :                 case SDRUSERCALL_CHGATTR:
    2839        4146 :                     eChildUserType = SDRUSERCALL_CHILD_CHGATTR;
    2840        4146 :                 break;
    2841             : 
    2842             :                 case SDRUSERCALL_DELETE:
    2843           0 :                     eChildUserType = SDRUSERCALL_CHILD_DELETE;
    2844           0 :                 break;
    2845             : 
    2846             :                 case SDRUSERCALL_COPY:
    2847           0 :                     eChildUserType = SDRUSERCALL_CHILD_COPY;
    2848           0 :                 break;
    2849             : 
    2850             :                 case SDRUSERCALL_INSERTED:
    2851        1337 :                     eChildUserType = SDRUSERCALL_CHILD_INSERTED;
    2852        1337 :                 break;
    2853             : 
    2854             :                 case SDRUSERCALL_REMOVED:
    2855         214 :                     eChildUserType = SDRUSERCALL_CHILD_REMOVED;
    2856         214 :                 break;
    2857             : 
    2858           0 :                 default: break;
    2859             :             }
    2860             : 
    2861       14165 :             pGroup->GetUserCall()->Changed( *this, eChildUserType, rBoundRect );
    2862             :         }
    2863             : 
    2864     1764978 :         if( pGroup->GetObjList()                                       &&
    2865     1123522 :             pGroup->GetObjList()->GetListKind() == SDROBJLIST_GROUPOBJ &&
    2866      529203 :             pGroup != pObjList->GetOwnerObj() )
    2867           0 :             pGroup = pObjList->GetOwnerObj();
    2868             :         else
    2869      594319 :             pGroup = NULL;
    2870             :     }
    2871             : 
    2872             :     // notify our UNO shape listeners
    2873     1131856 :     switch ( eUserCall )
    2874             :     {
    2875             :     case SDRUSERCALL_RESIZE:
    2876      365945 :         notifyShapePropertyChange( svx::eShapeSize );
    2877             :         // fall through - RESIZE might also imply a change of the position
    2878             :     case SDRUSERCALL_MOVEONLY:
    2879      450489 :         notifyShapePropertyChange( svx::eShapePosition );
    2880      450489 :         break;
    2881             :     default:
    2882             :         // not interested in
    2883      681367 :         break;
    2884             :     }
    2885     1131856 : }
    2886             : 
    2887             : // change ItemPool for this object
    2888      103474 : void SdrObject::MigrateItemPool(SfxItemPool* pSrcPool, SfxItemPool* pDestPool, SdrModel* pNewModel)
    2889             : {
    2890      103474 :     if(pSrcPool && pDestPool && (pSrcPool != pDestPool))
    2891             :     {
    2892      103474 :         GetProperties().MoveToItemPool(pSrcPool, pDestPool, pNewModel);
    2893             :     }
    2894      103474 : }
    2895             : 
    2896      401259 : void SdrObject::impl_setUnoShape( const uno::Reference< uno::XInterface >& _rxUnoShape )
    2897             : {
    2898      401259 :     const uno::Reference< uno::XInterface>& xOldUnoShape( maWeakUnoShape );
    2899             :     // the UNO shape would be gutted by the following code; return early
    2900      401259 :     if ( _rxUnoShape == xOldUnoShape )
    2901             :     {
    2902      200977 :         if ( !xOldUnoShape.is() )
    2903             :         {
    2904             :             // make sure there is no stale impl. pointer if the UNO
    2905             :             // shape was destroyed meanwhile (remember we only hold weak
    2906             :             // reference to it!)
    2907      135139 :             mpSvxShape = 0;
    2908             :         }
    2909      602236 :         return;
    2910             :     }
    2911             : 
    2912      200282 :     bool bTransferOwnership( false );
    2913      200282 :     if ( xOldUnoShape.is() )
    2914             :     {
    2915       31817 :         bTransferOwnership = mpSvxShape->HasSdrObjectOwnership();
    2916             :         // Remove yourself from the current UNO shape. Its destructor
    2917             :         // will reset our UNO shape otherwise.
    2918       31817 :         mpSvxShape->InvalidateSdrObject();
    2919             :     }
    2920             : 
    2921      200282 :     maWeakUnoShape = _rxUnoShape;
    2922      200282 :     mpSvxShape = SvxShape::getImplementation( _rxUnoShape );
    2923             : 
    2924             :     // I think this may never happen... But I am not sure enough .-)
    2925      200282 :     if ( bTransferOwnership )
    2926             :     {
    2927           0 :         if (mpSvxShape)
    2928           0 :             mpSvxShape->TakeSdrObjectOwnership();
    2929             :         SAL_WARN( "svx.uno", "a UNO shape took over an SdrObject previously owned by another UNO shape!");
    2930      200282 :     }
    2931             : }
    2932             : 
    2933             : /** only for internal use! */
    2934     1355148 : SvxShape* SdrObject::getSvxShape()
    2935             : {
    2936             :     DBG_TESTSOLARMUTEX();
    2937             :         // retrieving the impl pointer and subsequently using it is not thread-safe, of course, so it needs to be
    2938             :         // guarded by the SolarMutex
    2939             : 
    2940     1355148 :     uno::Reference< uno::XInterface > xShape( maWeakUnoShape );
    2941             : #if OSL_DEBUG_LEVEL > 0
    2942             :     OSL_ENSURE( !( !xShape.is() && mpSvxShape ),
    2943             :         "SdrObject::getSvxShape: still having IMPL-Pointer to dead object!" );
    2944             : #endif
    2945             :     //#113608#, make sure mpSvxShape is always synchronized with maWeakUnoShape
    2946     1355148 :     if ( mpSvxShape && !xShape.is() )
    2947           0 :         mpSvxShape = NULL;
    2948             : 
    2949     1355148 :     return mpSvxShape;
    2950             : }
    2951             : 
    2952      117359 : ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SdrObject::getUnoShape()
    2953             : {
    2954             :     // try weak reference first
    2955      117359 :     uno::Reference< uno::XInterface > xShape( getWeakUnoShape() );
    2956      117359 :     if( !xShape.is() )
    2957             :     {
    2958             :         OSL_ENSURE( mpSvxShape == NULL, "SdrObject::getUnoShape: XShape already dead, but still an IMPL pointer!" );
    2959       68576 :         if ( pPage )
    2960             :         {
    2961       67144 :             uno::Reference< uno::XInterface > xPage( pPage->getUnoPage() );
    2962       67144 :             if( xPage.is() )
    2963             :             {
    2964       67143 :                 SvxDrawPage* pDrawPage = SvxDrawPage::getImplementation(xPage);
    2965       67143 :                 if( pDrawPage )
    2966             :                 {
    2967             :                     // create one
    2968       67143 :                     xShape = pDrawPage->_CreateShape( this );
    2969       67143 :                     impl_setUnoShape( xShape );
    2970             :                 }
    2971       67144 :             }
    2972             :         }
    2973             :         else
    2974             :         {
    2975        1432 :             mpSvxShape = SvxDrawPage::CreateShapeByTypeAndInventor( GetObjIdentifier(), GetObjInventor(), this, NULL );
    2976        1432 :             maWeakUnoShape = xShape = static_cast< ::cppu::OWeakObject* >( mpSvxShape );
    2977             :         }
    2978             :     }
    2979             : 
    2980      117359 :     return xShape;
    2981             : }
    2982             : 
    2983      334116 : void SdrObject::setUnoShape(const uno::Reference<uno::XInterface >& _rxUnoShape)
    2984             : {
    2985      334116 :     impl_setUnoShape( _rxUnoShape );
    2986      334116 : }
    2987             : 
    2988        6904 : svx::PropertyChangeNotifier& SdrObject::getShapePropertyChangeNotifier()
    2989             : {
    2990             :     DBG_TESTSOLARMUTEX();
    2991             : 
    2992        6904 :     SvxShape* pSvxShape = getSvxShape();
    2993        6904 :     ENSURE_OR_THROW( pSvxShape, "no SvxShape, yet!" );
    2994        6904 :     return pSvxShape->getShapePropertyChangeNotifier();
    2995             : }
    2996             : 
    2997      818671 : void SdrObject::notifyShapePropertyChange( const svx::ShapeProperty _eProperty ) const
    2998             : {
    2999             :     DBG_TESTSOLARMUTEX();
    3000             : 
    3001      818671 :     SvxShape* pSvxShape = const_cast< SdrObject* >( this )->getSvxShape();
    3002      818671 :     if ( pSvxShape )
    3003      539864 :         return pSvxShape->getShapePropertyChangeNotifier().notifyPropertyChange( _eProperty );
    3004             : }
    3005             : 
    3006             : 
    3007             : 
    3008             : // transformation interface for StarOfficeAPI. This implements support for
    3009             : // homogeneous 3x3 matrices containing the transformation of the SdrObject. At the
    3010             : // moment it contains a shearX, rotation and translation, but for setting all linear
    3011             : // transforms like Scale, ShearX, ShearY, Rotate and Translate are supported.
    3012             : 
    3013             : 
    3014             : // gets base transformation and rectangle of object. If it's an SdrPathObj it fills the PolyPolygon
    3015             : // with the base geometry and returns TRUE. Otherwise it returns FALSE.
    3016         413 : bool SdrObject::TRGetBaseGeometry(basegfx::B2DHomMatrix& rMatrix, basegfx::B2DPolyPolygon& /*rPolyPolygon*/) const
    3017             : {
    3018             :     // any kind of SdrObject, just use SnapRect
    3019         413 :     Rectangle aRectangle(GetSnapRect());
    3020             : 
    3021             :     // convert to transformation values
    3022         413 :     basegfx::B2DTuple aScale(aRectangle.GetWidth(), aRectangle.GetHeight());
    3023         826 :     basegfx::B2DTuple aTranslate(aRectangle.Left(), aRectangle.Top());
    3024             : 
    3025             :     // position maybe relative to anchorpos, convert
    3026         413 :     if( pModel && pModel->IsWriter() )
    3027             :     {
    3028          27 :         if(GetAnchorPos().X() || GetAnchorPos().Y())
    3029             :         {
    3030           0 :             aTranslate -= basegfx::B2DTuple(GetAnchorPos().X(), GetAnchorPos().Y());
    3031             :         }
    3032             :     }
    3033             : 
    3034             :     // force MapUnit to 100th mm
    3035         413 :     const SfxMapUnit eMapUnit(GetObjectMapUnit());
    3036         413 :     if(eMapUnit != SFX_MAPUNIT_100TH_MM)
    3037             :     {
    3038          27 :         switch(eMapUnit)
    3039             :         {
    3040             :             case SFX_MAPUNIT_TWIP :
    3041             :             {
    3042             :                 // position
    3043          27 :                 aTranslate.setX(ImplTwipsToMM(aTranslate.getX()));
    3044          27 :                 aTranslate.setY(ImplTwipsToMM(aTranslate.getY()));
    3045             : 
    3046             :                 // size
    3047          27 :                 aScale.setX(ImplTwipsToMM(aScale.getX()));
    3048          27 :                 aScale.setY(ImplTwipsToMM(aScale.getY()));
    3049             : 
    3050          27 :                 break;
    3051             :             }
    3052             :             default:
    3053             :             {
    3054             :                 OSL_FAIL("TRGetBaseGeometry: Missing unit translation to 100th mm!");
    3055             :             }
    3056             :         }
    3057             :     }
    3058             : 
    3059             :     // build matrix
    3060         413 :     rMatrix = basegfx::tools::createScaleTranslateB2DHomMatrix(aScale, aTranslate);
    3061             : 
    3062         826 :     return false;
    3063             : }
    3064             : 
    3065             : // sets the base geometry of the object using infos contained in the homogeneous 3x3 matrix.
    3066             : // If it's an SdrPathObj it will use the provided geometry information. The Polygon has
    3067             : // to use (0,0) as upper left and will be scaled to the given size in the matrix.
    3068         332 : void SdrObject::TRSetBaseGeometry(const basegfx::B2DHomMatrix& rMatrix, const basegfx::B2DPolyPolygon& /*rPolyPolygon*/)
    3069             : {
    3070             :     // break up matrix
    3071         332 :     basegfx::B2DTuple aScale;
    3072         664 :     basegfx::B2DTuple aTranslate;
    3073             :     double fRotate, fShearX;
    3074         332 :     rMatrix.decompose(aScale, aTranslate, fRotate, fShearX);
    3075             : 
    3076             :     // #i75086# Old DrawingLayer (GeoStat and geometry) does not support holding negative scalings
    3077             :     // in X and Y which equal a 180 degree rotation. Recognize it and react accordingly
    3078         332 :     if(basegfx::fTools::less(aScale.getX(), 0.0) && basegfx::fTools::less(aScale.getY(), 0.0))
    3079             :     {
    3080           0 :         aScale.setX(fabs(aScale.getX()));
    3081           0 :         aScale.setY(fabs(aScale.getY()));
    3082             :     }
    3083             : 
    3084             :     // force metric to pool metric
    3085         332 :     const SfxMapUnit eMapUnit(GetObjectMapUnit());
    3086         332 :     if(eMapUnit != SFX_MAPUNIT_100TH_MM)
    3087             :     {
    3088           0 :         switch(eMapUnit)
    3089             :         {
    3090             :             case SFX_MAPUNIT_TWIP :
    3091             :             {
    3092             :                 // position
    3093           0 :                 aTranslate.setX(ImplMMToTwips(aTranslate.getX()));
    3094           0 :                 aTranslate.setY(ImplMMToTwips(aTranslate.getY()));
    3095             : 
    3096             :                 // size
    3097           0 :                 aScale.setX(ImplMMToTwips(aScale.getX()));
    3098           0 :                 aScale.setY(ImplMMToTwips(aScale.getY()));
    3099             : 
    3100           0 :                 break;
    3101             :             }
    3102             :             default:
    3103             :             {
    3104             :                 OSL_FAIL("TRSetBaseGeometry: Missing unit translation to PoolMetric!");
    3105             :             }
    3106             :         }
    3107             :     }
    3108             : 
    3109             :     // if anchor is used, make position relative to it
    3110         332 :     if( pModel && pModel->IsWriter() )
    3111             :     {
    3112           0 :         if(GetAnchorPos().X() || GetAnchorPos().Y())
    3113             :         {
    3114           0 :             aTranslate += basegfx::B2DTuple(GetAnchorPos().X(), GetAnchorPos().Y());
    3115             :         }
    3116             :     }
    3117             : 
    3118             :     // build BaseRect
    3119         332 :     Point aPoint(FRound(aTranslate.getX()), FRound(aTranslate.getY()));
    3120         332 :     Rectangle aBaseRect(aPoint, Size(FRound(aScale.getX()), FRound(aScale.getY())));
    3121             : 
    3122             :     // set BaseRect
    3123         664 :     SetSnapRect(aBaseRect);
    3124         332 : }
    3125             : 
    3126             : // Give info if object is in destruction
    3127           0 : bool SdrObject::IsInDestruction() const
    3128             : {
    3129           0 :     if(pModel)
    3130           0 :         return pModel->IsInDestruction();
    3131           0 :     return false;
    3132             : }
    3133             : 
    3134             : // return if fill is != drawing::FillStyle_NONE
    3135           0 : bool SdrObject::HasFillStyle() const
    3136             : {
    3137           0 :     return static_cast<const XFillStyleItem&>(GetObjectItem(XATTR_FILLSTYLE)).GetValue() != drawing::FillStyle_NONE;
    3138             : }
    3139             : 
    3140           2 : bool SdrObject::HasLineStyle() const
    3141             : {
    3142           2 :     return static_cast<const XLineStyleItem&>(GetObjectItem(XATTR_LINESTYLE)).GetValue() != drawing::LineStyle_NONE;
    3143             : }
    3144             : 
    3145             : 
    3146             : // #i52224#
    3147             : // on import of OLE object from MS documents the BLIP size might be retrieved,
    3148             : // the following four methods are used to control it;
    3149             : // usually this data makes no sense after the import is finished, since the object
    3150             : // might be resized
    3151             : 
    3152             : 
    3153          55 : void SdrObject::SetBLIPSizeRectangle( const Rectangle& aRect )
    3154             : {
    3155          55 :     maBLIPSizeRectangle = aRect;
    3156          55 : }
    3157             : 
    3158        2144 : void SdrObject::SetContextWritingMode( const sal_Int16 /*_nContextWritingMode*/ )
    3159             : {
    3160             :     // this base class does not support different writing modes, so ignore the call
    3161        2144 : }
    3162             : 
    3163           0 : void SdrObject::SetDoNotInsertIntoPageAutomatically(const bool bSet)
    3164             : {
    3165           0 :     mbDoNotInsertIntoPageAutomatically = bSet;
    3166           0 : }
    3167             : 
    3168             : 
    3169             : // #i121917#
    3170           0 : bool SdrObject::HasText() const
    3171             : {
    3172           0 :     return false;
    3173             : }
    3174             : 
    3175        6167 : SdrObjFactory::SdrObjFactory(sal_uInt32 nInvent, sal_uInt16 nIdent, SdrPage* pNewPage, SdrModel* pNewModel)
    3176             : {
    3177        6167 :     nInventor=nInvent;
    3178        6167 :     nIdentifier=nIdent;
    3179        6167 :     pNewObj=NULL;
    3180        6167 :     pPage=pNewPage;
    3181        6167 :     pModel=pNewModel;
    3182        6167 :     pObj=NULL;
    3183        6167 :     pNewData=NULL;
    3184        6167 : }
    3185             : 
    3186        6167 : SdrObject* SdrObjFactory::CreateObjectFromFactory( sal_uInt32 nInventor, sal_uInt16 nIdentifier, SdrPage* pPage, SdrModel* pModel )
    3187             : {
    3188        6167 :     boost::scoped_ptr<SdrObjFactory> pFact(new SdrObjFactory(nInventor, nIdentifier, pPage, pModel));
    3189             : 
    3190        6167 :     SdrLinkList& rLL = ImpGetUserMakeObjHdl();
    3191        6167 :     unsigned n = rLL.GetLinkCount();
    3192        6167 :     unsigned i = 0;
    3193        6167 :     SdrObject* pObj = NULL;
    3194       18501 :     while (i < n && !pObj)
    3195             :     {
    3196        6167 :         rLL.GetLink(i).Call(static_cast<void*>(pFact.get()));
    3197        6167 :         pObj = pFact->pNewObj;
    3198        6167 :         i++;
    3199             :     }
    3200             : 
    3201        6167 :     return pObj;
    3202             : }
    3203             : 
    3204         996 : SdrObject* SdrObjFactory::MakeNewObject(sal_uInt32 nInvent, sal_uInt16 nIdent, SdrPage* pPage, SdrModel* pModel)
    3205             : {
    3206         996 :     if (!pModel && pPage)
    3207           0 :         pModel = pPage->GetModel();
    3208             : 
    3209         996 :     SdrObject* pObj = NULL;
    3210             : 
    3211         996 :     if (nInvent == SdrInventor)
    3212             :     {
    3213         996 :         switch (nIdent)
    3214             :         {
    3215           0 :             case sal_uInt16(OBJ_NONE       ): pObj=new SdrObject;                   break;
    3216          29 :             case sal_uInt16(OBJ_GRUP       ): pObj=new SdrObjGroup;                 break;
    3217          19 :             case sal_uInt16(OBJ_LINE       ): pObj=new SdrPathObj(OBJ_LINE       ); break;
    3218         188 :             case sal_uInt16(OBJ_POLY       ): pObj=new SdrPathObj(OBJ_POLY       ); break;
    3219           2 :             case sal_uInt16(OBJ_PLIN       ): pObj=new SdrPathObj(OBJ_PLIN       ); break;
    3220           0 :             case sal_uInt16(OBJ_PATHLINE   ): pObj=new SdrPathObj(OBJ_PATHLINE   ); break;
    3221         204 :             case sal_uInt16(OBJ_PATHFILL   ): pObj=new SdrPathObj(OBJ_PATHFILL   ); break;
    3222           0 :             case sal_uInt16(OBJ_FREELINE   ): pObj=new SdrPathObj(OBJ_FREELINE   ); break;
    3223           0 :             case sal_uInt16(OBJ_FREEFILL   ): pObj=new SdrPathObj(OBJ_FREEFILL   ); break;
    3224           0 :             case sal_uInt16(OBJ_PATHPOLY   ): pObj=new SdrPathObj(OBJ_POLY       ); break;
    3225           0 :             case sal_uInt16(OBJ_PATHPLIN   ): pObj=new SdrPathObj(OBJ_PLIN       ); break;
    3226           0 :             case sal_uInt16(OBJ_EDGE       ): pObj=new SdrEdgeObj;                  break;
    3227         277 :             case sal_uInt16(OBJ_RECT       ): pObj=new SdrRectObj;                  break;
    3228           1 :             case sal_uInt16(OBJ_CIRC       ): pObj=new SdrCircObj(OBJ_CIRC       ); break;
    3229           0 :             case sal_uInt16(OBJ_SECT       ): pObj=new SdrCircObj(OBJ_SECT       ); break;
    3230           0 :             case sal_uInt16(OBJ_CARC       ): pObj=new SdrCircObj(OBJ_CARC       ); break;
    3231           0 :             case sal_uInt16(OBJ_CCUT       ): pObj=new SdrCircObj(OBJ_CCUT       ); break;
    3232           4 :             case sal_uInt16(OBJ_TEXT       ): pObj=new SdrRectObj(OBJ_TEXT       ); break;
    3233           0 :             case sal_uInt16(OBJ_TEXTEXT    ): pObj=new SdrRectObj(OBJ_TEXTEXT    ); break;
    3234           1 :             case sal_uInt16(OBJ_TITLETEXT  ): pObj=new SdrRectObj(OBJ_TITLETEXT  ); break;
    3235           0 :             case sal_uInt16(OBJ_OUTLINETEXT): pObj=new SdrRectObj(OBJ_OUTLINETEXT); break;
    3236           0 :             case sal_uInt16(OBJ_MEASURE    ): pObj=new SdrMeasureObj;               break;
    3237          45 :             case sal_uInt16(OBJ_GRAF       ): pObj=new SdrGrafObj;                  break;
    3238           0 :             case sal_uInt16(OBJ_OLE2       ): pObj=new SdrOle2Obj;                  break;
    3239           0 :             case sal_uInt16(OBJ_FRAME      ): pObj=new SdrOle2Obj(true);            break;
    3240           3 :             case sal_uInt16(OBJ_CAPTION    ): pObj=new SdrCaptionObj;               break;
    3241           0 :             case sal_uInt16(OBJ_PAGE       ): pObj=new SdrPageObj;                  break;
    3242           0 :             case sal_uInt16(OBJ_UNO        ): pObj=new SdrUnoObj(OUString());       break;
    3243         223 :             case sal_uInt16(OBJ_CUSTOMSHAPE  ): pObj=new SdrObjCustomShape();       break;
    3244             : #if HAVE_FEATURE_AVMEDIA
    3245           0 :             case sal_uInt16(OBJ_MEDIA      ): pObj=new SdrMediaObj();               break;
    3246             : #endif
    3247           0 :             case sal_uInt16(OBJ_TABLE      ): pObj=new sdr::table::SdrTableObj(pModel);   break;
    3248           0 :             case sal_uInt16(OBJ_OPENGL     ): pObj=new SdrOpenGLObj;                break;
    3249             :         }
    3250             :     }
    3251             : 
    3252         996 :     if (!pObj)
    3253           0 :         pObj = CreateObjectFromFactory(nInvent, nIdent, pPage, pModel);
    3254             : 
    3255         996 :     if (!pObj)
    3256             :     {
    3257             :         // Well, if no one wants it...
    3258           0 :         return NULL;
    3259             :     }
    3260             : 
    3261         996 :     if (pPage)
    3262           0 :         pObj->SetPage(pPage);
    3263         996 :     else if (pModel)
    3264           0 :         pObj->SetModel(pModel);
    3265             : 
    3266         996 :     return pObj;
    3267             : }
    3268             : 
    3269       94976 : SdrObject* SdrObjFactory::MakeNewObject(
    3270             :     sal_uInt32 nInventor, sal_uInt16 nIdentifier, const Rectangle& rSnapRect, SdrPage* pPage )
    3271             : {
    3272       94976 :     SdrModel* pModel = pPage ? pPage->GetModel() : NULL;
    3273             : 
    3274       94976 :     SdrObject* pObj = NULL;
    3275             : 
    3276       94976 :     bool bSetSnapRect = true;
    3277             : 
    3278       94976 :     if (nInventor == SdrInventor)
    3279             :     {
    3280       88809 :         switch (nIdentifier)
    3281             :         {
    3282             :             case OBJ_MEASURE:
    3283             :             {
    3284           7 :                 pObj = new SdrMeasureObj(rSnapRect.TopLeft(), rSnapRect.BottomRight());
    3285             :             }
    3286           7 :             break;
    3287             :             case OBJ_LINE:
    3288             :             {
    3289         248 :                 basegfx::B2DPolygon aPoly;
    3290         248 :                 aPoly.append(basegfx::B2DPoint(rSnapRect.Left(), rSnapRect.Top()));
    3291         248 :                 aPoly.append(basegfx::B2DPoint(rSnapRect.Right(), rSnapRect.Bottom()));
    3292         248 :                 pObj = new SdrPathObj(OBJ_LINE, basegfx::B2DPolyPolygon(aPoly));
    3293             :             }
    3294         248 :             break;
    3295             :             case OBJ_TEXT:
    3296             :             case OBJ_TEXTEXT:
    3297             :             case OBJ_TITLETEXT:
    3298             :             case OBJ_OUTLINETEXT:
    3299             :             {
    3300       22159 :                 pObj = new SdrRectObj(static_cast<SdrObjKind>(nIdentifier), rSnapRect);
    3301       22159 :                 bSetSnapRect = false;
    3302             :             }
    3303       22159 :             break;
    3304             :             case OBJ_CIRC:
    3305             :             case OBJ_SECT:
    3306             :             case OBJ_CARC:
    3307             :             case OBJ_CCUT:
    3308             :             {
    3309         114 :                 pObj = new SdrCircObj(static_cast<SdrObjKind>(nIdentifier), rSnapRect);
    3310         114 :                 bSetSnapRect = false;
    3311             :             }
    3312         114 :             break;
    3313           0 :             case sal_uInt16(OBJ_NONE       ): pObj=new SdrObject;                   break;
    3314       34283 :             case sal_uInt16(OBJ_GRUP       ): pObj=new SdrObjGroup;                 break;
    3315       10845 :             case sal_uInt16(OBJ_POLY       ): pObj=new SdrPathObj(OBJ_POLY       ); break;
    3316        6239 :             case sal_uInt16(OBJ_PLIN       ): pObj=new SdrPathObj(OBJ_PLIN       ); break;
    3317          50 :             case sal_uInt16(OBJ_PATHLINE   ): pObj=new SdrPathObj(OBJ_PATHLINE   ); break;
    3318         816 :             case sal_uInt16(OBJ_PATHFILL   ): pObj=new SdrPathObj(OBJ_PATHFILL   ); break;
    3319           0 :             case sal_uInt16(OBJ_FREELINE   ): pObj=new SdrPathObj(OBJ_FREELINE   ); break;
    3320           0 :             case sal_uInt16(OBJ_FREEFILL   ): pObj=new SdrPathObj(OBJ_FREEFILL   ); break;
    3321           0 :             case sal_uInt16(OBJ_PATHPOLY   ): pObj=new SdrPathObj(OBJ_POLY       ); break;
    3322           0 :             case sal_uInt16(OBJ_PATHPLIN   ): pObj=new SdrPathObj(OBJ_PLIN       ); break;
    3323           1 :             case sal_uInt16(OBJ_EDGE       ): pObj=new SdrEdgeObj;                  break;
    3324       10914 :             case sal_uInt16(OBJ_RECT       ): pObj=new SdrRectObj;                  break;
    3325         625 :             case sal_uInt16(OBJ_GRAF       ): pObj=new SdrGrafObj;                  break;
    3326         214 :             case sal_uInt16(OBJ_OLE2       ): pObj=new SdrOle2Obj;                  break;
    3327           0 :             case sal_uInt16(OBJ_FRAME      ): pObj=new SdrOle2Obj(true);            break;
    3328          16 :             case sal_uInt16(OBJ_CAPTION    ): pObj=new SdrCaptionObj;               break;
    3329           0 :             case sal_uInt16(OBJ_PAGE       ): pObj=new SdrPageObj;                  break;
    3330           0 :             case sal_uInt16(OBJ_UNO        ): pObj=new SdrUnoObj(OUString());       break;
    3331        2250 :             case sal_uInt16(OBJ_CUSTOMSHAPE  ): pObj=new SdrObjCustomShape();       break;
    3332             : #if HAVE_FEATURE_AVMEDIA
    3333           7 :             case sal_uInt16(OBJ_MEDIA      ): pObj=new SdrMediaObj();               break;
    3334             : #endif
    3335          21 :             case sal_uInt16(OBJ_TABLE      ): pObj=new sdr::table::SdrTableObj(pModel);   break;
    3336           0 :             case sal_uInt16(OBJ_OPENGL     ): pObj=new SdrOpenGLObj;                break;
    3337             :         }
    3338             :     }
    3339             : 
    3340       94976 :     if (!pObj)
    3341        6167 :         pObj = CreateObjectFromFactory(nInventor, nIdentifier, pPage, pModel);
    3342             : 
    3343       94976 :     if (!pObj)
    3344             :     {
    3345             :         // Well, if no one wants it...
    3346           0 :         return NULL;
    3347             :     }
    3348             : 
    3349       94976 :     if (pPage)
    3350       94976 :         pObj->SetPage(pPage);
    3351             : 
    3352       94976 :     if (bSetSnapRect)
    3353       72703 :         pObj->SetSnapRect(rSnapRect);
    3354             : 
    3355       94976 :     return pObj;
    3356             : }
    3357             : 
    3358         287 : void SdrObjFactory::InsertMakeObjectHdl(const Link<>& rLink)
    3359             : {
    3360         287 :     SdrLinkList& rLL=ImpGetUserMakeObjHdl();
    3361         287 :     rLL.InsertLink(rLink);
    3362         287 : }
    3363             : 
    3364          59 : void SdrObjFactory::RemoveMakeObjectHdl(const Link<>& rLink)
    3365             : {
    3366          59 :     SdrLinkList& rLL=ImpGetUserMakeObjHdl();
    3367          59 :     rLL.RemoveLink(rLink);
    3368          59 : }
    3369             : 
    3370         458 : void SdrObjFactory::InsertMakeUserDataHdl(const Link<>& rLink)
    3371             : {
    3372         458 :     SdrLinkList& rLL=ImpGetUserMakeObjUserDataHdl();
    3373         458 :     rLL.InsertLink(rLink);
    3374         458 : }
    3375             : 
    3376         432 : void SdrObjFactory::RemoveMakeUserDataHdl(const Link<>& rLink)
    3377             : {
    3378         432 :     SdrLinkList& rLL=ImpGetUserMakeObjUserDataHdl();
    3379         432 :     rLL.RemoveLink(rLink);
    3380         432 : }
    3381             : 
    3382             : namespace svx
    3383             : {
    3384           0 :     ISdrObjectFilter::~ISdrObjectFilter()
    3385             :     {
    3386           0 :     }
    3387         435 : }
    3388             : 
    3389             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11