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.grandin@collabora.co.uk>
diff --git a/chart2/source/controller/main/ChartController_Window.cxx b/chart2/source/controller/main/ChartController_Window.cxx
index 9129500..018419b 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 9d896b7..18dfda1d 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 3705429..aa6093a 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 460d0c1..302008375 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 d2b1ae4..a251d8d 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 6041a74..a257476 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 e8d5bef2..8939a54 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 bda3012..4fa1e6c 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 4d60bd5..7940758 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 cb87fb7..03336e9 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 fdb0efe..226407b 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 a5b4a73..2c8ed5a 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 6c2d548..d73915c 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 1064a30..0ffb6e8 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 ee90907..ea5f14a 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 46b7fc4..2b051bb 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 7f0ec12..9bd670d 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 df601ea..1c13bee 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 7c10eeb..372ccf1 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 1b5ff45c..535f3f4 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 93234b2..a9bec3ab 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 a4e5d88..62fe341 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 14fe41e2..83e27d4 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 8f36b01..1121403 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 c6e3356..8572bb5 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 5a14354..f637476 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 a0b6ff4..3529290 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 fc09d8a..873e825 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 254bcf0..d3d5b10 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 2504c2f..a4e1eb5 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 6c99ed6..0b1be5f 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 c2673ef..8f022c6 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 ff49054..8f9ab4c 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 4e296ea..2b4db59 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 4a67154..e87fd1a 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 06230fa..ed447874 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 b9aab12..c75959f 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 68839bd..60e36e2 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 78d2ae6..d978880 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 52e0555..2bd908f 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 f284331..21b9df9 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 14eb0a3..990f9c8 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 b906360..3994b9f 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 307c0d3..3d58ef8 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 3bb0afc..4773b3b 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 57e912c..ac3f1bc 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 e4cdf01..2c972b0 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 d9cf565..e3181ba 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 45b6edd..bd34aa5 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 4f375dc..b7968a6 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 8aab2c5..e74fe71 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 856c497..10a6e762 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 5007f6d..c92ee11 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 1c1f964..e5d9370 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 86a1b15..18df6d5 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 1483b57..5f13af5 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 193b6b6..dc8073e 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 100a7dc..5c04ce2 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 7c5d2c7..27b62dd 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 012b515..58812d8 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 6d4fe7c..2e4d218 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 caaeb93..38c07fb 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 838876a..77b5f9c 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 203b566..b642f8e 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 587ca14..eb1c964 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 58963a9..9df4b8d 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 90ebb72..912135b 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 becc4cd..877744f 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 53b32dd..8ca01ff 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 0c89288..90fddd2 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 16745d4..7509991 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 0df375d..20be7b8 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 4239900..e4e40a5 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 b1ffa64..66af82d 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 a37e6ef..38d5ee3 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 9dc311f9..b1ca3ff 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  );
                SdrTextObj* pTextObj = DynCastSdrTextObj( mpObject  );
                if (pTextObj && pTextObj->IsTextEditActive())
                {
                    // create new view forwarder
@@ -773,7 +773,7 @@ void SvxTextEditSourceImpl::UpdateData()
    {
        if( mpOutliner && mpObject && mpText )
        {
            SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( mpObject );
            SdrTextObj* pTextObj = DynCastSdrTextObj( mpObject );
            if( pTextObj )
            {
                if( (mpOutliner->GetParagraphCount() == 1 && mpOutliner->GetEditEngine().GetTextLen( 0 ) == 0 )
diff --git a/sw/qa/extras/layout/layout.cxx b/sw/qa/extras/layout/layout.cxx
index feda2a4..7d8f766 100644
--- a/sw/qa/extras/layout/layout.cxx
+++ b/sw/qa/extras/layout/layout.cxx
@@ -4932,7 +4932,7 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTdf137185)
    auto xTextFrame = SwXTextFrame::CreateXTextFrame(*pFormat->GetDoc(), pFormat);

    CPPUNIT_ASSERT_EQUAL(OUString("Align me!"), xTextFrame->getText()->getString());
    SdrTextObj* pTextObj = dynamic_cast<SdrTextObj*>(pObj);
    SdrTextObj* pTextObj = DynCastSdrTextObj(pObj);
    CPPUNIT_ASSERT(pTextObj);
    const auto& aOutStr = pTextObj->GetOutlinerParaObject()->GetTextObject();

diff --git a/sw/source/core/doc/DocumentDrawModelManager.cxx b/sw/source/core/doc/DocumentDrawModelManager.cxx
index 990bb8a..7f3098e 100644
--- a/sw/source/core/doc/DocumentDrawModelManager.cxx
+++ b/sw/source/core/doc/DocumentDrawModelManager.cxx
@@ -309,7 +309,7 @@ bool DocumentDrawModelManager::Search(const SwPaM& rPaM, const SvxSearchItem& rS
        // Does the shape have matching text?
        SdrOutliner& rOutliner = GetDrawModel()->GetDrawOutliner();
        SdrObject* pObject = const_cast<SdrObject*>(rFrameFormat.FindSdrObject());
        SdrTextObj* pTextObj = dynamic_cast<SdrTextObj*>(pObject);
        SdrTextObj* pTextObj = DynCastSdrTextObj(pObject);
        if (!pTextObj)
            continue;
        const OutlinerParaObject* pParaObj = pTextObj->GetOutlinerParaObject();
diff --git a/sw/source/core/doc/textboxhelper.cxx b/sw/source/core/doc/textboxhelper.cxx
index 5658d10..6c1af82 100644
--- a/sw/source/core/doc/textboxhelper.cxx
+++ b/sw/source/core/doc/textboxhelper.cxx
@@ -186,7 +186,7 @@ void SwTextBoxHelper::create(SwFrameFormat* pShape, SdrObject* pObject, bool bCo

    if (pObject)
    {
        auto pSourceText = dynamic_cast<SdrTextObj*>(pObject);
        auto pSourceText = DynCastSdrTextObj(pObject);
        uno::Reference<text::XTextRange> xDestText(xRealTextFrame, uno::UNO_QUERY);

        xDestText->setString(sCopyableText);
diff --git a/sw/source/core/draw/dcontact.cxx b/sw/source/core/draw/dcontact.cxx
index fe19106..f1375a8 100644
--- a/sw/source/core/draw/dcontact.cxx
+++ b/sw/source/core/draw/dcontact.cxx
@@ -1616,13 +1616,12 @@ void SwDrawContact::SwClientNotify(const SwModify& rMod, const SfxHint& rHint)
            //iterate inside of a grouped object
            while(aListIter.IsMore())
            {
                SdrObject* pSdrOElement = aListIter.Next();
                auto pTextObj = const_cast<SdrTextObj*>(dynamic_cast<const SdrTextObj*>(pSdrOElement));
                SdrTextObj* pTextObj = DynCastSdrTextObj(aListIter.Next());
                if(pTextObj && pTextObj->HasText())
                    pCollectTextObjectsHint->m_rTextObjects.push_back(pTextObj);
            }
        }
        else if(auto pTextObj = const_cast<SdrTextObj*>(dynamic_cast<const SdrTextObj*>(pSdrO)))
        else if(SdrTextObj* pTextObj = DynCastSdrTextObj(pSdrO))
        {
            if(pTextObj->HasText())
                pCollectTextObjectsHint->m_rTextObjects.push_back(pTextObj);
diff --git a/sw/source/core/frmedt/feshview.cxx b/sw/source/core/frmedt/feshview.cxx
index 1b2b4ea..46e1797 100644
--- a/sw/source/core/frmedt/feshview.cxx
+++ b/sw/source/core/frmedt/feshview.cxx
@@ -3199,7 +3199,7 @@ void SwFEShell::CreateDefaultShape( SdrObjKind eSdrObjectKind, const tools::Rect
            pCaptionObj->SetTailPos(
                aRect.TopLeft() - Point(aRect.GetWidth() / 2, aRect.GetHeight() / 2));
        }
        else if(auto pText = dynamic_cast<SdrTextObj*>( pObj.get()))
        else if(auto pText = DynCastSdrTextObj( pObj.get()))
        {
            pText->SetLogicRect(aRect);

diff --git a/sw/source/filter/indexing/IndexingExport.cxx b/sw/source/filter/indexing/IndexingExport.cxx
index 3839b55..13da0b7 100644
--- a/sw/source/filter/indexing/IndexingExport.cxx
+++ b/sw/source/filter/indexing/IndexingExport.cxx
@@ -118,7 +118,7 @@ public:

        m_rXmlWriter.endElement();

        SdrTextObj* pTextObject = dynamic_cast<SdrTextObj*>(pObject);
        SdrTextObj* pTextObject = DynCastSdrTextObj(pObject);
        if (!pTextObject)
            return;

diff --git a/sw/source/filter/ww8/rtfsdrexport.cxx b/sw/source/filter/ww8/rtfsdrexport.cxx
index 2820aa6..05413a8 100644
--- a/sw/source/filter/ww8/rtfsdrexport.cxx
+++ b/sw/source/filter/ww8/rtfsdrexport.cxx
@@ -587,7 +587,7 @@ sal_Int32 RtfSdrExport::StartShape()
        }
    }

    auto pTextObj = dynamic_cast<const SdrTextObj*>(m_pSdrObject);
    auto pTextObj = DynCastSdrTextObj(m_pSdrObject);
    if (pTextObj)
    {
        const OutlinerParaObject* pParaObj = nullptr;
diff --git a/sw/source/filter/ww8/wrtw8sty.cxx b/sw/source/filter/ww8/wrtw8sty.cxx
index 60a77ea..842bf95 100644
--- a/sw/source/filter/ww8/wrtw8sty.cxx
+++ b/sw/source/filter/ww8/wrtw8sty.cxx
@@ -2273,8 +2273,8 @@ bool WW8_WrPlcSubDoc::WriteGenericText( WW8Export& rWrt, sal_uInt8 nTTyp,
                        rWrt.GetOCXExp().ExportControl(rWrt, dynamic_cast<const SdrUnoObj&>(rObj));
                        rWrt.m_nTextTyp = nOldTyp;
                    }
                    else if( dynamic_cast<const SdrTextObj*>( &rObj) !=  nullptr )
                        rWrt.WriteSdrTextObj(dynamic_cast<const SdrTextObj&>(rObj), nTTyp);
                    else if( auto pText = DynCastSdrTextObj(&rObj) )
                        rWrt.WriteSdrTextObj(*pText, nTTyp);
                    else
                    {
                        const SwFrameFormat* pFormat = ::FindFrameFormat( &rObj );
@@ -2522,7 +2522,7 @@ void WW8_WrPlcSubDoc::WriteGenericPlc( WW8Export& rWrt, sal_uInt8 nTTyp,
                    // is it a writer or sdr - textbox?
                    const SdrObject* pObj = static_cast<SdrObject const *>(m_aContent[ i ]);
                    sal_Int32 nCnt = 1;
                    if (dynamic_cast< const SdrTextObj *>( pObj ))
                    if (DynCastSdrTextObj( pObj ))
                    {
                        // find the "highest" SdrObject of this
                        const SwFrameFormat& rFormat = *::FindFrameFormat( pObj );
diff --git a/sw/source/filter/ww8/ww8graf.cxx b/sw/source/filter/ww8/ww8graf.cxx
index d803e56..7fcbde4 100644
--- a/sw/source/filter/ww8/ww8graf.cxx
+++ b/sw/source/filter/ww8/ww8graf.cxx
@@ -2880,7 +2880,7 @@ SwFrameFormat* SwWW8ImplReader::MungeTextIntoDrawBox(SvxMSDffImportRec& rRecord,
        pThisGroup->GetSubList()->NbcInsertObject(pSdrTextObj.get());
    }
    else
        pSdrTextObj = dynamic_cast<SdrTextObj*>(rRecord.pObj.get());
        pSdrTextObj = DynCastSdrTextObj(rRecord.pObj.get());

    if( pSdrTextObj )
    {
@@ -2976,7 +2976,7 @@ SwFlyFrameFormat* SwWW8ImplReader::ConvertDrawTextToFly(rtl::Reference<SdrObject
        MatchSdrItemsIntoFlySet(rpObject.get(), rFlySet, rRecord.eLineStyle, rRecord.eLineDashing,
                                rRecord.eShapeType, aInnerDist);

        SdrTextObj *pSdrTextObj = dynamic_cast<SdrTextObj*>(rpObject.get());
        SdrTextObj *pSdrTextObj = DynCastSdrTextObj(rpObject.get());
        if (pSdrTextObj && pSdrTextObj->IsVerticalWriting())
            rFlySet.Put(SvxFrameDirectionItem(SvxFrameDirection::Vertical_RL_TB, RES_FRAMEDIR));

diff --git a/sw/source/filter/ww8/ww8par.cxx b/sw/source/filter/ww8/ww8par.cxx
index 700b276..1d38928 100644
--- a/sw/source/filter/ww8/ww8par.cxx
+++ b/sw/source/filter/ww8/ww8par.cxx
@@ -912,7 +912,7 @@ rtl::Reference<SdrObject> SwMSDffManager::ProcessObj(SvStream& rSt,

                if (bVerticalText)
                {
                    SdrTextObj *pTextObj = dynamic_cast< SdrTextObj* >(pObj.get());
                    SdrTextObj *pTextObj = DynCastSdrTextObj(pObj.get());
                    if (pTextObj)
                        pTextObj->SetVerticalWriting(true);
                }
diff --git a/sw/source/uibase/dialog/SwSpellDialogChildWindow.cxx b/sw/source/uibase/dialog/SwSpellDialogChildWindow.cxx
index 08b9910..44e0619 100644
--- a/sw/source/uibase/dialog/SwSpellDialogChildWindow.cxx
+++ b/sw/source/uibase/dialog/SwSpellDialogChildWindow.cxx
@@ -723,7 +723,7 @@ bool SwSpellDialogChildWindow::FindNextDrawTextError_Impl(SwWrtShell& rSh)
    if ( rMarkList.GetMarkCount() == 1 )
    {
        SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
        if( auto pSdrTextObj = dynamic_cast<SdrTextObj *>( pObj ) )
        if( auto pSdrTextObj = DynCastSdrTextObj( pObj ) )
            pCurrentTextObj = pSdrTextObj;
    }
    // at first fill the list of drawing objects
diff --git a/sw/source/uibase/ribbar/conrect.cxx b/sw/source/uibase/ribbar/conrect.cxx
index 837d5c3..577ca06 100644
--- a/sw/source/uibase/ribbar/conrect.cxx
+++ b/sw/source/uibase/ribbar/conrect.cxx
@@ -109,7 +109,7 @@ bool ConstRectangle::MouseButtonUp(const MouseEvent& rMEvt)
            }
            else if(mbVertical)
            {
                if (SdrTextObj* pText = dynamic_cast<SdrTextObj*>(pObj))
                if (SdrTextObj* pText = DynCastSdrTextObj(pObj))
                {
                    SfxItemSet aSet(pSdrView->GetModel()->GetItemPool());

diff --git a/sw/source/uibase/shells/drawsh.cxx b/sw/source/uibase/shells/drawsh.cxx
index 0d23582..f539d5a 100644
--- a/sw/source/uibase/shells/drawsh.cxx
+++ b/sw/source/uibase/shells/drawsh.cxx
@@ -599,7 +599,7 @@ void SwDrawShell::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/sw/source/uibase/shells/drwtxtsh.cxx b/sw/source/uibase/shells/drwtxtsh.cxx
index 776cd31..8f86fb5 100644
--- a/sw/source/uibase/shells/drwtxtsh.cxx
+++ b/sw/source/uibase/shells/drwtxtsh.cxx
@@ -234,7 +234,7 @@ void SwDrawTextShell::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/sw/source/uibase/uiview/viewdraw.cxx b/sw/source/uibase/uiview/viewdraw.cxx
index 4925a13..dc14040 100644
--- a/sw/source/uibase/uiview/viewdraw.cxx
+++ b/sw/source/uibase/uiview/viewdraw.cxx
@@ -480,9 +480,9 @@ bool SwView::EnterDrawTextMode(const Point& aDocPos)
    {
        // To allow SwDrawVirtObj text objects to be activated, allow their type, too.
        auto pVirtObj =  dynamic_cast<SwDrawVirtObj*>( pObj );
        if ( (pVirtObj && dynamic_cast< const SdrTextObj *>(&pVirtObj->GetReferencedObj() ) != nullptr &&
        if ( (pVirtObj && DynCastSdrTextObj(&pVirtObj->GetReferencedObj() ) != nullptr &&
               m_pWrtShell->IsSelObjProtected(FlyProtectFlags::Content) == FlyProtectFlags::NONE) ||
             dynamic_cast< const SdrTextObj *>( pObj ) != nullptr )
             DynCastSdrTextObj( pObj ) != nullptr )
        {
            // Refuse to edit editeng text of the shape if it has textbox attached.
            if (!lcl_isTextBox(pObj))