sw/source/uibase/inc/conttree.hxx  |    1 
 sw/source/uibase/utlui/content.cxx |   85 ++++++++++++++++++++++++++++++++++++-
 2 files changed, 85 insertions(+), 1 deletion(-)

New commits:
commit bef199febca711c9aa3fd199e8ca525b7d97a04f
Author:     Jim Raykowski <rayk...@gmail.com>
AuthorDate: Mon Dec 12 00:06:48 2022 -0900
Commit:     Jim Raykowski <rayk...@gmail.com>
CommitDate: Thu Dec 15 01:03:05 2022 +0000

    tdf#152029 Bring comment fields to attention in the document view
    
    when the mouse pointer is over comment content type and content entries
    in the Navigator content tree
    
    Change-Id: I81f8667231fe0e94f0b81c4c2d4955ba17aaa3da
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/143979
    Tested-by: Jenkins
    Reviewed-by: Jim Raykowski <rayk...@gmail.com>

diff --git a/sw/source/uibase/inc/conttree.hxx 
b/sw/source/uibase/inc/conttree.hxx
index 3cf671ac1bd9..af39a41cb1ae 100644
--- a/sw/source/uibase/inc/conttree.hxx
+++ b/sw/source/uibase/inc/conttree.hxx
@@ -141,6 +141,7 @@ class SwContentTree final : public SfxListener
     void BringBookmarksToAttention(const std::vector<OUString>& rNames);
     void BringURLFieldsToAttention(const SwGetINetAttrs& rINetAttrsArr);
     void BringReferencesToAttention(std::vector<const SwTextAttr*>& 
rTextAttrsArr);
+    void BringPostItFieldsToAttention(std::vector<const SwTextAttr*>& 
rTextAttrsArr);
     void BringDrawingObjectsToAttention(std::vector<const SdrObject*>& 
rDrawingObjectsArr);
     void BringTextFieldsToAttention(std::vector<const SwTextAttr*>& 
rTextAttrsArr);
     void BringFootnotesToAttention(std::vector<const SwTextAttr*>& 
rTextAttrsArr);
diff --git a/sw/source/uibase/utlui/content.cxx 
b/sw/source/uibase/utlui/content.cxx
index 0c027d73407f..7853b1c30f90 100644
--- a/sw/source/uibase/utlui/content.cxx
+++ b/sw/source/uibase/utlui/content.cxx
@@ -102,6 +102,7 @@
 #include <txtftn.hxx>
 #include <fmtftn.hxx>
 
+#include <txtannotationfld.hxx>
 #include <txtfrm.hxx>
 #include <txtrfmrk.hxx>
 #include <svx/sdr/overlay/overlayselection.hxx>
@@ -1248,6 +1249,15 @@ IMPL_LINK(SwContentTree, MouseMoveHdl, const 
MouseEvent&, rMEvt, bool)
                         BringReferencesToAttention(aTextAttrArr);
                     }
                 }
+                else if (nType == ContentTypeId::POSTIT)
+                {
+                    if (const SwTextAttr* pTextAttr =
+                            
static_cast<SwPostItContent*>(pCnt)->GetPostIt()->GetTextField())
+                    {
+                        std::vector<const SwTextAttr*> aTextAttrArr 
{pTextAttr};
+                        BringPostItFieldsToAttention(aTextAttrArr);
+                    }
+                }
                 else if (nType == ContentTypeId::DRAWOBJECT)
                 {
                     if (!pCnt->IsInvisible())
@@ -1372,6 +1382,20 @@ IMPL_LINK(SwContentTree, MouseMoveHdl, const 
MouseEvent&, rMEvt, bool)
                     }
                     BringReferencesToAttention(aTextAttrArr);
                 }
+                else if (nType == ContentTypeId::POSTIT)
+                {
+                    std::vector<const SwTextAttr*> aTextAttrArr;
+                    for (size_t i = 0; i < 
m_aActiveContentArr[nType]->GetMemberCount(); i++)
+                    {
+                        const SwPostItContent* pPostItContent = 
static_cast<const SwPostItContent*>(
+                                    m_aActiveContentArr[nType]->GetMember(i));
+                        if (pPostItContent && !pPostItContent->IsInvisible())
+                            if (const SwFormatField* pFormatField = 
pPostItContent->GetPostIt())
+                                if (const SwTextAttr* pTextAttr = 
pFormatField->GetTextField())
+                                    aTextAttrArr.push_back(pTextAttr);
+                    }
+                    BringPostItFieldsToAttention(aTextAttrArr);
+                }
                 else if (nType == ContentTypeId::DRAWOBJECT)
                 {
                     IDocumentDrawModelAccess& rIDDMA = 
m_pActiveShell->getIDocumentDrawModelAccess();
@@ -5944,6 +5968,66 @@ void 
SwContentTree::BringReferencesToAttention(std::vector<const SwTextAttr*>& r
     m_aOverlayObjectDelayTimer.Start();
 }
 
+void SwContentTree::BringPostItFieldsToAttention(std::vector<const 
SwTextAttr*>& rTextAttrsArr)
+{
+    std::vector<basegfx::B2DRange> aRanges;
+    for (const SwTextAttr* p : rTextAttrsArr)
+    {
+        if (!p)
+            continue;
+        // use as a fallback when there is no mark
+        SwTextNode& rTextNode = 
p->GetFormatField().GetTextField()->GetTextNode();
+        if (!rTextNode.getLayoutFrame(m_pActiveShell->GetLayout()))
+            continue;
+        assert(dynamic_cast<const 
SwTextAnnotationField*>(p->GetFormatField().GetTextField()));
+        const SwTextAnnotationField* pTextAnnotationField =
+                static_cast<const 
SwTextAnnotationField*>(p->GetFormatField().GetTextField());
+        if (!pTextAnnotationField)
+            continue;
+        const ::sw::mark::IMark* pAnnotationMark =
+                pTextAnnotationField != nullptr ? 
pTextAnnotationField->GetAnnotationMark()
+                                                : nullptr;
+        const SwPosition aMarkStart = pAnnotationMark ? 
pAnnotationMark->GetMarkStart()
+                                                : SwPosition(rTextNode, 
p->GetStart());
+        const SwPosition aMarkEnd = pAnnotationMark ? 
pAnnotationMark->GetMarkEnd()
+                                              : SwPosition(rTextNode, 
p->GetAnyEnd());
+        const SwTextFrame* pMarkStartFrame = static_cast<SwTextFrame*>(
+                    
aMarkStart.GetNode().GetTextNode()->getLayoutFrame(m_pActiveShell->GetLayout()));
+        const SwTextFrame* pMarkEndFrame = static_cast<SwTextFrame*>(
+                    
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);
+        }
+    }
+    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();
+}
+
 void SwContentTree::BringFootnotesToAttention(std::vector<const SwTextAttr*>& 
rTextAttrsArr)
 {
     std::vector<basegfx::B2DRange> aRanges;
@@ -5987,7 +6071,6 @@ void 
SwContentTree::BringFootnotesToAttention(std::vector<const SwTextAttr*>& rT
     m_aOverlayObjectDelayTimer.Start();
 }
 
-
 void SwContentTree::BringDrawingObjectsToAttention(std::vector<const 
SdrObject*>& rDrawingObjectsArr)
 {
     std::vector<basegfx::B2DRange> aRanges;

Reply via email to