summaryrefslogtreecommitdiff
path: root/sw
diff options
context:
space:
mode:
authorMichael Stahl <Michael.Stahl@cib.de>2020-01-21 13:15:50 +0100
committerMichael Stahl <Michael.Stahl@cib.de>2020-06-04 17:29:53 +0200
commita0e1983427439031b3228187f61fe60f92520ae8 (patch)
treed55b54b2112c55385bc2cfe4e34258135e8fa5e6 /sw
parent3a1186a1896c4c898ea86fe936e9a555a26a7f14 (diff)
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@cib.de> (cherry picked from commit ef8427d12a63127a2eb867637699343d630545dd) Change-Id: I293e6da9042bea5992cb27091b9cff77e5c7961d
Diffstat (limited to 'sw')
-rw-r--r--sw/source/core/crsr/bookmrk.cxx26
-rw-r--r--sw/source/core/doc/docbm.cxx15
-rw-r--r--sw/source/core/inc/bookmrk.hxx4
3 files changed, 45 insertions, 0 deletions
diff --git a/sw/source/core/crsr/bookmrk.cxx b/sw/source/core/crsr/bookmrk.cxx
index 8ea7445ea676..91e480592b0e 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__")
{ }
@@ -299,6 +311,7 @@ namespace sw { namespace mark
new SwUndoInsBookmark(*this));
}
io_pDoc->getIDocumentState().SetModified();
+ InvalidateFrames();
}
void Bookmark::DeregisterFromDoc(SwDoc* const io_pDoc)
@@ -311,6 +324,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()
@@ -415,6 +439,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 77dfdd976c1b..0998c1c83644 100644
--- a/sw/source/core/doc/docbm.cxx
+++ b/sw/source/core/doc/docbm.cxx
@@ -395,6 +395,17 @@ 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()
+ // huh, SwXTextRange puts one on table node?
+ && !rPaM.GetPoint()->nNode.GetNode().IsTableNode())
+ || (!rPaM.GetMark()->nNode.GetNode().IsTextNode()
+ && !rPaM.GetMark()->nNode.GetNode().IsTableNode()))
+ {
+ 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 +559,8 @@ namespace sw { namespace mark
if (!pMarkBase)
return;
+ pMarkBase->InvalidateFrames();
+
pMarkBase->SetMarkPos(*(rPaM.GetPoint()));
if(rPaM.HasMark())
pMarkBase->SetOtherMarkPos(*(rPaM.GetMark()));
@@ -557,6 +570,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 4fa2ef87c772..5d9752501e2c 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