[Libreoffice-commits] core.git: Branch 'distro/lhm/libreoffice-6-1+backports' - sw/source

Michael Stahl (via logerrit) logerrit at kemper.freedesktop.org
Mon Jun 15 11:41:03 UTC 2020


 sw/source/core/crsr/bookmrk.cxx |   26 ++++++++++++++++++++++++++
 sw/source/core/doc/docbm.cxx    |   17 +++++++++++++++++
 sw/source/core/inc/bookmrk.hxx  |    4 ++++
 3 files changed, 47 insertions(+)

New commits:
commit 79bc162d86c62506614a19bf7c92c72237804f5e
Author:     Michael Stahl <Michael.Stahl at cib.de>
AuthorDate: Tue Jan 21 13:15:50 2020 +0100
Commit:     Thorsten Behrens <Thorsten.Behrens at CIB.de>
CommitDate: Mon Jun 15 13:40:30 2020 +0200

    tdf#45589 sw: invalidate on bookmark insertion/deletion
    
    Invalidate the text frames when a bookmark is inserted or deleted; also
    when MarkManager::repositionMark() changes the positions.
    
    The other calls of SetMarkPos()/SetOtherMarkPos() look like they're all
    from code that corrects positions after text insertions or deletions so
    no additional invalidate should be necessary there.
    
    It turns out that one WW8 document in sw_filters_test wants to insert
    a bookmark on a SwGrfNode; check for that in makeMark().
    
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/87157
    Tested-by: Jenkins
    Reviewed-by: Michael Stahl <michael.stahl at cib.de>
    (cherry picked from commit ef8427d12a63127a2eb867637699343d630545dd)
    
    Change-Id: I293e6da9042bea5992cb27091b9cff77e5c7961d
    
    crashtesting: null dereference of reexporting abi12570.odt to odt
    
    FLY_AT_FLY shape is anchored on SwStartNode of fly section.
    
    (regression from ef8427d12a63127a2eb867637699343d630545dd)
    
    Change-Id: I4fe70237c060cc810af82657bc5791e7024db8f5
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/91336
    Tested-by: Jenkins
    Reviewed-by: Michael Stahl <michael.stahl at cib.de>
    (cherry picked from commit 71ed878556422068041025668876fb3300c128df)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/96318
    Tested-by: Thorsten Behrens <Thorsten.Behrens at CIB.de>

diff --git a/sw/source/core/crsr/bookmrk.cxx b/sw/source/core/crsr/bookmrk.cxx
index 05b999ac8e20..7a8ed0a000b4 100644
--- a/sw/source/core/crsr/bookmrk.cxx
+++ b/sw/source/core/crsr/bookmrk.cxx
@@ -26,6 +26,7 @@
 #include <doc.hxx>
 #include <ndtxt.hxx>
 #include <pam.hxx>
+#include <hints.hxx>
 #include <swserv.hxx>
 #include <sfx2/linkmgr.hxx>
 #include <swtypes.hxx>
@@ -143,6 +144,12 @@ namespace
 
         io_pDoc->GetIDocumentUndoRedo().EndUndo(SwUndoId::UI_REPLACE, nullptr);
     };
+
+    auto InvalidatePosition(SwPosition const& rPos) -> void
+    {
+        SwUpdateAttr const hint(rPos.nContent.GetIndex(), rPos.nContent.GetIndex(), 0);
+        rPos.nNode.GetNode().GetTextNode()->NotifyClients(nullptr, &hint);
+    }
 }
 
 namespace sw { namespace mark
@@ -244,6 +251,11 @@ namespace sw { namespace mark
     }
 
     // TODO: everything else uses MarkBase::GenerateNewName ?
+
+    auto MarkBase::InvalidateFrames() -> void
+    {
+    }
+
     NavigatorReminder::NavigatorReminder(const SwPaM& rPaM)
         : MarkBase(rPaM, "__NavigatorReminder__")
     { }
@@ -300,6 +312,7 @@ namespace sw { namespace mark
                     new SwUndoInsBookmark(*this));
         }
         io_pDoc->getIDocumentState().SetModified();
+        InvalidateFrames();
     }
 
     void Bookmark::DeregisterFromDoc(SwDoc* const io_pDoc)
@@ -312,6 +325,17 @@ namespace sw { namespace mark
                     new SwUndoDeleteBookmark(*this));
         }
         io_pDoc->getIDocumentState().SetModified();
+        InvalidateFrames();
+    }
+
+    // invalidate text frames in case it's hidden or Formatting Marks enabled
+    auto Bookmark::InvalidateFrames() -> void
+    {
+        InvalidatePosition(GetMarkPos());
+        if (IsExpanded())
+        {
+            InvalidatePosition(GetOtherMarkPos());
+        }
     }
 
     ::sfx2::IXmlIdRegistry& Bookmark::GetRegistry()
@@ -416,6 +440,8 @@ namespace sw { namespace mark
         if (eMode == sw::mark::InsertMode::New)
         {
             lcl_SetFieldMarks(this, io_pDoc, CH_TXT_ATR_FIELDSTART, CH_TXT_ATR_FIELDEND);
+            // no need to invalidate text frames here, the insertion of the
+            // CH_TXT_ATR already invalidates
         }
         else
         {
diff --git a/sw/source/core/doc/docbm.cxx b/sw/source/core/doc/docbm.cxx
index ed383ecec8e2..7de3816a3a75 100644
--- a/sw/source/core/doc/docbm.cxx
+++ b/sw/source/core/doc/docbm.cxx
@@ -395,6 +395,19 @@ namespace sw { namespace mark
         OSL_PRECOND(m_vAllMarks.size() < USHRT_MAX,
             "MarkManager::makeMark(..)"
             " - more than USHRT_MAX marks are not supported correctly");
+
+        if (   (!rPaM.GetPoint()->nNode.GetNode().IsTextNode()
+                && (eType != MarkType::UNO_BOOKMARK
+                // SwXTextRange can be on table node or plain start node (FLY_AT_FLY)
+                    || !rPaM.GetPoint()->nNode.GetNode().IsStartNode()))
+            || (!rPaM.GetMark()->nNode.GetNode().IsTextNode()
+                && (eType != MarkType::UNO_BOOKMARK
+                    || !rPaM.GetMark()->nNode.GetNode().IsStartNode())))
+        {
+            SAL_WARN("sw.core", "MarkManager::makeMark(..)"
+                " - refusing to create mark on non-textnode");
+            return nullptr;
+        }
         // There should only be one CrossRefBookmark per Textnode per Type
         if ((eType == MarkType::CROSSREF_NUMITEM_BOOKMARK || eType == MarkType::CROSSREF_HEADING_BOOKMARK)
             && (lcl_FindMarkAtPos(m_vBookmarks, *rPaM.Start(), eType) != m_vBookmarks.end()))
@@ -548,6 +561,8 @@ namespace sw { namespace mark
         if (!pMarkBase)
             return;
 
+        pMarkBase->InvalidateFrames();
+
         pMarkBase->SetMarkPos(*(rPaM.GetPoint()));
         if(rPaM.HasMark())
             pMarkBase->SetOtherMarkPos(*(rPaM.GetMark()));
@@ -557,6 +572,8 @@ namespace sw { namespace mark
         if(pMarkBase->GetMarkPos() != pMarkBase->GetMarkStart())
             pMarkBase->Swap();
 
+        pMarkBase->InvalidateFrames();
+
         sortMarks();
     }
 
diff --git a/sw/source/core/inc/bookmrk.hxx b/sw/source/core/inc/bookmrk.hxx
index 001f8561b012..3618bf448e63 100644
--- a/sw/source/core/inc/bookmrk.hxx
+++ b/sw/source/core/inc/bookmrk.hxx
@@ -87,6 +87,8 @@ namespace sw {
             virtual void ClearOtherMarkPos()
                 { m_pPos2.reset(); }
 
+            virtual auto InvalidateFrames() -> void;
+
             virtual OUString ToString( ) const override;
             virtual void dumpAsXml(struct _xmlTextWriter* pWriter) const override;
 
@@ -167,6 +169,8 @@ namespace sw {
 
             virtual void DeregisterFromDoc(SwDoc* const io_pDoc) override;
 
+            virtual auto InvalidateFrames() -> void override;
+
             virtual const OUString& GetShortName() const override
                 { return m_sShortName; }
             virtual const vcl::KeyCode& GetKeyCode() const override


More information about the Libreoffice-commits mailing list