LibreOffice Module svx (master) 1
svdobj.cxx
Go to the documentation of this file.
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 *
9 * This file incorporates work covered by the following license notice:
10 *
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 */
19
20#include <svx/svdobj.hxx>
21#include <config_features.h>
22
23#include <sal/config.h>
24#include <sal/log.hxx>
25
26#include <com/sun/star/lang/XComponent.hpp>
27#include <com/sun/star/text/RelOrientation.hpp>
28#include <com/sun/star/frame/XTerminateListener.hpp>
29#include <com/sun/star/frame/Desktop.hpp>
30
41#include <editeng/editeng.hxx>
42#include <editeng/outlobj.hxx>
43#include <o3tl/deleter.hxx>
44#include <math.h>
45#include <svl/grabbagitem.hxx>
46#include <tools/bigint.hxx>
48#include <tools/helpers.hxx>
50#include <vcl/canvastools.hxx>
51#include <vcl/ptrstyle.hxx>
52#include <vector>
53
55#include <svx/svdotable.hxx>
56
62#include <svx/sdrobjectuser.hxx>
64#include <svx/svddrag.hxx>
65#include <svx/svdetc.hxx>
66#include <svx/svdhdl.hxx>
67#include <svx/svditer.hxx>
68#include <svx/svdmodel.hxx>
69#include <svx/svdoashp.hxx>
70#include <svx/svdocapt.hxx>
71#include <svx/svdocirc.hxx>
72#include <svx/svdoedge.hxx>
73#include <svx/svdograf.hxx>
74#include <svx/svdogrp.hxx>
75#include <svx/svdomeas.hxx>
76#include <svx/svdomedia.hxx>
77#include <svx/svdoole2.hxx>
78#include <svx/svdopage.hxx>
79#include <svx/svdopath.hxx>
80#include <svx/svdorect.hxx>
81#include <svx/svdotext.hxx>
82#include <svx/svdouno.hxx>
83#include <svx/svdovirt.hxx>
84#include <svx/svdpage.hxx>
85#include <svx/svdpool.hxx>
86#include <svx/strings.hrc>
87#include <svx/dialmgr.hxx>
88#include <svx/svdtrans.hxx>
89#include <svx/svdundo.hxx>
90#include <svx/svdview.hxx>
91#include <sxlayitm.hxx>
92#include <sxlogitm.hxx>
93#include <sxmovitm.hxx>
94#include <sxoneitm.hxx>
95#include <sxopitm.hxx>
96#include <sxreoitm.hxx>
97#include <sxrooitm.hxx>
98#include <sxsaitm.hxx>
99#include <sxsoitm.hxx>
100#include <sxtraitm.hxx>
101#include <svx/unopage.hxx>
102#include <svx/unoshape.hxx>
103#include <svx/xfillit0.hxx>
104#include <svx/xflclit.hxx>
105#include <svx/xfltrit.hxx>
106#include <svx/xlineit0.hxx>
107#include <svx/xlnclit.hxx>
108#include <svx/xlnedwit.hxx>
109#include <svx/xlnstwit.hxx>
110#include <svx/xlntrit.hxx>
111#include <svx/xlnwtit.hxx>
112#include <svx/svdglue.hxx>
113#include <svx/svdsob.hxx>
114#include <svdobjplusdata.hxx>
115#include <svdobjuserdatalist.hxx>
116
117#include <unordered_set>
118
119#include <optional>
120#include <libxml/xmlwriter.h>
121#include <memory>
122
123#include <svx/scene3d.hxx>
124#include <rtl/character.hxx>
126#include <o3tl/string_view.hxx>
127
128using namespace ::com::sun::star;
129
130
132{
133}
134
135void SdrObjUserCall::Changed(const SdrObject& /*rObj*/, SdrUserCallType /*eType*/, const tools::Rectangle& /*rOldBoundRect*/)
136{
137}
138
140{
141 return -1;
142}
143
145 pVisiLayer(nullptr),
146 pPageView(nullptr),
147 nTol(0) {}
148
149
151 nInventor(nInv),
152 nIdentifier(nId) {}
153
155 nInventor(rData.nInventor),
156 nIdentifier(rData.nIdentifier) {}
157
159
161 bMovProt(false),
162 bSizProt(false),
163 bNoPrint(false),
164 bClosedObj(false),
165 mbVisible(true),
166 mnLayerID(0)
167{
168}
169
171{
172}
173
175 bMoveAllowed(true),
176 bResizeFreeAllowed(true),
177 bResizePropAllowed(true),
178 bRotateFreeAllowed(true),
179 bRotate90Allowed(true),
180 bMirrorFreeAllowed(true),
181 bMirror45Allowed(true),
182 bMirror90Allowed(true),
183 bTransparenceAllowed(true),
184 bShearAllowed(true),
185 bEdgeRadiusAllowed(true),
186 bNoOrthoDesired(true),
187 bNoContortion(true),
188 bCanConvToPath(true),
189 bCanConvToPoly(true),
190 bCanConvToContour(false),
191 bCanConvToPathLineToArea(true),
192 bCanConvToPolyLineToArea(true) {}
193
195{
197 std::optional<double> mnRelativeWidth;
198 std::optional<double> mnRelativeHeight;
201
203 meRelativeWidthRelation(text::RelOrientation::PAGE_FRAME),
204 meRelativeHeightRelation(text::RelOrientation::PAGE_FRAME) {}
205};
206
207const std::shared_ptr< svx::diagram::IDiagramHelper >& SdrObject::getDiagramHelper() const
208{
209 static std::shared_ptr< svx::diagram::IDiagramHelper > aEmpty;
210 return aEmpty;
211}
212
213// BaseProperties section
214
215std::unique_ptr<sdr::properties::BaseProperties> SdrObject::CreateObjectSpecificProperties()
216{
217 return std::make_unique<sdr::properties::EmptyProperties>(*this);
218}
219
221{
222 if(!mpProperties)
223 {
224 // CAUTION(!) Do *not* call this during SdrObject construction,
225 // that will lead to wrong type-casts (dependent on constructor-level)
226 // and thus eventually create the wrong sdr::properties (!). Is there
227 // a way to check if on the stack is a SdrObject-constructor (?)
228 const_cast< SdrObject* >(this)->mpProperties =
229 const_cast< SdrObject* >(this)->CreateObjectSpecificProperties();
230 }
231
232 return *mpProperties;
233}
234
235
236// ObjectUser section
237
239{
240 mpImpl->maObjectUsers.push_back(&rNewUser);
241}
242
244{
245 const sdr::ObjectUserVector::iterator aFindResult =
246 std::find(mpImpl->maObjectUsers.begin(), mpImpl->maObjectUsers.end(), &rOldUser);
247 if (aFindResult != mpImpl->maObjectUsers.end())
248 {
249 mpImpl->maObjectUsers.erase(aFindResult);
250 }
251}
252
253
254// DrawContact section
255
256std::unique_ptr<sdr::contact::ViewContact> SdrObject::CreateObjectSpecificViewContact()
257{
258 return std::make_unique<sdr::contact::ViewContactOfSdrObj>(*this);
259}
260
262{
263 if(!mpViewContact)
264 {
265 const_cast< SdrObject* >(this)->mpViewContact =
266 const_cast< SdrObject* >(this)->CreateObjectSpecificViewContact();
267 }
268
269 return *mpViewContact;
270}
271
272// DrawContact support: Methods for handling Object changes
274{
275 // Do necessary ViewContact actions
277}
278
280{
281 if (SdrObjList* pParentList = getParentSdrObjListFromSdrObject())
282 {
283 return pParentList->getSdrPageFromSdrObjList();
284 }
285
286 return nullptr;
287}
288
290{
292}
293
295{
296 assert(!pNewObjList || mpParentOfSdrObject != pNewObjList);
297 if(mpParentOfSdrObject == pNewObjList)
298 return;
299 // we need to be removed from the old parent before we are attached to the new parent
300 assert(bool(mpParentOfSdrObject) != bool(pNewObjList) && "may only transition empty->full or full->empty");
301
302 // remember current page
303 SdrPage* pOldPage(getSdrPageFromSdrObject());
304
305 // set new parent
306 mpParentOfSdrObject = pNewObjList;
307
308 // get new page
309 SdrPage* pNewPage(getSdrPageFromSdrObject());
310
311 // broadcast page change over objects if needed
312 if(pOldPage != pNewPage)
313 {
314 handlePageChange(pOldPage, pNewPage);
315 }
316}
317
319{
320 return mpParentOfSdrObject;
321}
322
324{
325 // default has no children
326 return nullptr;
327}
328
330{
332}
333
334#ifdef DBG_UTIL
335// SdrObjectLifetimeWatchDog:
337{
338 rSdrModel.maAllIncarnatedObjects.insert(&rSdrObject);
339}
341{
342 if(!rSdrModel.maAllIncarnatedObjects.erase(&rSdrObject))
343 {
344 assert(false && "SdrObject::~SdrObject: Destructed incarnation of SdrObject not member of this SdrModel (!)");
345 }
346}
347#endif
348
350: mpFillGeometryDefiningShape(nullptr)
351 ,mrSdrModelFromSdrObject(rSdrModel)
352 ,m_pUserCall(nullptr)
353 ,mpImpl(new Impl)
354 ,mpParentOfSdrObject(nullptr)
355 ,m_nOrdNum(0)
356 ,mnNavigationPosition(SAL_MAX_UINT32)
357 ,mnLayerID(0)
358 ,mpSvxShape( nullptr )
359 ,mbDoNotInsertIntoPageAutomatically(false)
360{
361 m_bVirtObj =false;
362 m_bSnapRectDirty =true;
363 m_bMovProt =false;
364 m_bSizProt =false;
365 m_bNoPrint =false;
366 m_bEmptyPresObj =false;
368 m_bClosedObj =false;
369 mbVisible = true;
370
371 // #i25616#
373
374 // #i25616#
376
377 m_bIsEdge=false;
378 m_bIs3DObj=false;
379 m_bMarkProt=false;
380 m_bIsUnoObj=false;
381#ifdef DBG_UTIL
382 // SdrObjectLifetimeWatchDog:
384#endif
385}
386
387SdrObject::SdrObject(SdrModel& rSdrModel, SdrObject const & rSource)
388: mpFillGeometryDefiningShape(nullptr)
389 ,mrSdrModelFromSdrObject(rSdrModel)
390 ,m_pUserCall(nullptr)
391 ,mpImpl(new Impl)
392 ,mpParentOfSdrObject(nullptr)
393 ,m_nOrdNum(0)
394 ,mnNavigationPosition(SAL_MAX_UINT32)
395 ,mnLayerID(0)
396 ,mpSvxShape( nullptr )
397 ,mbDoNotInsertIntoPageAutomatically(false)
398{
399 m_bVirtObj =false;
400 m_bSnapRectDirty =true;
401 m_bMovProt =false;
402 m_bSizProt =false;
403 m_bNoPrint =false;
404 m_bEmptyPresObj =false;
406 m_bClosedObj =false;
407 mbVisible = true;
408
409 // #i25616#
411
412 // #i25616#
414
415 m_bIsEdge=false;
416 m_bIs3DObj=false;
417 m_bMarkProt=false;
418 m_bIsUnoObj=false;
419
420 mpProperties.reset();
421 mpViewContact.reset();
422
423 // The CloneSdrObject() method uses the local copy constructor from the individual
424 // sdr::properties::BaseProperties class. Since the target class maybe for another
425 // draw object, an SdrObject needs to be provided, as in the normal constructor.
426 mpProperties = rSource.GetProperties().Clone(*this);
427
429 mnLayerID = rSource.mnLayerID;
430 m_aAnchor =rSource.m_aAnchor;
431 m_bVirtObj=rSource.m_bVirtObj;
432 m_bSizProt=rSource.m_bSizProt;
433 m_bMovProt=rSource.m_bMovProt;
434 m_bNoPrint=rSource.m_bNoPrint;
435 mbVisible=rSource.mbVisible;
436 m_bMarkProt=rSource.m_bMarkProt;
439 m_bSnapRectDirty=true;
440 m_pPlusData.reset();
441 if (rSource.m_pPlusData!=nullptr) {
442 m_pPlusData.reset(rSource.m_pPlusData->Clone(this));
443 }
444 if (m_pPlusData!=nullptr && m_pPlusData->pBroadcast!=nullptr) {
445 m_pPlusData->pBroadcast.reset(); // broadcaster isn't copied
446 }
447
448 m_pGrabBagItem.reset();
449 if (rSource.m_pGrabBagItem!=nullptr)
450 m_pGrabBagItem.reset(rSource.m_pGrabBagItem->Clone());
451#ifdef DBG_UTIL
452 // SdrObjectLifetimeWatchDog:
454#endif
455}
456
458{
459#ifdef DBG_UTIL
460 // see logic in SdrObject::release
461 assert(m_refCount == -1);
462#endif
463 // Tell all the registered ObjectUsers that the page is in destruction.
464 // And clear the vector. This means that user do not need to call RemoveObjectUser()
465 // when they get called from ObjectInDestruction().
467 aList.swap(mpImpl->maObjectUsers);
468 for(sdr::ObjectUser* pObjectUser : aList)
469 {
470 DBG_ASSERT(pObjectUser, "SdrObject::~SdrObject: corrupt ObjectUser list (!)");
471 pObjectUser->ObjectInDestruction(*this);
472 }
473
474 // UserCall
477
478 m_pGrabBagItem.reset();
479 mpProperties.reset();
480 mpViewContact.reset();
481#ifdef DBG_UTIL
482 // SdrObjectLifetimeWatchDog:
484#endif
485}
486
487void SdrObject::acquire() noexcept
488{
489#ifdef DBG_UTIL
490 assert(m_refCount != -1);
491#endif
492 osl_atomic_increment( &m_refCount );
493}
494
495void SdrObject::release() noexcept
496{
497 oslInterlockedCount x = osl_atomic_decrement( &m_refCount );
498 if ( x == 0 )
499 {
501#ifdef DBG_UTIL
502 // make sure it doesn't accidentally come back to life, see assert in acquire()
503 osl_atomic_decrement( &m_refCount );
504#endif
505 delete this;
506 }
507}
508
509void SdrObject::SetBoundAndSnapRectsDirty(bool bNotMyself, bool bRecursive)
510{
511 if (!bNotMyself)
512 {
514 m_bSnapRectDirty=true;
515 }
516
517 if (bRecursive && nullptr != getParentSdrObjListFromSdrObject())
518 {
520 }
521}
522
524{
525}
526
527
528// global static ItemPool for not-yet-inserted items
530
532namespace
533{
534class TerminateListener : public ::cppu::WeakImplHelper< css::frame::XTerminateListener >
535{
536 void SAL_CALL queryTermination( const lang::EventObject& ) override
537 {}
538 void SAL_CALL notifyTermination( const lang::EventObject& ) override
539 {
540 mpGlobalItemPool.clear();
541 }
542 virtual void SAL_CALL disposing( const ::css::lang::EventObject& ) override
543 {}
544};
545};
546
547// init global static itempool
549{
551 {
554 mpGlobalItemPool->SetSecondaryPool(pGlobalOutlPool.get());
556 mpGlobalItemPool->FreezeIdRanges();
558 mpGlobalItemPool->acquire();
559 else
560 {
561 uno::Reference< frame::XDesktop2 > xDesktop = frame::Desktop::create(comphelper::getProcessComponentContext());
562 uno::Reference< frame::XTerminateListener > xListener( new TerminateListener );
563 xDesktop->addTerminateListener( xListener );
564 }
565 }
566
567 return *mpGlobalItemPool;
568}
569
571{
572 mpImpl->mnRelativeWidth = nValue;
573}
574
576{
577 mpImpl->meRelativeWidthRelation = eValue;
578}
579
581{
582 mpImpl->mnRelativeHeight = nValue;
583}
584
586{
587 mpImpl->meRelativeHeightRelation = eValue;
588}
589
590const double* SdrObject::GetRelativeWidth( ) const
591{
592 if (!mpImpl->mnRelativeWidth)
593 return nullptr;
594
595 return &*mpImpl->mnRelativeWidth;
596}
597
599{
600 return mpImpl->meRelativeWidthRelation;
601}
602
603const double* SdrObject::GetRelativeHeight( ) const
604{
605 if (!mpImpl->mnRelativeHeight)
606 return nullptr;
607
608 return &*mpImpl->mnRelativeHeight;
609}
610
612{
613 return mpImpl->meRelativeHeightRelation;
614}
615
617{
619}
620
622{
624}
625
627{
628 return SdrObjKind::NONE;
629}
630
632{
633 rInfo.bRotateFreeAllowed=false;
634 rInfo.bMirrorFreeAllowed=false;
635 rInfo.bTransparenceAllowed = false;
636 rInfo.bShearAllowed =false;
637 rInfo.bEdgeRadiusAllowed=false;
638 rInfo.bCanConvToPath =false;
639 rInfo.bCanConvToPoly =false;
640 rInfo.bCanConvToContour = false;
641 rInfo.bCanConvToPathLineToArea=false;
642 rInfo.bCanConvToPolyLineToArea=false;
643}
644
646{
647 return mnLayerID;
648}
649
651{
652 if (rSet.IsSet(GetLayer()))
653 return true;
654 SdrObjList* pOL=GetSubList();
655 if (!pOL)
656 return false;
657 const size_t nObjCount = pOL->GetObjCount();
658 for (size_t nObjNum = 0; nObjNum<nObjCount; ++nObjNum)
659 if (pOL->GetObj(nObjNum)->isVisibleOnAnyOfTheseLayers(rSet))
660 return true;
661 return false;
662}
663
665{
666 mnLayerID = nLayer;
667}
668
670{
671 NbcSetLayer(nLayer);
672 SetChanged();
674}
675
677{
679 if (m_pPlusData->pBroadcast==nullptr) m_pPlusData->pBroadcast.reset(new SfxBroadcaster);
680
681 // SdrEdgeObj may be connected to same SdrObject on both ends so allow it
682 // to listen twice
683 SdrEdgeObj const*const pEdge(dynamic_cast<SdrEdgeObj const*>(&rListener));
684 rListener.StartListening(*m_pPlusData->pBroadcast, pEdge ? DuplicateHandling::Allow : DuplicateHandling::Unexpected);
685}
686
688{
689 if (m_pPlusData!=nullptr && m_pPlusData->pBroadcast!=nullptr) {
690 rListener.EndListening(*m_pPlusData->pBroadcast);
691 if (!m_pPlusData->pBroadcast->HasListeners()) {
692 m_pPlusData->pBroadcast.reset();
693 }
694 }
695}
696
698{
699 return m_pPlusData!=nullptr ? m_pPlusData->pBroadcast.get() : nullptr;
700}
701
703{
704 AddListener(rVrtObj);
705}
706
708{
709 RemoveListener(rVrtObj);
710}
711
713{
714 return GetSubList()!=nullptr;
715}
716
718{
719 return nullptr;
720}
721
723{
725
726 if(nullptr == pParent)
727 {
728 return nullptr;
729 }
730
731 return pParent->getSdrObjectFromSdrObjList();
732}
733
734void SdrObject::SetName(const OUString& rStr, const bool bSetChanged)
735{
736 if (!rStr.isEmpty() && !m_pPlusData)
737 {
739 }
740
741 if(!(m_pPlusData && m_pPlusData->aObjName != rStr))
742 return;
743
744 // Undo/Redo for setting object's name (#i73249#)
745 bool bUndo( false );
746 if ( getSdrModelFromSdrObject().IsUndoEnabled() )
747 {
748 bUndo = true;
749 std::unique_ptr<SdrUndoAction> pUndoAction =
751 *this,
753 GetName(),
754 rStr );
755 getSdrModelFromSdrObject().BegUndo( pUndoAction->GetComment() );
756 getSdrModelFromSdrObject().AddUndo( std::move(pUndoAction) );
757 }
758 m_pPlusData->aObjName = rStr;
759 // Undo/Redo for setting object's name (#i73249#)
760 if ( bUndo )
761 {
763 }
764 if (bSetChanged)
765 {
766 SetChanged();
768 }
769}
770
771const OUString & SdrObject::GetName() const
772{
773 static const OUString EMPTY = u"";
774
775 if(m_pPlusData)
776 {
777 return m_pPlusData->aObjName;
778 }
779
780 return EMPTY;
781}
782
783void SdrObject::SetTitle(const OUString& rStr)
784{
785 if (!rStr.isEmpty() && !m_pPlusData)
786 {
788 }
789
790 if(!(m_pPlusData && m_pPlusData->aObjTitle != rStr))
791 return;
792
793 // Undo/Redo for setting object's title (#i73249#)
794 bool bUndo( false );
795 if ( getSdrModelFromSdrObject().IsUndoEnabled() )
796 {
797 bUndo = true;
798 std::unique_ptr<SdrUndoAction> pUndoAction =
800 *this,
802 GetTitle(),
803 rStr );
804 getSdrModelFromSdrObject().BegUndo( pUndoAction->GetComment() );
805 getSdrModelFromSdrObject().AddUndo( std::move(pUndoAction) );
806 }
807 m_pPlusData->aObjTitle = rStr;
808 // Undo/Redo for setting object's title (#i73249#)
809 if ( bUndo )
810 {
812 }
813 SetChanged();
815}
816
817OUString SdrObject::GetTitle() const
818{
819 if(m_pPlusData)
820 {
821 return m_pPlusData->aObjTitle;
822 }
823
824 return OUString();
825}
826
827void SdrObject::SetDescription(const OUString& rStr)
828{
829 if (!rStr.isEmpty() && !m_pPlusData)
830 {
832 }
833
834 if(!(m_pPlusData && m_pPlusData->aObjDescription != rStr))
835 return;
836
837 // Undo/Redo for setting object's description (#i73249#)
838 bool bUndo( false );
839 if ( getSdrModelFromSdrObject().IsUndoEnabled() )
840 {
841 bUndo = true;
842 std::unique_ptr<SdrUndoAction> pUndoAction =
844 *this,
847 rStr );
848 getSdrModelFromSdrObject().BegUndo( pUndoAction->GetComment() );
849 getSdrModelFromSdrObject().AddUndo( std::move(pUndoAction) );
850 }
851 m_pPlusData->aObjDescription = rStr;
852 // Undo/Redo for setting object's description (#i73249#)
853 if ( bUndo )
854 {
856 }
857 SetChanged();
859}
860
862{
863 if(m_pPlusData)
864 {
865 return m_pPlusData->aObjDescription;
866 }
867
868 return OUString();
869}
870
871sal_uInt32 SdrObject::GetOrdNum() const
872{
873 if (SdrObjList* pParentList = getParentSdrObjListFromSdrObject())
874 {
875 if (pParentList->IsObjOrdNumsDirty())
876 {
877 pParentList->RecalcObjOrdNums();
878 }
879 } else const_cast<SdrObject*>(this)->m_nOrdNum=0;
880 return m_nOrdNum;
881}
882
883void SdrObject::SetOrdNum(sal_uInt32 nNum)
884{
885 m_nOrdNum = nNum;
886}
887
888void SdrObject::GetGrabBagItem(css::uno::Any& rVal) const
889{
890 if (m_pGrabBagItem != nullptr)
891 m_pGrabBagItem->QueryValue(rVal);
892 else
893 rVal <<= uno::Sequence<beans::PropertyValue>();
894}
895
896void SdrObject::SetGrabBagItem(const css::uno::Any& rVal)
897{
898 if (m_pGrabBagItem == nullptr)
900
901 m_pGrabBagItem->PutValue(rVal, 0);
902
903 SetChanged();
905}
906
908{
909 if (nullptr != getParentSdrObjListFromSdrObject() && getParentSdrObjListFromSdrObject()->RecalcNavigationPositions())
910 {
912 }
913 else
914 return GetOrdNum();
915}
916
917
918void SdrObject::SetNavigationPosition (const sal_uInt32 nNewPosition)
919{
920 mnNavigationPosition = nNewPosition;
921}
922
923
924// To make clearer that this method may trigger RecalcBoundRect and thus may be
925// expensive and sometimes problematic (inside a bigger object change you will get
926// non-useful BoundRects sometimes) I rename that method from GetBoundRect() to
927// GetCurrentBoundRect().
929{
930 auto const& rRectangle = getOutRectangle();
931 if (rRectangle.IsEmpty())
932 {
933 const_cast< SdrObject* >(this)->RecalcBoundRect();
934 }
935
936 return rRectangle;
937}
938
939// To have a possibility to get the last calculated BoundRect e.g for producing
940// the first rectangle for repaints (old and new need to be used) without forcing
941// a RecalcBoundRect (which may be problematical and expensive sometimes) I add here
942// a new method for accessing the last BoundRect.
944{
945 return getOutRectangle();
946}
947
949{
950 // #i101680# suppress BoundRect calculations on import(s)
952 return;
953
954 auto const& rRectangle = getOutRectangle();
955
956 // central new method which will calculate the BoundRect using primitive geometry
957 if (!rRectangle.IsEmpty())
958 return;
959
960 // Use view-independent data - we do not want any connections
961 // to e.g. GridOffset in SdrObject-level
964
965 if (xPrimitives.empty())
966 return;
967
968 // use neutral ViewInformation and get the range of the primitives
969 const drawinglayer::geometry::ViewInformation2D aViewInformation2D;
970 const basegfx::B2DRange aRange(xPrimitives.getB2DRange(aViewInformation2D));
971
972 if (!aRange.isEmpty())
973 {
974 tools::Rectangle aNewRectangle(
975 tools::Long(floor(aRange.getMinX())),
976 tools::Long(floor(aRange.getMinY())),
977 tools::Long(ceil(aRange.getMaxX())),
978 tools::Long(ceil(aRange.getMaxY())));
979 setOutRectangle(aNewRectangle);
980 return;
981 }
982}
983
985{
987 return;
988
989 bool bPlusDataBroadcast(m_pPlusData && m_pPlusData->pBroadcast);
990 bool bObjectChange(IsInserted());
991
992 if(!(bPlusDataBroadcast || bObjectChange))
993 return;
994
996
997 if(bPlusDataBroadcast)
998 {
999 m_pPlusData->pBroadcast->Broadcast(aHint);
1000 }
1001
1002 if(bObjectChange)
1003 {
1005 }
1006}
1007
1009{
1010 // For testing purposes, use the new ViewContact for change
1011 // notification now.
1012 ActionChanged();
1013
1014 // TTTT Need to check meaning/usage of IsInserted in one
1015 // of the next changes. It should not mean to have a SdrModel
1016 // set (this is guaranteed now), but should be connected to
1017 // being added to a SdrPage (?)
1018 // TTTT tdf#120066 Indeed - This triggers e.g. by CustomShape
1019 // geometry-presenting SdrObjects that are in a SdrObjGroup,
1020 // but the SdrObjGroup is *by purpose* not inserted.
1021 // Need to check deeper and maybe identify all ::IsInserted()
1022 // calls by rename and let the compiler work...
1023 if(nullptr != getSdrPageFromSdrObject())
1024 {
1026 }
1027}
1028
1029// tooling for painting a single object to an OutputDevice.
1031{
1032 sdr::contact::SdrObjectVector aObjectVector;
1033 aObjectVector.push_back(const_cast< SdrObject* >(this));
1034
1035 sdr::contact::ObjectContactOfObjListPainter aPainter(rOut, std::move(aObjectVector), getSdrPageFromSdrObject());
1036 sdr::contact::DisplayInfo aDisplayInfo;
1037
1038 aPainter.ProcessDisplay(aDisplayInfo);
1039}
1040
1042{
1043 drawing::LineStyle eXLS = GetMergedItem(XATTR_LINESTYLE).GetValue();
1044 return (eXLS != drawing::LineStyle_NONE);
1045}
1046
1048{
1049 // RotGrfFlyFrame: Default is false, support full rotation
1050 return false;
1051}
1052
1054{
1055 OUString sName(SvxResId(STR_ObjNameSingulNONE));
1056
1057 OUString aName(GetName());
1058 if (!aName.isEmpty())
1059 sName += " '" + aName + "'";
1060 return sName;
1061}
1062
1064{
1065 return SvxResId(STR_ObjNamePluralNONE);
1066}
1067
1069{
1070 OUString aStr = SvxResId(pStrCacheID);
1071 sal_Int32 nPos = aStr.indexOf("%1");
1072 if (nPos >= 0)
1073 {
1074 // Replace '%1' with the object name.
1075 OUString aObjName(TakeObjNameSingul());
1076 aStr = aStr.replaceAt(nPos, 2, aObjName);
1077 }
1078
1079 nPos = aStr.indexOf("%2");
1080 if (nPos >= 0)
1081 // Replace '%2' with the passed value.
1082 aStr = aStr.replaceAt(nPos, 2, u"0");
1083 return aStr;
1084}
1085
1087{
1088 if (!m_pPlusData)
1089 m_pPlusData.reset( new SdrObjPlusData );
1090}
1091
1093{
1095}
1096
1098{
1102
1103 return aRetval;
1104}
1105
1107{
1109
1110 // create cloned object without text, but with drawing::LineStyle_SOLID,
1111 // COL_BLACK as line color and drawing::FillStyle_NONE
1113
1114 if(pClone)
1115 {
1116 const SdrTextObj* pTextObj = DynCastSdrTextObj(this);
1117
1118 if(pTextObj)
1119 {
1120 // no text and no text animation
1121 pClone->SetMergedItem(SdrTextAniKindItem(SdrTextAniKind::NONE));
1122 pClone->SetOutlinerParaObject(std::nullopt);
1123 }
1124
1125 const SdrEdgeObj* pEdgeObj = dynamic_cast< const SdrEdgeObj* >(this);
1126
1127 if(pEdgeObj)
1128 {
1129 // create connections if connector, will be cleaned up when
1130 // deleting the connector again
1131 SdrObject* pLeft = pEdgeObj->GetConnectedNode(true);
1132 SdrObject* pRight = pEdgeObj->GetConnectedNode(false);
1133
1134 if(pLeft)
1135 {
1136 pClone->ConnectToNode(true, pLeft);
1137 }
1138
1139 if(pRight)
1140 {
1141 pClone->ConnectToNode(false, pRight);
1142 }
1143 }
1144
1145 SfxItemSet aNewSet(GetObjectItemPool());
1146
1147 // #i101980# ignore LineWidth; that's what the old implementation
1148 // did. With line width, the result may be huge due to fat/thick
1149 // line decompositions
1150 aNewSet.Put(XLineWidthItem(0));
1151
1152 // solid black lines and no fill
1153 aNewSet.Put(XLineStyleItem(drawing::LineStyle_SOLID));
1154 aNewSet.Put(XLineColorItem(OUString(), COL_BLACK));
1155 aNewSet.Put(XFillStyleItem(drawing::FillStyle_NONE));
1156 pClone->SetMergedItemSet(aNewSet);
1157
1158 // get sequence from clone
1159 const sdr::contact::ViewContact& rVC(pClone->GetViewContact());
1162
1163 if(!xSequence.empty())
1164 {
1165 // use neutral ViewInformation
1166 const drawinglayer::geometry::ViewInformation2D aViewInformation2D;
1167
1168 // create extractor, process and get result (with hairlines as opened polygons)
1169 drawinglayer::processor2d::ContourExtractor2D aExtractor(aViewInformation2D, false);
1170 aExtractor.process(xSequence);
1171 const basegfx::B2DPolyPolygonVector& rResult(aExtractor.getExtractedContour());
1172 const sal_uInt32 nSize(rResult.size());
1173
1174 // when count is one, it is implied that the object has only its normal
1175 // contour anyways and TakeContour() is to return an empty PolyPolygon
1176 // (see old implementation for historical reasons)
1177 if(nSize > 1)
1178 {
1179 // the topology for contour is correctly a vector of PolyPolygons; for
1180 // historical reasons cut it back to a single tools::PolyPolygon here
1181 for(sal_uInt32 a(0); a < nSize; a++)
1182 {
1183 aRetval.append(rResult[a]);
1184 }
1185 }
1186 }
1187 }
1188
1189 return aRetval;
1190}
1191
1192sal_uInt32 SdrObject::GetHdlCount() const
1193{
1194 return 8;
1195}
1196
1198{
1199 const tools::Rectangle& rR=GetSnapRect();
1200 for (sal_uInt32 nHdlNum=0; nHdlNum<8; ++nHdlNum)
1201 {
1202 std::unique_ptr<SdrHdl> pH;
1203 switch (nHdlNum) {
1204 case 0: pH.reset(new SdrHdl(rR.TopLeft(), SdrHdlKind::UpperLeft)); break;
1205 case 1: pH.reset(new SdrHdl(rR.TopCenter(), SdrHdlKind::Upper)); break;
1206 case 2: pH.reset(new SdrHdl(rR.TopRight(), SdrHdlKind::UpperRight)); break;
1207 case 3: pH.reset(new SdrHdl(rR.LeftCenter(), SdrHdlKind::Left )); break;
1208 case 4: pH.reset(new SdrHdl(rR.RightCenter(), SdrHdlKind::Right)); break;
1209 case 5: pH.reset(new SdrHdl(rR.BottomLeft(), SdrHdlKind::LowerLeft)); break;
1210 case 6: pH.reset(new SdrHdl(rR.BottomCenter(),SdrHdlKind::Lower)); break;
1211 case 7: pH.reset(new SdrHdl(rR.BottomRight(), SdrHdlKind::LowerRight)); break;
1212 }
1213 rHdlList.AddHdl(std::move(pH));
1214 }
1215}
1216
1218{
1219}
1220
1222{
1223 // Default implementation, does nothing. Overloaded in
1224 // SdrGrafObj and SwVirtFlyDrawObj
1225}
1226
1228{
1229 tools::Rectangle aTmpRect(GetSnapRect());
1230 tools::Rectangle aRect(aTmpRect);
1231 const SdrHdl* pHdl=rDrag.GetHdl();
1232 SdrHdlKind eHdl=pHdl==nullptr ? SdrHdlKind::Move : pHdl->GetKind();
1234 bool bOrtho=rDrag.GetView()!=nullptr && rDrag.GetView()->IsOrtho();
1235 bool bBigOrtho=bEcke && bOrtho && rDrag.GetView()->IsBigOrtho();
1236 Point aPos(rDrag.GetNow());
1237 bool bLft=(eHdl==SdrHdlKind::UpperLeft || eHdl==SdrHdlKind::Left || eHdl==SdrHdlKind::LowerLeft);
1238 bool bRgt=(eHdl==SdrHdlKind::UpperRight || eHdl==SdrHdlKind::Right || eHdl==SdrHdlKind::LowerRight);
1239 bool bTop=(eHdl==SdrHdlKind::UpperRight || eHdl==SdrHdlKind::Upper || eHdl==SdrHdlKind::UpperLeft);
1240 bool bBtm=(eHdl==SdrHdlKind::LowerRight || eHdl==SdrHdlKind::Lower || eHdl==SdrHdlKind::LowerLeft);
1241 if (bLft) aTmpRect.SetLeft(aPos.X() );
1242 if (bRgt) aTmpRect.SetRight(aPos.X() );
1243 if (bTop) aTmpRect.SetTop(aPos.Y() );
1244 if (bBtm) aTmpRect.SetBottom(aPos.Y() );
1245 if (bOrtho) { // Ortho
1246 tools::Long nWdt0=aRect.Right() -aRect.Left();
1247 tools::Long nHgt0=aRect.Bottom()-aRect.Top();
1248 tools::Long nXMul=aTmpRect.Right() -aTmpRect.Left();
1249 tools::Long nYMul=aTmpRect.Bottom()-aTmpRect.Top();
1250 tools::Long nXDiv=nWdt0;
1251 tools::Long nYDiv=nHgt0;
1252 bool bXNeg=(nXMul<0)!=(nXDiv<0);
1253 bool bYNeg=(nYMul<0)!=(nYDiv<0);
1254 nXMul=std::abs(nXMul);
1255 nYMul=std::abs(nYMul);
1256 nXDiv=std::abs(nXDiv);
1257 nYDiv=std::abs(nYDiv);
1258 Fraction aXFact(nXMul,nXDiv); // fractions for canceling
1259 Fraction aYFact(nYMul,nYDiv); // and for comparing
1260 nXMul=aXFact.GetNumerator();
1261 nYMul=aYFact.GetNumerator();
1262 nXDiv=aXFact.GetDenominator();
1263 nYDiv=aYFact.GetDenominator();
1264 if (bEcke) { // corner point handles
1265 bool bUseX=(aXFact<aYFact) != bBigOrtho;
1266 if (bUseX) {
1267 tools::Long nNeed=tools::Long(BigInt(nHgt0)*BigInt(nXMul)/BigInt(nXDiv));
1268 if (bYNeg) nNeed=-nNeed;
1269 if (bTop) aTmpRect.SetTop(aTmpRect.Bottom()-nNeed );
1270 if (bBtm) aTmpRect.SetBottom(aTmpRect.Top()+nNeed );
1271 } else {
1272 tools::Long nNeed=tools::Long(BigInt(nWdt0)*BigInt(nYMul)/BigInt(nYDiv));
1273 if (bXNeg) nNeed=-nNeed;
1274 if (bLft) aTmpRect.SetLeft(aTmpRect.Right()-nNeed );
1275 if (bRgt) aTmpRect.SetRight(aTmpRect.Left()+nNeed );
1276 }
1277 } else { // apex handles
1278 if ((bLft || bRgt) && nXDiv!=0) {
1279 tools::Long nHgt0b=aRect.Bottom()-aRect.Top();
1280 tools::Long nNeed=tools::Long(BigInt(nHgt0b)*BigInt(nXMul)/BigInt(nXDiv));
1281 aTmpRect.AdjustTop( -((nNeed-nHgt0b)/2) );
1282 aTmpRect.SetBottom(aTmpRect.Top()+nNeed );
1283 }
1284 if ((bTop || bBtm) && nYDiv!=0) {
1285 tools::Long nWdt0b=aRect.Right()-aRect.Left();
1286 tools::Long nNeed=tools::Long(BigInt(nWdt0b)*BigInt(nYMul)/BigInt(nYDiv));
1287 aTmpRect.AdjustLeft( -((nNeed-nWdt0b)/2) );
1288 aTmpRect.SetRight(aTmpRect.Left()+nNeed );
1289 }
1290 }
1291 }
1292 aTmpRect.Normalize();
1293 return aTmpRect;
1294}
1295
1296
1298{
1299 return false;
1300}
1301
1303{
1304 return true;
1305}
1306
1308{
1309 // default uses simple clone
1311}
1312
1314{
1315 const SdrHdl* pHdl = rDrag.GetHdl();
1316
1317 SdrHdlKind eHdl = (pHdl == nullptr) ? SdrHdlKind::Move : pHdl->GetKind();
1318
1319 return eHdl==SdrHdlKind::UpperLeft || eHdl==SdrHdlKind::Upper || eHdl==SdrHdlKind::UpperRight ||
1322}
1323
1325{
1326 tools::Rectangle aNewRect(ImpDragCalcRect(rDrag));
1327
1328 if(aNewRect != GetSnapRect())
1329 {
1330 NbcSetSnapRect(aNewRect);
1331 }
1332
1333 return true;
1334}
1335
1336OUString SdrObject::getSpecialDragComment(const SdrDragStat& /*rDrag*/) const
1337{
1338 return OUString();
1339}
1340
1342{
1343 // default has nothing to add
1344 return basegfx::B2DPolyPolygon();
1345}
1346
1347
1348// Create
1350{
1351 rStat.SetOrtho4Possible();
1352 tools::Rectangle aRect1(rStat.GetStart(), rStat.GetNow());
1353 aRect1.Normalize();
1354 rStat.SetActionRect(aRect1);
1355 setOutRectangle(aRect1);
1356 return true;
1357}
1358
1360{
1361 tools::Rectangle aRectangle;
1362 rStat.TakeCreateRect(aRectangle);
1363 rStat.SetActionRect(aRectangle);
1364 aRectangle.Normalize();
1365 setOutRectangle(aRectangle);
1366 return true;
1367}
1368
1370{
1371 tools::Rectangle aRectangle;
1372 rStat.TakeCreateRect(aRectangle);
1373 aRectangle.Normalize();
1374 setOutRectangle(aRectangle);
1375
1376 return (eCmd==SdrCreateCmd::ForceEnd || rStat.GetPointCount()>=2);
1377}
1378
1380{
1381}
1382
1384{
1385 return false;
1386}
1387
1389{
1390 tools::Rectangle aRect1;
1391 rDrag.TakeCreateRect(aRect1);
1392 aRect1.Normalize();
1393
1396 return aRetval;
1397}
1398
1400{
1401 return PointerStyle::Cross;
1402}
1403
1404// transformations
1405void SdrObject::NbcMove(const Size& rSize)
1406{
1407 moveOutRectangle(rSize.Width(), rSize.Height());
1409}
1410
1411void SdrObject::NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact)
1412{
1413 bool bXMirr=(xFact.GetNumerator()<0) != (xFact.GetDenominator()<0);
1414 bool bYMirr=(yFact.GetNumerator()<0) != (yFact.GetDenominator()<0);
1415 if (bXMirr || bYMirr) {
1416 Point aRef1(GetSnapRect().Center());
1417 if (bXMirr) {
1418 Point aRef2(aRef1);
1419 aRef2.AdjustY( 1 );
1420 NbcMirrorGluePoints(aRef1,aRef2);
1421 }
1422 if (bYMirr) {
1423 Point aRef2(aRef1);
1424 aRef2.AdjustX( 1 );
1425 NbcMirrorGluePoints(aRef1,aRef2);
1426 }
1427 }
1428 auto aRectangle = getOutRectangle();
1429 ResizeRect(aRectangle, rRef, xFact, yFact);
1430 setOutRectangle(aRectangle);
1431
1433}
1434
1435void SdrObject::NbcRotate(const Point& rRef, Degree100 nAngle)
1436{
1437 if (nAngle)
1438 {
1439 double a = toRadians(nAngle);
1440 NbcRotate( rRef, nAngle, sin( a ), cos( a ) );
1441 }
1442}
1443
1444namespace
1445{
1446tools::Rectangle lclMirrorRectangle(tools::Rectangle const& rRectangle, Point const& rRef1, Point const& rRef2)
1447{
1448 tools::Rectangle aRectangle(rRectangle);
1449 aRectangle.Move(-rRef1.X(),-rRef1.Y());
1450 tools::Rectangle R(aRectangle);
1451 tools::Long dx=rRef2.X()-rRef1.X();
1452 tools::Long dy=rRef2.Y()-rRef1.Y();
1453 if (dx==0) { // vertical axis
1454 aRectangle.SetLeft(-R.Right() );
1455 aRectangle.SetRight(-R.Left() );
1456 } else if (dy==0) { // horizontal axis
1457 aRectangle.SetTop(-R.Bottom() );
1458 aRectangle.SetBottom(-R.Top() );
1459 } else if (dx==dy) { // 45deg axis
1460 aRectangle.SetLeft(R.Top() );
1461 aRectangle.SetRight(R.Bottom() );
1462 aRectangle.SetTop(R.Left() );
1463 aRectangle.SetBottom(R.Right() );
1464 } else if (dx==-dy) { // 45deg axis
1465 aRectangle.SetLeft(-R.Bottom() );
1466 aRectangle.SetRight(-R.Top() );
1467 aRectangle.SetTop(-R.Right() );
1468 aRectangle.SetBottom(-R.Left() );
1469 }
1470 aRectangle.Move(rRef1.X(),rRef1.Y());
1471 aRectangle.Normalize(); // just in case
1472 return aRectangle;
1473}
1474
1475} // end anonymous namespace
1476
1477void SdrObject::NbcMirror(const Point& rRef1, const Point& rRef2)
1478{
1480
1481 tools::Rectangle aRectangle = getOutRectangle();
1482 aRectangle = lclMirrorRectangle(aRectangle, rRef1, rRef2);
1483 setOutRectangle(aRectangle);
1484
1486 NbcMirrorGluePoints(rRef1,rRef2);
1487 SetGlueReallyAbsolute(false);
1488}
1489
1490void SdrObject::NbcShear(const Point& rRef, Degree100 /*nAngle*/, double tn, bool bVShear)
1491{
1493 NbcShearGluePoints(rRef,tn,bVShear);
1494 SetGlueReallyAbsolute(false);
1495}
1496
1497void SdrObject::Move(const Size& rSiz)
1498{
1499 if (rSiz.Width()!=0 || rSiz.Height()!=0) {
1500 tools::Rectangle aBoundRect0; if (m_pUserCall!=nullptr) aBoundRect0=GetLastBoundRect();
1501 NbcMove(rSiz);
1502 SetChanged();
1505 }
1506}
1507
1508void SdrObject::NbcCrop(const basegfx::B2DPoint& /*aRef*/, double /*fxFact*/, double /*fyFact*/)
1509{
1510 // Default: does nothing. Real behaviour in SwVirtFlyDrawObj and SdrDragCrop::EndSdrDrag.
1511 // Where SwVirtFlyDrawObj is the only real user of it to do something local
1512}
1513
1514void SdrObject::Resize(const Point& rRef, const Fraction& xFact, const Fraction& yFact, bool bUnsetRelative)
1515{
1516 if (xFact.GetNumerator() == xFact.GetDenominator() && yFact.GetNumerator() == yFact.GetDenominator())
1517 return;
1518
1519 if (bUnsetRelative)
1520 {
1521 mpImpl->mnRelativeWidth.reset();
1522 mpImpl->meRelativeWidthRelation = text::RelOrientation::PAGE_FRAME;
1523 mpImpl->meRelativeHeightRelation = text::RelOrientation::PAGE_FRAME;
1524 mpImpl->mnRelativeHeight.reset();
1525 }
1526 tools::Rectangle aBoundRect0; if (m_pUserCall!=nullptr) aBoundRect0=GetLastBoundRect();
1527 NbcResize(rRef,xFact,yFact);
1528 SetChanged();
1531}
1532
1533void SdrObject::Crop(const basegfx::B2DPoint& rRef, double fxFact, double fyFact)
1534{
1535 tools::Rectangle aBoundRect0; if (m_pUserCall!=nullptr) aBoundRect0=GetLastBoundRect();
1536 NbcCrop(rRef, fxFact, fyFact);
1537 SetChanged();
1540}
1541
1542void SdrObject::Rotate(const Point& rRef, Degree100 nAngle, double sn, double cs)
1543{
1544 if (nAngle) {
1545 tools::Rectangle aBoundRect0; if (m_pUserCall!=nullptr) aBoundRect0=GetLastBoundRect();
1546 NbcRotate(rRef,nAngle,sn,cs);
1547 SetChanged();
1550 }
1551}
1552
1553void SdrObject::Mirror(const Point& rRef1, const Point& rRef2)
1554{
1555 tools::Rectangle aBoundRect0; if (m_pUserCall!=nullptr) aBoundRect0=GetLastBoundRect();
1556 NbcMirror(rRef1,rRef2);
1557 SetChanged();
1560}
1561
1562void SdrObject::Shear(const Point& rRef, Degree100 nAngle, double tn, bool bVShear)
1563{
1564 if (nAngle) {
1565 tools::Rectangle aBoundRect0; if (m_pUserCall!=nullptr) aBoundRect0=GetLastBoundRect();
1566 NbcShear(rRef,nAngle,tn,bVShear);
1567 SetChanged();
1570 }
1571}
1572
1573void SdrObject::NbcSetRelativePos(const Point& rPnt)
1574{
1575 Point aRelPos0(GetSnapRect().TopLeft()-m_aAnchor);
1576 Size aSiz(rPnt.X()-aRelPos0.X(),rPnt.Y()-aRelPos0.Y());
1577 NbcMove(aSiz); // This also calls SetRectsDirty()
1578}
1579
1580void SdrObject::SetRelativePos(const Point& rPnt)
1581{
1582 if (rPnt!=GetRelativePos()) {
1583 tools::Rectangle aBoundRect0; if (m_pUserCall!=nullptr) aBoundRect0=GetLastBoundRect();
1584 NbcSetRelativePos(rPnt);
1585 SetChanged();
1588 }
1589}
1590
1592{
1593 return GetSnapRect().TopLeft()-m_aAnchor;
1594}
1595
1596void SdrObject::ImpSetAnchorPos(const Point& rPnt)
1597{
1598 m_aAnchor = rPnt;
1599}
1600
1601void SdrObject::NbcSetAnchorPos(const Point& rPnt)
1602{
1603 Size aSiz(rPnt.X()-m_aAnchor.X(),rPnt.Y()-m_aAnchor.Y());
1604 m_aAnchor=rPnt;
1605 NbcMove(aSiz); // This also calls SetRectsDirty()
1606}
1607
1608void SdrObject::SetAnchorPos(const Point& rPnt)
1609{
1610 if (rPnt!=m_aAnchor) {
1611 tools::Rectangle aBoundRect0; if (m_pUserCall!=nullptr) aBoundRect0=GetLastBoundRect();
1612 NbcSetAnchorPos(rPnt);
1613 SetChanged();
1616 }
1617}
1618
1620{
1621 return m_aAnchor;
1622}
1623
1625{
1626}
1627
1629{
1630 return getOutRectangle();
1631}
1632
1634{
1635 setOutRectangle(rRect);
1636}
1637
1639{
1640 return GetSnapRect();
1641}
1642
1644{
1645 NbcSetSnapRect(rRect);
1646}
1647
1648void SdrObject::AdjustToMaxRect( const tools::Rectangle& rMaxRect, bool /* bShrinkOnly = false */ )
1649{
1650 SetLogicRect( rMaxRect );
1651}
1652
1654{
1655 tools::Rectangle aBoundRect0; if (m_pUserCall!=nullptr) aBoundRect0=GetLastBoundRect();
1656 NbcSetSnapRect(rRect);
1657 SetChanged();
1660}
1661
1663{
1664 tools::Rectangle aBoundRect0; if (m_pUserCall!=nullptr) aBoundRect0=GetLastBoundRect();
1665 NbcSetLogicRect(rRect);
1666 SetChanged();
1669}
1670
1672{
1673 return 0_deg100;
1674}
1675
1676Degree100 SdrObject::GetShearAngle(bool /*bVertical*/) const
1677{
1678 return 0_deg100;
1679}
1680
1682{
1683 return GetPointCount();
1684}
1685
1687{
1688 return GetPoint(i);
1689}
1690
1692{
1693 return false;
1694}
1695
1697{
1698 return 0;
1699}
1700
1701Point SdrObject::GetPoint(sal_uInt32 /*i*/) const
1702{
1703 return Point();
1704}
1705
1706void SdrObject::SetPoint(const Point& rPnt, sal_uInt32 i)
1707{
1708 tools::Rectangle aBoundRect0; if (m_pUserCall!=nullptr) aBoundRect0=GetLastBoundRect();
1709 NbcSetPoint(rPnt, i);
1710 SetChanged();
1713}
1714
1715void SdrObject::NbcSetPoint(const Point& /*rPnt*/, sal_uInt32 /*i*/)
1716{
1717}
1718
1720{
1721 return false;
1722}
1723
1724bool SdrObject::Equals(const SdrObject& rOtherObj) const
1725{
1726 return (m_aAnchor.X() == rOtherObj.m_aAnchor.X() && m_aAnchor.Y() == rOtherObj.m_aAnchor.Y() &&
1727 m_nOrdNum == rOtherObj.m_nOrdNum && mnNavigationPosition == rOtherObj.mnNavigationPosition &&
1730 m_bIs3DObj == rOtherObj.m_bIs3DObj && m_bIsEdge == rOtherObj.m_bIsEdge && m_bClosedObj == rOtherObj.m_bClosedObj &&
1732 mbVisible == rOtherObj.mbVisible && m_bNoPrint == rOtherObj.m_bNoPrint && m_bSizProt == rOtherObj.m_bSizProt &&
1733 m_bMovProt == rOtherObj.m_bMovProt && m_bVirtObj == rOtherObj.m_bVirtObj &&
1734 mnLayerID == rOtherObj.mnLayerID && GetMergedItemSet().Equals(rOtherObj.GetMergedItemSet(), false) );
1735}
1736
1738{
1739 (void)xmlTextWriterStartElement(pWriter, BAD_CAST("SdrObject"));
1740 (void)xmlTextWriterWriteFormatAttribute(pWriter, BAD_CAST("ptr"), "%p", this);
1741 (void)xmlTextWriterWriteFormatAttribute(pWriter, BAD_CAST("symbol"), "%s", BAD_CAST(typeid(*this).name()));
1742 (void)xmlTextWriterWriteFormatAttribute(pWriter, BAD_CAST("name"), "%s", BAD_CAST(GetName().toUtf8().getStr()));
1743 (void)xmlTextWriterWriteFormatAttribute(pWriter, BAD_CAST("title"), "%s", BAD_CAST(GetTitle().toUtf8().getStr()));
1744 (void)xmlTextWriterWriteFormatAttribute(pWriter, BAD_CAST("description"), "%s", BAD_CAST(GetDescription().toUtf8().getStr()));
1745 (void)xmlTextWriterWriteFormatAttribute(pWriter, BAD_CAST("nOrdNum"), "%" SAL_PRIuUINT32, GetOrdNumDirect());
1746 (void)xmlTextWriterWriteAttribute(pWriter, BAD_CAST("aOutRect"), BAD_CAST(getOutRectangle().toString().getStr()));
1747
1748 if (m_pGrabBagItem)
1749 {
1750 m_pGrabBagItem->dumpAsXml(pWriter);
1751 }
1752
1753 if (mpProperties)
1754 {
1755 mpProperties->dumpAsXml(pWriter);
1756 }
1757
1758 if (const OutlinerParaObject* pOutliner = GetOutlinerParaObject())
1759 pOutliner->dumpAsXml(pWriter);
1760
1761 (void)xmlTextWriterEndElement(pWriter);
1762}
1763
1765{
1766 tools::Rectangle aBoundRect0; if (m_pUserCall!=nullptr) aBoundRect0=GetLastBoundRect();
1767 NbcSetOutlinerParaObject(std::move(pTextObject));
1768 SetChanged();
1770 if (GetCurrentBoundRect()!=aBoundRect0) {
1772 }
1773
1774 if (!getSdrModelFromSdrObject().IsUndoEnabled())
1775 return;
1776
1777 // Don't do this during import.
1778 SdrObject* pTopGroupObj = nullptr;
1780 {
1781 pTopGroupObj = getParentSdrObjectFromSdrObject();
1782 while (pTopGroupObj->getParentSdrObjectFromSdrObject())
1783 {
1784 pTopGroupObj = pTopGroupObj->getParentSdrObjectFromSdrObject();
1785 }
1786 }
1787 if (pTopGroupObj)
1788 {
1789 // A shape was modified, which is in a group shape. Empty the group shape's grab-bag,
1790 // which potentially contains the old text of the shapes in case of diagrams.
1791 pTopGroupObj->SetGrabBagItem(uno::Any(uno::Sequence<beans::PropertyValue>()));
1792 }
1793}
1794
1796{
1797}
1798
1800{
1801 return nullptr;
1802}
1803
1805{
1806}
1807
1809{
1811}
1812
1814{
1815 return false;
1816}
1817
1819{
1820 if(rRec.pPageView)
1821 {
1822 return SdrObjectPrimitiveHit(*this, rRec.aPos, rRec.nTol, *rRec.pPageView, rRec.pVisiLayer, false);
1823 }
1824
1825 return nullptr;
1826}
1827
1829{
1830 return PointerStyle::RefHand;
1831}
1832
1834{
1835 const RasterOp eRop(rOut.GetRasterOp());
1836 const basegfx::B2DPolyPolygon aPolyPolygon(TakeXorPoly());
1837
1838 rOut.SetLineColor(COL_BLACK);
1839 rOut.SetFillColor();
1840 rOut.SetRasterOp(RasterOp::Invert);
1841
1842 for(auto const& rPolygon : aPolyPolygon)
1843 {
1844 rOut.DrawPolyLine(rPolygon);
1845 }
1846
1847 rOut.SetRasterOp(eRop);
1848}
1849
1851{
1852 return false;
1853}
1854
1856{
1857 return CheckMacroHit(rRec) != nullptr;
1858}
1859
1860
1861std::unique_ptr<SdrObjGeoData> SdrObject::NewGeoData() const
1862{
1863 return std::make_unique<SdrObjGeoData>();
1864}
1865
1867{
1869 rGeo.aAnchor =m_aAnchor ;
1870 rGeo.bMovProt =m_bMovProt ;
1871 rGeo.bSizProt =m_bSizProt ;
1872 rGeo.bNoPrint =m_bNoPrint ;
1873 rGeo.mbVisible =mbVisible ;
1874 rGeo.bClosedObj =m_bClosedObj ;
1875 rGeo.mnLayerID = mnLayerID;
1876
1877 // user-defined gluepoints
1878 if (m_pPlusData!=nullptr && m_pPlusData->pGluePoints!=nullptr) {
1879 if (rGeo.pGPL!=nullptr) {
1880 *rGeo.pGPL=*m_pPlusData->pGluePoints;
1881 } else {
1882 rGeo.pGPL.reset( new SdrGluePointList(*m_pPlusData->pGluePoints) );
1883 }
1884 } else {
1885 rGeo.pGPL.reset();
1886 }
1887}
1888
1890{
1893 m_aAnchor =rGeo.aAnchor ;
1894 m_bMovProt =rGeo.bMovProt ;
1895 m_bSizProt =rGeo.bSizProt ;
1896 m_bNoPrint =rGeo.bNoPrint ;
1897 mbVisible =rGeo.mbVisible ;
1898 m_bClosedObj =rGeo.bClosedObj ;
1899 mnLayerID = rGeo.mnLayerID;
1900
1901 // user-defined gluepoints
1902 if (rGeo.pGPL!=nullptr) {
1904 if (m_pPlusData->pGluePoints!=nullptr) {
1905 *m_pPlusData->pGluePoints=*rGeo.pGPL;
1906 } else {
1907 m_pPlusData->pGluePoints.reset(new SdrGluePointList(*rGeo.pGPL));
1908 }
1909 } else {
1910 if (m_pPlusData!=nullptr && m_pPlusData->pGluePoints!=nullptr) {
1911 m_pPlusData->pGluePoints.reset();
1912 }
1913 }
1914}
1915
1916std::unique_ptr<SdrObjGeoData> SdrObject::GetGeoData() const
1917{
1918 std::unique_ptr<SdrObjGeoData> pGeo = NewGeoData();
1919 SaveGeoData(*pGeo);
1920 return pGeo;
1921}
1922
1924{
1925 tools::Rectangle aBoundRect0; if (m_pUserCall!=nullptr) aBoundRect0=GetLastBoundRect();
1926 RestoreGeoData(rGeo);
1927 SetChanged();
1930}
1931
1932
1933// ItemSet access
1934
1936{
1938}
1939
1941{
1943}
1944
1946{
1948}
1949
1951{
1953}
1954
1955void SdrObject::ClearMergedItem(const sal_uInt16 nWhich)
1956{
1958}
1959
1961{
1963}
1964
1965void SdrObject::SetMergedItemSet(const SfxItemSet& rSet, bool bClearAllItems)
1966{
1967 GetProperties().SetMergedItemSet(rSet, bClearAllItems);
1968}
1969
1970const SfxPoolItem& SdrObject::GetObjectItem(const sal_uInt16 nWhich) const
1971{
1972 return GetObjectItemSet().Get(nWhich);
1973}
1974
1975const SfxPoolItem& SdrObject::GetMergedItem(const sal_uInt16 nWhich) const
1976{
1977 return GetMergedItemSet().Get(nWhich);
1978}
1979
1980void SdrObject::SetMergedItemSetAndBroadcast(const SfxItemSet& rSet, bool bClearAllItems)
1981{
1983}
1984
1986{
1987 tools::Rectangle aBoundRect0; if (m_pUserCall!=nullptr) aBoundRect0=GetLastBoundRect();
1989 SetChanged();
1992}
1993
1995{
1996 const tools::Rectangle& rSnap=GetSnapRect();
1997 const tools::Rectangle& rLogic=GetLogicRect();
1998 Point aRef1(rSnap.Center());
1999
2000 if (const SdrTransformRef1XItem *pPoolItem = rAttr.GetItemIfSet(SDRATTR_TRANSFORMREF1X))
2001 {
2002 aRef1.setX(pPoolItem->GetValue() );
2003 }
2004 if (const SdrTransformRef1YItem *pPoolItem = rAttr.GetItemIfSet(SDRATTR_TRANSFORMREF1Y))
2005 {
2006 aRef1.setY(pPoolItem->GetValue() );
2007 }
2008
2009 tools::Rectangle aNewSnap(rSnap);
2010 if (const SdrMoveXItem *pPoolItem = rAttr.GetItemIfSet(SDRATTR_MOVEX))
2011 {
2012 tools::Long n = pPoolItem->GetValue();
2013 aNewSnap.Move(n,0);
2014 }
2015 if (const SdrMoveYItem *pPoolItem = rAttr.GetItemIfSet(SDRATTR_MOVEY))
2016 {
2017 tools::Long n = pPoolItem->GetValue();
2018 aNewSnap.Move(0,n);
2019 }
2020 if (const SdrOnePositionXItem *pPoolItem = rAttr.GetItemIfSet(SDRATTR_ONEPOSITIONX))
2021 {
2022 tools::Long n = pPoolItem->GetValue();
2023 aNewSnap.Move(n-aNewSnap.Left(),0);
2024 }
2025 if (const SdrOnePositionYItem *pPoolItem = rAttr.GetItemIfSet(SDRATTR_ONEPOSITIONY))
2026 {
2027 tools::Long n = pPoolItem->GetValue();
2028 aNewSnap.Move(0,n-aNewSnap.Top());
2029 }
2030 if (const SdrOneSizeWidthItem *pPoolItem = rAttr.GetItemIfSet(SDRATTR_ONESIZEWIDTH))
2031 {
2032 tools::Long n = pPoolItem->GetValue();
2033 aNewSnap.SetRight(aNewSnap.Left()+n );
2034 }
2035 if (const SdrOneSizeHeightItem *pPoolItem = rAttr.GetItemIfSet(SDRATTR_ONESIZEHEIGHT))
2036 {
2037 tools::Long n = pPoolItem->GetValue();
2038 aNewSnap.SetBottom(aNewSnap.Top()+n );
2039 }
2040 if (aNewSnap!=rSnap) {
2041 if (aNewSnap.GetSize()==rSnap.GetSize()) {
2042 NbcMove(Size(aNewSnap.Left()-rSnap.Left(),aNewSnap.Top()-rSnap.Top()));
2043 } else {
2044 NbcSetSnapRect(aNewSnap);
2045 }
2046 }
2047
2048 if (const SdrShearAngleItem *pPoolItem = rAttr.GetItemIfSet(SDRATTR_SHEARANGLE))
2049 {
2050 Degree100 n = pPoolItem->GetValue();
2051 n-=GetShearAngle();
2052 if (n) {
2053 double nTan = tan(toRadians(n));
2054 NbcShear(aRef1,n,nTan,false);
2055 }
2056 }
2057 if (const SdrAngleItem *pPoolItem = rAttr.GetItemIfSet(SDRATTR_ROTATEANGLE))
2058 {
2059 Degree100 n = pPoolItem->GetValue();
2060 n-=GetRotateAngle();
2061 if (n) {
2062 NbcRotate(aRef1,n);
2063 }
2064 }
2065 if (const SdrRotateOneItem *pPoolItem = rAttr.GetItemIfSet(SDRATTR_ROTATEONE))
2066 {
2067 Degree100 n = pPoolItem->GetValue();
2068 NbcRotate(aRef1,n);
2069 }
2070 if (const SdrHorzShearOneItem *pPoolItem = rAttr.GetItemIfSet(SDRATTR_HORZSHEARONE))
2071 {
2072 Degree100 n = pPoolItem->GetValue();
2073 double nTan = tan(toRadians(n));
2074 NbcShear(aRef1,n,nTan,false);
2075 }
2076 if (const SdrVertShearOneItem *pPoolItem = rAttr.GetItemIfSet(SDRATTR_VERTSHEARONE))
2077 {
2078 Degree100 n = pPoolItem->GetValue();
2079 double nTan = tan(toRadians(n));
2080 NbcShear(aRef1,n,nTan,true);
2081 }
2082
2083 if (const SdrYesNoItem *pPoolItem = rAttr.GetItemIfSet(SDRATTR_OBJMOVEPROTECT))
2084 {
2085 bool b = pPoolItem->GetValue();
2086 SetMoveProtect(b);
2087 }
2088 if (const SdrYesNoItem *pPoolItem = rAttr.GetItemIfSet(SDRATTR_OBJSIZEPROTECT))
2089 {
2090 bool b = pPoolItem->GetValue();
2092 }
2093
2094 /* move protect always sets size protect */
2095 if( IsMoveProtect() )
2096 SetResizeProtect( true );
2097
2098 if (const SdrObjPrintableItem *pPoolItem = rAttr.GetItemIfSet(SDRATTR_OBJPRINTABLE))
2099 {
2100 bool b = pPoolItem->GetValue();
2101 SetPrintable(b);
2102 }
2103
2104 if (const SdrObjVisibleItem *pPoolItem = rAttr.GetItemIfSet(SDRATTR_OBJVISIBLE))
2105 {
2106 bool b = pPoolItem->GetValue();
2107 SetVisible(b);
2108 }
2109
2111 if (const SdrLayerIdItem *pPoolItem = rAttr.GetItemIfSet(SDRATTR_LAYERID))
2112 {
2113 nLayer = pPoolItem->GetValue();
2114 }
2115 if (const SdrLayerNameItem *pPoolItem = rAttr.GetItemIfSet(SDRATTR_LAYERNAME))
2116 {
2117 OUString aLayerName = pPoolItem->GetValue();
2118 const SdrLayerAdmin& rLayAd(nullptr != getSdrPageFromSdrObject()
2119 ? getSdrPageFromSdrObject()->GetLayerAdmin()
2120 : getSdrModelFromSdrObject().GetLayerAdmin());
2121 const SdrLayer* pLayer = rLayAd.GetLayer(aLayerName);
2122
2123 if(nullptr != pLayer)
2124 {
2125 nLayer=pLayer->GetID();
2126 }
2127 }
2128 if (nLayer!=SDRLAYER_NOTFOUND) {
2129 NbcSetLayer(nLayer);
2130 }
2131
2132 if (const SfxStringItem *pPoolItem = rAttr.GetItemIfSet(SDRATTR_OBJECTNAME))
2133 {
2134 OUString aName = pPoolItem->GetValue();
2135 SetName(aName);
2136 }
2137 tools::Rectangle aNewLogic(rLogic);
2138 if (const SdrLogicSizeWidthItem *pPoolItem = rAttr.GetItemIfSet(SDRATTR_LOGICSIZEWIDTH))
2139 {
2140 tools::Long n = pPoolItem->GetValue();
2141 aNewLogic.SetRight(aNewLogic.Left()+n );
2142 }
2143 if (const SdrLogicSizeHeightItem *pPoolItem = rAttr.GetItemIfSet(SDRATTR_LOGICSIZEHEIGHT))
2144 {
2145 tools::Long n = pPoolItem->GetValue();
2146 aNewLogic.SetBottom(aNewLogic.Top()+n );
2147 }
2148 if (aNewLogic!=rLogic) {
2149 NbcSetLogicRect(aNewLogic);
2150 }
2151 Fraction aResizeX(1,1);
2152 Fraction aResizeY(1,1);
2153 if (const SdrResizeXOneItem *pPoolItem = rAttr.GetItemIfSet(SDRATTR_RESIZEXONE))
2154 {
2155 aResizeX *= pPoolItem->GetValue();
2156 }
2157 if (const SdrResizeYOneItem *pPoolItem = rAttr.GetItemIfSet(SDRATTR_RESIZEYONE))
2158 {
2159 aResizeY *= pPoolItem->GetValue();
2160 }
2161 if (aResizeX!=Fraction(1,1) || aResizeY!=Fraction(1,1)) {
2162 NbcResize(aRef1,aResizeX,aResizeY);
2163 }
2164}
2165
2167{
2168 const tools::Rectangle& rSnap=GetSnapRect();
2169 const tools::Rectangle& rLogic=GetLogicRect();
2176 rAttr.Put(SdrOneSizeWidthItem(rSnap.GetWidth()-1));
2177 rAttr.Put(SdrOneSizeHeightItem(rSnap.GetHeight()-1));
2178 rAttr.Put(SdrOnePositionXItem(rSnap.Left()));
2179 rAttr.Put(SdrOnePositionYItem(rSnap.Top()));
2180 if (rLogic.GetWidth()!=rSnap.GetWidth()) {
2181 rAttr.Put(SdrLogicSizeWidthItem(rLogic.GetWidth()-1));
2182 }
2183 if (rLogic.GetHeight()!=rSnap.GetHeight()) {
2184 rAttr.Put(SdrLogicSizeHeightItem(rLogic.GetHeight()-1));
2185 }
2186 OUString aName(GetName());
2187
2188 if (!aName.isEmpty())
2189 {
2191 }
2192
2193 rAttr.Put(SdrLayerIdItem(GetLayer()));
2194 const SdrLayerAdmin& rLayAd(nullptr != getSdrPageFromSdrObject()
2195 ? getSdrPageFromSdrObject()->GetLayerAdmin()
2196 : getSdrModelFromSdrObject().GetLayerAdmin());
2197 const SdrLayer* pLayer = rLayAd.GetLayerPerID(GetLayer());
2198 if(nullptr != pLayer)
2199 {
2200 rAttr.Put(SdrLayerNameItem(pLayer->GetName()));
2201 }
2202 Point aRef1(rSnap.Center());
2203 Point aRef2(aRef1); aRef2.AdjustY( 1 );
2204 rAttr.Put(SdrTransformRef1XItem(aRef1.X()));
2205 rAttr.Put(SdrTransformRef1YItem(aRef1.Y()));
2206 rAttr.Put(SdrTransformRef2XItem(aRef2.X()));
2207 rAttr.Put(SdrTransformRef2YItem(aRef2.Y()));
2208}
2209
2211{
2212 return GetProperties().GetStyleSheet();
2213}
2214
2215void SdrObject::SetStyleSheet(SfxStyleSheet* pNewStyleSheet, bool bDontRemoveHardAttr)
2216{
2217 tools::Rectangle aBoundRect0;
2218
2219 if(m_pUserCall)
2220 aBoundRect0 = GetLastBoundRect();
2221
2222 InternalSetStyleSheet(pNewStyleSheet, bDontRemoveHardAttr, true);
2223 SetChanged();
2226}
2227
2228void SdrObject::NbcSetStyleSheet(SfxStyleSheet* pNewStyleSheet, bool bDontRemoveHardAttr)
2229{
2230 InternalSetStyleSheet(pNewStyleSheet, bDontRemoveHardAttr, false);
2231}
2232
2233void SdrObject::InternalSetStyleSheet(SfxStyleSheet* pNewStyleSheet, bool bDontRemoveHardAttr, bool bBroadcast)
2234{
2235 GetProperties().SetStyleSheet(pNewStyleSheet, bDontRemoveHardAttr, bBroadcast);
2236}
2237
2238// Broadcasting while setting attributes is managed by the AttrObj.
2239
2240
2242{
2243 // #i41936# Use SnapRect for default GluePoints
2244 const tools::Rectangle aR(GetSnapRect());
2245 Point aPt;
2246
2247 switch(nPosNum)
2248 {
2249 case 0 : aPt = aR.TopCenter(); break;
2250 case 1 : aPt = aR.RightCenter(); break;
2251 case 2 : aPt = aR.BottomCenter(); break;
2252 case 3 : aPt = aR.LeftCenter(); break;
2253 }
2254
2255 aPt -= aR.Center();
2256 SdrGluePoint aGP(aPt);
2257 aGP.SetPercent(false);
2258
2259 return aGP;
2260}
2261
2263{
2265 Point aPt;
2266 switch (nPosNum) {
2267 case 0 : aPt=aR.TopLeft(); break;
2268 case 1 : aPt=aR.TopRight(); break;
2269 case 2 : aPt=aR.BottomRight(); break;
2270 case 3 : aPt=aR.BottomLeft(); break;
2271 }
2272 aPt-=GetSnapRect().Center();
2273 SdrGluePoint aGP(aPt);
2274 aGP.SetPercent(false);
2275 return aGP;
2276}
2277
2279{
2280 if (m_pPlusData!=nullptr) return m_pPlusData->pGluePoints.get();
2281 return nullptr;
2282}
2283
2284
2286{
2288 if (m_pPlusData->pGluePoints==nullptr) {
2289 m_pPlusData->pGluePoints.reset(new SdrGluePointList);
2290 }
2291 return m_pPlusData->pGluePoints.get();
2292}
2293
2295{
2296 // First a const call to see whether there are any gluepoints.
2297 // Force const call!
2298 if (GetGluePointList()!=nullptr) {
2300 pGPL->SetReallyAbsolute(bOn,*this);
2301 }
2302}
2303
2304void SdrObject::NbcRotateGluePoints(const Point& rRef, Degree100 nAngle, double sn, double cs)
2305{
2306 // First a const call to see whether there are any gluepoints.
2307 // Force const call!
2308 if (GetGluePointList()!=nullptr) {
2310 pGPL->Rotate(rRef,nAngle,sn,cs,this);
2311 }
2312}
2313
2314void SdrObject::NbcMirrorGluePoints(const Point& rRef1, const Point& rRef2)
2315{
2316 // First a const call to see whether there are any gluepoints.
2317 // Force const call!
2318 if (GetGluePointList()!=nullptr) {
2320 pGPL->Mirror(rRef1,rRef2,this);
2321 }
2322}
2323
2324void SdrObject::NbcShearGluePoints(const Point& rRef, double tn, bool bVShear)
2325{
2326 // First a const call to see whether there are any gluepoints.
2327 // Force const call!
2328 if (GetGluePointList()!=nullptr) {
2330 pGPL->Shear(rRef,tn,bVShear,this);
2331 }
2332}
2333
2334void SdrObject::ConnectToNode(bool /*bTail1*/, SdrObject* /*pObj*/)
2335{
2336}
2337
2339{
2340}
2341
2343{
2344 return nullptr;
2345}
2346
2347
2350 basegfx::B2DPolygonVector& rExtractedHairlines,
2351 basegfx::B2DPolyPolygonVector& rExtractedLineFills)
2352{
2353 rExtractedHairlines.clear();
2354 rExtractedLineFills.clear();
2355
2356 if(rxSequence.empty())
2357 return;
2358
2359 // use neutral ViewInformation
2360 const drawinglayer::geometry::ViewInformation2D aViewInformation2D;
2361
2362 // create extractor, process and get result
2363 drawinglayer::processor2d::LineGeometryExtractor2D aExtractor(aViewInformation2D);
2364 aExtractor.process(rxSequence);
2365
2366 // copy line results
2367 rExtractedHairlines = aExtractor.getExtractedHairlines();
2368
2369 // copy fill rsults
2370 rExtractedLineFills = aExtractor.getExtractedLineFills();
2371}
2372
2373
2375{
2377
2379 {
2380 basegfx::B2DPolyPolygon aMergedLineFillPolyPolygon;
2381 basegfx::B2DPolyPolygon aMergedHairlinePolyPolygon;
2384
2385 if(!xSequence.empty())
2386 {
2387 basegfx::B2DPolygonVector aExtractedHairlines;
2388 basegfx::B2DPolyPolygonVector aExtractedLineFills;
2389
2390 extractLineContourFromPrimitive2DSequence(xSequence, aExtractedHairlines, aExtractedLineFills);
2391
2392 // for SdrObject creation, just copy all to a single Hairline-PolyPolygon
2393 for(const basegfx::B2DPolygon & rExtractedHairline : aExtractedHairlines)
2394 {
2395 aMergedHairlinePolyPolygon.append(rExtractedHairline);
2396 }
2397
2398 // check for fill rsults
2399 if (!aExtractedLineFills.empty() && !utl::ConfigManager::IsFuzzing())
2400 {
2401 // merge to a single tools::PolyPolygon (OR)
2402 aMergedLineFillPolyPolygon = basegfx::utils::mergeToSinglePolyPolygon(std::move(aExtractedLineFills));
2403 }
2404 }
2405
2406 if(aMergedLineFillPolyPolygon.count() || (bForceLineDash && aMergedHairlinePolyPolygon.count()))
2407 {
2409 drawing::FillStyle eOldFillStyle = aSet.Get(XATTR_FILLSTYLE).GetValue();
2410 rtl::Reference<SdrPathObj> aLinePolygonPart;
2411 rtl::Reference<SdrPathObj> aLineHairlinePart;
2412 bool bBuildGroup(false);
2413
2414 if(aMergedLineFillPolyPolygon.count())
2415 {
2416 // create SdrObject for filled line geometry
2417 aLinePolygonPart = new SdrPathObj(
2420 std::move(aMergedLineFillPolyPolygon));
2421
2422 // correct item properties
2423 aSet.Put(XLineWidthItem(0));
2424 aSet.Put(XLineStyleItem(drawing::LineStyle_NONE));
2425 Color aColorLine = aSet.Get(XATTR_LINECOLOR).GetColorValue();
2426 sal_uInt16 nTransLine = aSet.Get(XATTR_LINETRANSPARENCE).GetValue();
2427 aSet.Put(XFillColorItem(OUString(), aColorLine));
2428 aSet.Put(XFillStyleItem(drawing::FillStyle_SOLID));
2429 aSet.Put(XFillTransparenceItem(nTransLine));
2430
2431 aLinePolygonPart->SetMergedItemSet(aSet);
2432 }
2433
2434 if(aMergedHairlinePolyPolygon.count())
2435 {
2436 // create SdrObject for hairline geometry
2437 // OBJ_PATHLINE is necessary here, not OBJ_PATHFILL. This is intended
2438 // to get a non-filled object. If the poly is closed, the PathObj takes care for
2439 // the correct closed state.
2440 aLineHairlinePart = new SdrPathObj(
2443 std::move(aMergedHairlinePolyPolygon));
2444
2445 aSet.Put(XLineWidthItem(0));
2446 aSet.Put(XFillStyleItem(drawing::FillStyle_NONE));
2447 aSet.Put(XLineStyleItem(drawing::LineStyle_SOLID));
2448
2449 // it is also necessary to switch off line start and ends here
2450 aSet.Put(XLineStartWidthItem(0));
2451 aSet.Put(XLineEndWidthItem(0));
2452
2453 aLineHairlinePart->SetMergedItemSet(aSet);
2454
2455 if(aLinePolygonPart)
2456 {
2457 bBuildGroup = true;
2458 }
2459 }
2460
2461 // check if original geometry should be added (e.g. filled and closed)
2462 bool bAddOriginalGeometry(false);
2463 SdrPathObj* pPath = dynamic_cast<SdrPathObj*>(this);
2464
2465 if(pPath && pPath->IsClosed())
2466 {
2467 if(eOldFillStyle != drawing::FillStyle_NONE)
2468 {
2469 bAddOriginalGeometry = true;
2470 }
2471 }
2472
2473 // do we need a group?
2474 if(bBuildGroup || bAddOriginalGeometry)
2475 {
2477
2478 if(bAddOriginalGeometry)
2479 {
2480 // Add a clone of the original geometry.
2481 aSet.ClearItem();
2482 aSet.Put(GetMergedItemSet());
2483 aSet.Put(XLineStyleItem(drawing::LineStyle_NONE));
2484 aSet.Put(XLineWidthItem(0));
2485
2487 pClone->SetMergedItemSet(aSet);
2488
2489 pGroup->GetSubList()->NbcInsertObject(pClone.get());
2490 }
2491
2492 if(aLinePolygonPart)
2493 {
2494 pGroup->GetSubList()->NbcInsertObject(aLinePolygonPart.get());
2495 }
2496
2497 if(aLineHairlinePart)
2498 {
2499 pGroup->GetSubList()->NbcInsertObject(aLineHairlinePart.get());
2500 }
2501
2502 pRetval = pGroup;
2503 }
2504 else
2505 {
2506 if(aLinePolygonPart)
2507 {
2508 pRetval = aLinePolygonPart;
2509 }
2510 else if(aLineHairlinePart)
2511 {
2512 pRetval = aLineHairlinePart;
2513 }
2514 }
2515 }
2516 }
2517
2518 if(!pRetval)
2519 {
2520 // due to current method usage, create and return a clone when nothing has changed
2522 }
2523
2524 return pRetval;
2525}
2526
2527
2529{
2530 m_bMarkProt = bProt;
2531}
2532
2533
2535{
2536 m_bEmptyPresObj = bEpt;
2537}
2538
2539
2541{
2543}
2544
2545
2546// convert this path object to contour object, even when it is a group
2548{
2549 rtl::Reference<SdrObject> pRet = pRet1;
2550 if(dynamic_cast<const SdrObjGroup*>( pRet.get()) != nullptr)
2551 {
2552 SdrObjList* pObjList2 = pRet->GetSubList();
2554
2555 for(size_t a=0; a<pObjList2->GetObjCount(); ++a)
2556 {
2557 SdrObject* pIterObj = pObjList2->GetObj(a);
2558 pGroup->GetSubList()->NbcInsertObject(ConvertToContourObj(pIterObj, bForceLineDash).get());
2559 }
2560
2561 pRet = pGroup;
2562 }
2563 else
2564 {
2565 if (SdrPathObj *pPathObj = dynamic_cast<SdrPathObj*>(pRet.get()))
2566 {
2567 // bezier geometry got created, even for straight edges since the given
2568 // object is a result of DoConvertToPolyObj. For conversion to contour
2569 // this is not really needed and can be reduced again AFAP
2570 pPathObj->SetPathPoly(basegfx::utils::simplifyCurveSegments(pPathObj->GetPathPoly()));
2571 }
2572
2573 pRet = pRet->ImpConvertToContourObj(bForceLineDash);
2574 }
2575
2576 // #i73441# preserve LayerID
2577 if(pRet && pRet->GetLayer() != GetLayer())
2578 {
2579 pRet->SetLayer(GetLayer());
2580 }
2581
2582 return pRet;
2583}
2584
2585
2586rtl::Reference<SdrObject> SdrObject::ConvertToPolyObj(bool bBezier, bool bLineToArea) const
2587{
2588 rtl::Reference<SdrObject> pRet = DoConvertToPolyObj(bBezier, true);
2589
2590 if(pRet && bLineToArea)
2591 {
2592 pRet = ConvertToContourObj(pRet.get());
2593 }
2594
2595 // #i73441# preserve LayerID
2596 if(pRet && pRet->GetLayer() != GetLayer())
2597 {
2598 pRet->SetLayer(GetLayer());
2599 }
2600
2601 return pRet;
2602}
2603
2604
2605rtl::Reference<SdrObject> SdrObject::DoConvertToPolyObj(bool /*bBezier*/, bool /*bAddText*/) const
2606{
2607 return nullptr;
2608}
2609
2610
2612{
2613 const bool bIsInserted(nullptr != getParentSdrObjListFromSdrObject());
2614 const tools::Rectangle aBoundRect0(GetLastBoundRect());
2615
2616 if(bIsInserted)
2617 {
2619 }
2620 else
2621 {
2623 }
2624
2625 if(nullptr != m_pPlusData && nullptr != m_pPlusData->pBroadcast)
2626 {
2628 m_pPlusData->pBroadcast->Broadcast(aHint);
2629 }
2630}
2631
2633{
2634 if(IsMoveProtect() != bProt)
2635 {
2636 // #i77187# secured and simplified
2637 m_bMovProt = bProt;
2638 SetChanged();
2640 }
2641}
2642
2644{
2645 if(IsResizeProtect() != bProt)
2646 {
2647 // #i77187# secured and simplified
2648 m_bSizProt = bProt;
2649 SetChanged();
2651 }
2652}
2653
2655{
2656 if( bPrn == m_bNoPrint )
2657 {
2658 m_bNoPrint=!bPrn;
2659 SetChanged();
2660 if (IsInserted())
2661 {
2662 SdrHint aHint(SdrHintKind::ObjectChange, *this);
2664 }
2665 }
2666}
2667
2668void SdrObject::SetVisible(bool bVisible)
2669{
2670 if( bVisible != mbVisible )
2671 {
2673 SetChanged();
2674 if (IsInserted())
2675 {
2676 SdrHint aHint(SdrHintKind::ObjectChange, *this);
2678 }
2679 }
2680}
2681
2682
2684{
2685 if (m_pPlusData==nullptr || m_pPlusData->pUserDataList==nullptr) return 0;
2686 return m_pPlusData->pUserDataList->GetUserDataCount();
2687}
2688
2690{
2691 if (m_pPlusData==nullptr || m_pPlusData->pUserDataList==nullptr) return nullptr;
2692 return &m_pPlusData->pUserDataList->GetUserData(nNum);
2693}
2694
2695void SdrObject::AppendUserData(std::unique_ptr<SdrObjUserData> pData)
2696{
2697 if (!pData)
2698 {
2699 OSL_FAIL("SdrObject::AppendUserData(): pData is NULL pointer.");
2700 return;
2701 }
2702
2704 if (!m_pPlusData->pUserDataList)
2705 m_pPlusData->pUserDataList.reset( new SdrObjUserDataList );
2706
2707 m_pPlusData->pUserDataList->AppendUserData(std::move(pData));
2708}
2709
2710void SdrObject::DeleteUserData(sal_uInt16 nNum)
2711{
2712 sal_uInt16 nCount=GetUserDataCount();
2713 if (nNum<nCount) {
2714 m_pPlusData->pUserDataList->DeleteUserData(nNum);
2715 if (nCount==1) {
2716 m_pPlusData->pUserDataList.reset();
2717 }
2718 } else {
2719 OSL_FAIL("SdrObject::DeleteUserData(): Invalid Index.");
2720 }
2721}
2722
2724{
2725 m_pUserCall = pUser;
2726}
2727
2728
2729void SdrObject::SendUserCall(SdrUserCallType eUserCall, const tools::Rectangle& rBoundRect) const
2730{
2732
2733 if ( m_pUserCall )
2734 {
2735 m_pUserCall->Changed( *this, eUserCall, rBoundRect );
2736 }
2737
2738 if(nullptr != pGroup && pGroup->GetUserCall())
2739 {
2740 // broadcast to group
2742
2743 switch( eUserCall )
2744 {
2746 eChildUserType = SdrUserCallType::ChildMoveOnly;
2747 break;
2748
2750 eChildUserType = SdrUserCallType::ChildResize;
2751 break;
2752
2754 eChildUserType = SdrUserCallType::ChildChangeAttr;
2755 break;
2756
2758 eChildUserType = SdrUserCallType::ChildDelete;
2759 break;
2760
2762 eChildUserType = SdrUserCallType::ChildInserted;
2763 break;
2764
2766 eChildUserType = SdrUserCallType::ChildRemoved;
2767 break;
2768
2769 default: break;
2770 }
2771
2772 pGroup->GetUserCall()->Changed( *this, eChildUserType, rBoundRect );
2773 }
2774
2775 // notify our UNO shape listeners
2776 switch ( eUserCall )
2777 {
2780 [[fallthrough]]; // RESIZE might also imply a change of the position
2783 break;
2784 default:
2785 // not interested in
2786 break;
2787 }
2788}
2789
2790void SdrObject::setUnoShape( const uno::Reference< drawing::XShape >& _rxUnoShape )
2791{
2792 const uno::Reference< uno::XInterface>& xOldUnoShape( maWeakUnoShape );
2793 // the UNO shape would be gutted by the following code; return early
2794 if ( _rxUnoShape == xOldUnoShape )
2795 {
2796 if ( !xOldUnoShape.is() )
2797 {
2798 // make sure there is no stale impl. pointer if the UNO
2799 // shape was destroyed meanwhile (remember we only hold weak
2800 // reference to it!)
2801 mpSvxShape = nullptr;
2802 }
2803 return;
2804 }
2805
2806 if ( xOldUnoShape.is() )
2807 {
2808 // Remove yourself from the current UNO shape. Its destructor
2809 // will reset our UNO shape otherwise.
2811 }
2812
2813 maWeakUnoShape = _rxUnoShape;
2814 mpSvxShape = comphelper::getFromUnoTunnel<SvxShape>( _rxUnoShape );
2815}
2816
2819{
2821 // retrieving the impl pointer and subsequently using it is not thread-safe, of course, so it needs to be
2822 // guarded by the SolarMutex
2823
2824 uno::Reference< uno::XInterface > xShape( maWeakUnoShape );
2825 //#113608#, make sure mpSvxShape is always synchronized with maWeakUnoShape
2826 if ( mpSvxShape && !xShape )
2827 mpSvxShape = nullptr;
2828
2829 return mpSvxShape;
2830}
2831
2832css::uno::Reference< css::drawing::XShape > SdrObject::getUnoShape()
2833{
2834 // try weak reference first
2835 uno::Reference< css::drawing::XShape > xShape = maWeakUnoShape;
2836 if (xShape)
2837 return xShape;
2838
2839 // try to access SdrPage from this SdrObject. This will only exist if the SdrObject is
2840 // inserted in a SdrObjList (page/group/3dScene)
2841 SdrPage* pPageCandidate(getSdrPageFromSdrObject());
2842
2843 // tdf#12152, tdf#120728
2844 //
2845 // With the paradigm change to only get a SdrPage for a SdrObject when the SdrObject
2846 // is *inserted*, the functionality for creating 1:1 associated UNO API implementation
2847 // SvxShapes was partially broken: The used ::CreateShape relies on the SvxPage being
2848 // derived and the CreateShape method overloaded, implementing additional SdrInventor
2849 // types as needed.
2850 //
2851 // The fallback to use SvxDrawPage::CreateShapeByTypeAndInventor is a trap: It's only
2852 // a static fallback that handles the SdrInventor types SdrInventor::E3d and
2853 // SdrInventor::Default. Due to that, e.g. the ReportDesigner broke in various conditions.
2854 //
2855 // That again has to do with the ReportDesigner being implemented using the UNO API
2856 // aspects of SdrObjects early during their construction, not just after these are
2857 // inserted to a SdrPage - but that is not illegal or wrong, the SdrObject exists already.
2858 //
2859 // As a current solution, use the (now always available) SdrModel and any of the
2860 // existing SdrPages. The only important thing is to get a SdrPage where ::CreateShape is
2861 // overloaded and implemented as needed.
2862 //
2863 // Note for the future:
2864 // In a more ideal world there would be only one factory method for creating SdrObjects (not
2865 // ::CreateShape and ::CreateShapeByTypeAndInventor). This also would not be placed at
2866 // SdrPage/SvxPage at all, but at the Model where it belongs - where else would you expect
2867 // objects for the current Model to be constructed? To have this at the Page only would make
2868 // sense if different shapes would need to be constructed for different Pages in the same Model
2869 // - this is never the case.
2870 // At that Model extended functionality for that factory (or overloads and implementations)
2871 // should be placed. But to be realistic, migrating the factories to Model now is too much
2872 // work - maybe over time when melting SdrObject/SvxObject one day...
2873 //
2874 // More Note (added by noel grandin)
2875 // Except that sd/ is being naughty and doing all kinds of magic during CreateShape that
2876 // requires knowing which page the object is being created for. Fixing that would require
2877 // moving a bunch of nasty logic from object creation time, to the point in time when
2878 // it is actually added to a page.
2879 if(nullptr == pPageCandidate)
2880 {
2881 // If not inserted, alternatively access a SdrPage using the SdrModel. There is
2882 // no reason not to create and return a UNO API XShape when the SdrObject is not
2883 // inserted - it may be in construction. Main paradigm is that it exists.
2884 if(0 != getSdrModelFromSdrObject().GetPageCount())
2885 {
2886 // Take 1st SdrPage. That may be e.g. a special page (in SD), but the
2887 // to-be-used method ::CreateShape will be correctly overloaded in
2888 // all cases
2889 pPageCandidate = getSdrModelFromSdrObject().GetPage(0);
2890 }
2891 }
2892
2893 if(nullptr != pPageCandidate)
2894 {
2895 uno::Reference< uno::XInterface > xPage(pPageCandidate->getUnoPage());
2896 if( xPage.is() )
2897 {
2898 SvxDrawPage* pDrawPage = comphelper::getFromUnoTunnel<SvxDrawPage>(xPage);
2899 if( pDrawPage )
2900 {
2901 // create one
2902 xShape = pDrawPage->CreateShape( this );
2903 assert(xShape);
2904 setUnoShape( xShape );
2905 }
2906 }
2907 }
2908 else
2909 {
2910 // Fallback to static base functionality. CAUTION: This will only support
2911 // the most basic stuff like SdrInventor::E3d and SdrInventor::Default. All
2912 // the other SdrInventor enum entries are from overloads and are *not accessible*
2913 // using this fallback (!) - what a bad trap
2915 mpSvxShape = xNewShape.get();
2916 maWeakUnoShape = xShape = mpSvxShape;
2917 }
2918
2919 return xShape;
2920}
2921
2923{
2925
2926 SvxShape* pSvxShape = const_cast< SdrObject* >( this )->getSvxShape();
2927 if ( pSvxShape )
2928 return pSvxShape->notifyPropertyChange( _eProperty );
2929}
2930
2931void SdrObject::registerProvider( const svx::ShapePropertyProviderId _eProperty, std::unique_ptr<svx::PropertyValueProvider> provider )
2932{
2934
2935 SvxShape* pSvxShape = getSvxShape();
2936 return pSvxShape->registerProvider( _eProperty, std::move(provider) );
2937}
2938
2939// transformation interface for StarOfficeAPI. This implements support for
2940// homogeneous 3x3 matrices containing the transformation of the SdrObject. At the
2941// moment it contains a shearX, rotation and translation, but for setting all linear
2942// transforms like Scale, ShearX, ShearY, Rotate and Translate are supported.
2943
2944
2945// gets base transformation and rectangle of object. If it's an SdrPathObj it fills the PolyPolygon
2946// with the base geometry and returns TRUE. Otherwise it returns FALSE.
2948{
2949 // any kind of SdrObject, just use SnapRect
2950 tools::Rectangle aRectangle(GetSnapRect());
2951
2952 // convert to transformation values
2953 basegfx::B2DTuple aScale(aRectangle.GetWidth(), aRectangle.GetHeight());
2954 basegfx::B2DTuple aTranslate(aRectangle.Left(), aRectangle.Top());
2955
2956 // position maybe relative to anchorpos, convert
2957 if(getSdrModelFromSdrObject().IsWriter())
2958 {
2959 if(GetAnchorPos().X() || GetAnchorPos().Y())
2960 {
2961 aTranslate -= basegfx::B2DTuple(GetAnchorPos().X(), GetAnchorPos().Y());
2962 }
2963 }
2964
2965 // build matrix
2966 rMatrix = basegfx::utils::createScaleTranslateB2DHomMatrix(aScale, aTranslate);
2967
2968 return false;
2969}
2970
2971// sets the base geometry of the object using infos contained in the homogeneous 3x3 matrix.
2972// If it's an SdrPathObj it will use the provided geometry information. The Polygon has
2973// to use (0,0) as upper left and will be scaled to the given size in the matrix.
2975{
2976 // break up matrix
2977 basegfx::B2DTuple aScale;
2978 basegfx::B2DTuple aTranslate;
2979 double fRotate, fShearX;
2980 rMatrix.decompose(aScale, aTranslate, fRotate, fShearX);
2981
2982 // #i75086# Old DrawingLayer (GeoStat and geometry) does not support holding negative scalings
2983 // in X and Y which equal a 180 degree rotation. Recognize it and react accordingly
2984 if(basegfx::fTools::less(aScale.getX(), 0.0) && basegfx::fTools::less(aScale.getY(), 0.0))
2985 {
2986 aScale.setX(fabs(aScale.getX()));
2987 aScale.setY(fabs(aScale.getY()));
2988 }
2989
2990 // if anchor is used, make position relative to it
2991 if(getSdrModelFromSdrObject().IsWriter())
2992 {
2993 if(GetAnchorPos().X() || GetAnchorPos().Y())
2994 {
2995 aTranslate += basegfx::B2DTuple(GetAnchorPos().X(), GetAnchorPos().Y());
2996 }
2997 }
2998
2999 // build BaseRect
3000 Point aPoint(FRound(aTranslate.getX()), FRound(aTranslate.getY()));
3001 tools::Rectangle aBaseRect(aPoint, Size(FRound(aScale.getX()), FRound(aScale.getY())));
3002
3003 // set BaseRect
3004 SetSnapRect(aBaseRect);
3005}
3006
3007// Give info if object is in destruction
3009{
3011}
3012
3013// return if fill is != drawing::FillStyle_NONE
3015{
3016 return GetObjectItem(XATTR_FILLSTYLE).GetValue() != drawing::FillStyle_NONE;
3017}
3018
3020{
3021 return GetObjectItem(XATTR_LINESTYLE).GetValue() != drawing::LineStyle_NONE;
3022}
3023
3024
3025// #i52224#
3026// on import of OLE object from MS documents the BLIP size might be retrieved,
3027// the following four methods are used to control it;
3028// usually this data makes no sense after the import is finished, since the object
3029// might be resized
3030
3031
3033{
3034 maBLIPSizeRectangle = aRect;
3035}
3036
3037void SdrObject::SetContextWritingMode( const sal_Int16 /*_nContextWritingMode*/ )
3038{
3039 // this base class does not support different writing modes, so ignore the call
3040}
3041
3043{
3045}
3046
3047
3048// #i121917#
3050{
3051 return false;
3052}
3053
3055{
3056 return false;
3057}
3058
3060{
3061 if (GetName().isEmpty())
3062 {
3063 OUString aName;
3064 if (const E3dScene* pE3dObj = DynCastE3dScene(this))
3065 {
3066 SdrObjList* pObjList = pE3dObj->GetSubList();
3067 if (pObjList)
3068 {
3069 SdrObject* pObj0 = pObjList->GetObj(0);
3070 if (pObj0)
3071 aName = pObj0->TakeObjNameSingul();
3072 }
3073 }
3074 else
3076 SetName(aName + " 1");
3077 }
3078
3079 std::unordered_set<OUString> aNameSet;
3080 MakeNameUnique(aNameSet);
3081}
3082
3083void SdrObject::MakeNameUnique(std::unordered_set<OUString>& rNameSet)
3084{
3085 if (GetName().isEmpty())
3086 return;
3087
3088 if (rNameSet.empty())
3089 {
3090 SdrPage* pPage;
3091 SdrObject* pObj;
3092 for (sal_uInt16 nPage(0); nPage < mrSdrModelFromSdrObject.GetPageCount(); ++nPage)
3093 {
3094 pPage = mrSdrModelFromSdrObject.GetPage(nPage);
3096 while (aIter.IsMore())
3097 {
3098 pObj = aIter.Next();
3099 if (pObj != this)
3100 rNameSet.insert(pObj->GetName());
3101 }
3102 }
3103 }
3104
3105 OUString sName(GetName().trim());
3106 OUString sRootName(sName);
3107
3108 if (!sName.isEmpty() && rtl::isAsciiDigit(sName[sName.getLength() - 1]))
3109 {
3110 sal_Int32 nPos(sName.getLength() - 1);
3111 while (nPos > 0 && rtl::isAsciiDigit(sName[--nPos]));
3112 sRootName = o3tl::trim(sName.subView(0, nPos + 1));
3113 }
3114
3115 for (sal_uInt32 n = 1; rNameSet.find(sName) != rNameSet.end(); n++)
3116 sName = sRootName + " " + OUString::number(n);
3117 rNameSet.insert(sName);
3118
3119 SetName(sName);
3120}
3121
3123{
3124 MapUnit eMapUnit(getSdrModelFromSdrObject().GetItemPool().GetMetric(0));
3125 if(eMapUnit == MapUnit::Map100thMM)
3126 return;
3127
3128 if (const auto eTo = MapToO3tlLength(eMapUnit); eTo != o3tl::Length::invalid)
3129 {
3130 const double fConvert(o3tl::convert(1.0, o3tl::Length::mm100, eTo));
3131 rPolyPolygon.transform(basegfx::utils::createScaleB2DHomMatrix(fConvert, fConvert));
3132 }
3133 else
3134 {
3135 OSL_FAIL("Missing unit translation to PoolMetric!");
3136 }
3137}
3138
3140{
3141 return m_aOutRect;
3142}
3143
3145{
3146 m_aOutRect = rRectangle;
3147}
3148
3150{
3151 m_aOutRect = rRectangle;
3152}
3153
3155{
3157}
3158
3159void SdrObject::moveOutRectangle(sal_Int32 nXDelta, sal_Int32 nYDelta)
3160{
3161 m_aOutRect.Move(nXDelta, nYDelta);
3162}
3163
3165{
3166 if( pObj && pObj->GetObjInventor() == SdrInventor::E3d && pObj->GetObjIdentifier() == SdrObjKind::E3D_Scene )
3167 return static_cast<E3dScene*>(pObj);
3168 return nullptr;
3169}
3170
3172{
3173 if( pObj && pObj->GetObjInventor() == SdrInventor::E3d )
3174 return static_cast<E3dObject*>(pObj);
3175 return nullptr;
3176}
3177
3179{
3180 // SdrTextObj has a lot of subclasses, with lots of SdrObjKind identifiers, so use a virtual method
3181 // to be safer.
3182 if( pObj && pObj->IsSdrTextObj() )
3183 return static_cast<SdrTextObj*>(pObj);
3184 return nullptr;
3185}
3186
3188{
3189 SdrObjCreatorParams aParams { nInventor, nObjIdentifier, rSdrModel };
3190 for (const auto & i : ImpGetUserMakeObjHdl()) {
3191 rtl::Reference<SdrObject> pObj = i.Call(aParams);
3192 if (pObj) {
3193 return pObj;
3194 }
3195 }
3196 return nullptr;
3197}
3198
3199namespace
3200{
3201
3202// SdrObject subclass, which represents an empty object of a
3203// certain type (kind).
3204template <SdrObjKind OBJECT_KIND, SdrInventor OBJECT_INVENTOR>
3205class EmptyObject final : public SdrObject
3206{
3207private:
3208 virtual ~EmptyObject() override
3209 {}
3210
3211public:
3212 EmptyObject(SdrModel& rSdrModel)
3213 : SdrObject(rSdrModel)
3214 {
3215 }
3216
3217 EmptyObject(SdrModel& rSdrModel, EmptyObject const& rSource)
3218 : SdrObject(rSdrModel, rSource)
3219 {
3220 }
3221
3222 rtl::Reference<SdrObject> CloneSdrObject(SdrModel& rTargetModel) const override
3223 {
3224 return new EmptyObject(rTargetModel, *this);
3225 }
3226
3227 SdrInventor GetObjInventor() const override
3228 {
3229 return OBJECT_INVENTOR;
3230 }
3231
3232 SdrObjKind GetObjIdentifier() const override
3233 {
3234 return OBJECT_KIND;
3235 }
3236
3237 void NbcRotate(const Point& /*rRef*/, Degree100 /*nAngle*/, double /*sinAngle*/, double /*cosAngle*/) override
3238 {
3239 assert(false); // should not be called for this kind of objects
3240 }
3241};
3242
3243} // end anonymous namespace
3244
3246 SdrModel& rSdrModel,
3247 SdrInventor nInventor,
3248 SdrObjKind nIdentifier,
3249 const tools::Rectangle* pSnapRect)
3250{
3252 bool bSetSnapRect(nullptr != pSnapRect);
3253
3254 if (nInventor == SdrInventor::Default)
3255 {
3256 switch (nIdentifier)
3257 {
3259 {
3260 if(nullptr != pSnapRect)
3261 {
3262 pObj = new SdrMeasureObj(
3263 rSdrModel,
3264 pSnapRect->TopLeft(),
3265 pSnapRect->BottomRight());
3266 }
3267 else
3268 {
3269 pObj = new SdrMeasureObj(rSdrModel);
3270 }
3271 }
3272 break;
3273 case SdrObjKind::Line:
3274 {
3275 if(nullptr != pSnapRect)
3276 {
3277 basegfx::B2DPolygon aPoly;
3278
3279 aPoly.append(
3281 pSnapRect->Left(),
3282 pSnapRect->Top()));
3283 aPoly.append(
3285 pSnapRect->Right(),
3286 pSnapRect->Bottom()));
3287 pObj = new SdrPathObj(
3288 rSdrModel,
3291 }
3292 else
3293 {
3294 pObj = new SdrPathObj(
3295 rSdrModel,
3297 }
3298 }
3299 break;
3300 case SdrObjKind::Text:
3303 {
3304 if(nullptr != pSnapRect)
3305 {
3306 pObj = new SdrRectObj(
3307 rSdrModel,
3308 nIdentifier,
3309 *pSnapRect);
3310 bSetSnapRect = false;
3311 }
3312 else
3313 {
3314 pObj = new SdrRectObj(
3315 rSdrModel,
3316 nIdentifier);
3317 }
3318 }
3319 break;
3324 {
3325 SdrCircKind eCircKind = ToSdrCircKind(nIdentifier);
3326 if(nullptr != pSnapRect)
3327 {
3328 pObj = new SdrCircObj(rSdrModel, eCircKind, *pSnapRect);
3329 bSetSnapRect = false;
3330 }
3331 else
3332 {
3333 pObj = new SdrCircObj(rSdrModel, eCircKind);
3334 }
3335 }
3336 break;
3337 case SdrObjKind::NONE: pObj = nullptr; break;
3338 case SdrObjKind::Group : pObj=new SdrObjGroup(rSdrModel); break;
3339 case SdrObjKind::Polygon : pObj=new SdrPathObj(rSdrModel, SdrObjKind::Polygon ); break;
3340 case SdrObjKind::PolyLine : pObj=new SdrPathObj(rSdrModel, SdrObjKind::PolyLine ); break;
3341 case SdrObjKind::PathLine : pObj=new SdrPathObj(rSdrModel, SdrObjKind::PathLine ); break;
3342 case SdrObjKind::PathFill : pObj=new SdrPathObj(rSdrModel, SdrObjKind::PathFill ); break;
3343 case SdrObjKind::FreehandLine : pObj=new SdrPathObj(rSdrModel, SdrObjKind::FreehandLine ); break;
3344 case SdrObjKind::FreehandFill : pObj=new SdrPathObj(rSdrModel, SdrObjKind::FreehandFill ); break;
3345 case SdrObjKind::PathPoly : pObj=new SdrPathObj(rSdrModel, SdrObjKind::Polygon ); break;
3346 case SdrObjKind::PathPolyLine : pObj=new SdrPathObj(rSdrModel, SdrObjKind::PolyLine ); break;
3347 case SdrObjKind::Edge : pObj=new SdrEdgeObj(rSdrModel); break;
3348 case SdrObjKind::Rectangle : pObj=new SdrRectObj(rSdrModel); break;
3349 case SdrObjKind::Graphic : pObj=new SdrGrafObj(rSdrModel); break;
3350 case SdrObjKind::OLE2 : pObj=new SdrOle2Obj(rSdrModel); break;
3351 case SdrObjKind::OLEPluginFrame : pObj=new SdrOle2Obj(rSdrModel, true); break;
3352 case SdrObjKind::Caption : pObj=new SdrCaptionObj(rSdrModel); break;
3353 case SdrObjKind::Page : pObj=new SdrPageObj(rSdrModel); break;
3354 case SdrObjKind::UNO : pObj=new SdrUnoObj(rSdrModel, OUString()); break;
3355 case SdrObjKind::CustomShape: pObj=new SdrObjCustomShape(rSdrModel); break;
3356#if HAVE_FEATURE_AVMEDIA
3357 case SdrObjKind::Media : pObj=new SdrMediaObj(rSdrModel); break;
3358#endif
3359 case SdrObjKind::Table : pObj=new sdr::table::SdrTableObj(rSdrModel); break;
3360 case SdrObjKind::NewFrame: // used for frame creation in writer
3361 pObj = new EmptyObject<SdrObjKind::NewFrame, SdrInventor::Default>(rSdrModel);
3362 break;
3363 default:
3364 break;
3365 }
3366 }
3367
3368 if (!pObj)
3369 {
3370 pObj = CreateObjectFromFactory(rSdrModel, nInventor, nIdentifier);
3371 }
3372
3373 if (!pObj)
3374 {
3375 // Well, if no one wants it...
3376 return nullptr;
3377 }
3378
3379 if(bSetSnapRect && nullptr != pSnapRect)
3380 {
3381 pObj->NbcSetSnapRect(*pSnapRect);
3382 }
3383
3384 return pObj;
3385}
3386
3388{
3389 std::vector<Link<SdrObjCreatorParams, rtl::Reference<SdrObject>>>& rLL=ImpGetUserMakeObjHdl();
3390 auto it = std::find(rLL.begin(), rLL.end(), rLink);
3391 if (it != rLL.end()) {
3392 OSL_FAIL("SdrObjFactory::InsertMakeObjectHdl(): Link already in place.");
3393 } else {
3394 rLL.push_back(rLink);
3395 }
3396}
3397
3399{
3400 std::vector<Link<SdrObjCreatorParams, rtl::Reference<SdrObject>>>& rLL=ImpGetUserMakeObjHdl();
3401 auto it = std::find(rLL.begin(), rLL.end(), rLink);
3402 if (it != rLL.end())
3403 rLL.erase(it);
3404}
3405
3406namespace svx
3407{
3409 {
3410 }
3411}
3412
3413/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
RasterOp
constexpr o3tl::Length MapToO3tlLength(MapUnit eU, o3tl::Length ePixelValue=o3tl::Length::px)
static rtl::Reference< SfxItemPool > CreatePool()
sal_Int32 GetNumerator() const
sal_Int32 GetDenominator() const
void DrawPolyLine(const tools::Polygon &rPoly)
RasterOp GetRasterOp() const
void SetLineColor()
void SetFillColor()
void SetRasterOp(RasterOp eRasterOp)
void SetActionRect(const tools::Rectangle &rR)
Definition: svddrag.hxx:167
sal_Int32 GetPointCount() const
Definition: svddrag.hxx:101
void TakeCreateRect(tools::Rectangle &rRect) const
Definition: svddrag.cxx:115
void SetOrtho4Possible(bool bOn=true)
Definition: svddrag.hxx:136
const Point & GetStart() const
Definition: svddrag.hxx:102
SdrView * GetView() const
Definition: svddrag.hxx:96
const SdrHdl * GetHdl() const
Definition: svddrag.hxx:111
const Point & GetNow() const
Definition: svddrag.hxx:105
Utility class SdrEdgeObj.
Definition: svdoedge.hxx:130
SdrObject * GetConnectedNode(bool bTail1) const override
Definition: svdoedge.cxx:495
void SetReallyAbsolute(bool bOn, const SdrObject &rObj)
Definition: svdglue.cxx:363
void Rotate(const Point &rRef, Degree100 nAngle, double sn, double cs, const SdrObject *pObj)
Definition: svdglue.cxx:369
void Mirror(const Point &rRef1, const Point &rRef2, const SdrObject *pObj)
Definition: svdglue.cxx:375
void Shear(const Point &rRef, double tn, bool bVShear, const SdrObject *pObj)
Definition: svdglue.cxx:388
void SetPercent(bool bOn)
Definition: svdglue.hxx:124
This class represents an embedded or linked bitmap graphic object.
Definition: svdograf.hxx:68
void AddHdl(std::unique_ptr< SdrHdl > pHdl)
Definition: svdhdl.cxx:2291
SdrHdlKind GetKind() const
Definition: svdhdl.hxx:194
SdrLayer * GetLayerPerID(SdrLayerID nID)
Definition: svdlayer.hxx:145
SdrLayer * GetLayer(sal_uInt16 i)
Definition: svdlayer.hxx:137
SdrLayerID GetID() const
Definition: svdlayer.hxx:94
const OUString & GetName() const
Definition: svdlayer.hxx:77
void BegUndo()
Definition: svdmodel.cxx:382
virtual void SetChanged(bool bFlg=true)
Definition: svdmodel.cxx:1143
void AddUndo(std::unique_ptr< SdrUndoAction > pUndo)
Definition: svdmodel.cxx:516
const SfxItemPool & GetItemPool() const
Definition: svdmodel.hxx:318
bool IsInDestruction() const
Definition: svdmodel.hxx:592
OUString GetMetricString(tools::Long nVal, bool bNoUnitChars=false, sal_Int32 nNumDigits=-1) const
Definition: svdmodel.cxx:966
const SdrPage * GetPage(sal_uInt16 nPgNum) const
Definition: svdmodel.cxx:1868
std::unordered_set< SdrObject * > maAllIncarnatedObjects
Definition: svdmodel.hxx:170
sal_uInt16 GetPageCount() const
Definition: svdmodel.cxx:1878
void EndUndo()
Definition: svdmodel.cxx:453
static SVX_DLLPRIVATE rtl::Reference< SdrObject > CreateObjectFromFactory(SdrModel &rSdrModel, SdrInventor nInventor, SdrObjKind nIdentifier)
Definition: svdobj.cxx:3187
static void InsertMakeObjectHdl(Link< SdrObjCreatorParams, rtl::Reference< SdrObject > > const &rLink)
Definition: svdobj.cxx:3387
static void RemoveMakeObjectHdl(Link< SdrObjCreatorParams, rtl::Reference< SdrObject > > const &rLink)
Definition: svdobj.cxx:3398
static rtl::Reference< SdrObject > MakeNewObject(SdrModel &rSdrModel, SdrInventor nInventor, SdrObjKind nObjIdentifier, const tools::Rectangle *pSnapRect=nullptr)
Definition: svdobj.cxx:3245
All geometrical data of an arbitrary object for use in undo/redo.
Definition: svdobj.hxx:174
bool bClosedObj
Definition: svdobj.hxx:183
virtual ~SdrObjGeoData()
Definition: svdobj.cxx:170
Point aAnchor
Definition: svdobj.hxx:177
std::unique_ptr< SdrGluePointList > pGPL
Definition: svdobj.hxx:179
bool bMovProt
Definition: svdobj.hxx:180
SdrLayerID mnLayerID
Definition: svdobj.hxx:185
bool bSizProt
Definition: svdobj.hxx:181
tools::Rectangle aBoundRect
Definition: svdobj.hxx:176
bool bNoPrint
Definition: svdobj.hxx:182
bool mbVisible
Definition: svdobj.hxx:184
SdrObject * Next()
Definition: svditer.hxx:63
bool IsMore() const
Definition: svditer.hxx:62
SdrObject * GetObj(size_t nNum) const
Definition: svdpage.cxx:784
size_t GetObjCount() const
Definition: svdpage.cxx:778
void SetSdrObjListRectsDirty()
Definition: svdpage.cxx:222
virtual SdrObject * getSdrObjectFromSdrObjList() const
Definition: svdpage.cxx:127
const SdrPageView * pPageView
Definition: svdobj.hxx:140
const SdrLayerIDSet * pVisiLayer
Definition: svdobj.hxx:139
sal_uInt16 nTol
Definition: svdobj.hxx:141
Provides information about various ZObject properties.
Definition: svdobj.hxx:196
virtual void Changed(const SdrObject &rObj, SdrUserCallType eType, const tools::Rectangle &rOldBoundRect)
Definition: svdobj.cxx:135
virtual sal_Int32 GetPDFAnchorStructureElementId(SdrObject const &rObj)
Definition: svdobj.cxx:139
virtual ~SdrObjUserCall()
Definition: svdobj.cxx:131
User data of a drawing object, e.g.
Definition: svdobj.hxx:152
virtual ~SdrObjUserData()
Definition: svdobj.cxx:158
SdrObjUserData(SdrInventor nInv, sal_uInt16 nId)
Definition: svdobj.cxx:150
Abstract DrawObject.
Definition: svdobj.hxx:260
void SetBLIPSizeRectangle(const tools::Rectangle &aRect)
Definition: svdobj.cxx:3032
sal_uInt32 GetOrdNumDirect() const
Definition: svdobj.hxx:842
virtual bool BckCreate(SdrDragStat &rStat)
Definition: svdobj.cxx:1383
virtual void RecalcSnapRect()
Snap is not done on the BoundRect but if possible on logic coordinates (i.e.
Definition: svdobj.cxx:1624
virtual ~SdrObject() override
Definition: svdobj.cxx:457
void setOutRectangleConst(tools::Rectangle const &rRectangle) const
Definition: svdobj.cxx:3144
virtual std::unique_ptr< sdr::properties::BaseProperties > CreateObjectSpecificProperties()
Definition: svdobj.cxx:215
virtual void NbcSetAnchorPos(const Point &rPnt)
Definition: svdobj.cxx:1601
bool IsResizeProtect() const
Definition: svdobj.hxx:756
void SetDoNotInsertIntoPageAutomatically(bool bSet)
Definition: svdobj.cxx:3042
virtual Degree100 GetShearAngle(bool bVertical=false) const
Definition: svdobj.cxx:1676
virtual void dumpAsXml(xmlTextWriterPtr pWriter) const
Definition: svdobj.cxx:1737
void InsertedStateChange()
Definition: svdobj.cxx:2611
std::unique_ptr< Impl > mpImpl
Definition: svdobj.hxx:960
virtual rtl::Reference< SdrObject > DoConvertToPolyObj(bool bBezier, bool bAddText) const
Definition: svdobj.cxx:2605
virtual void NbcCrop(const basegfx::B2DPoint &rRef, double fxFact, double fyFact)
Definition: svdobj.cxx:1508
virtual bool DoMacro(const SdrObjMacroHitRec &rRec)
Definition: svdobj.cxx:1850
const SfxPoolItem & GetMergedItem(const sal_uInt16 nWhich) const
Definition: svdobj.cxx:1975
virtual void SetAnchorPos(const Point &rPnt)
Definition: svdobj.cxx:1608
SdrObjUserCall * GetUserCall() const
Definition: svdobj.hxx:835
void ImpForcePlusData()
Definition: svdobj.cxx:1086
virtual Degree100 GetRotateAngle() const
Definition: svdobj.cxx:1671
SVX_DLLPRIVATE void setParentOfSdrObject(SdrObjList *pNew)
Definition: svdobj.cxx:294
virtual void SetGrabBagItem(const css::uno::Any &rVal)
Definition: svdobj.cxx:896
const Point & GetAnchorPos() const
Definition: svdobj.cxx:1619
void ActionChanged() const
Definition: svdobj.cxx:273
void SetRelativeHeight(double nValue)
Definition: svdobj.cxx:580
bool mbLineIsOutsideGeometry
Definition: svdobj.hxx:918
virtual void SAL_CALL acquire() noexcept override final
Definition: svdobj.cxx:487
virtual SdrGluePointList * ForceGluePointList()
Definition: svdobj.cxx:2285
virtual bool HasText() const
Definition: svdobj.cxx:3049
virtual void NbcSetPoint(const Point &rPnt, sal_uInt32 i)
Definition: svdobj.cxx:1715
virtual void NbcSetOutlinerParaObject(std::optional< OutlinerParaObject > pTextObject)
Definition: svdobj.cxx:1795
SdrModel & mrSdrModelFromSdrObject
Definition: svdobj.hxx:294
SvxShape * getSvxShape()
only for internal use!
Definition: svdobj.cxx:2818
virtual void NbcSetLayer(SdrLayerID nLayer)
Definition: svdobj.cxx:664
void ImpSetAnchorPos(const Point &rPnt)
Definition: svdobj.cxx:1596
const tools::Rectangle & getOutRectangle() const
Definition: svdobj.cxx:3139
virtual bool beginSpecialDrag(SdrDragStat &rDrag) const
Definition: svdobj.cxx:1313
bool m_bIs3DObj
Definition: svdobj.hxx:915
void SetMarkProtect(bool bProt)
Definition: svdobj.cxx:2528
virtual rtl::Reference< SdrObject > getFullDragClone() const
Definition: svdobj.cxx:1307
void moveOutRectangle(sal_Int32 nXDelta, sal_Int32 nYDelta)
Definition: svdobj.cxx:3159
virtual void NbcSetLogicRect(const tools::Rectangle &rRect)
Definition: svdobj.cxx:1643
void SetOutlinerParaObject(std::optional< OutlinerParaObject > pTextObject)
Definition: svdobj.cxx:1764
virtual sdr::properties::BaseProperties & GetProperties() const
Definition: svdobj.cxx:220
void MakeNameUnique()
Definition: svdobj.cxx:3059
tools::Rectangle maBLIPSizeRectangle
Definition: svdobj.hxx:973
virtual void Crop(const basegfx::B2DPoint &rRef, double fxFact, double fyFact)
Definition: svdobj.cxx:1533
virtual void NbcResize(const Point &rRef, const Fraction &xFact, const Fraction &yFact)
Definition: svdobj.cxx:1411
void notifyShapePropertyChange(const svx::ShapePropertyProviderId _eProperty) const
Definition: svdobj.cxx:2922
virtual bool IsTextBox() const
Is this a textbox of a drawinglayer shape?
Definition: svdobj.cxx:3054
void SetRelativeHeightRelation(sal_Int16 eValue)
Definition: svdobj.cxx:585
virtual void Shear(const Point &rRef, Degree100 nAngle, double tn, bool bVShear)
Definition: svdobj.cxx:1562
const SfxBroadcaster * GetBroadcaster() const
Definition: svdobj.cxx:697
virtual OUString TakeObjNamePlural() const
Definition: svdobj.cxx:1063
virtual void InternalSetStyleSheet(SfxStyleSheet *pNewStyleSheet, bool bDontRemoveHardAttr, bool bBroadcast)
Definition: svdobj.cxx:2233
void AppendUserData(std::unique_ptr< SdrObjUserData > pData)
Definition: svdobj.cxx:2695
virtual Point GetPoint(sal_uInt32 i) const
Definition: svdobj.cxx:1701
virtual bool BegCreate(SdrDragStat &rStat)
Every object must be able to create itself interactively.
Definition: svdobj.cxx:1349
const double * GetRelativeHeight() const
Definition: svdobj.cxx:603
std::unique_ptr< SdrObjPlusData > m_pPlusData
Definition: svdobj.hxx:897
virtual void setUnoShape(const css::uno::Reference< css::drawing::XShape > &_rxUnoShape)
Sets a new UNO representation of the shape.
Definition: svdobj.cxx:2790
static SdrItemPool & GetGlobalDrawObjectItemPool()
Definition: svdobj.cxx:548
SdrObject(SdrModel &rSdrModel)
Definition: svdobj.cxx:349
virtual basegfx::B2DPolyPolygon TakeXorPoly() const
The Xor-Polygon is required by the View to drag the object.
Definition: svdobj.cxx:1097
bool m_bMovProt
Definition: svdobj.hxx:902
virtual OUString GetTitle() const
Definition: svdobj.cxx:817
bool LineGeometryUsageIsNecessary() const
Definition: svdobj.cxx:1041
void BroadcastObjectChange() const
Definition: svdobj.cxx:984
virtual void SetTitle(const OUString &rStr)
Definition: svdobj.cxx:783
virtual void SAL_CALL release() noexcept override final
Definition: svdobj.cxx:495
SfxItemPool & GetObjectItemPool() const
Definition: svdobj.cxx:616
void SetObjectItemSet(const SfxItemSet &rSet)
Definition: svdobj.cxx:1960
virtual void RestoreGeoData(const SdrObjGeoData &rGeo)
Definition: svdobj.cxx:1889
bool IsMoveProtect() const
Definition: svdobj.hxx:754
virtual std::unique_ptr< SdrObjGeoData > GetGeoData() const
Definition: svdobj.cxx:1916
virtual void NbcSetRelativePos(const Point &rPnt)
The relative position of a SdrObject is the distance of the upper left corner of the logic bounding r...
Definition: svdobj.cxx:1573
void SetUserCall(SdrObjUserCall *pUser)
Definition: svdobj.cxx:2723
virtual const std::shared_ptr< svx::diagram::IDiagramHelper > & getDiagramHelper() const
Definition: svdobj.cxx:207
void SetEmptyPresObj(bool bEpt)
Definition: svdobj.cxx:2534
void NbcApplyNotPersistAttr(const SfxItemSet &rAttr)
Definition: svdobj.cxx:1994
bool mbSupportTextIndentingOnLineWidthChange
Definition: svdobj.hxx:920
sal_uInt16 GetUserDataCount() const
Definition: svdobj.cxx:2683
virtual void SetDescription(const OUString &rStr)
Definition: svdobj.cxx:827
void SingleObjectPainter(OutputDevice &rOut) const
Definition: svdobj.cxx:1030
void SetStyleSheet(SfxStyleSheet *pNewStyleSheet, bool bDontRemoveHardAttr)
Definition: svdobj.cxx:2215
rtl::Reference< SdrObject > ImpConvertToContourObj(bool bForceLineDash)
Definition: svdobj.cxx:2374
virtual SdrInventor GetObjInventor() const
Definition: svdobj.cxx:621
Point m_aAnchor
Definition: svdobj.hxx:894
void RemoveListener(SfxListener &rListener)
Definition: svdobj.cxx:687
virtual basegfx::B2DPolyPolygon TakeCreatePoly(const SdrDragStat &rDrag) const
Polygon dragged by the user when creating the object.
Definition: svdobj.cxx:1388
virtual OutlinerParaObject * GetOutlinerParaObject() const
Definition: svdobj.cxx:1799
virtual sal_uInt32 GetSnapPointCount() const
snap to special points of an Object (polygon points, center of circle)
Definition: svdobj.cxx:1681
void SetObjectItem(const SfxPoolItem &rItem)
Definition: svdobj.cxx:1945
virtual css::uno::Reference< css::drawing::XShape > getUnoShape()
Definition: svdobj.cxx:2832
void SetVisible(bool bVisible)
Definition: svdobj.cxx:2668
SdrObjList * mpParentOfSdrObject
Definition: svdobj.hxx:962
void SetRelativeWidth(double nValue)
Definition: svdobj.cxx:570
const SfxPoolItem & GetObjectItem(const sal_uInt16 nWhich) const
Definition: svdobj.cxx:1970
virtual bool supportsFullDrag() const
Definition: svdobj.cxx:1302
virtual basegfx::B2DPolyPolygon getSpecialDragPoly(const SdrDragStat &rDrag) const
Definition: svdobj.cxx:1341
virtual void Mirror(const Point &rRef1, const Point &rRef2)
Definition: svdobj.cxx:1553
bool m_bMarkProt
Definition: svdobj.hxx:970
sal_uInt32 GetOrdNum() const
The order number (aka ZOrder, aka z-index) determines whether a SdrObject is located above or below a...
Definition: svdobj.cxx:871
bool m_bSnapRectDirty
Definition: svdobj.hxx:900
virtual SdrObjList * GetSubList() const
Definition: svdobj.cxx:717
virtual bool IsPolyObj() const
Definition: svdobj.cxx:1691
void NbcMirrorGluePoints(const Point &rRef1, const Point &rRef2)
Definition: svdobj.cxx:2314
virtual void handlePageChange(SdrPage *pOldPage, SdrPage *pNewPage)
Definition: svdobj.cxx:523
void SetNavigationPosition(const sal_uInt32 nPosition)
Definition: svdobj.cxx:918
void SetMergedItemSet(const SfxItemSet &rSet, bool bClearAllItems=false)
Definition: svdobj.cxx:1965
virtual void SaveGeoData(SdrObjGeoData &rGeo) const
Definition: svdobj.cxx:1866
virtual bool MovCreate(SdrDragStat &rStat)
Definition: svdobj.cxx:1359
rtl::Reference< SdrObject > ConvertToPolyObj(bool bBezier, bool bLineToArea) const
Definition: svdobj.cxx:2586
void NbcSetStyleSheet(SfxStyleSheet *pNewStyleSheet, bool bDontRemoveHardAttr)
Definition: svdobj.cxx:2228
virtual void Move(const Size &rSiz)
Definition: svdobj.cxx:1497
virtual bool HasLimitedRotation() const
Definition: svdobj.cxx:1047
virtual const tools::Rectangle & GetCurrentBoundRect() const
Definition: svdobj.cxx:928
void SetResizeProtect(bool bProt)
Definition: svdobj.cxx:2643
void ForceMetricToItemPoolMetric(basegfx::B2DPolyPolygon &rPolyPolygon) const noexcept
Definition: svdobj.cxx:3122
virtual OUString GetDescription() const
Definition: svdobj.cxx:861
const double * GetRelativeWidth() const
Definition: svdobj.cxx:590
virtual void NbcSetSnapRect(const tools::Rectangle &rRect)
Definition: svdobj.cxx:1633
virtual void NbcMirror(const Point &rRef1, const Point &rRef2)
Definition: svdobj.cxx:1477
SdrObjList * getParentSdrObjListFromSdrObject() const
Definition: svdobj.cxx:318
SdrModel & getSdrModelFromSdrObject() const
Definition: svdobj.cxx:289
virtual const tools::Rectangle & GetSnapRect() const
Definition: svdobj.cxx:1628
SdrObjUserCall * m_pUserCall
Definition: svdobj.hxx:895
virtual void NbcShear(const Point &rRef, Degree100 nAngle, double tn, bool bVShear)
Definition: svdobj.cxx:1490
void NbcShearGluePoints(const Point &rRef, double tn, bool bVShear)
Definition: svdobj.cxx:2324
virtual void SetLogicRect(const tools::Rectangle &rRect)
Definition: svdobj.cxx:1662
virtual void SetGeoData(const SdrObjGeoData &rGeo)
Definition: svdobj.cxx:1923
SfxStyleSheet * GetStyleSheet() const
Definition: svdobj.cxx:2210
virtual const OUString & GetName() const
Definition: svdobj.cxx:771
virtual SdrObjList * getChildrenOfSdrObject() const
Definition: svdobj.cxx:323
virtual std::unique_ptr< sdr::contact::ViewContact > CreateObjectSpecificViewContact()
Definition: svdobj.cxx:256
void SetMoveProtect(bool bProt)
Definition: svdobj.cxx:2632
bool Equals(const SdrObject &) const
Definition: svdobj.cxx:1724
bool isVisibleOnAnyOfTheseLayers(const SdrLayerIDSet &rSet) const
Definition: svdobj.cxx:650
std::unique_ptr< SfxGrabBagItem > m_pGrabBagItem
Definition: svdobj.hxx:964
void SetNotVisibleAsMaster(bool bFlg)
Definition: svdobj.cxx:2540
virtual bool IsSdrTextObj() const
Definition: svdobj.hxx:763
SdrObjUserData * GetUserData(sal_uInt16 nNum) const
Definition: svdobj.cxx:2689
void SetRelativeWidthRelation(sal_Int16 eValue)
Definition: svdobj.cxx:575
bool m_bIsUnoObj
Definition: svdobj.hxx:916
virtual bool HasTextEdit() const
Definition: svdobj.cxx:1719
virtual void TRSetBaseGeometry(const basegfx::B2DHomMatrix &rMatrix, const basegfx::B2DPolyPolygon &rPolyPolygon)
Definition: svdobj.cxx:2974
bool IsGroupObject() const
Definition: svdobj.cxx:712
sdr::contact::ViewContact & GetViewContact() const
Definition: svdobj.cxx:261
sal_uInt32 m_nOrdNum
Definition: svdobj.hxx:963
virtual PointerStyle GetCreatePointer() const
get the cursor/pointer that signals creating this object
Definition: svdobj.cxx:1399
void SetOrdNum(sal_uInt32 nNum)
Definition: svdobj.cxx:883
void BurnInStyleSheetAttributes()
Definition: svdobj.cxx:1808
virtual void AdjustToMaxRect(const tools::Rectangle &rMaxRect, bool bShrinkOnly=false)
Definition: svdobj.cxx:1648
virtual void Rotate(const Point &rRef, Degree100 nAngle, double sn, double cs)
Definition: svdobj.cxx:1542
void SendUserCall(SdrUserCallType eUserCall, const tools::Rectangle &rBoundRect) const
Definition: svdobj.cxx:2729
virtual void PaintMacro(OutputDevice &rOut, const tools::Rectangle &rDirtyRect, const SdrObjMacroHitRec &rRec) const
Definition: svdobj.cxx:1833
bool HasLineStyle() const
Definition: svdobj.cxx:3019
void SetPoint(const Point &rPnt, sal_uInt32 i)
Definition: svdobj.cxx:1706
void SetMergedItemSetAndBroadcast(const SfxItemSet &rSet, bool bClearAllItems=false)
Definition: svdobj.cxx:1980
sal_Int16 GetRelativeHeightRelation() const
Definition: svdobj.cxx:611
virtual void ConnectToNode(bool bTail1, SdrObject *pObj)
Definition: svdobj.cxx:2334
virtual void SetChanged()
Definition: svdobj.cxx:1008
virtual OUString getSpecialDragComment(const SdrDragStat &rDrag) const
Definition: svdobj.cxx:1336
void AddObjectUser(sdr::ObjectUser &rNewUser)
Definition: svdobj.cxx:238
tools::Rectangle m_aOutRect
Definition: svdobj.hxx:893
virtual SdrObjKind GetObjIdentifier() const
Definition: svdobj.cxx:626
virtual const tools::Rectangle & GetLastBoundRect() const
Definition: svdobj.cxx:943
virtual rtl::Reference< SdrObject > CloneSdrObject(SdrModel &rTargetModel) const =0
virtual void SetContextWritingMode(const sal_Int16 _nContextWritingMode)
Definition: svdobj.cxx:3037
bool m_bIsEdge
Definition: svdobj.hxx:914
virtual sal_uInt32 GetHdlCount() const
Via GetHdlCount the number of Handles can be retrieved.
Definition: svdobj.cxx:1192
void AddListener(SfxListener &rListener)
Definition: svdobj.cxx:676
sal_uInt32 GetNavigationPosition() const
Definition: svdobj.cxx:907
SdrPage * getSdrPageFromSdrObject() const
Definition: svdobj.cxx:279
virtual const SdrGluePointList * GetGluePointList() const
Definition: svdobj.cxx:2278
virtual basegfx::B2DPolyPolygon TakeContour() const
contour for TextToContour
Definition: svdobj.cxx:1106
virtual void SetSnapRect(const tools::Rectangle &rRect)
Definition: svdobj.cxx:1653
bool IsVisible() const
Definition: svdobj.hxx:760
std::unique_ptr< sdr::contact::ViewContact > mpViewContact
Definition: svdobj.hxx:977
rtl::Reference< SdrObject > ConvertToContourObj(SdrObject *pRet, bool bForceLineDash=false) const
Definition: svdobj.cxx:2547
virtual void DisconnectFromNode(bool bTail1)
Definition: svdobj.cxx:2338
const SfxItemSet & GetMergedItemSet() const
Definition: svdobj.cxx:1940
virtual void NbcReformatText()
Definition: svdobj.cxx:1804
bool IsMacroHit(const SdrObjMacroHitRec &rRec) const
Definition: svdobj.cxx:1855
SdrObject * getParentSdrObjectFromSdrObject() const
Definition: svdobj.cxx:722
virtual SdrObject * CheckMacroHit(const SdrObjMacroHitRec &rRec) const
Definition: svdobj.cxx:1818
virtual OUString TakeObjNameSingul() const
Definition: svdobj.cxx:1053
OUString ImpGetDescriptionStr(TranslateId pStrCacheID) const
Definition: svdobj.cxx:1068
bool mbVisible
Definition: svdobj.hxx:969
bool IsInserted() const
Definition: svdobj.hxx:748
void ClearMergedItem(const sal_uInt16 nWhich=0)
Definition: svdobj.cxx:1955
bool IsPrintable() const
Definition: svdobj.hxx:758
bool IsInDestruction() const
Definition: svdobj.cxx:3008
virtual SdrLayerID GetLayer() const
Definition: svdobj.cxx:645
void SetMergedItem(const SfxPoolItem &rItem)
Definition: svdobj.cxx:1950
void RemoveObjectUser(sdr::ObjectUser &rOldUser)
Definition: svdobj.cxx:243
bool HasFillStyle() const
Definition: svdobj.cxx:3014
virtual PointerStyle GetMacroPointer(const SdrObjMacroHitRec &rRec) const
Definition: svdobj.cxx:1828
void AddReference(SdrVirtObj &rVrtObj)
Definition: svdobj.cxx:702
virtual SdrObject * GetConnectedNode(bool bTail1) const
Definition: svdobj.cxx:2342
virtual void AddToHdlList(SdrHdlList &rHdlList) const
Definition: svdobj.cxx:1197
virtual bool applySpecialDrag(SdrDragStat &rDrag)
Definition: svdobj.cxx:1324
void DelReference(SdrVirtObj &rVrtObj)
Definition: svdobj.cxx:707
bool m_bNoPrint
Definition: svdobj.hxx:968
OUString GetMetrStr(tools::Long nVal) const
Definition: svdobj.cxx:1092
virtual bool EndCreate(SdrDragStat &rStat, SdrCreateCmd eCmd)
Definition: svdobj.cxx:1369
virtual void RecalcBoundRect()
Definition: svdobj.cxx:948
virtual void SetLayer(SdrLayerID nLayer)
Definition: svdobj.cxx:669
virtual void BrkCreate(SdrDragStat &rStat)
Definition: svdobj.cxx:1379
void DeleteUserData(sal_uInt16 nNum)
Definition: svdobj.cxx:2710
bool m_bClosedObj
Definition: svdobj.hxx:913
void NbcRotateGluePoints(const Point &rRef, Degree100 nAngle, double sn, double cs)
Definition: svdobj.cxx:2304
SvxShape * mpSvxShape
Definition: svdobj.hxx:981
virtual SdrGluePoint GetCornerGluePoint(sal_uInt16 nNum) const
Definition: svdobj.cxx:2262
sal_Int16 GetRelativeWidthRelation() const
Definition: svdobj.cxx:598
bool m_bVirtObj
Definition: svdobj.hxx:899
bool mbDoNotInsertIntoPageAutomatically
Definition: svdobj.hxx:987
SdrLayerID mnLayerID
Definition: svdobj.hxx:967
void registerProvider(const svx::ShapePropertyProviderId _eProperty, std::unique_ptr< svx::PropertyValueProvider > propProvider)
Definition: svdobj.cxx:2931
tools::Rectangle ImpDragCalcRect(const SdrDragStat &rDrag) const
Definition: svdobj.cxx:1227
virtual bool hasSpecialDrag() const
The standard transformations (Move,Resize,Rotate,Mirror,Shear) are taken over by the View (TakeXorPol...
Definition: svdobj.cxx:1297
virtual void addCropHandles(SdrHdlList &rTarget) const
Definition: svdobj.cxx:1221
void GetGrabBagItem(css::uno::Any &rVal) const
Definition: svdobj.cxx:888
void setOutRectangle(tools::Rectangle const &rRectangle)
Definition: svdobj.cxx:3149
virtual std::unique_ptr< SdrObjGeoData > NewGeoData() const
A derived class must override these 3 methods if it has own geometric data that must be saved for Und...
Definition: svdobj.cxx:1861
virtual Point GetSnapPoint(sal_uInt32 i) const
Definition: svdobj.cxx:1686
void TakeNotPersistAttr(SfxItemSet &rAttr) const
Definition: svdobj.cxx:2166
css::uno::WeakReference< css::drawing::XShape > maWeakUnoShape
Definition: svdobj.hxx:983
void resetOutRectangle()
Definition: svdobj.cxx:3154
virtual void SetName(const OUString &rStr, const bool bSetChanged=true)
Definition: svdobj.cxx:734
virtual bool HasMacro() const
Definition: svdobj.cxx:1813
sal_uInt32 mnNavigationPosition
Definition: svdobj.hxx:966
bool m_bSizProt
Definition: svdobj.hxx:903
void ApplyNotPersistAttr(const SfxItemSet &rAttr)
Definition: svdobj.cxx:1985
virtual SdrGluePoint GetVertexGluePoint(sal_uInt16 nNum) const
Definition: svdobj.cxx:2241
virtual void SetRelativePos(const Point &rPnt)
Definition: svdobj.cxx:1580
std::unique_ptr< sdr::properties::BaseProperties > mpProperties
Definition: svdobj.hxx:975
void SetGlueReallyAbsolute(bool bOn)
Definition: svdobj.cxx:2294
virtual void AddToPlusHdlList(SdrHdlList &rHdlList, SdrHdl &rHdl) const
Definition: svdobj.cxx:1217
virtual void SetBoundRectDirty()
Definition: svdobj.cxx:329
bool m_bNotVisibleAsMaster
Definition: svdobj.hxx:911
virtual bool TRGetBaseGeometry(basegfx::B2DHomMatrix &rMatrix, basegfx::B2DPolyPolygon &rPolyPolygon) const
Definition: svdobj.cxx:2947
bool m_bEmptyPresObj
Definition: svdobj.hxx:909
virtual void NbcMove(const Size &rSiz)
The methods Move, Resize, Rotate, Mirror, Shear, SetSnapRect and SetLogicRect call the corresponding ...
Definition: svdobj.cxx:1405
virtual void SetBoundAndSnapRectsDirty(bool bNotMyself=false, bool bRecursive=true)
Definition: svdobj.cxx:509
virtual Point GetRelativePos() const
Definition: svdobj.cxx:1591
const SfxItemSet & GetObjectItemSet() const
Definition: svdobj.cxx:1935
virtual sal_uInt32 GetPointCount() const
Definition: svdobj.cxx:1696
void SetPrintable(bool bPrn)
Definition: svdobj.cxx:2654
virtual void TakeObjInfo(SdrObjTransformInfoRec &rInfo) const
Definition: svdobj.cxx:631
virtual const tools::Rectangle & GetLogicRect() const
Definition: svdobj.cxx:1638
virtual void Resize(const Point &rRef, const Fraction &xFact, const Fraction &yFact, bool bUnsetRelative=true)
Definition: svdobj.cxx:1514
virtual void NbcRotate(const Point &rRef, Degree100 nAngle, double sn, double cs)=0
A SdrPage contains exactly one SdrObjList and a description of the physical page dimensions (size / m...
Definition: svdpage.hxx:377
virtual SdrPage * getSdrPageFromSdrObjList() const override
Definition: svdpage.cxx:1611
css::uno::Reference< css::uno::XInterface > const & getUnoPage()
Definition: svdpage.cxx:1754
bool IsClosed() const
Definition: svdopath.hxx:146
Rectangle objects (rectangle, circle, ...)
Definition: svdorect.hxx:39
bool IsBigOrtho() const
Definition: svdsnpv.hxx:258
bool IsOrtho() const
Definition: svdsnpv.hxx:246
static std::unique_ptr< SdrUndoAction > CreateUndoObjectStrAttr(SdrObject &rObject, SdrUndoObjStrAttr::ObjStrAttrType eObjStrAttrType, const OUString &sOldStr, const OUString &sNewStr)
Definition: svdundo.cxx:1709
FIXME: The virtual object is not yet fully implemented and tested.
Definition: svdovirt.hxx:30
void Broadcast(const SfxHint &rHint)
const T * GetItemIfSet(TypedWhichId< T > nWhich, bool bSrchInParent=true) const
sal_uInt16 ClearItem(sal_uInt16 nWhich=0)
const SfxPoolItem * Put(const SfxPoolItem &rItem, sal_uInt16 nWhich)
const SfxPoolItem & Get(sal_uInt16 nWhich, bool bSrchInParent=true) const
void StartListening(SfxBroadcaster &rBroadcaster, DuplicateHandling eDuplicateHanding=DuplicateHandling::Unexpected)
void EndListening(SfxBroadcaster &rBroadcaster, bool bRemoveAllDuplicates=false)
constexpr tools::Long Height() const
constexpr tools::Long Width() const
virtual css::uno::Reference< css::drawing::XShape > CreateShape(SdrObject *pObj) const
Definition: unopage.cxx:824
static rtl::Reference< SvxShape > CreateShapeByTypeAndInventor(SdrObjKind nType, SdrInventor nInventor, SdrObject *pObj, SvxDrawPage *pPage=nullptr, OUString const &referer=OUString())
Definition: unopage.cxx:613
void InvalidateSdrObject()
Definition: unoshape.cxx:241
void notifyPropertyChange(svx::ShapePropertyProviderId eProp)
Definition: unoshape.cxx:292
void registerProvider(svx::ShapePropertyProviderId eProp, std::unique_ptr< svx::PropertyValueProvider > provider)
Definition: unoshape.cxx:298
bool decompose(B2DTuple &rScale, B2DTuple &rTranslate, double &rRotate, double &rShearX) const
void append(const B2DPolygon &rPolygon, sal_uInt32 nCount=1)
sal_uInt32 count() const
void append(const basegfx::B2DPoint &rPoint, sal_uInt32 nCount)
TYPE getMaxX() const
TYPE getMinX() const
TYPE getMinY() const
TYPE getMaxY() const
bool isEmpty() const
TYPE getX() const
void setY(TYPE fY)
TYPE getY() const
void setX(TYPE fX)
oslInterlockedCount m_refCount
void disposeWeakConnectionPoint()
basegfx::B2DRange getB2DRange(const geometry::ViewInformation2D &aViewInformation) const
void process(const primitive2d::Primitive2DContainer &rSource)
const basegfx::B2DPolyPolygonVector & getExtractedContour() const
const basegfx::B2DPolyPolygonVector & getExtractedLineFills() const
const basegfx::B2DPolygonVector & getExtractedHairlines() const
virtual void ProcessDisplay(DisplayInfo &rDisplayInfo) override
virtual void ActionChanged()
void getViewIndependentPrimitive2DContainer(drawinglayer::primitive2d::Primitive2DDecompositionVisitor &rVisitor) const
virtual void SetObjectItemSet(const SfxItemSet &rSet)=0
virtual void SetStyleSheet(SfxStyleSheet *pNewStyleSheet, bool bDontRemoveHardAttr, bool bBroadcast)=0
virtual void ClearMergedItem(const sal_uInt16 nWhich)
Definition: properties.cxx:77
virtual void ForceStyleToHardAttributes()
Definition: properties.cxx:83
virtual std::unique_ptr< BaseProperties > Clone(SdrObject &rObj) const =0
virtual const SfxItemSet & GetMergedItemSet() const
Definition: properties.cxx:53
void SetMergedItemSetAndBroadcast(const SfxItemSet &rSet, bool bClearAllItems=false)
Definition: properties.cxx:90
virtual void SetMergedItem(const SfxPoolItem &rItem)
Definition: properties.cxx:71
virtual void SetObjectItem(const SfxPoolItem &rItem)=0
virtual void SetMergedItemSet(const SfxItemSet &rSet, bool bClearAllItems=false)
Definition: properties.cxx:59
virtual const SfxItemSet & GetObjectItemSet() const =0
virtual SfxStyleSheet * GetStyleSheet() const =0
virtual ~ISdrObjectFilter()=0
Definition: svdobj.cxx:3408
constexpr Point Center() const
constexpr tools::Long GetWidth() const
constexpr void SetLeft(tools::Long v)
constexpr void SetTop(tools::Long v)
constexpr tools::Long Top() const
constexpr Point TopLeft() const
constexpr void SetRight(tools::Long v)
constexpr Size GetSize() const
void Move(tools::Long nHorzMoveDelta, tools::Long nVertMoveDelta)
constexpr tools::Long Right() const
tools::Long AdjustTop(tools::Long nVertMoveDelta)
constexpr Point RightCenter() const
constexpr Point BottomCenter() const
constexpr void SetBottom(tools::Long v)
constexpr Point BottomRight() const
constexpr Point TopRight() const
constexpr tools::Long GetHeight() const
tools::Long AdjustLeft(tools::Long nHorzMoveDelta)
constexpr Point LeftCenter() const
constexpr Point TopCenter() const
constexpr tools::Long Left() const
constexpr tools::Long Bottom() const
constexpr Point BottomLeft() const
static bool IsFuzzing()
constexpr ::Color COL_BLACK(0x00, 0x00, 0x00)
int nCount
#define DBG_ASSERT(sCon, aError)
#define DBG_TESTSOLARMUTEX()
double toRadians(D x)
OUString SvxResId(TranslateId aId)
Definition: dialmgr.cxx:24
float u
float x
struct _xmlTextWriter * xmlTextWriterPtr
sal_Int16 nValue
Definition: fmsrccfg.cxx:81
OUString sName
tools::Long FRound(double fVal)
OUString aName
sal_Int64 n
uno_Any a
sal_uInt16 nPos
MapUnit
aStr
std::unique_ptr< sal_Int32[]> pData
def text(shape, orig_st)
MapUnit GetMapUnit()
Definition: svdetc.hxx:80
bool less(const T &rfValA, const T &rfValB)
B2DHomMatrix createScaleTranslateB2DHomMatrix(double fScaleX, double fScaleY, double fTranslateX, double fTranslateY)
B2DPolygon createPolygonFromRect(const B2DRectangle &rRect, double fRadiusX, double fRadiusY)
B2DHomMatrix createScaleB2DHomMatrix(double fScaleX, double fScaleY)
B2DPolyPolygon mergeToSinglePolyPolygon(const B2DPolyPolygonVector &rInput)
B2DPolygon simplifyCurveSegments(const B2DPolygon &rCandidate)
::std::vector< B2DPolygon > B2DPolygonVector
::std::vector< B2DPolyPolygon > B2DPolyPolygonVector
Reference< XComponentContext > getProcessComponentContext()
int i
std::basic_string_view< charT, traits > trim(std::basic_string_view< charT, traits > str)
constexpr Point convert(const Point &rPoint, o3tl::Length eFrom, o3tl::Length eTo)
void reset_preserve_ptr_during(uniqueptr &ptr)
constexpr OUStringLiteral EMPTY
class UNLESS_MERGELIBS(SVXCORE_DLLPUBLIC) ObjectContactPainter typedef ::std::vector< SdrObject * > SdrObjectVector
::std::vector< ObjectUser * > ObjectUserVector
css::uno::Reference< css::linguistic2::XProofreadingIterator > get(css::uno::Reference< css::uno::XComponentContext > const &context)
long Long
OUString toString(OptionInfo const *info)
basegfx::B2DRange b2DRectangleFromRectangle(const ::tools::Rectangle &rRect)
sal_Int16 nId
#define Y
PointerStyle
SdrObject * SdrObjectPrimitiveHit(const SdrObject &rObject, const Point &rPnt, sal_uInt16 nTol, const SdrPageView &rSdrPageView, const SdrLayerIDSet *pVisiLayer, bool bTextOnly, drawinglayer::primitive2d::Primitive2DContainer *pHitContainer)
static SfxItemSet & rSet
sdr::ObjectUserVector maObjectUsers
Definition: svdobj.cxx:196
std::optional< double > mnRelativeHeight
Definition: svdobj.cxx:198
sal_Int16 meRelativeHeightRelation
Definition: svdobj.cxx:200
sal_Int16 meRelativeWidthRelation
Definition: svdobj.cxx:199
std::optional< double > mnRelativeWidth
Definition: svdobj.cxx:197
constexpr TypedWhichId< SdrShearAngleItem > SDRATTR_SHEARANGLE(SDRATTR_NOTPERSIST_FIRST+17)
constexpr TypedWhichId< SdrLayerNameItem > SDRATTR_LAYERNAME(SDRATTR_NOTPERSIST_FIRST+4)
constexpr TypedWhichId< SdrLayerIdItem > SDRATTR_LAYERID(SDRATTR_NOTPERSIST_FIRST+3)
constexpr TypedWhichId< SdrVertShearOneItem > SDRATTR_VERTSHEARONE(SDRATTR_NOTPERSIST_FIRST+24)
constexpr TypedWhichId< SdrObjPrintableItem > SDRATTR_OBJPRINTABLE(SDRATTR_NOTPERSIST_FIRST+2)
constexpr TypedWhichId< SdrLogicSizeHeightItem > SDRATTR_LOGICSIZEHEIGHT(SDRATTR_NOTPERSIST_FIRST+15)
constexpr TypedWhichId< SdrYesNoItem > SDRATTR_OBJSIZEPROTECT(SDRATTR_NOTPERSIST_FIRST+1)
constexpr TypedWhichId< SdrObjVisibleItem > SDRATTR_OBJVISIBLE(SDRATTR_NOTPERSIST_FIRST+35)
constexpr TypedWhichId< SdrOneSizeHeightItem > SDRATTR_ONESIZEHEIGHT(SDRATTR_NOTPERSIST_FIRST+13)
constexpr TypedWhichId< SdrOneSizeWidthItem > SDRATTR_ONESIZEWIDTH(SDRATTR_NOTPERSIST_FIRST+12)
constexpr TypedWhichId< SdrYesNoItem > SDRATTR_OBJMOVEPROTECT(SDRATTR_NOTPERSIST_FIRST+0)
constexpr TypedWhichId< SdrMoveXItem > SDRATTR_MOVEX(SDRATTR_NOTPERSIST_FIRST+18)
constexpr TypedWhichId< SdrOnePositionYItem > SDRATTR_ONEPOSITIONY(SDRATTR_NOTPERSIST_FIRST+11)
constexpr TypedWhichId< SfxStringItem > SDRATTR_OBJECTNAME(SDRATTR_NOTPERSIST_FIRST+5)
constexpr TypedWhichId< SdrMoveYItem > SDRATTR_MOVEY(SDRATTR_NOTPERSIST_FIRST+19)
constexpr TypedWhichId< SdrTransformRef1YItem > SDRATTR_TRANSFORMREF1Y(SDRATTR_NOTPERSIST_FIRST+31)
constexpr TypedWhichId< SdrHorzShearOneItem > SDRATTR_HORZSHEARONE(SDRATTR_NOTPERSIST_FIRST+23)
constexpr TypedWhichId< SdrRotateOneItem > SDRATTR_ROTATEONE(SDRATTR_NOTPERSIST_FIRST+22)
constexpr TypedWhichId< SdrLogicSizeWidthItem > SDRATTR_LOGICSIZEWIDTH(SDRATTR_NOTPERSIST_FIRST+14)
constexpr TypedWhichId< SdrOnePositionXItem > SDRATTR_ONEPOSITIONX(SDRATTR_NOTPERSIST_FIRST+10)
constexpr TypedWhichId< SdrResizeXOneItem > SDRATTR_RESIZEXONE(SDRATTR_NOTPERSIST_FIRST+20)
constexpr TypedWhichId< SdrResizeYOneItem > SDRATTR_RESIZEYONE(SDRATTR_NOTPERSIST_FIRST+21)
constexpr TypedWhichId< SdrTransformRef1XItem > SDRATTR_TRANSFORMREF1X(SDRATTR_NOTPERSIST_FIRST+30)
constexpr TypedWhichId< SdrAngleItem > SDRATTR_ROTATEANGLE(SDRATTR_NOTPERSIST_FIRST+16)
std::vector< Link< SdrObjCreatorParams, rtl::Reference< SdrObject > > > & ImpGetUserMakeObjHdl()
Definition: svdetc.cxx:346
SdrHdlKind
Definition: svdhdl.hxx:53
void impAddIncarnatedSdrObjectToSdrModel(SdrObject &rSdrObject, SdrModel &rSdrModel)
Definition: svdobj.cxx:336
E3dObject * DynCastE3dObject(SdrObject *pObj)
Definition: svdobj.cxx:3171
SdrTextObj * DynCastSdrTextObj(SdrObject *pObj)
Definition: svdobj.cxx:3178
static rtl::Reference< SdrItemPool > mpGlobalItemPool
Definition: svdobj.cxx:529
static void extractLineContourFromPrimitive2DSequence(const drawinglayer::primitive2d::Primitive2DContainer &rxSequence, basegfx::B2DPolygonVector &rExtractedHairlines, basegfx::B2DPolyPolygonVector &rExtractedLineFills)
Definition: svdobj.cxx:2348
E3dScene * DynCastE3dScene(SdrObject *pObj)
Definition: svdobj.cxx:3164
void impRemoveIncarnatedSdrObjectToSdrModel(SdrObject &rSdrObject, SdrModel &rSdrModel)
Definition: svdobj.cxx:340
SdrInventor
Definition: svdobj.hxx:98
SdrUserCallType
Definition: svdobj.hxx:112
SdrObjKind
Definition: svdobjkind.hxx:25
@ Group
abstract object (SdrObject)
@ Measure
object that represents a SdrPage
@ Page
Polyline represented by SdrPathObj.
@ Caption
connector object
@ Media
custom shape
@ PathFill
open Bezier-curve
@ Line
object group
@ Polygon
circle cut
@ Table
media shape
@ FreehandLine
closed Bezier-curve
@ UNO
continuously activated OLE (PlugIn-Frame or similar)
@ PathLine
PolyLine.
@ CustomShape
Universal Network Object packed into SvDraw object.
@ CircleOrEllipse
rectangle (round corners optional)
@ PathPoly
caption object
@ Text
closed free-hand line
@ OLE2
foreign graphic (StarView Graphic)
@ OLEPluginFrame
measurement object
@ Graphic
OutlineText, special text object for StarDraw.
@ CircleCut
circle arc
@ Rectangle
line
@ PathPolyLine
Polygon/PolyPolygon represented by SdrPathObj.
@ CircleSection
circle, ellipse
@ OutlineText
TitleText, special text object for StarDraw.
@ CircleArc
circle section
@ PolyLine
polygon, PolyPolygon
@ Edge
OLE object.
@ TitleText
text object
@ FreehandFill
open free-hand line
SdrCircKind ToSdrCircKind(SdrObjKind eKind)
Definition: svdocirc.cxx:104
SdrCircKind
Definition: svdocirc.hxx:38
void ResizeRect(tools::Rectangle &rRect, const Point &rRef, const Fraction &rxFact, const Fraction &ryFact)
Definition: svdtrans.cxx:38
SdrCreateCmd
Definition: svdtypes.hxx:27
constexpr SdrLayerID SDRLAYER_NOTFOUND(-1)
bool mbVisible
bool bVisible
Center
#define SAL_MAX_UINT32
constexpr TypedWhichId< XLineColorItem > XATTR_LINECOLOR(XATTR_LINE_FIRST+3)
constexpr TypedWhichId< XLineStyleItem > XATTR_LINESTYLE(XATTR_LINE_FIRST)
constexpr TypedWhichId< XFillStyleItem > XATTR_FILLSTYLE(XATTR_FILL_FIRST)
constexpr TypedWhichId< XLineTransparenceItem > XATTR_LINETRANSPARENCE(XATTR_LINE_FIRST+10)
const sal_uInt8 R