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 <o3tl/sorted_vector.hxx>
22 #include <o3tl/string_view.hxx>
23 #include <svl/style.hxx>
24 #include <svx/svdotext.hxx>
25 #include <svx/svdmodel.hxx>
26 #include <svx/svdoutl.hxx>
27 #include <svx/svdorect.hxx>
28 #include <svx/svdocapt.hxx>
29 #include <editeng/editdata.hxx>
30 #include <svx/sdtfchim.hxx>
31 
32 
33 #include <editeng/outlobj.hxx>
34 #include <editeng/outliner.hxx>
35 #include <editeng/editobj.hxx>
36 
37 namespace {
38 // The style family which is appended to the style names is padded to this many characters.
39 const short PADDING_LENGTH_FOR_STYLE_FAMILY = 5;
40 // this character will be used to pad the style families when they are appended to the style names
41 const char PADDING_CHARACTER_FOR_STYLE_FAMILY = ' ';
42 }
43 
44 bool SdrTextObj::AdjustTextFrameWidthAndHeight( tools::Rectangle& rR, bool bHgt, bool bWdt ) const
45 {
46  if (!mbTextFrame)
47  // Not a text frame. Bail out.
48  return false;
49 
50  if (rR.IsEmpty())
51  // Empty rectangle.
52  return false;
53 
54  bool bFitToSize = IsFitToSize();
55  if (bFitToSize)
56  return false;
57 
58  bool bWdtGrow = bWdt && IsAutoGrowWidth();
59  bool bHgtGrow = bHgt && IsAutoGrowHeight();
60  if (!bWdtGrow && !bHgtGrow)
61  // Not supposed to auto-adjust width or height.
62  return false;
63 
64  SdrTextAniKind eAniKind = GetTextAniKind();
66 
67  bool bScroll = eAniKind == SdrTextAniKind::Scroll || eAniKind == SdrTextAniKind::Alternate || eAniKind == SdrTextAniKind::Slide;
68  bool bHScroll = bScroll && (eAniDir == SdrTextAniDirection::Left || eAniDir == SdrTextAniDirection::Right);
69  bool bVScroll = bScroll && (eAniDir == SdrTextAniDirection::Up || eAniDir == SdrTextAniDirection::Down);
70 
71  tools::Rectangle aOldRect = rR;
72  tools::Long nHgt = 0, nMinHgt = 0, nMaxHgt = 0;
73  tools::Long nWdt = 0, nMinWdt = 0, nMaxWdt = 0;
74 
75  Size aNewSize = rR.GetSize();
76  aNewSize.AdjustWidth( -1 ); aNewSize.AdjustHeight( -1 );
77 
78  Size aMaxSiz(100000, 100000);
79  Size aTmpSiz(getSdrModelFromSdrObject().GetMaxObjSize());
80 
81  if (aTmpSiz.Width())
82  aMaxSiz.setWidth( aTmpSiz.Width() );
83  if (aTmpSiz.Height())
84  aMaxSiz.setHeight( aTmpSiz.Height() );
85 
86  if (bWdtGrow)
87  {
88  nMinWdt = GetMinTextFrameWidth();
89  nMaxWdt = GetMaxTextFrameWidth();
90  if (nMaxWdt == 0 || nMaxWdt > aMaxSiz.Width())
91  nMaxWdt = aMaxSiz.Width();
92  if (nMinWdt <= 0)
93  nMinWdt = 1;
94 
95  aNewSize.setWidth( nMaxWdt );
96  }
97 
98  if (bHgtGrow)
99  {
100  nMinHgt = GetMinTextFrameHeight();
101  nMaxHgt = GetMaxTextFrameHeight();
102  if (nMaxHgt == 0 || nMaxHgt > aMaxSiz.Height())
103  nMaxHgt = aMaxSiz.Height();
104  if (nMinHgt <= 0)
105  nMinHgt = 1;
106 
107  aNewSize.setHeight( nMaxHgt );
108  }
109 
112  aNewSize.AdjustWidth( -nHDist );
113  aNewSize.AdjustHeight( -nVDist );
114 
115  if (aNewSize.Width() < 2)
116  aNewSize.setWidth( 2 );
117  if (aNewSize.Height() < 2)
118  aNewSize.setHeight( 2 );
119 
120  if (!IsInEditMode())
121  {
122  if (bHScroll)
123  aNewSize.setWidth( 0x0FFFFFFF ); // don't break ticker text
124  if (bVScroll)
125  aNewSize.setHeight( 0x0FFFFFFF );
126  }
127 
128  if (mpEditingOutliner)
129  {
131  if (bWdtGrow)
132  {
134  nWdt = aSiz2.Width() + 1; // a little tolerance
135  if (bHgtGrow)
136  nHgt = aSiz2.Height() + 1; // a little tolerance
137  }
138  else
139  {
140  nHgt = mpEditingOutliner->GetTextHeight() + 1; // a little tolerance
141  }
142  }
143  else
144  {
145  Outliner& rOutliner = ImpGetDrawOutliner();
146  rOutliner.SetPaperSize(aNewSize);
147  rOutliner.SetUpdateLayout(true);
148  // TODO: add the optimization with bPortionInfoChecked etc. here
149  OutlinerParaObject* pOutlinerParaObject = GetOutlinerParaObject();
150  if (pOutlinerParaObject)
151  {
152  rOutliner.SetText(*pOutlinerParaObject);
154  }
155 
156  if (bWdtGrow)
157  {
158  Size aSiz2(rOutliner.CalcTextSize());
159  nWdt = aSiz2.Width() + 1; // a little tolerance
160  if (bHgtGrow)
161  nHgt = aSiz2.Height() + 1; // a little tolerance
162  }
163  else
164  {
165  nHgt = rOutliner.GetTextHeight() + 1; // a little tolerance
166  }
167  rOutliner.Clear();
168  }
169 
170  if (nWdt < nMinWdt)
171  nWdt = nMinWdt;
172  if (nWdt > nMaxWdt)
173  nWdt = nMaxWdt;
174  nWdt += nHDist;
175  if (nWdt < 1)
176  nWdt = 1; // nHDist may be negative
177  if (nHgt < nMinHgt)
178  nHgt = nMinHgt;
179  if (nHgt > nMaxHgt)
180  nHgt = nMaxHgt;
181  nHgt += nVDist;
182  if (nHgt < 1)
183  nHgt = 1; // nVDist may be negative
184  tools::Long nWdtGrow = nWdt - (rR.Right() - rR.Left());
185  tools::Long nHgtGrow = nHgt - (rR.Bottom() - rR.Top());
186 
187  if (nWdtGrow == 0)
188  bWdtGrow = false;
189  if (nHgtGrow == 0)
190  bHgtGrow = false;
191 
192  if (!bWdtGrow && !bHgtGrow)
193  return false;
194 
195  if (bWdtGrow)
196  {
198 
199  if (eHAdj == SDRTEXTHORZADJUST_LEFT)
200  rR.AdjustRight(nWdtGrow );
201  else if (eHAdj == SDRTEXTHORZADJUST_RIGHT)
202  rR.AdjustLeft( -nWdtGrow );
203  else
204  {
205  tools::Long nWdtGrow2 = nWdtGrow / 2;
206  rR.AdjustLeft( -nWdtGrow2 );
207  rR.SetRight( rR.Left() + nWdt );
208  }
209  }
210 
211  if (bHgtGrow)
212  {
214 
215  if (eVAdj == SDRTEXTVERTADJUST_TOP)
216  rR.AdjustBottom(nHgtGrow );
217  else if (eVAdj == SDRTEXTVERTADJUST_BOTTOM)
218  rR.AdjustTop( -nHgtGrow );
219  else
220  {
221  tools::Long nHgtGrow2 = nHgtGrow / 2;
222  rR.AdjustTop( -nHgtGrow2 );
223  rR.SetBottom( rR.Top() + nHgt );
224  }
225  }
226 
227  if (maGeo.nRotationAngle)
228  {
229  // Object is rotated.
230  Point aD1(rR.TopLeft());
231  aD1 -= aOldRect.TopLeft();
232  Point aD2(aD1);
234  aD2 -= aD1;
235  rR.Move(aD2.X(), aD2.Y());
236  }
237 
238  return true;
239 }
240 
242 {
243  bool bRet = AdjustTextFrameWidthAndHeight(maRect,bHgt,bWdt);
244  if (bRet)
245  {
247  if (auto pRectObj = dynamic_cast<SdrRectObj *>(this)) { // this is a hack
248  pRectObj->SetXPolyDirty();
249  }
250  if (auto pCaptionObj = dynamic_cast<SdrCaptionObj *>(this)) { // this is a hack
251  pCaptionObj->ImpRecalcTail();
252  }
253  }
254  return bRet;
255 }
256 
258 {
259  tools::Rectangle aNewRect(maRect);
260  bool bRet=AdjustTextFrameWidthAndHeight(aNewRect);
261  if (bRet) {
262  tools::Rectangle aBoundRect0; if (m_pUserCall!=nullptr) aBoundRect0=GetLastBoundRect();
263  maRect = aNewRect;
265  if (auto pRectObj = dynamic_cast<SdrRectObj *>(this)) { // this is a hack
266  pRectObj->SetXPolyDirty();
267  }
268  bool bScPostIt = false;
269  if (auto pCaptionObj = dynamic_cast<SdrCaptionObj *>(this)) { // this is a hack
270  pCaptionObj->ImpRecalcTail();
271  // tdf#114956, tdf#138549 use GetSpecialTextBoxShadow to recognize
272  // that this SdrCaption is for a ScPostit
273  bScPostIt = pCaptionObj->GetSpecialTextBoxShadow();
274  }
275 
276  // to not slow down EditView visualization on Overlay (see
277  // TextEditOverlayObject) it is necessary to suppress the
278  // Invalidates for the deep repaint when the size of the
279  // TextFrame changed (AdjustTextFrameWidthAndHeight returned
280  // true). The ObjectChanges are valid, invalidate will be
281  // done on EndTextEdit anyways
282  const bool bSuppressChangeWhenEditOnOverlay(
283  IsInEditMode() &&
285  GetTextEditOutliner()->hasEditViewCallbacks());
286 
287  if (!bSuppressChangeWhenEditOnOverlay || bScPostIt)
288  {
289  SetChanged();
291  }
292 
294  }
295  return bRet;
296 }
297 
299 {
300  SfxStyleSheetBasePool* pStylePool(getSdrModelFromSdrObject().GetStyleSheetPool());
301  if (pStylePool==nullptr)
302  return;
303 
304  std::vector<OUString> aStyleNames;
305  OutlinerParaObject* pOutlinerParaObject = GetOutlinerParaObject();
306  if (pOutlinerParaObject!=nullptr)
307  {
308  // First, we collect all stylesheets contained in the ParaObject in
309  // the container aStyles. The Family is always appended to the name
310  // of the stylesheet.
311  const EditTextObject& rTextObj=pOutlinerParaObject->GetTextObject();
312  OUString aStyleName;
313  SfxStyleFamily eStyleFam;
314  sal_Int32 nParaCnt=rTextObj.GetParagraphCount();
315 
316 
317  for(sal_Int32 nParaNum(0); nParaNum < nParaCnt; nParaNum++)
318  {
319  rTextObj.GetStyleSheet(nParaNum, aStyleName, eStyleFam);
320 
321  if (!aStyleName.isEmpty())
322  {
323  AppendFamilyToStyleName(aStyleName, eStyleFam);
324 
325  bool bFnd(false);
326  sal_uInt32 nNum(aStyleNames.size());
327 
328  while(!bFnd && nNum > 0)
329  {
330  // we don't want duplicate stylesheets
331  nNum--;
332  bFnd = aStyleName == aStyleNames[nNum];
333  }
334 
335  if(!bFnd)
336  {
337  aStyleNames.push_back(aStyleName);
338  }
339  }
340  }
341  }
342 
343  // now convert the strings in the vector from names to StyleSheet*
345  while (!aStyleNames.empty()) {
346  OUString aName = aStyleNames.back();
347  aStyleNames.pop_back();
348 
350  SfxStyleSheetBase* pStyleBase = pStylePool->Find(aName,eFam);
351  SfxStyleSheet* pStyle = dynamic_cast<SfxStyleSheet*>( pStyleBase );
352  if (pStyle!=nullptr && pStyle!=GetStyleSheet()) {
353  aStyleSheets.insert(pStyle);
354  }
355  }
356  // now remove all superfluous stylesheets
357  sal_uInt16 nNum=GetBroadcasterCount();
358  while (nNum>0) {
359  nNum--;
360  SfxBroadcaster* pBroadcast=GetBroadcasterJOE(nNum);
361  SfxStyleSheet* pStyle=dynamic_cast<SfxStyleSheet*>( pBroadcast );
362  if (pStyle!=nullptr && pStyle!=GetStyleSheet()) { // special case for stylesheet of the object
363  if (aStyleSheets.find(pStyle)==aStyleSheets.end()) {
364  EndListening(*pStyle);
365  }
366  }
367  }
368  // and finally, merge all stylesheets that are contained in aStyles with previous broadcasters
369  for(SfxStyleSheet* pStyle : aStyleSheets) {
370  // let StartListening see for itself if there's already a listener registered
371  StartListening(*pStyle, DuplicateHandling::Prevent);
372  }
373 }
374 
379 void SdrTextObj::RemoveOutlinerCharacterAttribs( const std::vector<sal_uInt16>& rCharWhichIds )
380 {
381  sal_Int32 nText = getTextCount();
382 
383  while( --nText >= 0 )
384  {
385  SdrText* pText = getText( nText );
386  OutlinerParaObject* pOutlinerParaObject = pText ? pText->GetOutlinerParaObject() : nullptr;
387 
388  if(pOutlinerParaObject)
389  {
390  Outliner* pOutliner = nullptr;
391 
392  if( mpEditingOutliner || (pText == getActiveText()) )
393  pOutliner = mpEditingOutliner;
394 
395  if(!pOutliner)
396  {
397  pOutliner = &ImpGetDrawOutliner();
398  pOutliner->SetText(*pOutlinerParaObject);
399  }
400 
401  ESelection aSelAll( 0, 0, EE_PARA_ALL, EE_TEXTPOS_ALL );
402  for( const auto& rWhichId : rCharWhichIds )
403  {
404  pOutliner->RemoveAttribs( aSelAll, false, rWhichId );
405  }
406 
407  if(!mpEditingOutliner || (pText != getActiveText()) )
408  {
409  const sal_Int32 nParaCount = pOutliner->GetParagraphCount();
410  std::optional<OutlinerParaObject> pTemp = pOutliner->CreateParaObject(0, nParaCount);
411  pOutliner->Clear();
412  NbcSetOutlinerParaObjectForText(std::move(pTemp), pText);
413  }
414  }
415  }
416 }
417 
419 {
420  if (mpEditingOutliner)
422 
424 
425  bool bHasText = false;
426  if( pOPO )
427  {
428  const EditTextObject& rETO = pOPO->GetTextObject();
429  sal_Int32 nParaCount = rETO.GetParagraphCount();
430 
431  if( nParaCount > 0 )
432  bHasText = (nParaCount > 1) || (!rETO.GetText( 0 ).isEmpty());
433  }
434 
435  return bHasText;
436 }
437 
438 void SdrTextObj::AppendFamilyToStyleName(OUString& styleName, SfxStyleFamily family)
439 {
440  OUStringBuffer aFam;
441  aFam.append(static_cast<sal_Int32>(family));
442  comphelper::string::padToLength(aFam, PADDING_LENGTH_FOR_STYLE_FAMILY , PADDING_CHARACTER_FOR_STYLE_FAMILY);
443 
444  styleName += "|" + aFam.makeStringAndClear();
445 }
446 
448 {
449  std::u16string_view familyString = styleName.subView(styleName.getLength() - PADDING_LENGTH_FOR_STYLE_FAMILY);
450  familyString = comphelper::string::stripEnd(familyString, PADDING_CHARACTER_FOR_STYLE_FAMILY);
451  sal_uInt16 nFam = static_cast<sal_uInt16>(o3tl::toInt32(familyString));
452  assert(nFam != 0);
453  return static_cast<SfxStyleFamily>(nFam);
454 }
455 
456 
457 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
OString stripEnd(const OString &rIn, char c)
tools::Long GetTextLowerDistance() const
Bottom inner spacing to borders.
Definition: svdotext.cxx:1752
virtual bool IsAutoGrowHeight() const
Definition: svdotext.cxx:304
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:379
virtual bool NbcAdjustTextFrameWidthAndHeight(bool bHgt=true, bool bWdt=true)
Definition: svdotxat.cxx:241
tools::Long AdjustRight(tools::Long nHorzMoveDelta)
void setWidth(tools::Long nWidth)
std::string GetValue
constexpr tools::Long Left() const
virtual SdrText * getText(sal_Int32 nIndex) const override
returns the nth available text.
Definition: svdotext.cxx:2074
void SetPaperSize(const Size &rSize)
tools::Long GetTextLeftDistance() const
Left inner spacing to borders.
Definition: svdotext.cxx:1737
SdrTextHorzAdjust
Definition: sdtaitm.hxx:53
long Long
double mfSinRotationAngle
Definition: svdtrans.hxx:206
bool IsInEditMode() const
Definition: svdotext.hxx:314
SdrTextAniKind GetTextAniKind() const
Definition: svdotext.cxx:1757
const_iterator find(const Value &x) const
SfxBroadcaster * GetBroadcasterJOE(sal_uInt16 nNo) const
sal_uInt32 GetTextHeight() const
sal_Int32 GetParagraphCount() const
tools::Long GetMinTextFrameHeight() const
Definition: svdotext.cxx:1699
virtual bool HasText() const override
Definition: svdotxat.cxx:418
SdrTextAniKind
Animation type for text frame.
Definition: sdtakitm.hxx:29
tools::Long GetMaxTextFrameHeight() const
Definition: svdotext.cxx:1704
constexpr tools::Long Width() const
OutlinerParaObject * GetOutlinerParaObject()
Definition: svdtext.cxx:89
SfxStyleSheet * GetStyleSheet() const
Definition: svdobj.cxx:2242
tools::Rectangle maRect
Definition: svdotext.hxx:170
void SetFixedCellHeight(bool bUseFixedCellHeight)
static void AppendFamilyToStyleName(OUString &styleName, SfxStyleFamily family)
Appends the style family to a provided style name.
Definition: svdotxat.cxx:438
tools::Long GetMaxTextFrameWidth() const
Definition: svdotext.cxx:1714
SfxStyleFamily
virtual bool IsAutoGrowWidth() const
Definition: svdotext.cxx:329
SVX_DLLPRIVATE SdrOutliner * GetTextEditOutliner() const
Definition: svdotext.hxx:145
tools::Long AdjustBottom(tools::Long nVertMoveDelta)
sal_uInt16 GetBroadcasterCount() const
virtual void SetBoundAndSnapRectsDirty(bool bNotMyself=false, bool bRecursive=true)
Definition: svdobj.cxx:510
constexpr bool IsEmpty() const
void RemoveAttribs(const ESelection &rSelection, bool bRemoveParaAttribs, sal_uInt16 nWhich)
void NbcSetOutlinerParaObjectForText(std::optional< OutlinerParaObject > pTextObject, SdrText *pText)
Definition: svdotext.cxx:1353
SdrTextHorzAdjust GetTextHorizontalAdjust() const
Definition: svdotext.cxx:356
bool mbTextFrame
Definition: svdotext.hxx:219
const EditTextObject & GetTextObject() const
SdrTextVertAdjust GetTextVerticalAdjust() const
Definition: svdotext.cxx:388
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:1858
SdrOutliner * mpEditingOutliner
Definition: svdotext.hxx:184
void BroadcastObjectChange() const
Definition: svdobj.cxx:1001
virtual OUString GetText(sal_Int32 nPara) const =0
constexpr tools::Long Right() const
SdrModel & getSdrModelFromSdrObject() const
Definition: svdobj.cxx:279
SdrObjUserCall * m_pUserCall
Definition: svdobj.hxx:884
constexpr tools::Long Top() const
constexpr void SetRight(tools::Long v)
constexpr void SetBottom(tools::Long v)
void StartListening(SfxBroadcaster &rBroadcaster, DuplicateHandling eDuplicateHanding=DuplicateHandling::Unexpected)
const_iterator end() const
sal_Int32 toInt32(std::u16string_view str, sal_Int16 radix=10)
virtual SdrText * getActiveText() const
returns the currently active text.
Definition: svdotext.cxx:2065
const SfxPoolItem & GetMergedItem(const sal_uInt16 nWhich) const
Definition: svdobj.cxx:2007
std::optional< OutlinerParaObject > CreateParaObject(sal_Int32 nStartPara=0, sal_Int32 nParaCount=EE_PARA_ALL) const
tools::Long GetMinTextFrameWidth() const
Definition: svdotext.cxx:1709
constexpr Point TopLeft() const
tools::Long AdjustTop(tools::Long nVertMoveDelta)
constexpr tools::Long Bottom() const
static SfxStyleFamily ReadFamilyFromStyleName(const OUString &styleName)
Reads the style family from a style name to which the family has been appended.
Definition: svdotxat.cxx:447
tools::Long GetTextRightDistance() const
Right inner spacing to borders.
Definition: svdotext.cxx:1742
virtual const tools::Rectangle & GetLastBoundRect() const
Definition: svdobj.cxx:963
void RotatePoint(Point &rPnt, const Point &rRef, double sn, double cs)
Definition: svdtrans.hxx:101
constexpr Size GetSize() const
tools::Long GetTextUpperDistance() const
Top inner spacing to borders.
Definition: svdotext.cxx:1747
void SetMaxAutoPaperSize(const Size &rSz)
constexpr tools::Long Height() const
virtual OutlinerParaObject * GetOutlinerParaObject() const override
Definition: svdotext.cxx:1330
virtual bool AdjustTextFrameWidthAndHeight()
Definition: svdotxat.cxx:257
GeoStat maGeo
Definition: svdotext.hxx:173
virtual sal_Int32 GetParagraphCount() const =0
Degree100 nRotationAngle
Definition: svdtrans.hxx:203
OUString aName
tools::Long AdjustWidth(tools::Long n)
double mfCosRotationAngle
Definition: svdtrans.hxx:207
void EndListening(SfxBroadcaster &rBroadcaster, bool bRemoveAllDuplicates=false)
void ImpSetTextStyleSheetListeners()
Definition: svdotxat.cxx:298
bool SetUpdateLayout(bool bUpdate)
SdrTextAniDirection GetTextAniDirection() const
Definition: svdotext.cxx:1762
SdrTextAniDirection
Definition: sdtaditm.hxx:29
tools::Long AdjustHeight(tools::Long n)
constexpr TypedWhichId< SdrTextFixedCellHeightItem > SDRATTR_TEXT_USEFIXEDCELLHEIGHT(SDRATTR_MISC_FIRST+23)
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:2089
tools::Long AdjustLeft(tools::Long nHorzMoveDelta)
virtual void GetStyleSheet(sal_Int32 nPara, OUString &rName, SfxStyleFamily &eFamily) const =0
void Clear()
std::pair< const_iterator, bool > insert(Value &&x)
virtual void SetChanged()
Definition: svdobj.cxx:1025
virtual SfxStyleSheetBase * Find(const OUString &, SfxStyleFamily eFam, SfxStyleSearchBits n=SfxStyleSearchBits::All)
#define EE_TEXTPOS_ALL
SdrOutliner & ImpGetDrawOutliner() const
Definition: svdotext.cxx:1164
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:468
void SendUserCall(SdrUserCallType eUserCall, const tools::Rectangle &rBoundRect) const
Definition: svdobj.cxx:2762
SdrTextVertAdjust
Definition: sdtaitm.hxx:29
scroll back and forth
OStringBuffer & padToLength(OStringBuffer &rBuffer, sal_Int32 nLength, char cFill= '\0')