sw/inc/txtftn.hxx | 6 ++--- sw/source/core/edit/edattr.cxx | 2 - sw/source/core/fields/reffld.cxx | 2 - sw/source/core/txtnode/atrftn.cxx | 45 ++++++++++++++++---------------------- sw/source/filter/html/htmlftn.cxx | 4 +-- 5 files changed, 26 insertions(+), 33 deletions(-)
New commits: commit c83f85dcd9960e73564fe9a1b5866bee6c779118 Author: Noel Grandin <noelgran...@gmail.com> AuthorDate: Mon Aug 8 15:07:27 2022 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Wed Aug 10 08:07:43 2022 +0200 unique_ptr->optional in SwTextFootnote Change-Id: Icc08fde3d385403d59fde8555f4b1d160209f3a1 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/138057 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/sw/inc/txtftn.hxx b/sw/inc/txtftn.hxx index cd3af3c2074e..57cab883565f 100644 --- a/sw/inc/txtftn.hxx +++ b/sw/inc/txtftn.hxx @@ -21,16 +21,16 @@ #include <rtl/ustring.hxx> #include "txatbase.hxx" +#include "ndindex.hxx" class SwNodeIndex; -class SwTextNode; class SwNodes; class SwDoc; class SwRootFrame; class SW_DLLPUBLIC SwTextFootnote final : public SwTextAttr { - std::unique_ptr<SwNodeIndex> m_pStartNode; + std::optional<SwNodeIndex> m_oStartNode; SwTextNode * m_pTextNode; sal_uInt16 m_nSeqNo; @@ -38,7 +38,7 @@ public: SwTextFootnote( SwFormatFootnote& rAttr, sal_Int32 nStart ); virtual ~SwTextFootnote() override; - SwNodeIndex *GetStartNode() const { return m_pStartNode.get(); } + const SwNodeIndex *GetStartNode() const { return m_oStartNode ? &*m_oStartNode : nullptr; } void SetStartNode( const SwNodeIndex *pNode, bool bDelNodes = true ); void SetNumber(sal_uInt16 nNumber, sal_uInt16 nNumberRLHidden, const OUString &sNumStr); void CopyFootnote(SwTextFootnote & rDest, SwTextNode & rDestNode) const; diff --git a/sw/source/core/edit/edattr.cxx b/sw/source/core/edit/edattr.cxx index 610adc8c42f5..459ff365d8b7 100644 --- a/sw/source/core/edit/edattr.cxx +++ b/sw/source/core/edit/edattr.cxx @@ -455,7 +455,7 @@ size_t SwEditShell::GetSeqFootnoteList( SwSeqFieldList& rList, bool bEndNotes ) if ( rFootnote.IsEndNote() != bEndNotes ) continue; - SwNodeIndex* pIdx = pTextFootnote->GetStartNode(); + const SwNodeIndex* pIdx = pTextFootnote->GetStartNode(); if( pIdx ) { SwNodeIndex aIdx( *pIdx, 1 ); diff --git a/sw/source/core/fields/reffld.cxx b/sw/source/core/fields/reffld.cxx index 03ad0ee90920..c304f311df7f 100644 --- a/sw/source/core/fields/reffld.cxx +++ b/sw/source/core/fields/reffld.cxx @@ -1269,7 +1269,7 @@ SwTextNode* SwGetRefFieldType::FindAnchor( SwDoc* pDoc, const OUString& rRefMark } // otherwise: the position at the start of the footnote // will be mapped to something visible at least... - SwNodeIndex* pIdx = pFootnoteIdx->GetStartNode(); + const SwNodeIndex* pIdx = pFootnoteIdx->GetStartNode(); if( pIdx ) { SwNodeIndex aIdx( *pIdx, 1 ); diff --git a/sw/source/core/txtnode/atrftn.cxx b/sw/source/core/txtnode/atrftn.cxx index 69dc06c3db98..79dd0f903605 100644 --- a/sw/source/core/txtnode/atrftn.cxx +++ b/sw/source/core/txtnode/atrftn.cxx @@ -300,16 +300,9 @@ void SwTextFootnote::SetStartNode( const SwNodeIndex *pNewNode, bool bDelNode ) { if( pNewNode ) { - if ( !m_pStartNode ) - { - m_pStartNode.reset(new SwNodeIndex(*pNewNode)); - } - else - { - *m_pStartNode = *pNewNode; - } + m_oStartNode = *pNewNode; } - else if ( m_pStartNode ) + else if ( m_oStartNode ) { // need to do 2 things: // 1) unregister footnotes at their pages @@ -325,7 +318,7 @@ void SwTextFootnote::SetStartNode( const SwNodeIndex *pNewNode, bool bDelNode ) // attribute isn't anchored in the TextNode yet. // If it is deleted (e.g. Insert File with footnote // inside fly frame), the content must also be deleted. - pDoc = &m_pStartNode->GetNodes().GetDoc(); + pDoc = &m_oStartNode->GetNodes().GetDoc(); } // If called from ~SwDoc(), must not delete the footnote nodes, @@ -336,7 +329,7 @@ void SwTextFootnote::SetStartNode( const SwNodeIndex *pNewNode, bool bDelNode ) { // 2) delete the section for the footnote nodes // it's possible that the Inserts have already been deleted (how???) - pDoc->getIDocumentContentOperations().DeleteSection( &m_pStartNode->GetNode() ); + pDoc->getIDocumentContentOperations().DeleteSection( &m_oStartNode->GetNode() ); } else // If the nodes are not deleted, their frames must be removed @@ -344,7 +337,7 @@ void SwTextFootnote::SetStartNode( const SwNodeIndex *pNewNode, bool bDelNode ) // them (particularly not Undo) DelFrames( nullptr ); } - m_pStartNode.reset(); + m_oStartNode.reset(); // remove the footnote from the SwDoc's array for( size_t n = 0; n < pDoc->GetFootnoteIdxs().size(); ++n ) @@ -381,11 +374,11 @@ void SwTextFootnote::InvalidateNumberInLayout() SwNodes &rNodes = m_pTextNode->GetDoc().GetNodes(); const sw::LegacyModifyHint aHint(nullptr, &GetFootnote()); m_pTextNode->TriggerNodeUpdate(aHint); - if ( m_pStartNode ) + if ( m_oStartNode ) { // must iterate over all TextNodes because of footnotes on other pages - SwNodeOffset nSttIdx = m_pStartNode->GetIndex() + 1; - SwNodeOffset nEndIdx = m_pStartNode->GetNode().EndOfSectionIndex(); + SwNodeOffset nSttIdx = m_oStartNode->GetIndex() + 1; + SwNodeOffset nEndIdx = m_oStartNode->GetNode().EndOfSectionIndex(); for( ; nSttIdx < nEndIdx; ++nSttIdx ) { SwNode* pNd; @@ -399,21 +392,21 @@ void SwTextFootnote::CopyFootnote( SwTextFootnote & rDest, SwTextNode & rDestNode ) const { - if (m_pStartNode && !rDest.GetStartNode()) + if (m_oStartNode && !rDest.GetStartNode()) { // dest missing node section? create it here! // (happens in SwTextNode::CopyText if pDest == this) rDest.MakeNewTextSection( rDestNode.GetNodes() ); } - if (m_pStartNode && rDest.GetStartNode()) + if (m_oStartNode && rDest.GetStartNode()) { // footnotes not necessarily in same document! SwDoc& rDstDoc = rDestNode.GetDoc(); SwNodes &rDstNodes = rDstDoc.GetNodes(); // copy only the content of the section - SwNodeRange aRg( m_pStartNode->GetNode(), SwNodeOffset(1), - *m_pStartNode->GetNode().EndOfSectionNode() ); + SwNodeRange aRg( m_oStartNode->GetNode(), SwNodeOffset(1), + *m_oStartNode->GetNode().EndOfSectionNode() ); // insert at the end of rDest, i.e., the nodes are appended. // nDestLen contains number of ContentNodes in rDest _before_ copy. @@ -441,7 +434,7 @@ void SwTextFootnote::CopyFootnote( /// create a new nodes-array section for the footnote void SwTextFootnote::MakeNewTextSection( SwNodes& rNodes ) { - if ( m_pStartNode ) + if ( m_oStartNode ) return; // set the footnote style on the SwTextNode @@ -466,7 +459,7 @@ void SwTextFootnote::MakeNewTextSection( SwNodes& rNodes ) SwStartNode* pSttNd = rNodes.MakeTextSection( rNodes.GetEndOfInserts(), SwFootnoteStartNode, pFormatColl ); - m_pStartNode.reset(new SwNodeIndex(*pSttNd)); + m_oStartNode = *pSttNd; } void SwTextFootnote::DelFrames(SwRootFrame const*const pRoot) @@ -497,10 +490,10 @@ void SwTextFootnote::DelFrames(SwRootFrame const*const pRoot) } //JP 13.05.97: if the layout is deleted before the footnotes are deleted, // try to delete the footnote's frames by another way - if ( bFrameFnd || !m_pStartNode ) + if ( bFrameFnd || !m_oStartNode ) return; - SwNodeIndex aIdx( *m_pStartNode ); + SwNodeIndex aIdx( *m_oStartNode ); SwContentNode* pCNd = m_pTextNode->GetNodes().GoNext( &aIdx ); if( !pCNd ) return; @@ -586,11 +579,11 @@ void SwTextFootnote::dumpAsXml(xmlTextWriterPtr pWriter) const (void)xmlTextWriterStartElement(pWriter, BAD_CAST("SwTextFootnote")); SwTextAttr::dumpAsXml(pWriter); - if (m_pStartNode) + if (m_oStartNode) { - (void)xmlTextWriterStartElement(pWriter, BAD_CAST("m_pStartNode")); + (void)xmlTextWriterStartElement(pWriter, BAD_CAST("m_oStartNode")); (void)xmlTextWriterWriteAttribute(pWriter, BAD_CAST("index"), - BAD_CAST(OString::number(sal_Int32(m_pStartNode->GetIndex())).getStr())); + BAD_CAST(OString::number(sal_Int32(m_oStartNode->GetIndex())).getStr())); (void)xmlTextWriterEndElement(pWriter); } if (m_pTextNode) diff --git a/sw/source/filter/html/htmlftn.cxx b/sw/source/filter/html/htmlftn.cxx index 45f5b76b84eb..9e7ab7cc9a64 100644 --- a/sw/source/filter/html/htmlftn.cxx +++ b/sw/source/filter/html/htmlftn.cxx @@ -230,7 +230,7 @@ SwNodeIndex *SwHTMLParser::GetFootEndNoteSection( const OUString& rName ) { if (m_pFootEndNoteImpl->aTextFootnotes[i].sName == aName) { - pStartNodeIdx = m_pFootEndNoteImpl->aTextFootnotes[i].pTextFootnote->GetStartNode(); + pStartNodeIdx = const_cast<SwNodeIndex*>(m_pFootEndNoteImpl->aTextFootnotes[i].pTextFootnote->GetStartNode()); m_pFootEndNoteImpl->aTextFootnotes.erase( m_pFootEndNoteImpl->aTextFootnotes.begin() + i ); if (m_pFootEndNoteImpl->aTextFootnotes.empty()) { @@ -371,7 +371,7 @@ void SwHTMLWriter::OutFootEndNotes() IncIndentLevel(); // indent content of <DIV> OSL_ENSURE( pTextFootnote, "SwHTMLWriter::OutFootEndNotes: SwTextFootnote is missing" ); - SwNodeIndex *pSttNdIdx = pTextFootnote->GetStartNode(); + const SwNodeIndex *pSttNdIdx = pTextFootnote->GetStartNode(); OSL_ENSURE( pSttNdIdx, "SwHTMLWriter::OutFootEndNotes: StartNode-Index is missing" ); if( pSttNdIdx )