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