dont use SwClient/SwModify in unocore: HeadFootText

Change-Id: Icf0fa7ec07c8c52981c50bc03a34ae0fa9683fcf
Reviewed-on: https://gerrit.libreoffice.org/54184
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Björn Michaelsen <bjoern.michaelsen@libreoffice.org>
diff --git a/sw/inc/calbck.hxx b/sw/inc/calbck.hxx
index f5748d5..913a7f6 100644
--- a/sw/inc/calbck.hxx
+++ b/sw/inc/calbck.hxx
@@ -83,6 +83,10 @@ namespace sw
    class SW_DLLPUBLIC BroadcasterMixin {
        SvtBroadcaster m_aNotifier;
        public:
            BroadcasterMixin& operator=(const BroadcasterMixin&)
            {
                return *this; // Listeners are never copied or moved.
            }
            SvtBroadcaster& GetNotifier() { return m_aNotifier; }
    };
    /// refactoring out the some of the more sane SwClient functionality
diff --git a/sw/inc/frmfmt.hxx b/sw/inc/frmfmt.hxx
index 7879884..a8f61f3 100644
--- a/sw/inc/frmfmt.hxx
+++ b/sw/inc/frmfmt.hxx
@@ -53,7 +53,9 @@ namespace sw
class SwFrameFormats;

/// Style of a layout element.
class SW_DLLPUBLIC SwFrameFormat: public SwFormat
class SW_DLLPUBLIC SwFrameFormat
    : public SwFormat
    , public sw::BroadcasterMixin
{
    friend class SwDoc;
    friend class SwPageDesc;    ///< Is allowed to call protected CTor.
diff --git a/sw/inc/section.hxx b/sw/inc/section.hxx
index eb4cc691..30b582b 100644
--- a/sw/inc/section.hxx
+++ b/sw/inc/section.hxx
@@ -270,7 +270,6 @@ enum class SectionSort { Not, Pos };
class SW_DLLPUBLIC SwSectionFormat
    : public SwFrameFormat
    , public ::sfx2::Metadatable
    , public sw::BroadcasterMixin
{
    friend class SwDoc;

diff --git a/sw/inc/unotextbodyhf.hxx b/sw/inc/unotextbodyhf.hxx
index 11aa3cb..439d434 100644
--- a/sw/inc/unotextbodyhf.hxx
+++ b/sw/inc/unotextbodyhf.hxx
@@ -116,7 +116,6 @@ public:

    static css::uno::Reference< css::text::XText >
        CreateXHeadFootText(SwFrameFormat & rHeadFootFormat, const bool bIsHeader);
    static bool IsXHeadFootText(SwClient const *const pClient);

    // XInterface
    virtual css::uno::Any SAL_CALL queryInterface(
diff --git a/sw/source/core/layout/atrfrm.cxx b/sw/source/core/layout/atrfrm.cxx
index bcc42a8..7f4d27a 100644
--- a/sw/source/core/layout/atrfrm.cxx
+++ b/sw/source/core/layout/atrfrm.cxx
@@ -121,7 +121,7 @@ static void lcl_DelHFFormat( SwClient *pToRemove, SwFrameFormat *pFormat )
        // It's suboptimal if the format is deleted beforehand.
        SwIterator<SwClient,SwFrameFormat> aIter(*pFormat);
        for(SwClient* pLast = aIter.First(); bDel && pLast; pLast = aIter.Next())
            if (dynamic_cast<const SwFrame*>(pLast) == nullptr && !SwXHeadFootText::IsXHeadFootText(pLast))
            if (dynamic_cast<const SwFrame*>(pLast) == nullptr)
                bDel = false;
    }

diff --git a/sw/source/core/unocore/unotext.cxx b/sw/source/core/unocore/unotext.cxx
index 6d01370..5d9bde6 100644
--- a/sw/source/core/unocore/unotext.cxx
+++ b/sw/source/core/unocore/unotext.cxx
@@ -30,6 +30,7 @@
#include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
#include <com/sun/star/lang/WrappedTargetRuntimeException.hpp>

#include <svl/listener.hxx>
#include <vcl/svapp.hxx>
#include <comphelper/profilezone.hxx>
#include <comphelper/sequence.hxx>
@@ -2453,108 +2454,90 @@ SwXBodyText::hasElements()
}

class SwXHeadFootText::Impl
    : public SwClient
    : public SvtListener
{
    public:
        SwFrameFormat* m_pHeadFootFormat;
        bool m_bIsHeader;

public:

    bool                        m_bIsHeader;

    Impl( SwFrameFormat & rHeadFootFormat, const bool bIsHeader)
        : SwClient(& rHeadFootFormat)
        , m_bIsHeader(bIsHeader)
    {
    }

    SwFrameFormat * GetHeadFootFormat() const {
        return static_cast<SwFrameFormat*>(
                const_cast<SwModify*>(GetRegisteredIn()));
    }

    SwFrameFormat & GetHeadFootFormatOrThrow() {
        SwFrameFormat *const pFormat( GetHeadFootFormat() );
        if (!pFormat) {
            throw uno::RuntimeException("SwXHeadFootText: disposed or invalid", nullptr);
        Impl(SwFrameFormat& rHeadFootFormat, const bool bIsHeader)
            : m_pHeadFootFormat(&rHeadFootFormat)
            , m_bIsHeader(bIsHeader)
        {
            if(m_pHeadFootFormat)
                StartListening(m_pHeadFootFormat->GetNotifier());
        }
        return *pFormat;
    }
protected:
    // SwClient
    virtual void Modify(const SfxPoolItem *pOld, const SfxPoolItem *pNew) override;

        SwFrameFormat* GetHeadFootFormat() const {
            return m_pHeadFootFormat;
        }

        SwFrameFormat& GetHeadFootFormatOrThrow() {
            if (!m_pHeadFootFormat) {
                throw uno::RuntimeException("SwXHeadFootText: disposed or invalid", nullptr);
            }
            return *m_pHeadFootFormat;
        }
    protected:
        virtual void Notify(const SfxHint& rHint) override
        {
            if(rHint.GetId() == SfxHintId::Dying)
                m_pHeadFootFormat = nullptr;
        }
};

void SwXHeadFootText::Impl::Modify( const SfxPoolItem *pOld, const SfxPoolItem *pNew)
{
    ClientModify(this, pOld, pNew);
}

bool SwXHeadFootText::IsXHeadFootText(SwClient const *const pClient)
{
    return dynamic_cast<SwXHeadFootText::Impl const *>(pClient) !=  nullptr;
}

uno::Reference< text::XText >
SwXHeadFootText::CreateXHeadFootText(
        SwFrameFormat & rHeadFootFormat, const bool bIsHeader)
uno::Reference<text::XText> SwXHeadFootText::CreateXHeadFootText(
        SwFrameFormat& rHeadFootFormat,
        const bool bIsHeader)
{
    // re-use existing SwXHeadFootText
    // #i105557#: do not iterate over the registered clients: race condition
    uno::Reference< text::XText > xText(rHeadFootFormat.GetXObject(),
            uno::UNO_QUERY);
    if (!xText.is())
    uno::Reference<text::XText> xText(rHeadFootFormat.GetXObject(), uno::UNO_QUERY);
    if(!xText.is())
    {
        SwXHeadFootText *const pXHFT(
                new SwXHeadFootText(rHeadFootFormat, bIsHeader));
        const auto pXHFT(new SwXHeadFootText(rHeadFootFormat, bIsHeader));
        xText.set(pXHFT);
        rHeadFootFormat.SetXObject(xText);
    }
    return xText;
}

SwXHeadFootText::SwXHeadFootText(SwFrameFormat & rHeadFootFormat, const bool bIsHeader)
    : SwXText(rHeadFootFormat.GetDoc(),
SwXHeadFootText::SwXHeadFootText(SwFrameFormat& rHeadFootFormat, const bool bIsHeader)
    : SwXText(
            rHeadFootFormat.GetDoc(),
            bIsHeader ? CursorType::Header : CursorType::Footer)
    , m_pImpl( new SwXHeadFootText::Impl(rHeadFootFormat, bIsHeader) )
    , m_pImpl(new SwXHeadFootText::Impl(rHeadFootFormat, bIsHeader))
{
}

SwXHeadFootText::~SwXHeadFootText()
{
}
{ }

OUString SAL_CALL
SwXHeadFootText::getImplementationName()
{
    return OUString("SwXHeadFootText");
  return {"SwXHeadFootText"};
}

static char const*const g_ServicesHeadFootText[] =
{
    "com.sun.star.text.Text",
};

sal_Bool SAL_CALL SwXHeadFootText::supportsService(const OUString& rServiceName)
{
    return cppu::supportsService(this, rServiceName);
}

uno::Sequence< OUString > SAL_CALL
uno::Sequence<OUString> SAL_CALL
SwXHeadFootText::getSupportedServiceNames()
{
    return ::sw::GetSupportedServiceNamesImpl(
            SAL_N_ELEMENTS(g_ServicesHeadFootText),
            g_ServicesHeadFootText);
    return {"com.sun.star.text.Text"};
}

const SwStartNode *SwXHeadFootText::GetStartNode() const
const SwStartNode* SwXHeadFootText::GetStartNode() const
{
    const SwStartNode *pSttNd = nullptr;
    SwFrameFormat *const pHeadFootFormat = m_pImpl->GetHeadFootFormat();
    const SwStartNode* pSttNd = nullptr;
    SwFrameFormat* const pHeadFootFormat = m_pImpl->GetHeadFootFormat();
    if(pHeadFootFormat)
    {
        const SwFormatContent& rFlyContent = pHeadFootFormat->GetContent();
        if( rFlyContent.GetContentIdx() )
        if(rFlyContent.GetContentIdx())
        {
            pSttNd = rFlyContent.GetContentIdx()->GetNode().GetStartNode();
        }
@@ -2562,43 +2545,38 @@ const SwStartNode *SwXHeadFootText::GetStartNode() const
    return pSttNd;
}

uno::Reference< text::XTextCursor >
SwXHeadFootText::CreateCursor()
uno::Reference<text::XTextCursor> SwXHeadFootText::CreateCursor()
{
    return createTextCursor();
}

uno::Sequence< uno::Type > SAL_CALL
SwXHeadFootText::getTypes()
uno::Sequence<uno::Type> SAL_CALL SwXHeadFootText::getTypes()
{
    const uno::Sequence< uno::Type > aTypes = SwXHeadFootText_Base::getTypes();
    const uno::Sequence< uno::Type > aTextTypes = SwXText::getTypes();
    return ::comphelper::concatSequences(aTypes, aTextTypes);
    return ::comphelper::concatSequences(
        SwXHeadFootText_Base::getTypes(),
        SwXText::getTypes());
}

uno::Sequence< sal_Int8 > SAL_CALL
SwXHeadFootText::getImplementationId()
uno::Sequence<sal_Int8> SAL_CALL SwXHeadFootText::getImplementationId()
{
    return css::uno::Sequence<sal_Int8>();
}

uno::Any SAL_CALL
SwXHeadFootText::queryInterface(const uno::Type& rType)
uno::Any SAL_CALL SwXHeadFootText::queryInterface(const uno::Type& rType)
{
    const uno::Any ret = SwXHeadFootText_Base::queryInterface(rType);
    return (ret.getValueType() == cppu::UnoType<void>::get())
        ?   SwXText::queryInterface(rType)
        :   ret;
        ? SwXText::queryInterface(rType)
        : ret;
}

uno::Reference< text::XTextCursor > SAL_CALL
uno::Reference<text::XTextCursor> SAL_CALL
SwXHeadFootText::createTextCursor()
{
    SolarMutexGuard aGuard;

    SwFrameFormat & rHeadFootFormat( m_pImpl->GetHeadFootFormatOrThrow() );

    uno::Reference< text::XTextCursor > xRet;
    const SwFormatContent& rFlyContent = rHeadFootFormat.GetContent();
    const SwNode& rNode = rFlyContent.GetContentIdx()->GetNode();
    SwPosition aPos(rNode);
@@ -2624,8 +2602,7 @@ SwXHeadFootText::createTextCursor()
    {
        rUnoCursor.GetPoint()->nContent.Assign(pCont, 0);
    }
    SwStartNode const*const pNewStartNode =
        rUnoCursor.GetNode().FindSttNodeByType(
    SwStartNode const*const pNewStartNode = rUnoCursor.GetNode().FindSttNodeByType(
            (m_pImpl->m_bIsHeader) ? SwHeaderStartNode : SwFooterStartNode);
    if (!pNewStartNode || (pNewStartNode != pOwnStartNode))
    {
@@ -2633,69 +2610,65 @@ SwXHeadFootText::createTextCursor()
        aExcept.Message = "no text available";
        throw aExcept;
    }
    xRet = static_cast<text::XWordCursor*>(pXCursor);
    return xRet;
    return static_cast<text::XWordCursor*>(pXCursor);
}

uno::Reference< text::XTextCursor > SAL_CALL
SwXHeadFootText::createTextCursorByRange(
    const uno::Reference< text::XTextRange > & xTextPosition)
uno::Reference<text::XTextCursor> SAL_CALL SwXHeadFootText::createTextCursorByRange(
    const uno::Reference<text::XTextRange>& xTextPosition)
{
    SolarMutexGuard aGuard;

    SwFrameFormat & rHeadFootFormat( m_pImpl->GetHeadFootFormatOrThrow() );
    SwFrameFormat& rHeadFootFormat( m_pImpl->GetHeadFootFormatOrThrow() );

    SwUnoInternalPaM aPam(*GetDoc());
    if (!::sw::XTextRangeToSwPaM(aPam, xTextPosition))
    if (!sw::XTextRangeToSwPaM(aPam, xTextPosition))
    {
        uno::RuntimeException aRuntime;
        aRuntime.Message = cInvalidObject;
        throw aRuntime;
    }

    uno::Reference< text::XTextCursor >  xRet;
    SwNode& rNode = rHeadFootFormat.GetContent().GetContentIdx()->GetNode();
    SwPosition aPos(rNode);
    SwPaM aHFPam(aPos);
    aHFPam.Move(fnMoveForward, GoInNode);
    SwStartNode *const pOwnStartNode = aHFPam.GetNode().FindSttNodeByType(
    SwStartNode* const pOwnStartNode = aHFPam.GetNode().FindSttNodeByType(
            (m_pImpl->m_bIsHeader) ? SwHeaderStartNode : SwFooterStartNode);
    SwStartNode *const p1 = aPam.GetNode().FindSttNodeByType(
    SwStartNode* const p1 = aPam.GetNode().FindSttNodeByType(
            (m_pImpl->m_bIsHeader) ? SwHeaderStartNode : SwFooterStartNode);
    if (p1 == pOwnStartNode)
    {
        xRet = static_cast<text::XWordCursor*>(
                new SwXTextCursor(*GetDoc(), this,
        return static_cast<text::XWordCursor*>(
                new SwXTextCursor(
                    *GetDoc(),
                    this,
                    (m_pImpl->m_bIsHeader) ? CursorType::Header : CursorType::Footer,
                    *aPam.GetPoint(), aPam.GetMark()));
    }
    return xRet;
    return nullptr;
}

uno::Reference< container::XEnumeration > SAL_CALL
SwXHeadFootText::createEnumeration()
uno::Reference<container::XEnumeration> SAL_CALL SwXHeadFootText::createEnumeration()
{
    SolarMutexGuard aGuard;

    SwFrameFormat & rHeadFootFormat( m_pImpl->GetHeadFootFormatOrThrow() );
    SwFrameFormat& rHeadFootFormat(m_pImpl->GetHeadFootFormatOrThrow());

    const SwFormatContent& rFlyContent = rHeadFootFormat.GetContent();
    const SwNode& rNode = rFlyContent.GetContentIdx()->GetNode();
    SwPosition aPos(rNode);
    auto pUnoCursor(GetDoc()->CreateUnoCursor(aPos));
    pUnoCursor->Move(fnMoveForward, GoInNode);
    return SwXParagraphEnumeration::Create(this, pUnoCursor, (m_pImpl->m_bIsHeader) ? CursorType::Header : CursorType::Footer);
    return SwXParagraphEnumeration::Create(
            this,
            pUnoCursor,
            (m_pImpl->m_bIsHeader)
                ? CursorType::Header
                : CursorType::Footer);
}

uno::Type SAL_CALL
SwXHeadFootText::getElementType()
{
    return cppu::UnoType<text::XTextRange>::get();
}
uno::Type SAL_CALL SwXHeadFootText::getElementType()
    { return cppu::UnoType<text::XTextRange>::get(); }

sal_Bool SAL_CALL SwXHeadFootText::hasElements()
{
    return true;
}
    { return true; }

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */