sw/source/uibase/inc/conttree.hxx  |    2 
 sw/source/uibase/utlui/content.cxx |  555 ++++++++++++++-----------------------
 2 files changed, 213 insertions(+), 344 deletions(-)

New commits:
commit 24ead7e8a237fca3cc7bc9078a0b7378fa63a4a5
Author:     Jim Raykowski <rayk...@gmail.com>
AuthorDate: Wed Dec 14 06:24:08 2022 -0900
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Tue Dec 20 06:10:05 2022 +0000

    SwNavigator: Fix delete field content deletes one character extra
    
    PostIt fields are no longer included in the fields content
    type since commit bf28e1df0a04cf6a06d9c4cf591e238a45a34ec1 so there is
    no need to check to delete them from the field content type, if ever
    this was needed, and fall through to the PostIt content handling which
    is where the extra character delete happens that is the cause of this
    bug.
    
    Change-Id: I61ded30fd89d87c536f0c050117d5b61fe3a9aef
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/144201
    Tested-by: Jenkins
    Reviewed-by: Jim Raykowski <rayk...@gmail.com>
    Signed-off-by: Xisco Fauli <xiscofa...@libreoffice.org>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/144454
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/sw/source/uibase/utlui/content.cxx 
b/sw/source/uibase/utlui/content.cxx
index 3011c0828765..3ab2041e1898 100644
--- a/sw/source/uibase/utlui/content.cxx
+++ b/sw/source/uibase/utlui/content.cxx
@@ -5386,22 +5386,17 @@ void SwContentTree::EditEntry(const weld::TreeIter& 
rEntry, EditEntryMode nMode)
         break;
         case ContentTypeId::TEXTFIELD:
         {
-            const SwTextFieldContent* pTextFieldCnt = static_cast<const 
SwTextFieldContent*>(pCnt);
             if (nMode == EditEntryMode::DELETE)
             {
+                const SwTextFieldContent* pTextFieldCnt =
+                        static_cast<const SwTextFieldContent*>(pCnt);
                 const SwTextField* pTextField = 
pTextFieldCnt->GetFormatField()->GetTextField();
                 SwTextField::DeleteTextField(*pTextField);
             }
             else
-            {
-                if (pTextFieldCnt->GetFormatField()->GetField()->GetTypeId() 
!= SwFieldTypesEnum::Postit)
-                {
-                    nSlot = FN_EDIT_FIELD;
-                    break;
-                }
-            }
-            [[fallthrough]]; // execute FN_POSTIT assuring standard mode first
+                nSlot = FN_EDIT_FIELD;
         }
+        break;
         case ContentTypeId::POSTIT:
         {
             auto& rView = m_pActiveShell->GetView();
commit 18ce4278c37f58887ee830d4f8b2746ed14f20e6
Author:     Jim Raykowski <rayk...@gmail.com>
AuthorDate: Fri Dec 9 13:36:30 2022 -0900
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Tue Dec 20 06:09:58 2022 +0000

    tdf#152029 cleanup: Bring content to attention in document view
    
    when the mouse pointer is over content type and content entries in the
    Navigator content tree
    
    Changes made:
      * check for content visibility
      * use m_aActiveContentArray for content types where possible
      * consolidate repeated code
      * check pointers before use
      * stop and clear overlay when hidden shell is shown
    
    Change-Id: I2ec41b2508e3f37ea11bfbeb695fc95e0dcca0ec
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/143904
    Tested-by: Jenkins
    Reviewed-by: Jim Raykowski <rayk...@gmail.com>
    Signed-off-by: Xisco Fauli <xiscofa...@libreoffice.org>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/144453
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/sw/source/uibase/inc/conttree.hxx 
b/sw/source/uibase/inc/conttree.hxx
index af39a41cb1ae..1764377f0312 100644
--- a/sw/source/uibase/inc/conttree.hxx
+++ b/sw/source/uibase/inc/conttree.hxx
@@ -136,6 +136,8 @@ class SwContentTree final : public SfxListener
     std::unique_ptr<weld::TreeIter> m_xOverlayCompareEntry;
     std::unique_ptr<sdr::overlay::OverlayObject> m_xOverlayObject;
 
+    void OverlayObject(std::vector<basegfx::B2DRange>&& aRanges);
+
     void BringHeadingsToAttention(const SwOutlineNodes& rOutlineNodesArr);
     void BringFramesToAttention(const std::vector<const SwFrameFormat*>& 
rFrameFormats);
     void BringBookmarksToAttention(const std::vector<OUString>& rNames);
diff --git a/sw/source/uibase/utlui/content.cxx 
b/sw/source/uibase/utlui/content.cxx
index 7dd41c39b5e0..3011c0828765 100644
--- a/sw/source/uibase/utlui/content.cxx
+++ b/sw/source/uibase/utlui/content.cxx
@@ -1150,6 +1150,8 @@ SwContentTree::~SwContentTree()
 
 IMPL_LINK(SwContentTree, MouseMoveHdl, const MouseEvent&, rMEvt, bool)
 {
+    if (m_eState == State::HIDDEN)
+        return false;
     if (rMEvt.IsLeaveWindow())
     {
         m_aOverlayObjectDelayTimer.Stop();
@@ -1180,8 +1182,8 @@ IMPL_LINK(SwContentTree, MouseMoveHdl, const MouseEvent&, 
rMEvt, bool)
         {
             SwContent* pCnt = 
weld::fromId<SwContent*>(m_xTreeView->get_id(*xEntry));
             const ContentTypeId nType = pCnt->GetParent()->GetType();
-            if (rMEvt.IsEnterWindow() ||
-                    m_xTreeView->iter_compare(*xEntry, 
*m_xOverlayCompareEntry) != 0)
+            if (!pCnt->IsInvisible() && (rMEvt.IsEnterWindow() ||
+                    m_xTreeView->iter_compare(*xEntry, 
*m_xOverlayCompareEntry) != 0))
             {
                 if (nType == ContentTypeId::OUTLINE)
                 {
@@ -1217,23 +1219,9 @@ IMPL_LINK(SwContentTree, MouseMoveHdl, const 
MouseEvent&, rMEvt, bool)
                 else if (nType == ContentTypeId::REGION)
                 {
                     const SwSectionFormats& rFormats = 
m_pActiveShell->GetDoc()->GetSections();
-                    if (const size_t nSize = rFormats.size())
-                    {
-                        auto aEntryName = pCnt->GetName();
-                        for (SwSectionFormats::size_type n = nSize; n;)
-                        {
-                            if (const SwSectionFormat* pFormat = rFormats[--n])
-                            {
-                                const SwSection* pSect = pFormat->GetSection();
-                                if (pSect && !pSect->IsHiddenFlag() &&
-                                        pSect->GetSectionName() == aEntryName)
-                                {
-                                    BringFramesToAttention(std::vector<const 
SwFrameFormat*> {pFormat});
-                                    break;
-                                }
-                            }
-                        }
-                    }
+                    const SwSectionFormat* pFormat = 
rFormats.FindFormatByName(pCnt->GetName());
+                    if (pFormat)
+                        BringFramesToAttention(std::vector<const 
SwFrameFormat*> {pFormat});
                 }
                 else if (nType == ContentTypeId::URLFIELD)
                 {
@@ -1260,11 +1248,8 @@ IMPL_LINK(SwContentTree, MouseMoveHdl, const 
MouseEvent&, rMEvt, bool)
                 }
                 else if (nType == ContentTypeId::DRAWOBJECT)
                 {
-                    if (!pCnt->IsInvisible())
-                    {
-                        std::vector<const SdrObject*> aSdrObjectArr 
{GetDrawingObjectsByContent(pCnt)};
-                        BringDrawingObjectsToAttention(aSdrObjectArr);
-                    }
+                    std::vector<const SdrObject*> aSdrObjectArr 
{GetDrawingObjectsByContent(pCnt)};
+                    BringDrawingObjectsToAttention(aSdrObjectArr);
                 }
                 else if (nType == ContentTypeId::TEXTFIELD)
                 {
@@ -1300,47 +1285,40 @@ IMPL_LINK(SwContentTree, MouseMoveHdl, const 
MouseEvent&, rMEvt, bool)
                 else if (nType == ContentTypeId::TABLE)
                 {
                     std::vector<const SwFrameFormat*> aTableFormatsArr;
-                    const size_t nCount = 
m_pActiveShell->GetTableFrameFormatCount(true);
+                    const size_t nCount = 
m_pActiveShell->GetTableFrameFormatCount(false);
                     const SwFrameFormats* pFrameFormats =
                             m_pActiveShell->GetDoc()->GetTableFrameFormats();
                     SwAutoFormatGetDocNode aGetHt(&m_pActiveShell->GetNodes());
-                    for(size_t n = 0, i = 0; i < nCount + n; ++i)
+                    for(size_t i = 0; i < nCount; ++i)
                     {
                         if (const SwTableFormat* pTableFormat =
                                 
static_cast<SwTableFormat*>(pFrameFormats->GetFormat(i)))
-                        {
-                            if (pTableFormat->GetInfo(aGetHt))  // skip 
deleted tables
-                            {
-                                n++;
-                                continue;
-                            }
-                            aTableFormatsArr.push_back(pTableFormat);
-                        }
+                            if (!pTableFormat->GetInfo(aGetHt))  // skip 
deleted tables
+                                aTableFormatsArr.push_back(pTableFormat);
                     }
                     BringFramesToAttention(aTableFormatsArr);
                 }
-                else if (nType == ContentTypeId::FRAME ||  nType == 
ContentTypeId::GRAPHIC ||
+                else if (nType == ContentTypeId::FRAME || nType == 
ContentTypeId::GRAPHIC ||
                          nType == ContentTypeId::OLE)
                 {
-                        FlyCntType eType = FLYCNTTYPE_FRM;
-                        if(nType == ContentTypeId::GRAPHIC)
-                            eType = FLYCNTTYPE_GRF;
-                        else if(nType == ContentTypeId::OLE)
-                            eType = FLYCNTTYPE_OLE;
-                        
BringFramesToAttention(m_pActiveShell->GetFlyFrameFormats(eType, true));
+                    FlyCntType eType = FLYCNTTYPE_FRM;
+                    if(nType == ContentTypeId::GRAPHIC)
+                        eType = FLYCNTTYPE_GRF;
+                    else if(nType == ContentTypeId::OLE)
+                        eType = FLYCNTTYPE_OLE;
+                    
BringFramesToAttention(m_pActiveShell->GetFlyFrameFormats(eType, true));
                 }
                 else if (nType == ContentTypeId::BOOKMARK)
                 {
-                    Reference<frame::XModel> xModel =
-                            
m_pActiveShell->GetView().GetDocShell()->GetBaseModel();
-                    Reference<text::XBookmarksSupplier> xBkms(xModel, 
uno::UNO_QUERY);
-                    Reference<container::XNameAccess> xNames = 
xBkms->getBookmarks();
-                    if (xNames.is())
+                    std::vector<OUString> aNames;
+                    const auto nCount = 
m_aActiveContentArr[nType]->GetMemberCount();
+                    for (size_t i = 0; i < nCount; i++)
                     {
-                        auto 
aNames(comphelper::sequenceToContainer<std::vector<OUString>>(
-                                        xNames->getElementNames()));
-                        BringBookmarksToAttention(aNames);
+                        const SwContent* pMember = 
m_aActiveContentArr[nType]->GetMember(i);
+                        if (pMember && !pMember->IsInvisible())
+                            aNames.push_back(pMember->GetName());
                     }
+                    BringBookmarksToAttention(aNames);
                 }
                 else if (nType == ContentTypeId::REGION)
                 {
@@ -1350,11 +1328,18 @@ IMPL_LINK(SwContentTree, MouseMoveHdl, const 
MouseEvent&, rMEvt, bool)
                         std::vector<const SwFrameFormat*> aSectionsFormatsArr;
                         for (SwSectionFormats::size_type n = nSize; n;)
                         {
-                            if (const SwSectionFormat* pFormat = rFormats[--n])
+                            const SwSectionFormat* pFormat = rFormats[--n];
+                            if (pFormat && pFormat->IsInNodesArr())
                             {
-                                const SwSection* pSect = pFormat->GetSection();
-                                if (pSect && !pSect->IsHiddenFlag())
+                                const SwSection* pSection = 
pFormat->GetSection();
+                                if (pSection && !pSection->IsHiddenFlag())
+                                {
+                                    if (SectionType eSectionType = 
pSection->GetType();
+                                            eSectionType == 
SectionType::ToxContent ||
+                                            eSectionType == 
SectionType::ToxHeader)
+                                        continue;
                                     aSectionsFormatsArr.push_back(pFormat);
+                                }
                             }
                         }
                         BringFramesToAttention(aSectionsFormatsArr);
@@ -1372,20 +1357,21 @@ IMPL_LINK(SwContentTree, MouseMoveHdl, const 
MouseEvent&, rMEvt, bool)
                     for (const SfxPoolItem* pItem :
                          
m_pActiveShell->GetAttrPool().GetItemSurrogates(RES_TXTATR_REFMARK))
                     {
-                        auto pRefMark = dynamic_cast<const 
SwFormatRefMark*>(pItem);
-                        if (!pRefMark)
-                            continue;
-                        const SwTextRefMark* pTextRef = 
pRefMark->GetTextRefMark();
-                        if (pTextRef && &pTextRef->GetTextNode().GetNodes() ==
-                                &m_pActiveShell->GetNodes())
-                            aTextAttrArr.push_back(pTextRef);
+                        if (const auto pRefMark = dynamic_cast<const 
SwFormatRefMark*>(pItem))
+                        {
+                            const SwTextRefMark* pTextRef = 
pRefMark->GetTextRefMark();
+                            if (pTextRef && 
&pTextRef->GetTextNode().GetNodes() ==
+                                    &m_pActiveShell->GetNodes())
+                                aTextAttrArr.push_back(pTextRef);
+                        }
                     }
                     BringReferencesToAttention(aTextAttrArr);
                 }
                 else if (nType == ContentTypeId::POSTIT)
                 {
                     std::vector<const SwTextAttr*> aTextAttrArr;
-                    for (size_t i = 0; i < 
m_aActiveContentArr[nType]->GetMemberCount(); i++)
+                    const auto nCount = 
m_aActiveContentArr[nType]->GetMemberCount();
+                    for (size_t i = 0; i < nCount; i++)
                     {
                         const SwPostItContent* pPostItContent = 
static_cast<const SwPostItContent*>(
                                     m_aActiveContentArr[nType]->GetMember(i));
@@ -1424,11 +1410,11 @@ IMPL_LINK(SwContentTree, MouseMoveHdl, const 
MouseEvent&, rMEvt, bool)
                     const auto nCount = 
m_aActiveContentArr[nType]->GetMemberCount();
                     for (size_t i = 0; i < nCount; i++)
                     {
-                        if (const SwTextFieldContent* pTextFieldContent =
+                        const SwTextFieldContent* pTextFieldCnt =
                                 static_cast<const SwTextFieldContent*>(
-                                    m_aActiveContentArr[nType]->GetMember(i)))
-                            if (const SwFormatField* pFormatField =
-                                    pTextFieldContent->GetFormatField())
+                                    m_aActiveContentArr[nType]->GetMember(i));
+                        if (pTextFieldCnt && !pTextFieldCnt->IsInvisible())
+                            if (const SwFormatField* pFormatField = 
pTextFieldCnt->GetFormatField())
                                 if (const SwTextAttr* pTextAttr = 
pFormatField->GetTextField())
                                     aTextAttrArr.push_back(pTextAttr);
                     }
@@ -1440,11 +1426,11 @@ IMPL_LINK(SwContentTree, MouseMoveHdl, const 
MouseEvent&, rMEvt, bool)
                     const auto nCount = 
m_aActiveContentArr[nType]->GetMemberCount();
                     for (size_t i = 0; i < nCount; i++)
                     {
-                        if (const SwTextFootnoteContent* pTextFootnoteContent =
+                        const SwTextFootnoteContent* pTextFootnoteCnt =
                                 static_cast<const SwTextFootnoteContent*>(
-                                    m_aActiveContentArr[nType]->GetMember(i)))
-                            if (const SwTextAttr* pTextAttr =
-                                    pTextFootnoteContent->GetTextFootnote())
+                                    m_aActiveContentArr[nType]->GetMember(i));
+                        if (pTextFootnoteCnt && 
!pTextFootnoteCnt->IsInvisible())
+                            if (const SwTextAttr* pTextAttr = 
pTextFootnoteCnt->GetTextFootnote())
                                 aTextAttrArr.push_back(pTextAttr);
                     }
                     BringFootnotesToAttention(aTextAttrArr);
@@ -2768,7 +2754,15 @@ void SwContentTree::Display( bool bActive )
     clear();
 
     if (!bActive)
+    {
+        m_aOverlayObjectDelayTimer.Stop();
+        if (m_xOverlayObject && m_xOverlayObject->getOverlayManager())
+        {
+            m_xOverlayObject->getOverlayManager()->remove(*m_xOverlayObject);
+            m_xOverlayObject.reset();
+        }
         m_eState = State::HIDDEN;
+    }
     else if (State::HIDDEN == m_eState)
         m_eState = State::ACTIVE;
     SwWrtShell* pShell = GetWrtShell();
@@ -5745,45 +5739,39 @@ void 
SwContentTree::SelectContentType(std::u16string_view rContentTypeName)
     } while (m_xTreeView->iter_next_sibling(*xIter));
 }
 
-void SwContentTree::BringHeadingsToAttention(const SwOutlineNodes& 
rOutlineNodesArr)
+static void lcl_CalcOverlayRanges(const SwTextFrame* pStartFrame, const 
SwTextFrame* pEndFrame,
+                                  const SwPosition& aStartPos, const 
SwPosition& aEndPos,
+                                  std::vector<basegfx::B2DRange>& aRanges)
 {
-    std::vector<basegfx::B2DRange> aRanges;
-    for (const SwNode* p : rOutlineNodesArr)
+    if (pStartFrame && pEndFrame)
     {
-        if (!p || !p->GetTextNode())
-            continue;
-        if (const SwTextFrame* pFrame = static_cast<const SwTextFrame*>(
-                    
p->GetTextNode()->getLayoutFrame(m_pActiveShell->GetLayout())))
-        {
-            SwRect aStartCharRect;
-            SwPosition aStartPos(*p->GetTextNode());
-            pFrame->GetCharRect(aStartCharRect, aStartPos);
-            SwRect aEndCharRect;
-            SwContentIndex nIndex(p->GetTextNode());
-            if (!p->GetTextNode()->GetText().isEmpty())
-                nIndex = p->GetTextNode()->GetText().getLength();
-            SwPosition aEndPos(*p->GetTextNode(), nIndex);
-            pFrame->GetCharRect(aEndCharRect, aEndPos);
-            if (aStartCharRect.Top() == aEndCharRect.Top())
-            {
-                // single line range
-                aRanges.emplace_back(aStartCharRect.Left(), 
aStartCharRect.Top(),
-                                     aEndCharRect.Right() + 1, 
aEndCharRect.Bottom() + 1);
-            }
-            else
-            {
-                // multi line range
-                SwRect aFrameRect = pFrame->getFrameArea();
-                aRanges.emplace_back(aStartCharRect.Left(), 
aStartCharRect.Top(),
-                                     aFrameRect.Right(), 
aStartCharRect.Bottom() + 1);
-                if (aStartCharRect.Bottom() + 1 != aEndCharRect.Top())
-                    aRanges.emplace_back(aFrameRect.Left(), 
aStartCharRect.Bottom() + 1,
-                                         aFrameRect.Right(), 
aEndCharRect.Top() + 1);
-                aRanges.emplace_back(aFrameRect.Left(), aEndCharRect.Top() + 1,
-                                     aEndCharRect.Right() + 1, 
aEndCharRect.Bottom() + 1);
-            }
+        SwRect aStartCharRect;
+        pStartFrame->GetCharRect(aStartCharRect, aStartPos);
+        SwRect aEndCharRect;
+        pEndFrame->GetCharRect(aEndCharRect, aEndPos);
+        if (aStartCharRect.Top() == aEndCharRect.Top())
+        {
+            // single line range
+            aRanges.emplace_back(aStartCharRect.Left(), aStartCharRect.Top(),
+                                 aEndCharRect.Right() + 1, 
aEndCharRect.Bottom() + 1);
+        }
+        else
+        {
+            // multi line range
+            SwRect aFrameRect = pStartFrame->getFrameArea();
+            aRanges.emplace_back(aStartCharRect.Left(), aStartCharRect.Top(),
+                                 aFrameRect.Right(), aStartCharRect.Bottom() + 
1);
+            if (aStartCharRect.Bottom() + 1 != aEndCharRect.Top())
+                aRanges.emplace_back(aFrameRect.Left(), 
aStartCharRect.Bottom() + 1,
+                                     aFrameRect.Right(), aEndCharRect.Top() + 
1);
+            aRanges.emplace_back(aFrameRect.Left(), aEndCharRect.Top() + 1,
+                                 aEndCharRect.Right() + 1, 
aEndCharRect.Bottom() + 1);
         }
     }
+}
+
+void SwContentTree::OverlayObject(std::vector<basegfx::B2DRange>&& aRanges)
+{
     if (m_xOverlayObject && m_xOverlayObject->getOverlayManager())
         m_xOverlayObject->getOverlayManager()->remove(*m_xOverlayObject);
     m_xOverlayObject.reset(new 
sdr::overlay::OverlaySelection(sdr::overlay::OverlayType::Invert,
@@ -5792,21 +5780,42 @@ void SwContentTree::BringHeadingsToAttention(const 
SwOutlineNodes& rOutlineNodes
     m_aOverlayObjectDelayTimer.Start();
 }
 
+void SwContentTree::BringHeadingsToAttention(const SwOutlineNodes& 
rOutlineNodesArr)
+{
+    std::vector<basegfx::B2DRange> aRanges;
+    for (const SwNode* p : rOutlineNodesArr)
+    {
+        if (!p || !p->GetTextNode())
+            continue;
+        const SwTextNode& rTextNode = *p->GetTextNode();
+        if (const SwTextFrame* pFrame = static_cast<const SwTextFrame*>(
+                    rTextNode.getLayoutFrame(m_pActiveShell->GetLayout())))
+        {
+            SwContentIndex nIndex(&rTextNode);
+            auto nStart = nIndex.GetIndex();
+            auto nEnd = nStart +  rTextNode.GetText().getLength();
+            SwPosition aStartPos(rTextNode, nStart), aEndPos(rTextNode, nEnd);
+            lcl_CalcOverlayRanges(pFrame, pFrame, aStartPos, aEndPos, aRanges);
+        }
+    }
+    if (aRanges.size())
+        OverlayObject(std::move(aRanges));
+}
+
 void SwContentTree::BringFramesToAttention(const std::vector<const 
SwFrameFormat*>& rFrameFormats)
 {
     std::vector<basegfx::B2DRange> aRanges;
     for (const SwFrameFormat* pFrameFormat : rFrameFormats)
     {
+        if (!pFrameFormat)
+            continue;
         SwRect aFrameRect = pFrameFormat->FindLayoutRect();
-        aRanges.emplace_back(aFrameRect.Left(), aFrameRect.Top(),
-                             aFrameRect.Right(), aFrameRect.Bottom());
+        if (!aFrameRect.IsEmpty())
+            aRanges.emplace_back(aFrameRect.Left(), aFrameRect.Top(), 
aFrameRect.Right(),
+                                 aFrameRect.Bottom());
     }
-    if (m_xOverlayObject && m_xOverlayObject->getOverlayManager())
-        m_xOverlayObject->getOverlayManager()->remove(*m_xOverlayObject);
-    m_xOverlayObject.reset(new 
sdr::overlay::OverlaySelection(sdr::overlay::OverlayType::Invert,
-                                                              Color(), 
std::move(aRanges),
-                                                              true /*unused 
for Invert type*/));
-    m_aOverlayObjectDelayTimer.Start();
+    if (aRanges.size())
+        OverlayObject(std::move(aRanges));
 }
 
 void SwContentTree::BringBookmarksToAttention(const std::vector<OUString>& 
rNames)
@@ -5816,71 +5825,36 @@ void SwContentTree::BringBookmarksToAttention(const 
std::vector<OUString>& rName
     for (const auto& rName : rNames)
     {
         IDocumentMarkAccess::const_iterator_t ppBkmk = 
pMarkAccess->findBookmark(rName);
-        if (ppBkmk != pMarkAccess->getBookmarksEnd())
+        if (ppBkmk == pMarkAccess->getBookmarksEnd())
+            continue;
+        SwPosition aMarkStart = (*ppBkmk)->GetMarkStart();
+        const SwTextNode* pMarkStartTextNode = 
aMarkStart.GetNode().GetTextNode();
+        if (!pMarkStartTextNode)
+            continue;
+        const SwTextFrame* pMarkStartFrame = static_cast<const SwTextFrame*>(
+                    
pMarkStartTextNode->getLayoutFrame(m_pActiveShell->GetLayout()));
+        if (!pMarkStartFrame)
+            continue;
+        SwPosition aMarkEnd = (*ppBkmk)->GetMarkEnd();
+        const SwTextNode* pMarkEndTextNode = aMarkEnd.GetNode().GetTextNode();
+        if (!pMarkEndTextNode)
+            continue;
+        const SwTextFrame* pMarkEndFrame = static_cast<const SwTextFrame*>(
+                    
pMarkEndTextNode->getLayoutFrame(m_pActiveShell->GetLayout()));
+        if (!pMarkEndFrame)
+            continue;
+        // adjust span when mark start equals mark end
+        if (aMarkStart == aMarkEnd)
         {
-            SwPosition aMarkStart = (*ppBkmk)->GetMarkStart();
-            if (const SwTextNode* pMarkStartTextNode = 
aMarkStart.GetNode().GetTextNode())
-            {
-                if (const SwTextFrame* pMarkStartFrame = static_cast<const 
SwTextFrame*>(
-                            
pMarkStartTextNode->getLayoutFrame(m_pActiveShell->GetLayout())))
-                {
-                    SwPosition aMarkEnd = (*ppBkmk)->GetMarkEnd();
-                    if (const SwTextNode* pMarkEndTextNode = 
aMarkEnd.GetNode().GetTextNode())
-                    {
-                        if (const SwTextFrame* pMarkEndFrame = 
static_cast<const SwTextFrame*>(
-                                    pMarkEndTextNode->getLayoutFrame(
-                                        m_pActiveShell->GetLayout())))
-                        {
-                            // adjust span when mark start equals mark end
-                            if (aMarkStart == aMarkEnd)
-                            {
-                                if (aMarkEnd.GetContentIndex() < 
pMarkEndTextNode->Len() - 1)
-                                    aMarkEnd.AdjustContent(+1);
-                                else if (aMarkStart.GetContentIndex() > 0)
-                                    aMarkStart.AdjustContent(-1);
-                            }
-                            SwRect aStartCharRect;
-                            pMarkStartFrame->GetCharRect(aStartCharRect, 
aMarkStart);
-                            SwRect aEndCharRect;
-                            pMarkEndFrame->GetCharRect(aEndCharRect, aMarkEnd);
-                            if (aStartCharRect.Top() == aEndCharRect.Top())
-                            {
-                                // single line range
-                                aRanges.emplace_back(aStartCharRect.Left(),
-                                                     aStartCharRect.Top(),
-                                                     aEndCharRect.Right() + 1,
-                                                     aEndCharRect.Bottom() + 
1);
-                            }
-                            else
-                            {
-                                // multi line range
-                                SwRect aMarkStartFrameRect = 
pMarkStartFrame->getFrameArea();
-                                aRanges.emplace_back(aStartCharRect.Left(),
-                                                     aStartCharRect.Top(),
-                                                     
aMarkStartFrameRect.Right(),
-                                                     aStartCharRect.Bottom() + 
1);
-                                if (aStartCharRect.Bottom() + 1 != 
aEndCharRect.Top())
-                                    
aRanges.emplace_back(aMarkStartFrameRect.Left(),
-                                                         
aStartCharRect.Bottom() + 1,
-                                                         
aMarkStartFrameRect.Right(),
-                                                         aEndCharRect.Top() + 
1);
-                                
aRanges.emplace_back(aMarkStartFrameRect.Left(),
-                                                     aEndCharRect.Top() + 1,
-                                                     aEndCharRect.Right() + 1,
-                                                     aEndCharRect.Bottom() + 
1);
-                            }
-                        }
-                    }
-                }
-            }
+            if (aMarkEnd.GetContentIndex() < pMarkEndTextNode->Len() - 1)
+                aMarkEnd.AdjustContent(+1);
+            else if (aMarkStart.GetContentIndex() > 0)
+                aMarkStart.AdjustContent(-1);
         }
+        lcl_CalcOverlayRanges(pMarkStartFrame, pMarkEndFrame, aMarkStart, 
aMarkEnd, aRanges);
     }
-    if (m_xOverlayObject && m_xOverlayObject->getOverlayManager())
-        m_xOverlayObject->getOverlayManager()->remove(*m_xOverlayObject);
-    m_xOverlayObject.reset(new 
sdr::overlay::OverlaySelection(sdr::overlay::OverlayType::Invert,
-                                                              Color(), 
std::move(aRanges),
-                                                              true /*unused 
for Invert type*/));
-    m_aOverlayObjectDelayTimer.Start();
+    if (aRanges.size())
+        OverlayObject(std::move(aRanges));
 }
 
 void SwContentTree::BringURLFieldsToAttention(const SwGetINetAttrs& 
rINetAttrsArr)
@@ -5888,41 +5862,18 @@ void SwContentTree::BringURLFieldsToAttention(const 
SwGetINetAttrs& rINetAttrsAr
     std::vector<basegfx::B2DRange> aRanges;
     for (const auto& r : rINetAttrsArr)
     {
+        const SwTextNode& rTextNode = r.rINetAttr.GetTextNode();
         if (SwTextFrame* pFrame = static_cast<SwTextFrame*>(
-                    
r.rINetAttr.GetTextNode().getLayoutFrame(m_pActiveShell->GetLayout())))
+                    rTextNode.getLayoutFrame(m_pActiveShell->GetLayout())))
         {
-            SwRect aStartCharRect;
-            SwPosition aStartPos(r.rINetAttr.GetTextNode(), 
r.rINetAttr.GetStart());
-            pFrame->GetCharRect(aStartCharRect, aStartPos);
-            SwRect aEndCharRect;
-            SwPosition aEndPos(r.rINetAttr.GetTextNode(), 
r.rINetAttr.GetAnyEnd());
-            pFrame->GetCharRect(aEndCharRect, aEndPos);
-            if (aStartCharRect.Top() == aEndCharRect.Top())
-            {
-                // single line range
-                aRanges.emplace_back(aStartCharRect.Left(), 
aStartCharRect.Top(),
-                                     aEndCharRect.Right() + 1, 
aEndCharRect.Bottom() + 1);
-            }
-            else
-            {
-                // multi line range
-                SwRect aFrameRect = pFrame->getFrameArea();
-                aRanges.emplace_back(aStartCharRect.Left(), 
aStartCharRect.Top(),
-                                     aFrameRect.Right(), 
aStartCharRect.Bottom() + 1);
-                if (aStartCharRect.Bottom() + 1 != aEndCharRect.Top())
-                    aRanges.emplace_back(aFrameRect.Left(), 
aStartCharRect.Bottom() + 1,
-                                         aFrameRect.Right(), 
aEndCharRect.Top() + 1);
-                aRanges.emplace_back(aFrameRect.Left(), aEndCharRect.Top() + 1,
-                                     aEndCharRect.Right() + 1, 
aEndCharRect.Bottom() + 1);
-            }
+            auto nStart = r.rINetAttr.GetStart();
+            auto nEnd = r.rINetAttr.GetAnyEnd();
+            SwPosition aStartPos(rTextNode, nStart), aEndPos(rTextNode, nEnd);
+            lcl_CalcOverlayRanges(pFrame, pFrame, aStartPos, aEndPos, aRanges);
         }
     }
-    if (m_xOverlayObject && m_xOverlayObject->getOverlayManager())
-        m_xOverlayObject->getOverlayManager()->remove(*m_xOverlayObject);
-    m_xOverlayObject.reset(new 
sdr::overlay::OverlaySelection(sdr::overlay::OverlayType::Invert,
-                                                              Color(), 
std::move(aRanges),
-                                                              true /*unused 
for Invert type*/));
-    m_aOverlayObjectDelayTimer.Start();
+    if (aRanges.size())
+        OverlayObject(std::move(aRanges));
 }
 
 void SwContentTree::BringReferencesToAttention(std::vector<const SwTextAttr*>& 
rTextAttrsArr)
@@ -5930,42 +5881,23 @@ void 
SwContentTree::BringReferencesToAttention(std::vector<const SwTextAttr*>& r
     std::vector<basegfx::B2DRange> aRanges;
     for (const SwTextAttr* p : rTextAttrsArr)
     {
-        const SwTextNode& rTextNode = 
p->GetRefMark().GetTextRefMark()->GetTextNode();
+        if (!p)
+            continue;
+        const SwTextRefMark* pTextRefMark = p->GetRefMark().GetTextRefMark();
+        if (!pTextRefMark)
+            continue;
+        const SwTextNode& rTextNode = pTextRefMark->GetTextNode();
         if (SwTextFrame* pFrame = static_cast<SwTextFrame*>(
                     rTextNode.getLayoutFrame(m_pActiveShell->GetLayout())))
         {
-            SwRect aStartCharRect;
-            SwPosition aStartPos(rTextNode, p->GetStart());
-            pFrame->GetCharRect(aStartCharRect, aStartPos);
-            SwRect aEndCharRect;
-            SwPosition aEndPos(rTextNode, p->GetAnyEnd());
-            pFrame->GetCharRect(aEndCharRect, aEndPos);
-            if (aStartCharRect.Top() == aEndCharRect.Top())
-            {
-                // single line range
-                aRanges.emplace_back(aStartCharRect.Left(), 
aStartCharRect.Top(),
-                                     aEndCharRect.Right() + 1, 
aEndCharRect.Bottom() + 1);
-            }
-            else
-            {
-                // multi line range
-                SwRect aFrameRect = pFrame->getFrameArea();
-                aRanges.emplace_back(aStartCharRect.Left(), 
aStartCharRect.Top(),
-                                     aFrameRect.Right(), 
aStartCharRect.Bottom() + 1);
-                if (aStartCharRect.Bottom() + 1 != aEndCharRect.Top())
-                    aRanges.emplace_back(aFrameRect.Left(), 
aStartCharRect.Bottom() + 1,
-                                         aFrameRect.Right(), 
aEndCharRect.Top() + 1);
-                aRanges.emplace_back(aFrameRect.Left(), aEndCharRect.Top() + 1,
-                                     aEndCharRect.Right() + 1, 
aEndCharRect.Bottom() + 1);
-            }
+            auto nStart = p->GetStart();
+            auto nEnd = p->GetAnyEnd();
+            SwPosition aStartPos(rTextNode, nStart), aEndPos(rTextNode, nEnd);
+            lcl_CalcOverlayRanges(pFrame, pFrame, aStartPos, aEndPos, aRanges);
         }
     }
-    if (m_xOverlayObject && m_xOverlayObject->getOverlayManager())
-        m_xOverlayObject->getOverlayManager()->remove(*m_xOverlayObject);
-    m_xOverlayObject.reset(new 
sdr::overlay::OverlaySelection(sdr::overlay::OverlayType::Invert,
-                                                              Color(), 
std::move(aRanges),
-                                                              true /*unused 
for Invert type*/));
-    m_aOverlayObjectDelayTimer.Start();
+    if (aRanges.size())
+        OverlayObject(std::move(aRanges));
 }
 
 void SwContentTree::BringPostItFieldsToAttention(std::vector<const 
SwTextAttr*>& rTextAttrsArr)
@@ -5975,13 +5907,16 @@ void 
SwContentTree::BringPostItFieldsToAttention(std::vector<const SwTextAttr*>&
     {
         if (!p)
             continue;
+        const SwTextField* pTextField = p->GetFormatField().GetTextField();
+        if (!pTextField)
+            continue;
         // use as a fallback when there is no mark
-        SwTextNode& rTextNode = 
p->GetFormatField().GetTextField()->GetTextNode();
+        SwTextNode& rTextNode = pTextField->GetTextNode();
         if (!rTextNode.getLayoutFrame(m_pActiveShell->GetLayout()))
             continue;
-        assert(dynamic_cast<const 
SwTextAnnotationField*>(p->GetFormatField().GetTextField()));
+        assert(dynamic_cast<const SwTextAnnotationField*>(pTextField));
         const SwTextAnnotationField* pTextAnnotationField =
-                static_cast<const 
SwTextAnnotationField*>(p->GetFormatField().GetTextField());
+                static_cast<const SwTextAnnotationField*>(pTextField);
         if (!pTextAnnotationField)
             continue;
         const ::sw::mark::IMark* pAnnotationMark =
@@ -5997,35 +5932,11 @@ void 
SwContentTree::BringPostItFieldsToAttention(std::vector<const SwTextAttr*>&
                     
aMarkEnd.GetNode().GetTextNode()->getLayoutFrame(m_pActiveShell->GetLayout()));
         if (!pMarkStartFrame || !pMarkEndFrame)
             continue;
-        SwRect aStartCharRect;
-        pMarkStartFrame->GetCharRect(aStartCharRect, aMarkStart);
-        SwRect aEndCharRect;
-        pMarkEndFrame->GetCharRect(aEndCharRect, aMarkEnd);
-        if (aStartCharRect.Top() == aEndCharRect.Top())
-        {
-            // single line range
-            aRanges.emplace_back(aStartCharRect.Left(), aStartCharRect.Top(),
-                                 aEndCharRect.Right() + 1, 
aEndCharRect.Bottom() + 1);
-        }
-        else
-        {
-            // multi line range
-            SwRect aFrameRect = pMarkStartFrame->getFrameArea();
-            aRanges.emplace_back(aStartCharRect.Left(), aStartCharRect.Top(),
-                                 aFrameRect.Right(), aStartCharRect.Bottom() + 
1);
-            if (aStartCharRect.Bottom() + 1 != aEndCharRect.Top())
-                aRanges.emplace_back(aFrameRect.Left(), 
aStartCharRect.Bottom() + 1,
-                                     aFrameRect.Right(), aEndCharRect.Top() + 
1);
-            aRanges.emplace_back(aFrameRect.Left(), aEndCharRect.Top() + 1,
-                                 aEndCharRect.Right() + 1, 
aEndCharRect.Bottom() + 1);
-        }
+        lcl_CalcOverlayRanges(pMarkStartFrame, pMarkEndFrame, aMarkStart,
+                              aMarkEnd, aRanges);
     }
-    if (m_xOverlayObject && m_xOverlayObject->getOverlayManager())
-        m_xOverlayObject->getOverlayManager()->remove(*m_xOverlayObject);
-    m_xOverlayObject.reset(new 
sdr::overlay::OverlaySelection(sdr::overlay::OverlayType::Invert,
-                                                              Color(), 
std::move(aRanges),
-                                                              true /*unused 
for Invert type*/));
-    m_aOverlayObjectDelayTimer.Start();
+    if (aRanges.size())
+        OverlayObject(std::move(aRanges));
 }
 
 void SwContentTree::BringFootnotesToAttention(std::vector<const SwTextAttr*>& 
rTextAttrsArr)
@@ -6033,42 +5944,23 @@ void 
SwContentTree::BringFootnotesToAttention(std::vector<const SwTextAttr*>& rT
     std::vector<basegfx::B2DRange> aRanges;
     for (const SwTextAttr* p : rTextAttrsArr)
     {
-        const SwTextNode& rTextNode = 
p->GetFootnote().GetTextFootnote()->GetTextNode();
+        if (!p)
+            continue;
+        const SwTextFootnote* pTextFootnote = 
p->GetFootnote().GetTextFootnote();
+        if (!pTextFootnote)
+            continue;
+        const SwTextNode& rTextNode = pTextFootnote->GetTextNode();
         if (SwTextFrame* pFrame = static_cast<SwTextFrame*>(
                     rTextNode.getLayoutFrame(m_pActiveShell->GetLayout())))
         {
-            SwRect aStartCharRect;
-            SwPosition aStartPos(rTextNode, p->GetStart());
-            pFrame->GetCharRect(aStartCharRect, aStartPos);
-            SwRect aEndCharRect;
-            SwPosition aEndPos(rTextNode, p->GetStart() + 1);
-            pFrame->GetCharRect(aEndCharRect, aEndPos);
-            if (aStartCharRect.Top() == aEndCharRect.Top())
-            {
-                // single line range
-                aRanges.emplace_back(aStartCharRect.Left(), 
aStartCharRect.Top(),
-                                     aEndCharRect.Right() + 1, 
aEndCharRect.Bottom() + 1);
-            }
-            else
-            {
-                // multi line range
-                SwRect aFrameRect = pFrame->getFrameArea();
-                aRanges.emplace_back(aStartCharRect.Left(), 
aStartCharRect.Top(),
-                                     aFrameRect.Right(), 
aStartCharRect.Bottom() + 1);
-                if (aStartCharRect.Bottom() + 1 != aEndCharRect.Top())
-                    aRanges.emplace_back(aFrameRect.Left(), 
aStartCharRect.Bottom() + 1,
-                                         aFrameRect.Right(), 
aEndCharRect.Top() + 1);
-                aRanges.emplace_back(aFrameRect.Left(), aEndCharRect.Top() + 1,
-                                     aEndCharRect.Right() + 1, 
aEndCharRect.Bottom() + 1);
-            }
+            auto nStart = p->GetStart();
+            auto nEnd = nStart + 1;
+            SwPosition aStartPos(rTextNode, nStart), aEndPos(rTextNode, nEnd);
+            lcl_CalcOverlayRanges(pFrame, pFrame, aStartPos, aEndPos, aRanges);
         }
     }
-    if (m_xOverlayObject && m_xOverlayObject->getOverlayManager())
-        m_xOverlayObject->getOverlayManager()->remove(*m_xOverlayObject);
-    m_xOverlayObject.reset(new 
sdr::overlay::OverlaySelection(sdr::overlay::OverlayType::Invert,
-                                                              Color(), 
std::move(aRanges),
-                                                              true /*unused 
for Invert type*/));
-    m_aOverlayObjectDelayTimer.Start();
+    if (aRanges.size())
+        OverlayObject(std::move(aRanges));
 }
 
 void SwContentTree::BringDrawingObjectsToAttention(std::vector<const 
SdrObject*>& rDrawingObjectsArr)
@@ -6079,15 +5971,12 @@ void 
SwContentTree::BringDrawingObjectsToAttention(std::vector<const SdrObject*>
         if (pObject)
         {
             tools::Rectangle aRect(pObject->GetLogicRect());
-            aRanges.emplace_back(aRect.Left(), aRect.Top(), aRect.Right(), 
aRect.Bottom());
+            if (!aRect.IsEmpty())
+                aRanges.emplace_back(aRect.Left(), aRect.Top(), aRect.Right(), 
aRect.Bottom());
         }
     }
-    if (m_xOverlayObject && m_xOverlayObject->getOverlayManager())
-        m_xOverlayObject->getOverlayManager()->remove(*m_xOverlayObject);
-    m_xOverlayObject.reset(new 
sdr::overlay::OverlaySelection(sdr::overlay::OverlayType::Invert,
-                                                              Color(), 
std::move(aRanges),
-                                                              true /*unused 
for Invert type*/));
-    m_aOverlayObjectDelayTimer.Start();
+    if (aRanges.size())
+        OverlayObject(std::move(aRanges));
 }
 
 void SwContentTree::BringTextFieldsToAttention(std::vector<const SwTextAttr*>& 
rTextAttrsArr)
@@ -6096,41 +5985,24 @@ void 
SwContentTree::BringTextFieldsToAttention(std::vector<const SwTextAttr*>& r
     std::shared_ptr<SwPaM> pPamForTextField;
     for (const SwTextAttr* p : rTextAttrsArr)
     {
-        SwTextField::GetPamForTextField(*p->GetFormatField().GetTextField(), 
pPamForTextField);
-        SwTextNode& rTextNode = 
p->GetFormatField().GetTextField()->GetTextNode();
+        if (!p)
+            continue;
+        const SwTextField* pTextField = p->GetFormatField().GetTextField();
+        if (!pTextField)
+            continue;
         if (SwTextFrame* pFrame = static_cast<SwTextFrame*>(
-                    rTextNode.getLayoutFrame(m_pActiveShell->GetLayout())))
+                    
pTextField->GetTextNode().getLayoutFrame(m_pActiveShell->GetLayout())))
         {
-            SwRect aStartCharRect;
-            pFrame->GetCharRect(aStartCharRect, *pPamForTextField->GetMark());
-            SwRect aEndCharRect;
-            pFrame->GetCharRect(aEndCharRect, *pPamForTextField->GetPoint());
-            if (aStartCharRect.Top() == aEndCharRect.Top())
-            {
-                // single line range
-                aRanges.emplace_back(aStartCharRect.Left(), 
aStartCharRect.Top(),
-                                     aEndCharRect.Right() + 1, 
aEndCharRect.Bottom() + 1);
-            }
-            else
-            {
-                // multi line range
-                SwRect aFrameRect = pFrame->getFrameArea();
-                aRanges.emplace_back(aStartCharRect.Left(), 
aStartCharRect.Top(),
-                                     aFrameRect.Right(), 
aStartCharRect.Bottom() + 1);
-                if (aStartCharRect.Bottom() + 1 != aEndCharRect.Top())
-                    aRanges.emplace_back(aFrameRect.Left(), 
aStartCharRect.Bottom() + 1,
-                                         aFrameRect.Right(), 
aEndCharRect.Top() + 1);
-                aRanges.emplace_back(aFrameRect.Left(), aEndCharRect.Top() + 1,
-                                     aEndCharRect.Right() + 1, 
aEndCharRect.Bottom() + 1);
-            }
+            SwTextField::GetPamForTextField(*pTextField, pPamForTextField);
+            if (!pPamForTextField)
+                continue;
+            SwPosition aStartPos(*pPamForTextField->GetMark());
+            SwPosition aEndPos(*pPamForTextField->GetPoint());
+            lcl_CalcOverlayRanges(pFrame, pFrame, aStartPos, aEndPos, aRanges);
         }
     }
-    if (m_xOverlayObject && m_xOverlayObject->getOverlayManager())
-        m_xOverlayObject->getOverlayManager()->remove(*m_xOverlayObject);
-    m_xOverlayObject.reset(new 
sdr::overlay::OverlaySelection(sdr::overlay::OverlayType::Invert,
-                                                              Color(), 
std::move(aRanges),
-                                                              true /*unused 
for Invert type*/));
-    m_aOverlayObjectDelayTimer.Start();
+    if (aRanges.size())
+        OverlayObject(std::move(aRanges));
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Reply via email to