Resolves: #i123988# assure that hyperlink attribute...

(<SwFmtINetFmt>) always provides character style names for visited and
unvisited state

(cherry picked from commit c15b814d6e8ea429287def9a0bf3ac71db414119)

Conflicts:
	sw/inc/fmtinfmt.hxx
	sw/source/core/doc/doctxm.cxx
	sw/source/core/txtnode/fmtatr2.cxx
	sw/source/core/txtnode/txtatr2.cxx
	sw/source/filter/ww8/ww8atr.cxx
	sw/source/filter/ww8/ww8par5.cxx
	sw/source/ui/chrdlg/chardlg.cxx
	sw/source/ui/shells/txtattr.cxx

Change-Id: Ib23d55a299d0d78a2eba18dd5c1c0327c816da56
diff --git a/sw/inc/fmtinfmt.hxx b/sw/inc/fmtinfmt.hxx
index fbdaf2e..2179751 100644
--- a/sw/inc/fmtinfmt.hxx
+++ b/sw/inc/fmtinfmt.hxx
@@ -33,15 +33,15 @@ class SW_DLLPUBLIC SwFmtINetFmt: public SfxPoolItem
{
    friend class SwTxtINetFmt;

    OUString aURL;                  ///< URL.
    OUString aTargetFrame;          ///< Target frame for URL.
    OUString aINetFmt;
    OUString aVisitedFmt;
    OUString aName;                 ///< Name of the link.
    SvxMacroTableDtor* pMacroTbl;
    SwTxtINetFmt* pTxtAttr;         ///< My TextAttribute.
    sal_uInt16 nINetId;
    sal_uInt16 nVisitedId;
    OUString msURL;                  ///< URL.
    OUString msTargetFrame;          ///< Target frame for URL.
    OUString msINetFmtName;
    OUString msVisitedFmtName;
    OUString msHyperlinkName;        ///< Name of the link.
    SvxMacroTableDtor* mpMacroTbl;
    SwTxtINetFmt* mpTxtAttr;         ///< My TextAttribute.
    sal_uInt16 mnINetFmtId;
    sal_uInt16 mnVisitedFmtId;
public:
    SwFmtINetFmt( const OUString& rURL, const OUString& rTarget );
    SwFmtINetFmt( const SwFmtINetFmt& rAttr );
@@ -65,34 +65,81 @@ public:
                                        sal_uInt8 nMemberId = 0 );


    const SwTxtINetFmt* GetTxtINetFmt() const   { return pTxtAttr; }
    SwTxtINetFmt* GetTxtINetFmt()               { return pTxtAttr; }
    const SwTxtINetFmt* GetTxtINetFmt() const
    {
        return mpTxtAttr;
    }
    SwTxtINetFmt* GetTxtINetFmt()
    {
        return mpTxtAttr;
    }

    OUString GetValue() const               { return aURL; }
    const OUString& GetValue() const
    {
        return msURL;
    }

    OUString GetName() const                { return aName; }
    void SetName( const OUString& rNm )     { aName = rNm; }
    const OUString& GetName() const
    {
        return msHyperlinkName;
    }
    void SetName( const OUString& rNm )
    {
        msHyperlinkName = rNm;
    }

    OUString GetTargetFrame() const         { return aTargetFrame; }
    const OUString& GetTargetFrame() const
    {
        return msTargetFrame;
    }

    OUString GetINetFmt() const             { return aINetFmt; }
    void SetINetFmt( const OUString& rNm )  { aINetFmt = rNm; }
    void SetINetFmtAndId(
            const OUString& rNm,
            const sal_uInt16 nId )
    {
        msINetFmtName = rNm;
        mnINetFmtId = nId;
    }

    OUString GetVisitedFmt() const            { return aVisitedFmt; }
    void SetVisitedFmt( const OUString& rNm ) { aVisitedFmt = rNm; }
    const OUString& GetINetFmt() const
    {
        return msINetFmtName;
    }

    sal_uInt16 GetINetFmtId() const             { return nINetId; }
    void SetINetFmtId( sal_uInt16 nNew )        { nINetId = nNew; }
    sal_uInt16 GetINetFmtId() const
    {
        return mnINetFmtId;
    }

    sal_uInt16 GetVisitedFmtId() const          { return nVisitedId; }
    void SetVisitedFmtId( sal_uInt16 nNew )     { nVisitedId = nNew; }
    void SetVisitedFmtAndId(
            const OUString& rNm,
            const sal_uInt16 nId )
    {
        msVisitedFmtName = rNm;
        mnVisitedFmtId = nId;
    }

    const OUString& GetVisitedFmt() const
    {
        return msVisitedFmtName;
    }

    sal_uInt16 GetVisitedFmtId() const
    {
        return mnVisitedFmtId;
    }

    /// Set a new MacroTable or clear the current one.
    void SetMacroTbl( const SvxMacroTableDtor* pTbl = 0 );
    const SvxMacroTableDtor* GetMacroTbl() const    { return pMacroTbl; }
    const SvxMacroTableDtor* GetMacroTbl() const
    {
        return mpMacroTbl;
    }

    /// Macro getter and setter.
    void SetMacro( sal_uInt16 nEvent, const SvxMacro& rMacro );
    void SetMacro(
            sal_uInt16 nEvent,
            const SvxMacro& rMacro );
    const SvxMacro* GetMacro( sal_uInt16 nEvent ) const;
};

diff --git a/sw/source/core/doc/doctxm.cxx b/sw/source/core/doc/doctxm.cxx
index 1fb4254..2080812 100644
--- a/sw/source/core/doc/doctxm.cxx
+++ b/sw/source/core/doc/doctxm.cxx
@@ -1796,20 +1796,12 @@ void SwTOXBaseSection::GenerateText( sal_uInt16 nArrayIdx,
                    }
                    LinkStruct* pNewLink = new LinkStruct(sURL, nLinkStartPosition,
                                                    nEnd);
                    pNewLink->aINetFmt.SetVisitedFmt(sLinkCharacterStyle);
                    pNewLink->aINetFmt.SetINetFmt(sLinkCharacterStyle);
                    if(!sLinkCharacterStyle.isEmpty())
                    {
                        sal_uInt16 nPoolId =
                            SwStyleNameMapper::GetPoolIdFromUIName( sLinkCharacterStyle, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT );
                        pNewLink->aINetFmt.SetVisitedFmtId(nPoolId);
                        pNewLink->aINetFmt.SetINetFmtId(nPoolId);
                    }
                    else
                    {
                        pNewLink->aINetFmt.SetVisitedFmtId(USHRT_MAX);
                        pNewLink->aINetFmt.SetINetFmtId(USHRT_MAX);
                    }
                    const sal_uInt16 nPoolId =
                            sLinkCharacterStyle.isEmpty()
                            ? USHRT_MAX
                            : SwStyleNameMapper::GetPoolIdFromUIName( sLinkCharacterStyle, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT );
                    pNewLink->aINetFmt.SetVisitedFmtAndId( sLinkCharacterStyle, nPoolId );
                    pNewLink->aINetFmt.SetINetFmtAndId( sLinkCharacterStyle, nPoolId );
                    aLinkArr.push_back(pNewLink);
                    nLinkStartPosition = -1;
                    sLinkCharacterStyle = "";
diff --git a/sw/source/core/txtnode/fmtatr2.cxx b/sw/source/core/txtnode/fmtatr2.cxx
index cb3c33f..a6680ac 100644
--- a/sw/source/core/txtnode/fmtatr2.cxx
+++ b/sw/source/core/txtnode/fmtatr2.cxx
@@ -18,7 +18,8 @@
 */


#include "hintids.hxx"
#include <hintids.hxx>
#include <poolfmt.hxx>
#include "unomid.h"

#include <basic/sbxvar.hxx>
@@ -178,43 +179,53 @@ bool SwFmtAutoFmt::PutValue( const uno::Any& , sal_uInt8 )
*************************************************************************/

SwFmtINetFmt::SwFmtINetFmt()
    : SfxPoolItem( RES_TXTATR_INETFMT ),
    pMacroTbl( 0 ),
    pTxtAttr( 0 ),
    nINetId( 0 ),
    nVisitedId( 0 )
    : SfxPoolItem( RES_TXTATR_INETFMT )
    , msURL()
    , msTargetFrame()
    , msINetFmtName()
    , msVisitedFmtName()
    , msHyperlinkName()
    , mpMacroTbl( 0 )
    , mpTxtAttr( 0 )
    , mnINetFmtId( 0 )
    , mnVisitedFmtId( 0 )
{}

SwFmtINetFmt::SwFmtINetFmt( const OUString& rURL, const OUString& rTarget )
    : SfxPoolItem( RES_TXTATR_INETFMT ),
    aURL( rURL ),
    aTargetFrame( rTarget ),
    pMacroTbl( 0 ),
    pTxtAttr( 0 ),
    nINetId( 0 ),
    nVisitedId( 0 )
    : SfxPoolItem( RES_TXTATR_INETFMT )
    , msURL( rURL )
    , msTargetFrame( rTarget )
    , msINetFmtName()
    , msVisitedFmtName()
    , msHyperlinkName()
    , mpMacroTbl( 0 )
    , mpTxtAttr( 0 )
    , mnINetFmtId( RES_POOLCHR_INET_NORMAL )
    , mnVisitedFmtId( RES_POOLCHR_INET_VISIT )
{
    SwStyleNameMapper::FillUIName( mnINetFmtId, msINetFmtName );
    SwStyleNameMapper::FillUIName( mnVisitedFmtId, msVisitedFmtName );
}

SwFmtINetFmt::SwFmtINetFmt( const SwFmtINetFmt& rAttr )
    : SfxPoolItem( RES_TXTATR_INETFMT ),
    aURL( rAttr.GetValue() ),
    aTargetFrame( rAttr.aTargetFrame ),
    aINetFmt( rAttr.aINetFmt ),
    aVisitedFmt( rAttr.aVisitedFmt ),
    aName( rAttr.aName ),
    pMacroTbl( 0 ),
    pTxtAttr( 0 ),
    nINetId( rAttr.nINetId ),
    nVisitedId( rAttr.nVisitedId )
    : SfxPoolItem( RES_TXTATR_INETFMT )
    , msURL( rAttr.GetValue() )
    , msTargetFrame( rAttr.msTargetFrame )
    , msINetFmtName( rAttr.msINetFmtName )
    , msVisitedFmtName( rAttr.msVisitedFmtName )
    , msHyperlinkName( rAttr.msHyperlinkName )
    , mpMacroTbl( 0 )
    , mpTxtAttr( 0 )
    , mnINetFmtId( rAttr.mnINetFmtId )
    , mnVisitedFmtId( rAttr.mnVisitedFmtId )
{
    if( rAttr.GetMacroTbl() )
        pMacroTbl = new SvxMacroTableDtor( *rAttr.GetMacroTbl() );
    if ( rAttr.GetMacroTbl() )
        mpMacroTbl = new SvxMacroTableDtor( *rAttr.GetMacroTbl() );
}

SwFmtINetFmt::~SwFmtINetFmt()
{
    delete pMacroTbl;
    delete mpMacroTbl;
}


@@ -223,24 +234,24 @@ int SwFmtINetFmt::operator==( const SfxPoolItem& rAttr ) const
{
    OSL_ENSURE( SfxPoolItem::operator==( rAttr ), "keine gleichen Attribute" );
    bool bRet = SfxPoolItem::operator==( (SfxPoolItem&) rAttr )
                && aURL == ((SwFmtINetFmt&)rAttr).aURL
                && aName == ((SwFmtINetFmt&)rAttr).aName
                && aTargetFrame == ((SwFmtINetFmt&)rAttr).aTargetFrame
                && aINetFmt == ((SwFmtINetFmt&)rAttr).aINetFmt
                && aVisitedFmt == ((SwFmtINetFmt&)rAttr).aVisitedFmt
                && nINetId == ((SwFmtINetFmt&)rAttr).nINetId
                && nVisitedId == ((SwFmtINetFmt&)rAttr).nVisitedId;
                && msURL == ((SwFmtINetFmt&)rAttr).msURL
                && msHyperlinkName == ((SwFmtINetFmt&)rAttr).msHyperlinkName
                && msTargetFrame == ((SwFmtINetFmt&)rAttr).msTargetFrame
                && msINetFmtName == ((SwFmtINetFmt&)rAttr).msINetFmtName
                && msVisitedFmtName == ((SwFmtINetFmt&)rAttr).msVisitedFmtName
                && mnINetFmtId == ((SwFmtINetFmt&)rAttr).mnINetFmtId
                && mnVisitedFmtId == ((SwFmtINetFmt&)rAttr).mnVisitedFmtId;

    if( !bRet )
        return sal_False;

    const SvxMacroTableDtor* pOther = ((SwFmtINetFmt&)rAttr).pMacroTbl;
    if( !pMacroTbl )
    const SvxMacroTableDtor* pOther = ((SwFmtINetFmt&)rAttr).mpMacroTbl;
    if( !mpMacroTbl )
        return ( !pOther || pOther->empty() );
    if( !pOther )
        return pMacroTbl->empty();
        return mpMacroTbl->empty();

    const SvxMacroTableDtor& rOwn = *pMacroTbl;
    const SvxMacroTableDtor& rOwn = *mpMacroTbl;
    const SvxMacroTableDtor& rOther = *pOther;

    return rOwn == rOther;
@@ -259,23 +270,23 @@ void SwFmtINetFmt::SetMacroTbl( const SvxMacroTableDtor* pNewTbl )
{
    if( pNewTbl )
    {
        if( pMacroTbl )
            *pMacroTbl = *pNewTbl;
        if( mpMacroTbl )
            *mpMacroTbl = *pNewTbl;
        else
            pMacroTbl = new SvxMacroTableDtor( *pNewTbl );
            mpMacroTbl = new SvxMacroTableDtor( *pNewTbl );
    }
    else
        delete pMacroTbl, pMacroTbl = 0;
        delete mpMacroTbl, mpMacroTbl = 0;
}



void SwFmtINetFmt::SetMacro( sal_uInt16 nEvent, const SvxMacro& rMacro )
{
    if( !pMacroTbl )
        pMacroTbl = new SvxMacroTableDtor;
    if( !mpMacroTbl )
        mpMacroTbl = new SvxMacroTableDtor;

     pMacroTbl->Insert( nEvent, rMacro );
    mpMacroTbl->Insert( nEvent, rMacro );
}


@@ -283,8 +294,8 @@ void SwFmtINetFmt::SetMacro( sal_uInt16 nEvent, const SvxMacro& rMacro )
const SvxMacro* SwFmtINetFmt::GetMacro( sal_uInt16 nEvent ) const
{
    const SvxMacro* pRet = 0;
    if( pMacroTbl && pMacroTbl->IsKeyValid( nEvent ) )
        pRet = pMacroTbl->Get( nEvent );
    if( mpMacroTbl && mpMacroTbl->IsKeyValid( nEvent ) )
        pRet = mpMacroTbl->Get( nEvent );
    return pRet;
}

@@ -296,19 +307,19 @@ bool SwFmtINetFmt::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const
    switch(nMemberId)
    {
        case MID_URL_URL:
            rVal <<= aURL;
            rVal <<= msURL;
        break;
        case MID_URL_TARGET:
            rVal <<= aTargetFrame;
            rVal <<= msTargetFrame;
        break;
        case MID_URL_HYPERLINKNAME:
            rVal <<= aName;
            rVal <<= msHyperlinkName;
        break;
        case MID_URL_VISITED_FMT:
        {
            OUString sVal = aVisitedFmt;
            if (sVal.isEmpty() && nVisitedId != 0)
                SwStyleNameMapper::FillUIName(nVisitedId, sVal);
            OUString sVal = msVisitedFmtName;
            if (sVal.isEmpty() && mnVisitedFmtId != 0)
                SwStyleNameMapper::FillUIName(mnVisitedFmtId, sVal);
            if (!sVal.isEmpty())
                SwStyleNameMapper::FillProgName(sVal, sVal,
                        nsSwGetPoolIdFromName::GET_POOLID_CHRFMT, true);
@@ -317,9 +328,9 @@ bool SwFmtINetFmt::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const
        break;
        case MID_URL_UNVISITED_FMT:
        {
            OUString sVal = aINetFmt;
            if (sVal.isEmpty() && nINetId != 0)
                SwStyleNameMapper::FillUIName(nINetId, sVal);
            OUString sVal = msVisitedFmtName;
            if (sVal.isEmpty() && mnVisitedFmtId != 0)
                SwStyleNameMapper::FillUIName(mnVisitedFmtId, sVal);
            if (!sVal.isEmpty())
                SwStyleNameMapper::FillProgName(sVal, sVal,
                        nsSwGetPoolIdFromName::GET_POOLID_CHRFMT, true);
@@ -380,13 +391,13 @@ bool SwFmtINetFmt::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId  )
        switch(nMemberId)
        {
            case MID_URL_URL:
                rVal >>= aURL;
                rVal >>= msURL;
                break;
            case MID_URL_TARGET:
                rVal >>= aTargetFrame;
                rVal >>= msTargetFrame;
                break;
            case MID_URL_HYPERLINKNAME:
                rVal >>= aName;
                rVal >>= msHyperlinkName;
                break;
            case MID_URL_VISITED_FMT:
            {
@@ -394,8 +405,8 @@ bool SwFmtINetFmt::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId  )
                rVal >>= sVal;
                OUString aString;
                SwStyleNameMapper::FillUIName( sVal, aString, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT, true );
                aVisitedFmt = aString;
                nVisitedId = SwStyleNameMapper::GetPoolIdFromUIName( aVisitedFmt,
                msVisitedFmtName = aString;
                mnVisitedFmtId = SwStyleNameMapper::GetPoolIdFromUIName( msVisitedFmtName,
                                               nsSwGetPoolIdFromName::GET_POOLID_CHRFMT );
            }
            break;
@@ -405,8 +416,8 @@ bool SwFmtINetFmt::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId  )
                rVal >>= sVal;
                OUString aString;
                SwStyleNameMapper::FillUIName( sVal, aString, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT, true );
                aINetFmt = aString;
                nINetId = SwStyleNameMapper::GetPoolIdFromUIName( aINetFmt, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT );
                msINetFmtName = aString;
                mnINetFmtId = SwStyleNameMapper::GetPoolIdFromUIName( msINetFmtName, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT );
            }
            break;
            default:
diff --git a/sw/source/core/txtnode/txtatr2.cxx b/sw/source/core/txtnode/txtatr2.cxx
index 85208c9..998c592 100644
--- a/sw/source/core/txtnode/txtatr2.cxx
+++ b/sw/source/core/txtnode/txtatr2.cxx
@@ -117,7 +117,7 @@ SwTxtINetFmt::SwTxtINetFmt( SwFmtINetFmt& rAttr,
    , m_bVisited( false )
    , m_bVisitedValid( false )
{
    rAttr.pTxtAttr  = this;
    rAttr.mpTxtAttr  = this;
    SetCharFmtAttr( true );
}

@@ -130,7 +130,7 @@ SwCharFmt* SwTxtINetFmt::GetCharFmt()
    const SwFmtINetFmt& rFmt = SwTxtAttrEnd::GetINetFmt();
    SwCharFmt* pRet = NULL;

    if( !rFmt.GetValue().isEmpty() )
    if (!rFmt.GetValue().isEmpty())
    {
        const SwDoc* pDoc = GetTxtNode().GetDoc();
        if( !IsVisitedValid() )
@@ -138,38 +138,38 @@ SwCharFmt* SwTxtINetFmt::GetCharFmt()
            SetVisited( pDoc->IsVisitedURL( rFmt.GetValue() ) );
            SetVisitedValid( true );
        }
        sal_uInt16 nId;
        const OUString rStr = IsVisited() ? rFmt.GetVisitedFmt()
                                           : rFmt.GetINetFmt();
        if( !rStr.isEmpty() )
            nId = IsVisited() ? rFmt.GetVisitedFmtId() : rFmt.GetINetFmtId();
        else
            nId = static_cast<sal_uInt16>(IsVisited() ? RES_POOLCHR_INET_VISIT : RES_POOLCHR_INET_NORMAL);

        const sal_uInt16 nId = IsVisited() ? rFmt.GetVisitedFmtId() : rFmt.GetINetFmtId();
        const OUString& rStr = IsVisited() ? rFmt.GetVisitedFmt() : rFmt.GetINetFmt();
        if (rStr.isEmpty())
        {
            OSL_ENSURE( false, "<SwTxtINetFmt::GetCharFmt()> - missing character format at hyperlink attribute");
        }

        // JP 10.02.2000, Bug 72806: dont modify the doc for getting the
        //      correct charstyle.
        bool bResetMod = !pDoc->IsModified();
        Link aOle2Lnk;
        if( bResetMod )
        if ( bResetMod )
        {
            aOle2Lnk = pDoc->GetOle2Link();
            ((SwDoc*)pDoc)->SetOle2Link( Link() );
            ( (SwDoc*) pDoc )->SetOle2Link( Link() );
        }

        pRet = IsPoolUserFmt( nId )
                ? ((SwDoc*)pDoc)->FindCharFmtByName( rStr )
                : ((SwDoc*)pDoc)->GetCharFmtFromPool( nId );
               ? ( (SwDoc*) pDoc )->FindCharFmtByName( rStr )
               : ( (SwDoc*) pDoc )->GetCharFmtFromPool( nId );

        if( bResetMod )
        if ( bResetMod )
        {
            ((SwDoc*)pDoc)->ResetModified();
            ((SwDoc*)pDoc)->SetOle2Link( aOle2Lnk );
            ( (SwDoc*) pDoc )->ResetModified();
            ( (SwDoc*) pDoc )->SetOle2Link( aOle2Lnk );
        }
    }

    if( pRet )
    if ( pRet )
        pRet->Add( this );
    else if( GetRegisteredIn() )
    else if ( GetRegisteredIn() )
        GetRegisteredInNonConst()->Remove( this );

    return pRet;
diff --git a/sw/source/filter/ww8/ww8atr.cxx b/sw/source/filter/ww8/ww8atr.cxx
index 93f7653..42f1a8b 100644
--- a/sw/source/filter/ww8/ww8atr.cxx
+++ b/sw/source/filter/ww8/ww8atr.cxx
@@ -1627,12 +1627,12 @@ void WW8AttributeOutput::TextINetFormat( const SwFmtINetFmt& rINet )
{
    if ( !rINet.GetValue().isEmpty() )
    {
        sal_uInt16 nId;
        const OUString rStr = rINet.GetINetFmt();
        if ( !rStr.isEmpty() )
            nId = rINet.GetINetFmtId();
        else
            nId = RES_POOLCHR_INET_NORMAL;
        const sal_uInt16 nId = rINet.GetINetFmtId();
        const OUString& rStr = rINet.GetINetFmt();
        if (rStr.isEmpty())
        {
            OSL_ENSURE( false, "WW8AttributeOutput::TextINetFormat(..) - missing unvisited character format at hyperlink attribute" );
        }

        const SwCharFmt* pFmt = IsPoolUserFmt( nId )
                        ? m_rWW8Export.pDoc->FindCharFmtByName( rStr )
diff --git a/sw/source/filter/ww8/ww8par5.cxx b/sw/source/filter/ww8/ww8par5.cxx
index f0eaf85..5b88475 100644
--- a/sw/source/filter/ww8/ww8par5.cxx
+++ b/sw/source/filter/ww8/ww8par5.cxx
@@ -2076,13 +2076,11 @@ eF_ResT SwWW8ImplReader::Read_F_PgRef( WW8FieldDesc*, OUString& rStr )
            OUString sURL = OUString(INET_MARK_TOKEN) + sBookmarkName;
            const OUString sTarget;
            SwFmtINetFmt aURL( sURL, sTarget );
            OUString sLinkStyle("Index Link");
            sal_uInt16 nPoolId =
            const OUString sLinkStyle("Index Link");
            const sal_uInt16 nPoolId =
                SwStyleNameMapper::GetPoolIdFromUIName( sLinkStyle, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT );
            aURL.SetVisitedFmt(sLinkStyle);
            aURL.SetINetFmt(sLinkStyle);
            aURL.SetVisitedFmtId(nPoolId);
            aURL.SetINetFmtId(nPoolId);
            aURL.SetVisitedFmtAndId( sLinkStyle, nPoolId);
            aURL.SetINetFmtAndId( sLinkStyle, nPoolId );
            pCtrlStck->NewAttr( *pPaM->GetPoint(), aURL );
        }
        return FLD_TEXT;
@@ -3460,10 +3458,8 @@ eF_ResT SwWW8ImplReader::Read_F_Hyperlink( WW8FieldDesc* /*pF*/, OUString& rStr 
        OUString sLinkStyle("Index Link");
        sal_uInt16 nPoolId =
            SwStyleNameMapper::GetPoolIdFromUIName( sLinkStyle, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT );
        aURL.SetVisitedFmt(sLinkStyle);
        aURL.SetINetFmt(sLinkStyle);
        aURL.SetVisitedFmtId(nPoolId);
        aURL.SetINetFmtId(nPoolId);
        aURL.SetVisitedFmtAndId( sLinkStyle, nPoolId );
        aURL.SetINetFmtAndId( sLinkStyle, nPoolId );
    }

    //As an attribute this needs to be closed, and that'll happen from
diff --git a/sw/source/ui/chrdlg/chardlg.cxx b/sw/source/ui/chrdlg/chardlg.cxx
index 58c19ad..f5cf928 100644
--- a/sw/source/ui/chrdlg/chardlg.cxx
+++ b/sw/source/ui/chrdlg/chardlg.cxx
@@ -194,22 +194,29 @@ SwCharURLPage::~SwCharURLPage()
void SwCharURLPage::Reset(const SfxItemSet& rSet)
{
    const SfxPoolItem* pItem;
    if(SFX_ITEM_SET == rSet.GetItemState(RES_TXTATR_INETFMT, sal_False, &pItem))
    if ( SFX_ITEM_SET == rSet.GetItemState( RES_TXTATR_INETFMT, sal_False, &pItem ) )
    {
        const SwFmtINetFmt* pINetFmt = (const SwFmtINetFmt*)pItem;
        m_pURLED->SetText( INetURLObject::decode( pINetFmt->GetValue(),
                                        INET_HEX_ESCAPE,
                                           INetURLObject::DECODE_UNAMBIGUOUS,
                                        RTL_TEXTENCODING_UTF8 ));
        const SwFmtINetFmt* pINetFmt = (const SwFmtINetFmt*) pItem;
        m_pURLED->SetText(INetURLObject::decode(pINetFmt->GetValue(),
            INET_HEX_ESCAPE, INetURLObject::DECODE_UNAMBIGUOUS,
            RTL_TEXTENCODING_UTF8));
        m_pURLED->SaveValue();
        m_pNameED->SetText(pINetFmt->GetName());
        m_pURLED->SetText(pINetFmt->GetName());

        OUString sEntry = pINetFmt->GetVisitedFmt();
        if (sEntry.isEmpty())
            SwStyleNameMapper::FillUIName( RES_POOLCHR_INET_VISIT, sEntry );
        m_pVisitedLB->SelectEntry(sEntry);
        {
            OSL_ENSURE( false, "<SwCharURLPage::Reset(..)> - missing visited character format at hyperlink attribute" );
            SwStyleNameMapper::FillUIName(RES_POOLCHR_INET_VISIT, sEntry);
        }
        m_pVisitedLB->SelectEntry( sEntry );

        sEntry = pINetFmt->GetINetFmt();
        if (sEntry.isEmpty())
            SwStyleNameMapper::FillUIName( RES_POOLCHR_INET_NORMAL, sEntry );
        {
            OSL_ENSURE( false, "<SwCharURLPage::Reset(..)> - missing unvisited character format at hyperlink attribute" );
            SwStyleNameMapper::FillUIName(RES_POOLCHR_INET_NORMAL, sEntry);
        }
        m_pNotVisitedLB->SelectEntry(sEntry);

        m_pTargetFrmLB->SetText(pINetFmt->GetTargetFrame());
@@ -251,13 +258,11 @@ sal_Bool SwCharURLPage::FillItemSet(SfxItemSet& rSet)
    // set valid settings first
    OUString sEntry = m_pVisitedLB->GetSelectEntry();
    sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName( sEntry, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT);
    aINetFmt.SetVisitedFmtId(nId);
    aINetFmt.SetVisitedFmt(nId == RES_POOLCHR_INET_VISIT ? aEmptyOUStr : sEntry);
    aINetFmt.SetVisitedFmtAndId( sEntry, nId );

    sEntry = m_pNotVisitedLB->GetSelectEntry();
    nId = SwStyleNameMapper::GetPoolIdFromUIName( sEntry, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT);
    aINetFmt.SetINetFmtId( nId );
    aINetFmt.SetINetFmt(nId == RES_POOLCHR_INET_NORMAL ? aEmptyOUStr : sEntry);
    aINetFmt.SetINetFmtAndId( sEntry, nId );

    if( pINetItem && !pINetItem->GetMacroTable().empty() )
        aINetFmt.SetMacroTbl( &pINetItem->GetMacroTable() );
diff --git a/sw/source/ui/shells/txtattr.cxx b/sw/source/ui/shells/txtattr.cxx
index 706df62..0acaf93 100644
--- a/sw/source/ui/shells/txtattr.cxx
+++ b/sw/source/ui/shells/txtattr.cxx
@@ -179,37 +179,42 @@ void SwTextShell::ExecCharAttrArgs(SfxRequest &rReq)
    SwTxtFmtColl* pColl = 0;

    // Is only set if the whole paragraph is selected and AutoUpdateFmt is set.
    if( rWrtSh.HasSelection() && rWrtSh.IsSelFullPara() )
    if (rWrtSh.HasSelection() && rWrtSh.IsSelFullPara())
    {
        pColl = rWrtSh.GetCurTxtFmtColl();
        if(pColl && !pColl->IsAutoUpdateFmt())
        if ( pColl && !pColl->IsAutoUpdateFmt() )
            pColl = 0;
    }
    SfxItemPool& rPool = GetPool();
    sal_uInt16 nWhich = rPool.GetWhich(nSlot);
    switch ( nSlot )
    sal_uInt16 nWhich = rPool.GetWhich( nSlot );
    switch (nSlot)
    {
        case FN_TXTATR_INET:
        // Special treatment of the PoolId of the SwFmtInetFmt
        if(bArgs)
        {
            const SfxPoolItem& rItem = pArgs->Get(nWhich );
            const SfxPoolItem& rItem = pArgs->Get( nWhich );

            SwFmtINetFmt aINetFmt((const SwFmtINetFmt&)rItem);
            if( USHRT_MAX == aINetFmt.GetVisitedFmtId() )
            SwFmtINetFmt aINetFmt( (const SwFmtINetFmt&) rItem );
            if ( USHRT_MAX == aINetFmt.GetVisitedFmtId() )
            {
                aINetFmt.SetVisitedFmtId(
                        SwStyleNameMapper::GetPoolIdFromUIName( aINetFmt.GetVisitedFmt(), nsSwGetPoolIdFromName::GET_POOLID_CHRFMT));
                OSL_ENSURE( false, "<SwTextShell::ExecCharAttrArgs(..)> - unexpected visited character format ID at hyperlink attribute" );
                aINetFmt.SetVisitedFmtAndId(
                        aINetFmt.GetVisitedFmt(),
                        SwStyleNameMapper::GetPoolIdFromUIName( aINetFmt.GetVisitedFmt(), nsSwGetPoolIdFromName::GET_POOLID_CHRFMT ) );
            }
            if( USHRT_MAX == aINetFmt.GetINetFmtId() )
            if ( USHRT_MAX == aINetFmt.GetINetFmtId() )
            {
                aINetFmt.SetINetFmtId(
                        SwStyleNameMapper::GetPoolIdFromUIName( aINetFmt.GetINetFmt(), nsSwGetPoolIdFromName::GET_POOLID_CHRFMT));
                OSL_ENSURE( false, "<SwTextShell::ExecCharAttrArgs(..)> - unexpected unvisited character format ID at hyperlink attribute" );
                aINetFmt.SetINetFmtAndId(
                        aINetFmt.GetINetFmt(),
                        SwStyleNameMapper::GetPoolIdFromUIName( aINetFmt.GetINetFmt(), nsSwGetPoolIdFromName::GET_POOLID_CHRFMT ) );
            }

            if ( pColl )
                pColl->SetFmtAttr( aINetFmt );
            else rWrtSh.SetAttrItem( aINetFmt );
            else
                rWrtSh.SetAttrItem( aINetFmt );
            rReq.Done();
        }
        break;