sw: fix undefined casts of SwTxtInputFld

... as reported by sberg via UBSan in CppunitTest_sw_mailmerge:

> sw/source/core/txtnode/thints.cxx:3207:38: runtime error: downcast of address 0x000003cadcb0 which does not point to an object of type 'SwTxtAttrNesting'
> 0x000003cadcb0: note: object is of type 'SwTxtInputFld'
> #0 in SwpHints::TryInsertHint(SwTxtAttr*, SwTxtNode&, unsigned short) sw/source/core/txtnode/thints.cxx:3207:13
> #1 in SwTxtNode::InsertHint(SwTxtAttr*, unsigned short) sw/source/core/txtnode/thints.cxx:1583:25
> #2 in SwTxtNode::SetAttr(SfxItemSet const&, int, int, unsigned short) sw/source/core/txtnode/thints.cxx:1943:39
> #3 in SwRegHistory::InsertItems(SfxItemSet const&, int, int, unsigned short) sw/source/core/undo/rolbck.cxx:1390:28
> #4 in (anonymous namespace)::lcl_InsAttr(SwDoc*, SwPaM const&, SfxItemSet const&, unsigned short, SwUndoAttr*, bool) sw/source/core/doc/DocumentContentOperationsManager.cxx:1169:28
> #5 in sw::DocumentContentOperationsManager::InsertPoolItem(SwPaM const&, SfxPoolItem const&, unsigned short, bool) sw/source/core/doc/DocumentContentOperationsManager.cxx:3041:23
> #6 in SwXTextField::attach(com::sun::star::uno::Reference<com::sun::star::text::XTextRange> const&) sw/source/core/unocore/unofield.cxx:1966:13 > #7 in non-virtual thunk to SwXTextField::attach(com::sun::star::uno::Reference<com::sun::star::text::XTextRange> const&) sw/source/core/unocore/unofield.cxx:2061:1

The SwTxtInputFld is unusual because it's both a field and has a range;
let's try to use virtual inheritance to inherit both from
SwTxtFld and SwTxtAttrNesting.  Sadly requires dynamic_cast everywhere.

Change-Id: I69f834d2b78ef7cdaac1f554bd80711084efcd02
diff --git a/sw/inc/txatbase.hxx b/sw/inc/txatbase.hxx
index 222857d..830d097 100644
--- a/sw/inc/txatbase.hxx
+++ b/sw/inc/txatbase.hxx
@@ -121,7 +121,7 @@ public:

};

class SwTxtAttrEnd : public SwTxtAttr
class SwTxtAttrEnd : public virtual SwTxtAttr
{
protected:
    sal_Int32 m_nEnd;
@@ -132,6 +132,15 @@ public:
    virtual sal_Int32* GetEnd() SAL_OVERRIDE;
};

// attribute that must not overlap others
class SwTxtAttrNesting : public SwTxtAttrEnd
{
protected:
    SwTxtAttrNesting( SfxPoolItem & i_rAttr,
        const sal_Int32 i_nStart, const sal_Int32 i_nEnd );
    virtual ~SwTxtAttrNesting();
};

inline const sal_Int32* SwTxtAttr::End() const
{
    return const_cast<SwTxtAttr * >(this)->GetEnd();
@@ -227,6 +236,16 @@ inline const SwFmtMeta& SwTxtAttr::GetMeta() const
    return (const SwFmtMeta&)(*m_pAttr);
}

// these should be static_casts but with virtual inheritance it's not possible
template<typename T, typename S> inline T static_txtattr_cast(S * s)
{
    return dynamic_cast<T>(s);
}
template<typename T, typename S> inline T static_txtattr_cast(S & s)
{
    return dynamic_cast<T>(s);
}

#endif

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/inc/txtatr.hxx b/sw/inc/txtatr.hxx
index b8720b0..a5a4e1d 100644
--- a/sw/inc/txtatr.hxx
+++ b/sw/inc/txtatr.hxx
@@ -50,14 +50,6 @@ public:
};


class SwTxtAttrNesting : public SwTxtAttrEnd
{
protected:
    SwTxtAttrNesting( SfxPoolItem & i_rAttr,
        const sal_Int32 i_nStart, const sal_Int32 i_nEnd );
    virtual ~SwTxtAttrNesting();
};

class SwTxtMeta : public SwTxtAttrNesting
{
private:
diff --git a/sw/inc/txtfld.hxx b/sw/inc/txtfld.hxx
index 9758bd2..946a4bb 100644
--- a/sw/inc/txtfld.hxx
+++ b/sw/inc/txtfld.hxx
@@ -27,7 +27,7 @@
class SwPaM;
class SwTxtNode;

class SwTxtFld : public SwTxtAttr
class SwTxtFld : public virtual SwTxtAttr
{
    mutable OUString m_aExpand; // only used to determine, if field content is changing in <ExpandTxtFld()>
    SwTxtNode * m_pTxtNode;
@@ -73,7 +73,9 @@ public:

};

class SwTxtInputFld : public SwTxtFld
class SwTxtInputFld
    : public SwTxtAttrNesting
    , public SwTxtFld
{
public:
    SwTxtInputFld(
@@ -84,8 +86,6 @@ public:

    virtual ~SwTxtInputFld();

    virtual sal_Int32* GetEnd() SAL_OVERRIDE;

    void LockNotifyContentChange();
    void UnlockNotifyContentChange();
    virtual void NotifyContentChange( SwFmtFld& rFmtFld ) SAL_OVERRIDE;
@@ -96,7 +96,6 @@ public:
    void UpdateFieldContent();

private:
    sal_Int32 m_nEnd;

    bool m_bLockNotifyContentChange;
};
diff --git a/sw/source/core/access/accpara.cxx b/sw/source/core/access/accpara.cxx
index b4fe38f..7e00688 100644
--- a/sw/source/core/access/accpara.cxx
+++ b/sw/source/core/access/accpara.cxx
@@ -1462,7 +1462,8 @@ OUString SwAccessibleParagraph::GetFieldTypeNameAtIndex(sal_Int32 nIndex)
                       || pHt->Which() == RES_TXTATR_INPUTFIELD )
                     && (nFldIndex-- == 0))
                {
                    pTxtFld = (SwTxtFld *)pHt;
                    pTxtFld = const_cast<SwTxtFld*>(
                                static_txtattr_cast<SwTxtFld const*>(pHt));
                    break;
                }
                else if (pHt->Which() == RES_TXTATR_REFMARK
diff --git a/sw/source/core/crsr/crstrvl.cxx b/sw/source/core/crsr/crstrvl.cxx
index c956ece..dff0b0f 100644
--- a/sw/source/core/crsr/crstrvl.cxx
+++ b/sw/source/core/crsr/crstrvl.cxx
@@ -1671,7 +1671,7 @@ bool SwContentAtPos::IsInProtectSect() const
        {
        case SW_FIELD:
        case SW_CLICKFIELD:
            pNd = ((SwTxtFld*)pFndTxtAttr)->GetpTxtNode();
            pNd = static_txtattr_cast<SwTxtFld const*>(pFndTxtAttr)->GetpTxtNode();
            break;

        case SW_FTN:
@@ -1679,7 +1679,7 @@ bool SwContentAtPos::IsInProtectSect() const
            break;

        case SW_INETATTR:
            pNd = ((SwTxtINetFmt*)pFndTxtAttr)->GetpTxtNode();
            pNd = static_txtattr_cast<SwTxtINetFmt const*>(pFndTxtAttr)->GetpTxtNode();
            break;

        default:
diff --git a/sw/source/core/crsr/findtxt.cxx b/sw/source/core/crsr/findtxt.cxx
index 277b729..c6b2a74 100644
--- a/sw/source/core/crsr/findtxt.cxx
+++ b/sw/source/core/crsr/findtxt.cxx
@@ -135,7 +135,7 @@ lcl_CleanStr(const SwTxtNode& rNd, sal_Int32 const nStart, sal_Int32& rEnd,
                        const bool bEmpty =
                            ( pHt->Which() != RES_TXTATR_FIELD
                              && pHt->Which() != RES_TXTATR_ANNOTATION )
                            || (static_cast<SwTxtFld const*>(pHt)->GetFmtFld().GetField()->ExpandField(true).isEmpty());;
                            || (static_txtattr_cast<SwTxtFld const*>(pHt)->GetFmtFld().GetField()->ExpandField(true).isEmpty());;
                        if ( bEmpty && nStart == nAkt )
                        {
                            rArr.push_back( nAkt );
@@ -352,7 +352,8 @@ bool SwPaM::Find( const SearchOptions& rSearchOpt, bool bSearchInNotes , utl::Te
                        if ( (bSrchForward && (GetPostIt(aLoop + aIgnore,pHts) < pHts->Count()) ) || ( !bSrchForward && (aLoop!=0) ))
                        {
                            const SwTxtAttr* pTxtAttr = bSrchForward ?  (*pHts)[GetPostIt(aLoop+aIgnore,pHts)] : (*pHts)[GetPostIt(aLoop+aIgnore-1,pHts)];
                            if ( pPostItMgr && pPostItMgr->SearchReplace(((SwTxtFld*)pTxtAttr)->GetFmtFld(),rSearchOpt,bSrchForward) )
                            if (pPostItMgr && pPostItMgr->SearchReplace(
                                    static_txtattr_cast<SwTxtFld const*>(pTxtAttr)->GetFmtFld(),rSearchOpt,bSrchForward))
                            {
                                bFound = true ;
                                break;
diff --git a/sw/source/core/docnode/nodes.cxx b/sw/source/core/docnode/nodes.cxx
index 4873847..4102a70 100644
--- a/sw/source/core/docnode/nodes.cxx
+++ b/sw/source/core/docnode/nodes.cxx
@@ -270,7 +270,7 @@ void SwNodes::ChgNode( SwNodeIndex& rDelPos, sal_uLong nSz,
                            case RES_TXTATR_ANNOTATION:
                            case RES_TXTATR_INPUTFIELD:
                                {
                                    SwTxtFld* pTxtFld = static_cast<SwTxtFld*>(pAttr);
                                    SwTxtFld* pTxtFld = static_txtattr_cast<SwTxtFld*>(pAttr);
                                    rNds.GetDoc()->getIDocumentFieldsAccess().InsDelFldInFldLst( !bToUndo, *pTxtFld );

                                    const SwFieldType* pTyp = pTxtFld->GetFmtFld().GetField()->GetTyp();
@@ -314,7 +314,7 @@ void SwNodes::ChgNode( SwNodeIndex& rDelPos, sal_uLong nSz,
                            case RES_TXTATR_METAFIELD:
                                {
                                    SwTxtMeta *const pTxtMeta(
                                        static_cast<SwTxtMeta*>(pAttr));
                                        static_txtattr_cast<SwTxtMeta*>(pAttr));
                                    // force removal of UNO object
                                    pTxtMeta->ChgTxtNode(0);
                                    pTxtMeta->ChgTxtNode(pTxtNd);
diff --git a/sw/source/core/fields/cellfml.cxx b/sw/source/core/fields/cellfml.cxx
index a9a01d8..fc7bed2 100644
--- a/sw/source/core/fields/cellfml.cxx
+++ b/sw/source/core/fields/cellfml.cxx
@@ -153,7 +153,7 @@ double SwTableBox::GetValue( SwTblCalcPara& rCalcPara ) const
        if ( bOK && (Char==CH_TXTATR_BREAKWORD || Char==CH_TXTATR_INWORD) )
        {
            SwTxtFld * const pTxtFld =
                static_cast<SwTxtFld*>( pTxtNd->GetTxtAttrForCharAt( nSttPos, RES_TXTATR_FIELD ) );
                static_txtattr_cast<SwTxtFld*>(pTxtNd->GetTxtAttrForCharAt(nSttPos, RES_TXTATR_FIELD));
            if ( pTxtFld == NULL )
                break;

diff --git a/sw/source/core/text/atrstck.cxx b/sw/source/core/text/atrstck.cxx
index 365cca4..eb4584f 100644
--- a/sw/source/core/text/atrstck.cxx
+++ b/sw/source/core/text/atrstck.cxx
@@ -210,23 +210,23 @@ static bool lcl_ChgHyperLinkColor( const SwTxtAttr& rAttr,
    // We do not want to show visited links:
    // (printing, pdf export, page preview)

    SwTxtINetFmt & rINetAttr(const_cast<SwTxtINetFmt&>(
                            static_txtattr_cast<SwTxtINetFmt const&>(rAttr)));
    if ( pShell->GetOut()->GetOutDevType() == OUTDEV_PRINTER ||
         pShell->GetViewOptions()->IsPDFExport() ||
         pShell->GetViewOptions()->IsPagePreview() )
    {
        if ( ((SwTxtINetFmt&)rAttr).IsVisited() )
        if (rINetAttr.IsVisited())
        {
            if ( pColor )
            {
                // take color from character format 'unvisited link'
                SwTxtINetFmt& rInetAttr( const_cast<SwTxtINetFmt&>(
                    static_cast<const SwTxtINetFmt&>(rAttr)) );
                rInetAttr.SetVisited( false );
                const SwCharFmt* pTmpFmt = ((SwTxtINetFmt&)rAttr).GetCharFmt();
                rINetAttr.SetVisited(false);
                const SwCharFmt* pTmpFmt = rINetAttr.GetCharFmt();
                const SfxPoolItem* pItem;
                pTmpFmt->GetItemState( RES_CHRATR_COLOR, true, &pItem );
                *pColor = ((SvxColorItem*)pItem)->GetValue();
                rInetAttr.SetVisited( true );
                rINetAttr.SetVisited(true);
            }
            return true;
        }
@@ -240,14 +240,14 @@ static bool lcl_ChgHyperLinkColor( const SwTxtAttr& rAttr,

    if ( pShell->GetWin() &&
        (
          (((SwTxtINetFmt&)rAttr).IsVisited() && SwViewOption::IsVisitedLinks()) ||
          (!((SwTxtINetFmt&)rAttr).IsVisited() && SwViewOption::IsLinks())
          (rINetAttr.IsVisited() && SwViewOption::IsVisitedLinks()) ||
          (!rINetAttr.IsVisited() && SwViewOption::IsLinks())
        )
       )
    {
        if ( pColor )
        {
            if ( ((SwTxtINetFmt&)rAttr).IsVisited() )
            if (rINetAttr.IsVisited())
            {
                // take color from view option 'visited link color'
                *pColor = SwViewOption::GetVisitedLinksColor();
diff --git a/sw/source/core/text/pormulti.cxx b/sw/source/core/text/pormulti.cxx
index eb569db..736bbb8 100644
--- a/sw/source/core/text/pormulti.cxx
+++ b/sw/source/core/text/pormulti.cxx
@@ -563,7 +563,8 @@ SwRubyPortion::SwRubyPortion( const SwMultiCreator& rCreate, const SwFont& rFnt,
    else
        SetTop( ! rRuby.GetPosition() );

    const SwCharFmt* pFmt = ((SwTxtRuby*)rCreate.pAttr)->GetCharFmt();
    const SwCharFmt *const pFmt =
        static_txtattr_cast<SwTxtRuby const*>(rCreate.pAttr)->GetCharFmt();
    SwFont *pRubyFont;
    if( pFmt )
    {
diff --git a/sw/source/core/text/txtfld.cxx b/sw/source/core/text/txtfld.cxx
index 8b925cf..465c74c 100644
--- a/sw/source/core/text/txtfld.cxx
+++ b/sw/source/core/text/txtfld.cxx
@@ -123,7 +123,7 @@ SwExpandPortion *SwTxtFormatter::NewFldPortion( SwTxtFormatInfo &rInf,
            if( !bName && pSh && !pSh->Imp()->IsUpdateExpFlds() )
            {
                ((SwChapterField*)pFld)->ChangeExpansion( pFrame,
                                        &((SwTxtFld*)pHint)->GetTxtNode() );
                    &static_txtattr_cast<SwTxtFld const*>(pHint)->GetTxtNode());
            }
            {
                OUString const aStr( (bName)
@@ -185,12 +185,14 @@ SwExpandPortion *SwTxtFormatter::NewFldPortion( SwTxtFormatInfo &rInf,
                if( !::lcl_IsInBody( pFrame ) )
                {
                    pExpFld->ChgBodyTxtFlag( false );
                    pExpFld->ChangeExpansion( *pFrame, *((SwTxtFld*)pHint) );
                    pExpFld->ChangeExpansion(*pFrame,
                            *static_txtattr_cast<SwTxtFld const*>(pHint));
                }
                else if( !pExpFld->IsInBodyTxt() )
                {
                    // war vorher anders, also erst expandieren, dann umsetzen!!
                    pExpFld->ChangeExpansion( *pFrame, *((SwTxtFld*)pHint) );
                    pExpFld->ChangeExpansion(*pFrame,
                            *static_txtattr_cast<SwTxtFld const*>(pHint));
                    pExpFld->ChgBodyTxtFlag( true );
                }
            }
@@ -220,7 +222,8 @@ SwExpandPortion *SwTxtFormatter::NewFldPortion( SwTxtFormatInfo &rInf,
        case RES_REFPAGEGETFLD:
            if( !bName && pSh && !pSh->Imp()->IsUpdateExpFlds() )
            {
                ((SwRefPageGetField*)pFld)->ChangeExpansion( pFrame, (SwTxtFld*)pHint );
                ((SwRefPageGetField*)pFld)->ChangeExpansion(pFrame,
                        static_txtattr_cast<SwTxtFld const*>(pHint));
            }
            {
                OUString const aStr( (bName)
diff --git a/sw/source/core/txtnode/atrfld.cxx b/sw/source/core/txtnode/atrfld.cxx
index 828bc64..6455a19 100644
--- a/sw/source/core/txtnode/atrfld.cxx
+++ b/sw/source/core/txtnode/atrfld.cxx
@@ -329,6 +329,8 @@ bool SwFmtFld::IsProtect() const
           && mpTxtFld->GetpTxtNode()->IsProtect();
}

// class SwTxtFld ////////////////////////////////////////////////////

SwTxtFld::SwTxtFld(
    SwFmtFld & rAttr,
    sal_Int32 const nStartPos,
@@ -501,6 +503,8 @@ void SwTxtFld::DeleteTxtFld( const SwTxtFld& rTxtFld )
    }
}

// class SwTxtInputFld ///////////////////////////////////////////////

// input field in-place editing
SwTxtInputFld::SwTxtInputFld(
    SwFmtFld & rAttr,
@@ -508,29 +512,19 @@ SwTxtInputFld::SwTxtInputFld(
    sal_Int32 const nEnd,
    bool const bInClipboard )

    : SwTxtFld( rAttr, nStart, bInClipboard )
    , m_nEnd( nEnd )
    : SwTxtAttr( rAttr, nStart )
    , SwTxtAttrNesting( rAttr, nStart, nEnd )
    , SwTxtFld( rAttr, nStart, bInClipboard )
    , m_bLockNotifyContentChange( false )
{
    SetHasDummyChar( false );
    SetHasContent( true );

    SetDontExpand( true );
    SetLockExpandFlag( true );
    SetDontExpandStartAttr( true );

    SetNesting( true );
}

SwTxtInputFld::~SwTxtInputFld()
{
}

sal_Int32* SwTxtInputFld::GetEnd()
{
    return &m_nEnd;
}

void SwTxtInputFld::LockNotifyContentChange()
{
    m_bLockNotifyContentChange = true;
@@ -602,12 +596,15 @@ void SwTxtInputFld::UpdateTextNodeContent( const OUString& rNewContent )
    GetTxtNode().ReplaceText( aIdx, nDelLen, rNewContent );
}

// class SwTxtAnnotationFld //////////////////////////////////////////

// text annotation field
SwTxtAnnotationFld::SwTxtAnnotationFld(
    SwFmtFld & rAttr,
    sal_Int32 const nStart,
    bool const bInClipboard )
    : SwTxtFld( rAttr, nStart, bInClipboard )
    : SwTxtAttr( rAttr, nStart )
    , SwTxtFld( rAttr, nStart, bInClipboard )
{
}

diff --git a/sw/source/core/txtnode/atrref.cxx b/sw/source/core/txtnode/atrref.cxx
index 35f338b..48c87a4 100644
--- a/sw/source/core/txtnode/atrref.cxx
+++ b/sw/source/core/txtnode/atrref.cxx
@@ -75,7 +75,8 @@ void SwFmtRefMark::InvalidateRefMark()

SwTxtRefMark::SwTxtRefMark( SwFmtRefMark& rAttr,
            sal_Int32 const nStartPos, sal_Int32 const*const pEnd)
    : SwTxtAttrEnd( rAttr, nStartPos, nStartPos )
    : SwTxtAttr(rAttr, nStartPos)
    , SwTxtAttrEnd( rAttr, nStartPos, nStartPos )
    , m_pTxtNode( 0 )
    , m_pEnd( 0 )
{
diff --git a/sw/source/core/txtnode/atrtox.cxx b/sw/source/core/txtnode/atrtox.cxx
index 8107738..1cbd87a 100644
--- a/sw/source/core/txtnode/atrtox.cxx
+++ b/sw/source/core/txtnode/atrtox.cxx
@@ -25,7 +25,8 @@

SwTxtTOXMark::SwTxtTOXMark( SwTOXMark& rAttr,
            sal_Int32 const nStartPos, sal_Int32 const*const pEnd)
    : SwTxtAttrEnd( rAttr, nStartPos, nStartPos )
    : SwTxtAttr( rAttr, nStartPos )
    , SwTxtAttrEnd( rAttr, nStartPos, nStartPos )
    , m_pTxtNode( 0 )
    , m_pEnd( 0 )
{
diff --git a/sw/source/core/txtnode/modeltoviewhelper.cxx b/sw/source/core/txtnode/modeltoviewhelper.cxx
index 68a7cbb..ad268cd 100644
--- a/sw/source/core/txtnode/modeltoviewhelper.cxx
+++ b/sw/source/core/txtnode/modeltoviewhelper.cxx
@@ -149,7 +149,7 @@ ModelToViewHelper::ModelToViewHelper(const SwTxtNode &rNode, sal_uInt16 eMode)
                            {
                                aFieldResult.m_sExpand = (eMode & REPLACEMODE)
                                    ? OUString(CHAR_ZWSP)
                                    : static_cast<SwTxtFld const*>(pAttr)->
                                    : static_txtattr_cast<SwTxtFld const*>(pAttr)->
                                      GetFmtFld().GetField()->ExpandField(true);
                                aFieldResult.m_eType = FieldResult::FIELD;
                            }
diff --git a/sw/source/core/txtnode/ndhints.cxx b/sw/source/core/txtnode/ndhints.cxx
index ea5f4d8a..200f2114 100644
--- a/sw/source/core/txtnode/ndhints.cxx
+++ b/sw/source/core/txtnode/ndhints.cxx
@@ -44,8 +44,10 @@ static bool lcl_IsLessStart( const SwTxtAttr &rHt1, const SwTxtAttr &rHt2 )
            {
                if ( RES_TXTATR_CHARFMT == nWhich1 )
                {
                    const sal_uInt16 nS1 = static_cast<const SwTxtCharFmt&>(rHt1).GetSortNumber();
                    const sal_uInt16 nS2 = static_cast<const SwTxtCharFmt&>(rHt2).GetSortNumber();
                    const sal_uInt16 nS1 =
                        static_txtattr_cast<const SwTxtCharFmt&>(rHt1).GetSortNumber();
                    const sal_uInt16 nS2 =
                        static_txtattr_cast<const SwTxtCharFmt&>(rHt2).GetSortNumber();
                    if ( nS1 != nS2 ) // robust
                        return nS1 < nS2;
                }
@@ -75,8 +77,10 @@ static bool lcl_IsLessEnd( const SwTxtAttr &rHt1, const SwTxtAttr &rHt2 )
            {
                if ( RES_TXTATR_CHARFMT == nWhich1 )
                {
                    const sal_uInt16 nS1 = static_cast<const SwTxtCharFmt&>(rHt1).GetSortNumber();
                    const sal_uInt16 nS2 = static_cast<const SwTxtCharFmt&>(rHt2).GetSortNumber();
                    const sal_uInt16 nS1 =
                        static_txtattr_cast<const SwTxtCharFmt&>(rHt1).GetSortNumber();
                    const sal_uInt16 nS2 =
                        static_txtattr_cast<const SwTxtCharFmt&>(rHt2).GetSortNumber();
                    if ( nS1 != nS2 ) // robust
                        return nS1 > nS2;
                }
@@ -257,9 +261,9 @@ bool SwpHintsArray::Check(bool bPortionsMerged) const
                    ) // never two AUTOFMT on same range
                &&  (   (pHtThis->Which() != RES_TXTATR_CHARFMT)
                    ||  (pHtLast->Which() != RES_TXTATR_CHARFMT)
                    ||  (static_cast<const SwTxtCharFmt *>(pHtThis)
                    ||  (static_txtattr_cast<const SwTxtCharFmt *>(pHtThis)
                                ->GetSortNumber() !=
                         static_cast<const SwTxtCharFmt *>(pHtLast)
                         static_txtattr_cast<const SwTxtCharFmt *>(pHtLast)
                                ->GetSortNumber())
                    ) // multiple CHARFMT on same range need distinct sortnr
                )
diff --git a/sw/source/core/txtnode/ndtxt.cxx b/sw/source/core/txtnode/ndtxt.cxx
index 5f9f95c..5979305 100644
--- a/sw/source/core/txtnode/ndtxt.cxx
+++ b/sw/source/core/txtnode/ndtxt.cxx
@@ -1406,7 +1406,8 @@ void lcl_CopyHint(
        {
            if( pOtherDoc != NULL )
            {
                static_cast<const SwTxtFld*>(pHt)->CopyTxtFld( static_cast<SwTxtFld*>(pNewHt) );
                static_txtattr_cast<const SwTxtFld*>(pHt)->CopyTxtFld(
                        static_txtattr_cast<SwTxtFld*>(pNewHt));
            }

            // Tabellenformel ??
@@ -1416,7 +1417,7 @@ void lcl_CopyHint(
            {
                // wandel die interne in eine externe Formel um
                const SwTableNode* const pDstTblNd =
                    static_cast<const SwTxtFld*>(pHt)->GetTxtNode().FindTableNode();
                    static_txtattr_cast<const SwTxtFld*>(pHt)->GetTxtNode().FindTableNode();
                if( pDstTblNd )
                {
                    SwTblField* const pTblFld =
@@ -1432,7 +1433,8 @@ void lcl_CopyHint(
    case RES_TXTATR_ANNOTATION :
        if( pOtherDoc != NULL )
        {
            static_cast<const SwTxtFld*>(pHt)->CopyTxtFld( static_cast<SwTxtFld*>(pNewHt) );
            static_txtattr_cast<const SwTxtFld*>(pHt)->CopyTxtFld(
                    static_txtattr_cast<SwTxtFld*>(pNewHt));
        }
        break;

@@ -1442,7 +1444,7 @@ void lcl_CopyHint(
        {
            // Beim Kopieren von TOXMarks(Client) in andere Dokumente
            // muss der Verzeichnis (Modify) ausgetauscht werden
            static_cast<SwTxtTOXMark*>(pNewHt)->CopyTOXMark( pOtherDoc );
            static_txtattr_cast<SwTxtTOXMark*>(pNewHt)->CopyTOXMark(pOtherDoc);
        }
        break;

@@ -1470,8 +1472,8 @@ void lcl_CopyHint(
            if( pOtherDoc && pDest && pDest->GetpSwpHints()
                && pDest->GetpSwpHints()->Contains( pNewHt ) )
            {
                const SwDoc* const pDoc = static_cast<const SwTxtINetFmt*>(pHt)
                    ->GetTxtNode().GetDoc();
                const SwDoc* const pDoc = static_txtattr_cast<
                        const SwTxtINetFmt*>(pHt)->GetTxtNode().GetDoc();
                if ( pDoc )
                {
                    const SwCharFmts* pCharFmts = pDoc->GetCharFmts();
@@ -1488,7 +1490,7 @@ void lcl_CopyHint(
            //JP 24.04.98: Bug 49753 - ein TextNode muss am Attribut
            //              gesetzt sein, damit die Vorlagen erzeugt
            //              werden koenne
            SwTxtINetFmt* const pINetHt = static_cast<SwTxtINetFmt*>(pNewHt);
            SwTxtINetFmt *const pINetHt = static_txtattr_cast<SwTxtINetFmt*>(pNewHt);
            if ( !pINetHt->GetpTxtNode() )
            {
                pINetHt->ChgTxtNode( pDest );
@@ -3030,7 +3032,7 @@ static void Replace0xFF(
                        if( bExpandFlds )
                        {
                            const OUString aExpand(
                                static_cast<SwTxtFld const*>(pAttr)->GetFmtFld().GetField()->ExpandField(true));
                                static_txtattr_cast<SwTxtFld const*>(pAttr)->GetFmtFld().GetField()->ExpandField(true));
                            rTxt.insert(nPos, aExpand);
                            nPos = nPos + aExpand.getLength();
                            nEndPos = nEndPos + aExpand.getLength();
@@ -3196,7 +3198,7 @@ bool SwTxtNode::GetExpandTxt( SwTxtNode& rDestNd, const SwIndex* pDestIdx,
                case RES_TXTATR_ANNOTATION:
                    {
                        OUString const aExpand(
                            static_cast<SwTxtFld const*>(pHt)->GetFmtFld().GetField()->ExpandField(true) );
                            static_txtattr_cast<SwTxtFld const*>(pHt)->GetFmtFld().GetField()->ExpandField(true));
                        if (!aExpand.isEmpty())
                        {
                            ++aDestIdx;     // dahinter einfuegen;
diff --git a/sw/source/core/txtnode/thints.cxx b/sw/source/core/txtnode/thints.cxx
index 5e49b5a..a38fae5 100644
--- a/sw/source/core/txtnode/thints.cxx
+++ b/sw/source/core/txtnode/thints.cxx
@@ -105,7 +105,7 @@ struct TxtAttrDeleter
        if (RES_TXTATR_META == pAttr->Which() ||
            RES_TXTATR_METAFIELD == pAttr->Which())
        {
            static_cast<SwTxtMeta *>(pAttr)->ChgTxtNode(0); // prevents ASSERT
            static_txtattr_cast<SwTxtMeta *>(pAttr)->ChgTxtNode(0); // prevents ASSERT
        }
        SwTxtAttr::Destroy( pAttr, m_rPool );
    }
@@ -237,19 +237,19 @@ MakeTxtAttrNesting(SwTxtNode & rNode, SwTxtAttrNesting & rNesting,
    {
        case RES_TXTATR_INETFMT:
        {
            static_cast<SwTxtINetFmt*>(pNew)->InitINetFmt(rNode);
            static_txtattr_cast<SwTxtINetFmt*>(pNew)->InitINetFmt(rNode);
            break;
        }
        case RES_TXTATR_CJK_RUBY:
        {
            static_cast<SwTxtRuby*>(pNew)->InitRuby(rNode);
            static_txtattr_cast<SwTxtRuby*>(pNew)->InitRuby(rNode);
            break;
        }
        default:
            OSL_FAIL("MakeTxtAttrNesting: what the hell is that?");
            break;
    }
    return static_cast<SwTxtAttrNesting*>(pNew);
    return static_txtattr_cast<SwTxtAttrNesting*>(pNew);
}

typedef ::std::vector<SwTxtAttrNesting *> NestList_t;
@@ -400,7 +400,7 @@ SwpHints::TryInsertNesting( SwTxtNode & rNode, SwTxtAttrNesting & rNewHint )
                        break;
                    case SPLIT_OTHER:
                        OverlappingExisting.push_back(
                            static_cast<SwTxtAttrNesting*>(pOther));
                            static_txtattr_cast<SwTxtAttrNesting*>(pOther));
                        break;
                    default:
                        OSL_FAIL("bad code monkey");
@@ -413,7 +413,7 @@ SwpHints::TryInsertNesting( SwTxtNode & rNode, SwTxtAttrNesting & rNewHint )
                {
                // ruby and hyperlink: if there is nesting, _overwrite_
                OverwrittenExisting.push_back(
                    static_cast<SwTxtAttrNesting*>(pOther));
                    static_txtattr_cast<SwTxtAttrNesting*>(pOther));
                }
                else if ((nNewStart == nOtherStart) && pOther->HasDummyChar())
                {
@@ -620,7 +620,10 @@ void SwpHints::BuildPortions( SwTxtNode& rNode, SwTxtAttr& rNewHint,
                SwTxtAttr* pNewAttr = MakeTxtAttr( *rNode.GetDoc(),
                        pOther->GetAttr(), nOtherStart, nThisStart );
                if ( RES_TXTATR_CHARFMT == pOther->Which() )
                    static_cast<SwTxtCharFmt*>(pNewAttr)->SetSortNumber( static_cast<SwTxtCharFmt*>(pOther)->GetSortNumber() );
                {
                    static_txtattr_cast<SwTxtCharFmt*>(pNewAttr)->SetSortNumber(
                        static_txtattr_cast<SwTxtCharFmt*>(pOther)->GetSortNumber() );
                }
                aInsDelHints.push_back( pNewAttr );

                NoteInHistory( pOther );
@@ -637,7 +640,10 @@ void SwpHints::BuildPortions( SwTxtNode& rNode, SwTxtAttr& rNewHint,
                SwTxtAttr* pNewAttr = MakeTxtAttr( *rNode.GetDoc(),
                        pOther->GetAttr(), nOtherStart, nThisEnd );
                if ( RES_TXTATR_CHARFMT == pOther->Which() )
                    static_cast<SwTxtCharFmt*>(pNewAttr)->SetSortNumber( static_cast<SwTxtCharFmt*>(pOther)->GetSortNumber() );
                {
                    static_txtattr_cast<SwTxtCharFmt*>(pNewAttr)->SetSortNumber(
                        static_txtattr_cast<SwTxtCharFmt*>(pOther)->GetSortNumber());
                }
                aInsDelHints.push_back( pNewAttr );

                NoteInHistory( pOther );
@@ -806,7 +812,7 @@ void SwpHints::BuildPortions( SwTxtNode& rNode, SwTxtAttr& rNewHint,
            {
                pNewAttr = MakeTxtAttr( *rNode.GetDoc(), rNewHint.GetAttr(),
                        nPorStart, nPorEnd );
                static_cast<SwTxtCharFmt*>(pNewAttr)->SetSortNumber( nCharStyleCount );
                static_txtattr_cast<SwTxtCharFmt*>(pNewAttr)->SetSortNumber(nCharStyleCount);
            }
        }
        else
@@ -1140,13 +1146,14 @@ void SwTxtNode::DestroyAttr( SwTxtAttr* pAttr )
        case RES_TXTATR_INPUTFIELD:
            if( !pDoc->IsInDtor() )
            {
                SwTxtFld *const pTxtFld(static_txtattr_cast<SwTxtFld*>(pAttr));
                // Wenn wir ein HiddenParaField sind, dann muessen wir
                // ggf. fuer eine Neuberechnung des Visible-Flags sorgen.
                const SwField* pFld = pAttr->GetFmtFld().GetField();

                //JP 06-08-95: DDE-Felder bilden eine Ausnahme
                OSL_ENSURE( RES_DDEFLD == pFld->GetTyp()->Which() ||
                        this == ((SwTxtFld*)pAttr)->GetpTxtNode(),
                        this == pTxtFld->GetpTxtNode(),
                        "Wo steht denn dieses Feld?" );

                // bestimmte Felder mussen am Doc das Calculations-Flag updaten
@@ -1163,16 +1170,16 @@ void SwTxtNode::DestroyAttr( SwTxtAttr* pAttr )
                case RES_DBNUMSETFLD:
                case RES_DBNEXTSETFLD:
                    if( !pDoc->getIDocumentFieldsAccess().IsNewFldLst() && GetNodes().IsDocNodes() )
                        pDoc->getIDocumentFieldsAccess().InsDelFldInFldLst( false, *(SwTxtFld*)pAttr );
                        pDoc->getIDocumentFieldsAccess().InsDelFldInFldLst(false, *pTxtFld);
                    break;
                case RES_DDEFLD:
                    if( GetNodes().IsDocNodes() &&
                        ((SwTxtFld*)pAttr)->GetpTxtNode() )
                    if (GetNodes().IsDocNodes() && pTxtFld->GetpTxtNode())
                        ((SwDDEFieldType*)pFld->GetTyp())->DecRefCnt();
                    break;
                case RES_POSTITFLD:
                    {
                        const_cast<SwFmtFld&>(pAttr->GetFmtFld()).Broadcast( SwFmtFldHint( &((SwTxtFld*)pAttr)->GetFmtFld(), SwFmtFldHintWhich::REMOVED ) );
                        const_cast<SwFmtFld&>(pAttr->GetFmtFld()).Broadcast(
                            SwFmtFldHint(&pTxtFld->GetFmtFld(), SwFmtFldHintWhich::REMOVED));
                        break;
                    }
                }
@@ -1190,7 +1197,7 @@ void SwTxtNode::DestroyAttr( SwTxtAttr* pAttr )

        case RES_TXTATR_META:
        case RES_TXTATR_METAFIELD:
            static_cast<SwTxtMeta*>(pAttr)->ChgTxtNode(0);
            static_txtattr_cast<SwTxtMeta*>(pAttr)->ChgTxtNode(0);
            break;

        default:
@@ -2921,7 +2928,7 @@ static void lcl_CheckSortNumber( const SwpHints& rHints, SwTxtCharFmt& rNewCharF

            if ( nOtherStart == nHtStart && nOtherEnd == nHtEnd )
            {
                nSortNumber = static_cast<const SwTxtCharFmt*>(pOtherHt)->GetSortNumber() + 1;
                nSortNumber = static_txtattr_cast<const SwTxtCharFmt*>(pOtherHt)->GetSortNumber() + 1;
            }
        }
    }
@@ -2968,7 +2975,7 @@ bool SwpHints::TryInsertHint(
        if ( SfxItemState::SET == pFmt->GetItemState( RES_CHRATR_HIDDEN, true, &pItem ) )
            rNode.SetCalcHiddenCharFlags();

        ((SwTxtCharFmt*)pHint)->ChgTxtNode( &rNode );
        static_txtattr_cast<SwTxtCharFmt*>(pHint)->ChgTxtNode( &rNode );
        break;
    }
    // #i75430# Recalc hidden flags if necessary
@@ -3003,17 +3010,18 @@ bool SwpHints::TryInsertHint(
        break;
    }
    case RES_TXTATR_INETFMT:
        static_cast<SwTxtINetFmt*>(pHint)->InitINetFmt(rNode);
        static_txtattr_cast<SwTxtINetFmt*>(pHint)->InitINetFmt(rNode);
        break;

    case RES_TXTATR_FIELD:
    case RES_TXTATR_ANNOTATION:
    case RES_TXTATR_INPUTFIELD:
        {
            bool bDelFirst = 0 != ((SwTxtFld*)pHint)->GetpTxtNode();
            ((SwTxtFld*)pHint)->ChgTxtNode( &rNode );
            SwTxtFld *const pTxtFld(static_txtattr_cast<SwTxtFld*>(pHint));
            bool bDelFirst = 0 != pTxtFld->GetpTxtNode();
            pTxtFld->ChgTxtNode( &rNode );
            SwDoc* pDoc = rNode.GetDoc();
            const SwField* pFld = ((SwTxtFld*)pHint)->GetFmtFld().GetField();
            const SwField* pFld = pTxtFld->GetFmtFld().GetField();

            if( !pDoc->getIDocumentFieldsAccess().IsNewFldLst() )
            {
@@ -3029,9 +3037,9 @@ bool SwpHints::TryInsertHint(
                case RES_DBNEXTSETFLD:
                    {
                        if( bDelFirst )
                            pDoc->getIDocumentFieldsAccess().InsDelFldInFldLst( false, *(SwTxtFld*)pHint );
                            pDoc->getIDocumentFieldsAccess().InsDelFldInFldLst(false, *pTxtFld);
                        if( rNode.GetNodes().IsDocNodes() )
                            pDoc->getIDocumentFieldsAccess().InsDelFldInFldLst( true, *(SwTxtFld*)pHint );
                            pDoc->getIDocumentFieldsAccess().InsDelFldInFldLst(true, *pTxtFld);
                    }
                    break;
                case RES_DDEFLD:
@@ -3057,7 +3065,7 @@ bool SwpHints::TryInsertHint(
                                    pDoc->getIDocumentFieldsAccess().InsertFldType( *pFld->GetTyp() );
                        if( pFldType != pFld->GetTyp() )
                        {
                            SwFmtFld* pFmtFld = (SwFmtFld*)&((SwTxtFld*)pHint)->GetFmtFld();
                            SwFmtFld* pFmtFld = const_cast<SwFmtFld*>(&pTxtFld->GetFmtFld());
                            pFmtFld->RegisterToFieldType( *pFldType );
                            pFmtFld->GetField()->ChgTyp( pFldType );
                        }
@@ -3076,7 +3084,10 @@ bool SwpHints::TryInsertHint(

                case RES_POSTITFLD:
                    if ( pDoc->GetDocShell() )
                        pDoc->GetDocShell()->Broadcast( SwFmtFldHint( &((SwTxtFld*)pHint)->GetFmtFld(), SwFmtFldHintWhich::INSERTED ) );
                    {
                        pDoc->GetDocShell()->Broadcast( SwFmtFldHint(
                            &pTxtFld->GetFmtFld(), SwFmtFldHintWhich::INSERTED));
                    }
                    break;
                }
                if( bInsFldType )
@@ -3088,7 +3099,7 @@ bool SwpHints::TryInsertHint(
        ((SwTxtFtn*)pHint)->ChgTxtNode( &rNode );
        break;
    case RES_TXTATR_REFMARK:
        ((SwTxtRefMark*)pHint)->ChgTxtNode( &rNode );
        static_txtattr_cast<SwTxtRefMark*>(pHint)->ChgTxtNode( &rNode );
        if( rNode.GetNodes().IsDocNodes() )
        {
            // search for a reference with the same name
@@ -3136,16 +3147,16 @@ bool SwpHints::TryInsertHint(
        }
        break;
    case RES_TXTATR_TOXMARK:
        ((SwTxtTOXMark*)pHint)->ChgTxtNode( &rNode );
        static_txtattr_cast<SwTxtTOXMark*>(pHint)->ChgTxtNode( &rNode );
        break;

    case RES_TXTATR_CJK_RUBY:
        static_cast<SwTxtRuby*>(pHint)->InitRuby(rNode);
        static_txtattr_cast<SwTxtRuby*>(pHint)->InitRuby(rNode);
        break;

    case RES_TXTATR_META:
    case RES_TXTATR_METAFIELD:
        static_cast<SwTxtMeta *>(pHint)->ChgTxtNode( &rNode );
        static_txtattr_cast<SwTxtMeta *>(pHint)->ChgTxtNode( &rNode );
        break;

    case RES_CHRATR_HIDDEN:
@@ -3204,7 +3215,7 @@ bool SwpHints::TryInsertHint(
    if (pHint->IsNesting())
    {
        const bool bRet(
            TryInsertNesting(rNode, *static_cast<SwTxtAttrNesting*>(pHint)));
            TryInsertNesting(rNode, *static_txtattr_cast<SwTxtAttrNesting*>(pHint)));
        if (!bRet) return false;
    }
    // Currently REFMARK and TOXMARK have OverlapAllowed set to true.
@@ -3246,7 +3257,7 @@ bool SwpHints::TryInsertHint(
        {
            // #i82989# Check sort numbers in NoHintAdjustMode
            if ( RES_TXTATR_CHARFMT == nWhich )
                lcl_CheckSortNumber( *this, *static_cast<SwTxtCharFmt*>(pHint) );
                lcl_CheckSortNumber(*this, *static_txtattr_cast<SwTxtCharFmt*>(pHint));

            SwpHintsArray::Insert( pHint );
            NoteInHistory( pHint, true );
@@ -3281,13 +3292,14 @@ void SwpHints::DeleteAtPos( const size_t nPos )

    if( pHint->Which() == RES_TXTATR_FIELD )
    {
        const SwFieldType* pFldTyp = ((SwTxtFld*)pHint)->GetFmtFld().GetField()->GetTyp();
        SwTxtFld *const pTxtFld(static_txtattr_cast<SwTxtFld*>(pHint));
        const SwFieldType* pFldTyp = pTxtFld->GetFmtFld().GetField()->GetTyp();
        if( RES_DDEFLD == pFldTyp->Which() )
        {
            const SwTxtNode* pNd = ((SwTxtFld*)pHint)->GetpTxtNode();
            const SwTxtNode* pNd = pTxtFld->GetpTxtNode();
            if( pNd && pNd->GetNodes().IsDocNodes() )
                ((SwDDEFieldType*)pFldTyp)->DecRefCnt();
            ((SwTxtFld*)pHint)->ChgTxtNode( 0 );
            pTxtFld->ChgTxtNode(0);
        }
        else if ( m_bHasHiddenParaField &&
                 RES_HIDDENPARAFLD == pFldTyp->Which() )
@@ -3297,7 +3309,9 @@ void SwpHints::DeleteAtPos( const size_t nPos )
    }
    else if ( pHint->Which() == RES_TXTATR_ANNOTATION )
    {
        const_cast<SwFmtFld&>(((SwTxtFld*)pHint)->GetFmtFld()).Broadcast( SwFmtFldHint( &((SwTxtFld*)pHint)->GetFmtFld(), SwFmtFldHintWhich::REMOVED ) );
        SwTxtFld *const pTxtFld(static_txtattr_cast<SwTxtFld*>(pHint));
        const_cast<SwFmtFld&>(pTxtFld->GetFmtFld()).Broadcast(
            SwFmtFldHint(&pTxtFld->GetFmtFld(), SwFmtFldHintWhich::REMOVED));
    }

    CalcFlags();
diff --git a/sw/source/core/txtnode/txtatr2.cxx b/sw/source/core/txtnode/txtatr2.cxx
index 9f5856f..78edcb4 100644
--- a/sw/source/core/txtnode/txtatr2.cxx
+++ b/sw/source/core/txtnode/txtatr2.cxx
@@ -40,7 +40,8 @@ TYPEINIT1(SwTxtRuby,SwClient);

SwTxtCharFmt::SwTxtCharFmt( SwFmtCharFmt& rAttr,
                    sal_Int32 nStt, sal_Int32 nEnde )
    : SwTxtAttrEnd( rAttr, nStt, nEnde )
    : SwTxtAttr( rAttr, nStt )
    , SwTxtAttrEnd( rAttr, nStt, nEnde )
    , m_pTxtNode( 0 )
    , m_nSortNumber( 0 )
{
@@ -84,7 +85,8 @@ bool SwTxtCharFmt::GetInfo( SfxPoolItem& rInfo ) const

SwTxtAttrNesting::SwTxtAttrNesting( SfxPoolItem & i_rAttr,
            const sal_Int32 i_nStart, const sal_Int32 i_nEnd )
    : SwTxtAttrEnd( i_rAttr, i_nStart, i_nEnd )
    : SwTxtAttr( i_rAttr, i_nStart )
    , SwTxtAttrEnd( i_rAttr, i_nStart, i_nEnd )
{
    SetDontExpand( true );  // never expand this attribute
    // lock the expand flag: simple guarantee that nesting will not be
@@ -100,7 +102,8 @@ SwTxtAttrNesting::~SwTxtAttrNesting()

SwTxtINetFmt::SwTxtINetFmt( SwFmtINetFmt& rAttr,
                            sal_Int32 nStart, sal_Int32 nEnd )
    : SwTxtAttrNesting( rAttr, nStart, nEnd )
    : SwTxtAttr( rAttr, nStart )
    , SwTxtAttrNesting( rAttr, nStart, nEnd )
    , SwClient( 0 )
    , m_pTxtNode( 0 )
    , m_bVisited( false )
@@ -202,7 +205,8 @@ bool SwTxtINetFmt::IsProtect( ) const

SwTxtRuby::SwTxtRuby( SwFmtRuby& rAttr,
                      sal_Int32 nStart, sal_Int32 nEnd )
    : SwTxtAttrNesting( rAttr, nStart, nEnd )
    : SwTxtAttr( rAttr, nStart )
    , SwTxtAttrNesting( rAttr, nStart, nEnd )
    , SwClient( 0 )
    , m_pTxtNode( 0 )
{
@@ -305,7 +309,8 @@ SwTxtMeta::CreateTxtMeta(

SwTxtMeta::SwTxtMeta( SwFmtMeta & i_rAttr,
        const sal_Int32 i_nStart, const sal_Int32 i_nEnd )
    : SwTxtAttrNesting( i_rAttr, i_nStart, i_nEnd )
    : SwTxtAttr( i_rAttr, i_nStart )
    , SwTxtAttrNesting( i_rAttr, i_nStart, i_nEnd )
{
    i_rAttr.SetTxtAttr( this );
    SetHasDummyChar(true);
diff --git a/sw/source/core/txtnode/txtedt.cxx b/sw/source/core/txtnode/txtedt.cxx
index a4616ba..d094b83 100644
--- a/sw/source/core/txtnode/txtedt.cxx
+++ b/sw/source/core/txtnode/txtedt.cxx
@@ -609,7 +609,7 @@ void SwTxtNode::RstTxtAttr(
                        {
                            SwTxtCharFmt* pCharFmt = dynamic_cast<SwTxtCharFmt*>(pHt);
                            if ( pCharFmt )
                                static_cast<SwTxtCharFmt*>(pNew)->SetSortNumber( pCharFmt->GetSortNumber() );
                                static_txtattr_cast<SwTxtCharFmt*>(pNew)->SetSortNumber(pCharFmt->GetSortNumber());

                            InsertHint( pNew,
                                nsSetAttrMode::SETATTR_NOHINTADJUST );
diff --git a/sw/source/core/undo/rolbck.cxx b/sw/source/core/undo/rolbck.cxx
index 3366de0..a8429e8 100644
--- a/sw/source/core/undo/rolbck.cxx
+++ b/sw/source/core/undo/rolbck.cxx
@@ -1033,15 +1033,15 @@ void SwHistory::Add( SwTxtAttr* pHint, sal_uLong nNodeIdx, bool bNewAttr )
            case RES_TXTATR_FIELD:
            case RES_TXTATR_ANNOTATION:
                pHt = new SwHistorySetTxtFld(
                            static_cast<SwTxtFld*>(pHint), nNodeIdx );
                        static_txtattr_cast<SwTxtFld*>(pHint), nNodeIdx);
                break;
            case RES_TXTATR_TOXMARK:
                pHt = new SwHistorySetTOXMark(
                            static_cast<SwTxtTOXMark*>(pHint), nNodeIdx );
                        static_txtattr_cast<SwTxtTOXMark*>(pHint), nNodeIdx);
                break;
            case RES_TXTATR_REFMARK:
                pHt = new SwHistorySetRefMark(
                            static_cast<SwTxtRefMark*>(pHint), nNodeIdx );
                        static_txtattr_cast<SwTxtRefMark*>(pHint), nNodeIdx);
                break;
            default:
                pHt = new SwHistorySetTxt(
diff --git a/sw/source/core/unocore/unoportenum.cxx b/sw/source/core/unocore/unoportenum.cxx
index 51fa874..4d74772 100644
--- a/sw/source/core/unocore/unoportenum.cxx
+++ b/sw/source/core/unocore/unoportenum.cxx
@@ -522,7 +522,7 @@ lcl_InsertRubyPortion(
    const SwTxtAttr & rAttr, const bool bEnd)
{
    SwXTextPortion* pPortion = new SwXTextPortion(pUnoCrsr,
            static_cast<const SwTxtRuby&>(rAttr), xParent, bEnd);
            static_txtattr_cast<const SwTxtRuby&>(rAttr), xParent, bEnd);
    rPortions.push_back(pPortion);
    pPortion->SetCollapsed(rAttr.End() ? false : true);
}
diff --git a/sw/source/filter/ascii/ascatr.cxx b/sw/source/filter/ascii/ascatr.cxx
index 7bea087..f5e497f 100644
--- a/sw/source/filter/ascii/ascatr.cxx
+++ b/sw/source/filter/ascii/ascatr.cxx
@@ -137,7 +137,8 @@ bool SwASC_AttrIter::OutAttr( sal_Int32 nSwPos )
                case RES_TXTATR_FIELD:
                case RES_TXTATR_ANNOTATION:
                case RES_TXTATR_INPUTFIELD:
                    sOut = static_cast<SwTxtFld const*>(pHt)->GetFmtFld().GetField()->ExpandField(true);
                    sOut = static_txtattr_cast<SwTxtFld const*>(pHt)
                            ->GetFmtFld().GetField()->ExpandField(true);
                    break;

                case RES_TXTATR_FTN: