LibreOffice Module svx (master)  1
svdotxat.cxx
Go to the documentation of this file.
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  * Licensed to the Apache Software Foundation (ASF) under one or more
12  * contributor license agreements. See the NOTICE file distributed
13  * with this work for additional information regarding copyright
14  * ownership. The ASF licenses this file to you under the Apache
15  * License, Version 2.0 (the "License"); you may not use this file
16  * except in compliance with the License. You may obtain a copy of
17  * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 
20 #include <comphelper/string.hxx>
21 #include <svl/style.hxx>
22 #include <svx/svdotext.hxx>
23 #include <svx/svdmodel.hxx>
24 #include <svx/svdoutl.hxx>
25 #include <svx/svdorect.hxx>
26 #include <svx/svdocapt.hxx>
27 #include <editeng/editdata.hxx>
28 #include <svx/sdtfchim.hxx>
29 
30 
31 #include <editeng/outlobj.hxx>
32 #include <editeng/outliner.hxx>
33 #include <editeng/editobj.hxx>
34 
35 namespace {
36 // The style family which is appended to the style names is padded to this many characters.
37 const short PADDING_LENGTH_FOR_STYLE_FAMILY = 5;
38 // this character will be used to pad the style families when they are appended to the style names
39 const char PADDING_CHARACTER_FOR_STYLE_FAMILY = ' ';
40 }
41 
42 bool SdrTextObj::AdjustTextFrameWidthAndHeight( tools::Rectangle& rR, bool bHgt, bool bWdt ) const
43 {
44  if (!bTextFrame)
45  // Not a text frame. Bail out.
46  return false;
47 
48  if (rR.IsEmpty())
49  // Empty rectangle.
50  return false;
51 
52  bool bFitToSize = IsFitToSize();
53  if (bFitToSize)
54  return false;
55 
56  bool bWdtGrow = bWdt && IsAutoGrowWidth();
57  bool bHgtGrow = bHgt && IsAutoGrowHeight();
58  if (!bWdtGrow && !bHgtGrow)
59  // Not supposed to auto-adjust width or height.
60  return false;
61 
62  SdrTextAniKind eAniKind = GetTextAniKind();
64 
65  bool bScroll = eAniKind == SdrTextAniKind::Scroll || eAniKind == SdrTextAniKind::Alternate || eAniKind == SdrTextAniKind::Slide;
66  bool bHScroll = bScroll && (eAniDir == SdrTextAniDirection::Left || eAniDir == SdrTextAniDirection::Right);
67  bool bVScroll = bScroll && (eAniDir == SdrTextAniDirection::Up || eAniDir == SdrTextAniDirection::Down);
68 
69  tools::Rectangle aOldRect = rR;
70  tools::Long nHgt = 0, nMinHgt = 0, nMaxHgt = 0;
71  tools::Long nWdt = 0, nMinWdt = 0, nMaxWdt = 0;
72 
73  Size aNewSize = rR.GetSize();
74  aNewSize.AdjustWidth( -1 ); aNewSize.AdjustHeight( -1 );
75 
76  Size aMaxSiz(100000, 100000);
77  Size aTmpSiz(getSdrModelFromSdrObject().GetMaxObjSize());
78 
79  if (aTmpSiz.Width())
80  aMaxSiz.setWidth( aTmpSiz.Width() );
81  if (aTmpSiz.Height())
82  aMaxSiz.setHeight( aTmpSiz.Height() );
83 
84  if (bWdtGrow)
85  {
86  nMinWdt = GetMinTextFrameWidth();
87  nMaxWdt = GetMaxTextFrameWidth();
88  if (nMaxWdt == 0 || nMaxWdt > aMaxSiz.Width())
89  nMaxWdt = aMaxSiz.Width();
90  if (nMinWdt <= 0)
91  nMinWdt = 1;
92 
93  aNewSize.setWidth( nMaxWdt );
94  }
95 
96  if (bHgtGrow)
97  {
98  nMinHgt = GetMinTextFrameHeight();
99  nMaxHgt = GetMaxTextFrameHeight();
100  if (nMaxHgt == 0 || nMaxHgt > aMaxSiz.Height())
101  nMaxHgt = aMaxSiz.Height();
102  if (nMinHgt <= 0)
103  nMinHgt = 1;
104 
105  aNewSize.setHeight( nMaxHgt );
106  }
107 
110  aNewSize.AdjustWidth( -nHDist );
111  aNewSize.AdjustHeight( -nVDist );
112 
113  if (aNewSize.Width() < 2)
114  aNewSize.setWidth( 2 );
115  if (aNewSize.Height() < 2)
116  aNewSize.setHeight( 2 );
117 
118  if (!IsInEditMode())
119  {
120  if (bHScroll)
121  aNewSize.setWidth( 0x0FFFFFFF ); // don't break ticker text
122  if (bVScroll)
123  aNewSize.setHeight( 0x0FFFFFFF );
124  }
125 
126  if (pEdtOutl)
127  {
128  pEdtOutl->SetMaxAutoPaperSize(aNewSize);
129  if (bWdtGrow)
130  {
131  Size aSiz2(pEdtOutl->CalcTextSize());
132  nWdt = aSiz2.Width() + 1; // a little tolerance
133  if (bHgtGrow)
134  nHgt = aSiz2.Height() + 1; // a little tolerance
135  }
136  else
137  {
138  nHgt = pEdtOutl->GetTextHeight() + 1; // a little tolerance
139  }
140  }
141  else
142  {
143  Outliner& rOutliner = ImpGetDrawOutliner();
144  rOutliner.SetPaperSize(aNewSize);
145  rOutliner.SetUpdateMode(true);
146  // TODO: add the optimization with bPortionInfoChecked etc. here
147  OutlinerParaObject* pOutlinerParaObject = GetOutlinerParaObject();
148  if (pOutlinerParaObject)
149  {
150  rOutliner.SetText(*pOutlinerParaObject);
152  }
153 
154  if (bWdtGrow)
155  {
156  Size aSiz2(rOutliner.CalcTextSize());
157  nWdt = aSiz2.Width() + 1; // a little tolerance
158  if (bHgtGrow)
159  nHgt = aSiz2.Height() + 1; // a little tolerance
160  }
161  else
162  {
163  nHgt = rOutliner.GetTextHeight() + 1; // a little tolerance
164  }
165  rOutliner.Clear();
166  }
167 
168  if (nWdt < nMinWdt)
169  nWdt = nMinWdt;
170  if (nWdt > nMaxWdt)
171  nWdt = nMaxWdt;
172  nWdt += nHDist;
173  if (nWdt < 1)
174  nWdt = 1; // nHDist may be negative
175  if (nHgt < nMinHgt)
176  nHgt = nMinHgt;
177  if (nHgt > nMaxHgt)
178  nHgt = nMaxHgt;
179  nHgt += nVDist;
180  if (nHgt < 1)
181  nHgt = 1; // nVDist may be negative
182  tools::Long nWdtGrow = nWdt - (rR.Right() - rR.Left());
183  tools::Long nHgtGrow = nHgt - (rR.Bottom() - rR.Top());
184 
185  if (nWdtGrow == 0)
186  bWdtGrow = false;
187  if (nHgtGrow == 0)
188  bHgtGrow = false;
189 
190  if (!bWdtGrow && !bHgtGrow)
191  return false;
192 
193  if (bWdtGrow)
194  {
196 
197  if (eHAdj == SDRTEXTHORZADJUST_LEFT)
198  rR.AdjustRight(nWdtGrow );
199  else if (eHAdj == SDRTEXTHORZADJUST_RIGHT)
200  rR.AdjustLeft( -nWdtGrow );
201  else
202  {
203  tools::Long nWdtGrow2 = nWdtGrow / 2;
204  rR.AdjustLeft( -nWdtGrow2 );
205  rR.SetRight( rR.Left() + nWdt );
206  }
207  }
208 
209  if (bHgtGrow)
210  {
212 
213  if (eVAdj == SDRTEXTVERTADJUST_TOP)
214  rR.AdjustBottom(nHgtGrow );
215  else if (eVAdj == SDRTEXTVERTADJUST_BOTTOM)
216  rR.AdjustTop( -nHgtGrow );
217  else
218  {
219  tools::Long nHgtGrow2 = nHgtGrow / 2;
220  rR.AdjustTop( -nHgtGrow2 );
221  rR.SetBottom( rR.Top() + nHgt );
222  }
223  }
224 
225  if (aGeo.nRotationAngle)
226  {
227  // Object is rotated.
228  Point aD1(rR.TopLeft());
229  aD1 -= aOldRect.TopLeft();
230  Point aD2(aD1);
231  RotatePoint(aD2, Point(), aGeo.nSin, aGeo.nCos);
232  aD2 -= aD1;
233  rR.Move(aD2.X(), aD2.Y());
234  }
235 
236  return true;
237 }
238 
240 {
241  bool bRet = AdjustTextFrameWidthAndHeight(maRect,bHgt,bWdt);
242  if (bRet)
243  {
244  SetRectsDirty();
245  if (auto pRectObj = dynamic_cast<SdrRectObj *>(this)) { // this is a hack
246  pRectObj->SetXPolyDirty();
247  }
248  if (auto pCaptionObj = dynamic_cast<SdrCaptionObj *>(this)) { // this is a hack
249  pCaptionObj->ImpRecalcTail();
250  }
251  }
252  return bRet;
253 }
254 
256 {
257  tools::Rectangle aNewRect(maRect);
258  bool bRet=AdjustTextFrameWidthAndHeight(aNewRect);
259  if (bRet) {
260  tools::Rectangle aBoundRect0; if (pUserCall!=nullptr) aBoundRect0=GetLastBoundRect();
261  maRect = aNewRect;
262  SetRectsDirty();
263  if (auto pRectObj = dynamic_cast<SdrRectObj *>(this)) { // this is a hack
264  pRectObj->SetXPolyDirty();
265  }
266  if (auto pCaptionObj = dynamic_cast<SdrCaptionObj *>(this)) { // this is a hack
267  pCaptionObj->ImpRecalcTail();
268  }
269 
270  // to not slow down EditView visualization on Overlay (see
271  // TextEditOverlayObject) it is necessary to suppress the
272  // Invalidates for the deep repaint when the size of the
273  // TextFrame changed (AdjustTextFrameWidthAndHeight returned
274  // true). The ObjectChanges are valid, invalidate will be
275  // done on EndTextEdit anyways
276  const bool bSuppressChangeWhenEditOnOverlay(
277  IsInEditMode() &&
279  GetTextEditOutliner()->hasEditViewCallbacks());
280 
281  // tdf#114956 always broadcast change for ScPostIts
282  if (!bSuppressChangeWhenEditOnOverlay || GetName() == "ScPostIt")
283  {
284  SetChanged();
286  }
287 
289  }
290  return bRet;
291 }
292 
294 {
295  SfxStyleSheetBasePool* pStylePool(getSdrModelFromSdrObject().GetStyleSheetPool());
296  if (pStylePool==nullptr)
297  return;
298 
299  std::vector<OUString> aStyleNames;
300  OutlinerParaObject* pOutlinerParaObject = GetOutlinerParaObject();
301  if (pOutlinerParaObject!=nullptr)
302  {
303  // First, we collect all stylesheets contained in the ParaObject in
304  // the container aStyles. The Family is always appended to the name
305  // of the stylesheet.
306  const EditTextObject& rTextObj=pOutlinerParaObject->GetTextObject();
307  OUString aStyleName;
308  SfxStyleFamily eStyleFam;
309  sal_Int32 nParaCnt=rTextObj.GetParagraphCount();
310 
311 
312  for(sal_Int32 nParaNum(0); nParaNum < nParaCnt; nParaNum++)
313  {
314  rTextObj.GetStyleSheet(nParaNum, aStyleName, eStyleFam);
315 
316  if (!aStyleName.isEmpty())
317  {
318  AppendFamilyToStyleName(aStyleName, eStyleFam);
319 
320  bool bFnd(false);
321  sal_uInt32 nNum(aStyleNames.size());
322 
323  while(!bFnd && nNum > 0)
324  {
325  // we don't want duplicate stylesheets
326  nNum--;
327  bFnd = aStyleName == aStyleNames[nNum];
328  }
329 
330  if(!bFnd)
331  {
332  aStyleNames.push_back(aStyleName);
333  }
334  }
335  }
336  }
337 
338  // now convert the strings in the vector from names to StyleSheet*
340  while (!aStyleNames.empty()) {
341  OUString aName = aStyleNames.back();
342  aStyleNames.pop_back();
343 
345  SfxStyleSheetBase* pStyleBase = pStylePool->Find(aName,eFam);
346  SfxStyleSheet* pStyle = dynamic_cast<SfxStyleSheet*>( pStyleBase );
347  if (pStyle!=nullptr && pStyle!=GetStyleSheet()) {
348  aStyleSheets.insert(pStyle);
349  }
350  }
351  // now remove all superfluous stylesheets
352  sal_uInt16 nNum=GetBroadcasterCount();
353  while (nNum>0) {
354  nNum--;
355  SfxBroadcaster* pBroadcast=GetBroadcasterJOE(nNum);
356  SfxStyleSheet* pStyle=dynamic_cast<SfxStyleSheet*>( pBroadcast );
357  if (pStyle!=nullptr && pStyle!=GetStyleSheet()) { // special case for stylesheet of the object
358  if (aStyleSheets.find(pStyle)==aStyleSheets.end()) {
359  EndListening(*pStyle);
360  }
361  }
362  }
363  // and finally, merge all stylesheets that are contained in aStyles with previous broadcasters
364  for(SfxStyleSheet* pStyle : aStyleSheets) {
365  // let StartListening see for itself if there's already a listener registered
366  StartListening(*pStyle, DuplicateHandling::Prevent);
367  }
368 }
369 
374 void SdrTextObj::RemoveOutlinerCharacterAttribs( const std::vector<sal_uInt16>& rCharWhichIds )
375 {
376  sal_Int32 nText = getTextCount();
377 
378  while( --nText >= 0 )
379  {
380  SdrText* pText = getText( nText );
381  OutlinerParaObject* pOutlinerParaObject = pText ? pText->GetOutlinerParaObject() : nullptr;
382 
383  if(pOutlinerParaObject)
384  {
385  Outliner* pOutliner = nullptr;
386 
387  if( pEdtOutl || (pText == getActiveText()) )
388  pOutliner = pEdtOutl;
389 
390  if(!pOutliner)
391  {
392  pOutliner = &ImpGetDrawOutliner();
393  pOutliner->SetText(*pOutlinerParaObject);
394  }
395 
396  ESelection aSelAll( 0, 0, EE_PARA_ALL, EE_TEXTPOS_ALL );
397  for( const auto& rWhichId : rCharWhichIds )
398  {
399  pOutliner->RemoveAttribs( aSelAll, false, rWhichId );
400  }
401 
402  if(!pEdtOutl || (pText != getActiveText()) )
403  {
404  const sal_Int32 nParaCount = pOutliner->GetParagraphCount();
405  std::unique_ptr<OutlinerParaObject> pTemp = pOutliner->CreateParaObject(0, nParaCount);
406  pOutliner->Clear();
407  NbcSetOutlinerParaObjectForText(std::move(pTemp), pText);
408  }
409  }
410  }
411 }
412 
414 {
415  if( pEdtOutl )
416  return HasTextImpl(pEdtOutl);
417 
419 
420  bool bHasText = false;
421  if( pOPO )
422  {
423  const EditTextObject& rETO = pOPO->GetTextObject();
424  sal_Int32 nParaCount = rETO.GetParagraphCount();
425 
426  if( nParaCount > 0 )
427  bHasText = (nParaCount > 1) || (!rETO.GetText( 0 ).isEmpty());
428  }
429 
430  return bHasText;
431 }
432 
433 void SdrTextObj::AppendFamilyToStyleName(OUString& styleName, SfxStyleFamily family)
434 {
435  OUStringBuffer aFam;
436  aFam.append(static_cast<sal_Int32>(family));
437  comphelper::string::padToLength(aFam, PADDING_LENGTH_FOR_STYLE_FAMILY , PADDING_CHARACTER_FOR_STYLE_FAMILY);
438 
439  styleName += "|" + aFam.makeStringAndClear();
440 }
441 
443 {
444  OUString familyString = styleName.copy(styleName.getLength() - PADDING_LENGTH_FOR_STYLE_FAMILY);
445  familyString = comphelper::string::stripEnd(familyString, PADDING_CHARACTER_FOR_STYLE_FAMILY);
446  sal_uInt16 nFam = static_cast<sal_uInt16>(familyString.toInt32());
447  assert(nFam != 0);
448  return static_cast<SfxStyleFamily>(nFam);
449 }
450 
451 
452 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
OString stripEnd(const OString &rIn, char c)
Point TopLeft() const
tools::Long GetTextLowerDistance() const
Bottom inner spacing to borders.
Definition: svdotext.cxx:1765
virtual bool IsAutoGrowHeight() const
Definition: svdotext.cxx:257
void RemoveOutlinerCharacterAttribs(const std::vector< sal_uInt16 > &rCharWhichIds)
iterates over the paragraphs of a given SdrObject and removes all hard set character attributes with ...
Definition: svdotxat.cxx:374
virtual bool NbcAdjustTextFrameWidthAndHeight(bool bHgt=true, bool bWdt=true)
Definition: svdotxat.cxx:239
tools::Long AdjustRight(tools::Long nHorzMoveDelta)
void setWidth(tools::Long nWidth)
SdrObjUserCall * pUserCall
Definition: svdobj.hxx:874
std::string GetValue
double nSin
Definition: svdtrans.hxx:219
virtual SdrText * getText(sal_Int32 nIndex) const override
returns the nth available text.
Definition: svdotext.cxx:2057
GeoStat aGeo
Definition: svdotext.hxx:185
void SetPaperSize(const Size &rSize)
tools::Long GetTextLeftDistance() const
Left inner spacing to borders.
Definition: svdotext.cxx:1750
SdrTextHorzAdjust
Definition: sdtaitm.hxx:53
long Long
tools::Long nRotationAngle
Definition: svdtrans.hxx:216
void GetStyleSheet(sal_Int32 nPara, OUString &rName, SfxStyleFamily &eFamily) const
SdrOutliner * pEdtOutl
Definition: svdotext.hxx:196
bool IsInEditMode() const
Definition: svdotext.hxx:323
SdrTextAniKind GetTextAniKind() const
Definition: svdotext.cxx:1770
const_iterator find(const Value &x) const
SfxBroadcaster * GetBroadcasterJOE(sal_uInt16 nNo) const
sal_Int32 GetParagraphCount() const
tools::Long GetMinTextFrameHeight() const
Definition: svdotext.cxx:1712
void SetRight(tools::Long v)
virtual bool HasText() const override
Definition: svdotxat.cxx:413
SdrTextAniKind
Animation type for text frame.
Definition: sdtakitm.hxx:29
bool IsEmpty() const
tools::Long GetMaxTextFrameHeight() const
Definition: svdotext.cxx:1717
tools::Long Left() const
const BorderLinePrimitive2D *pCandidateB assert(pCandidateA)
tools::Long Bottom() const
SfxStyleSheet * GetStyleSheet() const
Definition: svdobj.cxx:2141
tools::Rectangle maRect
Definition: svdotext.hxx:182
void SetFixedCellHeight(bool bUseFixedCellHeight)
static void AppendFamilyToStyleName(OUString &styleName, SfxStyleFamily family)
Appends the style family to a provided style name.
Definition: svdotxat.cxx:433
tools::Long GetMaxTextFrameWidth() const
Definition: svdotext.cxx:1727
SfxStyleFamily
virtual bool IsAutoGrowWidth() const
Definition: svdotext.cxx:282
SVX_DLLPRIVATE SdrOutliner * GetTextEditOutliner() const
Definition: svdotext.hxx:157
tools::Long AdjustBottom(tools::Long nVertMoveDelta)
sal_uInt16 GetBroadcasterCount() const
OUString GetText(sal_Int32 nPara) const
void RemoveAttribs(const ESelection &rSelection, bool bRemoveParaAttribs, sal_uInt16 nWhich)
SdrTextHorzAdjust GetTextHorizontalAdjust() const
Definition: svdotext.cxx:309
const EditTextObject & GetTextObject() const
SdrTextVertAdjust GetTextVerticalAdjust() const
Definition: svdotext.cxx:341
double nCos
Definition: svdtrans.hxx:220
void SetText(const OutlinerParaObject &)
#define EE_PARA_ALL
bool IsFitToSize() const
returns true if the old feature for fitting shape content should into shape is enabled. implies IsAutoFit()==false!
Definition: svdotext.cxx:1841
void BroadcastObjectChange() const
Definition: svdobj.cxx:905
tools::Long Width() const
SdrModel & getSdrModelFromSdrObject() const
Definition: svdobj.cxx:273
void SetBottom(tools::Long v)
void StartListening(SfxBroadcaster &rBroadcaster, DuplicateHandling eDuplicateHanding=DuplicateHandling::Unexpected)
const_iterator end() const
virtual SdrText * getActiveText() const
returns the currently active text.
Definition: svdotext.cxx:2048
const SfxPoolItem & GetMergedItem(const sal_uInt16 nWhich) const
Definition: svdobj.cxx:1925
tools::Long Top() const
OUString GetName() const
Definition: svdobj.cxx:698
Size GetSize() const
tools::Long GetMinTextFrameWidth() const
Definition: svdotext.cxx:1722
bool bTextFrame
Definition: svdotext.hxx:231
tools::Long AdjustTop(tools::Long nVertMoveDelta)
static SfxStyleFamily ReadFamilyFromStyleName(const OUString &styleName)
Reads the style family from a style name to which the family has been appended.
Definition: svdotxat.cxx:442
tools::Long GetTextRightDistance() const
Right inner spacing to borders.
Definition: svdotext.cxx:1755
sal_Int32 GetParagraphCount() const
virtual const tools::Rectangle & GetLastBoundRect() const
Definition: svdobj.cxx:868
void RotatePoint(Point &rPnt, const Point &rRef, double sn, double cs)
Definition: svdtrans.hxx:114
std::unique_ptr< OutlinerParaObject > CreateParaObject(sal_Int32 nStartPara=0, sal_Int32 nParaCount=EE_PARA_ALL) const
tools::Long GetTextUpperDistance() const
Top inner spacing to borders.
Definition: svdotext.cxx:1760
void SetMaxAutoPaperSize(const Size &rSz)
virtual OutlinerParaObject * GetOutlinerParaObject() const override
Definition: svdotext.cxx:1362
virtual bool AdjustTextFrameWidthAndHeight()
Definition: svdotxat.cxx:255
void NbcSetOutlinerParaObjectForText(std::unique_ptr< OutlinerParaObject > pTextObject, SdrText *pText)
Definition: svdotext.cxx:1376
OUString aName
tools::Long AdjustWidth(tools::Long n)
void EndListening(SfxBroadcaster &rBroadcaster, bool bRemoveAllDuplicates=false)
tools::Long Height() const
void ImpSetTextStyleSheetListeners()
Definition: svdotxat.cxx:293
SdrTextAniDirection GetTextAniDirection() const
Definition: svdotext.cxx:1775
void SetUpdateMode(bool bUpdate)
SdrTextAniDirection
Definition: sdtaditm.hxx:29
tools::Long AdjustHeight(tools::Long n)
constexpr TypedWhichId< SdrTextFixedCellHeightItem > SDRATTR_TEXT_USEFIXEDCELLHEIGHT(SDRATTR_MISC_FIRST+23)
virtual void SetRectsDirty(bool bNotMyself=false, bool bRecursive=true)
Definition: svdobj.cxx:435
void setHeight(tools::Long nHeight)
void Move(tools::Long nHorzMoveDelta, tools::Long nVertMoveDelta)
virtual sal_Int32 getTextCount() const override
returns the number of texts available for this object.
Definition: svdotext.cxx:2072
tools::Long AdjustLeft(tools::Long nHorzMoveDelta)
void Clear()
OutlinerParaObject * GetOutlinerParaObject() const
Definition: svdtext.cxx:88
std::pair< const_iterator, bool > insert(Value &&x)
virtual void SetChanged()
Definition: svdobj.cxx:929
sal_uLong GetTextHeight() const
virtual SfxStyleSheetBase * Find(const OUString &, SfxStyleFamily eFam, SfxStyleSearchBits n=SfxStyleSearchBits::All)
#define EE_TEXTPOS_ALL
SdrOutliner & ImpGetDrawOutliner() const
Definition: svdotext.cxx:1144
Size CalcTextSize()
static bool HasTextImpl(SdrOutliner const *pOutliner)
returns false if the given pointer is NULL or if the given SdrOutliner contains no text...
Definition: svdotext.cxx:420
tools::Long Right() const
void SendUserCall(SdrUserCallType eUserCall, const tools::Rectangle &rBoundRect) const
Definition: svdobj.cxx:2655
SdrTextVertAdjust
Definition: sdtaitm.hxx:29
scroll back and forth
OStringBuffer & padToLength(OStringBuffer &rBuffer, sal_Int32 nLength, char cFill= '\0')