chart2/source/controller/main/ChartController_Window.cxx |    2 -
 chart2/source/controller/main/DrawCommandDispatch.cxx    |    2 -
 filter/source/msfilter/msdffimp.cxx                      |    2 -
 filter/source/msfilter/svdfppt.cxx                       |    4 +-
 include/svx/svdobj.hxx                                   |    4 ++
 include/svx/svdotext.hxx                                 |    2 +
 oox/source/export/drawingml.cxx                          |    6 +--
 oox/source/export/vmlexport.cxx                          |    2 -
 sc/source/filter/excel/xiescher.cxx                      |    2 -
 sc/source/filter/xcl97/xcl97esc.cxx                      |    2 -
 sc/source/ui/drawfunc/drawsh4.cxx                        |    2 -
 sc/source/ui/drawfunc/drtxtob2.cxx                       |    2 -
 sc/source/ui/drawfunc/fuconrec.cxx                       |    2 -
 sc/source/ui/drawfunc/fuconstr.cxx                       |    2 -
 sc/source/ui/drawfunc/fudraw.cxx                         |    2 -
 sc/source/ui/drawfunc/fusel.cxx                          |    2 -
 sc/source/ui/drawfunc/futext.cxx                         |    6 +--
 sc/source/ui/drawfunc/futext3.cxx                        |    2 -
 sd/qa/unit/SdrPdfImportTest.cxx                          |    2 -
 sd/qa/unit/ShapeImportExportTest.cxx                     |   22 +++++------
 sd/qa/unit/export-tests-ooxml1.cxx                       |   28 +++++++--------
 sd/qa/unit/export-tests-ooxml3.cxx                       |    2 -
 sd/qa/unit/export-tests.cxx                              |   10 ++---
 sd/qa/unit/import-tests.cxx                              |   22 +++++------
 sd/qa/unit/import-tests2.cxx                             |   20 +++++-----
 sd/qa/unit/misc-tests.cxx                                |    4 +-
 sd/qa/unit/tiledrendering/tiledrendering.cxx             |    2 -
 sd/source/core/EffectMigration.cxx                       |    2 -
 sd/source/core/drawdoc.cxx                               |    2 -
 sd/source/core/drawdoc4.cxx                              |    6 +--
 sd/source/core/sdpage.cxx                                |   10 ++---
 sd/source/filter/ppt/pptin.cxx                           |    2 -
 sd/source/filter/ppt/pptinanimations.cxx                 |    2 -
 sd/source/filter/xml/sdtransform.cxx                     |    2 -
 sd/source/ui/app/sdxfer.cxx                              |    2 -
 sd/source/ui/func/fudraw.cxx                             |    2 -
 sd/source/ui/func/fupoor.cxx                             |    6 +--
 sd/source/ui/func/futext.cxx                             |   18 ++++-----
 sd/source/ui/func/futhes.cxx                             |    2 -
 sd/source/ui/slidesorter/controller/SlsSlotManager.cxx   |    2 -
 sd/source/ui/table/tablefunction.cxx                     |    2 -
 sd/source/ui/unoidl/unomodel.cxx                         |    2 -
 sd/source/ui/unoidl/unoobj.cxx                           |    4 +-
 sd/source/ui/view/DocumentRenderer.cxx                   |    6 +--
 sd/source/ui/view/Outliner.cxx                           |    4 +-
 sd/source/ui/view/OutlinerIterator.cxx                   |   10 ++---
 sd/source/ui/view/drawview.cxx                           |    2 -
 sd/source/ui/view/drviews4.cxx                           |    2 -
 sd/source/ui/view/drviews6.cxx                           |    2 -
 sd/source/ui/view/drviews7.cxx                           |    2 -
 sd/source/ui/view/drviewsf.cxx                           |    2 -
 sd/source/ui/view/outlnvsh.cxx                           |    2 -
 sd/source/ui/view/sdview.cxx                             |    8 ++--
 svx/source/accessibility/AccessibleShape.cxx             |    2 -
 svx/source/engine3d/view3d.cxx                           |    2 -
 svx/source/sdr/contact/viewcontactofsdrobj.cxx           |    2 -
 svx/source/sidebar/SelectionAnalyzer.cxx                 |    4 +-
 svx/source/sidebar/possize/PosSizePropertyPanel.cxx      |    2 -
 svx/source/svdraw/svddrgv.cxx                            |    2 -
 svx/source/svdraw/svdedtv.cxx                            |    4 +-
 svx/source/svdraw/svdedtv1.cxx                           |    4 +-
 svx/source/svdraw/svdedtv2.cxx                           |    2 -
 svx/source/svdraw/svdedxv.cxx                            |    4 +-
 svx/source/svdraw/svdetc.cxx                             |    2 -
 svx/source/svdraw/svdfmtf.cxx                            |    4 +-
 svx/source/svdraw/svdmark.cxx                            |    4 +-
 svx/source/svdraw/svdmrkv.cxx                            |    6 +--
 svx/source/svdraw/svdobj.cxx                             |   11 +++++
 svx/source/svdraw/svdotext.cxx                           |    4 +-
 svx/source/svdraw/svdotextdecomposition.cxx              |    2 -
 svx/source/svdraw/svdpdf.cxx                             |    4 +-
 svx/source/svdraw/svdundo.cxx                            |    6 +--
 svx/source/svdraw/svdview.cxx                            |    6 +--
 svx/source/unodraw/UnoGraphicExporter.cxx                |    2 -
 svx/source/unodraw/unoshape.cxx                          |   12 +++---
 svx/source/unodraw/unoshtxt.cxx                          |   22 +++++------
 sw/qa/extras/layout/layout.cxx                           |    2 -
 sw/source/core/doc/DocumentDrawModelManager.cxx          |    2 -
 sw/source/core/doc/textboxhelper.cxx                     |    2 -
 sw/source/core/draw/dcontact.cxx                         |    5 +-
 sw/source/core/frmedt/feshview.cxx                       |    2 -
 sw/source/filter/indexing/IndexingExport.cxx             |    2 -
 sw/source/filter/ww8/rtfsdrexport.cxx                    |    2 -
 sw/source/filter/ww8/wrtw8sty.cxx                        |    6 +--
 sw/source/filter/ww8/ww8graf.cxx                         |    4 +-
 sw/source/filter/ww8/ww8par.cxx                          |    2 -
 sw/source/uibase/dialog/SwSpellDialogChildWindow.cxx     |    2 -
 sw/source/uibase/ribbar/conrect.cxx                      |    2 -
 sw/source/uibase/shells/drawsh.cxx                       |    2 -
 sw/source/uibase/shells/drwtxtsh.cxx                     |    2 -
 sw/source/uibase/uiview/viewdraw.cxx                     |    4 +-
 91 files changed, 217 insertions(+), 203 deletions(-)

New commits:
commit 4d863fd8e38748607636d0033262baa62a3e9eb2
Author:     Noel Grandin <noelgran...@gmail.com>
AuthorDate: Wed Nov 2 19:39:01 2022 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Wed Nov 2 20:30:29 2022 +0100

    tdf#54857 elide more dynamic_cast
    
    Change-Id: I42bef355eeef15e3733a5ee57b0569887cfa5e84
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/142183
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/chart2/source/controller/main/ChartController_Window.cxx 
b/chart2/source/controller/main/ChartController_Window.cxx
index 91295002cf03..018419b0eacf 100644
--- a/chart2/source/controller/main/ChartController_Window.cxx
+++ b/chart2/source/controller/main/ChartController_Window.cxx
@@ -957,7 +957,7 @@ void ChartController::execute_DoubleClick( const Point* 
pMousePixel )
         {
             // #i12587# support for shapes in chart
             SdrObject* pObj = DrawViewWrapper::getSdrObject( 
m_aSelection.getSelectedAdditionalShape() );
-            if ( dynamic_cast< const SdrTextObj* >(pObj) !=  nullptr )
+            if ( DynCastSdrTextObj(pObj) !=  nullptr )
             {
                 bEditText = true;
             }
diff --git a/chart2/source/controller/main/DrawCommandDispatch.cxx 
b/chart2/source/controller/main/DrawCommandDispatch.cxx
index 9d896b75425e..18dfda1de4a4 100644
--- a/chart2/source/controller/main/DrawCommandDispatch.cxx
+++ b/chart2/source/controller/main/DrawCommandDispatch.cxx
@@ -473,7 +473,7 @@ rtl::Reference<SdrObject> 
DrawCommandDispatch::createDefaultObject( const sal_uI
                     case COMMAND_ID_DRAW_TEXT:
                     case COMMAND_ID_DRAW_TEXT_VERTICAL:
                         {
-                            if ( SdrTextObj* pTextObj = 
dynamic_cast<SdrTextObj*>( pObj.get()) )
+                            if ( SdrTextObj* pTextObj = DynCastSdrTextObj( 
pObj.get()) )
                             {
                                 pTextObj->SetLogicRect( aRect );
                                 bool bVertical = ( nID == 
COMMAND_ID_DRAW_TEXT_VERTICAL );
diff --git a/filter/source/msfilter/msdffimp.cxx 
b/filter/source/msfilter/msdffimp.cxx
index 3705429218bd..aa6093a408a1 100644
--- a/filter/source/msfilter/msdffimp.cxx
+++ b/filter/source/msfilter/msdffimp.cxx
@@ -3666,7 +3666,7 @@ void SvxMSDffManager::ReadObjText( SvStream& rStream, 
SdrObject* pObj )
 // our outliner is too complicate to be used properly,
 void SvxMSDffManager::ReadObjText( const OUString& rText, SdrObject* pObj )
 {
-    SdrTextObj* pText = dynamic_cast<SdrTextObj*>( pObj  );
+    SdrTextObj* pText = DynCastSdrTextObj( pObj  );
     if ( !pText )
         return;
 
diff --git a/filter/source/msfilter/svdfppt.cxx 
b/filter/source/msfilter/svdfppt.cxx
index 460d0c1a1a73..3020083756a0 100644
--- a/filter/source/msfilter/svdfppt.cxx
+++ b/filter/source/msfilter/svdfppt.cxx
@@ -1147,7 +1147,7 @@ rtl::Reference<SdrObject> SdrEscherImport::ProcessObj( 
SvStream& rSt, DffObjData
                     */
                     if ( dynamic_cast<const SdrObjCustomShape* >(pTObj.get()) 
==  nullptr && !bFitShapeToText && !bWordWrap )
                     {
-                        SdrTextObj* pText = dynamic_cast<SdrTextObj*>( 
pTObj.get()  );
+                        SdrTextObj* pText = DynCastSdrTextObj( pTObj.get()  );
                         if ( pText )
                         {
                             if ( bVerticalText )
@@ -2226,7 +2226,7 @@ SdrOutliner* SdrPowerPointImport::GetDrawOutliner( 
SdrTextObj const * pSdrText )
 
 SdrObject* SdrPowerPointImport::ReadObjText( PPTTextObj* pTextObj, SdrObject* 
pSdrObj, SdPageCapsule pPage ) const
 {
-    SdrTextObj* pText = dynamic_cast<SdrTextObj*>( pSdrObj  );
+    SdrTextObj* pText = DynCastSdrTextObj( pSdrObj  );
     if ( pText )
     {
         if ( !ApplyTextObj( pTextObj, pText, pPage, nullptr, nullptr ) )
diff --git a/include/svx/svdobj.hxx b/include/svx/svdobj.hxx
index d2b1ae4579be..a251d8ddac33 100644
--- a/include/svx/svdobj.hxx
+++ b/include/svx/svdobj.hxx
@@ -55,6 +55,7 @@ class SdrObjList;
 class SdrObject;
 class SdrPage;
 class SdrPageView;
+class SdrTextObj;
 class SdrView;
 class SfxItemSet;
 class SfxGrabBagItem;
@@ -760,6 +761,7 @@ public:
     bool IsVisible() const { return mbVisible;}
     void SetMarkProtect(bool bProt);
     bool IsMarkProtect() const { return m_bMarkProt;}
+    virtual bool IsSdrTextObj() const { return false; }
 
     /// Whether the aspect ratio should be kept by default when resizing.
     virtual bool shouldKeepAspectRatio() const { return false; }
@@ -1002,6 +1004,8 @@ SVXCORE_DLLPUBLIC E3dScene* DynCastE3dScene(SdrObject*);
 inline const E3dScene* DynCastE3dScene(const SdrObject* p) { return 
DynCastE3dScene(const_cast<SdrObject*>(p)); }
 SVXCORE_DLLPUBLIC E3dObject* DynCastE3dObject(SdrObject*);
 inline const E3dObject* DynCastE3dObject(const SdrObject* p) { return 
DynCastE3dObject(const_cast<SdrObject*>(p)); }
+SVXCORE_DLLPUBLIC SdrTextObj* DynCastSdrTextObj(SdrObject*);
+inline const SdrTextObj* DynCastSdrTextObj(const SdrObject* p) { return 
DynCastSdrTextObj(const_cast<SdrObject*>(p)); }
 
 
 struct SdrObjCreatorParams
diff --git a/include/svx/svdotext.hxx b/include/svx/svdotext.hxx
index 6041a74fe0aa..a2574765ade7 100644
--- a/include/svx/svdotext.hxx
+++ b/include/svx/svdotext.hxx
@@ -625,6 +625,8 @@ public:
     */
     static bool HasTextImpl( SdrOutliner const * pOutliner );
 
+    virtual bool IsSdrTextObj() const final { return true; }
+
     friend class ::SdrTextObjTest;
 };
 
diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx
index e8d5bef246c4..8939a5415683 100644
--- a/oox/source/export/drawingml.cxx
+++ b/oox/source/export/drawingml.cxx
@@ -3117,7 +3117,7 @@ bool DrawingML::WriteParagraphProperties(const 
Reference<XTextContent>& rParagra
         SvxShapeText* pTextShape = 
dynamic_cast<SvxShapeText*>(rXShapePropSet.get());
         if (pTextShape)
         {
-            SdrTextObj* pTextObject = 
dynamic_cast<SdrTextObj*>(pTextShape->GetSdrObject());
+            SdrTextObj* pTextObject = 
DynCastSdrTextObj(pTextShape->GetSdrObject());
             if (pTextObject)
             {
                 const auto nFontScaleY = pTextObject->GetFontScaleY();
@@ -3796,7 +3796,7 @@ void DrawingML::WriteText(const Reference<XInterface>& 
rXIface, bool bBodyPr, bo
                 SvxShapeText* pTextShape = 
dynamic_cast<SvxShapeText*>(rXIface.get());
                 if (pTextShape)
                 {
-                    SdrTextObj* pTextObject = 
dynamic_cast<SdrTextObj*>(pTextShape->GetSdrObject());
+                    SdrTextObj* pTextObject = 
DynCastSdrTextObj(pTextShape->GetSdrObject());
                     if (pTextObject)
                         nFontScale = pTextObject->GetFontScaleY() * 1000;
                 }
@@ -3828,7 +3828,7 @@ void DrawingML::WriteText(const Reference<XInterface>& 
rXIface, bool bBodyPr, bo
         return;
 
     SdrObject* pSdrObject = xShape.is() ? 
SdrObject::getSdrObjectFromXShape(xShape) : nullptr;
-    const SdrTextObj* pTxtObj = dynamic_cast<SdrTextObj*>( pSdrObject );
+    const SdrTextObj* pTxtObj = DynCastSdrTextObj( pSdrObject );
     if (pTxtObj && mpTextExport)
     {
         std::optional<OutlinerParaObject> pParaObj;
diff --git a/oox/source/export/vmlexport.cxx b/oox/source/export/vmlexport.cxx
index bda301201ad2..4fa1e6cf7764 100644
--- a/oox/source/export/vmlexport.cxx
+++ b/oox/source/export/vmlexport.cxx
@@ -1389,7 +1389,7 @@ sal_Int32 VMLExport::StartShape()
     OString const textboxStyle(m_TextboxStyle.makeStringAndClear());
 
     // now check if we have some editeng text (not associated textbox) and we 
have a text exporter registered
-    const SdrTextObj* pTxtObj = dynamic_cast<const SdrTextObj*>( m_pSdrObject 
);
+    const SdrTextObj* pTxtObj = DynCastSdrTextObj( m_pSdrObject );
     if (pTxtObj && m_pTextExport && 
msfilter::util::HasTextBoxContent(m_nShapeType) && 
!IsWaterMarkShape(m_pSdrObject->GetName()) && !lcl_isTextBox(m_pSdrObject))
     {
         std::optional<OutlinerParaObject> pParaObj;
diff --git a/sc/source/filter/excel/xiescher.cxx 
b/sc/source/filter/excel/xiescher.cxx
index 4d60bd5b3f5d..7940758bffc5 100644
--- a/sc/source/filter/excel/xiescher.cxx
+++ b/sc/source/filter/excel/xiescher.cxx
@@ -1498,7 +1498,7 @@ rtl::Reference<SdrObject> XclImpTextObj::DoCreateSdrObj( 
XclImpDffConverter& rDf
 void XclImpTextObj::DoPreProcessSdrObj( XclImpDffConverter& rDffConv, 
SdrObject& rSdrObj ) const
 {
     // set text data
-    if( SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( &rSdrObj ) )
+    if( SdrTextObj* pTextObj = DynCastSdrTextObj( &rSdrObj ) )
     {
         if( maTextData.mxString )
         {
diff --git a/sc/source/filter/xcl97/xcl97esc.cxx 
b/sc/source/filter/xcl97/xcl97esc.cxx
index cb87fb7c3731..03336e90b577 100644
--- a/sc/source/filter/xcl97/xcl97esc.cxx
+++ b/sc/source/filter/xcl97/xcl97esc.cxx
@@ -275,7 +275,7 @@ EscherExHostAppData* XclEscherEx::StartShape( const 
Reference< XShape >& rxShape
                         pAnchor->SetFlags( *pObj );
                         pCurrAppData->SetClientAnchor( pAnchor );
                     }
-                    const SdrTextObj* pTextObj = dynamic_cast<SdrTextObj*>( 
pObj  );
+                    const SdrTextObj* pTextObj = DynCastSdrTextObj( pObj  );
                     if( pTextObj && !lcl_IsFontwork( pTextObj ) && 
(pObj->GetObjIdentifier() != SdrObjKind::Caption) )
                     {
                         const OutlinerParaObject* pParaObj = 
pTextObj->GetOutlinerParaObject();
diff --git a/sc/source/ui/drawfunc/drawsh4.cxx 
b/sc/source/ui/drawfunc/drawsh4.cxx
index fdb0efe91615..226407b2ee1b 100644
--- a/sc/source/ui/drawfunc/drawsh4.cxx
+++ b/sc/source/ui/drawfunc/drawsh4.cxx
@@ -33,7 +33,7 @@ void ScDrawShell::GetFormTextState(SfxItemSet& rSet)
     if ( rMarkList.GetMarkCount() == 1 )
         pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
 
-    const SdrTextObj* pTextObj = dynamic_cast< const SdrTextObj* >(pObj);
+    const SdrTextObj* pTextObj = DynCastSdrTextObj(pObj);
     const bool bDeactivate(
         !pObj ||
         !pTextObj ||
diff --git a/sc/source/ui/drawfunc/drtxtob2.cxx 
b/sc/source/ui/drawfunc/drtxtob2.cxx
index a5b4a7394cdd..2c8ed5ac89cb 100644
--- a/sc/source/ui/drawfunc/drtxtob2.cxx
+++ b/sc/source/ui/drawfunc/drtxtob2.cxx
@@ -197,7 +197,7 @@ void ScDrawTextObjectBar::GetFormTextState(SfxItemSet& rSet)
     if ( rMarkList.GetMarkCount() == 1 )
         pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
 
-    const SdrTextObj* pTextObj = dynamic_cast< const SdrTextObj* >(pObj);
+    const SdrTextObj* pTextObj = DynCastSdrTextObj(pObj);
     const bool bDeactivate(
         !pObj ||
         !pTextObj ||
diff --git a/sc/source/ui/drawfunc/fuconrec.cxx 
b/sc/source/ui/drawfunc/fuconrec.cxx
index 6c2d548094bb..d73915ca450e 100644
--- a/sc/source/ui/drawfunc/fuconrec.cxx
+++ b/sc/source/ui/drawfunc/fuconrec.cxx
@@ -137,7 +137,7 @@ bool FuConstRectangle::MouseButtonUp(const MouseEvent& 
rMEvt)
             {
                 SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
                 //  create OutlinerParaObject now so it can be set to vertical
-                if ( auto pSdrTextObj = dynamic_cast<SdrTextObj*>( pObj) )
+                if ( auto pSdrTextObj = DynCastSdrTextObj( pObj) )
                     pSdrTextObj->ForceOutlinerParaObject();
                 OutlinerParaObject* pOPO = pObj->GetOutlinerParaObject();
                 if( pOPO && !pOPO->IsEffectivelyVertical() )
diff --git a/sc/source/ui/drawfunc/fuconstr.cxx 
b/sc/source/ui/drawfunc/fuconstr.cxx
index 1064a30e1093..0ffb6e832d3f 100644
--- a/sc/source/ui/drawfunc/fuconstr.cxx
+++ b/sc/source/ui/drawfunc/fuconstr.cxx
@@ -146,7 +146,7 @@ bool FuConstruct::MouseButtonUp(const MouseEvent& rMEvt)
                 SdrObject* pObj = pMark->GetMarkedSdrObj();
 
                 //  if Uno-Controls no text mode
-                if ( dynamic_cast<const SdrTextObj*>( pObj) != nullptr && 
dynamic_cast<const SdrUnoObj*>( pObj) ==  nullptr )
+                if ( DynCastSdrTextObj( pObj) != nullptr && dynamic_cast<const 
SdrUnoObj*>( pObj) ==  nullptr )
                 {
                     OutlinerParaObject* pOPO = pObj->GetOutlinerParaObject();
                     bool bVertical = ( pOPO && pOPO->IsEffectivelyVertical() );
diff --git a/sc/source/ui/drawfunc/fudraw.cxx b/sc/source/ui/drawfunc/fudraw.cxx
index ee9090765e2c..ea5f14a820d4 100644
--- a/sc/source/ui/drawfunc/fudraw.cxx
+++ b/sc/source/ui/drawfunc/fudraw.cxx
@@ -157,7 +157,7 @@ bool FuDraw::MouseButtonUp(const MouseEvent& rMEvt)
 static bool lcl_KeyEditMode( SdrObject* pObj, ScTabViewShell& rViewShell, 
const KeyEvent* pInitialKey )
 {
     bool bReturn = false;
-    if ( dynamic_cast<const SdrTextObj*>( pObj) != nullptr && 
dynamic_cast<const SdrUnoObj*>( pObj) ==  nullptr )
+    if ( DynCastSdrTextObj( pObj) != nullptr && dynamic_cast<const 
SdrUnoObj*>( pObj) ==  nullptr )
     {
         // start text edit - like FuSelection::MouseButtonUp,
         // but with bCursorToEnd instead of mouse position
diff --git a/sc/source/ui/drawfunc/fusel.cxx b/sc/source/ui/drawfunc/fusel.cxx
index 46b7fc47d040..2b051bb3bf11 100644
--- a/sc/source/ui/drawfunc/fusel.cxx
+++ b/sc/source/ui/drawfunc/fusel.cxx
@@ -490,7 +490,7 @@ bool FuSelection::MouseButtonUp(const MouseEvent& rMEvt)
                     //  not in UNO controls
                     //  #i32352# not in media objects
 
-                    else if ( dynamic_cast<const SdrTextObj*>( pObj) != 
nullptr && dynamic_cast<const SdrUnoObj*>( pObj) == nullptr && 
dynamic_cast<const SdrMediaObj*>( pObj) ==  nullptr )
+                    else if ( DynCastSdrTextObj( pObj) != nullptr && 
dynamic_cast<const SdrUnoObj*>( pObj) == nullptr && dynamic_cast<const 
SdrMediaObj*>( pObj) ==  nullptr )
                     {
                         OutlinerParaObject* pOPO = 
pObj->GetOutlinerParaObject();
                         bool bVertical = ( pOPO && 
pOPO->IsEffectivelyVertical() );
diff --git a/sc/source/ui/drawfunc/futext.cxx b/sc/source/ui/drawfunc/futext.cxx
index 7f0ec1281484..9bd670d3fa9d 100644
--- a/sc/source/ui/drawfunc/futext.cxx
+++ b/sc/source/ui/drawfunc/futext.cxx
@@ -416,7 +416,7 @@ bool FuText::MouseButtonUp(const MouseEvent& rMEvt)
                 if(rMarkList.GetMark(0))
                 {
                     SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
-                    if(auto pText = dynamic_cast<SdrTextObj*>( pObj))
+                    if(auto pText = DynCastSdrTextObj( pObj))
                     {
                         SfxItemSet aSet(pDrDoc->GetItemPool());
 
@@ -557,7 +557,7 @@ void FuText::SetInEditMode(SdrObject* pObj, const Point* 
pMousePixel,
     if (!(nSdrObjKind == SdrObjKind::Text ||
         nSdrObjKind == SdrObjKind::TitleText ||
         nSdrObjKind == SdrObjKind::OutlineText ||
-        dynamic_cast<const SdrTextObj*>( pObj) !=  nullptr))
+        DynCastSdrTextObj( pObj) !=  nullptr))
         return;
 
     SdrPageView* pPV = pView->GetSdrPageView();
@@ -634,7 +634,7 @@ rtl::Reference<SdrObject> FuText::CreateDefaultObject(const 
sal_uInt16 nID, cons
 
     if(pObj)
     {
-        if(auto pText = dynamic_cast<SdrTextObj*>( pObj.get() ))
+        if(auto pText = DynCastSdrTextObj( pObj.get() ))
         {
             pText->SetLogicRect(rRectangle);
 
diff --git a/sc/source/ui/drawfunc/futext3.cxx 
b/sc/source/ui/drawfunc/futext3.cxx
index df601ea0d35c..1c13beea9388 100644
--- a/sc/source/ui/drawfunc/futext3.cxx
+++ b/sc/source/ui/drawfunc/futext3.cxx
@@ -122,7 +122,7 @@ void FuText::StopEditMode()
 
     /*  If the entire text has been cleared, the cell note and its caption
         object have to be removed. */
-    SdrTextObj* pTextObject = dynamic_cast< SdrTextObj* >( pObject );
+    SdrTextObj* pTextObject = DynCastSdrTextObj( pObject );
     bool bDeleteNote = !pTextObject || !pTextObject->HasText();
     if( bDeleteNote )
     {
diff --git a/sd/qa/unit/SdrPdfImportTest.cxx b/sd/qa/unit/SdrPdfImportTest.cxx
index 7c10eebc17e5..372ccf13f534 100644
--- a/sd/qa/unit/SdrPdfImportTest.cxx
+++ b/sd/qa/unit/SdrPdfImportTest.cxx
@@ -137,7 +137,7 @@ CPPUNIT_TEST_FIXTURE(SdrPdfImportTest, testImportSimpleText)
     // Object should be a text object containing one paragraph with
     // content "This is PDF!"
 
-    SdrTextObj* pTextObject = dynamic_cast<SdrTextObj*>(pImportedObject);
+    SdrTextObj* pTextObject = DynCastSdrTextObj(pImportedObject);
     CPPUNIT_ASSERT(pTextObject);
     OutlinerParaObject* pOutlinerParagraphObject = 
pTextObject->GetOutlinerParaObject();
     const EditTextObject& aEdit = pOutlinerParagraphObject->GetTextObject();
diff --git a/sd/qa/unit/ShapeImportExportTest.cxx 
b/sd/qa/unit/ShapeImportExportTest.cxx
index 1b5ff45ca859..535f3f4eda7e 100644
--- a/sd/qa/unit/ShapeImportExportTest.cxx
+++ b/sd/qa/unit/ShapeImportExportTest.cxx
@@ -74,7 +74,7 @@ void ShapeImportExportTest::testTextDistancesOOXML()
 
         for (auto const& rString : aObjectDesc)
         {
-            auto* pTextObj = dynamic_cast<SdrTextObj*>(searchObject(pPage, 
rString));
+            auto* pTextObj = DynCastSdrTextObj(searchObject(pPage, rString));
             CPPUNIT_ASSERT(pTextObj);
             CPPUNIT_ASSERT_EQUAL(tools::Long(-1292), 
pTextObj->GetTextUpperDistance());
             CPPUNIT_ASSERT_EQUAL(tools::Long(2708), 
pTextObj->GetTextLowerDistance());
@@ -91,7 +91,7 @@ void ShapeImportExportTest::testTextDistancesOOXML()
 
         for (auto const& rString : aObjectDesc)
         {
-            auto* pTextObj = dynamic_cast<SdrTextObj*>(searchObject(pPage, 
rString));
+            auto* pTextObj = DynCastSdrTextObj(searchObject(pPage, rString));
             CPPUNIT_ASSERT(pTextObj);
             CPPUNIT_ASSERT_EQUAL(tools::Long(0), 
pTextObj->GetTextUpperDistance());
             CPPUNIT_ASSERT_EQUAL(tools::Long(1000), 
pTextObj->GetTextLowerDistance());
@@ -108,7 +108,7 @@ void ShapeImportExportTest::testTextDistancesOOXML()
 
         for (auto const& rString : aObjectDesc)
         {
-            auto* pTextObj = dynamic_cast<SdrTextObj*>(searchObject(pPage, 
rString));
+            auto* pTextObj = DynCastSdrTextObj(searchObject(pPage, rString));
             CPPUNIT_ASSERT(pTextObj);
             CPPUNIT_ASSERT_EQUAL(tools::Long(708), 
pTextObj->GetTextUpperDistance());
             CPPUNIT_ASSERT_EQUAL(tools::Long(708), 
pTextObj->GetTextLowerDistance());
@@ -125,7 +125,7 @@ void ShapeImportExportTest::testTextDistancesOOXML()
 
         for (auto const& rString : aObjectDesc)
         {
-            auto* pTextObj = dynamic_cast<SdrTextObj*>(searchObject(pPage, 
rString));
+            auto* pTextObj = DynCastSdrTextObj(searchObject(pPage, rString));
             CPPUNIT_ASSERT(pTextObj);
             CPPUNIT_ASSERT_EQUAL(tools::Long(0), 
pTextObj->GetTextUpperDistance());
             CPPUNIT_ASSERT_EQUAL(tools::Long(0), 
pTextObj->GetTextLowerDistance());
@@ -142,7 +142,7 @@ void ShapeImportExportTest::testTextDistancesOOXML()
 
         for (auto const& rString : aObjectDesc)
         {
-            auto* pTextObj = dynamic_cast<SdrTextObj*>(searchObject(pPage, 
rString));
+            auto* pTextObj = DynCastSdrTextObj(searchObject(pPage, rString));
             CPPUNIT_ASSERT(pTextObj);
             CPPUNIT_ASSERT_EQUAL(tools::Long(1000), 
pTextObj->GetTextUpperDistance());
             CPPUNIT_ASSERT_EQUAL(tools::Long(0), 
pTextObj->GetTextLowerDistance());
@@ -159,7 +159,7 @@ void ShapeImportExportTest::testTextDistancesOOXML()
 
         for (auto const& rString : aObjectDesc)
         {
-            auto* pTextObj = dynamic_cast<SdrTextObj*>(searchObject(pPage, 
rString));
+            auto* pTextObj = DynCastSdrTextObj(searchObject(pPage, rString));
             CPPUNIT_ASSERT(pTextObj);
             CPPUNIT_ASSERT_EQUAL(tools::Long(2708), 
pTextObj->GetTextUpperDistance());
             CPPUNIT_ASSERT_EQUAL(tools::Long(-1292), 
pTextObj->GetTextLowerDistance());
@@ -183,7 +183,7 @@ void 
ShapeImportExportTest::testTextDistancesOOXML_LargerThanTextAreaSpecialCase
 
         for (auto const& rName : aObjectNames)
         {
-            auto* pTextObj = dynamic_cast<SdrTextObj*>(searchObject(pPage, 
rName));
+            auto* pTextObj = DynCastSdrTextObj(searchObject(pPage, rName));
             CPPUNIT_ASSERT(pTextObj);
             CPPUNIT_ASSERT_EQUAL(tools::Long(-792), 
pTextObj->GetTextUpperDistance());
             CPPUNIT_ASSERT_EQUAL(tools::Long(2208), 
pTextObj->GetTextLowerDistance());
@@ -199,7 +199,7 @@ void 
ShapeImportExportTest::testTextDistancesOOXML_LargerThanTextAreaSpecialCase
 
         for (auto const& rName : aObjectNames)
         {
-            auto* pTextObj = dynamic_cast<SdrTextObj*>(searchObject(pPage, 
rName));
+            auto* pTextObj = DynCastSdrTextObj(searchObject(pPage, rName));
             CPPUNIT_ASSERT(pTextObj);
             CPPUNIT_ASSERT_EQUAL(tools::Long(-292), 
pTextObj->GetTextUpperDistance());
             CPPUNIT_ASSERT_EQUAL(tools::Long(1708), 
pTextObj->GetTextLowerDistance());
@@ -215,7 +215,7 @@ void 
ShapeImportExportTest::testTextDistancesOOXML_LargerThanTextAreaSpecialCase
 
         for (auto const& rName : aObjectNames)
         {
-            auto* pTextObj = dynamic_cast<SdrTextObj*>(searchObject(pPage, 
rName));
+            auto* pTextObj = DynCastSdrTextObj(searchObject(pPage, rName));
             CPPUNIT_ASSERT(pTextObj);
             CPPUNIT_ASSERT_EQUAL(tools::Long(708), 
pTextObj->GetTextUpperDistance());
             CPPUNIT_ASSERT_EQUAL(tools::Long(708), 
pTextObj->GetTextLowerDistance());
@@ -231,7 +231,7 @@ void 
ShapeImportExportTest::testTextDistancesOOXML_LargerThanTextAreaSpecialCase
 
         for (auto const& rName : aObjectNames)
         {
-            auto* pTextObj = dynamic_cast<SdrTextObj*>(searchObject(pPage, 
rName));
+            auto* pTextObj = DynCastSdrTextObj(searchObject(pPage, rName));
             CPPUNIT_ASSERT(pTextObj);
             CPPUNIT_ASSERT_EQUAL(tools::Long(1708), 
pTextObj->GetTextUpperDistance());
             CPPUNIT_ASSERT_EQUAL(tools::Long(-292), 
pTextObj->GetTextLowerDistance());
@@ -247,7 +247,7 @@ void 
ShapeImportExportTest::testTextDistancesOOXML_LargerThanTextAreaSpecialCase
 
         for (auto const& rName : aObjectNames)
         {
-            auto* pTextObj = dynamic_cast<SdrTextObj*>(searchObject(pPage, 
rName));
+            auto* pTextObj = DynCastSdrTextObj(searchObject(pPage, rName));
             CPPUNIT_ASSERT(pTextObj);
             CPPUNIT_ASSERT_EQUAL(tools::Long(2208), 
pTextObj->GetTextUpperDistance());
             CPPUNIT_ASSERT_EQUAL(tools::Long(-792), 
pTextObj->GetTextLowerDistance());
diff --git a/sd/qa/unit/export-tests-ooxml1.cxx 
b/sd/qa/unit/export-tests-ooxml1.cxx
index 93234b2bb794..a9bec3abfd8e 100644
--- a/sd/qa/unit/export-tests-ooxml1.cxx
+++ b/sd/qa/unit/export-tests-ooxml1.cxx
@@ -532,7 +532,7 @@ void SdOOXMLExportTest1::testBnc887230()
 
     const SdrPage* pPage = GetPage(1);
 
-    const SdrTextObj* pObj = dynamic_cast<SdrTextObj*>(pPage->GetObj(0));
+    const SdrTextObj* pObj = DynCastSdrTextObj(pPage->GetObj(0));
     // Without the fix in place, this test would have failed with
     //- Expected: 255
     //- Actual  : 13421823
@@ -550,14 +550,14 @@ void SdOOXMLExportTest1::testBnc870233_1()
 
     // First shape has red, bold font
     {
-        const SdrTextObj* pObj = dynamic_cast<SdrTextObj*>(pPage->GetObj(0));
+        const SdrTextObj* pObj = DynCastSdrTextObj(pPage->GetObj(0));
         checkFontAttributes<Color, SvxColorItem>(pObj, Color(0xff0000), 
EE_CHAR_COLOR);
         checkFontAttributes<FontWeight, SvxWeightItem>(pObj, WEIGHT_BOLD, 
EE_CHAR_WEIGHT);
     }
 
     // Second shape has blue, italic font
     {
-        const SdrTextObj* pObj = dynamic_cast<SdrTextObj*>(pPage->GetObj(1));
+        const SdrTextObj* pObj = DynCastSdrTextObj(pPage->GetObj(1));
         checkFontAttributes<Color, SvxColorItem>(pObj, Color(0x0000ff), 
EE_CHAR_COLOR);
         checkFontAttributes<FontItalic, SvxPostureItem>(pObj, ITALIC_NORMAL, 
EE_CHAR_ITALIC);
     }
@@ -576,7 +576,7 @@ void SdOOXMLExportTest1::testBnc870233_2()
     {
         const SdrObjGroup* pObjGroup = 
dynamic_cast<SdrObjGroup*>(pPage->GetObj(0));
         CPPUNIT_ASSERT(pObjGroup);
-        const SdrTextObj* pObj = 
dynamic_cast<SdrTextObj*>(pObjGroup->GetSubList()->GetObj(1));
+        const SdrTextObj* pObj = 
DynCastSdrTextObj(pObjGroup->GetSubList()->GetObj(1));
         checkFontAttributes<Color, SvxColorItem>(pObj, Color(0x0000ff), 
EE_CHAR_COLOR);
     }
 
@@ -584,7 +584,7 @@ void SdOOXMLExportTest1::testBnc870233_2()
     {
         const SdrObjGroup* pObjGroup = 
dynamic_cast<SdrObjGroup*>(pPage->GetObj(1));
         CPPUNIT_ASSERT(pObjGroup);
-        const SdrTextObj* pObj = 
dynamic_cast<SdrTextObj*>(pObjGroup->GetSubList()->GetObj(1));
+        const SdrTextObj* pObj = 
DynCastSdrTextObj(pObjGroup->GetSubList()->GetObj(1));
         checkFontAttributes<Color, SvxColorItem>(pObj, Color(0x1f497d), 
EE_CHAR_COLOR);
     }
 
@@ -592,7 +592,7 @@ void SdOOXMLExportTest1::testBnc870233_2()
     {
         const SdrObjGroup* pObjGroup = 
dynamic_cast<SdrObjGroup*>(pPage->GetObj(2));
         CPPUNIT_ASSERT(pObjGroup);
-        const SdrTextObj* pObj = 
dynamic_cast<SdrTextObj*>(pObjGroup->GetSubList()->GetObj(1));
+        const SdrTextObj* pObj = 
DynCastSdrTextObj(pObjGroup->GetSubList()->GetObj(1));
         checkFontAttributes<Color, SvxColorItem>(pObj, Color(0xffffff), 
EE_CHAR_COLOR);
     }
 }
@@ -608,7 +608,7 @@ void SdOOXMLExportTest1::testN828390_4()
     {
         std::vector<EECharAttrib> rLst;
         SdrObject* pObj = pPage->GetObj(0);
-        SdrTextObj* pTxtObj = dynamic_cast<SdrTextObj*>(pObj);
+        SdrTextObj* pTxtObj = DynCastSdrTextObj(pObj);
         CPPUNIT_ASSERT(pTxtObj);
         const EditTextObject& aEdit = 
pTxtObj->GetOutlinerParaObject()->GetTextObject();
         aEdit.GetCharAttribs(0, rLst);
@@ -645,7 +645,7 @@ void SdOOXMLExportTest1::testN828390_5()
     const SdrPage* pPage = GetPage(1);
     {
         SdrObject* pObj = pPage->GetObj(0);
-        SdrTextObj* pTxtObj = dynamic_cast<SdrTextObj*>(pObj);
+        SdrTextObj* pTxtObj = DynCastSdrTextObj(pObj);
         CPPUNIT_ASSERT(pTxtObj);
         const EditTextObject& aEdit = 
pTxtObj->GetOutlinerParaObject()->GetTextObject();
         const SvxNumBulletItem& rNumFmt = 
aEdit.GetParaAttribs(3).Get(EE_PARA_NUMBULLET);
@@ -783,7 +783,7 @@ void SdOOXMLExportTest1::testN828390()
         std::vector<EECharAttrib> rLst;
         // Get the object
         SdrObject* pObj = pPage->GetObj(0);
-        SdrTextObj* pTxtObj = dynamic_cast<SdrTextObj*>(pObj);
+        SdrTextObj* pTxtObj = DynCastSdrTextObj(pObj);
         CPPUNIT_ASSERT(pTxtObj);
         const EditTextObject& aEdit = 
pTxtObj->GetOutlinerParaObject()->GetTextObject();
         aEdit.GetCharAttribs(0, rLst);
@@ -853,7 +853,7 @@ void SdOOXMLExportTest1::testBnc822347_EmptyBullet()
     SdrOutliner* pOutliner = pDoc->GetInternalOutliner();
     const SdrPage* pPage = pDoc->GetPage(1);
     SdrObject* pObject = pPage->GetObj(0);
-    SdrTextObj* pTextObject = dynamic_cast<SdrTextObj*>(pObject);
+    SdrTextObj* pTextObject = DynCastSdrTextObj(pObject);
     CPPUNIT_ASSERT(pTextObject);
 
     OutlinerParaObject* pOutlinerParagraphObject = 
pTextObject->GetOutlinerParaObject();
@@ -878,7 +878,7 @@ void SdOOXMLExportTest1::testFdo90607()
     saveAndReload("Impress Office Open XML");
 
     const SdrPage* pPage = GetPage(1);
-    SdrTextObj* pTxtObj = dynamic_cast<SdrTextObj*>(pPage->GetObj(1));
+    SdrTextObj* pTxtObj = DynCastSdrTextObj(pPage->GetObj(1));
     CPPUNIT_ASSERT_MESSAGE("no text object", pTxtObj != nullptr);
     OutlinerParaObject* pOutlinerParagraphObject = 
pTxtObj->GetOutlinerParaObject();
     const sal_Int16 nDepth = pOutlinerParagraphObject->GetDepth(0);
@@ -955,7 +955,7 @@ void SdOOXMLExportTest1::testBulletStartNumber()
     saveAndReload("Impress Office Open XML");
 
     const SdrPage* pPage = GetPage(1);
-    SdrTextObj* pTxtObj = dynamic_cast<SdrTextObj*>(pPage->GetObj(0));
+    SdrTextObj* pTxtObj = DynCastSdrTextObj(pPage->GetObj(0));
     CPPUNIT_ASSERT_MESSAGE("no text object", pTxtObj != nullptr);
     const EditTextObject& aEdit = 
pTxtObj->GetOutlinerParaObject()->GetTextObject();
     const SvxNumBulletItem* pNumFmt = 
aEdit.GetParaAttribs(0).GetItem(EE_PARA_NUMBULLET);
@@ -1052,7 +1052,7 @@ void SdOOXMLExportTest1::testBulletColor()
 
     const SdrPage* pPage = GetPage(1);
 
-    SdrTextObj* pTxtObj = dynamic_cast<SdrTextObj*>(pPage->GetObj(0));
+    SdrTextObj* pTxtObj = DynCastSdrTextObj(pPage->GetObj(0));
     CPPUNIT_ASSERT_MESSAGE("no text object", pTxtObj != nullptr);
 
     const EditTextObject& aEdit = 
pTxtObj->GetOutlinerParaObject()->GetTextObject();
@@ -1098,7 +1098,7 @@ void SdOOXMLExportTest1::testBulletMarginAndIndentation()
 
     const SdrPage* pPage = GetPage(1);
 
-    SdrTextObj* pTxtObj = dynamic_cast<SdrTextObj*>(pPage->GetObj(0));
+    SdrTextObj* pTxtObj = DynCastSdrTextObj(pPage->GetObj(0));
     CPPUNIT_ASSERT_MESSAGE("no text object", pTxtObj != nullptr);
 
     const EditTextObject& aEdit = 
pTxtObj->GetOutlinerParaObject()->GetTextObject();
diff --git a/sd/qa/unit/export-tests-ooxml3.cxx 
b/sd/qa/unit/export-tests-ooxml3.cxx
index a4e5d882d8e6..62fe34150896 100644
--- a/sd/qa/unit/export-tests-ooxml3.cxx
+++ b/sd/qa/unit/export-tests-ooxml3.cxx
@@ -1351,7 +1351,7 @@ void SdOOXMLExportTest3::testTdf126234()
     // check relative size of the bullet, 400% is a legitimate value for MS 
Office document
     // Without a fix, it will fail to set the size correctly
     const SdrPage* pPage = GetPage(1);
-    SdrTextObj* pTxtObj = dynamic_cast<SdrTextObj*>(pPage->GetObj(0));
+    SdrTextObj* pTxtObj = DynCastSdrTextObj(pPage->GetObj(0));
     CPPUNIT_ASSERT_MESSAGE("no text object", pTxtObj != nullptr);
     const EditTextObject& aEdit = 
pTxtObj->GetOutlinerParaObject()->GetTextObject();
     const SvxNumBulletItem* pNumFmt = 
aEdit.GetParaAttribs(0).GetItem(EE_PARA_NUMBULLET);
diff --git a/sd/qa/unit/export-tests.cxx b/sd/qa/unit/export-tests.cxx
index 14fe41e2099f..83e27d471bff 100644
--- a/sd/qa/unit/export-tests.cxx
+++ b/sd/qa/unit/export-tests.cxx
@@ -297,10 +297,10 @@ void SdExportTest::testTransparentBackground()
 
     const SdrPage* pPage = GetPage(1);
 
-    const SdrTextObj* pObj1 = dynamic_cast<SdrTextObj*>(pPage->GetObj(0));
+    const SdrTextObj* pObj1 = DynCastSdrTextObj(pPage->GetObj(0));
     checkFontAttributes<Color, SvxColorItem>(pObj1, COL_TRANSPARENT, 
EE_CHAR_BKGCOLOR);
 
-    const SdrTextObj* pObj2 = dynamic_cast<SdrTextObj*>(pPage->GetObj(1));
+    const SdrTextObj* pObj2 = DynCastSdrTextObj(pPage->GetObj(1));
     checkFontAttributes<Color, SvxColorItem>(pObj2, COL_YELLOW, 
EE_CHAR_BKGCOLOR);
 }
 
@@ -310,7 +310,7 @@ void SdExportTest::testTdf142716()
     saveAndReload("Impress Office Open XML");
 
     const SdrPage* pPage = GetPage(1);
-    const SdrTextObj* pObj = dynamic_cast<SdrTextObj*>(pPage->GetObj(0));
+    const SdrTextObj* pObj = DynCastSdrTextObj(pPage->GetObj(0));
 
     OUString sText = pObj->GetOutlinerParaObject()->GetTextObject().GetText(0);
 
@@ -1707,7 +1707,7 @@ void SdExportTest::testColumnsODG()
         CPPUNIT_ASSERT_EQUAL(uno::Any(sal_Int32(700)),
                              xColProps->getPropertyValue("AutomaticDistance"));
 
-        auto pTextObj = 
dynamic_cast<SdrTextObj*>(SdrObject::getSdrObjectFromXShape(xShape));
+        auto pTextObj = 
DynCastSdrTextObj(SdrObject::getSdrObjectFromXShape(xShape));
         CPPUNIT_ASSERT(pTextObj);
 
         CPPUNIT_ASSERT_EQUAL(sal_Int16(2), pTextObj->GetTextColumnsNumber());
@@ -1731,7 +1731,7 @@ void SdExportTest::testColumnsODG()
         CPPUNIT_ASSERT_EQUAL(uno::Any(sal_Int32(700)),
                              xColProps->getPropertyValue("AutomaticDistance"));
 
-        auto pTextObj = 
dynamic_cast<SdrTextObj*>(SdrObject::getSdrObjectFromXShape(xShape));
+        auto pTextObj = 
DynCastSdrTextObj(SdrObject::getSdrObjectFromXShape(xShape));
         CPPUNIT_ASSERT(pTextObj);
 
         CPPUNIT_ASSERT_EQUAL(sal_Int16(2), pTextObj->GetTextColumnsNumber());
diff --git a/sd/qa/unit/import-tests.cxx b/sd/qa/unit/import-tests.cxx
index 8f36b016a75b..1121403f4835 100644
--- a/sd/qa/unit/import-tests.cxx
+++ b/sd/qa/unit/import-tests.cxx
@@ -803,7 +803,7 @@ void SdImportTest::testN759180()
 
     // Get the object
     SdrObject* pObj = pPage->GetObj(0);
-    SdrTextObj* pTxtObj = dynamic_cast<SdrTextObj*>(pObj);
+    SdrTextObj* pTxtObj = DynCastSdrTextObj(pObj);
     CPPUNIT_ASSERT(pTxtObj);
     std::vector<EECharAttrib> rLst;
     const EditTextObject& aEdit = 
pTxtObj->GetOutlinerParaObject()->GetTextObject();
@@ -833,7 +833,7 @@ void SdImportTest::testN862510_1()
     {
         std::vector<EECharAttrib> rLst;
         SdrObject* pObj = pPage->GetObj(0);
-        SdrTextObj* pTxtObj = dynamic_cast<SdrTextObj*>(pObj);
+        SdrTextObj* pTxtObj = DynCastSdrTextObj(pObj);
         CPPUNIT_ASSERT(pTxtObj);
         const EditTextObject& aEdit = 
pTxtObj->GetOutlinerParaObject()->GetTextObject();
         aEdit.GetCharAttribs(0, rLst);
@@ -874,7 +874,7 @@ void SdImportTest::testN862510_4()
     {
         std::vector<EECharAttrib> rLst;
         SdrObject* pObj = pPage->GetObj(0);
-        SdrTextObj* pTxtObj = dynamic_cast<SdrTextObj*>(pObj);
+        SdrTextObj* pTxtObj = DynCastSdrTextObj(pObj);
         CPPUNIT_ASSERT(pTxtObj);
         const EditTextObject& aEdit = 
pTxtObj->GetOutlinerParaObject()->GetTextObject();
         aEdit.GetCharAttribs(0, rLst);
@@ -894,7 +894,7 @@ void SdImportTest::testN828390_2()
     const SdrPage* pPage = GetPage(1);
 
     SdrObject* pObj = pPage->GetObj(0);
-    SdrTextObj* pTxtObj = dynamic_cast<SdrTextObj*>(pObj);
+    SdrTextObj* pTxtObj = DynCastSdrTextObj(pObj);
     CPPUNIT_ASSERT(pTxtObj);
     const EditTextObject& aEdit = 
pTxtObj->GetOutlinerParaObject()->GetTextObject();
     CPPUNIT_ASSERT_EQUAL(OUString("Linux  "), aEdit.GetText(0));
@@ -907,7 +907,7 @@ void SdImportTest::testN828390_3()
     const SdrPage* pPage = GetPage(1);
 
     SdrObject* pObj = pPage->GetObj(0);
-    SdrTextObj* pTxtObj = dynamic_cast<SdrTextObj*>(pObj);
+    SdrTextObj* pTxtObj = DynCastSdrTextObj(pObj);
     CPPUNIT_ASSERT(pTxtObj);
     const EditTextObject& aEdit = 
pTxtObj->GetOutlinerParaObject()->GetTextObject();
     std::vector<EECharAttrib> rLst;
@@ -1014,7 +1014,7 @@ void SdImportTest::testN778859()
     {
         // Get the object
         SdrObject* pObj = pPage->GetObj(1);
-        SdrTextObj* pTxtObj = dynamic_cast<SdrTextObj*>(pObj);
+        SdrTextObj* pTxtObj = DynCastSdrTextObj(pObj);
         CPPUNIT_ASSERT_MESSAGE("no text object", pTxtObj != nullptr);
         CPPUNIT_ASSERT(!pTxtObj->IsAutoFit());
     }
@@ -1026,7 +1026,7 @@ void SdImportTest::testFdo68594()
 
     const SdrPage* pPage = &(GetPage(1)->TRG_GetMasterPage());
     SdrObject* pObj = pPage->GetObj(1);
-    SdrTextObj* pTxtObj = dynamic_cast<SdrTextObj*>(pObj);
+    SdrTextObj* pTxtObj = DynCastSdrTextObj(pObj);
     CPPUNIT_ASSERT_MESSAGE("no text object", pTxtObj != nullptr);
     const SvxColorItem* pC = &pTxtObj->GetMergedItem(EE_CHAR_COLOR);
     CPPUNIT_ASSERT_MESSAGE("no color item", pC != nullptr);
@@ -1261,13 +1261,13 @@ void SdImportTest::testMultiColTexts()
     loadFromURL(u"pptx/multicol.pptx");
     const SdrPage* pPage = GetPage(1);
 
-    auto pTextObj = dynamic_cast<SdrTextObj*>(pPage->GetObj(0));
+    auto pTextObj = DynCastSdrTextObj(pPage->GetObj(0));
     CPPUNIT_ASSERT(pTextObj);
 
     CPPUNIT_ASSERT_EQUAL(sal_Int16(2), pTextObj->GetTextColumnsNumber());
     CPPUNIT_ASSERT_EQUAL(sal_Int32(1000), pTextObj->GetTextColumnsSpacing());
 
-    auto pMasterTextObj = 
dynamic_cast<SdrTextObj*>(pPage->TRG_GetMasterPage().GetObj(0));
+    auto pMasterTextObj = 
DynCastSdrTextObj(pPage->TRG_GetMasterPage().GetObj(0));
     CPPUNIT_ASSERT(pMasterTextObj);
 
     CPPUNIT_ASSERT_EQUAL(sal_Int16(2), pMasterTextObj->GetTextColumnsNumber());
@@ -1354,7 +1354,7 @@ void SdImportTest::testBnc584721_1()
 
     const SdrPage* pPage = &(GetPage(1)->TRG_GetMasterPage());
     SdrObject* pObj = pPage->GetObj(0);
-    SdrTextObj* pTxtObj = dynamic_cast<SdrTextObj*>(pObj);
+    SdrTextObj* pTxtObj = DynCastSdrTextObj(pObj);
     CPPUNIT_ASSERT_MESSAGE("no text object", pTxtObj != nullptr);
     const EditTextObject& aEdit = 
pTxtObj->GetOutlinerParaObject()->GetTextObject();
     CPPUNIT_ASSERT_EQUAL(OUString("Click to edit Master title style"), 
aEdit.GetText(0));
@@ -1744,7 +1744,7 @@ void SdImportTest::testBulletSuffix()
 
     // check suffix of the char bullet
     const SdrPage* pPage = GetPage(1);
-    SdrTextObj* pTxtObj = dynamic_cast<SdrTextObj*>(pPage->GetObj(0));
+    SdrTextObj* pTxtObj = DynCastSdrTextObj(pPage->GetObj(0));
     CPPUNIT_ASSERT_MESSAGE("no text object", pTxtObj != nullptr);
     const EditTextObject& aEdit = 
pTxtObj->GetOutlinerParaObject()->GetTextObject();
     const SvxNumBulletItem* pNumFmt = 
aEdit.GetParaAttribs(1).GetItem(EE_PARA_NUMBULLET);
diff --git a/sd/qa/unit/import-tests2.cxx b/sd/qa/unit/import-tests2.cxx
index c6e335661e8c..8572bb5efdd4 100644
--- a/sd/qa/unit/import-tests2.cxx
+++ b/sd/qa/unit/import-tests2.cxx
@@ -427,7 +427,7 @@ void SdImportTest2::testTdf103792()
     CPPUNIT_ASSERT_MESSAGE("No page found", pPage != nullptr);
     SdrObject* pObj = pPage->GetObj(0);
     CPPUNIT_ASSERT_MESSAGE("Wrong object", pObj != nullptr);
-    SdrTextObj* pTxtObj = dynamic_cast<SdrTextObj*>(pObj);
+    SdrTextObj* pTxtObj = DynCastSdrTextObj(pObj);
     CPPUNIT_ASSERT_MESSAGE("Not a text object", pTxtObj != nullptr);
 
     const EditTextObject& aEdit = 
pTxtObj->GetOutlinerParaObject()->GetTextObject();
@@ -694,7 +694,7 @@ void SdImportTest2::testTdf103477()
 
     const SdrPage* pPage = GetPage(1);
 
-    SdrTextObj* pTxtObj = dynamic_cast<SdrTextObj*>(pPage->GetObj(6));
+    SdrTextObj* pTxtObj = DynCastSdrTextObj(pPage->GetObj(6));
     CPPUNIT_ASSERT_MESSAGE("no text object", pTxtObj != nullptr);
 
     const EditTextObject& aEdit = 
pTxtObj->GetOutlinerParaObject()->GetTextObject();
@@ -1053,7 +1053,7 @@ void SdImportTest2::testTdf108925()
 
     loadFromURL(u"odp/tdf108925.odp");
     const SdrPage* pPage = GetPage(1);
-    SdrTextObj* pTxtObj = dynamic_cast<SdrTextObj*>(pPage->GetObj(0));
+    SdrTextObj* pTxtObj = DynCastSdrTextObj(pPage->GetObj(0));
     CPPUNIT_ASSERT_MESSAGE("No text object", pTxtObj != nullptr);
     const EditTextObject& aEdit = 
pTxtObj->GetOutlinerParaObject()->GetTextObject();
 
@@ -1123,7 +1123,7 @@ void SdImportTest2::testTdf90626()
 {
     loadFromURL(u"pptx/tdf90626.pptx");
     const SdrPage* pPage = GetPage(1);
-    SdrTextObj* pTxtObj = dynamic_cast<SdrTextObj*>(pPage->GetObj(1));
+    SdrTextObj* pTxtObj = DynCastSdrTextObj(pPage->GetObj(1));
     CPPUNIT_ASSERT_MESSAGE("No text object", pTxtObj != nullptr);
     const EditTextObject& aEdit = 
pTxtObj->GetOutlinerParaObject()->GetTextObject();
     for (int i = 0; i < 4; i++)
@@ -1140,7 +1140,7 @@ void SdImportTest2::testTdf138148()
 {
     loadFromURL(u"pptx/tdf138148.pptx");
     const SdrPage* pPage = GetPage(1);
-    SdrTextObj* pTxtObj = dynamic_cast<SdrTextObj*>(pPage->GetObj(0));
+    SdrTextObj* pTxtObj = DynCastSdrTextObj(pPage->GetObj(0));
     CPPUNIT_ASSERT_MESSAGE("No text object", pTxtObj != nullptr);
     const EditTextObject& aEdit = 
pTxtObj->GetOutlinerParaObject()->GetTextObject();
     for (int i = 0; i < 2; i++)
@@ -1207,7 +1207,7 @@ void SdImportTest2::testTdf134210()
 void SdImportTest2::testTdf114913()
 {
     loadFromURL(u"pptx/tdf114913.pptx");
-    SdrTextObj* pTxtObj = dynamic_cast<SdrTextObj*>(GetPage(1)->GetObj(1));
+    SdrTextObj* pTxtObj = DynCastSdrTextObj(GetPage(1)->GetObj(1));
     CPPUNIT_ASSERT_MESSAGE("No text object", pTxtObj != nullptr);
     const SvxNumBulletItem* pItem
         = 
pTxtObj->GetOutlinerParaObject()->GetTextObject().GetParaAttribs(0).GetItem(
@@ -1394,7 +1394,7 @@ void SdImportTest2::testTdf116899()
 void SdImportTest2::testTdf77747()
 {
     loadFromURL(u"ppt/tdf77747.ppt");
-    SdrTextObj* pTxtObj = dynamic_cast<SdrTextObj*>(GetPage(1)->GetObj(0));
+    SdrTextObj* pTxtObj = DynCastSdrTextObj(GetPage(1)->GetObj(0));
     CPPUNIT_ASSERT_MESSAGE("No text object", pTxtObj != nullptr);
     const SvxNumBulletItem* pNumFmt
         = 
pTxtObj->GetOutlinerParaObject()->GetTextObject().GetParaAttribs(0).GetItem(
@@ -1709,7 +1709,7 @@ void SdImportTest2::testTdf49856()
 {
     loadFromURL(u"ppt/tdf49856.ppt");
     const SdrPage* pPage = GetPage(1);
-    SdrTextObj* pTxtObj = dynamic_cast<SdrTextObj*>(pPage->GetObj(1));
+    SdrTextObj* pTxtObj = DynCastSdrTextObj(pPage->GetObj(1));
     CPPUNIT_ASSERT_MESSAGE("No text object", pTxtObj != nullptr);
     const EditTextObject& aEdit = 
pTxtObj->GetOutlinerParaObject()->GetTextObject();
     const SvxNumBulletItem* pNumFmt = 
aEdit.GetParaAttribs(2).GetItem(EE_PARA_NUMBULLET);
@@ -1989,7 +1989,7 @@ void SdImportTest2::testTdf149961AutofitIndentation()
     const SdrPage* pPage = GetPage(1);
 
     {
-        SdrTextObj* pTxtObj = dynamic_cast<SdrTextObj*>(pPage->GetObj(0));
+        SdrTextObj* pTxtObj = DynCastSdrTextObj(pPage->GetObj(0));
         CPPUNIT_ASSERT_MESSAGE("no text object", pTxtObj != nullptr);
 
         const EditTextObject& aEdit = 
pTxtObj->GetOutlinerParaObject()->GetTextObject();
@@ -2002,7 +2002,7 @@ void SdImportTest2::testTdf149961AutofitIndentation()
     }
 
     {
-        SdrTextObj* pTxtObj = dynamic_cast<SdrTextObj*>(pPage->GetObj(1));
+        SdrTextObj* pTxtObj = DynCastSdrTextObj(pPage->GetObj(1));
         CPPUNIT_ASSERT_MESSAGE("no text object", pTxtObj != nullptr);
 
         const EditTextObject& aEdit = 
pTxtObj->GetOutlinerParaObject()->GetTextObject();
diff --git a/sd/qa/unit/misc-tests.cxx b/sd/qa/unit/misc-tests.cxx
index 5a14354ae8e1..f637476dbc7b 100644
--- a/sd/qa/unit/misc-tests.cxx
+++ b/sd/qa/unit/misc-tests.cxx
@@ -427,7 +427,7 @@ void SdMiscTest::testTextColumns()
         xShapes->add(xShape);
 
         // Set up columns
-        auto pTextObj = 
dynamic_cast<SdrTextObj*>(SdrObject::getSdrObjectFromXShape(xShape));
+        auto pTextObj = 
DynCastSdrTextObj(SdrObject::getSdrObjectFromXShape(xShape));
         CPPUNIT_ASSERT(pTextObj);
         pTextObj->SetMergedItem(SfxInt16Item(SDRATTR_TEXTCOLUMNS_NUMBER, 2));
         pTextObj->SetMergedItem(SdrMetricItem(SDRATTR_TEXTCOLUMNS_SPACING, 
1000));
@@ -438,7 +438,7 @@ void SdMiscTest::testTextColumns()
         uno::Reference<container::XIndexAccess> xIndexAccess(xDrawPage, 
uno::UNO_QUERY_THROW);
         uno::Reference<drawing::XShape> xShape(xIndexAccess->getByIndex(0), 
uno::UNO_QUERY_THROW);
 
-        auto pTextObj = 
dynamic_cast<SdrTextObj*>(SdrObject::getSdrObjectFromXShape(xShape));
+        auto pTextObj = 
DynCastSdrTextObj(SdrObject::getSdrObjectFromXShape(xShape));
         CPPUNIT_ASSERT(pTextObj);
 
         CPPUNIT_ASSERT_EQUAL(sal_Int16(2), pTextObj->GetTextColumnsNumber());
diff --git a/sd/qa/unit/tiledrendering/tiledrendering.cxx 
b/sd/qa/unit/tiledrendering/tiledrendering.cxx
index a0b6ff4cd9e5..3529290162c9 100644
--- a/sd/qa/unit/tiledrendering/tiledrendering.cxx
+++ b/sd/qa/unit/tiledrendering/tiledrendering.cxx
@@ -2445,7 +2445,7 @@ void SdTiledRenderingTest::testPasteTextOnSlide()
     CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), pActualPage->GetObjCount());
     SdrObject* pObject = pActualPage->GetObj(2);
     CPPUNIT_ASSERT(pObject);
-    SdrTextObj* pTextObj = dynamic_cast<SdrTextObj*>(pObject);
+    SdrTextObj* pTextObj = DynCastSdrTextObj(pObject);
     CPPUNIT_ASSERT(pTextObj);
     CPPUNIT_ASSERT_EQUAL(SdrObjKind::Text, pTextObj->GetObjIdentifier());
     const Point aPos = pTextObj->GetLastBoundRect().TopLeft();
diff --git a/sd/source/core/EffectMigration.cxx 
b/sd/source/core/EffectMigration.cxx
index fc09d8ab5f19..873e825cf4c5 100644
--- a/sd/source/core/EffectMigration.cxx
+++ b/sd/source/core/EffectMigration.cxx
@@ -607,7 +607,7 @@ void EffectMigration::SetTextAnimationEffect( SvxShape* 
pShape, AnimationEffect
         return;
     }
 
-    SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( pObj );
+    SdrTextObj* pTextObj = DynCastSdrTextObj( pObj );
 
     // ignore old text effects on shape without text
     if( (pTextObj == nullptr) || (!pTextObj->HasText()) )
diff --git a/sd/source/core/drawdoc.cxx b/sd/source/core/drawdoc.cxx
index 254bcf0ce9bd..d3d5b1063694 100644
--- a/sd/source/core/drawdoc.cxx
+++ b/sd/source/core/drawdoc.cxx
@@ -890,7 +890,7 @@ void SdDrawDocument::NewOrLoadCompleted( SdPage* pPage, 
SdStyleSheetPool* pSPool
                 }
             }
 
-            if( auto pTextObj = dynamic_cast<SdrTextObj *>( pObj ) )
+            if( auto pTextObj = DynCastSdrTextObj( pObj ) )
                 if (pTextObj->IsEmptyPresObj())
                 {
                     PresObjKind ePresObjKind = pPage->GetPresObjKind(pObj);
diff --git a/sd/source/core/drawdoc4.cxx b/sd/source/core/drawdoc4.cxx
index 2504c2f6af29..a4e1eb5a0c7c 100644
--- a/sd/source/core/drawdoc4.cxx
+++ b/sd/source/core/drawdoc4.cxx
@@ -917,7 +917,7 @@ IMPL_LINK_NOARG(SdDrawDocument, OnlineSpellingHdl, Timer *, 
void)
 
         if (pObj)
         {
-            if (pObj->GetOutlinerParaObject() && dynamic_cast< const 
SdrTextObj *>( pObj ) !=  nullptr)
+            if (pObj->GetOutlinerParaObject() && DynCastSdrTextObj( pObj ) !=  
nullptr)
             {
                 // Spell text object
                 SpellObject(static_cast<SdrTextObj*>(pObj));
@@ -933,7 +933,7 @@ IMPL_LINK_NOARG(SdDrawDocument, OnlineSpellingHdl, Timer *, 
void)
                     SdrObject* pSubObj = aGroupIter.Next();
 
                     if (pSubObj->GetOutlinerParaObject())
-                        if (auto pTextObj = dynamic_cast< SdrTextObj *>( 
pSubObj ))
+                        if (auto pTextObj = DynCastSdrTextObj( pSubObj ))
                             // Found a text object in a group object
                             SpellObject(pTextObj);
                 }
@@ -1055,7 +1055,7 @@ void 
SdDrawDocument::ImpOnlineSpellCallback(SpellCallbackInfo const * pInfo, Sdr
         || nCommand == SpellCallbackCommand::ADDTODICTIONARY)
     {
         if(pOutl)
-            if (auto pTextObj = dynamic_cast<SdrTextObj *>( pObj ))
+            if (auto pTextObj = DynCastSdrTextObj( pObj ))
             {
                 bool bModified(IsChanged());
                 pTextObj->SetOutlinerParaObject(pOutl->CreateParaObject());
diff --git a/sd/source/core/sdpage.cxx b/sd/source/core/sdpage.cxx
index 6c99ed6ba6e6..0b1be5faadd0 100644
--- a/sd/source/core/sdpage.cxx
+++ b/sd/source/core/sdpage.cxx
@@ -448,7 +448,7 @@ SdrObject* SdPage::CreatePresObj(PresObjKind eObjKind, bool 
bVertical, const ::t
 
         InsertObject(pSdrObj.get());
 
-        if ( auto pTextObj = dynamic_cast<SdrTextObj *>( pSdrObj.get() ) )
+        if ( auto pTextObj = DynCastSdrTextObj( pSdrObj.get() ) )
         {
             // Tell the object EARLY that it is vertical to have the
             // defaults for AutoGrowWidth/Height reversed
@@ -496,7 +496,7 @@ SdrObject* SdPage::CreatePresObj(PresObjKind eObjKind, bool 
bVertical, const ::t
 
         OUString aString = GetPresObjText(eObjKind);
         if(!aString.isEmpty() || bForceText)
-            if (auto pTextObj = dynamic_cast<SdrTextObj *>( pSdrObj.get() ) )
+            if (auto pTextObj = DynCastSdrTextObj( pSdrObj.get() ) )
             {
                 SdrOutliner* pOutliner = static_cast< SdDrawDocument& 
>(getSdrModelFromSdrPage()).GetInternalOutliner();
 
@@ -2014,7 +2014,7 @@ void SdPage::ScaleObjects(const Size& rNewPageSize, const 
::tools::Rectangle& rN
                     }
                     else if ( eObjKind != SdrObjKind::TitleText   &&
                               eObjKind != SdrObjKind::OutlineText &&
-                              dynamic_cast< const SdrTextObj *>( pObj ) !=  
nullptr       &&
+                              DynCastSdrTextObj( pObj ) !=  nullptr       &&
                               pObj->GetOutlinerParaObject() )
                     {
                         /******************************************************
@@ -2220,7 +2220,7 @@ SdrObject* SdPage::InsertAutoLayoutShape(SdrObject* 
pObj1, PresObjKind eObjKind,
 
         pObj->SetUserCall(this);
 
-        SdrTextObj* pTextObject = dynamic_cast< SdrTextObj* >(pObj.get());
+        SdrTextObj* pTextObject = DynCastSdrTextObj(pObj.get());
         if( pTextObject )
         {
             if( pTextObject->IsVerticalWriting() != bVertical )
@@ -2869,7 +2869,7 @@ bool SdPage::RestoreDefaultText( SdrObject* pObj )
 {
     bool bRet = false;
 
-    SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( pObj );
+    SdrTextObj* pTextObj = DynCastSdrTextObj( pObj );
 
     if( pTextObj )
     {
diff --git a/sd/source/filter/ppt/pptin.cxx b/sd/source/filter/ppt/pptin.cxx
index c2673ef4ce44..8f022c606764 100644
--- a/sd/source/filter/ppt/pptin.cxx
+++ b/sd/source/filter/ppt/pptin.cxx
@@ -2645,7 +2645,7 @@ rtl::Reference<SdrObject> ImplSdPPTImport::ProcessObj( 
SvStream& rSt, DffObjData
 
                                     bool bDontAnimateInvisibleShape = false;
                                     {
-                                        SdrTextObj* pTextObj = 
dynamic_cast<SdrTextObj*>(pObj.get());
+                                        SdrTextObj* pTextObj = 
DynCastSdrTextObj(pObj.get());
 
                                         if( pTextObj && pTextObj->HasText() &&
                                             dynamic_cast< SdrObjGroup *>( 
pObj.get() ) ==  nullptr &&
diff --git a/sd/source/filter/ppt/pptinanimations.cxx 
b/sd/source/filter/ppt/pptinanimations.cxx
index ff49054dde0b..8f9ab4c688a4 100644
--- a/sd/source/filter/ppt/pptinanimations.cxx
+++ b/sd/source/filter/ppt/pptinanimations.cxx
@@ -2508,7 +2508,7 @@ void AnimationImporter::importTargetElementContainer( 
const Atom* pAtom, Any& rT
                     if((begin == -1) && (end == -1))
                         break;
 
-                    SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( 
pSdrObject );
+                    SdrTextObj* pTextObj = DynCastSdrTextObj( pSdrObject );
                     if(!pTextObj)
                         break;
 
diff --git a/sd/source/filter/xml/sdtransform.cxx 
b/sd/source/filter/xml/sdtransform.cxx
index 4e296eaf6282..2b4db59efa5d 100644
--- a/sd/source/filter/xml/sdtransform.cxx
+++ b/sd/source/filter/xml/sdtransform.cxx
@@ -165,7 +165,7 @@ void SdTransformOOo2xDocument::transformShapes( SdrObjList 
const & rShapes )
 
 void SdTransformOOo2xDocument::transformShape( SdrObject& rObj )
 {
-    SdrTextObj* pTextShape = dynamic_cast< SdrTextObj* >( &rObj );
+    SdrTextObj* pTextShape = DynCastSdrTextObj( &rObj );
     if( pTextShape )
     {
         transformTextShape( *pTextShape );
diff --git a/sd/source/ui/app/sdxfer.cxx b/sd/source/ui/app/sdxfer.cxx
index 4a67154ccd6f..e87fd1a016b3 100644
--- a/sd/source/ui/app/sdxfer.cxx
+++ b/sd/source/ui/app/sdxfer.cxx
@@ -204,7 +204,7 @@ void SdTransferable::CreateObjectReplacement( SdrObject* 
pObj )
             }
         }
     }
-    else if( auto pTextObj = dynamic_cast< SdrTextObj *>( pObj ) )
+    else if( auto pTextObj = DynCastSdrTextObj( pObj ) )
     {
         const OutlinerParaObject* pPara;
 
diff --git a/sd/source/ui/func/fudraw.cxx b/sd/source/ui/func/fudraw.cxx
index 06230fa6cbdf..ed4478747e8c 100644
--- a/sd/source/ui/func/fudraw.cxx
+++ b/sd/source/ui/func/fudraw.cxx
@@ -655,7 +655,7 @@ void FuDraw::DoubleClick(const MouseEvent& rMEvt)
                     GetDispatcher()->Execute( SID_INSERT_GRAPHIC,
                                               SfxCallMode::ASYNCHRON | 
SfxCallMode::RECORD );
             }
-            else if ( ( dynamic_cast< const SdrTextObj *>( pObj ) != nullptr 
|| dynamic_cast< const SdrObjGroup *>( pObj ) !=  nullptr ) &&
+            else if ( ( DynCastSdrTextObj( pObj ) != nullptr || dynamic_cast< 
const SdrObjGroup *>( pObj ) !=  nullptr ) &&
                       !SD_MOD()->GetWaterCan()                            &&
                       mpViewShell->GetFrameView()->IsDoubleClickTextEdit() &&
                       !mpDocSh->IsReadOnly())
diff --git a/sd/source/ui/func/fupoor.cxx b/sd/source/ui/func/fupoor.cxx
index b9aab12a4b27..c75959fbc243 100644
--- a/sd/source/ui/func/fupoor.cxx
+++ b/sd/source/ui/func/fupoor.cxx
@@ -197,7 +197,7 @@ bool FuPoor::KeyInput(const KeyEvent& rKEvt)
                         {
                             SdrObject* pObj = aIter.Next();
 
-                            if(auto pTextObj = dynamic_cast<SdrTextObj *>( 
pObj ))
+                            if(auto pTextObj = DynCastSdrTextObj( pObj ))
                             {
                                 SdrInventor nInv(pObj->GetObjInventor());
                                 SdrObjKind nKnd(pObj->GetObjIdentifier());
@@ -786,7 +786,7 @@ bool FuPoor::KeyInput(const KeyEvent& rKEvt)
                 SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
 
                 // #i118485# allow TextInput for OLEs, too
-                if( dynamic_cast< const SdrTextObj *>( pObj ) !=  nullptr && 
pObj->HasTextEdit())
+                if( DynCastSdrTextObj( pObj ) !=  nullptr && 
pObj->HasTextEdit())
                 {
                     // use common IsSimpleCharInput from the EditEngine.
                     bool bPrintable(EditEngine::IsSimpleCharInput(rKEvt));
@@ -824,7 +824,7 @@ bool FuPoor::KeyInput(const KeyEvent& rKEvt)
                         {
                             SdrObject* pObj = aIter.Next();
 
-                            if(auto pTextObj = dynamic_cast< SdrTextObj *>( 
pObj ))
+                            if(auto pTextObj = DynCastSdrTextObj( pObj ))
                             {
                                 SdrInventor nInv(pObj->GetObjInventor());
                                 SdrObjKind nKnd(pObj->GetObjIdentifier());
diff --git a/sd/source/ui/func/futext.cxx b/sd/source/ui/func/futext.cxx
index 68839bded557..60e36e2674b3 100644
--- a/sd/source/ui/func/futext.cxx
+++ b/sd/source/ui/func/futext.cxx
@@ -196,7 +196,7 @@ void FuText::DoExecute( SfxRequest& )
         mpView->PickAnything(aMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt);
         mpView->MarkObj(aVEvt.mpRootObj, pPV);
 
-        mxTextObj = dynamic_cast< SdrTextObj* >( aVEvt.mpObj );
+        mxTextObj = DynCastSdrTextObj( aVEvt.mpObj );
     }
     else if (mpView->AreObjectsMarked())
     {
@@ -205,7 +205,7 @@ void FuText::DoExecute( SfxRequest& )
         if (rMarkList.GetMarkCount() == 1)
         {
             SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
-            mxTextObj = dynamic_cast< SdrTextObj* >( pObj );
+            mxTextObj = DynCastSdrTextObj( pObj );
         }
     }
 
@@ -354,7 +354,7 @@ bool FuText::MouseButtonDown(const MouseEvent& rMEvt)
                         if (bMarkChanges)
                             mpView->MarkObj(aVEvt.mpRootObj, pPV);
 
-                        if (auto pSdrTextObj = 
dynamic_cast<SdrTextObj*>(aVEvt.mpObj))
+                        if (auto pSdrTextObj = DynCastSdrTextObj(aVEvt.mpObj))
                         {
                             mxTextObj = pSdrTextObj;
                         }
@@ -702,7 +702,7 @@ bool FuText::MouseButtonUp(const MouseEvent& rMEvt)
     else if( mpView && mpView->IsCreateObj() && rMEvt.IsLeft())
     {
         // object was created
-        rtl::Reference<SdrTextObj> pTextObj = dynamic_cast< SdrTextObj* >( 
mpView->GetCreateObj() );
+        rtl::Reference<SdrTextObj> pTextObj = DynCastSdrTextObj( 
mpView->GetCreateObj() );
         mxTextObj = pTextObj.get();
 
         if( pTextObj )
@@ -808,7 +808,7 @@ bool FuText::MouseButtonUp(const MouseEvent& rMEvt)
             aPnt.AdjustY(nDrgLog + nDrgLog );
             mpView->MovAction(aPnt);
 
-            mxTextObj = dynamic_cast< SdrTextObj* >( mpView->GetCreateObj() );
+            mxTextObj = DynCastSdrTextObj( mpView->GetCreateObj() );
 
             if(mxTextObj.get().is())
             {
@@ -1281,7 +1281,7 @@ void FuText::ReceiveRequest(SfxRequest& rReq)
             mpView->PickAnything(aMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt);
             mpView->MarkObj(aVEvt.mpRootObj, pPV);
 
-            if (auto pSdrTextObj = dynamic_cast<SdrTextObj*>(aVEvt.mpObj))
+            if (auto pSdrTextObj = DynCastSdrTextObj(aVEvt.mpObj))
             {
                 mxTextObj = pSdrTextObj;
             }
@@ -1295,7 +1295,7 @@ void FuText::ReceiveRequest(SfxRequest& rReq)
         {
             SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
 
-            if( auto pTextObj = dynamic_cast<SdrTextObj *>( pObj ))
+            if( auto pTextObj = DynCastSdrTextObj( pObj ))
             {
                 mxTextObj = pTextObj;
             }
@@ -1339,7 +1339,7 @@ rtl::Reference<SdrObject> 
FuText::CreateDefaultObject(const sal_uInt16 nID, cons
 
     if(pObj)
     {
-        if( auto pText = dynamic_cast< SdrTextObj *>( pObj.get() ) )
+        if( auto pText = DynCastSdrTextObj( pObj.get() ) )
         {
             pText->SetLogicRect(rRectangle);
 
@@ -1413,7 +1413,7 @@ void FuText::ChangeFontSize( bool bGrow, OutlinerView* 
pOLV, const FontList* pFo
         const SdrMarkList& rMarkList = pView->GetMarkedObjectList();
         for( size_t nMark = 0; nMark < rMarkList.GetMarkCount(); ++nMark )
         {
-            SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( 
rMarkList.GetMark(nMark)->GetMarkedSdrObj() );
+            SdrTextObj* pTextObj = DynCastSdrTextObj( 
rMarkList.GetMark(nMark)->GetMarkedSdrObj() );
             if( pTextObj )
             {
                 rtl::Reference<sdr::SelectionController> 
xSelectionController(pView->getSelectionController());
diff --git a/sd/source/ui/func/futhes.cxx b/sd/source/ui/func/futhes.cxx
index 78d2ae6939b3..d978880039dd 100644
--- a/sd/source/ui/func/futhes.cxx
+++ b/sd/source/ui/func/futhes.cxx
@@ -78,7 +78,7 @@ void FuThesaurus::DoExecute(SfxRequest& rReq)
                 SdrMark* pMark = rMarkList.GetMark(0);
                 SdrObject* pObj = pMark->GetMarkedSdrObj();
 
-                pTextObj = dynamic_cast<SdrTextObj *>( pObj );
+                pTextObj = DynCastSdrTextObj( pObj );
             }
         }
 
diff --git a/sd/source/ui/slidesorter/controller/SlsSlotManager.cxx 
b/sd/source/ui/slidesorter/controller/SlsSlotManager.cxx
index 52e05557e903..2bd908fe93d0 100644
--- a/sd/source/ui/slidesorter/controller/SlsSlotManager.cxx
+++ b/sd/source/ui/slidesorter/controller/SlsSlotManager.cxx
@@ -568,7 +568,7 @@ void SlotManager::GetMenuState (SfxItemSet& rSet)
                     else
                     {
                         // check if the object is in edit, then if it's 
temporarily not empty
-                        SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( 
pObj );
+                        SdrTextObj* pTextObj = DynCastSdrTextObj( pObj );
                         if( pTextObj )
                         {
                             if( pTextObj->CanCreateEditOutlinerParaObject() )
diff --git a/sd/source/ui/table/tablefunction.cxx 
b/sd/source/ui/table/tablefunction.cxx
index f2843311c2b9..21b9df9ad4aa 100644
--- a/sd/source/ui/table/tablefunction.cxx
+++ b/sd/source/ui/table/tablefunction.cxx
@@ -152,7 +152,7 @@ static void InsertTableImpl(const DrawViewShell* pShell,
 
     // #i123359# if an object is to be replaced/manipulated it may be that it 
is in text edit mode,
     // so to be on the safe side call SdrEndTextEdit here
-    SdrTextObj* pCheckForTextEdit = dynamic_cast< SdrTextObj* >(pPickObj);
+    SdrTextObj* pCheckForTextEdit = DynCastSdrTextObj(pPickObj);
 
     if(pCheckForTextEdit && pCheckForTextEdit->IsInEditMode())
     {
diff --git a/sd/source/ui/unoidl/unomodel.cxx b/sd/source/ui/unoidl/unomodel.cxx
index 14eb0a38d279..990f9c84b625 100644
--- a/sd/source/ui/unoidl/unomodel.cxx
+++ b/sd/source/ui/unoidl/unomodel.cxx
@@ -1763,7 +1763,7 @@ vcl::PDFWriter::StructElement 
ImplRenderPaintProc::ImplBegStructureTag( const Sd
     {
         SdrInventor nInventor   = rObject.GetObjInventor();
         SdrObjKind  nIdentifier = rObject.GetObjIdentifier();
-        bool        bIsTextObj  = dynamic_cast< const SdrTextObj *>( &rObject 
) !=  nullptr;
+        bool        bIsTextObj  = DynCastSdrTextObj( &rObject ) !=  nullptr;
 
         if ( nInventor == SdrInventor::Default )
         {
diff --git a/sd/source/ui/unoidl/unoobj.cxx b/sd/source/ui/unoidl/unoobj.cxx
index b90636070135..3994b9f63f60 100644
--- a/sd/source/ui/unoidl/unoobj.cxx
+++ b/sd/source/ui/unoidl/unoobj.cxx
@@ -839,7 +839,7 @@ bool SdXShape::IsEmptyPresObj() const
     if( (pObj != nullptr) && pObj->IsEmptyPresObj() )
     {
         // check if the object is in edit, then if it's temporarily not empty
-        SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( pObj );
+        SdrTextObj* pTextObj = DynCastSdrTextObj( pObj );
         if( pTextObj == nullptr )
             return true;
 
@@ -890,7 +890,7 @@ void SdXShape::SetEmptyPresObj(bool bEmpty)
         // really delete SdrOutlinerObj at pObj
         pObj->NbcSetOutlinerParaObject(std::nullopt);
         if( bVertical )
-            if (auto pTextObj = dynamic_cast<SdrTextObj*>( pObj ) )
+            if (auto pTextObj = DynCastSdrTextObj( pObj ) )
                 pTextObj->SetVerticalWriting( true );
 
         SdrGrafObj* pGraphicObj = dynamic_cast<SdrGrafObj*>( pObj  );
diff --git a/sd/source/ui/view/DocumentRenderer.cxx 
b/sd/source/ui/view/DocumentRenderer.cxx
index 307c0d324bb9..3d58ef849104 100644
--- a/sd/source/ui/view/DocumentRenderer.cxx
+++ b/sd/source/ui/view/DocumentRenderer.cxx
@@ -1642,7 +1642,7 @@ private:
                     if (pObj->GetObjInventor() == SdrInventor::Default
                         && pObj->GetObjIdentifier() == SdrObjKind::TitleText)
                     {
-                        pTextObj = dynamic_cast<SdrTextObj*>(pObj);
+                        pTextObj = DynCastSdrTextObj(pObj);
                     }
                 }
 
@@ -1666,7 +1666,7 @@ private:
                     if (pObj->GetObjInventor() == SdrInventor::Default
                         && pObj->GetObjIdentifier() == SdrObjKind::OutlineText)
                     {
-                        pTextObj = dynamic_cast<SdrTextObj*>(pObj);
+                        pTextObj = DynCastSdrTextObj(pObj);
                     }
                 }
 
@@ -1674,7 +1674,7 @@ private:
                 if (!pTextObj)
                 {
                     bSubTitle = true;
-                    pTextObj = 
dynamic_cast<SdrTextObj*>(pPage->GetPresObj(PresObjKind::Text));  // is there a 
subtitle?
+                    pTextObj = 
DynCastSdrTextObj(pPage->GetPresObj(PresObjKind::Text));  // is there a 
subtitle?
                 }
 
                 sal_Int32 nParaCount1 = pOutliner->GetParagraphCount();
diff --git a/sd/source/ui/view/Outliner.cxx b/sd/source/ui/view/Outliner.cxx
index 3bb0afc7b406..4773b3badf4f 100644
--- a/sd/source/ui/view/Outliner.cxx
+++ b/sd/source/ui/view/Outliner.cxx
@@ -1160,7 +1160,7 @@ namespace
 
 bool lclIsValidTextObject(const sd::outliner::IteratorPosition& rPosition)
 {
-    auto* pObject = dynamic_cast< SdrTextObj* >( 
rPosition.mxObject.get().get() );
+    auto* pObject = DynCastSdrTextObj( rPosition.mxObject.get().get() );
     return (pObject != nullptr) && pObject->HasText() && ! 
pObject->IsEmptyPresObj();
 }
 
@@ -1469,7 +1469,7 @@ bool SdOutliner::ShowWrapAroundDialog()
 
 void SdOutliner::PutTextIntoOutliner()
 {
-    mpSearchSpellTextObj = dynamic_cast<SdrTextObj*>( mpObj );
+    mpSearchSpellTextObj = DynCastSdrTextObj( mpObj );
     if ( mpSearchSpellTextObj && mpSearchSpellTextObj->HasText() && 
!mpSearchSpellTextObj->IsEmptyPresObj() )
     {
         SdrText* pText = mpSearchSpellTextObj->getText( 
maCurrentPosition.mnText );
diff --git a/sd/source/ui/view/OutlinerIterator.cxx 
b/sd/source/ui/view/OutlinerIterator.cxx
index 57e912c1fcdb..ac3f1bc29601 100644
--- a/sd/source/ui/view/OutlinerIterator.cxx
+++ b/sd/source/ui/view/OutlinerIterator.cxx
@@ -436,7 +436,7 @@ IteratorImplBase* SelectionIteratorImpl::Clone 
(IteratorImplBase* pObject) const
 
 void SelectionIteratorImpl::GotoNextText()
 {
-    SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( 
mrObjectList.at(mnObjectIndex).get().get() );
+    SdrTextObj* pTextObj = DynCastSdrTextObj( 
mrObjectList.at(mnObjectIndex).get().get() );
     if (mbDirectionIsForward)
     {
         if( pTextObj )
@@ -472,7 +472,7 @@ void SelectionIteratorImpl::GotoNextText()
 
         if( (maPosition.mnText == -1) && (mnObjectIndex >= 0) )
         {
-            pTextObj = dynamic_cast< SdrTextObj* >( 
mrObjectList.at(mnObjectIndex).get().get() );
+            pTextObj = DynCastSdrTextObj( 
mrObjectList.at(mnObjectIndex).get().get() );
             if( pTextObj )
                 maPosition.mnText = pTextObj->getTextCount() - 1;
         }
@@ -561,7 +561,7 @@ IteratorImplBase* ViewIteratorImpl::Clone 
(IteratorImplBase* pObject) const
 
 void ViewIteratorImpl::GotoNextText()
 {
-    SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( 
maPosition.mxObject.get().get() );
+    SdrTextObj* pTextObj = DynCastSdrTextObj( maPosition.mxObject.get().get() 
);
     if( pTextObj )
     {
         if (mbDirectionIsForward)
@@ -601,7 +601,7 @@ void ViewIteratorImpl::GotoNextText()
     maPosition.mnText = 0;
     if( !mbDirectionIsForward && maPosition.mxObject.get().is() )
     {
-        pTextObj = dynamic_cast< SdrTextObj* >( 
maPosition.mxObject.get().get() );
+        pTextObj = DynCastSdrTextObj( maPosition.mxObject.get().get() );
         if( pTextObj )
             maPosition.mnText = pTextObj->getTextCount() - 1;
     }
@@ -656,7 +656,7 @@ void ViewIteratorImpl::SetPage (sal_Int32 nPageIndex)
     maPosition.mnText = 0;
     if( !mbDirectionIsForward && maPosition.mxObject.get().is() )
     {
-        SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( 
maPosition.mxObject.get().get() );
+        SdrTextObj* pTextObj = DynCastSdrTextObj( 
maPosition.mxObject.get().get() );
         if( pTextObj )
             maPosition.mnText = pTextObj->getTextCount() - 1;
     }
diff --git a/sd/source/ui/view/drawview.cxx b/sd/source/ui/view/drawview.cxx
index e4cdf010736c..2c972b065570 100644
--- a/sd/source/ui/view/drawview.cxx
+++ b/sd/source/ui/view/drawview.cxx
@@ -593,7 +593,7 @@ void DrawView::DeleteMarked()
                     default:
                         break;
                     }
-                    SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( pObj );
+                    SdrTextObj* pTextObj = DynCastSdrTextObj( pObj );
                     bool bVertical = pTextObj && pTextObj->IsVerticalWriting();
                     ::tools::Rectangle aRect( pObj->GetLogicRect() );
                     SdrObject* pNewObj = pPage->InsertAutoLayoutShape( 
nullptr, ePresObjKind, bVertical, aRect, true );
diff --git a/sd/source/ui/view/drviews4.cxx b/sd/source/ui/view/drviews4.cxx
index d9cf5656e063..e3181ba50d03 100644
--- a/sd/source/ui/view/drviews4.cxx
+++ b/sd/source/ui/view/drviews4.cxx
@@ -208,7 +208,7 @@ bool DrawViewShell::KeyInput (const KeyEvent& rKEvt, 
::sd::Window* pWin)
                 {
                     SdrObject* pObj = aIter.Next();
 
-                    if(auto pSdrTextObj = dynamic_cast<SdrTextObj *>( pObj ))
+                    if(auto pSdrTextObj = DynCastSdrTextObj( pObj ))
                     {
                         SdrInventor nInv(pObj->GetObjInventor());
                         SdrObjKind  nKnd(pObj->GetObjIdentifier());
diff --git a/sd/source/ui/view/drviews6.cxx b/sd/source/ui/view/drviews6.cxx
index 45b6edd5c0d6..bd34aa5a0267 100644
--- a/sd/source/ui/view/drviews6.cxx
+++ b/sd/source/ui/view/drviews6.cxx
@@ -82,7 +82,7 @@ void DrawViewShell::GetFormTextState(SfxItemSet& rSet)
     if ( rMarkList.GetMarkCount() == 1 )
         pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
 
-    const SdrTextObj* pTextObj = dynamic_cast< const SdrTextObj* >(pObj);
+    const SdrTextObj* pTextObj = DynCastSdrTextObj(pObj);
     const bool bDeactivate(
         !pObj ||
         !pTextObj ||
diff --git a/sd/source/ui/view/drviews7.cxx b/sd/source/ui/view/drviews7.cxx
index 4f375dc6a05c..b7968a638ce5 100644
--- a/sd/source/ui/view/drviews7.cxx
+++ b/sd/source/ui/view/drviews7.cxx
@@ -414,7 +414,7 @@ void DrawViewShell::GetMenuState( SfxItemSet &rSet )
                     else
                     {
                         // check if the object is in edit, then if it's 
temporarily not empty
-                        SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( 
pObj );
+                        SdrTextObj* pTextObj = DynCastSdrTextObj( pObj );
                         if( pTextObj )
                         {
                             if( pTextObj->CanCreateEditOutlinerParaObject() )
diff --git a/sd/source/ui/view/drviewsf.cxx b/sd/source/ui/view/drviewsf.cxx
index 8aab2c57602e..e74fe71dd45e 100644
--- a/sd/source/ui/view/drviewsf.cxx
+++ b/sd/source/ui/view/drviewsf.cxx
@@ -684,7 +684,7 @@ void DrawViewShell::GetAttrState( SfxItemSet& rSet )
                 const size_t nMarkCount = rMarkList.GetMarkCount();
                 for (size_t nIndex = 0; nIndex < nMarkCount; ++nIndex)
                 {
-                    SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* 
>(rMarkList.GetMark(nIndex)->GetMarkedSdrObj());
+                    SdrTextObj* pTextObj = 
DynCastSdrTextObj(rMarkList.GetMark(nIndex)->GetMarkedSdrObj());
                     if (pTextObj && pTextObj->GetObjInventor() == 
SdrInventor::Default)
                     {
                         if (pTextObj->GetObjIdentifier() != SdrObjKind::OLE2)
diff --git a/sd/source/ui/view/outlnvsh.cxx b/sd/source/ui/view/outlnvsh.cxx
index 856c49748ea4..10a6e7620afe 100644
--- a/sd/source/ui/view/outlnvsh.cxx
+++ b/sd/source/ui/view/outlnvsh.cxx
@@ -956,7 +956,7 @@ void OutlineViewShell::GetMenuState( SfxItemSet &rSet )
                     else
                     {
                         // check if the object is in edit, then if it's 
temporarily not empty
-                        SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( 
pObj );
+                        SdrTextObj* pTextObj = DynCastSdrTextObj( pObj );
                         if( pTextObj )
                         {
                             if( pTextObj->CanCreateEditOutlinerParaObject() )
diff --git a/sd/source/ui/view/sdview.cxx b/sd/source/ui/view/sdview.cxx
index 5007f6dd52af..c92ee1113e3c 100644
--- a/sd/source/ui/view/sdview.cxx
+++ b/sd/source/ui/view/sdview.cxx
@@ -221,7 +221,7 @@ void ViewRedirector::createRedirectedPrimitive2DSequence(
     {
         bool bCreateOutline(false);
 
-        if( pObject->IsEmptyPresObj() && dynamic_cast< SdrTextObj *>( pObject 
) !=  nullptr )
+        if( pObject->IsEmptyPresObj() && DynCastSdrTextObj( pObject ) !=  
nullptr )
         {
             if( !bSubContentProcessing || !pObject->IsNotVisibleAsMaster() )
             {
@@ -367,7 +367,7 @@ void ViewRedirector::createRedirectedPrimitive2DSequence(
                         aObjectMatrix.decompose(aScale, aTranslate, fRotate, 
fShearX);
 
                         // create font
-                        SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( 
pObject );
+                        SdrTextObj* pTextObj = DynCastSdrTextObj( pObject );
                         const SdrTextVertAdjust eTVA(pTextObj ? 
pTextObj->GetTextVerticalAdjust() : SDRTEXTVERTADJUST_CENTER);
                         vcl::Font aScaledVclFont;
 
@@ -1220,7 +1220,7 @@ bool View::ShouldToggleOn(
     const size_t nMarkCount = GetMarkedObjectCount();
     for (size_t nIndex = 0; nIndex < nMarkCount && !bToggleOn; ++nIndex)
     {
-        SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* 
>(GetMarkedObjectByIndex(nIndex));
+        SdrTextObj* pTextObj = 
DynCastSdrTextObj(GetMarkedObjectByIndex(nIndex));
         if (!pTextObj || pTextObj->IsTextEditActive())
             continue;
         if( dynamic_cast< const SdrTableObj *>( pTextObj ) !=  nullptr)
@@ -1291,7 +1291,7 @@ void View::ChangeMarkedObjectsBulletsNumbering(
     const size_t nMarkCount = GetMarkedObjectCount();
     for (size_t nIndex = 0; nIndex < nMarkCount; ++nIndex)
     {
-        SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* 
>(GetMarkedObjectByIndex(nIndex));
+        SdrTextObj* pTextObj = 
DynCastSdrTextObj(GetMarkedObjectByIndex(nIndex));
         if (!pTextObj || pTextObj->IsTextEditActive())
             continue;
         if( dynamic_cast< SdrTableObj *>( pTextObj ) !=  nullptr)
diff --git a/svx/source/accessibility/AccessibleShape.cxx 
b/svx/source/accessibility/AccessibleShape.cxx
index 1c1f964f971a..e5d937094d17 100644
--- a/svx/source/accessibility/AccessibleShape.cxx
+++ b/svx/source/accessibility/AccessibleShape.cxx
@@ -152,7 +152,7 @@ void AccessibleShape::Init()
     if( !pSdrObject )
         return;
 
-    SdrTextObj* pTextObj = dynamic_cast<SdrTextObj*>( pSdrObject  );
+    SdrTextObj* pTextObj = DynCastSdrTextObj( pSdrObject  );
     const bool hasOutlinerParaObject = (pTextObj && 
pTextObj->CanCreateEditOutlinerParaObject()) || 
(pSdrObject->GetOutlinerParaObject() != nullptr);
 
     // create AccessibleTextHelper to handle this shape's text
diff --git a/svx/source/engine3d/view3d.cxx b/svx/source/engine3d/view3d.cxx
index 86a1b15b64e4..18df6d5a6a98 100644
--- a/svx/source/engine3d/view3d.cxx
+++ b/svx/source/engine3d/view3d.cxx
@@ -632,7 +632,7 @@ void E3dView::ImpIsConvertTo3DPossible(SdrObject const * 
pObj, bool& rAny3D,
 
 void E3dView::ImpChangeSomeAttributesFor3DConversion(SdrObject* pObj)
 {
-    if(dynamic_cast<const SdrTextObj*>( pObj) ==  nullptr)
+    if(DynCastSdrTextObj( pObj) ==  nullptr)
         return;
 
     const SfxItemSet& rSet = pObj->GetMergedItemSet();
diff --git a/svx/source/sdr/contact/viewcontactofsdrobj.cxx 
b/svx/source/sdr/contact/viewcontactofsdrobj.cxx
index 1483b57645f8..5f13af5cbe65 100644
--- a/svx/source/sdr/contact/viewcontactofsdrobj.cxx
+++ b/svx/source/sdr/contact/viewcontactofsdrobj.cxx
@@ -98,7 +98,7 @@ ViewContact* ViewContactOfSdrObj::GetParentContact() const
 void ViewContactOfSdrObj::ActionChanged()
 {
     // look for own changes
-    if (SdrTextObj* pTextObj = dynamic_cast<SdrTextObj*>(&GetSdrObject()))
+    if (SdrTextObj* pTextObj = DynCastSdrTextObj(&GetSdrObject()))
     {
         //  tdf#146860 no idea why, but calling this makes the text boxes 
render properly
         pTextObj->GetTextAniKind();
diff --git a/svx/source/sidebar/SelectionAnalyzer.cxx 
b/svx/source/sidebar/SelectionAnalyzer.cxx
index 193b6b6b7d60..dc8073ec6c41 100644
--- a/svx/source/sidebar/SelectionAnalyzer.cxx
+++ b/svx/source/sidebar/SelectionAnalyzer.cxx
@@ -42,7 +42,7 @@ EnumContext::Context 
SelectionAnalyzer::GetContextForSelection_SC(const SdrMarkL
         case 1:
         {
             SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
-            auto pTextObj = dynamic_cast<SdrTextObj*>(pObj);
+            auto pTextObj = DynCastSdrTextObj(pObj);
             if (pTextObj && pTextObj->IsInEditMode())
             {
                 eContext = EnumContext::Context::DrawText;
@@ -125,7 +125,7 @@ EnumContext::Context 
SelectionAnalyzer::GetContextForSelection_SD(const SdrMarkL
         case 1:
         {
             SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
-            auto pTextObj = dynamic_cast<SdrTextObj*>(pObj);
+            auto pTextObj = DynCastSdrTextObj(pObj);
             if (pTextObj && pTextObj->IsInEditMode())
             {
                 if (pObj->GetObjIdentifier() == SdrObjKind::Table)
diff --git a/svx/source/sidebar/possize/PosSizePropertyPanel.cxx 
b/svx/source/sidebar/possize/PosSizePropertyPanel.cxx
index 100a7dcc8e16..5c04ce2706b6 100644
--- a/svx/source/sidebar/possize/PosSizePropertyPanel.cxx
+++ b/svx/source/sidebar/possize/PosSizePropertyPanel.cxx
@@ -188,7 +188,7 @@ namespace
 
             if((pObj->GetObjInventor() == SdrInventor::Default) && 
(SdrObjKind::Text == eKind || SdrObjKind::TitleText == eKind || 
SdrObjKind::OutlineText == eKind))
             {
-                const SdrTextObj* pSdrTextObj = dynamic_cast< const 
SdrTextObj* >(pObj);
+                const SdrTextObj* pSdrTextObj = DynCastSdrTextObj(pObj);
 
                 if(pSdrTextObj && pSdrTextObj->HasText())
                 {
diff --git a/svx/source/svdraw/svddrgv.cxx b/svx/source/svdraw/svddrgv.cxx
index 7c5d2c76f9e9..27b62dd17946 100644
--- a/svx/source/svdraw/svddrgv.cxx
+++ b/svx/source/svdraw/svddrgv.cxx
@@ -419,7 +419,7 @@ bool SdrDragView::BegDragObj(const Point& rPnt, 
OutputDevice* pOut, SdrHdl* pHdl
                                 {
                                     mpMarkedObj=GetMarkedObjectByIndex(0);
                                     if ( mpMarkedObj &&
-                                        dynamic_cast<const SdrTextObj*>( 
mpMarkedObj) !=  nullptr &&
+                                        DynCastSdrTextObj( mpMarkedObj) !=  
nullptr &&
                                         
static_cast<SdrTextObj*>(mpMarkedObj)->IsTextFrame() )
                                         bSingleTextObjMark = true;
                                 }
diff --git a/svx/source/svdraw/svdedtv.cxx b/svx/source/svdraw/svdedtv.cxx
index 012b5153207f..58812d849403 100644
--- a/svx/source/svdraw/svdedtv.cxx
+++ b/svx/source/svdraw/svdedtv.cxx
@@ -1025,11 +1025,11 @@ void SdrEditView::ReplaceObjectAtView(SdrObject* 
pOldObj, SdrPageView& rPV, SdrO
     if(IsTextEdit())
     {
 #ifdef DBG_UTIL
-        if(auto pTextObj = dynamic_cast< SdrTextObj* >(pOldObj))
+        if(auto pTextObj = DynCastSdrTextObj(pOldObj))
             if (pTextObj->IsTextEditActive())
                 OSL_ENSURE(false, "OldObject is in TextEdit mode, this has to 
be ended before replacing it using SdrEndTextEdit (!)");
 
-        if(auto pTextObj = dynamic_cast< SdrTextObj* >(pNewObj))
+        if(auto pTextObj = DynCastSdrTextObj(pNewObj))
             if (pTextObj->IsTextEditActive())
                 OSL_ENSURE(false, "NewObject is in TextEdit mode, this has to 
be ended before replacing it using SdrEndTextEdit (!)");
 #endif
diff --git a/svx/source/svdraw/svdedtv1.cxx b/svx/source/svdraw/svdedtv1.cxx
index 6d4fe7cfa181..2e4d218a3aee 100644
--- a/svx/source/svdraw/svdedtv1.cxx
+++ b/svx/source/svdraw/svdedtv1.cxx
@@ -1181,7 +1181,7 @@ void SdrEditView::SetAttrToMarked(const SfxItemSet& 
rAttr, bool bReplaceAll)
             // multiple portions exist with multiple formats. If an 
OutlinerParaObject
             // really exists and needs to be rescued is evaluated in the undo
             // implementation itself.
-            const bool bRescueText = dynamic_cast< SdrTextObj* >(pObj) != 
nullptr;
+            const bool bRescueText = DynCastSdrTextObj(pObj) != nullptr;
 
             // add attribute undo
             
AddUndo(GetModel()->GetSdrUndoFactory().CreateUndoAttrObject(*pObj,false,bHasEEItems
 || bPossibleGeomChange || bRescueText));
@@ -1226,7 +1226,7 @@ void SdrEditView::SetAttrToMarked(const SfxItemSet& 
rAttr, bool bReplaceAll)
             }
         }
 
-        if(auto pTextObj = dynamic_cast<SdrTextObj*>( pObj))
+        if(auto pTextObj = DynCastSdrTextObj( pObj))
         {
             if(!aCharWhichIds.empty())
             {
diff --git a/svx/source/svdraw/svdedtv2.cxx b/svx/source/svdraw/svdedtv2.cxx
index caaeb93f1a00..38c07fbba1f0 100644
--- a/svx/source/svdraw/svdedtv2.cxx
+++ b/svx/source/svdraw/svdedtv2.cxx
@@ -1237,7 +1237,7 @@ void SdrEditView::CombineMarkedTextObjects()
     while ( aIter.IsMore() )
     {
         SdrObject* pObj = aIter.Next();
-        SdrTextObj* pTextObj = dynamic_cast<SdrTextObj*>( pObj );
+        SdrTextObj* pTextObj = DynCastSdrTextObj( pObj );
         const OutlinerParaObject* pOPO = pTextObj ? 
pTextObj->GetOutlinerParaObject() : nullptr;
         if ( pOPO && pTextObj->IsTextFrame()
              &&  pTextObj->GetObjIdentifier() == SdrObjKind::Text   // not 
callouts (OBJ_CAPTION)
diff --git a/svx/source/svdraw/svdedxv.cxx b/svx/source/svdraw/svdedxv.cxx
index 838876afa707..77b5f9cea719 100644
--- a/svx/source/svdraw/svdedxv.cxx
+++ b/svx/source/svdraw/svdedxv.cxx
@@ -1232,7 +1232,7 @@ bool SdrObjEditView::SdrBeginTextEdit(SdrObject* pObj_, 
SdrPageView* pPV, vcl::W
     // FIXME this encourages all sorts of bad habits and should be removed
     SdrEndTextEdit();
 
-    SdrTextObj* pObj = dynamic_cast<SdrTextObj*>(pObj_);
+    SdrTextObj* pObj = DynCastSdrTextObj(pObj_);
     if (!pObj)
         return false; // currently only possible with text objects
 
@@ -2963,7 +2963,7 @@ void SdrObjEditView::ApplyFormatPaintBrush(SfxItemSet& 
rFormatSet, bool bNoChara
         }
 
         // now apply character and paragraph formatting to text, if the shape 
has any
-        SdrTextObj* pTextObj = dynamic_cast<SdrTextObj*>(pObj);
+        SdrTextObj* pTextObj = DynCastSdrTextObj(pObj);
         if (pTextObj)
         {
             sal_Int32 nText = pTextObj->getTextCount();
diff --git a/svx/source/svdraw/svdetc.cxx b/svx/source/svdraw/svdetc.cxx
index 203b566002b8..b642f8e69117 100644
--- a/svx/source/svdraw/svdetc.cxx
+++ b/svx/source/svdraw/svdetc.cxx
@@ -504,7 +504,7 @@ namespace
             }
             else
             {
-                SdrTextObj* pText = dynamic_cast< SdrTextObj * >(pObj);
+                SdrTextObj* pText = DynCastSdrTextObj(pObj);
 
                 // Exclude zero master page object (i.e. background shape) 
from color query
                 if(pText
diff --git a/svx/source/svdraw/svdfmtf.cxx b/svx/source/svdraw/svdfmtf.cxx
index 587ca14a4637..eb1c9648b127 100644
--- a/svx/source/svdraw/svdfmtf.cxx
+++ b/svx/source/svdraw/svdfmtf.cxx
@@ -465,7 +465,7 @@ void ImpSdrGDIMetaFileImport::InsertObj(SdrObject* pObj1, 
bool bScale)
         const SdrLayerID aOldLayer(pObj->GetLayer());
         const SfxItemSet aOldItemSet(pObj->GetMergedItemSet());
         const SdrGrafObj* pSdrGrafObj = dynamic_cast< SdrGrafObj* 
>(pObj.get());
-        const SdrTextObj* pSdrTextObj = dynamic_cast< SdrTextObj* 
>(pObj.get());
+        const SdrTextObj* pSdrTextObj = DynCastSdrTextObj(pObj.get());
 
         if(pSdrTextObj && pSdrTextObj->HasText())
         {
@@ -611,7 +611,7 @@ void ImpSdrGDIMetaFileImport::InsertObj(SdrObject* pObj1, 
bool bScale)
 
     if(!bVisible)
     {
-        SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >(pObj.get());
+        SdrTextObj* pTextObj = DynCastSdrTextObj(pObj.get());
 
         if(pTextObj && pTextObj->HasText())
         {
diff --git a/svx/source/svdraw/svdmark.cxx b/svx/source/svdraw/svdmark.cxx
index 58963a9f4ab8..9df4b8dc32f1 100644
--- a/svx/source/svdraw/svdmark.cxx
+++ b/svx/source/svdraw/svdmark.cxx
@@ -421,7 +421,7 @@ const OUString& SdrMarkList::GetMarkDescription() const
     {
         // if it's a single selection, cache only text frame
         const SdrObject* pObj = GetMark(0)->GetMarkedSdrObj();
-        const SdrTextObj* pTextObj = dynamic_cast<const SdrTextObj*>( pObj );
+        const SdrTextObj* pTextObj = DynCastSdrTextObj( pObj );
 
         if(!pTextObj || !pTextObj->IsTextFrame())
         {
@@ -511,7 +511,7 @@ const OUString& SdrMarkList::GetPointMarkDescription(bool 
bGlue) const
     {
         // if it's a single selection, cache only text frame
         const SdrObject* pObj = GetMark(0)->GetMarkedSdrObj();
-        const SdrTextObj* pTextObj = dynamic_cast<const SdrTextObj*>( pObj );
+        const SdrTextObj* pTextObj = DynCastSdrTextObj( pObj );
 
         if(!pTextObj || !pTextObj->IsTextFrame())
         {
diff --git a/svx/source/svdraw/svdmrkv.cxx b/svx/source/svdraw/svdmrkv.cxx
index 90ebb72a7cc9..912135b0d1c0 100644
--- a/svx/source/svdraw/svdmrkv.cxx
+++ b/svx/source/svdraw/svdmrkv.cxx
@@ -1214,7 +1214,7 @@ void SdrMarkView::SetMarkHandles(SfxViewShell* 
pOtherShell)
         if(nullptr != mpMarkedObj)
         {
             bSingleTextObjMark =
-                dynamic_cast<const SdrTextObj*>( mpMarkedObj) !=  nullptr &&
+                DynCastSdrTextObj( mpMarkedObj) !=  nullptr &&
                 static_cast<SdrTextObj*>(mpMarkedObj)->IsTextFrame();
 
             // RotGrfFlyFrame: we may have limited rotation
@@ -1254,7 +1254,7 @@ void SdrMarkView::SetMarkHandles(SfxViewShell* 
pOtherShell)
         // Also formerly #122142#: Pretty much the same for SdrCaptionObj's in 
calc.
         if(static_cast<SdrView*>(this)->IsTextEdit())
         {
-            const SdrTextObj* pSdrTextObj = dynamic_cast< const SdrTextObj* 
>(mpMarkedObj);
+            const SdrTextObj* pSdrTextObj = DynCastSdrTextObj(mpMarkedObj);
 
             if (pSdrTextObj && pSdrTextObj->IsInEditMode())
             {
@@ -2307,7 +2307,7 @@ SdrObject* SdrMarkView::CheckSingleSdrObjectHit(const 
Point& rPnt, sal_uInt16 nT
     const bool bCheckIfMarkable(nOptions & SdrSearchOptions::TESTMARKABLE);
     const bool bDeep(nOptions & SdrSearchOptions::DEEP);
     const bool bOLE(dynamic_cast< const SdrOle2Obj* >(pObj) !=  nullptr);
-    auto pTextObj = dynamic_cast<const SdrTextObj*>( pObj);
+    auto pTextObj = DynCastSdrTextObj( pObj);
     const bool bTXT(pTextObj && pTextObj->IsTextFrame());
     SdrObject* pRet=nullptr;
     tools::Rectangle aRect(pObj->GetCurrentBoundRect());
diff --git a/svx/source/svdraw/svdobj.cxx b/svx/source/svdraw/svdobj.cxx
index becc4cd3cdbe..877744f4e273 100644
--- a/svx/source/svdraw/svdobj.cxx
+++ b/svx/source/svdraw/svdobj.cxx
@@ -1107,7 +1107,7 @@ basegfx::B2DPolyPolygon SdrObject::TakeContour() const
 
     if(pClone)
     {
-        const SdrTextObj* pTextObj = dynamic_cast< const SdrTextObj* >(this);
+        const SdrTextObj* pTextObj = DynCastSdrTextObj(this);
 
         if(pTextObj)
         {
@@ -3209,6 +3209,15 @@ E3dObject* DynCastE3dObject(SdrObject* pObj)
     return nullptr;
 }
 
+SdrTextObj* DynCastSdrTextObj(SdrObject* pObj)
+{
+    // SdrTextObj has a lot of subclasses, with lots of SdrObjKind 
identifiers, so use a virtual method
+    // to be safer.
+    if( pObj && pObj->IsSdrTextObj() )
+        return static_cast<SdrTextObj*>(pObj);
+    return nullptr;
+}
+
 rtl::Reference<SdrObject> SdrObjFactory::CreateObjectFromFactory(SdrModel& 
rSdrModel, SdrInventor nInventor, SdrObjKind nObjIdentifier)
 {
     SdrObjCreatorParams aParams { nInventor, nObjIdentifier, rSdrModel };
diff --git a/svx/source/svdraw/svdotext.cxx b/svx/source/svdraw/svdotext.cxx
index 53b32ddf28b2..8ca01ffd74b2 100644
--- a/svx/source/svdraw/svdotext.cxx
+++ b/svx/source/svdraw/svdotext.cxx
@@ -1911,7 +1911,7 @@ static void ImpUpdateChainLinks(SdrTextObj *pTextObj, 
std::u16string_view aNextL
 
     SdrPage *pPage(pTextObj->getSdrPageFromSdrObject());
     assert(pPage);
-    SdrTextObj *pNextTextObj = dynamic_cast< SdrTextObj * >
+    SdrTextObj *pNextTextObj = DynCastSdrTextObj
                                 (ImpGetObjByName(pPage, aNextLinkName));
     if (!pNextTextObj) {
         SAL_INFO("svx.chaining", "[CHAINING] Can't find object as next link.");
@@ -2033,7 +2033,7 @@ bool SdrTextObj::GetPreventChainable() const
 rtl::Reference<SdrObject> SdrTextObj::getFullDragClone() const
 {
     rtl::Reference<SdrObject> pClone = SdrAttrObj::getFullDragClone();
-    SdrTextObj *pTextObjClone = dynamic_cast<SdrTextObj *>(pClone.get());
+    SdrTextObj *pTextObjClone = DynCastSdrTextObj(pClone.get());
     if (pTextObjClone != nullptr) {
         // Avoid transferring of text for chainable object during dragging
         pTextObjClone->mbIsUnchainableClone = true;
diff --git a/svx/source/svdraw/svdotextdecomposition.cxx 
b/svx/source/svdraw/svdotextdecomposition.cxx
index 0c8928891231..90fddd223263 100644
--- a/svx/source/svdraw/svdotextdecomposition.cxx
+++ b/svx/source/svdraw/svdotextdecomposition.cxx
@@ -1498,7 +1498,7 @@ void 
SdrTextObj::impHandleChainingEventsDuringDecomposition(SdrOutliner &rOutlin
     size_t nObjCount(getSdrPageFromSdrObject()->GetObjCount());
     for (size_t i = 0; i < nObjCount; i++)
     {
-        SdrTextObj* pCurObj(dynamic_cast< SdrTextObj* 
>(getSdrPageFromSdrObject()->GetObj(i)));
+        SdrTextObj* 
pCurObj(DynCastSdrTextObj(getSdrPageFromSdrObject()->GetObj(i)));
         if(pCurObj == this)
         {
             SAL_INFO("svx.chaining", "Working on TextBox " << i);
diff --git a/svx/source/svdraw/svdpdf.cxx b/svx/source/svdraw/svdpdf.cxx
index 16745d445e13..7509991ba346 100644
--- a/svx/source/svdraw/svdpdf.cxx
+++ b/svx/source/svdraw/svdpdf.cxx
@@ -416,7 +416,7 @@ void ImpSdrPdfImport::InsertObj(SdrObject* pObj1, bool 
bScale)
         const SdrLayerID aOldLayer(pObj->GetLayer());
         const SfxItemSet aOldItemSet(pObj->GetMergedItemSet());
         const SdrGrafObj* pSdrGrafObj = dynamic_cast<SdrGrafObj*>(pObj.get());
-        const SdrTextObj* pSdrTextObj = dynamic_cast<SdrTextObj*>(pObj.get());
+        const SdrTextObj* pSdrTextObj = DynCastSdrTextObj(pObj.get());
 
         if (pSdrTextObj && pSdrTextObj->HasText())
         {
@@ -561,7 +561,7 @@ void ImpSdrPdfImport::InsertObj(SdrObject* pObj1, bool 
bScale)
 
     if (!bVisible)
     {
-        SdrTextObj* pTextObj = dynamic_cast<SdrTextObj*>(pObj.get());
+        SdrTextObj* pTextObj = DynCastSdrTextObj(pObj.get());
 
         if (pTextObj && pTextObj->HasText())
         {
diff --git a/svx/source/svdraw/svdundo.cxx b/svx/source/svdraw/svdundo.cxx
index 0df375d266a6..20be7b878845 100644
--- a/svx/source/svdraw/svdundo.cxx
+++ b/svx/source/svdraw/svdundo.cxx
@@ -1023,7 +1023,7 @@ void SdrUndoObjSetText::AfterSetText()
 void SdrUndoObjSetText::Undo()
 {
     // only works with SdrTextObj
-    SdrTextObj* pTarget = dynamic_cast< SdrTextObj* >(mxObj.get());
+    SdrTextObj* pTarget = DynCastSdrTextObj(mxObj.get());
 
     if(!pTarget)
     {
@@ -1065,7 +1065,7 @@ void SdrUndoObjSetText::Undo()
 void SdrUndoObjSetText::Redo()
 {
     // only works with SdrTextObj
-    SdrTextObj* pTarget = dynamic_cast< SdrTextObj* >(mxObj.get());
+    SdrTextObj* pTarget = DynCastSdrTextObj(mxObj.get());
 
     if(!pTarget)
     {
@@ -1125,7 +1125,7 @@ void SdrUndoObjSetText::SdrRepeat(SdrView& rView)
     for (size_t nm=0; nm<nCount; ++nm)
     {
         SdrObject* pObj2=rML.GetMark(nm)->GetMarkedSdrObj();
-        SdrTextObj* pTextObj=dynamic_cast<SdrTextObj*>( pObj2 );
+        SdrTextObj* pTextObj=DynCastSdrTextObj( pObj2 );
         if (pTextObj!=nullptr)
         {
             if( bUndo )
diff --git a/svx/source/svdraw/svdview.cxx b/svx/source/svdraw/svdview.cxx
index 42399006bf47..e4e40a5ba2aa 100644
--- a/svx/source/svdraw/svdview.cxx
+++ b/svx/source/svdraw/svdview.cxx
@@ -438,7 +438,7 @@ SdrHitKind SdrView::PickAnything(const Point& rLogicPos, 
SdrViewEvent& rVEvt) co
     // check for URL field
     if (eHit==SdrHitKind::UnmarkedObject)
     {
-        SdrTextObj* pTextObj=dynamic_cast<SdrTextObj*>( pHitObj );
+        SdrTextObj* pTextObj=DynCastSdrTextObj( pHitObj );
         if (pTextObj!=nullptr && pTextObj->HasText())
         {
             // use the primitive-based HitTest which is more accurate anyways. 
It
@@ -518,7 +518,7 @@ SdrHitKind SdrView::PickAnything(const Point& rLogicPos, 
SdrViewEvent& rVEvt) co
         tools::Rectangle aBoundRect(pHitObj->GetCurrentBoundRect());
 
         // Force to SnapRect when Fontwork
-        if( auto pTextObj = dynamic_cast<const SdrTextObj*>(pHitObj) )
+        if( auto pTextObj = DynCastSdrTextObj(pHitObj) )
             if( pTextObj->IsFontwork() )
                 aBoundRect = pHitObj->GetSnapRect();
 
@@ -1041,7 +1041,7 @@ PointerStyle SdrView::GetPreferredPointer(const Point& 
rMousePos, const OutputDe
         case SdrHitKind::TextEdit :
         case SdrHitKind::TextEditObj:
         {
-            SdrTextObj* pText = dynamic_cast< SdrTextObj* >(aVEvt.mpObj);
+            SdrTextObj* pText = DynCastSdrTextObj(aVEvt.mpObj);
             if(pText && pText->HasText())
             {
                 OutlinerParaObject* pParaObj = pText->GetOutlinerParaObject();
diff --git a/svx/source/unodraw/UnoGraphicExporter.cxx 
b/svx/source/unodraw/UnoGraphicExporter.cxx
index b1ffa6449007..66af82d6baac 100644
--- a/svx/source/unodraw/UnoGraphicExporter.cxx
+++ b/svx/source/unodraw/UnoGraphicExporter.cxx
@@ -837,7 +837,7 @@ bool GraphicExporter::GetGraphic( ExportSettings const & 
rSettings, Graphic& aGr
             else if( rSettings.mbScrollText )
             {
                 SdrObject* pObj = aShapes.front();
-                auto pTextObj = dynamic_cast<SdrTextObj*>( pObj);
+                auto pTextObj = DynCastSdrTextObj( pObj);
                 if( pTextObj && pTextObj->HasText() )
                 {
                     tools::Rectangle aScrollRectangle;
diff --git a/svx/source/unodraw/unoshape.cxx b/svx/source/unodraw/unoshape.cxx
index a37e6ef4c65c..38d5ee335af5 100644
--- a/svx/source/unodraw/unoshape.cxx
+++ b/svx/source/unodraw/unoshape.cxx
@@ -175,7 +175,7 @@ protected:
 /// Calculates what scaling factor will be used for autofit text scaling of 
this shape.
 sal_Int16 GetTextFitToSizeScale(SdrObject* pObject)
 {
-    SdrTextObj* pTextObj = dynamic_cast<SdrTextObj*>(pObject);
+    SdrTextObj* pTextObj = DynCastSdrTextObj(pObject);
     if (!pTextObj)
     {
         return 0;
@@ -2436,7 +2436,7 @@ bool SvxShape::setPropertyValueImpl( const OUString&, 
const SfxItemPropertyMapEn
 
     case OWN_ATTR_TEXTCOLUMNS:
     {
-        if (auto pTextObj = dynamic_cast<SdrTextObj*>(pSdrObject.get()))
+        if (auto pTextObj = DynCastSdrTextObj(pSdrObject.get()))
         {
             css::uno::Reference<css::text::XTextColumns> xTextColumns;
             if (rValue >>= xTextColumns)
@@ -2566,7 +2566,7 @@ bool SvxShape::getPropertyValueImpl( const OUString&, 
const SfxItemPropertyMapEn
     case OWN_ATTR_ISFONTWORK:
     {
         bool bIsFontwork = false;
-        if (const SdrTextObj* pTextObj = dynamic_cast<const 
SdrTextObj*>(GetSdrObject()))
+        if (const SdrTextObj* pTextObj = DynCastSdrTextObj(GetSdrObject()))
             bIsFontwork = pTextObj->IsFontwork();
         rValue <<= bIsFontwork;
         break;
@@ -2883,7 +2883,7 @@ bool SvxShape::getPropertyValueImpl( const OUString&, 
const SfxItemPropertyMapEn
 
     case OWN_ATTR_TEXTCOLUMNS:
     {
-        if (auto pTextObj = dynamic_cast<const SdrTextObj*>(GetSdrObject()))
+        if (auto pTextObj = DynCastSdrTextObj(GetSdrObject()))
         {
             if (pTextObj->HasTextColumnsNumber() || 
pTextObj->HasTextColumnsSpacing())
             {
@@ -3888,7 +3888,7 @@ bool SvxShapeText::setPropertyValueImpl( const OUString& 
rName, const SfxItemPro
 
     if( pProperty->nWID == SDRATTR_TEXTDIRECTION )
     {
-        SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( GetSdrObject() );
+        SdrTextObj* pTextObj = DynCastSdrTextObj( GetSdrObject() );
         if( pTextObj )
         {
             css::text::WritingMode eMode;
@@ -3906,7 +3906,7 @@ bool SvxShapeText::getPropertyValueImpl( const OUString& 
rName, const SfxItemPro
 {
     if( pProperty->nWID == SDRATTR_TEXTDIRECTION )
     {
-        SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( GetSdrObject() );
+        SdrTextObj* pTextObj = DynCastSdrTextObj( GetSdrObject() );
         if( pTextObj && pTextObj->IsVerticalWriting() )
             rValue <<= css::text::WritingMode_TB_RL;
         else
diff --git a/svx/source/unodraw/unoshtxt.cxx b/svx/source/unodraw/unoshtxt.cxx
index 9dc311f9c438..b1ca3ff0c65e 100644
--- a/svx/source/unodraw/unoshtxt.cxx
+++ b/svx/source/unodraw/unoshtxt.cxx
@@ -110,7 +110,7 @@ private:
                                     {
                                         if (!mbShapeIsEditMode)
                                             return false;
-                                        SdrTextObj* pTextObj = 
dynamic_cast<SdrTextObj*>( mpObject  );
+                                        SdrTextObj* pTextObj = 
DynCastSdrTextObj( mpObject  );
                                         return pTextObj && 
pTextObj->IsTextEditActive();
                                     }
 
@@ -170,7 +170,7 @@ SvxTextEditSourceImpl::SvxTextEditSourceImpl( SdrObject* 
pObject, SdrText* pText
 
     if( !mpText )
     {
-        SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( mpObject );
+        SdrTextObj* pTextObj = DynCastSdrTextObj( mpObject );
         if( pTextObj )
             mpText = pTextObj->getText( 0 );
     }
@@ -201,7 +201,7 @@ SvxTextEditSourceImpl::SvxTextEditSourceImpl( SdrObject& 
rObject, SdrText* pText
 {
     if( !mpText )
     {
-        SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( mpObject );
+        SdrTextObj* pTextObj = DynCastSdrTextObj( mpObject );
         if( pTextObj )
             mpText = pTextObj->getText( 0 );
     }
@@ -441,7 +441,7 @@ void SvxTextEditSourceImpl::SetupOutliner()
     if( !(mpObject && mpOutliner) )
         return;
 
-    SdrTextObj* pTextObj = dynamic_cast<SdrTextObj*>( mpObject  );
+    SdrTextObj* pTextObj = DynCastSdrTextObj( mpObject  );
     if( pTextObj )
     {
         tools::Rectangle aPaintRect;
@@ -462,7 +462,7 @@ void SvxTextEditSourceImpl::UpdateOutliner()
     if( !(mpObject && mpOutliner) )
         return;
 
-    SdrTextObj* pTextObj = dynamic_cast<SdrTextObj*>( mpObject  );
+    SdrTextObj* pTextObj = DynCastSdrTextObj( mpObject  );
     if( pTextObj )
     {
         tools::Rectangle aPaintRect;
@@ -486,7 +486,7 @@ SvxTextForwarder* 
SvxTextEditSourceImpl::GetBackgroundTextForwarder()
     {
         if( mpOutliner == nullptr )
         {
-            SdrTextObj* pTextObj = dynamic_cast<SdrTextObj*>( mpObject  );
+            SdrTextObj* pTextObj = DynCastSdrTextObj( mpObject  );
             OutlinerMode nOutlMode = OutlinerMode::TextObject;
             if( pTextObj && pTextObj->IsTextFrame() && pTextObj->GetTextKind() 
== SdrObjKind::OutlineText )
                 nOutlMode = OutlinerMode::OutlineObject;
@@ -536,7 +536,7 @@ SvxTextForwarder* 
SvxTextEditSourceImpl::GetBackgroundTextForwarder()
         mpTextForwarder->flushCache();
 
         std::optional<OutlinerParaObject> pOutlinerParaObject;
-        SdrTextObj* pTextObj = dynamic_cast<SdrTextObj*>( mpObject  );
+        SdrTextObj* pTextObj = DynCastSdrTextObj( mpObject  );
         if( pTextObj && pTextObj->getActiveText() == mpText )
             pOutlinerParaObject = pTextObj->CreateEditOutlinerParaObject(); // 
Get the OutlinerParaObject if text edit is active
         bool bOwnParaObj(false);
@@ -665,7 +665,7 @@ SvxTextForwarder* SvxTextEditSourceImpl::GetTextForwarder()
         {
             assert(!mbForwarderIsEditMode); // because without a view there is 
no other option except !mbForwarderIsEditMode
             bool bTextEditActive = false;
-            SdrTextObj* pTextObj = dynamic_cast<SdrTextObj*>(mpObject);
+            SdrTextObj* pTextObj = DynCastSdrTextObj(mpObject);
             // similar to the GetBackgroundTextForwarder check, see if the 
text edit is active
             if (pTextObj && pTextObj->getActiveText() == mpText && 
pTextObj->CanCreateEditOutlinerParaObject())
                 bTextEditActive = true; // text edit active
@@ -685,7 +685,7 @@ std::unique_ptr<SvxDrawOutlinerViewForwarder> 
SvxTextEditSourceImpl::CreateViewF
         mpView->GetTextEditOutliner()->SetNotifyHdl( LINK(this, 
SvxTextEditSourceImpl, NotifyHdl) );
         mbNotifyEditOutlinerSet = true;
 
-        SdrTextObj* pTextObj = dynamic_cast<SdrTextObj*>( mpObject  );
+        SdrTextObj* pTextObj = DynCastSdrTextObj( mpObject  );
         if( pTextObj )
         {
             tools::Rectangle aBoundRect( pTextObj->GetCurrentBoundRect() );
@@ -736,7 +736,7 @@ SvxEditViewForwarder* 
SvxTextEditSourceImpl::GetEditViewForwarder( bool bCreate
 
             if(mpView->SdrBeginTextEdit(mpObject))
             {
-                SdrTextObj* pTextObj = dynamic_cast<SdrTextObj*>( mpObject  );

... etc. - the rest is truncated

Reply via email to