xref: /AOO41X/main/svx/source/svdraw/svdorect.cxx (revision a5258243accf51c522d45cf65e4b16cb17a336f7)
1cdf0e10cSrcweir /*************************************************************************
2cdf0e10cSrcweir  *
3cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4cdf0e10cSrcweir  *
5cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6cdf0e10cSrcweir  *
7cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8cdf0e10cSrcweir  *
9cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10cdf0e10cSrcweir  *
11cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14cdf0e10cSrcweir  *
15cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20cdf0e10cSrcweir  *
21cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25cdf0e10cSrcweir  *
26cdf0e10cSrcweir  ************************************************************************/
27cdf0e10cSrcweir 
28cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29cdf0e10cSrcweir #include "precompiled_svx.hxx"
30cdf0e10cSrcweir 
31cdf0e10cSrcweir #include <svx/svdorect.hxx>
32cdf0e10cSrcweir #include <math.h>
33cdf0e10cSrcweir #include <stdlib.h>
34cdf0e10cSrcweir #include <svx/xpool.hxx>
35cdf0e10cSrcweir #include <svx/xpoly.hxx>
36cdf0e10cSrcweir #include <svx/svdattr.hxx>
37cdf0e10cSrcweir #include <svx/svdpool.hxx>
38cdf0e10cSrcweir #include <svx/svdtrans.hxx>
39cdf0e10cSrcweir #include <svx/svdetc.hxx>
40cdf0e10cSrcweir #include <svx/svddrag.hxx>
41cdf0e10cSrcweir #include <svx/svdmodel.hxx>
42cdf0e10cSrcweir #include <svx/svdpage.hxx>
43cdf0e10cSrcweir #include <svx/svdocapt.hxx> // fuer Import von SdrFileVersion 2
44cdf0e10cSrcweir #include <svx/svdpagv.hxx> // fuer
45cdf0e10cSrcweir #include <svx/svdview.hxx> // das
46cdf0e10cSrcweir #include <svx/svdundo.hxx> // Macro-Beispiel
47cdf0e10cSrcweir #include <svx/svdopath.hxx>
48cdf0e10cSrcweir #include "svx/svdglob.hxx"  // Stringcache
49cdf0e10cSrcweir #include "svx/svdstr.hrc"   // Objektname
50cdf0e10cSrcweir #include <svx/xflclit.hxx>
51cdf0e10cSrcweir #include <svx/xlnclit.hxx>
52cdf0e10cSrcweir #include <svx/xlnwtit.hxx>
53cdf0e10cSrcweir #include "svdoimp.hxx"
54cdf0e10cSrcweir #include <svx/sdr/properties/rectangleproperties.hxx>
55cdf0e10cSrcweir #include <svx/sdr/contact/viewcontactofsdrrectobj.hxx>
56cdf0e10cSrcweir #include <basegfx/polygon/b2dpolygon.hxx>
57cdf0e10cSrcweir #include <basegfx/polygon/b2dpolygontools.hxx>
58cdf0e10cSrcweir 
59cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
60cdf0e10cSrcweir // BaseProperties section
61cdf0e10cSrcweir 
62cdf0e10cSrcweir sdr::properties::BaseProperties* SdrRectObj::CreateObjectSpecificProperties()
63cdf0e10cSrcweir {
64cdf0e10cSrcweir 	return new sdr::properties::RectangleProperties(*this);
65cdf0e10cSrcweir }
66cdf0e10cSrcweir 
67cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
68cdf0e10cSrcweir // DrawContact section
69cdf0e10cSrcweir 
70cdf0e10cSrcweir sdr::contact::ViewContact* SdrRectObj::CreateObjectSpecificViewContact()
71cdf0e10cSrcweir {
72cdf0e10cSrcweir 	return new sdr::contact::ViewContactOfSdrRectObj(*this);
73cdf0e10cSrcweir }
74cdf0e10cSrcweir 
75cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
76cdf0e10cSrcweir 
77cdf0e10cSrcweir TYPEINIT1(SdrRectObj,SdrTextObj);
78cdf0e10cSrcweir 
79cdf0e10cSrcweir SdrRectObj::SdrRectObj()
80cdf0e10cSrcweir :	mpXPoly(0L)
81cdf0e10cSrcweir {
82cdf0e10cSrcweir 	bClosedObj=sal_True;
83cdf0e10cSrcweir }
84cdf0e10cSrcweir 
85cdf0e10cSrcweir SdrRectObj::SdrRectObj(const Rectangle& rRect)
86cdf0e10cSrcweir :	SdrTextObj(rRect),
87cdf0e10cSrcweir 	mpXPoly(NULL)
88cdf0e10cSrcweir {
89cdf0e10cSrcweir 	bClosedObj=sal_True;
90cdf0e10cSrcweir }
91cdf0e10cSrcweir 
92cdf0e10cSrcweir SdrRectObj::SdrRectObj(SdrObjKind eNewTextKind)
93cdf0e10cSrcweir :	SdrTextObj(eNewTextKind),
94cdf0e10cSrcweir 	mpXPoly(NULL)
95cdf0e10cSrcweir {
96cdf0e10cSrcweir 	DBG_ASSERT(eTextKind==OBJ_TEXT || eTextKind==OBJ_TEXTEXT ||
97cdf0e10cSrcweir 			   eTextKind==OBJ_OUTLINETEXT || eTextKind==OBJ_TITLETEXT,
98cdf0e10cSrcweir 			   "SdrRectObj::SdrRectObj(SdrObjKind) ist nur fuer Textrahmen gedacht");
99cdf0e10cSrcweir 	bClosedObj=sal_True;
100cdf0e10cSrcweir }
101cdf0e10cSrcweir 
102cdf0e10cSrcweir SdrRectObj::SdrRectObj(SdrObjKind eNewTextKind, const Rectangle& rRect)
103cdf0e10cSrcweir :	SdrTextObj(eNewTextKind,rRect),
104cdf0e10cSrcweir 	mpXPoly(NULL)
105cdf0e10cSrcweir {
106cdf0e10cSrcweir 	DBG_ASSERT(eTextKind==OBJ_TEXT || eTextKind==OBJ_TEXTEXT ||
107cdf0e10cSrcweir 			   eTextKind==OBJ_OUTLINETEXT || eTextKind==OBJ_TITLETEXT,
108cdf0e10cSrcweir 			   "SdrRectObj::SdrRectObj(SdrObjKind,...) ist nur fuer Textrahmen gedacht");
109cdf0e10cSrcweir 	bClosedObj=sal_True;
110cdf0e10cSrcweir }
111cdf0e10cSrcweir 
112cdf0e10cSrcweir SdrRectObj::SdrRectObj(SdrObjKind eNewTextKind, const Rectangle& rNewRect, SvStream& rInput, const String& rBaseURL, sal_uInt16 eFormat)
113cdf0e10cSrcweir :    SdrTextObj(eNewTextKind,rNewRect,rInput,rBaseURL,eFormat),
114cdf0e10cSrcweir 	mpXPoly(NULL)
115cdf0e10cSrcweir {
116cdf0e10cSrcweir 	DBG_ASSERT(eTextKind==OBJ_TEXT || eTextKind==OBJ_TEXTEXT ||
117cdf0e10cSrcweir 			   eTextKind==OBJ_OUTLINETEXT || eTextKind==OBJ_TITLETEXT,
118cdf0e10cSrcweir 			   "SdrRectObj::SdrRectObj(SdrObjKind,...) ist nur fuer Textrahmen gedacht");
119cdf0e10cSrcweir 	bClosedObj=sal_True;
120cdf0e10cSrcweir }
121cdf0e10cSrcweir 
122cdf0e10cSrcweir SdrRectObj::~SdrRectObj()
123cdf0e10cSrcweir {
124cdf0e10cSrcweir 	if(mpXPoly)
125cdf0e10cSrcweir 	{
126cdf0e10cSrcweir 		delete mpXPoly;
127cdf0e10cSrcweir 	}
128cdf0e10cSrcweir }
129cdf0e10cSrcweir 
130cdf0e10cSrcweir void SdrRectObj::SetXPolyDirty()
131cdf0e10cSrcweir {
132cdf0e10cSrcweir 	if(mpXPoly)
133cdf0e10cSrcweir 	{
134cdf0e10cSrcweir 		delete mpXPoly;
135cdf0e10cSrcweir 		mpXPoly = 0L;
136cdf0e10cSrcweir 	}
137cdf0e10cSrcweir }
138cdf0e10cSrcweir 
139cdf0e10cSrcweir FASTBOOL SdrRectObj::PaintNeedsXPoly(long nEckRad) const
140cdf0e10cSrcweir {
141cdf0e10cSrcweir 	FASTBOOL bNeed=aGeo.nDrehWink!=0 || aGeo.nShearWink!=0 || nEckRad!=0;
142cdf0e10cSrcweir 	return bNeed;
143cdf0e10cSrcweir }
144cdf0e10cSrcweir 
145cdf0e10cSrcweir XPolygon SdrRectObj::ImpCalcXPoly(const Rectangle& rRect1, long nRad1) const
146cdf0e10cSrcweir {
147cdf0e10cSrcweir 	XPolygon aXPoly(rRect1,nRad1,nRad1);
148cdf0e10cSrcweir 	const sal_uInt16 nPointAnz(aXPoly.GetPointCount());
149cdf0e10cSrcweir 	XPolygon aNeuPoly(nPointAnz+1);
150cdf0e10cSrcweir 	sal_uInt16 nShift=nPointAnz-2;
151cdf0e10cSrcweir 	if (nRad1!=0) nShift=nPointAnz-5;
152cdf0e10cSrcweir 	sal_uInt16 j=nShift;
153cdf0e10cSrcweir 	for (sal_uInt16 i=1; i<nPointAnz; i++) {
154cdf0e10cSrcweir 		aNeuPoly[i]=aXPoly[j];
155cdf0e10cSrcweir 		aNeuPoly.SetFlags(i,aXPoly.GetFlags(j));
156cdf0e10cSrcweir 		j++;
157cdf0e10cSrcweir 		if (j>=nPointAnz) j=1;
158cdf0e10cSrcweir 	}
159cdf0e10cSrcweir 	aNeuPoly[0]=rRect1.BottomCenter();
160cdf0e10cSrcweir 	aNeuPoly[nPointAnz]=aNeuPoly[0];
161cdf0e10cSrcweir 	aXPoly=aNeuPoly;
162cdf0e10cSrcweir 
163cdf0e10cSrcweir 	// Die Winkelangaben beziehen sich immer auf die linke obere Ecke von !aRect!
164cdf0e10cSrcweir 	if (aGeo.nShearWink!=0) ShearXPoly(aXPoly,aRect.TopLeft(),aGeo.nTan);
165cdf0e10cSrcweir 	if (aGeo.nDrehWink!=0) RotateXPoly(aXPoly,aRect.TopLeft(),aGeo.nSin,aGeo.nCos);
166cdf0e10cSrcweir 	return aXPoly;
167cdf0e10cSrcweir }
168cdf0e10cSrcweir 
169cdf0e10cSrcweir void SdrRectObj::RecalcXPoly()
170cdf0e10cSrcweir {
171cdf0e10cSrcweir 	mpXPoly = new XPolygon(ImpCalcXPoly(aRect,GetEckenradius()));
172cdf0e10cSrcweir }
173cdf0e10cSrcweir 
174cdf0e10cSrcweir const XPolygon& SdrRectObj::GetXPoly() const
175cdf0e10cSrcweir {
176cdf0e10cSrcweir 	if(!mpXPoly)
177cdf0e10cSrcweir 	{
178cdf0e10cSrcweir 		((SdrRectObj*)this)->RecalcXPoly();
179cdf0e10cSrcweir 	}
180cdf0e10cSrcweir 
181cdf0e10cSrcweir 	return *mpXPoly;
182cdf0e10cSrcweir }
183cdf0e10cSrcweir 
184cdf0e10cSrcweir void SdrRectObj::TakeObjInfo(SdrObjTransformInfoRec& rInfo) const
185cdf0e10cSrcweir {
186cdf0e10cSrcweir 	FASTBOOL bNoTextFrame=!IsTextFrame();
187cdf0e10cSrcweir 	rInfo.bResizeFreeAllowed=bNoTextFrame || aGeo.nDrehWink%9000==0;
188cdf0e10cSrcweir 	rInfo.bResizePropAllowed=sal_True;
189cdf0e10cSrcweir 	rInfo.bRotateFreeAllowed=sal_True;
190cdf0e10cSrcweir 	rInfo.bRotate90Allowed  =sal_True;
191cdf0e10cSrcweir 	rInfo.bMirrorFreeAllowed=bNoTextFrame;
192cdf0e10cSrcweir 	rInfo.bMirror45Allowed  =bNoTextFrame;
193cdf0e10cSrcweir 	rInfo.bMirror90Allowed  =bNoTextFrame;
194cdf0e10cSrcweir 
195cdf0e10cSrcweir 	// allow transparence
196cdf0e10cSrcweir 	rInfo.bTransparenceAllowed = sal_True;
197cdf0e10cSrcweir 
198cdf0e10cSrcweir 	// gradient depends on fillstyle
199cdf0e10cSrcweir 	XFillStyle eFillStyle = ((XFillStyleItem&)(GetObjectItem(XATTR_FILLSTYLE))).GetValue();
200cdf0e10cSrcweir 	rInfo.bGradientAllowed = (eFillStyle == XFILL_GRADIENT);
201cdf0e10cSrcweir 
202cdf0e10cSrcweir 	rInfo.bShearAllowed     =bNoTextFrame;
203cdf0e10cSrcweir 	rInfo.bEdgeRadiusAllowed=sal_True;
204cdf0e10cSrcweir 
205cdf0e10cSrcweir 	FASTBOOL bCanConv=!HasText() || ImpCanConvTextToCurve();
206cdf0e10cSrcweir 	if (bCanConv && !bNoTextFrame && !HasText()) {
207cdf0e10cSrcweir 		bCanConv=HasFill() || HasLine();
208cdf0e10cSrcweir 	}
209cdf0e10cSrcweir 	rInfo.bCanConvToPath    =bCanConv;
210cdf0e10cSrcweir 	rInfo.bCanConvToPoly    =bCanConv;
211cdf0e10cSrcweir 	rInfo.bCanConvToContour = (rInfo.bCanConvToPoly || LineGeometryUsageIsNecessary());
212cdf0e10cSrcweir }
213cdf0e10cSrcweir 
214cdf0e10cSrcweir sal_uInt16 SdrRectObj::GetObjIdentifier() const
215cdf0e10cSrcweir {
216cdf0e10cSrcweir 	if (IsTextFrame()) return sal_uInt16(eTextKind);
217cdf0e10cSrcweir 	else return sal_uInt16(OBJ_RECT);
218cdf0e10cSrcweir }
219cdf0e10cSrcweir 
220cdf0e10cSrcweir void SdrRectObj::TakeUnrotatedSnapRect(Rectangle& rRect) const
221cdf0e10cSrcweir {
222cdf0e10cSrcweir 	rRect=aRect;
223cdf0e10cSrcweir 	if (aGeo.nShearWink!=0) {
224cdf0e10cSrcweir 		long nDst=Round((aRect.Bottom()-aRect.Top())*aGeo.nTan);
225cdf0e10cSrcweir 		if (aGeo.nShearWink>0) {
226cdf0e10cSrcweir 			Point aRef(rRect.TopLeft());
227cdf0e10cSrcweir 			rRect.Left()-=nDst;
228cdf0e10cSrcweir 			Point aTmpPt(rRect.TopLeft());
229cdf0e10cSrcweir 			RotatePoint(aTmpPt,aRef,aGeo.nSin,aGeo.nCos);
230cdf0e10cSrcweir 			aTmpPt-=rRect.TopLeft();
231cdf0e10cSrcweir 			rRect.Move(aTmpPt.X(),aTmpPt.Y());
232cdf0e10cSrcweir 		} else {
233cdf0e10cSrcweir 			rRect.Right()-=nDst;
234cdf0e10cSrcweir 		}
235cdf0e10cSrcweir 	}
236cdf0e10cSrcweir }
237cdf0e10cSrcweir 
238cdf0e10cSrcweir void SdrRectObj::TakeObjNameSingul(XubString& rName) const
239cdf0e10cSrcweir {
240cdf0e10cSrcweir 	if (IsTextFrame())
241cdf0e10cSrcweir 	{
242cdf0e10cSrcweir 		SdrTextObj::TakeObjNameSingul(rName);
243cdf0e10cSrcweir 	}
244cdf0e10cSrcweir 	else
245cdf0e10cSrcweir 	{
246cdf0e10cSrcweir 		sal_uInt16 nResId=STR_ObjNameSingulRECT;
247cdf0e10cSrcweir 		if (aGeo.nShearWink!=0) {
248cdf0e10cSrcweir 			nResId+=4;  // Parallelogramm oder Raute
249cdf0e10cSrcweir 			// Raute ist nicht, weil Shear die vertikalen Kanten verlaengert!
250cdf0e10cSrcweir 			// Wenn Zeit ist, werde ich das mal berechnen.
251cdf0e10cSrcweir 		} else {
252cdf0e10cSrcweir 			if (aRect.GetWidth()==aRect.GetHeight()) nResId+=2; // Quadrat
253cdf0e10cSrcweir 		}
254cdf0e10cSrcweir 		if (GetEckenradius()!=0) nResId+=8; // abgerundet
255cdf0e10cSrcweir 		rName=ImpGetResStr(nResId);
256cdf0e10cSrcweir 
257cdf0e10cSrcweir 		String aName( GetName() );
258cdf0e10cSrcweir 		if(aName.Len())
259cdf0e10cSrcweir 		{
260cdf0e10cSrcweir 			rName += sal_Unicode(' ');
261cdf0e10cSrcweir 			rName += sal_Unicode('\'');
262cdf0e10cSrcweir 			rName += aName;
263cdf0e10cSrcweir 			rName += sal_Unicode('\'');
264cdf0e10cSrcweir 		}
265cdf0e10cSrcweir 	}
266cdf0e10cSrcweir }
267cdf0e10cSrcweir 
268cdf0e10cSrcweir void SdrRectObj::TakeObjNamePlural(XubString& rName) const
269cdf0e10cSrcweir {
270cdf0e10cSrcweir 	if (IsTextFrame()) SdrTextObj::TakeObjNamePlural(rName);
271cdf0e10cSrcweir 	else {
272cdf0e10cSrcweir 		sal_uInt16 nResId=STR_ObjNamePluralRECT;
273cdf0e10cSrcweir 		if (aGeo.nShearWink!=0) {
274cdf0e10cSrcweir 			nResId+=4;  // Parallelogramm oder Raute
275cdf0e10cSrcweir 		} else {
276cdf0e10cSrcweir 			if (aRect.GetWidth()==aRect.GetHeight()) nResId+=2; // Quadrat
277cdf0e10cSrcweir 		}
278cdf0e10cSrcweir 		if (GetEckenradius()!=0) nResId+=8; // abgerundet
279cdf0e10cSrcweir 		rName=ImpGetResStr(nResId);
280cdf0e10cSrcweir 	}
281cdf0e10cSrcweir }
282cdf0e10cSrcweir 
283cdf0e10cSrcweir void SdrRectObj::operator=(const SdrObject& rObj)
284cdf0e10cSrcweir {
285cdf0e10cSrcweir 	SdrTextObj::operator=(rObj);
286cdf0e10cSrcweir }
287cdf0e10cSrcweir 
288cdf0e10cSrcweir basegfx::B2DPolyPolygon SdrRectObj::TakeXorPoly() const
289cdf0e10cSrcweir {
290cdf0e10cSrcweir 	XPolyPolygon aXPP;
291cdf0e10cSrcweir 	aXPP.Insert(ImpCalcXPoly(aRect,GetEckenradius()));
292cdf0e10cSrcweir 	return aXPP.getB2DPolyPolygon();
293cdf0e10cSrcweir }
294cdf0e10cSrcweir 
295cdf0e10cSrcweir void SdrRectObj::RecalcSnapRect()
296cdf0e10cSrcweir {
297cdf0e10cSrcweir 	long nEckRad=GetEckenradius();
298cdf0e10cSrcweir 	if ((aGeo.nDrehWink!=0 || aGeo.nShearWink!=0) && nEckRad!=0) {
299cdf0e10cSrcweir 		maSnapRect=GetXPoly().GetBoundRect();
300cdf0e10cSrcweir 	} else {
301cdf0e10cSrcweir 		SdrTextObj::RecalcSnapRect();
302cdf0e10cSrcweir 	}
303cdf0e10cSrcweir }
304cdf0e10cSrcweir 
305cdf0e10cSrcweir void SdrRectObj::NbcSetSnapRect(const Rectangle& rRect)
306cdf0e10cSrcweir {
307cdf0e10cSrcweir 	SdrTextObj::NbcSetSnapRect(rRect);
308cdf0e10cSrcweir 	SetXPolyDirty();
309cdf0e10cSrcweir }
310cdf0e10cSrcweir 
311cdf0e10cSrcweir void SdrRectObj::NbcSetLogicRect(const Rectangle& rRect)
312cdf0e10cSrcweir {
313cdf0e10cSrcweir 	SdrTextObj::NbcSetLogicRect(rRect);
314cdf0e10cSrcweir 	SetXPolyDirty();
315cdf0e10cSrcweir }
316cdf0e10cSrcweir 
317cdf0e10cSrcweir sal_uInt32 SdrRectObj::GetHdlCount() const
318cdf0e10cSrcweir {
319cdf0e10cSrcweir     return IsTextFrame() ? 10 : 9;
320cdf0e10cSrcweir }
321cdf0e10cSrcweir 
322cdf0e10cSrcweir SdrHdl* SdrRectObj::GetHdl(sal_uInt32 nHdlNum) const
323cdf0e10cSrcweir {
324cdf0e10cSrcweir 	SdrHdl* pH = NULL;
325cdf0e10cSrcweir 	Point aPnt;
326cdf0e10cSrcweir 	SdrHdlKind eKind = HDL_MOVE;
327cdf0e10cSrcweir 
328cdf0e10cSrcweir     if(!IsTextFrame())
329cdf0e10cSrcweir     {
330cdf0e10cSrcweir         nHdlNum++;
331cdf0e10cSrcweir     }
332cdf0e10cSrcweir 
333cdf0e10cSrcweir     switch(nHdlNum)
334cdf0e10cSrcweir     {
335cdf0e10cSrcweir         case 0:
336cdf0e10cSrcweir         {
337cdf0e10cSrcweir             pH = new ImpTextframeHdl(aRect);
338cdf0e10cSrcweir 		    pH->SetObj((SdrObject*)this);
339cdf0e10cSrcweir 		    pH->SetDrehWink(aGeo.nDrehWink);
340cdf0e10cSrcweir             break;
341cdf0e10cSrcweir         }
342cdf0e10cSrcweir         case 1:
343cdf0e10cSrcweir         {
344cdf0e10cSrcweir             long a = GetEckenradius();
345cdf0e10cSrcweir             long b = Max(aRect.GetWidth(),aRect.GetHeight())/2; // Wird aufgerundet, da GetWidth() eins draufaddiert
346cdf0e10cSrcweir             if (a>b) a=b;
347cdf0e10cSrcweir             if (a<0) a=0;
348cdf0e10cSrcweir             aPnt=aRect.TopLeft();
349cdf0e10cSrcweir             aPnt.X()+=a;
350cdf0e10cSrcweir             eKind = HDL_CIRC;
351cdf0e10cSrcweir             break;
352cdf0e10cSrcweir         }
353cdf0e10cSrcweir         case 2: aPnt=aRect.TopLeft();      eKind = HDL_UPLFT; break; // Oben links
354cdf0e10cSrcweir         case 3: aPnt=aRect.TopCenter();    eKind = HDL_UPPER; break; // Oben
355cdf0e10cSrcweir         case 4: aPnt=aRect.TopRight();     eKind = HDL_UPRGT; break; // Oben rechts
356cdf0e10cSrcweir         case 5: aPnt=aRect.LeftCenter();   eKind = HDL_LEFT ; break; // Links
357cdf0e10cSrcweir         case 6: aPnt=aRect.RightCenter();  eKind = HDL_RIGHT; break; // Rechts
358cdf0e10cSrcweir         case 7: aPnt=aRect.BottomLeft();   eKind = HDL_LWLFT; break; // Unten links
359cdf0e10cSrcweir         case 8: aPnt=aRect.BottomCenter(); eKind = HDL_LOWER; break; // Unten
360cdf0e10cSrcweir         case 9: aPnt=aRect.BottomRight();  eKind = HDL_LWRGT; break; // Unten rechts
361cdf0e10cSrcweir     }
362cdf0e10cSrcweir 
363cdf0e10cSrcweir     if(!pH)
364cdf0e10cSrcweir     {
365cdf0e10cSrcweir         if(aGeo.nShearWink)
366cdf0e10cSrcweir         {
367cdf0e10cSrcweir             ShearPoint(aPnt,aRect.TopLeft(),aGeo.nTan);
368cdf0e10cSrcweir         }
369cdf0e10cSrcweir 
370cdf0e10cSrcweir         if(aGeo.nDrehWink)
371cdf0e10cSrcweir         {
372cdf0e10cSrcweir             RotatePoint(aPnt,aRect.TopLeft(),aGeo.nSin,aGeo.nCos);
373cdf0e10cSrcweir         }
374cdf0e10cSrcweir 
375cdf0e10cSrcweir 		pH = new SdrHdl(aPnt,eKind);
376cdf0e10cSrcweir 		pH->SetObj((SdrObject*)this);
377cdf0e10cSrcweir 		pH->SetDrehWink(aGeo.nDrehWink);
378cdf0e10cSrcweir 	}
379cdf0e10cSrcweir 
380cdf0e10cSrcweir     return pH;
381cdf0e10cSrcweir }
382cdf0e10cSrcweir 
383cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
384cdf0e10cSrcweir 
385cdf0e10cSrcweir bool SdrRectObj::hasSpecialDrag() const
386cdf0e10cSrcweir {
387cdf0e10cSrcweir 	return true;
388cdf0e10cSrcweir }
389cdf0e10cSrcweir 
390cdf0e10cSrcweir bool SdrRectObj::beginSpecialDrag(SdrDragStat& rDrag) const
391cdf0e10cSrcweir {
392cdf0e10cSrcweir 	const bool bRad(rDrag.GetHdl() && HDL_CIRC == rDrag.GetHdl()->GetKind());
393cdf0e10cSrcweir 
394cdf0e10cSrcweir     if(bRad)
395cdf0e10cSrcweir     {
396cdf0e10cSrcweir 		rDrag.SetEndDragChangesAttributes(true);
397cdf0e10cSrcweir 
398cdf0e10cSrcweir         return true;
399cdf0e10cSrcweir 	}
400cdf0e10cSrcweir 
401cdf0e10cSrcweir     return SdrTextObj::beginSpecialDrag(rDrag);
402cdf0e10cSrcweir }
403cdf0e10cSrcweir 
404cdf0e10cSrcweir bool SdrRectObj::applySpecialDrag(SdrDragStat& rDrag)
405cdf0e10cSrcweir {
406cdf0e10cSrcweir 	const bool bRad(rDrag.GetHdl() && HDL_CIRC == rDrag.GetHdl()->GetKind());
407cdf0e10cSrcweir 
408cdf0e10cSrcweir     if (bRad)
409cdf0e10cSrcweir     {
410cdf0e10cSrcweir 		Rectangle aBoundRect0;
411cdf0e10cSrcweir 		Point aPt(rDrag.GetNow());
412cdf0e10cSrcweir 
413cdf0e10cSrcweir         if(aGeo.nDrehWink)
414cdf0e10cSrcweir             RotatePoint(aPt,aRect.TopLeft(),-aGeo.nSin,aGeo.nCos);
415cdf0e10cSrcweir 
416cdf0e10cSrcweir 		sal_Int32 nRad(aPt.X() - aRect.Left());
417cdf0e10cSrcweir 
418cdf0e10cSrcweir         if (nRad < 0)
419cdf0e10cSrcweir             nRad = 0;
420cdf0e10cSrcweir 
421cdf0e10cSrcweir         if(nRad != GetEckenradius())
422cdf0e10cSrcweir         {
423cdf0e10cSrcweir             NbcSetEckenradius(nRad);
424cdf0e10cSrcweir         }
425cdf0e10cSrcweir 
426cdf0e10cSrcweir         return true;
427cdf0e10cSrcweir 	}
428cdf0e10cSrcweir     else
429cdf0e10cSrcweir     {
430cdf0e10cSrcweir         return SdrTextObj::applySpecialDrag(rDrag);
431cdf0e10cSrcweir     }
432cdf0e10cSrcweir }
433cdf0e10cSrcweir 
434cdf0e10cSrcweir String SdrRectObj::getSpecialDragComment(const SdrDragStat& rDrag) const
435cdf0e10cSrcweir {
436cdf0e10cSrcweir     const bool bCreateComment(rDrag.GetView() && this == rDrag.GetView()->GetCreateObj());
437cdf0e10cSrcweir 
438cdf0e10cSrcweir     if(bCreateComment)
439cdf0e10cSrcweir     {
440cdf0e10cSrcweir         return String();
441cdf0e10cSrcweir     }
442cdf0e10cSrcweir     else
443cdf0e10cSrcweir     {
444cdf0e10cSrcweir 	    const bool bRad(rDrag.GetHdl() && HDL_CIRC == rDrag.GetHdl()->GetKind());
445cdf0e10cSrcweir 
446cdf0e10cSrcweir 	    if(bRad)
447cdf0e10cSrcweir 	    {
448cdf0e10cSrcweir 		    Point aPt(rDrag.GetNow());
449cdf0e10cSrcweir 
450cdf0e10cSrcweir 		    // -sin fuer Umkehrung
451cdf0e10cSrcweir 		    if(aGeo.nDrehWink)
452cdf0e10cSrcweir 			    RotatePoint(aPt, aRect.TopLeft(), -aGeo.nSin, aGeo.nCos);
453cdf0e10cSrcweir 
454cdf0e10cSrcweir 		    sal_Int32 nRad(aPt.X() - aRect.Left());
455cdf0e10cSrcweir 
456cdf0e10cSrcweir 		    if(nRad < 0)
457cdf0e10cSrcweir 			    nRad = 0;
458cdf0e10cSrcweir 
459cdf0e10cSrcweir 		    XubString aStr;
460cdf0e10cSrcweir 
461cdf0e10cSrcweir 		    ImpTakeDescriptionStr(STR_DragRectEckRad, aStr);
462cdf0e10cSrcweir 		    aStr.AppendAscii(" (");
463cdf0e10cSrcweir 		    aStr += GetMetrStr(nRad);
464cdf0e10cSrcweir 		    aStr += sal_Unicode(')');
465cdf0e10cSrcweir 
466cdf0e10cSrcweir 		    return aStr;
467cdf0e10cSrcweir 	    }
468cdf0e10cSrcweir 	    else
469cdf0e10cSrcweir 	    {
470cdf0e10cSrcweir 		    return SdrTextObj::getSpecialDragComment(rDrag);
471cdf0e10cSrcweir 	    }
472cdf0e10cSrcweir     }
473cdf0e10cSrcweir }
474cdf0e10cSrcweir 
475cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
476cdf0e10cSrcweir 
477cdf0e10cSrcweir basegfx::B2DPolyPolygon SdrRectObj::TakeCreatePoly(const SdrDragStat& rDrag) const
478cdf0e10cSrcweir {
479cdf0e10cSrcweir 	Rectangle aRect1;
480cdf0e10cSrcweir 	rDrag.TakeCreateRect(aRect1);
481cdf0e10cSrcweir 	aRect1.Justify();
482cdf0e10cSrcweir 
483cdf0e10cSrcweir 	basegfx::B2DPolyPolygon aRetval;
484cdf0e10cSrcweir 	aRetval.append(ImpCalcXPoly(aRect1,GetEckenradius()).getB2DPolygon());
485cdf0e10cSrcweir 	return aRetval;
486cdf0e10cSrcweir }
487cdf0e10cSrcweir 
488cdf0e10cSrcweir Pointer SdrRectObj::GetCreatePointer() const
489cdf0e10cSrcweir {
490cdf0e10cSrcweir 	if (IsTextFrame()) return Pointer(POINTER_DRAW_TEXT);
491cdf0e10cSrcweir 	return Pointer(POINTER_DRAW_RECT);
492cdf0e10cSrcweir }
493cdf0e10cSrcweir 
494cdf0e10cSrcweir void SdrRectObj::NbcMove(const Size& rSiz)
495cdf0e10cSrcweir {
496cdf0e10cSrcweir 	SdrTextObj::NbcMove(rSiz);
497cdf0e10cSrcweir 	SetXPolyDirty();
498cdf0e10cSrcweir }
499cdf0e10cSrcweir 
500cdf0e10cSrcweir void SdrRectObj::NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact)
501cdf0e10cSrcweir {
502cdf0e10cSrcweir 	SdrTextObj::NbcResize(rRef,xFact,yFact);
503cdf0e10cSrcweir 	SetXPolyDirty();
504cdf0e10cSrcweir }
505cdf0e10cSrcweir 
506cdf0e10cSrcweir void SdrRectObj::NbcRotate(const Point& rRef, long nWink, double sn, double cs)
507cdf0e10cSrcweir {
508cdf0e10cSrcweir 	SdrTextObj::NbcRotate(rRef,nWink,sn,cs);
509cdf0e10cSrcweir 	SetXPolyDirty();
510cdf0e10cSrcweir }
511cdf0e10cSrcweir 
512cdf0e10cSrcweir void SdrRectObj::NbcShear(const Point& rRef, long nWink, double tn, FASTBOOL bVShear)
513cdf0e10cSrcweir {
514cdf0e10cSrcweir 	SdrTextObj::NbcShear(rRef,nWink,tn,bVShear);
515cdf0e10cSrcweir 	SetXPolyDirty();
516cdf0e10cSrcweir }
517cdf0e10cSrcweir 
518cdf0e10cSrcweir void SdrRectObj::NbcMirror(const Point& rRef1, const Point& rRef2)
519cdf0e10cSrcweir {
520cdf0e10cSrcweir 	SdrTextObj::NbcMirror(rRef1,rRef2);
521cdf0e10cSrcweir 	SetXPolyDirty();
522cdf0e10cSrcweir }
523cdf0e10cSrcweir 
524cdf0e10cSrcweir FASTBOOL SdrRectObj::DoMacro(const SdrObjMacroHitRec& rRec)
525cdf0e10cSrcweir {
526cdf0e10cSrcweir 	return SdrTextObj::DoMacro(rRec);
527cdf0e10cSrcweir }
528cdf0e10cSrcweir 
529cdf0e10cSrcweir XubString SdrRectObj::GetMacroPopupComment(const SdrObjMacroHitRec& rRec) const
530cdf0e10cSrcweir {
531cdf0e10cSrcweir 	return SdrTextObj::GetMacroPopupComment(rRec);
532cdf0e10cSrcweir }
533cdf0e10cSrcweir 
534cdf0e10cSrcweir SdrGluePoint SdrRectObj::GetVertexGluePoint(sal_uInt16 nPosNum) const
535cdf0e10cSrcweir {
536cdf0e10cSrcweir 	sal_Int32 nWdt = ImpGetLineWdt(); // #i25616# ((XLineWidthItem&)(GetObjectItem(XATTR_LINEWIDTH))).GetValue();
537cdf0e10cSrcweir 
538cdf0e10cSrcweir 	// #i25616#
539cdf0e10cSrcweir 	if(!LineIsOutsideGeometry())
540cdf0e10cSrcweir 	{
541cdf0e10cSrcweir 		nWdt++;
542cdf0e10cSrcweir 		nWdt /= 2;
543cdf0e10cSrcweir 	}
544cdf0e10cSrcweir 
545cdf0e10cSrcweir 	Point aPt;
546cdf0e10cSrcweir 	switch (nPosNum) {
547cdf0e10cSrcweir 		case 0: aPt=aRect.TopCenter();    aPt.Y()-=nWdt; break;
548cdf0e10cSrcweir 		case 1: aPt=aRect.RightCenter();  aPt.X()+=nWdt; break;
549cdf0e10cSrcweir 		case 2: aPt=aRect.BottomCenter(); aPt.Y()+=nWdt; break;
550cdf0e10cSrcweir 		case 3: aPt=aRect.LeftCenter();   aPt.X()-=nWdt; break;
551cdf0e10cSrcweir 	}
552cdf0e10cSrcweir 	if (aGeo.nShearWink!=0) ShearPoint(aPt,aRect.TopLeft(),aGeo.nTan);
553cdf0e10cSrcweir 	if (aGeo.nDrehWink!=0) RotatePoint(aPt,aRect.TopLeft(),aGeo.nSin,aGeo.nCos);
554cdf0e10cSrcweir 	aPt-=GetSnapRect().Center();
555cdf0e10cSrcweir 	SdrGluePoint aGP(aPt);
556cdf0e10cSrcweir 	aGP.SetPercent(sal_False);
557cdf0e10cSrcweir 	return aGP;
558cdf0e10cSrcweir }
559cdf0e10cSrcweir 
560cdf0e10cSrcweir SdrGluePoint SdrRectObj::GetCornerGluePoint(sal_uInt16 nPosNum) const
561cdf0e10cSrcweir {
562cdf0e10cSrcweir 	sal_Int32 nWdt = ImpGetLineWdt(); // #i25616# ((XLineWidthItem&)(GetObjectItem(XATTR_LINEWIDTH))).GetValue();
563cdf0e10cSrcweir 
564cdf0e10cSrcweir 	// #i25616#
565cdf0e10cSrcweir 	if(!LineIsOutsideGeometry())
566cdf0e10cSrcweir 	{
567cdf0e10cSrcweir 		nWdt++;
568cdf0e10cSrcweir 		nWdt /= 2;
569cdf0e10cSrcweir 	}
570cdf0e10cSrcweir 
571cdf0e10cSrcweir 	Point aPt;
572cdf0e10cSrcweir 	switch (nPosNum) {
573cdf0e10cSrcweir 		case 0: aPt=aRect.TopLeft();     aPt.X()-=nWdt; aPt.Y()-=nWdt; break;
574cdf0e10cSrcweir 		case 1: aPt=aRect.TopRight();    aPt.X()+=nWdt; aPt.Y()-=nWdt; break;
575cdf0e10cSrcweir 		case 2: aPt=aRect.BottomRight(); aPt.X()+=nWdt; aPt.Y()+=nWdt; break;
576cdf0e10cSrcweir 		case 3: aPt=aRect.BottomLeft();  aPt.X()-=nWdt; aPt.Y()+=nWdt; break;
577cdf0e10cSrcweir 	}
578cdf0e10cSrcweir 	if (aGeo.nShearWink!=0) ShearPoint(aPt,aRect.TopLeft(),aGeo.nTan);
579cdf0e10cSrcweir 	if (aGeo.nDrehWink!=0) RotatePoint(aPt,aRect.TopLeft(),aGeo.nSin,aGeo.nCos);
580cdf0e10cSrcweir 	aPt-=GetSnapRect().Center();
581cdf0e10cSrcweir 	SdrGluePoint aGP(aPt);
582cdf0e10cSrcweir 	aGP.SetPercent(sal_False);
583cdf0e10cSrcweir 	return aGP;
584cdf0e10cSrcweir }
585cdf0e10cSrcweir 
586*a5258243SPedro Giffuni SdrObject* SdrRectObj::DoConvertToPolyObj(sal_Bool bBezier, bool bAddText) const
587cdf0e10cSrcweir {
588cdf0e10cSrcweir 	XPolygon aXP(ImpCalcXPoly(aRect,GetEckenradius()));
589cdf0e10cSrcweir 	{ // #40608# Nur Uebergangsweise bis zum neuen TakeContour()
590cdf0e10cSrcweir 		aXP.Remove(0,1);
591cdf0e10cSrcweir 		aXP[aXP.GetPointCount()-1]=aXP[0];
592cdf0e10cSrcweir 	}
593cdf0e10cSrcweir 
594cdf0e10cSrcweir 	basegfx::B2DPolyPolygon aPolyPolygon(aXP.getB2DPolygon());
595cdf0e10cSrcweir     aPolyPolygon.removeDoublePoints();
596cdf0e10cSrcweir 	SdrObject* pRet = 0L;
597cdf0e10cSrcweir 
598cdf0e10cSrcweir 	if(!IsTextFrame() || HasFill() || HasLine())
599cdf0e10cSrcweir 	{
600cdf0e10cSrcweir 		pRet = ImpConvertMakeObj(aPolyPolygon, sal_True, bBezier);
601cdf0e10cSrcweir 	}
602cdf0e10cSrcweir 
603*a5258243SPedro Giffuni     if(bAddText)
604*a5258243SPedro Giffuni     {
605cdf0e10cSrcweir     	pRet = ImpConvertAddText(pRet, bBezier);
606*a5258243SPedro Giffuni     }
607cdf0e10cSrcweir 
608cdf0e10cSrcweir 	return pRet;
609cdf0e10cSrcweir }
610cdf0e10cSrcweir 
611cdf0e10cSrcweir void SdrRectObj::Notify(SfxBroadcaster& rBC, const SfxHint& rHint)
612cdf0e10cSrcweir {
613cdf0e10cSrcweir 	SdrTextObj::Notify(rBC,rHint);
614cdf0e10cSrcweir 	SetXPolyDirty(); // wg. Eckenradius
615cdf0e10cSrcweir }
616cdf0e10cSrcweir 
617cdf0e10cSrcweir void SdrRectObj::RestGeoData(const SdrObjGeoData& rGeo)
618cdf0e10cSrcweir {
619cdf0e10cSrcweir 	SdrTextObj::RestGeoData(rGeo);
620cdf0e10cSrcweir 	SetXPolyDirty();
621cdf0e10cSrcweir }
622cdf0e10cSrcweir 
623cdf0e10cSrcweir // eof
624