sw/inc/IDocumentMarkAccess.hxx                          |    8 
 sw/inc/IMark.hxx                                        |  356 ++++++++++++++--
 sw/inc/unostyle.hxx                                     |   65 ++
 sw/inc/unotxdoc.hxx                                     |    1 
 sw/source/core/crsr/crbm.cxx                            |    4 
 sw/source/core/doc/DocumentContentOperationsManager.cxx |    8 
 sw/source/core/doc/DocumentFieldsManager.cxx            |    4 
 sw/source/core/doc/docbm.cxx                            |   22 
 sw/source/core/doc/docfld.cxx                           |    4 
 sw/source/core/doc/docredln.cxx                         |    2 
 sw/source/core/inc/bookmark.hxx                         |  332 --------------
 sw/source/core/inc/docfld.hxx                           |    6 
 sw/source/core/inc/scriptinfo.hxx                       |    6 
 sw/source/core/text/porlay.cxx                          |   14 
 sw/source/core/text/porrst.cxx                          |    2 
 sw/source/core/undo/rolbck.cxx                          |   24 -
 sw/source/core/unocore/unobkm.cxx                       |   12 
 sw/source/core/unocore/unostyle.cxx                     |  216 +++++----
 sw/source/filter/html/wrthtml.cxx                       |    2 
 sw/source/ui/misc/bookmark.cxx                          |    2 
 sw/source/uibase/uno/unotxdoc.cxx                       |    5 
 sw/source/writerfilter/dmapper/DomainMapper.cxx         |    3 
 sw/source/writerfilter/dmapper/DomainMapper.hxx         |    3 
 sw/source/writerfilter/dmapper/DomainMapper_Impl.cxx    |   23 -
 sw/source/writerfilter/dmapper/DomainMapper_Impl.hxx    |   13 
 sw/source/writerfilter/dmapper/PropertyMap.cxx          |    3 
 sw/source/writerfilter/dmapper/StyleSheetTable.cxx      |    3 
 27 files changed, 591 insertions(+), 552 deletions(-)

New commits:
commit f13e5718f53c3e460a6aacdb8f429d18ac011fa3
Author:     Noel Grandin <noelgran...@gmail.com>
AuthorDate: Sat Aug 3 19:15:34 2024 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Sun Aug 4 08:43:07 2024 +0200

    use more concrete UNO type in writerfilter
    
    Change-Id: Idf3fd445994e0b42cffc173ed68475398d74cdd2
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/171447
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/sw/inc/unostyle.hxx b/sw/inc/unostyle.hxx
index 77c2cc8856c0..b6f4d9abd96b 100644
--- a/sw/inc/unostyle.hxx
+++ b/sw/inc/unostyle.hxx
@@ -48,6 +48,8 @@ class SwXStyle;
 class SwXTextCellStyle;
 class SwXPageStyle;
 class SwXFrameStyle;
+class StyleFamilyEntry;
+class SwXStyleFamily;
 
 class SwXStyleFamilies final : public cppu::WeakImplHelper
 <
@@ -60,7 +62,7 @@ class SwXStyleFamilies final : public cppu::WeakImplHelper
 {
     SwDocShell*         m_pDocShell;
 
-    std::map<SfxStyleFamily, 
css::uno::Reference<css::container::XNameContainer>> m_vFamilies;
+    std::map<SfxStyleFamily, rtl::Reference<SwXStyleFamily>> m_vFamilies;
 
     virtual ~SwXStyleFamilies() override;
 public:
@@ -88,6 +90,12 @@ public:
     virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) 
override;
     virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() 
override;
 
+    SW_DLLPUBLIC rtl::Reference<SwXStyleFamily> GetPageStyles();
+    SW_DLLPUBLIC rtl::Reference<SwXStyleFamily> GetCharacterStyles();
+    SW_DLLPUBLIC rtl::Reference<SwXStyleFamily> GetParagraphStyles();
+    rtl::Reference<SwXStyleFamily> GetStylesByName(const OUString& rName);
+    rtl::Reference<SwXStyleFamily> GetStylesByIndex(sal_Int32 nIndex);
+
     static css::uno::Reference<css::style::XStyle> CreateStyle(SfxStyleFamily 
eFamily, SwDoc& rDoc);
     static rtl::Reference<SwXStyle> 
CreateStyleCharOrParaOrPseudo(SfxStyleFamily eFamily, SwDoc& rDoc);
     static rtl::Reference<SwXPageStyle> CreateStylePage(SwDoc& rDoc);
@@ -390,4 +398,59 @@ class SwXTextCellStyle final : public cppu::WeakImplHelper
     static rtl::Reference<SwXTextCellStyle> CreateXTextCellStyle(SwDocShell* 
pDocShell, const OUString& sName);
 };
 
+class SW_DLLPUBLIC SwXStyleFamily final : public cppu::WeakImplHelper
+<
+    css::container::XNameContainer,
+    css::lang::XServiceInfo,
+    css::container::XIndexAccess,
+    css::beans::XPropertySet
+>
+, public SfxListener
+{
+    const StyleFamilyEntry& m_rEntry;
+    SfxStyleSheetBasePool* m_pBasePool;
+    SwDocShell* m_pDocShell;
+
+    SwXStyle* FindStyle(std::u16string_view rStyleName) const;
+    sal_Int32 GetCountOrName(OUString* pString, sal_Int32 nIndex = 
SAL_MAX_INT32);
+    static const StyleFamilyEntry& InitEntry(SfxStyleFamily eFamily);
+public:
+    SwXStyleFamily(SwDocShell* pDocShell, const SfxStyleFamily eFamily);
+
+    //XIndexAccess
+    virtual sal_Int32 SAL_CALL getCount() override;
+    virtual css::uno::Any SAL_CALL getByIndex(sal_Int32 nIndex) override;
+
+    //XElementAccess
+    virtual css::uno::Type SAL_CALL getElementType(  ) override;
+    virtual sal_Bool SAL_CALL hasElements(  ) override;
+
+    //XNameAccess
+    virtual css::uno::Any SAL_CALL getByName(const OUString& Name) override;
+    virtual css::uno::Sequence< OUString > SAL_CALL getElementNames() override;
+    virtual sal_Bool SAL_CALL hasByName(const OUString& Name) override;
+
+    //XNameContainer
+    virtual void SAL_CALL insertByName(const OUString& Name, const 
css::uno::Any& Element) override;
+    virtual void SAL_CALL replaceByName(const OUString& Name, const 
css::uno::Any& Element) override;
+    virtual void SAL_CALL removeByName(const OUString& Name) override;
+
+    //XPropertySet
+    virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL 
getPropertySetInfo(  ) override;
+    virtual void SAL_CALL setPropertyValue( const OUString&, const 
css::uno::Any&) override;
+    virtual css::uno::Any SAL_CALL getPropertyValue( const OUString& 
PropertyName ) override;
+    virtual void SAL_CALL addPropertyChangeListener( const OUString&, const 
css::uno::Reference<css::beans::XPropertyChangeListener>&) override;
+    virtual void SAL_CALL removePropertyChangeListener( const OUString&, const 
css::uno::Reference<css::beans::XPropertyChangeListener>&) override;
+    virtual void SAL_CALL addVetoableChangeListener(const OUString&, const 
css::uno::Reference<css::beans::XVetoableChangeListener>&) override;
+    virtual void SAL_CALL removeVetoableChangeListener(const OUString&, const 
css::uno::Reference<css::beans::XVetoableChangeListener>&) override;
+
+    //SfxListener
+    virtual void Notify(SfxBroadcaster& rBC, const SfxHint& rHint) override;
+
+    //XServiceInfo
+    virtual OUString SAL_CALL getImplementationName() override;
+    virtual sal_Bool SAL_CALL supportsService(const OUString& rServiceName) 
override;
+    virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() 
override;
+};
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/inc/unotxdoc.hxx b/sw/inc/unotxdoc.hxx
index 38d67effb9ff..b3a308f37761 100644
--- a/sw/inc/unotxdoc.hxx
+++ b/sw/inc/unotxdoc.hxx
@@ -538,6 +538,7 @@ public:
     rtl::Reference<SwXFootnote> createEndnote();
     rtl::Reference<SwXTextEmbeddedObject> createTextEmbeddedObject();
     rtl::Reference<SvXMLEmbeddedObjectHelper> createEmbeddedObjectResolver();
+    rtl::Reference< SwXStyleFamilies > getSwStyleFamilies();
 };
 
 class SwXLinkTargetSupplier final : public cppu::WeakImplHelper
diff --git a/sw/source/core/unocore/unostyle.cxx 
b/sw/source/core/unocore/unostyle.cxx
index ebabef689cef..eadcc025a665 100644
--- a/sw/source/core/unocore/unostyle.cxx
+++ b/sw/source/core/unocore/unostyle.cxx
@@ -586,108 +586,91 @@ static rtl::Reference<SwXTextCellStyle> 
CreateStyleCell(SwDocShell* pDocShell, c
     return SwXTextCellStyle::CreateXTextCellStyle(pDocShell, sStyleName);
 }
 
-namespace {
+sal_Int32 SwXStyleFamily::GetCountOrName(OUString* pString, sal_Int32 nIndex)
+{
+    return m_rEntry.getCountOrName(*m_pDocShell->GetDoc(), pString, nIndex);
+};
 
-class XStyleFamily : public cppu::WeakImplHelper
-<
-    container::XNameContainer,
-    lang::XServiceInfo,
-    container::XIndexAccess,
-    beans::XPropertySet
->
-, public SfxListener
-{
-    const StyleFamilyEntry& m_rEntry;
-    SfxStyleSheetBasePool* m_pBasePool;
-    SwDocShell* m_pDocShell;
-
-    SwXStyle* FindStyle(std::u16string_view rStyleName) const;
-    sal_Int32 GetCountOrName(OUString* pString, sal_Int32 nIndex = 
SAL_MAX_INT32)
-        { return m_rEntry.getCountOrName(*m_pDocShell->GetDoc(), pString, 
nIndex); };
-    static const StyleFamilyEntry& InitEntry(SfxStyleFamily eFamily)
-    {
-        auto& entries = lcl_GetStyleFamilyEntries();
-        const auto pEntry = std::find_if(entries.begin(), entries.end(),
-                [eFamily] (const StyleFamilyEntry& e) { return e.family() == 
eFamily; });
-        assert(pEntry != entries.end());
-        return *pEntry;
-    }
-public:
-    XStyleFamily(SwDocShell* pDocShell, const SfxStyleFamily eFamily)
-        : m_rEntry(InitEntry(eFamily))
-        , m_pBasePool(pDocShell->GetStyleSheetPool())
-        , m_pDocShell(pDocShell)
-    {
-        if (m_pBasePool) //tdf#124142 html docs can have no styles
-            StartListening(*m_pBasePool);
-    }
+/*static*/ const StyleFamilyEntry& SwXStyleFamily::InitEntry(SfxStyleFamily 
eFamily)
+{
+    auto& entries = lcl_GetStyleFamilyEntries();
+    const auto pEntry = std::find_if(entries.begin(), entries.end(),
+            [eFamily] (const StyleFamilyEntry& e) { return e.family() == 
eFamily; });
+    assert(pEntry != entries.end());
+    return *pEntry;
+}
 
-    //XIndexAccess
-    virtual sal_Int32 SAL_CALL getCount() override
-    {
-        SolarMutexGuard aGuard;
-        return GetCountOrName(nullptr);
-    };
-    virtual uno::Any SAL_CALL getByIndex(sal_Int32 nIndex) override;
+SwXStyleFamily::SwXStyleFamily(SwDocShell* pDocShell, const SfxStyleFamily 
eFamily)
+    : m_rEntry(InitEntry(eFamily))
+    , m_pBasePool(pDocShell->GetStyleSheetPool())
+    , m_pDocShell(pDocShell)
+{
+    if (m_pBasePool) //tdf#124142 html docs can have no styles
+        StartListening(*m_pBasePool);
+}
+
+//XIndexAccess
+sal_Int32 SAL_CALL SwXStyleFamily::getCount()
+{
+    SolarMutexGuard aGuard;
+    return GetCountOrName(nullptr);
+};
 
     //XElementAccess
-    virtual uno::Type SAL_CALL getElementType(  ) override
-        { return cppu::UnoType<style::XStyle>::get(); };
-    virtual sal_Bool SAL_CALL hasElements(  ) override
+uno::Type SAL_CALL SwXStyleFamily::getElementType()
+{
+    return cppu::UnoType<style::XStyle>::get();
+};
+
+sal_Bool SAL_CALL SwXStyleFamily::hasElements()
+{
+    if(!m_pBasePool)
+        throw uno::RuntimeException();
+    return true;
+}
+
+//XPropertySet
+uno::Reference< beans::XPropertySetInfo > SAL_CALL 
SwXStyleFamily::getPropertySetInfo()
+{ return {}; };
+
+void SAL_CALL SwXStyleFamily::setPropertyValue( const OUString&, const 
uno::Any&)
+{ SAL_WARN("sw.uno", "###unexpected!"); };
+
+void SAL_CALL SwXStyleFamily::addPropertyChangeListener( const OUString&, 
const uno::Reference<beans::XPropertyChangeListener>&)
+{ SAL_WARN("sw.uno", "###unexpected!"); };
+
+void SAL_CALL SwXStyleFamily::removePropertyChangeListener( const OUString&, 
const uno::Reference<beans::XPropertyChangeListener>&)
+{ SAL_WARN("sw.uno", "###unexpected!"); };
+
+void SAL_CALL SwXStyleFamily::addVetoableChangeListener(const OUString&, const 
uno::Reference<beans::XVetoableChangeListener>&)
+{ SAL_WARN("sw.uno", "###unexpected!"); };
+
+void SAL_CALL SwXStyleFamily::removeVetoableChangeListener(const OUString&, 
const uno::Reference<beans::XVetoableChangeListener>&)
+{ SAL_WARN("sw.uno", "###unexpected!"); };
+
+//SfxListener
+void SwXStyleFamily::Notify(SfxBroadcaster& rBC, const SfxHint& rHint)
+{
+    if(rHint.GetId() == SfxHintId::Dying)
     {
-        if(!m_pBasePool)
-            throw uno::RuntimeException();
-        return true;
+        m_pBasePool = nullptr;
+        m_pDocShell = nullptr;
+        EndListening(rBC);
     }
+}
 
-    //XNameAccess
-    virtual uno::Any SAL_CALL getByName(const OUString& Name) override;
-    virtual uno::Sequence< OUString > SAL_CALL getElementNames() override;
-    virtual sal_Bool SAL_CALL hasByName(const OUString& Name) override;
-
-    //XNameContainer
-    virtual void SAL_CALL insertByName(const OUString& Name, const uno::Any& 
Element) override;
-    virtual void SAL_CALL replaceByName(const OUString& Name, const uno::Any& 
Element) override;
-    virtual void SAL_CALL removeByName(const OUString& Name) override;
-
-    //XPropertySet
-    virtual uno::Reference< beans::XPropertySetInfo > SAL_CALL 
getPropertySetInfo(  ) override
-        { return {}; };
-    virtual void SAL_CALL setPropertyValue( const OUString&, const uno::Any&) 
override
-        { SAL_WARN("sw.uno", "###unexpected!"); };
-    virtual uno::Any SAL_CALL getPropertyValue( const OUString& PropertyName ) 
override;
-    virtual void SAL_CALL addPropertyChangeListener( const OUString&, const 
uno::Reference<beans::XPropertyChangeListener>&) override
-        { SAL_WARN("sw.uno", "###unexpected!"); };
-    virtual void SAL_CALL removePropertyChangeListener( const OUString&, const 
uno::Reference<beans::XPropertyChangeListener>&) override
-        { SAL_WARN("sw.uno", "###unexpected!"); };
-    virtual void SAL_CALL addVetoableChangeListener(const OUString&, const 
uno::Reference<beans::XVetoableChangeListener>&) override
-        { SAL_WARN("sw.uno", "###unexpected!"); };
-    virtual void SAL_CALL removeVetoableChangeListener(const OUString&, const 
uno::Reference<beans::XVetoableChangeListener>&) override
-        { SAL_WARN("sw.uno", "###unexpected!"); };
-
-    //SfxListener
-    virtual void Notify(SfxBroadcaster& rBC, const SfxHint& rHint) override
-    {
-        if(rHint.GetId() == SfxHintId::Dying)
-        {
-            m_pBasePool = nullptr;
-            m_pDocShell = nullptr;
-            EndListening(rBC);
-        }
-    }
+//XServiceInfo
+OUString SAL_CALL SwXStyleFamily::getImplementationName()
+{ return {u"XStyleFamily"_ustr}; };
 
-    //XServiceInfo
-    virtual OUString SAL_CALL getImplementationName() override
-        { return {u"XStyleFamily"_ustr}; };
-    virtual sal_Bool SAL_CALL supportsService(const OUString& rServiceName) 
override
-        { return cppu::supportsService(this, rServiceName); };
-    virtual uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() 
override
-        { return { u"com.sun.star.style.StyleFamily"_ustr }; }
-};
-}
+sal_Bool SAL_CALL SwXStyleFamily::supportsService(const OUString& rServiceName)
+{ return cppu::supportsService(this, rServiceName); };
+
+uno::Sequence< OUString > SAL_CALL SwXStyleFamily::getSupportedServiceNames()
+{ return { u"com.sun.star.style.StyleFamily"_ustr }; }
 
 OUString SwXStyleFamilies::getImplementationName()
-    { return {u"SwXStyleFamilies"_ustr}; }
+{ return {u"SwXStyleFamilies"_ustr}; }
 
 sal_Bool SwXStyleFamilies::supportsService(const OUString& rServiceName)
 {
@@ -706,6 +689,11 @@ SwXStyleFamilies::~SwXStyleFamilies()
     { }
 
 uno::Any SAL_CALL SwXStyleFamilies::getByName(const OUString& Name)
+{
+    return 
uno::Any(uno::Reference(static_cast<css::container::XNameContainer*>(GetStylesByName(Name).get())));
+}
+
+rtl::Reference<SwXStyleFamily> SwXStyleFamilies::GetStylesByName(const 
OUString& Name)
 {
     SolarMutexGuard aGuard;
     if(!IsValid())
@@ -715,7 +703,22 @@ uno::Any SAL_CALL SwXStyleFamilies::getByName(const 
OUString& Name)
         [&Name] (const StyleFamilyEntry& e) { return e.name() == Name; });
     if(pEntry == entries.end())
         throw container::NoSuchElementException();
-    return getByIndex(pEntry - entries.begin());
+    return GetStylesByIndex(pEntry - entries.begin());
+}
+
+rtl::Reference<SwXStyleFamily> SwXStyleFamilies::GetPageStyles()
+{
+    return GetStylesByName(u"PageStyles"_ustr);
+}
+
+rtl::Reference<SwXStyleFamily> SwXStyleFamilies::GetCharacterStyles()
+{
+    return GetStylesByName(u"CharacterStyles"_ustr);
+}
+
+rtl::Reference<SwXStyleFamily> SwXStyleFamilies::GetParagraphStyles()
+{
+    return GetStylesByName(u"ParagraphStyles"_ustr);
 }
 
 uno::Sequence< OUString > SwXStyleFamilies::getElementNames()
@@ -740,6 +743,11 @@ sal_Int32 SwXStyleFamilies::getCount()
 }
 
 uno::Any SwXStyleFamilies::getByIndex(sal_Int32 nIndex)
+{
+    return 
uno::Any(uno::Reference(static_cast<css::container::XNameContainer*>(GetStylesByIndex(nIndex).get())));
+}
+
+rtl::Reference<SwXStyleFamily> SwXStyleFamilies::GetStylesByIndex(sal_Int32 
nIndex)
 {
     auto& entries(lcl_GetStyleFamilyEntries());
     SolarMutexGuard aGuard;
@@ -751,8 +759,8 @@ uno::Any SwXStyleFamilies::getByIndex(sal_Int32 nIndex)
     assert(eFamily != SfxStyleFamily::All);
     auto& rxFamily = m_vFamilies[eFamily];
     if(!rxFamily.is())
-        rxFamily = new XStyleFamily(m_pDocShell, eFamily);
-    return uno::Any(rxFamily);
+        rxFamily = new SwXStyleFamily(m_pDocShell, eFamily);
+    return rxFamily;
 }
 
 uno::Type SwXStyleFamilies::getElementType()
@@ -888,7 +896,7 @@ rtl::Reference<SwXTextCellStyle> 
SwXStyleFamilies::CreateStyleCell(SwDoc& rDoc)
 uno::Reference<css::style::XStyle> 
SwXStyleFamilies::CreateStyleCondParagraph(SwDoc& rDoc)
     { return new SwXStyle(&rDoc, SfxStyleFamily::Para, true); };
 
-uno::Any XStyleFamily::getByIndex(sal_Int32 nIndex)
+uno::Any SwXStyleFamily::getByIndex(sal_Int32 nIndex)
 {
     SolarMutexGuard aGuard;
     if(nIndex < 0)
@@ -907,7 +915,7 @@ uno::Any XStyleFamily::getByIndex(sal_Int32 nIndex)
     return getByName(sStyleName);
 }
 
-uno::Any XStyleFamily::getByName(const OUString& rName)
+uno::Any SwXStyleFamily::getByName(const OUString& rName)
 {
     SolarMutexGuard aGuard;
     OUString sStyleName;
@@ -944,7 +952,7 @@ uno::Any XStyleFamily::getByName(const OUString& rName)
     return uno::Any(xStyle);
 }
 
-uno::Sequence<OUString> XStyleFamily::getElementNames()
+uno::Sequence<OUString> SwXStyleFamily::getElementNames()
 {
     SolarMutexGuard aGuard;
     if(!m_pBasePool)
@@ -960,7 +968,7 @@ uno::Sequence<OUString> XStyleFamily::getElementNames()
     return comphelper::containerToSequence(vRet);
 }
 
-sal_Bool XStyleFamily::hasByName(const OUString& rName)
+sal_Bool SwXStyleFamily::hasByName(const OUString& rName)
 {
     SolarMutexGuard aGuard;
     if(!m_pBasePool)
@@ -971,7 +979,7 @@ sal_Bool XStyleFamily::hasByName(const OUString& rName)
     return nullptr != pBase;
 }
 
-void XStyleFamily::insertByName(const OUString& rName, const uno::Any& 
rElement)
+void SwXStyleFamily::insertByName(const OUString& rName, const uno::Any& 
rElement)
 {
     SolarMutexGuard aGuard;
     if(!m_pBasePool)
@@ -1026,7 +1034,7 @@ void XStyleFamily::insertByName(const OUString& rName, 
const uno::Any& rElement)
     }
 }
 
-void XStyleFamily::replaceByName(const OUString& rName, const uno::Any& 
rElement)
+void SwXStyleFamily::replaceByName(const OUString& rName, const uno::Any& 
rElement)
 {
     SolarMutexGuard aGuard;
     if(!m_pBasePool)
@@ -1087,7 +1095,7 @@ void XStyleFamily::replaceByName(const OUString& rName, 
const uno::Any& rElement
     }
 }
 
-void XStyleFamily::removeByName(const OUString& rName)
+void SwXStyleFamily::removeByName(const OUString& rName)
 {
     SolarMutexGuard aGuard;
     if(!m_pBasePool)
@@ -1111,7 +1119,7 @@ void XStyleFamily::removeByName(const OUString& rName)
         m_pBasePool->Remove(pBase);
 }
 
-uno::Any SAL_CALL XStyleFamily::getPropertyValue( const OUString& 
sPropertyName )
+uno::Any SAL_CALL SwXStyleFamily::getPropertyValue( const OUString& 
sPropertyName )
 {
     if(sPropertyName != "DisplayName")
         throw beans::UnknownPropertyException( "unknown property: " + 
sPropertyName, getXWeak() );
@@ -1120,7 +1128,7 @@ uno::Any SAL_CALL XStyleFamily::getPropertyValue( const 
OUString& sPropertyName
 }
 
 
-SwXStyle* XStyleFamily::FindStyle(std::u16string_view rStyleName) const
+SwXStyle* SwXStyleFamily::FindStyle(std::u16string_view rStyleName) const
 {
     SwXStyle* pFoundStyle = nullptr;
     m_pBasePool->ForAllListeners(
diff --git a/sw/source/uibase/uno/unotxdoc.cxx 
b/sw/source/uibase/uno/unotxdoc.cxx
index c028d4bccaed..20c3d1cedf47 100644
--- a/sw/source/uibase/uno/unotxdoc.cxx
+++ b/sw/source/uibase/uno/unotxdoc.cxx
@@ -1250,6 +1250,11 @@ Reference< XNameAccess >  
SwXTextDocument::getTextFrames()
 }
 
 Reference< XNameAccess >  SwXTextDocument::getStyleFamilies()
+{
+    return getSwStyleFamilies();
+}
+
+rtl::Reference< SwXStyleFamilies >  SwXTextDocument::getSwStyleFamilies()
 {
     SolarMutexGuard aGuard;
     ThrowIfInvalid();
diff --git a/sw/source/writerfilter/dmapper/DomainMapper.cxx 
b/sw/source/writerfilter/dmapper/DomainMapper.cxx
index 202a5343e510..d4399269eec6 100644
--- a/sw/source/writerfilter/dmapper/DomainMapper.cxx
+++ b/sw/source/writerfilter/dmapper/DomainMapper.cxx
@@ -93,6 +93,7 @@
 #include <sal/log.hxx>
 #include <tools/UnitConversion.hxx>
 #include <unotxdoc.hxx>
+#include <unostyle.hxx>
 #include <SwXTextDefaults.hxx>
 
 using namespace ::com::sun::star;
@@ -5085,7 +5086,7 @@ void DomainMapper::commentProps(const OUString& sId, 
const CommentProperties& rP
     m_pImpl->commentProps(sId, rProps);
 }
 
-css::uno::Reference<css::container::XNameContainer> const & 
DomainMapper::GetCharacterStyles()
+rtl::Reference<SwXStyleFamily> const & DomainMapper::GetCharacterStyles()
 {
     return m_pImpl->GetCharacterStyles();
 }
diff --git a/sw/source/writerfilter/dmapper/DomainMapper.hxx 
b/sw/source/writerfilter/dmapper/DomainMapper.hxx
index 03b6540cfca3..349029657b68 100644
--- a/sw/source/writerfilter/dmapper/DomainMapper.hxx
+++ b/sw/source/writerfilter/dmapper/DomainMapper.hxx
@@ -32,6 +32,7 @@
 #include <memory>
 
 class SwXTextDocument;
+class SwXStyleFamily;
 namespace com::sun::star{
     namespace beans{
         struct PropertyValue;
@@ -142,7 +143,7 @@ public:
 
     virtual void commentProps(const OUString& sId, const CommentProperties& 
rProps) override;
 
-    css::uno::Reference<css::container::XNameContainer> const & 
GetCharacterStyles();
+    rtl::Reference<SwXStyleFamily> const & GetCharacterStyles();
     OUString GetUnusedCharacterStyleName();
     bool IsNewDoc() const;
 
diff --git a/sw/source/writerfilter/dmapper/DomainMapper_Impl.cxx 
b/sw/source/writerfilter/dmapper/DomainMapper_Impl.cxx
index 50bdd274e6f0..942f0d516d17 100644
--- a/sw/source/writerfilter/dmapper/DomainMapper_Impl.cxx
+++ b/sw/source/writerfilter/dmapper/DomainMapper_Impl.cxx
@@ -145,6 +145,7 @@
 #include <unolinebreak.hxx>
 #include <unoframe.hxx>
 #include <unoxstyle.hxx>
+#include <unostyle.hxx>
 #include <unocontentcontrol.hxx>
 #include <unofootnote.hxx>
 #include <unoport.hxx>
@@ -453,11 +454,13 @@ writerfilter::ooxml::OOXMLDocument* 
DomainMapper_Impl::getDocumentReference() co
     return m_pOOXMLDocument;
 }
 
-uno::Reference< container::XNameContainer > const &  
DomainMapper_Impl::GetPageStyles()
+rtl::Reference< SwXStyleFamily > const &  DomainMapper_Impl::GetPageStyles()
 {
-    if(!m_xPageStyles1.is() && m_xTextDocument)
-        m_xTextDocument->getStyleFamilies()->getByName(u"PageStyles"_ustr) >>= 
m_xPageStyles1;
-    return m_xPageStyles1;
+    if(!m_xPageStyles.is() && m_xTextDocument)
+    {
+        m_xPageStyles = m_xTextDocument->getSwStyleFamilies()->GetPageStyles();
+    }
+    return m_xPageStyles;
 }
 
 OUString DomainMapper_Impl::GetUnusedPageStyleName()
@@ -487,17 +490,21 @@ OUString DomainMapper_Impl::GetUnusedPageStyleName()
     return sPageStyleName;
 }
 
-uno::Reference< container::XNameContainer > const &  
DomainMapper_Impl::GetCharacterStyles()
+rtl::Reference< SwXStyleFamily > const &  
DomainMapper_Impl::GetCharacterStyles()
 {
     if(!m_xCharacterStyles.is() && m_xTextDocument)
-        
m_xTextDocument->getStyleFamilies()->getByName(u"CharacterStyles"_ustr) >>= 
m_xCharacterStyles;
+    {
+        m_xCharacterStyles = 
m_xTextDocument->getSwStyleFamilies()->GetCharacterStyles();
+    }
     return m_xCharacterStyles;
 }
 
-uno::Reference<container::XNameContainer> const& 
DomainMapper_Impl::GetParagraphStyles()
+rtl::Reference<SwXStyleFamily> const& DomainMapper_Impl::GetParagraphStyles()
 {
     if (!m_xParagraphStyles.is() && m_xTextDocument)
-        
m_xTextDocument->getStyleFamilies()->getByName(u"ParagraphStyles"_ustr) >>= 
m_xParagraphStyles;
+    {
+        m_xParagraphStyles = 
m_xTextDocument->getSwStyleFamilies()->GetParagraphStyles();
+    }
     return m_xParagraphStyles;
 }
 
diff --git a/sw/source/writerfilter/dmapper/DomainMapper_Impl.hxx 
b/sw/source/writerfilter/dmapper/DomainMapper_Impl.hxx
index 223992082645..f40fa1dec1e7 100644
--- a/sw/source/writerfilter/dmapper/DomainMapper_Impl.hxx
+++ b/sw/source/writerfilter/dmapper/DomainMapper_Impl.hxx
@@ -62,6 +62,7 @@ class SwXTextField;
 class SwXTextFrame;
 class SwXTextEmbeddedObject;
 class SwXText;
+class SwXStyleFamily;
 namespace com::sun::star{
         namespace awt{
             struct Size;
@@ -546,11 +547,11 @@ private:
     rtl::Reference<SwXTextDocument> m_xTextDocument;
     rtl::Reference<SwXDocumentSettings> m_xDocumentSettings;
     css::uno::Reference<css::uno::XComponentContext> m_xComponentContext;
-    css::uno::Reference<css::container::XNameContainer> m_xPageStyles1;
+    rtl::Reference<SwXStyleFamily> m_xPageStyles;
     // cache next available number, expensive to repeatedly compute
     std::optional<int> m_xNextUnusedPageStyleNo;
-    css::uno::Reference<css::container::XNameContainer> m_xCharacterStyles;
-    css::uno::Reference<css::container::XNameContainer> m_xParagraphStyles;
+    rtl::Reference<SwXStyleFamily> m_xCharacterStyles;
+    rtl::Reference<SwXStyleFamily> m_xParagraphStyles;
 
     // cache next available number, expensive to repeatedly compute
     std::optional<int> m_xNextUnusedCharacterStyleNo;
@@ -721,10 +722,10 @@ public:
         return m_pLastSectionContext.get( );
     }
 
-    css::uno::Reference<css::container::XNameContainer> const & 
GetPageStyles();
+    rtl::Reference<SwXStyleFamily> const & GetPageStyles();
     OUString GetUnusedPageStyleName();
-    css::uno::Reference<css::container::XNameContainer> const & 
GetCharacterStyles();
-    css::uno::Reference<css::container::XNameContainer> const& 
GetParagraphStyles();
+    rtl::Reference<SwXStyleFamily> const & GetCharacterStyles();
+    rtl::Reference<SwXStyleFamily> const& GetParagraphStyles();
     OUString GetUnusedCharacterStyleName();
     rtl::Reference<SwXText> const & GetBodyText();
     const rtl::Reference<SwXTextDocument>& GetTextDocument() const
diff --git a/sw/source/writerfilter/dmapper/PropertyMap.cxx 
b/sw/source/writerfilter/dmapper/PropertyMap.cxx
index ce9b20c2f1f9..21638e5180c5 100644
--- a/sw/source/writerfilter/dmapper/PropertyMap.cxx
+++ b/sw/source/writerfilter/dmapper/PropertyMap.cxx
@@ -68,6 +68,7 @@
 #include <unosection.hxx>
 #include <unotxdoc.hxx>
 #include <unoxstyle.hxx>
+#include <unostyle.hxx>
 #include <unotext.hxx>
 #include <utility>
 
@@ -484,7 +485,7 @@ SectionPropertyMap::SectionPropertyMap( bool 
bIsFirstSection )
 
 rtl::Reference<SwXPageStyle> 
SectionPropertyMap::GetPageStyle(DomainMapper_Impl& rDM_Impl)
 {
-    const uno::Reference< container::XNameContainer >& xPageStyles = 
rDM_Impl.GetPageStyles();
+    const rtl::Reference< SwXStyleFamily >& xPageStyles = 
rDM_Impl.GetPageStyles();
     rtl::Reference<SwXPageStyle> xReturnPageStyle;
     try
     {
diff --git a/sw/source/writerfilter/dmapper/StyleSheetTable.cxx 
b/sw/source/writerfilter/dmapper/StyleSheetTable.cxx
index 5c259de5ff38..18adf5b764a6 100644
--- a/sw/source/writerfilter/dmapper/StyleSheetTable.cxx
+++ b/sw/source/writerfilter/dmapper/StyleSheetTable.cxx
@@ -54,6 +54,7 @@
 #include <o3tl/sorted_vector.hxx>
 #include <unotxdoc.hxx>
 #include <unoxstyle.hxx>
+#include <unostyle.hxx>
 #include <SwXTextDefaults.hxx>
 
 using namespace ::com::sun::star;
@@ -2145,7 +2146,7 @@ OUString StyleSheetTable::getOrCreateCharStyle( 
PropertyValueVector_t& rCharProp
         return sListLabel;
 
     //create a new one otherwise
-    const uno::Reference< container::XNameContainer >& xCharStyles = 
m_pImpl->m_rDMapper.GetCharacterStyles();
+    const rtl::Reference< SwXStyleFamily >& xCharStyles = 
m_pImpl->m_rDMapper.GetCharacterStyles();
     sListLabel = m_pImpl->m_rDMapper.GetUnusedCharacterStyleName();
     if (!m_pImpl->m_xTextDocument)
         throw uno::RuntimeException();
commit 4cad11120687b5dcb6812e88a03712686ff78333
Author:     Noel Grandin <noel.gran...@collabora.co.uk>
AuthorDate: Sat Aug 3 18:56:57 2024 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Sun Aug 4 08:42:53 2024 +0200

    simplify IMark hierarchy (1)
    
    The undoes some of the "reduce god objects" work, but leaves the primary
    utility of that work in place.
    
    The hierarchy invented to hide the MarkBase hierarchy is an unnecessary
    abstraction, and it results in considerable costs in dynamic_cast'ing in
    various places, and makes it much harder to optimise and maintain
    type-safety.
    
    In this first stage, I move the bulk of the declarations from
    bookmark.hxx to IMark.hxx, and remove the IBookmark interface class in
    favour of using the concrete Bookmark class (which already exposes some
    dead code).
    
    Change-Id: I9712506bd6f58bdddc5193823888e65d24d79ddf
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/171445
    Tested-by: Jenkins
    Reviewed-by: Bjoern Michaelsen <bjoern.michael...@libreoffice.org>
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/sw/inc/IDocumentMarkAccess.hxx b/sw/inc/IDocumentMarkAccess.hxx
index bc8f2e1c03d6..377013b94c89 100644
--- a/sw/inc/IDocumentMarkAccess.hxx
+++ b/sw/inc/IDocumentMarkAccess.hxx
@@ -286,20 +286,20 @@ class IDocumentMarkAccess
         */
         virtual const_iterator_t findFirstMarkNotStartsBefore(const 
SwPosition& rPos) const =0;
 
-        // interface IBookmarks (BOOKMARK, CROSSREF_NUMITEM_BOOKMARK, 
CROSSREF_HEADING_BOOKMARK )
+        // interface Bookmarks (BOOKMARK, CROSSREF_NUMITEM_BOOKMARK, 
CROSSREF_HEADING_BOOKMARK )
 
         /** check if the selection would delete a BOOKMARK */
         virtual bool isBookmarkDeleted(SwPaM const& rPaM, bool isReplace) 
const =0;
 
-        /** returns a STL-like random access iterator to the begin of the 
sequence the IBookmarks.
+        /** returns a STL-like random access iterator to the begin of the 
sequence the Bookmarks.
         */
         virtual const_iterator_t getBookmarksBegin() const =0;
 
-        /** returns a STL-like random access iterator to the end of the 
sequence of IBookmarks.
+        /** returns a STL-like random access iterator to the end of the 
sequence of Bookmarks.
         */
         virtual const_iterator_t getBookmarksEnd() const =0;
 
-        /** returns the number of IBookmarks.
+        /** returns the number of Bookmarks.
         */
         virtual sal_Int32 getBookmarksCount() const =0;
 
diff --git a/sw/inc/IMark.hxx b/sw/inc/IMark.hxx
index 04b7efa22141..3ca72a6fd5ef 100644
--- a/sw/inc/IMark.hxx
+++ b/sw/inc/IMark.hxx
@@ -16,15 +16,32 @@
  *   except in compliance with the License. You may obtain a copy of
  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
  */
-#ifndef INCLUDED_SW_INC_IMARK_HXX
-#define INCLUDED_SW_INC_IMARK_HXX
+#pragma once
 
+#include <com/sun/star/text/XTextContent.hpp>
+#include <cppuhelper/weakref.hxx>
+#include <osl/diagnose.h>
+#include <rtl/ustring.hxx>
+#include <sfx2/Metadatable.hxx>
+#include <unotools/weakref.hxx>
+#include <tools/ref.hxx>
 #include <vcl/keycod.hxx>
+#include "swrect.hxx"
 #include "calbck.hxx"
 #include "pam.hxx"
+#include "swdllapi.h"
 #include <map>
 #include <memory>
-#include "swdllapi.h"
+#include <optional>
+#include <string_view>
+
+class SwDoc;
+class SwEditWin;
+class SvNumberFormatter;
+class SwServerObject;
+class SfxViewShell;
+class SwXBookmark;
+class FormFieldButton;
 
 namespace sw::mark
 {
@@ -64,26 +81,6 @@ namespace sw::mark
             IMark &operator =(IMark const&) = delete;
     };
 
-    class SW_DLLPUBLIC IBookmark
-        : virtual public IMark
-    {
-        protected:
-            IBookmark() = default;
-
-        public:
-            virtual const OUString& GetShortName() const =0;
-            virtual const vcl::KeyCode& GetKeyCode() const =0;
-            virtual void SetShortName(const OUString&) =0;
-            virtual void SetKeyCode(const vcl::KeyCode&) =0;
-            virtual bool IsHidden() const =0;
-            virtual const OUString& GetHideCondition() const =0;
-            virtual void Hide(bool hide) =0;
-            virtual void SetHideCondition(const OUString&) =0;
-        private:
-            IBookmark(IBookmark const &) = delete;
-            IBookmark &operator =(IBookmark const&) = delete;
-    };
-
     class SW_DLLPUBLIC SAL_LOPLUGIN_ANNOTATE("crosscast") IFieldmark
         : virtual public IMark
     {
@@ -165,7 +162,318 @@ namespace sw::mark
 
     OUString ExpandFieldmark(IFieldmark* pBM);
 
+    class SW_DLLPUBLIC MarkBase
+        : virtual public IMark
+    {
+    public:
+        //getters
+        SwPosition& GetMarkPos() const override
+            { return const_cast<SwPosition&>(*m_oPos1); }
+        const OUString& GetName() const override
+            { return m_aName; }
+        SwPosition& GetOtherMarkPos() const override
+        {
+            OSL_PRECOND(IsExpanded(), "<SwPosition::GetOtherMarkPos(..)> - I 
have no other Pos set." );
+            return const_cast<SwPosition&>(*m_oPos2);
+        }
+        SwPosition& GetMarkStart() const override
+        {
+            if( !IsExpanded() ) return GetMarkPos( );
+            if ( GetMarkPos( ) < GetOtherMarkPos( ) )
+                return GetMarkPos();
+            else
+                return GetOtherMarkPos( );
+        }
+        SwPosition& GetMarkEnd() const override
+        {
+            if( !IsExpanded() ) return GetMarkPos();
+            if ( GetMarkPos( ) >= GetOtherMarkPos( ) )
+                return GetMarkPos( );
+            else
+                return GetOtherMarkPos( );
+        }
+
+        bool IsCoveringPosition(const SwPosition& rPos) const override;
+        bool IsExpanded() const override
+            { return m_oPos2.has_value(); }
+
+        void SetName(const OUString& rName)
+            { m_aName = rName; }
+        virtual void SetMarkPos(const SwPosition& rNewPos);
+        virtual void SetOtherMarkPos(const SwPosition& rNewPos);
+        virtual void ClearOtherMarkPos()
+            { m_oPos2.reset(); }
+
+        virtual auto InvalidateFrames() -> void;
+
+        OUString ToString( ) const override;
+        void dumpAsXml(xmlTextWriterPtr pWriter) const override;
+
+        void Swap()
+        {
+            if(m_oPos2)
+                m_oPos1.swap(m_oPos2);
+        }
+
+        virtual void InitDoc(SwDoc&, sw::mark::InsertMode, SwPosition const*)
+        {
+        }
+
+        ~MarkBase() override;
+
+        const unotools::WeakReference<SwXBookmark> & GetXBookmark() const
+                { return m_wXBookmark; }
+        void SetXBookmark(rtl::Reference<SwXBookmark> const& xBkmk);
+
+        static OUString GenerateNewName(std::u16string_view rPrefix);
+    protected:
+        // SwClient
+        void SwClientNotify(const SwModify&, const SfxHint&) override;
+
+        MarkBase(const SwPaM& rPaM, OUString aName);
+        std::optional<SwPosition> m_oPos1;
+        std::optional<SwPosition> m_oPos2;
+        OUString m_aName;
+
+        unotools::WeakReference<SwXBookmark> m_wXBookmark;
+    };
+
+    class NavigatorReminder final
+        : public MarkBase
+    {
+    public:
+        NavigatorReminder(const SwPaM& rPaM);
+    };
+
+    class UnoMark final
+        : public MarkBase
+    {
+    public:
+        UnoMark(const SwPaM& rPaM);
+    };
+
+    class SW_DLLPUBLIC DdeBookmark
+        : public MarkBase
+    {
+    public:
+        DdeBookmark(const SwPaM& rPaM);
+
+        const SwServerObject* GetRefObject() const { return m_aRefObj.get(); }
+        SwServerObject* GetRefObject() { return m_aRefObj.get(); }
+
+        bool IsServer() const { return m_aRefObj.is(); }
+
+        void SetRefObject( SwServerObject* pObj );
+
+        virtual void DeregisterFromDoc(SwDoc& rDoc);
+        ~DdeBookmark() override;
+
+    private:
+        tools::SvRef<SwServerObject> m_aRefObj;
+    };
+
+    class SW_DLLPUBLIC Bookmark
+        : public DdeBookmark
+        , public ::sfx2::Metadatable
+    {
+    public:
+        Bookmark(const SwPaM& rPaM,
+            const vcl::KeyCode& rCode,
+            const OUString& rName);
+        void InitDoc(SwDoc& io_Doc, sw::mark::InsertMode eMode, SwPosition 
const* pSepPos) override;
+
+        void DeregisterFromDoc(SwDoc& io_rDoc) override;
+
+        auto InvalidateFrames() -> void override;
+
+        const OUString& GetShortName() const
+            { return m_sShortName; }
+        const vcl::KeyCode& GetKeyCode() const
+            { return m_aCode; }
+        void SetShortName(const OUString& rShortName)
+            { m_sShortName = rShortName; }
+        void SetKeyCode(const vcl::KeyCode& rCode)
+            { m_aCode = rCode; }
+        bool IsHidden() const
+            { return m_bHidden; }
+        const OUString& GetHideCondition() const
+            { return m_sHideCondition; }
+        void Hide(bool rHide);
+        void SetHideCondition(const OUString& rHideCondition);
+
+        // ::sfx2::Metadatable
+        ::sfx2::IXmlIdRegistry& GetRegistry() override;
+        bool IsInClipboard() const override;
+        bool IsInUndo() const override;
+        bool IsInContent() const override;
+        void sendLOKDeleteCallback();
+        css::uno::Reference< css::rdf::XMetadatable > MakeUnoObject() override;
+
+    private:
+        vcl::KeyCode m_aCode;
+        OUString m_sShortName;
+        bool m_bHidden;
+        OUString m_sHideCondition;
+    };
+
+    class Fieldmark
+        : virtual public IFieldmark
+        , public MarkBase
+    {
+    public:
+        Fieldmark(const SwPaM& rPaM);
+
+        OUString GetFieldname() const override
+            { return m_aFieldname; }
+        OUString GetFieldHelptext() const override
+            { return m_aFieldHelptext; }
+
+        IFieldmark::parameter_map_t* GetParameters() override
+            { return &m_vParams; }
+
+        const IFieldmark::parameter_map_t* GetParameters() const override
+            { return &m_vParams; }
+
+        void SetFieldname(const OUString& aFieldname) override
+            { m_aFieldname = aFieldname; }
+        void SetFieldHelptext(const OUString& aFieldHelptext) override
+            { m_aFieldHelptext = aFieldHelptext; }
+
+        virtual void ReleaseDoc(SwDoc&) = 0;
+
+        void SetMarkStartPos( const SwPosition& rNewStartPos );
+
+        void Invalidate() override;
+        OUString ToString() const override;
+        void dumpAsXml(xmlTextWriterPtr pWriter) const override;
+
+    private:
+        OUString m_aFieldname;
+        OUString m_aFieldHelptext;
+        IFieldmark::parameter_map_t m_vParams;
+    };
+
+    class TextFieldmark final
+        : public Fieldmark
+    {
+    public:
+        TextFieldmark(const SwPaM& rPaM, const OUString& rName);
+        ~TextFieldmark();
+        void InitDoc(SwDoc& io_rDoc, sw::mark::InsertMode eMode, SwPosition 
const* pSepPos) override;
+        void ReleaseDoc(SwDoc& rDoc) override;
+
+        OUString GetContent() const override;
+        void ReplaceContent(const OUString& sNewContent) override;
+
+    private:
+        sw::DocumentContentOperationsManager* 
m_pDocumentContentOperationsManager;
+    };
+
+    // Non text fieldmarks have no content between the start and end marks.
+    class NonTextFieldmark
+        : public Fieldmark
+    {
+    public:
+        NonTextFieldmark(const SwPaM& rPaM);
+        void InitDoc(SwDoc& io_rDoc, sw::mark::InsertMode eMode, SwPosition 
const* pSepPos) override;
+        void ReleaseDoc(SwDoc& rDoc) override;
+    };
+
+    /// Fieldmark representing a checkbox form field.
+    class CheckboxFieldmark final
+        : virtual public ICheckboxFieldmark
+        , public NonTextFieldmark
+    {
+    public:
+        CheckboxFieldmark(const SwPaM& rPaM, const OUString& rName);
+        bool IsChecked() const override;
+        void SetChecked(bool checked) override;
+        OUString GetContent() const override;
+        void ReplaceContent(const OUString& sNewContent) override;
+    };
+
+    /// Fieldmark with a drop down button (e.g. this button opens the date 
picker for a date field)
+    class FieldmarkWithDropDownButton
+        : public NonTextFieldmark
+    {
+    public:
+        FieldmarkWithDropDownButton(const SwPaM& rPaM);
+        ~FieldmarkWithDropDownButton() override;
+
+        virtual void ShowButton(SwEditWin* pEditWin) = 0;
+        virtual void RemoveButton();
+        void LaunchPopup();
+
+    protected:
+        VclPtr<FormFieldButton> m_pButton;
+    };
+
+    /// Fieldmark representing a drop-down form field.
+    class DropDownFieldmark final
+        : virtual public IDropdownFieldmark
+        , public FieldmarkWithDropDownButton
+    {
+    public:
+        DropDownFieldmark(const SwPaM& rPaM, const OUString& rName);
+        ~DropDownFieldmark() override;
+
+        void ShowButton(SwEditWin* pEditWin) override;
+        void RemoveButton() override;
+        OUString GetContent(sal_Int32* pIndex) const override;
+        OUString GetContent() const override;
+        void AddContent(const OUString& rText, sal_Int32* pIndex = nullptr) 
override;
+        void DelContent(sal_Int32 nDelIndex = -1) override;
+        void ReplaceContent(const OUString* pText, sal_Int32* pIndex) override;
+        void ReplaceContent(const OUString& sNewContent) override;
+
+        // This method should be called only by the portion so we can now the 
portion's painting area
+        void SetPortionPaintArea(const SwRect& rPortionPaintArea);
+
+        void SendLOKShowMessage(const SfxViewShell* pViewShell);
+        static void SendLOKHideMessage(const SfxViewShell* pViewShell);
+
+    private:
+        SwRect m_aPortionPaintArea;
+    };
+
+    /// Fieldmark representing a date form field.
+    /// TODO: this was an SDT in DOCX, which is modelled suboptimally here
+    /// as a fieldmark; as it cannot contain paragraph breaks, must be
+    /// well-formed XML element, and does not have field separator, it
+    /// should be a nesting text attribute similar to SwTextMeta.
+    class DateFieldmark final
+        : virtual public IDateFieldmark
+        , public FieldmarkWithDropDownButton
+    {
+    public:
+        DateFieldmark(const SwPaM& rPaM);
+        ~DateFieldmark() override;
+
+        void InitDoc(SwDoc& io_rDoc, sw::mark::InsertMode eMode, SwPosition 
const* pSepPos) override;
+        void ReleaseDoc(SwDoc& rDoc) override;
+
+        void ShowButton(SwEditWin* pEditWin) override;
+
+        void SetPortionPaintAreaStart(const SwRect& rPortionPaintArea);
+        void SetPortionPaintAreaEnd(const SwRect& rPortionPaintArea);
+
+        OUString GetContent() const override;
+        void ReplaceContent(const OUString& sNewContent) override;
+
+        std::pair<bool, double> GetCurrentDate() const override;
+        void SetCurrentDate(double fDate) override;
+        OUString GetDateInStandardDateFormat(double fDate) const override;
+
+    private:
+        OUString GetDateInCurrentDateFormat(double fDate) const;
+        std::pair<bool, double> ParseCurrentDateParam() const;
+        void InvalidateCurrentDateParam();
+
+        SvNumberFormatter* m_pNumberFormatter;
+        sw::DocumentContentOperationsManager* 
m_pDocumentContentOperationsManager;
+        SwRect m_aPaintAreaStart;
+        SwRect m_aPaintAreaEnd;
+    };
 }
-#endif
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/crsr/crbm.cxx b/sw/source/core/crsr/crbm.cxx
index a7d81030dcbf..c60306a7e626 100644
--- a/sw/source/core/crsr/crbm.cxx
+++ b/sw/source/core/crsr/crbm.cxx
@@ -85,7 +85,7 @@ namespace
         *GetCursor(),
         rName,
         eMark, sw::mark::InsertMode::New);
-    ::sw::mark::IBookmark* pBookmark = dynamic_cast< ::sw::mark::IBookmark* 
>(pMark);
+    ::sw::mark::Bookmark* pBookmark = dynamic_cast< ::sw::mark::Bookmark* 
>(pMark);
     if(pBookmark)
     {
         pBookmark->SetKeyCode(rCode);
@@ -108,7 +108,7 @@ namespace
         *GetCursor(),
         rName,
         IDocumentMarkAccess::MarkType::BOOKMARK, sw::mark::InsertMode::New);
-    ::sw::mark::IBookmark* pBookmark = dynamic_cast< ::sw::mark::IBookmark* 
>(pMark);
+    ::sw::mark::Bookmark* pBookmark = dynamic_cast< ::sw::mark::Bookmark* 
>(pMark);
     if (pBookmark)
     {
         pBookmark->SetKeyCode(rCode);
diff --git a/sw/source/core/doc/DocumentContentOperationsManager.cxx 
b/sw/source/core/doc/DocumentContentOperationsManager.cxx
index 73811f5d083e..02af74aea64d 100644
--- a/sw/source/core/doc/DocumentContentOperationsManager.cxx
+++ b/sw/source/core/doc/DocumentContentOperationsManager.cxx
@@ -324,10 +324,10 @@ namespace sw
             rDestDoc.getIDocumentMarkAccess()->renameMark(pNewMark, 
sRequestedName);
 
             // copying additional attributes for bookmarks or fieldmarks
-            ::sw::mark::IBookmark* const pNewBookmark =
-                dynamic_cast< ::sw::mark::IBookmark* const >(pNewMark);
-            const ::sw::mark::IBookmark* const pOldBookmark =
-                dynamic_cast< const ::sw::mark::IBookmark* >(pMark);
+            ::sw::mark::Bookmark* const pNewBookmark =
+                dynamic_cast< ::sw::mark::Bookmark* const >(pNewMark);
+            const ::sw::mark::Bookmark* const pOldBookmark =
+                dynamic_cast< const ::sw::mark::Bookmark* >(pMark);
             if (pNewBookmark && pOldBookmark)
             {
                 pNewBookmark->SetKeyCode(pOldBookmark->GetKeyCode());
diff --git a/sw/source/core/doc/DocumentFieldsManager.cxx 
b/sw/source/core/doc/DocumentFieldsManager.cxx
index 05e26e9cf0f2..d270ef6618d0 100644
--- a/sw/source/core/doc/DocumentFieldsManager.cxx
+++ b/sw/source/core/doc/DocumentFieldsManager.cxx
@@ -963,8 +963,8 @@ void DocumentFieldsManager::UpdateExpFieldsImpl(
             }
             continue;
         }
-        ::sw::mark::IBookmark *const pBookmark(
-                const_cast<::sw::mark::IBookmark *>(it->GetBookmark()));
+        ::sw::mark::Bookmark *const pBookmark(
+                const_cast<::sw::mark::Bookmark *>(it->GetBookmark()));
         if (pBookmark)
         {
             SwSbxValue const 
aValue(aCalc.Calculate(pBookmark->GetHideCondition()));
diff --git a/sw/source/core/doc/docbm.cxx b/sw/source/core/doc/docbm.cxx
index 84d09de32d72..19661ad37ff0 100644
--- a/sw/source/core/doc/docbm.cxx
+++ b/sw/source/core/doc/docbm.cxx
@@ -1913,20 +1913,14 @@ SaveBookmark::SaveBookmark(
     , m_bHidden(false)
     , m_eOrigBkmType(IDocumentMarkAccess::GetType(rBkmk))
 {
-    const IBookmark* const pBookmark = dynamic_cast< const IBookmark* 
>(&rBkmk);
+    const Bookmark* const pBookmark = dynamic_cast< const Bookmark* >(&rBkmk);
     if(pBookmark)
     {
         m_aShortName = pBookmark->GetShortName();
         m_aCode = pBookmark->GetKeyCode();
         m_bHidden = pBookmark->IsHidden();
         m_aHideCondition = pBookmark->GetHideCondition();
-
-        ::sfx2::Metadatable const*const pMetadatable(
-                dynamic_cast< ::sfx2::Metadatable const* >(pBookmark));
-        if (pMetadatable)
-        {
-            m_pMetadataUndo = pMetadatable->CreateUndo();
-        }
+        m_pMetadataUndo = pBookmark->CreateUndo();
     }
     m_nNode1 = rBkmk.GetMarkPos().GetNodeIndex();
     m_nContent1 = rBkmk.GetMarkPos().GetContentIndex();
@@ -1995,7 +1989,7 @@ void SaveBookmark::SetInDoc(
         && !CheckNodesRange(aPam.GetPoint()->GetNode(), 
aPam.GetMark()->GetNode(), true))
         return;
 
-    ::sw::mark::IBookmark* const pBookmark = 
dynamic_cast<::sw::mark::IBookmark*>(
+    ::sw::mark::Bookmark* const pBookmark = 
dynamic_cast<::sw::mark::Bookmark*>(
         pDoc->getIDocumentMarkAccess()->makeMark(aPam, m_aName,
             m_eOrigBkmType, sw::mark::InsertMode::CopyText));
     if(!pBookmark)
@@ -2007,15 +2001,7 @@ void SaveBookmark::SetInDoc(
     pBookmark->SetHideCondition(m_aHideCondition);
 
     if (m_pMetadataUndo)
-    {
-        ::sfx2::Metadatable * const pMeta(
-            dynamic_cast< ::sfx2::Metadatable* >(pBookmark));
-        assert(pMeta && "metadata undo, but not metadatable?");
-        if (pMeta)
-        {
-            pMeta->RestoreMetadata(m_pMetadataUndo);
-        }
-    }
+        pBookmark->RestoreMetadata(m_pMetadataUndo);
 }
 
 // DelBookmarks
diff --git a/sw/source/core/doc/docfld.cxx b/sw/source/core/doc/docfld.cxx
index 1a92bd8dd19f..4f7ca94994df 100644
--- a/sw/source/core/doc/docfld.cxx
+++ b/sw/source/core/doc/docfld.cxx
@@ -112,7 +112,7 @@ SetGetExpField::SetGetExpField( const SwSectionNode& 
rSectNd,
     }
 }
 
-SetGetExpField::SetGetExpField(::sw::mark::IBookmark const& rBookmark,
+SetGetExpField::SetGetExpField(::sw::mark::Bookmark const& rBookmark,
                                SwPosition const*const pPos,
                                sal_uInt16 const nPageNumber)
     : m_nPageNumber(nPageNumber)
@@ -922,7 +922,7 @@ void SwDocUpdateField::MakeFieldList_( SwDoc& rDoc, int 
eGetMode )
         auto const& rIDMA(*rDoc.getIDocumentMarkAccess());
         for (auto it = rIDMA.getBookmarksBegin(); it != 
rIDMA.getBookmarksEnd(); ++it)
         {
-            auto const pBookmark(dynamic_cast<::sw::mark::IBookmark 
const*>(*it));
+            auto const pBookmark(dynamic_cast<::sw::mark::Bookmark 
const*>(*it));
             assert(pBookmark);
             if (!pBookmark->GetHideCondition().isEmpty())
             {
diff --git a/sw/source/core/doc/docredln.cxx b/sw/source/core/doc/docredln.cxx
index 72809b7b9339..5d347cdb34d9 100644
--- a/sw/source/core/doc/docredln.cxx
+++ b/sw/source/core/doc/docredln.cxx
@@ -1808,7 +1808,7 @@ static void lcl_storeAnnotationMarks(SwDoc& rDoc, const 
SwPosition* pStt, const
                     aPam,
                     (**iter).GetName(),
                     IDocumentMarkAccess::MarkType::BOOKMARK, 
sw::mark::InsertMode::New);
-                ::sw::mark::IBookmark* pBookmark = dynamic_cast< 
::sw::mark::IBookmark* >(pMark);
+                ::sw::mark::Bookmark* pBookmark = dynamic_cast< 
::sw::mark::Bookmark* >(pMark);
                 if (pBookmark)
                 {
                     pBookmark->SetKeyCode(vcl::KeyCode());
diff --git a/sw/source/core/inc/bookmark.hxx b/sw/source/core/inc/bookmark.hxx
index 8a3fc98f260c..d30945e53061 100644
--- a/sw/source/core/inc/bookmark.hxx
+++ b/sw/source/core/inc/bookmark.hxx
@@ -19,343 +19,13 @@
 
 #pragma once
 
-#include <cppuhelper/weakref.hxx>
-#include <sfx2/Metadatable.hxx>
-#include <vcl/keycod.hxx>
-#include <unotools/weakref.hxx>
-#include <memory>
-#include <optional>
-#include <string_view>
-#include <com/sun/star/text/XTextContent.hpp>
 
-#include <rtl/ustring.hxx>
-#include <osl/diagnose.h>
-#include <tools/ref.hxx>
 #include <IMark.hxx>
-#include <swrect.hxx>
 #include "FormFieldButton.hxx"
 
-class SwDoc;
-class SwEditWin;
-class SwServerObject;
-class SvNumberFormatter;
-class SfxViewShell;
-class SwXBookmark;
 
-namespace sw::mark {
-        class MarkBase
-            : virtual public IMark
-        {
-        public:
-            //getters
-            SwPosition& GetMarkPos() const override
-                { return const_cast<SwPosition&>(*m_oPos1); }
-            const OUString& GetName() const override
-                { return m_aName; }
-            SwPosition& GetOtherMarkPos() const override
-            {
-                OSL_PRECOND(IsExpanded(), "<SwPosition::GetOtherMarkPos(..)> - 
I have no other Pos set." );
-                return const_cast<SwPosition&>(*m_oPos2);
-            }
-            SwPosition& GetMarkStart() const override
-            {
-                if( !IsExpanded() ) return GetMarkPos( );
-                if ( GetMarkPos( ) < GetOtherMarkPos( ) )
-                    return GetMarkPos();
-                else
-                    return GetOtherMarkPos( );
-            }
-            SwPosition& GetMarkEnd() const override
-            {
-                if( !IsExpanded() ) return GetMarkPos();
-                if ( GetMarkPos( ) >= GetOtherMarkPos( ) )
-                    return GetMarkPos( );
-                else
-                    return GetOtherMarkPos( );
-            }
-
-            bool IsCoveringPosition(const SwPosition& rPos) const override;
-            bool IsExpanded() const override
-                { return m_oPos2.has_value(); }
-
-            void SetName(const OUString& rName)
-                { m_aName = rName; }
-            virtual void SetMarkPos(const SwPosition& rNewPos);
-            virtual void SetOtherMarkPos(const SwPosition& rNewPos);
-            virtual void ClearOtherMarkPos()
-                { m_oPos2.reset(); }
-
-            virtual auto InvalidateFrames() -> void;
-
-            OUString ToString( ) const override;
-            void dumpAsXml(xmlTextWriterPtr pWriter) const override;
-
-            void Swap()
-            {
-                if(m_oPos2)
-                    m_oPos1.swap(m_oPos2);
-            }
-
-            virtual void InitDoc(SwDoc&, sw::mark::InsertMode, SwPosition 
const*)
-            {
-            }
-
-            ~MarkBase() override;
-
-            const unotools::WeakReference<SwXBookmark> & GetXBookmark() const
-                    { return m_wXBookmark; }
-            void SetXBookmark(rtl::Reference<SwXBookmark> const& xBkmk);
-
-            static OUString GenerateNewName(std::u16string_view rPrefix);
-        protected:
-            // SwClient
-            void SwClientNotify(const SwModify&, const SfxHint&) override;
-
-            MarkBase(const SwPaM& rPaM, OUString aName);
-            std::optional<SwPosition> m_oPos1;
-            std::optional<SwPosition> m_oPos2;
-            OUString m_aName;
-
-            unotools::WeakReference<SwXBookmark> m_wXBookmark;
-        };
-
-        class NavigatorReminder final
-            : public MarkBase
-        {
-        public:
-            NavigatorReminder(const SwPaM& rPaM);
-        };
-
-        class UnoMark final
-            : public MarkBase
-        {
-        public:
-            UnoMark(const SwPaM& rPaM);
-        };
-
-        class DdeBookmark
-            : public MarkBase
-        {
-        public:
-            DdeBookmark(const SwPaM& rPaM);
-
-            const SwServerObject* GetRefObject() const { return 
m_aRefObj.get(); }
-            SwServerObject* GetRefObject() { return m_aRefObj.get(); }
-
-            bool IsServer() const { return m_aRefObj.is(); }
-
-            void SetRefObject( SwServerObject* pObj );
-
-            virtual void DeregisterFromDoc(SwDoc& rDoc);
-            ~DdeBookmark() override;
-
-        private:
-            tools::SvRef<SwServerObject> m_aRefObj;
-        };
-
-        class Bookmark
-            : virtual public IBookmark
-            , public DdeBookmark
-            , public ::sfx2::Metadatable
-        {
-        public:
-            Bookmark(const SwPaM& rPaM,
-                const vcl::KeyCode& rCode,
-                const OUString& rName);
-            void InitDoc(SwDoc& io_Doc, sw::mark::InsertMode eMode, SwPosition 
const* pSepPos) override;
-
-            void DeregisterFromDoc(SwDoc& io_rDoc) override;
-
-            auto InvalidateFrames() -> void override;
-
-            const OUString& GetShortName() const override
-                { return m_sShortName; }
-            const vcl::KeyCode& GetKeyCode() const override
-                { return m_aCode; }
-            void SetShortName(const OUString& rShortName) override
-                { m_sShortName = rShortName; }
-            void SetKeyCode(const vcl::KeyCode& rCode) override
-                { m_aCode = rCode; }
-            bool IsHidden() const override
-                { return m_bHidden; }
-            const OUString& GetHideCondition() const override
-                { return m_sHideCondition; }
-            void Hide(bool rHide) override;
-            void SetHideCondition(const OUString& rHideCondition) override;
-
-            // ::sfx2::Metadatable
-            ::sfx2::IXmlIdRegistry& GetRegistry() override;
-            bool IsInClipboard() const override;
-            bool IsInUndo() const override;
-            bool IsInContent() const override;
-            void sendLOKDeleteCallback();
-            css::uno::Reference< css::rdf::XMetadatable > MakeUnoObject() 
override;
-
-        private:
-            vcl::KeyCode m_aCode;
-            OUString m_sShortName;
-            bool m_bHidden;
-            OUString m_sHideCondition;
-        };
-
-        class Fieldmark
-            : virtual public IFieldmark
-            , public MarkBase
-        {
-        public:
-            Fieldmark(const SwPaM& rPaM);
-
-            OUString GetFieldname() const override
-                { return m_aFieldname; }
-            OUString GetFieldHelptext() const override
-                { return m_aFieldHelptext; }
 
-            IFieldmark::parameter_map_t* GetParameters() override
-                { return &m_vParams; }
-
-            const IFieldmark::parameter_map_t* GetParameters() const override
-                { return &m_vParams; }
-
-            void SetFieldname(const OUString& aFieldname) override
-                { m_aFieldname = aFieldname; }
-            void SetFieldHelptext(const OUString& aFieldHelptext) override
-                { m_aFieldHelptext = aFieldHelptext; }
-
-            virtual void ReleaseDoc(SwDoc&) = 0;
-
-            void SetMarkStartPos( const SwPosition& rNewStartPos );
-
-            void Invalidate() override;
-            OUString ToString() const override;
-            void dumpAsXml(xmlTextWriterPtr pWriter) const override;
-
-        private:
-            OUString m_aFieldname;
-            OUString m_aFieldHelptext;
-            IFieldmark::parameter_map_t m_vParams;
-        };
-
-        class TextFieldmark final
-            : public Fieldmark
-        {
-        public:
-            TextFieldmark(const SwPaM& rPaM, const OUString& rName);
-            ~TextFieldmark();
-            void InitDoc(SwDoc& io_rDoc, sw::mark::InsertMode eMode, 
SwPosition const* pSepPos) override;
-            void ReleaseDoc(SwDoc& rDoc) override;
-
-            OUString GetContent() const override;
-            void ReplaceContent(const OUString& sNewContent) override;
-
-        private:
-            sw::DocumentContentOperationsManager* 
m_pDocumentContentOperationsManager;
-        };
-
-        // Non text fieldmarks have no content between the start and end marks.
-        class NonTextFieldmark
-            : public Fieldmark
-        {
-        public:
-            NonTextFieldmark(const SwPaM& rPaM);
-            void InitDoc(SwDoc& io_rDoc, sw::mark::InsertMode eMode, 
SwPosition const* pSepPos) override;
-            void ReleaseDoc(SwDoc& rDoc) override;
-        };
-
-        /// Fieldmark representing a checkbox form field.
-        class CheckboxFieldmark final
-            : virtual public ICheckboxFieldmark
-            , public NonTextFieldmark
-        {
-        public:
-            CheckboxFieldmark(const SwPaM& rPaM, const OUString& rName);
-            bool IsChecked() const override;
-            void SetChecked(bool checked) override;
-            OUString GetContent() const override;
-            void ReplaceContent(const OUString& sNewContent) override;
-        };
-
-        /// Fieldmark with a drop down button (e.g. this button opens the date 
picker for a date field)
-        class FieldmarkWithDropDownButton
-            : public NonTextFieldmark
-        {
-        public:
-            FieldmarkWithDropDownButton(const SwPaM& rPaM);
-            ~FieldmarkWithDropDownButton() override;
-
-            virtual void ShowButton(SwEditWin* pEditWin) = 0;
-            virtual void RemoveButton();
-            void LaunchPopup();
-
-        protected:
-            VclPtr<FormFieldButton> m_pButton;
-        };
-
-        /// Fieldmark representing a drop-down form field.
-        class DropDownFieldmark final
-            : virtual public IDropdownFieldmark
-            , public FieldmarkWithDropDownButton
-        {
-        public:
-            DropDownFieldmark(const SwPaM& rPaM, const OUString& rName);
-            ~DropDownFieldmark() override;
-
-            void ShowButton(SwEditWin* pEditWin) override;
-            void RemoveButton() override;
-            OUString GetContent(sal_Int32* pIndex) const override;
-            OUString GetContent() const override;
-            void AddContent(const OUString& rText, sal_Int32* pIndex = 
nullptr) override;
-            void DelContent(sal_Int32 nDelIndex = -1) override;
-            void ReplaceContent(const OUString* pText, sal_Int32* pIndex) 
override;
-            void ReplaceContent(const OUString& sNewContent) override;
-
-            // This method should be called only by the portion so we can now 
the portion's painting area
-            void SetPortionPaintArea(const SwRect& rPortionPaintArea);
-
-            void SendLOKShowMessage(const SfxViewShell* pViewShell);
-            static void SendLOKHideMessage(const SfxViewShell* pViewShell);
-
-        private:
-            SwRect m_aPortionPaintArea;
-        };
-
-        /// Fieldmark representing a date form field.
-        /// TODO: this was an SDT in DOCX, which is modelled suboptimally here
-        /// as a fieldmark; as it cannot contain paragraph breaks, must be
-        /// well-formed XML element, and does not have field separator, it
-        /// should be a nesting text attribute similar to SwTextMeta.
-        class DateFieldmark final
-            : virtual public IDateFieldmark
-            , public FieldmarkWithDropDownButton
-        {
-        public:
-            DateFieldmark(const SwPaM& rPaM);
-            ~DateFieldmark() override;
-
-            void InitDoc(SwDoc& io_rDoc, sw::mark::InsertMode eMode, 
SwPosition const* pSepPos) override;
-            void ReleaseDoc(SwDoc& rDoc) override;
-
-            void ShowButton(SwEditWin* pEditWin) override;
-
-            void SetPortionPaintAreaStart(const SwRect& rPortionPaintArea);
-            void SetPortionPaintAreaEnd(const SwRect& rPortionPaintArea);
-
-            OUString GetContent() const override;
-            void ReplaceContent(const OUString& sNewContent) override;
-
-            std::pair<bool, double> GetCurrentDate() const override;
-            void SetCurrentDate(double fDate) override;
-            OUString GetDateInStandardDateFormat(double fDate) const override;
-
-        private:
-            OUString GetDateInCurrentDateFormat(double fDate) const;
-            std::pair<bool, double> ParseCurrentDateParam() const;
-            void InvalidateCurrentDateParam();
-
-            SvNumberFormatter* m_pNumberFormatter;
-            sw::DocumentContentOperationsManager* 
m_pDocumentContentOperationsManager;
-            SwRect m_aPaintAreaStart;
-            SwRect m_aPaintAreaEnd;
-        };
+namespace sw::mark {
 
         /// return position of the CH_TXT_ATR_FIELDSEP for rMark
         SwPosition FindFieldSep(IFieldmark const& rMark);
diff --git a/sw/source/core/inc/docfld.hxx b/sw/source/core/inc/docfld.hxx
index f0b4b261a8fe..0f6ed786b23a 100644
--- a/sw/source/core/inc/docfld.hxx
+++ b/sw/source/core/inc/docfld.hxx
@@ -56,7 +56,7 @@ class SetGetExpField
         const SwTableBox* pTBox;
         const SwTextINetFormat* pTextINet;
         const SwFlyFrameFormat* pFlyFormat;
-        ::sw::mark::IBookmark const* pBookmark;
+        ::sw::mark::Bookmark const* pBookmark;
     } m_CNTNT;
     sal_Int32 m_nContent;
     enum SetGetExpFieldType
@@ -76,7 +76,7 @@ public:
                     const SwPosition* pPos = nullptr,
                     sal_uInt16 nPageNumber = 0);
 
-    SetGetExpField( ::sw::mark::IBookmark const& rBookmark,
+    SetGetExpField( ::sw::mark::Bookmark const& rBookmark,
                     SwPosition const* pPos = nullptr,
                     sal_uInt16 nPageNumber = 0);
 
@@ -95,7 +95,7 @@ public:
         { return TEXTFIELD == m_eSetGetExpFieldType ? m_CNTNT.pTextField : 
nullptr; }
     const SwSection* GetSection() const
         { return SECTIONNODE == m_eSetGetExpFieldType ? m_CNTNT.pSection : 
nullptr; }
-    ::sw::mark::IBookmark const* GetBookmark() const
+    ::sw::mark::Bookmark const* GetBookmark() const
         { return BOOKMARK == m_eSetGetExpFieldType ? m_CNTNT.pBookmark : 
nullptr; }
     const SwTextINetFormat* GetINetFormat() const
         { return TEXTINET == m_eSetGetExpFieldType ? m_CNTNT.pTextINet : 
nullptr; }
diff --git a/sw/source/core/inc/scriptinfo.hxx 
b/sw/source/core/inc/scriptinfo.hxx
index 21c3c2240cc4..5abe7157c14b 100644
--- a/sw/source/core/inc/scriptinfo.hxx
+++ b/sw/source/core/inc/scriptinfo.hxx
@@ -36,7 +36,7 @@ class Point;
 class MultiSelection;
 enum class SwFontScript;
 namespace sw { struct MergedPara; }
-namespace sw::mark { class IBookmark; }
+namespace sw::mark { class Bookmark; }
 
 #define SPACING_PRECISION_FACTOR 100
 
@@ -189,10 +189,10 @@ public:
             GetBookmarks(TextFrameIndex const nPos);
     static void CalcHiddenRanges(const SwTextNode& rNode,
             MultiSelection& rHiddenMulti,
-            std::vector<std::pair<sw::mark::IBookmark const*, MarkKind>> * 
pBookmarks);
+            std::vector<std::pair<sw::mark::Bookmark const*, MarkKind>> * 
pBookmarks);
     static void selectHiddenTextProperty(const SwTextNode& rNode,
             MultiSelection &rHiddenMulti,
-            std::vector<std::pair<sw::mark::IBookmark const*, MarkKind>> * 
pBookmarks);
+            std::vector<std::pair<sw::mark::Bookmark const*, MarkKind>> * 
pBookmarks);
     static void selectRedLineDeleted(const SwTextNode& rNode, MultiSelection 
&rHiddenMulti, bool bSelect=true);
 
     // "high" level operations, nPos refers to string position
diff --git a/sw/source/core/text/porlay.cxx b/sw/source/core/text/porlay.cxx
index 16dee7a087ae..a496bff4636a 100644
--- a/sw/source/core/text/porlay.cxx
+++ b/sw/source/core/text/porlay.cxx
@@ -962,7 +962,7 @@ SwFontScript SwScriptInfo::WhichFont(sal_Int32 nIdx, 
OUString const& rText)
     return lcl_ScriptToFont(nScript);
 }
 
-static Color getBookmarkColor(const SwTextNode& rNode, const 
sw::mark::IBookmark* pBookmark)
+static Color getBookmarkColor(const SwTextNode& rNode, const 
sw::mark::Bookmark* pBookmark)
 {
     // search custom color in metadata, otherwise use COL_TRANSPARENT;
     Color c = COL_TRANSPARENT;
@@ -1008,7 +1008,7 @@ static void InitBookmarks(
     std::vector<sw::Extent>::const_iterator iter,
     std::vector<sw::Extent>::const_iterator const end,
     TextFrameIndex nOffset,
-    std::vector<std::pair<sw::mark::IBookmark const*, SwScriptInfo::MarkKind>> 
& rBookmarks,
+    std::vector<std::pair<sw::mark::Bookmark const*, SwScriptInfo::MarkKind>> 
& rBookmarks,
     std::vector<std::tuple<TextFrameIndex, SwScriptInfo::MarkKind, Color, 
OUString>> & o_rBookmarks)
 {
     SwTextNode const*const pNode(iter->pNode);
@@ -1213,7 +1213,7 @@ void SwScriptInfo::InitScriptInfo(const SwTextNode& rNode,
             pNode = iter->pNode;
             Range aRange( 0, pNode->Len() > 0 ? pNode->Len() - 1 : 0 );
             MultiSelection aHiddenMulti( aRange );
-            std::vector<std::pair<sw::mark::IBookmark const*, MarkKind>> 
bookmarks;
+            std::vector<std::pair<sw::mark::Bookmark const*, MarkKind>> 
bookmarks;
             CalcHiddenRanges(*pNode, aHiddenMulti, &bookmarks);
 
             InitBookmarks(oPrevIter, iter, pMerged->extents.end(), nOffset, 
bookmarks, m_Bookmarks);
@@ -1289,7 +1289,7 @@ void SwScriptInfo::InitScriptInfo(const SwTextNode& rNode,
     {
         Range aRange( 0, !rText.isEmpty() ? rText.getLength() - 1 : 0 );
         MultiSelection aHiddenMulti( aRange );
-        std::vector<std::pair<sw::mark::IBookmark const*, MarkKind>> bookmarks;
+        std::vector<std::pair<sw::mark::Bookmark const*, MarkKind>> bookmarks;
         CalcHiddenRanges(rNode, aHiddenMulti, &bookmarks);
 
         for (auto const& it : bookmarks)
@@ -2864,7 +2864,7 @@ SwTwips SwTextFrame::GetLowerMarginForFlyIntersect() const
 
 void SwScriptInfo::selectHiddenTextProperty(const SwTextNode& rNode,
     MultiSelection & rHiddenMulti,
-    std::vector<std::pair<sw::mark::IBookmark const*, MarkKind>> *const 
pBookmarks)
+    std::vector<std::pair<sw::mark::Bookmark const*, MarkKind>> *const 
pBookmarks)
 {
     assert((rNode.GetText().isEmpty() && rHiddenMulti.GetTotalRange().Len() == 
1)
         || (rNode.GetText().getLength() == 
rHiddenMulti.GetTotalRange().Len()));
@@ -2899,7 +2899,7 @@ void SwScriptInfo::selectHiddenTextProperty(const 
SwTextNode& rNode,
     for (const SwContentIndex* pIndex = rNode.GetFirstIndex(); pIndex; pIndex 
= pIndex->GetNext())
     {
         const sw::mark::IMark* pMark = pIndex->GetMark();
-        const sw::mark::IBookmark* pBookmark = dynamic_cast<const 
sw::mark::IBookmark*>(pMark);
+        const sw::mark::Bookmark* pBookmark = dynamic_cast<const 
sw::mark::Bookmark*>(pMark);
         if (pBookmarks && pBookmark)
         {
             if (!pBookmark->IsExpanded())
@@ -2971,7 +2971,7 @@ void SwScriptInfo::selectRedLineDeleted(const SwTextNode& 
rNode, MultiSelection
 // Returns a MultiSection indicating the hidden ranges.
 void SwScriptInfo::CalcHiddenRanges( const SwTextNode& rNode,
     MultiSelection & rHiddenMulti,
-    std::vector<std::pair<sw::mark::IBookmark const*, MarkKind>> *const 
pBookmarks)
+    std::vector<std::pair<sw::mark::Bookmark const*, MarkKind>> *const 
pBookmarks)
 {
     selectHiddenTextProperty(rNode, rHiddenMulti, pBookmarks);
 
diff --git a/sw/source/core/text/porrst.cxx b/sw/source/core/text/porrst.cxx
index 3f49bd2a507e..c5df18fb0155 100644
--- a/sw/source/core/text/porrst.cxx
+++ b/sw/source/core/text/porrst.cxx
@@ -472,7 +472,7 @@ bool SwTextFrame::FormatEmpty()
          pIndex; pIndex = pIndex->GetNext())
     {
         sw::mark::IMark const*const pMark = pIndex->GetMark();
-        if (dynamic_cast<const sw::mark::IBookmark*>(pMark) != nullptr)
+        if (dynamic_cast<const sw::mark::Bookmark*>(pMark) != nullptr)
         {   // need bookmark portions!
             return false;
         }
diff --git a/sw/source/core/undo/rolbck.cxx b/sw/source/core/undo/rolbck.cxx
index 56065b4b0c42..5937f52505b0 100644
--- a/sw/source/core/undo/rolbck.cxx
+++ b/sw/source/core/undo/rolbck.cxx
@@ -622,7 +622,7 @@ SwHistoryBookmark::SwHistoryBookmark(
     , m_bHadOtherPos(rBkmk.IsExpanded())
     , m_eBkmkType(IDocumentMarkAccess::GetType(rBkmk))
 {
-    const ::sw::mark::IBookmark* const pBookmark = dynamic_cast< const 
::sw::mark::IBookmark* >(&rBkmk);
+    const ::sw::mark::Bookmark* const pBookmark = dynamic_cast< const 
::sw::mark::Bookmark* >(&rBkmk);
     if(!pBookmark)
         return;
 
@@ -630,13 +630,7 @@ SwHistoryBookmark::SwHistoryBookmark(
     m_aShortName = pBookmark->GetShortName();
     m_bHidden = pBookmark->IsHidden();
     m_aHideCondition = pBookmark->GetHideCondition();
-
-    ::sfx2::Metadatable const*const pMetadatable(
-            dynamic_cast< ::sfx2::Metadatable const* >(pBookmark));
-    if (pMetadatable)
-    {
-        m_pMetadataUndo = pMetadatable->CreateUndo();
-    }
+    m_pMetadataUndo = pBookmark->CreateUndo();
 }
 
 void SwHistoryBookmark::SetInDoc( SwDoc* pDoc, bool )
@@ -686,8 +680,8 @@ void SwHistoryBookmark::SetInDoc( SwDoc* pDoc, bool )
     {
         pMarkAccess->deleteMark( pMark );
     }
-    ::sw::mark::IBookmark* const pBookmark =
-        dynamic_cast<::sw::mark::IBookmark*>(
+    ::sw::mark::Bookmark* const pBookmark =
+        dynamic_cast<::sw::mark::Bookmark*>(
             pMarkAccess->makeMark(*oPam, m_aName, m_eBkmkType, 
sw::mark::InsertMode::New));
     if ( pBookmark == nullptr )
         return;
@@ -698,15 +692,7 @@ void SwHistoryBookmark::SetInDoc( SwDoc* pDoc, bool )
     pBookmark->SetHideCondition(m_aHideCondition);
 
     if (m_pMetadataUndo)
-    {
-        ::sfx2::Metadatable * const pMeta(
-            dynamic_cast< ::sfx2::Metadatable* >(pBookmark));
-        OSL_ENSURE(pMeta, "metadata undo, but not metadatable?");
-        if (pMeta)
-        {
-            pMeta->RestoreMetadata(m_pMetadataUndo);
-        }
-    }
+        pBookmark->RestoreMetadata(m_pMetadataUndo);
 }
 
 bool SwHistoryBookmark::IsEqualBookmark(const ::sw::mark::IMark& rBkmk)
diff --git a/sw/source/core/unocore/unobkm.cxx 
b/sw/source/core/unocore/unobkm.cxx
index cb9b3894a72e..f61d86f1267f 100644
--- a/sw/source/core/unocore/unobkm.cxx
+++ b/sw/source/core/unocore/unobkm.cxx
@@ -106,7 +106,7 @@ void SwXBookmark::Impl::registerInMark(SwXBookmark& rThis,
         m_sMarkName = m_pRegisteredBookmark->GetName();
 
         // the following applies only to bookmarks (not to fieldmarks)
-        IBookmark* pBookmark = dynamic_cast<IBookmark*>(m_pRegisteredBookmark);
+        Bookmark* pBookmark = dynamic_cast<Bookmark*>(m_pRegisteredBookmark);
         if (pBookmark)
         {
             m_bHidden = pBookmark->IsHidden();
@@ -169,7 +169,7 @@ rtl::Reference<SwXBookmark> SwXBookmark::CreateXBookmark(
     if (!xBookmark.is())
     {
         OSL_ENSURE(!pBookmark ||
-            dynamic_cast< ::sw::mark::IBookmark* >(pBookmark) ||
+            dynamic_cast< ::sw::mark::Bookmark* >(pBookmark) ||
             IDocumentMarkAccess::GetType(*pBookmark) == 
IDocumentMarkAccess::MarkType::ANNOTATIONMARK,
             "<SwXBookmark::GetObject(..)>"
             "SwXBookmark requested for non-bookmark mark and non-annotation 
mark.");
@@ -399,7 +399,7 @@ SwXBookmark::setPropertyValue(const OUString& PropertyName,
         if (!(rValue >>= bNewValue))
             throw lang::IllegalArgumentException(u"Property BookmarkHidden 
requires value of type boolean"_ustr, nullptr, 0);
 
-        IBookmark* pBookmark = 
dynamic_cast<IBookmark*>(m_pImpl->m_pRegisteredBookmark);
+        Bookmark* pBookmark = 
dynamic_cast<Bookmark*>(m_pImpl->m_pRegisteredBookmark);
         if (pBookmark)
         {
             pBookmark->Hide(bNewValue);
@@ -416,7 +416,7 @@ SwXBookmark::setPropertyValue(const OUString& PropertyName,
         if (!(rValue >>= newValue))
             throw lang::IllegalArgumentException(u"Property BookmarkCondition 
requires value of type string"_ustr, nullptr, 0);
 
-        IBookmark* pBookmark = 
dynamic_cast<IBookmark*>(m_pImpl->m_pRegisteredBookmark);
+        Bookmark* pBookmark = 
dynamic_cast<Bookmark*>(m_pImpl->m_pRegisteredBookmark);
         if (pBookmark)
         {
             pBookmark->SetHideCondition(newValue);
@@ -446,7 +446,7 @@ uno::Any SAL_CALL SwXBookmark::getPropertyValue(const 
OUString& rPropertyName)
         }
         else if (rPropertyName == UNO_NAME_BOOKMARK_HIDDEN)
         {
-            IBookmark* pBookmark = 
dynamic_cast<IBookmark*>(m_pImpl->m_pRegisteredBookmark);
+            Bookmark* pBookmark = 
dynamic_cast<Bookmark*>(m_pImpl->m_pRegisteredBookmark);
             if (pBookmark)
             {
                 aRet <<= pBookmark->IsHidden();
@@ -458,7 +458,7 @@ uno::Any SAL_CALL SwXBookmark::getPropertyValue(const 
OUString& rPropertyName)
         }
         else if (rPropertyName == UNO_NAME_BOOKMARK_CONDITION)
         {
-            IBookmark* pBookmark = 
dynamic_cast<IBookmark*>(m_pImpl->m_pRegisteredBookmark);
+            Bookmark* pBookmark = 
dynamic_cast<Bookmark*>(m_pImpl->m_pRegisteredBookmark);
             if (pBookmark)
             {
                 aRet <<= pBookmark->GetHideCondition();
diff --git a/sw/source/filter/html/wrthtml.cxx 
b/sw/source/filter/html/wrthtml.cxx
index f77b5154cdee..9d3a7dd584f2 100644
--- a/sw/source/filter/html/wrthtml.cxx
+++ b/sw/source/filter/html/wrthtml.cxx
@@ -1286,7 +1286,7 @@ void SwHTMLWriter::OutBookmarks()
         // The area of bookmarks is first ignored, because it's not read.
 
         // first the SWG specific data:
-        if ( dynamic_cast< const ::sw::mark::IBookmark* >(pBookmark) && 
!pBookmark->GetName().isEmpty() )
+        if ( dynamic_cast< const ::sw::mark::Bookmark* >(pBookmark) && 
!pBookmark->GetName().isEmpty() )
         {
             OutAnchor( pBookmark->GetName() );
         }
diff --git a/sw/source/ui/misc/bookmark.cxx b/sw/source/ui/misc/bookmark.cxx
index 6f882bad5d15..f9619f4e40e2 100644
--- a/sw/source/ui/misc/bookmark.cxx
+++ b/sw/source/ui/misc/bookmark.cxx
@@ -498,7 +498,7 @@ std::unique_ptr<weld::TreeIter> 
BookmarkTable::get_selected() const
 
 void BookmarkTable::InsertBookmark(SwWrtShell& rSh, sw::mark::IMark* const 
pMark)
 {
-    sw::mark::IBookmark* pBookmark = dynamic_cast<sw::mark::IBookmark*>(pMark);
+    sw::mark::Bookmark* pBookmark = dynamic_cast<sw::mark::Bookmark*>(pMark);
     assert(pBookmark);
 
     OUString sBookmarkNodeText;

Reply via email to