summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sw/inc/doc.hxx3
-rw-r--r--sw/inc/formatcontentcontrol.hxx1
-rw-r--r--sw/inc/textcontentcontrol.hxx23
-rw-r--r--sw/source/core/doc/doc.cxx5
-rw-r--r--sw/source/core/doc/docfmt.cxx2
-rw-r--r--sw/source/core/doc/docnew.cxx2
-rw-r--r--sw/source/core/txtnode/attrcontentcontrol.cxx68
-rw-r--r--sw/source/core/txtnode/thints.cxx2
8 files changed, 100 insertions, 6 deletions
diff --git a/sw/inc/doc.hxx b/sw/inc/doc.hxx
index f7749190e3ea..c6b466d9ab3c 100644
--- a/sw/inc/doc.hxx
+++ b/sw/inc/doc.hxx
@@ -135,6 +135,7 @@ class IDocumentExternalData;
class IDocumentMarkAccess;
class SetGetExpFields;
struct SwInsertTableOptions;
+class SwContentControlManager;
enum class SvMacroItemId : sal_uInt16;
enum class SvxFrameDirection;
enum class RndStdIds;
@@ -210,6 +211,7 @@ class SW_DLLPUBLIC SwDoc final
const std::unique_ptr< ::sw::mark::MarkManager> mpMarkManager;
const std::unique_ptr< ::sw::MetaFieldManager > m_pMetaFieldManager;
+ const std::unique_ptr< ::SwContentControlManager > m_pContentControlManager;
const std::unique_ptr< ::sw::DocumentDrawModelManager > m_pDocumentDrawModelManager;
const std::unique_ptr< ::sw::DocumentRedlineManager > m_pDocumentRedlineManager;
const std::unique_ptr< ::sw::DocumentStateManager > m_pDocumentStateManager;
@@ -1625,6 +1627,7 @@ public:
const css::uno::Reference< css::container::XNameContainer >& GetVBATemplateToProjectCache() const { return m_xTemplateToProjectCache; };
::sfx2::IXmlIdRegistry& GetXmlIdRegistry();
::sw::MetaFieldManager & GetMetaFieldManager();
+ ::SwContentControlManager& GetContentControlManager();
::sw::UndoManager & GetUndoManager();
::sw::UndoManager const& GetUndoManager() const;
diff --git a/sw/inc/formatcontentcontrol.hxx b/sw/inc/formatcontentcontrol.hxx
index 2cf220b9bcd1..86bc8a0c62b7 100644
--- a/sw/inc/formatcontentcontrol.hxx
+++ b/sw/inc/formatcontentcontrol.hxx
@@ -76,6 +76,7 @@ public:
* (re-)moved.
*/
void NotifyChangeTextNode(SwTextNode* pTextNode);
+ SwTextNode* GetTextNode() const;
static SwFormatContentControl* CreatePoolDefault(sal_uInt16 nWhich);
std::shared_ptr<SwContentControl> GetContentControl() { return m_pContentControl; }
const std::shared_ptr<SwContentControl>& GetContentControl() const { return m_pContentControl; }
diff --git a/sw/inc/textcontentcontrol.hxx b/sw/inc/textcontentcontrol.hxx
index 1c445d812099..dc7d210f79a6 100644
--- a/sw/inc/textcontentcontrol.hxx
+++ b/sw/inc/textcontentcontrol.hxx
@@ -20,15 +20,19 @@
#include "txatbase.hxx"
+class SwContentControlManager;
class SwFormatContentControl;
/// SwTextAttr subclass that tracks the location of the wrapped SwFormatContentControl.
class SW_DLLPUBLIC SwTextContentControl final : public SwTextAttrNesting
{
- SwTextContentControl(SwFormatContentControl& rAttr, sal_Int32 nStart, sal_Int32 nEnd);
+ SwContentControlManager* m_pManager;
+
+ SwTextContentControl(SwContentControlManager* pManager, SwFormatContentControl& rAttr,
+ sal_Int32 nStart, sal_Int32 nEnd);
public:
- static SwTextContentControl* CreateTextContentControl(SwTextNode* pTargetTextNode,
+ static SwTextContentControl* CreateTextContentControl(SwDoc& rDoc, SwTextNode* pTargetTextNode,
SwFormatContentControl& rAttr,
sal_Int32 nStart, sal_Int32 nEnd,
bool bIsCopy);
@@ -37,7 +41,22 @@ public:
void ChgTextNode(SwTextNode* pNode);
+ SwTextNode* GetTextNode() const;
+
void dumpAsXml(xmlTextWriterPtr pWriter) const override;
};
+/// Knows all the text content controls in the document.
+class SW_DLLPUBLIC SwContentControlManager
+{
+ /// Non-owning reference to text content controls.
+ std::vector<SwTextContentControl*> m_aContentControls;
+
+public:
+ SwContentControlManager();
+ void Insert(SwTextContentControl* pTextContentControl);
+ void Erase(SwTextContentControl* pTextContentControl);
+ void dumpAsXml(xmlTextWriterPtr pWriter) const;
+};
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/doc/doc.cxx b/sw/source/core/doc/doc.cxx
index 800c264588b6..5abb1d9d92c9 100644
--- a/sw/source/core/doc/doc.cxx
+++ b/sw/source/core/doc/doc.cxx
@@ -130,6 +130,11 @@ sal_Int32 SwDoc::getReferenceCount() const
return *m_pMetaFieldManager;
}
+::SwContentControlManager& SwDoc::GetContentControlManager()
+{
+ return *m_pContentControlManager;
+}
+
::sw::UndoManager & SwDoc::GetUndoManager()
{
return *m_pUndoManager;
diff --git a/sw/source/core/doc/docfmt.cxx b/sw/source/core/doc/docfmt.cxx
index 42dfd707c556..c2104cd95857 100644
--- a/sw/source/core/doc/docfmt.cxx
+++ b/sw/source/core/doc/docfmt.cxx
@@ -76,6 +76,7 @@
#include <modcfg.hxx>
#include <frameformats.hxx>
#include <textboxhelper.hxx>
+#include <textcontentcontrol.hxx>
#include <memory>
using namespace ::com::sun::star::i18n;
@@ -1965,6 +1966,7 @@ void SwDoc::dumpAsXml(xmlTextWriterPtr pWriter) const
m_PageDescs.dumpAsXml(pWriter);
maDBData.dumpAsXml(pWriter);
mpMarkManager->dumpAsXml(pWriter);
+ m_pContentControlManager->dumpAsXml(pWriter);
m_pUndoManager->dumpAsXml(pWriter);
m_pDocumentSettingManager->dumpAsXml(pWriter);
getIDocumentFieldsAccess().GetFieldTypes()->dumpAsXml(pWriter);
diff --git a/sw/source/core/doc/docnew.cxx b/sw/source/core/doc/docnew.cxx
index da65b2957229..66921bc11ee4 100644
--- a/sw/source/core/doc/docnew.cxx
+++ b/sw/source/core/doc/docnew.cxx
@@ -108,6 +108,7 @@
#include <sfx2/Metadatable.hxx>
#include <fmtmeta.hxx>
+#include <textcontentcontrol.hxx>
#include <svx/xfillit0.hxx>
#include <unotools/configmgr.hxx>
@@ -207,6 +208,7 @@ SwDoc::SwDoc()
maOLEModifiedIdle( "sw::SwDoc maOLEModifiedIdle" ),
mpMarkManager(new ::sw::mark::MarkManager(*this)),
m_pMetaFieldManager(new ::sw::MetaFieldManager()),
+ m_pContentControlManager(new ::SwContentControlManager()),
m_pDocumentDrawModelManager( new ::sw::DocumentDrawModelManager( *this ) ),
m_pDocumentRedlineManager( new ::sw::DocumentRedlineManager( *this ) ),
m_pDocumentStateManager( new ::sw::DocumentStateManager( *this ) ),
diff --git a/sw/source/core/txtnode/attrcontentcontrol.cxx b/sw/source/core/txtnode/attrcontentcontrol.cxx
index dc451ca927e4..418f35878f85 100644
--- a/sw/source/core/txtnode/attrcontentcontrol.cxx
+++ b/sw/source/core/txtnode/attrcontentcontrol.cxx
@@ -136,6 +136,16 @@ void SwFormatContentControl::NotifyChangeTextNode(SwTextNode* pTextNode)
}
}
+SwTextNode* SwFormatContentControl::GetTextNode() const
+{
+ if (!m_pContentControl)
+ {
+ return nullptr;
+ }
+
+ return m_pContentControl->GetTextNode();
+}
+
// This SwFormatContentControl has been cloned and points at the same SwContentControl as the
// source: this function copies the SwContentControl.
void SwFormatContentControl::DoCopy(SwTextNode& rTargetTextNode)
@@ -495,7 +505,8 @@ SwContentControlListItem::ItemsFromAny(const css::uno::Any& rVal)
return aRet;
}
-SwTextContentControl* SwTextContentControl::CreateTextContentControl(SwTextNode* pTargetTextNode,
+SwTextContentControl* SwTextContentControl::CreateTextContentControl(SwDoc& rDoc,
+ SwTextNode* pTargetTextNode,
SwFormatContentControl& rAttr,
sal_Int32 nStart,
sal_Int32 nEnd, bool bIsCopy)
@@ -510,17 +521,21 @@ SwTextContentControl* SwTextContentControl::CreateTextContentControl(SwTextNode*
}
rAttr.DoCopy(*pTargetTextNode);
}
- auto pTextContentControl(new SwTextContentControl(rAttr, nStart, nEnd));
+ SwContentControlManager* pManager = &rDoc.GetContentControlManager();
+ auto pTextContentControl(new SwTextContentControl(pManager, rAttr, nStart, nEnd));
return pTextContentControl;
}
-SwTextContentControl::SwTextContentControl(SwFormatContentControl& rAttr, sal_Int32 nStart,
+SwTextContentControl::SwTextContentControl(SwContentControlManager* pManager,
+ SwFormatContentControl& rAttr, sal_Int32 nStart,
sal_Int32 nEnd)
: SwTextAttr(rAttr, nStart)
, SwTextAttrNesting(rAttr, nStart, nEnd)
+ , m_pManager(pManager)
{
rAttr.SetTextAttr(this);
SetHasDummyChar(true);
+ m_pManager->Insert(this);
}
SwTextContentControl::~SwTextContentControl()
@@ -538,9 +553,28 @@ void SwTextContentControl::ChgTextNode(SwTextNode* pNode)
if (rFormatContentControl.GetTextAttr() == this)
{
rFormatContentControl.NotifyChangeTextNode(pNode);
+
+ if (pNode)
+ {
+ m_pManager = &pNode->GetDoc().GetContentControlManager();
+ }
+ else
+ {
+ if (m_pManager)
+ {
+ m_pManager->Erase(this);
+ }
+ m_pManager = nullptr;
+ }
}
}
+SwTextNode* SwTextContentControl::GetTextNode() const
+{
+ auto& rFormatContentControl = static_cast<const SwFormatContentControl&>(GetAttr());
+ return rFormatContentControl.GetTextNode();
+}
+
void SwTextContentControl::dumpAsXml(xmlTextWriterPtr pWriter) const
{
(void)xmlTextWriterStartElement(pWriter, BAD_CAST("SwTextContentControl"));
@@ -550,4 +584,32 @@ void SwTextContentControl::dumpAsXml(xmlTextWriterPtr pWriter) const
(void)xmlTextWriterEndElement(pWriter);
}
+SwContentControlManager::SwContentControlManager() {}
+
+void SwContentControlManager::Insert(SwTextContentControl* pTextContentControl)
+{
+ m_aContentControls.push_back(pTextContentControl);
+}
+
+void SwContentControlManager::Erase(SwTextContentControl* pTextContentControl)
+{
+ m_aContentControls.erase(
+ std::remove(m_aContentControls.begin(), m_aContentControls.end(), pTextContentControl),
+ m_aContentControls.end());
+}
+
+void SwContentControlManager::dumpAsXml(xmlTextWriterPtr pWriter) const
+{
+ (void)xmlTextWriterStartElement(pWriter, BAD_CAST("SwContentControlManager"));
+ (void)xmlTextWriterWriteFormatAttribute(pWriter, BAD_CAST("ptr"), "%p", this);
+ for (const auto& pContentControl : m_aContentControls)
+ {
+ (void)xmlTextWriterStartElement(pWriter, BAD_CAST("SwTextContentControl"));
+ (void)xmlTextWriterWriteFormatAttribute(pWriter, BAD_CAST("ptr"), "%p", pContentControl);
+ (void)xmlTextWriterEndElement(pWriter);
+ }
+
+ (void)xmlTextWriterEndElement(pWriter);
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/txtnode/thints.cxx b/sw/source/core/txtnode/thints.cxx
index 7bb9c3a03798..c2d37e058c3b 100644
--- a/sw/source/core/txtnode/thints.cxx
+++ b/sw/source/core/txtnode/thints.cxx
@@ -1160,7 +1160,7 @@ SwTextAttr* MakeTextAttr(
break;
case RES_TXTATR_CONTENTCONTROL:
pNew = SwTextContentControl::CreateTextContentControl(
- pTextNode, static_cast<SwFormatContentControl&>(rNew), nStt, nEnd,
+ rDoc, pTextNode, static_cast<SwFormatContentControl&>(rNew), nStt, nEnd,
bIsCopy == CopyOrNewType::Copy);
break;
default: