xref: /aoo4110/main/svx/source/svdraw/svdomeas.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 
27*b1cdbd2cSJim Jagielski #include <svx/svdomeas.hxx>
28*b1cdbd2cSJim Jagielski #include <math.h>
29*b1cdbd2cSJim Jagielski #include "svx/svditext.hxx" //
30*b1cdbd2cSJim Jagielski #include <svx/xpoly.hxx>
31*b1cdbd2cSJim Jagielski #include <svx/svdtrans.hxx>
32*b1cdbd2cSJim Jagielski #include <svx/svdhdl.hxx>
33*b1cdbd2cSJim Jagielski #include <svx/svdoutl.hxx>
34*b1cdbd2cSJim Jagielski #include <svx/svddrag.hxx>
35*b1cdbd2cSJim Jagielski #include <svx/svdpool.hxx>
36*b1cdbd2cSJim Jagielski #include <svx/svdattrx.hxx>
37*b1cdbd2cSJim Jagielski #include <svx/svdmodel.hxx>
38*b1cdbd2cSJim Jagielski #include <svx/svdview.hxx>
39*b1cdbd2cSJim Jagielski #include "svx/svdglob.hxx"   // StringCache
40*b1cdbd2cSJim Jagielski #include "svx/svdstr.hrc"    // Objektname
41*b1cdbd2cSJim Jagielski #include <svl/style.hxx>
42*b1cdbd2cSJim Jagielski #include <svl/smplhint.hxx>
43*b1cdbd2cSJim Jagielski #include <editeng/eeitem.hxx>
44*b1cdbd2cSJim Jagielski #include <svx/xlnstit.hxx>
45*b1cdbd2cSJim Jagielski #include <svx/xlnstwit.hxx>
46*b1cdbd2cSJim Jagielski #include <svx/xlnedit.hxx>
47*b1cdbd2cSJim Jagielski #include <svx/xlnwtit.hxx>
48*b1cdbd2cSJim Jagielski #include <svx/xlnedwit.hxx>
49*b1cdbd2cSJim Jagielski #include <svx/xlnstcit.hxx>
50*b1cdbd2cSJim Jagielski #include <svx/xlnedcit.hxx>
51*b1cdbd2cSJim Jagielski #include <editeng/outlobj.hxx>
52*b1cdbd2cSJim Jagielski #include <editeng/outliner.hxx>
53*b1cdbd2cSJim Jagielski #include <editeng/editobj.hxx>
54*b1cdbd2cSJim Jagielski #include <editeng/measfld.hxx>
55*b1cdbd2cSJim Jagielski #include <editeng/flditem.hxx>
56*b1cdbd2cSJim Jagielski #include <svx/svdogrp.hxx>
57*b1cdbd2cSJim Jagielski #include <svx/svdopath.hxx>
58*b1cdbd2cSJim Jagielski #include <svx/svdpage.hxx>
59*b1cdbd2cSJim Jagielski #include <unotools/syslocale.hxx>
60*b1cdbd2cSJim Jagielski #include "svdoimp.hxx"
61*b1cdbd2cSJim Jagielski #include <svx/sdr/properties/measureproperties.hxx>
62*b1cdbd2cSJim Jagielski #include <svx/sdr/contact/viewcontactofsdrmeasureobj.hxx>
63*b1cdbd2cSJim Jagielski #include <basegfx/point/b2dpoint.hxx>
64*b1cdbd2cSJim Jagielski #include <basegfx/polygon/b2dpolygon.hxx>
65*b1cdbd2cSJim Jagielski #include <basegfx/polygon/b2dpolypolygon.hxx>
66*b1cdbd2cSJim Jagielski #include <basegfx/matrix/b2dhommatrix.hxx>
67*b1cdbd2cSJim Jagielski #include <basegfx/matrix/b2dhommatrixtools.hxx>
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////
70*b1cdbd2cSJim Jagielski 
SdrMeasureObjGeoData()71*b1cdbd2cSJim Jagielski SdrMeasureObjGeoData::SdrMeasureObjGeoData() {}
~SdrMeasureObjGeoData()72*b1cdbd2cSJim Jagielski SdrMeasureObjGeoData::~SdrMeasureObjGeoData() {}
73*b1cdbd2cSJim Jagielski 
TakeRepresentation(XubString & rStr,SdrMeasureFieldKind eMeasureFieldKind) const74*b1cdbd2cSJim Jagielski void SdrMeasureObj::TakeRepresentation( XubString& rStr, SdrMeasureFieldKind eMeasureFieldKind ) const
75*b1cdbd2cSJim Jagielski {
76*b1cdbd2cSJim Jagielski 	rStr.Erase();
77*b1cdbd2cSJim Jagielski 	Fraction aMeasureScale(1, 1);
78*b1cdbd2cSJim Jagielski 	sal_Bool bTextRota90(sal_False);
79*b1cdbd2cSJim Jagielski 	sal_Bool bShowUnit(sal_False);
80*b1cdbd2cSJim Jagielski 	FieldUnit eMeasureUnit(FUNIT_NONE);
81*b1cdbd2cSJim Jagielski 	FieldUnit eModUIUnit(FUNIT_NONE);
82*b1cdbd2cSJim Jagielski 
83*b1cdbd2cSJim Jagielski 	const SfxItemSet& rSet = GetMergedItemSet();
84*b1cdbd2cSJim Jagielski 	bTextRota90 = ((SdrMeasureTextRota90Item&)rSet.Get(SDRATTR_MEASURETEXTROTA90)).GetValue();
85*b1cdbd2cSJim Jagielski 	eMeasureUnit = ((SdrMeasureUnitItem&)rSet.Get(SDRATTR_MEASUREUNIT)).GetValue();
86*b1cdbd2cSJim Jagielski 	aMeasureScale = ((SdrMeasureScaleItem&)rSet.Get(SDRATTR_MEASURESCALE)).GetValue();
87*b1cdbd2cSJim Jagielski 	bShowUnit = ((SdrMeasureShowUnitItem&)rSet.Get(SDRATTR_MEASURESHOWUNIT)).GetValue();
88*b1cdbd2cSJim Jagielski 	sal_Int16 nNumDigits = ((SdrMeasureDecimalPlacesItem&)rSet.Get(SDRATTR_MEASUREDECIMALPLACES)).GetValue();
89*b1cdbd2cSJim Jagielski 
90*b1cdbd2cSJim Jagielski 	//SdrModel* pModel = rObj.pModel;
91*b1cdbd2cSJim Jagielski 
92*b1cdbd2cSJim Jagielski 	switch(eMeasureFieldKind)
93*b1cdbd2cSJim Jagielski 	{
94*b1cdbd2cSJim Jagielski 		case SDRMEASUREFIELD_VALUE:
95*b1cdbd2cSJim Jagielski 		{
96*b1cdbd2cSJim Jagielski 			if(pModel)
97*b1cdbd2cSJim Jagielski 			{
98*b1cdbd2cSJim Jagielski 				eModUIUnit = pModel->GetUIUnit();
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski 				if(eMeasureUnit == FUNIT_NONE)
101*b1cdbd2cSJim Jagielski 					eMeasureUnit = eModUIUnit;
102*b1cdbd2cSJim Jagielski 
103*b1cdbd2cSJim Jagielski 				sal_Int32 nLen(GetLen(aPt2 - aPt1));
104*b1cdbd2cSJim Jagielski 				Fraction aFact(1,1);
105*b1cdbd2cSJim Jagielski 
106*b1cdbd2cSJim Jagielski 				if(eMeasureUnit != eModUIUnit)
107*b1cdbd2cSJim Jagielski 				{
108*b1cdbd2cSJim Jagielski 					// Zur Umrechnung der Einheiten
109*b1cdbd2cSJim Jagielski 					aFact *= GetMapFactor(eModUIUnit, eMeasureUnit).X();
110*b1cdbd2cSJim Jagielski 				}
111*b1cdbd2cSJim Jagielski 
112*b1cdbd2cSJim Jagielski 				if(aMeasureScale.GetNumerator() != aMeasureScale.GetDenominator())
113*b1cdbd2cSJim Jagielski 				{
114*b1cdbd2cSJim Jagielski 					aFact *= aMeasureScale;
115*b1cdbd2cSJim Jagielski 				}
116*b1cdbd2cSJim Jagielski 
117*b1cdbd2cSJim Jagielski 				if(aFact.GetNumerator() != aFact.GetDenominator())
118*b1cdbd2cSJim Jagielski 				{
119*b1cdbd2cSJim Jagielski 					// Scaling ueber BigInt, um Ueberlaeufe zu vermeiden
120*b1cdbd2cSJim Jagielski 					nLen = BigMulDiv(nLen, aFact.GetNumerator(), aFact.GetDenominator());
121*b1cdbd2cSJim Jagielski 				}
122*b1cdbd2cSJim Jagielski 
123*b1cdbd2cSJim Jagielski 				pModel->TakeMetricStr(nLen, rStr, sal_True, nNumDigits);
124*b1cdbd2cSJim Jagielski 
125*b1cdbd2cSJim Jagielski 				if(!aFact.IsValid())
126*b1cdbd2cSJim Jagielski 				{
127*b1cdbd2cSJim Jagielski 					rStr = String();
128*b1cdbd2cSJim Jagielski 					rStr += sal_Unicode('?');
129*b1cdbd2cSJim Jagielski 				}
130*b1cdbd2cSJim Jagielski 
131*b1cdbd2cSJim Jagielski                 sal_Unicode cDec(SvtSysLocale().GetLocaleData().getNumDecimalSep().GetChar(0));
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski 				if(rStr.Search(cDec) != STRING_NOTFOUND)
134*b1cdbd2cSJim Jagielski 				{
135*b1cdbd2cSJim Jagielski 					xub_StrLen nLen2(rStr.Len() - 1);
136*b1cdbd2cSJim Jagielski 
137*b1cdbd2cSJim Jagielski 					while(rStr.GetChar(nLen2) == sal_Unicode('0'))
138*b1cdbd2cSJim Jagielski 					{
139*b1cdbd2cSJim Jagielski 						rStr.Erase(nLen2);
140*b1cdbd2cSJim Jagielski 						nLen2--;
141*b1cdbd2cSJim Jagielski 					}
142*b1cdbd2cSJim Jagielski 
143*b1cdbd2cSJim Jagielski 					if(rStr.GetChar(nLen2) == cDec)
144*b1cdbd2cSJim Jagielski 					{
145*b1cdbd2cSJim Jagielski 						rStr.Erase(nLen2);
146*b1cdbd2cSJim Jagielski 						nLen2--;
147*b1cdbd2cSJim Jagielski 					}
148*b1cdbd2cSJim Jagielski 
149*b1cdbd2cSJim Jagielski 					if(!rStr.Len())
150*b1cdbd2cSJim Jagielski 						rStr += sal_Unicode('0');
151*b1cdbd2cSJim Jagielski 				}
152*b1cdbd2cSJim Jagielski 			}
153*b1cdbd2cSJim Jagielski 			else
154*b1cdbd2cSJim Jagielski 			{
155*b1cdbd2cSJim Jagielski 				// falls kein Model da ... (z.B. Preview im Dialog)
156*b1cdbd2cSJim Jagielski 				rStr = String();
157*b1cdbd2cSJim Jagielski 				rStr.AppendAscii("4711");
158*b1cdbd2cSJim Jagielski 			}
159*b1cdbd2cSJim Jagielski 
160*b1cdbd2cSJim Jagielski 			break;
161*b1cdbd2cSJim Jagielski 		}
162*b1cdbd2cSJim Jagielski 		case SDRMEASUREFIELD_UNIT:
163*b1cdbd2cSJim Jagielski 		{
164*b1cdbd2cSJim Jagielski 			if(bShowUnit)
165*b1cdbd2cSJim Jagielski 			{
166*b1cdbd2cSJim Jagielski 				if(pModel)
167*b1cdbd2cSJim Jagielski 				{
168*b1cdbd2cSJim Jagielski 					eModUIUnit = pModel->GetUIUnit();
169*b1cdbd2cSJim Jagielski 
170*b1cdbd2cSJim Jagielski 					if(eMeasureUnit == FUNIT_NONE)
171*b1cdbd2cSJim Jagielski 						eMeasureUnit = eModUIUnit;
172*b1cdbd2cSJim Jagielski 
173*b1cdbd2cSJim Jagielski 					if(bShowUnit)
174*b1cdbd2cSJim Jagielski 						pModel->TakeUnitStr(eMeasureUnit, rStr);
175*b1cdbd2cSJim Jagielski 				}
176*b1cdbd2cSJim Jagielski 			}
177*b1cdbd2cSJim Jagielski 
178*b1cdbd2cSJim Jagielski 			break;
179*b1cdbd2cSJim Jagielski 		}
180*b1cdbd2cSJim Jagielski 		case SDRMEASUREFIELD_ROTA90BLANCS:
181*b1cdbd2cSJim Jagielski 		{
182*b1cdbd2cSJim Jagielski 			if(bTextRota90)
183*b1cdbd2cSJim Jagielski 			{
184*b1cdbd2cSJim Jagielski 				rStr = String();
185*b1cdbd2cSJim Jagielski 				rStr += sal_Unicode(' ');
186*b1cdbd2cSJim Jagielski 			}
187*b1cdbd2cSJim Jagielski 
188*b1cdbd2cSJim Jagielski 			break;
189*b1cdbd2cSJim Jagielski 		}
190*b1cdbd2cSJim Jagielski 	}
191*b1cdbd2cSJim Jagielski }
192*b1cdbd2cSJim Jagielski 
193*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
194*b1cdbd2cSJim Jagielski // BaseProperties section
195*b1cdbd2cSJim Jagielski 
CreateObjectSpecificProperties()196*b1cdbd2cSJim Jagielski sdr::properties::BaseProperties* SdrMeasureObj::CreateObjectSpecificProperties()
197*b1cdbd2cSJim Jagielski {
198*b1cdbd2cSJim Jagielski 	return new sdr::properties::MeasureProperties(*this);
199*b1cdbd2cSJim Jagielski }
200*b1cdbd2cSJim Jagielski 
201*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
202*b1cdbd2cSJim Jagielski // DrawContact section
203*b1cdbd2cSJim Jagielski 
CreateObjectSpecificViewContact()204*b1cdbd2cSJim Jagielski sdr::contact::ViewContact* SdrMeasureObj::CreateObjectSpecificViewContact()
205*b1cdbd2cSJim Jagielski {
206*b1cdbd2cSJim Jagielski 	return new sdr::contact::ViewContactOfSdrMeasureObj(*this);
207*b1cdbd2cSJim Jagielski }
208*b1cdbd2cSJim Jagielski 
209*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
210*b1cdbd2cSJim Jagielski 
211*b1cdbd2cSJim Jagielski TYPEINIT1(SdrMeasureObj,SdrTextObj);
212*b1cdbd2cSJim Jagielski 
SdrMeasureObj()213*b1cdbd2cSJim Jagielski SdrMeasureObj::SdrMeasureObj():
214*b1cdbd2cSJim Jagielski 	bTextDirty(sal_False)
215*b1cdbd2cSJim Jagielski {
216*b1cdbd2cSJim Jagielski 	// #i25616#
217*b1cdbd2cSJim Jagielski 	mbSupportTextIndentingOnLineWidthChange = sal_False;
218*b1cdbd2cSJim Jagielski }
219*b1cdbd2cSJim Jagielski 
SdrMeasureObj(const Point & rPt1,const Point & rPt2)220*b1cdbd2cSJim Jagielski SdrMeasureObj::SdrMeasureObj(const Point& rPt1, const Point& rPt2):
221*b1cdbd2cSJim Jagielski 	aPt1(rPt1),
222*b1cdbd2cSJim Jagielski 	aPt2(rPt2),
223*b1cdbd2cSJim Jagielski 	bTextDirty(sal_False)
224*b1cdbd2cSJim Jagielski {
225*b1cdbd2cSJim Jagielski 	// #i25616#
226*b1cdbd2cSJim Jagielski 	mbSupportTextIndentingOnLineWidthChange = sal_False;
227*b1cdbd2cSJim Jagielski }
228*b1cdbd2cSJim Jagielski 
~SdrMeasureObj()229*b1cdbd2cSJim Jagielski SdrMeasureObj::~SdrMeasureObj()
230*b1cdbd2cSJim Jagielski {
231*b1cdbd2cSJim Jagielski }
232*b1cdbd2cSJim Jagielski 
TakeObjInfo(SdrObjTransformInfoRec & rInfo) const233*b1cdbd2cSJim Jagielski void SdrMeasureObj::TakeObjInfo(SdrObjTransformInfoRec& rInfo) const
234*b1cdbd2cSJim Jagielski {
235*b1cdbd2cSJim Jagielski 	rInfo.bSelectAllowed    =sal_True;
236*b1cdbd2cSJim Jagielski 	rInfo.bMoveAllowed      =sal_True;
237*b1cdbd2cSJim Jagielski 	rInfo.bResizeFreeAllowed=sal_True;
238*b1cdbd2cSJim Jagielski 	rInfo.bResizePropAllowed=sal_True;
239*b1cdbd2cSJim Jagielski 	rInfo.bRotateFreeAllowed=sal_True;
240*b1cdbd2cSJim Jagielski 	rInfo.bRotate90Allowed  =sal_True;
241*b1cdbd2cSJim Jagielski 	rInfo.bMirrorFreeAllowed=sal_True;
242*b1cdbd2cSJim Jagielski 	rInfo.bMirror45Allowed  =sal_True;
243*b1cdbd2cSJim Jagielski 	rInfo.bMirror90Allowed  =sal_True;
244*b1cdbd2cSJim Jagielski 	rInfo.bTransparenceAllowed = sal_False;
245*b1cdbd2cSJim Jagielski 	rInfo.bGradientAllowed = sal_False;
246*b1cdbd2cSJim Jagielski 	rInfo.bShearAllowed     =sal_True;
247*b1cdbd2cSJim Jagielski 	rInfo.bEdgeRadiusAllowed=sal_False;
248*b1cdbd2cSJim Jagielski 	rInfo.bNoOrthoDesired   =sal_True;
249*b1cdbd2cSJim Jagielski 	rInfo.bNoContortion     =sal_False;
250*b1cdbd2cSJim Jagielski 	rInfo.bCanConvToPath    =sal_False;
251*b1cdbd2cSJim Jagielski 	rInfo.bCanConvToPoly    =sal_True;
252*b1cdbd2cSJim Jagielski 	rInfo.bCanConvToPathLineToArea=sal_False;
253*b1cdbd2cSJim Jagielski 	rInfo.bCanConvToPolyLineToArea=sal_False;
254*b1cdbd2cSJim Jagielski 	rInfo.bCanConvToContour = (rInfo.bCanConvToPoly || LineGeometryUsageIsNecessary());
255*b1cdbd2cSJim Jagielski }
256*b1cdbd2cSJim Jagielski 
GetObjIdentifier() const257*b1cdbd2cSJim Jagielski sal_uInt16 SdrMeasureObj::GetObjIdentifier() const
258*b1cdbd2cSJim Jagielski {
259*b1cdbd2cSJim Jagielski 	return (sal_uInt16)OBJ_MEASURE;
260*b1cdbd2cSJim Jagielski }
261*b1cdbd2cSJim Jagielski 
262*b1cdbd2cSJim Jagielski struct ImpMeasureRec : public SdrDragStatUserData
263*b1cdbd2cSJim Jagielski {
264*b1cdbd2cSJim Jagielski 	Point						aPt1;
265*b1cdbd2cSJim Jagielski 	Point						aPt2;
266*b1cdbd2cSJim Jagielski 	SdrMeasureKind				eKind;
267*b1cdbd2cSJim Jagielski 	SdrMeasureTextHPos			eWantTextHPos;
268*b1cdbd2cSJim Jagielski 	SdrMeasureTextVPos			eWantTextVPos;
269*b1cdbd2cSJim Jagielski 	long						nLineDist;
270*b1cdbd2cSJim Jagielski 	long						nHelplineOverhang;
271*b1cdbd2cSJim Jagielski 	long						nHelplineDist;
272*b1cdbd2cSJim Jagielski 	long						nHelpline1Len;
273*b1cdbd2cSJim Jagielski 	long						nHelpline2Len;
274*b1cdbd2cSJim Jagielski 	FASTBOOL					bBelowRefEdge;
275*b1cdbd2cSJim Jagielski 	FASTBOOL					bTextRota90;
276*b1cdbd2cSJim Jagielski 	FASTBOOL					bTextUpsideDown;
277*b1cdbd2cSJim Jagielski 	long						nMeasureOverhang;
278*b1cdbd2cSJim Jagielski 	FieldUnit					eMeasureUnit;
279*b1cdbd2cSJim Jagielski 	Fraction					aMeasureScale;
280*b1cdbd2cSJim Jagielski 	FASTBOOL					bShowUnit;
281*b1cdbd2cSJim Jagielski 	String						aFormatString;
282*b1cdbd2cSJim Jagielski 	FASTBOOL					bTextAutoAngle;
283*b1cdbd2cSJim Jagielski 	long						nTextAutoAngleView;
284*b1cdbd2cSJim Jagielski 	FASTBOOL					bTextIsFixedAngle;
285*b1cdbd2cSJim Jagielski 	long						nTextFixedAngle;
286*b1cdbd2cSJim Jagielski };
287*b1cdbd2cSJim Jagielski 
288*b1cdbd2cSJim Jagielski struct ImpLineRec
289*b1cdbd2cSJim Jagielski {
290*b1cdbd2cSJim Jagielski 	Point						aP1;
291*b1cdbd2cSJim Jagielski 	Point						aP2;
292*b1cdbd2cSJim Jagielski };
293*b1cdbd2cSJim Jagielski 
294*b1cdbd2cSJim Jagielski struct ImpMeasurePoly
295*b1cdbd2cSJim Jagielski {
296*b1cdbd2cSJim Jagielski 	ImpLineRec					aMainline1; // die mit dem 1. Pfeil
297*b1cdbd2cSJim Jagielski 	ImpLineRec					aMainline2; // die mit dem 2. Pfeil
298*b1cdbd2cSJim Jagielski 	ImpLineRec					aMainline3; // die dazwischen
299*b1cdbd2cSJim Jagielski 	ImpLineRec					aHelpline1;
300*b1cdbd2cSJim Jagielski 	ImpLineRec					aHelpline2;
301*b1cdbd2cSJim Jagielski 	Rectangle					aTextRect;
302*b1cdbd2cSJim Jagielski 	Size						aTextSize;
303*b1cdbd2cSJim Jagielski 	long						nLineLen;
304*b1cdbd2cSJim Jagielski 	long						nLineWink;
305*b1cdbd2cSJim Jagielski 	long						nTextWink;
306*b1cdbd2cSJim Jagielski 	long						nHlpWink;
307*b1cdbd2cSJim Jagielski 	double						nLineSin;
308*b1cdbd2cSJim Jagielski 	double						nLineCos;
309*b1cdbd2cSJim Jagielski 	double						nHlpSin;
310*b1cdbd2cSJim Jagielski 	double						nHlpCos;
311*b1cdbd2cSJim Jagielski 	sal_uInt16						nMainlineAnz;
312*b1cdbd2cSJim Jagielski 	SdrMeasureTextHPos			eUsedTextHPos;
313*b1cdbd2cSJim Jagielski 	SdrMeasureTextVPos			eUsedTextVPos;
314*b1cdbd2cSJim Jagielski 	long						nLineWdt2;  // Halbe Strichstaerke
315*b1cdbd2cSJim Jagielski 	long						nArrow1Len; // Laenge des 1. Pfeils. Bei Center nur die Haelfte
316*b1cdbd2cSJim Jagielski 	long						nArrow2Len; // Laenge des 2. Pfeils. Bei Center nur die Haelfte
317*b1cdbd2cSJim Jagielski 	long						nArrow1Wdt; // Breite des 1. Pfeils
318*b1cdbd2cSJim Jagielski 	long						nArrow2Wdt; // Breite des 2. Pfeils
319*b1cdbd2cSJim Jagielski 	long						nShortLineLen; // Linienlaenge, wenn PfeileAussen
320*b1cdbd2cSJim Jagielski 	FASTBOOL					bArrow1Center; // Pfeil 1 zentriert?
321*b1cdbd2cSJim Jagielski 	FASTBOOL					bArrow2Center; // Pfeil 2 zentriert?
322*b1cdbd2cSJim Jagielski 	FASTBOOL					bAutoUpsideDown; // UpsideDown durch Automatik
323*b1cdbd2cSJim Jagielski 	FASTBOOL					bPfeileAussen;
324*b1cdbd2cSJim Jagielski 	FASTBOOL					bBreakedLine;
325*b1cdbd2cSJim Jagielski };
326*b1cdbd2cSJim Jagielski 
ImpTakeAttr(ImpMeasureRec & rRec) const327*b1cdbd2cSJim Jagielski void SdrMeasureObj::ImpTakeAttr(ImpMeasureRec& rRec) const
328*b1cdbd2cSJim Jagielski {
329*b1cdbd2cSJim Jagielski 	rRec.aPt1 = aPt1;
330*b1cdbd2cSJim Jagielski 	rRec.aPt2 = aPt2;
331*b1cdbd2cSJim Jagielski 
332*b1cdbd2cSJim Jagielski 	const SfxItemSet& rSet = GetObjectItemSet();
333*b1cdbd2cSJim Jagielski 	rRec.eKind            =((SdrMeasureKindItem&            )rSet.Get(SDRATTR_MEASUREKIND            )).GetValue();
334*b1cdbd2cSJim Jagielski 	rRec.eWantTextHPos    =((SdrMeasureTextHPosItem&        )rSet.Get(SDRATTR_MEASURETEXTHPOS        )).GetValue();
335*b1cdbd2cSJim Jagielski 	rRec.eWantTextVPos    =((SdrMeasureTextVPosItem&        )rSet.Get(SDRATTR_MEASURETEXTVPOS        )).GetValue();
336*b1cdbd2cSJim Jagielski 	rRec.nLineDist        =((SdrMeasureLineDistItem&        )rSet.Get(SDRATTR_MEASURELINEDIST        )).GetValue();
337*b1cdbd2cSJim Jagielski 	rRec.nHelplineOverhang=((SdrMeasureHelplineOverhangItem&)rSet.Get(SDRATTR_MEASUREHELPLINEOVERHANG)).GetValue();
338*b1cdbd2cSJim Jagielski 	rRec.nHelplineDist    =((SdrMeasureHelplineDistItem&    )rSet.Get(SDRATTR_MEASUREHELPLINEDIST    )).GetValue();
339*b1cdbd2cSJim Jagielski 	rRec.nHelpline1Len    =((SdrMeasureHelpline1LenItem&    )rSet.Get(SDRATTR_MEASUREHELPLINE1LEN    )).GetValue();
340*b1cdbd2cSJim Jagielski 	rRec.nHelpline2Len    =((SdrMeasureHelpline2LenItem&    )rSet.Get(SDRATTR_MEASUREHELPLINE2LEN    )).GetValue();
341*b1cdbd2cSJim Jagielski 	rRec.bBelowRefEdge    =((SdrMeasureBelowRefEdgeItem&    )rSet.Get(SDRATTR_MEASUREBELOWREFEDGE    )).GetValue();
342*b1cdbd2cSJim Jagielski 	rRec.bTextRota90      =((SdrMeasureTextRota90Item&      )rSet.Get(SDRATTR_MEASURETEXTROTA90      )).GetValue();
343*b1cdbd2cSJim Jagielski 	rRec.bTextUpsideDown  =((SdrMeasureTextUpsideDownItem&  )rSet.Get(SDRATTR_MEASURETEXTUPSIDEDOWN  )).GetValue();
344*b1cdbd2cSJim Jagielski 	rRec.nMeasureOverhang =((SdrMeasureOverhangItem&        )rSet.Get(SDRATTR_MEASUREOVERHANG        )).GetValue();
345*b1cdbd2cSJim Jagielski 	rRec.eMeasureUnit     =((SdrMeasureUnitItem&            )rSet.Get(SDRATTR_MEASUREUNIT            )).GetValue();
346*b1cdbd2cSJim Jagielski 	rRec.aMeasureScale    =((SdrMeasureScaleItem&           )rSet.Get(SDRATTR_MEASURESCALE           )).GetValue();
347*b1cdbd2cSJim Jagielski 	rRec.bShowUnit        =((SdrMeasureShowUnitItem&        )rSet.Get(SDRATTR_MEASURESHOWUNIT        )).GetValue();
348*b1cdbd2cSJim Jagielski 	rRec.aFormatString    =((SdrMeasureFormatStringItem&    )rSet.Get(SDRATTR_MEASUREFORMATSTRING    )).GetValue();
349*b1cdbd2cSJim Jagielski 	rRec.bTextAutoAngle    =((SdrMeasureTextAutoAngleItem&    )rSet.Get(SDRATTR_MEASURETEXTAUTOANGLE    )).GetValue();
350*b1cdbd2cSJim Jagielski 	rRec.nTextAutoAngleView=((SdrMeasureTextAutoAngleViewItem&)rSet.Get(SDRATTR_MEASURETEXTAUTOANGLEVIEW)).GetValue();
351*b1cdbd2cSJim Jagielski 	rRec.bTextIsFixedAngle =((SdrMeasureTextIsFixedAngleItem& )rSet.Get(SDRATTR_MEASURETEXTISFIXEDANGLE )).GetValue();
352*b1cdbd2cSJim Jagielski 	rRec.nTextFixedAngle   =((SdrMeasureTextFixedAngleItem&   )rSet.Get(SDRATTR_MEASURETEXTFIXEDANGLE   )).GetValue();
353*b1cdbd2cSJim Jagielski }
354*b1cdbd2cSJim Jagielski 
impGetLineStartEndDistance(const basegfx::B2DPolyPolygon & rPolyPolygon,long nNewWidth,bool bCenter)355*b1cdbd2cSJim Jagielski long impGetLineStartEndDistance(const basegfx::B2DPolyPolygon& rPolyPolygon, long nNewWidth, bool bCenter)
356*b1cdbd2cSJim Jagielski {
357*b1cdbd2cSJim Jagielski 	const basegfx::B2DRange aPolygonRange(rPolyPolygon.getB2DRange());
358*b1cdbd2cSJim Jagielski 	const double fOldWidth(aPolygonRange.getWidth() > 1.0 ? aPolygonRange.getWidth() : 1.0);
359*b1cdbd2cSJim Jagielski 	const double fScale((double)nNewWidth / fOldWidth);
360*b1cdbd2cSJim Jagielski 	long nHeight(basegfx::fround(aPolygonRange.getHeight() * fScale));
361*b1cdbd2cSJim Jagielski 
362*b1cdbd2cSJim Jagielski 	if(bCenter)
363*b1cdbd2cSJim Jagielski 	{
364*b1cdbd2cSJim Jagielski 		nHeight /= 2L;
365*b1cdbd2cSJim Jagielski 	}
366*b1cdbd2cSJim Jagielski 
367*b1cdbd2cSJim Jagielski 	return nHeight;
368*b1cdbd2cSJim Jagielski }
369*b1cdbd2cSJim Jagielski 
ImpCalcGeometrics(const ImpMeasureRec & rRec,ImpMeasurePoly & rPol) const370*b1cdbd2cSJim Jagielski void SdrMeasureObj::ImpCalcGeometrics(const ImpMeasureRec& rRec, ImpMeasurePoly& rPol) const
371*b1cdbd2cSJim Jagielski {
372*b1cdbd2cSJim Jagielski 	Point aP1(rRec.aPt1);
373*b1cdbd2cSJim Jagielski 	Point aP2(rRec.aPt2);
374*b1cdbd2cSJim Jagielski 	Point aDelt(aP2); aDelt-=aP1;
375*b1cdbd2cSJim Jagielski 
376*b1cdbd2cSJim Jagielski 	rPol.aTextSize=GetTextSize();
377*b1cdbd2cSJim Jagielski 	rPol.nLineLen=GetLen(aDelt);
378*b1cdbd2cSJim Jagielski 
379*b1cdbd2cSJim Jagielski 	rPol.nLineWdt2=0;
380*b1cdbd2cSJim Jagielski 	long nArrow1Len=0; bool bArrow1Center=false;
381*b1cdbd2cSJim Jagielski 	long nArrow2Len=0; bool bArrow2Center=false;
382*b1cdbd2cSJim Jagielski 	long nArrow1Wdt=0;
383*b1cdbd2cSJim Jagielski 	long nArrow2Wdt=0;
384*b1cdbd2cSJim Jagielski 	rPol.nArrow1Wdt=0;
385*b1cdbd2cSJim Jagielski 	rPol.nArrow2Wdt=0;
386*b1cdbd2cSJim Jagielski 	long nArrowNeed=0;
387*b1cdbd2cSJim Jagielski 	long nShortLen=0;
388*b1cdbd2cSJim Jagielski 	FASTBOOL bPfeileAussen=sal_False;
389*b1cdbd2cSJim Jagielski 
390*b1cdbd2cSJim Jagielski 	const SfxItemSet& rSet = GetObjectItemSet();
391*b1cdbd2cSJim Jagielski 	sal_Int32 nLineWdt = ((XLineWidthItem&)(rSet.Get(XATTR_LINEWIDTH))).GetValue(); // Strichstaerke
392*b1cdbd2cSJim Jagielski 	rPol.nLineWdt2 = (nLineWdt + 1) / 2;
393*b1cdbd2cSJim Jagielski 
394*b1cdbd2cSJim Jagielski 	nArrow1Wdt = ((const XLineStartWidthItem&)(rSet.Get(XATTR_LINESTARTWIDTH))).GetValue();
395*b1cdbd2cSJim Jagielski 	if(nArrow1Wdt < 0)
396*b1cdbd2cSJim Jagielski 		nArrow1Wdt = -nLineWdt * nArrow1Wdt / 100; // <0 = relativ
397*b1cdbd2cSJim Jagielski 
398*b1cdbd2cSJim Jagielski 	nArrow2Wdt = ((const XLineEndWidthItem&)(rSet.Get(XATTR_LINEENDWIDTH))).GetValue();
399*b1cdbd2cSJim Jagielski 	if(nArrow2Wdt < 0)
400*b1cdbd2cSJim Jagielski 		nArrow2Wdt = -nLineWdt * nArrow2Wdt / 100; // <0 = relativ
401*b1cdbd2cSJim Jagielski 
402*b1cdbd2cSJim Jagielski 	basegfx::B2DPolyPolygon aPol1(((const XLineStartItem&)(rSet.Get(XATTR_LINESTART))).GetLineStartValue());
403*b1cdbd2cSJim Jagielski 	basegfx::B2DPolyPolygon aPol2(((const XLineEndItem&)(rSet.Get(XATTR_LINEEND))).GetLineEndValue());
404*b1cdbd2cSJim Jagielski 	bArrow1Center = ((const XLineStartCenterItem&)(rSet.Get(XATTR_LINESTARTCENTER))).GetValue();
405*b1cdbd2cSJim Jagielski 	bArrow2Center = ((const XLineEndCenterItem&)(rSet.Get(XATTR_LINEENDCENTER))).GetValue();
406*b1cdbd2cSJim Jagielski 	nArrow1Len = impGetLineStartEndDistance(aPol1, nArrow1Wdt, bArrow1Center) - 1;
407*b1cdbd2cSJim Jagielski 	nArrow2Len = impGetLineStartEndDistance(aPol2, nArrow2Wdt, bArrow2Center) - 1;
408*b1cdbd2cSJim Jagielski 
409*b1cdbd2cSJim Jagielski 	// nArrowLen ist bei bCenter bereits halbiert
410*b1cdbd2cSJim Jagielski 	// Bei 2 Pfeilen a 4mm ist unter 10mm Schluss.
411*b1cdbd2cSJim Jagielski 	nArrowNeed=nArrow1Len+nArrow2Len+(nArrow1Wdt+nArrow2Wdt)/2;
412*b1cdbd2cSJim Jagielski 	if (rPol.nLineLen<nArrowNeed) bPfeileAussen=sal_True;
413*b1cdbd2cSJim Jagielski 	nShortLen=(nArrow1Len+nArrow1Wdt + nArrow2Len+nArrow2Wdt) /2;
414*b1cdbd2cSJim Jagielski 
415*b1cdbd2cSJim Jagielski 	rPol.eUsedTextHPos=rRec.eWantTextHPos;
416*b1cdbd2cSJim Jagielski 	rPol.eUsedTextVPos=rRec.eWantTextVPos;
417*b1cdbd2cSJim Jagielski 	if (rPol.eUsedTextVPos==SDRMEASURE_TEXTVAUTO) rPol.eUsedTextVPos=SDRMEASURE_ABOVE;
418*b1cdbd2cSJim Jagielski 	FASTBOOL bBrkLine=rPol.eUsedTextVPos==SDRMEASURETEXT_BREAKEDLINE;
419*b1cdbd2cSJim Jagielski 	if (rPol.eUsedTextVPos==SDRMEASURETEXT_VERTICALCENTERED)
420*b1cdbd2cSJim Jagielski 	{
421*b1cdbd2cSJim Jagielski 		OutlinerParaObject* pOutlinerParaObject = SdrTextObj::GetOutlinerParaObject();
422*b1cdbd2cSJim Jagielski 		if (pOutlinerParaObject!=NULL && pOutlinerParaObject->GetTextObject().GetParagraphCount()==1)
423*b1cdbd2cSJim Jagielski 		{
424*b1cdbd2cSJim Jagielski 			bBrkLine=sal_True; // Unterbrochene Linie, wenn nur 1 Absatz.
425*b1cdbd2cSJim Jagielski 		}
426*b1cdbd2cSJim Jagielski 	}
427*b1cdbd2cSJim Jagielski 	rPol.bBreakedLine=bBrkLine;
428*b1cdbd2cSJim Jagielski 	if (rPol.eUsedTextHPos==SDRMEASURE_TEXTHAUTO) { // bei zu breitem Text diesen eventuell nach aussen schieben
429*b1cdbd2cSJim Jagielski 		FASTBOOL bOutside=sal_False;
430*b1cdbd2cSJim Jagielski 		long nNeedSiz=!rRec.bTextRota90 ? rPol.aTextSize.Width() : rPol.aTextSize.Height();
431*b1cdbd2cSJim Jagielski 		if (nNeedSiz>rPol.nLineLen) bOutside=sal_True; // Text passt nicht in die Mitte
432*b1cdbd2cSJim Jagielski 		if (bBrkLine) {
433*b1cdbd2cSJim Jagielski 			if (nNeedSiz+nArrowNeed>rPol.nLineLen) bPfeileAussen=sal_True; // Text passt in die Mitte, wenn die Pfeile nach aussen kommen
434*b1cdbd2cSJim Jagielski 		} else {
435*b1cdbd2cSJim Jagielski 			long nSmallNeed=nArrow1Len+nArrow2Len+(nArrow1Wdt+nArrow2Wdt)/2/4;
436*b1cdbd2cSJim Jagielski 			if (nNeedSiz+nSmallNeed>rPol.nLineLen) bPfeileAussen=sal_True; // Text passt in die Mitte, wenn die Pfeile nach aussen kommen
437*b1cdbd2cSJim Jagielski 		}
438*b1cdbd2cSJim Jagielski 		rPol.eUsedTextHPos=bOutside ? SDRMEASURE_TEXTLEFTOUTSIDE : SDRMEASURE_TEXTINSIDE;
439*b1cdbd2cSJim Jagielski 	}
440*b1cdbd2cSJim Jagielski 	if (rPol.eUsedTextHPos!=SDRMEASURE_TEXTINSIDE) bPfeileAussen=sal_True;
441*b1cdbd2cSJim Jagielski 	rPol.nArrow1Wdt=nArrow1Wdt;
442*b1cdbd2cSJim Jagielski 	rPol.nArrow2Wdt=nArrow2Wdt;
443*b1cdbd2cSJim Jagielski 	rPol.nShortLineLen=nShortLen;
444*b1cdbd2cSJim Jagielski 	rPol.bPfeileAussen=bPfeileAussen;
445*b1cdbd2cSJim Jagielski 	rPol.nArrow1Len=nArrow1Len;
446*b1cdbd2cSJim Jagielski 	rPol.bArrow1Center=bArrow1Center;
447*b1cdbd2cSJim Jagielski 	rPol.nArrow2Len=nArrow2Len;
448*b1cdbd2cSJim Jagielski 	rPol.bArrow2Center=bArrow2Center;
449*b1cdbd2cSJim Jagielski 
450*b1cdbd2cSJim Jagielski 	rPol.nLineWink=GetAngle(aDelt);
451*b1cdbd2cSJim Jagielski 	double a=rPol.nLineWink*nPi180;
452*b1cdbd2cSJim Jagielski 	double nLineSin=sin(a);
453*b1cdbd2cSJim Jagielski 	double nLineCos=cos(a);
454*b1cdbd2cSJim Jagielski 	rPol.nLineSin=nLineSin;
455*b1cdbd2cSJim Jagielski 	rPol.nLineCos=nLineCos;
456*b1cdbd2cSJim Jagielski 
457*b1cdbd2cSJim Jagielski 	rPol.nTextWink=rPol.nLineWink;
458*b1cdbd2cSJim Jagielski 	if (rRec.bTextRota90) rPol.nTextWink+=9000;
459*b1cdbd2cSJim Jagielski 
460*b1cdbd2cSJim Jagielski 	rPol.bAutoUpsideDown=sal_False;
461*b1cdbd2cSJim Jagielski 	if (rRec.bTextAutoAngle) {
462*b1cdbd2cSJim Jagielski 		long nTmpWink=NormAngle360(rPol.nTextWink-rRec.nTextAutoAngleView);
463*b1cdbd2cSJim Jagielski 		if (nTmpWink>=18000) {
464*b1cdbd2cSJim Jagielski 			rPol.nTextWink+=18000;
465*b1cdbd2cSJim Jagielski 			rPol.bAutoUpsideDown=sal_True;
466*b1cdbd2cSJim Jagielski 		}
467*b1cdbd2cSJim Jagielski 	}
468*b1cdbd2cSJim Jagielski 
469*b1cdbd2cSJim Jagielski 	if (rRec.bTextUpsideDown) rPol.nTextWink+=18000;
470*b1cdbd2cSJim Jagielski 	rPol.nTextWink=NormAngle360(rPol.nTextWink);
471*b1cdbd2cSJim Jagielski 	rPol.nHlpWink=rPol.nLineWink+9000;
472*b1cdbd2cSJim Jagielski 	if (rRec.bBelowRefEdge) rPol.nHlpWink+=18000;
473*b1cdbd2cSJim Jagielski 	rPol.nHlpWink=NormAngle360(rPol.nHlpWink);
474*b1cdbd2cSJim Jagielski 	double nHlpSin=nLineCos;
475*b1cdbd2cSJim Jagielski 	double nHlpCos=-nLineSin;
476*b1cdbd2cSJim Jagielski 	if (rRec.bBelowRefEdge) {
477*b1cdbd2cSJim Jagielski 		nHlpSin=-nHlpSin;
478*b1cdbd2cSJim Jagielski 		nHlpCos=-nHlpCos;
479*b1cdbd2cSJim Jagielski 	}
480*b1cdbd2cSJim Jagielski 	rPol.nHlpSin=nHlpSin;
481*b1cdbd2cSJim Jagielski 	rPol.nHlpCos=nHlpCos;
482*b1cdbd2cSJim Jagielski 
483*b1cdbd2cSJim Jagielski 	long nLineDist=rRec.nLineDist;
484*b1cdbd2cSJim Jagielski 	long nOverhang=rRec.nHelplineOverhang;
485*b1cdbd2cSJim Jagielski 	long nHelplineDist=rRec.nHelplineDist;
486*b1cdbd2cSJim Jagielski 
487*b1cdbd2cSJim Jagielski 	long dx= Round(nLineDist*nHlpCos);
488*b1cdbd2cSJim Jagielski 	long dy=-Round(nLineDist*nHlpSin);
489*b1cdbd2cSJim Jagielski 	long dxh1a= Round((nHelplineDist-rRec.nHelpline1Len)*nHlpCos);
490*b1cdbd2cSJim Jagielski 	long dyh1a=-Round((nHelplineDist-rRec.nHelpline1Len)*nHlpSin);
491*b1cdbd2cSJim Jagielski 	long dxh1b= Round((nHelplineDist-rRec.nHelpline2Len)*nHlpCos);
492*b1cdbd2cSJim Jagielski 	long dyh1b=-Round((nHelplineDist-rRec.nHelpline2Len)*nHlpSin);
493*b1cdbd2cSJim Jagielski 	long dxh2= Round((nLineDist+nOverhang)*nHlpCos);
494*b1cdbd2cSJim Jagielski 	long dyh2=-Round((nLineDist+nOverhang)*nHlpSin);
495*b1cdbd2cSJim Jagielski 
496*b1cdbd2cSJim Jagielski 	// Masshilfslinie 1
497*b1cdbd2cSJim Jagielski 	rPol.aHelpline1.aP1=Point(aP1.X()+dxh1a,aP1.Y()+dyh1a);
498*b1cdbd2cSJim Jagielski 	rPol.aHelpline1.aP2=Point(aP1.X()+dxh2,aP1.Y()+dyh2);
499*b1cdbd2cSJim Jagielski 
500*b1cdbd2cSJim Jagielski 	// Masshilfslinie 2
501*b1cdbd2cSJim Jagielski 	rPol.aHelpline2.aP1=Point(aP2.X()+dxh1b,aP2.Y()+dyh1b);
502*b1cdbd2cSJim Jagielski 	rPol.aHelpline2.aP2=Point(aP2.X()+dxh2,aP2.Y()+dyh2);
503*b1cdbd2cSJim Jagielski 
504*b1cdbd2cSJim Jagielski 	// Masslinie(n)
505*b1cdbd2cSJim Jagielski 	Point aMainlinePt1(aP1.X()+dx,aP1.Y()+dy);
506*b1cdbd2cSJim Jagielski 	Point aMainlinePt2(aP2.X()+dx,aP2.Y()+dy);
507*b1cdbd2cSJim Jagielski 	if (!bPfeileAussen) {
508*b1cdbd2cSJim Jagielski 		rPol.aMainline1.aP1=aMainlinePt1;
509*b1cdbd2cSJim Jagielski 		rPol.aMainline1.aP2=aMainlinePt2;
510*b1cdbd2cSJim Jagielski 		rPol.aMainline2=rPol.aMainline1;
511*b1cdbd2cSJim Jagielski 		rPol.aMainline3=rPol.aMainline1;
512*b1cdbd2cSJim Jagielski 		rPol.nMainlineAnz=1;
513*b1cdbd2cSJim Jagielski 		if (bBrkLine) {
514*b1cdbd2cSJim Jagielski 			long nNeedSiz=!rRec.bTextRota90 ? rPol.aTextSize.Width() : rPol.aTextSize.Height();
515*b1cdbd2cSJim Jagielski 			long nHalfLen=(rPol.nLineLen-nNeedSiz-nArrow1Wdt/4-nArrow2Wdt/4) /2;
516*b1cdbd2cSJim Jagielski 			rPol.nMainlineAnz=2;
517*b1cdbd2cSJim Jagielski 			rPol.aMainline1.aP2=aMainlinePt1;
518*b1cdbd2cSJim Jagielski 			rPol.aMainline1.aP2.X()+=nHalfLen;
519*b1cdbd2cSJim Jagielski 			RotatePoint(rPol.aMainline1.aP2,rPol.aMainline1.aP1,nLineSin,nLineCos);
520*b1cdbd2cSJim Jagielski 			rPol.aMainline2.aP1=aMainlinePt2;
521*b1cdbd2cSJim Jagielski 			rPol.aMainline2.aP1.X()-=nHalfLen;
522*b1cdbd2cSJim Jagielski 			RotatePoint(rPol.aMainline2.aP1,rPol.aMainline2.aP2,nLineSin,nLineCos);
523*b1cdbd2cSJim Jagielski 		}
524*b1cdbd2cSJim Jagielski 	} else {
525*b1cdbd2cSJim Jagielski 		long nLen1=nShortLen; // Pfeilbreite als Linienlaenge ausserhalb des Pfeils
526*b1cdbd2cSJim Jagielski 		long nLen2=nShortLen;
527*b1cdbd2cSJim Jagielski 		long nTextWdt=rRec.bTextRota90 ? rPol.aTextSize.Height() : rPol.aTextSize.Width();
528*b1cdbd2cSJim Jagielski 		if (!bBrkLine) {
529*b1cdbd2cSJim Jagielski 			if (rPol.eUsedTextHPos==SDRMEASURE_TEXTLEFTOUTSIDE) nLen1=nArrow1Len+nTextWdt;
530*b1cdbd2cSJim Jagielski 			if (rPol.eUsedTextHPos==SDRMEASURE_TEXTRIGHTOUTSIDE) nLen2=nArrow2Len+nTextWdt;
531*b1cdbd2cSJim Jagielski 		}
532*b1cdbd2cSJim Jagielski 		rPol.aMainline1.aP1=aMainlinePt1;
533*b1cdbd2cSJim Jagielski 		rPol.aMainline1.aP2=aMainlinePt1; rPol.aMainline1.aP2.X()-=nLen1; RotatePoint(rPol.aMainline1.aP2,aMainlinePt1,nLineSin,nLineCos);
534*b1cdbd2cSJim Jagielski 		rPol.aMainline2.aP1=aMainlinePt2; rPol.aMainline2.aP1.X()+=nLen2; RotatePoint(rPol.aMainline2.aP1,aMainlinePt2,nLineSin,nLineCos);
535*b1cdbd2cSJim Jagielski 		rPol.aMainline2.aP2=aMainlinePt2;
536*b1cdbd2cSJim Jagielski 		rPol.aMainline3.aP1=aMainlinePt1;
537*b1cdbd2cSJim Jagielski 		rPol.aMainline3.aP2=aMainlinePt2;
538*b1cdbd2cSJim Jagielski 		rPol.nMainlineAnz=3;
539*b1cdbd2cSJim Jagielski 		if (bBrkLine && rPol.eUsedTextHPos==SDRMEASURE_TEXTINSIDE) rPol.nMainlineAnz=2;
540*b1cdbd2cSJim Jagielski 	}
541*b1cdbd2cSJim Jagielski }
542*b1cdbd2cSJim Jagielski 
ImpCalcXPoly(const ImpMeasurePoly & rPol) const543*b1cdbd2cSJim Jagielski basegfx::B2DPolyPolygon SdrMeasureObj::ImpCalcXPoly(const ImpMeasurePoly& rPol) const
544*b1cdbd2cSJim Jagielski {
545*b1cdbd2cSJim Jagielski 	basegfx::B2DPolyPolygon aRetval;
546*b1cdbd2cSJim Jagielski 	basegfx::B2DPolygon aPartPolyA;
547*b1cdbd2cSJim Jagielski 	aPartPolyA.append(basegfx::B2DPoint(rPol.aMainline1.aP1.X(), rPol.aMainline1.aP1.Y()));
548*b1cdbd2cSJim Jagielski 	aPartPolyA.append(basegfx::B2DPoint(rPol.aMainline1.aP2.X(), rPol.aMainline1.aP2.Y()));
549*b1cdbd2cSJim Jagielski 	aRetval.append(aPartPolyA);
550*b1cdbd2cSJim Jagielski 
551*b1cdbd2cSJim Jagielski 	if(rPol.nMainlineAnz > 1)
552*b1cdbd2cSJim Jagielski 	{
553*b1cdbd2cSJim Jagielski 		aPartPolyA.clear();
554*b1cdbd2cSJim Jagielski 		aPartPolyA.append(basegfx::B2DPoint(rPol.aMainline2.aP1.X(), rPol.aMainline2.aP1.Y()));
555*b1cdbd2cSJim Jagielski 		aPartPolyA.append(basegfx::B2DPoint(rPol.aMainline2.aP2.X(), rPol.aMainline2.aP2.Y()));
556*b1cdbd2cSJim Jagielski 		aRetval.append(aPartPolyA);
557*b1cdbd2cSJim Jagielski 	}
558*b1cdbd2cSJim Jagielski 
559*b1cdbd2cSJim Jagielski 	if(rPol.nMainlineAnz > 2)
560*b1cdbd2cSJim Jagielski 	{
561*b1cdbd2cSJim Jagielski 		aPartPolyA.clear();
562*b1cdbd2cSJim Jagielski 		aPartPolyA.append(basegfx::B2DPoint(rPol.aMainline3.aP1.X(), rPol.aMainline3.aP1.Y()));
563*b1cdbd2cSJim Jagielski 		aPartPolyA.append(basegfx::B2DPoint(rPol.aMainline3.aP2.X(), rPol.aMainline3.aP2.Y()));
564*b1cdbd2cSJim Jagielski 		aRetval.append(aPartPolyA);
565*b1cdbd2cSJim Jagielski 	}
566*b1cdbd2cSJim Jagielski 
567*b1cdbd2cSJim Jagielski 	aPartPolyA.clear();
568*b1cdbd2cSJim Jagielski 	aPartPolyA.append(basegfx::B2DPoint(rPol.aHelpline1.aP1.X(), rPol.aHelpline1.aP1.Y()));
569*b1cdbd2cSJim Jagielski 	aPartPolyA.append(basegfx::B2DPoint(rPol.aHelpline1.aP2.X(), rPol.aHelpline1.aP2.Y()));
570*b1cdbd2cSJim Jagielski 	aRetval.append(aPartPolyA);
571*b1cdbd2cSJim Jagielski 
572*b1cdbd2cSJim Jagielski 	aPartPolyA.clear();
573*b1cdbd2cSJim Jagielski 	aPartPolyA.append(basegfx::B2DPoint(rPol.aHelpline2.aP1.X(), rPol.aHelpline2.aP1.Y()));
574*b1cdbd2cSJim Jagielski 	aPartPolyA.append(basegfx::B2DPoint(rPol.aHelpline2.aP2.X(), rPol.aHelpline2.aP2.Y()));
575*b1cdbd2cSJim Jagielski 	aRetval.append(aPartPolyA);
576*b1cdbd2cSJim Jagielski 
577*b1cdbd2cSJim Jagielski 	return aRetval;
578*b1cdbd2cSJim Jagielski }
579*b1cdbd2cSJim Jagielski 
CalcFieldValue(const SvxFieldItem & rField,sal_uInt16 nPara,sal_uInt16 nPos,FASTBOOL bEdit,Color * & rpTxtColor,Color * & rpFldColor,XubString & rRet) const580*b1cdbd2cSJim Jagielski FASTBOOL SdrMeasureObj::CalcFieldValue(const SvxFieldItem& rField, sal_uInt16 nPara, sal_uInt16 nPos,
581*b1cdbd2cSJim Jagielski 	FASTBOOL bEdit,
582*b1cdbd2cSJim Jagielski 	Color*& rpTxtColor, Color*& rpFldColor, XubString& rRet) const
583*b1cdbd2cSJim Jagielski {
584*b1cdbd2cSJim Jagielski 	const SvxFieldData* pField=rField.GetField();
585*b1cdbd2cSJim Jagielski 	SdrMeasureField* pMeasureField=PTR_CAST(SdrMeasureField,pField);
586*b1cdbd2cSJim Jagielski 	if (pMeasureField!=NULL) {
587*b1cdbd2cSJim Jagielski 		TakeRepresentation(rRet, pMeasureField->GetMeasureFieldKind());
588*b1cdbd2cSJim Jagielski 		if (rpFldColor!=NULL) {
589*b1cdbd2cSJim Jagielski 			if (!bEdit)
590*b1cdbd2cSJim Jagielski 			{
591*b1cdbd2cSJim Jagielski 				delete rpFldColor;
592*b1cdbd2cSJim Jagielski 				rpFldColor=NULL;
593*b1cdbd2cSJim Jagielski 			}
594*b1cdbd2cSJim Jagielski 		}
595*b1cdbd2cSJim Jagielski 		return sal_True;
596*b1cdbd2cSJim Jagielski 	} else {
597*b1cdbd2cSJim Jagielski 		return SdrTextObj::CalcFieldValue(rField,nPara,nPos,bEdit,rpTxtColor,rpFldColor,rRet);
598*b1cdbd2cSJim Jagielski 	}
599*b1cdbd2cSJim Jagielski }
600*b1cdbd2cSJim Jagielski 
UndirtyText() const601*b1cdbd2cSJim Jagielski void SdrMeasureObj::UndirtyText() const
602*b1cdbd2cSJim Jagielski {
603*b1cdbd2cSJim Jagielski 	if (bTextDirty)
604*b1cdbd2cSJim Jagielski 	{
605*b1cdbd2cSJim Jagielski 		SdrOutliner& rOutliner=ImpGetDrawOutliner();
606*b1cdbd2cSJim Jagielski 		OutlinerParaObject* pOutlinerParaObject = SdrTextObj::GetOutlinerParaObject();
607*b1cdbd2cSJim Jagielski 		if(pOutlinerParaObject==NULL)
608*b1cdbd2cSJim Jagielski 		{
609*b1cdbd2cSJim Jagielski             rOutliner.QuickInsertField(SvxFieldItem(SdrMeasureField(SDRMEASUREFIELD_ROTA90BLANCS), EE_FEATURE_FIELD), ESelection(0,0));
610*b1cdbd2cSJim Jagielski             rOutliner.QuickInsertField(SvxFieldItem(SdrMeasureField(SDRMEASUREFIELD_VALUE), EE_FEATURE_FIELD),ESelection(0,1));
611*b1cdbd2cSJim Jagielski             rOutliner.QuickInsertText(String(sal_Unicode(' ')), ESelection(0,2));
612*b1cdbd2cSJim Jagielski             rOutliner.QuickInsertField(SvxFieldItem(SdrMeasureField(SDRMEASUREFIELD_UNIT), EE_FEATURE_FIELD),ESelection(0,3));
613*b1cdbd2cSJim Jagielski             rOutliner.QuickInsertField(SvxFieldItem(SdrMeasureField(SDRMEASUREFIELD_ROTA90BLANCS), EE_FEATURE_FIELD),ESelection(0,4));
614*b1cdbd2cSJim Jagielski 
615*b1cdbd2cSJim Jagielski 			if(GetStyleSheet())
616*b1cdbd2cSJim Jagielski 				rOutliner.SetStyleSheet(0, GetStyleSheet());
617*b1cdbd2cSJim Jagielski 
618*b1cdbd2cSJim Jagielski 			rOutliner.SetParaAttribs(0, GetObjectItemSet());
619*b1cdbd2cSJim Jagielski 
620*b1cdbd2cSJim Jagielski 			// casting auf nonconst
621*b1cdbd2cSJim Jagielski 			const_cast<SdrMeasureObj*>(this)->NbcSetOutlinerParaObject( rOutliner.CreateParaObject() );
622*b1cdbd2cSJim Jagielski 		}
623*b1cdbd2cSJim Jagielski 		else
624*b1cdbd2cSJim Jagielski 		{
625*b1cdbd2cSJim Jagielski 			rOutliner.SetText(*pOutlinerParaObject);
626*b1cdbd2cSJim Jagielski 		}
627*b1cdbd2cSJim Jagielski 
628*b1cdbd2cSJim Jagielski 		rOutliner.SetUpdateMode(sal_True);
629*b1cdbd2cSJim Jagielski 		rOutliner.UpdateFields();
630*b1cdbd2cSJim Jagielski 		Size aSiz(rOutliner.CalcTextSize());
631*b1cdbd2cSJim Jagielski 		rOutliner.Clear();
632*b1cdbd2cSJim Jagielski 		// 3x casting auf nonconst
633*b1cdbd2cSJim Jagielski 		((SdrMeasureObj*)this)->aTextSize=aSiz;
634*b1cdbd2cSJim Jagielski 		((SdrMeasureObj*)this)->bTextSizeDirty=sal_False;
635*b1cdbd2cSJim Jagielski 		((SdrMeasureObj*)this)->bTextDirty=sal_False;
636*b1cdbd2cSJim Jagielski 	}
637*b1cdbd2cSJim Jagielski }
638*b1cdbd2cSJim Jagielski 
TakeUnrotatedSnapRect(Rectangle & rRect) const639*b1cdbd2cSJim Jagielski void SdrMeasureObj::TakeUnrotatedSnapRect(Rectangle& rRect) const
640*b1cdbd2cSJim Jagielski {
641*b1cdbd2cSJim Jagielski 	if (bTextDirty) UndirtyText();
642*b1cdbd2cSJim Jagielski 	ImpMeasureRec aRec;
643*b1cdbd2cSJim Jagielski 	ImpMeasurePoly aMPol;
644*b1cdbd2cSJim Jagielski 	ImpTakeAttr(aRec);
645*b1cdbd2cSJim Jagielski 	ImpCalcGeometrics(aRec,aMPol);
646*b1cdbd2cSJim Jagielski 
647*b1cdbd2cSJim Jagielski 	// TextSize ermitteln inkl. Textrahmenabstaende
648*b1cdbd2cSJim Jagielski 	Size aTextSize2(aMPol.aTextSize);
649*b1cdbd2cSJim Jagielski 	if (aTextSize2.Width()<1) aTextSize2.Width()=1;
650*b1cdbd2cSJim Jagielski 	if (aTextSize2.Height()<1) aTextSize2.Height()=1;
651*b1cdbd2cSJim Jagielski 	aTextSize2.Width()+=GetTextLeftDistance()+GetTextRightDistance();
652*b1cdbd2cSJim Jagielski 	aTextSize2.Height()+=GetTextUpperDistance()+GetTextLowerDistance();
653*b1cdbd2cSJim Jagielski 
654*b1cdbd2cSJim Jagielski 	Point aPt1b(aMPol.aMainline1.aP1);
655*b1cdbd2cSJim Jagielski 	long nLen=aMPol.nLineLen;
656*b1cdbd2cSJim Jagielski 	long nLWdt=aMPol.nLineWdt2;
657*b1cdbd2cSJim Jagielski 	long nArr1Len=aMPol.nArrow1Len;
658*b1cdbd2cSJim Jagielski 	long nArr2Len=aMPol.nArrow2Len;
659*b1cdbd2cSJim Jagielski 	if (aMPol.bBreakedLine) {
660*b1cdbd2cSJim Jagielski 		// Bei Unterbrochener Linie und Outside muss der Text nicht neben den
661*b1cdbd2cSJim Jagielski 		// Pfeil sondern neben die Linie an dem Pfeil plaziert werden
662*b1cdbd2cSJim Jagielski 		nArr1Len=aMPol.nShortLineLen+aMPol.nArrow1Wdt/4;
663*b1cdbd2cSJim Jagielski 		nArr2Len=aMPol.nShortLineLen+aMPol.nArrow2Wdt/4;
664*b1cdbd2cSJim Jagielski 	}
665*b1cdbd2cSJim Jagielski 
666*b1cdbd2cSJim Jagielski 	Point aTextPos;
667*b1cdbd2cSJim Jagielski 	FASTBOOL bRota90=aRec.bTextRota90;
668*b1cdbd2cSJim Jagielski 	FASTBOOL bUpsideDown=aRec.bTextUpsideDown!=aMPol.bAutoUpsideDown;
669*b1cdbd2cSJim Jagielski 	FASTBOOL bBelowRefEdge=aRec.bBelowRefEdge;
670*b1cdbd2cSJim Jagielski 	SdrMeasureTextHPos eMH=aMPol.eUsedTextHPos;
671*b1cdbd2cSJim Jagielski 	SdrMeasureTextVPos eMV=aMPol.eUsedTextVPos;
672*b1cdbd2cSJim Jagielski 	if (!bRota90) {
673*b1cdbd2cSJim Jagielski 		switch (eMH) {
674*b1cdbd2cSJim Jagielski 			case SDRMEASURE_TEXTLEFTOUTSIDE: aTextPos.X()=aPt1b.X()-aTextSize2.Width()-nArr1Len-nLWdt; break;
675*b1cdbd2cSJim Jagielski 			case SDRMEASURE_TEXTRIGHTOUTSIDE: aTextPos.X()=aPt1b.X()+nLen+nArr2Len+nLWdt; break;
676*b1cdbd2cSJim Jagielski 			default: aTextPos.X()=aPt1b.X(); aTextSize2.Width()=nLen;
677*b1cdbd2cSJim Jagielski 		}
678*b1cdbd2cSJim Jagielski 		switch (eMV) {
679*b1cdbd2cSJim Jagielski 			case SDRMEASURETEXT_VERTICALCENTERED:
680*b1cdbd2cSJim Jagielski 			case SDRMEASURETEXT_BREAKEDLINE: aTextPos.Y()=aPt1b.Y()-aTextSize2.Height()/2; break;
681*b1cdbd2cSJim Jagielski 			case SDRMEASURE_BELOW: {
682*b1cdbd2cSJim Jagielski 				if (!bUpsideDown) aTextPos.Y()=aPt1b.Y()+nLWdt;
683*b1cdbd2cSJim Jagielski 				else aTextPos.Y()=aPt1b.Y()-aTextSize2.Height()-nLWdt;
684*b1cdbd2cSJim Jagielski 			} break;
685*b1cdbd2cSJim Jagielski 			default: {
686*b1cdbd2cSJim Jagielski 				if (!bUpsideDown) aTextPos.Y()=aPt1b.Y()-aTextSize2.Height()-nLWdt;
687*b1cdbd2cSJim Jagielski 				else aTextPos.Y()=aPt1b.Y()+nLWdt;
688*b1cdbd2cSJim Jagielski 			}
689*b1cdbd2cSJim Jagielski 		}
690*b1cdbd2cSJim Jagielski 		if (bUpsideDown) {
691*b1cdbd2cSJim Jagielski 			aTextPos.X()+=aTextSize2.Width();
692*b1cdbd2cSJim Jagielski 			aTextPos.Y()+=aTextSize2.Height();
693*b1cdbd2cSJim Jagielski 		}
694*b1cdbd2cSJim Jagielski 	} else { // also wenn bTextRota90==TRUE
695*b1cdbd2cSJim Jagielski 		switch (eMH) {
696*b1cdbd2cSJim Jagielski 			case SDRMEASURE_TEXTLEFTOUTSIDE: aTextPos.X()=aPt1b.X()-aTextSize2.Height()-nArr1Len; break;
697*b1cdbd2cSJim Jagielski 			case SDRMEASURE_TEXTRIGHTOUTSIDE: aTextPos.X()=aPt1b.X()+nLen+nArr2Len; break;
698*b1cdbd2cSJim Jagielski 			default: aTextPos.X()=aPt1b.X(); aTextSize2.Height()=nLen;
699*b1cdbd2cSJim Jagielski 		}
700*b1cdbd2cSJim Jagielski 		switch (eMV) {
701*b1cdbd2cSJim Jagielski 			case SDRMEASURETEXT_VERTICALCENTERED:
702*b1cdbd2cSJim Jagielski 			case SDRMEASURETEXT_BREAKEDLINE: aTextPos.Y()=aPt1b.Y()+aTextSize2.Width()/2; break;
703*b1cdbd2cSJim Jagielski 			case SDRMEASURE_BELOW: {
704*b1cdbd2cSJim Jagielski 				if (!bBelowRefEdge) aTextPos.Y()=aPt1b.Y()+aTextSize2.Width()+nLWdt;
705*b1cdbd2cSJim Jagielski 				else aTextPos.Y()=aPt1b.Y()-nLWdt;
706*b1cdbd2cSJim Jagielski 			} break;
707*b1cdbd2cSJim Jagielski 			default: {
708*b1cdbd2cSJim Jagielski 				if (!bBelowRefEdge) aTextPos.Y()=aPt1b.Y()-nLWdt;
709*b1cdbd2cSJim Jagielski 				else aTextPos.Y()=aPt1b.Y()+aTextSize2.Width()+nLWdt;
710*b1cdbd2cSJim Jagielski 			}
711*b1cdbd2cSJim Jagielski 		}
712*b1cdbd2cSJim Jagielski 		if (bUpsideDown) {
713*b1cdbd2cSJim Jagielski 			aTextPos.X()+=aTextSize2.Height();
714*b1cdbd2cSJim Jagielski 			aTextPos.Y()-=aTextSize2.Width();
715*b1cdbd2cSJim Jagielski 		}
716*b1cdbd2cSJim Jagielski 	}
717*b1cdbd2cSJim Jagielski 	if (aMPol.nTextWink!=aGeo.nDrehWink) {
718*b1cdbd2cSJim Jagielski 		((SdrMeasureObj*)this)->aGeo.nDrehWink=aMPol.nTextWink;
719*b1cdbd2cSJim Jagielski 		((SdrMeasureObj*)this)->aGeo.RecalcSinCos();
720*b1cdbd2cSJim Jagielski 	}
721*b1cdbd2cSJim Jagielski 	RotatePoint(aTextPos,aPt1b,aMPol.nLineSin,aMPol.nLineCos);
722*b1cdbd2cSJim Jagielski 	aTextSize2.Width()++; aTextSize2.Height()++; // wg. des komischen Verhaltens beim Rect-Ctor
723*b1cdbd2cSJim Jagielski 	rRect=Rectangle(aTextPos,aTextSize2);
724*b1cdbd2cSJim Jagielski 	rRect.Justify();
725*b1cdbd2cSJim Jagielski 	((SdrMeasureObj*)this)->aRect=rRect;
726*b1cdbd2cSJim Jagielski 
727*b1cdbd2cSJim Jagielski 	if (aMPol.nTextWink!=aGeo.nDrehWink) {
728*b1cdbd2cSJim Jagielski 		((SdrMeasureObj*)this)->aGeo.nDrehWink=aMPol.nTextWink;
729*b1cdbd2cSJim Jagielski 		((SdrMeasureObj*)this)->aGeo.RecalcSinCos();
730*b1cdbd2cSJim Jagielski 	}
731*b1cdbd2cSJim Jagielski }
732*b1cdbd2cSJim Jagielski 
operator =(const SdrObject & rObj)733*b1cdbd2cSJim Jagielski void SdrMeasureObj::operator=(const SdrObject& rObj)
734*b1cdbd2cSJim Jagielski {
735*b1cdbd2cSJim Jagielski 	SdrTextObj::operator=(rObj);
736*b1cdbd2cSJim Jagielski 	aPt1=((SdrMeasureObj&)rObj).aPt1;
737*b1cdbd2cSJim Jagielski 	aPt2=((SdrMeasureObj&)rObj).aPt2;
738*b1cdbd2cSJim Jagielski 	bTextDirty=((SdrMeasureObj&)rObj).bTextDirty;
739*b1cdbd2cSJim Jagielski }
740*b1cdbd2cSJim Jagielski 
TakeObjNameSingul(XubString & rName) const741*b1cdbd2cSJim Jagielski void SdrMeasureObj::TakeObjNameSingul(XubString& rName) const
742*b1cdbd2cSJim Jagielski {
743*b1cdbd2cSJim Jagielski 	rName=ImpGetResStr(STR_ObjNameSingulMEASURE);
744*b1cdbd2cSJim Jagielski 
745*b1cdbd2cSJim Jagielski 	String aName( GetName() );
746*b1cdbd2cSJim Jagielski 	if(aName.Len())
747*b1cdbd2cSJim Jagielski 	{
748*b1cdbd2cSJim Jagielski 		rName += sal_Unicode(' ');
749*b1cdbd2cSJim Jagielski 		rName += sal_Unicode('\'');
750*b1cdbd2cSJim Jagielski 		rName += aName;
751*b1cdbd2cSJim Jagielski 		rName += sal_Unicode('\'');
752*b1cdbd2cSJim Jagielski 	}
753*b1cdbd2cSJim Jagielski }
754*b1cdbd2cSJim Jagielski 
TakeObjNamePlural(XubString & rName) const755*b1cdbd2cSJim Jagielski void SdrMeasureObj::TakeObjNamePlural(XubString& rName) const
756*b1cdbd2cSJim Jagielski {
757*b1cdbd2cSJim Jagielski 	rName=ImpGetResStr(STR_ObjNamePluralMEASURE);
758*b1cdbd2cSJim Jagielski }
759*b1cdbd2cSJim Jagielski 
TakeXorPoly() const760*b1cdbd2cSJim Jagielski basegfx::B2DPolyPolygon SdrMeasureObj::TakeXorPoly() const
761*b1cdbd2cSJim Jagielski {
762*b1cdbd2cSJim Jagielski 	ImpMeasureRec aRec;
763*b1cdbd2cSJim Jagielski 	ImpMeasurePoly aMPol;
764*b1cdbd2cSJim Jagielski 	ImpTakeAttr(aRec);
765*b1cdbd2cSJim Jagielski 	ImpCalcGeometrics(aRec,aMPol);
766*b1cdbd2cSJim Jagielski 	return ImpCalcXPoly(aMPol);
767*b1cdbd2cSJim Jagielski }
768*b1cdbd2cSJim Jagielski 
GetHdlCount() const769*b1cdbd2cSJim Jagielski sal_uInt32 SdrMeasureObj::GetHdlCount() const
770*b1cdbd2cSJim Jagielski {
771*b1cdbd2cSJim Jagielski 	return 6L;
772*b1cdbd2cSJim Jagielski }
773*b1cdbd2cSJim Jagielski 
GetHdl(sal_uInt32 nHdlNum) const774*b1cdbd2cSJim Jagielski SdrHdl* SdrMeasureObj::GetHdl(sal_uInt32 nHdlNum) const
775*b1cdbd2cSJim Jagielski {
776*b1cdbd2cSJim Jagielski 	ImpMeasureRec aRec;
777*b1cdbd2cSJim Jagielski 	ImpMeasurePoly aMPol;
778*b1cdbd2cSJim Jagielski 	ImpTakeAttr(aRec);
779*b1cdbd2cSJim Jagielski 	aRec.nHelplineDist=0;
780*b1cdbd2cSJim Jagielski 	ImpCalcGeometrics(aRec,aMPol);
781*b1cdbd2cSJim Jagielski 	Point aPt;
782*b1cdbd2cSJim Jagielski 	//SdrHdlKind eHdl=HDL_POLY;
783*b1cdbd2cSJim Jagielski 	switch (nHdlNum) {
784*b1cdbd2cSJim Jagielski 		case 0: aPt=aMPol.aHelpline1.aP1; break;
785*b1cdbd2cSJim Jagielski 		case 1: aPt=aMPol.aHelpline2.aP1; break;
786*b1cdbd2cSJim Jagielski 		case 2: aPt=aPt1;       break;
787*b1cdbd2cSJim Jagielski 		case 3: aPt=aPt2;       break;
788*b1cdbd2cSJim Jagielski 		case 4: aPt=aMPol.aHelpline1.aP2; break;
789*b1cdbd2cSJim Jagielski 		case 5: aPt=aMPol.aHelpline2.aP2; break;
790*b1cdbd2cSJim Jagielski 	} // switch
791*b1cdbd2cSJim Jagielski 	SdrHdl* pHdl=new ImpMeasureHdl(aPt,HDL_USER);
792*b1cdbd2cSJim Jagielski 	pHdl->SetObjHdlNum(nHdlNum);
793*b1cdbd2cSJim Jagielski 	pHdl->SetDrehWink(aMPol.nLineWink);
794*b1cdbd2cSJim Jagielski 	return pHdl;
795*b1cdbd2cSJim Jagielski }
796*b1cdbd2cSJim Jagielski 
797*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////
798*b1cdbd2cSJim Jagielski 
hasSpecialDrag() const799*b1cdbd2cSJim Jagielski bool SdrMeasureObj::hasSpecialDrag() const
800*b1cdbd2cSJim Jagielski {
801*b1cdbd2cSJim Jagielski 	return true;
802*b1cdbd2cSJim Jagielski }
803*b1cdbd2cSJim Jagielski 
beginSpecialDrag(SdrDragStat & rDrag) const804*b1cdbd2cSJim Jagielski bool SdrMeasureObj::beginSpecialDrag(SdrDragStat& rDrag) const
805*b1cdbd2cSJim Jagielski {
806*b1cdbd2cSJim Jagielski 	const SdrHdl* pHdl = rDrag.GetHdl();
807*b1cdbd2cSJim Jagielski 
808*b1cdbd2cSJim Jagielski     if(pHdl)
809*b1cdbd2cSJim Jagielski     {
810*b1cdbd2cSJim Jagielski 		const sal_uInt32 nHdlNum(pHdl->GetObjHdlNum());
811*b1cdbd2cSJim Jagielski 
812*b1cdbd2cSJim Jagielski         if(nHdlNum != 2 && nHdlNum != 3)
813*b1cdbd2cSJim Jagielski         {
814*b1cdbd2cSJim Jagielski 			rDrag.SetEndDragChangesAttributes(true);
815*b1cdbd2cSJim Jagielski 		}
816*b1cdbd2cSJim Jagielski 
817*b1cdbd2cSJim Jagielski         return true;
818*b1cdbd2cSJim Jagielski 	}
819*b1cdbd2cSJim Jagielski 
820*b1cdbd2cSJim Jagielski     return false;
821*b1cdbd2cSJim Jagielski }
822*b1cdbd2cSJim Jagielski 
applySpecialDrag(SdrDragStat & rDrag)823*b1cdbd2cSJim Jagielski bool SdrMeasureObj::applySpecialDrag(SdrDragStat& rDrag)
824*b1cdbd2cSJim Jagielski {
825*b1cdbd2cSJim Jagielski     ImpMeasureRec aMeasureRec;
826*b1cdbd2cSJim Jagielski 	const SdrHdl* pHdl = rDrag.GetHdl();
827*b1cdbd2cSJim Jagielski 	const sal_uInt32 nHdlNum(pHdl->GetObjHdlNum());
828*b1cdbd2cSJim Jagielski 
829*b1cdbd2cSJim Jagielski 	ImpTakeAttr(aMeasureRec);
830*b1cdbd2cSJim Jagielski 	ImpEvalDrag(aMeasureRec, rDrag);
831*b1cdbd2cSJim Jagielski 
832*b1cdbd2cSJim Jagielski 	switch (nHdlNum)
833*b1cdbd2cSJim Jagielski     {
834*b1cdbd2cSJim Jagielski 		case 2:
835*b1cdbd2cSJim Jagielski         {
836*b1cdbd2cSJim Jagielski             aPt1 = aMeasureRec.aPt1;
837*b1cdbd2cSJim Jagielski             SetTextDirty();
838*b1cdbd2cSJim Jagielski             break;
839*b1cdbd2cSJim Jagielski         }
840*b1cdbd2cSJim Jagielski 		case 3:
841*b1cdbd2cSJim Jagielski         {
842*b1cdbd2cSJim Jagielski             aPt2 = aMeasureRec.aPt2;
843*b1cdbd2cSJim Jagielski             SetTextDirty();
844*b1cdbd2cSJim Jagielski             break;
845*b1cdbd2cSJim Jagielski         }
846*b1cdbd2cSJim Jagielski 		default:
847*b1cdbd2cSJim Jagielski 		{
848*b1cdbd2cSJim Jagielski             switch(nHdlNum)
849*b1cdbd2cSJim Jagielski 			{
850*b1cdbd2cSJim Jagielski 				case 0:
851*b1cdbd2cSJim Jagielski 				case 1:
852*b1cdbd2cSJim Jagielski 				{
853*b1cdbd2cSJim Jagielski                     ImpMeasureRec aOrigMeasureRec;
854*b1cdbd2cSJim Jagielski 	                ImpTakeAttr(aOrigMeasureRec);
855*b1cdbd2cSJim Jagielski 
856*b1cdbd2cSJim Jagielski                     if(aMeasureRec.nHelpline1Len != aOrigMeasureRec.nHelpline1Len)
857*b1cdbd2cSJim Jagielski 					{
858*b1cdbd2cSJim Jagielski 						SetObjectItem(SdrMeasureHelpline1LenItem(aMeasureRec.nHelpline1Len));
859*b1cdbd2cSJim Jagielski 					}
860*b1cdbd2cSJim Jagielski 
861*b1cdbd2cSJim Jagielski 					if(aMeasureRec.nHelpline2Len != aOrigMeasureRec.nHelpline2Len)
862*b1cdbd2cSJim Jagielski 					{
863*b1cdbd2cSJim Jagielski 						SetObjectItem(SdrMeasureHelpline2LenItem(aMeasureRec.nHelpline2Len));
864*b1cdbd2cSJim Jagielski 					}
865*b1cdbd2cSJim Jagielski 
866*b1cdbd2cSJim Jagielski 					break;
867*b1cdbd2cSJim Jagielski 				}
868*b1cdbd2cSJim Jagielski 
869*b1cdbd2cSJim Jagielski 				case 4:
870*b1cdbd2cSJim Jagielski 				case 5:
871*b1cdbd2cSJim Jagielski 				{
872*b1cdbd2cSJim Jagielski                     ImpMeasureRec aOrigMeasureRec;
873*b1cdbd2cSJim Jagielski 	                ImpTakeAttr(aOrigMeasureRec);
874*b1cdbd2cSJim Jagielski 
875*b1cdbd2cSJim Jagielski                     if(aMeasureRec.nLineDist != aOrigMeasureRec.nLineDist)
876*b1cdbd2cSJim Jagielski 					{
877*b1cdbd2cSJim Jagielski 						SetObjectItem(SdrMeasureLineDistItem(aMeasureRec.nLineDist));
878*b1cdbd2cSJim Jagielski 					}
879*b1cdbd2cSJim Jagielski 
880*b1cdbd2cSJim Jagielski 					if(aMeasureRec.bBelowRefEdge != aOrigMeasureRec.bBelowRefEdge)
881*b1cdbd2cSJim Jagielski 					{
882*b1cdbd2cSJim Jagielski 						SetObjectItem(SdrMeasureBelowRefEdgeItem(aMeasureRec.bBelowRefEdge));
883*b1cdbd2cSJim Jagielski 					}
884*b1cdbd2cSJim Jagielski 				}
885*b1cdbd2cSJim Jagielski 			}
886*b1cdbd2cSJim Jagielski 		}
887*b1cdbd2cSJim Jagielski 	} // switch
888*b1cdbd2cSJim Jagielski 
889*b1cdbd2cSJim Jagielski     SetRectsDirty();
890*b1cdbd2cSJim Jagielski 	SetChanged();
891*b1cdbd2cSJim Jagielski 
892*b1cdbd2cSJim Jagielski     return true;
893*b1cdbd2cSJim Jagielski }
894*b1cdbd2cSJim Jagielski 
getSpecialDragComment(const SdrDragStat &) const895*b1cdbd2cSJim Jagielski String SdrMeasureObj::getSpecialDragComment(const SdrDragStat& /*rDrag*/) const
896*b1cdbd2cSJim Jagielski {
897*b1cdbd2cSJim Jagielski 	XubString aStr;
898*b1cdbd2cSJim Jagielski 	return aStr;
899*b1cdbd2cSJim Jagielski }
900*b1cdbd2cSJim Jagielski 
ImpEvalDrag(ImpMeasureRec & rRec,const SdrDragStat & rDrag) const901*b1cdbd2cSJim Jagielski void SdrMeasureObj::ImpEvalDrag(ImpMeasureRec& rRec, const SdrDragStat& rDrag) const
902*b1cdbd2cSJim Jagielski {
903*b1cdbd2cSJim Jagielski 	long nLineWink=GetAngle(rRec.aPt2-rRec.aPt1);
904*b1cdbd2cSJim Jagielski 	double a=nLineWink*nPi180;
905*b1cdbd2cSJim Jagielski 	double nSin=sin(a);
906*b1cdbd2cSJim Jagielski 	double nCos=cos(a);
907*b1cdbd2cSJim Jagielski 
908*b1cdbd2cSJim Jagielski 	const SdrHdl* pHdl=rDrag.GetHdl();
909*b1cdbd2cSJim Jagielski 	sal_uInt32 nHdlNum(pHdl->GetObjHdlNum());
910*b1cdbd2cSJim Jagielski 	FASTBOOL bOrtho=rDrag.GetView()!=NULL && rDrag.GetView()->IsOrtho();
911*b1cdbd2cSJim Jagielski 	FASTBOOL bBigOrtho=bOrtho && rDrag.GetView()->IsBigOrtho();
912*b1cdbd2cSJim Jagielski 	FASTBOOL bBelow=rRec.bBelowRefEdge;
913*b1cdbd2cSJim Jagielski 	Point aPt(rDrag.GetNow());
914*b1cdbd2cSJim Jagielski 
915*b1cdbd2cSJim Jagielski 	switch (nHdlNum) {
916*b1cdbd2cSJim Jagielski 		case 0: {
917*b1cdbd2cSJim Jagielski 			RotatePoint(aPt,aPt1,nSin,-nCos);
918*b1cdbd2cSJim Jagielski 			rRec.nHelpline1Len=aPt1.Y()-aPt.Y();
919*b1cdbd2cSJim Jagielski 			if (bBelow) rRec.nHelpline1Len=-rRec.nHelpline1Len;
920*b1cdbd2cSJim Jagielski 			if (bOrtho) rRec.nHelpline2Len=rRec.nHelpline1Len;
921*b1cdbd2cSJim Jagielski 		} break;
922*b1cdbd2cSJim Jagielski 		case 1: {
923*b1cdbd2cSJim Jagielski 			RotatePoint(aPt,aPt2,nSin,-nCos);
924*b1cdbd2cSJim Jagielski 			rRec.nHelpline2Len=aPt2.Y()-aPt.Y();
925*b1cdbd2cSJim Jagielski 			if (bBelow) rRec.nHelpline2Len=-rRec.nHelpline2Len;
926*b1cdbd2cSJim Jagielski 			if (bOrtho) rRec.nHelpline1Len=rRec.nHelpline2Len;
927*b1cdbd2cSJim Jagielski 		} break;
928*b1cdbd2cSJim Jagielski 		case 2: case 3: {
929*b1cdbd2cSJim Jagielski 			FASTBOOL bAnf=nHdlNum==2;
930*b1cdbd2cSJim Jagielski 			Point& rMov=bAnf ? rRec.aPt1 : rRec.aPt2;
931*b1cdbd2cSJim Jagielski 			Point aMov(rMov);
932*b1cdbd2cSJim Jagielski 			Point aFix(bAnf ? rRec.aPt2 : rRec.aPt1);
933*b1cdbd2cSJim Jagielski 			if (bOrtho) {
934*b1cdbd2cSJim Jagielski 				long ndx0=aMov.X()-aFix.X();
935*b1cdbd2cSJim Jagielski 				long ndy0=aMov.Y()-aFix.Y();
936*b1cdbd2cSJim Jagielski 				FASTBOOL bHLin=ndy0==0;
937*b1cdbd2cSJim Jagielski 				FASTBOOL bVLin=ndx0==0;
938*b1cdbd2cSJim Jagielski 				if (!bHLin || !bVLin) { // sonst ist aPt1==aPt2
939*b1cdbd2cSJim Jagielski 					long ndx=aPt.X()-aFix.X();
940*b1cdbd2cSJim Jagielski 					long ndy=aPt.Y()-aFix.Y();
941*b1cdbd2cSJim Jagielski 					double nXFact=0; if (!bVLin) nXFact=(double)ndx/(double)ndx0;
942*b1cdbd2cSJim Jagielski 					double nYFact=0; if (!bHLin) nYFact=(double)ndy/(double)ndy0;
943*b1cdbd2cSJim Jagielski 					FASTBOOL bHor=bHLin || (!bVLin && (nXFact>nYFact) ==bBigOrtho);
944*b1cdbd2cSJim Jagielski 					FASTBOOL bVer=bVLin || (!bHLin && (nXFact<=nYFact)==bBigOrtho);
945*b1cdbd2cSJim Jagielski 					if (bHor) ndy=long(ndy0*nXFact);
946*b1cdbd2cSJim Jagielski 					if (bVer) ndx=long(ndx0*nYFact);
947*b1cdbd2cSJim Jagielski 					aPt=aFix;
948*b1cdbd2cSJim Jagielski 					aPt.X()+=ndx;
949*b1cdbd2cSJim Jagielski 					aPt.Y()+=ndy;
950*b1cdbd2cSJim Jagielski 				} // else Ortho8
951*b1cdbd2cSJim Jagielski 			}
952*b1cdbd2cSJim Jagielski 			rMov=aPt;
953*b1cdbd2cSJim Jagielski 		} break;
954*b1cdbd2cSJim Jagielski 		case 4: case 5: {
955*b1cdbd2cSJim Jagielski 			long nVal0=rRec.nLineDist;
956*b1cdbd2cSJim Jagielski 			RotatePoint(aPt,(nHdlNum==4 ? aPt1 : aPt2),nSin,-nCos);
957*b1cdbd2cSJim Jagielski 			rRec.nLineDist=aPt.Y()- (nHdlNum==4 ? aPt1.Y() : aPt2.Y());
958*b1cdbd2cSJim Jagielski 			if (bBelow) rRec.nLineDist=-rRec.nLineDist;
959*b1cdbd2cSJim Jagielski 			if (rRec.nLineDist<0) {
960*b1cdbd2cSJim Jagielski 				rRec.nLineDist=-rRec.nLineDist;
961*b1cdbd2cSJim Jagielski 				rRec.bBelowRefEdge=!bBelow;
962*b1cdbd2cSJim Jagielski 			}
963*b1cdbd2cSJim Jagielski 			rRec.nLineDist-=rRec.nHelplineOverhang;
964*b1cdbd2cSJim Jagielski 			if (bOrtho) rRec.nLineDist=nVal0;
965*b1cdbd2cSJim Jagielski 		} break;
966*b1cdbd2cSJim Jagielski 	} // switch
967*b1cdbd2cSJim Jagielski }
968*b1cdbd2cSJim Jagielski 
969*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////
970*b1cdbd2cSJim Jagielski 
BegCreate(SdrDragStat & rStat)971*b1cdbd2cSJim Jagielski FASTBOOL SdrMeasureObj::BegCreate(SdrDragStat& rStat)
972*b1cdbd2cSJim Jagielski {
973*b1cdbd2cSJim Jagielski 	rStat.SetOrtho8Possible();
974*b1cdbd2cSJim Jagielski 	aPt1=rStat.GetStart();
975*b1cdbd2cSJim Jagielski 	aPt2=rStat.GetNow();
976*b1cdbd2cSJim Jagielski 	SetTextDirty();
977*b1cdbd2cSJim Jagielski 	return sal_True;
978*b1cdbd2cSJim Jagielski }
979*b1cdbd2cSJim Jagielski 
MovCreate(SdrDragStat & rStat)980*b1cdbd2cSJim Jagielski FASTBOOL SdrMeasureObj::MovCreate(SdrDragStat& rStat)
981*b1cdbd2cSJim Jagielski {
982*b1cdbd2cSJim Jagielski 	SdrView* pView=rStat.GetView();
983*b1cdbd2cSJim Jagielski 	aPt1=rStat.GetStart();
984*b1cdbd2cSJim Jagielski 	aPt2=rStat.GetNow();
985*b1cdbd2cSJim Jagielski 	if (pView!=NULL && pView->IsCreate1stPointAsCenter()) {
986*b1cdbd2cSJim Jagielski 		aPt1+=aPt1;
987*b1cdbd2cSJim Jagielski 		aPt1-=rStat.Now();
988*b1cdbd2cSJim Jagielski 	}
989*b1cdbd2cSJim Jagielski 	SetTextDirty();
990*b1cdbd2cSJim Jagielski 	SetBoundRectDirty();
991*b1cdbd2cSJim Jagielski 	bSnapRectDirty=sal_True;
992*b1cdbd2cSJim Jagielski 	return sal_True;
993*b1cdbd2cSJim Jagielski }
994*b1cdbd2cSJim Jagielski 
EndCreate(SdrDragStat & rStat,SdrCreateCmd eCmd)995*b1cdbd2cSJim Jagielski FASTBOOL SdrMeasureObj::EndCreate(SdrDragStat& rStat, SdrCreateCmd eCmd)
996*b1cdbd2cSJim Jagielski {
997*b1cdbd2cSJim Jagielski 	SetTextDirty();
998*b1cdbd2cSJim Jagielski 	SetRectsDirty();
999*b1cdbd2cSJim Jagielski 	return (eCmd==SDRCREATE_FORCEEND || rStat.GetPointAnz()>=2);
1000*b1cdbd2cSJim Jagielski }
1001*b1cdbd2cSJim Jagielski 
BckCreate(SdrDragStat &)1002*b1cdbd2cSJim Jagielski FASTBOOL SdrMeasureObj::BckCreate(SdrDragStat& /*rStat*/)
1003*b1cdbd2cSJim Jagielski {
1004*b1cdbd2cSJim Jagielski 	return sal_False;
1005*b1cdbd2cSJim Jagielski }
1006*b1cdbd2cSJim Jagielski 
BrkCreate(SdrDragStat &)1007*b1cdbd2cSJim Jagielski void SdrMeasureObj::BrkCreate(SdrDragStat& /*rStat*/)
1008*b1cdbd2cSJim Jagielski {
1009*b1cdbd2cSJim Jagielski }
1010*b1cdbd2cSJim Jagielski 
TakeCreatePoly(const SdrDragStat &) const1011*b1cdbd2cSJim Jagielski basegfx::B2DPolyPolygon SdrMeasureObj::TakeCreatePoly(const SdrDragStat& /*rDrag*/) const
1012*b1cdbd2cSJim Jagielski {
1013*b1cdbd2cSJim Jagielski 	ImpMeasureRec aRec;
1014*b1cdbd2cSJim Jagielski 	ImpMeasurePoly aMPol;
1015*b1cdbd2cSJim Jagielski 
1016*b1cdbd2cSJim Jagielski 	ImpTakeAttr(aRec);
1017*b1cdbd2cSJim Jagielski 	ImpCalcGeometrics(aRec, aMPol);
1018*b1cdbd2cSJim Jagielski 
1019*b1cdbd2cSJim Jagielski 	return ImpCalcXPoly(aMPol);
1020*b1cdbd2cSJim Jagielski }
1021*b1cdbd2cSJim Jagielski 
GetCreatePointer() const1022*b1cdbd2cSJim Jagielski Pointer SdrMeasureObj::GetCreatePointer() const
1023*b1cdbd2cSJim Jagielski {
1024*b1cdbd2cSJim Jagielski 	return Pointer(POINTER_CROSS);
1025*b1cdbd2cSJim Jagielski }
1026*b1cdbd2cSJim Jagielski 
NbcMove(const Size & rSiz)1027*b1cdbd2cSJim Jagielski void SdrMeasureObj::NbcMove(const Size& rSiz)
1028*b1cdbd2cSJim Jagielski {
1029*b1cdbd2cSJim Jagielski 	SdrTextObj::NbcMove(rSiz);
1030*b1cdbd2cSJim Jagielski 	MovePoint(aPt1,rSiz);
1031*b1cdbd2cSJim Jagielski 	MovePoint(aPt2,rSiz);
1032*b1cdbd2cSJim Jagielski }
1033*b1cdbd2cSJim Jagielski 
NbcResize(const Point & rRef,const Fraction & xFact,const Fraction & yFact)1034*b1cdbd2cSJim Jagielski void SdrMeasureObj::NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact)
1035*b1cdbd2cSJim Jagielski {
1036*b1cdbd2cSJim Jagielski 	SdrTextObj::NbcResize(rRef,xFact,yFact);
1037*b1cdbd2cSJim Jagielski 	ResizePoint(aPt1,rRef,xFact,yFact);
1038*b1cdbd2cSJim Jagielski 	ResizePoint(aPt2,rRef,xFact,yFact);
1039*b1cdbd2cSJim Jagielski 	SetTextDirty();
1040*b1cdbd2cSJim Jagielski }
1041*b1cdbd2cSJim Jagielski 
NbcRotate(const Point & rRef,long nWink,double sn,double cs)1042*b1cdbd2cSJim Jagielski void SdrMeasureObj::NbcRotate(const Point& rRef, long nWink, double sn, double cs)
1043*b1cdbd2cSJim Jagielski {
1044*b1cdbd2cSJim Jagielski 	SdrTextObj::NbcRotate(rRef,nWink,sn,cs);
1045*b1cdbd2cSJim Jagielski 	long nLen0=GetLen(aPt2-aPt1);
1046*b1cdbd2cSJim Jagielski 	RotatePoint(aPt1,rRef,sn,cs);
1047*b1cdbd2cSJim Jagielski 	RotatePoint(aPt2,rRef,sn,cs);
1048*b1cdbd2cSJim Jagielski 	long nLen1=GetLen(aPt2-aPt1);
1049*b1cdbd2cSJim Jagielski 	if (nLen1!=nLen0) { // Aha, Rundungsfehler
1050*b1cdbd2cSJim Jagielski 		long dx=aPt2.X()-aPt1.X();
1051*b1cdbd2cSJim Jagielski 		long dy=aPt2.Y()-aPt1.Y();
1052*b1cdbd2cSJim Jagielski 		dx=BigMulDiv(dx,nLen0,nLen1);
1053*b1cdbd2cSJim Jagielski 		dy=BigMulDiv(dy,nLen0,nLen1);
1054*b1cdbd2cSJim Jagielski 		if (rRef==aPt2) {
1055*b1cdbd2cSJim Jagielski 			aPt1.X()=aPt2.X()-dx;
1056*b1cdbd2cSJim Jagielski 			aPt1.Y()=aPt2.Y()-dy;
1057*b1cdbd2cSJim Jagielski 		} else {
1058*b1cdbd2cSJim Jagielski 			aPt2.X()=aPt1.X()+dx;
1059*b1cdbd2cSJim Jagielski 			aPt2.Y()=aPt1.Y()+dy;
1060*b1cdbd2cSJim Jagielski 		}
1061*b1cdbd2cSJim Jagielski 	}
1062*b1cdbd2cSJim Jagielski 	SetRectsDirty();
1063*b1cdbd2cSJim Jagielski }
1064*b1cdbd2cSJim Jagielski 
NbcMirror(const Point & rRef1,const Point & rRef2)1065*b1cdbd2cSJim Jagielski void SdrMeasureObj::NbcMirror(const Point& rRef1, const Point& rRef2)
1066*b1cdbd2cSJim Jagielski {
1067*b1cdbd2cSJim Jagielski 	SdrTextObj::NbcMirror(rRef1,rRef2);
1068*b1cdbd2cSJim Jagielski 	MirrorPoint(aPt1,rRef1,rRef2);
1069*b1cdbd2cSJim Jagielski 	MirrorPoint(aPt2,rRef1,rRef2);
1070*b1cdbd2cSJim Jagielski 	SetRectsDirty();
1071*b1cdbd2cSJim Jagielski }
1072*b1cdbd2cSJim Jagielski 
NbcShear(const Point & rRef,long nWink,double tn,FASTBOOL bVShear)1073*b1cdbd2cSJim Jagielski void SdrMeasureObj::NbcShear(const Point& rRef, long nWink, double tn, FASTBOOL bVShear)
1074*b1cdbd2cSJim Jagielski {
1075*b1cdbd2cSJim Jagielski 	SdrTextObj::NbcShear(rRef,nWink,tn,bVShear);
1076*b1cdbd2cSJim Jagielski 	ShearPoint(aPt1,rRef,tn,bVShear);
1077*b1cdbd2cSJim Jagielski 	ShearPoint(aPt2,rRef,tn,bVShear);
1078*b1cdbd2cSJim Jagielski 	SetRectsDirty();
1079*b1cdbd2cSJim Jagielski 	SetTextDirty();
1080*b1cdbd2cSJim Jagielski }
1081*b1cdbd2cSJim Jagielski 
GetRotateAngle() const1082*b1cdbd2cSJim Jagielski long SdrMeasureObj::GetRotateAngle() const
1083*b1cdbd2cSJim Jagielski {
1084*b1cdbd2cSJim Jagielski 	return GetAngle(aPt2-aPt1);
1085*b1cdbd2cSJim Jagielski }
1086*b1cdbd2cSJim Jagielski 
RecalcSnapRect()1087*b1cdbd2cSJim Jagielski void SdrMeasureObj::RecalcSnapRect()
1088*b1cdbd2cSJim Jagielski {
1089*b1cdbd2cSJim Jagielski 	// #94520# Added correct implementation here.
1090*b1cdbd2cSJim Jagielski 	ImpMeasureRec aRec;
1091*b1cdbd2cSJim Jagielski 	ImpMeasurePoly aMPol;
1092*b1cdbd2cSJim Jagielski 	XPolyPolygon aXPP;
1093*b1cdbd2cSJim Jagielski 
1094*b1cdbd2cSJim Jagielski 	ImpTakeAttr(aRec);
1095*b1cdbd2cSJim Jagielski 	ImpCalcGeometrics(aRec, aMPol);
1096*b1cdbd2cSJim Jagielski 	aXPP = XPolyPolygon(ImpCalcXPoly(aMPol));
1097*b1cdbd2cSJim Jagielski 	maSnapRect = aXPP.GetBoundRect();
1098*b1cdbd2cSJim Jagielski }
1099*b1cdbd2cSJim Jagielski 
GetSnapPointCount() const1100*b1cdbd2cSJim Jagielski sal_uInt32 SdrMeasureObj::GetSnapPointCount() const
1101*b1cdbd2cSJim Jagielski {
1102*b1cdbd2cSJim Jagielski 	return 2L;
1103*b1cdbd2cSJim Jagielski }
1104*b1cdbd2cSJim Jagielski 
GetSnapPoint(sal_uInt32 i) const1105*b1cdbd2cSJim Jagielski Point SdrMeasureObj::GetSnapPoint(sal_uInt32 i) const
1106*b1cdbd2cSJim Jagielski {
1107*b1cdbd2cSJim Jagielski 	if (i==0) return aPt1;
1108*b1cdbd2cSJim Jagielski 	else return aPt2;
1109*b1cdbd2cSJim Jagielski }
1110*b1cdbd2cSJim Jagielski 
IsPolyObj() const1111*b1cdbd2cSJim Jagielski sal_Bool SdrMeasureObj::IsPolyObj() const
1112*b1cdbd2cSJim Jagielski {
1113*b1cdbd2cSJim Jagielski 	return sal_True;
1114*b1cdbd2cSJim Jagielski }
1115*b1cdbd2cSJim Jagielski 
GetPointCount() const1116*b1cdbd2cSJim Jagielski sal_uInt32 SdrMeasureObj::GetPointCount() const
1117*b1cdbd2cSJim Jagielski {
1118*b1cdbd2cSJim Jagielski 	return 2L;
1119*b1cdbd2cSJim Jagielski }
1120*b1cdbd2cSJim Jagielski 
GetPoint(sal_uInt32 i) const1121*b1cdbd2cSJim Jagielski Point SdrMeasureObj::GetPoint(sal_uInt32 i) const
1122*b1cdbd2cSJim Jagielski {
1123*b1cdbd2cSJim Jagielski 	 return (0L == i) ? aPt1 : aPt2;
1124*b1cdbd2cSJim Jagielski }
1125*b1cdbd2cSJim Jagielski 
NbcSetPoint(const Point & rPnt,sal_uInt32 i)1126*b1cdbd2cSJim Jagielski void SdrMeasureObj::NbcSetPoint(const Point& rPnt, sal_uInt32 i)
1127*b1cdbd2cSJim Jagielski {
1128*b1cdbd2cSJim Jagielski 	if (0L == i)
1129*b1cdbd2cSJim Jagielski 		aPt1=rPnt;
1130*b1cdbd2cSJim Jagielski 	if (1L == i)
1131*b1cdbd2cSJim Jagielski 		aPt2=rPnt;
1132*b1cdbd2cSJim Jagielski 	SetRectsDirty();
1133*b1cdbd2cSJim Jagielski 	SetTextDirty();
1134*b1cdbd2cSJim Jagielski }
1135*b1cdbd2cSJim Jagielski 
NewGeoData() const1136*b1cdbd2cSJim Jagielski SdrObjGeoData* SdrMeasureObj::NewGeoData() const
1137*b1cdbd2cSJim Jagielski {
1138*b1cdbd2cSJim Jagielski 	return new SdrMeasureObjGeoData;
1139*b1cdbd2cSJim Jagielski }
1140*b1cdbd2cSJim Jagielski 
SaveGeoData(SdrObjGeoData & rGeo) const1141*b1cdbd2cSJim Jagielski void SdrMeasureObj::SaveGeoData(SdrObjGeoData& rGeo) const
1142*b1cdbd2cSJim Jagielski {
1143*b1cdbd2cSJim Jagielski 	SdrTextObj::SaveGeoData(rGeo);
1144*b1cdbd2cSJim Jagielski 	SdrMeasureObjGeoData& rMGeo=(SdrMeasureObjGeoData&)rGeo;
1145*b1cdbd2cSJim Jagielski 	rMGeo.aPt1=aPt1;
1146*b1cdbd2cSJim Jagielski 	rMGeo.aPt2=aPt2;
1147*b1cdbd2cSJim Jagielski }
1148*b1cdbd2cSJim Jagielski 
RestGeoData(const SdrObjGeoData & rGeo)1149*b1cdbd2cSJim Jagielski void SdrMeasureObj::RestGeoData(const SdrObjGeoData& rGeo)
1150*b1cdbd2cSJim Jagielski {
1151*b1cdbd2cSJim Jagielski 	SdrTextObj::RestGeoData(rGeo);
1152*b1cdbd2cSJim Jagielski 	SdrMeasureObjGeoData& rMGeo=(SdrMeasureObjGeoData&)rGeo;
1153*b1cdbd2cSJim Jagielski 	aPt1=rMGeo.aPt1;
1154*b1cdbd2cSJim Jagielski 	aPt2=rMGeo.aPt2;
1155*b1cdbd2cSJim Jagielski 	SetTextDirty();
1156*b1cdbd2cSJim Jagielski }
1157*b1cdbd2cSJim Jagielski 
DoConvertToPolyObj(sal_Bool bBezier,bool bAddText) const1158*b1cdbd2cSJim Jagielski SdrObject* SdrMeasureObj::DoConvertToPolyObj(sal_Bool bBezier, bool bAddText) const
1159*b1cdbd2cSJim Jagielski {
1160*b1cdbd2cSJim Jagielski 	// get XOR Poly as base
1161*b1cdbd2cSJim Jagielski 	XPolyPolygon aTmpPolyPolygon(TakeXorPoly());
1162*b1cdbd2cSJim Jagielski 
1163*b1cdbd2cSJim Jagielski 	// get local ItemSet and StyleSheet
1164*b1cdbd2cSJim Jagielski 	SfxItemSet aSet(GetObjectItemSet());
1165*b1cdbd2cSJim Jagielski     SfxStyleSheet* pStyleSheet = GetStyleSheet();
1166*b1cdbd2cSJim Jagielski 
1167*b1cdbd2cSJim Jagielski     // prepare group
1168*b1cdbd2cSJim Jagielski 	SdrObjGroup* pGroup = new SdrObjGroup;
1169*b1cdbd2cSJim Jagielski 	pGroup->SetModel(GetModel());
1170*b1cdbd2cSJim Jagielski 
1171*b1cdbd2cSJim Jagielski 	// prepare parameters
1172*b1cdbd2cSJim Jagielski 	basegfx::B2DPolyPolygon aPolyPoly;
1173*b1cdbd2cSJim Jagielski 	SdrPathObj* pPath;
1174*b1cdbd2cSJim Jagielski 	sal_uInt16 nCount(aTmpPolyPolygon.Count());
1175*b1cdbd2cSJim Jagielski 	sal_uInt16 nLoopStart(0);
1176*b1cdbd2cSJim Jagielski 
1177*b1cdbd2cSJim Jagielski 	if(nCount == 3)
1178*b1cdbd2cSJim Jagielski 	{
1179*b1cdbd2cSJim Jagielski 		// three lines, first one is the middle one
1180*b1cdbd2cSJim Jagielski 		aPolyPoly.clear();
1181*b1cdbd2cSJim Jagielski 		aPolyPoly.append(aTmpPolyPolygon[0].getB2DPolygon());
1182*b1cdbd2cSJim Jagielski 
1183*b1cdbd2cSJim Jagielski 		pPath = new SdrPathObj(OBJ_PATHLINE, aPolyPoly);
1184*b1cdbd2cSJim Jagielski 		pPath->SetModel(GetModel());
1185*b1cdbd2cSJim Jagielski 		pPath->SetMergedItemSet(aSet);
1186*b1cdbd2cSJim Jagielski         pPath->SetStyleSheet(pStyleSheet, true);
1187*b1cdbd2cSJim Jagielski 		pGroup->GetSubList()->NbcInsertObject(pPath);
1188*b1cdbd2cSJim Jagielski 		aSet.Put(XLineStartWidthItem(0L));
1189*b1cdbd2cSJim Jagielski 		aSet.Put(XLineEndWidthItem(0L));
1190*b1cdbd2cSJim Jagielski 		nLoopStart = 1;
1191*b1cdbd2cSJim Jagielski 	}
1192*b1cdbd2cSJim Jagielski 	else if(nCount == 4)
1193*b1cdbd2cSJim Jagielski 	{
1194*b1cdbd2cSJim Jagielski 		// four lines, middle line with gap, so there are two lines used
1195*b1cdbd2cSJim Jagielski 		// which have one arrow each
1196*b1cdbd2cSJim Jagielski 		//sal_Int32 nStartWidth = ((const XLineStartWidthItem&)(aSet.Get(XATTR_LINESTARTWIDTH))).GetValue();
1197*b1cdbd2cSJim Jagielski 		sal_Int32 nEndWidth = ((const XLineEndWidthItem&)(aSet.Get(XATTR_LINEENDWIDTH))).GetValue();
1198*b1cdbd2cSJim Jagielski 		aSet.Put(XLineEndWidthItem(0L));
1199*b1cdbd2cSJim Jagielski 
1200*b1cdbd2cSJim Jagielski 		aPolyPoly.clear();
1201*b1cdbd2cSJim Jagielski 		aPolyPoly.append(aTmpPolyPolygon[0].getB2DPolygon());
1202*b1cdbd2cSJim Jagielski 		pPath = new SdrPathObj(OBJ_PATHLINE, aPolyPoly);
1203*b1cdbd2cSJim Jagielski 		pPath->SetModel(GetModel());
1204*b1cdbd2cSJim Jagielski 		pPath->SetMergedItemSet(aSet);
1205*b1cdbd2cSJim Jagielski         pPath->SetStyleSheet(pStyleSheet, true);
1206*b1cdbd2cSJim Jagielski 
1207*b1cdbd2cSJim Jagielski 		pGroup->GetSubList()->NbcInsertObject(pPath);
1208*b1cdbd2cSJim Jagielski 
1209*b1cdbd2cSJim Jagielski 		aSet.Put(XLineEndWidthItem(nEndWidth));
1210*b1cdbd2cSJim Jagielski 		aSet.Put(XLineStartWidthItem(0L));
1211*b1cdbd2cSJim Jagielski 
1212*b1cdbd2cSJim Jagielski 		aPolyPoly.clear();
1213*b1cdbd2cSJim Jagielski 		aPolyPoly.append(aTmpPolyPolygon[1].getB2DPolygon());
1214*b1cdbd2cSJim Jagielski 		pPath = new SdrPathObj(OBJ_PATHLINE, aPolyPoly);
1215*b1cdbd2cSJim Jagielski 		pPath->SetModel(GetModel());
1216*b1cdbd2cSJim Jagielski 		pPath->SetMergedItemSet(aSet);
1217*b1cdbd2cSJim Jagielski         pPath->SetStyleSheet(pStyleSheet, true);
1218*b1cdbd2cSJim Jagielski 
1219*b1cdbd2cSJim Jagielski 		pGroup->GetSubList()->NbcInsertObject(pPath);
1220*b1cdbd2cSJim Jagielski 
1221*b1cdbd2cSJim Jagielski 		aSet.Put(XLineEndWidthItem(0L));
1222*b1cdbd2cSJim Jagielski 		nLoopStart = 2;
1223*b1cdbd2cSJim Jagielski 	}
1224*b1cdbd2cSJim Jagielski 	else if(nCount == 5)
1225*b1cdbd2cSJim Jagielski 	{
1226*b1cdbd2cSJim Jagielski 		// five lines, first two are the outer ones
1227*b1cdbd2cSJim Jagielski 		//sal_Int32 nStartWidth = ((const XLineStartWidthItem&)(aSet.Get(XATTR_LINESTARTWIDTH))).GetValue();
1228*b1cdbd2cSJim Jagielski 		sal_Int32 nEndWidth = ((const XLineEndWidthItem&)(aSet.Get(XATTR_LINEENDWIDTH))).GetValue();
1229*b1cdbd2cSJim Jagielski 
1230*b1cdbd2cSJim Jagielski 		aSet.Put(XLineEndWidthItem(0L));
1231*b1cdbd2cSJim Jagielski 
1232*b1cdbd2cSJim Jagielski 		aPolyPoly.clear();
1233*b1cdbd2cSJim Jagielski 		aPolyPoly.append(aTmpPolyPolygon[0].getB2DPolygon());
1234*b1cdbd2cSJim Jagielski 		pPath = new SdrPathObj(OBJ_PATHLINE, aPolyPoly);
1235*b1cdbd2cSJim Jagielski 		pPath->SetModel(GetModel());
1236*b1cdbd2cSJim Jagielski 		pPath->SetMergedItemSet(aSet);
1237*b1cdbd2cSJim Jagielski         pPath->SetStyleSheet(pStyleSheet, true);
1238*b1cdbd2cSJim Jagielski 
1239*b1cdbd2cSJim Jagielski 		pGroup->GetSubList()->NbcInsertObject(pPath);
1240*b1cdbd2cSJim Jagielski 
1241*b1cdbd2cSJim Jagielski 		aSet.Put(XLineEndWidthItem(nEndWidth));
1242*b1cdbd2cSJim Jagielski 		aSet.Put(XLineStartWidthItem(0L));
1243*b1cdbd2cSJim Jagielski 
1244*b1cdbd2cSJim Jagielski 		aPolyPoly.clear();
1245*b1cdbd2cSJim Jagielski 		aPolyPoly.append(aTmpPolyPolygon[1].getB2DPolygon());
1246*b1cdbd2cSJim Jagielski 		pPath = new SdrPathObj(OBJ_PATHLINE, aPolyPoly);
1247*b1cdbd2cSJim Jagielski 		pPath->SetModel(GetModel());
1248*b1cdbd2cSJim Jagielski 		pPath->SetMergedItemSet(aSet);
1249*b1cdbd2cSJim Jagielski         pPath->SetStyleSheet(pStyleSheet, true);
1250*b1cdbd2cSJim Jagielski 
1251*b1cdbd2cSJim Jagielski 		pGroup->GetSubList()->NbcInsertObject(pPath);
1252*b1cdbd2cSJim Jagielski 
1253*b1cdbd2cSJim Jagielski 		aSet.Put(XLineEndWidthItem(0L));
1254*b1cdbd2cSJim Jagielski 		nLoopStart = 2;
1255*b1cdbd2cSJim Jagielski 	}
1256*b1cdbd2cSJim Jagielski 
1257*b1cdbd2cSJim Jagielski 	for(;nLoopStart<nCount;nLoopStart++)
1258*b1cdbd2cSJim Jagielski 	{
1259*b1cdbd2cSJim Jagielski 		aPolyPoly.clear();
1260*b1cdbd2cSJim Jagielski 		aPolyPoly.append(aTmpPolyPolygon[nLoopStart].getB2DPolygon());
1261*b1cdbd2cSJim Jagielski 		pPath = new SdrPathObj(OBJ_PATHLINE, aPolyPoly);
1262*b1cdbd2cSJim Jagielski 		pPath->SetModel(GetModel());
1263*b1cdbd2cSJim Jagielski 		pPath->SetMergedItemSet(aSet);
1264*b1cdbd2cSJim Jagielski         pPath->SetStyleSheet(pStyleSheet, true);
1265*b1cdbd2cSJim Jagielski 
1266*b1cdbd2cSJim Jagielski 		pGroup->GetSubList()->NbcInsertObject(pPath);
1267*b1cdbd2cSJim Jagielski 	}
1268*b1cdbd2cSJim Jagielski 
1269*b1cdbd2cSJim Jagielski     if(bAddText)
1270*b1cdbd2cSJim Jagielski     {
1271*b1cdbd2cSJim Jagielski     	return ImpConvertAddText(pGroup, bBezier);
1272*b1cdbd2cSJim Jagielski     }
1273*b1cdbd2cSJim Jagielski     else
1274*b1cdbd2cSJim Jagielski     {
1275*b1cdbd2cSJim Jagielski     	return pGroup;
1276*b1cdbd2cSJim Jagielski     }
1277*b1cdbd2cSJim Jagielski }
1278*b1cdbd2cSJim Jagielski 
BegTextEdit(SdrOutliner & rOutl)1279*b1cdbd2cSJim Jagielski sal_Bool SdrMeasureObj::BegTextEdit(SdrOutliner& rOutl)
1280*b1cdbd2cSJim Jagielski {
1281*b1cdbd2cSJim Jagielski 	UndirtyText();
1282*b1cdbd2cSJim Jagielski 	return SdrTextObj::BegTextEdit(rOutl);
1283*b1cdbd2cSJim Jagielski }
1284*b1cdbd2cSJim Jagielski 
GetTextSize() const1285*b1cdbd2cSJim Jagielski const Size& SdrMeasureObj::GetTextSize() const
1286*b1cdbd2cSJim Jagielski {
1287*b1cdbd2cSJim Jagielski 	if (bTextDirty) UndirtyText();
1288*b1cdbd2cSJim Jagielski 	return SdrTextObj::GetTextSize();
1289*b1cdbd2cSJim Jagielski }
1290*b1cdbd2cSJim Jagielski 
GetOutlinerParaObject() const1291*b1cdbd2cSJim Jagielski OutlinerParaObject* SdrMeasureObj::GetOutlinerParaObject() const
1292*b1cdbd2cSJim Jagielski {
1293*b1cdbd2cSJim Jagielski 	if(bTextDirty)
1294*b1cdbd2cSJim Jagielski 		UndirtyText();
1295*b1cdbd2cSJim Jagielski 	return SdrTextObj::GetOutlinerParaObject();
1296*b1cdbd2cSJim Jagielski }
1297*b1cdbd2cSJim Jagielski 
NbcSetOutlinerParaObject(OutlinerParaObject * pTextObject)1298*b1cdbd2cSJim Jagielski void SdrMeasureObj::NbcSetOutlinerParaObject(OutlinerParaObject* pTextObject)
1299*b1cdbd2cSJim Jagielski {
1300*b1cdbd2cSJim Jagielski 	SdrTextObj::NbcSetOutlinerParaObject(pTextObject);
1301*b1cdbd2cSJim Jagielski 	if(SdrTextObj::GetOutlinerParaObject())
1302*b1cdbd2cSJim Jagielski 		SetTextDirty(); // Text neu berechnen!
1303*b1cdbd2cSJim Jagielski }
1304*b1cdbd2cSJim Jagielski 
TakeTextRect(SdrOutliner & rOutliner,Rectangle & rTextRect,FASTBOOL bNoEditText,Rectangle * pAnchorRect,sal_Bool bLineWidth) const1305*b1cdbd2cSJim Jagielski void SdrMeasureObj::TakeTextRect( SdrOutliner& rOutliner, Rectangle& rTextRect, FASTBOOL bNoEditText,
1306*b1cdbd2cSJim Jagielski 	Rectangle* pAnchorRect, sal_Bool bLineWidth ) const
1307*b1cdbd2cSJim Jagielski {
1308*b1cdbd2cSJim Jagielski 	if (bTextDirty) UndirtyText();
1309*b1cdbd2cSJim Jagielski 	SdrTextObj::TakeTextRect( rOutliner, rTextRect, bNoEditText, pAnchorRect, bLineWidth );
1310*b1cdbd2cSJim Jagielski }
1311*b1cdbd2cSJim Jagielski 
TakeTextAnchorRect(Rectangle & rAnchorRect) const1312*b1cdbd2cSJim Jagielski void SdrMeasureObj::TakeTextAnchorRect(Rectangle& rAnchorRect) const
1313*b1cdbd2cSJim Jagielski {
1314*b1cdbd2cSJim Jagielski 	if (bTextDirty) UndirtyText();
1315*b1cdbd2cSJim Jagielski 	SdrTextObj::TakeTextAnchorRect(rAnchorRect);
1316*b1cdbd2cSJim Jagielski }
1317*b1cdbd2cSJim Jagielski 
TakeTextEditArea(Size * pPaperMin,Size * pPaperMax,Rectangle * pViewInit,Rectangle * pViewMin) const1318*b1cdbd2cSJim Jagielski void SdrMeasureObj::TakeTextEditArea(Size* pPaperMin, Size* pPaperMax, Rectangle* pViewInit, Rectangle* pViewMin) const
1319*b1cdbd2cSJim Jagielski {
1320*b1cdbd2cSJim Jagielski 	if (bTextDirty) UndirtyText();
1321*b1cdbd2cSJim Jagielski 	SdrTextObj::TakeTextEditArea(pPaperMin,pPaperMax,pViewInit,pViewMin);
1322*b1cdbd2cSJim Jagielski }
1323*b1cdbd2cSJim Jagielski 
GetOutlinerViewAnchorMode() const1324*b1cdbd2cSJim Jagielski sal_uInt16 SdrMeasureObj::GetOutlinerViewAnchorMode() const
1325*b1cdbd2cSJim Jagielski {
1326*b1cdbd2cSJim Jagielski 	if (bTextDirty) UndirtyText();
1327*b1cdbd2cSJim Jagielski 	ImpMeasureRec aRec;
1328*b1cdbd2cSJim Jagielski 	ImpMeasurePoly aMPol;
1329*b1cdbd2cSJim Jagielski 	ImpTakeAttr(aRec);
1330*b1cdbd2cSJim Jagielski 	ImpCalcGeometrics(aRec,aMPol);
1331*b1cdbd2cSJim Jagielski 
1332*b1cdbd2cSJim Jagielski 	SdrTextHorzAdjust eTH=GetTextHorizontalAdjust();
1333*b1cdbd2cSJim Jagielski 	SdrTextVertAdjust eTV=GetTextVerticalAdjust();
1334*b1cdbd2cSJim Jagielski 	SdrMeasureTextHPos eMH=aMPol.eUsedTextHPos;
1335*b1cdbd2cSJim Jagielski 	SdrMeasureTextVPos eMV=aMPol.eUsedTextVPos;
1336*b1cdbd2cSJim Jagielski 	FASTBOOL bTextRota90=aRec.bTextRota90;
1337*b1cdbd2cSJim Jagielski 	//int bTextUpsideDown=aRec.bTextUpsideDown;
1338*b1cdbd2cSJim Jagielski 	FASTBOOL bBelowRefEdge=aRec.bBelowRefEdge;
1339*b1cdbd2cSJim Jagielski 
1340*b1cdbd2cSJim Jagielski 	// bTextUpsideDown muss hier noch ausgewertet werden!!!!
1341*b1cdbd2cSJim Jagielski 	if (!bTextRota90) {
1342*b1cdbd2cSJim Jagielski 		if (eMH==SDRMEASURE_TEXTLEFTOUTSIDE) eTH=SDRTEXTHORZADJUST_RIGHT;
1343*b1cdbd2cSJim Jagielski 		if (eMH==SDRMEASURE_TEXTRIGHTOUTSIDE) eTH=SDRTEXTHORZADJUST_LEFT;
1344*b1cdbd2cSJim Jagielski 		// bei eMH==SDRMEASURE_TEXTINSIDE kann horizontal geankert werden.
1345*b1cdbd2cSJim Jagielski 		if (eMV==SDRMEASURE_ABOVE) eTV=SDRTEXTVERTADJUST_BOTTOM;
1346*b1cdbd2cSJim Jagielski 		if (eMV==SDRMEASURE_BELOW) eTV=SDRTEXTVERTADJUST_TOP;
1347*b1cdbd2cSJim Jagielski 		if (eMV==SDRMEASURETEXT_BREAKEDLINE || eMV==SDRMEASURETEXT_VERTICALCENTERED) eTV=SDRTEXTVERTADJUST_CENTER;
1348*b1cdbd2cSJim Jagielski 	} else {
1349*b1cdbd2cSJim Jagielski 		if (eMH==SDRMEASURE_TEXTLEFTOUTSIDE) eTV=SDRTEXTVERTADJUST_BOTTOM;
1350*b1cdbd2cSJim Jagielski 		if (eMH==SDRMEASURE_TEXTRIGHTOUTSIDE) eTV=SDRTEXTVERTADJUST_TOP;
1351*b1cdbd2cSJim Jagielski 		// bei eMH==SDRMEASURE_TEXTINSIDE kann vertikal geankert werden.
1352*b1cdbd2cSJim Jagielski 		if (!bBelowRefEdge) {
1353*b1cdbd2cSJim Jagielski 			if (eMV==SDRMEASURE_ABOVE) eTH=SDRTEXTHORZADJUST_LEFT;
1354*b1cdbd2cSJim Jagielski 			if (eMV==SDRMEASURE_BELOW) eTH=SDRTEXTHORZADJUST_RIGHT;
1355*b1cdbd2cSJim Jagielski 		} else {
1356*b1cdbd2cSJim Jagielski 			if (eMV==SDRMEASURE_ABOVE) eTH=SDRTEXTHORZADJUST_RIGHT;
1357*b1cdbd2cSJim Jagielski 			if (eMV==SDRMEASURE_BELOW) eTH=SDRTEXTHORZADJUST_LEFT;
1358*b1cdbd2cSJim Jagielski 		}
1359*b1cdbd2cSJim Jagielski 		if (eMV==SDRMEASURETEXT_BREAKEDLINE || eMV==SDRMEASURETEXT_VERTICALCENTERED) eTH=SDRTEXTHORZADJUST_CENTER;
1360*b1cdbd2cSJim Jagielski 	}
1361*b1cdbd2cSJim Jagielski 
1362*b1cdbd2cSJim Jagielski 	EVAnchorMode eRet=ANCHOR_BOTTOM_HCENTER;
1363*b1cdbd2cSJim Jagielski 	if (eTH==SDRTEXTHORZADJUST_LEFT) {
1364*b1cdbd2cSJim Jagielski 		if (eTV==SDRTEXTVERTADJUST_TOP) eRet=ANCHOR_TOP_LEFT;
1365*b1cdbd2cSJim Jagielski 		else if (eTV==SDRTEXTVERTADJUST_BOTTOM) eRet=ANCHOR_BOTTOM_LEFT;
1366*b1cdbd2cSJim Jagielski 		else eRet=ANCHOR_VCENTER_LEFT;
1367*b1cdbd2cSJim Jagielski 	} else if (eTH==SDRTEXTHORZADJUST_RIGHT) {
1368*b1cdbd2cSJim Jagielski 		if (eTV==SDRTEXTVERTADJUST_TOP) eRet=ANCHOR_TOP_RIGHT;
1369*b1cdbd2cSJim Jagielski 		else if (eTV==SDRTEXTVERTADJUST_BOTTOM) eRet=ANCHOR_BOTTOM_RIGHT;
1370*b1cdbd2cSJim Jagielski 		else eRet=ANCHOR_VCENTER_RIGHT;
1371*b1cdbd2cSJim Jagielski 	} else {
1372*b1cdbd2cSJim Jagielski 		if (eTV==SDRTEXTVERTADJUST_TOP) eRet=ANCHOR_TOP_HCENTER;
1373*b1cdbd2cSJim Jagielski 		else if (eTV==SDRTEXTVERTADJUST_BOTTOM) eRet=ANCHOR_BOTTOM_HCENTER;
1374*b1cdbd2cSJim Jagielski 		else eRet=ANCHOR_VCENTER_HCENTER;
1375*b1cdbd2cSJim Jagielski 	}
1376*b1cdbd2cSJim Jagielski 	return (sal_uInt16)eRet;
1377*b1cdbd2cSJim Jagielski }
1378*b1cdbd2cSJim Jagielski 
1379*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
1380*b1cdbd2cSJim Jagielski // #i97878#
1381*b1cdbd2cSJim Jagielski // TRGetBaseGeometry/TRSetBaseGeometry needs to be based on two positions,
1382*b1cdbd2cSJim Jagielski // same as line geometry in SdrPathObj. Thus needs to be overloaded and
1383*b1cdbd2cSJim Jagielski // implemented since currently it is derived from SdrTextObj which uses
1384*b1cdbd2cSJim Jagielski // a functionality based on SnapRect which is not useful here
1385*b1cdbd2cSJim Jagielski 
ImplTwipsToMM(double fVal)1386*b1cdbd2cSJim Jagielski inline double ImplTwipsToMM(double fVal) { return (fVal * (127.0 / 72.0)); }
ImplMMToTwips(double fVal)1387*b1cdbd2cSJim Jagielski inline double ImplMMToTwips(double fVal) { return (fVal * (72.0 / 127.0)); }
1388*b1cdbd2cSJim Jagielski 
TRGetBaseGeometry(basegfx::B2DHomMatrix & rMatrix,basegfx::B2DPolyPolygon &) const1389*b1cdbd2cSJim Jagielski sal_Bool SdrMeasureObj::TRGetBaseGeometry(basegfx::B2DHomMatrix& rMatrix, basegfx::B2DPolyPolygon& /*rPolyPolygon*/) const
1390*b1cdbd2cSJim Jagielski {
1391*b1cdbd2cSJim Jagielski     // handle the same as a simple line since the definition is based on two points
1392*b1cdbd2cSJim Jagielski     const basegfx::B2DRange aRange(aPt1.X(), aPt1.Y(), aPt2.X(), aPt2.Y());
1393*b1cdbd2cSJim Jagielski 	basegfx::B2DTuple aScale(aRange.getRange());
1394*b1cdbd2cSJim Jagielski     basegfx::B2DTuple aTranslate(aRange.getMinimum());
1395*b1cdbd2cSJim Jagielski 
1396*b1cdbd2cSJim Jagielski 	// position maybe relative to anchorpos, convert
1397*b1cdbd2cSJim Jagielski 	if( pModel->IsWriter() )
1398*b1cdbd2cSJim Jagielski 	{
1399*b1cdbd2cSJim Jagielski 		if(GetAnchorPos().X() || GetAnchorPos().Y())
1400*b1cdbd2cSJim Jagielski 		{
1401*b1cdbd2cSJim Jagielski 			aTranslate -= basegfx::B2DTuple(GetAnchorPos().X(), GetAnchorPos().Y());
1402*b1cdbd2cSJim Jagielski 		}
1403*b1cdbd2cSJim Jagielski 	}
1404*b1cdbd2cSJim Jagielski 
1405*b1cdbd2cSJim Jagielski 	// force MapUnit to 100th mm
1406*b1cdbd2cSJim Jagielski 	SfxMapUnit eMapUnit = pModel->GetItemPool().GetMetric(0);
1407*b1cdbd2cSJim Jagielski 	if(eMapUnit != SFX_MAPUNIT_100TH_MM)
1408*b1cdbd2cSJim Jagielski 	{
1409*b1cdbd2cSJim Jagielski 		switch(eMapUnit)
1410*b1cdbd2cSJim Jagielski 		{
1411*b1cdbd2cSJim Jagielski 			case SFX_MAPUNIT_TWIP :
1412*b1cdbd2cSJim Jagielski 			{
1413*b1cdbd2cSJim Jagielski 				// postion
1414*b1cdbd2cSJim Jagielski 				aTranslate.setX(ImplTwipsToMM(aTranslate.getX()));
1415*b1cdbd2cSJim Jagielski 				aTranslate.setY(ImplTwipsToMM(aTranslate.getY()));
1416*b1cdbd2cSJim Jagielski 
1417*b1cdbd2cSJim Jagielski 				// size
1418*b1cdbd2cSJim Jagielski 				aScale.setX(ImplTwipsToMM(aScale.getX()));
1419*b1cdbd2cSJim Jagielski 				aScale.setY(ImplTwipsToMM(aScale.getY()));
1420*b1cdbd2cSJim Jagielski 
1421*b1cdbd2cSJim Jagielski 				break;
1422*b1cdbd2cSJim Jagielski 			}
1423*b1cdbd2cSJim Jagielski 			default:
1424*b1cdbd2cSJim Jagielski 			{
1425*b1cdbd2cSJim Jagielski 				DBG_ERROR("TRGetBaseGeometry: Missing unit translation to 100th mm!");
1426*b1cdbd2cSJim Jagielski 			}
1427*b1cdbd2cSJim Jagielski 		}
1428*b1cdbd2cSJim Jagielski 	}
1429*b1cdbd2cSJim Jagielski 
1430*b1cdbd2cSJim Jagielski 	// build return value matrix
1431*b1cdbd2cSJim Jagielski 	rMatrix = basegfx::tools::createScaleTranslateB2DHomMatrix(aScale, aTranslate);
1432*b1cdbd2cSJim Jagielski 
1433*b1cdbd2cSJim Jagielski 	return sal_True;
1434*b1cdbd2cSJim Jagielski }
1435*b1cdbd2cSJim Jagielski 
TRSetBaseGeometry(const basegfx::B2DHomMatrix & rMatrix,const basegfx::B2DPolyPolygon &)1436*b1cdbd2cSJim Jagielski void SdrMeasureObj::TRSetBaseGeometry(const basegfx::B2DHomMatrix& rMatrix, const basegfx::B2DPolyPolygon& /*rPolyPolygon*/)
1437*b1cdbd2cSJim Jagielski {
1438*b1cdbd2cSJim Jagielski     // use given transformation to derive the two defining points from unit line
1439*b1cdbd2cSJim Jagielski     basegfx::B2DPoint aPosA(rMatrix * basegfx::B2DPoint(0.0, 0.0));
1440*b1cdbd2cSJim Jagielski     basegfx::B2DPoint aPosB(rMatrix * basegfx::B2DPoint(1.0, 0.0));
1441*b1cdbd2cSJim Jagielski 
1442*b1cdbd2cSJim Jagielski 	// force metric to pool metric
1443*b1cdbd2cSJim Jagielski 	SfxMapUnit eMapUnit = pModel->GetItemPool().GetMetric(0);
1444*b1cdbd2cSJim Jagielski 	if(eMapUnit != SFX_MAPUNIT_100TH_MM)
1445*b1cdbd2cSJim Jagielski 	{
1446*b1cdbd2cSJim Jagielski 		switch(eMapUnit)
1447*b1cdbd2cSJim Jagielski 		{
1448*b1cdbd2cSJim Jagielski 			case SFX_MAPUNIT_TWIP :
1449*b1cdbd2cSJim Jagielski 			{
1450*b1cdbd2cSJim Jagielski 				// position
1451*b1cdbd2cSJim Jagielski                 aPosA.setX(ImplMMToTwips(aPosA.getX()));
1452*b1cdbd2cSJim Jagielski                 aPosA.setY(ImplMMToTwips(aPosA.getY()));
1453*b1cdbd2cSJim Jagielski                 aPosB.setX(ImplMMToTwips(aPosB.getX()));
1454*b1cdbd2cSJim Jagielski                 aPosB.setY(ImplMMToTwips(aPosB.getY()));
1455*b1cdbd2cSJim Jagielski 
1456*b1cdbd2cSJim Jagielski 				break;
1457*b1cdbd2cSJim Jagielski 			}
1458*b1cdbd2cSJim Jagielski 			default:
1459*b1cdbd2cSJim Jagielski 			{
1460*b1cdbd2cSJim Jagielski 				DBG_ERROR("TRSetBaseGeometry: Missing unit translation to PoolMetric!");
1461*b1cdbd2cSJim Jagielski 			}
1462*b1cdbd2cSJim Jagielski 		}
1463*b1cdbd2cSJim Jagielski 	}
1464*b1cdbd2cSJim Jagielski 
1465*b1cdbd2cSJim Jagielski 	if( pModel->IsWriter() )
1466*b1cdbd2cSJim Jagielski 	{
1467*b1cdbd2cSJim Jagielski 		// if anchor is used, make position relative to it
1468*b1cdbd2cSJim Jagielski 		if(GetAnchorPos().X() || GetAnchorPos().Y())
1469*b1cdbd2cSJim Jagielski 		{
1470*b1cdbd2cSJim Jagielski             const basegfx::B2DVector aAnchorOffset(GetAnchorPos().X(), GetAnchorPos().Y());
1471*b1cdbd2cSJim Jagielski 
1472*b1cdbd2cSJim Jagielski             aPosA += aAnchorOffset;
1473*b1cdbd2cSJim Jagielski             aPosB += aAnchorOffset;
1474*b1cdbd2cSJim Jagielski 		}
1475*b1cdbd2cSJim Jagielski 	}
1476*b1cdbd2cSJim Jagielski 
1477*b1cdbd2cSJim Jagielski     // derive new model data
1478*b1cdbd2cSJim Jagielski     const Point aNewPt1(basegfx::fround(aPosA.getX()), basegfx::fround(aPosA.getY()));
1479*b1cdbd2cSJim Jagielski     const Point aNewPt2(basegfx::fround(aPosB.getX()), basegfx::fround(aPosB.getY()));
1480*b1cdbd2cSJim Jagielski 
1481*b1cdbd2cSJim Jagielski     if(aNewPt1 != aPt1 || aNewPt2 != aPt2)
1482*b1cdbd2cSJim Jagielski     {
1483*b1cdbd2cSJim Jagielski         // set model values and broadcast
1484*b1cdbd2cSJim Jagielski 		Rectangle aBoundRect0; if (pUserCall!=NULL) aBoundRect0=GetLastBoundRect();
1485*b1cdbd2cSJim Jagielski 
1486*b1cdbd2cSJim Jagielski         aPt1 = aNewPt1;
1487*b1cdbd2cSJim Jagielski         aPt2 = aNewPt2;
1488*b1cdbd2cSJim Jagielski 
1489*b1cdbd2cSJim Jagielski         SetTextDirty();
1490*b1cdbd2cSJim Jagielski         ActionChanged();
1491*b1cdbd2cSJim Jagielski 		SetChanged();
1492*b1cdbd2cSJim Jagielski 		BroadcastObjectChange();
1493*b1cdbd2cSJim Jagielski 		SendUserCall(SDRUSERCALL_MOVEONLY,aBoundRect0);
1494*b1cdbd2cSJim Jagielski     }
1495*b1cdbd2cSJim Jagielski }
1496*b1cdbd2cSJim Jagielski 
1497*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
1498*b1cdbd2cSJim Jagielski // eof
1499