[Libreoffice-commits] core.git: Branch 'private/mst/sw_redlinehide_3' - 5 commits - sw/inc sw/source

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Mon Nov 5 18:16:22 UTC 2018


Rebased ref, commits from common ancestor:
commit abe212d752a0668e06f17d6c8a26771fa5fdaf7a
Author:     Michael Stahl <Michael.Stahl at cib.de>
AuthorDate: Mon Nov 5 18:32:31 2018 +0100
Commit:     Michael Stahl <Michael.Stahl at cib.de>
CommitDate: Mon Nov 5 18:58:20 2018 +0100

    sw_redlinehide_3: hide deleted numbered nodes in field dialog
    
    This reuses the IDocumentOutlineNodes code for IDocumentListItems;
    the only client of it is the field dialog cross reference page.
    
    Adapt SwCursorShell::GetContentAtPos() too.
    
    Change-Id: I9a9ed464b176dd26bf39969ba94041f995ba8c7e

diff --git a/sw/inc/IDocumentListItems.hxx b/sw/inc/IDocumentListItems.hxx
index e8573e59879f..b5d1e8083b48 100644
--- a/sw/inc/IDocumentListItems.hxx
+++ b/sw/inc/IDocumentListItems.hxx
@@ -22,6 +22,8 @@
 
 #include <vector>
 #include <rtl/ustring.hxx>
+
+class SwRootFrame;
 class SwNodeNum;
 
 /** Provides numbered items of a document.
@@ -34,7 +36,11 @@ public:
     virtual void addListItem( const SwNodeNum& rNodeNum ) = 0;
     virtual void removeListItem( const SwNodeNum& rNodeNum ) = 0;
 
-    virtual OUString getListItemText( const SwNodeNum& rNodeNum ) const = 0;
+    virtual OUString getListItemText(const SwNodeNum& rNodeNum,
+                                     SwRootFrame const& rLayout) const = 0;
+
+    virtual bool isNumberedInLayout(SwNodeNum const& rNodeNum,
+            SwRootFrame const& rLayout) const = 0;
 
     /** get vector of all list items, which are numbered
     */
diff --git a/sw/source/core/crsr/crstrvl.cxx b/sw/source/core/crsr/crstrvl.cxx
index a00a35ec6f77..5220dd4f8071 100644
--- a/sw/source/core/crsr/crstrvl.cxx
+++ b/sw/source/core/crsr/crstrvl.cxx
@@ -1291,7 +1291,7 @@ bool SwCursorShell::GetContentAtPos( const Point& rPt,
             if( pONd )
             {
                 rContentAtPos.eContentAtPos = IsAttrAtPos::Outline;
-                rContentAtPos.sStr = pONd->GetExpandText( 0, -1, true, true );
+                rContentAtPos.sStr = sw::GetExpandTextMerged(GetLayout(), *pONd, true, false, ExpandMode(0));
                 bRet = true;
             }
         }
diff --git a/sw/source/core/doc/DocumentListItemsManager.cxx b/sw/source/core/doc/DocumentListItemsManager.cxx
index edb859a6e57a..8d88fba75cf1 100644
--- a/sw/source/core/doc/DocumentListItemsManager.cxx
+++ b/sw/source/core/doc/DocumentListItemsManager.cxx
@@ -18,7 +18,9 @@
  */
 
 #include <DocumentListItemsManager.hxx>
+
 #include <SwNodeNum.hxx>
+#include <txtfrm.hxx>
 #include <ndtxt.hxx>
 #include <osl/diagnose.h>
 
@@ -66,12 +68,19 @@ void DocumentListItemsManager::removeListItem( const SwNodeNum& rNodeNum )
     }
 }
 
-OUString DocumentListItemsManager::getListItemText( const SwNodeNum& rNodeNum ) const
+OUString DocumentListItemsManager::getListItemText(const SwNodeNum& rNodeNum,
+        SwRootFrame const& rLayout) const
+{
+    SwTextNode const*const pNode(rNodeNum.GetTextNode());
+    assert(pNode);
+    return sw::GetExpandTextMerged(&rLayout, *pNode, true, true, ExpandMode(0));
+}
+
+bool DocumentListItemsManager::isNumberedInLayout(
+        SwNodeNum const& rNodeNum, // note: this is the non-hidden Num ...
+        SwRootFrame const& rLayout) const
 {
-    return rNodeNum.GetTextNode()
-           ? rNodeNum.GetTextNode()->GetExpandText( 0, -1, true/*bWithNumber*/,
-                                                    true/*bWithNumber*/, true/*bWithSpacesForLevel*/ )
-           : OUString();
+    return sw::IsParaPropsNode(rLayout, *rNodeNum.GetTextNode());
 }
 
 void DocumentListItemsManager::getNumItems( tSortedNodeNumList& orNodeNumList ) const
diff --git a/sw/source/core/doc/DocumentOutlineNodesManager.cxx b/sw/source/core/doc/DocumentOutlineNodesManager.cxx
index 3654c5032eb4..12945c76ae6e 100644
--- a/sw/source/core/doc/DocumentOutlineNodesManager.cxx
+++ b/sw/source/core/doc/DocumentOutlineNodesManager.cxx
@@ -41,36 +41,31 @@ int DocumentOutlineNodesManager::getOutlineLevel( const tSortedOutlineNodeList::
                                 GetTextNode()->GetAttrOutlineLevel()-1;
 }
 
-OUString DocumentOutlineNodesManager::getOutlineText(
-                              const tSortedOutlineNodeList::size_type nIdx,
-                              SwRootFrame const*const pLayout,
-                              const bool bWithNumber,
-                              const bool bWithSpacesForLevel,
-                              const bool bWithFootnote ) const
+OUString GetExpandTextMerged(SwRootFrame const*const pLayout,
+        SwTextNode const& rNode, bool const bWithNumber,
+        bool const bWithSpacesForLevel, ExpandMode const i_mode)
 {
-    SwTextNode const*const pNode(m_rDoc.GetNodes().GetOutLineNds()[ nIdx ]->GetTextNode());
     if (pLayout && pLayout->IsHideRedlines())
     {
-        SwTextFrame const*const pFrame(static_cast<SwTextFrame*>(pNode->getLayoutFrame(pLayout)));
+        SwTextFrame const*const pFrame(static_cast<SwTextFrame*>(rNode.getLayoutFrame(pLayout)));
         if (pFrame)
         {
             sw::MergedPara const*const pMerged = pFrame->GetMergedPara();
             if (pMerged)
             {
-                if (pNode != pMerged->pParaPropsNode)
+                if (&rNode != pMerged->pParaPropsNode)
                 {
                     return OUString();
                 }
                 else
                 {
-                    ExpandMode const mode(ExpandMode::HideDeletions |
-                        (bWithFootnote ? ExpandMode::ExpandFootnote : ExpandMode(0)));
-                    OUStringBuffer ret(pNode->GetExpandText(0, -1, bWithNumber,
+                    ExpandMode const mode(ExpandMode::HideDeletions | i_mode);
+                    OUStringBuffer ret(rNode.GetExpandText(0, -1, bWithNumber,
                         bWithNumber, bWithSpacesForLevel, mode));
-                    for (sal_uLong i = pNode->GetIndex() + 1;
+                    for (sal_uLong i = rNode.GetIndex() + 1;
                          i <= pMerged->pLastNode->GetIndex(); ++i)
                     {
-                        SwNode *const pTmp(pNode->GetNodes()[i]);
+                        SwNode *const pTmp(rNode.GetNodes()[i]);
                         if (pTmp->GetRedlineMergeFlag() == SwNode::Merge::NonFirst)
                         {
                             ret.append(pTmp->GetTextNode()->GetExpandText(
@@ -82,9 +77,21 @@ OUString DocumentOutlineNodesManager::getOutlineText(
             }
         }
     }
-    return pNode->GetExpandText( 0, -1, bWithNumber,
-                    bWithNumber, bWithSpacesForLevel,
-                    bWithFootnote ? ExpandMode::ExpandFootnote : ExpandMode(0));
+    return rNode.GetExpandText( 0, -1, bWithNumber,
+                    bWithNumber, bWithSpacesForLevel, i_mode);
+}
+
+OUString DocumentOutlineNodesManager::getOutlineText(
+                              const tSortedOutlineNodeList::size_type nIdx,
+                              SwRootFrame const*const pLayout,
+                              const bool bWithNumber,
+                              const bool bWithSpacesForLevel,
+                              const bool bWithFootnote ) const
+{
+    SwTextNode const*const pNode(m_rDoc.GetNodes().GetOutLineNds()[ nIdx ]->GetTextNode());
+    return GetExpandTextMerged(pLayout, *pNode,
+            bWithNumber, bWithSpacesForLevel,
+            (bWithFootnote ? ExpandMode::ExpandFootnote : ExpandMode(0)));
 }
 
 SwTextNode* DocumentOutlineNodesManager::getOutlineNode( const tSortedOutlineNodeList::size_type nIdx ) const
diff --git a/sw/source/core/inc/DocumentListItemsManager.hxx b/sw/source/core/inc/DocumentListItemsManager.hxx
index 36e56e015d7a..7508a2b5df41 100644
--- a/sw/source/core/inc/DocumentListItemsManager.hxx
+++ b/sw/source/core/inc/DocumentListItemsManager.hxx
@@ -36,7 +36,11 @@ public:
     void addListItem( const SwNodeNum& rNodeNum ) override;
     void removeListItem( const SwNodeNum& rNodeNum ) override;
 
-    OUString getListItemText( const SwNodeNum& rNodeNum ) const override;
+    OUString getListItemText(const SwNodeNum& rNodeNum,
+                             SwRootFrame const& rLayout) const override;
+
+    bool isNumberedInLayout(SwNodeNum const& rNodeNum,
+            SwRootFrame const& rLayout) const override;
 
     void getNumItems( IDocumentListItems::tSortedNodeNumList& orNodeNumList ) const override;
 
diff --git a/sw/source/core/inc/txtfrm.hxx b/sw/source/core/inc/txtfrm.hxx
index 6870d721e5a0..9ecc04e38218 100644
--- a/sw/source/core/inc/txtfrm.hxx
+++ b/sw/source/core/inc/txtfrm.hxx
@@ -44,6 +44,7 @@ struct SwCursorMoveState;
 struct SwFillData;
 class SwPortionHandler;
 class SwScriptInfo;
+enum class ExpandMode;
 
 #define NON_PRINTING_CHARACTER_COLOR Color(0x26, 0x8b, 0xd2)
 
@@ -124,6 +125,10 @@ void AddRemoveFlysAnchoredToFrameStartingAtNode(
         SwTextFrame & rFrame, SwTextNode & rTextNode,
         std::set<sal_uLong> *pSkipped);
 
+OUString GetExpandTextMerged(SwRootFrame const* pLayout,
+        SwTextNode const& rNode, bool bWithNumber,
+        bool bWithSpacesForLevel, ExpandMode i_mode);
+
 } // namespace sw
 
 /// Represents the visualization of a paragraph. Typical upper is an
diff --git a/sw/source/ui/fldui/fldref.cxx b/sw/source/ui/fldui/fldref.cxx
index cd3919294a41..dfdb141f2d47 100644
--- a/sw/source/ui/fldui/fldref.cxx
+++ b/sw/source/ui/fldui/fldref.cxx
@@ -626,11 +626,15 @@ void SwFieldRefPage::UpdateSubType(const OUString& filterString)
             bool bCertainTextNodeSelected( false );
             for ( size_t nNumItemIdx = 0; nNumItemIdx < maNumItems.size(); ++nNumItemIdx )
             {
-                bool isSubstring = MatchSubstring(pIDoc->getListItemText( *maNumItems[nNumItemIdx] ), filterString);
+                if (!pIDoc->isNumberedInLayout(*maNumItems[nNumItemIdx], *pSh->GetLayout()))
+                {
+                    continue; // skip it
+                }
+                bool isSubstring = MatchSubstring(pIDoc->getListItemText(*maNumItems[nNumItemIdx], *pSh->GetLayout()), filterString);
                 if(isSubstring)
                 {
                     SvTreeListEntry* pEntry = m_pSelectionToolTipLB->InsertEntry(
-                    pIDoc->getListItemText( *maNumItems[nNumItemIdx] ) );
+                        pIDoc->getListItemText(*maNumItems[nNumItemIdx], *pSh->GetLayout()));
                     pEntry->SetUserData( reinterpret_cast<void*>(nNumItemIdx) );
                     if ( ( IsFieldEdit() &&
                            pRefField->GetReferencedTextNode() == maNumItems[nNumItemIdx]->GetTextNode() ) ||
commit 2dfef08c8bc4f2d0bc240966897cea1639b9a052
Author:     Michael Stahl <Michael.Stahl at cib.de>
AuthorDate: Mon Nov 5 15:50:43 2018 +0100
Commit:     Michael Stahl <Michael.Stahl at cib.de>
CommitDate: Mon Nov 5 15:59:14 2018 +0100

    sw_redlinehide_3: fix footnotes not being removed when deleted
    
    If there already is a merged SwTextFrame and a footnote is being
    deleted in a non-first node hence UpdateFramesForAddDeleteRedline()
    is called, the SwFootnoteFrame isn't removed unless by some accident.
    
    Just let CheckParaRedlineMerge iterate all top-level nodes.
    
    Change-Id: I65ac90636a283d5178b4c0323bcc0ae28b3f1196

diff --git a/sw/source/core/text/redlnitr.cxx b/sw/source/core/text/redlnitr.cxx
index 598c0bc321da..ecdd22eff44b 100644
--- a/sw/source/core/text/redlnitr.cxx
+++ b/sw/source/core/text/redlnitr.cxx
@@ -216,29 +216,36 @@ CheckParaRedlineMerge(SwTextFrame & rFrame, SwTextNode & rTextNode,
     if (eMode == FrameMode::Existing)
     {
         // remove existing footnote frames for first node;
-        // for non-first notes, DelFrames will remove all
+        // for non-first nodes with own frames, DelFrames will remove all
         // (could possibly call lcl_ChangeFootnoteRef, not sure if worth it)
         // note: must be done *before* changing listeners!
-        sal_Int32 nLast(0);
-        std::vector<std::pair<sal_Int32, sal_Int32>> hidden;
-        for (auto const& rExtent : extents)
+        // for non-first nodes that are already merged with this frame,
+        // need to remove here too, otherwise footnotes can be removed only
+        // by lucky accident, e.g. TruncLines().
+        auto itExtent(extents.begin());
+        for (auto const pTextNode : nodes)
         {
-            if (rExtent.pNode != &rTextNode)
+            sal_Int32 nLast(0);
+            std::vector<std::pair<sal_Int32, sal_Int32>> hidden;
+            for ( ; itExtent != extents.end(); ++itExtent)
             {
-                break;
+                if (itExtent->pNode != pTextNode)
+                {
+                    break;
+                }
+                if (itExtent->nStart != 0)
+                {
+                    assert(itExtent->nStart != nLast);
+                    hidden.emplace_back(nLast, itExtent->nStart);
+                }
+                nLast = itExtent->nEnd;
             }
-            if (rExtent.nStart != 0)
+            if (nLast != pTextNode->Len())
             {
-                assert(rExtent.nStart != nLast);
-                hidden.emplace_back(nLast, rExtent.nStart);
+                hidden.emplace_back(nLast, pTextNode->Len());
             }
-            nLast = rExtent.nEnd;
-        }
-        if (nLast != rTextNode.Len())
-        {
-            hidden.emplace_back(nLast, rTextNode.Len());
+            sw::RemoveFootnotesForNode(rFrame, *pTextNode, &hidden);
         }
-        sw::RemoveFootnotesForNode(rFrame, rTextNode, &hidden);
         // unfortunately DelFrames() must be done before StartListening too,
         // otherwise footnotes cannot be deleted by SwTextFootnote::DelFrames!
         for (auto iter = ++nodes.begin(); iter != nodes.end(); ++iter)
commit 6e137a16b870f4a8ee7ddeaa51859036c7e1a63c
Author:     Michael Stahl <Michael.Stahl at cib.de>
AuthorDate: Mon Nov 5 13:41:29 2018 +0100
Commit:     Michael Stahl <Michael.Stahl at cib.de>
CommitDate: Mon Nov 5 13:41:29 2018 +0100

    sw: fix crash in SwContentTree::HasContentChanged()
    
    Remove() will remove the node including its children, but
    SvTreeList::Next() will actually return the first child, so the pChild
    points to an entry that has been deleted.
    
    Change-Id: Ia4bd75d64c8436ea03c0727a8d49ee0c34fda16f

diff --git a/sw/source/uibase/utlui/content.cxx b/sw/source/uibase/utlui/content.cxx
index b465975a385a..ba2255d07d63 100644
--- a/sw/source/uibase/utlui/content.cxx
+++ b/sw/source/uibase/utlui/content.cxx
@@ -2213,14 +2213,11 @@ bool SwContentTree::HasContentChanged()
                     }
                     if(bRemoveChildren)
                     {
-                        SvTreeListEntry* pChild = FirstChild(pEntry);
-                        SvTreeListEntry* pRemove = pChild;
                         for(size_t j = 0; j < nChildCount; ++j)
                         {
-                            pChild = Next(pRemove);
+                            SvTreeListEntry *const pRemove = FirstChild(pEntry);
                             assert(pRemove);
                             GetModel()->Remove(pRemove);
-                            pRemove = pChild;
                         }
                     }
                     if(!nChildCount)
commit dd3622905ee3fdbeb81686abbeeb0fd50bc7f1e3
Author:     Michael Stahl <Michael.Stahl at cib.de>
AuthorDate: Mon Nov 5 11:51:00 2018 +0100
Commit:     Michael Stahl <Michael.Stahl at cib.de>
CommitDate: Mon Nov 5 11:51:00 2018 +0100

    sw_redlinehide_3: move assert in SwContentNode::DelFrames()
    
    This is happening in MoveParagraph; the UpdateMergedParaForDelete will
    reset the pParaPropsNode pointer so move assert below that.
    
    Change-Id: I31069578a9bfdb05f01ea778bbe9e9ae43c865c6

diff --git a/sw/source/core/docnode/node.cxx b/sw/source/core/docnode/node.cxx
index fa30b94a25a8..6971e30774c9 100644
--- a/sw/source/core/docnode/node.cxx
+++ b/sw/source/core/docnode/node.cxx
@@ -1364,8 +1364,6 @@ void SwContentNode::DelFrames(SwRootFrame const*const pLayout)
             {
                 if (this != pMerged->pFirstNode)
                 {
-                    // pointer should have been updated to a different node
-                    assert(this != pMerged->pParaPropsNode);
                     // SwNodes::RemoveNode iterates *backwards* - so
                     // ensure there are no more extents pointing to this
                     // node as SwFrame::InvalidatePage() will access them.
@@ -1373,6 +1371,8 @@ void SwContentNode::DelFrames(SwRootFrame const*const pLayout)
                     // because that would access deleted wrong-lists
                     sw::UpdateMergedParaForDelete(*pMerged, true,
                             *static_cast<SwTextNode*>(this), 0, Len());
+                    // pointer should have been updated to a different node
+                    assert(this != pMerged->pParaPropsNode);
                     if (this == pMerged->pLastNode)
                     {
                         pMerged->pLastNode = GetNodes()[GetIndex()-1]->GetTextNode();
commit 9fe02e664cb09fef7d1c5f2fac8f494f5a781a4d
Author:     Michael Stahl <Michael.Stahl at cib.de>
AuthorDate: Fri Nov 2 19:26:19 2018 +0100
Commit:     Michael Stahl <Michael.Stahl at cib.de>
CommitDate: Mon Nov 5 11:07:22 2018 +0100

    sw_redlinehide_3: update frames in MoveParagraph()
    
    ... if redlining is disabled and MoveNodeRange is called.
    
    Change-Id: I8c4e35b1b783446ab9bd888599bcce44222857e8

diff --git a/sw/source/core/doc/DocumentContentOperationsManager.cxx b/sw/source/core/doc/DocumentContentOperationsManager.cxx
index 8dcec0a9fd15..4854afde55c1 100644
--- a/sw/source/core/doc/DocumentContentOperationsManager.cxx
+++ b/sw/source/core/doc/DocumentContentOperationsManager.cxx
@@ -826,6 +826,10 @@ namespace
         {
             rSvRedLine.SetPos( nInsPos );
             pDoc->getIDocumentRedlineAccess().AppendRedline( rSvRedLine.pRedl, true );
+            if (rSvRedLine.pRedl->GetType() == nsRedlineType_t::REDLINE_DELETE)
+            {
+                UpdateFramesForAddDeleteRedline(*pDoc, *rSvRedLine.pRedl);
+            }
         }
 
         pDoc->getIDocumentRedlineAccess().SetRedlineFlags_intern( eOld );


More information about the Libreoffice-commits mailing list