summaryrefslogtreecommitdiff
path: root/sw
diff options
context:
space:
mode:
authorBjoern Michaelsen <bjoern.michaelsen@libreoffice.org>2018-03-13 00:04:04 +0100
committerBjörn Michaelsen <bjoern.michaelsen@libreoffice.org>2018-03-13 22:43:40 +0100
commitfa585ae736246126cf1b574f72750b7a57cba947 (patch)
tree9706a03f087431ce81032dff05fccae580534bd0 /sw
parentefcb9a7078e08a367816b825d14419ddf351ff3e (diff)
use sw::WriterMultiListener instead of SwDepend in SwDDETable
Change-Id: Iaf3b3429d48ecebae5aaf27b384377aec607d3ba Reviewed-on: https://gerrit.libreoffice.org/51188 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Björn Michaelsen <bjoern.michaelsen@libreoffice.org>
Diffstat (limited to 'sw')
-rw-r--r--sw/inc/ddefld.hxx22
-rw-r--r--sw/inc/swddetbl.hxx4
-rw-r--r--sw/source/core/fields/ddefld.cxx59
-rw-r--r--sw/source/core/fields/ddetbl.cxx48
4 files changed, 69 insertions, 64 deletions
diff --git a/sw/inc/ddefld.hxx b/sw/inc/ddefld.hxx
index e8c444676e16..938e515caef5 100644
--- a/sw/inc/ddefld.hxx
+++ b/sw/inc/ddefld.hxx
@@ -20,11 +20,33 @@
#define INCLUDED_SW_INC_DDEFLD_HXX
#include <sfx2/lnkbase.hxx>
+#include <svl/hint.hxx>
#include "swdllapi.h"
#include "fldbas.hxx"
+#include "ndarr.hxx"
class SwDoc;
+namespace sw
+{
+ struct LinkAnchorSearchHint final : public SfxHint
+ {
+ SwNodes& m_rNodes;
+ const SwNode*& m_rpFoundNode;
+ LinkAnchorSearchHint(SwNodes& rNodes, const SwNode*& rpFoundNode) : m_rNodes(rNodes), m_rpFoundNode(rpFoundNode) {};
+ virtual ~LinkAnchorSearchHint() override;
+ };
+ struct InRangeSearchHint final : public SfxHint
+ {
+ SwNodes& m_rNodes;
+ const sal_uLong m_nSttNd, m_nEndNd;
+ const sal_Int32 m_nStt, m_nEnd;
+ bool& m_rIsInRange;
+ InRangeSearchHint(SwNodes& rNodes, const sal_uLong nSttNd, const sal_uLong nEndNd, const sal_Int32 nStt, const sal_Int32 nEnd, bool& rIsInRange)
+ : m_rNodes(rNodes), m_nSttNd(nSttNd), m_nEndNd(nEndNd), m_nStt(nStt), m_nEnd(nEnd), m_rIsInRange(rIsInRange) {}
+ };
+}
+
// FieldType for DDE
class SW_DLLPUBLIC SwDDEFieldType : public SwFieldType
{
diff --git a/sw/inc/swddetbl.hxx b/sw/inc/swddetbl.hxx
index ea56c56b6be9..6e5cbf090a06 100644
--- a/sw/inc/swddetbl.hxx
+++ b/sw/inc/swddetbl.hxx
@@ -20,12 +20,14 @@
#define INCLUDED_SW_INC_SWDDETBL_HXX
#include "swtable.hxx"
+#include "ddefld.hxx"
class SwDDEFieldType;
class SwDDETable : public SwTable
{
- SwDepend aDepend;
+ sw::WriterMultiListener m_aDepends;
+ SwDDEFieldType* m_pDDEType;
public:
// Ctor moves all lines/boxes from SwTable to it.
diff --git a/sw/source/core/fields/ddefld.cxx b/sw/source/core/fields/ddefld.cxx
index 557124dcf7f2..f25b012953d5 100644
--- a/sw/source/core/fields/ddefld.cxx
+++ b/sw/source/core/fields/ddefld.cxx
@@ -168,66 +168,25 @@ void SwIntrnlRefLink::Closed()
SvBaseLink::Closed();
}
+sw::LinkAnchorSearchHint::~LinkAnchorSearchHint() {};
+
const SwNode* SwIntrnlRefLink::GetAnchor() const
{
// here, any anchor of the normal NodesArray should be sufficient
const SwNode* pNd = nullptr;
- SwIterator<SwClient,SwFieldType> aIter(rFieldType);
- for(SwClient* pLast = aIter.First(); pLast; pLast = aIter.Next())
- {
- // a DDE table or a DDE field attribute in the text
- if( dynamic_cast<const SwFormatField *>(pLast) == nullptr)
- {
- SwDepend* pDep = static_cast<SwDepend*>(pLast);
- SwDDETable* pDDETable = static_cast<SwDDETable*>(pDep->GetToTell());
- pNd = pDDETable->GetTabSortBoxes()[0]->GetSttNd();
- }
- else if( static_cast<SwFormatField*>(pLast)->GetTextField() )
- pNd = static_cast<SwFormatField*>(pLast)->GetTextField()->GetpTextNode();
-
- if( pNd && &rFieldType.GetDoc()->GetNodes() == &pNd->GetNodes() )
- break;
- pNd = nullptr;
- }
+ rFieldType.CallSwClientNotify(sw::LinkAnchorSearchHint(rFieldType.GetDoc()->GetNodes(), pNd));
return pNd;
}
bool SwIntrnlRefLink::IsInRange( sal_uLong nSttNd, sal_uLong nEndNd,
sal_Int32 nStt, sal_Int32 nEnd ) const
{
- // here, any anchor of the normal NodesArray should be sufficient
- SwNodes* pNds = &rFieldType.GetDoc()->GetNodes();
- SwIterator<SwClient,SwFieldType> aIter(rFieldType);
- for(SwClient* pLast = aIter.First(); pLast; pLast = aIter.Next())
- {
- // a DDE table or a DDE field attribute in the text
- if( dynamic_cast<const SwFormatField *>(pLast) == nullptr)
- {
- SwDepend* pDep = static_cast<SwDepend*>(pLast);
- SwDDETable* pDDETable = static_cast<SwDDETable*>(pDep->GetToTell());
- const SwTableNode* pTableNd = pDDETable->GetTabSortBoxes()[0]->
- GetSttNd()->FindTableNode();
- if( pTableNd->GetNodes().IsDocNodes() &&
- nSttNd < pTableNd->EndOfSectionIndex() &&
- nEndNd > pTableNd->GetIndex() )
- return true;
- }
- else if( static_cast<SwFormatField*>(pLast)->GetTextField() )
- {
- const SwTextField* pTField = static_cast<SwFormatField*>(pLast)->GetTextField();
- const SwTextNode* pNd = pTField->GetpTextNode();
- if( pNd && pNds == &pNd->GetNodes() )
- {
- sal_uLong nNdPos = pNd->GetIndex();
- if( nSttNd <= nNdPos && nNdPos <= nEndNd &&
- ( nNdPos != nSttNd || pTField->GetStart() >= nStt ) &&
- ( nNdPos != nEndNd || pTField->GetStart() < nEnd ))
- return true;
- }
- }
- }
-
- return false;
+ bool bInRange = false;
+ rFieldType.CallSwClientNotify(sw::InRangeSearchHint(
+ rFieldType.GetDoc()->GetNodes(),
+ nSttNd, nEndNd, nStt, nEnd,
+ bInRange));
+ return bInRange;
}
SwDDEFieldType::SwDDEFieldType(const OUString& rName,
diff --git a/sw/source/core/fields/ddetbl.cxx b/sw/source/core/fields/ddetbl.cxx
index 0047f22f8296..174e0aacaee4 100644
--- a/sw/source/core/fields/ddetbl.cxx
+++ b/sw/source/core/fields/ddetbl.cxx
@@ -32,13 +32,15 @@
#include <fldupde.hxx>
#include <swtblfmt.hxx>
#include <fieldhint.hxx>
+#include <ddefld.hxx>
/// Ctor moves all lines/boxes from a SwTable into itself.
/// Afterwards the SwTable is empty and must be deleted.
SwDDETable::SwDDETable( SwTable& rTable, SwDDEFieldType* pDDEType, bool bUpdate )
- : SwTable( rTable ), aDepend( this, pDDEType )
+ : SwTable(rTable), m_aDepends(*this), m_pDDEType(pDDEType)
{
+ m_aDepends.StartListening(m_pDDEType);
// copy the table data
m_TabSortContentBoxes.insert(rTable.GetTabSortBoxes());
rTable.GetTabSortBoxes().clear();
@@ -63,22 +65,22 @@ SwDDETable::SwDDETable( SwTable& rTable, SwDDEFieldType* pDDEType, bool bUpdate
SwDDETable::~SwDDETable()
{
- SwDDEFieldType* pFieldTyp = static_cast<SwDDEFieldType*>(aDepend.GetRegisteredIn());
SwDoc* pDoc = GetFrameFormat()->GetDoc();
if (!pDoc->IsInDtor() && !m_aLines.empty())
{
assert(m_pTableNode);
if (m_pTableNode->GetNodes().IsDocNodes())
{
- pFieldTyp->DecRefCnt();
+ m_pDDEType->DecRefCnt();
}
}
// If it is the last dependent of the "deleted field" than delete it finally
- if( pFieldTyp->IsDeleted() && pFieldTyp->HasOnlyOneListener() )
+ if( m_pDDEType->IsDeleted() && m_pDDEType->HasOnlyOneListener() )
{
- pFieldTyp->Remove( &aDepend );
- delete pFieldTyp;
+ m_aDepends.EndListeningAll();
+ delete m_pDDEType;
+ m_pDDEType = nullptr;
}
}
@@ -93,10 +95,32 @@ void SwDDETable::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew )
void SwDDETable::SwClientNotify( const SwModify& rModify, const SfxHint& rHint )
{
SwClient::SwClientNotify(rModify, rHint);
- const SwFieldHint* pHint = dynamic_cast<const SwFieldHint*>( &rHint );
- if ( pHint )
+ if(dynamic_cast<const SwFieldHint*>(&rHint))
// replace DDETable by real table
NoDDETable();
+ else if(const auto pLinkAnchorHint = dynamic_cast<const sw::LinkAnchorSearchHint*>(&rHint))
+ {
+ if(pLinkAnchorHint->m_rpFoundNode)
+ return;
+ const auto pNd = GetTabSortBoxes()[0]->GetSttNd();
+ if( pNd && &pLinkAnchorHint->m_rNodes == &pNd->GetNodes() )
+ pLinkAnchorHint->m_rpFoundNode = pNd;
+ }
+ else if(const sw::InRangeSearchHint* pInRangeHint = dynamic_cast<const sw::InRangeSearchHint*>(&rHint))
+ {
+ if(pInRangeHint->m_rIsInRange)
+ return;
+ const SwTableNode* pTableNd = GetTabSortBoxes()[0]->GetSttNd()->FindTableNode();
+ if( pTableNd->GetNodes().IsDocNodes() &&
+ pInRangeHint->m_nSttNd < pTableNd->EndOfSectionIndex() &&
+ pInRangeHint->m_nEndNd > pTableNd->GetIndex() )
+ pInRangeHint->m_rIsInRange = true;
+ }
+ else if (auto pModifyChangedHint = dynamic_cast<const sw::ModifyChangedHint*>(&rHint))
+ {
+ if(m_pDDEType == &rModify)
+ m_pDDEType = const_cast<SwDDEFieldType*>(static_cast<const SwDDEFieldType*>(pModifyChangedHint->m_pNew));
+ }
}
void SwDDETable::ChangeContent()
@@ -110,10 +134,8 @@ void SwDDETable::ChangeContent()
if( !GetTabSortBoxes()[0]->GetSttNd()->GetNodes().IsDocNodes() )
return;
- // access to DDEFieldType
- SwDDEFieldType* pDDEType = static_cast<SwDDEFieldType*>(aDepend.GetRegisteredIn());
- OUString aExpand = pDDEType->GetExpansion().replaceAll("\r", "");
+ OUString aExpand = m_pDDEType->GetExpansion().replaceAll("\r", "");
sal_Int32 nExpandTokenPos = 0;
for( size_t n = 0; n < m_aLines.size(); ++n )
@@ -147,7 +169,7 @@ void SwDDETable::ChangeContent()
SwDDEFieldType* SwDDETable::GetDDEFieldType()
{
- return static_cast<SwDDEFieldType*>(aDepend.GetRegisteredIn());
+ return m_pDDEType;
}
bool SwDDETable::NoDDETable()
@@ -178,7 +200,7 @@ bool SwDDETable::NoDDETable()
GetTabLines().clear();
if( pDoc->getIDocumentLayoutAccess().GetCurrentViewShell() )
- static_cast<SwDDEFieldType*>(aDepend.GetRegisteredIn())->DecRefCnt();
+ m_pDDEType->DecRefCnt();
pTableNd->SetNewTable( pNewTable ); // replace table