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