xref: /AOO41X/main/svx/source/svdraw/svdotext.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_svx.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir #include <svx/svdotext.hxx>
32*cdf0e10cSrcweir #include "svx/svditext.hxx"
33*cdf0e10cSrcweir #include <svx/svdpagv.hxx>  // fuer Abfrage im Paint, ob das
34*cdf0e10cSrcweir #include <svx/svdview.hxx>  // Objekt gerade editiert wird
35*cdf0e10cSrcweir #include <svx/svdpage.hxx>  // und fuer AnimationHandler (Laufschrift)
36*cdf0e10cSrcweir #include <svx/svdetc.hxx>
37*cdf0e10cSrcweir #include <svx/svdoutl.hxx>
38*cdf0e10cSrcweir #include <svx/svdmodel.hxx>  // OutlinerDefaults
39*cdf0e10cSrcweir #include "svx/svdglob.hxx"  // Stringcache
40*cdf0e10cSrcweir #include "svx/svdstr.hrc"   // Objektname
41*cdf0e10cSrcweir #include <editeng/writingmodeitem.hxx>
42*cdf0e10cSrcweir #include <svx/sdtfchim.hxx>
43*cdf0e10cSrcweir #include <svtools/colorcfg.hxx>
44*cdf0e10cSrcweir #include <editeng/eeitem.hxx>
45*cdf0e10cSrcweir #include <editeng/editstat.hxx>
46*cdf0e10cSrcweir #include <editeng/outlobj.hxx>
47*cdf0e10cSrcweir #include <editeng/editobj.hxx>
48*cdf0e10cSrcweir #include <editeng/outliner.hxx>
49*cdf0e10cSrcweir #include <editeng/fhgtitem.hxx>
50*cdf0e10cSrcweir #include <svl/itempool.hxx>
51*cdf0e10cSrcweir #include <editeng/adjitem.hxx>
52*cdf0e10cSrcweir #include <editeng/flditem.hxx>
53*cdf0e10cSrcweir #include <svx/xftouit.hxx>
54*cdf0e10cSrcweir #include <vcl/salbtype.hxx>		// FRound
55*cdf0e10cSrcweir #include <svx/xflgrit.hxx>
56*cdf0e10cSrcweir #include <svx/svdpool.hxx>
57*cdf0e10cSrcweir #include <svx/xflclit.hxx>
58*cdf0e10cSrcweir #include <svl/style.hxx>
59*cdf0e10cSrcweir #include <editeng/editeng.hxx>
60*cdf0e10cSrcweir #include <svl/itemiter.hxx>
61*cdf0e10cSrcweir #include <svx/sdr/properties/textproperties.hxx>
62*cdf0e10cSrcweir #include <vcl/metaact.hxx>
63*cdf0e10cSrcweir #include <svx/sdr/contact/viewcontactoftextobj.hxx>
64*cdf0e10cSrcweir #include <basegfx/tuple/b2dtuple.hxx>
65*cdf0e10cSrcweir #include <basegfx/matrix/b2dhommatrix.hxx>
66*cdf0e10cSrcweir #include <basegfx/polygon/b2dpolygon.hxx>
67*cdf0e10cSrcweir #include <drawinglayer/geometry/viewinformation2d.hxx>
68*cdf0e10cSrcweir #include <vcl/virdev.hxx>
69*cdf0e10cSrcweir #include <basegfx/matrix/b2dhommatrixtools.hxx>
70*cdf0e10cSrcweir 
71*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
72*cdf0e10cSrcweir 
73*cdf0e10cSrcweir using namespace com::sun::star;
74*cdf0e10cSrcweir 
75*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
76*cdf0e10cSrcweir // #104018# replace macros above with type-safe methods
77*cdf0e10cSrcweir inline double ImplTwipsToMM(double fVal) { return (fVal * (127.0 / 72.0)); }
78*cdf0e10cSrcweir inline double ImplMMToTwips(double fVal) { return (fVal * (72.0 / 127.0)); }
79*cdf0e10cSrcweir 
80*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
81*cdf0e10cSrcweir //
82*cdf0e10cSrcweir //  @@@@@@ @@@@@ @@   @@ @@@@@@  @@@@  @@@@@  @@@@@@
83*cdf0e10cSrcweir //    @@   @@    @@@ @@@   @@   @@  @@ @@  @@     @@
84*cdf0e10cSrcweir //    @@   @@     @@@@@    @@   @@  @@ @@  @@     @@
85*cdf0e10cSrcweir //    @@   @@@@    @@@     @@   @@  @@ @@@@@      @@
86*cdf0e10cSrcweir //    @@   @@     @@@@@    @@   @@  @@ @@  @@     @@
87*cdf0e10cSrcweir //    @@   @@    @@@ @@@   @@   @@  @@ @@  @@ @@  @@
88*cdf0e10cSrcweir //    @@   @@@@@ @@   @@   @@    @@@@  @@@@@   @@@@
89*cdf0e10cSrcweir //
90*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
91*cdf0e10cSrcweir 
92*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
93*cdf0e10cSrcweir // BaseProperties section
94*cdf0e10cSrcweir 
95*cdf0e10cSrcweir sdr::properties::BaseProperties* SdrTextObj::CreateObjectSpecificProperties()
96*cdf0e10cSrcweir {
97*cdf0e10cSrcweir 	return new sdr::properties::TextProperties(*this);
98*cdf0e10cSrcweir }
99*cdf0e10cSrcweir 
100*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
101*cdf0e10cSrcweir // DrawContact section
102*cdf0e10cSrcweir 
103*cdf0e10cSrcweir sdr::contact::ViewContact* SdrTextObj::CreateObjectSpecificViewContact()
104*cdf0e10cSrcweir {
105*cdf0e10cSrcweir 	return new sdr::contact::ViewContactOfTextObj(*this);
106*cdf0e10cSrcweir }
107*cdf0e10cSrcweir 
108*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
109*cdf0e10cSrcweir 
110*cdf0e10cSrcweir TYPEINIT1(SdrTextObj,SdrAttrObj);
111*cdf0e10cSrcweir 
112*cdf0e10cSrcweir SdrTextObj::SdrTextObj()
113*cdf0e10cSrcweir :	SdrAttrObj(),
114*cdf0e10cSrcweir 	mpText(NULL),
115*cdf0e10cSrcweir 	pEdtOutl(NULL),
116*cdf0e10cSrcweir 	pFormTextBoundRect(NULL),
117*cdf0e10cSrcweir 	eTextKind(OBJ_TEXT)
118*cdf0e10cSrcweir {
119*cdf0e10cSrcweir 	bTextSizeDirty=sal_False;
120*cdf0e10cSrcweir 	bTextFrame=sal_False;
121*cdf0e10cSrcweir 	bNoShear=sal_False;
122*cdf0e10cSrcweir 	bNoRotate=sal_False;
123*cdf0e10cSrcweir 	bNoMirror=sal_False;
124*cdf0e10cSrcweir 	bDisableAutoWidthOnDragging=sal_False;
125*cdf0e10cSrcweir 
126*cdf0e10cSrcweir 	// #101684#
127*cdf0e10cSrcweir 	mbInEditMode = sal_False;
128*cdf0e10cSrcweir 
129*cdf0e10cSrcweir 	// #111096#
130*cdf0e10cSrcweir 	mbTextHidden = sal_False;
131*cdf0e10cSrcweir 
132*cdf0e10cSrcweir 	// #111096#
133*cdf0e10cSrcweir 	mbTextAnimationAllowed = sal_True;
134*cdf0e10cSrcweir 
135*cdf0e10cSrcweir 	// #108784#
136*cdf0e10cSrcweir 	maTextEditOffset = Point(0, 0);
137*cdf0e10cSrcweir 
138*cdf0e10cSrcweir 	// #i25616#
139*cdf0e10cSrcweir 	mbSupportTextIndentingOnLineWidthChange = sal_True;
140*cdf0e10cSrcweir }
141*cdf0e10cSrcweir 
142*cdf0e10cSrcweir SdrTextObj::SdrTextObj(const Rectangle& rNewRect)
143*cdf0e10cSrcweir :	SdrAttrObj(),
144*cdf0e10cSrcweir 	aRect(rNewRect),
145*cdf0e10cSrcweir 	mpText(NULL),
146*cdf0e10cSrcweir 	pEdtOutl(NULL),
147*cdf0e10cSrcweir 	pFormTextBoundRect(NULL)
148*cdf0e10cSrcweir {
149*cdf0e10cSrcweir 	bTextSizeDirty=sal_False;
150*cdf0e10cSrcweir 	bTextFrame=sal_False;
151*cdf0e10cSrcweir 	bNoShear=sal_False;
152*cdf0e10cSrcweir 	bNoRotate=sal_False;
153*cdf0e10cSrcweir 	bNoMirror=sal_False;
154*cdf0e10cSrcweir 	bDisableAutoWidthOnDragging=sal_False;
155*cdf0e10cSrcweir 	ImpJustifyRect(aRect);
156*cdf0e10cSrcweir 
157*cdf0e10cSrcweir 	// #101684#
158*cdf0e10cSrcweir 	mbInEditMode = sal_False;
159*cdf0e10cSrcweir 
160*cdf0e10cSrcweir 	// #111096#
161*cdf0e10cSrcweir 	mbTextHidden = sal_False;
162*cdf0e10cSrcweir 
163*cdf0e10cSrcweir 	// #111096#
164*cdf0e10cSrcweir 	mbTextAnimationAllowed = sal_True;
165*cdf0e10cSrcweir 
166*cdf0e10cSrcweir 	// #108784#
167*cdf0e10cSrcweir 	maTextEditOffset = Point(0, 0);
168*cdf0e10cSrcweir 
169*cdf0e10cSrcweir 	// #i25616#
170*cdf0e10cSrcweir 	mbSupportTextIndentingOnLineWidthChange = sal_True;
171*cdf0e10cSrcweir }
172*cdf0e10cSrcweir 
173*cdf0e10cSrcweir SdrTextObj::SdrTextObj(SdrObjKind eNewTextKind)
174*cdf0e10cSrcweir :	SdrAttrObj(),
175*cdf0e10cSrcweir 	mpText(NULL),
176*cdf0e10cSrcweir 	pEdtOutl(NULL),
177*cdf0e10cSrcweir 	pFormTextBoundRect(NULL),
178*cdf0e10cSrcweir 	eTextKind(eNewTextKind)
179*cdf0e10cSrcweir {
180*cdf0e10cSrcweir 	bTextSizeDirty=sal_False;
181*cdf0e10cSrcweir 	bTextFrame=sal_True;
182*cdf0e10cSrcweir 	bNoShear=sal_True;
183*cdf0e10cSrcweir 	bNoRotate=sal_False;
184*cdf0e10cSrcweir 	bNoMirror=sal_True;
185*cdf0e10cSrcweir 	bDisableAutoWidthOnDragging=sal_False;
186*cdf0e10cSrcweir 
187*cdf0e10cSrcweir 	// #101684#
188*cdf0e10cSrcweir 	mbInEditMode = sal_False;
189*cdf0e10cSrcweir 
190*cdf0e10cSrcweir 	// #111096#
191*cdf0e10cSrcweir 	mbTextHidden = sal_False;
192*cdf0e10cSrcweir 
193*cdf0e10cSrcweir 	// #111096#
194*cdf0e10cSrcweir 	mbTextAnimationAllowed = sal_True;
195*cdf0e10cSrcweir 
196*cdf0e10cSrcweir 	// #108784#
197*cdf0e10cSrcweir 	maTextEditOffset = Point(0, 0);
198*cdf0e10cSrcweir 
199*cdf0e10cSrcweir 	// #i25616#
200*cdf0e10cSrcweir 	mbSupportTextIndentingOnLineWidthChange = sal_True;
201*cdf0e10cSrcweir }
202*cdf0e10cSrcweir 
203*cdf0e10cSrcweir SdrTextObj::SdrTextObj(SdrObjKind eNewTextKind, const Rectangle& rNewRect)
204*cdf0e10cSrcweir :	SdrAttrObj(),
205*cdf0e10cSrcweir 	aRect(rNewRect),
206*cdf0e10cSrcweir 	mpText(NULL),
207*cdf0e10cSrcweir 	pEdtOutl(NULL),
208*cdf0e10cSrcweir 	pFormTextBoundRect(NULL),
209*cdf0e10cSrcweir 	eTextKind(eNewTextKind)
210*cdf0e10cSrcweir {
211*cdf0e10cSrcweir 	bTextSizeDirty=sal_False;
212*cdf0e10cSrcweir 	bTextFrame=sal_True;
213*cdf0e10cSrcweir 	bNoShear=sal_True;
214*cdf0e10cSrcweir 	bNoRotate=sal_False;
215*cdf0e10cSrcweir 	bNoMirror=sal_True;
216*cdf0e10cSrcweir 	bDisableAutoWidthOnDragging=sal_False;
217*cdf0e10cSrcweir 	ImpJustifyRect(aRect);
218*cdf0e10cSrcweir 
219*cdf0e10cSrcweir 	// #101684#
220*cdf0e10cSrcweir 	mbInEditMode = sal_False;
221*cdf0e10cSrcweir 
222*cdf0e10cSrcweir 	// #111096#
223*cdf0e10cSrcweir 	mbTextHidden = sal_False;
224*cdf0e10cSrcweir 
225*cdf0e10cSrcweir 	// #111096#
226*cdf0e10cSrcweir 	mbTextAnimationAllowed = sal_True;
227*cdf0e10cSrcweir 
228*cdf0e10cSrcweir 	// #108784#
229*cdf0e10cSrcweir 	maTextEditOffset = Point(0, 0);
230*cdf0e10cSrcweir 
231*cdf0e10cSrcweir 	// #i25616#
232*cdf0e10cSrcweir 	mbSupportTextIndentingOnLineWidthChange = sal_True;
233*cdf0e10cSrcweir }
234*cdf0e10cSrcweir 
235*cdf0e10cSrcweir SdrTextObj::SdrTextObj(SdrObjKind eNewTextKind, const Rectangle& rNewRect, SvStream& rInput, const String& rBaseURL, sal_uInt16 eFormat)
236*cdf0e10cSrcweir :	SdrAttrObj(),
237*cdf0e10cSrcweir 	aRect(rNewRect),
238*cdf0e10cSrcweir 	mpText(NULL),
239*cdf0e10cSrcweir 	pEdtOutl(NULL),
240*cdf0e10cSrcweir 	pFormTextBoundRect(NULL),
241*cdf0e10cSrcweir 	eTextKind(eNewTextKind)
242*cdf0e10cSrcweir {
243*cdf0e10cSrcweir 	bTextSizeDirty=sal_False;
244*cdf0e10cSrcweir 	bTextFrame=sal_True;
245*cdf0e10cSrcweir 	bNoShear=sal_True;
246*cdf0e10cSrcweir 	bNoRotate=sal_False;
247*cdf0e10cSrcweir 	bNoMirror=sal_True;
248*cdf0e10cSrcweir 	bDisableAutoWidthOnDragging=sal_False;
249*cdf0e10cSrcweir 	ImpJustifyRect(aRect);
250*cdf0e10cSrcweir 
251*cdf0e10cSrcweir     NbcSetText(rInput, rBaseURL, eFormat);
252*cdf0e10cSrcweir 
253*cdf0e10cSrcweir 	// #101684#
254*cdf0e10cSrcweir 	mbInEditMode = sal_False;
255*cdf0e10cSrcweir 
256*cdf0e10cSrcweir 	// #111096#
257*cdf0e10cSrcweir 	mbTextHidden = sal_False;
258*cdf0e10cSrcweir 
259*cdf0e10cSrcweir 	// #111096#
260*cdf0e10cSrcweir 	mbTextAnimationAllowed = sal_True;
261*cdf0e10cSrcweir 
262*cdf0e10cSrcweir 	// #108784#
263*cdf0e10cSrcweir 	maTextEditOffset = Point(0, 0);
264*cdf0e10cSrcweir 
265*cdf0e10cSrcweir 	// #i25616#
266*cdf0e10cSrcweir 	mbSupportTextIndentingOnLineWidthChange = sal_True;
267*cdf0e10cSrcweir }
268*cdf0e10cSrcweir 
269*cdf0e10cSrcweir SdrTextObj::~SdrTextObj()
270*cdf0e10cSrcweir {
271*cdf0e10cSrcweir 	if( pModel )
272*cdf0e10cSrcweir 	{
273*cdf0e10cSrcweir 		SdrOutliner& rOutl = pModel->GetHitTestOutliner();
274*cdf0e10cSrcweir 		if( rOutl.GetTextObj() == this )
275*cdf0e10cSrcweir 			rOutl.SetTextObj( NULL );
276*cdf0e10cSrcweir 	}
277*cdf0e10cSrcweir 
278*cdf0e10cSrcweir 	if(mpText!=NULL)
279*cdf0e10cSrcweir 		delete mpText;
280*cdf0e10cSrcweir 
281*cdf0e10cSrcweir 	if (pFormTextBoundRect!=NULL)
282*cdf0e10cSrcweir 		delete pFormTextBoundRect;
283*cdf0e10cSrcweir 
284*cdf0e10cSrcweir 	ImpLinkAbmeldung();
285*cdf0e10cSrcweir }
286*cdf0e10cSrcweir 
287*cdf0e10cSrcweir void SdrTextObj::FitFrameToTextSize()
288*cdf0e10cSrcweir {
289*cdf0e10cSrcweir 	DBG_ASSERT(pModel!=NULL,"SdrTextObj::FitFrameToTextSize(): pModel=NULL!");
290*cdf0e10cSrcweir 	ImpJustifyRect(aRect);
291*cdf0e10cSrcweir 
292*cdf0e10cSrcweir 	SdrText* pText = getActiveText();
293*cdf0e10cSrcweir 	if( pText!=NULL && pText->GetOutlinerParaObject() && pModel!=NULL)
294*cdf0e10cSrcweir 	{
295*cdf0e10cSrcweir 		SdrOutliner& rOutliner=ImpGetDrawOutliner();
296*cdf0e10cSrcweir 		rOutliner.SetPaperSize(Size(aRect.Right()-aRect.Left(),aRect.Bottom()-aRect.Top()));
297*cdf0e10cSrcweir 		rOutliner.SetUpdateMode(sal_True);
298*cdf0e10cSrcweir 		rOutliner.SetText(*pText->GetOutlinerParaObject());
299*cdf0e10cSrcweir 		Rectangle aTextRect;
300*cdf0e10cSrcweir 		Size aNewSize(rOutliner.CalcTextSize());
301*cdf0e10cSrcweir 		rOutliner.Clear();
302*cdf0e10cSrcweir 		aNewSize.Width()++; // wegen evtl. Rundungsfehler
303*cdf0e10cSrcweir 		aNewSize.Width()+=GetTextLeftDistance()+GetTextRightDistance();
304*cdf0e10cSrcweir 		aNewSize.Height()+=GetTextUpperDistance()+GetTextLowerDistance();
305*cdf0e10cSrcweir 		Rectangle aNewRect(aRect);
306*cdf0e10cSrcweir 		aNewRect.SetSize(aNewSize);
307*cdf0e10cSrcweir 		ImpJustifyRect(aNewRect);
308*cdf0e10cSrcweir 		if (aNewRect!=aRect) {
309*cdf0e10cSrcweir 			SetLogicRect(aNewRect);
310*cdf0e10cSrcweir 		}
311*cdf0e10cSrcweir 	}
312*cdf0e10cSrcweir }
313*cdf0e10cSrcweir 
314*cdf0e10cSrcweir void SdrTextObj::NbcSetText(const XubString& rStr)
315*cdf0e10cSrcweir {
316*cdf0e10cSrcweir 	SdrOutliner& rOutliner=ImpGetDrawOutliner();
317*cdf0e10cSrcweir 	rOutliner.SetStyleSheet( 0, GetStyleSheet());
318*cdf0e10cSrcweir 	//OutputDevice* pRef1=rOutliner.GetRefDevice();
319*cdf0e10cSrcweir 	rOutliner.SetUpdateMode(sal_True);
320*cdf0e10cSrcweir 	rOutliner.SetText(rStr,rOutliner.GetParagraph( 0 ));
321*cdf0e10cSrcweir 	OutlinerParaObject* pNewText=rOutliner.CreateParaObject();
322*cdf0e10cSrcweir 	Size aSiz(rOutliner.CalcTextSize());
323*cdf0e10cSrcweir 	//OutputDevice* pRef2=rOutliner.GetRefDevice();
324*cdf0e10cSrcweir 	rOutliner.Clear();
325*cdf0e10cSrcweir 	NbcSetOutlinerParaObject(pNewText);
326*cdf0e10cSrcweir 	aTextSize=aSiz;
327*cdf0e10cSrcweir 	bTextSizeDirty=sal_False;
328*cdf0e10cSrcweir }
329*cdf0e10cSrcweir 
330*cdf0e10cSrcweir void SdrTextObj::SetText(const XubString& rStr)
331*cdf0e10cSrcweir {
332*cdf0e10cSrcweir 	Rectangle aBoundRect0; if (pUserCall!=NULL) aBoundRect0=GetLastBoundRect();
333*cdf0e10cSrcweir 	// #110094#-14 SendRepaintBroadcast();
334*cdf0e10cSrcweir 	NbcSetText(rStr);
335*cdf0e10cSrcweir 	SetChanged();
336*cdf0e10cSrcweir 	BroadcastObjectChange();
337*cdf0e10cSrcweir 	SendUserCall(SDRUSERCALL_RESIZE,aBoundRect0);
338*cdf0e10cSrcweir 	//if (GetBoundRect()!=aBoundRect0) {
339*cdf0e10cSrcweir 	//	SendUserCall(SDRUSERCALL_RESIZE,aBoundRect0);
340*cdf0e10cSrcweir 	//}
341*cdf0e10cSrcweir }
342*cdf0e10cSrcweir 
343*cdf0e10cSrcweir void SdrTextObj::NbcSetText(SvStream& rInput, const String& rBaseURL, sal_uInt16 eFormat)
344*cdf0e10cSrcweir {
345*cdf0e10cSrcweir 	SdrOutliner& rOutliner=ImpGetDrawOutliner();
346*cdf0e10cSrcweir 	rOutliner.SetStyleSheet( 0, GetStyleSheet());
347*cdf0e10cSrcweir     rOutliner.Read(rInput,rBaseURL,eFormat);
348*cdf0e10cSrcweir 	OutlinerParaObject* pNewText=rOutliner.CreateParaObject();
349*cdf0e10cSrcweir 	rOutliner.SetUpdateMode(sal_True);
350*cdf0e10cSrcweir 	Size aSiz(rOutliner.CalcTextSize());
351*cdf0e10cSrcweir 	rOutliner.Clear();
352*cdf0e10cSrcweir 	NbcSetOutlinerParaObject(pNewText);
353*cdf0e10cSrcweir 	aTextSize=aSiz;
354*cdf0e10cSrcweir 	bTextSizeDirty=sal_False;
355*cdf0e10cSrcweir }
356*cdf0e10cSrcweir 
357*cdf0e10cSrcweir void SdrTextObj::SetText(SvStream& rInput, const String& rBaseURL, sal_uInt16 eFormat)
358*cdf0e10cSrcweir {
359*cdf0e10cSrcweir 	Rectangle aBoundRect0; if (pUserCall!=NULL) aBoundRect0=GetLastBoundRect();
360*cdf0e10cSrcweir 	// #110094#-14 SendRepaintBroadcast();
361*cdf0e10cSrcweir     NbcSetText(rInput,rBaseURL,eFormat);
362*cdf0e10cSrcweir 	SetChanged();
363*cdf0e10cSrcweir 	BroadcastObjectChange();
364*cdf0e10cSrcweir 	SendUserCall(SDRUSERCALL_RESIZE,aBoundRect0);
365*cdf0e10cSrcweir }
366*cdf0e10cSrcweir 
367*cdf0e10cSrcweir const Size& SdrTextObj::GetTextSize() const
368*cdf0e10cSrcweir {
369*cdf0e10cSrcweir 	if (bTextSizeDirty)
370*cdf0e10cSrcweir 	{
371*cdf0e10cSrcweir 		Size aSiz;
372*cdf0e10cSrcweir 		SdrText* pText = getActiveText();
373*cdf0e10cSrcweir 		if( pText && pText->GetOutlinerParaObject ())
374*cdf0e10cSrcweir 		{
375*cdf0e10cSrcweir 			SdrOutliner& rOutliner=ImpGetDrawOutliner();
376*cdf0e10cSrcweir 			rOutliner.SetText(*pText->GetOutlinerParaObject());
377*cdf0e10cSrcweir 			rOutliner.SetUpdateMode(sal_True);
378*cdf0e10cSrcweir 			aSiz=rOutliner.CalcTextSize();
379*cdf0e10cSrcweir 			rOutliner.Clear();
380*cdf0e10cSrcweir 		}
381*cdf0e10cSrcweir 		// 2x casting auf nonconst
382*cdf0e10cSrcweir 		((SdrTextObj*)this)->aTextSize=aSiz;
383*cdf0e10cSrcweir 		((SdrTextObj*)this)->bTextSizeDirty=sal_False;
384*cdf0e10cSrcweir 	}
385*cdf0e10cSrcweir 	return aTextSize;
386*cdf0e10cSrcweir }
387*cdf0e10cSrcweir 
388*cdf0e10cSrcweir FASTBOOL SdrTextObj::IsAutoGrowHeight() const
389*cdf0e10cSrcweir {
390*cdf0e10cSrcweir 	if(!bTextFrame)
391*cdf0e10cSrcweir 		return sal_False; // AutoGrow nur bei TextFrames
392*cdf0e10cSrcweir 
393*cdf0e10cSrcweir 	const SfxItemSet& rSet = GetObjectItemSet();
394*cdf0e10cSrcweir 	sal_Bool bRet = ((SdrTextAutoGrowHeightItem&)(rSet.Get(SDRATTR_TEXT_AUTOGROWHEIGHT))).GetValue();
395*cdf0e10cSrcweir 
396*cdf0e10cSrcweir 	if(bRet)
397*cdf0e10cSrcweir 	{
398*cdf0e10cSrcweir 		SdrTextAniKind eAniKind = ((SdrTextAniKindItem&)(rSet.Get(SDRATTR_TEXT_ANIKIND))).GetValue();
399*cdf0e10cSrcweir 
400*cdf0e10cSrcweir 		if(eAniKind == SDRTEXTANI_SCROLL || eAniKind == SDRTEXTANI_ALTERNATE || eAniKind == SDRTEXTANI_SLIDE)
401*cdf0e10cSrcweir 		{
402*cdf0e10cSrcweir 			SdrTextAniDirection eDirection = ((SdrTextAniDirectionItem&)(rSet.Get(SDRATTR_TEXT_ANIDIRECTION))).GetValue();
403*cdf0e10cSrcweir 
404*cdf0e10cSrcweir 			if(eDirection == SDRTEXTANI_UP || eDirection == SDRTEXTANI_DOWN)
405*cdf0e10cSrcweir 			{
406*cdf0e10cSrcweir 				bRet = sal_False;
407*cdf0e10cSrcweir 			}
408*cdf0e10cSrcweir 		}
409*cdf0e10cSrcweir 	}
410*cdf0e10cSrcweir 	return bRet;
411*cdf0e10cSrcweir }
412*cdf0e10cSrcweir 
413*cdf0e10cSrcweir FASTBOOL SdrTextObj::IsAutoGrowWidth() const
414*cdf0e10cSrcweir {
415*cdf0e10cSrcweir 	if(!bTextFrame)
416*cdf0e10cSrcweir 		return sal_False; // AutoGrow nur bei TextFrames
417*cdf0e10cSrcweir 
418*cdf0e10cSrcweir 	const SfxItemSet& rSet = GetObjectItemSet();
419*cdf0e10cSrcweir 	sal_Bool bRet = ((SdrTextAutoGrowHeightItem&)(rSet.Get(SDRATTR_TEXT_AUTOGROWWIDTH))).GetValue();
420*cdf0e10cSrcweir 
421*cdf0e10cSrcweir 	// #101684#
422*cdf0e10cSrcweir 	sal_Bool bInEditMOde = IsInEditMode();
423*cdf0e10cSrcweir 
424*cdf0e10cSrcweir 	if(!bInEditMOde && bRet)
425*cdf0e10cSrcweir 	{
426*cdf0e10cSrcweir 		SdrTextAniKind eAniKind = ((SdrTextAniKindItem&)(rSet.Get(SDRATTR_TEXT_ANIKIND))).GetValue();
427*cdf0e10cSrcweir 
428*cdf0e10cSrcweir 		if(eAniKind == SDRTEXTANI_SCROLL || eAniKind == SDRTEXTANI_ALTERNATE || eAniKind == SDRTEXTANI_SLIDE)
429*cdf0e10cSrcweir 		{
430*cdf0e10cSrcweir 			SdrTextAniDirection eDirection = ((SdrTextAniDirectionItem&)(rSet.Get(SDRATTR_TEXT_ANIDIRECTION))).GetValue();
431*cdf0e10cSrcweir 
432*cdf0e10cSrcweir 			if(eDirection == SDRTEXTANI_LEFT || eDirection == SDRTEXTANI_RIGHT)
433*cdf0e10cSrcweir 			{
434*cdf0e10cSrcweir 				bRet = sal_False;
435*cdf0e10cSrcweir 			}
436*cdf0e10cSrcweir 		}
437*cdf0e10cSrcweir 	}
438*cdf0e10cSrcweir 	return bRet;
439*cdf0e10cSrcweir }
440*cdf0e10cSrcweir 
441*cdf0e10cSrcweir SdrTextHorzAdjust SdrTextObj::GetTextHorizontalAdjust() const
442*cdf0e10cSrcweir {
443*cdf0e10cSrcweir 	return GetTextHorizontalAdjust(GetObjectItemSet());
444*cdf0e10cSrcweir }
445*cdf0e10cSrcweir 
446*cdf0e10cSrcweir SdrTextHorzAdjust SdrTextObj::GetTextHorizontalAdjust(const SfxItemSet& rSet) const
447*cdf0e10cSrcweir {
448*cdf0e10cSrcweir 	if(IsContourTextFrame())
449*cdf0e10cSrcweir 		return SDRTEXTHORZADJUST_BLOCK;
450*cdf0e10cSrcweir 
451*cdf0e10cSrcweir 	SdrTextHorzAdjust eRet = ((SdrTextHorzAdjustItem&)(rSet.Get(SDRATTR_TEXT_HORZADJUST))).GetValue();
452*cdf0e10cSrcweir 
453*cdf0e10cSrcweir 	// #101684#
454*cdf0e10cSrcweir 	sal_Bool bInEditMode = IsInEditMode();
455*cdf0e10cSrcweir 
456*cdf0e10cSrcweir 	if(!bInEditMode && eRet == SDRTEXTHORZADJUST_BLOCK)
457*cdf0e10cSrcweir 	{
458*cdf0e10cSrcweir 		SdrTextAniKind eAniKind = ((SdrTextAniKindItem&)(rSet.Get(SDRATTR_TEXT_ANIKIND))).GetValue();
459*cdf0e10cSrcweir 
460*cdf0e10cSrcweir 		if(eAniKind == SDRTEXTANI_SCROLL || eAniKind == SDRTEXTANI_ALTERNATE || eAniKind == SDRTEXTANI_SLIDE)
461*cdf0e10cSrcweir 		{
462*cdf0e10cSrcweir 			SdrTextAniDirection eDirection = ((SdrTextAniDirectionItem&)(rSet.Get(SDRATTR_TEXT_ANIDIRECTION))).GetValue();
463*cdf0e10cSrcweir 
464*cdf0e10cSrcweir 			if(eDirection == SDRTEXTANI_LEFT || eDirection == SDRTEXTANI_RIGHT)
465*cdf0e10cSrcweir 			{
466*cdf0e10cSrcweir 				eRet = SDRTEXTHORZADJUST_LEFT;
467*cdf0e10cSrcweir 			}
468*cdf0e10cSrcweir 		}
469*cdf0e10cSrcweir 	}
470*cdf0e10cSrcweir 
471*cdf0e10cSrcweir 	return eRet;
472*cdf0e10cSrcweir } // defaults: BLOCK fuer Textrahmen, CENTER fuer beschriftete Grafikobjekte
473*cdf0e10cSrcweir 
474*cdf0e10cSrcweir SdrTextVertAdjust SdrTextObj::GetTextVerticalAdjust() const
475*cdf0e10cSrcweir {
476*cdf0e10cSrcweir 	return GetTextVerticalAdjust(GetObjectItemSet());
477*cdf0e10cSrcweir }
478*cdf0e10cSrcweir 
479*cdf0e10cSrcweir SdrTextVertAdjust SdrTextObj::GetTextVerticalAdjust(const SfxItemSet& rSet) const
480*cdf0e10cSrcweir {
481*cdf0e10cSrcweir 	if(IsContourTextFrame())
482*cdf0e10cSrcweir 		return SDRTEXTVERTADJUST_TOP;
483*cdf0e10cSrcweir 
484*cdf0e10cSrcweir 	// #103516# Take care for vertical text animation here
485*cdf0e10cSrcweir 	SdrTextVertAdjust eRet = ((SdrTextVertAdjustItem&)(rSet.Get(SDRATTR_TEXT_VERTADJUST))).GetValue();
486*cdf0e10cSrcweir 	sal_Bool bInEditMode = IsInEditMode();
487*cdf0e10cSrcweir 
488*cdf0e10cSrcweir 	// #103516# Take care for vertical text animation here
489*cdf0e10cSrcweir 	if(!bInEditMode && eRet == SDRTEXTVERTADJUST_BLOCK)
490*cdf0e10cSrcweir 	{
491*cdf0e10cSrcweir 		SdrTextAniKind eAniKind = ((SdrTextAniKindItem&)(rSet.Get(SDRATTR_TEXT_ANIKIND))).GetValue();
492*cdf0e10cSrcweir 
493*cdf0e10cSrcweir 		if(eAniKind == SDRTEXTANI_SCROLL || eAniKind == SDRTEXTANI_ALTERNATE || eAniKind == SDRTEXTANI_SLIDE)
494*cdf0e10cSrcweir 		{
495*cdf0e10cSrcweir 			SdrTextAniDirection eDirection = ((SdrTextAniDirectionItem&)(rSet.Get(SDRATTR_TEXT_ANIDIRECTION))).GetValue();
496*cdf0e10cSrcweir 
497*cdf0e10cSrcweir 			if(eDirection == SDRTEXTANI_LEFT || eDirection == SDRTEXTANI_RIGHT)
498*cdf0e10cSrcweir 			{
499*cdf0e10cSrcweir 				eRet = SDRTEXTVERTADJUST_TOP;
500*cdf0e10cSrcweir 			}
501*cdf0e10cSrcweir 		}
502*cdf0e10cSrcweir 	}
503*cdf0e10cSrcweir 
504*cdf0e10cSrcweir 	return eRet;
505*cdf0e10cSrcweir } // defaults: TOP fuer Textrahmen, CENTER fuer beschriftete Grafikobjekte
506*cdf0e10cSrcweir 
507*cdf0e10cSrcweir void SdrTextObj::ImpJustifyRect(Rectangle& rRect) const
508*cdf0e10cSrcweir {
509*cdf0e10cSrcweir 	if (!rRect.IsEmpty()) {
510*cdf0e10cSrcweir 		rRect.Justify();
511*cdf0e10cSrcweir 		if (rRect.Left()==rRect.Right()) rRect.Right()++;
512*cdf0e10cSrcweir 		if (rRect.Top()==rRect.Bottom()) rRect.Bottom()++;
513*cdf0e10cSrcweir 	}
514*cdf0e10cSrcweir }
515*cdf0e10cSrcweir 
516*cdf0e10cSrcweir void SdrTextObj::ImpCheckShear()
517*cdf0e10cSrcweir {
518*cdf0e10cSrcweir 	if (bNoShear && aGeo.nShearWink!=0) {
519*cdf0e10cSrcweir 		aGeo.nShearWink=0;
520*cdf0e10cSrcweir 		aGeo.nTan=0;
521*cdf0e10cSrcweir 	}
522*cdf0e10cSrcweir }
523*cdf0e10cSrcweir 
524*cdf0e10cSrcweir void SdrTextObj::TakeObjInfo(SdrObjTransformInfoRec& rInfo) const
525*cdf0e10cSrcweir {
526*cdf0e10cSrcweir 	FASTBOOL bNoTextFrame=!IsTextFrame();
527*cdf0e10cSrcweir 	rInfo.bResizeFreeAllowed=bNoTextFrame || aGeo.nDrehWink%9000==0;
528*cdf0e10cSrcweir 	rInfo.bResizePropAllowed=sal_True;
529*cdf0e10cSrcweir 	rInfo.bRotateFreeAllowed=sal_True;
530*cdf0e10cSrcweir 	rInfo.bRotate90Allowed  =sal_True;
531*cdf0e10cSrcweir 	rInfo.bMirrorFreeAllowed=bNoTextFrame;
532*cdf0e10cSrcweir 	rInfo.bMirror45Allowed  =bNoTextFrame;
533*cdf0e10cSrcweir 	rInfo.bMirror90Allowed  =bNoTextFrame;
534*cdf0e10cSrcweir 
535*cdf0e10cSrcweir 	// allow transparence
536*cdf0e10cSrcweir 	rInfo.bTransparenceAllowed = sal_True;
537*cdf0e10cSrcweir 
538*cdf0e10cSrcweir 	// gradient depends on fillstyle
539*cdf0e10cSrcweir 	XFillStyle eFillStyle = ((XFillStyleItem&)(GetObjectItem(XATTR_FILLSTYLE))).GetValue();
540*cdf0e10cSrcweir 	rInfo.bGradientAllowed = (eFillStyle == XFILL_GRADIENT);
541*cdf0e10cSrcweir 	rInfo.bShearAllowed     =bNoTextFrame;
542*cdf0e10cSrcweir 	rInfo.bEdgeRadiusAllowed=sal_True;
543*cdf0e10cSrcweir 	FASTBOOL bCanConv=ImpCanConvTextToCurve();
544*cdf0e10cSrcweir 	rInfo.bCanConvToPath    =bCanConv;
545*cdf0e10cSrcweir 	rInfo.bCanConvToPoly    =bCanConv;
546*cdf0e10cSrcweir 	rInfo.bCanConvToPathLineToArea=bCanConv;
547*cdf0e10cSrcweir 	rInfo.bCanConvToPolyLineToArea=bCanConv;
548*cdf0e10cSrcweir 	rInfo.bCanConvToContour = (rInfo.bCanConvToPoly || LineGeometryUsageIsNecessary());
549*cdf0e10cSrcweir }
550*cdf0e10cSrcweir 
551*cdf0e10cSrcweir sal_uInt16 SdrTextObj::GetObjIdentifier() const
552*cdf0e10cSrcweir {
553*cdf0e10cSrcweir 	return sal_uInt16(eTextKind);
554*cdf0e10cSrcweir }
555*cdf0e10cSrcweir 
556*cdf0e10cSrcweir bool SdrTextObj::HasTextImpl( SdrOutliner* pOutliner )
557*cdf0e10cSrcweir {
558*cdf0e10cSrcweir 	bool bRet=false;
559*cdf0e10cSrcweir 	if(pOutliner)
560*cdf0e10cSrcweir 	{
561*cdf0e10cSrcweir 		Paragraph* p1stPara=pOutliner->GetParagraph( 0 );
562*cdf0e10cSrcweir 		sal_uIntPtr nParaAnz=pOutliner->GetParagraphCount();
563*cdf0e10cSrcweir 		if(p1stPara==NULL)
564*cdf0e10cSrcweir 			nParaAnz=0;
565*cdf0e10cSrcweir 
566*cdf0e10cSrcweir 		if(nParaAnz==1)
567*cdf0e10cSrcweir 		{
568*cdf0e10cSrcweir 			// if it is only one paragraph, check if that paragraph is empty
569*cdf0e10cSrcweir 			XubString aStr(pOutliner->GetText(p1stPara));
570*cdf0e10cSrcweir 
571*cdf0e10cSrcweir 			if(!aStr.Len())
572*cdf0e10cSrcweir 				nParaAnz = 0;
573*cdf0e10cSrcweir 		}
574*cdf0e10cSrcweir 
575*cdf0e10cSrcweir 		bRet= nParaAnz!=0;
576*cdf0e10cSrcweir 	}
577*cdf0e10cSrcweir 	return bRet;
578*cdf0e10cSrcweir }
579*cdf0e10cSrcweir 
580*cdf0e10cSrcweir FASTBOOL SdrTextObj::HasEditText() const
581*cdf0e10cSrcweir {
582*cdf0e10cSrcweir 	return HasTextImpl( pEdtOutl );
583*cdf0e10cSrcweir }
584*cdf0e10cSrcweir 
585*cdf0e10cSrcweir void SdrTextObj::SetPage(SdrPage* pNewPage)
586*cdf0e10cSrcweir {
587*cdf0e10cSrcweir 	FASTBOOL bRemove=pNewPage==NULL && pPage!=NULL;
588*cdf0e10cSrcweir 	FASTBOOL bInsert=pNewPage!=NULL && pPage==NULL;
589*cdf0e10cSrcweir 	FASTBOOL bLinked=IsLinkedText();
590*cdf0e10cSrcweir 
591*cdf0e10cSrcweir 	if (bLinked && bRemove) {
592*cdf0e10cSrcweir 		ImpLinkAbmeldung();
593*cdf0e10cSrcweir 	}
594*cdf0e10cSrcweir 
595*cdf0e10cSrcweir 	SdrAttrObj::SetPage(pNewPage);
596*cdf0e10cSrcweir 
597*cdf0e10cSrcweir 	if (bLinked && bInsert) {
598*cdf0e10cSrcweir 		ImpLinkAnmeldung();
599*cdf0e10cSrcweir 	}
600*cdf0e10cSrcweir }
601*cdf0e10cSrcweir 
602*cdf0e10cSrcweir void SdrTextObj::SetModel(SdrModel* pNewModel)
603*cdf0e10cSrcweir {
604*cdf0e10cSrcweir 	SdrModel* pOldModel=pModel;
605*cdf0e10cSrcweir 	bool bLinked=IsLinkedText();
606*cdf0e10cSrcweir 	bool bChg=pNewModel!=pModel;
607*cdf0e10cSrcweir 
608*cdf0e10cSrcweir 	if (bLinked && bChg)
609*cdf0e10cSrcweir 	{
610*cdf0e10cSrcweir 		ImpLinkAbmeldung();
611*cdf0e10cSrcweir 	}
612*cdf0e10cSrcweir 
613*cdf0e10cSrcweir 	SdrAttrObj::SetModel(pNewModel);
614*cdf0e10cSrcweir 
615*cdf0e10cSrcweir 	if( bChg )
616*cdf0e10cSrcweir 	{
617*cdf0e10cSrcweir 		if( pNewModel != 0 && pOldModel != 0 )
618*cdf0e10cSrcweir 			SetTextSizeDirty();
619*cdf0e10cSrcweir 
620*cdf0e10cSrcweir 		sal_Int32 nCount = getTextCount();
621*cdf0e10cSrcweir 		for( sal_Int32 nText = 0; nText < nCount; nText++ )
622*cdf0e10cSrcweir 		{
623*cdf0e10cSrcweir 			SdrText* pText = getText( nText );
624*cdf0e10cSrcweir 			if( pText )
625*cdf0e10cSrcweir 				pText->SetModel( pNewModel );
626*cdf0e10cSrcweir 		}
627*cdf0e10cSrcweir 	}
628*cdf0e10cSrcweir 
629*cdf0e10cSrcweir 	if (bLinked && bChg)
630*cdf0e10cSrcweir 	{
631*cdf0e10cSrcweir 		ImpLinkAnmeldung();
632*cdf0e10cSrcweir 	}
633*cdf0e10cSrcweir }
634*cdf0e10cSrcweir 
635*cdf0e10cSrcweir FASTBOOL SdrTextObj::NbcSetEckenradius(long nRad)
636*cdf0e10cSrcweir {
637*cdf0e10cSrcweir 	SetObjectItem(SdrEckenradiusItem(nRad));
638*cdf0e10cSrcweir 	return sal_True;
639*cdf0e10cSrcweir }
640*cdf0e10cSrcweir 
641*cdf0e10cSrcweir FASTBOOL SdrTextObj::NbcSetAutoGrowHeight(bool bAuto)
642*cdf0e10cSrcweir {
643*cdf0e10cSrcweir 	if(bTextFrame)
644*cdf0e10cSrcweir 	{
645*cdf0e10cSrcweir 		SetObjectItem(SdrTextAutoGrowHeightItem(bAuto));
646*cdf0e10cSrcweir 		return sal_True;
647*cdf0e10cSrcweir 	}
648*cdf0e10cSrcweir 	return sal_False;
649*cdf0e10cSrcweir }
650*cdf0e10cSrcweir 
651*cdf0e10cSrcweir FASTBOOL SdrTextObj::NbcSetMinTextFrameHeight(long nHgt)
652*cdf0e10cSrcweir {
653*cdf0e10cSrcweir 	if( bTextFrame && ( !pModel || !pModel->isLocked() ) )			// SJ: #i44922#
654*cdf0e10cSrcweir 	{
655*cdf0e10cSrcweir 		SetObjectItem(SdrTextMinFrameHeightItem(nHgt));
656*cdf0e10cSrcweir 
657*cdf0e10cSrcweir 		// #84974# use bDisableAutoWidthOnDragging as
658*cdf0e10cSrcweir 		// bDisableAutoHeightOnDragging if vertical.
659*cdf0e10cSrcweir 		if(IsVerticalWriting() && bDisableAutoWidthOnDragging)
660*cdf0e10cSrcweir 		{
661*cdf0e10cSrcweir 			bDisableAutoWidthOnDragging = sal_False;
662*cdf0e10cSrcweir 			SetObjectItem(SdrTextAutoGrowHeightItem(sal_False));
663*cdf0e10cSrcweir 		}
664*cdf0e10cSrcweir 
665*cdf0e10cSrcweir 		return sal_True;
666*cdf0e10cSrcweir 	}
667*cdf0e10cSrcweir 	return sal_False;
668*cdf0e10cSrcweir }
669*cdf0e10cSrcweir 
670*cdf0e10cSrcweir FASTBOOL SdrTextObj::NbcSetMaxTextFrameHeight(long nHgt)
671*cdf0e10cSrcweir {
672*cdf0e10cSrcweir 	if(bTextFrame)
673*cdf0e10cSrcweir 	{
674*cdf0e10cSrcweir 		SetObjectItem(SdrTextMaxFrameHeightItem(nHgt));
675*cdf0e10cSrcweir 		return sal_True;
676*cdf0e10cSrcweir 	}
677*cdf0e10cSrcweir 	return sal_False;
678*cdf0e10cSrcweir }
679*cdf0e10cSrcweir 
680*cdf0e10cSrcweir FASTBOOL SdrTextObj::NbcSetAutoGrowWidth(bool bAuto)
681*cdf0e10cSrcweir {
682*cdf0e10cSrcweir 	if(bTextFrame)
683*cdf0e10cSrcweir 	{
684*cdf0e10cSrcweir 		SetObjectItem(SdrTextAutoGrowWidthItem(bAuto));
685*cdf0e10cSrcweir 		return sal_True;
686*cdf0e10cSrcweir 	}
687*cdf0e10cSrcweir 	return sal_False;
688*cdf0e10cSrcweir }
689*cdf0e10cSrcweir 
690*cdf0e10cSrcweir FASTBOOL SdrTextObj::NbcSetMinTextFrameWidth(long nWdt)
691*cdf0e10cSrcweir {
692*cdf0e10cSrcweir 	if( bTextFrame && ( !pModel || !pModel->isLocked() ) )			// SJ: #i44922#
693*cdf0e10cSrcweir 	{
694*cdf0e10cSrcweir 		SetObjectItem(SdrTextMinFrameWidthItem(nWdt));
695*cdf0e10cSrcweir 
696*cdf0e10cSrcweir 		// #84974# use bDisableAutoWidthOnDragging only
697*cdf0e10cSrcweir 		// when not vertical.
698*cdf0e10cSrcweir 		if(!IsVerticalWriting() && bDisableAutoWidthOnDragging)
699*cdf0e10cSrcweir 		{
700*cdf0e10cSrcweir 			bDisableAutoWidthOnDragging = sal_False;
701*cdf0e10cSrcweir 			SetObjectItem(SdrTextAutoGrowWidthItem(sal_False));
702*cdf0e10cSrcweir 		}
703*cdf0e10cSrcweir 
704*cdf0e10cSrcweir 		return sal_True;
705*cdf0e10cSrcweir 	}
706*cdf0e10cSrcweir 	return sal_False;
707*cdf0e10cSrcweir }
708*cdf0e10cSrcweir 
709*cdf0e10cSrcweir FASTBOOL SdrTextObj::NbcSetMaxTextFrameWidth(long nWdt)
710*cdf0e10cSrcweir {
711*cdf0e10cSrcweir 	if(bTextFrame)
712*cdf0e10cSrcweir 	{
713*cdf0e10cSrcweir 		SetObjectItem(SdrTextMaxFrameWidthItem(nWdt));
714*cdf0e10cSrcweir 		return sal_True;
715*cdf0e10cSrcweir 	}
716*cdf0e10cSrcweir 	return sal_False;
717*cdf0e10cSrcweir }
718*cdf0e10cSrcweir 
719*cdf0e10cSrcweir FASTBOOL SdrTextObj::NbcSetFitToSize(SdrFitToSizeType eFit)
720*cdf0e10cSrcweir {
721*cdf0e10cSrcweir 	if(bTextFrame)
722*cdf0e10cSrcweir 	{
723*cdf0e10cSrcweir 		SetObjectItem(SdrTextFitToSizeTypeItem(eFit));
724*cdf0e10cSrcweir 		return sal_True;
725*cdf0e10cSrcweir 	}
726*cdf0e10cSrcweir 	return sal_False;
727*cdf0e10cSrcweir }
728*cdf0e10cSrcweir 
729*cdf0e10cSrcweir void SdrTextObj::ImpSetContourPolygon( SdrOutliner& rOutliner, Rectangle& rAnchorRect, sal_Bool bLineWidth ) const
730*cdf0e10cSrcweir {
731*cdf0e10cSrcweir 	basegfx::B2DPolyPolygon aXorPolyPolygon(TakeXorPoly());
732*cdf0e10cSrcweir 	basegfx::B2DPolyPolygon* pContourPolyPolygon = 0L;
733*cdf0e10cSrcweir     basegfx::B2DHomMatrix aMatrix(basegfx::tools::createTranslateB2DHomMatrix(
734*cdf0e10cSrcweir         -rAnchorRect.Left(), -rAnchorRect.Top()));
735*cdf0e10cSrcweir 
736*cdf0e10cSrcweir 	if(aGeo.nDrehWink)
737*cdf0e10cSrcweir 	{
738*cdf0e10cSrcweir 		// Unrotate!
739*cdf0e10cSrcweir 		aMatrix.rotate(-aGeo.nDrehWink * nPi180);
740*cdf0e10cSrcweir 	}
741*cdf0e10cSrcweir 
742*cdf0e10cSrcweir 	aXorPolyPolygon.transform(aMatrix);
743*cdf0e10cSrcweir 
744*cdf0e10cSrcweir 	if( bLineWidth )
745*cdf0e10cSrcweir 	{
746*cdf0e10cSrcweir 		// Strichstaerke beruecksichtigen
747*cdf0e10cSrcweir 		// Beim Hittest muss das unterbleiben (Performance!)
748*cdf0e10cSrcweir 		pContourPolyPolygon = new basegfx::B2DPolyPolygon();
749*cdf0e10cSrcweir 
750*cdf0e10cSrcweir 		// #86258# test if shadow needs to be avoided for TakeContour()
751*cdf0e10cSrcweir 		const SfxItemSet& rSet = GetObjectItemSet();
752*cdf0e10cSrcweir 		sal_Bool bShadowOn = ((SdrShadowItem&)(rSet.Get(SDRATTR_SHADOW))).GetValue();
753*cdf0e10cSrcweir 
754*cdf0e10cSrcweir 		// #i33696#
755*cdf0e10cSrcweir 		// Remember TextObject currently set at the DrawOutliner, it WILL be
756*cdf0e10cSrcweir 		// replaced during calculating the outline since it uses an own paint
757*cdf0e10cSrcweir 		// and that one uses the DrawOutliner, too.
758*cdf0e10cSrcweir 		const SdrTextObj* pLastTextObject = rOutliner.GetTextObj();
759*cdf0e10cSrcweir 
760*cdf0e10cSrcweir 		if(bShadowOn)
761*cdf0e10cSrcweir 		{
762*cdf0e10cSrcweir 			// #86258# force shadow off
763*cdf0e10cSrcweir 			SdrObject* pCopy = Clone();
764*cdf0e10cSrcweir 			pCopy->SetMergedItem(SdrShadowItem(sal_False));
765*cdf0e10cSrcweir 			*pContourPolyPolygon = pCopy->TakeContour();
766*cdf0e10cSrcweir 			SdrObject::Free( pCopy );
767*cdf0e10cSrcweir 		}
768*cdf0e10cSrcweir 		else
769*cdf0e10cSrcweir 		{
770*cdf0e10cSrcweir 			*pContourPolyPolygon = TakeContour();
771*cdf0e10cSrcweir 		}
772*cdf0e10cSrcweir 
773*cdf0e10cSrcweir 		// #i33696#
774*cdf0e10cSrcweir 		// restore remembered text object
775*cdf0e10cSrcweir 		if(pLastTextObject != rOutliner.GetTextObj())
776*cdf0e10cSrcweir 		{
777*cdf0e10cSrcweir 			rOutliner.SetTextObj(pLastTextObject);
778*cdf0e10cSrcweir 		}
779*cdf0e10cSrcweir 
780*cdf0e10cSrcweir 		pContourPolyPolygon->transform(aMatrix);
781*cdf0e10cSrcweir 	}
782*cdf0e10cSrcweir 
783*cdf0e10cSrcweir 	rOutliner.SetPolygon(aXorPolyPolygon, pContourPolyPolygon);
784*cdf0e10cSrcweir }
785*cdf0e10cSrcweir 
786*cdf0e10cSrcweir void SdrTextObj::TakeUnrotatedSnapRect(Rectangle& rRect) const
787*cdf0e10cSrcweir {
788*cdf0e10cSrcweir 	rRect=aRect;
789*cdf0e10cSrcweir }
790*cdf0e10cSrcweir 
791*cdf0e10cSrcweir void SdrTextObj::TakeTextAnchorRect(Rectangle& rAnchorRect) const
792*cdf0e10cSrcweir {
793*cdf0e10cSrcweir 	long nLeftDist=GetTextLeftDistance();
794*cdf0e10cSrcweir 	long nRightDist=GetTextRightDistance();
795*cdf0e10cSrcweir 	long nUpperDist=GetTextUpperDistance();
796*cdf0e10cSrcweir 	long nLowerDist=GetTextLowerDistance();
797*cdf0e10cSrcweir 	Rectangle aAnkRect(aRect); // Rect innerhalb dem geankert wird
798*cdf0e10cSrcweir 	FASTBOOL bFrame=IsTextFrame();
799*cdf0e10cSrcweir 	if (!bFrame) {
800*cdf0e10cSrcweir 		TakeUnrotatedSnapRect(aAnkRect);
801*cdf0e10cSrcweir 	}
802*cdf0e10cSrcweir 	Point aRotateRef(aAnkRect.TopLeft());
803*cdf0e10cSrcweir 	aAnkRect.Left()+=nLeftDist;
804*cdf0e10cSrcweir 	aAnkRect.Top()+=nUpperDist;
805*cdf0e10cSrcweir 	aAnkRect.Right()-=nRightDist;
806*cdf0e10cSrcweir 	aAnkRect.Bottom()-=nLowerDist;
807*cdf0e10cSrcweir 
808*cdf0e10cSrcweir 	// #108816#
809*cdf0e10cSrcweir 	// Since sizes may be bigger than the object bounds it is necessary to
810*cdf0e10cSrcweir 	// justify the rect now.
811*cdf0e10cSrcweir 	ImpJustifyRect(aAnkRect);
812*cdf0e10cSrcweir 
813*cdf0e10cSrcweir 	if (bFrame) {
814*cdf0e10cSrcweir 		// !!! hier noch etwas verfeinern !!!
815*cdf0e10cSrcweir 		if (aAnkRect.GetWidth()<2) aAnkRect.Right()=aAnkRect.Left()+1;   // Mindestgroesse 2
816*cdf0e10cSrcweir 		if (aAnkRect.GetHeight()<2) aAnkRect.Bottom()=aAnkRect.Top()+1;  // Mindestgroesse 2
817*cdf0e10cSrcweir 	}
818*cdf0e10cSrcweir 	if (aGeo.nDrehWink!=0) {
819*cdf0e10cSrcweir 		Point aTmpPt(aAnkRect.TopLeft());
820*cdf0e10cSrcweir 		RotatePoint(aTmpPt,aRotateRef,aGeo.nSin,aGeo.nCos);
821*cdf0e10cSrcweir 		aTmpPt-=aAnkRect.TopLeft();
822*cdf0e10cSrcweir 		aAnkRect.Move(aTmpPt.X(),aTmpPt.Y());
823*cdf0e10cSrcweir 	}
824*cdf0e10cSrcweir 	rAnchorRect=aAnkRect;
825*cdf0e10cSrcweir }
826*cdf0e10cSrcweir 
827*cdf0e10cSrcweir void SdrTextObj::TakeTextRect( SdrOutliner& rOutliner, Rectangle& rTextRect, FASTBOOL bNoEditText,
828*cdf0e10cSrcweir 	                           Rectangle* pAnchorRect, sal_Bool bLineWidth ) const
829*cdf0e10cSrcweir {
830*cdf0e10cSrcweir 	Rectangle aAnkRect; // Rect innerhalb dem geankert wird
831*cdf0e10cSrcweir 	TakeTextAnchorRect(aAnkRect);
832*cdf0e10cSrcweir 	SdrTextVertAdjust eVAdj=GetTextVerticalAdjust();
833*cdf0e10cSrcweir 	SdrTextHorzAdjust eHAdj=GetTextHorizontalAdjust();
834*cdf0e10cSrcweir 	SdrTextAniKind      eAniKind=GetTextAniKind();
835*cdf0e10cSrcweir 	SdrTextAniDirection eAniDirection=GetTextAniDirection();
836*cdf0e10cSrcweir 
837*cdf0e10cSrcweir 	SdrFitToSizeType eFit=GetFitToSize();
838*cdf0e10cSrcweir 	FASTBOOL bFitToSize=(eFit==SDRTEXTFIT_PROPORTIONAL || eFit==SDRTEXTFIT_ALLLINES);
839*cdf0e10cSrcweir 	FASTBOOL bContourFrame=IsContourTextFrame();
840*cdf0e10cSrcweir 
841*cdf0e10cSrcweir 	FASTBOOL bFrame=IsTextFrame();
842*cdf0e10cSrcweir 	sal_uIntPtr nStat0=rOutliner.GetControlWord();
843*cdf0e10cSrcweir 	Size aNullSize;
844*cdf0e10cSrcweir 	if (!bContourFrame)
845*cdf0e10cSrcweir 	{
846*cdf0e10cSrcweir 		rOutliner.SetControlWord(nStat0|EE_CNTRL_AUTOPAGESIZE);
847*cdf0e10cSrcweir 		rOutliner.SetMinAutoPaperSize(aNullSize);
848*cdf0e10cSrcweir 		rOutliner.SetMaxAutoPaperSize(Size(1000000,1000000));
849*cdf0e10cSrcweir 	}
850*cdf0e10cSrcweir 
851*cdf0e10cSrcweir 	if (!bFitToSize && !bContourFrame)
852*cdf0e10cSrcweir 	{
853*cdf0e10cSrcweir 		long nAnkWdt=aAnkRect.GetWidth();
854*cdf0e10cSrcweir 		long nAnkHgt=aAnkRect.GetHeight();
855*cdf0e10cSrcweir 		if (bFrame)
856*cdf0e10cSrcweir 		{
857*cdf0e10cSrcweir 			long nWdt=nAnkWdt;
858*cdf0e10cSrcweir 			long nHgt=nAnkHgt;
859*cdf0e10cSrcweir 
860*cdf0e10cSrcweir 			// #101684#
861*cdf0e10cSrcweir 			sal_Bool bInEditMode = IsInEditMode();
862*cdf0e10cSrcweir 
863*cdf0e10cSrcweir 			if (!bInEditMode && (eAniKind==SDRTEXTANI_SCROLL || eAniKind==SDRTEXTANI_ALTERNATE || eAniKind==SDRTEXTANI_SLIDE))
864*cdf0e10cSrcweir 			{
865*cdf0e10cSrcweir 				// Grenzenlose Papiergroesse fuer Laufschrift
866*cdf0e10cSrcweir 				if (eAniDirection==SDRTEXTANI_LEFT || eAniDirection==SDRTEXTANI_RIGHT) nWdt=1000000;
867*cdf0e10cSrcweir 				if (eAniDirection==SDRTEXTANI_UP || eAniDirection==SDRTEXTANI_DOWN) nHgt=1000000;
868*cdf0e10cSrcweir 			}
869*cdf0e10cSrcweir 			rOutliner.SetMaxAutoPaperSize(Size(nWdt,nHgt));
870*cdf0e10cSrcweir 		}
871*cdf0e10cSrcweir 
872*cdf0e10cSrcweir 		// #103516# New try with _BLOCK for hor and ver after completely
873*cdf0e10cSrcweir 		// supporting full width for vertical text.
874*cdf0e10cSrcweir 		if(SDRTEXTHORZADJUST_BLOCK == eHAdj && !IsVerticalWriting())
875*cdf0e10cSrcweir 		{
876*cdf0e10cSrcweir 			rOutliner.SetMinAutoPaperSize(Size(nAnkWdt, 0));
877*cdf0e10cSrcweir 		}
878*cdf0e10cSrcweir 
879*cdf0e10cSrcweir 		if(SDRTEXTVERTADJUST_BLOCK == eVAdj && IsVerticalWriting())
880*cdf0e10cSrcweir 		{
881*cdf0e10cSrcweir 			rOutliner.SetMinAutoPaperSize(Size(0, nAnkHgt));
882*cdf0e10cSrcweir 		}
883*cdf0e10cSrcweir 	}
884*cdf0e10cSrcweir 
885*cdf0e10cSrcweir 	rOutliner.SetPaperSize(aNullSize);
886*cdf0e10cSrcweir 	if (bContourFrame)
887*cdf0e10cSrcweir 		ImpSetContourPolygon( rOutliner, aAnkRect, bLineWidth );
888*cdf0e10cSrcweir 
889*cdf0e10cSrcweir 	// put text into the outliner, if available from the edit outliner
890*cdf0e10cSrcweir 	SdrText* pText = getActiveText();
891*cdf0e10cSrcweir 	OutlinerParaObject* pOutlinerParaObject = pText ? pText->GetOutlinerParaObject() : 0;
892*cdf0e10cSrcweir 	OutlinerParaObject* pPara = (pEdtOutl && !bNoEditText) ? pEdtOutl->CreateParaObject() : pOutlinerParaObject;
893*cdf0e10cSrcweir 
894*cdf0e10cSrcweir 	if (pPara)
895*cdf0e10cSrcweir 	{
896*cdf0e10cSrcweir 		sal_Bool bHitTest = sal_False;
897*cdf0e10cSrcweir 		if( pModel )
898*cdf0e10cSrcweir 			bHitTest = &pModel->GetHitTestOutliner() == &rOutliner;
899*cdf0e10cSrcweir 
900*cdf0e10cSrcweir 		const SdrTextObj* pTestObj = rOutliner.GetTextObj();
901*cdf0e10cSrcweir 		if( !pTestObj || !bHitTest || pTestObj != this ||
902*cdf0e10cSrcweir 		    pTestObj->GetOutlinerParaObject() != pOutlinerParaObject )
903*cdf0e10cSrcweir 		{
904*cdf0e10cSrcweir 			if( bHitTest ) // #i33696# take back fix #i27510#
905*cdf0e10cSrcweir 			{
906*cdf0e10cSrcweir 				rOutliner.SetTextObj( this );
907*cdf0e10cSrcweir 				rOutliner.SetFixedCellHeight(((const SdrTextFixedCellHeightItem&)GetMergedItem(SDRATTR_TEXT_USEFIXEDCELLHEIGHT)).GetValue());
908*cdf0e10cSrcweir 			}
909*cdf0e10cSrcweir 
910*cdf0e10cSrcweir 			rOutliner.SetUpdateMode(sal_True);
911*cdf0e10cSrcweir 			rOutliner.SetText(*pPara);
912*cdf0e10cSrcweir 		}
913*cdf0e10cSrcweir 	}
914*cdf0e10cSrcweir 	else
915*cdf0e10cSrcweir 	{
916*cdf0e10cSrcweir 		rOutliner.SetTextObj( NULL );
917*cdf0e10cSrcweir 	}
918*cdf0e10cSrcweir 
919*cdf0e10cSrcweir 	if (pEdtOutl && !bNoEditText && pPara)
920*cdf0e10cSrcweir 		delete pPara;
921*cdf0e10cSrcweir 
922*cdf0e10cSrcweir 	rOutliner.SetUpdateMode(sal_True);
923*cdf0e10cSrcweir 	rOutliner.SetControlWord(nStat0);
924*cdf0e10cSrcweir 
925*cdf0e10cSrcweir 	if( pText )
926*cdf0e10cSrcweir 		pText->CheckPortionInfo(rOutliner);
927*cdf0e10cSrcweir 
928*cdf0e10cSrcweir 	Point aTextPos(aAnkRect.TopLeft());
929*cdf0e10cSrcweir 	Size aTextSiz(rOutliner.GetPaperSize()); // GetPaperSize() hat etwas Toleranz drauf, oder?
930*cdf0e10cSrcweir 
931*cdf0e10cSrcweir 	// #106653#
932*cdf0e10cSrcweir 	// For draw objects containing text correct hor/ver alignment if text is bigger
933*cdf0e10cSrcweir 	// than the object itself. Without that correction, the text would always be
934*cdf0e10cSrcweir 	// formatted to the left edge (or top edge when vertical) of the draw object.
935*cdf0e10cSrcweir 	if(!IsTextFrame())
936*cdf0e10cSrcweir 	{
937*cdf0e10cSrcweir 		if(aAnkRect.GetWidth() < aTextSiz.Width() && !IsVerticalWriting())
938*cdf0e10cSrcweir 		{
939*cdf0e10cSrcweir 			// #110129#
940*cdf0e10cSrcweir 			// Horizontal case here. Correct only if eHAdj == SDRTEXTHORZADJUST_BLOCK,
941*cdf0e10cSrcweir 			// else the alignment is wanted.
942*cdf0e10cSrcweir 			if(SDRTEXTHORZADJUST_BLOCK == eHAdj)
943*cdf0e10cSrcweir 			{
944*cdf0e10cSrcweir 				eHAdj = SDRTEXTHORZADJUST_CENTER;
945*cdf0e10cSrcweir 			}
946*cdf0e10cSrcweir 		}
947*cdf0e10cSrcweir 
948*cdf0e10cSrcweir 		if(aAnkRect.GetHeight() < aTextSiz.Height() && IsVerticalWriting())
949*cdf0e10cSrcweir 		{
950*cdf0e10cSrcweir 			// #110129#
951*cdf0e10cSrcweir 			// Vertical case here. Correct only if eHAdj == SDRTEXTVERTADJUST_BLOCK,
952*cdf0e10cSrcweir 			// else the alignment is wanted.
953*cdf0e10cSrcweir 			if(SDRTEXTVERTADJUST_BLOCK == eVAdj)
954*cdf0e10cSrcweir 			{
955*cdf0e10cSrcweir 				eVAdj = SDRTEXTVERTADJUST_CENTER;
956*cdf0e10cSrcweir 			}
957*cdf0e10cSrcweir 		}
958*cdf0e10cSrcweir 	}
959*cdf0e10cSrcweir 
960*cdf0e10cSrcweir 	if (eHAdj==SDRTEXTHORZADJUST_CENTER || eHAdj==SDRTEXTHORZADJUST_RIGHT)
961*cdf0e10cSrcweir 	{
962*cdf0e10cSrcweir 		long nFreeWdt=aAnkRect.GetWidth()-aTextSiz.Width();
963*cdf0e10cSrcweir 		if (eHAdj==SDRTEXTHORZADJUST_CENTER)
964*cdf0e10cSrcweir 			aTextPos.X()+=nFreeWdt/2;
965*cdf0e10cSrcweir 		if (eHAdj==SDRTEXTHORZADJUST_RIGHT)
966*cdf0e10cSrcweir 			aTextPos.X()+=nFreeWdt;
967*cdf0e10cSrcweir 	}
968*cdf0e10cSrcweir 	if (eVAdj==SDRTEXTVERTADJUST_CENTER || eVAdj==SDRTEXTVERTADJUST_BOTTOM)
969*cdf0e10cSrcweir 	{
970*cdf0e10cSrcweir 		long nFreeHgt=aAnkRect.GetHeight()-aTextSiz.Height();
971*cdf0e10cSrcweir 		if (eVAdj==SDRTEXTVERTADJUST_CENTER)
972*cdf0e10cSrcweir 			aTextPos.Y()+=nFreeHgt/2;
973*cdf0e10cSrcweir 		if (eVAdj==SDRTEXTVERTADJUST_BOTTOM)
974*cdf0e10cSrcweir 			aTextPos.Y()+=nFreeHgt;
975*cdf0e10cSrcweir 	}
976*cdf0e10cSrcweir 	if (aGeo.nDrehWink!=0)
977*cdf0e10cSrcweir 		RotatePoint(aTextPos,aAnkRect.TopLeft(),aGeo.nSin,aGeo.nCos);
978*cdf0e10cSrcweir 
979*cdf0e10cSrcweir 	if (pAnchorRect)
980*cdf0e10cSrcweir 		*pAnchorRect=aAnkRect;
981*cdf0e10cSrcweir 
982*cdf0e10cSrcweir 	// rTextRect ist bei ContourFrame in einigen Faellen nicht korrekt
983*cdf0e10cSrcweir 	rTextRect=Rectangle(aTextPos,aTextSiz);
984*cdf0e10cSrcweir 	if (bContourFrame)
985*cdf0e10cSrcweir 		rTextRect=aAnkRect;
986*cdf0e10cSrcweir }
987*cdf0e10cSrcweir 
988*cdf0e10cSrcweir OutlinerParaObject* SdrTextObj::GetEditOutlinerParaObject() const
989*cdf0e10cSrcweir {
990*cdf0e10cSrcweir 	OutlinerParaObject* pPara=NULL;
991*cdf0e10cSrcweir 	if( HasTextImpl( pEdtOutl ) )
992*cdf0e10cSrcweir 	{
993*cdf0e10cSrcweir 		sal_uInt16 nParaAnz = static_cast< sal_uInt16 >( pEdtOutl->GetParagraphCount() );
994*cdf0e10cSrcweir 		pPara = pEdtOutl->CreateParaObject(0, nParaAnz);
995*cdf0e10cSrcweir 	}
996*cdf0e10cSrcweir 	return pPara;
997*cdf0e10cSrcweir }
998*cdf0e10cSrcweir 
999*cdf0e10cSrcweir void SdrTextObj::ImpSetCharStretching(SdrOutliner& rOutliner, const Rectangle& rTextRect, const Rectangle& rAnchorRect, Fraction& rFitXKorreg) const
1000*cdf0e10cSrcweir {
1001*cdf0e10cSrcweir 	OutputDevice* pOut = rOutliner.GetRefDevice();
1002*cdf0e10cSrcweir 	sal_Bool bNoStretching(sal_False);
1003*cdf0e10cSrcweir 
1004*cdf0e10cSrcweir 	if(pOut && pOut->GetOutDevType() == OUTDEV_PRINTER)
1005*cdf0e10cSrcweir 	{
1006*cdf0e10cSrcweir 		// #35762#: Checken ob CharStretching ueberhaupt moeglich
1007*cdf0e10cSrcweir 		GDIMetaFile* pMtf = pOut->GetConnectMetaFile();
1008*cdf0e10cSrcweir 		UniString aTestString(sal_Unicode('J'));
1009*cdf0e10cSrcweir 
1010*cdf0e10cSrcweir 		if(pMtf && (!pMtf->IsRecord() || pMtf->IsPause()))
1011*cdf0e10cSrcweir 			pMtf = NULL;
1012*cdf0e10cSrcweir 
1013*cdf0e10cSrcweir 		if(pMtf)
1014*cdf0e10cSrcweir 			pMtf->Pause(sal_True);
1015*cdf0e10cSrcweir 
1016*cdf0e10cSrcweir 		Font aFontMerk(pOut->GetFont());
1017*cdf0e10cSrcweir 		Font aTmpFont( OutputDevice::GetDefaultFont( DEFAULTFONT_SERIF, LANGUAGE_SYSTEM, DEFAULTFONT_FLAGS_ONLYONE ) );
1018*cdf0e10cSrcweir 
1019*cdf0e10cSrcweir 		aTmpFont.SetSize(Size(0,100));
1020*cdf0e10cSrcweir 		pOut->SetFont(aTmpFont);
1021*cdf0e10cSrcweir 		Size aSize1(pOut->GetTextWidth(aTestString), pOut->GetTextHeight());
1022*cdf0e10cSrcweir 		aTmpFont.SetSize(Size(800,100));
1023*cdf0e10cSrcweir 		pOut->SetFont(aTmpFont);
1024*cdf0e10cSrcweir 		Size aSize2(pOut->GetTextWidth(aTestString), pOut->GetTextHeight());
1025*cdf0e10cSrcweir 		pOut->SetFont(aFontMerk);
1026*cdf0e10cSrcweir 
1027*cdf0e10cSrcweir 		if(pMtf)
1028*cdf0e10cSrcweir 			pMtf->Pause(sal_False);
1029*cdf0e10cSrcweir 
1030*cdf0e10cSrcweir 		bNoStretching = (aSize1 == aSize2);
1031*cdf0e10cSrcweir 
1032*cdf0e10cSrcweir #ifdef WNT
1033*cdf0e10cSrcweir 		// #35762# Windows vergroessert bei Size(100,500) den Font proportional
1034*cdf0e10cSrcweir 		// Und das finden wir nicht so schoen.
1035*cdf0e10cSrcweir 		if(aSize2.Height() >= aSize1.Height() * 2)
1036*cdf0e10cSrcweir 		{
1037*cdf0e10cSrcweir 			bNoStretching = sal_True;
1038*cdf0e10cSrcweir 		}
1039*cdf0e10cSrcweir #endif
1040*cdf0e10cSrcweir 	}
1041*cdf0e10cSrcweir 	unsigned nLoopCount=0;
1042*cdf0e10cSrcweir 	FASTBOOL bNoMoreLoop=sal_False;
1043*cdf0e10cSrcweir 	long nXDiff0=0x7FFFFFFF;
1044*cdf0e10cSrcweir 	long nWantWdt=rAnchorRect.Right()-rAnchorRect.Left();
1045*cdf0e10cSrcweir 	long nIsWdt=rTextRect.Right()-rTextRect.Left();
1046*cdf0e10cSrcweir 	if (nIsWdt==0) nIsWdt=1;
1047*cdf0e10cSrcweir 
1048*cdf0e10cSrcweir 	long nWantHgt=rAnchorRect.Bottom()-rAnchorRect.Top();
1049*cdf0e10cSrcweir 	long nIsHgt=rTextRect.Bottom()-rTextRect.Top();
1050*cdf0e10cSrcweir 	if (nIsHgt==0) nIsHgt=1;
1051*cdf0e10cSrcweir 
1052*cdf0e10cSrcweir 	long nXTolPl=nWantWdt/100; // Toleranz +1%
1053*cdf0e10cSrcweir 	long nXTolMi=nWantWdt/25;  // Toleranz -4%
1054*cdf0e10cSrcweir 	long nXKorr =nWantWdt/20;  // Korrekturmasstab 5%
1055*cdf0e10cSrcweir 
1056*cdf0e10cSrcweir 	long nX=(nWantWdt*100) /nIsWdt; // X-Stretching berechnen
1057*cdf0e10cSrcweir 	long nY=(nWantHgt*100) /nIsHgt; // Y-Stretching berechnen
1058*cdf0e10cSrcweir 	FASTBOOL bChkX=sal_True;
1059*cdf0e10cSrcweir 	FASTBOOL bChkY=sal_True;
1060*cdf0e10cSrcweir 	if (bNoStretching) { // #35762# evtl. nur proportional moeglich
1061*cdf0e10cSrcweir 		if (nX>nY) { nX=nY; bChkX=sal_False; }
1062*cdf0e10cSrcweir 		else { nY=nX; bChkY=sal_False; }
1063*cdf0e10cSrcweir 	}
1064*cdf0e10cSrcweir 
1065*cdf0e10cSrcweir 	while (nLoopCount<5 && !bNoMoreLoop) {
1066*cdf0e10cSrcweir 		if (nX<0) nX=-nX;
1067*cdf0e10cSrcweir 		if (nX<1) { nX=1; bNoMoreLoop=sal_True; }
1068*cdf0e10cSrcweir 		if (nX>65535) { nX=65535; bNoMoreLoop=sal_True; }
1069*cdf0e10cSrcweir 
1070*cdf0e10cSrcweir 		if (nY<0) nY=-nY;
1071*cdf0e10cSrcweir 		if (nY<1) { nY=1; bNoMoreLoop=sal_True; }
1072*cdf0e10cSrcweir 		if (nY>65535) { nY=65535; bNoMoreLoop=sal_True; }
1073*cdf0e10cSrcweir 
1074*cdf0e10cSrcweir 		// exception, there is no text yet (horizontal case)
1075*cdf0e10cSrcweir 		if(nIsWdt <= 1)
1076*cdf0e10cSrcweir 		{
1077*cdf0e10cSrcweir 			nX = nY;
1078*cdf0e10cSrcweir 			bNoMoreLoop = sal_True;
1079*cdf0e10cSrcweir 		}
1080*cdf0e10cSrcweir 
1081*cdf0e10cSrcweir 		// #87877# exception, there is no text yet (vertical case)
1082*cdf0e10cSrcweir 		if(nIsHgt <= 1)
1083*cdf0e10cSrcweir 		{
1084*cdf0e10cSrcweir 			nY = nX;
1085*cdf0e10cSrcweir 			bNoMoreLoop = sal_True;
1086*cdf0e10cSrcweir 		}
1087*cdf0e10cSrcweir 
1088*cdf0e10cSrcweir 		rOutliner.SetGlobalCharStretching((sal_uInt16)nX,(sal_uInt16)nY);
1089*cdf0e10cSrcweir 		nLoopCount++;
1090*cdf0e10cSrcweir 		Size aSiz(rOutliner.CalcTextSize());
1091*cdf0e10cSrcweir 		long nXDiff=aSiz.Width()-nWantWdt;
1092*cdf0e10cSrcweir 		rFitXKorreg=Fraction(nWantWdt,aSiz.Width());
1093*cdf0e10cSrcweir 		if (((nXDiff>=nXTolMi || !bChkX) && nXDiff<=nXTolPl) || nXDiff==nXDiff0/*&& Abs(nYDiff)<=nYTol*/) {
1094*cdf0e10cSrcweir 			bNoMoreLoop=sal_True;
1095*cdf0e10cSrcweir 		} else {
1096*cdf0e10cSrcweir 			// Stretchingfaktoren korregieren
1097*cdf0e10cSrcweir 			long nMul=nWantWdt;
1098*cdf0e10cSrcweir 			long nDiv=aSiz.Width();
1099*cdf0e10cSrcweir 			if (Abs(nXDiff)<=2*nXKorr) {
1100*cdf0e10cSrcweir 				if (nMul>nDiv) nDiv+=(nMul-nDiv)/2; // und zwar nur um die haelfte des berechneten
1101*cdf0e10cSrcweir 				else nMul+=(nDiv-nMul)/2;           // weil die EE ja eh wieder falsch rechnet
1102*cdf0e10cSrcweir 			}
1103*cdf0e10cSrcweir 			nX=nX*nMul/nDiv;
1104*cdf0e10cSrcweir 			if (bNoStretching) nY=nX;
1105*cdf0e10cSrcweir 		}
1106*cdf0e10cSrcweir 		nXDiff0=nXDiff;
1107*cdf0e10cSrcweir 	}
1108*cdf0e10cSrcweir }
1109*cdf0e10cSrcweir 
1110*cdf0e10cSrcweir void SdrTextObj::StartTextAnimation(OutputDevice* /*pOutDev*/, const Point& /*rOffset*/, long /*nExtraData*/)
1111*cdf0e10cSrcweir {
1112*cdf0e10cSrcweir 	// #111096#
1113*cdf0e10cSrcweir 	// use new text animation
1114*cdf0e10cSrcweir 	SetTextAnimationAllowed(sal_True);
1115*cdf0e10cSrcweir }
1116*cdf0e10cSrcweir 
1117*cdf0e10cSrcweir void SdrTextObj::StopTextAnimation(OutputDevice* /*pOutDev*/, long /*nExtraData*/)
1118*cdf0e10cSrcweir {
1119*cdf0e10cSrcweir 	// #111096#
1120*cdf0e10cSrcweir 	// use new text animation
1121*cdf0e10cSrcweir 	SetTextAnimationAllowed(sal_False);
1122*cdf0e10cSrcweir }
1123*cdf0e10cSrcweir 
1124*cdf0e10cSrcweir void SdrTextObj::TakeObjNameSingul(XubString& rName) const
1125*cdf0e10cSrcweir {
1126*cdf0e10cSrcweir 	XubString aStr;
1127*cdf0e10cSrcweir 
1128*cdf0e10cSrcweir 	switch(eTextKind)
1129*cdf0e10cSrcweir 	{
1130*cdf0e10cSrcweir 		case OBJ_OUTLINETEXT:
1131*cdf0e10cSrcweir 		{
1132*cdf0e10cSrcweir 			aStr = ImpGetResStr(STR_ObjNameSingulOUTLINETEXT);
1133*cdf0e10cSrcweir 			break;
1134*cdf0e10cSrcweir 		}
1135*cdf0e10cSrcweir 
1136*cdf0e10cSrcweir 		case OBJ_TITLETEXT  :
1137*cdf0e10cSrcweir 		{
1138*cdf0e10cSrcweir 			aStr = ImpGetResStr(STR_ObjNameSingulTITLETEXT);
1139*cdf0e10cSrcweir 			break;
1140*cdf0e10cSrcweir 		}
1141*cdf0e10cSrcweir 
1142*cdf0e10cSrcweir 		default:
1143*cdf0e10cSrcweir 		{
1144*cdf0e10cSrcweir 			if(IsLinkedText())
1145*cdf0e10cSrcweir 				aStr = ImpGetResStr(STR_ObjNameSingulTEXTLNK);
1146*cdf0e10cSrcweir 			else
1147*cdf0e10cSrcweir 				aStr = ImpGetResStr(STR_ObjNameSingulTEXT);
1148*cdf0e10cSrcweir 			break;
1149*cdf0e10cSrcweir 		}
1150*cdf0e10cSrcweir 	}
1151*cdf0e10cSrcweir 
1152*cdf0e10cSrcweir 	OutlinerParaObject* pOutlinerParaObject = GetOutlinerParaObject();
1153*cdf0e10cSrcweir 	if(pOutlinerParaObject && eTextKind != OBJ_OUTLINETEXT)
1154*cdf0e10cSrcweir 	{
1155*cdf0e10cSrcweir 		// Macht bei OUTLINETEXT wohl derzeit noch etwas Probleme
1156*cdf0e10cSrcweir 		XubString aStr2(pOutlinerParaObject->GetTextObject().GetText(0));
1157*cdf0e10cSrcweir 		aStr2.EraseLeadingChars();
1158*cdf0e10cSrcweir 
1159*cdf0e10cSrcweir 		// #69446# avoid non expanded text portions in object name
1160*cdf0e10cSrcweir 		// (second condition is new)
1161*cdf0e10cSrcweir 		if(aStr2.Len() && aStr2.Search(sal_Unicode(255)) == STRING_NOTFOUND)
1162*cdf0e10cSrcweir 		{
1163*cdf0e10cSrcweir 			// #76681# space between ResStr and content text
1164*cdf0e10cSrcweir 			aStr += sal_Unicode(' ');
1165*cdf0e10cSrcweir 
1166*cdf0e10cSrcweir 			aStr += sal_Unicode('\'');
1167*cdf0e10cSrcweir 
1168*cdf0e10cSrcweir 			if(aStr2.Len() > 10)
1169*cdf0e10cSrcweir 			{
1170*cdf0e10cSrcweir 				aStr2.Erase(8);
1171*cdf0e10cSrcweir 				aStr2.AppendAscii("...", 3);
1172*cdf0e10cSrcweir 			}
1173*cdf0e10cSrcweir 
1174*cdf0e10cSrcweir 			aStr += aStr2;
1175*cdf0e10cSrcweir 			aStr += sal_Unicode('\'');
1176*cdf0e10cSrcweir 		}
1177*cdf0e10cSrcweir 	}
1178*cdf0e10cSrcweir 
1179*cdf0e10cSrcweir 	rName = aStr;
1180*cdf0e10cSrcweir 
1181*cdf0e10cSrcweir 	String aName( GetName() );
1182*cdf0e10cSrcweir 	if(aName.Len())
1183*cdf0e10cSrcweir 	{
1184*cdf0e10cSrcweir 		rName += sal_Unicode(' ');
1185*cdf0e10cSrcweir 		rName += sal_Unicode('\'');
1186*cdf0e10cSrcweir 		rName += aName;
1187*cdf0e10cSrcweir 		rName += sal_Unicode('\'');
1188*cdf0e10cSrcweir 	}
1189*cdf0e10cSrcweir 
1190*cdf0e10cSrcweir }
1191*cdf0e10cSrcweir 
1192*cdf0e10cSrcweir void SdrTextObj::TakeObjNamePlural(XubString& rName) const
1193*cdf0e10cSrcweir {
1194*cdf0e10cSrcweir 	switch (eTextKind) {
1195*cdf0e10cSrcweir 		case OBJ_OUTLINETEXT: rName=ImpGetResStr(STR_ObjNamePluralOUTLINETEXT); break;
1196*cdf0e10cSrcweir 		case OBJ_TITLETEXT  : rName=ImpGetResStr(STR_ObjNamePluralTITLETEXT);   break;
1197*cdf0e10cSrcweir 		default: {
1198*cdf0e10cSrcweir 			if (IsLinkedText()) {
1199*cdf0e10cSrcweir 				rName=ImpGetResStr(STR_ObjNamePluralTEXTLNK);
1200*cdf0e10cSrcweir 			} else {
1201*cdf0e10cSrcweir 				rName=ImpGetResStr(STR_ObjNamePluralTEXT);
1202*cdf0e10cSrcweir 			}
1203*cdf0e10cSrcweir 		} break;
1204*cdf0e10cSrcweir 	} // switch
1205*cdf0e10cSrcweir }
1206*cdf0e10cSrcweir 
1207*cdf0e10cSrcweir void SdrTextObj::operator=(const SdrObject& rObj)
1208*cdf0e10cSrcweir {
1209*cdf0e10cSrcweir 	// call parent
1210*cdf0e10cSrcweir 	SdrObject::operator=(rObj);
1211*cdf0e10cSrcweir 
1212*cdf0e10cSrcweir 	const SdrTextObj* pTextObj = dynamic_cast< const SdrTextObj* >( &rObj );
1213*cdf0e10cSrcweir 	if (pTextObj!=NULL)
1214*cdf0e10cSrcweir 	{
1215*cdf0e10cSrcweir 		aRect     =pTextObj->aRect;
1216*cdf0e10cSrcweir 		aGeo      =pTextObj->aGeo;
1217*cdf0e10cSrcweir 		eTextKind =pTextObj->eTextKind;
1218*cdf0e10cSrcweir 		bTextFrame=pTextObj->bTextFrame;
1219*cdf0e10cSrcweir 		aTextSize=pTextObj->aTextSize;
1220*cdf0e10cSrcweir 		bTextSizeDirty=pTextObj->bTextSizeDirty;
1221*cdf0e10cSrcweir 
1222*cdf0e10cSrcweir 		// #101776# Not all of the necessary parameters were copied yet.
1223*cdf0e10cSrcweir 		bNoShear = pTextObj->bNoShear;
1224*cdf0e10cSrcweir 		bNoRotate = pTextObj->bNoRotate;
1225*cdf0e10cSrcweir 		bNoMirror = pTextObj->bNoMirror;
1226*cdf0e10cSrcweir 		bDisableAutoWidthOnDragging = pTextObj->bDisableAutoWidthOnDragging;
1227*cdf0e10cSrcweir 
1228*cdf0e10cSrcweir 		OutlinerParaObject* pNewOutlinerParaObject = 0;
1229*cdf0e10cSrcweir 
1230*cdf0e10cSrcweir 		SdrText* pText = getActiveText();
1231*cdf0e10cSrcweir 
1232*cdf0e10cSrcweir 		if( pText && pTextObj->HasText() )
1233*cdf0e10cSrcweir 		{
1234*cdf0e10cSrcweir 			const Outliner* pEO=pTextObj->pEdtOutl;
1235*cdf0e10cSrcweir 			if (pEO!=NULL)
1236*cdf0e10cSrcweir 			{
1237*cdf0e10cSrcweir 				pNewOutlinerParaObject = pEO->CreateParaObject();
1238*cdf0e10cSrcweir 			}
1239*cdf0e10cSrcweir 			else
1240*cdf0e10cSrcweir 			{
1241*cdf0e10cSrcweir 				pNewOutlinerParaObject = new OutlinerParaObject(*pTextObj->getActiveText()->GetOutlinerParaObject());
1242*cdf0e10cSrcweir 			}
1243*cdf0e10cSrcweir 		}
1244*cdf0e10cSrcweir 
1245*cdf0e10cSrcweir 		mpText->SetOutlinerParaObject( pNewOutlinerParaObject );
1246*cdf0e10cSrcweir 		ImpSetTextStyleSheetListeners();
1247*cdf0e10cSrcweir 	}
1248*cdf0e10cSrcweir }
1249*cdf0e10cSrcweir 
1250*cdf0e10cSrcweir basegfx::B2DPolyPolygon SdrTextObj::TakeXorPoly() const
1251*cdf0e10cSrcweir {
1252*cdf0e10cSrcweir 	Polygon aPol(aRect);
1253*cdf0e10cSrcweir 	if (aGeo.nShearWink!=0) ShearPoly(aPol,aRect.TopLeft(),aGeo.nTan);
1254*cdf0e10cSrcweir 	if (aGeo.nDrehWink!=0) RotatePoly(aPol,aRect.TopLeft(),aGeo.nSin,aGeo.nCos);
1255*cdf0e10cSrcweir 
1256*cdf0e10cSrcweir 	basegfx::B2DPolyPolygon aRetval;
1257*cdf0e10cSrcweir 	aRetval.append(aPol.getB2DPolygon());
1258*cdf0e10cSrcweir 	return aRetval;
1259*cdf0e10cSrcweir }
1260*cdf0e10cSrcweir 
1261*cdf0e10cSrcweir basegfx::B2DPolyPolygon SdrTextObj::TakeContour() const
1262*cdf0e10cSrcweir {
1263*cdf0e10cSrcweir 	basegfx::B2DPolyPolygon aRetval(SdrAttrObj::TakeContour());
1264*cdf0e10cSrcweir 
1265*cdf0e10cSrcweir 	// und nun noch ggf. das BoundRect des Textes dazu
1266*cdf0e10cSrcweir 	if ( pModel && GetOutlinerParaObject() && !IsFontwork() && !IsContourTextFrame() )
1267*cdf0e10cSrcweir 	{
1268*cdf0e10cSrcweir 		// #80328# using Clone()-Paint() strategy inside TakeContour() leaves a destroyed
1269*cdf0e10cSrcweir 		// SdrObject as pointer in DrawOutliner. Set *this again in fetching the outliner
1270*cdf0e10cSrcweir 		// in every case
1271*cdf0e10cSrcweir 		SdrOutliner& rOutliner=ImpGetDrawOutliner();
1272*cdf0e10cSrcweir 
1273*cdf0e10cSrcweir 		Rectangle aAnchor2;
1274*cdf0e10cSrcweir 		Rectangle aR;
1275*cdf0e10cSrcweir 		TakeTextRect(rOutliner,aR,sal_False,&aAnchor2);
1276*cdf0e10cSrcweir 		rOutliner.Clear();
1277*cdf0e10cSrcweir 		SdrFitToSizeType eFit=GetFitToSize();
1278*cdf0e10cSrcweir 		FASTBOOL bFitToSize=(eFit==SDRTEXTFIT_PROPORTIONAL || eFit==SDRTEXTFIT_ALLLINES);
1279*cdf0e10cSrcweir 		if (bFitToSize) aR=aAnchor2;
1280*cdf0e10cSrcweir 		Polygon aPol(aR);
1281*cdf0e10cSrcweir 		if (aGeo.nDrehWink!=0) RotatePoly(aPol,aR.TopLeft(),aGeo.nSin,aGeo.nCos);
1282*cdf0e10cSrcweir 
1283*cdf0e10cSrcweir 		aRetval.append(aPol.getB2DPolygon());
1284*cdf0e10cSrcweir 	}
1285*cdf0e10cSrcweir 
1286*cdf0e10cSrcweir 	return aRetval;
1287*cdf0e10cSrcweir }
1288*cdf0e10cSrcweir 
1289*cdf0e10cSrcweir void SdrTextObj::RecalcSnapRect()
1290*cdf0e10cSrcweir {
1291*cdf0e10cSrcweir 	if (aGeo.nDrehWink!=0 || aGeo.nShearWink!=0) {
1292*cdf0e10cSrcweir 		Polygon aPol(aRect);
1293*cdf0e10cSrcweir 		if (aGeo.nShearWink!=0) ShearPoly(aPol,aRect.TopLeft(),aGeo.nTan);
1294*cdf0e10cSrcweir 		if (aGeo.nDrehWink!=0) RotatePoly(aPol,aRect.TopLeft(),aGeo.nSin,aGeo.nCos);
1295*cdf0e10cSrcweir 		maSnapRect=aPol.GetBoundRect();
1296*cdf0e10cSrcweir 	} else {
1297*cdf0e10cSrcweir 		maSnapRect=aRect;
1298*cdf0e10cSrcweir 	}
1299*cdf0e10cSrcweir }
1300*cdf0e10cSrcweir 
1301*cdf0e10cSrcweir sal_uInt32 SdrTextObj::GetSnapPointCount() const
1302*cdf0e10cSrcweir {
1303*cdf0e10cSrcweir 	return 4L;
1304*cdf0e10cSrcweir }
1305*cdf0e10cSrcweir 
1306*cdf0e10cSrcweir Point SdrTextObj::GetSnapPoint(sal_uInt32 i) const
1307*cdf0e10cSrcweir {
1308*cdf0e10cSrcweir 	Point aP;
1309*cdf0e10cSrcweir 	switch (i) {
1310*cdf0e10cSrcweir 		case 0: aP=aRect.TopLeft(); break;
1311*cdf0e10cSrcweir 		case 1: aP=aRect.TopRight(); break;
1312*cdf0e10cSrcweir 		case 2: aP=aRect.BottomLeft(); break;
1313*cdf0e10cSrcweir 		case 3: aP=aRect.BottomRight(); break;
1314*cdf0e10cSrcweir 		default: aP=aRect.Center(); break;
1315*cdf0e10cSrcweir 	}
1316*cdf0e10cSrcweir 	if (aGeo.nShearWink!=0) ShearPoint(aP,aRect.TopLeft(),aGeo.nTan);
1317*cdf0e10cSrcweir 	if (aGeo.nDrehWink!=0) RotatePoint(aP,aRect.TopLeft(),aGeo.nSin,aGeo.nCos);
1318*cdf0e10cSrcweir 	return aP;
1319*cdf0e10cSrcweir }
1320*cdf0e10cSrcweir 
1321*cdf0e10cSrcweir void SdrTextObj::ImpCheckMasterCachable()
1322*cdf0e10cSrcweir {
1323*cdf0e10cSrcweir 	bNotMasterCachable=sal_False;
1324*cdf0e10cSrcweir 
1325*cdf0e10cSrcweir 	OutlinerParaObject* pOutlinerParaObject = GetOutlinerParaObject();
1326*cdf0e10cSrcweir 
1327*cdf0e10cSrcweir 	if(!bNotVisibleAsMaster && pOutlinerParaObject && pOutlinerParaObject->IsEditDoc() )
1328*cdf0e10cSrcweir 	{
1329*cdf0e10cSrcweir 		const EditTextObject& rText= pOutlinerParaObject->GetTextObject();
1330*cdf0e10cSrcweir 		bNotMasterCachable=rText.HasField(SvxPageField::StaticType());
1331*cdf0e10cSrcweir 		if( !bNotMasterCachable )
1332*cdf0e10cSrcweir 		{
1333*cdf0e10cSrcweir 			bNotMasterCachable=rText.HasField(SvxHeaderField::StaticType());
1334*cdf0e10cSrcweir 			if( !bNotMasterCachable )
1335*cdf0e10cSrcweir 			{
1336*cdf0e10cSrcweir 				bNotMasterCachable=rText.HasField(SvxFooterField::StaticType());
1337*cdf0e10cSrcweir 				if( !bNotMasterCachable )
1338*cdf0e10cSrcweir 				{
1339*cdf0e10cSrcweir 					bNotMasterCachable=rText.HasField(SvxDateTimeField::StaticType());
1340*cdf0e10cSrcweir 				}
1341*cdf0e10cSrcweir 			}
1342*cdf0e10cSrcweir 		}
1343*cdf0e10cSrcweir 	}
1344*cdf0e10cSrcweir }
1345*cdf0e10cSrcweir 
1346*cdf0e10cSrcweir // #101029#: Extracted from ImpGetDrawOutliner()
1347*cdf0e10cSrcweir void SdrTextObj::ImpInitDrawOutliner( SdrOutliner& rOutl ) const
1348*cdf0e10cSrcweir {
1349*cdf0e10cSrcweir 	rOutl.SetUpdateMode(sal_False);
1350*cdf0e10cSrcweir 	sal_uInt16 nOutlinerMode = OUTLINERMODE_OUTLINEOBJECT;
1351*cdf0e10cSrcweir 	if ( !IsOutlText() )
1352*cdf0e10cSrcweir 		nOutlinerMode = OUTLINERMODE_TEXTOBJECT;
1353*cdf0e10cSrcweir 	rOutl.Init( nOutlinerMode );
1354*cdf0e10cSrcweir 
1355*cdf0e10cSrcweir 	rOutl.SetGlobalCharStretching(100,100);
1356*cdf0e10cSrcweir 	sal_uIntPtr nStat=rOutl.GetControlWord();
1357*cdf0e10cSrcweir 	nStat&=~(EE_CNTRL_STRETCHING|EE_CNTRL_AUTOPAGESIZE);
1358*cdf0e10cSrcweir 	rOutl.SetControlWord(nStat);
1359*cdf0e10cSrcweir 	Size aNullSize;
1360*cdf0e10cSrcweir 	Size aMaxSize(100000,100000);
1361*cdf0e10cSrcweir 	rOutl.SetMinAutoPaperSize(aNullSize);
1362*cdf0e10cSrcweir 	rOutl.SetMaxAutoPaperSize(aMaxSize);
1363*cdf0e10cSrcweir 	rOutl.SetPaperSize(aMaxSize);
1364*cdf0e10cSrcweir 	rOutl.ClearPolygon();
1365*cdf0e10cSrcweir }
1366*cdf0e10cSrcweir 
1367*cdf0e10cSrcweir SdrOutliner& SdrTextObj::ImpGetDrawOutliner() const
1368*cdf0e10cSrcweir {
1369*cdf0e10cSrcweir 	SdrOutliner& rOutl=pModel->GetDrawOutliner(this);
1370*cdf0e10cSrcweir 
1371*cdf0e10cSrcweir     // #101029#: Code extracted to ImpInitDrawOutliner()
1372*cdf0e10cSrcweir     ImpInitDrawOutliner( rOutl );
1373*cdf0e10cSrcweir 
1374*cdf0e10cSrcweir 	return rOutl;
1375*cdf0e10cSrcweir }
1376*cdf0e10cSrcweir 
1377*cdf0e10cSrcweir boost::shared_ptr< SdrOutliner > SdrTextObj::CreateDrawOutliner()
1378*cdf0e10cSrcweir {
1379*cdf0e10cSrcweir 	boost::shared_ptr< SdrOutliner > xDrawOutliner( pModel->CreateDrawOutliner(this) );
1380*cdf0e10cSrcweir 	ImpInitDrawOutliner( *(xDrawOutliner.get()) );
1381*cdf0e10cSrcweir 	return xDrawOutliner;
1382*cdf0e10cSrcweir }
1383*cdf0e10cSrcweir 
1384*cdf0e10cSrcweir // #101029#: Extracted from Paint()
1385*cdf0e10cSrcweir void SdrTextObj::ImpSetupDrawOutlinerForPaint( FASTBOOL 		bContourFrame,
1386*cdf0e10cSrcweir                                                SdrOutliner& 	rOutliner,
1387*cdf0e10cSrcweir                                                Rectangle& 		rTextRect,
1388*cdf0e10cSrcweir                                                Rectangle& 		rAnchorRect,
1389*cdf0e10cSrcweir                                                Rectangle& 		rPaintRect,
1390*cdf0e10cSrcweir                                                Fraction& 		rFitXKorreg ) const
1391*cdf0e10cSrcweir {
1392*cdf0e10cSrcweir     if (!bContourFrame)
1393*cdf0e10cSrcweir     {
1394*cdf0e10cSrcweir         // FitToSize erstmal nicht mit ContourFrame
1395*cdf0e10cSrcweir         SdrFitToSizeType eFit=GetFitToSize();
1396*cdf0e10cSrcweir         if (eFit==SDRTEXTFIT_PROPORTIONAL || eFit==SDRTEXTFIT_ALLLINES)
1397*cdf0e10cSrcweir         {
1398*cdf0e10cSrcweir             sal_uIntPtr nStat=rOutliner.GetControlWord();
1399*cdf0e10cSrcweir             nStat|=EE_CNTRL_STRETCHING|EE_CNTRL_AUTOPAGESIZE;
1400*cdf0e10cSrcweir             rOutliner.SetControlWord(nStat);
1401*cdf0e10cSrcweir         }
1402*cdf0e10cSrcweir     }
1403*cdf0e10cSrcweir 	rOutliner.SetFixedCellHeight(((const SdrTextFixedCellHeightItem&)GetMergedItem(SDRATTR_TEXT_USEFIXEDCELLHEIGHT)).GetValue());
1404*cdf0e10cSrcweir     TakeTextRect(rOutliner, rTextRect, sal_False, &rAnchorRect);
1405*cdf0e10cSrcweir     rPaintRect = rTextRect;
1406*cdf0e10cSrcweir 
1407*cdf0e10cSrcweir     if (!bContourFrame)
1408*cdf0e10cSrcweir     {
1409*cdf0e10cSrcweir         // FitToSize erstmal nicht mit ContourFrame
1410*cdf0e10cSrcweir         SdrFitToSizeType eFit=GetFitToSize();
1411*cdf0e10cSrcweir         if (eFit==SDRTEXTFIT_PROPORTIONAL || eFit==SDRTEXTFIT_ALLLINES)
1412*cdf0e10cSrcweir         {
1413*cdf0e10cSrcweir             ImpSetCharStretching(rOutliner,rTextRect,rAnchorRect,rFitXKorreg);
1414*cdf0e10cSrcweir             rPaintRect=rAnchorRect;
1415*cdf0e10cSrcweir         }
1416*cdf0e10cSrcweir     }
1417*cdf0e10cSrcweir }
1418*cdf0e10cSrcweir 
1419*cdf0e10cSrcweir void SdrTextObj::SetupOutlinerFormatting( SdrOutliner& rOutl, Rectangle& rPaintRect ) const
1420*cdf0e10cSrcweir {
1421*cdf0e10cSrcweir     ImpInitDrawOutliner( rOutl );
1422*cdf0e10cSrcweir     UpdateOutlinerFormatting( rOutl, rPaintRect );
1423*cdf0e10cSrcweir }
1424*cdf0e10cSrcweir 
1425*cdf0e10cSrcweir void SdrTextObj::UpdateOutlinerFormatting( SdrOutliner& rOutl, Rectangle& rPaintRect ) const
1426*cdf0e10cSrcweir {
1427*cdf0e10cSrcweir     Rectangle aTextRect;
1428*cdf0e10cSrcweir     Rectangle aAnchorRect;
1429*cdf0e10cSrcweir     Fraction aFitXKorreg(1,1);
1430*cdf0e10cSrcweir 
1431*cdf0e10cSrcweir     FASTBOOL bContourFrame=IsContourTextFrame();
1432*cdf0e10cSrcweir 
1433*cdf0e10cSrcweir     if( GetModel() )
1434*cdf0e10cSrcweir     {
1435*cdf0e10cSrcweir 		MapMode aMapMode(GetModel()->GetScaleUnit(), Point(0,0),
1436*cdf0e10cSrcweir                          GetModel()->GetScaleFraction(),
1437*cdf0e10cSrcweir                          GetModel()->GetScaleFraction());
1438*cdf0e10cSrcweir 		rOutl.SetRefMapMode(aMapMode);
1439*cdf0e10cSrcweir 	}
1440*cdf0e10cSrcweir 
1441*cdf0e10cSrcweir     ImpSetupDrawOutlinerForPaint( bContourFrame, rOutl, aTextRect, aAnchorRect, rPaintRect, aFitXKorreg );
1442*cdf0e10cSrcweir }
1443*cdf0e10cSrcweir 
1444*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
1445*cdf0e10cSrcweir 
1446*cdf0e10cSrcweir OutlinerParaObject* SdrTextObj::GetOutlinerParaObject() const
1447*cdf0e10cSrcweir {
1448*cdf0e10cSrcweir 	SdrText* pText = getActiveText();
1449*cdf0e10cSrcweir 	if( pText )
1450*cdf0e10cSrcweir 		return pText->GetOutlinerParaObject();
1451*cdf0e10cSrcweir 	else
1452*cdf0e10cSrcweir 		return 0;
1453*cdf0e10cSrcweir }
1454*cdf0e10cSrcweir 
1455*cdf0e10cSrcweir bool SdrTextObj::HasOutlinerParaObject() const
1456*cdf0e10cSrcweir {
1457*cdf0e10cSrcweir 	SdrText* pText = getActiveText();
1458*cdf0e10cSrcweir 	if( pText && pText->GetOutlinerParaObject() )
1459*cdf0e10cSrcweir 		return true;
1460*cdf0e10cSrcweir 	return false;
1461*cdf0e10cSrcweir }
1462*cdf0e10cSrcweir 
1463*cdf0e10cSrcweir void SdrTextObj::NbcSetOutlinerParaObject(OutlinerParaObject* pTextObject)
1464*cdf0e10cSrcweir {
1465*cdf0e10cSrcweir 	NbcSetOutlinerParaObjectForText( pTextObject, getActiveText() );
1466*cdf0e10cSrcweir }
1467*cdf0e10cSrcweir 
1468*cdf0e10cSrcweir void SdrTextObj::NbcSetOutlinerParaObjectForText( OutlinerParaObject* pTextObject, SdrText* pText )
1469*cdf0e10cSrcweir {
1470*cdf0e10cSrcweir 	if( pText )
1471*cdf0e10cSrcweir 		pText->SetOutlinerParaObject( pTextObject );
1472*cdf0e10cSrcweir 
1473*cdf0e10cSrcweir 	if( pText->GetOutlinerParaObject() )
1474*cdf0e10cSrcweir 	{
1475*cdf0e10cSrcweir 		SvxWritingModeItem aWritingMode(pText->GetOutlinerParaObject()->IsVertical()
1476*cdf0e10cSrcweir 			? com::sun::star::text::WritingMode_TB_RL
1477*cdf0e10cSrcweir 			: com::sun::star::text::WritingMode_LR_TB,
1478*cdf0e10cSrcweir             SDRATTR_TEXTDIRECTION);
1479*cdf0e10cSrcweir 		GetProperties().SetObjectItemDirect(aWritingMode);
1480*cdf0e10cSrcweir 	}
1481*cdf0e10cSrcweir 
1482*cdf0e10cSrcweir 	SetTextSizeDirty();
1483*cdf0e10cSrcweir 	if (IsTextFrame() && (IsAutoGrowHeight() || IsAutoGrowWidth()))
1484*cdf0e10cSrcweir 	{ // Textrahmen anpassen!
1485*cdf0e10cSrcweir 		NbcAdjustTextFrameWidthAndHeight();
1486*cdf0e10cSrcweir 	}
1487*cdf0e10cSrcweir 	if (!IsTextFrame())
1488*cdf0e10cSrcweir 	{
1489*cdf0e10cSrcweir 		// Das SnapRect behaelt seine Groesse bei
1490*cdf0e10cSrcweir 		SetRectsDirty(sal_True);
1491*cdf0e10cSrcweir 	}
1492*cdf0e10cSrcweir 
1493*cdf0e10cSrcweir 	// always invalidate BoundRect on change
1494*cdf0e10cSrcweir 	SetBoundRectDirty();
1495*cdf0e10cSrcweir 	ActionChanged();
1496*cdf0e10cSrcweir 
1497*cdf0e10cSrcweir 	ImpSetTextStyleSheetListeners();
1498*cdf0e10cSrcweir 	ImpCheckMasterCachable();
1499*cdf0e10cSrcweir }
1500*cdf0e10cSrcweir 
1501*cdf0e10cSrcweir void SdrTextObj::NbcReformatText()
1502*cdf0e10cSrcweir {
1503*cdf0e10cSrcweir 	SdrText* pText = getActiveText();
1504*cdf0e10cSrcweir 	if( pText && pText->GetOutlinerParaObject() )
1505*cdf0e10cSrcweir 	{
1506*cdf0e10cSrcweir 		pText->ReformatText();
1507*cdf0e10cSrcweir 		if (bTextFrame)
1508*cdf0e10cSrcweir 		{
1509*cdf0e10cSrcweir 			NbcAdjustTextFrameWidthAndHeight();
1510*cdf0e10cSrcweir 		}
1511*cdf0e10cSrcweir 		else
1512*cdf0e10cSrcweir 		{
1513*cdf0e10cSrcweir 			// Das SnapRect behaelt seine Groesse bei
1514*cdf0e10cSrcweir 			SetBoundRectDirty();
1515*cdf0e10cSrcweir 			SetRectsDirty(sal_True);
1516*cdf0e10cSrcweir 		}
1517*cdf0e10cSrcweir 		SetTextSizeDirty();
1518*cdf0e10cSrcweir 		ActionChanged();
1519*cdf0e10cSrcweir 		// FME, AW: i22396
1520*cdf0e10cSrcweir 		// Necessary here since we have no compare operator at the outliner
1521*cdf0e10cSrcweir 		// para object which may detect changes regarding the combination
1522*cdf0e10cSrcweir 		// of outliner para data and configuration (e.g., change of
1523*cdf0e10cSrcweir 		// formatting of text numerals)
1524*cdf0e10cSrcweir 		GetViewContact().flushViewObjectContacts(false);
1525*cdf0e10cSrcweir 	}
1526*cdf0e10cSrcweir }
1527*cdf0e10cSrcweir 
1528*cdf0e10cSrcweir void SdrTextObj::ReformatText()
1529*cdf0e10cSrcweir {
1530*cdf0e10cSrcweir 	if(GetOutlinerParaObject())
1531*cdf0e10cSrcweir 	{
1532*cdf0e10cSrcweir 		Rectangle aBoundRect0;
1533*cdf0e10cSrcweir 		if (pUserCall!=NULL)
1534*cdf0e10cSrcweir 			aBoundRect0=GetLastBoundRect();
1535*cdf0e10cSrcweir 
1536*cdf0e10cSrcweir 		// #110094#-14 SendRepaintBroadcast();
1537*cdf0e10cSrcweir 		NbcReformatText();
1538*cdf0e10cSrcweir 		SetChanged();
1539*cdf0e10cSrcweir 		BroadcastObjectChange();
1540*cdf0e10cSrcweir 		SendUserCall(SDRUSERCALL_RESIZE,aBoundRect0);
1541*cdf0e10cSrcweir 	}
1542*cdf0e10cSrcweir }
1543*cdf0e10cSrcweir 
1544*cdf0e10cSrcweir SdrObjGeoData* SdrTextObj::NewGeoData() const
1545*cdf0e10cSrcweir {
1546*cdf0e10cSrcweir 	return new SdrTextObjGeoData;
1547*cdf0e10cSrcweir }
1548*cdf0e10cSrcweir 
1549*cdf0e10cSrcweir void SdrTextObj::SaveGeoData(SdrObjGeoData& rGeo) const
1550*cdf0e10cSrcweir {
1551*cdf0e10cSrcweir 	SdrAttrObj::SaveGeoData(rGeo);
1552*cdf0e10cSrcweir 	SdrTextObjGeoData& rTGeo=(SdrTextObjGeoData&)rGeo;
1553*cdf0e10cSrcweir 	rTGeo.aRect  =aRect;
1554*cdf0e10cSrcweir 	rTGeo.aGeo   =aGeo;
1555*cdf0e10cSrcweir }
1556*cdf0e10cSrcweir 
1557*cdf0e10cSrcweir void SdrTextObj::RestGeoData(const SdrObjGeoData& rGeo)
1558*cdf0e10cSrcweir { // RectsDirty wird von SdrObject gerufen
1559*cdf0e10cSrcweir 	SdrAttrObj::RestGeoData(rGeo);
1560*cdf0e10cSrcweir 	SdrTextObjGeoData& rTGeo=(SdrTextObjGeoData&)rGeo;
1561*cdf0e10cSrcweir 	aRect  =rTGeo.aRect;
1562*cdf0e10cSrcweir 	aGeo   =rTGeo.aGeo;
1563*cdf0e10cSrcweir 	SetTextSizeDirty();
1564*cdf0e10cSrcweir }
1565*cdf0e10cSrcweir 
1566*cdf0e10cSrcweir SdrFitToSizeType SdrTextObj::GetFitToSize() const
1567*cdf0e10cSrcweir {
1568*cdf0e10cSrcweir 	SdrFitToSizeType eType = SDRTEXTFIT_NONE;
1569*cdf0e10cSrcweir 
1570*cdf0e10cSrcweir 	if(!IsAutoGrowWidth())
1571*cdf0e10cSrcweir 		eType = ((SdrTextFitToSizeTypeItem&)(GetObjectItem(SDRATTR_TEXT_FITTOSIZE))).GetValue();
1572*cdf0e10cSrcweir 
1573*cdf0e10cSrcweir 	return eType;
1574*cdf0e10cSrcweir }
1575*cdf0e10cSrcweir 
1576*cdf0e10cSrcweir void SdrTextObj::ForceOutlinerParaObject()
1577*cdf0e10cSrcweir {
1578*cdf0e10cSrcweir 	SdrText* pText = getActiveText();
1579*cdf0e10cSrcweir 	if( pText && (pText->GetOutlinerParaObject() == 0) )
1580*cdf0e10cSrcweir 	{
1581*cdf0e10cSrcweir 		sal_uInt16 nOutlMode = OUTLINERMODE_TEXTOBJECT;
1582*cdf0e10cSrcweir 		if( IsTextFrame() && eTextKind == OBJ_OUTLINETEXT )
1583*cdf0e10cSrcweir 			nOutlMode = OUTLINERMODE_OUTLINEOBJECT;
1584*cdf0e10cSrcweir 
1585*cdf0e10cSrcweir 		pText->ForceOutlinerParaObject( nOutlMode );
1586*cdf0e10cSrcweir 	}
1587*cdf0e10cSrcweir }
1588*cdf0e10cSrcweir 
1589*cdf0e10cSrcweir sal_Bool SdrTextObj::IsVerticalWriting() const
1590*cdf0e10cSrcweir {
1591*cdf0e10cSrcweir 	// #89459#
1592*cdf0e10cSrcweir 	if(pEdtOutl)
1593*cdf0e10cSrcweir 	{
1594*cdf0e10cSrcweir 		return pEdtOutl->IsVertical();
1595*cdf0e10cSrcweir 	}
1596*cdf0e10cSrcweir 
1597*cdf0e10cSrcweir 	OutlinerParaObject* pOutlinerParaObject = GetOutlinerParaObject();
1598*cdf0e10cSrcweir 	if(pOutlinerParaObject)
1599*cdf0e10cSrcweir 	{
1600*cdf0e10cSrcweir 		return pOutlinerParaObject->IsVertical();
1601*cdf0e10cSrcweir 	}
1602*cdf0e10cSrcweir 
1603*cdf0e10cSrcweir 	return sal_False;
1604*cdf0e10cSrcweir }
1605*cdf0e10cSrcweir 
1606*cdf0e10cSrcweir void SdrTextObj::SetVerticalWriting(sal_Bool bVertical)
1607*cdf0e10cSrcweir {
1608*cdf0e10cSrcweir 	OutlinerParaObject* pOutlinerParaObject = GetOutlinerParaObject();
1609*cdf0e10cSrcweir 	if( !pOutlinerParaObject && bVertical )
1610*cdf0e10cSrcweir 	{
1611*cdf0e10cSrcweir 		// we only need to force a outliner para object if the default of
1612*cdf0e10cSrcweir 		// horizontal text is changed
1613*cdf0e10cSrcweir 		ForceOutlinerParaObject();
1614*cdf0e10cSrcweir 		pOutlinerParaObject = GetOutlinerParaObject();
1615*cdf0e10cSrcweir 	}
1616*cdf0e10cSrcweir 
1617*cdf0e10cSrcweir 	if( pOutlinerParaObject && (pOutlinerParaObject->IsVertical() != (bool)bVertical) )
1618*cdf0e10cSrcweir 	{
1619*cdf0e10cSrcweir 		// get item settings
1620*cdf0e10cSrcweir 		const SfxItemSet& rSet = GetObjectItemSet();
1621*cdf0e10cSrcweir 		sal_Bool bAutoGrowWidth = ((SdrTextAutoGrowWidthItem&)rSet.Get(SDRATTR_TEXT_AUTOGROWWIDTH)).GetValue();
1622*cdf0e10cSrcweir 		sal_Bool bAutoGrowHeight = ((SdrTextAutoGrowHeightItem&)rSet.Get(SDRATTR_TEXT_AUTOGROWHEIGHT)).GetValue();
1623*cdf0e10cSrcweir 
1624*cdf0e10cSrcweir 		// #103516# Also exchange hor/ver adjust items
1625*cdf0e10cSrcweir 		SdrTextHorzAdjust eHorz = ((SdrTextHorzAdjustItem&)(rSet.Get(SDRATTR_TEXT_HORZADJUST))).GetValue();
1626*cdf0e10cSrcweir 		SdrTextVertAdjust eVert = ((SdrTextVertAdjustItem&)(rSet.Get(SDRATTR_TEXT_VERTADJUST))).GetValue();
1627*cdf0e10cSrcweir 
1628*cdf0e10cSrcweir 		// rescue object size
1629*cdf0e10cSrcweir 		Rectangle aObjectRect = GetSnapRect();
1630*cdf0e10cSrcweir 
1631*cdf0e10cSrcweir 		// prepare ItemSet to set exchanged width and height items
1632*cdf0e10cSrcweir 		SfxItemSet aNewSet(*rSet.GetPool(),
1633*cdf0e10cSrcweir 			SDRATTR_TEXT_AUTOGROWHEIGHT, SDRATTR_TEXT_AUTOGROWHEIGHT,
1634*cdf0e10cSrcweir 			// #103516# Expanded item ranges to also support hor and ver adjust.
1635*cdf0e10cSrcweir 			SDRATTR_TEXT_VERTADJUST, SDRATTR_TEXT_VERTADJUST,
1636*cdf0e10cSrcweir 			SDRATTR_TEXT_AUTOGROWWIDTH, SDRATTR_TEXT_HORZADJUST,
1637*cdf0e10cSrcweir 			0, 0);
1638*cdf0e10cSrcweir 
1639*cdf0e10cSrcweir 		aNewSet.Put(rSet);
1640*cdf0e10cSrcweir 		aNewSet.Put(SdrTextAutoGrowWidthItem(bAutoGrowHeight));
1641*cdf0e10cSrcweir 		aNewSet.Put(SdrTextAutoGrowHeightItem(bAutoGrowWidth));
1642*cdf0e10cSrcweir 
1643*cdf0e10cSrcweir 		// #103516# Exchange horz and vert adjusts
1644*cdf0e10cSrcweir 		switch(eVert)
1645*cdf0e10cSrcweir 		{
1646*cdf0e10cSrcweir 			case SDRTEXTVERTADJUST_TOP: aNewSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_RIGHT)); break;
1647*cdf0e10cSrcweir 			case SDRTEXTVERTADJUST_CENTER: aNewSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_CENTER)); break;
1648*cdf0e10cSrcweir 			case SDRTEXTVERTADJUST_BOTTOM: aNewSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_LEFT)); break;
1649*cdf0e10cSrcweir 			case SDRTEXTVERTADJUST_BLOCK: aNewSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_BLOCK)); break;
1650*cdf0e10cSrcweir 		}
1651*cdf0e10cSrcweir 		switch(eHorz)
1652*cdf0e10cSrcweir 		{
1653*cdf0e10cSrcweir 			case SDRTEXTHORZADJUST_LEFT: aNewSet.Put(SdrTextVertAdjustItem(SDRTEXTVERTADJUST_BOTTOM)); break;
1654*cdf0e10cSrcweir 			case SDRTEXTHORZADJUST_CENTER: aNewSet.Put(SdrTextVertAdjustItem(SDRTEXTVERTADJUST_CENTER)); break;
1655*cdf0e10cSrcweir 			case SDRTEXTHORZADJUST_RIGHT: aNewSet.Put(SdrTextVertAdjustItem(SDRTEXTVERTADJUST_TOP)); break;
1656*cdf0e10cSrcweir 			case SDRTEXTHORZADJUST_BLOCK: aNewSet.Put(SdrTextVertAdjustItem(SDRTEXTVERTADJUST_BLOCK)); break;
1657*cdf0e10cSrcweir 		}
1658*cdf0e10cSrcweir 
1659*cdf0e10cSrcweir 		SetObjectItemSet(aNewSet);
1660*cdf0e10cSrcweir 
1661*cdf0e10cSrcweir 		pOutlinerParaObject = GetOutlinerParaObject();
1662*cdf0e10cSrcweir 		if( pOutlinerParaObject )
1663*cdf0e10cSrcweir 		{
1664*cdf0e10cSrcweir 			// set ParaObject orientation accordingly
1665*cdf0e10cSrcweir 			pOutlinerParaObject->SetVertical(bVertical);
1666*cdf0e10cSrcweir 		}
1667*cdf0e10cSrcweir 
1668*cdf0e10cSrcweir 		// restore object size
1669*cdf0e10cSrcweir 		SetSnapRect(aObjectRect);
1670*cdf0e10cSrcweir 	}
1671*cdf0e10cSrcweir }
1672*cdf0e10cSrcweir 
1673*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
1674*cdf0e10cSrcweir //
1675*cdf0e10cSrcweir // transformation interface for StarOfficeAPI. This implements support for
1676*cdf0e10cSrcweir // homogen 3x3 matrices containing the transformation of the SdrObject. At the
1677*cdf0e10cSrcweir // moment it contains a shearX, rotation and translation, but for setting all linear
1678*cdf0e10cSrcweir // transforms like Scale, ShearX, ShearY, Rotate and Translate are supported.
1679*cdf0e10cSrcweir //
1680*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
1681*cdf0e10cSrcweir // gets base transformation and rectangle of object. If it's an SdrPathObj it fills the PolyPolygon
1682*cdf0e10cSrcweir // with the base geometry and returns TRUE. Otherwise it returns FALSE.
1683*cdf0e10cSrcweir sal_Bool SdrTextObj::TRGetBaseGeometry(basegfx::B2DHomMatrix& rMatrix, basegfx::B2DPolyPolygon& /*rPolyPolygon*/) const
1684*cdf0e10cSrcweir {
1685*cdf0e10cSrcweir 	// get turn and shear
1686*cdf0e10cSrcweir 	double fRotate = (aGeo.nDrehWink / 100.0) * F_PI180;
1687*cdf0e10cSrcweir 	double fShearX = (aGeo.nShearWink / 100.0) * F_PI180;
1688*cdf0e10cSrcweir 
1689*cdf0e10cSrcweir 	// get aRect, this is the unrotated snaprect
1690*cdf0e10cSrcweir 	Rectangle aRectangle(aRect);
1691*cdf0e10cSrcweir 
1692*cdf0e10cSrcweir 	// fill other values
1693*cdf0e10cSrcweir 	basegfx::B2DTuple aScale(aRectangle.GetWidth(), aRectangle.GetHeight());
1694*cdf0e10cSrcweir 	basegfx::B2DTuple aTranslate(aRectangle.Left(), aRectangle.Top());
1695*cdf0e10cSrcweir 
1696*cdf0e10cSrcweir 	// position maybe relative to anchorpos, convert
1697*cdf0e10cSrcweir 	if( pModel && pModel->IsWriter() )
1698*cdf0e10cSrcweir 	{
1699*cdf0e10cSrcweir 		if(GetAnchorPos().X() || GetAnchorPos().Y())
1700*cdf0e10cSrcweir 		{
1701*cdf0e10cSrcweir 			aTranslate -= basegfx::B2DTuple(GetAnchorPos().X(), GetAnchorPos().Y());
1702*cdf0e10cSrcweir 		}
1703*cdf0e10cSrcweir 	}
1704*cdf0e10cSrcweir 
1705*cdf0e10cSrcweir 	// force MapUnit to 100th mm
1706*cdf0e10cSrcweir 	SfxMapUnit eMapUnit = GetObjectItemSet().GetPool()->GetMetric(0);
1707*cdf0e10cSrcweir 	if(eMapUnit != SFX_MAPUNIT_100TH_MM)
1708*cdf0e10cSrcweir 	{
1709*cdf0e10cSrcweir 		switch(eMapUnit)
1710*cdf0e10cSrcweir 		{
1711*cdf0e10cSrcweir 			case SFX_MAPUNIT_TWIP :
1712*cdf0e10cSrcweir 			{
1713*cdf0e10cSrcweir 				// postion
1714*cdf0e10cSrcweir 				aTranslate.setX(ImplTwipsToMM(aTranslate.getX()));
1715*cdf0e10cSrcweir 				aTranslate.setY(ImplTwipsToMM(aTranslate.getY()));
1716*cdf0e10cSrcweir 
1717*cdf0e10cSrcweir 				// size
1718*cdf0e10cSrcweir 				aScale.setX(ImplTwipsToMM(aScale.getX()));
1719*cdf0e10cSrcweir 				aScale.setY(ImplTwipsToMM(aScale.getY()));
1720*cdf0e10cSrcweir 
1721*cdf0e10cSrcweir 				break;
1722*cdf0e10cSrcweir 			}
1723*cdf0e10cSrcweir 			default:
1724*cdf0e10cSrcweir 			{
1725*cdf0e10cSrcweir 				DBG_ERROR("TRGetBaseGeometry: Missing unit translation to 100th mm!");
1726*cdf0e10cSrcweir 			}
1727*cdf0e10cSrcweir 		}
1728*cdf0e10cSrcweir 	}
1729*cdf0e10cSrcweir 
1730*cdf0e10cSrcweir 	// build matrix
1731*cdf0e10cSrcweir 	rMatrix = basegfx::tools::createScaleShearXRotateTranslateB2DHomMatrix(
1732*cdf0e10cSrcweir 		aScale,
1733*cdf0e10cSrcweir 		basegfx::fTools::equalZero(fShearX) ? 0.0 : tan(fShearX),
1734*cdf0e10cSrcweir 		basegfx::fTools::equalZero(fRotate) ? 0.0 : -fRotate,
1735*cdf0e10cSrcweir 		aTranslate);
1736*cdf0e10cSrcweir 
1737*cdf0e10cSrcweir 	return sal_False;
1738*cdf0e10cSrcweir }
1739*cdf0e10cSrcweir 
1740*cdf0e10cSrcweir // sets the base geometry of the object using infos contained in the homogen 3x3 matrix.
1741*cdf0e10cSrcweir // If it's an SdrPathObj it will use the provided geometry information. The Polygon has
1742*cdf0e10cSrcweir // to use (0,0) as upper left and will be scaled to the given size in the matrix.
1743*cdf0e10cSrcweir void SdrTextObj::TRSetBaseGeometry(const basegfx::B2DHomMatrix& rMatrix, const basegfx::B2DPolyPolygon& /*rPolyPolygon*/)
1744*cdf0e10cSrcweir {
1745*cdf0e10cSrcweir 	// break up matrix
1746*cdf0e10cSrcweir 	basegfx::B2DTuple aScale;
1747*cdf0e10cSrcweir 	basegfx::B2DTuple aTranslate;
1748*cdf0e10cSrcweir     double fRotate(0.0);
1749*cdf0e10cSrcweir     double fShearX(0.0);
1750*cdf0e10cSrcweir 	rMatrix.decompose(aScale, aTranslate, fRotate, fShearX);
1751*cdf0e10cSrcweir 
1752*cdf0e10cSrcweir 	// #i75086# Old DrawingLayer (GeoStat and geometry) does not support holding negative scalings
1753*cdf0e10cSrcweir 	// in X and Y which equal a 180 degree rotation. Recognize it and react accordingly
1754*cdf0e10cSrcweir 	if(basegfx::fTools::less(aScale.getX(), 0.0) && basegfx::fTools::less(aScale.getY(), 0.0))
1755*cdf0e10cSrcweir 	{
1756*cdf0e10cSrcweir 		aScale.setX(fabs(aScale.getX()));
1757*cdf0e10cSrcweir 		aScale.setY(fabs(aScale.getY()));
1758*cdf0e10cSrcweir 		fRotate = fmod(fRotate + F_PI, F_2PI);
1759*cdf0e10cSrcweir 	}
1760*cdf0e10cSrcweir 
1761*cdf0e10cSrcweir 	// reset object shear and rotations
1762*cdf0e10cSrcweir 	aGeo.nDrehWink = 0;
1763*cdf0e10cSrcweir 	aGeo.RecalcSinCos();
1764*cdf0e10cSrcweir 	aGeo.nShearWink = 0;
1765*cdf0e10cSrcweir 	aGeo.RecalcTan();
1766*cdf0e10cSrcweir 
1767*cdf0e10cSrcweir 	// force metric to pool metric
1768*cdf0e10cSrcweir 	SfxMapUnit eMapUnit = GetObjectItemSet().GetPool()->GetMetric(0);
1769*cdf0e10cSrcweir 	if(eMapUnit != SFX_MAPUNIT_100TH_MM)
1770*cdf0e10cSrcweir 	{
1771*cdf0e10cSrcweir 		switch(eMapUnit)
1772*cdf0e10cSrcweir 		{
1773*cdf0e10cSrcweir 			case SFX_MAPUNIT_TWIP :
1774*cdf0e10cSrcweir 			{
1775*cdf0e10cSrcweir 				// position
1776*cdf0e10cSrcweir 				aTranslate.setX(ImplMMToTwips(aTranslate.getX()));
1777*cdf0e10cSrcweir 				aTranslate.setY(ImplMMToTwips(aTranslate.getY()));
1778*cdf0e10cSrcweir 
1779*cdf0e10cSrcweir 				// size
1780*cdf0e10cSrcweir 				aScale.setX(ImplMMToTwips(aScale.getX()));
1781*cdf0e10cSrcweir 				aScale.setY(ImplMMToTwips(aScale.getY()));
1782*cdf0e10cSrcweir 
1783*cdf0e10cSrcweir 				break;
1784*cdf0e10cSrcweir 			}
1785*cdf0e10cSrcweir 			default:
1786*cdf0e10cSrcweir 			{
1787*cdf0e10cSrcweir 				DBG_ERROR("TRSetBaseGeometry: Missing unit translation to PoolMetric!");
1788*cdf0e10cSrcweir 			}
1789*cdf0e10cSrcweir 		}
1790*cdf0e10cSrcweir 	}
1791*cdf0e10cSrcweir 
1792*cdf0e10cSrcweir 	// if anchor is used, make position relative to it
1793*cdf0e10cSrcweir 	if( pModel && pModel->IsWriter() )
1794*cdf0e10cSrcweir 	{
1795*cdf0e10cSrcweir 		if(GetAnchorPos().X() || GetAnchorPos().Y())
1796*cdf0e10cSrcweir 		{
1797*cdf0e10cSrcweir 			aTranslate += basegfx::B2DTuple(GetAnchorPos().X(), GetAnchorPos().Y());
1798*cdf0e10cSrcweir 		}
1799*cdf0e10cSrcweir 	}
1800*cdf0e10cSrcweir 
1801*cdf0e10cSrcweir 	// build and set BaseRect (use scale)
1802*cdf0e10cSrcweir 	Point aPoint = Point();
1803*cdf0e10cSrcweir 	Size aSize(FRound(aScale.getX()), FRound(aScale.getY()));
1804*cdf0e10cSrcweir 	Rectangle aBaseRect(aPoint, aSize);
1805*cdf0e10cSrcweir 	SetSnapRect(aBaseRect);
1806*cdf0e10cSrcweir 
1807*cdf0e10cSrcweir 	// shear?
1808*cdf0e10cSrcweir     if(!basegfx::fTools::equalZero(fShearX))
1809*cdf0e10cSrcweir 	{
1810*cdf0e10cSrcweir 		GeoStat aGeoStat;
1811*cdf0e10cSrcweir 		aGeoStat.nShearWink = FRound((atan(fShearX) / F_PI180) * 100.0);
1812*cdf0e10cSrcweir 		aGeoStat.RecalcTan();
1813*cdf0e10cSrcweir 		Shear(Point(), aGeoStat.nShearWink, aGeoStat.nTan, sal_False);
1814*cdf0e10cSrcweir 	}
1815*cdf0e10cSrcweir 
1816*cdf0e10cSrcweir 	// rotation?
1817*cdf0e10cSrcweir     if(!basegfx::fTools::equalZero(fRotate))
1818*cdf0e10cSrcweir 	{
1819*cdf0e10cSrcweir 		GeoStat aGeoStat;
1820*cdf0e10cSrcweir 
1821*cdf0e10cSrcweir         // #i78696#
1822*cdf0e10cSrcweir         // fRotate is matematically correct, but aGeoStat.nDrehWink is
1823*cdf0e10cSrcweir         // mirrored -> mirror value here
1824*cdf0e10cSrcweir         aGeoStat.nDrehWink = NormAngle360(FRound(-fRotate / F_PI18000));
1825*cdf0e10cSrcweir 		aGeoStat.RecalcSinCos();
1826*cdf0e10cSrcweir 		Rotate(Point(), aGeoStat.nDrehWink, aGeoStat.nSin, aGeoStat.nCos);
1827*cdf0e10cSrcweir 	}
1828*cdf0e10cSrcweir 
1829*cdf0e10cSrcweir 	// translate?
1830*cdf0e10cSrcweir     if(!aTranslate.equalZero())
1831*cdf0e10cSrcweir 	{
1832*cdf0e10cSrcweir 		Move(Size(FRound(aTranslate.getX()), FRound(aTranslate.getY())));
1833*cdf0e10cSrcweir 	}
1834*cdf0e10cSrcweir }
1835*cdf0e10cSrcweir 
1836*cdf0e10cSrcweir bool SdrTextObj::IsRealyEdited() const
1837*cdf0e10cSrcweir {
1838*cdf0e10cSrcweir 	return pEdtOutl && pEdtOutl->IsModified();
1839*cdf0e10cSrcweir }
1840*cdf0e10cSrcweir 
1841*cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////////////////////////////////
1842*cdf0e10cSrcweir // moved inlines here form hxx
1843*cdf0e10cSrcweir 
1844*cdf0e10cSrcweir long SdrTextObj::GetEckenradius() const
1845*cdf0e10cSrcweir {
1846*cdf0e10cSrcweir 	return ((SdrEckenradiusItem&)(GetObjectItemSet().Get(SDRATTR_ECKENRADIUS))).GetValue();
1847*cdf0e10cSrcweir }
1848*cdf0e10cSrcweir 
1849*cdf0e10cSrcweir long SdrTextObj::GetMinTextFrameHeight() const
1850*cdf0e10cSrcweir {
1851*cdf0e10cSrcweir 	return ((SdrTextMinFrameHeightItem&)(GetObjectItemSet().Get(SDRATTR_TEXT_MINFRAMEHEIGHT))).GetValue();
1852*cdf0e10cSrcweir }
1853*cdf0e10cSrcweir 
1854*cdf0e10cSrcweir long SdrTextObj::GetMaxTextFrameHeight() const
1855*cdf0e10cSrcweir {
1856*cdf0e10cSrcweir 	return ((SdrTextMaxFrameHeightItem&)(GetObjectItemSet().Get(SDRATTR_TEXT_MAXFRAMEHEIGHT))).GetValue();
1857*cdf0e10cSrcweir }
1858*cdf0e10cSrcweir 
1859*cdf0e10cSrcweir long SdrTextObj::GetMinTextFrameWidth() const
1860*cdf0e10cSrcweir {
1861*cdf0e10cSrcweir 	return ((SdrTextMinFrameWidthItem&)(GetObjectItemSet().Get(SDRATTR_TEXT_MINFRAMEWIDTH))).GetValue();
1862*cdf0e10cSrcweir }
1863*cdf0e10cSrcweir 
1864*cdf0e10cSrcweir long SdrTextObj::GetMaxTextFrameWidth() const
1865*cdf0e10cSrcweir {
1866*cdf0e10cSrcweir 	return ((SdrTextMaxFrameWidthItem&)(GetObjectItemSet().Get(SDRATTR_TEXT_MAXFRAMEWIDTH))).GetValue();
1867*cdf0e10cSrcweir }
1868*cdf0e10cSrcweir 
1869*cdf0e10cSrcweir FASTBOOL SdrTextObj::IsFontwork() const
1870*cdf0e10cSrcweir {
1871*cdf0e10cSrcweir 	return (bTextFrame) ? sal_False // Default ist FALSE
1872*cdf0e10cSrcweir 		: ((XFormTextStyleItem&)(GetObjectItemSet().Get(XATTR_FORMTXTSTYLE))).GetValue()!=XFT_NONE;
1873*cdf0e10cSrcweir }
1874*cdf0e10cSrcweir 
1875*cdf0e10cSrcweir FASTBOOL SdrTextObj::IsHideContour() const
1876*cdf0e10cSrcweir {
1877*cdf0e10cSrcweir 	return (bTextFrame) ? sal_False // Default ist: Nein, kein HideContour; HideContour nicht bei TextFrames
1878*cdf0e10cSrcweir 		: ((XFormTextHideFormItem&)(GetObjectItemSet().Get(XATTR_FORMTXTHIDEFORM))).GetValue();
1879*cdf0e10cSrcweir }
1880*cdf0e10cSrcweir 
1881*cdf0e10cSrcweir FASTBOOL SdrTextObj::IsContourTextFrame() const
1882*cdf0e10cSrcweir {
1883*cdf0e10cSrcweir 	return (bTextFrame) ? sal_False // ContourFrame nicht bei normalen TextFrames
1884*cdf0e10cSrcweir 		: ((SdrTextContourFrameItem&)(GetObjectItemSet().Get(SDRATTR_TEXT_CONTOURFRAME))).GetValue();
1885*cdf0e10cSrcweir }
1886*cdf0e10cSrcweir 
1887*cdf0e10cSrcweir long SdrTextObj::GetTextLeftDistance() const
1888*cdf0e10cSrcweir {
1889*cdf0e10cSrcweir 	return ((SdrTextLeftDistItem&)(GetObjectItemSet().Get(SDRATTR_TEXT_LEFTDIST))).GetValue();
1890*cdf0e10cSrcweir }
1891*cdf0e10cSrcweir 
1892*cdf0e10cSrcweir long SdrTextObj::GetTextRightDistance() const
1893*cdf0e10cSrcweir {
1894*cdf0e10cSrcweir 	return ((SdrTextRightDistItem&)(GetObjectItemSet().Get(SDRATTR_TEXT_RIGHTDIST))).GetValue();
1895*cdf0e10cSrcweir }
1896*cdf0e10cSrcweir 
1897*cdf0e10cSrcweir long SdrTextObj::GetTextUpperDistance() const
1898*cdf0e10cSrcweir {
1899*cdf0e10cSrcweir 	return ((SdrTextUpperDistItem&)(GetObjectItemSet().Get(SDRATTR_TEXT_UPPERDIST))).GetValue();
1900*cdf0e10cSrcweir }
1901*cdf0e10cSrcweir 
1902*cdf0e10cSrcweir long SdrTextObj::GetTextLowerDistance() const
1903*cdf0e10cSrcweir {
1904*cdf0e10cSrcweir 	return ((SdrTextLowerDistItem&)(GetObjectItemSet().Get(SDRATTR_TEXT_LOWERDIST))).GetValue();
1905*cdf0e10cSrcweir }
1906*cdf0e10cSrcweir 
1907*cdf0e10cSrcweir SdrTextAniKind SdrTextObj::GetTextAniKind() const
1908*cdf0e10cSrcweir {
1909*cdf0e10cSrcweir 	return ((SdrTextAniKindItem&)(GetObjectItemSet().Get(SDRATTR_TEXT_ANIKIND))).GetValue();
1910*cdf0e10cSrcweir }
1911*cdf0e10cSrcweir 
1912*cdf0e10cSrcweir SdrTextAniDirection SdrTextObj::GetTextAniDirection() const
1913*cdf0e10cSrcweir {
1914*cdf0e10cSrcweir 	return ((SdrTextAniDirectionItem&)(GetObjectItemSet().Get(SDRATTR_TEXT_ANIDIRECTION))).GetValue();
1915*cdf0e10cSrcweir }
1916*cdf0e10cSrcweir 
1917*cdf0e10cSrcweir // #111096#
1918*cdf0e10cSrcweir // Access to thext hidden flag
1919*cdf0e10cSrcweir sal_Bool SdrTextObj::GetTextHidden() const
1920*cdf0e10cSrcweir {
1921*cdf0e10cSrcweir 	return mbTextHidden;
1922*cdf0e10cSrcweir }
1923*cdf0e10cSrcweir 
1924*cdf0e10cSrcweir void SdrTextObj::NbcSetTextHidden(sal_Bool bNew)
1925*cdf0e10cSrcweir {
1926*cdf0e10cSrcweir 	if(bNew != mbTextHidden)
1927*cdf0e10cSrcweir 	{
1928*cdf0e10cSrcweir 		mbTextHidden = bNew;
1929*cdf0e10cSrcweir 	}
1930*cdf0e10cSrcweir }
1931*cdf0e10cSrcweir 
1932*cdf0e10cSrcweir // #111096#
1933*cdf0e10cSrcweir // Get necessary data for text scroll animation. ATM base it on a Text-Metafile and a
1934*cdf0e10cSrcweir // painting rectangle. Rotation is excluded from the returned values.
1935*cdf0e10cSrcweir GDIMetaFile* SdrTextObj::GetTextScrollMetaFileAndRectangle(
1936*cdf0e10cSrcweir 	Rectangle& rScrollRectangle, Rectangle& rPaintRectangle)
1937*cdf0e10cSrcweir {
1938*cdf0e10cSrcweir 	GDIMetaFile* pRetval = 0L;
1939*cdf0e10cSrcweir 	SdrOutliner& rOutliner = ImpGetDrawOutliner();
1940*cdf0e10cSrcweir 	Rectangle aTextRect;
1941*cdf0e10cSrcweir 	Rectangle aAnchorRect;
1942*cdf0e10cSrcweir 	Rectangle aPaintRect;
1943*cdf0e10cSrcweir 	Fraction aFitXKorreg(1,1);
1944*cdf0e10cSrcweir 	bool bContourFrame(IsContourTextFrame());
1945*cdf0e10cSrcweir 
1946*cdf0e10cSrcweir 	// get outliner set up. To avoid getting a somehow rotated MetaFile,
1947*cdf0e10cSrcweir 	// temporarily disable object rotation.
1948*cdf0e10cSrcweir 	sal_Int32 nAngle(aGeo.nDrehWink);
1949*cdf0e10cSrcweir 	aGeo.nDrehWink = 0L;
1950*cdf0e10cSrcweir 	ImpSetupDrawOutlinerForPaint( bContourFrame, rOutliner, aTextRect, aAnchorRect, aPaintRect, aFitXKorreg );
1951*cdf0e10cSrcweir 	aGeo.nDrehWink = nAngle;
1952*cdf0e10cSrcweir 
1953*cdf0e10cSrcweir 	Rectangle aScrollFrameRect(aPaintRect);
1954*cdf0e10cSrcweir 	const SfxItemSet& rSet = GetObjectItemSet();
1955*cdf0e10cSrcweir 	SdrTextAniDirection eDirection = ((SdrTextAniDirectionItem&)(rSet.Get(SDRATTR_TEXT_ANIDIRECTION))).GetValue();
1956*cdf0e10cSrcweir 
1957*cdf0e10cSrcweir 	if(SDRTEXTANI_LEFT == eDirection || SDRTEXTANI_RIGHT == eDirection)
1958*cdf0e10cSrcweir 	{
1959*cdf0e10cSrcweir 		aScrollFrameRect.Left() = aAnchorRect.Left();
1960*cdf0e10cSrcweir 		aScrollFrameRect.Right() = aAnchorRect.Right();
1961*cdf0e10cSrcweir 	}
1962*cdf0e10cSrcweir 
1963*cdf0e10cSrcweir 	if(SDRTEXTANI_UP == eDirection || SDRTEXTANI_DOWN == eDirection)
1964*cdf0e10cSrcweir 	{
1965*cdf0e10cSrcweir 		aScrollFrameRect.Top() = aAnchorRect.Top();
1966*cdf0e10cSrcweir 		aScrollFrameRect.Bottom() = aAnchorRect.Bottom();
1967*cdf0e10cSrcweir 	}
1968*cdf0e10cSrcweir 
1969*cdf0e10cSrcweir 	// create the MetaFile
1970*cdf0e10cSrcweir 	pRetval = new GDIMetaFile;
1971*cdf0e10cSrcweir 	VirtualDevice aBlackHole;
1972*cdf0e10cSrcweir 	aBlackHole.EnableOutput(sal_False);
1973*cdf0e10cSrcweir 	pRetval->Record(&aBlackHole);
1974*cdf0e10cSrcweir 	Point aPaintPos = aPaintRect.TopLeft();
1975*cdf0e10cSrcweir 
1976*cdf0e10cSrcweir 	rOutliner.Draw(&aBlackHole, aPaintPos);
1977*cdf0e10cSrcweir 
1978*cdf0e10cSrcweir 	pRetval->Stop();
1979*cdf0e10cSrcweir 	pRetval->WindStart();
1980*cdf0e10cSrcweir 
1981*cdf0e10cSrcweir 	// return PaintRectanglePixel and pRetval;
1982*cdf0e10cSrcweir 	rScrollRectangle = aScrollFrameRect;
1983*cdf0e10cSrcweir 	rPaintRectangle = aPaintRect;
1984*cdf0e10cSrcweir 
1985*cdf0e10cSrcweir 	return pRetval;
1986*cdf0e10cSrcweir }
1987*cdf0e10cSrcweir 
1988*cdf0e10cSrcweir // #111096#
1989*cdf0e10cSrcweir // Access to TextAnimationAllowed flag
1990*cdf0e10cSrcweir bool SdrTextObj::IsTextAnimationAllowed() const
1991*cdf0e10cSrcweir {
1992*cdf0e10cSrcweir 	return mbTextAnimationAllowed;
1993*cdf0e10cSrcweir }
1994*cdf0e10cSrcweir 
1995*cdf0e10cSrcweir void SdrTextObj::SetTextAnimationAllowed(sal_Bool bNew)
1996*cdf0e10cSrcweir {
1997*cdf0e10cSrcweir 	if(mbTextAnimationAllowed != bNew)
1998*cdf0e10cSrcweir 	{
1999*cdf0e10cSrcweir 		mbTextAnimationAllowed = bNew;
2000*cdf0e10cSrcweir 		ActionChanged();
2001*cdf0e10cSrcweir 	}
2002*cdf0e10cSrcweir }
2003*cdf0e10cSrcweir 
2004*cdf0e10cSrcweir /** called from the SdrObjEditView during text edit when the status of the edit outliner changes */
2005*cdf0e10cSrcweir void SdrTextObj::onEditOutlinerStatusEvent( EditStatus* pEditStatus )
2006*cdf0e10cSrcweir {
2007*cdf0e10cSrcweir     const sal_uInt32 nStat = pEditStatus->GetStatusWord();
2008*cdf0e10cSrcweir 	const bool bGrowX=(nStat & EE_STAT_TEXTWIDTHCHANGED) !=0;
2009*cdf0e10cSrcweir 	const bool bGrowY=(nStat & EE_STAT_TEXTHEIGHTCHANGED) !=0;
2010*cdf0e10cSrcweir     if(bTextFrame && (bGrowX || bGrowY))
2011*cdf0e10cSrcweir 	{
2012*cdf0e10cSrcweir 		const bool bAutoGrowHgt= bTextFrame && IsAutoGrowHeight();
2013*cdf0e10cSrcweir 		const bool bAutoGrowWdt= bTextFrame && IsAutoGrowWidth();
2014*cdf0e10cSrcweir 
2015*cdf0e10cSrcweir 	    if ((bGrowX && bAutoGrowWdt) || (bGrowY && bAutoGrowHgt))
2016*cdf0e10cSrcweir 		{
2017*cdf0e10cSrcweir 			AdjustTextFrameWidthAndHeight();
2018*cdf0e10cSrcweir 		}
2019*cdf0e10cSrcweir 	}
2020*cdf0e10cSrcweir }
2021*cdf0e10cSrcweir 
2022*cdf0e10cSrcweir /** returns the currently active text. */
2023*cdf0e10cSrcweir SdrText* SdrTextObj::getActiveText() const
2024*cdf0e10cSrcweir {
2025*cdf0e10cSrcweir 	if( !mpText )
2026*cdf0e10cSrcweir 		return getText( 0 );
2027*cdf0e10cSrcweir 	else
2028*cdf0e10cSrcweir 		return mpText;
2029*cdf0e10cSrcweir }
2030*cdf0e10cSrcweir 
2031*cdf0e10cSrcweir /** returns the nth available text. */
2032*cdf0e10cSrcweir SdrText* SdrTextObj::getText( sal_Int32 nIndex ) const
2033*cdf0e10cSrcweir {
2034*cdf0e10cSrcweir 	if( nIndex == 0 )
2035*cdf0e10cSrcweir 	{
2036*cdf0e10cSrcweir 		if( mpText == 0 )
2037*cdf0e10cSrcweir 			const_cast< SdrTextObj* >(this)->mpText = new SdrText( *(const_cast< SdrTextObj* >(this)) );
2038*cdf0e10cSrcweir 		return mpText;
2039*cdf0e10cSrcweir 	}
2040*cdf0e10cSrcweir 	else
2041*cdf0e10cSrcweir 	{
2042*cdf0e10cSrcweir 		return 0;
2043*cdf0e10cSrcweir 	}
2044*cdf0e10cSrcweir }
2045*cdf0e10cSrcweir 
2046*cdf0e10cSrcweir /** returns the number of texts available for this object. */
2047*cdf0e10cSrcweir sal_Int32 SdrTextObj::getTextCount() const
2048*cdf0e10cSrcweir {
2049*cdf0e10cSrcweir 	return 1;
2050*cdf0e10cSrcweir }
2051*cdf0e10cSrcweir 
2052*cdf0e10cSrcweir /** changes the current active text */
2053*cdf0e10cSrcweir void SdrTextObj::setActiveText( sal_Int32 /*nIndex*/ )
2054*cdf0e10cSrcweir {
2055*cdf0e10cSrcweir }
2056*cdf0e10cSrcweir 
2057*cdf0e10cSrcweir /** returns the index of the text that contains the given point or -1 */
2058*cdf0e10cSrcweir sal_Int32 SdrTextObj::CheckTextHit(const Point& /*rPnt*/) const
2059*cdf0e10cSrcweir {
2060*cdf0e10cSrcweir 	return 0;
2061*cdf0e10cSrcweir }
2062*cdf0e10cSrcweir 
2063*cdf0e10cSrcweir void SdrTextObj::SetObjectItemNoBroadcast(const SfxPoolItem& rItem)
2064*cdf0e10cSrcweir {
2065*cdf0e10cSrcweir     static_cast< sdr::properties::TextProperties& >(GetProperties()).SetObjectItemNoBroadcast(rItem);
2066*cdf0e10cSrcweir }
2067*cdf0e10cSrcweir 
2068*cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////////////////////////////////
2069*cdf0e10cSrcweir //
2070*cdf0e10cSrcweir // Konzept des TextObjekts:
2071*cdf0e10cSrcweir // ~~~~~~~~~~~~~~~~~~~~~~~~
2072*cdf0e10cSrcweir // Attribute/Varianten:
2073*cdf0e10cSrcweir // - sal_Bool Textrahmen / beschriftetes Zeichenobjekt
2074*cdf0e10cSrcweir // - sal_Bool FontWork                 (wenn nicht Textrahmen und nicht ContourTextFrame)
2075*cdf0e10cSrcweir // - sal_Bool ContourTextFrame         (wenn nicht Textrahmen und nicht Fontwork)
2076*cdf0e10cSrcweir // - long Drehwinkel               (wenn nicht FontWork)
2077*cdf0e10cSrcweir // - long Textrahmenabstaende      (wenn nicht FontWork)
2078*cdf0e10cSrcweir // - sal_Bool FitToSize                (wenn nicht FontWork)
2079*cdf0e10cSrcweir // - sal_Bool AutoGrowingWidth/Height  (wenn nicht FitToSize und nicht FontWork)
2080*cdf0e10cSrcweir // - long Min/MaxFrameWidth/Height (wenn AutoGrowingWidth/Height)
2081*cdf0e10cSrcweir // - enum Horizontale Textverankerung Links,Mitte,Rechts,Block,Stretch(ni)
2082*cdf0e10cSrcweir // - enum Vertikale Textverankerung Oben,Mitte,Unten,Block,Stretch(ni)
2083*cdf0e10cSrcweir // - enum Laufschrift              (wenn nicht FontWork)
2084*cdf0e10cSrcweir //
2085*cdf0e10cSrcweir // Jedes abgeleitete Objekt ist entweder ein Textrahmen (bTextFrame=sal_True)
2086*cdf0e10cSrcweir // oder ein beschriftetes Zeichenobjekt (bTextFrame=sal_False).
2087*cdf0e10cSrcweir //
2088*cdf0e10cSrcweir // Defaultverankerung von Textrahmen:
2089*cdf0e10cSrcweir //   SDRTEXTHORZADJUST_BLOCK, SDRTEXTVERTADJUST_TOP
2090*cdf0e10cSrcweir //   = statische Pooldefaults
2091*cdf0e10cSrcweir // Defaultverankerung von beschrifteten Zeichenobjekten:
2092*cdf0e10cSrcweir //   SDRTEXTHORZADJUST_CENTER, SDRTEXTVERTADJUST_CENTER
2093*cdf0e10cSrcweir //   durch harte Attributierung von SdrAttrObj
2094*cdf0e10cSrcweir //
2095*cdf0e10cSrcweir // Jedes vom SdrTextObj abgeleitete Objekt muss ein "UnrotatedSnapRect"
2096*cdf0e10cSrcweir // (->TakeUnrotatedSnapRect()) liefern (Drehreferenz ist TopLeft dieses
2097*cdf0e10cSrcweir // Rechtecks (aGeo.nDrehWink)), welches die Grundlage der Textverankerung
2098*cdf0e10cSrcweir // bildet. Von diesem werden dann ringsum die Textrahmenabstaende abgezogen;
2099*cdf0e10cSrcweir // das Ergebnis ist der Ankerbereich (->TakeTextAnchorRect()). Innerhalb
2100*cdf0e10cSrcweir // dieses Bereichs wird dann in Abhaengigkeit von der horizontalen und
2101*cdf0e10cSrcweir // vertikalen Ausrichtung (SdrTextVertAdjust,SdrTextHorzAdjust) der Ankerpunkt
2102*cdf0e10cSrcweir // sowie der Ausgabebereich bestimmt. Bei beschrifteten Grafikobjekten kann
2103*cdf0e10cSrcweir // der Ausgabebereich durchaus groesser als der Ankerbereich werden, bei
2104*cdf0e10cSrcweir // Textrahmen ist er stets kleiner oder gleich (ausser bei negativen Textrahmen-
2105*cdf0e10cSrcweir // abstaenden).
2106*cdf0e10cSrcweir //
2107*cdf0e10cSrcweir // FitToSize hat Prioritaet vor Textverankerung und AutoGrowHeight/Width. Der
2108*cdf0e10cSrcweir // Ausgabebereich ist bei FitToSize immer genau der Ankerbereich. Weiterhin
2109*cdf0e10cSrcweir // gibt es bei FitToSize keinen automatischen Zeilenumbruch.
2110*cdf0e10cSrcweir //
2111*cdf0e10cSrcweir // ContourTextFrame:
2112*cdf0e10cSrcweir // - long Drehwinkel
2113*cdf0e10cSrcweir // - long Textrahmenabstaende         spaeter vielleicht
2114*cdf0e10cSrcweir // - sal_Bool FitToSize                   spaeter vielleicht
2115*cdf0e10cSrcweir // - sal_Bool AutoGrowingWidth/Height     viel spaeter vielleicht
2116*cdf0e10cSrcweir // - long Min/MaxFrameWidth/Height    viel spaeter vielleicht
2117*cdf0e10cSrcweir // - enum Horizontale Textverankerung spaeter vielleicht, erstmal Links, Absatz zentr.
2118*cdf0e10cSrcweir // - enum Vertikale Textverankerung   spaeter vielleicht, erstmal oben
2119*cdf0e10cSrcweir // - enum Laufschrift                 spaeter vielleicht (evtl. sogar mit korrektem Clipping)
2120*cdf0e10cSrcweir //
2121*cdf0e10cSrcweir // Bei Aenderungen zu beachten:
2122*cdf0e10cSrcweir // - Paint
2123*cdf0e10cSrcweir // - HitTest
2124*cdf0e10cSrcweir // - ConvertToPoly
2125*cdf0e10cSrcweir // - Edit
2126*cdf0e10cSrcweir // - Drucken,Speichern, Paint in Nachbarview waerend Edit
2127*cdf0e10cSrcweir // - ModelChanged (z.B. durch NachbarView oder Lineale) waerend Edit
2128*cdf0e10cSrcweir // - FillColorChanged waerend Edit
2129*cdf0e10cSrcweir // - uvm...
2130*cdf0e10cSrcweir //
2131*cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////////////////////////////////
2132*cdf0e10cSrcweir 
2133