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